fix(candy-survival): resolve persistent candy color bugs, sync HUD scores and counts, bypass Mekton face delivery requirement, and correct STAR/COIN color switch
This commit is contained in:
+3
-1
@@ -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.
|
||||
|
||||
+3
-3
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user