View Javadoc

1   package net.sourceforge.simplegamenet.chess;
2   
3   import java.io.Serializable;
4   import net.sourceforge.simplegamenet.specs.gui.GamePanel;
5   import net.sourceforge.simplegamenet.specs.gui.UtilityPanelFactory;
6   import net.sourceforge.simplegamenet.specs.model.ClientEngine;
7   import net.sourceforge.simplegamenet.specs.model.GamePlayerClient;
8   import net.sourceforge.simplegamenet.specs.to.PlayerSettings;
9   
10  public class ChessPlayerClient extends GamePlayerClient implements ChessPacketCodes,
11          ChessPlayFieldState {
12  
13      private ChessPanel chessPanel = null;
14  
15      private ChessPlayField chessPlayField = null;
16  
17      private boolean remiseOfferable = false;
18  
19      public ChessPlayerClient(ClientEngine clientEngine) {
20          super(clientEngine);
21      }
22  
23      public GamePanel createGamePanel(UtilityPanelFactory utilityPanelFactory) {
24          chessPanel = new ChessPanel(this, utilityPanelFactory.createChatClientPanel());
25          return chessPanel;
26      }
27  
28      public void playerRemoved(PlayerSettings playerSettings) {
29          if (clientEngine.isGamePlaying()
30                  && playerSettings.getPlayingState() == PlayerSettings.PARTICIPATING) {
31              int playFieldState = chessPlayField.yieldGame(playerSettings.getPlayerID());
32              chessPanel.setPlayFieldState(playFieldState);
33              Integer winningPlayerID = chessPlayField.getParticipantAtTurnPlayerID();
34              if (clientEngine.getPlayerID().equals(winningPlayerID)) {
35                  chessPanel.setWinnerThisPlayer();
36              } else {
37                  chessPanel.setWinner(clientEngine.getPlayerSettingsMap().getPlayerSettings(
38                          winningPlayerID)
39                          .getNickname());
40              }
41          }
42      }
43  
44      public void receiveData(Serializable data) {
45          if (!(data instanceof ChessPacket)) {
46              clientEngine.leaveProtocolViolatingServer();
47              return;
48          }
49          ChessPacket chessPacket = (ChessPacket) data;
50          int playFieldState = -1;
51          switch (chessPacket.packetCode) {
52  
53              case PARTICIPANTS_ORDER:
54                  if (!(chessPacket.data instanceof Integer[])) {
55                      clientEngine.leaveProtocolViolatingServer();
56                      return;
57                  }
58                  chessPlayField = new ChessPlayField((Integer[]) chessPacket.data);
59                  chessPanel.setPieceOwnerSight(chessPlayField.getPieceOwnerSight(
60                          clientEngine.getPlayerID()));
61                  chessPanel.playFieldUpdated(chessPlayField.getPieceTypeGrid(),
62                          chessPlayField.getPieceOwnerGrid());
63                  chessPanel.setPlayFieldState(NORMAL_STATE);
64                  moveOnToNextParticipant(true);
65                  break;
66  
67              case E_MAKE_MOVE:
68                  moveOnToNextParticipant(false);
69                  break;
70              case MOVE_MADE:
71                  if (!(chessPacket.data instanceof ChessMove)) {
72                      clientEngine.leaveProtocolViolatingServer();
73                      return;
74                  }
75                  ChessMove chessMove = (ChessMove) chessPacket.data;
76                  playFieldState = chessPlayField.doMove(chessMove.sourceX, chessMove.sourceY,
77                          chessMove.destinationX, chessMove.destinationY,
78                          chessMove.chosenPieceType);
79                  chessPanel.playFieldUpdated(chessPlayField.getPieceTypeGrid(),
80                          chessPlayField.getPieceOwnerGrid());
81                  chessPanel.setLastMove(chessMove.sourceX, chessMove.sourceY,
82                          chessMove.destinationX, chessMove.destinationY);
83                  chessPanel.setPlayFieldState(playFieldState);
84                  switch (playFieldState) {
85                      case NORMAL_STATE:
86                      case CHECK:
87                          moveOnToNextParticipant(true);
88                          break;
89                      case CHECKMATE:
90                          Integer participantAtTurn = chessPlayField.getParticipantAtTurnPlayerID();
91                          if (clientEngine.getPlayerID().equals(participantAtTurn)) {
92                              chessPanel.setWinnerThisPlayer();
93                          } else {
94                              chessPanel.setWinner(clientEngine.getPlayerSettingsMap()
95                                      .getPlayerSettings(participantAtTurn)
96                                      .getNickname());
97                          }
98                          break;
99                      case STALEMATE:
100                     case REMISE:
101                         chessPanel.setNoWinner();
102                         break;
103                 }
104                 break;
105 
106             case YIELD_MADE:
107                 playFieldState = chessPlayField.yieldGame(
108                         chessPlayField.getParticipantAtTurnPlayerID());
109                 chessPanel.setPlayFieldState(playFieldState);
110                 Integer winningPlayerID = chessPlayField.getParticipantAtTurnPlayerID();
111                 if (clientEngine.getPlayerID().equals(winningPlayerID)) {
112                     chessPanel.setWinnerThisPlayer();
113                 } else {
114                     chessPanel.setWinner(clientEngine.getPlayerSettingsMap().getPlayerSettings(
115                             winningPlayerID)
116                             .getNickname());
117                 }
118                 break;
119 
120             case E_OFFER_REMISE:
121                 moveOnToNextParticipant(false);
122                 break;
123             case REMISE_OFFERED:
124                 chessPlayField.setWaitingForRemiseOfferAnswer();
125                 chessPanel.remiseOffered();
126                 if (clientEngine.getPlayerSettings().getPlayingState()
127                         == PlayerSettings.PARTICIPATING
128                         && !clientEngine.getPlayerID().equals(
129                                 chessPlayField.getParticipantAtTurnPlayerID())) {
130                     if (chessPanel.getRemiseOfferAnswer()) {
131                         clientEngine.sendData(new ChessPacket(ACCEPT_REMISE, null));
132                     } else {
133                         clientEngine.sendData(new ChessPacket(DECLINE_REMISE, null));
134                     }
135                 }
136                 break;
137             case REMISE_ACCEPTED:
138                 if (clientEngine.getPlayerID().equals(
139                         chessPlayField.getParticipantAtTurnPlayerID())) {
140                     chessPanel.setRemiseOfferAnswer(true);
141                 }
142                 playFieldState = chessPlayField.setRemiseOfferAnswer(true);
143                 chessPanel.setPlayFieldState(playFieldState);
144                 chessPanel.setNoWinner();
145                 break;
146             case REMISE_DECLINED:
147                 if (clientEngine.getPlayerID().equals(
148                         chessPlayField.getParticipantAtTurnPlayerID())) {
149                     chessPanel.setRemiseOfferAnswer(false);
150                 }
151                 chessPlayField.setRemiseOfferAnswer(false);
152                 moveOnToNextParticipant(false);
153                 break;
154 
155             case PLAY_FIELD:
156                 if (!(chessPacket.data instanceof ChessPlayField)) {
157                     clientEngine.leaveProtocolViolatingServer();
158                     return;
159                 }
160                 chessPlayField = (ChessPlayField) chessPacket.data;
161                 chessPanel.setPieceOwnerSight(chessPlayField.getPieceOwnerSight(
162                         clientEngine.getPlayerID()));
163                 chessPanel.playFieldUpdated(chessPlayField.getPieceTypeGrid(),
164                         chessPlayField.getPieceOwnerGrid());
165                 chessPanel.setPlayFieldState(chessPlayField.getPlayFieldState());
166                 moveOnToNextParticipant(true);
167                 break;
168 
169             default:
170                 clientEngine.leaveProtocolViolatingServer();
171         }
172     }
173 
174     public void gameAborting() {
175         int playFieldState = chessPlayField.setRemiseOfferAnswer(true);
176         chessPanel.setPlayFieldState(playFieldState);
177         chessPanel.setNoWinner();
178     }
179 
180     private void moveOnToNextParticipant(boolean adjustRemiseOfferable) {
181         Integer participantAtTurn = chessPlayField.getParticipantAtTurnPlayerID();
182         if (clientEngine.getPlayerID().equals(participantAtTurn)) {
183             if (adjustRemiseOfferable) {
184                 remiseOfferable = true;
185             }
186             chessPanel.handleTurn();
187         } else {
188             chessPanel.setOtherParticipantAtTurn(clientEngine.getPlayerSettingsMap()
189                     .getPlayerSettings(participantAtTurn)
190                     .getNickname());
191         }
192     }
193 
194     public void makeMove(int sourceX, int sourceY, int destinationX, int destinationY) {
195         makeMove(sourceX, sourceY, destinationX, destinationY, ChessPieceType.NO_TYPE);
196     }
197 
198     public void makeMove(int sourceX, int sourceY, int destinationX, int destinationY,
199                          int chosenPieceType) {
200         clientEngine.sendData(new ChessPacket(MAKE_MOVE,
201                 new ChessMove(sourceX, sourceY, destinationX, destinationY, chosenPieceType)));
202     }
203 
204     public boolean isOfferRemiseAllowed() {
205         return remiseOfferable;
206     }
207 
208     public void offerRemise() {
209         remiseOfferable = false;
210         clientEngine.sendData(new ChessPacket(OFFER_REMISE, null));
211     }
212 
213     public void yieldGame() {
214         clientEngine.sendData(new ChessPacket(MAKE_YIELD, null));
215     }
216 
217     public boolean[][] getMoveSourceAllowedGrid() {
218         if (chessPlayField == null) {
219             return null;
220         } else {
221             return chessPlayField.getMoveSourceAllowedGrid();
222         }
223     }
224 
225     public boolean[][] getMoveDestinationAllowedGrid(int sourceX, int sourceY) {
226         if (chessPlayField == null) {
227             return null;
228         } else {
229             return chessPlayField.getMoveDestinationAllowedGrid(sourceX, sourceY);
230         }
231     }
232 
233     public boolean isReplaceChoiceNeeded(int sourceX, int sourceY,
234                                          int destinationX, int destinationY) {
235         return chessPlayField.isReplaceChoiceNeeded(sourceX, sourceY,
236                 destinationX, destinationY);
237     }
238 
239 }