feat: implemented CharacterSelection and game start

This commit is contained in:
Yannik Bretschneider 2021-06-06 19:29:51 +02:00
parent f52e089433
commit c09d407351

View File

@ -18,6 +18,7 @@ import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.stream.Collectors;
/** /**
* A class that handles the connection to the lobby. It contains the participants inside of the lobby. The class * A class that handles the connection to the lobby. It contains the participants inside of the lobby. The class
@ -105,7 +106,7 @@ public class LobbyConnection implements Runnable {
Logger.info("Lobby '{}' is terminating. Exiting...", gameID); Logger.info("Lobby '{}' is terminating. Exiting...", gameID);
return; return;
} else if (currentMessage == null) { } else if (currentMessage == null) {
Logger.trace("Message was null, continuing"); // TODO: remove for production // Logger.trace("Message was null, continuing"); // TODO: remove for production
continue; continue;
} else if (currentMessage.item2 instanceof CharacterSelectionMessage) { } else if (currentMessage.item2 instanceof CharacterSelectionMessage) {
var origin = currentMessage.item1; var origin = currentMessage.item1;
@ -115,10 +116,6 @@ public class LobbyConnection implements Runnable {
origin.name); origin.name);
characterSelectionActive = receiveCharacterSelection(origin, message); characterSelectionActive = receiveCharacterSelection(origin, message);
Logger.trace("Sending confirmSelectionMessage to player1");
var replyMessage = new ConfirmSelectionMessage();
replyMessage.selectionComplete = !characterSelectionActive;
sendMessage(origin, replyMessage);
} else if (currentMessage.item2 instanceof RequestMessage) { } else if (currentMessage.item2 instanceof RequestMessage) {
var origin = currentMessage.item1; var origin = currentMessage.item1;
// var message = (RequestMessage) currentMessage.item2; this is ignored here // var message = (RequestMessage) currentMessage.item2; this is ignored here
@ -131,8 +128,7 @@ public class LobbyConnection implements Runnable {
} else { } else {
Logger.warn("Message that isn't of type RequestMessage or CharacacterSelectionMessage" + Logger.warn("Message that isn't of type RequestMessage or CharacacterSelectionMessage" +
"received in Lobby. This is probably a bug."); "received in Lobby. This is probably a bug.");
sendError( sendError(currentMessage.item1,
currentMessage.item1,
"Message couldn't be processed by the lobby, as its type was invalid"); "Message couldn't be processed by the lobby, as its type was invalid");
} }
} }
@ -227,7 +223,7 @@ public class LobbyConnection implements Runnable {
} }
private void receiveRequests(Participant origin, RequestMessage message) { private void receiveRequests(Participant origin, RequestMessage message) {
System.out.println("REMOVE THIS PRINTLN: received request message " + message.toString()); // TODO: implement
} }
/** /**
@ -237,8 +233,8 @@ public class LobbyConnection implements Runnable {
* *
* @param origin is the participant that sent the message * @param origin is the participant that sent the message
* @param message is the message triggering the CharacterSelection method * @param message is the message triggering the CharacterSelection method
* @return true if CharacterSelection is now completed, and false otherwise. If the method is called outside of the * @return false if CharacterSelection is now completed, and true otherwise. If the method is called outside of the
* CharacterSelection phase, true is returned, as the characterSelection is after all done * CharacterSelection phase, false is returned, as the characterSelection is after all done
*/ */
private boolean receiveCharacterSelection(Participant origin, CharacterSelectionMessage message) { private boolean receiveCharacterSelection(Participant origin, CharacterSelectionMessage message) {
if (this.characterSelectionActive) { if (this.characterSelectionActive) {
@ -253,6 +249,12 @@ public class LobbyConnection implements Runnable {
selectionPossibilities.item1, selectionPossibilities.item1,
message.characters); message.characters);
Logger.info("Player 1 has selected their characters"); Logger.info("Player 1 has selected their characters");
Logger.trace("Sending selection confirmation message to Player1");
Logger.trace("Sending confirmSelectionMessage to player1");
var replyMessage = new ConfirmSelectionMessage();
replyMessage.selectionComplete = !characterSelectionActive;
sendMessage(origin, replyMessage);
} else { } else {
Logger.debug("Player 1 tried to select characters twice, sending error"); Logger.debug("Player 1 tried to select characters twice, sending error");
sendError(origin, sendError(origin,
@ -262,13 +264,17 @@ public class LobbyConnection implements Runnable {
} }
case PlayerTwo -> { case PlayerTwo -> {
if (playerTwoSelection == null) { if (playerTwoSelection == null) {
Logger.trace("Checking whether there are actually 6 choices");
playerTwoSelection = getChosenCharacters( playerTwoSelection = getChosenCharacters(
selectionPossibilities.item1, selectionPossibilities.item1,
message.characters); message.characters);
Logger.info("Player 1 has selected their characters"); Logger.info("Player 2 has selected their characters");
Logger.trace("Sending confirmSelectionMessage to player2");
var replyMessage = new ConfirmSelectionMessage();
replyMessage.selectionComplete = !characterSelectionActive;
sendMessage(origin, replyMessage);
} else { } else {
Logger.debug("Player 1 tried to select characters twice, sending error"); Logger.debug("Player 2 tried to select characters twice, sending error");
sendError(origin, sendError(origin,
"Cannot select characters as characters were already selected"); "Cannot select characters as characters were already selected");
} }
@ -284,7 +290,7 @@ public class LobbyConnection implements Runnable {
"the CharacterSelectionPhase, sending error", origin.name); "the CharacterSelectionPhase, sending error", origin.name);
sendError(origin, "The character selection phase is already over"); sendError(origin, "The character selection phase is already over");
} }
return !characterSelectionActive || (playerOneSelection != null && playerTwoSelection != null); return (playerOneSelection == null || playerTwoSelection == null) && characterSelectionActive;
} }
private CharacterProperties[] getChosenCharacters(CharacterProperties[] possibleChoices, Boolean[] choices) { private CharacterProperties[] getChosenCharacters(CharacterProperties[] possibleChoices, Boolean[] choices) {
@ -309,13 +315,24 @@ public class LobbyConnection implements Runnable {
} }
private void initializeLobby() { private void initializeLobby() {
Logger.trace("Initializing lobby..."); Logger.trace("Transforming chosen characters into integer array of IDs");
var player1CharacterChoiceIDs = Arrays.stream(playerOneSelection)
.map(properties -> properties.characterID)
.collect(Collectors.toList());
var player2CharacterChoiceIDs = Arrays.stream(playerOneSelection)
.map(properties -> properties.characterID)
.collect(Collectors.toList());
Logger.info("Initializing lobby...");
this.lobby = new Lobby( this.lobby = new Lobby(
gameID, gameID,
this, this,
Server.getPartyConfig(), Server.getPartyConfig(),
Server.getCharacterConfig(), Server.getCharacterConfig(),
Server.getScenarioConfig()); Server.getScenarioConfig(),
player1CharacterChoiceIDs,
player2CharacterChoiceIDs);
} }
/** /**
@ -466,6 +483,10 @@ public class LobbyConnection implements Runnable {
broadcast(message); broadcast(message);
} }
public void broadcastEvents(List<Event> events) {
broadcastEvents(events.toArray(new Event[0]));
}
public void broadcastToAllExcept(Participant except, Event... events) { public void broadcastToAllExcept(Participant except, Event... events) {
var message = new EventMessage(); var message = new EventMessage();
message.messages = events; message.messages = events;