wip: implement post turn handling
This commit is contained in:
parent
7bac3bd46a
commit
f3b5fc277e
@ -8,7 +8,6 @@
|
|||||||
<option name="testRunner" value="GRADLE" />
|
<option name="testRunner" value="GRADLE" />
|
||||||
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
<option name="distributionType" value="DEFAULT_WRAPPED" />
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
||||||
<option name="gradleHome" value="$PROJECT_DIR$/../../../../../../../utils/gradle-7.0" />
|
|
||||||
<option name="modules">
|
<option name="modules">
|
||||||
<set>
|
<set>
|
||||||
<option value="$PROJECT_DIR$" />
|
<option value="$PROJECT_DIR$" />
|
||||||
|
@ -5,6 +5,7 @@ import uulm.teamname.marvelous.gamelibrary.events.Event;
|
|||||||
import uulm.teamname.marvelous.gamelibrary.events.EventType;
|
import uulm.teamname.marvelous.gamelibrary.events.EventType;
|
||||||
import uulm.teamname.marvelous.gamelibrary.requests.Request;
|
import uulm.teamname.marvelous.gamelibrary.requests.Request;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Observer;
|
import java.util.Observer;
|
||||||
|
|
||||||
/** Represents a game instance. */
|
/** Represents a game instance. */
|
||||||
@ -36,6 +37,12 @@ public class GameInstance {
|
|||||||
public boolean checkRequestsAndApply(Request... requests) {
|
public boolean checkRequestsAndApply(Request... requests) {
|
||||||
if(manager.processRequests(requests, true)) {
|
if(manager.processRequests(requests, true)) {
|
||||||
emit(manager.apply());
|
emit(manager.apply());
|
||||||
|
|
||||||
|
Event[] result = manager.checkPostPhase();
|
||||||
|
if(result.length > 0) {
|
||||||
|
emit(result);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -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<Event> 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<Event> handleTurnEnd(GameState state) {
|
||||||
|
ArrayList<Event> result = new ArrayList<>();
|
||||||
|
|
||||||
|
ArrayList<EntityID> order = state.turnOrder;
|
||||||
|
ArrayList<EntityID> 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.
|
* Checks a {@link GameState} for the current overtime win condition.
|
||||||
* @param state The game state to check
|
* @param state The game state to check
|
||||||
|
@ -45,6 +45,14 @@ class GameStateManager {
|
|||||||
return true;
|
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.
|
* Applies an array of {@link Event}s to the game state.
|
||||||
* @param events The events to apply
|
* @param events The events to apply
|
||||||
|
Loading…
Reference in New Issue
Block a user