70 lines
1.9 KiB
GDScript
70 lines
1.9 KiB
GDScript
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
|