project_files/Android-build/SDL-android-project/src/org/hedgewars/hedgeroid/netplay/NetRoomState.java
author Medo <smaxein@googlemail.com>
Sat, 18 Aug 2012 00:47:51 +0200
changeset 7508 763d3961400b
child 7582 714310efad8f
permissions -rw-r--r--
Hedgeroid: Frantic scrabbling toward the deadline - Added activities for weapon/scheme editors (unfinished) - Completed tablet version of netroom activity - Added map preview - Fixed default team files having the wrong names - Restructuring - Updated frontlib JNA bindings to respect the latest frontlib changes

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<RoomStateManager.Observer> observers = new LinkedList<RoomStateManager.Observer>();
	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);
	}
}