feat: Implement the main game scene with new player functionality, Stop n Go and Portal Mode managers, a dynamic message bar, and pre-game countdown logic.

This commit is contained in:
2026-03-05 02:07:14 +08:00
parent cd7881bc3f
commit ebfa8f99a7
3 changed files with 318 additions and 46 deletions
+32 -7
View File
@@ -807,15 +807,41 @@ 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 spawns to the far left columns (Start Line) for Stop N Go mode."""
"""Assigns random spawns on walkable arena tiles 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())
var spawn_index = 0
var enhanced_gridmap = $EnhancedGridMap
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] = []
for player in all_players:
# Use deterministic assignment from (0, 1) to (0, 8) to keep players separate
# Start Line is Column 0. We use rows 1 to 8.
var assigned_pos = Vector2i(0, spawn_index + 1)
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)
# Ensure immediate sync
player.position = player.grid_to_world(assigned_pos)
@@ -825,8 +851,7 @@ func _assign_stop_n_go_spawn_positions(all_players: Array):
if can_rpc():
player.rpc("set_spawn_position", assigned_pos)
spawn_index += 1
print("[StopNGo] Assigned fixed starting block %s to player %s" % [assigned_pos, player.name])
print("[StopNGo] Assigned random 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."""