package org.pixelgaffer.turnierserver.gamelogic; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.pixelgaffer.turnierserver.Airbrake; import org.pixelgaffer.turnierserver.gamelogic.interfaces.Ai; import org.pixelgaffer.turnierserver.gamelogic.interfaces.AiObject; import org.pixelgaffer.turnierserver.gamelogic.interfaces.Game; /** * @param <E> * Das AiObject * @param <R> * Die Antwort der Ai */ public abstract class TurnBasedGameLogic<E extends AiObject, R> extends GameStateLogic<E, R> { /** * Die AIs, deren Antworten erhalten wurden */ private List<Ai> received = new ArrayList<>(); /** * Wird aufgerufen, wenn alle AIs geantwortet haben, und der Gamestate geupdated werden muss * * @return Das Objekt für den renderer, wenn null wird nichts gesendet */ protected abstract Object update(); @Override protected final void receive(R response, Ai ai, int passedMikros) { if (getUserObject(ai).lost) { logger.warning("Verlorene KI schickt noch stuff; wird ignoriert [" + ai.getId() + "]"); return; } // logger.debug("Habe tolle Sachen von KI " + ai.getId() + " emfangen!"); if (received.contains(ai)) { logger.critical("Habe von einer KI zweimal was emfangen: " + ai.getId()); return; } if(getUserObject(ai).subtractMikros(passedMikros)) { return; } received.add(ai); gamestate.applyChanges(response, ai); check(); } @Override public void startGame(Game game) { super.startGame(game); started = true; try { sendGameState(); } catch (IOException e) { Airbrake.log(e).printStackTrace(); } } /** * super.lost(Ai ai) MUSS AUFGERUFEN WERDEN (auser das Spiel wird beendet)!! */ @Override public void lost(Ai ai) { if (!received.contains(ai)) { received.add(ai); check(); } } private void check() { if (received.size() == game.getAis().size()) { Object update = update(); if (gameEnded) { return; } if (update != null) { sendRenderData(update); } round(); if (allRoundsPlayed()) { endGame("Die maximale Anzahl an Runden (" + maxTurns + ") wurde gespielt"); return; } received.clear(); try { sendGameState(); } catch (IOException e) { Airbrake.log(e).printStackTrace(); } for (Ai wrapper : game.getAis()) { if (getUserObject(wrapper).lost) { received.add(wrapper); } } } } }