41 lines
1.2 KiB
GDScript
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
|