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 }