Rydder kraftig opp i koden

Legger til alle manglende kommentarer
Fikser en del variabelnavn med feil camelCase
Legger til en boks som gir beskjed om at et navn ikke kan være tomt
Oppdaterer versjon i pom og readme
Forenkler noen av testene
Fjerner duplisert kode i tester
Fikser problemer rapportert av Codacy
Bytter navn på respons beholdere for å tydeliggjøre bruk
Fjerner ubrukte metoder
Fikser noen skrivefeil
This commit is contained in:
Kristian Knarvik 2020-04-22 23:14:06 +02:00
parent 6394bd9655
commit acab7345f2
36 changed files with 372 additions and 285 deletions

View File

@ -36,6 +36,6 @@ Dette vil også kjøre alle tester i koden
### Kjøreprosedyre ### Kjøreprosedyre
```shell script ```shell script
cd target cd target
java -jar roborally-0.2-alpha-jar-with-dependencies.jar java -jar roborally-0.4-alpha-jar-with-dependencies.jar
``` ```
Den produserte .jar filen kan alternativt flyttes til en annen mappe og dobbeltklikkes for å kjøres. Den produserte .jar filen kan alternativt flyttes til en annen mappe og dobbeltklikkes for å kjøres.

View File

@ -6,7 +6,7 @@
<groupId>inf112.fiasko.roborally</groupId> <groupId>inf112.fiasko.roborally</groupId>
<artifactId>roborally</artifactId> <artifactId>roborally</artifactId>
<version>0.3-alpha</version> <version>0.4-alpha</version>
<packaging>jar</packaging> <packaging>jar</packaging>

View File

