Added modular coin machine and power station. Updated Player code to handle inventory.
This commit is contained in:
1 parent
9956a8f7a4
commit
afe0a5d39c
11 files changed
+179
-24
No files matched your search
@@ -0,0 +1,63 @@
|
||||
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
|
||||
|
||||
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
|
||||
@@ -0,0 +1,16 @@
|
||||
extends Area
|
||||
|
||||
export var coins_required : int = 1
|
||||
|
||||
signal coin_requirement_met;
|
||||
|
||||
func _ready():
|
||||
assert(coins_required >= 0)
|
||||
set_meta("owner", self)
|
||||
|
||||
func on_player_interact(player):
|
||||
assert(player.has_method("modify_inventory"))
|
||||
if not player.modify_inventory("coins", -coins_required):
|
||||
return
|
||||
|
||||
emit_signal("coin_requirement_met", player)
|
||||
@@ -0,0 +1,31 @@
|
||||
extends Spatial
|
||||
|
||||
export var max_charge_capacity : int = 1
|
||||
export var time_to_generate : float = 120
|
||||
|
||||
var current_holding : int = 0
|
||||
var current_timer : float = 0
|
||||
|
||||
func _ready():
|
||||
pass # Replace with function body.
|
||||
|
||||
func _process(delta):
|
||||
current_timer += delta
|
||||
if current_timer >= time_to_generate:
|
||||
generate_charge()
|
||||
current_timer = 0
|
||||
|
||||
func generate_charge():
|
||||
if current_holding >= max_charge_capacity:
|
||||
return
|
||||
current_holding += 1
|
||||
print("power station: charge generated")
|
||||
|
||||
func collect_charges_from_station():
|
||||
var charges_to_return : int = current_holding
|
||||
current_holding = 0
|
||||
return charges_to_return
|
||||
|
||||
func _on_coin_machine_coin_requirement_met(player):
|
||||
assert(player.has_method("modify_inventory"))
|
||||
player.modify_inventory("coins", collect_charges_from_station())
|
||||
Reference in new issue
Block a user