project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetRoomState.java
author Medo <smaxein@googlemail.com>
Mon, 20 Aug 2012 21:05:57 +0200
changeset 7584 7831c84cc644
parent 7582 714310efad8f
child 10017 de822cd3df3a
permissions -rw-r--r--
License change: With the agreement of Xeli, I changed the Hedgeroid license to GPLv2+ (from GPLv2).

/*
 * Hedgewars for Android. An Android port of Hedgewars, a free turn based strategy game
 * Copyright (C) 2012 Simeon Maxein <smaxein@googlemail.com>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

package org.hedgewars.hedgeroid.netplay;

import static org.hedgewars.hedgeroid.netplay.ThreadedNetConnection.ToNetMsgType.*;
import static org.hedgewars.hedgeroid.util.ObjectUtils.equal;

import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.TreeMap;

import org.hedgewars.hedgeroid.BasicRoomState;
import org.hedgewars.hedgeroid.Datastructures.GameConfig;
import org.hedgewars.hedgeroid.Datastructures.MapRecipe;
import org.hedgewars.hedgeroid.Datastructures.Scheme;
import org.hedgewars.hedgeroid.Datastructures.Team;
import org.hedgewars.hedgeroid.Datastructures.TeamInGame;
import org.hedgewars.hedgeroid.Datastructures.TeamIngameAttributes;
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 extends BasicRoomState {
	final Map<String, TeamInGame> requestedTeams = new TreeMap<String, TeamInGame>();
	private Netplay netplay;
	
	public NetRoomState(Netplay netplay) {
		this.netplay = netplay;
		initRoomState(false);
	}

	public void changeWeaponset(Weaponset weaponset) {
		if(getChiefStatus() && !equal(weaponset, getWeaponset())) {
			sendToNet(MSG_SEND_WEAPONSET, weaponset);
			setWeaponset(weaponset);
		}
	}
	
	public void changeMapRecipe(MapRecipe mapRecipe) {
		if(getChiefStatus() && !equal(mapRecipe, getMapRecipe())) {
			sendToNet(MSG_SEND_MAP, mapRecipe);
			setMapRecipe(mapRecipe);
		}
	}
	
	public void changeMapNameAndGenerator(String mapName) {
		if(getChiefStatus() && !equal(mapName, getMapRecipe().name)) {
			int newGenerator = MapRecipe.generatorForMapname(mapName);
			if(newGenerator != getMapRecipe().mapgen) {
				sendToNet(MSG_SEND_MAP_GENERATOR, newGenerator, null);
			}
			sendToNet(MSG_SEND_MAP_NAME, mapName);
			setMapRecipe(getMapRecipe().withName(mapName).withMapgen(newGenerator));
		}
	}
	
	public void changeMapTemplate(int template) {
		if(getChiefStatus() && template != getMapRecipe().templateFilter) {
			sendToNet(MSG_SEND_MAP_TEMPLATE, template, null);
			setMapRecipe(getMapRecipe().withTemplateFilter(template));
		}
	}
	
	public void changeMazeSize(int mazeSize) {
		if(getChiefStatus() && mazeSize != getMapRecipe().mazeSize) {
			sendToNet(MSG_SEND_MAZE_SIZE, mazeSize, 0);
			setMapRecipe(getMapRecipe().withMazeSize(mazeSize));
		}
	}
	
	public void changeMapSeed(String seed) {
		if(getChiefStatus() && !equal(seed, getMapRecipe().seed)) {
			sendToNet(MSG_SEND_MAP_SEED, seed);
			setMapRecipe(getMapRecipe().withSeed(seed));
		}
	}
	
	public void changeMapTheme(String theme) {
		if(getChiefStatus() && !equal(theme, getMapRecipe().theme)) {
			sendToNet(MSG_SEND_MAP_THEME, theme);
			setMapRecipe(getMapRecipe().withTheme(theme));
		}
	}
	
	public void changeMapDrawdata(byte[] drawdata) {
		if(getChiefStatus() && !Arrays.equals(drawdata, getMapRecipe().getDrawData())) {
			sendToNet(MSG_SEND_MAP_DRAWDATA, drawdata);
			setMapRecipe(getMapRecipe().withDrawData(drawdata));
		}
	}
	
	public void changeGameStyle(String gameStyle) {
		if(getChiefStatus() && !equal(gameStyle, getGameStyle())) {
			sendToNet(MSG_SEND_GAMESTYLE, gameStyle);
			setGameStyle(gameStyle);
		}
	}
	
	public void changeScheme(Scheme scheme) {
		if(getChiefStatus() && !equal(scheme, getScheme())) {
			sendToNet(MSG_SEND_SCHEME, scheme);
			setScheme(scheme);
		}
	}
	
	void initRoomState(boolean chief) {
		setTeams(Collections.<String, TeamInGame>emptyMap());
		requestedTeams.clear();
		
		setChief(chief);
		setGameStyle(GameConfig.DEFAULT_STYLE);
		setMapRecipe(MapRecipe.makeRandomMap(0, "seed", GameConfig.DEFAULT_THEME));
		setScheme(netplay.defaultScheme);
		setWeaponset(netplay.defaultWeaponset);
		sendFullConfig();
	}
	
	void sendFullConfig() {
		if(getChiefStatus()) {
			sendToNet(MSG_SEND_GAMESTYLE, getGameStyle());
			sendToNet(MSG_SEND_SCHEME, getScheme());
			sendToNet(MSG_SEND_WEAPONSET, getWeaponset());
			sendToNet(MSG_SEND_MAP, getMapRecipe());
		}
	}
	
	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);
	}

	public void requestAddTeam(Team team, int colorIndex) {
		TeamIngameAttributes tia = new TeamIngameAttributes(netplay.getPlayerName(), colorIndex, TeamIngameAttributes.DEFAULT_HOG_COUNT, false);
		TeamInGame newTeamInGame = new TeamInGame(team, tia);
		requestedTeams.put(team.name, newTeamInGame);
		sendToNet(MSG_SEND_ADD_TEAM, newTeamInGame);
	}

	public void requestRemoveTeam(String teamname) {
		sendToNet(MSG_SEND_REMOVE_TEAM, teamname);
	}

	public void changeTeamColorIndex(String teamname, int colorIndex) {
		if(getChiefStatus()) {
			TeamInGame team = getTeams().get(teamname);
			if(team.ingameAttribs.colorIndex != colorIndex) {
				sendToNet(MSG_SEND_TEAM_COLOR_INDEX, colorIndex, teamname);
				putTeam(team.withAttribs(team.ingameAttribs.withColorIndex(colorIndex)));
			}
		}
	}

	public void changeTeamHogCount(String teamname, int hogcount) {
		if(getChiefStatus()) {
			TeamInGame team = getTeams().get(teamname);
			if(team.ingameAttribs.hogCount != hogcount) {
				sendToNet(MSG_SEND_TEAM_HOG_COUNT, hogcount, teamname);
				putTeam(team.withAttribs(team.ingameAttribs.withHogCount(hogcount)));
			}
		}
	}
}