@ -4,11 +4,13 @@ import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration; import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper; import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
/**
* The mail class which runs the game
*/
public class Main { public class Main {
public static void main(String[] args) { public static void main(String[] args) {
LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration(); LwjglApplicationConfiguration cfg = new LwjglApplicationConfiguration();
cfg.title = "Game Board"; cfg.title = "Robo Rally";
cfg.width = 900; cfg.width = 900;
cfg.height = 900; cfg.height = 900;
cfg.samples = 3; cfg.samples = 3;

View File

@ -6,7 +6,7 @@ package inf112.fiasko.roborally.elementproperties;
public enum GameState { public enum GameState {
/** /**
* At the absolute start of the game, before anything has happended * At the absolute start of the game, before anything has happened
*/ */
BEGINNING_OF_GAME, BEGINNING_OF_GAME,
/** /**
@ -45,9 +45,13 @@ public enum GameState {
* Indicates that the game is no longer running * Indicates that the game is no longer running
*/ */
EXITED, EXITED,
/**
* Indicates that the game is in the process of skipping the power down screen
*/
SKIP_POWER_DOWN_SCREEN, SKIP_POWER_DOWN_SCREEN,
/**
* Indicates that the game is in the process of skipping the stay in power down screen
*/
SKIP_STAY_IN_POWER_DOWN SKIP_STAY_IN_POWER_DOWN
} }

View File

@ -1,5 +1,8 @@
package inf112.fiasko.roborally.elementproperties; package inf112.fiasko.roborally.elementproperties;
/**
* This enum represents all possible particle types
*/
public enum ParticleType { public enum ParticleType {
/** /**
* The beam emitting from a single laser * The beam emitting from a single laser

View File

@ -68,24 +68,81 @@ public enum TileType {
* A fast conveyor belt with one entrance on the right and one from behind * A fast conveyor belt with one entrance on the right and one from behind
*/ */
CONVEYOR_BELT_FAST_SIDE_ENTRANCE_RIGHT(16), CONVEYOR_BELT_FAST_SIDE_ENTRANCE_RIGHT(16),
/**
* The first flag a robot has to visit to win the game
*/
FLAG_1(17), FLAG_1(17),
/**
* The second flag a robot has to visit to win the game
*/
FLAG_2(18), FLAG_2(18),
/**
* The third flag a robot has to visit to win the game
*/
FLAG_3(19), FLAG_3(19),
/**
* The fourth flag a robot has to visit to win the game
*/
FLAG_4(20), FLAG_4(20),
/**
* A wrench which repairs a robot
*/
WRENCH(21), WRENCH(21),
/**
* A wrench and hammer which repairs a robot
*/
WRENCH_AND_HAMMER(22), WRENCH_AND_HAMMER(22),
/**
* The spawn location belonging to the first robot
*/
ROBOT_SPAWN_1(23), ROBOT_SPAWN_1(23),
/**
* The spawn location belonging to the second robot
*/
ROBOT_SPAWN_2(24), ROBOT_SPAWN_2(24),
/**
* The spawn location belonging to the third robot
*/
ROBOT_SPAWN_3(25), ROBOT_SPAWN_3(25),
/**
* The spawn location belonging to the fourth robot
*/
ROBOT_SPAWN_4(26), ROBOT_SPAWN_4(26),
/**
* The spawn location belonging to the fifth robot
*/
ROBOT_SPAWN_5(27), ROBOT_SPAWN_5(27),
/**
* The spawn location belonging to the sixth robot
*/
ROBOT_SPAWN_6(28), ROBOT_SPAWN_6(28),
/**
* The spawn location belonging to the seventh robot
*/
ROBOT_SPAWN_7(29), ROBOT_SPAWN_7(29),
/**
* The spawn location belonging to the eight robot
*/
ROBOT_SPAWN_8(30), ROBOT_SPAWN_8(30),
/**
* A pit without edges a robot may fall into
*/
PIT_EMPTY(31), PIT_EMPTY(31),
/**
* A pit with all edges a robot may fall into
*/
PIT_FULL(32), PIT_FULL(32),
/**
* A pit with one edge a robot may fall into
*/
PIT_NORMAL(33), PIT_NORMAL(33),
/**
* A pit with two connected edges the robot may fall into
*/
PIT_CORNER(34), PIT_CORNER(34),
/**
* A pit with three edges the robot may fall into
*/
PIT_U(35); PIT_U(35);
private final int tileTypeID; private final int tileTypeID;

View File

@ -4,9 +4,21 @@ package inf112.fiasko.roborally.elementproperties;
* This enum represents all possible wall types * This enum represents all possible wall types
*/ */
public enum WallType { public enum WallType {
/**
* A normal wall
*/
WALL_NORMAL(1), WALL_NORMAL(1),
/**
* A wall which consists of two connected walls
*/
WALL_CORNER(2), WALL_CORNER(2),
/**
* A wall with a laser
*/
WALL_LASER_SINGLE(3), WALL_LASER_SINGLE(3),
/**
* A wall with two lasers
*/
WALL_LASER_DOUBLE(4); WALL_LASER_DOUBLE(4);
private final int wallTypeID; private final int wallTypeID;

View File

@ -15,7 +15,6 @@ import inf112.fiasko.roborally.gamewrapper.screens.WinnerScreen;
*/ */
public class ScreenManager { public class ScreenManager {
private BoardActiveScreen boardActiveScreen; private BoardActiveScreen boardActiveScreen;
private PowerDownScreen powerDownScreen;
private LoadingScreen loadingScreen; private LoadingScreen loadingScreen;
private UsernameScreen usernameScreen; private UsernameScreen usernameScreen;
private IPAddressScreen ipAddressScreen; private IPAddressScreen ipAddressScreen;

View File

@ -86,7 +86,6 @@ public class BoardActiveScreen extends AbstractScreen implements InputProcessor
roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getPowerDownScreen(roboRallyWrapper)); roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getPowerDownScreen(roboRallyWrapper));
break; break;
case SKIP_STAY_IN_POWER_DOWN: case SKIP_STAY_IN_POWER_DOWN:
System.out.println("Sent false to server");
roboRallyWrapper.client.sendElement(false); roboRallyWrapper.client.sendElement(false);
roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getLoadingScreen(roboRallyWrapper)); roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getLoadingScreen(roboRallyWrapper));
break; break;
@ -212,6 +211,12 @@ public class BoardActiveScreen extends AbstractScreen implements InputProcessor
} }
/**
* Gets the robot with the corresponding robot id
*
* @param robotID The robot id to get robot for
* @return The robot with the robot id
*/
private Robot getPlayersRobot(RobotID robotID) { private Robot getPlayersRobot(RobotID robotID) {
for (Robot robot : roboRallyWrapper.roboRallyGame.getAllRobots()) { for (Robot robot : roboRallyWrapper.roboRallyGame.getAllRobots()) {
if (robot.getRobotId() == robotID) { if (robot.getRobotId() == robotID) {

View File

@ -98,8 +98,6 @@ public class CardChoiceScreen extends InputAdapter implements Screen {
for (int i = 4; i > (4 - lockedCardsInt); i--) { for (int i = 4; i > (4 - lockedCardsInt); i--) {
newProgram.add(oldProgram.get(i)); newProgram.add(oldProgram.get(i));
} }
System.out.println("fuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuasdasdasda234234234: " + newProgram.size());
System.out.println(newProgram);
roboRallyWrapper.roboRallyGame.setProgram(newProgram); roboRallyWrapper.roboRallyGame.setProgram(newProgram);
roboRallyWrapper.roboRallyGame.setGameState(GameState.CHOOSING_POWER_DOWN); roboRallyWrapper.roboRallyGame.setGameState(GameState.CHOOSING_POWER_DOWN);

View File

@ -27,7 +27,7 @@ public class IPAddressScreen extends AbstractScreen {
private final OrthographicCamera camera; private final OrthographicCamera camera;
private final Viewport viewport; private final Viewport viewport;
private final Stage stage; private final Stage stage;
private TextField txtinput; private TextField textInput;
/** /**
* Instantiates a new ip address screen * Instantiates a new ip address screen
@ -50,7 +50,7 @@ public class IPAddressScreen extends AbstractScreen {
@Override @Override
public void touchUp(InputEvent e, float x, float y, int point, int button) { public void touchUp(InputEvent e, float x, float y, int point, int button) {
try { try {
roboRallyWrapper.client = new RoboRallyClient(txtinput.getText(), roboRallyWrapper); roboRallyWrapper.client = new RoboRallyClient(textInput.getText(), roboRallyWrapper);
roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getUsernameScreen(roboRallyWrapper)); roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getUsernameScreen(roboRallyWrapper));
} catch (IOException ex) { } catch (IOException ex) {
ex.printStackTrace(); ex.printStackTrace();
@ -59,10 +59,10 @@ public class IPAddressScreen extends AbstractScreen {
} }
} }
}); });
txtinput = new TextField("", skin); textInput = new TextField("", skin);
txtinput.setPosition(applicationWidth / 2f - txtinput.getWidth() / 2f, 250); textInput.setPosition(applicationWidth / 2f - textInput.getWidth() / 2f, 250);
txtinput.setSize(150, 40); textInput.setSize(150, 40);
stage.addActor(txtinput); stage.addActor(textInput);
stage.addActor(joinButton); stage.addActor(joinButton);
camera = new OrthographicCamera(); camera = new OrthographicCamera();

View File

@ -46,7 +46,6 @@ public class LoadingScreen extends AbstractScreen {
if (roboRallyWrapper.roboRallyGame != null) { if (roboRallyWrapper.roboRallyGame != null) {
GameState gameState = roboRallyWrapper.roboRallyGame.getGameState(); GameState gameState = roboRallyWrapper.roboRallyGame.getGameState();
System.out.println(gameState);
if (gameState != GameState.LOADING) { if (gameState != GameState.LOADING) {
handleScreenChange(gameState); handleScreenChange(gameState);
} }

View File

@ -11,7 +11,7 @@ import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport; import com.badlogic.gdx.utils.viewport.Viewport;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper; import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
import inf112.fiasko.roborally.gamewrapper.SimpleButton; import inf112.fiasko.roborally.gamewrapper.SimpleButton;
import inf112.fiasko.roborally.networking.containers.GameStartInfo; import inf112.fiasko.roborally.networking.containers.GameStartInfoResponse;
import inf112.fiasko.roborally.objects.Player; import inf112.fiasko.roborally.objects.Player;
import inf112.fiasko.roborally.utility.IOUtil; import inf112.fiasko.roborally.utility.IOUtil;
import com.esotericsoftware.kryonet.Connection; import com.esotericsoftware.kryonet.Connection;
@ -48,12 +48,12 @@ public class LobbyScreen extends AbstractScreen {
@Override @Override
public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
roboRallyWrapper.server.startGame(); roboRallyWrapper.server.startGame();
Map<Connection, String> playernames = roboRallyWrapper.server.getPlayerNames(); Map<Connection, String> playerNames = roboRallyWrapper.server.getPlayerNames();
List<Player> playerlist = IOUtil.playerGenerator(playernames, List<Player> playerList = IOUtil.playerGenerator(playerNames,
roboRallyWrapper.server.getRobotID()); roboRallyWrapper.server.getRobotID());
for (Connection connection : playernames.keySet()) { for (Connection connection : playerNames.keySet()) {
roboRallyWrapper.server.sendToClient(connection, new GameStartInfo("Checkmate.txt" roboRallyWrapper.server.sendToClient(connection, new GameStartInfoResponse("Checkmate.txt"
, playerlist, playernames.get(connection))); , playerList, playerNames.get(connection)));
} }
roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getLoadingScreen(roboRallyWrapper)); roboRallyWrapper.setScreen(roboRallyWrapper.screenManager.getLoadingScreen(roboRallyWrapper));
return true; return true;

View File

@ -53,30 +53,30 @@ public class PowerDownScreen extends AbstractScreen {
@Override @Override
public void render(float delta) { public void render(float delta) {
Gdx.gl.glClearColor(0.2f, 1f, 0.2f, 1); Gdx.gl.glClearColor(0.2f, 0.2f, 0.2f, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
camera.update(); camera.update();
roboRallyWrapper.batch.setProjectionMatrix(camera.combined); roboRallyWrapper.batch.setProjectionMatrix(camera.combined);
String descriptiontext; String descriptionText;
if (roboRallyWrapper.roboRallyGame.getGameState() == GameState.CHOOSING_POWER_DOWN) { if (roboRallyWrapper.roboRallyGame.getGameState() == GameState.CHOOSING_POWER_DOWN) {
descriptiontext = "click the button to enter powerdown next round"; descriptionText = "Click the button to enter power down next round";
} else { } else {
descriptiontext = "continue powerdown?"; descriptionText = "Click the button to continue your power down the next round";
} }
int elapsedTime = (int) Math.floor((System.currentTimeMillis() - startTime) / 1000f); int elapsedTime = (int) Math.floor((System.currentTimeMillis() - startTime) / 1000f);
roboRallyWrapper.batch.begin(); roboRallyWrapper.batch.begin();
roboRallyWrapper.font.draw(roboRallyWrapper.batch, descriptiontext, roboRallyWrapper.font.draw(roboRallyWrapper.batch, descriptionText,
applicationWidth / 2f - 380 / 2f, applicationHeight / 2f + 100, 380, 1, applicationWidth / 2f - 380 / 2f, applicationHeight / 2f + 100, 380, 1,
true); true);
roboRallyWrapper.font.draw(roboRallyWrapper.batch, String.valueOf(10 - elapsedTime), roboRallyWrapper.font.draw(roboRallyWrapper.batch, String.valueOf(5 - elapsedTime),
applicationWidth / 2f - 40 / 2f, applicationHeight / 2f - 100, 40, 1, applicationWidth / 2f - 40 / 2f, applicationHeight / 2f - 100, 40, 1,
true); true);
roboRallyWrapper.batch.end(); roboRallyWrapper.batch.end();
stage.draw(); stage.draw();
if (elapsedTime > 10) { if (elapsedTime > 5) {
sendPowerDownStatus(Boolean.FALSE); sendPowerDownStatus(Boolean.FALSE);
} }
} }

View File

@ -13,6 +13,8 @@ import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport; import com.badlogic.gdx.utils.viewport.Viewport;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper; import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
import javax.swing.*;
/** /**
* This screen allows a user to choose their player name * This screen allows a user to choose their player name
*/ */
@ -46,6 +48,7 @@ public class UsernameScreen extends AbstractScreen {
public void touchUp(InputEvent e, float x, float y, int point, int button) { public void touchUp(InputEvent e, float x, float y, int point, int button) {
String userName = textInput.getText(); String userName = textInput.getText();
if (nameInvalid(userName)) { if (nameInvalid(userName)) {
JOptionPane.showMessageDialog(null, "Username cannot be empty.");
return; return;
} }
roboRallyWrapper.client.sendElement(userName); roboRallyWrapper.client.sendElement(userName);

View File

@ -11,8 +11,10 @@ import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.Viewport; import com.badlogic.gdx.utils.viewport.Viewport;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper; import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
import inf112.fiasko.roborally.gamewrapper.SimpleButton; import inf112.fiasko.roborally.gamewrapper.SimpleButton;
import inf112.fiasko.roborally.gamewrapper.screens.AbstractScreen;
/**
* This screen shows which player won the game
*/
public class WinnerScreen extends AbstractScreen { public class WinnerScreen extends AbstractScreen {
private final RoboRallyWrapper roboRallyWrapper; private final RoboRallyWrapper roboRallyWrapper;

View File

@ -5,9 +5,9 @@ import com.esotericsoftware.kryonet.Listener;
import inf112.fiasko.roborally.elementproperties.GameState; import inf112.fiasko.roborally.elementproperties.GameState;
import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper; import inf112.fiasko.roborally.gamewrapper.RoboRallyWrapper;
import inf112.fiasko.roborally.networking.containers.ErrorResponse; import inf112.fiasko.roborally.networking.containers.ErrorResponse;
import inf112.fiasko.roborally.networking.containers.GameStartInfo; import inf112.fiasko.roborally.networking.containers.GameStartInfoResponse;
import inf112.fiasko.roborally.networking.containers.PowerDownContainer; import inf112.fiasko.roborally.networking.containers.PowerDownContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgamsContainer; import inf112.fiasko.roborally.networking.containers.ProgramsContainerResponse;
import inf112.fiasko.roborally.objects.ProgrammingCardDeck; import inf112.fiasko.roborally.objects.ProgrammingCardDeck;
import inf112.fiasko.roborally.objects.RoboRallyGame; import inf112.fiasko.roborally.objects.RoboRallyGame;
@ -42,14 +42,14 @@ class RoboRallyClientListener extends Listener {
wrapper.quit(errorResponse.getErrorMessage()); wrapper.quit(errorResponse.getErrorMessage());
} }
System.out.println(errorResponse.getErrorMessage()); System.out.println(errorResponse.getErrorMessage());
} else if (object instanceof GameStartInfo) { } else if (object instanceof GameStartInfoResponse) {
GameStartInfo info = (GameStartInfo) object; GameStartInfoResponse info = (GameStartInfoResponse) object;
wrapper.roboRallyGame = new RoboRallyGame(info.getPlayerList(), info.getBoardName(), wrapper.roboRallyGame = new RoboRallyGame(info.getPlayerList(), info.getBoardName(),
wrapper.server != null, info.getPlayerName(), wrapper.server); wrapper.server != null, info.getPlayerName(), wrapper.server);
} else if (object instanceof ProgrammingCardDeck) { } else if (object instanceof ProgrammingCardDeck) {
if (((ProgrammingCardDeck) object).isEmpty()) { if (((ProgrammingCardDeck) object).isEmpty()) {
wrapper.roboRallyGame.setProgram(new ArrayList<>()); wrapper.roboRallyGame.setProgram(new ArrayList<>());
if (wrapper.roboRallyGame.getRobotPowerdown()) { if (wrapper.roboRallyGame.getRobotPowerDown()) {
wrapper.roboRallyGame.setGameState(GameState.SKIP_POWER_DOWN_SCREEN); wrapper.roboRallyGame.setGameState(GameState.SKIP_POWER_DOWN_SCREEN);
} else { } else {
wrapper.roboRallyGame.setGameState(GameState.CHOOSING_POWER_DOWN); wrapper.roboRallyGame.setGameState(GameState.CHOOSING_POWER_DOWN);
@ -58,16 +58,16 @@ class RoboRallyClientListener extends Listener {
wrapper.roboRallyGame.setGameState(GameState.CHOOSING_CARDS); wrapper.roboRallyGame.setGameState(GameState.CHOOSING_CARDS);
} }
new Thread(() -> wrapper.roboRallyGame.setPlayerHand((ProgrammingCardDeck) object)).start(); new Thread(() -> wrapper.roboRallyGame.setPlayerHand((ProgrammingCardDeck) object)).start();
} else if (object instanceof ProgamsContainer) { } else if (object instanceof ProgramsContainerResponse) {
new Thread(() -> { new Thread(() -> {
try { try {
wrapper.roboRallyGame.receiveAllPrograms((ProgamsContainer) object); wrapper.roboRallyGame.receiveAllPrograms((ProgramsContainerResponse) object);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} }
}).start(); }).start();
} else if (object instanceof PowerDownContainer) { } else if (object instanceof PowerDownContainerResponse) {
new Thread(() -> wrapper.roboRallyGame.receiveStayInPowerDown((PowerDownContainer) object)).start(); new Thread(() -> wrapper.roboRallyGame.receiveStayInPowerDown((PowerDownContainerResponse) object)).start();
} }
} }

View File

@ -5,8 +5,8 @@ import com.esotericsoftware.kryonet.Connection;
import com.esotericsoftware.kryonet.Listener; import com.esotericsoftware.kryonet.Listener;
import inf112.fiasko.roborally.elementproperties.RobotID; import inf112.fiasko.roborally.elementproperties.RobotID;
import inf112.fiasko.roborally.networking.containers.ErrorResponse; import inf112.fiasko.roborally.networking.containers.ErrorResponse;
import inf112.fiasko.roborally.networking.containers.PowerDownContainer; import inf112.fiasko.roborally.networking.containers.PowerDownContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgamsContainer; import inf112.fiasko.roborally.networking.containers.ProgramsContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgramAndPowerdownRequest; import inf112.fiasko.roborally.networking.containers.ProgramAndPowerdownRequest;
import inf112.fiasko.roborally.objects.ProgrammingCard; import inf112.fiasko.roborally.objects.ProgrammingCard;
@ -136,7 +136,7 @@ class RoboRallyServerListener extends Listener {
for (Connection connected : stayInPowerDown.keySet()) { for (Connection connected : stayInPowerDown.keySet()) {
powerDowns.put(playerNames.get(connected), stayInPowerDown.get(connected)); powerDowns.put(playerNames.get(connected), stayInPowerDown.get(connected));
} }
server.sendToAllClients(new PowerDownContainer(powerDowns)); server.sendToAllClients(new PowerDownContainerResponse(powerDowns));
stayInPowerDown = new HashMap<>(); stayInPowerDown = new HashMap<>();
} }
} }
@ -156,7 +156,7 @@ class RoboRallyServerListener extends Listener {
powerDown.put(playerNames.get(connected), programs.get(connected).getPowerdown()); powerDown.put(playerNames.get(connected), programs.get(connected).getPowerdown());
program.put(playerNames.get(connected), programs.get(connected).getProgram()); program.put(playerNames.get(connected), programs.get(connected).getProgram());
} }
server.sendToAllClients(new ProgamsContainer(program, powerDown)); server.sendToAllClients(new ProgramsContainerResponse(program, powerDown));
programs = new HashMap<>(); programs = new HashMap<>();
} }
} }

View File

@ -17,6 +17,9 @@ public class ErrorResponse {
this.critical = false; this.critical = false;
} }
/**
* Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
*/
public ErrorResponse() { public ErrorResponse() {
} }

View File

@ -7,25 +7,25 @@ import java.util.List;
/** /**
* This class contains information about the game board to be used and the game's players * This class contains information about the game board to be used and the game's players
*/ */
public class GameStartInfo { public class GameStartInfoResponse {
private String boardName; private String boardName;
private List<Player> playerList; private List<Player> playerList;
private String playerName; private String playerName;
/** /**
* Empty initialization method required by kryo * Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
*/ */
public GameStartInfo() { public GameStartInfoResponse() {
} }
/** /**
* Instantiates a new GameStartInfo object * Instantiates a new GameStartInfoResponse object
* *
* @param boardName The name of the board to be used, with extension * @param boardName The name of the board to be used, with extension
* @param playerList List of players for the game * @param playerList List of players for the game
* @param playerName The player name of the receiver * @param playerName The player name of the receiver
*/ */
public GameStartInfo(String boardName, List<Player> playerList, String playerName) { public GameStartInfoResponse(String boardName, List<Player> playerList, String playerName) {
this.playerName = playerName; this.playerName = playerName;
this.boardName = boardName; this.boardName = boardName;
this.playerList = playerList; this.playerList = playerList;
@ -40,15 +40,6 @@ public class GameStartInfo {
return playerName; return playerName;
} }
/**
* Sets the player name of the current player
*
* @param playerName The player name of the current player
*/
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
/** /**
* Gets the list of players * Gets the list of players
* *
@ -58,15 +49,6 @@ public class GameStartInfo {
return playerList; return playerList;
} }
/**
* Sets the list of players for the game
*
* @param playerList List of players for the game
*/
public void setPlayerList(List<Player> playerList) {
this.playerList = playerList;
}
/** /**
* Gets the board name * Gets the board name
* *
@ -76,13 +58,4 @@ public class GameStartInfo {
return boardName; return boardName;
} }
/**
* Sets the name of the board to be used
*
* @param boardName The name of the board to be used, with extension
*/
public void setBoardName(String boardName) {
this.boardName = boardName;
}
} }

View File

@ -5,15 +5,13 @@ import java.util.Map;
/** /**
* This class is used to contain power down status for all players * This class is used to contain power down status for all players
*/ */
public class PowerDownContainer { public class PowerDownContainerResponse {
private Map<String, Boolean> powerDown; private Map<String, Boolean> powerDown;
/** /**
* IMPORTANT!!! * Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
* DO NOT USE!
* Kryonet demands a no args constructor or else it throws a exception
*/ */
public PowerDownContainer() { public PowerDownContainerResponse() {
} }
/** /**
@ -21,7 +19,7 @@ public class PowerDownContainer {
* *
* @param powerDown A map between player names and whether they should remain in power down * @param powerDown A map between player names and whether they should remain in power down
*/ */
public PowerDownContainer(Map<String, Boolean> powerDown) { public PowerDownContainerResponse(Map<String, Boolean> powerDown) {
this.powerDown = powerDown; this.powerDown = powerDown;
} }

View File

@ -1,27 +0,0 @@
package inf112.fiasko.roborally.networking.containers;
import inf112.fiasko.roborally.objects.ProgrammingCard;
import java.util.List;
import java.util.Map;
public class ProgamsContainer {
private Map<String, List<ProgrammingCard>> program;
private Map<String, Boolean> powerdown;
public ProgamsContainer() {
}
public ProgamsContainer(Map<String, List<ProgrammingCard>> program, Map<String, Boolean> powerdown) {
this.program = program;
this.powerdown = powerdown;
}
public Map<String, List<ProgrammingCard>> getProgram() {
return program;
}
public Map<String, Boolean> getPowerdown() {
return powerdown;
}
}

View File

@ -8,6 +8,9 @@ public class ProgramAndPowerdownRequest {
private Boolean powerdown; private Boolean powerdown;
private List<ProgrammingCard> program; private List<ProgrammingCard> program;
/**
* Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
*/
public ProgramAndPowerdownRequest() { public ProgramAndPowerdownRequest() {
} }

View File

@ -0,0 +1,49 @@
package inf112.fiasko.roborally.networking.containers;
import inf112.fiasko.roborally.objects.ProgrammingCard;
import java.util.List;
import java.util.Map;
/**
* This class contains information about all players' programs and whether they want to enter power down
*/
public class ProgramsContainerResponse {
private Map<String, List<ProgrammingCard>> programsMap;
private Map<String, Boolean> powerDownMap;
/**
* Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
*/
public ProgramsContainerResponse() {
}
/**
* Instantiates a new programs container
*
* @param programsMap A map between a player name and a player's program
* @param powerDownMap A map between a player name and power down
*/
public ProgramsContainerResponse(Map<String, List<ProgrammingCard>> programsMap, Map<String, Boolean> powerDownMap) {
this.programsMap = programsMap;
this.powerDownMap = powerDownMap;
}
/**
* Gets the map of programs
*
* @return A map between a player name and a player's program
*/
public Map<String, List<ProgrammingCard>> getProgramsMap() {
return programsMap;
}
/**
* Gets the map of power down
*
* @return A map between a player name and power down
*/
public Map<String, Boolean> getPowerDownMap() {
return powerDownMap;
}
}

View File

@ -11,6 +11,7 @@ import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
/** /**
* This class represents a board * This class represents a board
@ -179,10 +180,16 @@ public class Board {
if (robots.containsKey(robotID)) { if (robots.containsKey(robotID)) {
robots.get(robotID).setPowerDown(powerDown); robots.get(robotID).setPowerDown(powerDown);
} else if (getRobotFromDeadRobots(robotID) != null) { } else if (getRobotFromDeadRobots(robotID) != null) {
getRobotFromDeadRobots(robotID).setPowerDown(powerDown); Objects.requireNonNull(getRobotFromDeadRobots(robotID)).setPowerDown(powerDown);
} }
} }
/**
* Sets the backup position of a given robot to a given position
*
* @param robotID The robot to change backup position for
* @param pos The robot's new backup position
*/
public void setBackupPositionOfRobot(RobotID robotID, Position pos) { public void setBackupPositionOfRobot(RobotID robotID, Position pos) {
robots.get(robotID).setBackupPosition(pos); robots.get(robotID).setBackupPosition(pos);
} }
@ -197,11 +204,17 @@ public class Board {
if (robots.containsKey(robotID)) { if (robots.containsKey(robotID)) {
return robots.get(robotID).isInPowerDown(); return robots.get(robotID).isInPowerDown();
} else if (getRobotFromDeadRobots(robotID) != null) { } else if (getRobotFromDeadRobots(robotID) != null) {
return getRobotFromDeadRobots(robotID).isInPowerDown(); return Objects.requireNonNull(getRobotFromDeadRobots(robotID)).isInPowerDown();
} }
return false; return false;
} }
/**
* Gets a robot from the list of dead robots
*
* @param robotID The id of the robot to get
* @return The dead robot
*/
private Robot getRobotFromDeadRobots(RobotID robotID) { private Robot getRobotFromDeadRobots(RobotID robotID) {
for (Robot robot : deadRobots) { for (Robot robot : deadRobots) {
if (robot.getRobotId() == robotID) { if (robot.getRobotId() == robotID) {

View File

@ -1,13 +1,13 @@
package inf112.fiasko.roborally.objects; package inf112.fiasko.roborally.objects;
import inf112.fiasko.roborally.elementproperties.GameState; import inf112.fiasko.roborally.elementproperties.GameState;
import inf112.fiasko.roborally.networking.containers.PowerDownContainer; import inf112.fiasko.roborally.networking.containers.PowerDownContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgamsContainer; import inf112.fiasko.roborally.networking.containers.ProgramsContainerResponse;
import java.util.List; import java.util.List;
/** /**
* This interface describes * This interface describes a game which can be interacted with
*/ */
public interface InteractableGame { public interface InteractableGame {
/** /**
@ -44,14 +44,14 @@ public interface InteractableGame {
* @param programs The programs container received from the server * @param programs The programs container received from the server
* @throws InterruptedException If interrupted during sleep * @throws InterruptedException If interrupted during sleep
*/ */
void receiveAllPrograms(ProgamsContainer programs) throws InterruptedException; void receiveAllPrograms(ProgramsContainerResponse programs) throws InterruptedException;
/** /**
* Continues turn when stay in power down is received from all players * Continues turn when stay in power down is received from all players
* *
* @param powerDowns The power down container received from the server * @param powerDowns The power down container received from the server
*/ */
void receiveStayInPowerDown(PowerDownContainer powerDowns); void receiveStayInPowerDown(PowerDownContainerResponse powerDowns);
/** /**
* Gets the hand of this player * Gets the hand of this player

View File

@ -25,7 +25,7 @@ public class Phase {
private List<BoardElementContainer<Tile>> conveyorBelts; private List<BoardElementContainer<Tile>> conveyorBelts;
private List<BoardElementContainer<Tile>> fastConveyorBelts; private List<BoardElementContainer<Tile>> fastConveyorBelts;
private List<BoardElementContainer<Tile>> flags; private List<BoardElementContainer<Tile>> flags;
private InteractableGame game; private final InteractableGame game;
/** /**
* Instantiates a new phase * Instantiates a new phase

View File

@ -36,7 +36,7 @@ public class Player {
} }
/** /**
* Gives you the RobotID of a player * Gets the RobotID of a player
* *
* @return A RobotID * @return A RobotID
*/ */
@ -45,7 +45,7 @@ public class Player {
} }
/** /**
* Gives you the Name of the player * Gets the name of the player
* *
* @return A player Name * @return A player Name
*/ */
@ -54,16 +54,7 @@ public class Player {
} }
/** /**
* Sets the name of the robot * Gets the players program
*
* @param name The new name of the robot
*/
public void setName(String name) {
this.name = name;
}
/**
* Gives you the players program
* *
* @return A list of programming cards * @return A list of programming cards
*/ */
@ -85,16 +76,16 @@ public class Player {
} }
/** /**
* Gives you the player hand/deck * Gets the player hand/deck
* *
* @return a deck * @return A deck
*/ */
public ProgrammingCardDeck getProgrammingCardDeck() { public ProgrammingCardDeck getProgrammingCardDeck() {
return playerDeck; return playerDeck;
} }
/** /**
* Set the players deck to the given deck * Sets the players deck to the given deck
* *
* @param playerDeck A deck of cards given to the player * @param playerDeck A deck of cards given to the player
*/ */
@ -103,7 +94,7 @@ public class Player {
} }
/** /**
* Gives you the player deck with locked cards * Gets the player deck with locked cards
* *
* @return a deck with locked cards * @return a deck with locked cards
*/ */
@ -112,7 +103,7 @@ public class Player {
} }
/** /**
* Gives you the players power down status * Gets the players power down status
* *
* @return Whether the player is to power down * @return Whether the player is to power down
*/ */

View File

@ -21,8 +21,10 @@ public class ProgrammingCard implements Comparable<ProgrammingCard> {
this.cardAction = cardAction; this.cardAction = cardAction;
} }
/**
* Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
*/
public ProgrammingCard() { public ProgrammingCard() {
} }
/** /**

View File

@ -16,6 +16,9 @@ public class ProgrammingCardDeck extends AbstractDeck<ProgrammingCard> {
super(cardList); super(cardList);
} }
/**
* Empty constructor required by KryoNet. DO NOT REMOVE THIS!!!
*/
public ProgrammingCardDeck() { public ProgrammingCardDeck() {
} }
} }

View File

@ -6,8 +6,8 @@ import inf112.fiasko.roborally.elementproperties.Position;
import inf112.fiasko.roborally.elementproperties.RobotID; import inf112.fiasko.roborally.elementproperties.RobotID;
import inf112.fiasko.roborally.elementproperties.TileType; import inf112.fiasko.roborally.elementproperties.TileType;
import inf112.fiasko.roborally.networking.RoboRallyServer; import inf112.fiasko.roborally.networking.RoboRallyServer;
import inf112.fiasko.roborally.networking.containers.PowerDownContainer; import inf112.fiasko.roborally.networking.containers.PowerDownContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgamsContainer; import inf112.fiasko.roborally.networking.containers.ProgramsContainerResponse;
import inf112.fiasko.roborally.utility.BoardLoaderUtil; import inf112.fiasko.roborally.utility.BoardLoaderUtil;
import inf112.fiasko.roborally.utility.DeckLoaderUtil; import inf112.fiasko.roborally.utility.DeckLoaderUtil;
@ -32,7 +32,7 @@ public class RoboRallyGame implements DrawableGame, InteractableGame {
private String winningPlayerName; private String winningPlayerName;
private List<ProgrammingCard> program; private List<ProgrammingCard> program;
private ProgrammingCardDeck playerHand; private ProgrammingCardDeck playerHand;
private Phase phase; private final Phase phase;
/** /**
* Instantiates a new Robo Rally game * Instantiates a new Robo Rally game
@ -53,7 +53,12 @@ public class RoboRallyGame implements DrawableGame, InteractableGame {
this.phase = new Phase(gameBoard, playerList, 600, this); this.phase = new Phase(gameBoard, playerList, 600, this);
} }
public Boolean getRobotPowerdown() { /**
* Gets the power down status of the client playing this instance of the game
*
* @return Whether this player's robot is in power down
*/
public Boolean getRobotPowerDown() {
if (getPlayerFromName(this.playerName) != null) { if (getPlayerFromName(this.playerName) != null) {
return gameBoard.getPowerDown(Objects.requireNonNull(getPlayerFromName(this.playerName)).getRobotID()); return gameBoard.getPowerDown(Objects.requireNonNull(getPlayerFromName(this.playerName)).getRobotID());
} }
@ -140,10 +145,10 @@ public class RoboRallyGame implements DrawableGame, InteractableGame {
} }
@Override @Override
public void receiveAllPrograms(ProgamsContainer programs) throws InterruptedException { public void receiveAllPrograms(ProgramsContainerResponse programs) throws InterruptedException {
//Reads data from server and updates player objects //Reads data from server and updates player objects
Map<String, List<ProgrammingCard>> programMap = programs.getProgram(); Map<String, List<ProgrammingCard>> programMap = programs.getProgramsMap();
Map<String, Boolean> powerDown = programs.getPowerdown(); Map<String, Boolean> powerDown = programs.getPowerDownMap();
String playerName; String playerName;
for (Player player : playerList) { for (Player player : playerList) {
playerName = player.getName(); playerName = player.getName();
@ -175,7 +180,7 @@ public class RoboRallyGame implements DrawableGame, InteractableGame {
} }
@Override @Override
public void receiveStayInPowerDown(PowerDownContainer powerDowns) { public void receiveStayInPowerDown(PowerDownContainerResponse powerDowns) {
for (Player player : playerList) { for (Player player : playerList) {
if (gameBoard.getPowerDown(player.getRobotID())) { if (gameBoard.getPowerDown(player.getRobotID())) {
player.setPowerDownNextRound(powerDowns.getPowerDown().get(player.getName())); player.setPowerDownNextRound(powerDowns.getPowerDown().get(player.getName()));
@ -198,26 +203,6 @@ public class RoboRallyGame implements DrawableGame, InteractableGame {
this.winningPlayerName = winningPlayerName; this.winningPlayerName = winningPlayerName;
} }
/**
* Initializes the game with a debugging board
*/
private void initializeDebugMode() {
List<Robot> robots = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(0, 18)));
robots.add(new Robot(RobotID.ROBOT_2, new Position(1, 18)));
robots.add(new Robot(RobotID.ROBOT_3, new Position(2, 18)));
robots.add(new Robot(RobotID.ROBOT_4, new Position(3, 18)));
robots.add(new Robot(RobotID.ROBOT_5, new Position(4, 18)));
robots.add(new Robot(RobotID.ROBOT_6, new Position(5, 18)));
robots.add(new Robot(RobotID.ROBOT_7, new Position(6, 18)));
robots.add(new Robot(RobotID.ROBOT_8, new Position(7, 18)));
try {
gameBoard = BoardLoaderUtil.loadBoard("boards/all_tiles_test_board.txt", robots);
} catch (IOException e) {
e.printStackTrace();
}
}
/** /**
* Initializes the game with a playable board * Initializes the game with a playable board
*/ */
@ -255,7 +240,7 @@ public class RoboRallyGame implements DrawableGame, InteractableGame {
RobotID robotID = player.getRobotID(); RobotID robotID = player.getRobotID();
TileType robotSpawn = TileType.getTileTypeFromID(robotID.getRobotIDID() + 22); TileType robotSpawn = TileType.getTileTypeFromID(robotID.getRobotIDID() + 22);
List<BoardElementContainer<Tile>> spawnTileContainerList = gameBoard.getPositionsOfTileOnBoard(robotSpawn); List<BoardElementContainer<Tile>> spawnTileContainerList = gameBoard.getPositionsOfTileOnBoard(robotSpawn);
if (spawnTileContainerList.size() != 1) { if (spawnTileContainerList.size() < 1) {
throw new IllegalArgumentException("The chosen board seems to be missing a robot spawn"); throw new IllegalArgumentException("The chosen board seems to be missing a robot spawn");
} }
BoardElementContainer<Tile> spawnTileContainer = spawnTileContainerList.get(0); BoardElementContainer<Tile> spawnTileContainer = spawnTileContainerList.get(0);

View File

@ -132,9 +132,9 @@ public class Robot {
} }
/** /**
* setBackupPosition * Sets the backup position of the robot
* *
* @param backupPosition * @param backupPosition The new backup position of the robot
*/ */
public void setBackupPosition(Position backupPosition) { public void setBackupPosition(Position backupPosition) {
this.backupPosition = backupPosition; this.backupPosition = backupPosition;

View File

@ -4,9 +4,9 @@ import com.esotericsoftware.kryo.Kryo;
import inf112.fiasko.roborally.elementproperties.Action; import inf112.fiasko.roborally.elementproperties.Action;
import inf112.fiasko.roborally.elementproperties.RobotID; import inf112.fiasko.roborally.elementproperties.RobotID;
import inf112.fiasko.roborally.networking.containers.ErrorResponse; import inf112.fiasko.roborally.networking.containers.ErrorResponse;
import inf112.fiasko.roborally.networking.containers.GameStartInfo; import inf112.fiasko.roborally.networking.containers.GameStartInfoResponse;
import inf112.fiasko.roborally.networking.containers.PowerDownContainer; import inf112.fiasko.roborally.networking.containers.PowerDownContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgamsContainer; import inf112.fiasko.roborally.networking.containers.ProgramsContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgramAndPowerdownRequest; import inf112.fiasko.roborally.networking.containers.ProgramAndPowerdownRequest;
import inf112.fiasko.roborally.objects.Deck; import inf112.fiasko.roborally.objects.Deck;
import inf112.fiasko.roborally.objects.Player; import inf112.fiasko.roborally.objects.Player;
@ -30,17 +30,15 @@ public final class NetworkUtil {
kryo.register(ErrorResponse.class); kryo.register(ErrorResponse.class);
kryo.register(Deck.class); kryo.register(Deck.class);
kryo.register(ProgrammingCard.class); kryo.register(ProgrammingCard.class);
kryo.register(GameStartInfo.class); kryo.register(GameStartInfoResponse.class);
kryo.register(ArrayList.class); kryo.register(ArrayList.class);
kryo.register(Player.class); kryo.register(Player.class);
kryo.register(RobotID.class); kryo.register(RobotID.class);
kryo.register(ProgrammingCardDeck.class); kryo.register(ProgrammingCardDeck.class);
kryo.register(Action.class); kryo.register(Action.class);
kryo.register(ProgramAndPowerdownRequest.class); kryo.register(ProgramAndPowerdownRequest.class);
kryo.register(ProgamsContainer.class); kryo.register(ProgramsContainerResponse.class);
kryo.register(PowerDownContainer.class); kryo.register(PowerDownContainerResponse.class);
kryo.register(HashMap.class); kryo.register(HashMap.class);
} }
} }

View File

@ -366,6 +366,18 @@ public final class TextureConverterUtil {
private final int xWest; private final int xWest;
private final int yWest; private final int yWest;
/**
* Instantiates a new texture converter container
*
* @param xNorth The x position of the texture for a north-facing instance of the object
* @param yNorth The y position of the texture for a north-facing instance of the object
* @param xEast The x position of the texture for a east-facing instance of the object
* @param yEast The y position of the texture for a east-facing instance of the object
* @param xSouth The x position of the texture for a south-facing instance of the object
* @param ySouth The y position of the texture for a south-facing instance of the object
* @param xWest The x position of the texture for a west-facing instance of the object
* @param yWest The y position of the texture for a west-facing instance of the object
*/
TextureConverterContainer(int xNorth, int yNorth, int xEast, int yEast, int xSouth, int ySouth, TextureConverterContainer(int xNorth, int yNorth, int xEast, int yEast, int xSouth, int ySouth,
int xWest, int yWest) { int xWest, int yWest) {
this.xNorth = xNorth; this.xNorth = xNorth;
@ -378,34 +390,74 @@ public final class TextureConverterUtil {
this.yWest = yWest; this.yWest = yWest;
} }
/**
* Gets the x position of the texture for a north-facing instance of the object
*
* @return The x position of the texture for a north-facing instance of the object
*/
public int getXNorth() { public int getXNorth() {
return xNorth; return xNorth;
} }
/**
* Gets the y position of the texture for a north-facing instance of the object
*
* @return The y position of the texture for a north-facing instance of the object
*/
public int getYNorth() { public int getYNorth() {
return yNorth; return yNorth;
} }
/**
* Gets the x position of the texture for a east-facing instance of the object
*
* @return The x position of the texture for a east-facing instance of the object
*/
public int getXEast() { public int getXEast() {
return xEast; return xEast;
} }
/**
* Gets the y position of the texture for a east-facing instance of the object
*
* @return The y position of the texture for a east-facing instance of the object
*/
public int getYEast() { public int getYEast() {
return yEast; return yEast;
} }
/**
* Gets the x position of the texture for a south-facing instance of the object
*
* @return The x position of the texture for a south-facing instance of the object
*/
public int getXSouth() { public int getXSouth() {
return xSouth; return xSouth;
} }
/**
* Gets the y position of the texture for a south-facing instance of the object
*
* @return The y position of the texture for a south-facing instance of the object
*/
public int getYSouth() { public int getYSouth() {
return ySouth; return ySouth;
} }
/**
* Gets the x position of the texture for a west-facing instance of the object
*
* @return The x position of the texture for a west-facing instance of the object
*/
public int getXWest() { public int getXWest() {
return xWest; return xWest;
} }
/**
* Gets the y position of the texture for a west-facing instance of the object
*
* @return The y position of the texture for a west-facing instance of the object
*/
public int getYWest() { public int getYWest() {
return yWest; return yWest;
} }

View File

@ -1,11 +1,14 @@
package inf112.fiasko.roborally.objects; package inf112.fiasko.roborally.objects;
import inf112.fiasko.roborally.elementproperties.GameState; import inf112.fiasko.roborally.elementproperties.GameState;
import inf112.fiasko.roborally.networking.containers.PowerDownContainer; import inf112.fiasko.roborally.networking.containers.PowerDownContainerResponse;
import inf112.fiasko.roborally.networking.containers.ProgamsContainer; import inf112.fiasko.roborally.networking.containers.ProgramsContainerResponse;
import java.util.List; import java.util.List;
/**
* A class implementing just enough features of an interactable game to be able to test a phase
*/
public class FakeGame implements InteractableGame { public class FakeGame implements InteractableGame {
private String winningPlayerName; private String winningPlayerName;
@ -30,12 +33,12 @@ public class FakeGame implements InteractableGame {
} }
@Override @Override
public void receiveAllPrograms(ProgamsContainer programs) throws InterruptedException { public void receiveAllPrograms(ProgramsContainerResponse programs) {
//Not needed for testing //Not needed for testing
} }
@Override @Override
public void receiveStayInPowerDown(PowerDownContainer powerDowns) { public void receiveStayInPowerDown(PowerDownContainerResponse powerDowns) {
//Not needed for testing //Not needed for testing
} }

View File

@ -12,10 +12,13 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static junit.framework.TestCase.*; import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
public class PhaseTest { public class PhaseTest {
List<Robot> robots = new ArrayList<>(); private List<Robot> robots = new ArrayList<>();
private Phase phase; private Phase phase;
private Board board; private Board board;
private Position robot1Position = new Position(2, 2); private Position robot1Position = new Position(2, 2);
@ -267,36 +270,14 @@ public class PhaseTest {
List<ProgrammingCard> testProgram1 = new ArrayList<>(); List<ProgrammingCard> testProgram1 = new ArrayList<>();
List<ProgrammingCard> testProgram2 = new ArrayList<>(); List<ProgrammingCard> testProgram2 = new ArrayList<>();
List<ProgrammingCard> testProgram3 = new ArrayList<>(); List<ProgrammingCard> testProgram3 = new ArrayList<>();
ProgrammingCard card1 = new ProgrammingCard(1, Action.MOVE_1); testProgram1.add(new ProgrammingCard(1, Action.MOVE_1));
ProgrammingCard card2 = new ProgrammingCard(2, Action.ROTATE_RIGHT); testProgram2.add(new ProgrammingCard(10, Action.MOVE_1));
ProgrammingCard card3 = new ProgrammingCard(3, Action.MOVE_1); testProgram3.add(new ProgrammingCard(100, Action.ROTATE_LEFT));
ProgrammingCard card4 = new ProgrammingCard(4, Action.MOVE_1); for (int i = 0; i < 4; i++) {
ProgrammingCard card5 = new ProgrammingCard(5, Action.MOVE_1); testProgram1.add(null);
ProgrammingCard card6 = new ProgrammingCard(10, Action.MOVE_1); testProgram2.add(null);
ProgrammingCard card7 = new ProgrammingCard(11, Action.ROTATE_RIGHT); testProgram3.add(null);
ProgrammingCard card8 = new ProgrammingCard(12, Action.MOVE_1); }
ProgrammingCard card9 = new ProgrammingCard(13, Action.MOVE_1);
ProgrammingCard card10 = new ProgrammingCard(14, Action.MOVE_1);
ProgrammingCard card11 = new ProgrammingCard(100, Action.ROTATE_LEFT);
ProgrammingCard card12 = new ProgrammingCard(200, Action.ROTATE_LEFT);
ProgrammingCard card13 = new ProgrammingCard(300, Action.ROTATE_LEFT);
ProgrammingCard card14 = new ProgrammingCard(400, Action.ROTATE_LEFT);
ProgrammingCard card15 = new ProgrammingCard(500, Action.ROTATE_LEFT);
testProgram1.add(card1);
testProgram1.add(card2);
testProgram1.add(card3);
testProgram1.add(card4);
testProgram1.add(card5);
testProgram2.add(card6);
testProgram2.add(card7);
testProgram2.add(card8);
testProgram2.add(card9);
testProgram2.add(card10);
testProgram3.add(card11);
testProgram3.add(card12);
testProgram3.add(card13);
testProgram3.add(card14);
testProgram3.add(card15);
player1.setProgram(testProgram3); player1.setProgram(testProgram3);
player2.setProgram(testProgram3); player2.setProgram(testProgram3);
player3.setProgram(testProgram3); player3.setProgram(testProgram3);
@ -310,8 +291,20 @@ public class PhaseTest {
assertEquals(robot6.getRobotId(), board.getRobotOnPosition(new Position(2, 14))); assertEquals(robot6.getRobotId(), board.getRobotOnPosition(new Position(2, 14)));
} }
/**
* Loads the test board to the variable and creates a new phase
*
* @param players A list of players participating in the game
* @param robots A list of robots on the board
* @return A phase object
*/
private Phase createPhaseAndLoadBoard(List<Player> players, List<Robot> robots) throws IOException {
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
return new Phase(board, players, 0, null);
}
@Test @Test
public void robotsOnConveyorBeltsFacingTheSameEmptyTileDoesNotMove() { public void robotsOnConveyorBeltsFacingTheSameEmptyTileDoesNotMove() throws InterruptedException, IOException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(8, 11))); robots.add(new Robot(RobotID.ROBOT_1, new Position(8, 11)));
@ -319,19 +312,15 @@ public class PhaseTest {
players.add(new Player(RobotID.ROBOT_1, "Player 1")); players.add(new Player(RobotID.ROBOT_1, "Player 1"));
players.add(new Player(RobotID.ROBOT_2, "Player 2")); players.add(new Player(RobotID.ROBOT_2, "Player 2"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(8, 11))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(8, 11)));
assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(7, 10))); assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(7, 10)));
} }
@Test @Test
public void robotsOnConveyorBeltsFacingTheSameHoleTileDoesNotMove() { public void robotsOnConveyorBeltsFacingTheSameHoleTileDoesNotMove() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(6, 7))); robots.add(new Robot(RobotID.ROBOT_1, new Position(6, 7)));
@ -339,36 +328,28 @@ public class PhaseTest {
players.add(new Player(RobotID.ROBOT_1, "Player 1")); players.add(new Player(RobotID.ROBOT_1, "Player 1"));
players.add(new Player(RobotID.ROBOT_2, "Player 2")); players.add(new Player(RobotID.ROBOT_2, "Player 2"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(6, 7))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(6, 7)));
assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(7, 8))); assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(7, 8)));
} }
@Test @Test
public void robotOnConveyorBeltsFacingWallDoesNotMove() { public void robotOnConveyorBeltsFacingWallDoesNotMove() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(1, 1))); robots.add(new Robot(RobotID.ROBOT_1, new Position(1, 1)));
players.add(new Player(RobotID.ROBOT_1, "Player 1")); players.add(new Player(RobotID.ROBOT_1, "Player 1"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(1, 1))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(1, 1)));
} }
@Test @Test
public void robotBehindAnotherRobotOnConveyorBeltsFacingWallDoesNotMove() { public void robotBehindAnotherRobotOnConveyorBeltsFacingWallDoesNotMove() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(1, 1))); robots.add(new Robot(RobotID.ROBOT_1, new Position(1, 1)));
@ -376,19 +357,15 @@ public class PhaseTest {
players.add(new Player(RobotID.ROBOT_1, "Player 1")); players.add(new Player(RobotID.ROBOT_1, "Player 1"));
players.add(new Player(RobotID.ROBOT_2, "Player 2")); players.add(new Player(RobotID.ROBOT_2, "Player 2"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(1, 1))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(1, 1)));
assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(1, 2))); assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(1, 2)));
} }
@Test @Test
public void robotBehindOtherRobotsOnSlowConveyorBeltsFacingEmptyTilesMoves() { public void robotBehindOtherRobotsOnSlowConveyorBeltsFacingEmptyTilesMoves() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(5, 7))); robots.add(new Robot(RobotID.ROBOT_1, new Position(5, 7)));
@ -400,13 +377,9 @@ public class PhaseTest {
players.add(new Player(RobotID.ROBOT_3, "Player 3")); players.add(new Player(RobotID.ROBOT_3, "Player 3"));
players.add(new Player(RobotID.ROBOT_4, "Player 4")); players.add(new Player(RobotID.ROBOT_4, "Player 4"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(5, 6))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(5, 6)));
assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(5, 7))); assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(5, 7)));
assertEquals(RobotID.ROBOT_3, board.getRobotOnPosition(new Position(5, 8))); assertEquals(RobotID.ROBOT_3, board.getRobotOnPosition(new Position(5, 8)));
@ -414,7 +387,7 @@ public class PhaseTest {
} }
@Test @Test
public void robotBehindOtherRobotsOnFastConveyorBeltsFacingEmptyTilesMoves() { public void robotBehindOtherRobotsOnFastConveyorBeltsFacingEmptyTilesMoves() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(4, 7))); robots.add(new Robot(RobotID.ROBOT_1, new Position(4, 7)));
@ -426,13 +399,9 @@ public class PhaseTest {
players.add(new Player(RobotID.ROBOT_3, "Player 3")); players.add(new Player(RobotID.ROBOT_3, "Player 3"));
players.add(new Player(RobotID.ROBOT_4, "Player 4")); players.add(new Player(RobotID.ROBOT_4, "Player 4"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(4, 5))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(4, 5)));
assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(4, 6))); assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(4, 6)));
assertEquals(RobotID.ROBOT_3, board.getRobotOnPosition(new Position(4, 7))); assertEquals(RobotID.ROBOT_3, board.getRobotOnPosition(new Position(4, 7)));
@ -440,7 +409,7 @@ public class PhaseTest {
} }
@Test @Test
public void robotBehindOtherRobotsOnConveyorBeltsShapedAsARoundaboutMoves() { public void robotBehindOtherRobotsOnConveyorBeltsShapedAsARoundaboutMoves() throws IOException, InterruptedException {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
@ -453,13 +422,9 @@ public class PhaseTest {
players.add(new Player(RobotID.ROBOT_3, "Player 3")); players.add(new Player(RobotID.ROBOT_3, "Player 3"));
players.add(new Player(RobotID.ROBOT_4, "Player 4")); players.add(new Player(RobotID.ROBOT_4, "Player 4"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(1, 9))); assertEquals(RobotID.ROBOT_1, board.getRobotOnPosition(new Position(1, 9)));
assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(1, 8))); assertEquals(RobotID.ROBOT_2, board.getRobotOnPosition(new Position(1, 8)));
assertEquals(RobotID.ROBOT_3, board.getRobotOnPosition(new Position(2, 8))); assertEquals(RobotID.ROBOT_3, board.getRobotOnPosition(new Position(2, 8)));
@ -469,38 +434,30 @@ public class PhaseTest {
} }
@Test @Test
public void robotOnConveyorBeltFacingHoleMovesAndDies() { public void robotOnConveyorBeltFacingHoleMovesAndDies() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(6, 7))); robots.add(new Robot(RobotID.ROBOT_1, new Position(6, 7)));
players.add(new Player(RobotID.ROBOT_1, "Player 1")); players.add(new Player(RobotID.ROBOT_1, "Player 1"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertFalse(board.isRobotAlive(RobotID.ROBOT_1)); assertFalse(board.isRobotAlive(RobotID.ROBOT_1));
assertNull(board.getRobotOnPosition(new Position(6, 7))); assertNull(board.getRobotOnPosition(new Position(6, 7)));
assertNull(board.getRobotOnPosition(new Position(7, 7))); assertNull(board.getRobotOnPosition(new Position(7, 7)));
} }
@Test @Test
public void robotOnConveyorBeltFacingOutOfMapMovesAndDies() { public void robotOnConveyorBeltFacingOutOfMapMovesAndDies() throws IOException, InterruptedException {
List<Robot> robots = new ArrayList<>(); List<Robot> robots = new ArrayList<>();
List<Player> players = new ArrayList<>(); List<Player> players = new ArrayList<>();
robots.add(new Robot(RobotID.ROBOT_1, new Position(7, 0))); robots.add(new Robot(RobotID.ROBOT_1, new Position(7, 0)));
players.add(new Player(RobotID.ROBOT_1, "Player 1")); players.add(new Player(RobotID.ROBOT_1, "Player 1"));
try { Phase testPhase = createPhaseAndLoadBoard(players, robots);
board = BoardLoaderUtil.loadBoard("boards/test_board.txt", robots);
Phase testPhase = new Phase(board, players, 0, null);
testPhase.moveAllConveyorBelts(); testPhase.moveAllConveyorBelts();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
assertFalse(board.isRobotAlive(RobotID.ROBOT_1)); assertFalse(board.isRobotAlive(RobotID.ROBOT_1));
assertNull(board.getRobotOnPosition(new Position(7, 0))); assertNull(board.getRobotOnPosition(new Position(7, 0)));
} }