Files
tekton/scripts/behaviors/conditions/can_put.gd
T
2025-01-31 17:45:35 +08:00

41 lines
1.2 KiB
GDScript

extends ConditionLeaf
func is_goals_achieved(actor) -> bool:
# ... same is_goals_achieved function as in can_grab.gd ...
return false
func tick(actor: Node, blackboard: Blackboard) -> int:
# First check if goals are achieved
if is_goals_achieved(actor):
blackboard.set_value("current_action", "idle")
return FAILURE
# Find an item in playerboard that matches goals
var put_slot = -1
for i in range(actor.playerboard.size()):
if actor.playerboard[i] in actor.goals:
put_slot = i
break
if put_slot == -1:
return FAILURE
# Find empty adjacent cell
var current_cell = Vector3i(actor.current_position.x, 1, actor.current_position.y)
if actor.enhanced_gridmap.get_cell_item(current_cell) == -1:
blackboard.set_value("put_position", actor.current_position)
blackboard.set_value("put_slot", put_slot)
return SUCCESS
var neighbors = actor.enhanced_gridmap.get_neighbors(actor.current_position, 0)
for neighbor in neighbors:
if not neighbor.is_walkable:
continue
var cell = Vector3i(neighbor.position.x, 1, neighbor.position.y)
if actor.enhanced_gridmap.get_cell_item(cell) == -1:
blackboard.set_value("put_position", neighbor.position)
blackboard.set_value("put_slot", put_slot)
return SUCCESS
return FAILURE