Source code: org/zazof/jteg/GameController.java
1 package org.zazof.jteg;
2
3 import java.io.IOException;
4 import javax.swing.JOptionPane;
5
6 /**
7 * responsible for the general control of the game
8 *
9 * @author Jef De Geeter
10 * @date August 2001
11 */
12 public class GameController implements MessageListener{
13
14 /**
15 * private constructor because this class is a singleton
16 */
17 private GameController(){
18 $playerList = new PlayerList();
19 $boardModel = new BoardModel($playerList);
20 $boardController = new BoardController($boardModel);
21 $cardController = new CardController();
22 MessageManager.getInstance().addMessageListener(this);
23 }
24
25 /**
26 * @return the unique instance of this class
27 */
28 public static GameController getInstance(){
29 if (instance == null) instance = new GameController();
30 return instance;
31 }
32
33 /**
34 * makes a connection with the server
35 *
36 * @param playerMode 0 = observer or 1 = player
37 */
38 public void connectToServer(String server, int port, String playerName, int playerMode){
39 $playerMode = playerMode;
40 try{
41 MessageManager.getInstance().makeConnectionWithServer(server, port);
42 String[] messageParts = {"newplayer", playerName, Integer.toString(playerMode)};
43 MessageManager.getInstance().sendToServer(messageParts);
44 MessageManager.getInstance().startThread();
45 }
46 catch (ServerException exc){
47 if (DEBUG) System.out.println("Error handling in GameController!");
48 JOptionPane.showMessageDialog(null, exc.getMessage(), "Error message", JOptionPane.ERROR_MESSAGE);
49 JTEGStateMachine.getInstance().setCurrentState(JTEGStateMachine.DISCONNECTED);
50 }
51 catch (IOException exc) {
52 if (DEBUG) System.out.println("Error handling in GameController!");
53 JOptionPane.showMessageDialog(null, "No Server found on the address/port specified", "Error message", JOptionPane.ERROR_MESSAGE);
54 JTEGStateMachine.getInstance().setCurrentState(JTEGStateMachine.DISCONNECTED);
55 }
56 catch (UnknownMessageException exc) {
57 // This should never happen...
58 exc.printStackTrace();
59 System.out.println(exc.getMessage());
60 }
61 }
62
63 public void startGame(int gameType)
64 {
65 try
66 {
67 // First we request a mission
68 String[] messageParts={"mission", Integer.toString(gameType)};
69 MessageManager.getInstance().sendToServer(messageParts);
70 // And then we initiate the start of a game
71 String[] other = {"startgame"};
72 MessageManager.getInstance().sendToServer(other);
73 }
74 catch (ServerException exc){
75 // Should never happen!
76 if (DEBUG) System.out.println("Error handling in GameController while starting game!");
77 JOptionPane.showMessageDialog(null, exc.getMessage(), "Error message", JOptionPane.ERROR_MESSAGE);
78 JTEGStateMachine.getInstance().setCurrentState(JTEGStateMachine.DISCONNECTED);
79 }
80 catch (UnknownMessageException exc) {
81 // This should never happen...
82 exc.printStackTrace();
83 System.out.println(exc.getMessage());
84 }
85 }
86
87 /**
88 * @return the mode of this game: 0 = observer, 1 = player
89 */
90 public int getPlayerMode(){
91 return $playerMode;
92 }
93
94 public PlayerList getPlayerList(){
95 return $playerList;
96 }
97
98 public CountryList getCountryList(){
99 return $boardModel.getCountryList();
100 }
101
102
103
104 public void messageArrived(Message m){
105 try{
106 if (m.getMessageName().equals("new_player")){
107 NewPlayerMessage npm;
108 npm = (NewPlayerMessage) m;
109 if (DEBUG) System.out.println("New player " + npm.getNewPlayerName() + " arrived in GameController");
110 $playerList.addPlayer(new Player(npm.getNewPlayerName(), npm.getNewPlayerColor(), npm.getNewPlayerNumber()));
111 }
112 if (m.getMessageName().equals("turno")){
113 // we have a turno message, so we send to the server "paises=-1"
114 TurnMessage tm = (TurnMessage) m;
115 MessageManager.getInstance().askPlayerStatus();
116 }
117 if (m.getMessageName().equals("start")){
118 // we have a start message, so we can fill the playerlist
119 if (DEBUG) System.out.println("GameController: received StartMessage");
120 JTEGStateMachine.getInstance().setCurrentState(JTEGStateMachine.GAME_STARTED);
121 StartMessage sm = (StartMessage) m;
122 Player tmp;
123 while (sm.hasMoreInformation()){
124 tmp = new Player(sm.getPlayerName(), sm.getPlayerColor(), sm.getPlayerID());
125 if (DEBUG) System.out.println("added player " + tmp.getName() + " with id: " + tmp.getID() + " with color: " + tmp.getColorID());
126 $playerList.addPlayer(tmp);
127 sm.nextInformation();
128 }
129 MessageManager.getInstance().askPlayerStatus();
130 }
131 if (m.getMessageName().equals("status")){
132 // we have a status message, so we can fill the playerlist
133 if (DEBUG) System.out.println("GameController: received StatusMessage");
134 StatusMessage sm = (StatusMessage) m;
135 Player tmp;
136 while (sm.hasMoreInformation()){
137 tmp = new Player(sm.getPlayerName(), sm.getPlayerColor(), sm.getPlayerID());
138 if (DEBUG) System.out.println("added player " + tmp.getName() + " with id: " + tmp.getID() + " with color: " + tmp.getColorID());
139 $playerList.addPlayer(tmp);
140 sm.nextInformation();
141 }
142 }
143 if (m.getMessageName().equals("player_id")){
144 if (DEBUG) System.out.println("GameController: received ClientPlayerMessage");
145 ClientPlayerMessage cpm = (ClientPlayerMessage) m;
146 setClientPlayerID(cpm.getClientPlayerNumber());
147 // we ask the status, because other players may be connected before us. So
148 // we can know which colors are already taken by other players.
149 String[] params = {"status"};
150 MessageManager.getInstance().sendToServer(params);
151 }
152 if (m.getMessageName().equals("mission")){
153 if (DEBUG) System.out.println("GameController: received ClientPlayerMessage");
154 MissionMessage mm = (MissionMessage) m;
155 if ((mm.getMissionType() == 1) && (mm.getMissionNumber() == 0))
156 {
157 // We know that we have a secret mission
158 // We don't know which one.. So we'll have to request it...
159 String[] params = {"askprivatemission"};
160 MessageManager.getInstance().sendToServer(params);
161 }
162 }
163 }
164 catch (Exception exc){
165 exc.printStackTrace();
166 JOptionPane.showMessageDialog(null, exc.getMessage(), "Error message", JOptionPane.ERROR_MESSAGE);
167 }
168 }
169
170 public BoardModel getBoardModel()
171 {
172 return $boardModel;
173 }
174
175 public BoardController getBoardController()
176 {
177 return $boardController;
178 }
179
180 public CardController getCardController()
181 {
182 return $cardController;
183 }
184
185
186 public Player getClientPlayer(){
187 try
188 {
189 Player clientPlayer = $playerList.getPlayer($clientPlayer);
190 return clientPlayer;
191 }
192 catch (Exception e)
193 {
194 System.out.println("Exception thrown in getClientPlayer() with message: " + e.getMessage());
195 e.printStackTrace();
196 return null;
197 }
198 }
199
200 public void setClientPlayerID(int id){
201 $clientPlayer = id;
202 }
203
204
205 public String getBoardMapFileName()
206 {
207 return BoardModel.getBoardMapFileName();
208 }
209
210
211 /**
212 * o = observer, 1 = player
213 */
214 private int $playerMode;
215 /**
216 * id of the player who's behind this client
217 */
218 private int $clientPlayer;
219
220 private static GameController instance;
221 private PlayerList $playerList;
222 private static final boolean DEBUG = false;
223 private BoardModel $boardModel;
224 private BoardController $boardController;
225 private CardController $cardController;
226 }