feat: Create player input and powerup managers to handle player interactions, movement, actions, targeting, and boost meter mechanics.
This commit is contained in:
+23
-33
@@ -807,7 +807,7 @@ func _assign_random_spawn_positions():
|
||||
print("Assigned spawn %s to player %s" % [assigned_pos, player.name])
|
||||
|
||||
func _assign_stop_n_go_spawn_positions(all_players: Array):
|
||||
"""Assigns random spawns on walkable arena tiles for Stop N Go mode."""
|
||||
"""Assigns spawns on column 0, starting from row 1 for Stop N Go mode."""
|
||||
# Sort players for deterministic assignment based on ID
|
||||
all_players.sort_custom(func(a, b): return a.name.to_int() < b.name.to_int())
|
||||
|
||||
@@ -815,33 +815,12 @@ func _assign_stop_n_go_spawn_positions(all_players: Array):
|
||||
if not enhanced_gridmap:
|
||||
return
|
||||
|
||||
# Collect all valid walkable positions (not obstacle, not void)
|
||||
var valid_positions: Array[Vector2i] = []
|
||||
for x in range(enhanced_gridmap.columns):
|
||||
for z in range(enhanced_gridmap.rows):
|
||||
var tile = enhanced_gridmap.get_cell_item(Vector3i(x, 0, z))
|
||||
# Accept walkable (0), start (3), finish (3) — skip obstacles (4) and void (-1)
|
||||
if tile != -1 and tile != 4:
|
||||
valid_positions.append(Vector2i(x, z))
|
||||
|
||||
valid_positions.shuffle()
|
||||
|
||||
var used_positions: Array[Vector2i] = []
|
||||
var col = 0
|
||||
var current_row = 1
|
||||
|
||||
for player in all_players:
|
||||
var assigned_pos = Vector2i(-1, -1)
|
||||
|
||||
# Find a random walkable position not occupied by another player
|
||||
for pos in valid_positions:
|
||||
if pos not in used_positions:
|
||||
assigned_pos = pos
|
||||
break
|
||||
|
||||
if assigned_pos == Vector2i(-1, -1):
|
||||
# Fallback: center of arena
|
||||
assigned_pos = Vector2i(int(enhanced_gridmap.columns / 2), int(enhanced_gridmap.rows / 2))
|
||||
|
||||
used_positions.append(assigned_pos)
|
||||
var assigned_pos = Vector2i(col, current_row)
|
||||
current_row += 1
|
||||
|
||||
# Ensure immediate sync
|
||||
player.position = player.grid_to_world(assigned_pos)
|
||||
@@ -851,7 +830,7 @@ func _assign_stop_n_go_spawn_positions(all_players: Array):
|
||||
if can_rpc():
|
||||
player.rpc("set_spawn_position", assigned_pos)
|
||||
|
||||
print("[StopNGo] Assigned random spawn %s to player %s" % [assigned_pos, player.name])
|
||||
print("[StopNGo] Assigned spawn %s to player %s" % [assigned_pos, player.name])
|
||||
|
||||
func _assign_portal_mode_spawn_positions(all_players: Array):
|
||||
"""Assigns spawns to different quadrants for Tekton Doors mode."""
|
||||
@@ -1584,14 +1563,23 @@ func randomize_item_at_position(grid_position: Vector2i):
|
||||
|
||||
if is_ground:
|
||||
var new_item = 7
|
||||
# Use ScarcityController
|
||||
new_item = ScarcityController.get_random_tile_id()
|
||||
|
||||
var get_mode_specific_tile = func():
|
||||
if LobbyManager.game_mode != "Stop n Go" and LobbyManager.game_mode != "Tekton Doors":
|
||||
# 60% Chance for Common (7-10), 40% for PowerUp
|
||||
if randf() <= 0.6:
|
||||
return [7, 8, 9, 10].pick_random()
|
||||
else:
|
||||
return ScarcityModel.SPECIAL_TILES.pick_random()
|
||||
return ScarcityController.get_random_tile_id()
|
||||
|
||||
new_item = get_mode_specific_tile.call()
|
||||
|
||||
# If we are replacing an existing item, try to ensure it changes
|
||||
if current_item != -1:
|
||||
var max_retries = 3
|
||||
while new_item == current_item and max_retries > 0:
|
||||
new_item = ScarcityController.get_random_tile_id()
|
||||
new_item = get_mode_specific_tile.call()
|
||||
max_retries -= 1
|
||||
|
||||
sync_grid_item(cell.x, cell.y, cell.z, new_item)
|
||||
@@ -1654,10 +1642,12 @@ func randomize_game_grid():
|
||||
|
||||
var enhanced_gridmap = $EnhancedGridMap
|
||||
if enhanced_gridmap:
|
||||
# Use density-aware callable: 60% chance for a real tile, 40% for none
|
||||
# Custom spawn ratio for Free Mode: 60% common tiles, 40% empty tiles (start of game)
|
||||
var density_callable = func():
|
||||
if randf() > 0.6: return -1
|
||||
return ScarcityController.get_random_tile_id()
|
||||
if randf() <= 0.6:
|
||||
return ScarcityModel.STANDARD_TILES.pick_random()
|
||||
else:
|
||||
return -1 # Empty
|
||||
|
||||
enhanced_gridmap.randomize_floor(1, density_callable)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user