diff -r c92596feac0d -r 714310efad8f project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java --- a/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java Mon Aug 20 20:16:37 2012 +0200 +++ b/project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/Netplay.java Mon Aug 20 20:19:35 2012 +0200 @@ -7,8 +7,6 @@ import java.util.Collections; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import java.util.TreeMap; import org.hedgewars.hedgeroid.RoomStateManager; import org.hedgewars.hedgeroid.Datastructures.GameConfig; @@ -18,7 +16,6 @@ import org.hedgewars.hedgeroid.Datastructures.Room; import org.hedgewars.hedgeroid.Datastructures.Scheme; import org.hedgewars.hedgeroid.Datastructures.Schemes; -import org.hedgewars.hedgeroid.Datastructures.Team; import org.hedgewars.hedgeroid.Datastructures.TeamInGame; import org.hedgewars.hedgeroid.Datastructures.TeamIngameAttributes; import org.hedgewars.hedgeroid.Datastructures.Weaponset; @@ -42,7 +39,7 @@ * This class manages the application's networking state. */ public class Netplay { - public static enum State { NOT_CONNECTED, CONNECTING, LOBBY, ROOM, INGAME } + public static enum State { NOT_CONNECTED, CONNECTING, LOBBY, ROOM } // Extras in broadcasts public static final String EXTRA_PLAYERNAME = "playerName"; @@ -64,6 +61,8 @@ private final Context appContext; private final LocalBroadcastManager broadcastManager; private final FromNetHandler fromNetHandler = new FromNetHandler(); + public final Scheme defaultScheme; + public final Weaponset defaultWeaponset; private State state = State.NOT_CONNECTED; private String playerName; @@ -79,17 +78,17 @@ public final Roomlist roomList = new Roomlist(); public final MessageLog lobbyChatlog; public final MessageLog roomChatlog; - public final ObservableTreeMap roomTeamlist = new ObservableTreeMap(); - private final Map roomRequestedTeams = new TreeMap(); private final List gameMessageListeners = new LinkedList(); private final List runGameListeners = new LinkedList(); - public Netplay(Context appContext) { + public Netplay(Context appContext, Scheme defaultScheme, Weaponset defaultWeaponset) { this.appContext = appContext; broadcastManager = LocalBroadcastManager.getInstance(appContext); lobbyChatlog = new MessageLog(appContext); roomChatlog = new MessageLog(appContext); + this.defaultScheme = defaultScheme; + this.defaultWeaponset = defaultWeaponset; } public RoomStateManager getRoomStateManager() { @@ -105,21 +104,7 @@ private void initRoomState(boolean chief) { roomChatlog.clear(); roomPlayerlist.clear(); - roomTeamlist.clear(); - roomRequestedTeams.clear(); - - try { - netRoomState.setChief(chief); - netRoomState.setGameStyle(GameConfig.DEFAULT_STYLE); - List schemes = Schemes.loadBuiltinSchemes(appContext); - netRoomState.setScheme(schemes.get(Schemes.toNameList(schemes).indexOf(GameConfig.DEFAULT_SCHEME))); - netRoomState.setMapRecipe(MapRecipe.makeRandomMap(0, MapRecipe.makeRandomSeed(), GameConfig.DEFAULT_THEME)); - List weaponsets = Weaponsets.loadBuiltinWeaponsets(appContext); - netRoomState.setWeaponset(weaponsets.get(Weaponsets.toNameList(weaponsets).indexOf(GameConfig.DEFAULT_WEAPONSET))); - netRoomState.sendFullConfig(); - } catch(IOException e) { - throw new RuntimeException(e); - } + netRoomState.initRoomState(chief); } public void registerGameMessageListener(GameMessageListener listener) { @@ -176,30 +161,10 @@ public void sendCreateRoom(String name) { sendToNet(MSG_SEND_CREATE_ROOM, name); } public void sendLeaveRoom(String message) { sendToNet(MSG_SEND_LEAVE_ROOM, message); } public void sendKick(String player) { sendToNet(MSG_SEND_KICK, player); } - public void sendAddTeam(Team newTeam, int colorIndex) { - TeamIngameAttributes tia = new TeamIngameAttributes(playerName, colorIndex, TeamIngameAttributes.DEFAULT_HOG_COUNT, false); - TeamInGame newTeamInGame = new TeamInGame(newTeam, tia); - roomRequestedTeams.put(newTeam.name, newTeamInGame); - sendToNet(MSG_SEND_ADD_TEAM, newTeamInGame); - } - public void sendRemoveTeam(String teamName) { sendToNet(MSG_SEND_REMOVE_TEAM, teamName); } - public void changeTeamColorIndex(String teamName, int colorIndex) { - if(isChief()) { - sendToNet(MSG_SEND_TEAM_COLOR_INDEX, colorIndex, teamName); - TeamInGame team = roomTeamlist.get(teamName); - roomTeamlist.put(teamName, team.withAttribs(team.ingameAttribs.withColorIndex(colorIndex))); - } - } - public void changeTeamHogCount(String teamName, int hogCount) { - if(isChief()) { - sendToNet(MSG_SEND_TEAM_HOG_COUNT, hogCount, teamName); - TeamInGame team = roomTeamlist.get(teamName); - roomTeamlist.put(teamName, team.withAttribs(team.ingameAttribs.withHogCount(hogCount))); - } - } public void sendEngineMessage(byte[] engineMessage) { sendToNet(MSG_SEND_ENGINE_MESSAGE, engineMessage); } public void sendRoundFinished(boolean withoutError) { sendToNet(MSG_SEND_ROUND_FINISHED, Boolean.valueOf(withoutError)); } public void sendToggleReady() { sendToNet(MSG_SEND_TOGGLE_READY); } + public void sendStartGame() { sendToNet(MSG_SEND_START_GAME); } public void disconnect() { sendToNet(MSG_DISCONNECT, "User Quit"); } @@ -218,7 +183,32 @@ if(Flib.INSTANCE.flib_init() != 0) { throw new RuntimeException("Unable to start frontlib"); } - instance = new Netplay(applicationContext); + + // We will need some default values for rooms, best load them here + Scheme defaultScheme = null; + Weaponset defaultWeaponset = null; + try { + List schemes = Schemes.loadBuiltinSchemes(applicationContext); + for(Scheme scheme : schemes) { + if(scheme.name.equals(GameConfig.DEFAULT_SCHEME)) { + defaultScheme = scheme; + } + } + List weaponsets = Weaponsets.loadBuiltinWeaponsets(applicationContext); + for(Weaponset weaponset : weaponsets) { + if(weaponset.name.equals(GameConfig.DEFAULT_WEAPONSET)) { + defaultWeaponset = weaponset; + } + } + } catch(IOException e) { + throw new RuntimeException(e); + } + + if(defaultScheme==null || defaultWeaponset==null) { + throw new RuntimeException("Unable to load default scheme or weaponset"); + } + + instance = new Netplay(applicationContext, defaultScheme, defaultWeaponset); } return instance; } @@ -236,7 +226,7 @@ public boolean isChief() { if(netRoomState != null) { - return netRoomState.chief; + return netRoomState.getChiefStatus(); } else { return false; } @@ -264,7 +254,7 @@ } private MessageLog getCurrentLog() { - if(state == State.ROOM || state == State.INGAME) { + if(state == State.ROOM) { return roomChatlog; } else { return lobbyChatlog; @@ -435,22 +425,22 @@ case MSG_TEAM_ADDED: { TeamInGame newTeam = (TeamInGame)msg.obj; if(isChief()) { - int freeColor = TeamInGame.getUnusedOrRandomColorIndex(roomTeamlist.getMap().values()); + int freeColor = TeamInGame.getUnusedOrRandomColorIndex(netRoomState.getTeams().values()); sendToNet(MSG_SEND_TEAM_HOG_COUNT, newTeam.ingameAttribs.hogCount, newTeam.team.name); sendToNet(MSG_SEND_TEAM_COLOR_INDEX, freeColor, newTeam.team.name); newTeam = newTeam.withAttribs(newTeam.ingameAttribs.withColorIndex(freeColor)); } - roomTeamlist.put(newTeam.team.name, newTeam); + netRoomState.putTeam(newTeam); break; } case MSG_TEAM_DELETED: { - roomTeamlist.remove((String)msg.obj); + netRoomState.removeTeam((String)msg.obj); break; } case MSG_TEAM_ACCEPTED: { - TeamInGame requestedTeam = roomRequestedTeams.remove(msg.obj); + TeamInGame requestedTeam = netRoomState.requestedTeams.remove(msg.obj); if(requestedTeam!=null) { - roomTeamlist.put(requestedTeam.team.name, requestedTeam); + netRoomState.putTeam(requestedTeam); if(isChief()) { // Not strictly necessary, but QtFrontend does it... sendToNet(MSG_SEND_TEAM_HOG_COUNT, requestedTeam.ingameAttribs.hogCount, requestedTeam.team.name); @@ -461,7 +451,7 @@ break; } case MSG_TEAM_COLOR_CHANGED: { - TeamInGame oldEntry = roomTeamlist.get((String)msg.obj); + TeamInGame oldEntry = netRoomState.getTeams().get((String)msg.obj); if(oldEntry != null) { /* * If we are chief, we ignore colors from the outside. They only come from the server @@ -471,7 +461,7 @@ */ if(!isChief()) { TeamIngameAttributes newAttribs = oldEntry.ingameAttribs.withColorIndex(msg.arg1); - roomTeamlist.put(oldEntry.team.name, oldEntry.withAttribs(newAttribs)); + netRoomState.putTeam(oldEntry.withAttribs(newAttribs)); } } else { Log.e("Netplay", "Color update for unknown team "+msg.obj); @@ -479,10 +469,10 @@ break; } case MSG_HOG_COUNT_CHANGED: { - TeamInGame oldEntry = roomTeamlist.get((String)msg.obj); + TeamInGame oldEntry = netRoomState.getTeams().get((String)msg.obj); if(oldEntry != null) { TeamIngameAttributes newAttribs = oldEntry.ingameAttribs.withHogCount(msg.arg1); - roomTeamlist.put(oldEntry.team.name, oldEntry.withAttribs(newAttribs)); + netRoomState.putTeam(oldEntry.withAttribs(newAttribs)); } else { Log.e("Netplay", "Hog count update for unknown team "+msg.obj); }