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 }