project-dung/scripts/Player.gd
2022-08-13 20:41:37 -07:00

64 lines
1.8 KiB
GDScript

extends KinematicBody
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
$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
owner.on_player_interact(self)
print("player interacted with ", owner)
return true