extends KinematicBody const EPSILON = 0.0001 const SPEED = 3.0 export var inventory = { "ore" : 0 } # 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 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