|
1 package org.hedgewars.hedgeroid.netplay; |
|
2 |
|
3 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_GAMESTYLE; |
|
4 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP; |
|
5 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_DRAWDATA; |
|
6 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_GENERATOR; |
|
7 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_NAME; |
|
8 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_SEED; |
|
9 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_TEMPLATE; |
|
10 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_THEME; |
|
11 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAZE_SIZE; |
|
12 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_SCHEME; |
|
13 import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_WEAPONSET; |
|
14 |
|
15 import java.util.Arrays; |
|
16 import java.util.LinkedList; |
|
17 import java.util.List; |
|
18 |
|
19 import org.hedgewars.hedgeroid.RoomStateManager; |
|
20 import org.hedgewars.hedgeroid.Datastructures.GameConfig; |
|
21 import org.hedgewars.hedgeroid.Datastructures.MapRecipe; |
|
22 import org.hedgewars.hedgeroid.Datastructures.Scheme; |
|
23 import org.hedgewars.hedgeroid.Datastructures.Weaponset; |
|
24 import org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType; |
|
25 |
|
26 /** |
|
27 * This class manages the room state in a network game. |
|
28 */ |
|
29 class NetRoomState implements RoomStateManager { |
|
30 private List<RoomStateManager.Observer> observers = new LinkedList<RoomStateManager.Observer>(); |
|
31 private Netplay netplay; |
|
32 |
|
33 boolean chief; |
|
34 String gameStyle; |
|
35 Scheme scheme; |
|
36 MapRecipe map; |
|
37 Weaponset weaponset; |
|
38 |
|
39 public NetRoomState(Netplay netplay) { |
|
40 this.netplay = netplay; |
|
41 this.map = MapRecipe.makeRandomMap(0, "seed", GameConfig.DEFAULT_THEME); |
|
42 } |
|
43 |
|
44 public MapRecipe getMapRecipe() { |
|
45 return map; |
|
46 } |
|
47 |
|
48 public boolean getChiefStatus() { |
|
49 return chief; |
|
50 } |
|
51 |
|
52 public Scheme getScheme() { |
|
53 return scheme; |
|
54 } |
|
55 |
|
56 public String getGameStyle() { |
|
57 return gameStyle; |
|
58 } |
|
59 |
|
60 public Weaponset getWeaponset() { |
|
61 return weaponset; |
|
62 } |
|
63 |
|
64 public void changeWeaponset(Weaponset weaponset) { |
|
65 if(chief && !weaponset.equals(this.weaponset)) { |
|
66 sendToNet(MSG_SEND_WEAPONSET, weaponset); |
|
67 setWeaponset(weaponset); |
|
68 } |
|
69 } |
|
70 |
|
71 public void changeMapRecipe(MapRecipe mapRecipe) { |
|
72 if(chief && !mapRecipe.equals(this.map)) { |
|
73 sendToNet(MSG_SEND_MAP, mapRecipe); |
|
74 setMapRecipe(mapRecipe); |
|
75 } |
|
76 } |
|
77 |
|
78 public void changeMapNameAndGenerator(String mapName) { |
|
79 if(chief && !mapName.equals(this.map.name)) { |
|
80 int newGenerator = MapRecipe.generatorForMapname(mapName); |
|
81 if(newGenerator != this.map.mapgen) { |
|
82 sendToNet(MSG_SEND_MAP_GENERATOR, newGenerator, null); |
|
83 } |
|
84 sendToNet(MSG_SEND_MAP_NAME, mapName); |
|
85 setMapRecipe(map.withName(mapName).withMapgen(newGenerator)); |
|
86 } |
|
87 } |
|
88 |
|
89 public void changeMapTemplate(int template) { |
|
90 if(chief && template != this.map.templateFilter) { |
|
91 sendToNet(MSG_SEND_MAP_TEMPLATE, template, null); |
|
92 setMapRecipe(map.withTemplateFilter(template)); |
|
93 } |
|
94 } |
|
95 |
|
96 public void changeMazeSize(int mazeSize) { |
|
97 if(chief && mazeSize != this.map.mazeSize) { |
|
98 sendToNet(MSG_SEND_MAZE_SIZE, mazeSize, 0); |
|
99 setMapRecipe(map.withMazeSize(mazeSize)); |
|
100 } |
|
101 } |
|
102 |
|
103 public void changeMapSeed(String seed) { |
|
104 if(chief && !seed.equals(this.map.seed)) { |
|
105 sendToNet(MSG_SEND_MAP_SEED, seed); |
|
106 setMapRecipe(map.withSeed(seed)); |
|
107 } |
|
108 } |
|
109 |
|
110 public void changeMapTheme(String theme) { |
|
111 if(chief && !theme.equals(this.map.theme)) { |
|
112 sendToNet(MSG_SEND_MAP_THEME, theme); |
|
113 setMapRecipe(map.withTheme(theme)); |
|
114 } |
|
115 } |
|
116 |
|
117 public void changeMapDrawdata(byte[] drawdata) { |
|
118 if(chief && !Arrays.equals(drawdata, this.map.getDrawData())) { |
|
119 sendToNet(MSG_SEND_MAP_DRAWDATA, drawdata); |
|
120 setMapRecipe(map.withDrawData(drawdata)); |
|
121 } |
|
122 } |
|
123 |
|
124 public void changeGameStyle(String gameStyle) { |
|
125 if(chief && !gameStyle.equals(this.gameStyle)) { |
|
126 sendToNet(MSG_SEND_GAMESTYLE, gameStyle); |
|
127 setGameStyle(gameStyle); |
|
128 } |
|
129 } |
|
130 |
|
131 public void changeScheme(Scheme scheme) { |
|
132 if(chief && !scheme.equals(this.scheme)) { |
|
133 sendToNet(MSG_SEND_SCHEME, scheme); |
|
134 setScheme(scheme); |
|
135 } |
|
136 } |
|
137 |
|
138 void setWeaponset(Weaponset weaponset) { |
|
139 if(!weaponset.equals(this.weaponset)) { |
|
140 this.weaponset = weaponset; |
|
141 for(RoomStateManager.Observer observer : observers) { |
|
142 observer.onWeaponsetChanged(weaponset); |
|
143 } |
|
144 } |
|
145 } |
|
146 |
|
147 void setMapRecipe(MapRecipe map) { |
|
148 if(!map.equals(this.map)) { |
|
149 this.map = map; |
|
150 for(RoomStateManager.Observer observer : observers) { |
|
151 observer.onMapChanged(map); |
|
152 } |
|
153 } |
|
154 } |
|
155 |
|
156 void setGameStyle(String gameStyle) { |
|
157 if(!gameStyle.equals(this.gameStyle)) { |
|
158 this.gameStyle = gameStyle; |
|
159 for(RoomStateManager.Observer observer : observers) { |
|
160 observer.onGameStyleChanged(gameStyle); |
|
161 } |
|
162 } |
|
163 } |
|
164 |
|
165 void setScheme(Scheme scheme) { |
|
166 if(!scheme.equals(this.scheme)) { |
|
167 this.scheme = scheme; |
|
168 for(RoomStateManager.Observer observer : observers) { |
|
169 observer.onSchemeChanged(scheme); |
|
170 } |
|
171 } |
|
172 } |
|
173 |
|
174 void setChief(boolean chief) { |
|
175 if(chief != this.chief) { |
|
176 this.chief = chief; |
|
177 for(RoomStateManager.Observer observer : observers) { |
|
178 observer.onChiefStatusChanged(chief); |
|
179 } |
|
180 } |
|
181 } |
|
182 |
|
183 void sendFullConfig() { |
|
184 if(chief) { |
|
185 sendToNet(MSG_SEND_GAMESTYLE, gameStyle); |
|
186 sendToNet(MSG_SEND_SCHEME, scheme); |
|
187 sendToNet(MSG_SEND_WEAPONSET, weaponset); |
|
188 sendToNet(MSG_SEND_MAP, map); |
|
189 } |
|
190 } |
|
191 |
|
192 public void registerObserver(Observer observer) { |
|
193 observers.add(observer); |
|
194 } |
|
195 |
|
196 public void unregisterObserver(Observer observer) { |
|
197 observers.remove(observer); |
|
198 } |
|
199 |
|
200 private boolean sendToNet(ToNetMsgType what, Object obj) { |
|
201 return netplay.sendToNet(what, 0, obj); |
|
202 } |
|
203 |
|
204 private boolean sendToNet(ToNetMsgType what, int arg1, Object obj) { |
|
205 return netplay.sendToNet(what, arg1, obj); |
|
206 } |
|
207 } |