extends KinematicBody const EPSILON = 0.0001 const SPEED = 10.0 export var inventory = { "ore" : 0 } var health: int = 4 setget set_health var item_in_hand onready var move_playback = $DungMan/AnimationTree["parameters/Move/playback"] # Called when the node enters the scene tree for the first time. func _ready(): $hitbox.set_meta("owner", self) move_playback.travel("idle") 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_playback.travel("run") else: move_playback.travel("idle") 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"): $DungMan/AnimationTree["parameters/Activate/active"] = true yield(get_tree().create_timer(0.2), "timeout") 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 func _on_blink_timer_timeout(): $DungMan/AnimationTree["parameters/Blink/active"] = true $DungMan/blink_timer.wait_time = rand_range(0.5, 3.0)