/* * AiWrapper.java * * Copyright (C) 2015 Pixelgaffer * * This work is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by the * Free Software Foundation; either version 2 of the License, or any later * version. * * This work is distributed in the hope that it will be useful, but without * any warranty; without even the implied warranty of merchantability or * fitness for a particular purpose. See version 2 and version 3 of the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.pixelgaffer.turnierserver.backend; import java.io.IOException; import java.util.UUID; import org.pixelgaffer.turnierserver.backend.Games.GameImpl; import org.pixelgaffer.turnierserver.backend.Games.GameImpl.GameState; import org.pixelgaffer.turnierserver.gamelogic.interfaces.Ai; import org.pixelgaffer.turnierserver.gamelogic.interfaces.AiObject; import org.pixelgaffer.turnierserver.networking.messages.MessageForward; import lombok.AccessLevel; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.Setter; /** * Diese Klasse repräsentiert eine KI intern für Backend und Spiellogik. */ @RequiredArgsConstructor public class AiWrapper implements Ai { /** Das zugrundeliegende Spiel, enthält die Spiellogik. */ @NonNull @Getter private GameImpl game; /** Die UUID der KI im Netzwerk. */ @Getter @Setter(AccessLevel.PACKAGE) @NonNull private UUID uuid; /** Der ID-String dieser KI. */ @Setter @Getter private String id; /** Die ID dieser KI. */ @Setter @Getter private int aiId; /** Die Version dieser KI. */ @Setter @Getter private int version; /** Der Index der KI in der Liste. */ @Getter @Setter private int index; /** Die {@link WorkerConnection} dieser KI. */ @Setter @Getter private WorkerConnection connection; /** Gibt an, ob die KI mit dem Worker verbunden ist. */ @Getter private boolean connected; /** Die Programmiersprache dieser KI. */ @Getter @NonNull private String lang; /** * Wird aufgerufen wenn die KI mit dem Worker verbunden wurde. Wenn alle * KIs verbunden sind, wird das Spiel endgültig gestartet. */ public void connected () { BackendMain.getLogger().info("Die KI " + uuid + " hat sich verbunden!"); connected = true; getGame().aiConnected(); } /** * Empfängt eine Nachricht und leitet sie an die Spiellogik weiter, wenn * diese gestartet ist. */ public void receiveMessage (byte message[]) { if (getGame().getLogic().isStarted()) getGame().getLogic().receiveMessage(message, this); else BackendMain.getLogger().warning("received message but game wasn't started"); } /** Sendet eine Nachricht an die KI. */ public void sendMessage (byte message[]) throws IOException { if (connection == null) throw new IOException("Not connected"); MessageForward mf = new MessageForward(uuid, message); connection.sendMessage(mf); } /** Hier kann die Spiellogik Informationen über die KI abspeichern. */ @Getter @Setter private AiObject object; @Override public void disconnect () throws IOException { BackendMain.getLogger().info("Die KI " + uuid + " wird disconnected"); connected = false; connection.killJob(this); } /** * Wird aufgerufen, wenn die KI, aus welchen Gründen auch immer, * abgestürtzt ist oder sich beendet hat. */ public void crashed () { if (!isConnected() && (game.getState() != GameState.WAITING)) return; BackendMain.getLogger().info("Die KI " + uuid + " ist abgestürtzt"); // wenn das Spiel noch läuft der GameLogik mitteilen dass die KI sich // beendet hat if (getGame().getState() == GameState.STARTED) getGame().getLogic().aiCrashed(this); // wenn sich die KI noch gar nicht verbunden hat diese als gestartet // markieren damit // die GameLogik das spiel startet und die KI entsprechend behandelt if (!isConnected()) connected(); } }