Gamelib/src/main/java/uulm/teamname/marvelous/gamelibrary/gamelogic/GameStateManager.java

143 lines
4.2 KiB
Java
Raw Normal View History

package uulm.teamname.marvelous.gamelibrary.gamelogic;
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;
/** Represents manager for a game state. */
class GameStateManager {
/** The managed {@link GameState} */
private final GameState state;
/** The queue of {@link Event}s to be applied during {@link Request} processing */
private final ArrayList<Event> queue = new ArrayList<>();
/**
* Constructs a new {@link GameStateManager}.
* @param state A reference to the state to be managed
*/
public GameStateManager(GameState state) {
this.state = state;
}
/**
* Checks a list of {@link Request}s for validity and optionally produces resulting {@link Event}s.
* @param requests The requests to check
* @param apply True if resulting events should be stored for later application
* @return Whether the requests are valid
*/
public boolean processRequests(ArrayList<Request> requests, boolean apply) {
GameState snapshot = state.snapshot();
for(Request request: requests) {
if (GameLogic.checkRequest(snapshot, request)) {
ArrayList<Event> result = GameLogic.executeRequest(snapshot, request);
for(Event event: result) {
GameLogic.applyEvent(snapshot, event);
}
if(apply) {
queue.addAll(result);
}
}else {
queue.clear();
return false;
}
}
return true;
}
/**
* Applies an array of {@link Event}s to the game state.
* @param events The events to apply
*/
public void applyEvents(Event[] events) {
for(Event event: events) {
GameLogic.applyEvent(state, event);
}
}
2021-05-19 17:59:41 +00:00
/**
* Applies an array of {@link Event}s to the game state.
* @param events The events to apply
2021-05-19 17:59:41 +00:00
*/
public void applyEvents(ArrayList<Event> events) {
for(Event event: events) {
GameLogic.applyEvent(state, event);
}
2021-05-19 17:59:41 +00:00
}
2021-05-31 19:37:18 +00:00
/**
* Applies an {@link Event} to the game state.
* @param event The event to apply
2021-05-31 19:37:18 +00:00
*/
public void applyEvent(Event event) {
GameLogic.applyEvent(state, event);
2021-05-31 19:37:18 +00:00
}
2021-05-19 18:04:10 +00:00
/**
* Applies the result of the last processRequests call.
* @return A list of applied events
2021-05-19 18:04:10 +00:00
*/
public ArrayList<Event> apply() {
for(Event event: queue) {
GameLogic.applyEvent(state, event);
}
// i feel so smart for remembering this trick
try {
return new ArrayList<>(queue);
}finally {
queue.clear();
}
2021-05-19 18:04:10 +00:00
}
/**
* Handles events that happen after a turn phase.
* @return The optionally resulting {@link Event}s
*/
public ArrayList<Event> checkPostPhase() {
ArrayList<Event> result = GameLogic.checkTurnEnd(state);
applyEvents(result);
return result;
}
/**
* Initializes and starts the game.
* @param selectedCharacters1 The characters selected by player 1
* @param selectedCharacters2 The characters selected by player 2
* @return The resulting {@link Event}s
*/
public ArrayList<Event> startGame(ArrayList<Integer> selectedCharacters1, ArrayList<Integer> selectedCharacters2) {
ArrayList<Event> result = GameLogic.startGame(state, selectedCharacters1, selectedCharacters2);
applyEvents(result);
ArrayList<Event> result2 = GameLogic.startRound(state);
applyEvents(result2);
result.addAll(result2);
return result;
}
/**
* Forcefully ends the current turn.
* @return The resulting {@link Event}s
*/
public ArrayList<Event> endTurn() {
ArrayList<Event> result = GameLogic.endTurn(state);
applyEvents(result);
return result;
}
/**
* Produces a {@link EventType#GamestateEvent} for the current {@link GameState}.
* @return The resulting event
*/
public Event getGameStateEvent() {
return GameLogic.buildGameStateEvent(state);
}
}