Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 46 additions & 25 deletions app/events/EndTurnClicked.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand All @@ -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++) {
Expand Down Expand Up @@ -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());
}
}
}
}
17 changes: 9 additions & 8 deletions app/events/Initalize.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,30 +92,31 @@ 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));

// --------------------------------------------------------
// 3. Initialize Visual Player Objects (Avatars on UI)
// --------------------------------------------------------

// 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());
Expand Down
11 changes: 8 additions & 3 deletions app/structures/GameState.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package structures;

import structures.basic.Card;
import structures.basic.Player;
import structures.basic.Tile;
import structures.basic.Unit;

/**
* GameState
Expand Down Expand Up @@ -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 {
Expand Down