47 lines
1.2 KiB
GDScript
47 lines
1.2 KiB
GDScript
extends ActionLeaf
|
|
|
|
func is_goals_achieved(actor) -> bool:
|
|
for i in range(3):
|
|
for j in range(3):
|
|
var board_idx = (i + 1) * 5 + (j + 1)
|
|
var goal_idx = i * 3 + j
|
|
if actor.goals[goal_idx] != -1 and actor.goals[goal_idx] != actor.playerboard[board_idx]:
|
|
return false
|
|
elif actor.goals[goal_idx] == -1 and actor.playerboard[board_idx] != -1:
|
|
return false
|
|
return true
|
|
|
|
func tick(actor: Node, blackboard: Blackboard) -> int:
|
|
# Don't move if goals are achieved
|
|
if is_goals_achieved(actor):
|
|
return FAILURE
|
|
|
|
# Get target from blackboard
|
|
var target_pos = blackboard.get_value("move_target")
|
|
if not target_pos:
|
|
return FAILURE
|
|
|
|
if actor.action_points <= 0:
|
|
return FAILURE
|
|
|
|
if not actor.is_bot == true and not actor.is_in_group("Bots"):
|
|
return FAILURE
|
|
|
|
# Execute movement
|
|
if actor.is_within_movement_range(target_pos):
|
|
if actor.is_bot == true:
|
|
var path = actor.enhanced_gridmap.find_path(
|
|
Vector2(actor.current_position),
|
|
Vector2(target_pos),
|
|
0,
|
|
false
|
|
)
|
|
if path.size() > 1:
|
|
path.pop_front()
|
|
actor.rpc("start_movement_along_path", path, false)
|
|
actor.action_points -= 1
|
|
blackboard.set_value("current_action", "moving")
|
|
return SUCCESS
|
|
|
|
return FAILURE
|