diff --git a/scenes/main.gd b/scenes/main.gd index 9b8a0df..83c77a5 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -1409,7 +1409,7 @@ func _on_peer_connected(new_peer_id: int): var player_goals = GoalManager.preset_goals[player_index].duplicate() player.goals = player_goals # Update goals UI for all clients - call_deferred("_deferred_set_player_goals", new_peer_id, player_goals) + rpc("sync_player_goals", new_peer_id, player_goals) @rpc func add_newly_connected_player_character(new_peer_id: int): @@ -2041,6 +2041,8 @@ func request_full_grid_sync(): if stop_n_go_manager.player_missions.has(sender_id): var mission_dict = {sender_id: stop_n_go_manager.player_missions[sender_id]} stop_n_go_manager.rpc_id(sender_id, "sync_missions", mission_dict) + elif LobbyManager.game_mode == "Candy Survival" and candy_survival_manager: + candy_survival_manager.sync_state_to_player(sender_id) # For all modes, only sync Floor 1 (Items) to prevent MTU packet overflow. # Floor 0 logic is deterministic and generated locally on level load. diff --git a/scenes/player.gd b/scenes/player.gd index 13093a4..0d83c85 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -624,12 +624,12 @@ func sync_candy_stack(colors: Array) -> void: var candy_colors = { 0: Color(1.0, 0.3, 0.3), # HEART = red 1: Color(0.3, 0.6, 1.0), # DIAMOND = blue - 2: Color(1.0, 0.8, 0.0), # STAR = gold - 3: Color(0.0, 1.0, 0.4), # COIN = green + 2: Color(0.0, 1.0, 0.4), # STAR = green + 3: Color(1.0, 0.8, 0.0), # COIN = gold } for i in range(colors.size()): - var color_id = colors[i] + var color_id = int(colors[i]) var base_color = candy_colors.get(color_id, Color.WHITE) var candy = _candy_scene.instantiate() candy.position = Vector3(0, i * 0.35, 0) diff --git a/scripts/controllers/candy_survival_npc_controller.gd b/scripts/controllers/candy_survival_npc_controller.gd index a046718..fe04f1c 100644 --- a/scripts/controllers/candy_survival_npc_controller.gd +++ b/scripts/controllers/candy_survival_npc_controller.gd @@ -34,8 +34,8 @@ func set_face_color_rpc(color_index: int) -> void: match color_index: 0: c = Color(1.0, 0.2, 0.2) # HEART (Red) 1: c = Color(0.2, 0.4, 1.0) # DIAMOND (Blue) - 2: c = Color(1.0, 0.9, 0.2) # STAR (Yellow) - 3: c = Color(1.0, 0.6, 0.0) # COIN (Orange/Gold) + 2: c = Color(0.0, 1.0, 0.4) # STAR (Green) + 3: c = Color(1.0, 0.8, 0.0) # COIN (Gold/Yellow) face_material.albedo_color = c face_material.emission = c diff --git a/scripts/managers/candy_survival_manager.gd b/scripts/managers/candy_survival_manager.gd index 15957ca..7d2c02d 100644 --- a/scripts/managers/candy_survival_manager.gd +++ b/scripts/managers/candy_survival_manager.gd @@ -167,6 +167,7 @@ func start_game_mode() -> void: player_blueprints[pid] = 0 player_sugar_rush[pid] = 0.0 player_last_knocked_by[pid] = 0 + _update_candy_badge(pid) print("[CandySurvival] Started with %d players" % pids.size()) @@ -308,8 +309,9 @@ func _update_candy_badge(pid: int) -> void: var mult = 1.0 + count * MULTI_STEP var colors = player_candy_colors.get(pid, []) var color = colors.back() if colors.size() > 0 else -1 - var face_match = (color != -1 and color == current_face) - rpc("sync_candy_badge", pid, count, mult, face_match) + var face_match = (color != -1) + var score = player_score.get(pid, 0) + rpc("sync_candy_badge", pid, count, mult, face_match, score, colors) # Update the 3D meshes on the player's head across all clients var all_players = get_tree().get_nodes_in_group("Players") @@ -336,9 +338,6 @@ func try_deliver(pid: int) -> bool: if color == -1 or colors.size() == 0: rpc("sync_delivery_result", pid, false, "No candy") return false - if color != current_face: - rpc("sync_delivery_result", pid, false, "Wrong color") - return false var count = colors.size() var mult = get_multiplier(pid) @@ -543,7 +542,7 @@ func get_score(pid: int) -> int: # ── RPCs (stubs — HUD client handles visuals) ── @rpc("authority", "call_remote", "unreliable") -func sync_candy_badge(pid: int, count: int, mult: float, face_match: bool) -> void: +func sync_candy_badge(pid: int, count: int, mult: float, face_match: bool, score: int, colors: Array) -> void: if not active: activate_client_side() if pid == multiplayer.get_unique_id(): @@ -552,7 +551,19 @@ func sync_candy_badge(pid: int, count: int, mult: float, face_match: bool) -> vo _last_badge_face_match = face_match if hud_stack_badge: - hud_stack_badge.text = "Stack: %d (x%.1f)" % [count, mult] + var red = 0 + var blue = 0 + var yellow = 0 + var green = 0 + for col in colors: + match int(col): + 0: red += 1 + 1: blue += 1 + 2: green += 1 + 3: yellow += 1 + hud_stack_badge.text = "Stack: %d (x%.1f)\nRed: %dx Blue: %dx Green: %dx Yellow: %dx" % [count, mult, red, blue, green, yellow] + if hud_points_label: + hud_points_label.text = "Score: %d" % score if hud_delivery_indicator: if count > 0: if face_match: @@ -613,3 +624,29 @@ func sync_ghost_active(pid: int, active_on: bool) -> void: if pid == multiplayer.get_unique_id(): if hud_ghost_label and player_ghosts.has(pid): hud_ghost_label.text = "👻 Ghosts: %d" % player_ghosts[pid] + +func sync_state_to_player(peer_id: int) -> void: + # Sync Mekton's current face color + if mekton_node and mekton_node.has_method("set_face_color_rpc"): + mekton_node.rpc_id(peer_id, "set_face_color_rpc", current_face) + + # Sync all players' candy stack heights and colors + for pid in player_candy_colors.keys(): + var count = player_candies.get(pid, 0) + var mult = get_multiplier(pid) + var colors = player_candy_colors.get(pid, []) + var color = colors.back() if colors.size() > 0 else -1 + var face_match = (color != -1) + var score = player_score.get(pid, 0) + + # Sync badge + rpc_id(peer_id, "sync_candy_badge", pid, count, mult, face_match, score, colors) + + # Sync 3D stack meshes + var all_players = get_tree().get_nodes_in_group("Players") + for player in all_players: + var curr_pid = player.get("peer_id") if "peer_id" in player else player.name.to_int() + if curr_pid == pid: + if player.has_method("sync_candy_stack"): + player.rpc_id(peer_id, "sync_candy_stack", colors) + break diff --git a/scripts/managers/goals_cycle_manager.gd b/scripts/managers/goals_cycle_manager.gd index d9a5682..1fba12b 100644 --- a/scripts/managers/goals_cycle_manager.gd +++ b/scripts/managers/goals_cycle_manager.gd @@ -377,7 +377,7 @@ func _process_cycle_end_for_all_players(): var peer_id = player.name.to_int() var match_score = _calculate_match_score(player) - if match_score > 0: + if match_score > 0 and not (LobbyManager.game_mode == "Candy Survival"): if not player_scores.has(peer_id): player_scores[peer_id] = 0 player_scores[peer_id] += match_score