88import io .github .tfkfan .orbital .core .factory .PlayerFactory ;
99import io .github .tfkfan .orbital .core .manager .GameManager ;
1010import io .github .tfkfan .orbital .core .metrics .registrar .GameManagerMetricsRegistrar ;
11+ import io .github .tfkfan .orbital .core .model .players .Player ;
1112import io .github .tfkfan .orbital .core .room .GameRoom ;
13+ import io .github .tfkfan .orbital .core .room .RoomType ;
1214import io .github .tfkfan .orbital .core .session .PlayerSession ;
1315import io .github .tfkfan .orbital .core .shared .ActionType ;
1416import io .github .tfkfan .orbital .core .state .GameState ;
1517import io .vertx .core .Vertx ;
1618import io .vertx .core .eventbus .Message ;
19+ import io .vertx .core .json .JsonArray ;
1720import io .vertx .core .json .JsonObject ;
1821import io .vertx .micrometer .backends .BackendRegistries ;
1922import lombok .extern .slf4j .Slf4j ;
2023
21- import java .util .HashMap ;
22- import java .util .Map ;
23- import java .util .Objects ;
24- import java .util .UUID ;
24+ import java .util .*;
2525
2626@ Slf4j
2727public class GameManagerImpl <R extends GameRoom , S extends GameState > implements GameManager {
@@ -62,31 +62,62 @@ protected void onMessage(Message<JsonObject> message) {
6262 ActionType actionType = ActionType .valueOf (rawAction );
6363 if (actionType .equals (ActionType .NEW_ROOM )) {
6464 final S gameState = gameStateFactory .get ();
65+ final RoomType roomType = RoomType .valueOf (json .getString (Fields .roomType ));
6566 final UUID roomId = UUID .fromString (json .getString (Fields .roomId ));
66- final GameRoom room = gameRoomFactory .createGameRoom (verticleId , roomId , gameState ,
67- this , roomConfig );
68- room .onCreate ();
69-
70- json .getJsonArray (Fields .sessions )
71- .stream ()
72- .forEach (s -> {
73- JsonObject session = (JsonObject ) s ;
74- final String sessionId = session
75- .getString (Fields .sessionId );
76- final boolean isAdmin = session .getBoolean (Fields .admin );
77- final PlayerSession userSession = new PlayerSession (sessionId , isAdmin );
78- gameState .addPlayer (playerFactory .createPlayer (gameState .nextPlayerId (),
79- room , userSession , session .getJsonObject (Fields .initialData )));
80- playerSessionsMap .put (sessionId , userSession );
81- room .onJoin (userSession );
82- });
83-
84- gameRoomMap .put (room .key (), room );
67+ final GameRoom room = createRoom (roomId , roomType , gameState , json .getJsonArray (Fields .sessions ));
8568 room .onStart ();
8669 }
8770 }
8871 }
8972
73+ protected GameRoom createRoom (final UUID roomId , final RoomType roomType , final S gameState , JsonArray playersSessions ) {
74+ validatePlayersCount (roomType , playersSessions , roomId );
75+
76+ final GameRoom room = gameRoomFactory .createGameRoom (verticleId , roomId , roomType ,
77+ gameState , this , roomConfig );
78+ room .onCreate ();
79+
80+ playersSessions .forEach (s -> addPlayerSession (gameState , room , (JsonObject ) s ));
81+
82+ if (RoomType .TRAINING .equals (roomType ))
83+ addNpcSessions (gameState , room , roomConfig .getMaxPlayers () - 1 );
84+
85+ gameRoomMap .put (room .key (), room );
86+ return room ;
87+ }
88+
89+ protected void addNpcSessions (S gameState , GameRoom room , int count ) {
90+ for (int id = 0 ; id < count ; id ++)
91+ addPlayerSession (gameState , room , Integer .toString (id ),
92+ false ,
93+ true ,
94+ null );
95+ }
96+
97+ protected void postPlayerSessionHandle (final Player player ) {
98+
99+ }
100+
101+ protected void addPlayerSession (S gameState , GameRoom room , JsonObject session ) {
102+ addPlayerSession (gameState , room , session
103+ .getString (Fields .sessionId ),
104+ session .getBoolean (Fields .admin ),
105+ false ,
106+ session .getJsonObject (Fields .initialData ));
107+ }
108+
109+ protected void addPlayerSession (S gameState , GameRoom room , String sessionId ,
110+ boolean isAdmin , boolean isNpc ,
111+ JsonObject initialData ) {
112+ final PlayerSession userSession = new PlayerSession (sessionId , isAdmin , isNpc );
113+ final Player player = playerFactory .createPlayer (gameState .nextPlayerId (),
114+ room , userSession , initialData );
115+ gameState .addPlayer (player );
116+ playerSessionsMap .put (sessionId , userSession );
117+ room .onJoin (userSession );
118+ postPlayerSessionHandle (player );
119+ }
120+
90121 @ Override
91122 public void onBattleEnd (GameRoom room ) {
92123 gameRoomMap .remove (room .key ());
@@ -105,4 +136,10 @@ public Integer totalPlayers() {
105136 public String id () {
106137 return verticleId ;
107138 }
139+
140+ protected void validatePlayersCount (final RoomType roomType , final JsonArray playersSessions , final UUID roomId ) {
141+ if (RoomType .TRAINING .equals (roomType ) && playersSessions .size () > 1 || !RoomType .TRAINING .equals (roomType ) && playersSessions .size () >= roomConfig .getMaxPlayers ())
142+ throw new IllegalArgumentException ("Invalid players count received for room: " + roomId );
143+
144+ }
108145}
0 commit comments