AFTERDEATH

Quick Jumps:

Custom Classes:

Game Code:

Map.as

class Map {
		private var mapType:String;
		private var mapColumns:Number;
		private var mapRows:Number;
		private var mapTiles:Array;
		private var mapHero:Hero;
		
		function Map(tmp_columns:Number, tmp_rows:Number, tmp_type:String) {
			//constructor
			mapColumns = tmp_columns;
			mapRows = tmp_rows;
			mapType = tmp_type;
			mapHero = new Hero();
			initialize();
		}
		function initialize() {
			mapTiles = new Array();
			for (var i = 0; i < this.columns; ++i) {
				for (var j = 0; j < this.rows; ++j) {
					if (j == 0) {
						mapTiles[i] = new Array();
					}
					var tmp_tile:Tile = new Tile(i, j, mapType);
					setTile(i, j, tmp_tile);
				}
			}
		}
		
		//Hero Functions
		function get hero():Hero {
			return mapHero;
		}
		function placeHero(tmp_column:Number, tmp_row:Number) {
			mapHero.column = tmp_column;
			mapHero.row = tmp_row;
		}
		
		//Tile Functions
		function getTile(tmp_column:Number, tmp_row:Number):Tile {
			return mapTiles[tmp_column][tmp_row];
		}
		function setTile(tmp_column:Number, tmp_row:Number, tmp_tile:Tile) {
			mapTiles[tmp_column][tmp_row] = tmp_tile;
		}
		
		//Get Functions
		function get columns():Number {
			return mapColumns;
		}
		function get rows():Number {
			return mapRows;
		}
		function get type():String {
			return mapType;
		}
		
		//Header XML Function
		function generateHeaderXML():String {
			var header:String = "< Header ";
			header += "columns=\""+this.columns+"\" ";
			header += "rows=\""+this.rows+"\" ";
			header += "type=\""+this.type+"\" ";
			header += "/>";
			return header;
		}
		function parseHeaderXML(tmp_xml:XMLNode) {
			var atts:Object = tmp_xml.attributes;
			mapColumns = Number(atts.columns);
			mapRows = Number(atts.rows);
			mapType = atts.type;
			initialize();
		}
		
		//Hero XML Functions
		function parseHeroXML(tmp_xml:XMLNode) {
			mapHero.fromXML(tmp_xml);
		}
		function generateHeroXML():String {
			return mapHero.toXML();
		}
		
		//Tile XML Function
		function generateTilesXML():String {
			var myXML = "< Tiles >";
			for (var i = 0; i < columns; ++i) {
				myXML += "< Column >";
				for (var j = 0; j < rows; ++j) {
					myXML += getTile(i, j).toXML();
				}
				myXML += "< /Column >";
			}
			myXML += "< /Tiles >"
			return myXML;
		}
		function parseTilesXML(tmp_xml:XMLNode) {
			var columns_arr:Array = tmp_xml.childNodes;
			mapTiles = new Array();
			for (var i = 0; i < columns_arr.length; ++i) {
				var rows_arr:Array = columns_arr[i].childNodes;
				for (var j = 0; j < rows_arr.length; ++j) {
					if (j == 0) {
						mapTiles[i] = new Array();
					}
					var tile_node:XMLNode = rows_arr[j];
					var tmp_tile:Tile = new Tile(i, j);
					tmp_tile.fromXML(tile_node, mapType);
					setTile(i, j, tmp_tile);
				}
			}
		}
		
		//Map XML Functions
		function toXML():XML {
			var myXML:String = "";
			myXML += "< Map >";
			myXML += generateHeaderXML();
			myXML += generateHeroXML();
			myXML += generateTilesXML();
			myXML += "< /Map >";
			return new XML(myXML);
		}
		function fromXML(tmp_xml) {
			if (typeof tmp_xml == "string") {
				var myXML:XML = new XML(tmp_xml);
			} else {
				var myXML:XML = tmp_xml;
			}
			var baseChildren:Array = myXML.firstChild.childNodes;
			for (var i = 0; i < baseChildren.length; ++i) {
				var child:XMLNode = baseChildren[i];
				var name:String = child.nodeName;
				if (name == "Header") {
					parseHeaderXML(child);
				} else if (name == "Hero") {
					parseHeroXML(child);
				} else if (name == "Tiles") {
					parseTilesXML(child);
				}
			}
		}
}
Top

Tile

Top
class Tile {
		// attributes
		private var tileCol:Number;
		private var tileRow:Number;
		private var tileFloorIndex:Number;
		private var tileObjIndex:Number;
		private var tileWalkable:Boolean;
		private var tileType:String;
		private var tileTrigger:String;
		private var tileTriggerType:Boolean;
		
		
		//FLOORS
		//outdoor
		public static var outdoor_f_array:Array = [ 	"concrete", "grass", "sand", "water",
														"road_2way01", "road_2way02", 
														"road_3way_ne", "road_3way_se", "road_3way_sw", "road_3way__nw",
														"road_4way", 
														"road_corner_n", "road_corner_e", "road_corner_s", "road_corner_w", 
														"road_end_ne", "road_end_se", "road_end_sw", "road_end_nw", 
														"shore_corner_n", "shore_corner_e", "shore_corner_s", "shore_corner_w", 
														"shore_angle_n", "shore_angle_e", "shore_angle_s", "shore_angle_w", 
														"shore_ne", "shore_se", "shore_sw", "shore_nw"];
		//house
		public static var house_f_array:Array = [		"none", "carpet_tan", "carpet_grey",  "carpet_blue", 
														"grass", "concrete"];
		//office
		public static var office_f_array:Array = [		"tile_grey", "concrete"];
		//OBJECTS
		//outdoor
		public static var outdoor_obj_array:Array = [	"none", 
														"house_se_blue", "house_sw_blue", "house_up_blue",  
														"house_se_green", "house_sw_green", "house_up_green",  
														"house_se_pink", "house_sw_pink", "house_up_pink",  
														"house_se_red", "house_sw_red", "house_up_red",  
														"house_se_red", "house_sw_red", "house_up_red",  
														"apartment_se_aqua", "apartment_sw_aqua", "apartment_up_aqua", 
														"apartment_se_blue", "apartment_sw_blue", "apartment_up_blue", 
														"apartment_se_green", "apartment_sw_green", "apartment_up_green", 
														"apartment_se_red", "apartment_sw_red", "apartment_up_red", 
														"apartment_se_yellow", "apartment_sw_yellow", "apartment_up_yellow", 
														"office_se_blue", "office_sw_blue", "office_up_blue", 
														"office_se_brown", "office_sw_brown", "office_up_brown", 
														"office_se_green", "office_sw_green", "office_up_green", 
														"office_se_grey", "office_sw_grey", "office_up_grey", 
														"office_se_red", "office_sw_red", "office_up_red", 
														"office_se_yellow", "office_sw_yellow", "office_up_yellow", 
														"unique02", "unique01",  
														"church", 
														"trees01", "trees02"];
		//house
		public static var house_obj_array:Array = [		"none", 
														"bed_nw", "bed_ne", "bed_se", "bed_sw",
														"desk_nw", "desk_ne", "desk_se", "desk_sw", 
														"table", 
														"tv_ne", "tv_nw", 
														"wall_ne", "wall_nw", "wall_sw", "wall_se", 
														"wall_door_nw", "wall_door_ne", "wall_door_se", "wall_door_sw", 
														"wall_window_nw", "wall_window_ne", "wall_window_se", "wall_window_sw", 
														"wall_picture_se", "wall_picture_sw",  
														"nightstand_nw", "nightstand_ne", "nightstand_se", "nightstand_sw", 
														"tree", "bush", 
														"man01", "man02", 
														"woman01", "woman02"]; 
	//office
		public static var office_obj_array:Array = [	"none", 
														"desk_type1_e", "desk_type1_e", "desk_type1_e", "desk_type1_e", 
														"person"];
		
		//PUBLIC STATIC FUNCTIONS
		public static function returnIndex(tmp_array:Array, tmp_str:String):Number {
			for (var i=0; i < tmp_array.length; i++) {
				if (tmp_array[i] == tmp_str) {
					return i;
				}
			}
			return 0;
		}
		public static function defaultFloor(tmp_type:String):String {
			var tmp_str:String = "";
			switch(tmp_type) {
				case "outdoor":
					tmp_str = "water";
					break;
				case "house":
					tmp_str = "grass";
					break;
				case "office":
					tmp_str = "concrete";
					break;
			}
			return tmp_str;
		}
		public static function defaultObj(tmp_type:String):String {
			var tmp_str:String = "";
			switch(tmp_type) {
				case "outdoor":
					tmp_str = "none";
					break;
				case "house":
					tmp_str = "none";
					break;
				case "office":
					tmp_str = "none";
					break;
			}
			return tmp_str;
		}
		
		//CONSTRUCTER	
		function Tile(tmp_column:Number, tmp_row:Number, tmp_type:String) {
			tileCol = tmp_column;
			tileRow = tmp_row;
			tileWalkable = false;
			tileType = tmp_type;
			tileFloorIndex = returnIndex(Tile[tmp_type+"_f_array"], Tile.defaultFloor(tmp_type));
			tileObjIndex = returnIndex(Tile[tmp_type+"_obj_array"], Tile.defaultObj(tmp_type));
			tileTrigger = "none";
			tileTriggerType = false;
		}
		
		// GETTERS
		function get column():Number {
			return tileCol;
		}
		function get row():Number {
			return tileRow;
		}
		function get name():String {
			return "tile"+this.column+"_"+this.row;
		}
		function get floorIndex():Number {
			return tileFloorIndex;
		}
		function get objIndex():Number {
			return tileObjIndex;
		}
		function get walkable():Boolean {
			return tileWalkable;
		}
		function get trigger():String {
			return tileTrigger;
		}
		function get isExit():Boolean {
			return tileTriggerType;
		}
		
		// SETTERS
		function set walkable(tmp_walkable:Boolean) {
			tileWalkable = tmp_walkable;
		}
		function set column(tmp_column:Number) {
			tileCol = tmp_column;
		}
		function set row(tmp_row:Number) {
			tileRow = tmp_row;
		}
		function set floorIndex(tmp_floor:String) {
			tileFloorIndex = returnIndex(Tile[tileType+"_f_array"], tmp_floor);
		}
		function set objIndex(tmp_obj:String) {
			tileObjIndex = returnIndex(Tile[tileType+"_obj_array"], tmp_obj);
		}
		function set trigger(tmp_str:String) {
			tileTrigger = tmp_str;
		}
		function set isExit(tmp_bool:Boolean) {
			tileTriggerType = tmp_bool;
		}
		
		
		//XML FUNCTIONS
		function fromXML(tmp_xml:XMLNode, type:String) {
			var atts:Object = tmp_xml.attributes;
			if (atts.walkable != undefined && atts.walkable.toLowerCase() == "false") {
				this.walkable = false;
			} else {
				this.walkable = true;
			}
			tileType = type.toLowerCase();
			this.floorIndex = atts.floor;
			this.objIndex = atts.obj;
			this.trigger = atts.trigger;
			if (atts.triggerType != undefined && atts.triggerType.toLowerCase() == "false") {
				this.isExit = false;
			} else {
				this.isExit = true;
			}
		}
		
		function toXML():String {
			var myXML:String = "";
			myXML += "< Tile"
			if (this.walkable) {
				myXML += " walkable=\"true\"";
			} else {
				myXML += " walkable=\"false\"";
			}
			switch (tileType) {
				case "outdoor":
					myXML += " floor=\""+outdoor_f_array[this.floorIndex]+"\"";
					myXML += " obj=\""+outdoor_obj_array[this.objIndex]+"\"";
					break;
				case "office":
					myXML += " floor=\""+office_f_array[this.floorIndex]+"\"";
					myXML += " obj=\""+office_obj_array[this.objIndex]+"\"";
					break;
				case "house":
					myXML += " floor=\""+house_f_array[this.floorIndex]+"\"";
					myXML += " obj=\""+house_obj_array[this.objIndex]+"\"";
					break;
			}
			myXML += " trigger=\""+this.trigger+"\"";
			if (this.isExit) {
				myXML += " triggerType=\"true\"";
			} else {
				myXML += " triggerType=\"false\"";
			}
			myXML += ">";
			return myXML;
		}
}
Top

Hero.as

Top
class Hero {
		private var heroColumn:Number;
		private var heroRow:Number;
		private var heroX:Number;
		private var heroY:Number;
		private var heroWidth:Number;
		private var heroSpeed:Number;
		
		function Hero() {
			//constructor
			heroColumn = 0;
			heroRow = 0;
			heroX = 0;
			heroY = 0;
			heroWidth = 0;
			heroSpeed = 0;
		}
		
		//Setters
		function set column(tmp_column:Number) {
			heroColumn = tmp_column;
		}
		function set row(tmp_row:Number) {
			heroRow = tmp_row;
		}
		function set x(tmp_val:Number) {
			heroX = tmp_val;
		}
		function set y(tmp_val:Number) {
			heroY = tmp_val;
		}
		function set width(tmp_width:Number) {
			heroWidth = tmp_width;
		}
		function set speed(tmp_val:Number) {
			heroSpeed = tmp_val;
		}
		
		//Getters
		function get column():Number {
			return heroColumn;
		}
		function get row():Number {
			return heroRow;
		}
		function get x():Number {
			return heroX;
		}
		function get y():Number {
			return heroY;
		}
		function get width():Number {
			return heroWidth;
		}
		function get speed():Number {
			return heroSpeed;
		}
		
		// return only functions
		function get isoX():Number {
			return heroX-heroY;
		}
		function get isoY():Number {
			return (heroX + heroY)/2;
		}
		
		function toXML():String {
			var myXML:String = "< Hero ";
			myXML += "column=\""+this.column+"\" ";
			myXML += "row=\""+this.row+"\" ";
			myXML += "speed=\""+this.speed+"\" ";
			myXML += "width=\""+this.width+"\" ";
			myXML += "x=\""+this.x+"\" ";
			myXML += "y=\""+this.y+"\" ";
			myXML += "/>";
			return myXML;
		}
		function fromXML(tmp_xml:XMLNode) {
			var atts:Object = tmp_xml.attributes;
			this.column = Number(atts.column);
			this.row = Number(atts.row);
			this.speed = Number(atts.speed);
			this.width = Number(atts.width);
			this.x = Number(atts.x);
			this.y = Number(atts.y);
		}
}
Top Top
class ChatMC extends MovieClip {
	private var myText:String;
	private var myFormat:TextFormat
	private var myCurve:Number;
	private var myWidth:Number;
	private var myHeight:Number;
	private var myCounter:Number;
	private var myCarrot:String;
	
	function ChatMC() {
		//constructor
		myText = "";
		initCounter();
		myFormat = new TextFormat();
		with (myFormat) {
			size = 16;
			bold = true;
			font = "Comic Sans MS";
		}
		myCurve = 20;
		myWidth = 350;
		initHeight();
		myCarrot = "none";
		drawMe();
	}
	
	//SET FUNCTIONS
	function setWidth(aNum:Number) {
		myWidth = aNum;
		initHeight();
		drawMe();
	}
	function setCurve(aNum:Number) {
		myCurve = aNum;
		drawMe();
	}
	function setText(aStr:String) {
		myText = aStr;
		initCounter();
		initHeight();
		drawMe();
	}
	function setCarrot(aStr:String) {
		myCarrot = aStr;
		drawMe();
	}
	function set counter(aNum:Number) {
		myCounter = aNum;
	}
	
	//PRIVATE FUNCTIONS
	private function initHeight() {
		var aNum:Number = 0;
		this.createTextField("trash_txt", 1, Math.floor(myCurve/2), Math.floor(myCurve/2), myWidth-myCurve, 100);
		this["trash_txt"].autoSize = true;
		this["trash_txt"].multiline = true;
		this["trash_txt"].wordWrap = true;
		this["trash_txt"]._width = myWidth;
		this["trash_txt"].text = myText;
		this["trash_txt"].setTextFormat(myFormat);
		aNum = this["trash_txt"]._height;
		this["trash_txt"].removeTextField();
		trace("Height Set: "+aNum);
		myHeight = aNum;
	}
	private function initCounter() {
		myCounter = myText.length;
	}
	private function drawMe() {
		if (this["background_mc"] != undefined) {
			this["background_mc"].removeMovieClip();
		}
		this.createEmptyMovieClip("background_mc", 2);
		this["background_mc"]._x = 0;
		this["background_mc"]._y = 0;
		this["background_mc"].lineStyle (5, 0x000000, 100);
		this["background_mc"].beginFill( 0xEDE020 );
		this["background_mc"].moveTo (myCurve/2, -myCurve/2);
		this["background_mc"].lineTo (myWidth-myCurve/2, -myCurve/2);
		this["background_mc"].curveTo (myWidth+myCurve/2, -myCurve/2, myWidth+myCurve/2, myCurve/2);
		switch (myCarrot) {
			case "topright":
				this["background_mc"].lineTo (myWidth+myCurve/2+Math.round(myWidth/5), Math.round(myHeight/16)+myCurve/2);
				this["background_mc"].lineTo (myWidth+myCurve/2, Math.round(myHeight/8)+myCurve/2);
				break;
			case "middleright":
				this["background_mc"].lineTo (myWidth+myCurve/2, myHeight/2-Math.round(myHeight/16));
				this["background_mc"].lineTo (myWidth+myCurve/2+Math.round(myWidth/5), myHeight/2);
				this["background_mc"].lineTo (myWidth+myCurve/2, myHeight/2+Math.round(myHeight/16));
				break;
			case "bottomright":
				this["background_mc"].lineTo (myWidth+myCurve/2, myHeight-Math.round(myHeight/8)-myCurve/2);
				this["background_mc"].lineTo (myWidth+myCurve/2+Math.round(myWidth/5), myHeight-Math.round(myHeight/16)-myCurve/2);
				break;
		}
		this["background_mc"].lineTo (myWidth+myCurve/2, myHeight-myCurve/2);
		this["background_mc"].curveTo (myWidth+myCurve/2, myHeight+myCurve/2, myWidth-myCurve/2, myHeight+myCurve/2);
		this["background_mc"].lineTo (myCurve/2, myHeight+myCurve/2);
		this["background_mc"].curveTo (-myCurve/2, myHeight+myCurve/2, -myCurve/2, myHeight-myCurve/2);
		switch (myCarrot) {
			case "topleft":
				this["background_mc"].lineTo (-myCurve/2, Math.round(myHeight/8)+myCurve/2);
				this["background_mc"].lineTo (-myCurve/2-Math.round(myWidth/5), Math.round(myHeight/16)+myCurve/2);
				break;
			case "middleleft":
				this["background_mc"].lineTo (-myCurve/2, myHeight/2+Math.round(myHeight/16));
				this["background_mc"].lineTo (-myCurve/2-Math.round(myWidth/5), myHeight/2);
				this["background_mc"].lineTo (-myCurve/2, myHeight/2-Math.round(myHeight/16));
				break;
			case "bottomleft":
				this["background_mc"].lineTo (-myCurve/2-Math.round(myWidth/5), myHeight-Math.round(myHeight/16)-myCurve/2);
				this["background_mc"].lineTo (-myCurve/2, myHeight-Math.round(myHeight/8)-myCurve/2);
				break;
		}
		this["background_mc"].lineTo (-myCurve/2, myCurve/2);
		this["background_mc"].curveTo (-myCurve/2, -myCurve/2, myCurve/2, -myCurve/2);
		this["background_mc"].endFill();
		if (this["text_txt"] == undefined) {
			this.createTextField("text_txt", 3, Math.floor(myCurve/2), Math.floor(myCurve/2), myWidth-myCurve, 1000);
			this["text_txt"]._width = myWidth;
			this["text_txt"]._x = 0;
			this["text_txt"]._y = 0;
			this["text_txt"].autoSize = true;
			this["text_txt"].multiline = true;
			this["text_txt"].wordWrap = true;
			this["text_txt"].selectable = false;
			this["text_txt"].text = "";
			this["text_txt"].setTextFormat(myFormat);
		} else {
			this["text_txt"]._width = myWidth;
			this["text_txt"].text = "";
		}
		this.onEnterFrame = function() {
			trace(myCounter);
			myCounter-=2;
			this["text_txt"].text = myText.substr(0, myText.length-myCounter);
			this["text_txt"].setTextFormat(myFormat);
			if (myCounter <= 1) {
				delete this.onEnterFrame;
			}
		}
	}
}
Top

Main Game Actionscript

Top
assets_mc._vible = false;
assets_mc.removeMovieClip();
//	init game
var gameInfo:Object = {
	tileW:72, 
	centerX:178, 
	centerY:145, 
	visible_columns:6, 
	visible_rows:8, 
	map:new Map(), 
	clip_mc:this
};
gameInfo.halfvis_col = int(gameInfo.visible_columns/2);
gameInfo.halfvis_row = gameInfo.visible_rows;

var mapXML:XML;
var convXML:XML;
var loadedMaps:Object = new Object();
var currentMap:String = "";
var loadedConvs:Object = new Object();
var currentConv:String = "";

loadMapXML("house");

/////////////////////////////////////////////////
///            MAP FUNCTIONS                  ///
/////////////////////////////////////////////////
function loadMapXML(tmp_name) {
	mapXML = new XML();
	mapXML.ignoreWhite = true;
	mapXML.onLoad = loadMap;
	var filepath:String = tmp_name+".xml";
	_root.attachMovie("loadbar", "loading_mc", 4);
	_root.loading_mc._x = 250;
	_root.loading_mc._y = 145;
	_root.loading_mc.onEnterFrame = function() {
		var loadedBytes:Number = _parent.game_mc.mapXML.getBytesLoaded();
		var totalBytes:Number = _parent.game_mc.mapXML.getBytesTotal();
		var frame:Number = Math.round(20*loadedBytes/totalBytes);
		if (frame >= 20) {
			this.removeMovieClip();
		} else {
			this.gotoAndStop(frame);
		}
	}
	currentMap = tmp_name;
	mapXML.load(filepath);
}
function loadMap() {
	var aMap:Map = new Map();
	aMap.fromXML(mapXML);
	loadedMaps[currentMap] = aMap;
	buildGrid(loadedMaps[currentMap]);
}
function changeMap(tmp_name:String) {
	var mapIsLoaded:Boolean = false;
	for (i in loadedMaps) {
		if (i == tmp_name) {
			mapIsLoaded = true;
		}
	}
	currentMap = tmp_name;
	if (mapIsLoaded) {
		buildGrid(loadedMaps[tmp_name]);
	} else {
		loadMapXML(tmp_name);
	}
}

function buildGrid() {
	loadedMaps[currentMap].hero.x = loadedMaps[currentMap].hero.column*gameInfo.tileW;
	loadedMaps[currentMap].hero.y = loadedMaps[currentMap].hero.row*gameInfo.tileW;
	if (loadedMaps[currentMap].type == "outdoor") {
		loadedMaps[currentMap].hero.width = 12;
		loadedMaps[currentMap].hero.speed = 5;
	} else {
		loadedMaps[currentMap].hero.width = 24;
		loadedMaps[currentMap].hero.speed = 10;
	}
	if (gameInfo.clip_mc.floor_mc != undefined) {
		gameInfo.clip_mc.floor_mc.removeMovieClip();
		gameInfo.clip_mc.objects_mc.removeMovieClip();
	}
	// Attach movie clip and postision
	gameInfo.clip_mc.attachMovie("empty", "floor_mc", 2);
	gameInfo.clip_mc.attachMovie("empty", "objects_mc", 3);
	gameInfo.clip_mc._x = gameInfo.centerX-loadedMaps[currentMap].hero.isoX;
	gameInfo.clip_mc._y = gameInfo.centerY-loadedMaps[currentMap].hero.isoY;
	
	// tile loop
	for (var vis_row = -gameInfo.halfvis_row+1; vis_row<=gameInfo.halfvis_row; vis_row++) {
		for (var vis_col = -gameInfo.halfvis_col+1; vis_col<=gameInfo.halfvis_col; vis_col++) {
			// find x-coord in isometric view
			if (vis_row%2 != 0) {
				var isoX:Number = vis_col*gameInfo.tileW*2+loadedMaps[currentMap].hero.isoX;
			} else {
				var isoX:Number = vis_col*gameInfo.tileW*2+loadedMaps[currentMap].hero.isoX-gameInfo.tileW;
			}
			// find y-coord in isometric view
			var isoY:Number = vis_row*gameInfo.tileW/2+loadedMaps[currentMap].hero.isoY;
			// find map tile column and row
			var world_row:Number = (2*isoY-isoX)/2;
			var world_col:Number = isoX+world_row;
			world_col = Math.round(world_col/gameInfo.tileW);
			world_row = Math.round(world_row/gameInfo.tileW);
			// tile name
			var vis_name:String = "t"+vis_col+"_"+vis_row;
			// tile name
			var world_name:String = "tile"+world_col+"_"+world_row;
			//depth
			var aDepth:Number = (world_col+world_row)*gameInfo.tileW/2*300+(world_col-world_row)*gameInfo.tileW+1+100000;
			//check to see if tile pieces are on the map ... if not make defaults
			if (gameInfo.clip_mc.floor_mc[world_name] == undefined) {
				gameInfo.clip_mc.floor_mc.attachMovie(loadedMaps[currentMap].type+"_floor", world_name, aDepth);
			}
			//check to see if tile pieces are on the map ... if not make defaults
			if (gameInfo.clip_mc.objects_mc[world_name] == undefined) {
				gameInfo.clip_mc.objects_mc.attachMovie(loadedMaps[currentMap].type+"_obj", world_name, aDepth);
			}
			// get tile frames
			var floor_frame:Number = 1;
			var obj_frame:Number = 1;
			if (world_col < 0 or world_col >= loadedMaps[currentMap].columns or world_row < 0 or world_row >= loadedMaps[currentMap].rows) {
				var tmp_tile:Tile = new Tile(0, 0, loadedMaps[currentMap].type);
				floor_frame = tmp_tile.floorIndex+1;
				obj_frame = tmp_tile.objIndex+1;
			} else {
				floor_frame = loadedMaps[currentMap].getTile(world_col, world_row).floorIndex+1;
				obj_frame = loadedMaps[currentMap].getTile(world_col, world_row).objIndex+1;
				if (loadedMaps[currentMap].getTile(world_col, world_row).trigger != "none") {
					gameInfo.clip_mc.objects_mc.attachMovie("trigger", world_name+"trig", aDepth+3);
					gameInfo.clip_mc.objects_mc[world_name+"trig"]._x = isoX;
					gameInfo.clip_mc.objects_mc[world_name+"trig"]._y = isoY;
					if (loadedMaps[currentMap].getTile(world_col, world_row).isExit) {
						gameInfo.clip_mc.objects_mc[world_name+"trig"].gotoAndStop(2);
					} else {
						gameInfo.clip_mc.objects_mc[world_name+"trig"].gotoAndStop(1);
					}
				}
			}
			gameInfo.clip_mc.floor_mc[world_name]._x = isoX;
			gameInfo.clip_mc.floor_mc[world_name]._y = isoY;
			gameInfo.clip_mc.floor_mc[world_name].gotoAndStop(floor_frame);
			gameInfo.clip_mc.objects_mc[world_name]._x = isoX;
			gameInfo.clip_mc.objects_mc[world_name]._y = isoY;
			gameInfo.clip_mc.objects_mc[world_name].gotoAndStop(obj_frame);
			gameInfo[vis_name] = {worldname:world_name, x:isoX, y:isoY};
		}
	}
	gameInfo.depthshift = (-loadedMaps[currentMap].hero.width)/2;
	var bDepth:Number = (loadedMaps[currentMap].hero.isoY-gameInfo.depthshift)*300+loadedMaps[currentMap].hero.isoX+1+100000;
	// add the character mc
	gameInfo.clip_mc.objects_mc.attachMovie("char_"+loadedMaps[currentMap].type, "hero_mc", bDepth);
	gameInfo.clip_mc.objects_mc.hero_mc._x = loadedMaps[currentMap].hero.isoX;
	gameInfo.clip_mc.objects_mc.hero_mc._y = loadedMaps[currentMap].hero.isoY;
	gameInfo.clip_mc.objects_mc.hero_mc.gotoAndStop(1);
	checkOverlap(loadedMaps[currentMap].hero);
	// add scrolling counters
	gameInfo.xstep = loadedMaps[currentMap].hero.isoX;
	gameInfo.ystep = loadedMaps[currentMap].hero.isoY;
	gameInfo.xtilecount = 0;
	gameInfo.ytilecount = 0;
	gameInfo.clip_mc.onEnterFrame = function() {
		movement();
	}
}
function changeTile(old_col:Number, old_row:Number, x:Number, y:Number) {
	// find x-coord in isometric view
	// tile name
	var new_name:String = "t"+(old_col+x)+"_"+(old_row+y);
	var old_name:String = "t"+old_col+"_"+old_row;
	if (gameInfo[old_name].x == undefined) {
		return false;
	}
	// find x coordinate in non-iso space
	var isoX = gameInfo[old_name].x+x*gameInfo.tileW*2;
	// find y coordinate in non-iso space
	var isoY = gameInfo[old_name].y+y*gameInfo.tileW/2;
	// convert coordinates from isometric to normal
	// find map tile column and row
	var world_row:Number = (2*isoY-isoX)/2;
	var world_col:Number = isoX+world_row;
	world_col = Math.round(world_col/gameInfo.tileW);
	world_row = Math.round(world_row/gameInfo.tileW);
	// tile name
	var world_name:String = "tile"+world_col+"_"+world_row;
	//depth
	var aDepth:Number = (world_col+world_row)*gameInfo.tileW/2*300+(world_col-world_row)*gameInfo.tileW+1+100000;
	//check to see if tile pieces are on the map ... if not make defaults
	if (gameInfo.clip_mc.floor_mc[world_name] == undefined) {
		gameInfo.clip_mc.floor_mc.attachMovie(loadedMaps[currentMap].type+"_floor", world_name, aDepth);
	}
	//check to see if tile pieces are on the map ... if not make defaults
	if (gameInfo.clip_mc.objects_mc[world_name] == undefined) {
		gameInfo.clip_mc.objects_mc.attachMovie(loadedMaps[currentMap].type+"_obj", world_name, aDepth);
	}
	// get tile frames
	var floor_frame:Number = 1;
	var obj_frame:Number = 1;
	if (world_col < 0 or world_col >= loadedMaps[currentMap].columns or world_row < 0 or world_row >= loadedMaps[currentMap].rows) {
		var tmp_tile:Tile = new Tile(0, 0, loadedMaps[currentMap].type);
		floor_frame = tmp_tile.floorIndex+1;
		obj_frame = tmp_tile.objIndex+1;
	} else {
		floor_frame = loadedMaps[currentMap].getTile(world_col, world_row).floorIndex+1;
		obj_frame = loadedMaps[currentMap].getTile(world_col, world_row).objIndex+1;
		if (loadedMaps[currentMap].getTile(world_col, world_row).trigger != "none") {
			gameInfo.clip_mc.objects_mc.attachMovie("trigger", world_name+"trig", aDepth+3);
			gameInfo.clip_mc.objects_mc[world_name+"trig"]._x = isoX;
			gameInfo.clip_mc.objects_mc[world_name+"trig"]._y = isoY;
			if (loadedMaps[currentMap].getTile(world_col, world_row).isExit) {
				gameInfo.clip_mc.objects_mc[world_name+"trig"].gotoAndStop(2);
			} else {
				gameInfo.clip_mc.objects_mc[world_name+"trig"].gotoAndStop(1);
			}
		}
	}
	gameInfo.clip_mc.floor_mc[world_name]._x = isoX;
	gameInfo.clip_mc.floor_mc[world_name]._y = isoY;
	gameInfo.clip_mc.floor_mc[world_name].gotoAndStop(floor_frame);
	gameInfo.clip_mc.objects_mc[world_name]._x = isoX;
	gameInfo.clip_mc.objects_mc[world_name]._y = isoY;
	gameInfo.clip_mc.objects_mc[world_name].gotoAndStop(obj_frame);
	gameInfo[new_name] = {worldname:world_name, x:isoX, y:isoY};
	//remove old stuff
	if (gameInfo.clip_mc.floor_mc[gameInfo[old_name].worldname] != undefined) {
		gameInfo.clip_mc.floor_mc[gameInfo[old_name].worldname].removeMovieClip();
		gameInfo.clip_mc.objects_mc[gameInfo[old_name].worldname].removeMovieClip();
		if (gameInfo.clip_mc.objects_mc[gameInfo[old_name].worldname+"trig"] != undefined) {
			gameInfo.clip_mc.objects_mc[gameInfo[old_name].worldname+"trig"].removeMovieClip();
		}
	}
	delete gameInfo[old_name];
}
function getMyCorners(x:Number, y:Number) {
	// find corner points
	var down_row:Number = Math.floor((y+gameInfo.tileW/2+loadedMaps[currentMap].hero.width-1)/gameInfo.tileW);
	var up_row:Number = Math.floor((y+gameInfo.tileW/2)/gameInfo.tileW);
	var left_col:Number = Math.floor((x+gameInfo.tileW/2)/gameInfo.tileW);
	var right_col:Number = Math.floor((x+gameInfo.tileW/2+loadedMaps[currentMap].hero.width-1)/gameInfo.tileW);
	// check if they are walls
	gameInfo.upleft = loadedMaps[currentMap].getTile(left_col, up_row).walkable;
	gameInfo.downleft = loadedMaps[currentMap].getTile(left_col, down_row).walkable;
	gameInfo.upright = loadedMaps[currentMap].getTile(right_col, up_row).walkable;
	gameInfo.downright = loadedMaps[currentMap].getTile(right_col, down_row).walkable;
}

function moveChar(dirx:Number, diry:Number):Boolean {
	// vertical movement
	getMyCorners(loadedMaps[currentMap].hero.x, loadedMaps[currentMap].hero.y+loadedMaps[currentMap].hero.speed*diry);
	// move got dammit... and check for collisions.
	// going up
	if (diry == -1) {
		if (gameInfo.upleft and gameInfo.upright) {
			// no wall in the way, move on
			gameInfo.clip_mc.objects_mc.hero_mc.run();
			loadedMaps[currentMap].hero.y += loadedMaps[currentMap].hero.speed*diry;
		} else {
			// hit the wall, place char near the wall
			gameInfo.clip_mc.objects_mc.hero_mc.stand();
			loadedMaps[currentMap].hero.y = loadedMaps[currentMap].hero.row*gameInfo.tileW-gameInfo.tileW/2;
		}
	}
	// if going down
	if (diry == 1) {
		if (gameInfo.downleft and gameInfo.downright) {
			gameInfo.clip_mc.objects_mc.hero_mc.run();
			loadedMaps[currentMap].hero.y += loadedMaps[currentMap].hero.speed*diry;
		} else {
			gameInfo.clip_mc.objects_mc.hero_mc.stand();
			loadedMaps[currentMap].hero.y = (loadedMaps[currentMap].hero.row)*gameInfo.tileW-loadedMaps[currentMap].hero.width+gameInfo.tileW/2;
		}
	}
	// horisontal movement
	// changing x with speed and taking old y
	getMyCorners(loadedMaps[currentMap].hero.x+loadedMaps[currentMap].hero.speed*dirx, loadedMaps[currentMap].hero.y);
	// if going left
	if (dirx == -1) {
		if (gameInfo.downleft and gameInfo.upleft) {
			gameInfo.clip_mc.objects_mc.hero_mc.run();
			loadedMaps[currentMap].hero.x += loadedMaps[currentMap].hero.speed*dirx;
		} else {
			gameInfo.clip_mc.objects_mc.hero_mc.stand();
			loadedMaps[currentMap].hero.x = loadedMaps[currentMap].hero.column*gameInfo.tileW-gameInfo.tileW/2;
		}
	}
	// if going right
	if (dirx == 1) {
		if (gameInfo.upright and gameInfo.downright) {
			gameInfo.clip_mc.objects_mc.hero_mc.run();
			loadedMaps[currentMap].hero.x += loadedMaps[currentMap].hero.speed*dirx;
		} else {
			gameInfo.clip_mc.objects_mc.hero_mc.stand();
			loadedMaps[currentMap].hero.x = (loadedMaps[currentMap].hero.column)*gameInfo.tileW-loadedMaps[currentMap].hero.width+gameInfo.tileW/2;
		}
	}
	// update char position
	gameInfo.clip_mc.objects_mc.hero_mc._x = loadedMaps[currentMap].hero.isoX;
	gameInfo.clip_mc.objects_mc.hero_mc._y = loadedMaps[currentMap].hero.isoY;
	// face the direction
	gameInfo.clip_mc.objects_mc.hero_mc.gotoAndStop(dirx+diry*2+3);
	// calculate the tile where chars center is
	loadedMaps[currentMap].hero.column = Math.round(loadedMaps[currentMap].hero.x/gameInfo.tileW);
	loadedMaps[currentMap].hero.row = Math.round(loadedMaps[currentMap].hero.y/gameInfo.tileW);
	// calculate depth
	var aDepth:Number = (loadedMaps[currentMap].hero.isoY-gameInfo.depthshift)*300+(loadedMaps[currentMap].hero.isoX)+1+100000;
	gameInfo.clip_mc.objects_mc.hero_mc.swapDepths(aDepth);
	checkOverlap(loadedMaps[currentMap].hero);
	// scroll the background
	gameInfo.clip_mc._x = gameInfo.centerX-loadedMaps[currentMap].hero.isoX;
	gameInfo.clip_mc._y = gameInfo.centerY-loadedMaps[currentMap].hero.isoY;
	var char:Hero = loadedMaps[currentMap].hero;
	var ob = gameInfo;
	if (ob.xstep>char.isoX) {
		// find column to move from right to left
		var xold = ob.halfvis_col+ob.xtilecount;
		var xmove = -(ob.halfvis_col*2);
		for (var y = -ob.halfvis_row+ob.ytilecount+1; y<=ob.halfvis_row+ob.ytilecount; y++) {
			changeTile(xold, y, xmove, 0, loadedMaps[currentMap]);
		}
		ob.xtilecount -= 1;
		ob.xstep = ob.xstep-ob.tileW*2;
		// hero is moving right
	} else if (ob.xstep+ob.tileW*2 < char.isoX) {
		// find column to move from left to right
		var xold = -ob.halfvis_col+ob.xtilecount+1;
		var xmove = ob.halfvis_col*2;
		for (var y = -ob.halfvis_row+ob.ytilecount+1; y <=ob.halfvis_row+ob.ytilecount; y++) {
			changeTile(xold, y, xmove, 0, loadedMaps[currentMap]);
		}
		ob.xtilecount += 1;
		ob.xstep += ob.tileW*2;
	} else if (ob.ystep>char.isoY) {
		// hero is moving up
		// find row to move from down to up
		var yold = ob.halfvis_row+ob.ytilecount;
		var ymove = -(ob.halfvis_row*2);
		for (var x = -ob.halfvis_col+ob.xtilecount+1; x<=ob.halfvis_col+ob.xtilecount; x++) {
			changeTile(x, yold, 0, ymove, loadedMaps[currentMap]);
		}
		ob.ytilecount -= 1;
		ob.ystep = ob.ystep-ob.tileW/2;
		// hero is moving down
	} else if (ob.ystep+ob.tileW < char.isoY) {
		// find row to move from up to down
		var yold = -ob.halfvis_row+ob.ytilecount+1;
		var ymove = ob.halfvis_row*2;
		for (var x = -ob.halfvis_col+ob.xtilecount+1; x<=ob.halfvis_col+ob.xtilecount; x++) {
			changeTile(x, yold, 0, ymove, loadedMaps[currentMap]);
		}
		ob.ytilecount += 1;
		ob.ystep = ob.ystep+ob.tileW/2;
	}
	return (true);
}
function checkOverlap(hero:Hero) {
	for (var col = hero.column; col<=hero.column+1; col++) {
		var dif_col:Number = hero.column-col;
		for (var row = hero.row-dif_col-1; row<=hero.row-dif_col+1; row++) {
			if (!(dif_col == 0 and row == hero.row-1)) {
				gameInfo.clip_mc.objects_mc["tile"+col+"_"+row].onEnterFrame = function() {
					if (this.hitTest(gameInfo.clip_mc.objects_mc.hero_mc)) {
						//this._visible = false;
						this._alpha = 20;
					} else {
						//this._visible = true;
						this._alpha = 100;
						delete this.onEnterFrame;
					}
				};
			}
		}
	}
}
function pausegame(tmp_bool:Boolean) {
	if (tmp_bool) {
		delete gameInfo.clip_mc.onEnterFrame;
	} else {
		gameInfo.clip_mc.onEnterFrame = function() {
			movement();
		}
	}
}
function checkAction() {
	var tmp_tile:Tile = loadedMaps[currentMap].getTile(loadedMaps[currentMap].hero.column, loadedMaps[currentMap].hero.row);
	if (tmp_tile.trigger != "none") {
		if (tmp_tile.isExit) {
			changeMap(tmp_tile.trigger);
		} else {
			//trace(tmp_tile.trigger);
		}
	}
}
function movement() {
	var keyPressed = false;
	if (Key.isDown(Key.RIGHT)) {
		keyPressed = moveChar(1, 0);
	} else if (Key.isDown(Key.LEFT)) {
		keyPressed = moveChar(-1, 0);
	} else if (Key.isDown(Key.UP)) {
		keyPressed = moveChar(0, -1);
	} else if (Key.isDown(Key.DOWN)) {
		keyPressed = moveChar(0, 1);
	} else if (Key.isDown(191)) {
		gameInfo.clip_mc.objects_mc.hero_mc.wave();
		checkAction();
	} else {
		gameInfo.clip_mc.objects_mc.hero_mc.stand();
	}
}
/////////////////////////////////////////////////
///            CONV FUNCTIONS                 ///
/////////////////////////////////////////////////
function drawConv() {
	pausegame(true);
	
}
// frame functions
stop();
Top