project-dung/scripts/Player.gd

111 lines
3.0 KiB
GDScript

extends KinematicBody
const EPSILON = 0.0001
const SPEED = 3.0
export var inventory = { "ore" : 0 }
var health: int = 4 setget set_health
var item_in_hand
# Called when the node enters the scene tree for the first time.
func _ready():
pass # Replace with function body.
func _physics_process(delta):
var input = Vector3(Input.get_axis("left", "right"), 0.0, Input.get_axis("up", "down"))
var motion = Plane.PLANE_XZ.project(get_viewport().get_camera().global_transform.basis.xform(input)).normalized() * SPEED
if motion.length_squared() > EPSILON:
$DungMan.look_at(global_transform.origin - motion, Vector3.UP)
move_and_slide(motion)
func set_health(new_value):
health = min(new_value, 4)
for child in $"%stomachs".get_children():
child.visible = child.get_index() < health
if health <= 0:
var node = Dialogic.start("starve")
node.pause_mode = PAUSE_MODE_PROCESS
add_child(node)
get_tree().paused = true
yield(node, "timeline_end")
get_tree().paused = false
get_tree().quit() # go back to main menu when such a thing exists
func can_afford(item_name, item_amount):
assert(item_amount > 0)
var current_amount : int = 0
if(inventory.has(item_name)):
current_amount = inventory[item_name]
return current_amount >= item_amount
func modify_inventory(item_name, item_amount):
if item_amount == 0:
return true
var is_op_valid : bool = true
# Note(asr): check if you can afford the item if we are removing
# for item grants op is always valid
if item_amount < 0:
is_op_valid = can_afford(item_name, abs(item_amount))
if not is_op_valid:
return false
var current_amount : int = 0
if inventory.has(item_name):
current_amount = inventory[item_name]
# Note(asr): clamp to 0. can't have negative items
var new_amount : int = max(current_amount + item_amount, 0)
inventory[item_name] = new_amount
print("inventory updated: ", item_name, " : ", new_amount)
return true
func _unhandled_input(event):
if event.is_action_pressed("action"):
for area in $"%TriggerVolume".get_overlapping_areas():
if try_trigger_interact(area):
break
func try_trigger_interact(area):
var owner = area
if area.has_meta("owner"):
owner = area.get_meta("owner")
if not owner.has_method("on_player_interact"):
return false
var result = owner.on_player_interact(self)
if not result:
print("player failed to interacted with ", owner)
return
print("player interacted with ", owner)
return true
func drop_item_in_hand():
print("player dropped ", item_in_hand.item_name)
var item_dropped = item_in_hand
$"%ItemSpawn".remove_child(item_in_hand)
item_in_hand = null
return item_dropped
func pick_up_item(item):
var item_dropped = null
if item_in_hand != null:
item_dropped = drop_item_in_hand()
item_in_hand = item
$"%ItemSpawn".add_child(item_in_hand)
print("player picked up ", item_in_hand.item_name)
return item_dropped
func has_item() -> bool:
return item_in_hand != null
func get_item_in_hand():
var item_to_return = null
if item_in_hand != null:
item_to_return = drop_item_in_hand()
return item_to_return