overhaul bot

This commit is contained in:
2026-01-03 03:40:20 +08:00
parent 7423e29443
commit cbbe95e108
185 changed files with 989 additions and 6514 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ extends Node
signal game_started()
signal game_state_changed()
@export var enable_bots: bool = false
@export var enable_bots: bool = true
@export var max_players: int = 4
var players: Array = []
+7 -4
View File
@@ -140,7 +140,8 @@ func _initialize_player_scores():
"""Initialize scores for all connected players to 0."""
var all_players = get_tree().get_nodes_in_group("Players")
for player in all_players:
var peer_id = player.get_multiplayer_authority()
# Use name.to_int() for ID because bots share authority 1 but have unique node names
var peer_id = player.name.to_int()
if not player_scores.has(peer_id):
player_scores[peer_id] = 0
_update_leaderboard()
@@ -186,7 +187,8 @@ func on_goal_completed(player: Node, time_remaining: float):
if not multiplayer.is_server():
return
var peer_id = player.get_multiplayer_authority()
# Use name.to_int() for ID because bots share authority 1
var peer_id = player.name.to_int()
# Calculate score: base + time bonus
var time_bonus = int(time_remaining * TIME_BONUS_MULTIPLIER)
@@ -241,7 +243,8 @@ func _process_cycle_end_for_all_players():
var all_players = get_tree().get_nodes_in_group("Players")
for player in all_players:
var peer_id = player.get_multiplayer_authority()
# Use name.to_int() for ID because bots share authority 1
var peer_id = player.name.to_int()
var match_score = _calculate_match_score(player)
if match_score > 0:
@@ -297,7 +300,7 @@ func regenerate_goals_for_player(player: Node):
player.goals = int_goals
# Use main scene's RPC which properly looks up player by ID on each client
var peer_id = player.get_multiplayer_authority()
var peer_id = player.name.to_int()
if main_scene:
main_scene.rpc("sync_player_goals", peer_id, int_goals)
+15 -10
View File
@@ -47,17 +47,22 @@ func after_action_completed():
# Clear the highlights after placing the tiles. (Quickfix for Clientside)
clear_highlights()
# Only update UI if this is the LOCAL HUMAN PLAYER
# Bots are owned by the host (authority match) but shouldn't trigger UI updates
if multiplayer.get_unique_id() == player.get_multiplayer_authority():
var main = player.get_tree().get_root().get_node_or_null("Main")
if main:
main.ui_manager.update_button_states()
main.ui_manager.update_playerboard_ui()
# Add this line to sync all boards
main.update_all_players_boards()
# Add sync for playerboard
if player.is_multiplayer_authority():
if not player.is_bot and not player.is_in_group("Bots"):
var main = player.get_tree().get_root().get_node_or_null("Main")
if main:
main.ui_manager.update_button_states()
main.ui_manager.update_playerboard_ui()
# Add this line to sync all boards
main.update_all_players_boards()
# Sync playerboard (Bots DO need to sync their board logic, just not update local UI)
if player.is_multiplayer_authority():
var main = player.get_tree().get_root().get_node_or_null("Main")
if main:
main.rpc("sync_playerboard", player.get_multiplayer_authority(), player.playerboard)
player._is_processing_action = false