BattleManager es el punto de entrada de cada partida en Beast Card Clash. Extiende a StateMachine y está acoplado a la escena de batalla. Se encarga de instanciar al jugador humano, generar los bots de IA, conectar las señales e inicializar el campo de batalla antes de que la máquina de estados comience a gestionar el flujo de turnos.
BattleManageres un nodo a nivel de escena, no un autoload. Solo existe mientras la escena de batalla esté activa. Para singletons globales, consulta Autoloads.
Resumen de la clase
class_name BattleManager extends StateMachine
- Inicializa jugadores: Crea al jugador humano a partir de
PlayerStatsy genera entre 1 y 3 bots de IA con barajas aleatorias. - Conecta la interfaz: Vincula
BattleUIcon los datos del jugador y desactiva el dado 3D (a través deBattleWorld) hasta que la máquina de estados permita un lanzamiento. - Conecta señales: Enlaza la señal
deck_updateddel jugador humano conBattleUI.set_hand_from_deckpara que la mano se vuelva a renderizar automáticamente. - Alimenta la máquina de estados: Expone el arreglo
playersya poblado para que la máquina de estados pueda iterar sobre los participantes en cada fase.
Propiedades
- MAX_PLAYERS (
int): Número máximo de participantes en una misma batalla, incluyendo al jugador humano y a todos los bots. Por defecto:4. - battle_ui (
BattleUI): Referencia exportada al nodoBattleUIen la escena de batalla. Se asigna en el Inspector de Godot. - battle_world (
BattleWorld): Referencia exportada al nodoBattleWorld, que contiene los dados 3D y las rocas.BattleManagerllama abattle_world.set_dice(false)durantesetup_world()para desactivar la interacción con el dado al inicio de la partida. - player (
Player): La instancia única delPlayerhumano. Se inicializa mediantesetup_player(). Utiliza esta referencia siempre que necesites leer o modificar el estado del jugador humano. - players (
Array[Player]): Todos los participantes: el jugador humano más los bots que se hayan creado. El arreglo es mezclado porsetup_bots()para aleatorizar el orden de los turnos, por lo que no se garantiza que la posición0sea el jugador humano. La máquina de estados itera sobre este arreglo para controlar los turnos. - rocks (
Array[RockScene.Rock]): Todos los objetos de roca colocados en la escena de batalla. Declarado para su uso futuro por los estados de batalla que requieran hacer referencia a posiciones en el mundo.
Métodos
setup_player()
Crea al Player humano a partir del singleton global PlayerStats, genera su baraja (deck), lo añade al arreglo players y conecta la señal deck_updated para mantener sincronizada la visualización de la mano.
func setup_player() -> void:
player = Player.new(PlayerStats.player_name, PlayerStats.team, false)
player.create_deck()
players.append(player)
player.randomize() # Temporary
player.deck_updated.connect(battle_ui.set_hand_from_deck)
La llamada a
player.randomize()es un andamiaje temporal que asigna un estado aleatorio al jugador con fines de desarrollo y pruebas. Elimínala o reemplázala con una inicialización determinista antes del lanzamiento.
La conexión de la señal en la última línea significa que cada vez que el mazo del jugador cambie (cartas robadas, descartadas o reordenadas), BattleUI.set_hand_from_deck se ejecutará automáticamente con el mazo actualizado. No necesitas llamar manualmente a set_hand_from_deck después de este punto.
setup_bots()
Genera entre 1 y MAX_PLAYERS - 1 bots de IA, cada uno con una baraja recién creada. Una vez añadidos todos los bots, se mezcla el arreglo completo de players para aleatorizar el orden de los turnos.
func setup_bots() -> void:
var bots_count := randi_range(1, MAX_PLAYERS - 1)
for i in range(bots_count):
var new_bot := Player.new()
new_bot.create_deck()
players.append(new_bot)
print_debug("[BattleManager] Nuevo bot creado: %s!" % new_bot.player_name)
# ! Temporal
new_bot.randomize()
players.shuffle()
print_debug(
"[BattleManager] %s jugadores en juego: %s"
% [bots_count, players.map(func(p): return p.player_name)]
)
- bots_count (
int): Elegido de forma aleatoria medianterandi_range(1, MAX_PLAYERS - 1). ConMAX_PLAYERS = 4, esto produce 1, 2 o 3 bots por batalla.
Las instancias de bots de la clase
Playerse construyen sin argumentos (Player.new()), por lo que reciben nombres autogenerados. Los jugadores humanos pasanPlayerStats.player_nameyPlayerStats.teamde forma explícita.
setup_ui()
Prepara la interfaz de usuario de la batalla para el inicio del combate: actualiza los paneles de estadísticas de todos los jugadores, llena la mano del jugador humano con su mazo actual y oculta la pantalla de fin de partida.
func setup_ui() -> void:
battle_ui.refresh_player_stats(players)
battle_ui.set_hand_from_deck(player.deck)
battle_ui.set_end_ui(false)
Llama a setup_ui() una vez completados tanto setup_player() como setup_bots(), de modo que players esté completamente lleno cuando refresh_player_stats realice la iteración.
setup_world()
Configura los elementos 3D del mundo. Desactiva la interacción con el dado al inicio del combate para que el jugador no pueda lanzarlo antes de que la máquina de estados lo permita.
func setup_world() -> void:
battle_world.set_dice(false)
BattleWorld.set_dice(enabled: bool) establece dice.clickable en el nodo subyacente Dice. La máquina de estados de batalla vuelve a activar la interacción con el dado al inicio del turno del jugador humano.
Secuencia de inicialización
BattleStart invoca estos cuatro métodos de configuración en el siguiente orden:
- setup_player(): Crea al jugador humano, genera su baraja y conecta la señal
deck_updated→set_hand_from_deck. - setup_bots(): Genera aleatoriamente de 1 a 3 bots, los añade a
playersy luego mezclaplayerspara definir el orden de los turnos. - setup_ui(): Actualiza los paneles de estadísticas de todos los jugadores, inicializa la visualización de la mano y oculta la UI de fin de partida.
- setup_world(): Desactiva el dado 3D hasta que la máquina de estados lo active al inicio del turno del jugador humano.
Conexión de señales
La conexión de señales más importante establecida por BattleManager es:
player.deck_updated.connect(battle_ui.set_hand_from_deck)
| Señal | Origen | Destino | Efecto |
|---|---|---|---|
deck_updated | Player | BattleUI.set_hand_from_deck | Vuelve a renderizar la mano mostrada cada vez que cambia la baraja del jugador |
Esta única línea mantiene la representación visual del sistema de cartas sincronizada con el estado del juego, sin necesidad de llamar manualmente a actualizaciones de la interfaz en todo tu código.