View Javadoc

1   package net.sourceforge.simplegamenet.chess;
2   
3   import java.io.Serializable;
4   import net.sourceforge.simplegamenet.specs.model.GameServer;
5   import net.sourceforge.simplegamenet.specs.model.ServerEngine;
6   import net.sourceforge.simplegamenet.specs.to.PlayerSettings;
7   
8   public class ChessServer extends GameServer implements ChessPacketCodes,
9           ChessPlayFieldState {
10  
11      private ChessPlayField chessPlayField = null;
12  
13      private boolean remiseOfferable = false;
14  
15      public ChessServer(ServerEngine serverEngine) {
16          super(serverEngine);
17      }
18  
19      public void playerAdded(PlayerSettings playerSettings) {
20          if (serverEngine.isGamePlaying()) {
21              serverEngine.sendData(playerSettings.getPlayerID(),
22                      new ChessPacket(PLAY_FIELD, chessPlayField));
23          }
24      }
25  
26      public void playerRemoved(PlayerSettings playerSettings) {
27          if (serverEngine.isGamePlaying()
28                  && playerSettings.getPlayingState() == PlayerSettings.PARTICIPATING) {
29              chessPlayField.yieldGame(playerSettings.getPlayerID());
30              Integer winningPlayerID = chessPlayField.getParticipantAtTurnPlayerID();
31              serverEngine.appendGameChatMessage(serverEngine.getPlayerSettingsMap()
32                      .getPlayerSettings(winningPlayerID)
33                      .getNickname()
34                      + " has won the game.");
35              serverEngine.stopGame();
36          }
37      }
38  
39      public void gameStarted() {
40          Integer[] originParticipantIDs = serverEngine.getPlayerSettingsMap()
41                  .getParticipantIDs();
42          Integer[] participantsOrder = new Integer[originParticipantIDs.length];
43          int originParticipantIDsLength = originParticipantIDs.length;
44          for (int i = 0; i < participantsOrder.length; i++) {
45              int randomNumberIndex = (int) (Math.random() * (originParticipantIDsLength));
46              participantsOrder[i] = originParticipantIDs[randomNumberIndex];
47              for (int j = randomNumberIndex; j < originParticipantIDsLength - 1; j++) {
48                  originParticipantIDs[j] = originParticipantIDs[j + 1];
49              }
50              originParticipantIDsLength--;
51          }
52          chessPlayField = new ChessPlayField(participantsOrder);
53          remiseOfferable = true;
54          serverEngine.sendData(new ChessPacket(PARTICIPANTS_ORDER, participantsOrder));
55      }
56  
57      public void receiveData(Integer playerID, Serializable data) {
58          if (!(data instanceof ChessPacket)) {
59              serverEngine.kickProtocolViolatingPlayer(playerID);
60              return;
61          }
62          ChessPacket chessPacket = (ChessPacket) data;
63          switch (chessPacket.packetCode) {
64  
65              case MAKE_MOVE:
66                  if (!(chessPacket.data instanceof ChessMove)) {
67                      serverEngine.kickProtocolViolatingPlayer(playerID);
68                      return;
69                  }
70                  ChessMove chessMove = (ChessMove) chessPacket.data;
71                  if (playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())
72                          && chessPlayField.isMoveAllowed(chessMove.sourceX, chessMove.sourceY,
73                                  chessMove.destinationX, chessMove.destinationY,
74                                  chessMove.chosenPieceType)) {
75                      int chessPlayFieldState = chessPlayField.doMove(chessMove.sourceX, chessMove.sourceY,
76                              chessMove.destinationX, chessMove.destinationY,
77                              chessMove.chosenPieceType);
78                      serverEngine.sendData(new ChessPacket(MOVE_MADE, chessMove));
79                      switch (chessPlayFieldState) {
80                          case NORMAL_STATE:
81                          case CHECK:
82                              remiseOfferable = true;
83                              break;
84                          case CHECKMATE:
85                              serverEngine.appendGameChatMessage(serverEngine.getPlayerSettingsMap()
86                                      .getPlayerSettings(playerID)
87                                      .getNickname()
88                                      + " has won the game.");
89                              serverEngine.stopGame();
90                              break;
91                          case STALEMATE:
92                              serverEngine.appendGameChatMessage("The game is remise by stalemate.");
93                              serverEngine.stopGame();
94                              break;
95                          case REMISE:
96                              serverEngine.appendGameChatMessage("The game is remise.");
97                              serverEngine.stopGame();
98                              break;
99                      }
100                 } else {
101                     serverEngine.sendData(playerID, new ChessPacket(E_MAKE_MOVE, null));
102                 }
103                 break;
104 
105             case MAKE_YIELD:
106                 if (playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) {
107                     chessPlayField.yieldGame(chessPlayField.getParticipantAtTurnPlayerID());
108                     serverEngine.sendData(new ChessPacket(YIELD_MADE, null));
109                     Integer winningPlayerID = chessPlayField.getParticipantAtTurnPlayerID();
110                     serverEngine.appendGameChatMessage(serverEngine.getPlayerSettingsMap()
111                             .getPlayerSettings(winningPlayerID)
112                             .getNickname()
113                             + " has won the game.");
114                     serverEngine.stopGame();
115                 }
116                 break;
117 
118             case OFFER_REMISE:
119                 if (playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) {
120                     if (!remiseOfferable) {
121                         serverEngine.sendData(playerID, new ChessPacket(E_OFFER_REMISE, null));
122                         return;
123                     }
124                     remiseOfferable = false;
125                     chessPlayField.setWaitingForRemiseOfferAnswer();
126                     serverEngine.sendData(new ChessPacket(REMISE_OFFERED, null));
127                 }
128                 break;
129             case ACCEPT_REMISE:
130                 if (serverEngine.getPlayerSettingsMap().getPlayerSettings(playerID)
131                         .getPlayingState() == PlayerSettings.PARTICIPATING
132                         && !playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) {
133                     chessPlayField.setRemiseOfferAnswer(true);
134                     serverEngine.sendData(new ChessPacket(REMISE_ACCEPTED, null));
135                     serverEngine.appendGameChatMessage("The game is remise.");
136                     serverEngine.stopGame();
137                 }
138                 break;
139             case DECLINE_REMISE:
140                 if (serverEngine.getPlayerSettingsMap().getPlayerSettings(playerID)
141                         .getPlayingState() == PlayerSettings.PARTICIPATING
142                         && !playerID.equals(chessPlayField.getParticipantAtTurnPlayerID())) {
143                     chessPlayField.setRemiseOfferAnswer(false);
144                     serverEngine.sendData(new ChessPacket(REMISE_DECLINED, null));
145                 }
146                 break;
147 
148             default:
149                 serverEngine.kickProtocolViolatingPlayer(playerID);
150         }
151     }
152 
153     public void gameAborting() {
154         chessPlayField.setRemiseOfferAnswer(true);
155         serverEngine.appendGameChatMessage("The game is remise because the game was "
156                 + "aborted.");
157     }
158 
159 }