diff --git a/scenes/player.gd b/scenes/player.gd index 384fa2d..e7c8dc9 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -23,6 +23,18 @@ var action_points: int = 2 var target_rotation: float = 0.0 var rotation_speed: float = 10.0 +var spawn_locations = [ + Vector2i(0, 0), # (0,1,0) + Vector2i(0, 1), # (0,1,1) + Vector2i(0, 2), # (0,1,2) + Vector2i(0, 3), # (0,1,3) + Vector2i(0, 4), # (0,1,4) + Vector2i(0, 5) # (0,1,5) +] + +var spawn_point_selected = false +var highlighted_spawn_points = [] + # Action var _is_processing_action = false var _is_highlighting = false @@ -82,12 +94,23 @@ func _ready(): rpc("sync_bot_status", true) - # Initialize bot-specific components + ## Initialize bot-specific components + #if enhanced_gridmap: + #current_position = find_valid_starting_position() + #update_player_position(current_position) + if enhanced_gridmap: - current_position = find_valid_starting_position() + current_position = _find_random_spawn_position() update_player_position(current_position) - - # Remove this line as goals are now managed by the host + spawn_point_selected = true + + else: + # Human player initialization + if enhanced_gridmap: + enhanced_gridmap.initialize_astar() + enhanced_gridmap.set_diagonal_movement(use_diagonal_movement) + highlight_available_spawn_points() + # Remove this line as goals are now managed by the host #append_random_goals() playerboard.resize(25) @@ -166,7 +189,19 @@ func _unhandled_input(event): if not is_multiplayer_authority() or is_bot or is_in_group("Bots"): set_process_unhandled_input(false) return - + + # Handle spawn point selection if not yet selected + if not spawn_point_selected and highlighted_spawn_points.size() > 0: + if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT: + var camera = get_viewport().get_camera_3d() + var from = camera.project_ray_origin(event.position) + var to = from + camera.project_ray_normal(event.position) * 1000 + + var click_position = raycast_to_grid(from, to) + if click_position in highlighted_spawn_points: + if select_spawn_point(click_position): + return # Spawn point selected successfully + # Use get_node_or_null for safer node access var main = get_tree().get_root().get_node_or_null("Main") if not main: @@ -239,21 +274,101 @@ func is_position_occupied(pos: Vector2i) -> bool: return true return false +#func find_valid_starting_position() -> Vector2i: + #var rng = RandomNumberGenerator.new() + #rng.randomize() +# + #var max_attempts = 100 + #var attempts = 0 +# + #while attempts < max_attempts: + #var x = rng.randi_range(0, enhanced_gridmap.columns - 1) + #var y = rng.randi_range(0, enhanced_gridmap.rows - 1) + #var pos = Vector2i(x, y) + #if not is_position_occupied(pos): + #return pos + #attempts += 1 +# + #return Vector2i.ZERO + func find_valid_starting_position() -> Vector2i: - var rng = RandomNumberGenerator.new() - rng.randomize() + if is_bot: + return _find_random_spawn_position() + else: + highlight_available_spawn_points() + # Return temporary position, will be updated when player selects spawn point + return Vector2i(-1, -1) - var max_attempts = 100 - var attempts = 0 +func highlight_available_spawn_points(): + if not is_multiplayer_authority() or is_bot or spawn_point_selected: + return + + # Clear any existing highlights + clear_highlights() + highlighted_spawn_points.clear() + + # Check each spawn location + for spawn_pos in spawn_locations: + if not is_position_occupied(spawn_pos): + highlighted_spawn_points.append(spawn_pos) + if enhanced_gridmap: + # Highlight the cell at y=0 (ground level) + enhanced_gridmap.set_cell_item( + Vector3i(spawn_pos.x, 0, spawn_pos.y), + enhanced_gridmap.hover_item + ) - while attempts < max_attempts: - var x = rng.randi_range(0, enhanced_gridmap.columns - 1) - var y = rng.randi_range(0, enhanced_gridmap.rows - 1) - var pos = Vector2i(x, y) - if not is_position_occupied(pos): - return pos - attempts += 1 +func select_spawn_point(spawn_pos: Vector2i) -> bool: + if not is_multiplayer_authority() or is_bot or spawn_point_selected: + return false + + if spawn_pos in highlighted_spawn_points: + current_position = spawn_pos + spawn_point_selected = true + + # Update position in the world + position = grid_to_world(spawn_pos) + + # Clear ALL highlights comprehensively + clear_spawn_highlights() + + # Sync with other clients + if is_multiplayer_authority(): + rpc("sync_position", current_position) + + return true + return false +func clear_spawn_highlights(): + # Clear the highlighted spawn points array + for spawn_pos in highlighted_spawn_points: + if enhanced_gridmap: + # Reset the cell to its original state + var cell_item = enhanced_gridmap.get_cell_item(Vector3i(spawn_pos.x, 1, spawn_pos.y)) + enhanced_gridmap.set_cell_item( + Vector3i(spawn_pos.x, 0, spawn_pos.y), + enhanced_gridmap.normal_items[0] if cell_item != -1 else -1 + ) + + # Clear the array + highlighted_spawn_points.clear() + + # Force an update of the grid visualization + if enhanced_gridmap: + enhanced_gridmap._update_cell_option_buttons() + +func _find_random_spawn_position() -> Vector2i: + var available_positions = [] + + for spawn_pos in spawn_locations: + if not is_position_occupied(spawn_pos): + available_positions.append(spawn_pos) + + if available_positions.size() > 0: + var rng = RandomNumberGenerator.new() + rng.randomize() + return available_positions[rng.randi() % available_positions.size()] + return Vector2i.ZERO func find_random_valid_position_in_range() -> Vector2i: