SmartfoxLobbies

From WikiFlashed

Jump to: navigation, search

Back to Checkers Game

Explained

Most of the code here is quite messy due to hacking the code to work on the older buggy version of Smart Fox Server. But look at the the parts where smartfox server casino events are handled. You can pretty much ignore the rest. If you did notice, I will be publishing a clean version of my Automatic Search Lobby soon that is compatible with the latest SFS version 1.66 or something.

Anyways, hopefully this can give some people some idea how it works.

Code

package sample {
	import de.polygonal.ds.SLinkedList;
	import de.polygonal.ds.SListNode;
	import de.polygonal.ds.SListIterator;	
	import it.gotoandplay.smartfoxserver.data.Room;
	import it.gotoandplay.smartfoxserver.data.User;
	import it.gotoandplay.smartfoxserver.SFSEvent;
	/**
	 * @author fdi
	 * You can extend this class to however required.
	 * NPC is really a VIEW like class.
	 * 
	 * Multiplayer Game Spec
	 * onUserLeaveTriggered
	 * 
	 * 
	 */
	public class MultiGamePanel extends Sprite {
 
		protected var gamePlaying:Boolean = false;
 
		protected var gameId:int = 0;
 
		protected var avatarID:*;
		protected var username:String;
		public var maxUsersPerGame:int = 2;
		protected var amIHost:Boolean = false;
 
		protected var views:Array;
		protected var currentPlayers:Array;
		protected var playerIds:Array;
		public var current:String;
		protected var currentRoom:Room;
		protected var currentGameRoom:Room;
		protected var view:*;
		protected var imReady:int = 0;
 
		protected var gf:GlowFilter;
 
		protected var gamePanelList:Array = ["topLeftPanel","topRightPanel","bottomLeftPanel","bottomRightPanel"];
 
		public function MultiGamePanel()
		{
			// idname is the multiplayer base game panel that all multiplaying game starts,
			// lobby, room, etc are handled her
			// by default it should Games Arcade
			parentId = "Games Arcade";
			idname = "This Game";
			gameType = "multi";
		}
 
		override public function loadData(data:*):void
		{
			initData(data.style, data.username, data.room);
		}
 
		protected function initData(a:*, u:String, r:Room):void
		{
			avatarID = a;
			username = u;
			currentRoom = r;
		}		
		/*
		 * loads XML data from publish folder
		 */
		override protected function initConfig(c:XML = null):void		
		{
			super.initConfig(c);
 
			var mapDir:String = config.info[0].@name + "/";
 
			if(config.info[0].@dbid)
			{
				gameId = config.info[0].@dbid;
			}
 
			if(config.game[0].@id)
			{
				idname = config.game[0].@id;
			}
 
			maxUsersPerGame = config.game[0].@maxUsersPerGame
 
			// loads the game
 
			total = 3;
			parseLevelData();			
		}
 
		/*
		 * Starts the game
		 * This function should be overriden fro different games
		 */
		protected function startGame():void
		{
			if(loaded == total && !gamePlaying){
				trace("[GamePanel] startGame " + game + " myGameID: " + playerIds[username]);
				//game.cacheAsBitmap = true;				
 
				// Pass some information into the game, you can do it other ways obviously
				game.content['loadData'](username, avatarID, playerIds[username]);
 
				var playerData:Array = [];
				var vstring:String, l:int, body:String, idx:int = 0, playername:String;
				for (var i:int = 0; i < currentPlayers.length; i++ ) {
					if (currentPlayers[i].getName() != username) {
                                                // Some custom data for players to be taken inside the game
						vstring = currentPlayers[i].getVariable("name");				
						//body - as it appears in the shared library
						l = vstring.indexOf("body=", 0);
						body = vstring.substring(l + 5, vstring.indexOf(";", l));
						playername = currentPlayers[i].getName();
						playerData.push({name:playername, avatar:body, id:playerIds[playername]});
						idx++;
					}
				}
 
				game.content['loadPlayerData'](playerData);
				game.content['startGame']();
				gamePlaying = true;
				//gamePlayBtn.alpha = 0.5;
				//gamePlayBtn.mouseEnabled = false;
			}
		}
 
		/*
		 * Resets the game
		 */
		protected function onClickQuit(evt:MouseEvent):void
		{
			game.unload();
			gamePlaying = false;
 
			goBack(evt);		
			Mouse.show();
		}
 
		override protected function setupEvents():void
		{
			super.setupEvents();
			//gamePlayBtn.addEventListener(MouseEvent.CLICK, onClickStart);
			gameQuitBtn.addEventListener(MouseEvent.CLICK, onClickQuit);
 
			views["createButton"].addEventListener(MouseEvent.CLICK, onCreateGame);
			views["lobbyButton"].addEventListener(MouseEvent.CLICK, onLobbyClick);
			views["lobby"].addEventListener(HM3Event.ACTION_GAME_ROOM, actionGameRoom);
			views["readyButton"].addEventListener(MouseEvent.CLICK, onReadyClick);
 
			// Internal Smartfox Server
			server = CommandServer.getInstance();
			server.addEventListener(SFSEvent.onUserEnterRoom, onUserEnterRoomHandler );
			server.addEventListener(SFSEvent.onUserLeaveRoom, onUserLeaveRoomHandler );
			server.addEventListener(SFSEvent.onRoomLeft, onRoomLeftHandler );
			server.addEventListener(SFSEvent.onRoomAdded, onRoomAddedHandler );
			server.addEventListener(SFSEvent.onRoomDeleted, onRoomDeletedHandler );			
			server.addEventListener(SFSEvent.onRoomListUpdate, onRoomListUpdateHandler );
 
			addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
		}
 
		protected function onRemovedFromStage(evt:Event):void
		{
			server.removeEventListener(SFSEvent.onUserEnterRoom, onUserEnterRoomHandler );
			server.removeEventListener(SFSEvent.onUserLeaveRoom, onUserLeaveRoomHandler );
			server.removeEventListener(SFSEvent.onRoomLeft, onRoomLeftHandler );
			server.removeEventListener(SFSEvent.onRoomAdded, onRoomAddedHandler );
			server.removeEventListener(SFSEvent.onRoomDeleted, onRoomDeletedHandler );			
			server.removeEventListener(SFSEvent.onRoomListUpdate, onRoomListUpdateHandler );
		}
 
 
		/*
		 * Parses Level
		 */
		protected function parseLevelData():void
		{
			draw();
		}
 
		override protected function onLoaded(evt:Event):void
		{
			loaded++;
			if (loaded == total)
			{
 
				showLobby();
				setupEvents();
			}
		}
 
		/*
		 * Adds Children
		 */
		override protected function addChildren():void
		{			
			super.addChildren();
 
			playerIds = new Array();
 
			gameBG = new Sprite();
			gameBG.graphics.lineStyle(5, 0x0170B1, 1);
			gameBG.graphics.beginFill(0x0170B1,1);
			gameBG.graphics.drawRoundRect(0,0,480, 360, 10, 10);
			gameBG.graphics.endFill();
			addChild(gameBG);			
 
			gameMask = new Sprite();
			gameMask.graphics.beginFill(0x334f5d,1);
			gameMask.graphics.drawRoundRect(0,0,480, 360, 10, 10);
			gameMask.graphics.endFill();
			addChild(gameMask);
 
			game = new Loader();
			game.mask = gameMask;
			addChild(game);			
 
			createViews();
 
			views['gameBG'] = gameBG;
			// tempory should change according to design
			//gamePlayBtn = new GamesPlayButton();
			//addChild(gamePlayBtn);
			// tempory should change according to design
			gameQuitBtn = new GamesQuitButton();
			addChild(gameQuitBtn);
		}
 
		protected function createViews():void
		{
			// need to create multiplayer planels
			// in views? Lobby Room, Room, and Game Room
			current = "lobby";
 
			views = new Array();
			currentPlayers = new Array();
 
			var titleText:Text = new Text();
			titleText.textSize = 20;
			titleText.html = true;
			titleText.bg = false;
			//titleText.align = true;
			titleText.width = 350;
			titleText.color = 0xffffff;
			titleText.autoSize = TextFieldAutoSize.LEFT;
			titleText.text = "<font size=\"24\">" + 0 + " GAMES" + " AND " + 0 + " PLAYERS</font>";
			gf = new GlowFilter(0x000000,0.5,5,5,2,1);
			titleText.filters = [gf];
			addChild(titleText);
			views["title"] = titleText;			
 
			var howText:Text = new Text();
			howText.textSize = 20;
			howText.html = true;
			howText.bg = false;
			//howText.align = true;
			howText.width = 348;
			howText.color = 0xffffff;
			howText.autoSize = TextFieldAutoSize.LEFT;
			howText.text = "<font size=\"23\">HOW TO PLAY</font><br/><br/>" + config.content.description + "<br/><br/>" + config.content.how;
			//var gf:GlowFilter = new GlowFilter(0x000000,0.5,5,5,2,1);
			howText.filters = [gf];
			addChild(howText);
			views["how"] = howText;
 
			var roomsPanel:Panel = new Panel();
			roomsPanel.linecolor = 0x0170B1;
			roomsPanel.color = 0xffffff;
			roomsPanel.round = 20;
			roomsPanel.bg = 0.2;
			roomsPanel.setSize(458, 320);
			addChild(roomsPanel);
			views["leftPanel"] = roomsPanel;
 
			var roomsList:GameRoomsList = new GameRoomsList(null, this);
			roomsList.BUTTON_HEIGHT = 24;
			roomsList.shadow = false;
			addChild(roomsList);
			roomsList.setSize(405, 24);
			views["lobby"] = roomsList;
 
			var createGameBtn:MultiCreateGameButton = new MultiCreateGameButton();
			addChild(createGameBtn);
			views["createButton"] = createGameBtn;
 
			var playerPanel:Panel = new Panel();
			playerPanel.linecolor = 0x0170B1;
			playerPanel.color = 0xffffff;
			playerPanel.round = 20;
			playerPanel.bg = 0.3;
			playerPanel.setSize(224, 155);
			addChild(playerPanel);
			views["topLeftPanel"] = playerPanel;
 
			playerPanel = new Panel();
			playerPanel.linecolor = 0x0170B1;
			playerPanel.color = 0xffffff;
			playerPanel.round = 20;
			playerPanel.bg = 0.3;
			playerPanel.setSize(224, 155);
			addChild(playerPanel);
			views["topRightPanel"] = playerPanel;
 
			playerPanel = new Panel();
			playerPanel.linecolor = 0x0170B1;
			playerPanel.color = 0xffffff;
			playerPanel.round = 20;
			playerPanel.bg = 0.3;
			playerPanel.setSize(224, 155);
			addChild(playerPanel);
			views["bottomLeftPanel"] = playerPanel;
 
			playerPanel = new Panel();
			playerPanel.linecolor = 0x0170B1;
			playerPanel.color = 0xffffff;
			playerPanel.round = 20;
			playerPanel.bg = 0.3;
			playerPanel.setSize(224, 155);
			addChild(playerPanel);
			views["bottomRightPanel"] = playerPanel;		
 
			//var gamePanelList:Array = ["topLeftPanel","topRightPanel","bottomLeftPanel","bottomRightPanel"];
			for (var i:int = 0; i < 4; i++) 
			{
				howText = new Text();
				howText.textSize = 15;
				howText.html = true;
				howText.bg = false;
				//howText.align = true;
				howText.width = 204;
				howText.color = 0x019EFC;
				howText.autoSize = TextFieldAutoSize.LEFT;
				howText.align = true;
				howText.text = "<center><font size=\"35\">WAITING . . .</font></center>";
				howText.x = 10;
				howText.y = 100;
				var gf:GlowFilter = new GlowFilter(0x0170B1,1,10,10,2,1);
				howText.filters = [gf];
				views[gamePanelList[i]].content.addChild(howText);
				views[gamePanelList[i] + "Wait"] = howText;
 
				if (i == 0) {
					var readyBtn:MultiStartGameButton = new MultiStartGameButton();
					views[gamePanelList[i]].content.addChild(readyBtn);
					views["readyButton"] = readyBtn;
				}
			}						
 
			var lobbyBtn:MultiLobbyButton = new MultiLobbyButton();
			addChild(lobbyBtn);
			views["lobbyButton"] = lobbyBtn;			
 
			hideViews();
		}
 
		// Join Room
		protected function actionGameRoom(evt:SomeGameEvent):void
		{
			var data:* = evt.data;
			var action:Action = new Action(Action.JOIN_GAME_ROOM);
			action.init({roomname:data.roomname, userCount:data.userCount});
			dispatchEvent(new SomeGameEvent(SomeGameEvent.ACTION_NPCS, { action:action } ));
 
			// DISPATCH VARIABLE
			//var look:String = "status=" + 0 + ";body=" + avatarID.Body + ";" + "pant=" + avatarID.Bottoms + ";" + "hat=" + avatarID.Headwear +";" + "shoe=" + avatarID.Shoes +";" + "top=" + avatarID.Tops +";";
			//dispatchUserVariable(look);
		}
 
		protected function dispatchUserVariable(vstring:String):void
		{
			dispatchEvent(new SomeGameEvent(SomeGameEvent.UPDATE_MY_VARIABLE, {roomId:currentGameRoom.getId(), variable:vstring}));
		}
 
		public function removeUser(uid:int):void
		{
			//var userList:Array = currentRoom.getUserList();
			requestRoomListUpdate();
		}
 
		public function userVariableUpdated(user:User, gameVariable:String):void
		{
			var ready:int, l:Number, playerIndex:int = 0;
			var vstring:String = user.getVariable("name");
			trace("[MultiGamePanel] userVariableUpdated " + vstring);
			if(gameVariable == "profile") {		
				l = vstring.indexOf("status=", 0);
				ready = Number(vstring.substring(l + 7, vstring.indexOf(";", l)));
			} else {
				return;
			}
			trace("[MultiGamePanel] updateUserProfile ready? " + ready);			
			var userList:Array = currentPlayers;
			var bodyparts:Object = new Object();
			trace("[MultiGamePanel] updateUserProfile userList? " + userList.length);
			for (var i:int = 1; i < gamePanelList.length; i++) 
			{
				if (userList[i] && user.getName() == userList[i].getName()) {
					trace("[MultiGamePanel] updateUserProfile from " + user.getId() + "|" + userList[i].getName());
					l = vstring.indexOf("mId=", 0);
					playerIndex = int(vstring.substring(l+4, vstring.indexOf(";", l)));													
					//body - as it appears in the shared library
					l = vstring.indexOf("body=", 0);
					bodyparts.Body = vstring.substring(l+5, vstring.indexOf(";", l));		
					l = vstring.indexOf("pant=", 0);								
					bodyparts.Bottoms = vstring.substring(l+5, vstring.indexOf(";", l));	
 
					l = vstring.indexOf("top=", 0);
					bodyparts.Tops = vstring.substring(l+4, vstring.indexOf(";", l));	
 
					l = vstring.indexOf("hat=", 0);
					bodyparts.Headwear = vstring.substring(l+4, vstring.indexOf(";", l));
					l = vstring.indexOf("shoe=", 0);
					bodyparts.Shoes = vstring.substring(l + 5, vstring.indexOf(";", l));	
 
					playerIds[user.getName()] = playerIndex;
 
					views[gamePanelList[i] + "Wait"].visible = true;
					if (ready == 0)
					{
						views[gamePanelList[i] + "Wait"].text = "<center><font size=\"20\">"+user.getName()+"<br/>IS NOT READY!!</font></center>";
					} else {
						views[gamePanelList[i] + "Wait"].text = "<center><font size=\"20\">"+user.getName()+"<br/>IS READY!!</font></center>";
					}
 
					if (views[gamePanelList[i] + "Avatar"]) {
						views[gamePanelList[i]].content.removeChild(views[gamePanelList[i] + "Avatar"]);
						views[gamePanelList[i] + "Avatar"] = null;
					}
 
					var avatar:Avatar = AvatarManager.getInstance().createAvatar(bodyparts.Body);
					avatar.init(bodyparts.Body);
					avatar.gotoAndStopOnPhase("setup");
					avatar.scaleX = avatar.scaleY = 0.5;						
					avatar.x = 224/2 - avatar.width/2;
					avatar.y = -5;
 
					gf = new GlowFilter(0x0170B1, 1, 10, 10, 2, 1);
					if (ready == 1) {
						views[gamePanelList[i]].bg = 0.1;
						//views["topLeftPanel"].linecolor = 0x97D8FF;
						gf.blurX = 50;
						gf.blurY = 50;
						gf.strength = 3;
						//views[gamePanelList[i]+"Avatar"].filters = [gf];
						views[gamePanelList[i] + "Ready"] = 1;
					} else {
						views[gamePanelList[i] + "Ready"] = 0;
					}
					avatar.filters = [gf];
					views[gamePanelList[i]].content.addChild(avatar);
					views[gamePanelList[i] + "Avatar"] = avatar;
					views[gamePanelList[i]].content.setChildIndex(views[gamePanelList[i] + "Wait"], views[gamePanelList[i]].content.numChildren - 1);
					views[gamePanelList[i] + "Avatar"].visible = true;
 
					checkReady();
					break;					
				}
			}
		}		
 
 
		/*
		 *  dispatchEvent(new SomeGameEvent(SomeGameEvent.SEND_GAME_OBJECT, gameStateObject));
		 *  public function onGameObject(obj:Object):void {
		 *     //TODO update game state
		 *  }
		 * 
		 */
		public function onGameObject(obj:Object):void
		{
			// obj is the same obj u pass in below
			if (game.content['onGameObject'])
			{
				game.content['onGameObject'](obj);
				//trace("[MultiGamePanel] onGameObject x: value" + obj.x);
			}
		}
 
		public function onSendGameObject(evt:NPCEvent):void
		{
			var data:Object = evt.data;
			data.action = "updategame";
			data.type = "public";
			dispatchEvent(new SomeGameEvent(SomeGameEvent.SEND_MOVE, {receiver:"all", type:"game", game:data}));
		}		
 
		protected function onCreateGame(evt:MouseEvent):void
		{
			/*
			 * Its a Game
			 * It has a name
			 * It has a max user for this game
			 * It has a password?
			 */ 
 
			amIHost = true;
 
			trace("[MultiGamePanel] onCreateGame");
			var action:Action = new Action(Action.CREATE_GAME_ROOM);
			action.init({roomname:username+ " " + gameId});
			dispatchEvent(new SomeGameEvent(SomeGameEvent.ACTION_NPCS, { action:action } ));
		}
 
		override public function clear():void
		{
			super.clear();
			game.unload();
		}
 
		protected function hideViews():void
		{
			for (var k:String in views)
			{
				if(k != "how" && k != "titleText" && k.indexOf("Ready") == -1) {
					views[k].visible = false;
				}
			}
		}
 
		protected function onLobbyClick(evt:MouseEvent):void
		{
			imReady = 0;
			joinRoom();
			showLobby(true);
		}
 
		public function showGameRoom(r:Room):void
		{
			hideViews();
			current = "gameroom";
			views["topLeftPanel"].x = 80.2;
			views["topLeftPanel"].y = 156;
			views["topLeftPanel"].visible = true;
			views["topLeftPanel"].bg = 0.3;
			views["topRightPanel"].x = 314.2;
			views["topRightPanel"].y = 156;
			views["topRightPanel"].visible = true;
			views["topRightPanel"].bg = 0.3;
			views["bottomLeftPanel"].x = 80.2;
			views["bottomLeftPanel"].y = 321;
			views["bottomLeftPanel"].bg = 0.3;
			if (maxUsersPerGame < 3) {
				views["bottomLeftPanel"].visible = false;
			} else {
				views["bottomLeftPanel"].visible = true;
			}			
			views["bottomRightPanel"].x = 314.2;
			views["bottomRightPanel"].y = 321;
			views["bottomRightPanel"].visible = true;
			views["bottomRightPanel"].bg = 0.3;
			if (maxUsersPerGame < 4) {
				views["bottomRightPanel"].visible = false;
			} else {
				views["bottomRightPanel"].visible = true;
			}			
			views["lobbyButton"].visible = true;
			views["lobbyButton"].x = 129;
			views["lobbyButton"].y = 125;
			views["title"].x = 190;
			views["title"].y = 106;
			views["title"].visible = true;
 
			views["readyButton"].visible = true;
			views["readyButton"].x = 224 / 2;
			views["readyButton"].y = 130;
 
			//var gamePanelList:Array = ["topLeftPanel","topRightPanel","bottomLeftPanel","bottomRightPanel"];
			updateGameRoom(r);			
			//requestRoomListUpdate();;
		}
 
		protected function onReadyClick(evt:MouseEvent):void
		{
			//views["readyButton"].enabled = false;
			//views["readyButton"].gotoAndStop(2);
			views["readyButton"].visible = false;
			views["topLeftPanel" + "Wait"].text = "<center><font size=\"35\">I'M READY!!</font></center>";
			views["topLeftPanel" + "Wait"].visible = true;
			views["topLeftPanel"].bg = 0.1;
			//views["topLeftPanel"].linecolor = 0x97D8FF;
			gf.blurX = 50;
			gf.blurY = 50;
			gf.strength = 3;
			views["topLeftPanel"+"Avatar"].filters = [gf];
			// send ready to everyone, update variable i would say
			// do something to show i am ready
			imReady = 1;
			views["topLeftPanel" + "Ready"] = 1;
			var look:String = "mId=" + currentGameRoom.getMyPlayerIndex() + ";status=" + imReady + ";body=" + avatarID.Body + ";" + "pant=" + avatarID.Bottoms + ";" + "hat=" + avatarID.Headwear +";" + "shoe=" + avatarID.Shoes +";" + "top=" + avatarID.Tops +";";
			dispatchUserVariable(look);
 
			checkReady();
		}
 
		protected function onUserEnterRoomHandler(evt:SFSEvent):void
		{
			var roomId:int = evt.params.roomId as int;
			var user:User = evt.params.user as User;
			var room:Room = server.getRoomById(roomId);				
 
			trace("[PlayerClient] " + user.getName() +  " entered room " + roomId + " " + room );	
			if (current == "gameroom" && room.getName() == currentGameRoom.getName()) { // In a Game Lobby
				trace("[PlayerClient] onUserEnterRoomHandler updateGameRoom " + room + " (in game lobby)");
				//APPEND USER INTO GAME LOBBY SLOT
 
				updateGameRoom(room);
 
			} else if (current == "lobby" ) { // In a NPC Lobby
				trace("[PlayerClient] onUserEnterRoomHandler updateRoomList (in NPC lobby)");
				updateRoomList(server.getRoomList());
			}
		}
 
		protected function onRoomDeletedHandler(evt:SFSEvent):void
		{		
			//updateRoomList(server.getRoomList());
			updateRoomList(server.getRoomList());
				//server.updateRoomList();
		}		
 
		protected function onRoomAddedHandler(evt:SFSEvent):void
		{		
			//updateRoomList(server.getRoomList());
		}
 
		private function onRoomListUpdateHandler(evt:SFSEvent):void
		{		
			// Initial
			if (current == "lobby") {
				updateRoomList(evt.params.roomList);
			}
		}		
 
		protected function onRoomLeftHandler(evt:SFSEvent):void
		{
			var roomId:int = evt.params.roomId;
			trace("[MultiGamePAnel] getActiveRoom " + server.getActiveRoom());
			if (current == "lobby") { // In a NPC Lobby
				trace("[PlayerClient] onRoomLeftHandler updateRoomList (in NPC lobby)");
				updateRoomList(server.getRoomList());
			}
		}		
 
		protected function onUserLeaveRoomHandler(evt:SFSEvent):void
		{
			var userId:int = evt.params.userId as int;
			var roomId:int = evt.params.roomId as int;
			var room:Room = server.getRoomById(roomId);
			if (current == "gameroom" && currentGameRoom.getName() == room.getName()) { // In a Game Lobby
				trace("[PlayerClient] onUserLeaveRoomHandler updateGameRoom " + room + " | " + room.getName() + " (in game lobby)");
				// REMOVES USER FROM SLOT
				updateGameRoom(room);
			} else if (current == "lobby") { // In a NPC Lobby
				trace("[PlayerClient] onUserLeaveRoomHandler updateRoomList (in NPC lobby)");
				updateRoomList(server.getRoomList());
			}
		}		
 
		public function updateGameRoom(r:Room):void
		{			
			if (current == "lobby") {
				return;
			}
 
			if(r) {
				currentGameRoom = r;
			}			
 
			var userList:Array = currentGameRoom.getUserList();
 
			var user:User, gameVariable:String, vstring:String, ready:int = 0, l:Number, playerIndex:int = 0;
			var noneGf:GlowFilter = new GlowFilter(0x000000, 1, 10, 10, 2, 1, true, true);		
			var bodyparts:Object, avatar:Avatar;
			views["title"].text = "<font size=\"24\">WAITING FOR " + (currentGameRoom.getMaxUsers() - currentGameRoom.getUserCount()) + " PLAYERS!</font>";
			trace("[MultiGamePanel] updateGameRoom with " + userList.length + " user blocks");
			currentPlayers = [];
			var i:int = 1;
			for (var key:String in userList) 
			{
				user = userList[key];
				if (user) {
					bodyparts = new Object();
					bodyparts.Body = "Teddy";
					bodyparts.Tops = "Default";
					bodyparts.Bottoms = "Default";
					bodyparts.Headwear = "Default";
					bodyparts.Shoes = "Default";
 
					gameVariable = user.getVariable("lastActionTarget");
					vstring = user.getVariable("name");
					trace("[MultiGamePanel] updateGameRoom userId " + key + "|" + user.getName() + "|"+ vstring);
					switch (gameVariable) {
						case "profile": 
							l = vstring.indexOf("status=", 0);
							ready = Number(vstring.substring(l+7, vstring.indexOf(";", l)));
							l = vstring.indexOf("mId=", 0);
							playerIndex = int(vstring.substring(l+4, vstring.indexOf(";", l)));													
							//body - as it appears in the shared library
							l = vstring.indexOf("body=", 0);
							bodyparts.Body = vstring.substring(l+5, vstring.indexOf(";", l));		
							l = vstring.indexOf("pant=", 0);								
							bodyparts.Bottoms = vstring.substring(l+5, vstring.indexOf(";", l));	
							l = vstring.indexOf("top=", 0);
							bodyparts.Tops = vstring.substring(l + 4, vstring.indexOf(";", l));
							l = vstring.indexOf("hat=", 0);
							bodyparts.Headwear = vstring.substring(l+4, vstring.indexOf(";", l));	
							l = vstring.indexOf("shoe=", 0);
							bodyparts.Shoes = vstring.substring(l + 5, vstring.indexOf(";", l));
 
							break;
					}
					//trace("[MultiGamePanel] updateGameRoom 3");
					// my self
					if (user.getName() == username) {
						currentPlayers[0] = user;
						playerIds[username] = currentGameRoom.getMyPlayerIndex();
						trace("[MultiGamePanel] updateGameRoom 4");
						//views[gamePanelList[0] + "Wait"].text = "<center><font size=\"35\">NOT READY!!</font></center>";
						if(!views[gamePanelList[0] + "Avatar"]) {	
							avatar = AvatarManager.getInstance().createAvatar(avatarID.Body);
							avatar.init(avatarID);
							avatar.gotoAndStopOnPhase("setup");
							avatar.scaleX = avatar.scaleY = 0.5;						
							avatar.x = 224/2 - avatar.width/2;
							avatar.y = -5;
 
							gf = new GlowFilter(0x0170B1, 1, 10, 10, 2, 1);
							avatar.filters = [gf];
							views[gamePanelList[0]].content.addChild(avatar);
							views[gamePanelList[0] + "Avatar"] = avatar;
							views[gamePanelList[0]].content.setChildIndex(views["readyButton"], views[gamePanelList[0]].content.numChildren - 1);
							views[gamePanelList[0]].content.setChildIndex(views[gamePanelList[0] + "Wait"], views[gamePanelList[0]].content.numChildren - 1);								
						}
						if (imReady == 1) { // since i am ready, then set myself to ready state
							onReadyClick(null);
							views[gamePanelList[0] + "Ready"] = 1;
						} else { // not ready then do the usual dispatch
							var look:String = "mId=" + currentGameRoom.getMyPlayerIndex() + ";status=" + 0 + ";body=" + avatarID.Body + ";" + "pant=" + avatarID.Bottoms + ";" + "hat=" + avatarID.Headwear +";" + "shoe=" + avatarID.Shoes +";" + "top=" + avatarID.Tops +";";
							dispatchUserVariable(look);
							views[gamePanelList[0] + "Ready"] = 0;
						}
 
						views[gamePanelList[0] + "Avatar"].visible = true;					
					} else {
						currentPlayers[i] = user;
						playerIds[user.getName()] = playerIndex;
						trace("[MultiGamePanel] updateGameRoom 5");
						views[gamePanelList[i] + "Wait"].visible = true;
						if (ready == 0)
						{
							views[gamePanelList[i] + "Wait"].text = "<center><font size=\"20\">"+user.getName()+"<br/>IS NOT READY!!</font></center>";
						} else {
							views[gamePanelList[i] + "Wait"].text = "<center><font size=\"20\">"+user.getName()+"<br/>IS READY!!</font></center>";
						}
 
						if (views[gamePanelList[i] + "Avatar"]) {
							views[gamePanelList[i]].content.removeChild(views[gamePanelList[i] + "Avatar"]);
							views[gamePanelList[i] + "Avatar"] = null;
						}					
						trace("[MultiGamePanel] updateGameRoom 55");
						if(vstring != null) {
							avatar = AvatarManager.getInstance().createAvatar(bodyparts.Body);
							avatar.init(bodyparts.Body);
							avatar.gotoAndStopOnPhase("setup");
							avatar.scaleX = avatar.scaleY = 0.5;						
							avatar.x = 224/2 - avatar.width/2;
							avatar.y = -5;
 
							gf = new GlowFilter(0x0170B1, 1, 10, 10, 2, 1);
							avatar.filters = [gf];
						} else {
							avatar = AvatarManager.getInstance().createAvatar(AvatarManager.getInstance().getType("random"));
							avatar.gotoAndStopOnPhase("setup");
							avatar.scaleX = avatar.scaleY = 0.5;
							avatar.alpha = 0.3;
							avatar.x = 224/2 - avatar.width/2;
							avatar.y = -5;
							avatar.filters = [noneGf];
						}
						trace("[MultiGamePanel] updateGameRoom 6 ready " + ready);
						if (ready == 1 && vstring != null) {
							views[gamePanelList[i]].bg = 0.1;
							//views["topLeftPanel"].linecolor = 0x97D8FF;
							gf.blurX = 50;
							gf.blurY = 50;
							gf.strength = 3;
							avatar.filters = [gf];
 
							views[gamePanelList[i] + "Ready"] = 1;
						} else {
							views[gamePanelList[i] + "Ready"] = 0;
						}
						trace("[MultiGamePanel] updateGameRoom 7");
						views[gamePanelList[i]].content.addChild(avatar);
						views[gamePanelList[i] + "Avatar"] = avatar;
						views[gamePanelList[i]].content.setChildIndex(views[gamePanelList[i] + "Wait"], views[gamePanelList[i]].content.numChildren - 1);
						views[gamePanelList[i] + "Avatar"].visible = true;	
						trace("[MultiGamePanel] updateGameRoom 8");
						i++;						
					}
				}
			}
 
			//Fill up the boxes with crap
			trace("[MultiGamePanel] updateGameRoom i: " + i);
 
			for (var start:int = i; start < maxUsersPerGame; start++ ) {
				//trace("                 "+gamePanelList[start])
				views[gamePanelList[start] + "Wait"].visible = true;
				views[gamePanelList[start] + "Wait"].text = "<center><font size=\"35\">WAITING ...</font></center>";
 
				if (views[gamePanelList[start] + "Avatar"]) {
					views[gamePanelList[start]].content.removeChild(views[gamePanelList[start] + "Avatar"]);
					views[gamePanelList[start] + "Avatar"] = null;
				}					
 
				avatar = AvatarManager.getInstance().createAvatar(AvatarManager.getInstance().getType("random"));
				avatar.gotoAndStopOnPhase("setup");
				avatar.scaleX = avatar.scaleY = 0.5;
				avatar.alpha = 0.3;
				avatar.x = 224/2 - avatar.width/2;
				avatar.y = -5;
 
				avatar.filters = [noneGf];
				views[gamePanelList[start]].content.addChild(avatar);
				views[gamePanelList[start] + "Avatar"] = avatar;
				views[gamePanelList[start]].content.setChildIndex(views[gamePanelList[start] + "Wait"], views[gamePanelList[start]].content.numChildren - 1);
				views[gamePanelList[start] + "Avatar"].visible = true;	
			}
		}
 
		protected function checkReady():void {
			for (var i:int = 0; i < maxUsersPerGame;i++ ) {
				if (views[gamePanelList[i] + "Ready"] == null || views[gamePanelList[i] + "Ready"] == 0) {
					trace("[MultiGamePanel] checkReady false - ready to play " + gamePanelList[i]);
					return;
				}
			}
 
			trace("[MultiGamePanel] checkReady true - ready to play ");
			//TODO START THE GAME NOW
			showGame();			
		}
 
		protected function showGame():void
		{
			hideViews();
			current = "game";
			views['gameBG'].visible = true;
			startGame();
		}
 
		protected function showLobby(rejoin:Boolean = false):void
		{
			hideViews();
			current = "lobby";
			views["lobby"].visible = true;
			views["lobby"].x = 82.2;
			views["lobby"].y = 158;			
 
			views["createButton"].visible = true;
			views["createButton"].x = 129;
			views["createButton"].y = 125;
 
			views["leftPanel"].x = 80.2;
			views["leftPanel"].y = 156;			
			views["leftPanel"].visible = true;
 
			views["title"].x = 190;
			views["title"].y = 106;
			views["title"].visible = true;
			if(views["titleText"]) {
				views["title"].text = views["titleText"];
			}
 
			if (rejoin)
			{
				//views["lobby"].items = new SLinkedList();
				requestRoomListUpdate();
			}
		}
 
		protected function requestRoomListUpdate():void
		{
			var action:Action = new Action(Action.UPDATE_GAME_ROOM_LIST);
			dispatchEvent(new SomeGameEvent(SomeGameEvent.ACTION_NPCS, {action:action}));
		}	
 
		protected function joinRoom():void
		{
			var action:Action = new Action(Action.JOIN_NPC_ROOM);
			action.init({roomname:currentRoom.getName(), gameroomname:currentGameRoom.getName()});
			dispatchEvent(new SomeGameEvent(SomeGameEvent.ACTION_NPCS, {action:action}));
		}		
 
		protected function leaveGameRoom():void
		{
			var action:Action = new Action(Action.LEAVE_GAME_ROOM);
			action.init({roomname:currentGameRoom.getName()});
			dispatchEvent(new SomeGameEvent(SomeGameEvent.ACTION_NPCS, {action:action}));
		}
 
		protected function leaveRoom():void
		{
			var action:Action = new Action(Action.LEAVE_GAME_ROOM);
			action.init({roomname:currentRoom.getName()});
			dispatchEvent(new SomeGameEvent(SomeGameEvent.ACTION_NPCS, {action:action}));
		}		
 
		/*
		 * Draws the npc
		 */
		override protected function draw():void
		{
			super.draw();
 
			views["how"].x = 554.3;
			views["how"].y = 106;			
 
			game.x = 70;
			game.y = 115;
 
			gameBG.x = 70;
			gameBG.y = 115;			
 
			gameMask.x = 70;
			gameMask.y = 115;
 
			//gamePlayBtn.x = 500;
			//gamePlayBtn.y = 50;
 
			gameQuitBtn.x = 554.3 + 348 - gameQuitBtn.width/2;
			gameQuitBtn.y = 460;
		}
 
		/*
		 * Update Rooms
		 */
		public function updateRoomList(result:Array):void
		{
			var provider:SLinkedList = new SLinkedList();
 
			// Populate the data provider with list of game rooms only
			var r:Room, gid:int, count:String = "No", roomName:String, info:Array, size:int = 0, userSize:int = 0;
			for each(r in result)
			{
				if (r.isGame())
				{
					//var cmdList:SLinkedList = new SLinkedList();
					//cmdList.append({type:"CMD", command:Action.JOIN_GAME_ROOM, name:r.getName(), id:getId()});
					if (r.getUserCount() >= r.getMaxUsers()) {
						count = "Yes";
					}
					info = r.getName().split(" ");
					roomName = info[0] + "'S GAME WITH (" + r.getUserCount() + "/" + r.getMaxUsers() + ") PLAYERS";
					gid = info[1];
					trace("[MultiGamePanel] updateRoomList room ownerId: " + gid +"|" + (gameId == gid) );
					if (gid == gameId) {
						if(current == "gameroom" && currentGameRoom.getName() == r.getName()) {
							currentGameRoom = r;
						}
						size ++;
						provider.append( { type:"CMD", full:count, userCount:r.getUserCount(), command:Action.JOIN_GAME_ROOM, name:roomName, roomname:r.getName(), id:r.getId() } );
					}
				}
 
				if (r.getName() == idname) {
					trace("[MultiGamePanel] updateRoomList room ownerId: " + r.getName() +"|" + (r.getName() == idname) );
					userSize = r.getUserCount();
				}
			}
 
			// Sort provider
			if (provider.sort == null)
			{	
				provider.sort();
			}
 
			var gameTag:String = " GAMES";
			if (size == 1)
			{
				gameTag = " GAME";
			}
 
			var playerTag:String = " PLAYERS";
			if (userSize == 1)
			{
				playerTag = " PLAYER";
			}
 
			views["titleText"] = "<font size=\"24\">TOTAL OF " + size + gameTag + " | " + userSize + playerTag + "</font>";
			if (current == "lobby") {
				views["title"].text = views["titleText"];
			} else if (current == "gameroom") {
				updateGameRoom(null);
			}
 
			views["lobby"].items = provider;
			//views["lobby"].invalidate();
		}
	}
}
google ads
Personal tools