File tree Expand file tree Collapse file tree 4 files changed +25
-5
lines changed
sdk/src/main/server-api/sc
main/java/sc/server/gaming
test/java/sc/server/network Expand file tree Collapse file tree 4 files changed +25
-5
lines changed Original file line number Diff line number Diff line change @@ -7,6 +7,7 @@ import com.thoughtworks.xstream.annotations.XStreamOmitField
7
7
import org.slf4j.LoggerFactory
8
8
import sc.api.plugins.ITeam
9
9
import sc.api.plugins.host.IPlayerListener
10
+ import sc.networking.clients.XStreamClient.DisconnectCause
10
11
import sc.protocol.room.MoveRequest
11
12
import sc.protocol.room.RoomMessage
12
13
import sc.util.PlayerConverter
@@ -37,9 +38,9 @@ class Player @JvmOverloads constructor(
37
38
var canTimeout: Boolean = false
38
39
39
40
@XStreamOmitField
40
- var left = false
41
+ var left: DisconnectCause ? = null
41
42
42
- fun hasLeft () = left
43
+ fun hasLeft () = left != null
43
44
44
45
@XStreamOmitField
45
46
var softTimeout = false
Original file line number Diff line number Diff line change @@ -8,4 +8,4 @@ import com.thoughtworks.xstream.annotations.XStreamAsAttribute
8
8
data class RemovedFromGame (
9
9
@XStreamAsAttribute
10
10
val roomId : String
11
- ): ProtocolPacket
11
+ ): ResponsePacket
Original file line number Diff line number Diff line change @@ -367,7 +367,10 @@ public synchronized void step(boolean forced) {
367
367
if (getStatus () == GameStatus .CREATED ) {
368
368
if (forced ) {
369
369
logger .warn ("Forcing game start for {}" , game );
370
- start ();
370
+ if (getClients ().size () < 2 )
371
+ cancel ();
372
+ else
373
+ start ();
371
374
} else {
372
375
logger .info ("Game isn't active yet, step was not forced." );
373
376
}
@@ -406,7 +409,10 @@ protected void setStatus(GameStatus status) {
406
409
/** Remove a player and stop the game. */
407
410
public void removePlayer (Player player , XStreamClient .DisconnectCause cause ) {
408
411
logger .info ("Removing {} from {}" , player , this );
409
- player .setLeft (true );
412
+ // Mark all non-joined players as left to trigger a draw when noone joined
413
+ // Might be superfluous through the check in "step", but keeping for safety
414
+ playerSlots .forEach (slot -> slot .getPlayer ().setLeft (slot .isEmpty () ? cause : null ));
415
+ player .setLeft (cause );
410
416
if (!isOver ())
411
417
cancel ();
412
418
}
Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ import io.kotest.matchers.collections.*
10
10
import io.kotest.matchers.nulls.*
11
11
import io.kotest.matchers.string.*
12
12
import sc.api.plugins.Team
13
+ import sc.protocol.RemovedFromGame
13
14
import sc.protocol.ResponsePacket
14
15
import sc.protocol.requests.JoinPreparedRoomRequest
15
16
import sc.protocol.requests.PrepareGameRequest
@@ -95,6 +96,18 @@ class LobbyGameTest: WordSpec({
95
96
room.clients.shouldBeEmpty()
96
97
room.isPauseRequested shouldBe true
97
98
}
99
+
100
+ " return GameResult on step" {
101
+ val roomListener = observeRoom(room.id)
102
+ admin.control(room.id).step(true)
103
+ val result = roomListener.waitForMessage(GameResult ::class)
104
+ withClue("No Winner ") {
105
+ result.winner shouldBe null
106
+ }
107
+ adminListener.waitForMessage(RemovedFromGame ::class)
108
+ roomListener.clearMessages() shouldBe 0
109
+ admin.closed shouldBe false
110
+ }
98
111
99
112
val reservations = prepared.reservations
100
113
players[0 ].joinGameWithReservation(reservations[0])
You can’t perform that action at this time.
0 commit comments