home *** CD-ROM | disk | FTP | other *** search
Wrap
package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.MovieClip; import flash.events.*; import flash.geom.*; import flash.text.TextField; import flash.text.TextFormat; import flash.utils.Timer; import flash.utils.getTimer; public dynamic class Main extends MovieClip { public static const FRAME_RATE:int = 20; internal var lev:int = 1; internal var aMarkerImage:Array; internal var animationTimer:Timer; internal var goRight:* = false; internal var startH:int = 2; internal var failures:int; internal var ctr:int; internal var backgroundRect:Rectangle; internal var startW:int = 3; internal var pauseFrames:int = 0; internal var spacing:int = 2; internal var h:int; internal var gameTimer:Timer; internal var w:int; internal var gameCompleted:Boolean = false; internal var pixH:int = 560; internal var goodMessage:Boolean; internal var pixW:int = 700; internal var score:int; private var _beforeTime:int = 0; private var _excess:int = 0; internal var canvasBitmap:Bitmap; internal var xPos:int; private var _sleepTime:int = 0; internal var offX:int; internal var offY:int; internal var aTravel:Array; private var _period:Number = 50; internal var fps:String = "n/a"; internal var backgroundSource:*; internal var backgroundPoint:Point; internal var aDigitImageCurrent:Array; internal var yPos:int; internal var goLeft:* = false; internal var total:int; internal var startMessage:String; private var _afterTime:int = 0; internal var onlyWidthNumber:int = 4; internal var endLevel:int = 16; internal var aDigitImage:Array; internal var targetScore:int; internal var level:int; internal var randInt:int; internal var pauseFramesMax:int = 200; internal var canvasBD:BitmapData; internal var firstTime:Boolean = true; internal var goDown:* = false; internal var goUp:* = false; internal var aDecimal:Array; internal var aDigitImageTraveled:Array; internal var tileSize:int = 32; private var _timeDiff:int = 0; internal var animationCounter:int; internal var targetTile:int; internal var randInt2:int; private var _overSleepTime:int = 0; internal var aDigitImageTarget:Array; internal var backgroundBD:BitmapData; internal var frameTimer:FrameTimer; public function Main() { tileSize = 32; spacing = 2; goLeft = false; goRight = false; goUp = false; goDown = false; fps = "n/a"; pixW = 700; pixH = 560; onlyWidthNumber = 4; lev = 1; startW = 3; startH = 2; endLevel = 16; pauseFramesMax = 200; pauseFrames = 0; gameCompleted = false; firstTime = true; _period = 1000 / FRAME_RATE; _beforeTime = 0; _afterTime = 0; _timeDiff = 0; _sleepTime = 0; _overSleepTime = 0; _excess = 0; super(); trace("main"); createObjects(); createDecimals(); resetGame(); startGame(); } private function createDecimals() : void { aDecimal = new Array(1,4,1,5,9,2,6,5,3,5,8,9,7,9,3,2,3,8,4,6,2,6,4,3,3,8,3,2,7,9,5,0,2,8,8,4,1,9,7,1,6,9,3,9,9,3,7,5,1,0,5,8,2,0,9,7,4,9,4,4,5,9,2,3,0,7,8,1,6,4,0,6,2,8,6,2,0,8,9,9,8,6,2,8,0,3,4,8,2,5,3,4,2,1,1,7,0,6,7,9,8,2,1,4,8,0,8,6,5,1,3,2,8,2,3,0,6,6,4,7,0,9,3,8,4,4,6,0,9,5,5,0,5,8,2,2,3,1,7,2,5,3,5,9,4,0,8,1,2,8,4,8,1,1,1,7,4,5,0,2,8,4,1,0,2,7,0,1,9,3,8,5,2,1,1,0,5,5,5,9,6,4,4,6,2,2,9,4,8,9,5,4,9,3,0,3,8,1,9,6,4,4,2,8,8,1,0,9,7,5,6,6,5,9,3,3,4,4,6,1,2,8,4,7,5,6,4,8,2,3,3,7,8,6,7,8,3,1,6,5,2,7,1,2,0,1,9,0,9,1,4,5,6,4,8,5,6,6,9,2,3,4,6,0,3,4,8,6,1,0,4,5,4,3,2,6,6,4,8,2,1,3,3,9,3,6,0,7,2,6,0,2,4,9,1,4,1,2,7,3,7,2,4,5,8,7,0,0,6,6,0,6,3,1,5,5,8,8,1,7,4,8,8,1,5,2,0,9,2,0,9,6,2,8,2,9,2,5,4,0,9,1,7,1,5,3,6,4,3,6,7,8,9,2,5,9,0,3,6,0,0,1,1,3,3,0,5,3,0,5,4,8,8,2,0,4,6,6,5,2,1,3,8,4,1,4,6,9,5,1,9,4,1,5,1,1,6,0,9,4,3,3,0,5,7,2,7,0,3,6,5,7,5,9,5,9,1,9,5,3,0,9,2,1,8,6,1,1,7,3,8,1,9,3,2,6,1,1,7,9,3,1,0,5,1,1,8,5,4,8,0,7,4,4,6,2,3,7,9,9,6,2,7,4,9,5,6,7,3,5,1,8,8,5,7,5,2,7,2,4,8,9,1,2,2,7,9,3,8,1,8,3,0,1,1,9,4,9,1,2,9,8,3,3,6,7,3,3,6,2,4,4,0,6,5,6,6,4,3,0,8,6,0,2,1,3,9,4,9,4,6,3,9,5,2,2,4,7,3,7,1,9,0,7,0,2,1,7,9,8,6,0,9,4,3,7,0,2,7,7,0,5,3,9,2,1,7,1,7,6,2,9,3,1,7,6,7,5,2,3,8,4,6,7,4,8,1,8,4,6,7,6,6,9,4,0,5,1,3,2,0,0,0,5,6,8,1,2,7,1,4,5,2,6,3,5,6,0,8,2,7,7,8,5,7,7); trace("Decimals: " + aDecimal.length); } private function checkScore() : * { newLevel(score != targetScore,false); } private function createObjects() : void { var _loc1_:BitmapData = null; var _loc2_:* = undefined; var _loc3_:* = undefined; var _loc4_:* = undefined; var _loc5_:* = undefined; var _loc6_:int = 0; var _loc7_:int = 0; var _loc8_:* = undefined; var _loc9_:int = 0; var _loc10_:int = 0; canvasBD = new BitmapData(pixW,pixH,false,0); canvasBitmap = new Bitmap(canvasBD); addChild(canvasBitmap); backgroundSource = new bg_original_blue(pixW,pixH); backgroundBD = new BitmapData(pixW,pixH,false,0); backgroundBD.draw(backgroundSource,new Matrix()); backgroundRect = new Rectangle(0,0,pixW,pixH); backgroundPoint = new Point(0,0); aDigitImage = []; aDigitImageTraveled = []; aDigitImageCurrent = []; aDigitImageTarget = []; _loc2_ = new digits_grad_blue(320,32); _loc3_ = new digits_grad_pink(320,32); _loc4_ = new digits_grad_blue(320,32); _loc5_ = new digits_grad_red(320,32); _loc6_ = 10; _loc7_ = 32; _loc8_ = 0; while(_loc8_ < 10) { _loc9_ = _loc8_ % _loc6_ * _loc7_; _loc10_ = int(_loc8_ / _loc6_) * _loc7_; _loc1_ = new BitmapData(_loc7_,_loc7_,true,0); _loc1_.copyPixels(_loc2_,new Rectangle(_loc9_,_loc10_,_loc7_,_loc7_),new Point(0,0)); aDigitImage.push(_loc1_); _loc1_ = new BitmapData(_loc7_,_loc7_,true,0); _loc1_.copyPixels(_loc3_,new Rectangle(_loc9_,_loc10_,_loc7_,_loc7_),new Point(0,0)); aDigitImageTraveled.push(_loc1_); _loc1_ = new BitmapData(_loc7_,_loc7_,true,0); _loc1_.copyPixels(_loc4_,new Rectangle(_loc9_,_loc10_,_loc7_,_loc7_),new Point(0,0)); aDigitImageCurrent.push(_loc1_); _loc1_ = new BitmapData(_loc7_,_loc7_,true,0); _loc1_.copyPixels(_loc5_,new Rectangle(_loc9_,_loc10_,_loc7_,_loc7_),new Point(0,0)); aDigitImageTarget.push(_loc1_); _loc8_++; } aMarkerImage = []; _loc1_ = new BitmapData(32,32,true,0); _loc1_.copyPixels(new m_frame_red(32,32),new Rectangle(0,0,32,32),new Point(0,0)); aMarkerImage.push(_loc1_); frameTimer = new FrameTimer(this,300,5,canvasBD); } private function CalculateLeastPoint() : int { var _loc1_:* = undefined; var _loc2_:int = 0; var _loc3_:* = undefined; var _loc4_:* = undefined; var _loc5_:* = undefined; var _loc6_:* = undefined; var _loc7_:Array = null; var _loc8_:* = undefined; var _loc9_:* = undefined; var _loc10_:* = undefined; var _loc11_:* = undefined; var _loc12_:* = undefined; _loc1_ = new Array(); _loc2_ = 16; _loc3_ = 0; while(_loc3_ < h) { _loc5_ = 0; while(_loc5_ < w) { _loc6_ = _loc5_ + _loc3_ * w; _loc7_ = new Array(total); _loc8_ = 0; while(_loc8_ < total) { _loc7_[_loc8_] = _loc2_; _loc8_++; } _loc7_[_loc6_] = 0; _loc9_ = _loc6_ - w; _loc10_ = _loc6_ + w; _loc11_ = _loc6_ - 1; _loc12_ = _loc6_ + 1; if(_loc3_ > 0) { _loc7_[_loc9_] = Math.abs(aDecimal[_loc6_] - aDecimal[_loc9_]); } if(_loc5_ > 0) { _loc7_[_loc11_] = Math.abs(aDecimal[_loc6_] - aDecimal[_loc11_]); } if(_loc3_ < h - 1) { _loc7_[_loc10_] = Math.abs(aDecimal[_loc6_] - aDecimal[_loc10_]); } if(_loc5_ < w - 1) { _loc7_[_loc12_] = Math.abs(aDecimal[_loc6_] - aDecimal[_loc12_]); } _loc1_.push(_loc7_); _loc5_++; } _loc3_++; } return (_loc4_ = new Dijkstra(aDecimal,w,h)).findShortestPath(); } private function endMessage() : * { var _loc1_:TextFormat = null; var _loc2_:String = null; var _loc3_:BitmapData = null; var _loc4_:TextField = null; var _loc5_:Point = null; var _loc6_:Rectangle = null; _loc1_ = new TextFormat(); _loc4_ = new TextField(); _loc1_.size = 32; _loc1_.font = "Arial"; _loc1_.color = "0xffffff"; _loc1_.bold = true; _loc4_.text = " Congratulations you completed all " + endLevel + " levels!"; _loc4_.setTextFormat(_loc1_); _loc4_.width = pixW; _loc4_.height = 50; _loc3_ = new BitmapData(_loc4_.width,_loc4_.height,true,4294901760); _loc5_ = new Point(0,pixH / 2 - 25); _loc6_ = new Rectangle(0,0,_loc4_.width,_loc4_.height); _loc3_.fillRect(_loc6_,4278229248); _loc3_.draw(_loc4_); canvasBD.copyPixels(_loc3_,_loc6_,_loc5_); } private function fullMessage() : * { var _loc1_:TextFormat = null; var _loc2_:String = null; var _loc3_:BitmapData = null; var _loc4_:TextField = null; var _loc5_:Point = null; var _loc6_:Rectangle = null; _loc1_ = new TextFormat(); _loc4_ = new TextField(); _loc1_.size = 24; _loc1_.font = "Hobo Std"; _loc1_.color = "0x000000"; _loc1_.bold = false; _loc1_.align = "center"; _loc4_.text = startMessage; _loc4_.setTextFormat(_loc1_); _loc4_.width = pixW; _loc4_.height = 50; _loc3_ = new BitmapData(_loc4_.width,_loc4_.height,true,4294901760); _loc5_ = new Point(0,0); _loc6_ = new Rectangle(0,0,_loc4_.width,_loc4_.height); if(goodMessage) { _loc3_.fillRect(_loc6_,4285125844); } else { _loc3_.fillRect(_loc6_,4293787648); } _loc3_.draw(_loc4_); canvasBD.copyPixels(_loc3_,_loc6_,_loc5_); } private function updateClimber() : void { var _loc1_:* = undefined; var _loc2_:* = undefined; var _loc3_:* = undefined; var _loc4_:int = 0; _loc1_ = xPos; _loc2_ = yPos; if(xPos == -1) { if(goRight) { ++xPos; yPos = 0; } } else if(goRight) { if(xPos < w - 1 && aTravel[xPos + 1 + yPos * w] == 0) { ++xPos; } } else if(goLeft) { if(xPos > 0 && aTravel[xPos - 1 + yPos * w] == 0) { --xPos; } } else if(goDown) { if(yPos < h - 1 && aTravel[xPos + (yPos + 1) * w] == 0) { ++yPos; } } else if(goUp) { if(yPos > 0 && aTravel[xPos + (yPos - 1) * w] == 0) { --yPos; } } if(xPos != -1) { aTravel[xPos + yPos * w] = 1; } if(_loc1_ != xPos || _loc2_ != yPos) { _loc3_ = aDecimal[xPos + yPos * w]; if(_loc1_ == -1) { _loc4_ = 3; } else { _loc4_ = int(aDecimal[_loc1_ + _loc2_ * w]); } score += Math.abs(_loc3_ - _loc4_); _loc4_ = _loc3_; } goLeft = goRight = goUp = goDown = false; } private function runGame(param1:TimerEvent) : * { var _loc2_:Boolean = false; _loc2_ = false; if(firstTime) { stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownListener); firstTime = false; } _beforeTime = getTimer(); _overSleepTime = _beforeTime - _afterTime - _sleepTime; if(gameCompleted) { canvasBD.lock(); endMessage(); canvasBD.unlock(); } else if(pauseFrames == 0) { updateClimber(); canvasBD.lock(); drawBackground(); drawDigits(); canvasBD.unlock(); } else { canvasBD.lock(); fullMessage(); canvasBD.unlock(); --pauseFrames; } _afterTime = getTimer(); _timeDiff = _afterTime - _beforeTime; _sleepTime = _period - _timeDiff - _overSleepTime; if(_sleepTime <= 0) { _excess -= _sleepTime; _sleepTime = 2; } gameTimer.reset(); gameTimer.delay = _sleepTime; gameTimer.start(); while(_excess > _period) { _excess -= _period; } fps = frameTimer.countFrames(); param1.updateAfterEvent(); if(!gameCompleted) { checkGameFinished(); } } private function keyDownListener(param1:KeyboardEvent) : * { switch(param1.keyCode) { case 38: goUp = true; goDown = goLeft = goRight = false; break; case 37: goLeft = true; goDown = goRight = goUp = false; break; case 39: goRight = true; goDown = goLeft = goUp = false; break; case 40: goDown = true; goLeft = goRight = goUp = false; break; default: trace(param1.keyCode); } } private function drawDigits() : void { var _loc1_:Rectangle = null; var _loc2_:Point = null; var _loc3_:int = 0; var _loc4_:TextFormat = null; var _loc5_:String = null; var _loc6_:BitmapData = null; var _loc7_:TextField = null; var _loc8_:Point = null; var _loc9_:Rectangle = null; _loc1_ = new Rectangle(0,0,32,32); _loc2_ = new Point(offX - (tileSize + spacing),offY); if(xPos == -1) { canvasBD.copyPixels(aDigitImageCurrent[3],_loc1_,_loc2_); canvasBD.copyPixels(aMarkerImage[0],_loc1_,_loc2_); } else { canvasBD.copyPixels(aDigitImageTraveled[3],_loc1_,_loc2_); } _loc3_ = 0; while(_loc3_ < total) { _loc2_ = new Point(offX + _loc3_ % w * (tileSize + spacing),offY + Math.floor(_loc3_ / w) * (tileSize + spacing)); canvasBD.copyPixels(aDigitImage[aDecimal[_loc3_]],_loc1_,_loc2_); if(aTravel[_loc3_] == 1) { if(xPos != -1 && xPos + yPos * w == _loc3_) { canvasBD.copyPixels(aDigitImageCurrent[aDecimal[_loc3_]],_loc1_,_loc2_); canvasBD.copyPixels(aMarkerImage[0],_loc1_,_loc2_); } else { canvasBD.copyPixels(aDigitImageTraveled[aDecimal[_loc3_]],_loc1_,_loc2_); } } else { canvasBD.copyPixels(aDigitImage[aDecimal[_loc3_]],_loc1_,_loc2_); } if(_loc3_ == targetTile) { if(xPos + yPos * w != targetTile) { canvasBD.copyPixels(aDigitImageTarget[aDecimal[targetTile]],_loc1_,_loc2_); } else { canvasBD.copyPixels(aDigitImageTraveled[aDecimal[targetTile]],_loc1_,_loc2_); } } _loc3_++; } _loc4_ = new TextFormat(); _loc7_ = new TextField(); _loc4_.size = 24; _loc4_.font = "Hobo Std"; _loc4_.color = "0x69d4d4"; _loc4_.bold = false; _loc7_.text = " Level: " + level + " of " + endLevel + " Score: " + score + " of " + targetScore + " Failures: " + failures; _loc7_.setTextFormat(_loc4_); _loc7_.width = pixW; _loc7_.height = 30; _loc6_ = new BitmapData(_loc7_.width,_loc7_.height,true,4278190080); _loc8_ = new Point(0,0); _loc9_ = new Rectangle(0,0,_loc7_.width,_loc7_.height); _loc6_.draw(_loc7_); canvasBD.copyPixels(_loc6_,_loc9_,_loc8_); } public function startGame() : void { var _loc1_:int = 0; gameTimer = new Timer(_period,1); gameTimer.addEventListener(TimerEvent.TIMER,runGame); gameTimer.start(); offX = (pixW - w * (tileSize + spacing)) / 2; offY = (pixH - (h + 1) * (tileSize + spacing)) / 2; _loc1_ = 1; while(_loc1_ < lev) { newLevel(false,false); _loc1_++; } } private function drawBackground() : void { canvasBD.copyPixels(backgroundBD,backgroundRect,backgroundPoint); } private function stuck() : * { newLevel(true,true); } private function checkGameFinished() : * { var _loc1_:int = 0; var _loc2_:int = 0; var _loc3_:int = 0; var _loc4_:int = 0; var _loc5_:int = 0; _loc1_ = 0; _loc2_ = -1; _loc3_ = 1; _loc4_ = -1; _loc5_ = 1; if(xPos == -1) { _loc1_ = 1; } else { _loc1_ = 0; if(xPos > 0 && aTravel[xPos - 1 + yPos * w] == 0) { _loc1_++; } if(xPos < w - 1 && aTravel[xPos + 1 + yPos * w] == 0) { _loc1_++; } if(yPos > 0 && aTravel[xPos + yPos * w - w] == 0) { _loc1_++; } if(yPos < h - 1 && aTravel[xPos + yPos * w + w] == 0) { _loc1_++; } } if(xPos + yPos * w == targetTile) { checkScore(); } else if(_loc1_ == 0) { stuck(); } } private function newLevel(param1:Boolean, param2:Boolean) : void { var _loc3_:* = undefined; if(!(param1 || param2) && level == endLevel) { gameCompleted = true; trace("GameEnded"); return; } if(!param1) { ++w; ++h; ++level; if(level % onlyWidthNumber == 0) { --h; } } else { ++failures; } total = w * h; targetTile = total - 1; aTravel = []; _loc3_ = 0; while(_loc3_ < total) { aTravel.push(0); _loc3_++; } xPos = yPos = -1; if(!param2) { offX = (pixW - w * (tileSize + spacing)) / 2; offY = (pixH - (h + 1) * (tileSize + spacing)) / 2; targetScore = 2 + CalculateLeastPoint(); trace("Target = " + targetScore); } goodMessage = !(param2 || param1); if(param2) { startMessage = "So you got stuck on level " + level + ", eh?"; } else if(level == 1) { if(param1) { startMessage = "Oh no! Failure on first level! :p"; } else { startMessage = "Welcome! You need to finish level 1 with " + targetScore + " points."; } } else if(param1) { startMessage = "Too bad. Your score was " + score + " but you need to hit " + targetScore + "."; } else { startMessage = "Well done! Next level is " + level + " and target is " + targetScore + " points."; } score = 0; pauseFrames = 4 * FRAME_RATE; } public function resetGame() : void { level = 1 - 1; w = startW - 1; h = startH - 1; failures = 0; newLevel(false,false); } } }