update bot logic

This commit is contained in:
2024-10-24 18:06:10 +08:00
parent 8fe13a42ca
commit df436e7af0
3 changed files with 284 additions and 23 deletions
+147 -1
View File
@@ -12,6 +12,16 @@ var is_player_moving: bool = false
@export var center_y: bool = false
@export var center_z: bool = false
# Goals & Playerboard Data
@export var goals: Array[int] = [0,0,0,0,0,0,0,0,0] # 9 length array for goals
@export var playerboard: Array[int] = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # 25 length array for holding items
var has_performed_action: bool = false # Track if grab/put action has been done
# Player Rotation Config
# Add these variables for rotation
var target_rotation: float = 0.0
var rotation_speed: float = 10.0 # Adjust this to control rotation speed
@export var movement_range: int = 1 # How many blocks can be moved at once
@export var use_diagonal_movement: bool = false: # Allow diagonal movement
set(value):
@@ -49,6 +59,13 @@ func _ready():
update_player_position(current_position)
set_process_unhandled_input(is_multiplayer_authority())
# Initialize random goals
initialize_random_goals()
# Initialize playerboard with -1 (empty slots)
playerboard.resize(25)
playerboard.fill(-1)
func find_valid_starting_position() -> Vector2i:
var rng = RandomNumberGenerator.new()
@@ -106,6 +123,16 @@ func _physics_process(_delta):
if is_multiplayer_authority():
rpc("remote_set_position", global_position)
# Add this to your _process function if you don't have one
func _process(delta):
if is_multiplayer_authority():
if Input.is_action_just_pressed("grab_item"): # Define this input in project settings
if grab_item():
rpc("display_message", "Item grabbed!")
elif Input.is_action_just_pressed("put_item"): # Define this input in project settings
if put_item():
rpc("display_message", "Item placed!")
func _unhandled_input(event):
var main = get_node("/root/Main")
if not is_multiplayer_authority() or (main.turn_based_mode and (not is_my_turn or is_player_moving)):
@@ -149,14 +176,44 @@ func is_within_movement_range(target_position: Vector2i) -> bool:
abs(target_position.y - current_position.y)
return distance <= movement_range
#func move_player_to_clicked_position(grid_position: Vector2i):
#if not is_multiplayer_authority():
#return
#
#if is_player_moving:
#return
#
## Check if the movement is within range
#if not is_within_movement_range(grid_position):
#print("Movement out of range")
#return
#
#var cell_item = enhanced_gridmap.get_cell_item(Vector3i(grid_position.x, 0, grid_position.y))
#
#if cell_item in enhanced_gridmap.non_walkable_items:
#print("Cannot move to non-walkable cell")
#return
#
#var path = enhanced_gridmap.find_path(Vector2(current_position), Vector2(grid_position))
#
#if path.size() > 1:
#path.pop_front()
#rpc("start_movement_along_path", path)
#else:
#print("No valid path found")
func move_player_to_clicked_position(grid_position: Vector2i):
if not is_multiplayer_authority():
return
if is_player_moving:
return
# Check if player has performed grab/put action
if not has_performed_action and current_position != grid_position:
rpc("display_message", "Must grab or place item before moving!")
return
# Check if the movement is within range
if not is_within_movement_range(grid_position):
print("Movement out of range")
return
@@ -167,6 +224,8 @@ func move_player_to_clicked_position(grid_position: Vector2i):
print("Cannot move to non-walkable cell")
return
rotate_towards_target(grid_position)
var path = enhanced_gridmap.find_path(Vector2(current_position), Vector2(grid_position))
if path.size() > 1:
@@ -189,6 +248,7 @@ func start_movement_along_path(path: Array):
tween.tween_callback(func():
current_position = Vector2i(path[-1].x, path[-1].y)
is_player_moving = false
has_performed_action = false # Reset the action flag after movement
enhanced_gridmap.clear_path_visualization()
has_moved_this_turn = true
var main = get_node("/root/Main")
@@ -196,6 +256,7 @@ func start_movement_along_path(path: Array):
end_turn()
)
func move_bot_along_path(path: Array, bot_id: int):
if not is_multiplayer_authority():
return
@@ -250,6 +311,7 @@ func grid_to_world(grid_position: Vector2i) -> Vector3:
func start_turn():
has_moved_this_turn = false
has_performed_action = false # Reset action flag at start of turn
is_my_turn = true
if is_multiplayer_authority():
rpc("display_message", "It's your turn!")
@@ -272,3 +334,87 @@ func display_message(message):
await get_tree().create_timer(3).timeout
$Bubble.hide()
$Bubble/Message.hide()
func initialize_random_goals():
goals.clear()
var rng = RandomNumberGenerator.new()
rng.randomize()
for i in range(9):
goals.append(rng.randi_range(7, 10))
if is_multiplayer_authority():
rpc("sync_goals", goals)
func grab_item() -> bool:
if not enhanced_gridmap:
return false
var current_cell = Vector3i(current_position.x, 1, current_position.y)
var item = enhanced_gridmap.get_cell_item(current_cell)
if item == -1: # No item to grab
return false
var empty_slot = playerboard.find(-1)
if empty_slot == -1: # No empty slots
return false
playerboard[empty_slot] = item
enhanced_gridmap.set_cell_item(current_cell, -1)
if is_multiplayer_authority():
rpc("sync_playerboard", playerboard)
has_performed_action = true # Set action flag
return true
func put_item() -> bool:
if not enhanced_gridmap:
return false
var current_cell = Vector3i(current_position.x, 1, current_position.y)
if enhanced_gridmap.get_cell_item(current_cell) != -1:
return false # Cell is occupied
var item_to_put = -1
var item_index = -1
for goal in goals:
var index = playerboard.find(goal)
if index != -1:
item_to_put = goal
item_index = index
break
if item_to_put == -1:
return false
enhanced_gridmap.set_cell_item(current_cell, item_to_put)
playerboard[item_index] = -1
if is_multiplayer_authority():
rpc("sync_playerboard", playerboard)
has_performed_action = true # Set action flag
return true
@rpc("any_peer", "call_local")
func sync_goals(new_goals: Array):
goals = new_goals
@rpc("any_peer", "call_local")
func sync_playerboard(new_playerboard: Array):
playerboard = new_playerboard
func rotate_towards_target(target_pos: Vector2i):
var direction = Vector2(
target_pos.x - current_position.x,
target_pos.y - current_position.y
).normalized()
target_rotation = atan2(direction.x, direction.y)
# Create a tween for smooth rotation
var tween = create_tween()
tween.tween_property(self, "rotation:y", target_rotation, 0.2)