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 }