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
ChatMC.as
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