From 4afe5ad10519e9e04222bb1a293162063932a018 Mon Sep 17 00:00:00 2001 From: 2937915z <2937915z@student.gla.ac.uk> Date: Sun, 8 Mar 2026 02:48:18 +0000 Subject: [PATCH] Complete strict Mana logic for story card 6 --- app/events/EndTurnClicked.java | 71 ++++++++++++++++++++++------------ app/events/Initalize.java | 17 ++++---- app/structures/GameState.java | 11 ++++-- 3 files changed, 63 insertions(+), 36 deletions(-) diff --git a/app/events/EndTurnClicked.java b/app/events/EndTurnClicked.java index 3e1edaf..e303f85 100644 --- a/app/events/EndTurnClicked.java +++ b/app/events/EndTurnClicked.java @@ -7,6 +7,7 @@ import structures.GameUnit; import structures.MovementRule; import structures.AttackLogic; +import structures.GamePlayer; import structures.basic.Card; import structures.basic.Tile; import structures.basic.Unit; @@ -63,10 +64,11 @@ public void processEvent(ActorRef out, GameState gameState, JsonNode message) { // 3. Clear logical selection state (Clear selectedUnit and selectedCard in memory) gameState.selectionState.clear(); - // 3b. Visually and logically clear Human player's mana at end of turn - gameState.humanPlayer.setMana(0); - gameState.humanPlayer.getBasicPlayer().setMana(0); - BasicCommands.setPlayer1Mana(out, gameState.humanPlayer.getBasicPlayer()); + // 3b. Human ends current turn -> unused Mana is lost + clearPlayerMana(out, gameState.humanPlayer, true); + + // Prepare Human's NEXT turn number + gameState.humanTurnNumber++; // 4. Remove Stunned status from Human units // (If a unit was stunned, the penalty is considered paid at the end of the turn) @@ -84,37 +86,25 @@ public void processEvent(ActorRef out, GameState gameState, JsonNode message) { // -------------------------------------------------------- BasicCommands.addPlayer1Notification(out, "Enemy Turn", 2); - // Update AI Mana (Cap at 9) - int currentAIMax = gameState.aiPlayer.getMaxMana(); - if (currentAIMax < 9) gameState.aiPlayer.setMaxMana(currentAIMax + 1); - if (gameState.aiPlayer.getMaxMana() > 9) gameState.aiPlayer.setMaxMana(9); - gameState.aiPlayer.setMana(gameState.aiPlayer.getMaxMana()); - - // Sync AI Mana with frontend (Player 2) - gameState.aiPlayer.getBasicPlayer().setMana(gameState.aiPlayer.getMana()); - BasicCommands.setPlayer2Mana(out, gameState.aiPlayer.getBasicPlayer()); + // Start AI turn using AI's OWN turn number + applyTurnMana(out, gameState, gameState.aiPlayer, false, gameState.aiTurnNumber); // Run the main AI logic executeAITurn(out, gameState); - gameState.aiPlayer.setMana(0); - gameState.aiPlayer.getBasicPlayer().setMana(0); - BasicCommands.setPlayer2Mana(out, gameState.aiPlayer.getBasicPlayer()); + // AI ends current turn -> unused Mana is lost + clearPlayerMana(out, gameState.aiPlayer, false); + + // Prepare AI's NEXT turn number + gameState.aiTurnNumber++; // -------------------------------------------------------- // Step 3: Start Human Turn // -------------------------------------------------------- BasicCommands.addPlayer1Notification(out, "Your Turn!", 2); - // Update Human Mana (Cap at 9) - int currentHumanMax = gameState.humanPlayer.getMaxMana(); - if (currentHumanMax < 9) gameState.humanPlayer.setMaxMana(currentHumanMax + 1); - if (gameState.humanPlayer.getMaxMana() > 9) gameState.humanPlayer.setMaxMana(9); - gameState.humanPlayer.setMana(gameState.humanPlayer.getMaxMana()); - - // Sync Human Mana with frontend (Player 1) - gameState.humanPlayer.getBasicPlayer().setMana(gameState.humanPlayer.getMana()); - BasicCommands.setPlayer1Mana(out, gameState.humanPlayer.getBasicPlayer()); + // Start Human turn using Human's OWN turn number + applyTurnMana(out, gameState, gameState.humanPlayer, true, gameState.humanTurnNumber); // Draw card for Human player for (int i = 0; i < 1; i++) { @@ -781,4 +771,35 @@ private GameUnit getHero(GameState gameState, structures.GamePlayer player) { private boolean isAvatar(GameUnit unit) { return unit.getBasicUnit().getId() == 1 || unit.getBasicUnit().getId() == 2; } + + private void setPlayerManaAndUI(ActorRef out, GamePlayer player, boolean isHumanPlayer, int mana) { + player.setMaxMana(mana); + player.setMana(mana); + + if (player.getBasicPlayer() != null) { + player.getBasicPlayer().setMana(mana); + if (isHumanPlayer) { + BasicCommands.setPlayer1Mana(out, player.getBasicPlayer()); + } else { + BasicCommands.setPlayer2Mana(out, player.getBasicPlayer()); + } + } + } + + private void applyTurnMana(ActorRef out, GameState gameState, GamePlayer player, boolean isHumanPlayer, int turnNumber) { + int mana = gameState.manaForTurn(turnNumber); + setPlayerManaAndUI(out, player, isHumanPlayer, mana); + } + + private void clearPlayerMana(ActorRef out, GamePlayer player, boolean isHumanPlayer) { + player.setMana(0); + if (player.getBasicPlayer() != null) { + player.getBasicPlayer().setMana(0); + if (isHumanPlayer) { + BasicCommands.setPlayer1Mana(out, player.getBasicPlayer()); + } else { + BasicCommands.setPlayer2Mana(out, player.getBasicPlayer()); + } + } + } } diff --git a/app/events/Initalize.java b/app/events/Initalize.java index 018a526..b3c7739 100644 --- a/app/events/Initalize.java +++ b/app/events/Initalize.java @@ -92,16 +92,18 @@ public void processEvent(ActorRef out, GameState gameState, JsonNode message) { // 2. Initialize Logical Players // -------------------------------------------------------- + gameState.humanTurnNumber = 1; + gameState.aiTurnNumber = 1; + // Human Player Setup gameState.humanPlayer = new GamePlayer(); - gameState.humanPlayer.setMana(3); - gameState.humanPlayer.setMaxMana(3); + gameState.humanPlayer.setMana(gameState.manaForTurn(gameState.humanTurnNumber)); + gameState.humanPlayer.setMaxMana(gameState.manaForTurn(gameState.humanTurnNumber)); gameState.humanPlayer.setDeck(OrderedCardLoader.getPlayer1Cards(2)); - // AI Player Setup gameState.aiPlayer = new GamePlayer(); - gameState.aiPlayer.setMana(3); - gameState.aiPlayer.setMaxMana(3); + gameState.aiPlayer.setMana(gameState.manaForTurn(gameState.aiTurnNumber)); + gameState.aiPlayer.setMaxMana(gameState.manaForTurn(gameState.aiTurnNumber)); gameState.aiPlayer.setDeck(OrderedCardLoader.getPlayer2Cards(2)); // -------------------------------------------------------- @@ -109,13 +111,12 @@ public void processEvent(ActorRef out, GameState gameState, JsonNode message) { // -------------------------------------------------------- // Set Player 1 (Human) Stats UI - Player humanAvatarObj = new Player(20, 3); + Player humanAvatarObj = new Player(20, gameState.manaForTurn(gameState.humanTurnNumber)); gameState.humanPlayer.setBasicPlayer(humanAvatarObj); BasicCommands.setPlayer1Health(out, gameState.humanPlayer.getBasicPlayer()); BasicCommands.setPlayer1Mana(out, gameState.humanPlayer.getBasicPlayer()); - // Set Player 2 (AI) Stats UI - Player aiAvatarObj = new Player(20, 3); + Player aiAvatarObj = new Player(20, gameState.manaForTurn(gameState.aiTurnNumber)); gameState.aiPlayer.setBasicPlayer(aiAvatarObj); BasicCommands.setPlayer2Health(out, gameState.aiPlayer.getBasicPlayer()); BasicCommands.setPlayer2Mana(out, gameState.aiPlayer.getBasicPlayer()); diff --git a/app/structures/GameState.java b/app/structures/GameState.java index 773f453..0eb0c97 100644 --- a/app/structures/GameState.java +++ b/app/structures/GameState.java @@ -1,9 +1,6 @@ package structures; import structures.basic.Card; -import structures.basic.Player; -import structures.basic.Tile; -import structures.basic.Unit; /** * GameState @@ -35,6 +32,14 @@ public class GameState { // Current selection status of cards or units public SelectionState selectionState = new SelectionState(); + // Human starts on turn 1, AI is also prepared for turn 1. + public int humanTurnNumber = 1; + public int aiTurnNumber = 1; + + public int manaForTurn(int turnNumber) { + return Math.min(turnNumber + 1, 9); + } + //Inner class to manage the selection state of units and cards. public class SelectionState {