feat: implemented wins and disconnects in Lobby
This commit is contained in:
parent
ffb37def47
commit
cb1f99814a
@ -6,40 +6,48 @@ import uulm.teamname.marvelous.gamelibrary.events.EventBuilder;
|
|||||||
import uulm.teamname.marvelous.gamelibrary.events.EventType;
|
import uulm.teamname.marvelous.gamelibrary.events.EventType;
|
||||||
import uulm.teamname.marvelous.gamelibrary.gamelogic.EventObserver;
|
import uulm.teamname.marvelous.gamelibrary.gamelogic.EventObserver;
|
||||||
import uulm.teamname.marvelous.gamelibrary.gamelogic.GameInstance;
|
import uulm.teamname.marvelous.gamelibrary.gamelogic.GameInstance;
|
||||||
|
import uulm.teamname.marvelous.gamelibrary.gamelogic.ParticipantType;
|
||||||
|
import uulm.teamname.marvelous.gamelibrary.json.config.CharacterConfig;
|
||||||
|
import uulm.teamname.marvelous.gamelibrary.json.config.PartyConfig;
|
||||||
|
import uulm.teamname.marvelous.gamelibrary.json.config.ScenarioConfig;
|
||||||
import uulm.teamname.marvelous.gamelibrary.requests.Request;
|
import uulm.teamname.marvelous.gamelibrary.requests.Request;
|
||||||
import uulm.teamname.marvelous.gamelibrary.requests.RequestType;
|
import uulm.teamname.marvelous.gamelibrary.requests.RequestType;
|
||||||
import uulm.teamname.marvelous.server.lobby.pipelining.PauseSegment;
|
import uulm.teamname.marvelous.server.lobby.pipelining.*;
|
||||||
import uulm.teamname.marvelous.server.lobby.pipelining.Pipeline;
|
|
||||||
import uulm.teamname.marvelous.server.lobby.pipelining.RequestGameStateSegment;
|
|
||||||
import uulm.teamname.marvelous.server.lobbymanager.LobbyConnection;
|
import uulm.teamname.marvelous.server.lobbymanager.LobbyConnection;
|
||||||
import uulm.teamname.marvelous.server.lobbymanager.Participant;
|
import uulm.teamname.marvelous.server.lobbymanager.Participant;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class Lobby extends EventObserver {
|
public class Lobby {
|
||||||
public final String gameID;
|
public final String gameID;
|
||||||
public final LobbyConnection connection;
|
public final LobbyConnection connection;
|
||||||
public final GameInstance game;
|
public final GameInstance game;
|
||||||
public final Pipeline pipeline;
|
public final Pipeline pipeline;
|
||||||
public final PauseSegment pauseSegment;
|
public final PauseSegment pauseSegment;
|
||||||
public final RequestGameStateSegment reqSegment;
|
|
||||||
private final PauseHandler pause = new PauseHandler();
|
private final PauseHandler pause = new PauseHandler();
|
||||||
|
|
||||||
public Lobby(String gameID, IntVector2 mapSize, LobbyConnection connection) {
|
public Lobby(
|
||||||
|
String gameID,
|
||||||
|
LobbyConnection connection,
|
||||||
|
PartyConfig partyConfig,
|
||||||
|
CharacterConfig characterConfig,
|
||||||
|
ScenarioConfig scenarioConfig) {
|
||||||
this.gameID = gameID;
|
this.gameID = gameID;
|
||||||
this.connection = connection;
|
this.connection = connection;
|
||||||
|
|
||||||
game = new GameInstance(); //TODO: Add config objects here
|
this.game = new GameInstance(
|
||||||
game.addObserver(this);
|
partyConfig,
|
||||||
|
characterConfig,
|
||||||
|
scenarioConfig
|
||||||
|
); //TODO: Add config objects here
|
||||||
|
|
||||||
this.pipeline = new Pipeline();
|
this.pipeline = new Pipeline();
|
||||||
|
var reqSegment = new RequestGameStateSegment(this.game);
|
||||||
this.pauseSegment = new PauseSegment();
|
this.pauseSegment = new PauseSegment();
|
||||||
this.reqSegment = new RequestGameStateSegment(this);
|
var disconnectSegment = new DisconnectSegment(this);
|
||||||
}
|
var gameStateSegment = new GameStateSegment(this.game);
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void handle(Event[] events) {
|
|
||||||
connection.broadcastEvents(events);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void receiveRequests(Participant source, Request[] requests) {
|
public void receiveRequests(Participant source, Request[] requests) {
|
||||||
@ -69,14 +77,15 @@ public class Lobby extends EventObserver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//
|
||||||
if(!game.checkRequestsAndApply(stateRelevant.toArray(new Request[0]))) {
|
// if(!game.checkRequestsAndApply(stateRelevant.toArray(new Request[0]))) { TODO: Fix this.
|
||||||
// requests don't apply, tell the client that they need to update their state
|
// // requests don't apply, tell the client that they need to update their state
|
||||||
reject(source);
|
// reject(source);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processRequest(Participant source, Request request) {
|
private void processRequest(Participant source, Request request) {
|
||||||
|
// TODO: Implement as pipeline
|
||||||
switch(request.type) {
|
switch(request.type) {
|
||||||
case PauseStopRequest -> {
|
case PauseStopRequest -> {
|
||||||
pause.stop();
|
pause.stop();
|
||||||
@ -99,4 +108,43 @@ public class Lobby extends EventObserver {
|
|||||||
private void reject(Participant source) {
|
private void reject(Participant source) {
|
||||||
connection.sendEvents(source, new EventBuilder(EventType.Nack).buildGameEvent(), game.getGameStateEvent());
|
connection.sendEvents(source, new EventBuilder(EventType.Nack).buildGameEvent(), game.getGameStateEvent());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void soonTimeout (Participant source){
|
||||||
|
connection.sendEvents(
|
||||||
|
source,
|
||||||
|
new EventBuilder(EventType.TimeoutWarningEvent).buildGameStateEvent());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Timeout(Participant source){
|
||||||
|
connection.sendEvents(
|
||||||
|
source,
|
||||||
|
new EventBuilder(EventType.TimeoutEvent).buildGameStateEvent());
|
||||||
|
connection.removePlayer(source);
|
||||||
|
|
||||||
|
if(connection.hasPlayer1()){
|
||||||
|
generateWin(connection.getPlayer1());
|
||||||
|
}
|
||||||
|
else if(connection.hasPlayer2()) {
|
||||||
|
generateWin(connection.getPlayer2());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new IllegalStateException("Spectator was time-outed which is impossible");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The method generates a Win event for a {@link Participant}.
|
||||||
|
* Afterwards it sends a Disconnect to everyone, and terminates the connection.
|
||||||
|
*
|
||||||
|
* @param winner is the {@link Participant} that won
|
||||||
|
*/
|
||||||
|
public void generateWin(Participant winner){
|
||||||
|
connection.broadcastEvents(
|
||||||
|
new EventBuilder(EventType.WinEvent)
|
||||||
|
.withPlayerWon(winner.type.equals(ParticipantType.Player1) ? 1 : 2)
|
||||||
|
.buildGameStateEvent(),
|
||||||
|
new EventBuilder(EventType.DisconnectEvent)
|
||||||
|
.buildGameStateEvent());
|
||||||
|
connection.terminateConnection();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,10 +42,24 @@ public class MessageRelay {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Broadcasts events to all {@link Participant Participants} of a {@link LobbyConnection}.
|
||||||
|
* @param origin is the {@link LobbyConnection} that the {@link Event Events} are broadcasted from
|
||||||
|
* @param events are the {@link Event Events} to be broadcasted
|
||||||
|
*/
|
||||||
public void broadcastEvents (LobbyConnection origin, Event[] events) {
|
public void broadcastEvents (LobbyConnection origin, Event[] events) {
|
||||||
// TODO: Create JSON
|
// TODO: Create JSON
|
||||||
// TODO: send to target
|
// TODO: send to target
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Terminates a given {@link LobbyConnection}. This is a End-of-Lifecycle method for
|
||||||
|
* {@link LobbyConnection LobbyConnections}, and they may not be reused again.
|
||||||
|
* @param origin is the LobbyConnection to be terminated
|
||||||
|
*/
|
||||||
|
public void terminate (LobbyConnection origin) {
|
||||||
|
// TODO: implement
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user