update, fix

This commit is contained in:
2025-02-13 17:09:51 +08:00
parent 39979b8e58
commit 84457ce915
2 changed files with 874 additions and 45 deletions
+55 -41
View File
@@ -405,19 +405,29 @@ func replace_bot_with_player(player_id):
var bot_id = bots[0]
var bot_node = get_node_or_null(str(bot_id))
if bot_node:
# Transfer bot's goals to new player
# Get bot's state
var goals = bot_node.goals
var playerboard = bot_node.playerboard.duplicate()
var current_pos = bot_node.current_position
# Transfer state to new player
var player_node = get_node_or_null(str(player_id))
if player_node:
player_node.goals = goals
player_node.playerboard = playerboard.duplicate() # Make sure to duplicate
player_node.current_position = current_pos
# Sync state
rpc("sync_player_goals", player_id, goals)
# Now remove the bot
bots.pop_front()
players.erase(bot_id)
players.append(player_id)
rpc("remove_bot", bot_id)
rpc("sync_players", players)
rpc("sync_playerboard", player_id, playerboard)
# Remove bot but keep board structure intact
bots.pop_front()
players.erase(bot_id)
players.append(player_id)
rpc("remove_bot_keep_board", bot_id)
rpc("sync_players", players)
@rpc("call_local")
func remove_bot(bot_id):
@@ -522,43 +532,47 @@ func update_all_players_boards():
if not game_started:
return
var all_players = get_tree().get_nodes_in_group("Players")
var local_id = multiplayer.get_unique_id()
var all_players = get_tree().get_nodes_in_group("Players")
var all_player_boards = $AllPlayerBoards
# Sort players by relative position to local player
all_players.sort_custom(func(a, b):
var a_id = int(String(a.name))
var b_id = int(String(b.name))
# Calculate relative positions
var a_rel = (a_id - local_id + max_players) % max_players
var b_rel = (b_id - local_id + max_players) % max_players
return a_rel < b_rel
)
# Store current active tab
var current_tab = all_player_boards.current_tab
# Update each player's board in AllPlayerBoards
for i in range(min(all_players.size() - 1, 3)): # Skip local player, max 3 other players
var player = all_players[i + 1] # +1 to skip local player
var board = $AllPlayerBoards.get_child(i) # "2", "3", "4"
var board_ui = board.get_node("PlayerboardUI")
# Update each slot
# Board 1 should show host (server)
var host_player = null
# Find host player (ID 1)
for player in all_players:
if int(String(player.name)) == 1:
host_player = player
break
# Update host board
var host_board = all_player_boards.get_node("1")
if host_player and host_board and host_board.has_node("PlayerboardUI"):
host_board.visible = true
var board_ui = host_board.get_node("PlayerboardUI")
for slot_idx in range(25):
var slot = board_ui.get_node("Slot%d" % (slot_idx + 1))
var value = player.playerboard[slot_idx]
# Hide all tiles first
slot.get_node("TileHeart").hide()
slot.get_node("TileDiamond").hide()
slot.get_node("TileStar").hide()
slot.get_node("TileCoin").hide()
# Show correct tile based on value
match value:
7: slot.get_node("TileHeart").show()
8: slot.get_node("TileDiamond").show()
9: slot.get_node("TileStar").show()
10: slot.get_node("TileCoin").show()
update_board_slot(board_ui, slot_idx, host_player.playerboard[slot_idx])
# Sort remaining players by ID for boards 2-4
var other_players = all_players.filter(func(p): return int(String(p.name)) != 1)
other_players.sort_custom(func(a, b): return int(String(a.name)) < int(String(b.name)))
# Update boards 2-4 with remaining players
for i in range(min(other_players.size(), 3)):
var board_num = i + 2 # boards 2,3,4
var player = other_players[i]
var board = all_player_boards.get_node(str(board_num))
if board and board.has_node("PlayerboardUI"):
board.visible = true
var board_ui = board.get_node("PlayerboardUI")
for slot_idx in range(25):
update_board_slot(board_ui, slot_idx, player.playerboard[slot_idx])
# Restore previous active tab
all_player_boards.current_tab = current_tab
@rpc("any_peer", "call_local")
func sync_playerboard(player_id: int, new_playerboard: Array):