diff -r ed1d52c5aa94 -r 763d3961400b project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetRoomState.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetRoomState.java Sat Aug 18 00:47:51 2012 +0200 @@ -0,0 +1,207 @@ +package org.hedgewars.hedgeroid.netplay; + +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_GAMESTYLE; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_DRAWDATA; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_GENERATOR; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_NAME; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_SEED; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_TEMPLATE; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAP_THEME; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_MAZE_SIZE; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_SCHEME; +import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.MSG_SEND_WEAPONSET; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +import org.hedgewars.hedgeroid.RoomStateManager; +import org.hedgewars.hedgeroid.Datastructures.GameConfig; +import org.hedgewars.hedgeroid.Datastructures.MapRecipe; +import org.hedgewars.hedgeroid.Datastructures.Scheme; +import org.hedgewars.hedgeroid.Datastructures.Weaponset; +import org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType; + +/** + * This class manages the room state in a network game. + */ +class NetRoomState implements RoomStateManager { + private List observers = new LinkedList(); + private Netplay netplay; + + boolean chief; + String gameStyle; + Scheme scheme; + MapRecipe map; + Weaponset weaponset; + + public NetRoomState(Netplay netplay) { + this.netplay = netplay; + this.map = MapRecipe.makeRandomMap(0, "seed", GameConfig.DEFAULT_THEME); + } + + public MapRecipe getMapRecipe() { + return map; + } + + public boolean getChiefStatus() { + return chief; + } + + public Scheme getScheme() { + return scheme; + } + + public String getGameStyle() { + return gameStyle; + } + + public Weaponset getWeaponset() { + return weaponset; + } + + public void changeWeaponset(Weaponset weaponset) { + if(chief && !weaponset.equals(this.weaponset)) { + sendToNet(MSG_SEND_WEAPONSET, weaponset); + setWeaponset(weaponset); + } + } + + public void changeMapRecipe(MapRecipe mapRecipe) { + if(chief && !mapRecipe.equals(this.map)) { + sendToNet(MSG_SEND_MAP, mapRecipe); + setMapRecipe(mapRecipe); + } + } + + public void changeMapNameAndGenerator(String mapName) { + if(chief && !mapName.equals(this.map.name)) { + int newGenerator = MapRecipe.generatorForMapname(mapName); + if(newGenerator != this.map.mapgen) { + sendToNet(MSG_SEND_MAP_GENERATOR, newGenerator, null); + } + sendToNet(MSG_SEND_MAP_NAME, mapName); + setMapRecipe(map.withName(mapName).withMapgen(newGenerator)); + } + } + + public void changeMapTemplate(int template) { + if(chief && template != this.map.templateFilter) { + sendToNet(MSG_SEND_MAP_TEMPLATE, template, null); + setMapRecipe(map.withTemplateFilter(template)); + } + } + + public void changeMazeSize(int mazeSize) { + if(chief && mazeSize != this.map.mazeSize) { + sendToNet(MSG_SEND_MAZE_SIZE, mazeSize, 0); + setMapRecipe(map.withMazeSize(mazeSize)); + } + } + + public void changeMapSeed(String seed) { + if(chief && !seed.equals(this.map.seed)) { + sendToNet(MSG_SEND_MAP_SEED, seed); + setMapRecipe(map.withSeed(seed)); + } + } + + public void changeMapTheme(String theme) { + if(chief && !theme.equals(this.map.theme)) { + sendToNet(MSG_SEND_MAP_THEME, theme); + setMapRecipe(map.withTheme(theme)); + } + } + + public void changeMapDrawdata(byte[] drawdata) { + if(chief && !Arrays.equals(drawdata, this.map.getDrawData())) { + sendToNet(MSG_SEND_MAP_DRAWDATA, drawdata); + setMapRecipe(map.withDrawData(drawdata)); + } + } + + public void changeGameStyle(String gameStyle) { + if(chief && !gameStyle.equals(this.gameStyle)) { + sendToNet(MSG_SEND_GAMESTYLE, gameStyle); + setGameStyle(gameStyle); + } + } + + public void changeScheme(Scheme scheme) { + if(chief && !scheme.equals(this.scheme)) { + sendToNet(MSG_SEND_SCHEME, scheme); + setScheme(scheme); + } + } + + void setWeaponset(Weaponset weaponset) { + if(!weaponset.equals(this.weaponset)) { + this.weaponset = weaponset; + for(RoomStateManager.Observer observer : observers) { + observer.onWeaponsetChanged(weaponset); + } + } + } + + void setMapRecipe(MapRecipe map) { + if(!map.equals(this.map)) { + this.map = map; + for(RoomStateManager.Observer observer : observers) { + observer.onMapChanged(map); + } + } + } + + void setGameStyle(String gameStyle) { + if(!gameStyle.equals(this.gameStyle)) { + this.gameStyle = gameStyle; + for(RoomStateManager.Observer observer : observers) { + observer.onGameStyleChanged(gameStyle); + } + } + } + + void setScheme(Scheme scheme) { + if(!scheme.equals(this.scheme)) { + this.scheme = scheme; + for(RoomStateManager.Observer observer : observers) { + observer.onSchemeChanged(scheme); + } + } + } + + void setChief(boolean chief) { + if(chief != this.chief) { + this.chief = chief; + for(RoomStateManager.Observer observer : observers) { + observer.onChiefStatusChanged(chief); + } + } + } + + void sendFullConfig() { + if(chief) { + sendToNet(MSG_SEND_GAMESTYLE, gameStyle); + sendToNet(MSG_SEND_SCHEME, scheme); + sendToNet(MSG_SEND_WEAPONSET, weaponset); + sendToNet(MSG_SEND_MAP, map); + } + } + + public void registerObserver(Observer observer) { + observers.add(observer); + } + + public void unregisterObserver(Observer observer) { + observers.remove(observer); + } + + private boolean sendToNet(ToNetMsgType what, Object obj) { + return netplay.sendToNet(what, 0, obj); + } + + private boolean sendToNet(ToNetMsgType what, int arg1, Object obj) { + return netplay.sendToNet(what, arg1, obj); + } +}