feat: Introduce Stop N Go game mode with new managers for phases, missions, and special tiles.

This commit is contained in:
Yogi Wiguna
2026-03-25 15:21:13 +08:00
parent f482909df5
commit 0616d3a20a
3 changed files with 143 additions and 74 deletions
+18 -7
View File
@@ -29,7 +29,7 @@ const PERMANENT_POWERUP_LOCATIONS: Array[Vector2i] = [
]
var current_phase: Phase = Phase.GO
var phase_timer: float = 15.0 # Initialized dynamically later
var phase_timer: float = 20.0 # Initialized dynamically later
var is_active: bool = false
var player_missions: Dictionary = {} # player_id -> {target_tile: int, required: int, current: int}
@@ -667,16 +667,28 @@ func _scatter_player_tiles(player_node: Node):
var peer_id = player_node.name.to_int()
var playerboard = player_node.playerboard
var tiles_to_scatter: Array[int] = []
# Collect all non-empty tiles from playerboard
# Collect all non-empty tile indices from playerboard
var occupied_indices: Array[int] = []
for i in range(playerboard.size()):
if playerboard[i] != -1:
tiles_to_scatter.append(playerboard[i])
playerboard[i] = -1
occupied_indices.append(i)
if tiles_to_scatter.is_empty():
if occupied_indices.is_empty():
return # Nothing to scatter
# Select up to 3 random tiles to scatter
var rng = RandomNumberGenerator.new()
rng.randomize()
occupied_indices.shuffle()
var tiles_to_scatter: Array[int] = []
var scatter_count = min(occupied_indices.size(), 3)
for i in range(scatter_count):
var board_idx = occupied_indices[i]
tiles_to_scatter.append(playerboard[board_idx])
playerboard[board_idx] = -1 # Remove only the scattered tiles from board
# Find valid nearby positions to drop tiles (within radius 3 of player)
var center = player_node.current_position
@@ -698,7 +710,6 @@ func _scatter_player_tiles(player_node: Node):
valid_drop_positions.append(pos)
# Scatter tiles onto valid positions
var rng = RandomNumberGenerator.new()
rng.randomize()
for tile in tiles_to_scatter: