diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a2fbb6d..592fdc7 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -8,7 +8,6 @@ - diff --git a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameInstance.java b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameInstance.java index 477fb70..52b1722 100644 --- a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameInstance.java +++ b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameInstance.java @@ -5,6 +5,7 @@ import uulm.teamname.marvelous.gamelibrary.events.Event; import uulm.teamname.marvelous.gamelibrary.events.EventType; import uulm.teamname.marvelous.gamelibrary.requests.Request; +import java.util.ArrayList; import java.util.Observer; /** Represents a game instance. */ @@ -36,6 +37,12 @@ public class GameInstance { public boolean checkRequestsAndApply(Request... requests) { if(manager.processRequests(requests, true)) { emit(manager.apply()); + + Event[] result = manager.checkPostPhase(); + if(result.length > 0) { + emit(result); + } + return true; } return false; diff --git a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java index 22946e3..99f2caa 100644 --- a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java +++ b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameLogic.java @@ -469,6 +469,98 @@ class GameLogic { } } + /** + * Starts end of round handling if necessary. + * @param state The game state to work on + * @return The list of resulting {@link Event}s + */ + public static ArrayList checkTurnEnd(GameState state) { + if( + ((Character) state.entities.findEntity(state.activeCharacter)).ap.getValue() <= 0 && + ((Character) state.entities.findEntity(state.activeCharacter)).mp.getValue() <= 0 + ) { + return handleTurnEnd(state); + } + + return new ArrayList<>(); + } + + /** + * Handles everything that happens at the end of a turn, including new rounds. + * @param state The game state to work on + * @return The list of resulting {@link Event}s + */ + private static ArrayList handleTurnEnd(GameState state) { + ArrayList result = new ArrayList<>(); + + ArrayList order = state.turnOrder; + ArrayList alive = new ArrayList<>(); + + state.turnNumber++; + boolean newRound = false; + + for (EntityID id: order) { + Character character = ((Character)state.entities.findEntity(id)); + + if(character.hp.getValue() > 0){ + alive.add(id); + } + + if(character.inventory.getFreeSlots() == 0) { // no slots => has all infinity stones + state.won = true; + result.add(new EventBuilder(EventType.WinEvent) + .withPlayerWon(character.id.id) + .buildGameEvent()); + return result; + } + } + + if(alive.isEmpty()) { + + //thanos win handling + + }else { + + int activeIndex = alive.indexOf(state.activeCharacter); + if(activeIndex == alive.size() - 1) { + state.activeCharacter = alive.get(0); + //reached end of turn order, new round + state.roundNumber++; + newRound = true; + }else { + state.activeCharacter = alive.get(activeIndex + 1); + } + Character activeCharacter = (Character)state.entities.findEntity(state.activeCharacter); + + result.add(new EventBuilder(EventType.ConsumedAPEvent) + .withTargetEntity(state.activeCharacter) + .withTargetField(activeCharacter.getPosition()) + .withAmount(activeCharacter.ap.getValue() - activeCharacter.ap.max) + .buildGameEvent()); + result.add(new EventBuilder(EventType.ConsumedMPEvent) + .withTargetEntity(state.activeCharacter) + .withTargetField(activeCharacter.getPosition()) + .withAmount(activeCharacter.mp.getValue() - activeCharacter.mp.max) + .buildGameEvent()); + result.add(new EventBuilder(EventType.TurnEvent) + .withTurnCount(alive.size()) + .withNextCharacter(state.activeCharacter) + .buildGameEvent()); + + } + + if(newRound) { + //special round handling + //shuffle turn order + /* + result.add(new EventBuilder(EventType.RoundSetupEvent) + .buildGameEvent()); + */ + } + + return result; + } + /** * Checks a {@link GameState} for the current overtime win condition. * @param state The game state to check diff --git a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameStateManager.java b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameStateManager.java index 5738627..8b6f33b 100644 --- a/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameStateManager.java +++ b/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameStateManager.java @@ -45,6 +45,14 @@ class GameStateManager { return true; } + /** + * Handles events that happen after a turn phase. + * @return The optionally resulting {@link Event}s + */ + public Event[] checkPostPhase() { + return (Event[])GameLogic.checkTurnEnd(state).toArray(); + } + /** * Applies an array of {@link Event}s to the game state. * @param events The events to apply