Repository: SimonHung/LodeRunner_TotalRecall Branch: master Commit: cceca5d5a15a Files: 87 Total size: 1.2 MB Directory structure: gitextract_wygbf6yf/ ├── README.md ├── cursor/ │ ├── closedhand.cur │ └── openhand.cur ├── flag32Id.js ├── lodeRunner.colorSelector.js ├── lodeRunner.colorTheme.js ├── lodeRunner.def.js ├── lodeRunner.demo.js ├── lodeRunner.demoData1.js ├── lodeRunner.demoData2.js ├── lodeRunner.edit.js ├── lodeRunner.gameVerName.js ├── lodeRunner.gamepad.js ├── lodeRunner.guard.js ├── lodeRunner.hiscore.js ├── lodeRunner.html ├── lodeRunner.iconClass.js ├── lodeRunner.info.js ├── lodeRunner.key.js ├── lodeRunner.main.js ├── lodeRunner.menu.js ├── lodeRunner.misc.js ├── lodeRunner.preload.js ├── lodeRunner.runner.js ├── lodeRunner.share.js ├── lodeRunner.storage.js ├── lodeRunner.v.championship.js ├── lodeRunner.v.classic.js ├── lodeRunner.v.fanBookMod.js ├── lodeRunner.v.professional.js ├── lodeRunner.v.revenge.js ├── lodeRunner.wData.js ├── lodeRunner.win.js ├── sound/ │ ├── Theme/ │ │ ├── APPLE2/ │ │ │ ├── born.ogg │ │ │ ├── dead.ogg │ │ │ ├── dig.ogg │ │ │ ├── down.ogg │ │ │ ├── fall.ogg │ │ │ ├── getGold.ogg │ │ │ ├── pass.ogg │ │ │ └── trap.ogg │ │ ├── C64/ │ │ │ ├── born.ogg │ │ │ ├── dead.ogg │ │ │ ├── dig.ogg │ │ │ ├── down.ogg │ │ │ ├── fall.ogg │ │ │ ├── fall.org.ogg │ │ │ ├── getGold.ogg │ │ │ ├── goldFinish1.ogg │ │ │ ├── goldFinish2.ogg │ │ │ ├── goldFinish3.ogg │ │ │ ├── goldFinish4.ogg │ │ │ ├── goldFinish5.ogg │ │ │ ├── goldFinish6.ogg │ │ │ ├── pass.ogg │ │ │ └── trap.ogg │ │ ├── fallSound-C64.js │ │ └── goldFinish-C64.sid │ ├── beep.ogg │ ├── ending/ │ │ └── win.ogg │ ├── ending.ogg │ ├── goldFinish.ogg │ ├── scoreBell.ogg │ ├── scoreCount.ogg │ └── scoreEnding.ogg └── tools/ ├── LodeRunnerDiskParser.cpp ├── apple2.dsk/ │ ├── Lode Runner Fan Book (4 Levels).do │ ├── Lode_Runner_Apple-II.dsk │ ├── Lode_Runner_Championship _Apple-II.dsk │ ├── MYLODE.DSK │ └── Revenge_of_Lode_Runner.dsk ├── c64.dsk/ │ ├── Atlantis Lode Runner (19xx)(-)[cr TBC].d64 │ ├── Extended Championship Lode Runner (1985)(Doug Smith & Dane Bigham)[cr The A-Team].d64 │ ├── LODERUN1.D64 │ ├── LODERUN2.D64 │ ├── LODERUN4.D64 │ ├── LODERUN5.D64 │ ├── LODERUN_CHAMP(FF).D64 │ ├── Lode Runner (1983)(Broderbund).d64 │ ├── LodeRunner[amg].fix.d64 │ ├── PROFLODE.D64 │ ├── PROLODER.D64 │ ├── Professional Lode Runner (1985)(Dodosoft).d64 │ ├── Professional Lode Runner (1985)(Dodosoft).fixed.d64 │ └── loderunner[amg].d64 ├── cmpDate.cpp └── pzlDiskParser.cpp ================================================ FILE CONTENTS ================================================ ================================================ FILE: README.md ================================================ Lode Runner - Total Recall ======================================= ## (超級運動員 - 全面回憶) This program build with Javascript + [CreateJS](http://www.createjs.com). ### * 3 GAME Mode & 1 DEMO Mode
1. Challenge Mode Compete with other players.
2. Training Mode Player can select any levels
3. Edit Mode Player can create custom levels
4. Demo Mode Demo passed levels
### * Include 5 Game Versions
1. Classic Lode Runner (150 Levels) Difficulty: 3
2. Professional Lode Runner (150 Levels) Difficulty: 4
3. Revenge of Lode Runner (17 Levels) Difficulty: 4
4. Lode Runner Fan Book (66 Levels) Difficulty: 5
5. Championship Lode Runner (51 Levels) Difficulty: 5
### * Provide 2 Themes
1. APPLE-II
2. Commodore 64
### * 2 Keyboard control mode
1. Repeat Actions On: Like APPLE-II keyboard behavior
2. Repeat Actions Off: Like NES keyboard behavior
### * Play on a Local Machine #### A simple web server is required to play LoderRunner on a local machine; follow these instructions for Windows: 1. Download and extract the source code into a directory. 2. If Python is installed, open a command prompt, navigate to the LodeRunner directory, and run "`python -m http.server 8080`" to start an HTTP server. 3. Alternatively, download `sswws.zip` from [here](https://github.com/faustinoaq/sswws/releases/tag/v0.1.0), extract it into the LodeRunner directory, and run "`sswws.exe -p 8080`" from the command prompt. 4. Open a web browser and go to "`http://127.0.0.1:8080/lodeRunner.html`". ##### Note: Changing the HTTP port will cause the browser to store "status" or "custom levels" data in a separate storage. ### * Play Online ------------------------------------ ================================================ FILE: flag32Id.js ================================================ var countryId = { unknown: 0 , _African_Union: 1, _Arab_League: 2, _ASEAN: 3, _CARICOM: 4, _CIS: 5 , _Commonwealth: 6, _England: 7, _European_Union: 8, eu: 8, _Islamic_Conference: 9 , _Kosovo: 10, _NATO: 11, _Northern_Cyprus: 12, _Northern_Ireland: 13, _Olimpic_Movement: 14 , _OPEC: 15, _Red_Cross: 16, _Scotland: 17, _Somaliland: 18, _Tibet: 19 , _United_Nations: 20, _Wales: 21, ad: 22, ae: 23, af: 24 , ag: 25, ai: 26, al: 27, am: 28, ao: 29 , aq: 30, ar: 31, as: 32, at: 33, au: 34 , aw: 35, ax: 36, az: 37, ba: 38, bb: 39 , bd: 40, be: 41, bf: 42, bg: 43, bh: 44 , bi: 45, bj: 46, bm: 47, bn: 48, bo: 49 , br: 50, bs: 51, bt: 52, bw: 53, by: 54 , bz: 55, ca: 56, cd: 57, cf: 58, cg: 59 , ch: 60, ci: 61, ck: 62, cl: 63, cm: 64 , cn: 65, co: 66, cr: 67, cu: 68, cv: 69 , cy: 70, cz: 71, de: 72, dj: 73, dk: 74 , dm: 75, do: 76, dz: 77, ec: 78, ee: 79 , eg: 80, eh: 81, er: 82, es: 83, et: 84 , fi: 85, fj: 86, fm: 87, fo: 88, fr: 89 , bl: 89, cp: 89, mf: 89, yt: 89, ga: 90 , gb: 91, sh: 91, gd: 92, ge: 93, gg: 94 , gh: 95, gi: 96, gl: 97, gm: 98, gn: 99 , gp: 100, gq: 101, gr: 102, gt: 103, gu: 104 , gw: 105, gy: 106, hk: 107, hn: 108, hr: 109 , ht: 110, hu: 111, id: 112, mc: 112, ie: 113 , il: 114, im: 115, in: 116, iq: 117, ir: 118 , is: 119, it: 120, je: 121, jm: 122, jo: 123 , jp: 124, ke: 125, kg: 126, kh: 127, ki: 128 , km: 129, kn: 130, kp: 131, kr: 132, kw: 133 , ky: 134, kz: 135, la: 136, lb: 137, lc: 138 , li: 139, lk: 140, lr: 141, ls: 142, lt: 143 , lu: 144, lv: 145, ly: 146, ma: 147, md: 148 , me: 149, mg: 150, mh: 151, mk: 152, ml: 153 , mm: 154, mn: 155, mo: 156, mq: 157, mr: 158 , ms: 159, mt: 160, mu: 161, mv: 162, mw: 163 , mx: 164, my: 165, mz: 166, na: 167, nc: 168 , ne: 169, ng: 170, ni: 171, nl: 172, bq: 172 , no: 173, bv: 173, nq: 173, sj: 173, np: 174 , nr: 175, nz: 176, om: 177, pa: 178, pe: 179 , pf: 180, pg: 181, ph: 182, pk: 183, pl: 184 , pr: 185, ps: 186, pt: 187, pw: 188, py: 189 , qa: 190, re: 191, ro: 192, rs: 193, ru: 194 , rw: 195, sa: 196, sb: 197, sc: 198, sd: 199 , se: 200, sg: 201, si: 202, sk: 203, sl: 204 , sm: 205, sn: 206, so: 207, sr: 208, st: 209 , sv: 210, sy: 211, sz: 212, tc: 213, td: 214 , tg: 215, th: 216, tj: 217, tl: 218, tm: 219 , tn: 220, to: 221, tr: 222, tt: 223, tv: 224 , tw: 225, tz: 226, ua: 227, ug: 228, us: 229 , uy: 230, uz: 231, va: 232, vc: 233, ve: 234 , vg: 235, vi: 236, vn: 237, vu: 238, ws: 239 , ye: 240, za: 241, zm: 242, zw: 243, sx: 244 , cw: 245, ss: 246 }; ================================================ FILE: lodeRunner.colorSelector.js ================================================ function colorSelectorClass(_screenX1, _screenY1, baseX) { var radius = baseX*3/4|0; var px = (baseX *7/5)|0; var py = (baseX *7/5)|0; var left = screenBorder; var top = baseX/4|0; var colorCanvas, colorStage; var colorSelector; var colorShape=[]; var activeCircle; var smallScale = 0.4; var colorSelectorIsSmall = 0; var outFocusTimer = null; var colorStageTicker = null; var self = this; var enabled = 0; var bgColor= backgroundColor; init(); function init() { createColorCanvas(); createColorSelector(); } this.enable = function () { if(enabled) return; enabled = 1; colorSelector.set({alpha:1}); colorStage.enableMouseOver(30); colorStage.update(); } this.disable = function (hidden) { enabled = 0; if(hidden) { colorSelector.set({alpha:0}); } else { colorSelector.set({alpha:1}) } colorStage.enableMouseOver(0); colorStage.update(); } this.themeChange = function() { for(var i=0; i < maxThemeColor;i++) { setColorShape(colorShape[i], i, pinker(getThemeTileColor(i)) ); } setActiveCircle(); colorStage.update(); } this.activeColorChange = function() { setActiveCircle(); colorStage.update(); } function createColorCanvas() { colorCanvas = document.createElement('canvas'); colorCanvas.id = "theme_color_selector"; colorCanvas.width = px * 2; colorCanvas.height = py * 2; colorCanvas.style.left = left + "px"; colorCanvas.style.top = top + "px"; colorCanvas.style.position = "absolute"; document.body.appendChild(colorCanvas); } function createColorSelector() { var bgCircle = new createjs.Shape(); colorStage = new createjs.Stage(colorCanvas); colorSelector = new createjs.Container(); bgCircle.graphics.beginFill(bgColor).drawCircle(px,py, radius*5/3|0); colorSelector.addChild(bgCircle); //colorSelector.regY =radius*5/3*2; //colorSelector.y = radius*5/3*2; addColorShape(); setColorSelectorMouseEvent(); colorSelectorTransform(1); addActiveCircle(); setActiveCircleMouseEvent(); colorSelector.set({alpha:0}); //disabled colorStage.addChild(colorSelector); colorStage.update(); } //= 2 ========================= function addColorShape() { for(var i=0; i < maxThemeColor;i++) createColorShape(i); for(var i=0; i < maxThemeColor;i++) createBGBar(i); function createColorShape(id) { var color = pinker( getThemeTileColor(i)); colorShape[id] = new createjs.Shape(); setColorShape(colorShape[id], id, color); setColorShapeMouseEvent(colorShape[id], id) colorSelector.addChild(colorShape[id]); } function createBGBar(id) { var s = Math.PI*2/5 + (2*Math.PI) * id/5; var bar = new createjs.Shape(); bar.graphics.setStrokeStyle(baseX/6|0) .beginStroke(bgColor).moveTo(px, py) .lineTo(px+ Math.sin(s)*radius*3/2, py+Math.cos(s)*radius*3/2) .endStroke(); colorSelector.addChild(bar); } } function setColorSelectorMouseEvent() { colorSelector.on("mouseover", mouseOver); colorSelector.on("mouseout", mouseOut); colorSelector.on("click", mouseClick); function mouseOver() { if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) { colorSelector.cursor = "default"; return; } if(colorSelectorIsSmall) { colorSelector.cursor = "pointer"; return; } setTransformTimeout(0); //clear timeout } function mouseOut() { if(colorSelectorIsSmall) return; setTransformTimeout(1); //set timeout } function mouseClick() { if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; if(!colorSelectorIsSmall) return; colorSelectorTransform(0); } } function addActiveCircle() { activeCircle = new createjs.Shape(); colorSelector.addChild(activeCircle); setActiveCircle(); } function setActiveCircleMouseEvent() { activeCircle.on("mouseover", function(){ if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; if(colorSelectorIsSmall) return; colorSelector.cursor = "pointer"; }); activeCircle.on("mouseout", function(){ if(colorSelectorIsSmall) return; colorSelector.cursor = "default"; }); activeCircle.on("click",function() { if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; if(colorSelectorIsSmall) return; setTransformTimeout(0); //clear timeout colorSelectorTransform(0); //transform to small }); } function colorSelectorTransform(immediate) { if(colorSelectorIsSmall) { colorCanvas.width = px * 2; colorCanvas.height = py * 2; if(immediate) { colorSelector.scaleX = colorSelector.scaleY = 1; colorSelectorIsSmall = 0; colorSelector.cursor = "default"; } else { createjs.Tween.get(colorSelector) .to({scaleX: 1, scaleY: 1}, 100) .call(function(){ colorSelectorIsSmall = 0; setActiveCircle(); colorSelector.cursor = "default"; createjs.Ticker.off("tick", colorStageTicker); colorStageTicker = null; colorStage.update(); }); colorStageTicker = createjs.Ticker.on("tick", colorStage); } } else { if(immediate) { colorSelector.scaleX = colorSelector.scaleY = smallScale; colorSelectorIsSmall = 1; colorSelector.cursor = "pointer"; colorCanvas.width = px * 2 * smallScale; colorCanvas.height = py * 2 * smallScale; } else { createjs.Tween.get(colorSelector) .to({scaleX: smallScale, scaleY: smallScale}, 100) .call(function(){ colorCanvas.width = px * 2 * smallScale; colorCanvas.height = py * 2 * smallScale; colorSelectorIsSmall = 1; //setActiveCircle(); //self.themeChange(); colorSelector.cursor = "pointer"; createjs.Ticker.off("tick", colorStageTicker); colorStageTicker = null; colorStage.update(); }); colorStageTicker = createjs.Ticker.on("tick", colorStage); } } } //= 3 =========================== function pinker(hexColor) { var orgRGB = hexToRGB(hexColor); var percent = 1/2, whitePercent = 1-percent; for(var i=0; i < 3; i++) { orgRGB[i] = (orgRGB[i]*percent+255*whitePercent)|0; if(orgRGB[i]>255) orgRGB[i]=255; } return rgbToHex(orgRGB) } function setColorShape(shape, id, color) { var s = (2*Math.PI) * id/5-(Math.PI)*7/10+(Math.PI)/40; var e = (2*Math.PI) * (id+1)/5-(Math.PI)*7/10-(Math.PI)/40; shape.graphics.clear().setStrokeStyle(radius-2) .beginStroke(color).arc(px, py, radius, s, e).endStroke(); } function setColorShapeMouseEvent(shape, id) { shape.on("mouseover", mouseOver, null, false, {id:id}); shape.on("mouseout", mouseOut, null, false, {id:id}); shape.on("click", mouseClick, null, false, {id:id}); function mouseOver(evt, data) { var id = data.id; var curColorId = getCurColorId(); if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; if(colorSelectorIsSmall) return; colorSelector.cursor = "pointer"; setColorShape(colorShape[id], id, getThemeTileColor(id)); colorStage.update(); } function mouseOut(evt, data) { var id = data.id; var curColorId = getCurColorId(); if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; if(colorSelectorIsSmall) return; colorSelector.cursor = "default"; setColorShape(colorShape[id], id, pinker(getThemeTileColor(id))); colorStage.update(); } function mouseClick(evt, data) { var id = data.id; var curColorId = getCurColorId(); if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; if(colorSelectorIsSmall || curColorId == id) return; themeColorChange(id); setActiveCircle(); colorStage.update(); } } function setTransformTimeout(enable) { //clear timeout if(outFocusTimer) { clearTimeout(outFocusTimer); outFocusTimer = null; } //set timeout if(enable) { outFocusTimer = setTimeout(function(){ colorSelectorTransform(0); }, 1000); } } function setActiveCircle() { var color = getThemeTileColor(getCurColorId()); activeCircle.graphics.clear().beginFill(color).drawCircle(px,py, radius*3/8|0); //activeCircle.alpha = colorSelectorIsSmall?0:1; } } ================================================ FILE: lodeRunner.colorTheme.js ================================================ var baseBitmapName = [ "empty", "brick", "solid", "ladder", "rope", "trapBrick", "hladder", "gold", "redhat", "guard1", "runner1", "runner", "guard", "hole", "ground", "over", "text" ]; var themeColor = {}; themeColor[THEME_APPLE2] = [ null, //original image color "#60C0A0", "#DD8D5D", "#C080F0", "#FF83BB", ]; themeColor[THEME_C64] = [ null, //original image color "#DF5050", "#F7993E", "#4A4AFF", "#2E8B57" ]; var maxThemeColor = themeColor[THEME_APPLE2].length; var themeBaseBitmap = {}; var curColorId = {}; var orgImageColor = {}; var themeNameList = [THEME_APPLE2, THEME_C64]; function createBaseBitmapInstance() { for(var i = 0; i < themeNameList.length; i++) { var themeName = themeNameList[i]; var id = curColorId[themeName]; orgImageColor[themeName] = getOrgImageColor(themeName); createThemeBaseBitmap(themeName, hexToRGB(themeColor[themeName][id]), id); } //for edit mode only themeBaseBitmap["eraser"] = createBitmap("eraser", null, null); } function createThemeBaseBitmap(themeName, newColor, id) { var oldColor = orgImageColor[themeName]; //get original image color for(var i=0; i < baseBitmapName.length; i++){ var imageName = baseBitmapName[i]+themeName; if( (imageName+id) in themeBaseBitmap) return; themeBaseBitmap[imageName+id] = createBitmap(imageName, oldColor, newColor); } } function getThemeBitmap(name) { if(name == "eraser") return themeBaseBitmap[name].clone(); //for edit mode only return themeBaseBitmap[name+ curTheme+curColorId[curTheme]].clone(); } function getThemeImage(name) { return preload.getResult(name); } function getThemeTileColor(id) { var curId = (typeof id != 'undefined')?id:curColorId[curTheme]; if(curId == 0) return rgbToHex(orgImageColor[curTheme]); //original color return themeColor[curTheme][curId]; } function getCurColorId() { return curColorId[curTheme]; } function getOrgImageColor(themeName) { var canvas = document.createElement('canvas'); var ctx=canvas.getContext("2d"); var stage = new createjs.Stage(canvas); var bitmap = new createjs.Bitmap(getThemeImage("solid"+themeName)); //"solid" as sample image var imgData, orgColor; canvas.width = bitmap.getBounds().width; canvas.height = bitmap.getBounds().height; stage.addChild(bitmap); stage.update(); stage.cache(0, 0, canvas.width, canvas.height); imgData=ctx.getImageData(0, 0, canvas.width, canvas.height); orgColor = [imgData.data[0], imgData.data[1], imgData.data[2] ]; stage.uncache(); stage.removeAllChildren(); stage.update(); return orgColor; } function createBitmap(imageName, oldColor, newColor) { var bitmap = new createjs.Bitmap(getThemeImage(imageName)); var newBitmap; if(newColor != null && (newBitmap = changeBitmapColor(bitmap, oldColor, newColor)) != null) return newBitmap; //color changed else return bitmap; } function changeBitmapColor(bitmap, oldColor, newColor) { var canvas = document.createElement('canvas'); var stage = new createjs.Stage(canvas); var changed; canvas.width = bitmap.getBounds().width; canvas.height = bitmap.getBounds().height; stage.addChild(bitmap); stage.update(); stage.cache(0, 0, canvas.width, canvas.height); changed = changeColor(canvas, oldColor, newColor); stage.uncache(); stage.removeAllChildren(); if(changed) return (new createjs.Bitmap(stage.canvas)); else return null; } function changeColor(canvas, oldColor, newColor) { var ctx=canvas.getContext("2d"); var imgData=ctx.getImageData(0, 0, canvas.width, canvas.height); var data = imgData.data; var bitChanged = 0; // add a range compare for fix browser (Brave) color have bit different ?, 6/3/2021 var oldMin = [oldColor[0]-2, oldColor[1]-2, oldColor[2]-2]; var oldMax = [oldColor[0]+2, oldColor[1]+2, oldColor[2]+2]; for (var i = 0; i < data.length; i += 4) { var red = data[i + 0]; var green = data[i + 1]; var blue = data[i + 2]; var alpha = data[i + 3]; if(oldMin[0] <= red && red <= oldMax[0] && oldMin[1] <= green && green <= oldMax[1] && oldMin[2] <= blue && blue <= oldMax[2]) { data[i+0] = newColor[0]; data[i+1] = newColor[1]; data[i+2] = newColor[2]; bitChanged = 1; } } ctx.putImageData(imgData, 0, 0); return bitChanged; } function themeColorChange(id) { var newColor; if(curColorId[curTheme] == id) return; //don't need change newColor = hexToRGB(themeColor[curTheme][id]); curColorId[curTheme] = id; createThemeBaseBitmap(curTheme, newColor, id) themeDataReset(0); //don't need reset sound instance setThemeColor(); themeColorObj.activeColorChange(); if(playMode == PLAY_EDIT) { if(editLevelModified()) saveTestState(); stopEditTicker(); startEditMode(); } else { changeThemeScreen(); //real time change theme screen } } function hexToRGB(hex) { var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); return result ? [ parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16) ] : null; } function rgbToHex(rgb) { return "#" + ("00" + rgb[0].toString(16)).slice(-2)+ ("00" + rgb[1].toString(16)).slice(-2)+ ("00" + rgb[2].toString(16)).slice(-2); } ================================================ FILE: lodeRunner.def.js ================================================ var VERSION = "2.30e"; var AI_VERSION = 4; var NO_OF_TILES_X = 28, NO_OF_TILES_Y = 16; var BASE_TILE_X = 40, BASE_TILE_Y = 44; var GROUND_TILE_X = 40, GROUND_TILE_Y = 20, TEXT_TILE_X = 40, TEXT_TILE_Y = 44; var BASE_SCREEN_X = (NO_OF_TILES_X * BASE_TILE_X); var BASE_SCREEN_Y = (NO_OF_TILES_Y * BASE_TILE_Y + GROUND_TILE_Y + TEXT_TILE_Y); var MIN_SCALE = 0.5, MAX_SCALE = 3; var MENU_ICON_X = 40, MENU_ICON_Y = 36, ICON_BORDER = 4; var BASE_ICON_X = (MENU_ICON_X + ICON_BORDER * 2); var KEYCODE_BKSPACE = 8, //backspace KEYCODE_ENTER = 13, KEYCODE_SPACE = 32, KEYCODE_ESC = 27, //escape KEYCODE_X = 88, //dig right KEYCODE_Y = 89, //dig left (Y key to dig left, for German keyboards) KEYCODE_Z = 90, //dig left KEYCODE_LEFT = 37, //move left KEYCODE_RIGHT = 39, //move right KEYCODE_UP = 38, //move up KEYCODE_DOWN = 40, //move down KEYCODE_SUBTRACT = 109, //Add KEYCODE_SUBTRACT & KEYCODE_HYPHEN for support fireFox 'dash' keycode KEYCODE_HYPHEN = 173, // KEYCODE_DASH = 189, //'-' KEYCODE_DOT = 190, //'.' KEYCODE_U = 85, //dig left KEYCODE_O = 79, //dig right KEYCODE_J = 74, //move left KEYCODE_L = 76, //move right KEYCODE_I = 73, //move up KEYCODE_K = 75, //move down KEYCODE_PERIOD = 190, //'.' KEYCODE_COMMA = 188, //',' KEYCODE_A = 65, //'A' KEYCODE_C = 67, //'C' KEYCODE_D = 68, //'D' KEYCODE_E = 69, //'E' KEYCODE_G = 71, //'G' KEYCODE_H = 72, //'H' KEYCODE_Q = 81, //'Q' KEYCODE_R = 82, //'R' KEYCODE_S = 83, //'S' KEYCODE_T = 84, //'T' KEYCODE_V = 86, //'V' KEYCODE_W = 87; //'W' var KEYCODE_0 = 48, KEYCODE_1 = 49, KEYCODE_2 = 50, KEYCODE_3 = 51, KEYCODE_4 = 52, KEYCODE_5 = 53, KEYCODE_6 = 54, KEYCODE_7 = 55, KEYCODE_8 = 56, KEYCODE_9 = 57; var SCORE_COMPLETE_LEVEL = 1500, SCORE_COUNTER = 15, SCORE_GET_GOLD = 250, SCORE_IN_HOLE = 75, SCORE_GUARD_DEAD = 75, SCORE_WIN_PER_MAN = 42500; var SCORE_VALUE_PER_POINT = 100; //for modern & edit mode var PLAY_NONE = 0, PLAY_CLASSIC = 1, PLAY_MODERN = 2, PLAY_DEMO = 3, PLAY_EDIT = 4, PLAY_TEST = 5, PLAY_AUTO = 6, PLAY_DEMO_ONCE = 7; var GAME_START = 0, GAME_RUNNING = 1, GAME_FINISH = 2, GAME_FINISH_SCORE_COUNT= 3, GAME_WAITING = 4, GAME_PAUSE = 5, GAME_NEW_LEVEL = 6, GAME_RUNNER_DEAD = 7, GAME_OVER_ANIMATION = 8, GAME_OVER = 9, GAME_NEXT_LEVEL = 10, GAME_PREV_LEVEL = 11, GAME_LOADING = 12, GAME_WIN_SCORE_COUNT = 13, GAME_WIN = 14; var ACT_UNKNOWN = -1, ACT_STOP = 0, ACT_LEFT = 1, ACT_RIGHT = 2, ACT_UP = 3, ACT_DOWN = 4, ACT_FALL = 5, ACT_FALL_BAR = 6, ACT_DIG_LEFT = 7, ACT_DIG_RIGHT = 8, ACT_DIGGING = 9, ACT_IN_HOLE = 10, ACT_CLIMB_OUT = 11, ACT_REBORN = 12; //value | Character | Type //------+-----------+----------- // 0x0 | | Empty space // 0x1 | # | Normal Brick // 0x2 | @ | Solid Brick // 0x3 | H | Ladder // 0x4 | - | Hand-to-hand bar (Line of rope) // 0x5 | X | False brick // 0x6 | S | Ladder appears at end of level // 0x7 | $ | Gold chest // 0x8 | 0 | Guard // 0x9 | & | Player var EMPTY_T = 0x00; var BLOCK_T = 0x01; var SOLID_T = 0x02; var LADDR_T = 0x03; var BAR_T = 0x04; var TRAP_T = 0x05; var HLADR_T = 0x06; var GOLD_T = 0x07; var GUARD_T = 0x08; var RUNNER_T = 0x09; var REBORN_T = 0x10; //template: for reborn var CLOSE_SCREEN_SPEED = 35; //20 ~ 80 var MAX_OLD_GUARD = 6; //maximum number of guards for AI Version 1 and 2 var MAX_NEW_GUARD = 5; //for AI Version >= 3 var RUNNER_LIFE = 5; //number of runner life var RUNNER_MAX_LIFE = 100; var MAX_TIME_COUNT = 999; //for moden mode var TICK_COUNT_PER_TIME = 16; var MAX_DEMO_WAIT_COUNT = 200 * TICK_COUNT_PER_TIME; var MAX_EDIT_LEVEL = 120; var MAX_HISCORE_RECORD = 10, MAX_HISCORE_NAME_LENGTH = 12; //=========================== // Define value for playData //=========================== var PLAY_DATA_USERDEF = 999; //================================================ // Define themes string also as theme folder name //================================================ var THEME_APPLE2 = "APPLE2"; var THEME_C64 = "C64"; //================================ // Below defined for LocalStorage //================================ var STORAGE_LASTPLAY_MODE = "loderunner_lastplay"; var STORAGE_CLASSIC_INFO = "loderunner_classicInfo"; var STORAGE_MODERN_INFO = "loderunner_modernInfo"; var STORAGE_DEMO_INFO = "loderunner_demoInfo"; var STORAGE_FIRST_PLAY = "loderunner_firstRun"; var STORAGE_MODERN_SCORE_INFO = "loderunner_modernScore"; var STORAGE_USER_INFO = "loderunner_userInfo"; //user created var STORAGE_USER_SCORE_INFO = "loderunner_userScore"; //user created var STORAGE_EDIT_INFO = "loderunner_editInfo"; var STORAGE_USER_LEVEL = "loderunner_userLevel"; var STORAGE_TEST_LEVEL = "loderunner_testlevel"; var STORAGE_HISCORE_INFO = "loderunner_hiScore"; var STORAGE_LASTSCORE = "loderunner_lastScore"; var STORAGE_PLAYER_NAME = "loderunner_player"; var STORAGE_UID = "loderunner_uid"; var STORAGE_THEME_MODE = "loderunner_theme"; var STORAGE_THEME_COLOR = "loderunner_color_"; var STORAGE_REPEAT_ACTION = "loderunner_actRepeat"; var STORAGE_GAMEPAD_MODE = "loderunner_gamepadMode"; //================================ // backup & restore file header //================================ var LRWG_FILE_START_INFO = "LODE RUNNER WEB GAME."; ================================================ FILE: lodeRunner.demo.js ================================================ //=============== // Auto Demo //=============== var demoRecordIdx, demoGoldIdx, demoBornIdx; var demoTickCount; var demoRnd, demoIdx; function initAutoDemoRnd() { demoRnd = []; demoRnd[0] = new rangeRandom(0, demoData1.length-1, 0); //random range 0 .. demoData1.length-1 } var demoRecord, demoGoldDrop, demoBornPos; var demoLevel, demoData, demoCount, demoMaxCount; function getAutoDemoLevel(initValue) { if(initValue) { curScore = 0; runnerLife = 1; demoLevel = 1; demoCount = 1; demoMaxCount = 3; demoData = demoData1; levelData = playVersionInfo[0].verData; demoIdx = 0; } else { demoLevel++; demoCount++; } var idx = demoRnd[demoIdx].get(); demoRecord = demoData[idx].action; demoGoldDrop = demoData[idx].goldDrop; demoBornPos = demoData[idx].bornPos; curLevel = demoData[idx].level; curAiVersion = demoData[idx].ai; //07/04/2014 if("godMode" in demoData[idx]) godMode = demoData[idx].godMode; //07/09/2014 } var demoCountTime = 0, demoCountEnable = 0; function enableAutoDemoTimer() { demoCountEnable = 1; demoCountTime = 0; } function disableAutoDemoTimer() { demoCountEnable = 0; } function countAutoDemoTimer() { if(demoCountEnable) { demoCountTime++; //debug(demoCountTime); if(demoCountTime > MAX_DEMO_WAIT_COUNT) { disableAutoDemoTimer(); gameState = GAME_WAITING; showCoverPage(); } } } //===================================== // function for auto demo & demo mode //===================================== function initPlayDemo() { demoRecordIdx = demoGoldIdx = demoBornIdx = 0; demoTickCount = 0; playTickTimer = 0; //modern mode time counter gameState = GAME_RUNNING; if(playMode == PLAY_DEMO_ONCE) { demoIconObj.disable(1); selectIconObj.disable(1); } } function playDemo() { if(demoRecordIdx < demoRecord.length) { if(demoRecord[demoRecordIdx*2] == demoTickCount) { //loadingTxt.text = demoRecordIdx + " " + demoTickCount ; //for debug pressKey(demoRecord[demoRecordIdx*2+1]); demoRecordIdx++; } } demoTickCount++; } function getDemoGold(guard) { guard.hasGold = demoGoldDrop[demoGoldIdx++]; } function getDemoBornPos() { if(demoBornPos[0] == 2) { demoBornIdx += 2; return { x: demoBornPos[demoBornIdx-1], y: demoBornPos[demoBornIdx] }; } else { return { x: demoBornPos[++demoBornIdx], y: 1 }; } } //==================================== // for demo mode (User select level) //==================================== var playerDemoData = [], wDemoData = []; var demoPlayData = 0; //for syn demo data with current playData var demoDataLoading = 0; function initDemoData() { demoPlayData = playData; playerDemoData = []; wDemoData = []; demoDataLoading = 1; getDemoData(playData); //ajax } function setDemoData(jsonTxt) { if(jsonTxt.substring(0, 1) == "[" ) { wDemoData = JSON.parse(jsonTxt); for(var i = 0; i < wDemoData.length; i++) { playerDemoData[wDemoData[i].level-1] = wDemoData[i]; } } else { error("Wrong Demo Data: " + jsonTxt); } demoDataLoading = 0; if(playMode == PLAY_MODERN && gameState == GAME_START ) demoIconObj.enable(); } function initDemoInfo() { var idx = curLevel - 1; curScore = 0; runnerLife = 1; demoRecord = demoData[idx].action; demoGoldDrop = demoData[idx].goldDrop; demoBornPos = demoData[idx].bornPos; assert(curLevel == demoData[idx].level, "curLevel != level of demoData"); curAiVersion = demoData[idx].ai; //07/04/2014 if("godMode" in demoData[idx]) godMode = demoData[idx].godMode; //07/09/2014 } function getDemoOnceInfo() //for demo once { //DEMO ONCE in Training mode, so curLevel & levelData are same as training mode demoData = playerDemoData; initDemoInfo(); } function getDemoInfo() { var infoJSON; if (playData >= 1 && playData <= maxPlayId) { infoJSON = getStorage(STORAGE_DEMO_INFO + playData); levelData = getPlayVerData(playData); //demoData = playerDemoData[playData-1]; demoData = playerDemoData; } else { error("design error, value =" + playData ); } if(infoJSON == null) { curLevel = 1; } else { var infoObj = JSON.parse(infoJSON); curLevel = infoObj.l; } getValidDemoLevel(); initDemoInfo(); } function setDemoInfo() { var infoObj = { l:curLevel}; var infoJSON = JSON.stringify(infoObj); if (playData >= 1 && playData <= maxPlayId) { setStorage(STORAGE_DEMO_INFO + playData, infoJSON); } else { error("design error, value =" + playData ); } } function getValidDemoLevel() { while(typeof demoData[curLevel-1] == "undefined") { if(++curLevel > levelData.length) curLevel = 1; } } function getNextDemoLevel() { getValidDemoLevel(); setDemoInfo(); initDemoInfo(); } function curDemoLevelIsVaild() { if(playData == PLAY_DATA_USERDEF) return 0; return (playerDemoData.length >= curLevel && typeof playerDemoData[curLevel-1] != "undefined"); } function updatePlayerDemoData(playData, demoDataInfo) { var level = demoDataInfo.level; playerDemoData[level-1] = { level: demoDataInfo.level, ai: demoDataInfo.ai, time: demoDataInfo.time, state: demoDataInfo.state, action: demoDataInfo.action, goldDrop: demoDataInfo.goldDrop, bornPos: demoDataInfo.bornPos, godMode: demoDataInfo.godMode, player: playerName, date: getLocalTime(), location: "Unknown", //update by sendDemoData2Server() resp. cId: "Unknown", ip: "updating" }; } //====================== // resp from server //====================== function respUpdatePlayerDemoData(jsonTxt) { var respObj, level; if(jsonTxt.substring(0, 1) == "{" ) { respObj = JSON.parse(jsonTxt); level = respObj.level; if(respObj.playData == playData && playerDemoData[level-1].ip == "updating") { playerDemoData[level-1].ip = respObj.ip; playerDemoData[level-1].location = respObj.location; playerDemoData[level-1].cId = respObj.cId; } } else { error("Wrong resp Data: " + jsonTxt); } } //============================== // Record play action for demo //============================== var RECORD_NONE = 0, RECORD_KEY = 1, RECORD_PLAY = 2; var recordMode = RECORD_KEY; //var recordMode = RECORD_NONE; var recordCount, recordKeyCode = 0, lastKeyCode = -1; var playRecord, goldRecord, bornRecord; var goldRecordIdx, bornRecordIdx; var playRecordTime, recordState; function initRecordVariable() { recordCount = 0; goldRecordIdx = 0; bornRecordIdx = 0; playRecordTime = 0; switch(recordMode) { case RECORD_KEY: recordKeyCode = 0; lastKeyCode = -1; playRecord = []; goldRecord = []; bornRecord = []; break; case RECORD_PLAY: recordIdx = 0; gameState = GAME_RUNNING; break; } } var alwaysRecord = 0, keyPressed = 0; function saveKeyCode(code, keyAction) { //----------------------------------------------------------------------------- // Don't care repeat times, always record key when press dig-left or dig-right // fixed by Simon 12/12/2014 //----------------------------------------------------------------------------- alwaysRecord = 0; if(keyAction == ACT_DIG_LEFT || keyAction == ACT_DIG_RIGHT) alwaysRecord = 1; recordKeyCode = code; keyPressed = 1; } function recordModeDump(state) { recordPlayTime(state); remapActionKey(); convertBornPos(); dumpRecord(); } function recordModeToggle(state) { if(recordMode == RECORD_KEY) { if(playMode != PLAY_AUTO && playMode != PLAY_DEMO && playMode != PLAY_DEMO_ONCE) recordMode = RECORD_PLAY; recordModeDump(state); } else recordMode = RECORD_KEY; } function processRecordKey() { switch(recordMode) { case RECORD_KEY: //record the play key action recordKeyAction(); break; case RECORD_PLAY: //play the record key recordPlayDemo(); break; } recordCount++; } function recordKeyAction() { if(repeatAction) recordKeyAction1(); else recordKeyAction2() } //record key for "keyboard repeat on" function recordKeyAction1() { if(!keyPressed) return; if(recordKeyCode != lastKeyCode || alwaysRecord) { playRecord.push(recordCount); playRecord.push(recordKeyCode); lastKeyCode = recordKeyCode; } keyPressed = 0; } //record key for "keyboard repeat off" // keyPressed= 1:pressed, 0:released, -1:floating (do nothing till pressed again) function recordKeyAction2() { switch(keyPressed) { case 1: //pressed if(recordKeyCode != lastKeyCode || alwaysRecord) { playRecord.push(recordCount); playRecord.push(recordKeyCode); lastKeyCode = recordKeyCode; } if(alwaysRecord) keyPressed = -1; //floating break; case 0: //release if(recordKeyCode != KEYCODE_SPACE) { playRecord.push(recordCount); playRecord.push(KEYCODE_SPACE); lastKeyCode = recordKeyCode = KEYCODE_SPACE; keyAction = ACT_STOP; } break; } } var recordIdx; function recordPlayDemo() { if(recordIdx < playRecord.length) { if(playRecord[recordIdx*2] == recordCount) { //loadingTxt.text = recordIdx; //for debug pressKey(playRecord[recordIdx*2+1]); recordIdx++; } } } function processRecordGold(guard) { switch(recordMode) { case RECORD_KEY: //record the play key action, save gold goldRecord.push(guard.hasGold); break; case RECORD_PLAY: //play the record key, get gold guard.hasGold = goldRecord[goldRecordIdx++]; break; } } function saveRecordBornPos(x, y) { bornRecord.push({ x:x, y:y }); } function getRecordBornPos() { if(bornRecord[0] == 2) { bornRecordIdx += 2; return { x: bornRecord[bornRecordIdx-1], y: bornRecord[bornRecordIdx] }; } else { return { x: bornRecord[++bornRecordIdx], y: 1 }; } } function recordPlayTime(state) { playRecordTime = recordCount; recordState = (state == GAME_FINISH)?1:0; //finish or dead } var actionKeyMapping = [ [ KEYCODE_A, KEYCODE_LEFT], //move left [ KEYCODE_D, KEYCODE_RIGHT], //move right [ KEYCODE_W, KEYCODE_UP], //move up [ KEYCODE_S, KEYCODE_DOWN], //move down [ KEYCODE_Q, KEYCODE_Z], //dig left [ KEYCODE_E, KEYCODE_X], //dig right [ KEYCODE_COMMA, KEYCODE_Z], //dig left [ KEYCODE_PERIOD, KEYCODE_X] //dig right ]; //Remap action key to orignal "left, right, up down and Z, X" //for backward compatible function remapActionKey() { for(var i = 0; i < playRecord.length; i+=2){ for(var j = 0; j < actionKeyMapping.length; j++) { if(actionKeyMapping[j][0] == playRecord[i+1]) { playRecord[i+1] = actionKeyMapping[j][1]; break; } } } } function convertBornPos() { var len, offset = 1; var tmpRecord = []; if((len = bornRecord.length) <= 0) return; for(var i = 0; i < len; i++) if(bornRecord[i].y != 1) offset = 2; tmpRecord[0] = offset; for(var i = 0; i < len; i++) { tmpRecord[i*offset+1] = bornRecord[i].x; if(offset == 2) tmpRecord[i*offset+2] = bornRecord[i].y; } bornRecord = tmpRecord; } var curDemoData = { ai: AI_VERSION, time: 0 }; //bug fixed: when press CTRL-C without demo data function dumpRecord() { var txtStr; curDemoData = {}; curDemoData.level = curLevel; curDemoData.ai = AI_VERSION; curDemoData.time = playRecordTime; curDemoData.state = recordState; //game finish or not curDemoData.action = []; curDemoData.goldDrop = []; curDemoData.bornPos = []; curDemoData.godMode = godModeKeyPressed; //07/09/2014 for(var i = 0; i < playRecord.length; i++) { curDemoData.action[i] = playRecord[i]; } for(var i = 0; i < goldRecord.length; i++) { curDemoData.goldDrop[i] = goldRecord[i]; } for(var i = 0; i < bornRecord.length; i++) { curDemoData.bornPos[i] = bornRecord[i]; } debug(curDemoData); debug(" { level: " + curLevel + ","); debug(" ai: " + AI_VERSION + ","); debug(" time: " + playRecordTime + ","); debug(" state: " + recordState + ","); debug(" godMode: " + godModeKeyPressed + ","); //07/09/2014 if(playRecord.length > 0) { txtStr = " action: [ " + playRecord[0]; for(var i = 1; i < playRecord.length; i++) { txtStr += ", " + playRecord[i]; } debug(txtStr+ " ], //" + (playRecord.length/2)); } else { debug(" action: [ ],"); } if(goldRecord.length > 0) { txtStr = " goldDrop: [ " + goldRecord[0]; for(var i = 1; i < goldRecord.length; i++) { txtStr += ", " + goldRecord[i]; } debug(txtStr+ " ],"); } else { debug(" goldDrop: [ ],"); } if( bornRecord.length > 0) { txtStr = " bornPos: [ " + bornRecord[0]; for(var i = 1; i < bornRecord.length; i++) { txtStr += ", " + bornRecord[i]; } debug(txtStr+" ]"); } else { debug(" bornPos: [ ]"); } debug(" },"); } ================================================ FILE: lodeRunner.demoData1.js ================================================ var demoData1 = [ { level: 11, ai: 4, time: 603, state: 1, godMode: 0, action: [ 0, 39, 29, 32, 30, 37, 38, 39, 49, 37, 60, 38, 68, 39, 80, 38, 85, 32, 86, 37, 97, 38, 102, 32, 103, 39, 113, 38, 119, 37, 128, 38, 133, 32, 134, 39, 145, 38, 150, 37, 158, 38, 165, 39, 175, 38, 181, 37, 190, 38, 196, 39, 205, 38, 212, 37, 217, 38, 229, 39, 237, 90, 252, 39, 257, 90, 278, 39, 281, 90, 305, 39, 308, 90, 330, 39, 333, 90, 534, 37, 593, 38 ], //41 goldDrop: [ 26, 22, 24, 34 ], bornPos: [ 1, 24, 3, 21, 0 ] }, { level: 12, ai: 4, time: 929, state: 1, godMode: 0, action: [ 0, 39, 35, 38, 55, 88, 77, 39, 94, 37, 108, 38, 127, 39, 143, 37, 170, 88, 180, 37, 198, 39, 223, 38, 242, 39, 259, 37, 325, 39, 344, 38, 354, 37, 434, 90, 444, 39, 458, 90, 470, 37, 483, 90, 494, 39, 500, 90, 510, 39, 516, 90, 525, 37, 542, 90, 551, 39, 559, 90, 569, 37, 575, 90, 590, 37, 609, 39, 620, 90, 631, 37, 644, 39, 686, 90, 697, 39, 706, 37, 725, 39, 761, 38, 780, 39, 795, 40, 802, 39, 860, 38 ], //46 goldDrop: [ ], bornPos: [ 1, 23 ] }, { level: 18, ai: 4, time: 1730, state: 1, godMode: 0, action: [ 0, 39, 43, 88, 76, 37, 79, 88, 113, 39, 126, 38, 164, 39, 175, 38, 181, 39, 205, 90, 217, 37, 230, 39, 243, 37, 285, 38, 322, 39, 334, 38, 341, 39, 346, 38, 397, 39, 416, 38, 445, 37, 476, 38, 487, 37, 540, 38, 547, 37, 560, 88, 572, 39, 602, 88, 618, 37, 624, 88, 634, 39, 651, 90, 661, 37, 678, 90, 692, 37, 741, 38, 757, 39, 767, 37, 776, 40, 853, 37, 858, 90, 869, 39, 875, 90, 937, 39, 950, 88, 959, 37, 987, 39, 1008, 38, 1017, 39, 1102, 38, 1140, 39, 1149, 38, 1155, 39, 1197, 38, 1226, 37, 1259, 38, 1270, 37, 1289, 40, 1325, 39, 1357, 38, 1366, 40, 1402, 38, 1442, 39, 1453, 38, 1505, 39, 1542, 38, 1571, 37, 1603, 38, 1614, 37, 1666, 38, 1672, 37, 1720, 38 ], //72 goldDrop: [ 31 ], bornPos: [ 1, 4, 24 ] }, { level: 22, ai: 4, time: 2124, state: 1, godMode: 0, action: [ 0, 37, 30, 38, 44, 37, 59, 39, 163, 37, 198, 38, 217, 39, 277, 37, 303, 38, 307, 37, 331, 39, 337, 38, 348, 39, 353, 38, 360, 39, 372, 38, 383, 39, 411, 38, 427, 37, 484, 40, 496, 37, 529, 38, 549, 37, 609, 39, 620, 38, 633, 39, 637, 38, 648, 37, 652, 38, 664, 88, 699, 39, 750, 37, 758, 39, 783, 40, 796, 37, 803, 88, 814, 90, 837, 39, 847, 38, 861, 39, 893, 37, 915, 90, 935, 39, 939, 90, 993, 37, 1042, 38, 1049, 37, 1053, 38, 1067, 39, 1089, 88, 1128, 39, 1164, 88, 1183, 39, 1209, 37, 1235, 90, 1244, 39, 1272, 90, 1296, 37, 1385, 38, 1394, 37, 1397, 38, 1410, 39, 1454, 38, 1463, 37, 1556, 88, 1568, 39, 1616, 38, 1629, 39, 1656, 37, 1661, 38, 1672, 37, 1680, 38, 1696, 39, 1700, 88, 1710, 37, 1723, 88, 1733, 37, 1738, 40, 1744, 90, 1925, 38, 1929, 39, 1941, 88, 1952, 37, 1957, 88, 1968, 37, 1972, 88, 2028, 39, 2056, 38, 2069, 39, 2114, 38 ], //90 goldDrop: [ 35, 12, 32 ], bornPos: [ 1, 22, 24, 19, 23 ] }, { level: 32, ai: 4, time: 1506, state: 0, godMode: 0, action: [ 0, 37, 10, 38, 30, 39, 47, 38, 54, 39, 64, 38, 77, 40, 114, 37, 143, 38, 193, 37, 196, 88, 218, 40, 295, 39, 315, 90, 342, 37, 390, 39, 432, 38, 437, 39, 443, 37, 447, 38, 477, 37, 481, 38, 502, 39, 517, 38, 522, 39, 543, 88, 553, 39, 572, 90, 583, 37, 589, 40, 603, 39, 609, 37, 614, 38, 620, 39, 635, 40, 641, 39, 652, 37, 657, 38, 662, 39, 682, 40, 688, 39, 693, 38, 708, 37, 734, 38, 742, 39, 776, 40, 814, 39, 840, 90, 851, 37, 885, 38, 895, 90, 905, 40, 911, 90, 920, 37, 942, 39, 971, 88, 980, 37, 989, 88, 1005, 39, 1030, 40, 1085, 38, 1103, 39, 1113, 38, 1127, 39, 1144, 38, 1151, 37, 1153, 38, 1164, 37, 1165, 38, 1186, 39, 1193, 38, 1203, 37, 1233, 40, 1241, 39, 1246, 88, 1256, 39, 1264, 40, 1280, 39, 1285, 40, 1297, 37, 1311, 40, 1320, 90, 1328, 40, 1331, 90, 1340, 40, 1342, 90, 1353, 37, 1370, 90, 1400, 37, 1413, 38, 1422, 37, 1447, 39, 1469, 38, 1484, 39, 1502, 38 ], //95 goldDrop: [ 35 ], bornPos: [ ] }, { level: 36, ai: 4, time: 2009, state: 1, godMode: 0, action: [ 0, 37, 11, 39, 48, 37, 59, 38, 64, 37, 68, 38, 74, 39, 78, 38, 83, 37, 87, 38, 92, 39, 96, 38, 102, 37, 105, 38, 111, 39, 115, 38, 120, 37, 125, 38, 130, 39, 135, 38, 140, 37, 143, 39, 188, 40, 201, 37, 214, 90, 226, 39, 229, 90, 246, 37, 258, 88, 269, 37, 274, 88, 282, 39, 293, 88, 305, 37, 310, 88, 319, 39, 327, 88, 341, 37, 345, 88, 354, 39, 381, 37, 417, 90, 428, 39, 433, 90, 468, 37, 482, 38, 487, 37, 491, 38, 497, 39, 501, 38, 507, 37, 511, 38, 517, 39, 520, 38, 526, 37, 530, 38, 535, 39, 540, 38, 545, 37, 550, 38, 554, 39, 559, 38, 565, 37, 568, 38, 579, 39, 631, 38, 638, 39, 641, 38, 647, 37, 651, 38, 656, 39, 661, 38, 671, 37, 747, 38, 753, 39, 756, 38, 765, 37, 837, 39, 855, 37, 859, 90, 880, 37, 894, 38, 898, 39, 920, 90, 932, 39, 937, 90, 952, 39, 966, 88, 989, 37, 998, 90, 1011, 39, 1030, 38, 1036, 37, 1039, 38, 1045, 39, 1050, 38, 1055, 37, 1059, 38, 1065, 39, 1069, 38, 1074, 37, 1078, 38, 1083, 39, 1087, 38, 1093, 37, 1096, 38, 1101, 37, 1174, 39, 1182, 38, 1189, 39, 1192, 38, 1198, 37, 1202, 38, 1207, 39, 1211, 38, 1216, 37, 1220, 38, 1224, 39, 1227, 38, 1233, 37, 1236, 38, 1241, 39, 1244, 38, 1250, 37, 1254, 38, 1259, 39, 1262, 38, 1268, 37, 1271, 38, 1276, 39, 1278, 38, 1285, 37, 1291, 39, 1310, 38, 1315, 39, 1319, 38, 1326, 37, 1330, 38, 1334, 39, 1338, 38, 1344, 37, 1348, 38, 1359, 39, 1370, 37, 1416, 40, 1453, 39, 1457, 90, 1468, 39, 1473, 90, 1482, 37, 1497, 88, 1506, 39, 1580, 90, 1605, 37, 1615, 38, 1620, 39, 1625, 38, 1630, 37, 1635, 38, 1640, 39, 1644, 38, 1649, 37, 1653, 38, 1658, 39, 1662, 38, 1667, 37, 1671, 38, 1675, 39, 1679, 38, 1682, 37, 1698, 40, 1705, 37, 1710, 88, 1721, 37, 1726, 88, 1735, 39, 1744, 88, 1759, 39, 1809, 90, 1819, 39, 1839, 88, 1863, 39, 1883, 38, 1889, 37, 1893, 38, 1898, 39, 1903, 38, 1908, 37, 1912, 38, 1917, 39, 1921, 38, 1926, 37, 1930, 38, 1935, 39, 1938, 38, 1944, 37, 1948, 38, 1953, 39, 1956, 38, 1962, 37, 1965, 38, 1970, 39, 1973, 38, 1979, 37, 1982, 38, 1988, 39, 1991, 38, 2000, 37 ], //208 goldDrop: [ ], bornPos: [ 1, 11, 21, 11, 21, 21, 11 ] }, { level: 41, ai: 4, time: 2282, state: 1, godMode: 0, action: [ 0, 37, 6, 39, 16, 38, 21, 39, 26, 38, 30, 39, 46, 37, 51, 40, 58, 37, 87, 39, 132, 38, 139, 39, 142, 38, 148, 39, 152, 38, 157, 39, 162, 38, 167, 39, 204, 90, 215, 39, 230, 37, 237, 88, 269, 39, 279, 38, 289, 37, 304, 39, 326, 40, 348, 37, 358, 39, 374, 40, 384, 37, 398, 88, 409, 37, 419, 90, 452, 37, 471, 38, 480, 39, 554, 38, 594, 37, 604, 38, 610, 37, 613, 38, 619, 37, 622, 38, 628, 37, 632, 38, 636, 39, 662, 40, 680, 37, 690, 88, 700, 38, 708, 37, 712, 38, 718, 37, 721, 38, 727, 37, 730, 38, 736, 39, 753, 40, 769, 37, 775, 38, 780, 37, 784, 38, 790, 37, 793, 38, 799, 39, 820, 40, 825, 39, 852, 37, 866, 39, 877, 38, 896, 37, 905, 38, 909, 37, 914, 38, 918, 37, 928, 90, 938, 37, 973, 39, 978, 88, 988, 39, 1004, 37, 1095, 38, 1108, 37, 1118, 90, 1129, 39, 1134, 90, 1175, 39, 1180, 90, 1190, 39, 1311, 38, 1350, 39, 1394, 38, 1400, 90, 1437, 38, 1443, 90, 1457, 40, 1463, 90, 1474, 38, 1483, 90, 1496, 40, 1510, 37, 1529, 40, 1546, 39, 1568, 40, 1574, 38, 1621, 37, 1630, 38, 1635, 37, 1638, 38, 1645, 37, 1650, 38, 1655, 37, 1659, 38, 1665, 37, 1740, 40, 1747, 39, 1787, 40, 1814, 37, 1862, 38, 1875, 37, 1886, 90, 1899, 39, 1903, 90, 1972, 37, 1979, 39, 2059, 88, 2103, 39, 2119, 40, 2156, 38, 2171, 39, 2201, 38, 2241, 37, 2250, 38, 2256, 37, 2259, 38, 2265, 37, 2268, 38, 2274, 37, 2277, 38 ], //140 goldDrop: [ 24, 29, 36 ], bornPos: [ 1, 25, 11, 26, 14, 12 ] }, { level: 44, ai: 4, time: 559, state: 1, godMode: 0, action: [ 0, 39, 27, 40, 43, 37, 68, 38, 98, 40, 105, 39, 171, 38, 177, 39, 202, 38, 223, 39, 330, 38, 349, 39, 360, 38, 371, 90, 383, 39, 387, 90, 451, 37, 465, 40, 496, 39, 519, 38 ], //20 goldDrop: [ 35, 25 ], bornPos: [ ] }, { level: 48, ai: 4, time: 1711, state: 1, godMode: 0, action: [ 0, 37, 59, 38, 69, 39, 87, 38, 97, 37, 115, 38, 125, 39, 143, 38, 153, 37, 172, 88, 184, 39, 197, 37, 204, 40, 214, 88, 223, 39, 236, 37, 244, 40, 255, 88, 265, 39, 291, 37, 307, 40, 318, 39, 329, 37, 389, 38, 399, 39, 405, 38, 409, 39, 413, 38, 417, 39, 421, 38, 426, 39, 429, 38, 431, 39, 435, 38, 437, 39, 440, 38, 444, 39, 452, 38, 488, 88, 531, 39, 565, 38, 609, 39, 645, 38, 660, 37, 680, 39, 717, 37, 734, 40, 749, 39, 761, 88, 796, 39, 809, 40, 846, 37, 896, 38, 914, 39, 956, 40, 966, 37, 983, 39, 1001, 38, 1012, 37, 1052, 40, 1091, 38, 1098, 39, 1201, 40, 1208, 39, 1259, 38, 1265, 39, 1323, 38, 1350, 90, 1376, 37, 1411, 90, 1442, 37, 1519, 38, 1530, 37, 1551, 38, 1561, 39, 1581, 38, 1591, 37, 1611, 38, 1621, 39, 1641, 38, 1651, 37, 1671, 38, 1681, 39, 1701, 38 ], //84 goldDrop: [ 36 ], bornPos: [ 1, 23 ] }, { level: 60, ai: 4, time: 908, state: 0, godMode: 0, action: [ 0, 39, 5, 88, 15, 39, 36, 88, 45, 39, 85, 88, 107, 39, 113, 90, 122, 37, 136, 39, 149, 88, 159, 39, 203, 40, 220, 37, 230, 40, 270, 38, 292, 40, 315, 39, 335, 38, 409, 37, 423, 90, 434, 37, 477, 88, 497, 39, 509, 37, 521, 39, 532, 40, 561, 39, 591, 38, 659, 37, 714, 88, 726, 39, 746, 90, 772, 37, 820, 39, 858, 38, 867, 39, 881, 40, 889, 39 ], //39 goldDrop: [ 29, 16, 23, 26 ], bornPos: [ ] }, { level: 64, ai: 4, time: 2974, state: 1, godMode: 0, action: [ 0, 39, 15, 37, 48, 88, 57, 37, 65, 88, 76, 37, 80, 88, 89, 37, 95, 88, 105, 37, 110, 88, 120, 37, 126, 88, 135, 37, 141, 88, 150, 37, 156, 88, 166, 37, 172, 88, 180, 37, 194, 38, 208, 39, 253, 38, 263, 37, 304, 38, 314, 39, 430, 40, 439, 37, 474, 39, 508, 38, 519, 37, 563, 38, 572, 39, 606, 38, 615, 37, 640, 38, 650, 39, 671, 37, 771, 39, 780, 90, 790, 39, 796, 90, 805, 39, 811, 90, 821, 39, 827, 90, 837, 39, 844, 90, 855, 39, 862, 90, 872, 39, 877, 90, 887, 39, 892, 90, 1093, 37, 1133, 88, 1145, 37, 1149, 88, 1159, 37, 1165, 88, 1173, 37, 1180, 88, 1190, 37, 1198, 88, 1207, 37, 1214, 88, 1223, 37, 1230, 88, 1238, 37, 1262, 38, 1276, 39, 1322, 38, 1332, 37, 1373, 38, 1384, 39, 1414, 38, 1422, 37, 1443, 38, 1454, 39, 1509, 37, 1520, 40, 1530, 37, 1573, 40, 1588, 39, 1596, 88, 1631, 39, 1642, 88, 1652, 37, 1660, 88, 1670, 37, 1681, 88, 1693, 37, 1698, 88, 1709, 38, 1724, 39, 1787, 37, 1813, 90, 1823, 39, 1828, 90, 1841, 39, 1845, 90, 1856, 39, 1869, 90, 1879, 39, 1885, 90, 1895, 39, 1901, 90, 1911, 39, 1918, 90, 1928, 39, 1934, 90, 2134, 90, 2180, 37, 2203, 88, 2214, 37, 2220, 88, 2230, 37, 2235, 88, 2245, 37, 2251, 88, 2261, 37, 2266, 88, 2276, 37, 2281, 88, 2484, 39, 2517, 37, 2525, 88, 2539, 37, 2543, 88, 2557, 37, 2561, 88, 2706, 39, 2722, 37, 2777, 38, 2790, 39, 2846, 38, 2852, 90, 2860, 38, 2903, 39, 2969, 38 ], //140 goldDrop: [ 34, 16, 28, 29, 37, 13, 14, 21, 14, 18, 25, 13, 14, 14, 16, 14, 24, 24, 32, 12, 15, 29, 26, 28, 18, 35 ], bornPos: [ 1, 13, 22, 26, 24, 23, 21, 18, 2, 5, 7, 19, 1, 3, 25, 9, 20, 4, 3, 16 ] }, { level: 95, ai: 4, time: 1384, state: 1, godMode: 0, action: [ 0, 37, 62, 39, 90, 37, 107, 38, 141, 90, 191, 37, 206, 38, 236, 37, 240, 38, 260, 37, 281, 38, 424, 40, 454, 39, 520, 38, 531, 39, 540, 38, 547, 90, 634, 37, 644, 38, 674, 37, 679, 38, 698, 37, 764, 40, 785, 37, 791, 90, 801, 39, 833, 37, 847, 38, 856, 37, 876, 38, 912, 39, 961, 38, 1006, 37, 1064, 40, 1106, 37, 1113, 38, 1123, 88, 1208, 39, 1222, 40, 1233, 39, 1241, 37, 1250, 38, 1260, 37, 1275, 38, 1290, 39, 1297, 38, 1303, 39, 1319, 38, 1344, 37, 1364, 38 ], //50 goldDrop: [ 16, 18, 17, 22, 35, 26 ], bornPos: [ ] }, { level: 114, ai: 4, time: 1845, state: 1, godMode: 0, action: [ 0, 39, 6, 38, 46, 40, 59, 38, 67, 39, 75, 88, 101, 39, 110, 38, 167, 39, 173, 37, 176, 38, 181, 39, 191, 37, 201, 38, 207, 39, 240, 90, 251, 40, 258, 90, 268, 39, 273, 90, 284, 37, 294, 90, 305, 39, 313, 37, 351, 39, 362, 90, 372, 39, 377, 90, 388, 40, 396, 37, 401, 90, 410, 39, 417, 90, 428, 39, 433, 90, 443, 40, 451, 37, 461, 90, 471, 37, 545, 38, 566, 90, 633, 37, 667, 38, 735, 37, 745, 90, 757, 40, 763, 90, 773, 39, 777, 90, 785, 39, 789, 90, 799, 37, 810, 90, 821, 39, 825, 90, 837, 39, 842, 90, 851, 37, 867, 90, 877, 39, 883, 90, 895, 39, 900, 90, 909, 37, 925, 90, 936, 39, 941, 90, 953, 39, 958, 90, 967, 37, 984, 90, 994, 39, 1000, 90, 1012, 39, 1018, 90, 1027, 37, 1044, 90, 1054, 39, 1060, 90, 1072, 39, 1078, 90, 1089, 37, 1104, 90, 1114, 39, 1121, 90, 1134, 39, 1139, 90, 1147, 37, 1164, 90, 1175, 39, 1181, 90, 1193, 39, 1199, 90, 1209, 37, 1235, 39, 1241, 90, 1253, 39, 1258, 90, 1270, 39, 1274, 90, 1286, 39, 1290, 90, 1300, 37, 1330, 39, 1355, 38, 1403, 39, 1419, 88, 1429, 37, 1434, 88, 1445, 37, 1450, 88, 1459, 39, 1476, 88, 1486, 37, 1492, 88, 1502, 39, 1511, 88, 1520, 39, 1570, 37, 1594, 39, 1619, 38, 1623, 39, 1661, 37, 1673, 39, 1681, 90, 1692, 39, 1696, 90, 1751, 37, 1767, 38, 1786, 37, 1791, 39, 1796, 38 ], //132 goldDrop: [ 15, 22, 34 ], bornPos: [ ] }, { level: 118, ai: 4, time: 686, state: 0, godMode: 0, action: [ 0, 39, 30, 88, 41, 37, 69, 88, 80, 37, 83, 88, 95, 90, 134, 39, 145, 38, 160, 37, 164, 38, 194, 39, 198, 38, 207, 37, 262, 40, 289, 39, 354, 88, 386, 39, 401, 38, 415, 37, 420, 38, 449, 39, 454, 38, 462, 37, 520, 40, 528, 37, 566, 40, 582, 88, 595, 37, 599, 88, 610, 37, 615, 88, 671, 39 ], //33 goldDrop: [ 22, 19, 16 ], bornPos: [ 1, 0 ] }, { level: 118, ai: 4, time: 2640, state: 1, godMode: 0, action: [ 0, 39, 31, 88, 46, 37, 56, 38, 76, 39, 80, 90, 95, 39, 110, 37, 139, 38, 155, 37, 159, 38, 189, 39, 194, 38, 206, 37, 264, 40, 272, 39, 357, 88, 369, 37, 374, 88, 410, 39, 430, 38, 445, 37, 448, 38, 478, 39, 482, 38, 493, 37, 546, 40, 561, 39, 651, 38, 665, 37, 669, 38, 698, 39, 703, 38, 713, 37, 778, 40, 800, 37, 814, 40, 833, 39, 842, 88, 854, 37, 858, 88, 869, 37, 874, 88, 927, 39, 1001, 38, 1016, 37, 1019, 38, 1049, 39, 1054, 38, 1065, 37, 1115, 40, 1150, 39, 1217, 38, 1231, 37, 1235, 38, 1264, 39, 1268, 38, 1279, 37, 1350, 40, 1402, 39, 1408, 88, 1419, 37, 1424, 88, 1475, 39, 1501, 88, 1533, 39, 1578, 38, 1593, 37, 1597, 38, 1618, 39, 1633, 38, 1634, 90, 1645, 39, 1664, 40, 1678, 39, 1700, 40, 1710, 37, 1746, 90, 1767, 37, 1780, 38, 1795, 37, 1800, 38, 1831, 39, 1835, 38, 1844, 37, 1919, 40, 1972, 39, 1985, 88, 1997, 37, 2001, 88, 2045, 39, 2076, 88, 2104, 39, 2144, 38, 2159, 37, 2162, 38, 2192, 39, 2196, 38, 2206, 37, 2246, 40, 2293, 37, 2304, 88, 2330, 39, 2374, 38, 2389, 37, 2392, 38, 2422, 39, 2425, 38, 2436, 37, 2480, 40, 2530, 39, 2579, 38, 2595, 37, 2598, 38, 2627, 39, 2630, 38 ], //116 goldDrop: [ 31, 17, 12, 13 ], bornPos: [ 1, 0, 27, 15, 10 ] } ]; ================================================ FILE: lodeRunner.demoData2.js ================================================ var demoData2 = [ { level: 1, ai:1, time: 7396, state: 1, action: [0, 37, 46, 88, 59, 40, 64, 88, 75, 40, 80, 88, 91, 40, 95, 88, 268, 40, 273, 88, 286, 38, 305, 39, 316, 38, 320, 39, 403, 37, 474, 38, 490, 39, 506, 38, 525, 37, 796, 38, 870, 39, 1013, 40, 1024, 39, 1038, 40, 1048, 39, 1057, 40, 1064, 39, 1072, 40, 1078, 39, 1087, 40, 1091, 39, 1109, 38, 1122, 40, 1128, 39, 1177, 40, 1192, 90, 1236, 37, 1243, 39, 1252, 38, 1294, 37, 1304, 38, 1394, 40, 1426, 39, 1439, 39, 1440, 39, 1441, 39, 1445, 38, 1484, 37, 1499, 40, 1533, 39, 1548, 40, 1557, 39, 1565, 37, 1575, 88, 1617, 39, 1628, 38, 1673, 37, 1694, 38, 1794, 40, 1819, 39, 1833, 39, 1834, 39, 1835, 39, 1836, 39, 1837, 39, 1838, 39, 1839, 39, 1840, 39, 1841, 39, 1842, 39, 1843, 39, 1853, 38, 1892, 37, 1918, 38, 2009, 40, 2038, 39, 2052, 39, 2053, 39, 2054, 39, 2055, 39, 2056, 39, 2057, 39, 2058, 39, 2059, 39, 2060, 39, 2061, 39, 2062, 39, 2063, 39, 2064, 39, 2072, 38, 2111, 37, 2151, 38, 2280, 40, 2317, 39, 2361, 38, 2399, 37, 2449, 38, 2594, 40, 2619, 39, 2633, 39, 2634, 39, 2635, 39, 2636, 39, 2637, 39, 2638, 39, 2639, 39, 2640, 39, 2641, 39, 2698, 40, 2702, 90, 2773, 37, 2781, 39, 2792, 38, 2835, 37, 2894, 38, 3015, 40, 3039, 39, 3114, 38, 3154, 37, 3219, 38, 3377, 40, 3403, 39, 3417, 39, 3418, 39, 3419, 39, 3420, 39, 3421, 39, 3422, 39, 3423, 39, 3424, 39, 3425, 39, 3426, 39, 3427, 39, 3482, 38, 3524, 37, 3598, 38, 3724, 40, 3756, 37, 3830, 38, 3870, 39, 3930, 38, 4083, 40, 4121, 37, 4183, 38, 4221, 39, 4272, 38, 4433, 40, 4461, 37, 4475, 37, 4476, 37, 4477, 37, 4478, 37, 4479, 37, 4480, 37, 4481, 37, 4521, 38, 4561, 39, 4607, 38, 4745, 40, 4774, 37, 4831, 38, 4872, 39, 4913, 38, 5038, 40, 5069, 37, 5120, 38, 5159, 39, 5194, 38, 5310, 40, 5343, 37, 5386, 38, 5427, 39, 5453, 38, 5552, 40, 5578, 37, 5617, 38, 5656, 39, 5676, 38, 5757, 40, 5784, 37, 5798, 37, 5799, 37, 5800, 37, 5801, 37, 5802, 37, 5803, 37, 5804, 37, 5812, 38, 5851, 39, 5865, 38, 5945, 40, 5975, 37, 5999, 38, 6038, 39, 6049, 38, 6122, 40, 6157, 37, 6171, 40, 6177, 88, 6227, 39, 6233, 37, 6241, 38, 6285, 39, 6383, 40, 6395, 39, 6409, 39, 6410, 39, 6411, 39, 6412, 39, 6413, 39, 6414, 39, 6415, 39, 6416, 39, 6417, 39, 6418, 39, 6419, 39, 6420, 39, 6421, 39, 6422, 39, 6423, 39, 6424, 39, 6425, 39, 6426, 39, 6427, 39, 6428, 39, 6429, 39, 6430, 39, 6431, 39, 6432, 39, 6433, 39, 6434, 39, 6435, 39, 6436, 39, 6437, 39, 6438, 39, 6439, 39, 6440, 39, 6441, 39, 6442, 39, 6443, 39, 6444, 39, 6445, 39, 6446, 39, 6447, 39, 6448, 39, 6454, 38, 6467, 90, 6472, 39, 6682, 38, 6696, 38, 6697, 38, 6698, 38, 6699, 38, 6700, 38, 6701, 38, 6702, 38, 6703, 38, 6704, 38, 6705, 38, 6706, 38, 6707, 38, 6739, 40, 6801, 39, 6900, 38, 6910, 90, 6921, 40, 6927, 90, 6939, 40, 6943, 90, 6954, 40, 6960, 90, 7129, 40, 7132, 90, 7142, 38, 7165, 37, 7245, 39, 7319, 38], //277 goldDrop: [35, 30, 36] }, { level: 2, ai:1, time: 11607, state: 1, action: [0, 39, 17, 38, 41, 37, 61, 38, 139, 40, 176, 37, 184, 40, 205, 37, 214, 40, 242, 39, 279, 38, 338, 37, 489, 40, 502, 40, 503, 40, 504, 40, 505, 40, 506, 40, 507, 40, 508, 40, 509, 40, 552, 39, 600, 38, 804, 37, 835, 38, 851, 40, 868, 37, 965, 40, 988, 37, 992, 38, 1007, 40, 1047, 37, 1071, 39, 1143, 38, 1200, 37, 1316, 40, 1330, 37, 1365, 38, 1398, 39, 1430, 37, 1434, 38, 1496, 39, 1534, 37, 1554, 38, 1616, 40, 1630, 40, 1631, 40, 1632, 40, 1633, 40, 1634, 40, 1635, 40, 1636, 40, 1637, 40, 1638, 40, 1639, 40, 1640, 40, 1649, 37, 1749, 38, 1833, 39, 1863, 40, 1874, 37, 1882, 40, 1895, 39, 1909, 39, 1926, 38, 1960, 39, 1983, 38, 2089, 39, 2114, 40, 2127, 37, 2252, 40, 2264, 37, 2275, 38, 2276, 39, 2296, 37, 2302, 38, 2320, 40, 2357, 37, 2367, 40, 2393, 37, 2455, 38, 2510, 39, 2575, 38, 2759, 40, 2795, 37, 2811, 39, 2834, 37, 2848, 38, 2860, 40, 2873, 38, 2980, 39, 3005, 37, 3031, 40, 3038, 37, 3047, 37, 3185, 39, 3190, 38, 3227, 40, 3232, 90, 3394, 39, 3405, 37, 3412, 38, 3420, 39, 3434, 37, 3446, 40, 3460, 40, 3461, 40, 3462, 40, 3463, 40, 3464, 40, 3465, 40, 3466, 40, 3467, 40, 3468, 40, 3469, 40, 3470, 40, 3471, 40, 3472, 40, 3473, 40, 3474, 40, 3482, 37, 3577, 38, 3634, 39, 3694, 38, 3698, 38, 3706, 39, 3708, 38, 3722, 39, 3724, 38, 3862, 37, 3899, 39, 3906, 40, 3915, 37, 4057, 40, 4102, 37, 4108, 40, 4120, 39, 4239, 38, 4463, 37, 4521, 39, 4531, 38, 4584, 40, 4605, 37, 4662, 39, 4671, 38, 4684, 37, 4690, 40, 4744, 39, 4785, 38, 4800, 40, 4842, 38, 5018, 37, 5047, 38, 5189, 40, 5210, 37, 5307, 40, 5358, 39, 5511, 38, 5590, 37, 5616, 38, 5834, 40, 5855, 37, 5897, 40, 5912, 37, 5944, 38, 5955, 40, 5969, 38, 5976, 37, 5988, 39, 5999, 37, 6006, 39, 6015, 37, 6025, 39, 6036, 38, 6081, 40, 6086, 39, 6098, 40, 6109, 37, 6240, 39, 6248, 38, 6270, 37, 6275, 38, 6285, 37, 6302, 39, 6312, 37, 6327, 39, 6343, 90, 6449, 40, 6454, 37, 6551, 39, 6563, 40, 6583, 37, 6597, 37, 6598, 37, 6667, 38, 6728, 39, 6772, 40, 6775, 39, 6810, 37, 6828, 39, 6845, 38, 6922, 39, 7021, 40, 7035, 40, 7036, 40, 7037, 40, 7038, 40, 7039, 40, 7040, 40, 7041, 40, 7042, 40, 7043, 40, 7044, 40, 7045, 40, 7046, 40, 7047, 40, 7048, 40, 7049, 40, 7050, 40, 7051, 40, 7052, 40, 7053, 40, 7054, 40, 7055, 40, 7056, 40, 7057, 40, 7058, 40, 7059, 40, 7060, 40, 7061, 40, 7062, 40, 7063, 40, 7064, 40, 7065, 40, 7066, 40, 7067, 40, 7068, 40, 7069, 40, 7070, 40, 7079, 37, 7195, 38, 7268, 40, 7286, 39, 7349, 38, 7587, 40, 7611, 37, 7685, 40, 7690, 39, 7808, 40, 7820, 37, 7830, 40, 7844, 40, 7845, 40, 7846, 40, 7847, 40, 7848, 40, 7849, 40, 7850, 40, 7851, 40, 7852, 40, 7853, 40, 7854, 40, 7855, 40, 7863, 37, 7877, 37, 7878, 37, 7879, 37, 7880, 37, 7881, 37, 7882, 37, 7883, 37, 7884, 37, 8004, 38, 8060, 39, 8129, 38, 8141, 37, 8144, 38, 8365, 40, 8447, 39, 8741, 38, 8776, 40, 8792, 39, 8804, 40, 8809, 39, 8820, 40, 8825, 39, 9155, 38, 9202, 37, 9303, 40, 9315, 37, 9355, 38, 9376, 39, 9385, 38, 9449, 40, 9463, 40, 9464, 40, 9465, 40, 9466, 40, 9467, 40, 9468, 40, 9469, 40, 9470, 40, 9471, 40, 9472, 40, 9473, 40, 9474, 40, 9475, 40, 9476, 40, 9477, 40, 9478, 40, 9485, 39, 9685, 38, 9747, 40, 9800, 39, 10232, 40, 10246, 40, 10451, 38, 10681, 37, 10713, 38, 10788, 39, 10792, 40, 10814, 37, 10832, 40, 10846, 37, 10884, 40, 10889, 37, 11018, 39, 11027, 40, 11049, 37, 11169, 38, 11224, 39, 11250, 38, 11371, 40, 11430, 37, 11456, 38, 11513, 39, 11579, 38], //337 goldDrop: [38, 31, 35, 19, 14, 15, 24, 27, 27, 30, 33, 25, 28, 28, 22, 32, 14, 23, 14, 31] }, { level: 3, ai:1, time: 3536, state: 1, action: [0, 37, 25, 40, 41, 37, 55, 37, 56, 37, 57, 37, 58, 37, 59, 37, 64, 38, 79, 37, 92, 37, 93, 37, 94, 37, 95, 37, 96, 37, 105, 40, 118, 40, 119, 40, 120, 40, 121, 40, 122, 40, 131, 38, 145, 38, 146, 38, 147, 38, 148, 38, 149, 38, 150, 38, 151, 38, 156, 40, 169, 37, 178, 40, 192, 40, 195, 39, 208, 39, 209, 39, 210, 39, 211, 39, 212, 39, 213, 39, 214, 39, 215, 39, 216, 39, 217, 39, 218, 39, 330, 40, 342, 37, 356, 40, 372, 39, 388, 40, 402, 40, 403, 40, 404, 40, 405, 40, 411, 37, 451, 39, 465, 38, 487, 37, 494, 38, 509, 37, 543, 40, 561, 37, 576, 38, 593, 40, 603, 38, 609, 39, 625, 37, 630, 38, 651, 40, 665, 37, 679, 37, 680, 37, 681, 37, 689, 38, 706, 37, 731, 40, 753, 39, 778, 38, 787, 37, 799, 39, 809, 40, 829, 38, 848, 39, 859, 40, 863, 37, 870, 40, 883, 40, 941, 37, 944, 40, 956, 39, 970, 39, 971, 39, 972, 39, 973, 39, 974, 39, 976, 39, 993, 40, 1002, 39, 1034, 90, 1172, 37, 1240, 39, 1249, 37, 1266, 38, 1281, 39, 1284, 40, 1297, 40, 1348, 37, 1395, 38, 1417, 40, 1431, 40, 1440, 39, 1447, 37, 1457, 38, 1482, 39, 1495, 39, 1496, 40, 1509, 40, 1510, 40, 1511, 40, 1512, 40, 1513, 40, 1514, 40, 1518, 39, 1532, 39, 1533, 39, 1534, 39, 1543, 40, 1549, 39, 1592, 90, 1625, 38, 1649, 40, 1669, 38, 1684, 40, 1758, 37, 1828, 38, 1845, 39, 1856, 40, 1954, 37, 1960, 40, 1969, 39, 1983, 39, 1984, 39, 2036, 40, 2048, 90, 2229, 37, 2280, 40, 2290, 37, 2304, 38, 2316, 39, 2337, 38, 2342, 39, 2347, 40, 2447, 37, 2451, 40, 2459, 39, 2472, 40, 2476, 39, 2543, 40, 2594, 90, 2631, 38, 2648, 40, 2659, 38, 2671, 40, 2682, 38, 2699, 40, 2775, 37, 2840, 38, 2849, 39, 2880, 37, 2901, 38, 2908, 39, 2924, 37, 2939, 40, 2945, 39, 2962, 38, 2970, 39, 2974, 40, 3063, 37, 3094, 40, 3182, 38, 3196, 38, 3201, 39, 3214, 39, 3216, 39, 3217, 39, 3218, 39, 3219, 39, 3220, 39, 3221, 39, 3222, 39, 3223, 39, 3224, 39, 3225, 39, 3226, 39, 3227, 39, 3228, 39, 3229, 39, 3230, 39, 3231, 39, 3232, 39, 3308, 40, 3319, 39, 3335, 38, 3343, 39, 3352, 38, 3392, 37, 3508, 38], //207 goldDrop: [24, 22, 16, 24], bornPos: [1, 26, 27, 25] }, { level: 4, ai: 1, time: 2124, state: 1, action: [ 0, 37, 36, 38, 58, 39, 106, 38, 114, 39, 145, 88, 156, 37, 162, 88, 193, 37, 198, 88, 220, 39, 262, 37, 316, 38, 421, 40, 427, 38, 445, 40, 452, 39, 571, 38, 578, 39, 590, 88, 601, 37, 606, 88, 617, 37, 621, 88, 633, 40, 655, 39, 662, 37, 668, 88, 716, 39, 724, 37, 840, 37, 847, 38, 869, 39, 916, 38, 923, 39, 1017, 38, 1039, 37, 1094, 38, 1102, 37, 1122, 90, 1168, 39, 1171, 90, 1208, 37, 1250, 39, 1406, 38, 1413, 37, 1418, 90, 1430, 39, 1434, 90, 1446, 40, 1464, 39, 1546, 38, 1570, 37, 1625, 38, 1655, 37, 1742, 38, 1766, 39, 1824, 38, 1831, 39, 1846, 37, 1855, 38, 2023, 39, 2025, 88, 2100, 39, 2106, 37, 2113, 38 ], //66 goldDrop: [ 38, 20 ] }, { level: 5, ai:1, time: 6878, state: 1, action: [0, 40, 288, 38, 293, 39, 347, 88, 356, 37, 359, 88, 371, 37, 376, 88, 388, 37, 393, 88, 406, 37, 411, 88, 423, 37, 429, 88, 441, 37, 447, 88, 459, 37, 464, 88, 477, 37, 482, 88, 496, 37, 500, 88, 515, 37, 518, 88, 535, 37, 550, 88, 623, 40, 637, 40, 638, 40, 639, 40, 640, 40, 641, 40, 642, 40, 643, 40, 644, 40, 645, 40, 646, 40, 647, 40, 648, 40, 649, 40, 650, 40, 651, 40, 652, 40, 776, 38, 783, 39, 835, 88, 844, 37, 851, 88, 862, 37, 868, 88, 880, 37, 885, 88, 898, 37, 902, 88, 916, 37, 919, 88, 932, 37, 937, 88, 949, 37, 954, 88, 967, 37, 972, 88, 985, 37, 989, 88, 1012, 37, 1018, 88, 1115, 40, 1137, 38, 1159, 39, 1181, 38, 1217, 90, 1265, 37, 1285, 40, 1295, 39, 1438, 40, 1446, 39, 1497, 88, 1506, 37, 1514, 88, 1524, 37, 1530, 88, 1540, 37, 1546, 88, 1558, 37, 1564, 88, 1575, 37, 1581, 88, 1592, 37, 1598, 88, 1610, 37, 1615, 88, 1629, 37, 1634, 88, 1644, 37, 1649, 88, 1661, 37, 1666, 88, 1773, 38, 1806, 39, 1830, 38, 1897, 90, 1964, 37, 1991, 40, 2000, 39, 2127, 40, 2141, 40, 2142, 40, 2143, 40, 2144, 40, 2145, 40, 2146, 40, 2147, 40, 2148, 40, 2149, 40, 2150, 40, 2151, 40, 2152, 40, 2153, 40, 2154, 40, 2155, 40, 2156, 40, 2157, 40, 2158, 40, 2159, 40, 2160, 40, 2161, 40, 2162, 40, 2163, 40, 2164, 40, 2322, 38, 2339, 40, 2373, 38, 2396, 40, 2433, 38, 2442, 39, 2453, 40, 2456, 39, 2509, 88, 2519, 37, 2522, 88, 2533, 37, 2539, 88, 2550, 37, 2556, 88, 2567, 37, 2574, 88, 2585, 37, 2591, 88, 2601, 37, 2608, 88, 2619, 37, 2626, 88, 2637, 37, 2643, 88, 2654, 37, 2660, 88, 2672, 37, 2678, 88, 2687, 37, 2694, 88, 2782, 38, 2829, 39, 2851, 38, 2971, 90, 3018, 37, 3039, 40, 3048, 39, 3190, 40, 3204, 40, 3478, 38, 3484, 39, 3535, 88, 3545, 37, 3552, 88, 3563, 37, 3570, 88, 3582, 37, 3588, 88, 3601, 37, 3606, 88, 3617, 37, 3623, 88, 3635, 37, 3640, 88, 3652, 37, 3657, 88, 3669, 37, 3674, 88, 3685, 37, 3690, 88, 3700, 37, 3706, 88, 3791, 38, 3860, 39, 3876, 38, 3918, 39, 3927, 38, 3937, 37, 3947, 38, 4015, 90, 4056, 37, 4070, 40, 4080, 39, 4241, 38, 4262, 39, 4333, 37, 4339, 88, 4350, 37, 4416, 40, 4430, 39, 4496, 37, 4503, 88, 4513, 37, 4576, 40, 4588, 39, 4600, 40, 4604, 39, 4665, 37, 4672, 88, 4681, 37, 4741, 40, 4756, 39, 4811, 37, 4817, 88, 4827, 37, 4879, 40, 4894, 39, 5029, 38, 5096, 90, 5107, 40, 5112, 90, 5123, 40, 5128, 90, 5141, 40, 5145, 90, 5158, 40, 5162, 90, 5174, 40, 5179, 90, 5191, 40, 5196, 90, 5208, 40, 5213, 90, 5226, 40, 5230, 90, 5244, 40, 5248, 90, 5260, 37, 5278, 39, 5290, 38, 5347, 37, 5387, 90, 5399, 39, 5404, 90, 5416, 39, 5421, 90, 5433, 39, 5439, 90, 5451, 39, 5457, 90, 5468, 39, 5474, 90, 5485, 39, 5490, 90, 5497, 37, 5535, 90, 5546, 39, 5551, 90, 5563, 39, 5568, 90, 5581, 39, 5586, 90, 5597, 39, 5603, 90, 5612, 39, 5622, 90, 5631, 37, 5654, 90, 5667, 39, 5671, 90, 5685, 39, 5689, 90, 5702, 37, 5718, 90, 5728, 39, 5735, 90, 5748, 37, 5768, 88, 5780, 40, 5786, 88, 5799, 40, 5803, 88, 5817, 40, 5822, 88, 5834, 40, 5839, 88, 5852, 40, 5857, 88, 5873, 40, 5881, 39, 5897, 90, 5908, 37, 5918, 39, 5963, 38, 6028, 37, 6048, 88, 6059, 37, 6066, 88, 6076, 37, 6082, 88, 6094, 37, 6100, 88, 6111, 37, 6117, 88, 6128, 37, 6134, 88, 6145, 37, 6151, 88, 6161, 39, 6190, 88, 6201, 37, 6208, 88, 6219, 37, 6225, 88, 6237, 37, 6243, 88, 6254, 37, 6262, 88, 6273, 39, 6293, 88, 6302, 37, 6310, 88, 6322, 37, 6329, 88, 6337, 39, 6354, 88, 6367, 39, 6384, 90, 6395, 40, 6401, 90, 6414, 40, 6418, 90, 6432, 40, 6436, 90, 6450, 40, 6454, 90, 6467, 40, 6471, 90, 6490, 40, 6501, 90, 6514, 37, 6525, 39, 6554, 38, 6620, 37, 6666, 90, 6681, 37, 6746, 39, 6801, 38], //358 bornPos: [1, 27, 27] }, { level: 6, ai:1, time: 6375, state: 1, action: [0, 39, 6, 38, 24, 37, 138, 40, 173, 39, 182, 38, 196, 37, 211, 39, 218, 38, 231, 39, 236, 38, 320, 39, 337, 37, 374, 38, 459, 39, 596, 40, 611, 90, 622, 38, 640, 37, 655, 40, 708, 37, 716, 39, 730, 38, 744, 38, 756, 39, 769, 39, 770, 39, 771, 39, 772, 39, 773, 39, 774, 39, 775, 39, 776, 39, 777, 39, 778, 39, 779, 39, 780, 39, 781, 39, 782, 39, 783, 39, 784, 39, 785, 39, 833, 39, 837, 38, 847, 90, 887, 38, 953, 40, 969, 38, 976, 90, 987, 38, 1007, 37, 1058, 39, 1072, 38, 1105, 40, 1131, 37, 1135, 88, 1207, 39, 1220, 39, 1246, 37, 1322, 39, 1401, 39, 1493, 38, 1573, 40, 1585, 38, 1600, 40, 1614, 38, 1622, 39, 1632, 40, 1641, 39, 1652, 90, 1667, 37, 1686, 88, 1762, 39, 1777, 38, 1812, 37, 1857, 38, 1887, 39, 1896, 40, 1920, 39, 1923, 90, 1962, 37, 1984, 39, 2037, 39, 2068, 38, 2152, 37, 2213, 39, 2224, 38, 2272, 37, 2279, 40, 2297, 39, 2320, 37, 2358, 39, 2429, 38, 2514, 37, 2655, 40, 2687, 88, 2699, 38, 2733, 39, 2815, 38, 3000, 40, 3021, 90, 3078, 37, 3084, 39, 3109, 37, 3149, 39, 3162, 39, 3163, 39, 3331, 38, 3475, 37, 3539, 40, 3551, 39, 3595, 37, 3718, 39, 3725, 90, 3734, 39, 3748, 39, 3749, 39, 3750, 39, 3812, 38, 3895, 37, 3951, 38, 4310, 40, 4360, 39, 4383, 37, 4419, 39, 4491, 38, 4575, 37, 4668, 40, 4692, 39, 4696, 40, 4710, 37, 4720, 39, 4743, 37, 4760, 39, 4765, 88, 4774, 37, 4826, 39, 4853, 37, 4856, 88, 4869, 37, 4875, 38, 4905, 39, 4914, 38, 4958, 39, 4972, 39, 4973, 39, 4992, 90, 5006, 37, 5009, 90, 5017, 39, 5034, 37, 5059, 39, 5111, 38, 5196, 37, 5269, 39, 5287, 38, 5657, 40, 5675, 90, 5739, 37, 5743, 39, 5753, 38, 5765, 39, 5776, 37, 5813, 39, 5827, 39, 5828, 39, 5829, 39, 5894, 38, 5983, 37, 6073, 40, 6085, 90, 6103, 37, 6114, 39, 6146, 90, 6159, 39, 6164, 90, 6178, 37, 6185, 39, 6230, 37, 6292, 38], //180 goldDrop: [29, 35, 27, 35, 23] }, { level: 7, ai:1, time: 10949, state: 1, action: [0, 38, 4, 38, 9, 38, 14, 38, 19, 38, 29, 38, 81, 37, 95, 37, 96, 37, 97, 37, 140, 38, 222, 39, 241, 38, 284, 39, 287, 38, 395, 39, 399, 38, 600, 40, 651, 39, 902, 37, 918, 39, 936, 37, 986, 38, 1073, 39, 1099, 38, 1469, 40, 1516, 39, 1597, 37, 1615, 39, 1638, 37, 1665, 38, 1751, 39, 1810, 40, 1833, 37, 1857, 39, 1874, 37, 1878, 90, 1888, 39, 1948, 37, 1973, 39, 1981, 37, 1992, 39, 2000, 90, 2009, 39, 2042, 37, 2050, 39, 2084, 37, 2095, 39, 2167, 37, 2181, 39, 2228, 38, 2234, 39, 2325, 38, 2411, 37, 2464, 38, 2480, 39, 2496, 38, 2541, 39, 2548, 38, 2847, 40, 2890, 38, 3020, 39, 3041, 39, 3081, 37, 3097, 39, 3140, 38, 3187, 40, 3262, 38, 3348, 37, 3460, 38, 3488, 39, 3490, 38, 3665, 40, 3706, 39, 3711, 39, 3724, 39, 3725, 39, 3726, 39, 3757, 37, 3771, 39, 3830, 38, 3837, 39, 3891, 37, 3898, 39, 3935, 37, 4039, 38, 4052, 37, 4142, 38, 4226, 39, 4291, 38, 4306, 40, 4337, 37, 4378, 39, 4386, 90, 4397, 39, 4452, 37, 4485, 39, 4491, 90, 4501, 39, 4603, 37, 4638, 39, 4695, 38, 4702, 39, 4710, 88, 4762, 39, 4891, 38, 4977, 37, 5018, 38, 5046, 39, 5064, 38, 5139, 37, 5144, 38, 5400, 40, 5441, 38, 5511, 39, 5545, 37, 5564, 39, 5596, 38, 5657, 39, 5668, 40, 5675, 39, 5685, 40, 5706, 38, 5723, 40, 5740, 38, 5791, 37, 5852, 40, 5871, 39, 5896, 37, 5904, 88, 5913, 37, 5934, 39, 5941, 38, 5983, 39, 6007, 37, 6024, 39, 6027, 88, 6038, 37, 6052, 37, 6082, 39, 6088, 38, 6137, 39, 6151, 38, 6201, 39, 6215, 37, 6263, 38, 6269, 37, 6417, 38, 6500, 39, 6516, 40, 6571, 37, 6613, 38, 6696, 39, 6764, 38, 6811, 39, 6813, 38, 6865, 40, 6971, 39, 6978, 38, 6994, 39, 7018, 37, 7059, 39, 7091, 37, 7105, 39, 7115, 37, 7292, 39, 7295, 88, 7301, 37, 7315, 37, 7316, 37, 7317, 37, 7318, 37, 7319, 37, 7372, 39, 7396, 37, 7429, 38, 7436, 37, 7526, 38, 7607, 40, 7626, 37, 7648, 38, 7686, 39, 7755, 40, 7793, 39, 7816, 37, 7842, 39, 7845, 88, 7852, 37, 7866, 37, 7867, 37, 7868, 37, 7886, 39, 7892, 38, 7915, 39, 7984, 38, 8158, 37, 8176, 40, 8242, 37, 8255, 39, 8270, 37, 8303, 38, 8309, 37, 8399, 38, 8512, 39, 8603, 37, 8634, 38, 8679, 37, 8731, 40, 8807, 39, 8853, 38, 8862, 39, 8954, 38, 9061, 37, 9123, 39, 9143, 38, 9169, 39, 9179, 38, 9474, 40, 9511, 38, 9618, 39, 9664, 37, 9677, 39, 9712, 38, 9797, 37, 9862, 38, 9874, 40, 9909, 39, 9964, 88, 9975, 37, 10050, 39, 10075, 37, 10106, 38, 10112, 37, 10125, 38, 10153, 88, 10220, 39, 10292, 38, 10399, 37, 10454, 40, 10479, 39, 10512, 88, 10524, 37, 10641, 39, 10651, 38, 10659, 39, 10712, 37, 10723, 39, 10738, 37, 10771, 38, 10777, 37, 10866, 38], //251 goldDrop: [37, 26, 31, 17, 35, 17, 15, 25], bornPos: [1, 10] }, { level: 8, ai:1, time: 2738, state: 1, action: [0, 37, 6, 38, 40, 37, 79, 38, 100, 39, 112, 90, 145, 37, 158, 38, 185, 39, 192, 37, 200, 40, 210, 39, 226, 38, 231, 39, 241, 38, 245, 39, 274, 90, 288, 37, 294, 40, 301, 39, 312, 38, 318, 39, 328, 38, 332, 39, 346, 37, 360, 40, 370, 37, 380, 39, 391, 90, 399, 37, 410, 40, 426, 37, 444, 88, 489, 39, 501, 38, 507, 39, 516, 38, 522, 39, 534, 38, 541, 39, 550, 38, 555, 39, 572, 37, 612, 39, 627, 90, 763, 37, 767, 40, 781, 40, 782, 37, 792, 88, 829, 39, 839, 38, 846, 39, 856, 38, 864, 39, 873, 38, 881, 39, 896, 37, 916, 40, 924, 90, 995, 37, 1001, 40, 1015, 40, 1018, 37, 1032, 88, 1069, 40, 1078, 37, 1089, 40, 1097, 37, 1107, 88, 1207, 40, 1220, 40, 1221, 40, 1328, 38, 1337, 39, 1346, 38, 1353, 39, 1363, 38, 1369, 39, 1378, 38, 1384, 39, 1396, 37, 1409, 40, 1417, 37, 1427, 40, 1438, 37, 1444, 40, 1457, 37, 1462, 40, 1474, 37, 1507, 40, 1520, 37, 1530, 40, 1541, 37, 1551, 40, 1566, 37, 1576, 40, 1607, 90, 1618, 37, 1625, 40, 1639, 40, 1640, 40, 1641, 40, 1644, 90, 1649, 37, 1657, 40, 1667, 37, 1677, 40, 1689, 39, 1702, 38, 1709, 39, 1719, 38, 1726, 39, 1736, 38, 1744, 39, 1754, 90, 1763, 37, 1775, 40, 1788, 37, 1797, 39, 1812, 38, 1818, 39, 1830, 38, 1834, 39, 1843, 90, 1853, 37, 1866, 40, 1874, 39, 1887, 38, 1894, 39, 1903, 38, 1911, 39, 1921, 38, 1928, 39, 1946, 90, 1958, 37, 1968, 40, 1974, 39, 1987, 38, 1993, 39, 2003, 90, 2014, 37, 2024, 40, 2033, 39, 2046, 38, 2114, 37, 2218, 40, 2230, 37, 2242, 40, 2276, 90, 2315, 38, 2369, 40, 2400, 37, 2413, 40, 2424, 37, 2435, 40, 2446, 37, 2458, 40, 2472, 40, 2591, 38, 2600, 39, 2629, 38, 2635, 39, 2651, 38, 2659, 39, 2670, 38, 2680, 39, 2688, 38, 2697, 39, 2707, 38, 2721, 39, 2727, 38], //172 goldDrop: [14] }, { level: 9, ai:1, time: 7861, state: 1, action: [0, 90, 20, 37, 38, 40, 45, 90, 58, 88, 64, 40, 69, 90, 89, 39, 92, 90, 106, 37, 116, 39, 184, 37, 187, 88, 197, 39, 211, 39, 212, 39, 213, 39, 214, 39, 215, 39, 216, 39, 217, 39, 218, 39, 222, 38, 228, 39, 236, 37, 240, 38, 249, 37, 252, 38, 261, 37, 264, 38, 273, 37, 276, 38, 284, 37, 287, 38, 296, 37, 300, 38, 309, 37, 312, 38, 323, 37, 328, 90, 340, 37, 360, 39, 365, 90, 379, 37, 393, 88, 403, 39, 426, 90, 435, 37, 466, 90, 477, 37, 501, 38, 506, 37, 514, 39, 519, 38, 525, 39, 530, 38, 539, 39, 543, 38, 551, 39, 555, 38, 562, 39, 565, 38, 572, 39, 575, 38, 595, 39, 602, 38, 610, 39, 622, 90, 636, 37, 666, 39, 678, 37, 708, 90, 721, 37, 742, 38, 751, 90, 769, 40, 770, 90, 788, 40, 795, 37, 806, 39, 814, 38, 826, 39, 828, 38, 858, 39, 865, 38, 871, 39, 878, 38, 883, 39, 889, 38, 894, 39, 900, 38, 905, 39, 910, 38, 915, 39, 917, 38, 928, 39, 933, 38, 940, 39, 945, 90, 953, 39, 958, 90, 970, 39, 976, 90, 989, 40, 997, 39, 1008, 37, 1014, 38, 1095, 37, 1109, 37, 1110, 37, 1111, 37, 1112, 37, 1113, 37, 1114, 37, 1115, 37, 1116, 37, 1117, 37, 1118, 37, 1119, 37, 1120, 37, 1121, 37, 1122, 37, 1123, 37, 1124, 37, 1125, 37, 1126, 37, 1127, 37, 1128, 37, 1216, 39, 1220, 90, 1233, 37, 1246, 37, 1252, 38, 1303, 40, 1307, 90, 1332, 40, 1388, 38, 1400, 39, 1407, 38, 1414, 39, 1420, 38, 1426, 39, 1432, 38, 1438, 39, 1444, 38, 1449, 39, 1456, 38, 1461, 39, 1465, 38, 1485, 39, 1495, 38, 1514, 90, 1531, 39, 1536, 90, 1558, 40, 1565, 39, 1673, 40, 1686, 39, 1691, 40, 1701, 39, 1707, 40, 1716, 39, 1722, 40, 1731, 39, 1737, 40, 1746, 39, 1754, 40, 1763, 88, 1773, 38, 1776, 88, 1787, 40, 1823, 38, 1834, 37, 1838, 38, 1847, 37, 1851, 38, 1860, 37, 1864, 38, 1873, 37, 1877, 38, 1886, 37, 1889, 38, 1898, 37, 1904, 38, 1913, 37, 1922, 88, 1976, 39, 1983, 37, 1995, 88, 2003, 40, 2014, 37, 2216, 39, 2224, 38, 2229, 39, 2246, 40, 2254, 39, 2264, 40, 2273, 39, 2279, 40, 2287, 39, 2295, 40, 2301, 39, 2308, 40, 2315, 39, 2322, 40, 2329, 39, 2341, 40, 2348, 39, 2359, 37, 2364, 88, 2378, 40, 2425, 38, 2435, 37, 2440, 38, 2448, 37, 2453, 38, 2461, 37, 2465, 38, 2475, 37, 2478, 38, 2487, 37, 2490, 38, 2500, 37, 2505, 38, 2519, 37, 2526, 38, 2537, 37, 2540, 88, 2580, 39, 2587, 37, 2599, 88, 2607, 40, 2619, 37, 2821, 39, 2827, 38, 2832, 39, 2846, 40, 2854, 39, 2860, 40, 2868, 39, 2875, 40, 2882, 39, 2888, 40, 2896, 39, 2902, 40, 2908, 39, 2915, 40, 2920, 39, 2928, 40, 2936, 88, 2956, 40, 3022, 38, 3034, 37, 3039, 38, 3046, 37, 3052, 38, 3060, 37, 3063, 38, 3073, 37, 3076, 38, 3085, 37, 3089, 38, 3099, 37, 3104, 38, 3119, 37, 3127, 88, 3161, 37, 3166, 88, 3180, 40, 3192, 38, 3245, 40, 3256, 37, 3262, 40, 3268, 37, 3273, 40, 3277, 37, 3281, 40, 3285, 37, 3289, 40, 3293, 37, 3297, 40, 3300, 37, 3304, 40, 3308, 37, 3318, 39, 3325, 90, 3388, 38, 3396, 39, 3402, 38, 3407, 39, 3413, 38, 3419, 39, 3425, 38, 3429, 39, 3434, 38, 3439, 39, 3443, 38, 3446, 39, 3450, 38, 3454, 39, 3463, 39, 3474, 40, 3482, 39, 3487, 40, 3493, 39, 3499, 40, 3504, 39, 3510, 40, 3515, 39, 3521, 40, 3525, 39, 3531, 40, 3536, 39, 3543, 40, 3549, 88, 3562, 40, 3569, 39, 3577, 40, 3588, 37, 3594, 40, 3601, 37, 3617, 39, 3621, 38, 3636, 37, 3640, 38, 3648, 37, 3653, 38, 3660, 37, 3664, 38, 3673, 37, 3676, 38, 3685, 37, 3689, 38, 3698, 37, 3702, 38, 3735, 37, 3742, 88, 3751, 37, 3755, 88, 3764, 37, 3777, 40, 3786, 37, 3791, 40, 3795, 37, 3801, 40, 3804, 37, 3807, 40, 3809, 37, 3812, 40, 3814, 37, 3817, 40, 3819, 37, 3822, 40, 3823, 37, 3826, 40, 3828, 37, 3831, 40, 3833, 37, 3840, 37, 3847, 40, 3853, 90, 3863, 37, 3891, 38, 3897, 37, 3910, 38, 3931, 40, 3961, 38, 4007, 40, 4021, 40, 4022, 40, 4023, 40, 4048, 38, 4134, 40, 4184, 39, 4200, 37, 4208, 38, 4217, 39, 4226, 38, 4231, 39, 4236, 38, 4239, 39, 4243, 38, 4246, 39, 4250, 38, 4253, 39, 4257, 38, 4259, 39, 4263, 38, 4265, 39, 4269, 38, 4274, 39, 4277, 38, 4287, 37, 4363, 38, 4371, 39, 4385, 38, 4395, 37, 4403, 38, 4414, 39, 4421, 38, 4427, 39, 4434, 38, 4438, 39, 4441, 38, 4451, 37, 4470, 38, 4480, 39, 4488, 38, 4494, 39, 4499, 38, 4504, 39, 4509, 38, 4513, 39, 4517, 38, 4522, 39, 4525, 38, 4529, 39, 4532, 38, 4536, 39, 4540, 38, 4544, 39, 4547, 38, 4552, 39, 4555, 38, 4558, 39, 4561, 38, 4563, 39, 4566, 38, 4584, 39, 4590, 88, 4612, 39, 4625, 39, 4626, 39, 4627, 39, 4628, 39, 4629, 39, 4630, 39, 4631, 39, 4632, 39, 4633, 39, 4634, 39, 4635, 39, 4636, 39, 4637, 39, 4639, 40, 4646, 39, 4651, 40, 4671, 38, 4676, 37, 4681, 38, 4686, 90, 4729, 37, 4745, 40, 4752, 37, 4763, 39, 4768, 38, 4773, 88, 4781, 40, 4794, 37, 4802, 40, 4816, 40, 4817, 40, 4830, 38, 4998, 39, 5003, 38, 5007, 39, 5020, 40, 5027, 39, 5031, 40, 5036, 39, 5042, 40, 5047, 39, 5051, 40, 5059, 39, 5063, 40, 5067, 39, 5069, 40, 5073, 39, 5075, 40, 5079, 39, 5082, 40, 5084, 39, 5087, 40, 5091, 39, 5099, 38, 5106, 37, 5110, 88, 5121, 39, 5134, 39, 5135, 39, 5136, 39, 5137, 39, 5138, 39, 5139, 39, 5140, 39, 5141, 39, 5142, 39, 5143, 39, 5148, 38, 5163, 37, 5165, 38, 5171, 37, 5177, 38, 5186, 37, 5190, 38, 5199, 37, 5202, 38, 5211, 37, 5213, 38, 5225, 37, 5227, 38, 5237, 37, 5243, 38, 5250, 37, 5254, 38, 5264, 37, 5268, 38, 5276, 37, 5279, 38, 5287, 37, 5291, 38, 5299, 37, 5419, 38, 5430, 39, 5440, 38, 5450, 39, 5453, 38, 5463, 39, 5467, 38, 5476, 39, 5480, 38, 5488, 39, 5496, 38, 5510, 37, 5566, 38, 5576, 39, 5584, 38, 5595, 39, 5599, 38, 5610, 39, 5614, 38, 5624, 39, 5628, 38, 5637, 39, 5641, 38, 5650, 39, 5655, 38, 5663, 39, 5668, 38, 5677, 39, 5681, 38, 5689, 39, 5694, 38, 5704, 39, 5708, 38, 5730, 37, 5739, 40, 5749, 37, 5831, 40, 5842, 39, 5852, 38, 5861, 39, 5866, 38, 5873, 39, 5879, 38, 5887, 39, 5892, 38, 5900, 39, 5905, 38, 5913, 39, 5919, 38, 5926, 39, 5934, 38, 5951, 37, 6025, 38, 6034, 39, 6042, 38, 6051, 39, 6054, 38, 6062, 39, 6065, 38, 6076, 39, 6079, 38, 6089, 39, 6093, 38, 6101, 39, 6104, 38, 6117, 39, 6122, 38, 6131, 39, 6135, 38, 6143, 39, 6147, 38, 6158, 39, 6162, 38, 6178, 37, 6203, 40, 6212, 37, 6260, 40, 6292, 39, 6301, 38, 6310, 39, 6313, 38, 6322, 39, 6325, 38, 6339, 39, 6344, 38, 6353, 39, 6358, 38, 6367, 39, 6372, 38, 6381, 39, 6385, 38, 6394, 39, 6398, 38, 6408, 39, 6412, 38, 6423, 39, 6427, 38, 6442, 37, 6482, 90, 6517, 37, 6531, 39, 6536, 90, 6549, 37, 6568, 88, 6580, 39, 6595, 37, 6609, 40, 6640, 39, 6650, 38, 6660, 39, 6663, 38, 6671, 39, 6681, 39, 6696, 37, 6733, 38, 6744, 39, 6754, 38, 6763, 39, 6767, 38, 6777, 39, 6781, 38, 6790, 39, 6794, 38, 6803, 39, 6808, 38, 6820, 39, 6825, 38, 6834, 39, 6839, 38, 6848, 39, 6853, 38, 6863, 39, 6868, 38, 6877, 39, 6882, 38, 6892, 39, 6930, 38, 6946, 88, 6959, 39, 7055, 40, 7078, 37, 7088, 38, 7098, 37, 7102, 38, 7111, 37, 7115, 38, 7124, 37, 7125, 38, 7137, 37, 7141, 38, 7150, 37, 7154, 38, 7163, 37, 7167, 38, 7177, 37, 7180, 38, 7189, 37, 7193, 38, 7202, 37, 7204, 38, 7216, 37, 7220, 38, 7228, 37, 7233, 38, 7266, 39, 7285, 88, 7297, 39, 7311, 37, 7318, 88, 7327, 39, 7344, 37, 7350, 88, 7360, 39, 7377, 37, 7383, 88, 7392, 39, 7410, 37, 7418, 88, 7428, 39, 7444, 37, 7452, 88, 7463, 39, 7479, 90, 7497, 37, 7505, 39, 7519, 39, 7520, 39, 7521, 39, 7526, 40, 7550, 37, 7561, 38, 7571, 37, 7575, 38, 7584, 37, 7587, 38, 7597, 37, 7599, 38, 7610, 37, 7614, 38, 7624, 37, 7628, 38, 7637, 37, 7640, 38, 7649, 37, 7652, 38, 7662, 37, 7664, 38, 7676, 37, 7680, 38, 7690, 37, 7696, 38, 7706, 37, 7710, 38, 7738, 39, 7779, 88, 7809, 39, 7823, 39, 7826, 37, 7838, 39, 7850, 38], //742 goldDrop: [16, 19, 35, 28, 25, 36, 15, 28, 24, 18], bornPos: [1, 21] }, { level: 10, ai:1, time: 3605, state: 1, action: [0, 39, 55, 38, 84, 37, 89, 38, 98, 37, 102, 38, 138, 39, 154, 40, 159, 37, 191, 38, 211, 39, 233, 37, 276, 39, 298, 88, 308, 37, 315, 88, 326, 39, 335, 90, 347, 39, 353, 90, 365, 39, 371, 90, 388, 37, 403, 88, 416, 37, 420, 88, 438, 39, 454, 90, 468, 37, 475, 39, 492, 37, 496, 88, 507, 39, 524, 90, 537, 37, 551, 88, 561, 39, 578, 90, 588, 37, 603, 88, 614, 39, 631, 90, 642, 37, 657, 88, 665, 39, 685, 90, 695, 37, 726, 38, 770, 37, 773, 38, 784, 37, 788, 38, 824, 39, 843, 88, 856, 39, 867, 37, 872, 88, 877, 88, 889, 39, 905, 37, 913, 88, 922, 39, 941, 90, 953, 37, 969, 39, 976, 37, 983, 88, 994, 39, 1009, 90, 1021, 37, 1037, 88, 1046, 39, 1063, 90, 1076, 37, 1089, 88, 1102, 39, 1115, 90, 1127, 37, 1142, 88, 1159, 39, 1178, 37, 1186, 88, 1203, 39, 1227, 38, 1243, 37, 1248, 39, 1251, 38, 1269, 37, 1273, 38, 1285, 39, 1289, 38, 1300, 37, 1305, 38, 1316, 39, 1321, 38, 1331, 37, 1336, 38, 1347, 39, 1352, 38, 1365, 37, 1368, 38, 1380, 39, 1384, 38, 1394, 39, 1398, 38, 1418, 39, 1448, 37, 1456, 39, 1468, 37, 1473, 39, 1479, 40, 1494, 39, 1511, 40, 1545, 39, 1565, 37, 1570, 88, 1584, 39, 1606, 40, 1611, 39, 1633, 38, 1672, 88, 1788, 40, 1794, 88, 1876, 40, 1879, 88, 1890, 38, 1903, 39, 1918, 88, 1928, 39, 1942, 37, 1968, 38, 1986, 37, 2014, 38, 2035, 88, 2047, 40, 2051, 88, 2061, 39, 2084, 38, 2089, 88, 2100, 39, 2121, 38, 2126, 88, 2138, 39, 2159, 38, 2172, 37, 2228, 38, 2249, 39, 2254, 38, 2266, 39, 2270, 38, 2305, 40, 2308, 37, 2324, 40, 2328, 37, 2336, 40, 2365, 39, 2390, 90, 2537, 40, 2543, 90, 2627, 40, 2631, 90, 2652, 38, 2662, 37, 2674, 88, 2683, 37, 2692, 90, 2702, 37, 2713, 39, 2726, 39, 2727, 39, 2728, 39, 2729, 39, 2730, 39, 2731, 39, 2732, 39, 2733, 39, 2734, 39, 2735, 39, 2736, 39, 2746, 38, 2764, 39, 2772, 90, 2782, 39, 2789, 90, 2801, 39, 2807, 90, 3004, 37, 3018, 37, 3019, 37, 3020, 37, 3021, 37, 3022, 37, 3023, 37, 3024, 37, 3025, 37, 3026, 37, 3027, 37, 3028, 37, 3029, 37, 3030, 37, 3031, 37, 3032, 37, 3033, 37, 3034, 37, 3035, 37, 3048, 38, 3062, 38, 3063, 38, 3064, 38, 3065, 38, 3066, 38, 3067, 38, 3068, 38, 3069, 38, 3070, 38, 3071, 38, 3072, 38, 3073, 38, 3074, 38, 3075, 38, 3076, 38, 3077, 38, 3078, 38, 3082, 39, 3086, 38, 3141, 39, 3145, 38, 3239, 40, 3242, 37, 3314, 40, 3318, 37, 3324, 40, 3351, 88, 3363, 39, 3390, 90, 3402, 37, 3416, 37, 3417, 37, 3418, 37, 3420, 40, 3434, 37, 3507, 38, 3553, 37, 3557, 38, 3566, 37, 3572, 38], //246 bornPos: [1, 2] }, { level: 11, ai:1, time: 3836, state: 1, action: [0, 88, 12, 39, 23, 37, 32, 88, 43, 39, 64, 37, 112, 39, 130, 37, 207, 38, 250, 39, 293, 37, 298, 88, 328, 39, 350, 37, 362, 39, 367, 90, 463, 37, 494, 38, 508, 38, 511, 37, 518, 38, 577, 37, 630, 39, 665, 37, 670, 88, 690, 39, 714, 37, 719, 88, 754, 39, 766, 38, 875, 39, 891, 37, 948, 38, 1028, 39, 1083, 40, 1088, 90, 1101, 37, 1115, 90, 1135, 37, 1153, 88, 1163, 39, 1186, 90, 1195, 37, 1217, 88, 1227, 39, 1249, 90, 1261, 37, 1328, 38, 1407, 39, 1493, 40, 1500, 88, 1512, 39, 1527, 37, 1534, 88, 1545, 39, 1565, 90, 1575, 37, 1597, 88, 1608, 39, 1628, 90, 1639, 37, 1660, 88, 1670, 39, 1739, 38, 1818, 37, 1863, 40, 2026, 39, 2078, 37, 2082, 88, 2097, 39, 2119, 88, 2130, 37, 2133, 88, 2211, 39, 2218, 38, 2417, 39, 2461, 38, 2541, 37, 2586, 38, 2598, 40, 2892, 39, 2905, 38, 2961, 39, 2987, 37, 2992, 88, 3002, 39, 3026, 90, 3252, 37, 3258, 88, 3282, 39, 3318, 38, 3398, 37, 3413, 40, 3422, 90, 3438, 37, 3448, 88, 3531, 39, 3539, 38, 3694, 39, 3759, 38] //100 }, { level: 13, ai:1, time: 9521, state: 1, action: [0, 39, 85, 40, 100, 39, 112, 40, 136, 39, 162, 38, 198, 37, 270, 40, 284, 39, 304, 38, 309, 39, 341, 37, 373, 40, 400, 37, 412, 40, 416, 37, 430, 39, 445, 40, 459, 40, 468, 39, 494, 37, 501, 38, 513, 38, 528, 37, 529, 38, 539, 39, 584, 38, 628, 37, 668, 40, 684, 39, 690, 39, 693, 37, 704, 38, 717, 39, 758, 38, 798, 39, 836, 40, 850, 40, 851, 40, 852, 40, 853, 40, 854, 40, 920, 38, 930, 37, 1008, 40, 1022, 40, 1023, 40, 1024, 40, 1029, 39, 1061, 40, 1084, 37, 1105, 40, 1118, 39, 1130, 40, 1144, 37, 1165, 40, 1178, 39, 1239, 38, 1260, 37, 1268, 39, 1280, 38, 1290, 39, 1301, 40, 1315, 40, 1316, 40, 1317, 40, 1318, 40, 1319, 40, 1320, 40, 1321, 40, 1323, 40, 1324, 40, 1325, 40, 1326, 40, 1327, 40, 1328, 40, 1342, 37, 1356, 40, 1364, 37, 1396, 39, 1428, 38, 1474, 37, 1484, 40, 1498, 40, 1499, 40, 1500, 40, 1501, 40, 1502, 40, 1503, 40, 1504, 40, 1505, 40, 1506, 40, 1507, 40, 1508, 40, 1509, 40, 1510, 40, 1511, 40, 1512, 40, 1513, 40, 1514, 40, 1515, 40, 1516, 40, 1517, 40, 1518, 40, 1522, 37, 1583, 38, 1595, 39, 1616, 38, 1629, 37, 1648, 38, 1671, 37, 1681, 39, 1709, 37, 1727, 40, 1741, 40, 1752, 37, 1763, 40, 1777, 40, 1778, 40, 1779, 40, 1780, 40, 1781, 40, 1782, 40, 1783, 40, 1784, 40, 1785, 40, 1786, 40, 1787, 40, 1788, 40, 1789, 40, 1790, 40, 1798, 39, 1821, 37, 1847, 38, 1881, 39, 1901, 38, 1915, 39, 1935, 38, 1993, 37, 2035, 38, 2104, 40, 2120, 39, 2152, 40, 2166, 40, 2167, 40, 2168, 40, 2174, 37, 2188, 37, 2189, 37, 2190, 37, 2197, 40, 2211, 37, 2231, 39, 2241, 38, 2268, 39, 2394, 37, 2413, 40, 2427, 40, 2428, 40, 2429, 40, 2435, 39, 2457, 40, 2468, 37, 2482, 37, 2483, 37, 2484, 37, 2489, 40, 2502, 39, 2506, 39, 2510, 37, 2518, 38, 2530, 39, 2543, 39, 2550, 38, 2560, 40, 2592, 38, 2604, 37, 2611, 38, 2624, 37, 2628, 38, 2644, 39, 2678, 38, 2726, 37, 2757, 38, 2779, 39, 2855, 38, 3007, 40, 3019, 39, 3023, 40, 3037, 40, 3079, 39, 3088, 40, 3102, 40, 3103, 40, 3104, 40, 3105, 40, 3106, 40, 3107, 40, 3108, 40, 3109, 40, 3110, 40, 3111, 40, 3112, 40, 3113, 40, 3114, 40, 3115, 40, 3116, 40, 3117, 40, 3118, 40, 3119, 40, 3175, 38, 3187, 39, 3277, 40, 3290, 40, 3291, 40, 3292, 40, 3293, 40, 3320, 39, 3337, 40, 3351, 40, 3352, 40, 3360, 39, 3365, 40, 3379, 40, 3380, 40, 3381, 40, 3382, 40, 3383, 40, 3384, 40, 3385, 40, 3386, 40, 3387, 40, 3388, 40, 3389, 40, 3390, 40, 3391, 40, 3392, 40, 3393, 40, 3394, 40, 3395, 40, 3396, 40, 3458, 38, 3480, 37, 3498, 38, 3519, 37, 3531, 38, 3540, 37, 3554, 37, 3583, 40, 3598, 39, 3602, 40, 3661, 38, 3686, 40, 4243, 38, 4301, 37, 4340, 40, 4352, 39, 4381, 40, 4400, 37, 4413, 37, 4418, 40, 4424, 37, 4444, 40, 4455, 39, 4464, 40, 4474, 37, 4488, 37, 4489, 37, 4490, 37, 4491, 37, 4495, 40, 4509, 40, 4510, 40, 4511, 40, 4523, 39, 4583, 38, 4604, 37, 4615, 38, 4635, 39, 4662, 37, 4689, 40, 4703, 40, 4704, 40, 4710, 39, 4725, 38, 4735, 39, 4746, 40, 4764, 39, 4776, 40, 4780, 39, 4798, 40, 4811, 40, 4812, 40, 4821, 37, 4839, 39, 4890, 37, 4899, 38, 4921, 37, 4942, 38, 4968, 37, 4981, 40, 4995, 40, 4996, 40, 4997, 40, 4998, 40, 4999, 40, 5000, 40, 5001, 40, 5002, 40, 5003, 40, 5004, 40, 5005, 40, 5006, 40, 5007, 40, 5008, 40, 5009, 40, 5010, 40, 5011, 40, 5012, 40, 5013, 40, 5047, 37, 5061, 37, 5062, 37, 5111, 38, 5124, 39, 5146, 38, 5161, 37, 5170, 38, 5196, 40, 5240, 38, 5290, 40, 5328, 38, 5354, 40, 5391, 38, 5422, 40, 5459, 38, 5503, 40, 5540, 38, 5576, 39, 5594, 38, 5628, 40, 5642, 40, 5643, 40, 5644, 40, 5645, 40, 5646, 40, 5647, 40, 5648, 40, 5649, 40, 5650, 40, 5651, 40, 5652, 40, 5653, 40, 5654, 40, 5692, 37, 5714, 40, 5728, 39, 5740, 40, 5754, 40, 5776, 37, 5798, 40, 5814, 39, 5876, 38, 5911, 39, 5923, 40, 5936, 40, 5937, 40, 5938, 40, 5939, 40, 5940, 40, 5941, 40, 5942, 40, 5943, 40, 5944, 40, 5945, 40, 5946, 40, 5947, 40, 5948, 40, 5949, 40, 5950, 40, 5951, 40, 5952, 40, 5953, 40, 5954, 40, 5955, 40, 5956, 40, 5957, 40, 5958, 40, 5959, 40, 5960, 40, 5961, 40, 5962, 40, 5963, 40, 5964, 40, 5965, 40, 5966, 40, 5967, 40, 5968, 40, 5969, 40, 5970, 40, 6058, 38, 6127, 40, 6141, 40, 6142, 40, 6143, 40, 6144, 40, 6145, 40, 6146, 40, 6147, 40, 6148, 40, 6149, 40, 6150, 40, 6151, 40, 6152, 40, 6153, 40, 6154, 40, 6155, 40, 6156, 40, 6157, 40, 6158, 40, 6159, 40, 6160, 40, 6161, 40, 6162, 40, 6163, 40, 6164, 40, 6165, 40, 6242, 38, 6314, 37, 6329, 40, 6338, 37, 6442, 38, 6501, 40, 6552, 38, 6633, 40, 6647, 40, 6648, 40, 6649, 40, 6650, 40, 6651, 40, 6652, 40, 6653, 40, 6662, 39, 6673, 40, 6710, 37, 6848, 38, 6860, 39, 6879, 38, 6894, 37, 6904, 38, 6923, 39, 6973, 38, 7000, 37, 7094, 38, 7105, 39, 7185, 38, 7202, 40, 7216, 40, 7217, 40, 7218, 40, 7219, 40, 7220, 40, 7221, 40, 7222, 40, 7223, 40, 7224, 40, 7290, 38, 7299, 37, 7378, 40, 7392, 40, 7393, 40, 7394, 40, 7395, 40, 7396, 40, 7397, 40, 7398, 40, 7399, 40, 7405, 39, 7439, 40, 7460, 37, 7478, 40, 7490, 39, 7501, 40, 7511, 37, 7530, 40, 7544, 39, 7610, 38, 7646, 39, 7658, 40, 7678, 39, 7740, 37, 7757, 38, 7774, 37, 7778, 38, 7780, 37, 7785, 38, 7803, 37, 7818, 40, 7828, 37, 7842, 38, 7866, 39, 7894, 40, 7907, 40, 7908, 40, 7909, 40, 7910, 40, 7911, 40, 7912, 40, 7913, 40, 7973, 39, 8000, 40, 8013, 40, 8014, 40, 8015, 40, 8016, 40, 8017, 40, 8018, 40, 8019, 40, 8020, 40, 8463, 38, 8491, 37, 8520, 38, 8534, 39, 8607, 38, 8647, 40, 8655, 39, 8671, 40, 8685, 40, 8686, 40, 8690, 38, 8718, 40, 8727, 37, 8750, 40, 8763, 40, 8764, 40, 8765, 40, 8766, 40, 8767, 40, 8768, 40, 8769, 40, 8770, 40, 8809, 39, 8828, 40, 8847, 38, 8869, 37, 8878, 39, 8890, 40, 8921, 38, 8932, 39, 8979, 40, 8992, 40, 8993, 40, 8994, 40, 8995, 40, 8996, 40, 8997, 40, 8998, 40, 8999, 40, 9000, 40, 9001, 40, 9002, 40, 9003, 40, 9004, 40, 9005, 40, 9006, 40, 9007, 40, 9008, 40, 9009, 40, 9010, 40, 9019, 39, 9027, 40, 9040, 40, 9041, 40, 9042, 40, 9043, 40, 9044, 40, 9045, 40, 9046, 40, 9047, 40, 9048, 40, 9090, 38, 9100, 37, 9112, 38, 9133, 37, 9155, 38, 9177, 37, 9208, 40, 9222, 40, 9223, 40, 9228, 39, 9240, 40, 9253, 40, 9254, 40, 9255, 40, 9264, 37, 9327, 38, 9338, 39, 9360, 38, 9374, 37, 9384, 38, 9395, 39, 9414, 38, 9439, 37, 9466, 38, 9486, 37, 9490, 38, 9503, 37, 9515, 38], //608 goldDrop: [18, 24, 39, 32, 37, 17, 39, 29, 38, 39] }, { level: 14, ai:1, time: 3067, state: 1, action: [0, 39, 12, 40, 26, 40, 30, 39, 40, 40, 53, 40, 61, 39, 73, 40, 94, 39, 108, 39, 109, 39, 116, 37, 123, 88, 133, 37, 147, 37, 148, 37, 149, 37, 150, 37, 151, 37, 152, 37, 155, 88, 165, 37, 178, 37, 179, 37, 180, 37, 181, 37, 182, 37, 183, 37, 189, 88, 204, 37, 223, 39, 237, 38, 245, 40, 254, 39, 267, 38, 271, 39, 290, 38, 312, 39, 332, 38, 356, 39, 392, 38, 410, 39, 433, 38, 447, 40, 459, 39, 480, 40, 523, 37, 594, 39, 604, 38, 625, 39, 640, 38, 680, 37, 686, 40, 700, 40, 701, 40, 702, 40, 703, 40, 704, 40, 710, 39, 717, 90, 763, 37, 770, 39, 795, 90, 813, 39, 833, 90, 959, 39, 969, 38, 1011, 40, 1019, 38, 1030, 37, 1052, 38, 1063, 40, 1072, 37, 1074, 38, 1114, 40, 1121, 39, 1176, 40, 1190, 40, 1191, 40, 1192, 40, 1193, 40, 1194, 40, 1195, 40, 1196, 40, 1197, 40, 1198, 40, 1199, 40, 1200, 40, 1201, 40, 1202, 40, 1203, 40, 1204, 40, 1205, 40, 1206, 40, 1207, 40, 1208, 40, 1209, 40, 1210, 40, 1211, 40, 1212, 40, 1213, 40, 1214, 40, 1215, 40, 1216, 40, 1217, 40, 1218, 40, 1219, 40, 1220, 40, 1221, 40, 1222, 40, 1235, 37, 1251, 88, 1263, 37, 1276, 37, 1277, 37, 1278, 37, 1279, 37, 1280, 37, 1281, 37, 1283, 88, 1296, 37, 1316, 88, 1327, 37, 1348, 88, 1516, 37, 1522, 38, 1544, 39, 1564, 38, 1590, 39, 1600, 40, 1604, 39, 1631, 37, 1636, 38, 1651, 39, 1713, 40, 1727, 40, 1728, 40, 1729, 40, 1730, 40, 1731, 40, 1732, 40, 1733, 40, 1734, 40, 1735, 40, 1736, 40, 1737, 40, 1738, 40, 1739, 40, 1740, 40, 1741, 40, 1742, 40, 1743, 40, 1744, 40, 1745, 40, 1746, 40, 1747, 40, 1748, 40, 1749, 40, 1750, 40, 1751, 40, 1752, 40, 1753, 40, 1754, 40, 1755, 40, 1756, 40, 1757, 40, 1758, 40, 1759, 40, 1760, 40, 1761, 40, 1762, 40, 1763, 40, 1772, 39, 1808, 37, 1828, 90, 1841, 39, 1864, 90, 1873, 37, 1876, 90, 1889, 39, 1911, 90, 1973, 39, 2098, 38, 2111, 38, 2143, 37, 2201, 38, 2215, 39, 2307, 40, 2321, 40, 2322, 40, 2323, 40, 2324, 40, 2325, 40, 2326, 40, 2327, 40, 2328, 40, 2329, 40, 2330, 40, 2331, 40, 2332, 40, 2333, 40, 2334, 40, 2335, 40, 2336, 40, 2337, 40, 2338, 40, 2339, 40, 2340, 40, 2341, 40, 2342, 40, 2343, 40, 2344, 40, 2345, 40, 2346, 40, 2347, 40, 2348, 40, 2349, 40, 2350, 40, 2351, 40, 2352, 40, 2353, 40, 2354, 40, 2355, 40, 2356, 40, 2357, 40, 2365, 39, 2388, 37, 2393, 90, 2402, 37, 2405, 90, 2415, 39, 2440, 90, 2451, 90, 2454, 37, 2457, 90, 2469, 39, 2492, 90, 2505, 37, 2507, 90, 2564, 39, 2574, 38, 2620, 37, 2669, 38, 2723, 40, 2737, 40, 2738, 40, 2739, 40, 2740, 40, 2741, 40, 2742, 40, 2743, 40, 2744, 40, 2745, 40, 2746, 40, 2747, 40, 2748, 40, 2749, 40, 2750, 40, 2751, 40, 2752, 40, 2753, 40, 2754, 40, 2755, 40, 2756, 40, 2757, 40, 2758, 40, 2759, 40, 2760, 40, 2761, 40, 2762, 40, 2763, 40, 2764, 40, 2769, 37, 2775, 88, 2848, 39, 2853, 37, 2866, 37, 2901, 38, 2923, 39, 2942, 38, 2964, 39, 3045, 38], //282 goldDrop: [37, 39, 38, 30, 29, 23, 24, 27, 25, 24], bornPos: [2, 23, 5, 23, 5, 23, 6, 15, 5, 23, 5, 7, 5, 23, 5, 23, 5, 23, 5] }, { level: 15, ai:1, time: 2482, state: 1, action: [0, 39, 76, 38, 146, 39, 223, 38, 289, 39, 361, 38, 423, 39, 488, 38, 545, 39, 605, 38, 656, 39, 711, 38, 755, 39, 804, 38, 843, 39, 888, 38, 916, 39, 960, 40, 975, 39, 982, 40, 1188, 38, 1231, 37, 1271, 90, 1275, 39, 1289, 39, 1290, 39, 1291, 39, 1292, 39, 1316, 37, 1330, 90, 1357, 37, 1406, 90, 1412, 39, 1426, 39, 1427, 39, 1488, 37, 1494, 39, 1502, 37, 1512, 37, 1556, 38, 1626, 39, 1703, 38, 1765, 39, 1835, 38, 1895, 39, 1961, 38, 2013, 39, 2070, 38, 2115, 39, 2163, 38, 2175, 39, 2179, 38, 2224, 39, 2274, 38, 2311, 39, 2357, 38, 2411, 39, 2449, 38], //58 goldDrop: [38] }, { level: 16, ai:1, time: 5396, state: 1, action: [0, 39, 5, 90, 16, 37, 33, 90, 45, 37, 60, 39, 64, 90, 75, 37, 91, 39, 95, 90, 107, 37, 121, 88, 132, 39, 168, 38, 242, 37, 258, 38, 264, 37, 286, 38, 317, 40, 333, 39, 362, 37, 379, 39, 395, 39, 403, 37, 413, 39, 423, 38, 446, 37, 507, 40, 515, 39, 603, 40, 628, 38, 643, 90, 678, 38, 682, 90, 709, 38, 718, 90, 770, 38, 784, 38, 785, 38, 786, 38, 787, 38, 788, 38, 789, 38, 800, 37, 882, 40, 892, 39, 1000, 39, 1012, 38, 1020, 90, 1058, 38, 1072, 90, 1120, 38, 1147, 37, 1188, 39, 1203, 40, 1231, 39, 1264, 39, 1270, 40, 1300, 38, 1312, 90, 1353, 38, 1366, 90, 1377, 38, 1405, 37, 1506, 40, 1519, 39, 1532, 39, 1533, 39, 1534, 39, 1535, 39, 1536, 39, 1537, 39, 1538, 39, 1539, 39, 1540, 39, 1541, 39, 1542, 39, 1543, 39, 1544, 39, 1553, 38, 1559, 39, 1567, 38, 1572, 39, 1594, 37, 1598, 88, 1609, 39, 1625, 37, 1640, 39, 1659, 90, 1664, 37, 1677, 39, 1683, 37, 1691, 88, 1705, 39, 1722, 37, 1731, 38, 1739, 37, 1746, 38, 1753, 37, 1762, 38, 1772, 37, 1782, 38, 1793, 37, 1803, 38, 1812, 37, 1821, 38, 1832, 37, 1845, 38, 1863, 37, 1875, 40, 1887, 39, 2003, 40, 2014, 37, 2028, 37, 2029, 37, 2030, 37, 2031, 37, 2032, 37, 2033, 37, 2052, 40, 2148, 38, 2162, 37, 2178, 40, 2184, 37, 2198, 38, 2278, 39, 2312, 37, 2321, 38, 2339, 90, 2360, 37, 2374, 39, 2383, 37, 2394, 39, 2408, 39, 2409, 39, 2410, 39, 2411, 39, 2412, 39, 2413, 39, 2414, 39, 2415, 39, 2416, 39, 2417, 39, 2418, 39, 2419, 39, 2462, 37, 2478, 40, 2547, 39, 2566, 38, 2579, 37, 2630, 40, 2637, 37, 2704, 40, 2781, 39, 2801, 40, 2832, 38, 2861, 40, 2897, 38, 2919, 37, 2944, 40, 2954, 37, 2971, 38, 3057, 39, 3080, 38, 3118, 90, 3130, 37, 3138, 90, 3156, 37, 3166, 88, 3180, 37, 3181, 88, 3196, 37, 3198, 88, 3220, 39, 3332, 38, 3339, 39, 3514, 38, 3521, 39, 3567, 40, 3590, 39, 3630, 38, 3637, 39, 3645, 38, 3652, 39, 3661, 38, 3666, 39, 3700, 37, 3713, 40, 3794, 38, 3800, 39, 3807, 40, 3830, 39, 3845, 90, 3859, 37, 3921, 40, 3928, 37, 3977, 38, 3989, 37, 4001, 40, 4008, 37, 4022, 38, 4099, 39, 4188, 38, 4274, 37, 4451, 40, 4628, 39, 4644, 40, 4679, 39, 4687, 38, 4728, 37, 4892, 40, 4906, 39, 4982, 37, 5007, 38, 5019, 37, 5028, 38, 5036, 37, 5044, 38, 5053, 37, 5062, 38, 5070, 37, 5078, 38, 5087, 37, 5094, 38, 5106, 37, 5110, 38, 5118, 37, 5127, 38, 5135, 37, 5142, 38, 5151, 37, 5154, 38, 5197, 39, 5282, 40, 5294, 39, 5363, 38], //236 goldDrop: [30, 22, 28, 31, 20, 23, 16, 28, 27, 26, 32], bornPos: [1, 2, 10] }, { level: 17, ai:1, time: 4628, state: 1, action: [0, 37, 6, 38, 18, 39, 33, 38, 38, 39, 42, 88, 68, 39, 134, 38, 141, 39, 157, 38, 162, 39, 177, 40, 203, 39, 210, 40, 226, 39, 241, 90, 252, 37, 273, 37, 283, 38, 289, 37, 306, 38, 313, 37, 329, 38, 335, 37, 341, 38, 352, 39, 376, 37, 390, 37, 391, 37, 392, 37, 397, 38, 403, 37, 411, 38, 430, 39, 433, 38, 443, 39, 450, 38, 465, 39, 467, 38, 471, 39, 488, 37, 506, 38, 513, 37, 519, 38, 529, 39, 540, 38, 549, 37, 563, 40, 582, 39, 591, 38, 602, 39, 609, 38, 620, 39, 624, 38, 638, 37, 653, 38, 662, 39, 677, 38, 683, 39, 699, 38, 704, 39, 730, 37, 739, 38, 745, 37, 756, 88, 765, 37, 768, 88, 813, 39, 828, 40, 852, 39, 860, 40, 866, 39, 880, 37, 889, 40, 907, 37, 958, 38, 967, 37, 1071, 40, 1080, 39, 1095, 38, 1119, 37, 1212, 38, 1218, 37, 1223, 38, 1233, 39, 1248, 38, 1343, 37, 1355, 38, 1361, 37, 1367, 38, 1377, 39, 1386, 38, 1397, 37, 1411, 38, 1418, 37, 1433, 38, 1439, 37, 1453, 38, 1459, 37, 1483, 40, 1502, 37, 1513, 40, 1523, 37, 1541, 40, 1555, 40, 1556, 40, 1557, 40, 1558, 40, 1559, 40, 1560, 40, 1561, 40, 1562, 40, 1563, 40, 1564, 40, 1565, 40, 1566, 40, 1567, 40, 1568, 40, 1569, 40, 1587, 37, 1608, 40, 1727, 38, 1736, 39, 1802, 38, 1807, 39, 1831, 38, 1836, 39, 1852, 38, 1857, 39, 1873, 38, 1878, 39, 1888, 38, 1899, 37, 1917, 38, 1928, 39, 1937, 37, 1967, 38, 1978, 37, 1985, 90, 2006, 37, 2014, 40, 2028, 40, 2047, 39, 2156, 40, 2161, 90, 2182, 40, 2201, 37, 2248, 38, 2266, 39, 2286, 38, 2292, 39, 2308, 40, 2315, 39, 2328, 37, 2340, 38, 2350, 39, 2368, 38, 2375, 39, 2385, 38, 2399, 37, 2415, 38, 2424, 37, 2446, 38, 2454, 37, 2473, 40, 2481, 37, 2491, 40, 2500, 39, 2509, 90, 2524, 37, 2540, 39, 2569, 40, 2598, 37, 2632, 38, 2644, 39, 2661, 38, 2666, 39, 2669, 88, 2701, 39, 2714, 38, 2720, 39, 2780, 38, 2795, 39, 2804, 38, 2858, 37, 2872, 38, 2885, 37, 2906, 38, 2912, 37, 2934, 38, 2941, 37, 2956, 38, 2970, 39, 2987, 38, 2993, 39, 3046, 40, 3073, 37, 3094, 40, 3104, 37, 3112, 40, 3136, 37, 3156, 40, 3159, 37, 3173, 37, 3174, 37, 3175, 37, 3176, 37, 3177, 37, 3178, 37, 3179, 37, 3180, 37, 3181, 37, 3182, 37, 3183, 37, 3184, 37, 3185, 37, 3220, 38, 3232, 39, 3247, 38, 3251, 39, 3255, 88, 3286, 39, 3297, 38, 3303, 39, 3323, 38, 3330, 39, 3344, 38, 3398, 37, 3440, 38, 3446, 37, 3463, 38, 3471, 37, 3486, 38, 3491, 37, 3502, 38, 3513, 39, 3529, 38, 3534, 39, 3606, 40, 3632, 37, 3649, 37, 3663, 37, 3666, 38, 3671, 37, 3687, 38, 3696, 39, 3705, 38, 3719, 37, 3734, 38, 3760, 37, 3782, 38, 3788, 37, 3807, 38, 3815, 37, 3827, 38, 3849, 39, 3866, 38, 3872, 39, 4058, 40, 4071, 39, 4083, 40, 4086, 39, 4100, 39, 4101, 39, 4102, 39, 4103, 39, 4104, 39, 4105, 39, 4106, 39, 4107, 39, 4108, 39, 4109, 39, 4110, 39, 4111, 39, 4112, 39, 4113, 39, 4114, 39, 4115, 39, 4116, 39, 4117, 39, 4149, 37, 4162, 37, 4163, 37, 4167, 38, 4263, 37, 4266, 90, 4282, 37, 4320, 88, 4330, 37, 4343, 37, 4344, 37, 4345, 37, 4346, 37, 4347, 37, 4348, 37, 4349, 37, 4352, 88, 4402, 39, 4434, 37, 4448, 38, 4463, 39, 4477, 38, 4487, 37, 4504, 38, 4511, 37, 4519, 38, 4538, 39, 4542, 38, 4554, 39, 4562, 38, 4572, 37, 4586, 38, 4596, 39, 4611, 38], //314 goldDrop: [26, 17, 17, 24, 25, 33, 36, 26, 25] }, { level: 18, ai:1, time: 1579, state: 1, action: [0, 39, 14, 88, 24, 39, 84, 38, 130, 39, 141, 88, 155, 39, 169, 90, 187, 37, 200, 88, 225, 40, 231, 88, 243, 37, 248, 88, 256, 39, 274, 90, 287, 37, 299, 39, 322, 38, 368, 39, 379, 88, 391, 39, 407, 90, 417, 40, 422, 90, 438, 40, 443, 90, 454, 40, 459, 90, 477, 40, 481, 90, 495, 40, 499, 90, 516, 40, 521, 90, 537, 40, 542, 37, 559, 39, 581, 38, 632, 39, 636, 88, 654, 39, 678, 37, 719, 38, 860, 39, 871, 88, 882, 39, 899, 90, 916, 37, 924, 88, 948, 39, 957, 37, 962, 88, 974, 37, 979, 88, 989, 37, 996, 88, 1009, 39, 1024, 88, 1034, 37, 1044, 88, 1058, 39, 1068, 88, 1080, 39, 1094, 90, 1110, 37, 1138, 37, 1165, 39, 1180, 40, 1193, 40, 1194, 40, 1195, 40, 1196, 40, 1197, 40, 1198, 40, 1199, 40, 1200, 40, 1201, 40, 1376, 37, 1392, 38, 1414, 39, 1496, 38] //82 }, { level: 19, ai:1, time: 5077, state: 1, action: [0, 37, 14, 38, 25, 39, 34, 38, 47, 39, 58, 38, 65, 88, 79, 39, 90, 37, 96, 88, 107, 39, 123, 90, 135, 39, 139, 90, 148, 37, 164, 88, 175, 37, 183, 88, 191, 39, 208, 90, 220, 37, 251, 38, 263, 39, 270, 38, 282, 37, 289, 38, 296, 37, 303, 38, 311, 37, 317, 38, 325, 37, 331, 38, 338, 37, 345, 38, 352, 37, 358, 38, 372, 39, 393, 88, 432, 39, 454, 38, 472, 37, 478, 38, 485, 37, 489, 38, 497, 37, 506, 90, 518, 37, 534, 39, 539, 90, 551, 37, 572, 38, 583, 90, 596, 40, 601, 90, 616, 40, 626, 37, 645, 39, 648, 90, 660, 37, 700, 39, 715, 40, 719, 90, 731, 40, 736, 90, 746, 38, 760, 37, 771, 40, 785, 39, 797, 38, 804, 39, 818, 37, 823, 88, 835, 37, 839, 88, 848, 39, 863, 90, 875, 39, 879, 90, 889, 37, 905, 88, 916, 37, 921, 88, 931, 39, 946, 90, 957, 37, 984, 39, 1007, 38, 1013, 39, 1025, 38, 1032, 39, 1039, 38, 1051, 37, 1059, 38, 1066, 37, 1073, 38, 1081, 37, 1088, 38, 1098, 37, 1105, 38, 1114, 37, 1121, 38, 1130, 37, 1137, 38, 1149, 39, 1168, 88, 1210, 39, 1232, 38, 1252, 37, 1257, 38, 1265, 37, 1271, 38, 1278, 37, 1288, 90, 1300, 37, 1320, 88, 1335, 39, 1350, 37, 1359, 88, 1369, 39, 1383, 90, 1398, 37, 1409, 88, 1422, 39, 1436, 39, 1445, 88, 1459, 39, 1477, 37, 1482, 88, 1493, 39, 1515, 37, 1528, 38, 1536, 37, 1543, 38, 1550, 37, 1556, 38, 1565, 37, 1573, 38, 1581, 37, 1588, 38, 1596, 37, 1602, 38, 1640, 39, 1658, 88, 1701, 39, 1724, 38, 1732, 88, 1744, 38, 1747, 88, 1759, 40, 1765, 88, 1775, 39, 1804, 90, 1816, 37, 1832, 37, 1872, 38, 1881, 37, 1888, 38, 1898, 37, 1903, 38, 1913, 37, 1919, 38, 1928, 37, 1934, 38, 1943, 37, 1948, 38, 1964, 39, 2005, 38, 2023, 37, 2030, 38, 2038, 37, 2044, 38, 2053, 39, 2061, 88, 2074, 39, 2117, 38, 2123, 39, 2130, 38, 2145, 37, 2152, 90, 2163, 37, 2166, 90, 2178, 37, 2212, 88, 2228, 40, 2232, 88, 2259, 39, 2288, 88, 2315, 39, 2321, 88, 2338, 39, 2355, 90, 2368, 37, 2438, 38, 2449, 37, 2454, 38, 2464, 37, 2470, 38, 2479, 37, 2485, 38, 2494, 37, 2499, 38, 2509, 37, 2514, 38, 2528, 39, 2569, 38, 2582, 39, 2608, 38, 2616, 39, 2626, 38, 2641, 88, 2656, 40, 2661, 88, 2672, 40, 2860, 88, 2873, 38, 2884, 88, 2901, 39, 2925, 37, 2932, 88, 2948, 39, 2975, 40, 2994, 39, 3016, 40, 3022, 39, 3035, 40, 3042, 39, 3050, 40, 3063, 40, 3064, 40, 3065, 40, 3066, 40, 3067, 40, 3068, 40, 3069, 40, 3070, 40, 3078, 37, 3089, 38, 3099, 37, 3103, 38, 3111, 39, 3118, 38, 3125, 39, 3131, 38, 3138, 39, 3143, 38, 3154, 37, 3159, 38, 3184, 37, 3203, 90, 3213, 39, 3251, 37, 3265, 88, 3274, 39, 3301, 38, 3310, 39, 3316, 38, 3323, 39, 3329, 38, 3337, 39, 3342, 38, 3352, 37, 3357, 38, 3366, 37, 3372, 38, 3381, 37, 3410, 40, 3416, 37, 3441, 40, 3453, 39, 3459, 88, 3479, 39, 3493, 90, 3504, 88, 3519, 39, 3540, 37, 3563, 39, 3581, 88, 3591, 39, 3616, 38, 3626, 39, 3634, 38, 3641, 39, 3649, 38, 3655, 39, 3662, 38, 3681, 37, 3687, 38, 3698, 37, 3704, 38, 3718, 37, 3722, 37, 3741, 38, 3760, 37, 3772, 40, 3780, 37, 3816, 38, 3824, 37, 3838, 37, 3839, 37, 3840, 37, 3841, 37, 3842, 37, 3863, 38, 3871, 37, 3877, 38, 3887, 37, 3893, 38, 3901, 37, 3906, 38, 3914, 37, 3920, 38, 3929, 37, 3934, 38, 3947, 39, 3961, 39, 3992, 38, 4006, 39, 4036, 38, 4044, 39, 4052, 38, 4069, 88, 4082, 40, 4087, 88, 4098, 40, 4106, 88, 4125, 39, 4155, 37, 4161, 88, 4171, 39, 4207, 38, 4220, 39, 4225, 38, 4234, 39, 4239, 38, 4248, 39, 4263, 37, 4280, 38, 4290, 39, 4295, 38, 4306, 37, 4317, 90, 4328, 37, 4344, 39, 4353, 90, 4363, 37, 4379, 88, 4391, 39, 4410, 38, 4423, 39, 4429, 38, 4442, 39, 4448, 38, 4458, 39, 4465, 38, 4481, 39, 4491, 88, 4505, 39, 4512, 90, 4527, 37, 4536, 90, 4549, 37, 4561, 88, 4574, 39, 4593, 90, 4603, 37, 4623, 39, 4685, 37, 4692, 38, 4699, 37, 4705, 38, 4712, 37, 4717, 38, 4725, 37, 4730, 38, 4739, 37, 4743, 38, 4753, 37, 4784, 40, 4791, 37, 4798, 40, 4807, 90, 4849, 37, 4864, 38, 4876, 37, 4913, 38, 4921, 37, 4926, 38, 4935, 37, 4940, 38, 4948, 37, 4956, 38, 4964, 37, 4969, 38, 4978, 37, 4983, 38, 4995, 39, 5035, 38, 5052, 37, 5059, 38, 5066, 37, 5071, 38] //401 }, { level: 20, ai:1, time: 7612, state: 1, action: [0, 37, 15, 38, 336, 39, 395, 37, 398, 88, 409, 39, 420, 37, 493, 40, 504, 38, 581, 39, 590, 38, 610, 40, 620, 39, 688, 37, 711, 90, 723, 39, 727, 90, 740, 39, 744, 90, 757, 39, 761, 90, 776, 39, 779, 90, 793, 39, 797, 90, 859, 37, 912, 38, 959, 90, 977, 39, 981, 90, 997, 39, 1001, 90, 1018, 39, 1021, 90, 1033, 39, 1039, 90, 1084, 39, 1090, 38, 1226, 39, 1232, 38, 1272, 90, 1275, 39, 1292, 90, 1334, 37, 1361, 90, 1373, 37, 1402, 38, 1412, 90, 1468, 37, 1491, 40, 1499, 39, 1518, 40, 1522, 39, 1640, 90, 1729, 37, 1744, 88, 1757, 37, 1771, 37, 1772, 37, 1773, 37, 1774, 37, 1775, 37, 1776, 37, 1777, 37, 1778, 37, 1779, 37, 1780, 37, 1781, 37, 1782, 37, 1783, 37, 1784, 37, 1785, 37, 1786, 37, 1787, 37, 1788, 37, 1789, 37, 1804, 40, 1818, 40, 1819, 40, 1957, 38, 1975, 39, 2020, 37, 2038, 38, 2042, 90, 2093, 37, 2122, 38, 2272, 39, 2280, 38, 2329, 39, 2368, 40, 2379, 37, 2388, 39, 2410, 37, 2424, 39, 2464, 39, 2559, 37, 2567, 88, 2592, 37, 2595, 88, 2652, 39, 2671, 38, 2745, 37, 2755, 38, 2767, 40, 2782, 37, 2791, 40, 2797, 39, 2816, 39, 2820, 37, 2834, 37, 2835, 37, 2836, 37, 2871, 39, 2910, 40, 2923, 37, 2986, 39, 3046, 88, 3090, 39, 3106, 38, 3179, 37, 3204, 38, 3229, 40, 3247, 37, 3293, 39, 3323, 90, 3335, 37, 3380, 39, 3385, 90, 3394, 37, 3443, 39, 3495, 88, 3552, 39, 3572, 38, 3702, 37, 3746, 38, 3779, 40, 3808, 37, 3827, 39, 3837, 90, 3850, 37, 3892, 39, 3935, 37, 3946, 38, 4016, 37, 4021, 88, 4079, 39, 4127, 38, 4246, 37, 4299, 40, 4329, 39, 4335, 37, 4405, 39, 4419, 39, 4420, 39, 4466, 37, 4503, 38, 4576, 88, 4638, 39, 4652, 90, 4662, 39, 4669, 90, 4677, 39, 4691, 39, 4692, 39, 4693, 39, 4694, 39, 4695, 39, 4696, 39, 4697, 39, 4698, 39, 4714, 40, 4728, 40, 4926, 38, 4942, 37, 4947, 39, 4973, 37, 4978, 90, 5071, 37, 5085, 37, 5086, 37, 5087, 37, 5120, 39, 5153, 88, 5177, 39, 5185, 37, 5198, 88, 5212, 37, 5217, 88, 5231, 37, 5236, 88, 5249, 37, 5254, 88, 5268, 37, 5272, 88, 5287, 37, 5291, 88, 5305, 37, 5309, 88, 5323, 37, 5328, 88, 5341, 37, 5346, 88, 5520, 37, 5532, 88, 5580, 39, 5691, 90, 5744, 38, 5817, 37, 5828, 40, 5840, 90, 5851, 37, 5882, 39, 5902, 37, 5932, 38, 5939, 39, 5963, 37, 5978, 38, 6022, 39, 6027, 90, 6041, 37, 6098, 39, 6154, 88, 6216, 39, 6240, 40, 6295, 38, 6379, 37, 6423, 40, 6448, 37, 6469, 39, 6479, 90, 6489, 37, 6537, 39, 6549, 38, 6693, 88, 6737, 39, 6794, 40, 6808, 40, 7037, 38, 7118, 37, 7207, 40, 7219, 37, 7259, 40, 7270, 39, 7332, 37, 7350, 38, 7390, 90, 7403, 37, 7414, 90, 7427, 37, 7459, 38, 7468, 90, 7526, 37, 7546, 38], //253 goldDrop: [37, 25, 19, 23, 22, 26, 16, 22, 30, 38, 35, 37, 22, 23, 38, 26, 28, 16, 16, 33, 15, 16, 18, 33, 20, 24], bornPos: [1, 2, 3, 1, 9, 26, 7, 5, 4, 6, 13] }, { level: 21, ai:1, time: 1941, state: 1, action: [0, 90, 12, 39, 16, 90, 29, 37, 37, 90, 48, 37, 75, 88, 82, 39, 102, 90, 111, 37, 151, 39, 166, 88, 186, 39, 200, 39, 201, 39, 202, 39, 203, 39, 204, 39, 206, 38, 224, 39, 228, 88, 239, 39, 249, 37, 254, 88, 266, 37, 270, 88, 278, 39, 295, 37, 300, 88, 313, 37, 317, 88, 328, 37, 333, 88, 341, 37, 358, 39, 380, 88, 390, 37, 396, 88, 401, 37, 414, 37, 415, 37, 416, 37, 417, 37, 418, 37, 419, 37, 420, 37, 425, 39, 441, 88, 449, 37, 463, 37, 464, 37, 470, 39, 499, 88, 563, 39, 604, 38, 674, 37, 714, 40, 729, 90, 741, 39, 745, 90, 756, 37, 773, 88, 779, 39, 801, 90, 811, 37, 831, 88, 840, 39, 859, 90, 869, 37, 887, 88, 896, 39, 914, 90, 925, 37, 942, 88, 953, 39, 971, 90, 982, 37, 1000, 88, 1012, 39, 1047, 38, 1079, 88, 1114, 39, 1142, 38, 1215, 37, 1247, 40, 1258, 88, 1270, 37, 1275, 88, 1283, 39, 1300, 37, 1306, 88, 1319, 39, 1335, 37, 1342, 88, 1352, 39, 1371, 37, 1378, 88, 1391, 39, 1405, 90, 1416, 37, 1433, 39, 1440, 90, 1451, 37, 1470, 88, 1481, 39, 1500, 37, 1507, 88, 1519, 39, 1532, 90, 1543, 37, 1562, 88, 1573, 39, 1592, 38, 1616, 88, 1651, 39, 1667, 38, 1743, 39, 1775, 88, 1821, 39, 1858, 38] //120 }, { level: 22, ai:1, time: 5279, state: 1, action: [0, 39, 19, 37, 102, 40, 121, 39, 348, 38, 536, 40, 616, 39, 741, 38, 816, 37, 879, 40, 895, 38, 903, 40, 911, 37, 918, 39, 934, 37, 941, 38, 956, 37, 995, 39, 1034, 40, 1049, 39, 1067, 38, 1075, 39, 1089, 37, 1098, 39, 1108, 37, 1133, 39, 1143, 38, 1147, 39, 1158, 88, 1168, 39, 1180, 38, 1221, 37, 1247, 38, 1276, 37, 1281, 38, 1290, 39, 1299, 38, 1384, 40, 1394, 37, 1399, 40, 1431, 39, 1438, 40, 1555, 38, 1568, 37, 1572, 38, 1606, 39, 1615, 38, 1625, 39, 1637, 88, 1656, 39, 1665, 38, 1709, 37, 1733, 38, 1779, 38, 1784, 37, 1791, 38, 1801, 39, 1807, 38, 1853, 40, 1863, 37, 1868, 40, 1902, 39, 1907, 40, 1919, 40, 1920, 40, 1921, 40, 1922, 40, 1923, 40, 1924, 40, 2023, 38, 2035, 37, 2041, 38, 2078, 39, 2086, 38, 2093, 39, 2189, 37, 2242, 38, 2254, 37, 2258, 38, 2272, 39, 2282, 37, 2283, 39, 2295, 40, 2299, 39, 2308, 37, 2316, 39, 2326, 37, 2338, 38, 2359, 39, 2366, 38, 2377, 39, 2387, 88, 2396, 39, 2431, 37, 2444, 39, 2462, 40, 2478, 38, 2493, 37, 2518, 40, 2527, 39, 2540, 39, 2553, 38, 2564, 37, 2597, 39, 2624, 38, 2655, 37, 2725, 39, 2736, 38, 2746, 37, 2754, 38, 2766, 37, 2862, 39, 2901, 38, 2913, 39, 2921, 38, 2931, 37, 2946, 39, 2957, 38, 2979, 37, 2986, 38, 2998, 37, 3007, 90, 3017, 37, 3075, 39, 3079, 39, 3085, 37, 3096, 39, 3122, 37, 3144, 39, 3162, 37, 3187, 38, 3218, 39, 3229, 39, 3230, 39, 3267, 40, 3307, 37, 3323, 39, 3633, 38, 3710, 37, 3772, 38, 3857, 37, 3860, 40, 3867, 39, 3898, 38, 4042, 40, 4119, 40, 4201, 37, 4307, 38, 4386, 39, 4446, 40, 4451, 39, 4631, 38, 4781, 40, 4793, 40, 4794, 40, 4795, 40, 4796, 40, 4797, 40, 4798, 40, 4799, 40, 4800, 40, 4801, 40, 4802, 40, 4803, 40, 4974, 37, 5073, 38, 5151, 39, 5242, 37, 5273, 38], //169 goldDrop: [24, 19, 34, 37, 17, 16, 25, 21, 34, 25, 19, 35] }, { level: 23, ai:1, time: 3015, state: 1, action: [0, 88, 20, 39, 33, 37, 47, 88, 54, 39, 97, 38, 111, 88, 124, 40, 130, 88, 142, 38, 152, 37, 157, 38, 173, 39, 190, 37, 198, 90, 209, 37, 219, 38, 291, 40, 332, 38, 349, 88, 375, 40, 384, 88, 398, 38, 400, 88, 413, 40, 419, 88, 431, 38, 443, 37, 448, 38, 464, 39, 483, 38, 491, 88, 500, 39, 535, 37, 544, 90, 555, 37, 573, 90, 585, 37, 634, 38, 653, 37, 659, 38, 719, 39, 742, 38, 778, 39, 806, 88, 817, 39, 853, 38, 863, 88, 874, 39, 912, 38, 929, 90, 940, 37, 987, 88, 1003, 39, 1043, 38, 1060, 40, 1069, 37, 1077, 88, 1087, 37, 1093, 88, 1102, 39, 1113, 88, 1130, 39, 1152, 37, 1162, 88, 1173, 39, 1214, 38, 1248, 37, 1263, 39, 1272, 38, 1307, 37, 1322, 39, 1330, 38, 1352, 40, 1356, 37, 1375, 88, 1388, 37, 1406, 39, 1416, 40, 1422, 37, 1430, 40, 1447, 39, 1467, 38, 1484, 39, 1502, 38, 1540, 40, 1545, 39, 1601, 37, 1615, 37, 1616, 37, 1617, 37, 1618, 37, 1619, 37, 1620, 37, 1621, 37, 1622, 37, 1623, 37, 1624, 37, 1625, 37, 1626, 37, 1627, 37, 1628, 37, 1629, 37, 1630, 37, 1631, 37, 1632, 37, 1633, 37, 1634, 37, 1635, 37, 1636, 37, 1637, 37, 1638, 37, 1639, 37, 1640, 37, 1641, 37, 1642, 37, 1643, 37, 1644, 37, 1645, 37, 1646, 37, 1647, 37, 1654, 90, 1665, 37, 1693, 90, 1719, 37, 1755, 90, 1767, 39, 1771, 90, 1784, 39, 1787, 90, 1800, 37, 1814, 88, 1826, 40, 1830, 88, 1841, 38, 1852, 37, 1865, 39, 1921, 37, 1933, 90, 1948, 37, 1959, 39, 1978, 37, 1996, 38, 2169, 39, 2183, 39, 2184, 39, 2188, 38, 2195, 88, 2207, 39, 2213, 88, 2225, 39, 2240, 37, 2279, 38, 2284, 90, 2295, 37, 2344, 38, 2363, 90, 2376, 40, 2382, 90, 2392, 40, 2407, 39, 2453, 40, 2502, 38, 2508, 90, 2525, 37, 2577, 38, 2584, 90, 2594, 38, 2606, 37, 2612, 90, 2622, 37, 2634, 39, 2698, 38, 2744, 39, 2758, 39, 2766, 38, 2834, 39, 2868, 37, 2873, 88, 2882, 39, 2938, 38] //181 }, { level: 26, //OK ai:1, time: 6562, state: 1, action: [0, 39, 16, 88, 71, 37, 86, 38, 131, 88, 184, 39, 199, 38, 214, 90, 250, 39, 265, 38, 305, 90, 365, 37, 379, 88, 390, 40, 395, 88, 405, 40, 411, 88, 425, 39, 443, 90, 597, 37, 618, 38, 630, 39, 688, 39, 707, 38, 713, 39, 746, 40, 761, 37, 800, 38, 814, 37, 855, 39, 866, 88, 922, 37, 926, 88, 938, 40, 943, 88, 955, 40, 960, 88, 974, 39, 992, 90, 1154, 37, 1169, 38, 1180, 39, 1244, 38, 1256, 39, 1272, 90, 1350, 37, 1365, 88, 1375, 40, 1381, 88, 1392, 40, 1397, 88, 1410, 39, 1429, 38, 1489, 90, 1585, 37, 1603, 38, 1614, 39, 2092, 38, 2106, 39, 2118, 37, 2129, 88, 2276, 40, 2282, 88, 2341, 40, 2346, 88, 2356, 38, 2370, 39, 2379, 88, 2394, 39, 2430, 37, 2518, 38, 2557, 40, 2563, 39, 2603, 38, 2612, 39, 2619, 88, 2691, 37, 2695, 88, 2707, 40, 2713, 88, 2727, 40, 2731, 88, 2745, 39, 2764, 38, 2858, 90, 2931, 37, 2944, 37, 2945, 37, 2946, 37, 2947, 37, 2948, 37, 2949, 37, 2953, 38, 2960, 39, 2972, 38, 2976, 39, 3089, 38, 3108, 90, 3345, 37, 3352, 90, 3575, 37, 3580, 90, 3600, 37, 3608, 39, 3621, 39, 3622, 39, 3623, 39, 3624, 39, 3625, 39, 3626, 39, 3628, 90, 3645, 37, 3655, 90, 3671, 37, 3679, 39, 3693, 39, 3716, 90, 3740, 88, 3758, 39, 3766, 37, 3842, 39, 3909, 38, 3916, 39, 3923, 38, 3928, 39, 3935, 38, 3940, 39, 3946, 38, 3951, 39, 3959, 38, 3963, 39, 3971, 38, 3999, 37, 4006, 40, 4016, 39, 4030, 39, 4031, 39, 4035, 38, 4058, 37, 4069, 40, 4082, 39, 4100, 38, 4121, 37, 4136, 40, 4153, 37, 4160, 38, 4170, 37, 4174, 38, 4214, 37, 4285, 40, 4303, 39, 4339, 38, 4356, 39, 4384, 38, 4404, 90, 4460, 39, 4464, 90, 4475, 40, 4479, 90, 4493, 40, 4496, 90, 4510, 37, 4525, 38, 4594, 37, 4598, 88, 4689, 39, 4705, 38, 4716, 39, 4800, 38, 4808, 37, 4842, 40, 4858, 39, 4901, 38, 4918, 39, 4947, 90, 5019, 39, 5022, 90, 5032, 40, 5037, 90, 5049, 40, 5053, 90, 5072, 37, 5088, 38, 5159, 88, 5239, 39, 5250, 38, 5267, 37, 5286, 38, 5417, 37, 5431, 88, 5476, 39, 5509, 38, 5524, 37, 5536, 39, 5545, 90, 5603, 39, 5606, 90, 5617, 40, 5622, 90, 5636, 40, 5639, 90, 5654, 37, 5673, 38, 5760, 88, 5832, 39, 5848, 38, 5860, 39, 5983, 38, 5988, 90, 5996, 40, 6002, 90, 6012, 40, 6016, 90, 6028, 40, 6032, 90, 6042, 37, 6079, 39, 6106, 38, 6215, 37, 6255, 40, 6280, 39, 6293, 38, 6306, 39, 6309, 38, 6333, 37, 6344, 40, 6360, 39, 6372, 38, 6385, 39, 6388, 38, 6412, 37, 6428, 40, 6445, 39, 6460, 38, 6478, 37, 6497, 38, 6529, 39, 6535, 38, 6542, 39, 6546, 38, 6552, 39, 6556, 38], //242 bornPos: [1, 8, 12] }, { level: 27, //OK ai:1, time: 2831, state: 1, action: [0, 39, 18, 38, 51, 90, 239, 39, 253, 39, 254, 39, 255, 39, 256, 39, 257, 39, 258, 39, 259, 39, 260, 39, 261, 39, 262, 39, 364, 37, 468, 38, 621, 37, 629, 39, 643, 39, 644, 39, 645, 39, 646, 39, 647, 39, 648, 39, 649, 39, 760, 37, 880, 38, 959, 39, 971, 38, 978, 39, 1114, 37, 1227, 38, 1309, 39, 1366, 39, 1399, 37, 1440, 39, 1504, 37, 1547, 37, 1558, 38, 1604, 90, 1623, 40, 1625, 90, 1642, 39, 1644, 90, 1760, 39, 1767, 38, 2092, 39, 2106, 39, 2107, 39, 2108, 39, 2109, 39, 2110, 39, 2111, 39, 2112, 39, 2113, 39, 2114, 39, 2115, 39, 2116, 39, 2117, 39, 2118, 39, 2119, 39, 2120, 39, 2121, 39, 2122, 39, 2123, 39, 2212, 40, 2221, 37, 2315, 39, 2405, 38, 2416, 37, 2512, 39, 2525, 37, 2542, 39, 2697, 37, 2748, 38], //75 goldDrop: [38, 17] }, { level: 28, //OK ai:1, time: 1012, state: 1, action: [0, 39, 18, 38, 84, 39, 98, 39, 99, 39, 100, 39, 101, 39, 102, 39, 103, 39, 104, 39, 159, 88, 178, 39, 195, 90, 209, 37, 220, 38, 253, 37, 334, 38, 350, 39, 365, 38, 378, 37, 402, 38, 423, 37, 434, 38, 456, 90, 469, 40, 475, 90, 488, 40, 492, 90, 563, 40, 567, 90, 581, 40, 585, 90, 641, 40, 645, 37, 656, 90, 665, 39, 667, 90, 679, 39, 683, 90, 695, 40, 699, 90, 709, 37, 734, 39, 756, 88, 768, 37, 773, 88, 821, 39, 841, 38, 858, 39, 872, 38, 886, 37, 911, 38, 930, 37, 941, 38, 955, 37, 975, 38, 989, 39, 1001, 38] //58 }, { level: 29, ai:1, time: 6605, state: 1, action: [0, 88, 333, 39, 383, 40, 390, 39, 441, 37, 459, 38, 473, 37, 492, 38, 505, 37, 516, 38, 767, 37, 776, 39, 822, 40, 861, 90, 1005, 38, 1037, 37, 1060, 38, 1073, 37, 1094, 38, 1110, 37, 1145, 40, 1161, 39, 1212, 38, 1358, 40, 1396, 39, 1419, 40, 1428, 39, 1450, 40, 1459, 39, 1496, 38, 1503, 37, 1524, 40, 1528, 90, 1671, 38, 1701, 37, 1721, 38, 1736, 37, 1747, 40, 1765, 37, 1792, 40, 1798, 39, 1813, 40, 1822, 39, 1859, 38, 1891, 37, 1902, 40, 1931, 38, 1949, 40, 1953, 39, 1963, 38, 1997, 37, 2017, 40, 2039, 37, 2049, 39, 2063, 37, 2086, 40, 2089, 39, 2096, 38, 2115, 39, 2118, 38, 2149, 37, 2170, 38, 2179, 37, 2193, 40, 2225, 37, 2260, 40, 2264, 39, 2280, 40, 2285, 39, 2303, 40, 2306, 39, 2333, 40, 2336, 39, 2371, 38, 2403, 37, 2425, 38, 2439, 37, 2471, 38, 2480, 37, 2484, 40, 2531, 38, 2549, 40, 2552, 39, 2573, 40, 2585, 39, 2620, 38, 2652, 37, 2672, 38, 2683, 37, 2702, 38, 2713, 37, 2722, 40, 2752, 37, 2762, 39, 2802, 40, 2807, 37, 2825, 38, 2858, 39, 2870, 40, 2894, 39, 2931, 40, 2936, 37, 2956, 38, 2992, 39, 3010, 40, 3039, 39, 3065, 40, 3070, 37, 3089, 38, 3194, 37, 3246, 39, 3250, 90, 3261, 39, 3265, 90, 3276, 39, 3280, 90, 3291, 40, 3296, 90, 3313, 40, 3317, 90, 3369, 37, 3393, 40, 3399, 39, 3409, 40, 3416, 39, 3421, 38, 3429, 37, 3445, 38, 3454, 37, 3464, 40, 3475, 37, 3497, 38, 3524, 39, 3537, 38, 3543, 37, 3557, 38, 3566, 39, 3577, 38, 3598, 39, 3601, 38, 3616, 39, 3619, 38, 3736, 39, 3793, 39, 3811, 90, 3822, 40, 3835, 39, 3849, 90, 3859, 39, 3865, 90, 3878, 40, 3885, 39, 3897, 40, 3905, 39, 3925, 40, 3931, 37, 3937, 38, 3947, 39, 4032, 37, 4041, 39, 4051, 38, 4060, 39, 4077, 38, 4092, 39, 4104, 38, 4118, 39, 4127, 37, 4146, 39, 4160, 39, 4161, 39, 4162, 39, 4163, 39, 4164, 39, 4165, 39, 4166, 39, 4167, 39, 4168, 39, 4173, 38, 4183, 37, 4190, 40, 4203, 40, 4204, 40, 4205, 40, 4206, 40, 4207, 40, 4208, 40, 4209, 40, 4213, 37, 4271, 38, 4318, 37, 4336, 38, 4346, 37, 4366, 38, 4377, 39, 4388, 37, 4398, 38, 4409, 37, 4431, 38, 4449, 37, 4463, 38, 4467, 37, 4474, 38, 4494, 39, 4498, 38, 4572, 39, 4621, 39, 4632, 90, 4642, 39, 4645, 90, 4658, 39, 4661, 90, 4674, 39, 4678, 90, 4688, 40, 4695, 90, 4715, 39, 4725, 38, 4736, 39, 4741, 90, 4753, 39, 4757, 90, 4768, 39, 4771, 90, 4785, 39, 4786, 90, 4832, 40, 4838, 90, 4862, 38, 4908, 39, 4997, 38, 5002, 39, 5015, 38, 5105, 39, 5116, 38, 5341, 37, 5355, 37, 5356, 37, 5357, 37, 5358, 37, 5359, 37, 5360, 37, 5361, 37, 5362, 37, 5363, 37, 5364, 37, 5365, 37, 5366, 37, 5367, 37, 5368, 37, 5369, 37, 5370, 37, 5371, 37, 5372, 37, 5373, 37, 5374, 37, 5375, 37, 5376, 37, 5377, 37, 5378, 37, 5379, 37, 5380, 37, 5381, 37, 5382, 37, 5383, 37, 5384, 37, 5385, 37, 5386, 37, 5387, 37, 5388, 37, 5389, 37, 5390, 37, 5391, 37, 5392, 37, 5393, 37, 5394, 37, 5395, 37, 5396, 37, 5397, 37, 5398, 37, 5399, 37, 5400, 37, 5401, 37, 5402, 37, 5403, 37, 5404, 37, 5405, 37, 5406, 37, 5407, 37, 5408, 37, 5409, 37, 5410, 37, 5411, 37, 5412, 37, 5413, 37, 5414, 37, 5415, 37, 5416, 37, 5417, 37, 5418, 37, 5419, 37, 5420, 37, 5421, 37, 5426, 38, 5433, 37, 5443, 38, 5451, 37, 5457, 38, 5465, 37, 5481, 39, 5503, 40, 5517, 40, 5518, 40, 5519, 40, 5557, 38, 5638, 37, 5670, 38, 5716, 37, 5737, 38, 5748, 37, 5770, 38, 5790, 37, 5799, 38, 5811, 39, 5814, 38, 5840, 39, 5845, 38, 5905, 39, 5963, 39, 5968, 90, 5980, 39, 5984, 90, 5995, 39, 5999, 90, 6092, 39, 6105, 38, 6120, 39, 6124, 90, 6137, 39, 6142, 90, 6154, 39, 6158, 90, 6223, 39, 6241, 38, 6267, 39, 6275, 40, 6332, 38, 6341, 39, 6360, 39, 6366, 38, 6384, 39, 6391, 38, 6405, 37, 6433, 38, 6440, 37, 6455, 38, 6464, 37, 6470, 38, 6476, 37, 6493, 38, 6504, 37, 6507, 38, 6521, 37, 6541, 38, 6561, 37, 6567, 38, 6583, 39, 6588, 38], //367 goldDrop: [31, 37, 33, 26, 36, 35, 38, 39, 31, 35, 39, 36, 20, 14, 16, 39, 29, 18, 30, 39, 15, 16, 15, 23, 36], bornPos: [1, 14, 5, 6, 7, 13] }, { level: 34, ai:1, time: 8419, state: 1, action: [0, 39, 16, 38, 29, 90, 44, 38, 47, 90, 61, 37, 75, 38, 131, 90, 160, 40, 174, 39, 185, 38, 257, 37, 308, 38, 321, 90, 326, 37, 368, 40, 373, 37, 378, 40, 384, 40, 429, 39, 434, 37, 440, 38, 448, 38, 491, 39, 495, 38, 503, 39, 541, 37, 552, 38, 568, 90, 576, 37, 613, 40, 619, 37, 622, 40, 627, 40, 643, 39, 648, 37, 652, 38, 676, 39, 682, 38, 687, 39, 719, 38, 792, 90, 801, 37, 838, 40, 845, 37, 847, 40, 858, 37, 862, 40, 895, 39, 901, 37, 906, 38, 941, 39, 948, 38, 953, 39, 985, 38, 1015, 90, 1024, 37, 1042, 90, 1052, 37, 1058, 40, 1094, 37, 1103, 40, 1109, 37, 1117, 39, 1123, 38, 1136, 39, 1146, 38, 1170, 37, 1176, 38, 1183, 37, 1188, 38, 1209, 39, 1223, 39, 1224, 39, 1225, 39, 1226, 39, 1227, 39, 1228, 39, 1229, 39, 1230, 39, 1231, 39, 1232, 39, 1233, 39, 1234, 39, 1235, 39, 1237, 38, 1249, 37, 1253, 38, 1275, 90, 1287, 37, 1302, 90, 1315, 37, 1321, 40, 1346, 37, 1363, 39, 1367, 38, 1383, 37, 1389, 39, 1422, 38, 1444, 37, 1450, 38, 1457, 37, 1461, 38, 1473, 39, 1487, 39, 1488, 39, 1489, 39, 1490, 39, 1491, 39, 1492, 39, 1493, 39, 1494, 39, 1495, 39, 1496, 39, 1497, 39, 1498, 39, 1499, 39, 1500, 38, 1512, 37, 1516, 38, 1535, 90, 1545, 37, 1562, 90, 1575, 37, 1583, 40, 1590, 39, 1603, 40, 1620, 37, 1627, 38, 1637, 37, 1640, 38, 1656, 37, 1661, 38, 1669, 37, 1672, 38, 1684, 39, 1698, 39, 1699, 39, 1701, 39, 1702, 39, 1709, 38, 1784, 90, 1792, 37, 1809, 90, 1820, 37, 1833, 39, 1846, 40, 1850, 39, 1861, 40, 1875, 37, 1881, 38, 1900, 37, 1904, 38, 1913, 37, 1916, 38, 1928, 39, 1941, 39, 1942, 39, 1943, 39, 1951, 38, 2041, 90, 2051, 37, 2067, 90, 2078, 37, 2088, 40, 2094, 39, 2120, 37, 2144, 38, 2162, 37, 2166, 38, 2175, 37, 2180, 38, 2191, 39, 2216, 38, 2266, 39, 2306, 88, 2316, 37, 2321, 88, 2332, 37, 2337, 88, 2346, 39, 2363, 88, 2373, 37, 2379, 88, 2389, 39, 2399, 88, 2412, 39, 2419, 40, 2454, 37, 2460, 39, 2465, 38, 2500, 37, 2509, 38, 2521, 37, 2526, 38, 2563, 39, 2575, 88, 2585, 37, 2590, 88, 2601, 37, 2606, 88, 2622, 39, 2636, 88, 2646, 37, 2652, 88, 2661, 39, 2676, 88, 2686, 37, 2689, 88, 2700, 39, 2709, 40, 2730, 37, 2739, 40, 2751, 39, 2762, 38, 2795, 37, 2805, 38, 2818, 37, 2828, 38, 2842, 39, 2855, 88, 2866, 37, 2868, 88, 2877, 37, 2884, 88, 2895, 37, 2899, 88, 2908, 39, 2925, 88, 2934, 37, 2941, 88, 2949, 39, 2960, 88, 2974, 39, 2983, 40, 3002, 37, 3012, 38, 3026, 40, 3035, 39, 3041, 39, 3046, 38, 3068, 37, 3077, 38, 3089, 37, 3095, 38, 3129, 39, 3140, 88, 3150, 37, 3155, 88, 3166, 37, 3170, 88, 3178, 39, 3196, 88, 3206, 37, 3211, 88, 3222, 39, 3231, 88, 3249, 37, 3255, 40, 3268, 37, 3273, 40, 3293, 39, 3310, 38, 3334, 37, 3344, 38, 3358, 37, 3365, 38, 3446, 39, 3471, 40, 3523, 90, 3534, 40, 3537, 90, 3548, 37, 3561, 90, 3574, 39, 3585, 40, 3663, 38, 3736, 37, 3813, 38, 3841, 40, 3869, 38, 3898, 90, 3908, 37, 3948, 39, 3957, 38, 3991, 40, 3995, 90, 4026, 38, 4033, 39, 4046, 39, 4047, 39, 4048, 39, 4049, 39, 4050, 39, 4051, 39, 4052, 39, 4053, 39, 4054, 39, 4055, 39, 4082, 40, 4131, 38, 4173, 39, 4198, 40, 4269, 37, 4275, 90, 4284, 37, 4371, 38, 4380, 40, 4388, 39, 4471, 38, 4651, 90, 4664, 37, 4696, 38, 4762, 39, 4859, 38, 4929, 90, 4941, 37, 4985, 38, 5034, 39, 5123, 38, 5168, 90, 5184, 37, 5239, 38, 5277, 39, 5364, 38, 5459, 90, 5471, 37, 5525, 38, 5537, 39, 5598, 38, 5605, 39, 5610, 38, 5821, 40, 5893, 37, 5898, 90, 5908, 37, 5975, 38, 6003, 39, 6088, 38, 6094, 39, 6098, 38, 6195, 40, 6268, 37, 6271, 90, 6280, 37, 6357, 38, 6377, 39, 6391, 39, 6393, 40, 6410, 39, 6415, 39, 6471, 38, 6477, 39, 6482, 38, 6510, 40, 6522, 90, 6531, 37, 6545, 90, 6555, 37, 6558, 90, 6570, 37, 6589, 38, 6608, 40, 6624, 39, 6640, 38, 6649, 39, 6659, 38, 6703, 39, 6719, 37, 6727, 40, 6737, 39, 6743, 37, 6751, 40, 6760, 39, 6772, 37, 6780, 40, 6790, 39, 6801, 37, 6809, 40, 6818, 39, 6831, 37, 6846, 38, 6889, 90, 7084, 40, 7295, 38, 7350, 39, 7360, 38, 7440, 39, 7475, 37, 7486, 37, 7500, 39, 7539, 40, 7546, 37, 7561, 38, 7580, 88, 7603, 37, 7607, 88, 7678, 39, 7708, 38, 7766, 37, 7782, 39, 7815, 37, 7837, 39, 7851, 39, 7852, 39, 7853, 39, 7854, 39, 7855, 39, 7856, 39, 7857, 39, 7903, 40, 7917, 40, 7935, 37, 7962, 39, 7972, 88, 8018, 39, 8050, 38, 8098, 37, 8111, 39, 8135, 37, 8140, 39, 8160, 40, 8170, 37, 8175, 39, 8184, 40, 8193, 37, 8199, 39, 8206, 40, 8216, 37, 8222, 39, 8231, 40, 8241, 37, 8274, 38, 8283, 37, 8295, 38, 8362, 37, 8413, 38], //437 bornPos: [1, 5] }, { level: 38, ai:1, time: 15166, state: 1, action: [0, 40, 21, 39, 62, 37, 66, 88, 384, 88, 400, 39, 414, 39, 415, 39, 416, 39, 417, 39, 418, 39, 419, 39, 420, 39, 424, 40, 438, 39, 452, 39, 453, 39, 454, 39, 455, 39, 456, 39, 457, 39, 458, 39, 459, 39, 460, 39, 461, 39, 462, 39, 463, 39, 464, 39, 465, 39, 466, 39, 467, 39, 468, 39, 470, 39, 471, 39, 472, 39, 473, 39, 474, 39, 475, 39, 476, 39, 477, 39, 478, 39, 536, 38, 762, 37, 817, 39, 875, 37, 905, 38, 938, 40, 945, 90, 970, 38, 979, 39, 1374, 40, 1388, 37, 1437, 38, 1459, 39, 1480, 37, 1500, 38, 1781, 40, 1826, 38, 1993, 37, 2069, 39, 2103, 38, 2370, 40, 2390, 37, 2518, 39, 2525, 38, 2549, 37, 2557, 39, 2577, 39, 2586, 38, 2598, 37, 2604, 39, 2618, 39, 2619, 39, 2622, 38, 2633, 39, 2639, 38, 2740, 39, 2780, 40, 2797, 39, 2813, 37, 2842, 39, 2856, 37, 2912, 38, 2998, 39, 3015, 38, 3052, 39, 3059, 38, 3248, 39, 3291, 37, 3306, 39, 3321, 38, 3485, 40, 3493, 37, 3496, 40, 3509, 38, 3523, 38, 3529, 37, 3606, 38, 3613, 39, 3624, 38, 3643, 39, 3650, 38, 3675, 39, 3699, 38, 3717, 40, 3750, 37, 3757, 39, 3784, 37, 3812, 38, 3823, 37, 3855, 38, 3870, 40, 3895, 38, 3904, 39, 3911, 38, 3983, 40, 3997, 40, 3998, 40, 3999, 40, 4000, 40, 4001, 40, 4002, 40, 4003, 40, 4004, 40, 4005, 40, 4006, 40, 4007, 40, 4008, 40, 4009, 40, 4010, 40, 4011, 40, 4012, 40, 4165, 38, 4172, 39, 4201, 38, 4294, 40, 4316, 39, 4366, 38, 4411, 37, 4417, 39, 4422, 38, 4443, 37, 4486, 38, 4509, 37, 4531, 38, 4580, 39, 4589, 38, 4609, 40, 4634, 39, 4646, 38, 4744, 39, 4764, 38, 4819, 40, 4829, 37, 4840, 39, 4848, 40, 4858, 37, 4862, 40, 4877, 39, 4883, 37, 4903, 39, 4963, 38, 5229, 40, 5336, 38, 5568, 37, 5708, 40, 5817, 38, 5822, 39, 5881, 38, 6120, 40, 6143, 39, 6193, 38, 6219, 37, 6232, 40, 6236, 37, 6254, 39, 6258, 37, 6268, 39, 6282, 39, 6290, 39, 6313, 38, 6336, 37, 6346, 38, 6357, 37, 6364, 38, 6405, 39, 6421, 38, 6488, 39, 6492, 37, 6501, 39, 6512, 37, 6528, 38, 6670, 39, 6706, 40, 6714, 39, 6726, 40, 6748, 37, 6819, 38, 6857, 40, 6879, 39, 6928, 38, 6983, 37, 6995, 38, 7014, 39, 7044, 40, 7054, 39, 7061, 38, 7081, 40, 7097, 37, 7103, 40, 7139, 37, 7178, 38, 7189, 37, 7206, 38, 7261, 39, 7285, 37, 7336, 37, 7343, 38, 7360, 37, 7392, 38, 7445, 37, 7475, 38, 7498, 37, 7503, 38, 7559, 40, 7574, 39, 7619, 40, 7624, 39, 7635, 38, 7651, 39, 7657, 38, 7672, 39, 7697, 40, 7707, 39, 7735, 40, 7807, 39, 7818, 40, 7834, 39, 7839, 40, 7862, 37, 7893, 38, 7905, 37, 7968, 37, 7973, 38, 7984, 39, 7988, 38, 7998, 37, 8015, 38, 8023, 37, 8030, 38, 8043, 40, 8058, 39, 8086, 38, 8137, 37, 8146, 38, 8161, 39, 8187, 40, 8196, 39, 8223, 38, 8244, 40, 8357, 37, 8370, 39, 8389, 37, 8420, 38, 8432, 37, 8476, 38, 8494, 37, 8495, 38, 8504, 37, 8507, 38, 8517, 37, 8542, 38, 8547, 37, 8551, 38, 8570, 40, 8589, 39, 8770, 40, 8784, 40, 8785, 40, 8786, 40, 8787, 40, 8788, 40, 8789, 40, 8790, 40, 8791, 40, 8792, 40, 8793, 40, 8794, 40, 8795, 40, 8796, 40, 8912, 38, 9073, 37, 9110, 38, 9130, 37, 9243, 40, 9256, 40, 9257, 40, 9258, 40, 9259, 40, 9380, 37, 9396, 39, 9410, 39, 9411, 39, 9412, 39, 9413, 39, 9414, 39, 9433, 39, 9438, 38, 9463, 39, 9540, 40, 9553, 40, 9554, 40, 9555, 40, 9556, 40, 9557, 40, 9558, 40, 9559, 40, 9585, 37, 9610, 40, 9697, 38, 9704, 39, 9785, 38, 9839, 39, 9911, 38, 9923, 37, 9965, 38, 9978, 40, 9988, 39, 10007, 38, 10015, 40, 10025, 39, 10038, 38, 10058, 40, 10074, 39, 10101, 38, 10395, 40, 10461, 37, 10480, 39, 10496, 38, 10511, 39, 10514, 38, 10532, 40, 10541, 39, 10583, 40, 10596, 40, 10597, 40, 10598, 40, 10599, 40, 10600, 40, 10737, 38, 10831, 37, 10861, 38, 10876, 37, 10881, 38, 10903, 37, 10937, 38, 10943, 37, 10964, 40, 10984, 39, 10988, 90, 10997, 39, 11000, 90, 11041, 88, 11053, 37, 11059, 88, 11069, 39, 11085, 90, 11097, 37, 11117, 37, 11125, 39, 11134, 40, 11166, 40, 11170, 39, 11247, 38, 11369, 40, 11382, 40, 11383, 40, 11384, 40, 11385, 40, 11386, 40, 11387, 40, 11388, 40, 11389, 40, 11390, 40, 11396, 37, 11421, 40, 11442, 38, 11449, 39, 11490, 38, 11505, 40, 11514, 39, 11597, 38, 11739, 40, 11757, 37, 11796, 38, 11809, 38, 11817, 39, 11831, 39, 11832, 39, 11833, 39, 11834, 39, 11835, 39, 11836, 39, 11837, 39, 11838, 39, 11839, 39, 11841, 38, 11855, 39, 11861, 38, 11885, 39, 11909, 38, 11933, 37, 11950, 38, 11976, 38, 11998, 39, 12021, 38, 12039, 39, 12050, 38, 12120, 40, 12133, 40, 12134, 40, 12135, 40, 12136, 40, 12137, 40, 12140, 37, 12148, 40, 12164, 39, 12216, 38, 12482, 37, 12620, 40, 12700, 37, 12705, 38, 12711, 39, 12719, 38, 12727, 37, 12731, 38, 12741, 39, 12754, 38, 12766, 39, 12780, 39, 12781, 39, 12782, 39, 12783, 39, 12784, 39, 12786, 38, 12797, 39, 12803, 38, 12879, 39, 12919, 38, 13074, 40, 13097, 37, 13104, 40, 13116, 39, 13174, 38, 13236, 40, 13272, 39, 13279, 37, 13310, 38, 13445, 40, 13459, 40, 13460, 40, 13461, 40, 13462, 40, 13463, 40, 13464, 40, 13465, 40, 13466, 40, 13467, 40, 13468, 40, 13469, 40, 13470, 40, 13471, 40, 13472, 40, 13473, 40, 13558, 38, 13578, 40, 13589, 38, 13865, 40, 13971, 38, 14217, 37, 14357, 40, 14474, 38, 14480, 39, 14536, 38, 14603, 40, 14617, 40, 14618, 40, 14619, 40, 14620, 40, 14621, 40, 14622, 40, 14623, 40, 14624, 40, 14632, 39, 14683, 40, 14729, 38, 14742, 40, 14756, 40, 14757, 40, 14758, 40, 14759, 40, 14760, 40, 14794, 38, 14816, 37, 14824, 38, 14843, 37, 14846, 88, 14859, 37, 14863, 88, 14876, 37, 14880, 88, 15015, 37, 15033, 39, 15047, 39, 15048, 39, 15049, 39, 15050, 39, 15051, 39, 15052, 39, 15053, 39, 15064, 38, 15084, 37, 15089, 39, 15095, 38, 15139, 37, 15149, 38], //526 goldDrop: [26, 28, 14, 35, 15, 32, 16, 35, 26, 15, 20, 31, 18, 33, 23, 27, 31, 15, 38, 31, 20, 25, 37, 38, 16], bornPos: [1, 19] }, { level: 39, ai:1, time: 3527, state: 1, action: [0, 37, 12, 40, 287, 37, 291, 88, 337, 39, 363, 90, 374, 40, 380, 90, 511, 40, 518, 90, 536, 38, 588, 37, 603, 39, 611, 37, 620, 90, 630, 37, 642, 39, 671, 38, 849, 37, 872, 38, 918, 37, 931, 38, 937, 37, 948, 38, 952, 37, 977, 90, 987, 39, 992, 90, 1004, 39, 1009, 90, 1021, 39, 1026, 90, 1036, 37, 1055, 90, 1066, 39, 1071, 90, 1084, 39, 1089, 90, 1099, 37, 1114, 90, 1124, 39, 1131, 90, 1141, 37, 1149, 90, 1163, 37, 1175, 39, 1224, 37, 1251, 39, 1258, 88, 1272, 37, 1278, 88, 1288, 39, 1296, 88, 1311, 39, 1470, 38, 1497, 37, 1522, 38, 1568, 37, 1582, 38, 1605, 37, 1629, 38, 1726, 37, 1827, 39, 1843, 37, 1850, 90, 1861, 39, 1866, 90, 1878, 37, 1886, 90, 1897, 37, 1928, 38, 1946, 37, 1951, 90, 1980, 39, 1983, 90, 2043, 37, 2061, 88, 2074, 37, 2079, 88, 2091, 38, 2135, 39, 2151, 38, 2174, 39, 2203, 88, 2213, 37, 2219, 88, 2229, 37, 2235, 88, 2247, 37, 2251, 88, 2259, 39, 2282, 88, 2294, 37, 2299, 88, 2313, 37, 2318, 88, 2328, 39, 2345, 88, 2357, 37, 2364, 88, 2375, 39, 2384, 88, 2397, 39, 2420, 37, 2444, 39, 2457, 39, 2458, 39, 2459, 39, 2460, 39, 2461, 39, 2462, 39, 2463, 39, 2464, 39, 2465, 39, 2468, 90, 2476, 39, 2479, 90, 2490, 39, 2496, 90, 2506, 37, 2517, 90, 2527, 37, 2560, 38, 2573, 38, 2574, 38, 2577, 90, 2607, 37, 2620, 88, 2634, 37, 2638, 88, 2652, 37, 2656, 88, 2904, 39, 2940, 90, 2954, 40, 2960, 90, 3151, 40, 3156, 90, 3169, 38, 3186, 37, 3195, 90, 3207, 37, 3216, 39, 3241, 38, 3419, 37, 3446, 38, 3490, 39, 3505, 38], //148 bornPos: [1, 26, 24] }, { level: 46, ai:1, time: 4227, state: 1, action: [0, 40, 20, 39, 127, 37, 137, 38, 177, 40, 191, 40, 192, 40, 205, 38, 213, 39, 220, 38, 226, 39, 235, 37, 284, 90, 296, 40, 302, 90, 314, 40, 319, 90, 333, 40, 338, 90, 349, 38, 368, 39, 378, 38, 403, 90, 447, 37, 454, 39, 492, 38, 556, 40, 569, 40, 570, 40, 571, 40, 572, 40, 573, 40, 574, 40, 575, 40, 576, 40, 577, 40, 578, 40, 579, 40, 596, 38, 603, 39, 611, 38, 620, 88, 639, 40, 651, 39, 664, 38, 702, 88, 752, 39, 782, 40, 814, 37, 823, 38, 904, 88, 969, 39, 981, 38, 1014, 37, 1034, 90, 1048, 37, 1057, 39, 1071, 90, 1082, 37, 1103, 39, 1127, 37, 1148, 90, 1160, 37, 1166, 38, 1187, 39, 1192, 40, 1263, 38, 1269, 39, 1303, 38, 1336, 37, 1368, 90, 1380, 39, 1385, 90, 1395, 37, 1406, 90, 1421, 37, 1436, 88, 1447, 39, 1472, 88, 1483, 39, 1497, 39, 1498, 39, 1499, 39, 1500, 39, 1511, 37, 1533, 90, 1543, 39, 1554, 90, 1562, 39, 1576, 39, 1577, 39, 1578, 39, 1579, 39, 1580, 39, 1581, 39, 1582, 39, 1583, 39, 1584, 39, 1585, 39, 1586, 39, 1587, 39, 1588, 39, 1589, 39, 1590, 39, 1609, 38, 1618, 38, 1635, 40, 1644, 39, 1660, 38, 1703, 90, 1716, 40, 1721, 90, 1732, 37, 1756, 38, 1766, 90, 1779, 37, 1827, 40, 1836, 37, 1840, 38, 1856, 39, 1860, 38, 1868, 37, 1880, 90, 1891, 37, 1894, 90, 1983, 40, 1987, 90, 2013, 40, 2018, 90, 2115, 40, 2120, 90, 2130, 38, 2147, 37, 2177, 39, 2187, 38, 2220, 37, 2231, 90, 2243, 37, 2272, 90, 2284, 39, 2289, 90, 2301, 39, 2306, 90, 2318, 39, 2322, 90, 2331, 37, 2353, 90, 2364, 39, 2369, 90, 2381, 39, 2388, 90, 2401, 37, 2415, 88, 2430, 37, 2433, 88, 2443, 39, 2454, 88, 2465, 39, 2503, 90, 2515, 37, 2524, 39, 2548, 38, 2609, 37, 2620, 90, 2635, 37, 2663, 90, 2676, 39, 2681, 90, 2694, 39, 2698, 90, 2711, 39, 2715, 90, 2724, 37, 2746, 90, 2759, 39, 2764, 90, 2776, 39, 2783, 90, 2796, 37, 2811, 88, 2825, 37, 2828, 88, 2838, 39, 2857, 90, 2869, 37, 2902, 88, 2910, 39, 2958, 38, 3019, 37, 3029, 90, 3041, 37, 3058, 88, 3070, 37, 3075, 88, 3088, 37, 3092, 88, 3104, 37, 3108, 88, 3116, 39, 3141, 88, 3152, 37, 3159, 88, 3171, 37, 3177, 88, 3191, 39, 3204, 90, 3217, 39, 3221, 90, 3233, 37, 3249, 88, 3259, 39, 3283, 88, 3295, 39, 3326, 38, 3389, 37, 3399, 90, 3410, 37, 3491, 38, 3521, 39, 3553, 37, 3569, 38, 3579, 39, 3598, 40, 3612, 37, 3619, 40, 3632, 39, 3682, 38, 3731, 39, 3764, 38, 3783, 37, 3786, 40, 3800, 40, 3809, 37, 3830, 39, 3838, 88, 3850, 39, 3857, 40, 3866, 37, 3874, 40, 3888, 39, 3931, 88, 3942, 39, 3977, 38, 4034, 90, 4044, 40, 4050, 90, 4061, 37, 4085, 38, 4096, 90, 4107, 37, 4171, 38, 4191, 39, 4205, 38, 4215, 39, 4221, 38], //255 goldDrop: [16, 37] }, { level: 47, ai:1, time: 6562, state: 1, action: [0, 37, 48, 88, 59, 37, 63, 88, 71, 37, 79, 38, 91, 39, 110, 88, 121, 37, 125, 88, 132, 37, 149, 39, 170, 88, 180, 37, 185, 88, 194, 37, 214, 39, 234, 88, 245, 37, 250, 88, 258, 37, 283, 39, 302, 88, 313, 37, 318, 88, 328, 37, 350, 39, 370, 88, 381, 37, 386, 88, 395, 37, 424, 39, 443, 88, 453, 37, 458, 88, 466, 37, 492, 39, 513, 88, 523, 37, 529, 88, 538, 37, 560, 39, 580, 88, 590, 37, 597, 88, 605, 37, 619, 37, 620, 37, 633, 39, 652, 88, 663, 37, 668, 88, 676, 37, 703, 39, 723, 88, 732, 37, 738, 88, 746, 37, 760, 37, 761, 37, 762, 37, 779, 39, 801, 37, 809, 88, 821, 37, 865, 39, 872, 38, 940, 39, 954, 90, 991, 37, 1122, 38, 1175, 40, 1191, 90, 1285, 38, 1324, 88, 1335, 39, 1344, 88, 1357, 39, 1366, 88, 1377, 39, 1384, 88, 1396, 39, 1404, 88, 1418, 39, 1425, 88, 1439, 39, 1446, 88, 1459, 39, 1468, 88, 1481, 39, 1489, 88, 1502, 39, 1510, 88, 1524, 39, 1531, 88, 1545, 39, 1555, 88, 1567, 39, 1584, 90, 1592, 37, 1671, 38, 1732, 88, 1743, 39, 1752, 88, 1763, 39, 1772, 88, 1784, 39, 1792, 88, 1805, 39, 1813, 88, 1826, 39, 1834, 88, 1847, 39, 1855, 88, 1868, 39, 1876, 88, 1890, 39, 1898, 88, 1913, 39, 1929, 90, 1937, 37, 2001, 38, 2044, 88, 2057, 39, 2067, 88, 2078, 39, 2088, 88, 2100, 39, 2109, 88, 2120, 39, 2128, 88, 2142, 39, 2151, 88, 2162, 39, 2179, 90, 2191, 37, 2237, 38, 2262, 88, 2274, 39, 2283, 88, 2295, 39, 2304, 88, 2314, 39, 2332, 90, 2342, 37, 2375, 38, 2466, 39, 2528, 88, 2540, 37, 2545, 88, 2553, 37, 2563, 38, 2575, 39, 2597, 88, 2608, 37, 2613, 88, 2621, 37, 2643, 39, 2662, 88, 2673, 37, 2679, 88, 2686, 37, 2709, 39, 2730, 88, 2740, 37, 2746, 88, 2754, 37, 2768, 37, 2769, 37, 2777, 39, 2797, 88, 2809, 37, 2814, 88, 2823, 37, 2845, 39, 2865, 88, 2875, 37, 2882, 88, 2890, 37, 2911, 39, 2932, 88, 2943, 37, 2949, 88, 2957, 37, 2980, 39, 3000, 88, 3010, 37, 3016, 88, 3025, 37, 3038, 37, 3048, 39, 3068, 88, 3079, 37, 3085, 88, 3092, 37, 3106, 37, 3107, 37, 3119, 39, 3139, 88, 3149, 37, 3156, 88, 3166, 37, 3179, 37, 3187, 39, 3207, 88, 3217, 37, 3224, 88, 3230, 37, 3244, 37, 3245, 37, 3246, 37, 3247, 37, 3248, 37, 3249, 37, 3250, 37, 3260, 39, 3282, 88, 3292, 37, 3294, 88, 3305, 37, 3312, 88, 3318, 37, 3332, 37, 3333, 37, 3334, 37, 3335, 37, 3336, 37, 3337, 37, 3338, 37, 3339, 37, 3340, 37, 3368, 39, 3373, 38, 3470, 39, 3482, 37, 3497, 90, 3543, 37, 3690, 38, 3784, 40, 3806, 39, 3822, 38, 3828, 90, 3839, 38, 3846, 90, 4103, 38, 4133, 39, 4180, 88, 4190, 37, 4195, 88, 4202, 37, 4213, 38, 4226, 39, 4247, 88, 4257, 37, 4262, 88, 4269, 37, 4283, 37, 4284, 37, 4285, 37, 4294, 39, 4312, 88, 4321, 37, 4328, 88, 4334, 37, 4357, 39, 4377, 88, 4386, 37, 4392, 88, 4399, 37, 4413, 37, 4424, 39, 4443, 88, 4453, 37, 4460, 88, 4466, 37, 4480, 37, 4492, 39, 4511, 88, 4521, 37, 4528, 88, 4535, 37, 4548, 37, 4549, 37, 4557, 39, 4576, 88, 4586, 37, 4592, 88, 4600, 37, 4614, 37, 4615, 37, 4622, 39, 4641, 88, 4650, 37, 4657, 88, 4663, 37, 4677, 37, 4678, 37, 4685, 39, 4704, 88, 4713, 37, 4720, 88, 4727, 37, 4750, 39, 4770, 88, 4780, 37, 4788, 88, 4794, 37, 4808, 37, 4809, 37, 4810, 37, 4811, 37, 4812, 37, 4818, 39, 4837, 88, 4846, 37, 4854, 88, 4861, 37, 4875, 37, 4892, 39, 4907, 88, 4918, 37, 4932, 37, 4933, 37, 4934, 37, 5003, 39, 5028, 37, 5042, 88, 5088, 39, 5095, 37, 5209, 38, 5230, 39, 5342, 38, 5412, 39, 5445, 88, 5455, 37, 5458, 88, 5470, 37, 5474, 88, 5482, 37, 5492, 38, 5504, 39, 5525, 88, 5534, 37, 5541, 88, 5548, 37, 5569, 39, 5588, 88, 5597, 37, 5605, 88, 5612, 37, 5626, 37, 5637, 39, 5657, 88, 5667, 37, 5675, 88, 5683, 37, 5707, 39, 5728, 88, 5739, 37, 5745, 88, 5754, 37, 5767, 37, 5768, 37, 5769, 37, 5770, 37, 5778, 39, 5798, 88, 5808, 37, 5815, 88, 5824, 37, 5845, 39, 5866, 88, 5875, 37, 5882, 88, 5892, 37, 5912, 39, 5932, 88, 5942, 37, 5949, 88, 5958, 37, 5979, 39, 5999, 88, 6009, 37, 6016, 88, 6024, 37, 6037, 37, 6038, 37, 6045, 39, 6064, 88, 6075, 37, 6081, 88, 6090, 37, 6110, 39, 6129, 88, 6140, 37, 6146, 88, 6154, 37, 6177, 39, 6196, 88, 6206, 37, 6213, 88, 6221, 37, 6235, 37, 6236, 37, 6237, 37, 6238, 37, 6299, 39, 6323, 37, 6330, 88, 6344, 37, 6356, 39, 6374, 37, 6460, 38, 6484, 39, 6509, 38], //415 goldDrop: [28, 27, 37, 19] }, { level: 48, ai: 1, time: 5605, state: 1, action: [ 0, 39, 12, 88, 23, 37, 28, 88, 42, 37, 45, 88, 58, 37, 61, 88, 74, 37, 77, 88, 272, 37, 277, 38, 297, 39, 311, 39, 312, 39, 313, 39, 314, 39, 315, 39, 316, 39, 317, 39, 318, 39, 319, 39, 320, 39, 321, 39, 322, 39, 323, 39, 324, 39, 325, 39, 326, 39, 327, 39, 328, 39, 329, 39, 330, 39, 331, 39, 332, 39, 333, 39, 334, 39, 335, 39, 336, 39, 352, 88, 396, 39, 421, 38, 436, 37, 441, 38, 463, 37, 469, 38, 497, 37, 523, 88, 531, 37, 534, 88, 569, 39, 574, 38, 584, 37, 595, 38, 632, 39, 751, 37, 761, 88, 772, 39, 785, 37, 798, 37, 836, 90, 846, 39, 851, 90, 863, 39, 867, 90, 879, 39, 882, 90, 894, 39, 897, 90, 909, 39, 912, 90, 923, 39, 927, 90, 939, 39, 943, 90, 955, 39, 958, 90, 969, 39, 973, 90, 1048, 38, 1067, 37, 1070, 38, 1086, 40, 1100, 39, 1114, 40, 1127, 40, 1128, 40, 1129, 40, 1130, 40, 1131, 40, 1132, 40, 1133, 40, 1134, 40, 1204, 37, 1255, 90, 1307, 37, 1323, 38, 1342, 39, 1347, 38, 1369, 39, 1375, 38, 1404, 39, 1412, 38, 1425, 39, 1432, 38, 1460, 39, 1464, 90, 1509, 37, 1562, 39, 1575, 37, 1591, 39, 1596, 90, 1609, 37, 1632, 39, 1693, 38, 1713, 37, 1716, 38, 1733, 37, 1737, 38, 1760, 37, 1765, 38, 1815, 39, 1852, 90, 1935, 37, 1948, 39, 1977, 90, 2063, 37, 2084, 39, 2106, 37, 2109, 88, 2122, 39, 2135, 37, 2143, 40, 2152, 37, 2162, 38, 2168, 37, 2215, 90, 2226, 39, 2230, 90, 2242, 39, 2246, 90, 2257, 39, 2261, 90, 2272, 39, 2276, 90, 2288, 39, 2292, 90, 2301, 39, 2306, 90, 2322, 39, 2325, 90, 2336, 39, 2340, 90, 2404, 39, 2413, 38, 2557, 37, 2653, 40, 2773, 38, 2782, 39, 2803, 37, 2820, 38, 2839, 39, 2852, 39, 2853, 39, 2854, 39, 2881, 90, 2893, 39, 2898, 90, 2910, 39, 2915, 90, 2927, 39, 2932, 90, 2943, 39, 2949, 90, 2959, 39, 2964, 90, 3003, 39, 3018, 38, 3036, 37, 3041, 38, 3074, 37, 3078, 38, 3106, 40, 3136, 39, 3150, 40, 3184, 37, 3222, 90, 3232, 39, 3238, 90, 3248, 39, 3252, 90, 3262, 39, 3265, 90, 3276, 39, 3281, 90, 3291, 39, 3296, 90, 3306, 39, 3311, 90, 3323, 39, 3434, 37, 3440, 38, 3487, 37, 3492, 38, 3511, 40, 3529, 39, 3536, 40, 3550, 40, 3551, 40, 3552, 40, 3553, 40, 3557, 39, 3565, 40, 3573, 39, 3582, 38, 3591, 39, 3599, 88, 3609, 37, 3614, 88, 3623, 37, 3629, 88, 3639, 40, 3653, 37, 3855, 38, 3866, 37, 3941, 40, 3947, 37, 3958, 38, 3965, 37, 3975, 90, 3985, 39, 3990, 90, 4000, 39, 4006, 90, 4017, 40, 4027, 39, 4037, 38, 4049, 39, 4063, 38, 4082, 39, 4137, 38, 4152, 37, 4157, 38, 4178, 37, 4183, 38, 4239, 40, 4264, 39, 4272, 40, 4309, 37, 4315, 88, 4326, 37, 4331, 88, 4341, 37, 4346, 88, 4398, 37, 4445, 38, 4458, 38, 4465, 39, 4470, 38, 4484, 38, 4485, 38, 4495, 39, 4502, 38, 4573, 40, 4658, 38, 4683, 88, 4690, 40, 4699, 88, 4706, 40, 4720, 40, 4721, 40, 4722, 40, 4723, 40, 4724, 40, 4725, 40, 4726, 40, 4727, 40, 4728, 40, 4729, 40, 4730, 40, 4731, 40, 4732, 40, 4733, 37, 4741, 40, 4755, 40, 4756, 40, 4757, 40, 4758, 40, 4759, 40, 4760, 40, 4761, 40, 4762, 40, 4763, 40, 4798, 39, 4802, 90, 4816, 39, 4819, 90, 4831, 39, 4835, 90, 5085, 37, 5105, 38, 5126, 39, 5132, 38, 5158, 39, 5163, 38, 5193, 37, 5238, 88, 5283, 39, 5290, 38, 5327, 37, 5349, 88, 5384, 39, 5389, 38, 5438, 37, 5452, 39, 5457, 90, 5469, 37, 5477, 40, 5485, 39, 5490, 40, 5498, 39, 5508, 38, 5515, 39, 5520, 38, 5536, 39, 5540, 38, 5562, 39, 5566, 38 ], goldDrop: [], bornPos: [ 1, 16, 9, 13, 0, 20, 15, 4, 8, 25, 1, 19, 11, 6 ] }, { level: 50, ai:1, time: 5390, state: 1, action: [0, 39, 8, 90, 17, 39, 31, 39, 32, 39, 33, 39, 34, 39, 35, 39, 36, 39, 37, 39, 38, 39, 39, 39, 40, 39, 43, 38, 48, 39, 57, 40, 71, 38, 125, 40, 139, 40, 140, 40, 141, 40, 142, 40, 143, 40, 149, 39, 157, 40, 169, 37, 173, 40, 183, 37, 290, 38, 300, 88, 311, 39, 334, 37, 344, 88, 360, 37, 379, 40, 421, 88, 433, 38, 499, 37, 502, 38, 635, 88, 659, 39, 667, 40, 680, 37, 684, 40, 707, 39, 713, 38, 719, 37, 733, 37, 734, 37, 743, 38, 754, 37, 773, 40, 778, 39, 825, 38, 908, 39, 919, 90, 1056, 39, 1067, 88, 1080, 37, 1084, 88, 1097, 37, 1118, 88, 1130, 40, 1136, 88, 1145, 38, 1159, 39, 1173, 39, 1174, 39, 1175, 39, 1176, 39, 1190, 90, 1202, 40, 1206, 90, 1215, 39, 1229, 37, 1241, 88, 1253, 37, 1258, 88, 1269, 37, 1275, 88, 1285, 37, 1301, 88, 1312, 40, 1319, 88, 1327, 38, 1341, 38, 1342, 38, 1343, 38, 1344, 38, 1345, 38, 1346, 38, 1347, 38, 1348, 38, 1349, 38, 1350, 38, 1351, 38, 1352, 38, 1359, 39, 1370, 88, 1379, 39, 1407, 88, 1421, 40, 1425, 88, 1434, 39, 1460, 37, 1495, 88, 1507, 40, 1511, 88, 1521, 39, 1539, 37, 1558, 39, 1601, 38, 1621, 90, 1632, 40, 1637, 90, 1646, 37, 1664, 39, 1672, 38, 1683, 38, 1698, 39, 1701, 38, 1758, 37, 1763, 38, 1777, 39, 1793, 37, 1802, 38, 1840, 39, 1843, 88, 1853, 37, 1858, 38, 1870, 39, 1876, 38, 1898, 39, 1903, 38, 1913, 39, 1927, 39, 1928, 39, 1929, 39, 1935, 38, 1948, 37, 1953, 38, 1989, 39, 2034, 37, 2039, 88, 2050, 37, 2055, 88, 2065, 39, 2080, 90, 2093, 39, 2096, 90, 2105, 37, 2131, 39, 2139, 90, 2150, 39, 2155, 90, 2166, 37, 2182, 90, 2189, 39, 2192, 90, 2206, 39, 2210, 90, 2219, 38, 2235, 39, 2241, 38, 2256, 39, 2272, 37, 2279, 88, 2289, 37, 2301, 40, 2324, 37, 2352, 39, 2357, 90, 2368, 37, 2379, 40, 2408, 39, 2431, 37, 2438, 88, 2670, 39, 2682, 37, 2689, 88, 2701, 37, 2706, 88, 2716, 40, 2723, 88, 2735, 39, 2755, 38, 2762, 39, 2772, 38, 2784, 39, 2797, 37, 2806, 88, 2817, 40, 2824, 88, 2834, 40, 2840, 37, 2869, 38, 2876, 37, 2880, 38, 2891, 39, 2893, 38, 2906, 38, 2911, 39, 2916, 38, 2939, 39, 2946, 88, 2954, 37, 2962, 88, 2977, 40, 2982, 88, 2991, 39, 3005, 39, 3006, 39, 3007, 39, 3008, 39, 3009, 39, 3010, 39, 3011, 39, 3012, 39, 3013, 39, 3014, 38, 3020, 39, 3030, 88, 3041, 90, 3052, 38, 3065, 39, 3070, 88, 3080, 39, 3098, 37, 3138, 40, 3162, 39, 3173, 38, 3193, 39, 3199, 88, 3210, 37, 3215, 88, 3227, 39, 3237, 88, 3247, 37, 3253, 88, 3264, 39, 3292, 38, 3309, 39, 3323, 37, 3334, 88, 3344, 40, 3351, 88, 3360, 37, 3392, 38, 3439, 39, 3444, 88, 3457, 37, 3461, 88, 3475, 39, 3483, 88, 3496, 37, 3501, 88, 3512, 39, 3525, 39, 3526, 39, 3527, 39, 3528, 39, 3529, 39, 3530, 39, 3531, 39, 3540, 38, 3545, 88, 3555, 38, 3567, 39, 3572, 88, 3584, 39, 3598, 37, 3648, 38, 3658, 39, 3663, 38, 3678, 39, 3683, 38, 3704, 37, 3708, 38, 3721, 90, 3743, 40, 3757, 39, 3766, 90, 3782, 38, 3791, 37, 3795, 38, 3805, 37, 3812, 40, 3828, 39, 3836, 90, 3847, 37, 3868, 39, 3875, 90, 3888, 39, 3893, 38, 3921, 37, 3946, 39, 3952, 90, 3963, 39, 3970, 38, 3996, 37, 4021, 38, 4241, 39, 4249, 38, 4270, 90, 4279, 40, 4303, 37, 4313, 40, 4379, 38, 4391, 39, 4400, 38, 4442, 37, 4451, 38, 4482, 39, 4494, 40, 4518, 39, 4524, 88, 4537, 39, 4554, 88, 4568, 39, 4582, 90, 4595, 37, 4611, 39, 4618, 90, 4630, 37, 4641, 38, 4662, 37, 4688, 38, 4697, 39, 4708, 38, 4749, 37, 4759, 38, 4790, 39, 4813, 40, 4839, 37, 4842, 40, 4860, 37, 4864, 88, 4877, 39, 4894, 88, 4911, 39, 4925, 90, 4941, 37, 4953, 39, 4965, 90, 4977, 37, 5026, 39, 5038, 37, 5042, 38, 5052, 39, 5062, 38, 5106, 37, 5117, 38, 5149, 39, 5198, 37, 5203, 88, 5218, 39, 5231, 39, 5240, 38, 5251, 88, 5265, 40, 5271, 88, 5288, 40, 5290, 88, 5305, 40, 5308, 88, 5332, 39, 5345, 39, 5346, 39, 5347, 39, 5348, 39, 5349, 39, 5350, 39, 5351, 39, 5352, 39, 5353, 39, 5354, 39, 5355, 39, 5368, 38] //378 } ]; ================================================ FILE: lodeRunner.edit.js ================================================ var emptyTile, actTile; var cursorTileObj; var editMap; var MAX_EDIT_GUARD = 5; //maximum number of guards var EMPTY_ID = 0, GUARD_ID = 8, RUNNER_ID = 9; var EDIT_PADDING = 1; //value | Character | Type //------+-----------+----------- // 0x0 | | Empty space // 0x1 | # | Normal Brick // 0x2 | @ | Solid Brick // 0x3 | H | Ladder // 0x4 | - | Hand-to-hand bar (Line of rope) // 0x5 | X | False brick // 0x6 | S | Ladder appears at end of level // 0x7 | $ | Gold chest // 0x8 | 0 | Guard // 0x9 | & | Player var tileIdMapping = { ' ':0, '#':1, '@':2, 'H':3, '-':4, 'X':5, 'S':6, '$':7, '0':8, '&':9 }; var tileInfo = [ [ "eraser", ' ' ], //(0), empty [ "brick", '#' ], //(1) [ "solid", '@' ], //(2) [ "ladder", 'H' ], //(3) [ "rope", '-' ], //(4) [ "trapBrick",'X' ], //(5) [ "hladder", 'S' ], //(6) [ "gold", '$' ], //(7) [ "guard1", '0' ], //(8) [ "runner1", '&' ] //(9) ]; var baseTile=[]; var lastRunner = null; var lastGuardList = []; var editBorder, editStartX; var testLevelInfo = {level: -1}; var mouseInStage = 1; //var mouseOver = 0; var mouseDown = 0; var lastDown = {x:-1, y:-1}; var testButton, newButton, saveButton, loadButton; var editorTile =[], editorActiveTileId = -1; var editorButton = [], editorButtonMouseOverId = -1; var editInNarrowScreen = 0; var editMapIsEmpty = 1; function startEditMode() { playMode = PLAY_EDIT; playData = PLAY_DATA_USERDEF; //for title name only mainStage.removeAllChildren(); document.onkeydown = editHandleKeyDown; editInNarrowScreen = canvasEditReSize(); soundIconObj.disable(1); repeatActionIconObj.disable(1); if(editInNarrowScreen) themeColorObj.disable(1); //if(gamepadIconObj) gamepadIconObj.disable(1); setEditSelectMenu(); createBaseTile(); createEditMap(); checkEditMapEmpty(); // 2021/04 startEditTicker(); setButtonState(); initForPlay(); } function setEditSelectMenu() { if(editLevels>0)selectIconObj.enable(); else selectIconObj.disable(1); } function canvasEditReSize() { var menuIconAreaX = screenBorder + BASE_ICON_X * tileScale; //current icon size X var toolAreaX = BASE_TILE_X*3/2; //edit tool size X var canvas = document.getElementById('canvas'); var narrowScreen = 0; //(1) try use scale same as play mode canvasX = (BASE_SCREEN_X+toolAreaX) * tileScale + EDIT_PADDING * (NO_OF_TILES_X+1); canvasY = BASE_SCREEN_Y * tileScale + EDIT_PADDING * (NO_OF_TILES_Y+1); if(canvasX > (screenX1 - menuIconAreaX) || canvasY > screenY1) { //(2) can not fit, find new scale for (var scale = MAX_SCALE*100; scale >= MIN_SCALE*100; scale -= 10) { tileScale = scale/100; //new scale canvasX = (BASE_SCREEN_X+toolAreaX) * tileScale + EDIT_PADDING * (NO_OF_TILES_X+1); canvasY = BASE_SCREEN_Y * tileScale + EDIT_PADDING * (NO_OF_TILES_Y+1); if (canvasX <= (screenX1 - menuIconAreaX) && canvasY <= screenY1 || tileScale <= MIN_SCALE) break; } } debug("EDIT SCALE = " + tileScale); var left = ((screenX1 - canvasX)/2|0), top = ((screenY1 - canvasY)/2|0); if(left < menuIconAreaX) { narrowScreen = 1; left = ((screenX1 - canvasX - menuIconAreaX)/2|0); } canvas.width = canvasX; canvas.height = canvasY; canvas.style.left = (left>0?left:0) + "px"; canvas.style.top = (top>0?top:0) + "px"; canvas.style.position = "absolute"; canvas.style.cursor = "default"; tileWScale = BASE_TILE_X * tileScale; tileHScale = BASE_TILE_Y * tileScale; editBorder = 4 * tileScale; editStartX = (tileWScale + W2 * tileScale); return narrowScreen; } function createBaseTile() { for(var id = 0; id < tileInfo.length; id++) { baseTile[id] = { image: getThemeBitmap(tileInfo[id][0]).image, id: id }; } emptyTile = { image: getThemeBitmap("empty").image, id: 0 }; actTile = baseTile[1]; } function createEditMap() { var tile, backColor, bitmap; setCanvasBackground(); setEditBackground(editStartX,0, (tileWScale+EDIT_PADDING)*NO_OF_TILES_X+EDIT_PADDING, (tileHScale+EDIT_PADDING)*NO_OF_TILES_Y+EDIT_PADDING ); initMapInfo(); getTestLevel(testLevelInfo); //(1) create empty map[x][y] array; editMap = []; for(var x = 0; x < NO_OF_TILES_X; x++) { editMap[x] = []; } //(2) draw map var index = 0; for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { var id = tile2Id(testLevelInfo.levelMap.charAt(index++)); tile = new createjs.Container(); backColor = new createjs.Shape(); backColor.graphics.beginFill("black").drawRect(0, 0, tileWScale, tileHScale).endFill(); if(id == 0) { bitmap = new createjs.Bitmap(emptyTile.image); } else { bitmap = new createjs.Bitmap(baseTile[id].image); } bitmap.scaleX = bitmap.scaleY = tileScale; tile.addChild(backColor, bitmap); tile.x = (tileWScale + EDIT_PADDING) * x+EDIT_PADDING + editStartX; tile.y = (tileHScale + EDIT_PADDING) * y+EDIT_PADDING; editMap[x][y] = { tile: tile, id: id }; mainStage.addChild(tile); addManCheck(id, x, y); } } drawEditGround(); drawEditBlock(editStartX,0, canvasX-editStartX-1, (tileHScale+EDIT_PADDING)*NO_OF_TILES_Y+EDIT_PADDING ); addSelectIcon(); addCursorTile(); drawEditLevel(); addEditorButton(); mouseInStage = 1; mainStage.on("stagemouseup", stageMouseUp); mainStage.on("stagemousedown", stageMouseDown); mainStage.on("mouseleave", function() { mouseInStage = 0; }); mainStage.on("mouseenter", function() { mouseInStage = 1; }); } function clearEditMap() { initMapInfo(); for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { var tileObj = editMap[x][y]; tileObj.tile.getChildAt(1).image = emptyTile.image; tileObj.id = emptyTile.id; } } editMapIsEmpty = 1; } function tile2Id(tileChar) { if( tileIdMapping.hasOwnProperty(tileChar)) { return tileIdMapping[tileChar]; } else { return 0; } } function setCanvasBackground() { //set background color var background = new createjs.Shape(); background.graphics.beginFill("black").drawRect(0, 0, canvas.width, canvas.height); mainStage.addChild(background); document.body.style.background = backgroundColor; } function setEditBackground(startX, startY, width, height) { var editBack = new createjs.Shape(); editBack.alpha = 0.6; editBack.graphics.beginFill("gold").drawRect(startX, startY, width, height); mainStage.addChild(editBack); } function drawEditBlock(startX, startY, width, height) { var editBlock = new createjs.Shape(); editBlock.alpha = 0.6; editBlock.graphics.setStrokeStyle(2); editBlock.graphics.beginStroke("red"); editBlock.graphics.moveTo(startX, startY); editBlock.graphics.lineTo(startX+width, startY); editBlock.graphics.lineTo(startX+width, startY+height); editBlock.graphics.lineTo(startX, startY+height); editBlock.graphics.lineTo(startX, startY); editBlock.graphics.endStroke(); mainStage.addChild(editBlock); } function drawEditGround() { var groundTile; var x = (tileWScale + EDIT_PADDING) * NO_OF_TILES_X+EDIT_PADDING + editStartX; var y = (tileHScale + EDIT_PADDING) * NO_OF_TILES_Y+EDIT_PADDING; groundTile = new createjs.Shape(); groundTile.graphics.beginFill(getThemeTileColor()).drawRect(0, 0, x, 10*tileScale); groundTile.x = 0; groundTile.y = y; mainStage.addChild(groundTile); } function addSelectIcon() { var x = W4 * tileScale; var y; for(var i = 1; i < baseTile.length; i++) { y = (tileHScale*5/3)*(i-1) + tileHScale/10; drawSelectIcon(i, x, y); } y = (tileHScale*5/3)*(i-1) + tileHScale/10; drawSelectIcon(0, x, y); } function addCursorTile() { var backColor, bitmap; cursorTileObj = new createjs.Container(); backColor = new createjs.Shape(); backColor.graphics.beginFill("black").drawRect(0, 0, tileWScale, tileHScale).endFill(); bitmap = new createjs.Bitmap(actTile.image); bitmap.scaleX = bitmap.scaleY = tileScale; cursorTileObj.addChild(backColor, bitmap); cursorTileObj.alpha = 0; mainStage.addChild(cursorTileObj); } //var gameTicker = null; ....//same as playTicker function startEditTicker() { stopEditTicker(); createjs.Ticker.setFPS(60); mainStage.enableMouseOver(0); gameTicker = createjs.Ticker.on("tick", editTick); } function stopEditTicker() { if(gameTicker) { createjs.Ticker.off("tick", gameTicker); mainStage.enableMouseOver(0); //mainStage.cursor = 'default'; gameTicker = null; } } function drawSelectIcon(id, x, y) { var tile, border, backColor, bitmap; var selColor; tile = new createjs.Container(); //child id = 0 border = new createjs.Shape(); if(id == actTile.id) { selColor = "red"; selectedTile = tile; } else { selColor = "black"; } border.graphics.beginFill(selColor).drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill(); //child id = 1 backColor = new createjs.Shape(); backColor.graphics.beginFill("black").drawRect(0, 0, tileWScale, tileHScale).endFill(); //child id = 2 if(id == 0) { bitmap = new createjs.Bitmap(preload.getResult("eraser")); //id=2 } else { bitmap = new createjs.Bitmap(baseTile[id].image); //id=2 } bitmap.scaleX = bitmap.scaleY = tileScale; tile.addChild(border, backColor, bitmap); tile.x = x; tile.y = y; tile.myId = id; tile.on('click', selectTileClick); mainStage.addChild(tile); tile.x1 = x + tileWScale; tile.y1 = y + tileHScale; editorTile[id] = tile; } function selectTileClick() { var actBorder = this.getChildAt(0); var inActBorder = selectedTile.getChildAt(0); inActBorder.graphics.clear(); inActBorder.graphics.beginFill("black").drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill(); actBorder.graphics.clear(); actBorder.graphics.beginFill("red").drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill(); actTile = baseTile[this.myId]; cursorTileObj.getChildAt(1).image = actTile.image; selectedTile = this; } function drawEditLevel() { var x = 17.2*(tileWScale+EDIT_PADDING)+EDIT_PADDING; var y = canvas.height - tileHScale - editBorder; drawText(x, y, "EDIT", mainStage); x += 4.3*(tileWScale+EDIT_PADDING); drawText(x, y, "LEVEL", mainStage); drawEditLevelNo(); } var editLevelNoObj = []; function drawEditLevelNo() { var y = canvas.height - tileHScale - editBorder; for(var i = 0; i < editLevelNoObj.length; i++) mainStage.removeChild(editLevelNoObj[i]); editLevelNoObj = drawText(26.5*(tileWScale+EDIT_PADDING), y, ("00"+(testLevelInfo.level)).slice(-3), mainStage); } function addEditorButton() { editorButton = []; editorButtonMouseOverId = -1; drawNewButton(); drawLoadButton(); drawTestButton(); drawSaveButton(); enableTestButton(); } function drawNewButton() { var border, backColor, text; var textSting = "NEW"; var width = textSting.length * tileWScale; var x = 0.5*(tileWScale+EDIT_PADDING)+EDIT_PADDING; var y = canvas.height - tileHScale - editBorder; newButton = new createjs.Container(); //child id = 0 border = new createjs.Shape(); border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, width+editBorder*2, tileHScale+editBorder*2).endFill(); //child id = 1 backColor = new createjs.Shape(); backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill(); newButton.addChild(border, backColor); //child id = 2 drawText(0, 0, textSting, newButton); newButton.x = x; newButton.y = y; newButton.on('click', newButtonClick); mainStage.addChild(newButton); newButton.x1 = x + width; newButton.y1 = y + tileHScale; editorButton[editorButton.length] = newButton; function newLevel(rc) { if(rc) { clearEditMap(); if(testLevelInfo.level <= editLevels) { //edit exist level testLevelInfo.level = editLevels+1; drawEditLevelNo(); } if(testLevelInfo.level > MAX_EDIT_LEVEL) { setButtonState(); } else { disableTestButton(); } setPasteIconState(); clearTestLevel(); testLevelInfo.fromPlayData = -1; testLevelInfo.fromLevel = -1; } startEditTicker(); gameResume(); } function newButtonClick() { gamePause(); stopEditTicker(); if(testLevelInfo.modified) { yesNoDialog(["Abort current editing ?"], yesBitmap, noBitmap, mainStage, tileScale, newLevel); } else { newLevel(1); } } } function drawLoadButton() { var border, backColor, text; var textSting = "LOAD"; var width = textSting.length * tileWScale; var x = 4*(tileWScale+EDIT_PADDING)+EDIT_PADDING; var y = canvas.height - tileHScale - editBorder; var saveStateObj; var loadLevelData, loadPlayData; var editGameVersionList = [ { activeItem: 0 } //game version menu ID ]; loadButton = new createjs.Container(); //child id = 0 border = new createjs.Shape(); border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, width+editBorder*2, tileHScale+editBorder*2).endFill(); //child id = 1 backColor = new createjs.Shape(); backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill(); loadButton.addChild(border, backColor); //child id = 2 drawText(0, 0, textSting, loadButton); loadButton.x = x; loadButton.y = y; loadButton.on('click', loadButtonClick); mainStage.addChild(loadButton); initLoadVariable(); loadButton.x1 = x + width; loadButton.y1 = y + tileHScale; editorButton[editorButton.length] = loadButton; function saveState() { //saveStateObj = saveKeyHandler(noKeyDown); gamePause(); stopEditTicker(); } function restoreState() { //restoreKeyHandler(saveStateObj); startEditTicker(); gameResume(); } function initLoadVariable() { for(var i = 0; i < playVersionInfo.length; i++) { editGameVersionList.push( { name: playVersionInfo[i].name + " (" + playVersionInfo[i].verData.length + " Levels) ", id :playVersionInfo[i].id, activeFun: loadSelectMenu }); } } function menuId2GameVersionId(id) { return editGameVersionList[id+1].id; } function loadSelectLevel(level) { restoreState(); testLevelInfo.levelMap = loadLevelData[level-1]; testLevelInfo.pass = 1; testLevelInfo.fromPlayData = loadPlayData; testLevelInfo.fromLevel = level; setTestLevel(testLevelInfo); startEditMode(); } function loadSelectMenu(id, callbackFun) { loadPlayData = menuId2GameVersionId(id); var titleName = playDataToTitleName(loadPlayData); loadLevelData = getPlayVerData(loadPlayData); titleName = "Load From: " + titleName; selectDialog(titleName, checkBitmap, loadLevelData, 1, screenX1, screenY1, mainStage, tileScale, loadSelectLevel, null, restoreState) } function loadExistLevel(yes) { if(yes) { menuDialog("Load Game Version ", editGameVersionList, mainStage, tileScale, 1, restoreState, null); } else { restoreState(); } } function loadButtonClick() { saveState(); if(!editMapIsEmpty) { yesNoDialog(["Abort current editing ?"], yesBitmap, noBitmap, mainStage, tileScale, loadExistLevel); } else { loadExistLevel(1); } } } function drawTestButton() { var border, backColor, text; var textSting = "TEST"; var width = textSting.length * tileWScale; var x = 8.5*(tileWScale+EDIT_PADDING)+EDIT_PADDING; var y = canvas.height - tileHScale - editBorder; testButton = new createjs.Container(); //child id = 0 border = new createjs.Shape(); border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, width+editBorder*2, tileHScale+editBorder*2).endFill(); //child id = 1 backColor = new createjs.Shape(); backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill(); testButton.addChild(border, backColor); //child id = 2 drawText(0, 0, textSting, testButton); testButton.x = x; testButton.y = y; testButton.on('click', testButtonClick); testButton.alpha = 0; mainStage.addChild(testButton); testButton.x1 = x + width; testButton.y1 = y + tileHScale; editorButton[editorButton.length] = testButton; function testButtonClick() { //mainStage.cursor = 'default'; startTestMode(); } } function drawSaveButton() { var border, backColor, text; var textSting = "SAVE"; var width = textSting.length * tileWScale; var x = 13*(tileWScale+EDIT_PADDING)+EDIT_PADDING; var y = canvas.height - tileHScale - editBorder; saveButton = new createjs.Container(); //child id = 0 border = new createjs.Shape(); border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, width+editBorder*2, tileHScale+editBorder*2).endFill(); //child id = 1 backColor = new createjs.Shape(); backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill(); saveButton.addChild(border, backColor); //child id = 2 drawText(0, 0, textSting, saveButton); saveButton.x = x; saveButton.y = y; saveButton.on('click', saveButtonClick); saveButton.alpha = 0; mainStage.addChild(saveButton); saveButton.x1 = x + width; saveButton.y1 = y + tileHScale; editorButton[editorButton.length] = saveButton; function saveButtonClick() { gamePause(); stopEditTicker(); saveEditLevel(); yesNoDialog(["Save Successful", "Play It ?"], yesBitmap, noBitmap, mainStage, tileScale, playConfirm); } function playConfirm(rc) { gameResume(); if(rc) { //yes clearTestLevel(); //clear current edit level startPlayUserLevel(); } else { //no setButtonState(); startEditTicker(); } } function startPlayUserLevel() { playMode = PLAY_MODERN; playData = PLAY_DATA_USERDEF; curLevel = testLevelInfo.level; setModernInfo(); canvasReSize(); document.onkeydown = handleKeyDown; initShowDataMsg(); startGame(); } } //======================= // BEGIN for TEST Mode //======================= function startTestMode() { playMode = PLAY_TEST; playData = PLAY_DATA_USERDEF; curLevel = testLevelInfo.level; stopEditTicker(); saveTestState(); canvasReSize(); document.onkeydown = handleKeyDown; //key press selectIconObj.disable(1); initShowDataMsg(); startGame(); } function saveTestState() { map2LevelData(); setTestLevel(testLevelInfo); } function back2EditMode(rc) { if(rc == 1) { //pass testLevelInfo.pass = 1; setTestLevel(testLevelInfo); //enableSaveButton(); } else { //fail //if(testLevelInfo.pass && !testLevelInfo.modified) enableSaveButton(); } startEditMode(); } function getTestLevelMap(initValue) { return testLevelInfo.levelMap; } function enableTestButton() { if(lastRunner) testButton.alpha = 1; } //========================== function editLevelModified() { return (testLevelInfo.modified); } function editConfirmAbortState(callbackFun) { gamePause(); stopEditTicker(); yesNoDialog(["Abort current editing ?"], yesBitmap, noBitmap, mainStage, tileScale, function(rc) { gameResume(); if(rc) callbackFun(); else startEditTicker(); } ); } function disableTestButton() { testButton.alpha = 0; saveButton.alpha = 0; } function clearUserLevelScore() { playData = PLAY_DATA_USERDEF; getModernScoreInfo(); modernScoreInfo[testLevelInfo.level-1] = -1; setModernScoreInfo(); } function delUserLevelScore(level) { playData = PLAY_DATA_USERDEF; getModernScoreInfo(); modernScoreInfo.splice(level-1, 1); modernScoreInfo[MAX_EDIT_LEVEL-1] = -1; setModernScoreInfo(); } function saveEditLevel() { map2LevelData(); if(testLevelInfo.level > editLevels) { // new level addEditLevel(testLevelInfo.levelMap); } else { setEditLevel(testLevelInfo.level, testLevelInfo.levelMap); } clearUserLevelScore(); //clear score testLevelInfo.modified = 0; setEditSelectMenu(); } function stageMouseDown(event) { var e = event.nativeEvent; // ------------------------------------------------------------------------ // nativeEvent: https://createjs.com/docs/easeljs/classes/MouseEvent.html // which: https://www.w3schools.com/jsref/event_which.asp // ------------------------------------------------------------------------ if( e.which === undefined || e.which == 1 ) { // 1: left, 2: middle, 3: right // only support left mouse button mouseDown = 1; //console.log(e.which) //console.log("DOWN"); } } function stageMouseUp(event) { var e = event.nativeEvent; // ------------------------------------------------------------------------ // nativeEvent: https://createjs.com/docs/easeljs/classes/MouseEvent.html // which: https://www.w3schools.com/jsref/event_which.asp // ------------------------------------------------------------------------ if( e.which === undefined || e.which == 1 ) { // 1: left, 2: middle, 3: right // only support left mouse button mouseDown = 0; lastDown = {x:-1, y:-1}; //console.log(e.which) //console.log("UP"); } } function initMapInfo() { lastRunner = null; lastGuardList = []; testLevelInfo.modified = 0; testLevelInfo.pass = 0; } function addManCheck(id, x, y) { switch(id) { case RUNNER_ID: if (lastRunner && (lastRunner.x != x || lastRunner.y != y)) { var lastRunnerTile = editMap[lastRunner.x][lastRunner.y]; lastRunnerTile.tile.getChildAt(1).image = emptyTile.image; lastRunnerTile.id = emptyTile.id; } lastRunner = { x:x, y:y }; break; case GUARD_ID: var sameGuard=0, guardNo = lastGuardList.length; for(var i = 0; i < guardNo; i++) { if(lastGuardList[i].x == x && lastGuardList[i].y == y) { sameGuard = 1; break; } } if(!sameGuard) { if(guardNo >= MAX_EDIT_GUARD) { //too many guards remove first one var x1 = lastGuardList[0].x, y1 = lastGuardList[0].y; var guardTile = editMap[x1][y1]; guardTile.tile.getChildAt(1).image = emptyTile.image; guardTile.id = emptyTile.id; lastGuardList.splice(0,1); //remove first one from array } lastGuardList.push({x:x, y:y}); } break; } } function delManCheck(id, x, y) { switch(id) { case RUNNER_ID: //assert(lastRunner != null, "runner == null error"); var lastRunnerTile = editMap[lastRunner.x][lastRunner.y]; lastRunnerTile.tile.getChildAt(1).image = emptyTile.image; lastRunnerTile.id = emptyTile.id; lastRunner = null; disableTestButton(); break; case GUARD_ID: var removeId = -1, guardNo = lastGuardList.length; for(var i = 0; i < guardNo; i++) { if(lastGuardList[i].x == x && lastGuardList[i].y == y) { removeId = i; break; } } if(removeId >= 0) { var x1 = lastGuardList[removeId].x, y1 = lastGuardList[removeId].y; var guardTile = editMap[x1][y1]; guardTile.tile.getChildAt(1).image = emptyTile.image; guardTile.id = emptyTile.id; lastGuardList.splice(removeId,1); } else { error("design error !"); } break; } } //state: = 0: no change, < 0: level deleted, > 0 level change to newLevel function editSelectMenuClose(levelDeleted, newLevel, state) { if(levelDeleted) { setEditSelectMenu(); startEditMode(); /* Bug fixed: If player delete some custom levels and restart the program immediate will cause testLevel inconsistent, must del or shift testlevel immediate. ==> so move below statements into function delLevel(level). switch(true) { case (state > 0): //level number changed //getTestLevel(testLevelInfo); //testLevelInfo.level = newLevel; //setTestLevel(testLevelInfo); startEditMode(); break; case (state < 0): //level deleted //clearTestLevel(); setEditSelectMenu(); startEditMode(); break; case (state == 0 && newLevel == 0): //newLevel = 0 : meanings edit new level just need change level id //if(testLevelInfo.modified == 1) { // testLevelInfo.level = editLevels+1; // setTestLevel(testLevelInfo); //} startEditMode(); break; } */ } } function editSelectLevel(level) { testLevelInfo.level = level; testLevelInfo.levelMap = editLevelData[level-1]; testLevelInfo.fromPlayData = testLevelInfo.fromLevel = -1; setTestLevel(testLevelInfo); startEditMode(); } function map2LevelData() { var i=0; testLevelInfo.levelMap = ""; for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { testLevelInfo.levelMap += tileInfo[editMap[x][y].id][1]; } } } function checkEditMapEmpty() { editMapIsEmpty = 1; mapCheckLoop: for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { if(editMap[x][y].id != emptyTile.id) { editMapIsEmpty = 0; break mapCheckLoop; } } } setPasteIconState(); } function setPasteIconState() { if (editMapIsEmpty && copyLevelMap != null && testLevelInfo.level <= MAX_EDIT_LEVEL) pasteIconObj.enable(); else pasteIconObj.disable(); } function copyEditingMap() { var curEditMap = ""; for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { curEditMap += tileInfo[editMap[x][y].id][1]; } } return curEditMap; } //============================== // Too many user created Levels //============================== var editWarningText = null; function editWarningMsg(hidden) { var width, height; if(editWarningText == null) editWarningText = new createjs.Text("Too many custom levels !", "bold " + (64*tileScale) + "px Helvetica", "#fc5c1c"); width = editWarningText.getBounds().width; height = editWarningText.getBounds().height; editWarningText.x = ((NO_OF_TILES_X+2)*(tileWScale+EDIT_PADDING) - width) / 2 | 0; editWarningText.y = (NO_OF_TILES_Y*tileHScale - height) / 2 | 0; editWarningText.shadow = new createjs.Shadow("white", tileScale, 2*tileScale, 1); if(hidden) { mainStage.removeChild(editWarningText); } else { mainStage.addChild(editWarningText); } mainStage.update(); } var copyLevelMap = null, copyLevelPassed = 0; function editHandleKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if (event.ctrlKey) { switch(event.keyCode) { case KEYCODE_C: //CTRL-C : copy current level if (!editMapIsEmpty) { copyLevelMap = copyEditingMap(); copyLevelPassed = (!testLevelInfo.modified && lastRunner) || testLevelInfo.pass; setTimeout(function() { showTipsText("COPY MAP", 1500);}, 50); } break; case KEYCODE_V: //CTRL-V : paste copy map if(copyLevelMap != null && editMapIsEmpty && testLevelInfo.level <= MAX_EDIT_LEVEL) { editPasteMap(); } break; } } return true; } function editPasteMap() { testLevelInfo.levelMap = copyLevelMap; testLevelInfo.modified = 1; testLevelInfo.pass = copyLevelPassed; testLevelInfo.fromPlayData = testLevelInfo.fromLevel = -1; setTestLevel(testLevelInfo); copyLevelMap = null; //clear copy map after paste startEditMode(); ////setButtonState(); setTimeout(function() { showTipsText("PASTE MAP", 1500);}, 50); } function checkTileMouseOver(x, y) { var curTile; for(var i = 0; i < editorTile.length; i++) { curTile = editorTile[i]; if(curTile.x <= x && curTile.y <= y && curTile.x1 >= x && curTile.y1 >= y) { if(editorActiveTileId == i) return; selectTileMouseOver(curTile); if(editorActiveTileId >= 0) selectTileMouseOut(editorTile[editorActiveTileId]); editorActiveTileId = i; return; } } if(editorActiveTileId >= 0) selectTileMouseOut(editorTile[editorActiveTileId]); editorActiveTileId = -1; } function selectTileMouseOver(tile) { var border = tile.getChildAt(0); border.graphics.clear(); border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill(); canvas.style.cursor = "pointer"; //mouseOver = 1; } function selectTileMouseOut(tile) { var border = tile.getChildAt(0); var color = (actTile.id == tile.myId)?"red":"black"; border.graphics.clear(); border.graphics.beginFill(color).drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill(); canvas.style.cursor = "default"; //mouseOver = 0; } function checkButtonMouseOver(x, y) { var curButton; for(var i = 0; i < editorButton.length; i++) { curButton = editorButton[i]; if(curButton.x <= x && curButton.y <= y && curButton.x1 >= x && curButton.y1 >= y) { if(editorButtonMouseOverId == i) return; editorButtonMouseOver(curButton); if(editorButtonMouseOverId >= 0) editorButtonMouseOut(editorButton[editorButtonMouseOverId]); editorButtonMouseOverId = i; return; } } if(editorButtonMouseOverId >= 0) editorButtonMouseOut(editorButton[editorButtonMouseOverId]); editorButtonMouseOverId = -1; } function editorButtonMouseOver(button) { var border = button.getChildAt(0); var width = button.x1-button.x; border.graphics.clear(); border.graphics.beginFill("red").drawRect(-editBorder, -editBorder, width+editBorder*2, tileHScale+editBorder*2).endFill(); var backColor = button.getChildAt(1); backColor.graphics.clear(); backColor.graphics.beginFill("#ffa").drawRect(0, 0, width, tileHScale).endFill(); if (button.alpha) canvas.style.cursor = "pointer"; //mouseOver = 1; } function editorButtonMouseOut(button) { var border = button.getChildAt(0); var width = button.x1-button.x; border.graphics.clear(); border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, width+editBorder*2, tileHScale+editBorder*2).endFill(); var backColor = button.getChildAt(1); backColor.graphics.clear(); backColor.graphics.beginFill("#fff").drawRect(0, 0, width, tileHScale).endFill(); canvas.style.cursor = "default"; //mouseOver = 0; } function setButtonState() { if(testLevelInfo.level > MAX_EDIT_LEVEL) { newButton.alpha = 0; loadButton.alpha = 0; testButton.alpha = 0; saveButton.alpha = 0; canvas.style.cursor = "default"; editWarningMsg(0); return; } else { newButton.alpha = 1; editWarningMsg(1); } if(testLevelInfo.modified) { enableTestButton(); if(testLevelInfo.pass) { saveButton.alpha = 1; } else { saveButton.alpha = 0; } } else { testLevelInfo.pass = 0; saveButton.alpha = 0; } } function editTick() { var x = ((mainStage.mouseX-EDIT_PADDING - editStartX)/(tileWScale+EDIT_PADDING)); var x = (x < 0)?-1:(x|0); var y = ((mainStage.mouseY-EDIT_PADDING) / (tileHScale+EDIT_PADDING) )| 0; if(testLevelInfo.level <= MAX_EDIT_LEVEL) { //debug(mainStage.mouseX,editStartX, x,y); if(mouseInStage && x >= 0 && x < NO_OF_TILES_X && y >= 0 && y < NO_OF_TILES_Y) { //edit area if(editorActiveTileId >= 0) selectTileMouseOut(editorTile[editorActiveTileId]); if(editorButtonMouseOverId >= 0) editorButtonMouseOut(editorButton[editorButtonMouseOverId]); if( x != lastDown.x || y != lastDown.y) { cursorTileObj.alpha = 1; cursorTileObj.x = (tileWScale + EDIT_PADDING) * x+EDIT_PADDING + editStartX; cursorTileObj.y = (tileHScale + EDIT_PADDING) * y+EDIT_PADDING; if(mouseDown) { var clickTile = editMap[x][y]; if(!actTile.id || clickTile.id == actTile.id) { if(actTile.id) cursorTileObj.alpha = 0.1; delManCheck(clickTile.id, x, y); clickTile.tile.getChildAt(1).image = emptyTile.image; clickTile.id = emptyTile.id; } else { delManCheck(clickTile.id, x, y); clickTile.tile.getChildAt(1).image = actTile.image; clickTile.id = actTile.id; addManCheck(actTile.id, x, y); } lastDown = {x:x, y:y}; checkEditMapEmpty(); if(testLevelInfo.pass || actTile.id == RUNNER_ID || testLevelInfo.modified == 0) { testLevelInfo.modified = 1; testLevelInfo.pass = 0; setButtonState(); } } } } else { checkTileMouseOver(mainStage.mouseX, mainStage.mouseY); checkButtonMouseOver(mainStage.mouseX, mainStage.mouseY); cursorTileObj.alpha = 0; } } mainStage.update(); } function levelMapIsEmpty(levelMap) { for(i =0; i < levelMap.length; i++) { if (levelMap[i] != ' ') return 0; } return 1; } //======================================================== // // Copy share level to test level or copy map for editig // //========================================================= function copyShareLevelForEditing() { getTestLevel(testLevelInfo); if(testLevelInfo.level <= MAX_EDIT_LEVEL && levelMapIsEmpty(testLevelInfo.levelMap)) { //test map is empty, replace test map with share level map testLevelInfo.levelMap = shareLevelData[0]; testLevelInfo.modified = 1; testLevelInfo.pass = 1; testLevelInfo.fromPlayData = testLevelInfo.fromLevel = -1; setTestLevel(testLevelInfo); } else { if (shareLevelData[0] != testLevelInfo.levelMap) { //(testMap != empty and testMap != shareMap) ==> keep shareLevel map to copyMap copyLevelMap = shareLevelData[0]; copyLevelPassed = 1; } } } function editShareLevel() { editEdit(0, null); } ================================================ FILE: lodeRunner.gameVerName.js ================================================ var gameVersionName = [ " Classic Lode Runner ", " Championship Lode Runner ", " Professional Lode Runner ", " Revenge of Lode Runner ", " Lode Runner Fan Book " ]; ================================================ FILE: lodeRunner.gamepad.js ================================================ var MAX_CONTROLLER = 4; var gamepadReady = 0; var gamepadPollingId = null; var gamepadLastId = -1; //for send to server only var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; var cancelRequestAnimationFrame = window.cancelRequestAnimationFrame || window.webkitCancelRequestAnimationFrame || window.mozCancelRequestAnimationFrame; function gamepadEnable() { if(!gamepadSupport()) return; window.addEventListener("gamepadconnected",gamepadConnectFun, false); window.addEventListener("gamepaddisconnected", gamepadDisconnectFun, false); gamepadPollingId = setInterval(gamepadCheck, 500); } function gamepadSupport() { return ("getGamepads" in navigator) || ("webkitGetGamepads" in navigator); } function gamepadConnectFun(e) { //console.log("Gamepad connected at index %d: %s. %d buttons, %d axes.", // e.gamepad.index, e.gamepad.id, // e.gamepad.buttons.length, e.gamepad.axes.length); gamepadReady = 1; if(gamepadPollingId) { clearInterval(gamepadPollingId); gamepadPollingId = null; } requestAnimationFrame(gamepadRequestState); } function gamepadDisconnectFun(e) { console.log("disconnection game port#%d", e.gamepad.index ); gamepadReady = 0; if(!gamepadPollingId) gamepadPollingId = setInterval(gamepadCheck, 500); } function gamepadCheck() { gamepad = gamepadGetInstance(); for(var id=0; id < MAX_CONTROLLER; id ++) { if(gamepad[id]) { if(!gamepadReady) { gamepadConnectTrigger(gamepad[id]); } } } } function gamepadGetInstance() { return ("getGamepads" in navigator) ? navigator.getGamepads() : (("webkitGetGamepads" in navigator) ? navigator.webkitGetGamepads() : []); } //================================= // Generate gamepadconnected event //================================= function gamepadConnectTrigger(gamepad) { var event = document.createEvent('Event'); event.initEvent("gamepadconnected", true, true); //can bubble, and is cancellable event.gamepad = gamepad; dispatchEvent(event); } function gamepadDisable() { if(!gamepadSupport()) return; window.removeEventListener("gamepadconnected",gamepadConnectFun, false); window.removeEventListener("gamepaddisconnected", gamepadDisconnectFun, false); if(gamepadPollingId) { clearInterval(gamepadPollingId); gamepadPollingId = null; } gamepadReady = 0; } function getLastGamepadInfo() { var gamepadInfo = null; if(gamepadLastId >= 0 && gamepadLastId < MAX_CONTROLLER ) { var gamepad = gamepadGetInstance()[gamepadLastId]; if(gamepad) { gamepadInfo =gamepad.index + "." + gamepad.id + (gamepad.mapping != ""?("." +gamepad.mapping):""); } } return gamepadInfo; } //=========================================================================== var keyCodeMapping = [ //[[keyCode1, ctrl, shift], [keyCode2, ctrl, shift] [[KEYCODE_UP, 0, 0], [KEYCODE_UP, 0, 0]], //up [[KEYCODE_DOWN, 0, 0], [KEYCODE_DOWN, 0, 0]], //down [[KEYCODE_LEFT, 0, 0], [KEYCODE_LEFT, 0, 0]], //left [[KEYCODE_RIGHT, 0, 0], [KEYCODE_RIGHT, 0, 0]], //right [[KEYCODE_Z, 0, 0], [KEYCODE_ENTER, 0, 0]], //dig-left [[KEYCODE_X, 0, 0], [KEYCODE_ENTER, 0, 0]], //dig-right [[KEYCODE_ESC, 0, 0], [KEYCODE_ENTER, 0, 0]], //pause [[KEYCODE_ENTER, 0, 0], [KEYCODE_ENTER, 0, 0]], //enter [[KEYCODE_A, 1, 0], [KEYCODE_ENTER, 0, 0]] //game abort ]; var gameButtonMapping = [ //index[0] buttonMethod: 0: don't repeat, 1: repeat, 2: combine button [ 1, ['B', 12],['A', 1, "<", -0.6],['B', 16]], //UP [ 1, ['B', 13],['A', 1, ">", 0.6],['B', 17]], //DOWN [ 1, ['B', 14],['A', 0, "<", -0.6],['B', 18]], //LEFT [ 1, ['B', 15],['A', 0, ">", 0.6],['B', 19]], //RIGHT [ 1, ['B', 2],['B', 3]], //DIG-LEFT [ 1, ['B', 1]], //DIG-RIGHT [ 0, ['B', 8],['B', 11]], //PAUSE (ESC) [ 0, ['B', 9]], //Enter (Accept) [ 2, ['B', 4],['B', 5], ['B', 6],['B', 7]] //GAME ABORT (CTRL-A) ]; var lastButtonState = [ [ 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0], [ 0, 0, 0, 0, 0, 0, 0, 0, 0] ]; function gamepadRequestState() { var i, j; var gamepad, curButtonState; var buttonMethod; for(var id=0; id < MAX_CONTROLLER; id ++) { gamepad = gamepadGetInstance()[id]; curButtonState = []; if(gamepad) { for(i = 0; i < gameButtonMapping.length; i++) { curButtonState[i] = 0; buttonMethod = gameButtonMapping[i][0]; for(j = 1; j < gameButtonMapping[i].length && !curButtonState[i]; j++) { var curButtonMapping = gameButtonMapping[i][j]; switch(curButtonMapping[0]) { case 'A': //axes var axesId = curButtonMapping[1]; if(gamepad.axes.length > axesId) { var axesCmpSign = curButtonMapping[2]; var axesCmpValue = curButtonMapping[3]; var axesValue = Math.trunc(gamepad.axes[axesId]*100)/100; if(typeof axesValue != 'undefined' ) { if( (axesCmpSign == ">" && axesValue > axesCmpValue && axesValue <= 1.05) ||(axesCmpSign == "<" && axesValue < axesCmpValue && axesValue >= -1.05) ) { //console.log("axes#%d = %f", axesId, axesValue ); curButtonState[i] = 1; } } } break; case 'B': //button var buttonId = curButtonMapping[1]; var button = gamepad.buttons[buttonId]; if(buttonPressed(button)) curButtonState[i] = 1; if(buttonMethod == 2) { //combine mode j++; if(curButtonState[i]) { curButtonMapping = gameButtonMapping[i][j]; buttonId = curButtonMapping[1]; button = gamepad.buttons[buttonId]; if(buttonPressed(button)) { curButtonState[i] = 1; } else { curButtonState[i] = 0; } } } break; } } switch(buttonMethod) { case 1: //repeat if(document.onkeydown == handleKeyDown || document.onkeydown == anyKeyDown) { if(curButtonState[i])sendKeyDown(keyCodeMapping[i], id); else if(lastButtonState[id][i]) sendKeyUp(keyCodeMapping[i], id); break; } case 0: //don't repeat case 2: if(lastButtonState[id][i] != curButtonState[i]) { if(curButtonState[i])sendKeyDown(keyCodeMapping[i], id); else if(lastButtonState[id][i]) sendKeyUp(keyCodeMapping[i], id); } break; } } lastButtonState[id] = curButtonState; } } if(gamepadReady) requestAnimationFrame(gamepadRequestState); } function buttonPressed(button) { var pressed = button == 1.0; if (typeof(button) == "object") { pressed = button.pressed; } return pressed; } function gamepadClearId() { gamepadLastId = -1; } function sendKeyUp(twinKey, id) { var key = (inputNameState)? twinKey[1]:twinKey[0]; if(key[0] == null) return; var event = {keyCode: key[0], ctrlKey: key[1], shiftKey: key[2]}; //console.log("sendKeyUp = %d",keyCode ); if(typeof document.onkeydown == "function" ) document.onkeyup(event); gamepadLastId = id; } function sendKeyDown(twinKey, id) { var key = (inputNameState)? twinKey[1]:twinKey[0]; if(key[0] == null) return; var event = {keyCode: key[0], ctrlKey: key[1], shiftKey: key[2]}; //console.log("sendKeyDown = %d",keyCode ); if(typeof document.onkeydown == "function" ) document.onkeydown(event); gamepadLastId = id; } ================================================ FILE: lodeRunner.guard.js ================================================ //============================================================================= // AI reference book: "玩 Lode Runner 學 C 語言" // http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538 //============================================================================= var movePolicy = [ [0, 0, 0, 0, 0, 0], //* move_map is used to find *// [0, 1, 1, 0, 1, 1], //* wheather to move a enm *// [1, 1, 1, 1, 1, 1], //* by indexing into it with *// [1, 2, 1, 1, 2, 1], //* enm_byte + num_enm + *// [1, 2, 2, 1, 2, 2], //* set_num to get a byte. *// [2, 2, 2, 2, 2, 2], //* then that byte is checked*// [2, 2, 3, 2, 2, 3], //* for !=0 and then decrmnt *// [2, 3, 3, 2, 3, 3], //* for next test until = 0 *// [3, 3, 3, 3, 3, 3], [3, 3, 4, 3, 3, 4], [3, 4, 4, 3, 4, 4], [4, 4, 4, 4, 4, 4] ]; var moveOffset = 0; var moveId = 0; //current guard id var numOfMoveItems = movePolicy[0].length; //******************************** //initial guard start move value //******************************** function initGuardVariable() { moveOffset = moveId = 0; } function moveGuard() { var moves; var curGuard; var x, y, yOffset; if(!guardCount) return; //no guard if( ++moveOffset >= numOfMoveItems ) moveOffset = 0; moves = movePolicy[guardCount][moveOffset]; // get next moves while ( moves-- > 0) { // slows guard relative to runner if(++moveId >= guardCount) moveId = 0; curGuard = guard[moveId]; if(curGuard.action == ACT_IN_HOLE || curGuard.action == ACT_REBORN) { continue; } guardMoveStep(moveId, bestMove(moveId)); } } function guardMoveStep( id, action) { var curGuard = guard[id]; var x = curGuard.pos.x; var xOffset = curGuard.pos.xOffset; var y = curGuard.pos.y; var yOffset = curGuard.pos.yOffset; var curToken, nextToken; var centerX, centerY; var curShape, newShape; var stayCurrPos; centerX = centerY = ACT_STOP; curShape = newShape = curGuard.shape; if(curGuard.action == ACT_CLIMB_OUT && action == ACT_STOP) curGuard.action = ACT_STOP; //for level 16, 30, guard will stock in hole switch(action) { case ACT_UP: case ACT_DOWN: case ACT_FALL: if ( action == ACT_UP ) { stayCurrPos = ( y <= 0 || (nextToken = map[x][y-1].act) == BLOCK_T || nextToken == SOLID_T || nextToken == TRAP_T || nextToken == GUARD_T); if( yOffset <= 0 && stayCurrPos) action = ACT_STOP; } else { //ACT_DOWN || ACT_FALL stayCurrPos = ( y >= maxTileY || (nextToken = map[x][y+1].act) == BLOCK_T || nextToken == SOLID_T || nextToken == GUARD_T); if( action == ACT_FALL && yOffset < 0 && map[x][y].base == BLOCK_T) { action = ACT_IN_HOLE; stayCurrPos = 1; } else { if ( yOffset >= 0 && stayCurrPos) action = ACT_STOP; } } if ( action != ACT_STOP ) { if ( xOffset > 0) centerX = ACT_LEFT; else if ( xOffset < 0) centerX = ACT_RIGHT; } break; case ACT_LEFT: case ACT_RIGHT: if ( action == ACT_LEFT ) { /* original source code from book stayCurrPos = ( x <= 0 || (nextToken = map[x-1][y].act) == BLOCK_T || nextToken == SOLID_T || nextToken == TRAP_T || nextToken == GUARD_T); */ // change check TRAP_T from base, // for support level 41==> runner in trap will cause guard move stayCurrPos = ( x <= 0 || (nextToken = map[x-1][y].act) == BLOCK_T || nextToken == SOLID_T || nextToken == GUARD_T || map[x-1][y].base == TRAP_T); if (xOffset <= 0 && stayCurrPos) action = ACT_STOP; } else { //ACT_RIGHT /* original source code from book stayCurrPos = ( x >= maxTileX || (nextToken = map[x+1][y].act) == BLOCK_T || nextToken == SOLID_T || nextToken == TRAP_T || nextToken == GUARD_T); */ // change check TRAP_T from base, // for support level 41==> runner in trap will cause guard move stayCurrPos = ( x >= maxTileX || (nextToken = map[x+1][y].act) == BLOCK_T || nextToken == SOLID_T || nextToken == GUARD_T || map[x+1][y].base == TRAP_T); if (xOffset >= 0 && stayCurrPos) action = ACT_STOP; } if ( action != ACT_STOP ) { if ( yOffset > 0 ) centerY = ACT_UP; else if ( yOffset < 0) centerY = ACT_DOWN; } break; } curToken = map[x][y].base; if ( action == ACT_UP ) { yOffset -= yMove; if(stayCurrPos && yOffset < 0) yOffset = 0; //stay on current position else if(yOffset < -H2) { //move to y-1 position if ( curToken == BLOCK_T || curToken == HLADR_T ) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x][y-1], so set [x][y].act to previous state y--; yOffset = tileH + yOffset; if(map[x][y].act == RUNNER_T) setRunnerDead(); //collision //map[x][y].act = GUARD_T; } if( yOffset <= 0 && yOffset > -yMove) { dropGold(id); //decrease count } newShape = "runUpDn"; } if ( centerY == ACT_UP ) { yOffset -= yMove; if( yOffset < 0) yOffset = 0; //move to center Y } if ( action == ACT_DOWN || action == ACT_FALL || action == ACT_IN_HOLE) { var holdOnBar = 0; if(curToken == BAR_T) { if( yOffset < 0) holdOnBar = 1; else if(action == ACT_DOWN && y < maxTileY && map[x][y+1].act != LADDR_T) { action = ACT_FALL; //shape fixed: 2014/03/27 } } yOffset += yMove; if(holdOnBar == 1 && yOffset >= 0) { yOffset = 0; //fall and hold on bar action = ACT_FALL_BAR; } if(stayCurrPos && yOffset > 0 ) yOffset = 0; //stay on current position else if(yOffset > H2) { //move to y+1 position if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x][y+1], so set [x][y].act to previous state y++; yOffset = yOffset - tileH; if(map[x][y].act == RUNNER_T) setRunnerDead(); //collision //map[x][y].act = GUARD_T; } //add condition: AI version >= 3 will decrease drop count while guard fall if( ((curAiVersion >= 3 && action == ACT_FALL) || action == ACT_DOWN) && yOffset >= 0 && yOffset < yMove) { //try drop gold dropGold(id); //decrease count } if(action == ACT_IN_HOLE) { //check in hole or still falling if (yOffset < 0) { action = ACT_FALL; //still falling //---------------------------------------------------------------------- //For AI version >= 4, drop gold before guard failing into hole totally if(curAiVersion >= 4 && curGuard.hasGold > 0) { if(map[x][y-1].base == EMPTY_T) { //drop gold above addGold(x, y-1); } else decGold(); //gold disappear curGuard.hasGold = 0; guardRemoveRedhat(curGuard); //9/4/2016 } //---------------------------------------------------------------------- } else { //fall into hole (yOffset MUST = 0) //---------------------------------------------------------------------- //For AI version < 4, drop gold after guard failing into hole totally if( curGuard.hasGold > 0 ) { if(map[x][y-1].base == EMPTY_T) { //drop gold above addGold(x, y-1); } else decGold(); //gold disappear } curGuard.hasGold = 0; guardRemoveRedhat(curGuard); //9/4/2016 //---------------------------------------------------------------------- if( curShape == "fallRight") newShape = "shakeRight"; else newShape = "shakeLeft"; themeSoundPlay("trap"); shakeTimeStart = recordCount; //for debug if(curAiVersion < 3) { curGuard.sprite.on("animationend", function() { climbOut(id); }); } else { add2GuardShakeQueue(id, newShape); } if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) { drawScore(SCORE_IN_HOLE); } else { //for modem mode & edit mode //drawGuard(1); //only guard dead need add count } } } if(action == ACT_DOWN) { newShape = "runUpDn"; } else { //ACT_FALL or ACT_FALL_BAR if (action == ACT_FALL_BAR) { if(curGuard.lastLeftRight == ACT_LEFT) newShape = "barLeft"; else newShape = "barRight"; } else { if(action == ACT_FALL && curShape != "fallLeft" && curShape != "fallRight") { if (curGuard.lastLeftRight == ACT_LEFT) newShape = "fallLeft"; else newShape = "fallRight"; } } } } if ( centerY == ACT_DOWN ) { yOffset += yMove; if ( yOffset > 0 ) yOffset = 0; //move to center Y } if ( action == ACT_LEFT) { xOffset -= xMove; if(stayCurrPos && xOffset < 0) xOffset = 0; //stay on current position else if ( xOffset < -W2) { //move to x-1 position if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x-1][y], so set [x][y].act to previous state x--; xOffset = tileW + xOffset; if(map[x][y].act == RUNNER_T) setRunnerDead(); //collision //map[x][y].act = GUARD_T; } if( xOffset <= 0 && xOffset > -xMove) { dropGold(id); //try to drop gold } if(curToken == BAR_T) newShape = "barLeft"; else newShape = "runLeft"; } if ( centerX == ACT_LEFT ) { xOffset -= xMove; if ( xOffset < 0) xOffset = 0; //move to center X } if ( action == ACT_RIGHT ) { xOffset += xMove; if(stayCurrPos && xOffset > 0) xOffset = 0; //stay on current position else if ( xOffset > W2) { //move to x+1 position if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x+1][y], so set [x][y].act to previous state x++; xOffset = xOffset - tileW; if(map[x][y].act == RUNNER_T) setRunnerDead(); //collision //map[x][y].act = GUARD_T; } if( xOffset >= 0 && xOffset < xMove) { dropGold(id); } if(curToken == BAR_T) newShape = "barRight"; else newShape = "runRight"; } if ( centerX == ACT_RIGHT ) { xOffset += xMove; if ( xOffset > 0) xOffset = 0; //move to center X } //if(curGuard == ACT_CLIMB_OUT) action == ACT_CLIMB_OUT; if(action == ACT_STOP) { if(curGuard.action != ACT_STOP){ curGuard.sprite.stop(); if(curGuard.action != ACT_CLIMB_OUT) curGuard.action = ACT_STOP; } } else { if(curGuard.action == ACT_CLIMB_OUT) action = ACT_CLIMB_OUT; curGuard.sprite.x = (x * tileW + xOffset) * tileScale | 0; curGuard.sprite.y = (y * tileH + yOffset) * tileScale | 0; curGuard.pos = { x:x, y:y, xOffset:xOffset, yOffset:yOffset}; if(curShape != newShape) { curGuard.sprite.gotoAndPlay(newShape); curGuard.shape = newShape; } if(action != curGuard.action){ curGuard.sprite.play(); } curGuard.action = action; if(action == ACT_LEFT || action == ACT_RIGHT) curGuard.lastLeftRight = action; } map[x][y].act = GUARD_T; // Check to get gold and carry if(map[x][y].base == GOLD_T && curGuard.hasGold == 0 && ((!xOffset && yOffset >= 0 && yOffset < H4) || (!yOffset && xOffset >= 0 && xOffset < W4) || (y < maxTileY && map[x][y+1].base == LADDR_T && yOffset < H4) // gold above laddr ) ) { //curGuard.hasGold = ((Math.random()*26)+14)|0; //14 - 39 curGuard.hasGold = ((Math.random()*26)+12)|0; //12 - 37 change gold drop steps guardWearRedhat(curGuard); //9/4/2016 if(playMode == PLAY_AUTO || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) getDemoGold(curGuard); if(recordMode) processRecordGold(curGuard); removeGold(x, y); //debug ("get, (x,y) = " + x + "," + y + ", offset = " + xOffset); } //check collision again //checkCollision(runner.pos.x, runner.pos.y); } //meanings: guard with gold function guardWearRedhat(guard) { if(redhatMode) guard.sprite.spriteSheet = redhatData; } //meanings: guard without gold function guardRemoveRedhat(guard) { if(redhatMode) guard.sprite.spriteSheet = guardData; } function dropGold(id) { var curGuard = guard[id]; var nextToken; var drop = 0; switch (true) { case (curGuard.hasGold > 1): curGuard.hasGold--; // count > 1, don't drop it only decrease count //loadingTxt.text = "(" + id + ") = " + curGuard.hasGold; break; case (curGuard.hasGold == 1): //drop gold var x = curGuard.pos.x, y = curGuard.pos.y; if(map[x][y].base == EMPTY_T && ( y >= maxTileY || ((nextToken = map[x][y+1].base) == BLOCK_T || nextToken == SOLID_T || nextToken == LADDR_T) ) ) { addGold(x,y); curGuard.hasGold = -1; //for record play action always use value = -1 //curGuard.hasGold = -(((Math.random()*10)+1)|0); //-1 ~ -10; //waiting time for get gold guardRemoveRedhat(curGuard); //9/4/2016 drop = 1; } break; case (curGuard.hasGold < 0): curGuard.hasGold++; //wait, don't get gold till count = 0 //loadingTxt.text = "(" + id + ") = " + curGuard.hasGold; break; } return drop; } //============================================= // BEGIN NEW SHAKE METHOD for AI version >= 3 //============================================= var DEBUG_TIME = 0; var shakeRight = [ 8, 9, 10, 9, 10, 8 ]; var shakeLeft = [ 30, 31, 32, 31, 32, 30 ]; var shakeTime = [ 36, 3, 3, 3, 3, 3 ]; var shakingGuardList = []; function initStillFrameVariable() { initGuardShakeVariable(); initFillHoleVariable(); initRebornVariable(); } function initGuardShakeVariable() { shakingGuardList = []; //------------------------------------------------------------------------- // Shake time extension when guard in hole, // so the runner can dig three hold for three guards and pass through them. // The behavior almost same as original lode runner (APPLE-II version). // 2016/06/04 //------------------------------------------------------------------------- if(curAiVersion <= 3) shakeTime = [ 36, 3, 3, 3, 3, 3 ]; //for AI VERSION = 3 else shakeTime = [ 51, 3, 3, 3, 3, 3 ]; //for AI VERSION > 3 } function add2GuardShakeQueue(id, shape) { var curGuard = guard[id]; if(shape == "shakeRight") { curGuard.shapeFrame = shakeRight; } else { curGuard.shapeFrame = shakeLeft; } curGuard.curFrameIdx = 0; curGuard.curFrameTime = -1; //for init shakingGuardList.push(id); //error("push id =" + id + "(" + shakingGuardList + ")" ); } function processGuardShake() { var curGuard, curIdx; for(var i = 0; i < shakingGuardList.length;) { curGuard = guard[shakingGuardList[i]]; curIdx = curGuard.curFrameIdx; if( curGuard.curFrameTime < 0) { //start shake => set still frame curGuard.curFrameTime = 0; curGuard.sprite.gotoAndStop(curGuard.shapeFrame[curIdx]); } else { if(++curGuard.curFrameTime >= shakeTime[curIdx]) { if(++curGuard.curFrameIdx < curGuard.shapeFrame.length) { //change frame curGuard.curFrameTime = 0; curGuard.sprite.gotoAndStop(curGuard.shapeFrame[curGuard.curFrameIdx]); } else { //shake time out var id = shakingGuardList[i]; shakingGuardList.splice(i, 1); //remove from list //error("remove id =" + id + "(" + shakingGuardList + ")" ); climbOut(id); //climb out continue; } } } i++; } } function removeFromShake(id) { for(var i = 0; i < shakingGuardList.length;i++) { if(shakingGuardList[i] == id) { shakingGuardList.splice(i, 1); //remove from list //error("remove id =" + id + "(" + shakingGuardList + ")" ); return; } } error("design error id =" + id + "(" + shakingGuardList + ")" ); } //====================== // END NEW SHAKE METHOD //====================== function climbOut(id) { var curGuard = guard[id] curGuard.action = ACT_CLIMB_OUT; curGuard.sprite.removeAllEventListeners ("animationend"); curGuard.sprite.gotoAndPlay("runUpDn"); curGuard.shape = "runUpDn"; curGuard.holePos = {x: curGuard.pos.x, y: curGuard.pos.y }; if(DEBUG_TIME) loadingTxt.text = "ShakeTime = " + (recordCount - shakeTimeStart); //for debug } function bestMove(id) { var guarder = guard[id]; var x = guarder.pos.x; var xOffset = guarder.pos.xOffset; var y = guarder.pos.y; var yOffset = guarder.pos.yOffset; var curToken, nextBelow, nextMove; var checkSameLevelOnly = 0; curToken = map[x][y].base; if(guarder.action == ACT_CLIMB_OUT) { //clib from hole if(guarder.pos.y == guarder.holePos.y) { return (ACT_UP); }else { checkSameLevelOnly = 1; if(guarder.pos.x != guarder.holePos.x) { //out of hole guarder.action = ACT_LEFT; } } } if( !checkSameLevelOnly) { /****** next check to see if enm must fall. if so ***********/ /****** return e_fall and skip the rest. ***********/ if ( curToken == LADDR_T || (curToken == BAR_T && yOffset === 0) ) { //ladder & bar /* no guard fall */ } else if ( yOffset < 0) //no laddr & yOffset < 0 ==> falling return (ACT_FALL); else if ( y < maxTileY ) { nextBelow = map[x][y+1].act; if ( (nextBelow == EMPTY_T || nextBelow == RUNNER_T )) { return (ACT_FALL); } else if ( nextBelow == BLOCK_T || nextBelow == SOLID_T || nextBelow == GUARD_T || nextBelow == LADDR_T ) { /* no guard fall */ } else { return ( ACT_FALL ); } } } /******* next check to see if palyer on same floor *********/ /******* and whether enm can get him. Ignore walls *********/ var runnerX = runner.pos.x; var runnerY = runner.pos.y; // if ( y == runnerY ) { // same floor with runner if ( y == runnerY && runner.action != ACT_FALL) { //case : guard on laddr and falling => don't catch it while ( x != runnerX ) { if ( y < maxTileY ) nextBelow = map[x][y+1].base; else nextBelow = SOLID_T; curToken = map[x][y].base; if ( curToken == LADDR_T || curToken == BAR_T || // go through nextBelow == SOLID_T || nextBelow == LADDR_T || nextBelow == BLOCK_T || map[x][y+1].act == GUARD_T || //fixed: must check map[].act with guard_t (for support champLevel:43) nextBelow == BAR_T || nextBelow == GOLD_T) //add BAR_T & GOLD_T for support level 92 { if ( x < runnerX) // guard left to runner ++x; else if ( x > runnerX ) --x; // guard right to runner } else break; // exit loop with closest x if no path to runner } if ( x == runnerX ) // scan for a path ignoring walls is a success { if (guarder.pos.x < runnerX ) { //if left of man go right else left nextMove = ACT_RIGHT; } else if ( guarder.pos.x > runnerX ) { nextMove = ACT_LEFT; } else { // guard X = runner X if ( guarder.pos.xOffset < runner.pos.xOffset ) nextMove = ACT_RIGHT; else nextMove = ACT_LEFT; } return (nextMove); } } // if ( y == runnerY ) { ... /********** If can't reach man on current level, then scan floor *********/ /********** (ignoring walls) and look up and down for best move *********/ return scanFloor(id); } var bestPath, bestRating, curRating; var leftEnd, rightEnd; var startX, startY; function scanFloor(id) { var x, y; var curToken, nextBelow; var curPath; x = startX = guard[id].pos.x; y = startY = guard[id].pos.y; bestRating = 255; // start with worst rating curRating = 255; bestPath = ACT_STOP; /****** get ends for search along floor ******/ while ( x > 0 ) { //get left end first curToken = map[x-1][y].act; if ( curToken == BLOCK_T || curToken == SOLID_T ) break; if ( curToken == LADDR_T || curToken == BAR_T || y >= maxTileY || y < maxTileY && ( ( nextBelow = map[x-1][y+1].base) == BLOCK_T || nextBelow == SOLID_T || nextBelow == LADDR_T ) ) --x; else { --x; // go on left anyway break; } } leftEnd = x; x = startX; while ( x < maxTileX ) { // get right end next curToken = map[x+1][y].act; if ( curToken == BLOCK_T || curToken == SOLID_T ) break; if ( curToken == LADDR_T || curToken == BAR_T || y >= maxTileY || y < maxTileY && ( ( nextBelow = map[x+1][y+1].base) == BLOCK_T || nextBelow == SOLID_T || nextBelow == LADDR_T ) ) ++x; else { // go on right anyway ++x; break; } } rightEnd = x; /******* Do middle scan first for best rating and direction *******/ x = startX; if ( y < maxTileY && (nextBelow = map[x][y+1].base) != BLOCK_T && nextBelow != SOLID_T ) scanDown( x, ACT_DOWN ); if( map[x][y].base == LADDR_T ) scanUp( x, ACT_UP ); /******* next scan both sides of floor for best rating *******/ curPath = ACT_LEFT; x = leftEnd; while ( true ) { if ( x == startX ) { if ( curPath == ACT_LEFT && rightEnd != startX ) { curPath = ACT_RIGHT; x = rightEnd; } else break; } if( y < maxTileY && (nextBelow = map [x][y+1].base) != BLOCK_T && nextBelow != SOLID_T ) scanDown (x, curPath ); if( map[x][y].base == LADDR_T ) scanUp ( x, curPath ); if ( curPath == ACT_LEFT ) x++; else x--; } return ( bestPath ); } // end scan floor for best direction to go function scanDown(x, curPath ) { var y; var nextBelow; //curRating; var runnerX = runner.pos.x; var runnerY = runner.pos.y; y = startY; while( y < maxTileY && ( nextBelow = map [x][y+1].base) != BLOCK_T && nextBelow != SOLID_T ) // while no floor below ==> can move down { if ( map[x][y].base != EMPTY_T && map[x][y].base != HLADR_T) { // if not falling ==> try move left or right //************************************************************************************ // 2014/04/14 Add check "map[x][y].base != HLADR_T" for support // champLevel 19: a guard in hole with h-ladder can run left after dig the left hole //************************************************************************************ if ( x > 0 ) { // if not at left edge check left side if ( (nextBelow = map[x-1][y+1].base) == BLOCK_T || nextBelow == LADDR_T || nextBelow == SOLID_T || map[x-1][y].base == BAR_T ) // can move left { if ( y >= runnerY ) // no need to go on break; // already below runner } } if ( x < maxTileX ) // if not at right edge check right side { if ( (nextBelow = map[x+1][y+1].base) == BLOCK_T || nextBelow == LADDR_T || nextBelow == SOLID_T || map[x+1][y].base == BAR_T ) // can move right { if ( y >= runnerY ) break; } } } // end if not falling ++y; // go to next level down } // end while ( y < maxTileY ... ) scan down if( y == runnerY ) { // update best rating and direct. curRating = Math.abs(startX - x); // if ( (curRating = runnerX - x) < 0) //BUG from original book ? (changed by Simon) // curRating = -curRating; //ABS } else if ( y > runnerY ) curRating = y - runnerY + 200; // position below runner else curRating = runnerY - y + 100; // position above runner if( curRating < bestRating ) { bestRating = curRating; bestPath = curPath; } } // end Scan Down function scanUp( x, curPath ) { var y; var nextBelow; //curRating; var runnerX = runner.pos.x; var runnerY = runner.pos.y; y = startY; while ( y > 0 && map[x][y].base == LADDR_T ) { // while can go up --y; if ( x > 0 ) { // if not at left edge check left side if ( (nextBelow = map[x-1][y+1].base) == BLOCK_T || nextBelow == SOLID_T || nextBelow == LADDR_T || map[x-1][y].base == BAR_T ) // can move left { if ( y <= runnerY ) // no need to go on break; // already above runner } } if ( x < maxTileX ) { // if not at right edge check right side if ( (nextBelow = map[x+1][y+1].base) == BLOCK_T || nextBelow == SOLID_T || nextBelow == LADDR_T || map[x+1][y].base == BAR_T ) // can move right { if ( y <= runnerY ) break; } } //--y; } // end while ( y > 0 && laddr up) scan up if ( y == runnerY ) { // update best rating and direct. curRating = Math.abs(startX - x); //if ( (curRating = runnerX - x) < 0) // BUG from original book ? (changed by Simon) // curRating = -curRating; //ABS } else if ( y > runnerY ) curRating = y - runnerY + 200; // position below runner else curRating = runnerY - y + 100; // position above runner if ( curRating < bestRating ) { bestRating = curRating; bestPath = curPath; } } // end scan Up var bornRndX; //range random 0..maxTileX function initRnd() { //bornRndX = new rangeRandom(0, maxTileX, curLevel); //set fixed seed for demo mode bornRndX = new rangeRandom(0, maxTileX, 0); //random range 0 .. maxTileX } function getGuardId(x, y) { var id; for(id = 0; id < guardCount; id++) { if ( guard[id].pos.x == x && guard[id].pos.y == y) break; } assert(id < guardCount, "Error: can not get guard position!"); return id; } function guardReborn(x, y) { var id; //get guard id by current in hole position id = getGuardId(x, y); var bornY = 1; //start on line 2 var bornX = bornRndX.get(); var rndStart = bornX; while(map[bornX][bornY].act != EMPTY_T || map[bornX][bornY].base == GOLD_T || map[bornX][bornY].base == BLOCK_T ) { //BUG FIXED for level 115 (can not reborn at bornX=27) //don't born at gold position & diged position, 2/24/2015 if( (bornX = bornRndX.get()) == rndStart) { bornY++; } assert(bornY <= maxTileY, "Error: Born Y too large !"); } //debug("bornX = " + bornX); if(playMode == PLAY_AUTO || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) { var bornPos = getDemoBornPos(); bornX = bornPos.x; bornY = bornPos.y; } if(recordMode == RECORD_KEY) saveRecordBornPos(bornX, bornY); else if(recordMode == RECORD_PLAY) { var bornPos = getRecordBornPos(); bornX = bornPos.x; bornY = bornPos.y; } map[bornX][bornY].act = GUARD_T; //debug("born (x,y) = (" + bornX + "," + bornY + ")"); var curGuard = guard[id]; curGuard.pos = { x:bornX, y:bornY, xOffset:0, yOffset: 0 }; curGuard.sprite.x = bornX * tileWScale | 0; curGuard.sprite.y = bornY * tileHScale | 0; rebornTimeStart = recordCount; if(curAiVersion < 3) { curGuard.sprite.on("animationend", function() { rebornComplete(id); }); curGuard.sprite.gotoAndPlay("reborn"); } else { add2RebornQueue(id); } curGuard.shape = "reborn"; curGuard.action = ACT_REBORN; } function rebornComplete(id) { var x = guard[id].pos.x; var y = guard[id].pos.y; if( map[x][y].act == RUNNER_T) setRunnerDead(); //collision map[x][y].act = GUARD_T; guard[id].sprite.removeAllEventListeners ("animationend"); guard[id].action = ACT_FALL; guard[id].shape = "fallRight"; //guard[id].hasGold = 0; guard[id].sprite.gotoAndPlay("fallRight"); themeSoundPlay("reborn"); if(DEBUG_TIME) loadingTxt.text = "rebornTime = " + (recordCount - rebornTimeStart); //for debug } function setRunnerDead() { if(!godMode) gameState = GAME_RUNNER_DEAD; } //=============================================== // BEGIN NEW FOR REBORN (ai version >= 3) //=============================================== var rebornFrame = [ 28, 29 ]; var rebornTime = [ 6, 2 ]; var rebornGuardList = []; function initRebornVariable() { rebornGuardList = []; } function add2RebornQueue(id) { var curGuard = guard[id]; curGuard.sprite.gotoAndStop("reborn"); curGuard.curFrameIdx = 0; curGuard.curFrameTime = -1; rebornGuardList.push(id); } function processReborn() { var curGuard, curIdx; for(var i = 0; i < rebornGuardList.length;) { curGuard = guard[rebornGuardList[i]]; curIdx = curGuard.curFrameIdx; if(++curGuard.curFrameTime >= rebornTime[curIdx]) { if(++curGuard.curFrameIdx < rebornFrame.length) { //change frame curGuard.curFrameTime = 0; curGuard.sprite.gotoAndStop(rebornFrame[curGuard.curFrameIdx]); } else { //reborn var id = rebornGuardList[i]; rebornGuardList.splice(i, 1); //remove from list rebornComplete(id); continue; } } i++; } } //==================== // END NEW FOR REBORN //==================== ================================================ FILE: lodeRunner.hiscore.js ================================================ var inputNameState = 0; function showScoreTable(_playData, _curScoreInfo, _callbackFun, _waitTime) { var hiScoreInfo; var canvas2, scoreStage; var titleText; var recordId = -1; var savedKeyDownHander; var timeOutHandler = null; init(); function init() { var haveInfo = getHiScoreInfo(); if(_curScoreInfo) { recordId = updateScoreInfo(); if(recordId < 0) { if(_callbackFun) _callbackFun(); return; //don't need update score } } if(!haveInfo && !_curScoreInfo) { if(_callbackFun) _callbackFun(); return; //no score info don't need display } createCanvas2(); createScoreStage(); setScoreBackground(); drawHiScoreList(); scoreStage.update(); if(recordId >= 0) { var winner = 0; if('w' in _curScoreInfo) winner = 1; inputHiScoreName(winner); } else { anyKeyHandler(); if(typeof _waitTime == "undefined") _waitTime = 3500; timeOutHandler = setTimeout( function() { closeScoreTable(); }, _waitTime); } } function closeScoreTable() { removeCanvas2(); restoreKeyDownHandler(); if(_callbackFun) _callbackFun(); } function getHiScoreInfo() { var infoJSON = null, levelMap; var rc = 0; infoJSON = getStorage(STORAGE_HISCORE_INFO + _playData); if(infoJSON) { var infoObj = JSON.parse(infoJSON); hiScoreInfo = infoObj; rc = 1; } else { // no score hiScoreInfo = []; for(var i = 0; i < MAX_HISCORE_RECORD; i++) { hiScoreInfo[i] = {s:0 , n:"" , l: 0}; } } return rc; } function setHiScoreInfo() { var infoJSON = JSON.stringify(hiScoreInfo); setStorage(STORAGE_HISCORE_INFO + _playData, infoJSON); } function setLastScoreInfo(scoreInfo) { if(typeof cId == "undefined") return; scoreInfo.id = cId; var infoJSON = JSON.stringify(scoreInfo); setStorage(STORAGE_LASTSCORE+_playData, infoJSON); } function updateScoreInfo() { var addId = -1; if(_curScoreInfo.s <= 0) return addId; //don't save if scroe <= 0 for(var i = 0; i < MAX_HISCORE_RECORD; i++) { _curScoreInfo.n = ""; if(_curScoreInfo.s >= hiScoreInfo[i].s) { addId = i; hiScoreInfo.splice(i, 0, _curScoreInfo); hiScoreInfo.splice(MAX_HISCORE_RECORD, 1); setHiScoreInfo(); break; } } return addId; } function createCanvas2() { canvas2 = document.createElement('canvas'); canvas2.id = "canvas2"; canvas2.width = canvasX; canvas2.height = canvasY; //Set canvas top left position var left = ((screenX1 - canvasX)/2|0), top = ((screenY1 - canvasY)/2|0); canvas2.style.left = (left>0?left:0) + "px"; canvas2.style.top = (top>0?top:0) + "px"; canvas2.style.position = "absolute"; document.body.appendChild(canvas2); } function createScoreStage() { scoreStage = new createjs.Stage(canvas); } function removeCanvas2() { scoreStage.removeAllChildren(); scoreStage.update(); document.body.removeChild(canvas2); } function setScoreBackground() { //set background color var background = new createjs.Shape(); background.graphics.beginFill("black").drawRect(0, 0, canvas2.width, canvas2.height); scoreStage.addChild(background); } function getNameStartPos(nameLength, itemId) { var x = (3.75+(MAX_HISCORE_NAME_LENGTH-nameLength)/2)*tileWScale; var y = (itemId * 1.2 + 5) * tileHScale; return { x: x, y: y }; } function drawHiScoreList() { var title = playDataToTitleName(_playData); var localHighScore = "LOCAL HIGH SCORES"; var barTile; //title drawText((NO_OF_TILES_X-title.length)/2*tileWScale, 0*tileHScale, title, scoreStage); drawText((NO_OF_TILES_X-localHighScore.length)/2*tileWScale, 1.5*tileHScale, localHighScore, scoreStage); drawText(0.5*tileWScale, 3*tileHScale, "NO", scoreStage); drawText(7.75*tileWScale, 3*tileHScale, "NAME", scoreStage); drawText(15.75*tileWScale, 3*tileHScale, "LEVEL", scoreStage); drawText(22*tileWScale, 3*tileHScale, "SCORE", scoreStage); //bar for(var x = 0; x < NO_OF_TILES_X; x++) { barTile = getThemeBitmap("ground"); barTile.setTransform(x * tileWScale, 4.5*tileHScale , tileScale, tileScale); scoreStage.addChild(barTile); } for(var i = 0; i < MAX_HISCORE_RECORD; i++) { var pos = getNameStartPos(hiScoreInfo[i].n.length, i); drawText(0.25*tileWScale, pos.y, ("0"+(i+1)).slice(-2) + ".", scoreStage); //no if(hiScoreInfo[i].s > 0) { if(hiScoreInfo[i].n.length > 0) { drawText(pos.x, pos.y, hiScoreInfo[i].n, scoreStage, "D"); //name } drawText(16.75*tileWScale, pos.y, ("00"+hiScoreInfo[i].l).slice(-3), scoreStage); //level drawText(21*tileWScale, pos.y, ("000000"+hiScoreInfo[i].s).slice(-7), scoreStage); //score } } } function anyKeyHandler() { savedKeyDownHander = document.onkeydown; document.onkeydown = function(event) { if(!event){ event = window.event; } //if( event.keyCode == KEYCODE_ENTER) { clearTimeout(timeOutHandler); closeScoreTable(); //} }; } function restoreKeyDownHandler() { document.onkeydown = savedKeyDownHander; } function inputHiScoreName(winner) { var name, nameText; var curPos = 0; var savedKeyDownHander, hiScoreTicker; var cursor; if(winner) endingMusicPlay(); //6/15/2015, play ending music for winner initInput(); function initInput() { inputNameState = 1; curPos = playerName.length; name = playerName.split(""); //string to array; nameText = []; //text object var pos = getNameStartPos(name.length, recordId); cursor = new createjs.Sprite(textData, "FLASH"); cursor.setTransform(pos.x-tileWScale/2, pos.y , tileScale, tileScale); scoreStage.addChild(cursor); //copyPlayerName(); redrawName(); changeKeyDownHandler(); hiScoreTicker = createjs.Ticker.on("tick", scoreStage); } function changeKeyDownHandler() { savedKeyDownHander = document.onkeydown; document.onkeydown = handleHiScoreName; } function inputFinish(async) { if(winner) endingMusicStop(); //6/15/2015, stop ending music //cut tail space for(var i = name.length-1; i >= 0; i--) { if(name[i] == " ") name.splice(i,1); else break; } var nameString = name.join(""); //array to string redrawName(); //update name for score info hiScoreInfo[recordId].n = nameString; setHiScoreInfo(); setLastScoreInfo(hiScoreInfo[recordId]); //save last score if(nameString != playerName && nameString != "???") { //set and save playerName playerName = nameString; setPlayerName(nameString); } //remove cursor scoreStage.removeChild(cursor); scoreStage.update(); createjs.Ticker.off("tick", hiScoreTicker); setTimeout( function() { closeScoreTable(); }, 1500); inputNameState = 0; } function removeNameText() { for(var i = 0; i < nameText.length; i++) scoreStage.removeChild(nameText[i]); } function redrawName() { var pos = getNameStartPos(name.length, recordId); removeNameText(); nameText = drawText(pos.x, pos.y, name.join(""), scoreStage, "D"); //change cursor position if(name.length > 0) cursor.x = pos.x + curPos * tileWScale; else cursor.x = pos.x - tileWScale/2; //move cursor to top moveChild2Top(scoreStage, cursor); } function nextChar(charValue, nextMode) { if(typeof(charValue) == "undefined")charValue = " "; var code = charValue.charCodeAt(0); if(nextMode >=0) code++; else code--; if (code < 65 || code > 90) { //out of A-Z if(nextMode >=0) code = 65; else code= 90; } return String.fromCharCode(code); } function handleHiScoreName(event) { if(!event){ event = window.event; } //cross browser issues exist var code = event.keyCode; if(curPos >= MAX_HISCORE_NAME_LENGTH && code != KEYCODE_BKSPACE && code != KEYCODE_LEFT && code != KEYCODE_ENTER) { soundPlay("beep"); //wrong key code return false; } switch(true) { case (code >= 48 && code <= 57): // 0 ~ 9 if(curPos == 0) { soundPlay("beep"); break; } //first char except numbers name[curPos++] = String.fromCharCode(code); break; case (code >=65 && code <= 90): // A ~ Z case (code >= 97 && code <= 122): //a ~ z if( code > 90) code -= 32; name[curPos++] = String.fromCharCode(code); break; case (code == KEYCODE_DOT): //'.' if(curPos == 0) { soundPlay("beep"); break; } //first char except '.' name[curPos++] = "."; break; case (code == KEYCODE_DASH || code == KEYCODE_HYPHEN || code == KEYCODE_SUBTRACT): //'-' if(curPos == 0) { soundPlay("beep"); break; } //first char except '-' name[curPos++] = "-"; break; case (code == KEYCODE_SPACE): //space if(curPos == 0) { soundPlay("beep"); break; } //first char except space name[curPos++] = " "; break; case (code == KEYCODE_BKSPACE): //backspace if(curPos == 0) break; name.splice(--curPos, 1); break; case (code == KEYCODE_LEFT): //LEFT if(curPos > 0) curPos--; break; case (code == KEYCODE_RIGHT): //RIGHT if(curPos < name.length) curPos++; break; case (code == KEYCODE_UP): //UP name[curPos] = nextChar(name[curPos], 1); break; case (code == KEYCODE_DOWN): //DOWN name[curPos] = nextChar(name[curPos], -1); break; case (code == KEYCODE_ENTER): //ENTER if(vaildPlayerName(name)) { restoreKeyDownHandler(); //avoid type "ENTER" twice inputFinish(true); //async } else soundPlay("beep"); break; default: //debug(code); if(code > 32) soundPlay("beep"); //wrong key code break; } redrawName(); return false; } } } function inputPlayerName(_stage, _callbackFun) { var constString = "PLAYER NAME:" var constSize = constString.length; var maxInputSize = MAX_HISCORE_NAME_LENGTH; var borderSize = 2; var totalSizeX = constSize + maxInputSize + borderSize + 1; //+1 flash var totalSizeY = 3; var inputBoardX = (NO_OF_TILES_X - totalSizeX) / 2; var inputBoardY = (NO_OF_TILES_Y - totalSizeY) / 2; var inputStartX = inputBoardX + constSize + 1; var inputStartY = inputBoardY + 1; var background = new createjs.Shape(); var textBorder = new createjs.Shape(); var textBackground = new createjs.Shape(); background.graphics.beginFill("black").drawRect(0, 0, _stage.canvas.width, _stage.canvas.height).endFill(); background.alpha = 0.2; var x = inputBoardX*tileWScale, y = inputBoardY*tileHScale; var w = totalSizeX*tileWScale, h = totalSizeY*tileHScale; var radius = (tileWScale/4)|0; textBorder.graphics.beginFill("#f00").drawRoundRect(x, y, w, h, radius).endFill(); textBorder.alpha = 0.6; textBorder.shadow = new createjs.Shadow("#111", tileWScale/4, tileHScale/4, 10); x = (inputBoardX+0.5)*tileWScale; y = (inputBoardY+0.5)*tileHScale; w = (totalSizeX-1)*tileWScale; h = (totalSizeY-1)*tileHScale; textBackground.alpha = 0.5; textBackground.graphics.beginFill("#111").drawRoundRect(x, y, w, h, radius/2).endFill(); _stage.addChild(background, textBorder, textBackground); x = (inputBoardX+1)*tileWScale; y = (inputBoardY+1)*tileHScale; var constObj = drawText(x, y, constString, _stage, "D"); x = inputStartX*tileWScale; y = inputStartY*tileHScale; inputString(_stage, maxInputSize, x, y, playerName, inputComplete); function inputComplete(string) { setPlayerName(string); playerName = string; //remove const object for(var i = 0; i < constObj.length; i++) _stage.removeChild(constObj[i]); //remove textBackground, textBorder & background _stage.removeChild(textBackground, textBorder, background); _stage.update(); _callbackFun(); } } function vaildPlayerName(playerArray) { var len = playerArray.length; //(1)skip tail space for(var i = len-1; i >= 0; i--) { if(playerArray[i] == " ") len--; else break; } //(2) string length must > 1 and don't all same char if(len <= 1) return 0; //too short for(var i = 1; i < len; i++) { if(playerArray[0] != playerArray[i]) return 1; //OK } return 0; //all same char } function inputString(_stage, _maxSize, _startX, _startY, _defaultString, _callbackFun) { var inputText, inputObj; var curPos = 0; var savedKeyDownHander, hiScoreTicker; var cursor; initInput(); function initInput() { inputNameState = 1; curPos = _defaultString.length; // cursor start position inputText = _defaultString.split(""); //string to array inputObj = []; //text object cursor = new createjs.Sprite(textData, "FLASH"); cursor.setTransform(_startX, _startY, tileScale, tileScale); _stage.addChild(cursor); drawString(); changeKeyDownHandler(); //hiScoreTicker = createjs.Ticker.on("tick", scoreStage); } function drawString() { clearStringObj(); inputObj = drawText(_startX, _startY, inputText.join(""), _stage, "D"); //change cursor position cursor.x = _startX + curPos * tileWScale; //move cursor to top moveChild2Top(_stage, cursor); } function clearStringObj() { for(var i = 0; i < inputObj.length; i++) _stage.removeChild(inputObj[i]); } function changeKeyDownHandler() { savedKeyDownHander = document.onkeydown; document.onkeydown = handleStringInput; } function restoreKeyDownHandler() { document.onkeydown = savedKeyDownHander; } function nextChar(charValue, nextMode) { if(typeof(charValue) == "undefined") charValue = " "; var code = charValue.charCodeAt(0); if(nextMode >=0) code++; else code--; if (code < 65 || code > 90) { //out of A-Z if(nextMode >=0) code = 65; else code= 90; } return String.fromCharCode(code); } function handleStringInput(event) { if(!event){ event = window.event; } //cross browser issues exist var code = event.keyCode; if(curPos >= _maxSize && code != KEYCODE_BKSPACE && code != KEYCODE_LEFT && code != KEYCODE_ENTER) { soundPlay("beep"); //wrong key code return false; } switch(true) { case (code >= 48 && code <= 57): // 0 ~ 9 if(curPos == 0) { soundPlay("beep"); break; } //first char except numbers inputText[curPos++] = String.fromCharCode(code); break; case (code >=65 && code <= 90): // A ~ Z case (code >= 97 && code <= 122): //a ~ z if( code > 90) code -= 32; inputText[curPos++] = String.fromCharCode(code); break; case (code == KEYCODE_DOT): //'.' if(curPos == 0) { soundPlay("beep"); break; } //first char except '.' inputText[curPos++] = "."; break; case (code == KEYCODE_DASH || code == KEYCODE_HYPHEN || code == KEYCODE_SUBTRACT): //'-' if(curPos == 0) { soundPlay("beep"); break; } //first char except '-' inputText[curPos++] = "-"; break; case (code == KEYCODE_SPACE): //space if(curPos == 0) { soundPlay("beep"); break; } //first char except space inputText[curPos++] = " "; break; case (code == KEYCODE_BKSPACE): //backspace if(curPos == 0) break; inputText.splice(--curPos, 1); break; case (code == KEYCODE_LEFT): //LEFT if(curPos > 0) curPos--; break; case (code == KEYCODE_RIGHT): //RIGHT if(curPos < inputText.length) curPos++; break; case (code == KEYCODE_UP): //UP inputText[curPos] = nextChar(inputText[curPos], 1); break; case (code == KEYCODE_DOWN): //DOWN inputText[curPos] = nextChar(inputText[curPos], -1); break; case (code == KEYCODE_ENTER): //ENTER if(vaildPlayerName(inputText)) { inputFinish(); return true; } else soundPlay("beep"); break; default: //debug(code); if(code > 32) soundPlay("beep"); //wrong key code break; } drawString(); return false; } function inputFinish() { //cut tail space for(var i = inputText.length-1; i >= 0; i--) { if(inputText[i] == " ") inputText.splice(i,1); else break; } restoreKeyDownHandler(); //remove cursor clearStringObj(); _stage.removeChild(cursor); _stage.update(); _callbackFun(inputText.join("")); inputNameState = 0; } } ================================================ FILE: lodeRunner.html ================================================ Lode Runner Web Game
================================================ FILE: lodeRunner.iconClass.js ================================================ var mouseOverBGColor = "#fefef1"; //icon background color while mouse over it function mainMenuIconClass( _screenX1, _screenY1, _scale, _mainMenuBitmap) { //_scale = _scale*2/3; var border = 4 * _scale; var mainMainCanvas, stage; var menuIcon, menuBG; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _mainMenuBitmap.getBounds().width * _scale; var bitmapY = _mainMenuBitmap.getBounds().height * _scale; var self = this; var enabled = 0; init(); function init() { createCanvas(); createMenuIcon(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); menuIcon.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { menuIcon.set({alpha:0}) } else { menuIcon.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = menuIcon.on("mouseover", mouseOver); mouseOutHandler = menuIcon.on("mouseout", mouseOut); mouseClickHandler = menuIcon.on("click", mouseClick); } function disableMouseHandler() { menuIcon.removeEventListener("mouseover", mouseOverHandler); menuIcon.removeEventListener("mouseout", mouseOutHandler); menuIcon.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { mainMainCanvas = document.createElement('canvas'); mainMainCanvas.id = "main_menu"; mainMainCanvas.width = bitmapX+border*2; mainMainCanvas.height = bitmapY+border*2; var left = (_screenX1 - mainMainCanvas.width - screenBorder), top = bitmapY/2|0; mainMainCanvas.style.left = left + "px"; mainMainCanvas.style.top = top + "px"; mainMainCanvas.style.position = "absolute"; document.body.appendChild(mainMainCanvas); } function createMenuIcon() { stage = new createjs.Stage(mainMainCanvas); menuIcon = new createjs.Container(); menuBG = new createjs.Shape(); menuBG.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); menuBG.alpha = 0; menuIcon.addChild(menuBG); _mainMenuBitmap.setTransform(border, border, _scale, _scale); menuIcon.addChild(_mainMenuBitmap); menuIcon.set({alpha:0}) stage.addChild(menuIcon); stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || //// demoDataLoading || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; stage.cursor = "pointer"; menuBG.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; menuBG.alpha = 0; stage.update(); } function mouseClick() { if(gameState == GAME_PAUSE || //// demoDataLoading || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; saveState(); ////mainMenu(restoreState); gameMenu(restoreState); mouseOut(); } function saveState() { saveStateObj = saveKeyHandler(noKeyDown); gamePause(); if(playMode == PLAY_EDIT) { if(editLevelModified()) saveTestState(); stopEditTicker(); } else { stopPlayTicker(); stopAllSpriteObj(); } self.disable(); } function restoreState() { restoreKeyHandler(saveStateObj); if(playMode == PLAY_EDIT) { startEditTicker(); } else { startAllSpriteObj(); startPlayTicker(); } gameResume(); self.enable(); } } function selectIconClass( _screenX1, _screenY1, _scale, _bitmap) { var border = 4 * _scale; var selectCanvas, stage; var selectIcon, selectBG; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _bitmap.getBounds().width * _scale; var bitmapY = _bitmap.getBounds().height * _scale; var self = this; var enabled = 0; init(); function init() { createCanvas(); createSelectIcon(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); document.body.appendChild(selectCanvas); //overlay with selectCanvas, make zIndex up ? selectIcon.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { selectIcon.set({alpha:0}) } else { selectIcon.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = selectIcon.on("mouseover", mouseOver); mouseOutHandler = selectIcon.on("mouseout", mouseOut); mouseClickHandler = selectIcon.on("click", mouseClick); } function disableMouseHandler() { selectIcon.removeEventListener("mouseover", mouseOverHandler); selectIcon.removeEventListener("mouseout", mouseOutHandler); selectIcon.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { selectCanvas = document.createElement('canvas'); selectCanvas.id = "select_menu"; selectCanvas.width = bitmapX+border*2; selectCanvas.height = bitmapY+border*2; var left = (_screenX1 - selectCanvas.width - screenBorder), top = (selectCanvas.height + bitmapY)|0; selectCanvas.style.left = left + "px"; selectCanvas.style.top = top + "px"; selectCanvas.style.position = "absolute"; document.body.appendChild(selectCanvas); } function createSelectIcon() { stage = new createjs.Stage(selectCanvas); selectIcon = new createjs.Container(); selectBG = new createjs.Shape(); selectBG.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); selectBG.alpha = 0; selectIcon.addChild(selectBG); _bitmap.setTransform(border, border, _scale, _scale); selectIcon.addChild(_bitmap); selectIcon.set({alpha:0}) stage.addChild(selectIcon); stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; stage.cursor = "pointer"; selectBG.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; selectBG.alpha = 0; stage.update(); } function startSelectMenu() { saveState(); activeSelectMenu(activeSelectPlay, restoreState); mouseOut(); } function mouseClick() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; if(playMode == PLAY_EDIT && editLevelModified()) { if(editLevelModified())saveTestState(); editConfirmAbortState(startSelectMenu); } else { startSelectMenu(); } } function activeSelectPlay(level) { soundStop(soundDig); soundStop(soundFall); switch(playMode) { case PLAY_EDIT: editSelectLevel(level); break; case PLAY_DEMO: curLevel = level; setDemoInfo(); startGame(); break; case PLAY_MODERN: curLevel = level; //playMode = PLAY_MODERN; //document.onkeydown = handleKeyDown; //setLastPlayMode(); setModernInfo(); startGame(); break; default: debug("activeSelectPlay design error ! playMode = " + playMode); break; } } function saveState() { saveStateObj = saveKeyHandler(noKeyDown); gamePause(); if(playMode == PLAY_EDIT) { stopEditTicker(); } else { stopPlayTicker(); stopAllSpriteObj(); } self.disable(); } function restoreState() { restoreKeyHandler(saveStateObj); if(playMode == PLAY_EDIT) { startEditTicker(); } else { startAllSpriteObj(); startPlayTicker(); } gameResume(); self.enable(); } } function demoIconClass( _screenX1, _screenY1, _scale, _bitmap) { var border = 4 * _scale; var canvas, stage; var iconObj, bgObj; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _bitmap.getBounds().width * _scale; var bitmapY = _bitmap.getBounds().height * _scale; var self = this; var enabled = 0; init(); function init() { createCanvas(); createIconObj(); } this.enable = function () { if(!curDemoLevelIsVaild()) { self.disable(1); return; } if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); document.body.appendChild(canvas); //overlay with pasteCanvas, make zIndex up ? iconObj.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { iconObj.set({alpha:0}); } else { iconObj.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = iconObj.on("mouseover", mouseOver); mouseOutHandler = iconObj.on("mouseout", mouseOut); mouseClickHandler = iconObj.on("click", mouseClick); } function disableMouseHandler() { iconObj.removeEventListener("mouseover", mouseOverHandler); iconObj.removeEventListener("mouseout", mouseOutHandler); iconObj.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { canvas = document.createElement('canvas'); canvas.id = "theme_menu"; canvas.width = bitmapX+border*2; canvas.height = bitmapY+border*2; var left = (_screenX1 - canvas.width - screenBorder), top = (canvas.height*2 + bitmapY*3/2)|0; canvas.style.left = left + "px"; canvas.style.top = top + "px"; canvas.style.position = "absolute"; document.body.appendChild(canvas); } function createIconObj() { stage = new createjs.Stage(canvas); iconObj = new createjs.Container(); //create background shape bgObj = new createjs.Shape(); bgObj.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); bgObj.alpha = 0; //change bitmap size _bitmap.setTransform(border, border, _scale, _scale); iconObj.addChild(bgObj); iconObj.addChild(_bitmap); iconObj.set({alpha:0}) stage.addChild(iconObj); stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || (gameState != GAME_START && playMode != PLAY_DEMO && playMode != PLAY_DEMO_ONCE && playMode != PLAY_EDIT)) return; stage.cursor = "pointer"; bgObj.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; bgObj.alpha = 0; stage.update(); } function mouseClick() { if(gameState == GAME_PAUSE || playMode == PLAY_DEMO_ONCE || (gameState != GAME_START && playMode != PLAY_DEMO && playMode != PLAY_EDIT)) return; mouseOut(); demoSoundOff = 1; //always sound off when start demo playMode = PLAY_DEMO_ONCE; anyKeyStopDemo(); startGame(1); setTimeout(function() {showTipsText("HIT ANY KEY TO STOP DEMO", 3500);}, 50); } function saveState() { setThemeMode(curTheme); if(playMode == PLAY_EDIT) { if(editLevelModified()) saveTestState(); stopEditTicker(); } else { stopPlayTicker(); stopAllSpriteObj(); } } } function soundIconClass( _screenX1, _screenY1, _scale, _soundOnBitmap, _soundOffBitmap) { var border = 4 * _scale; var canvas, stage; var iconObj, bgObj; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _soundOnBitmap.getBounds().width * _scale; var bitmapY = _soundOnBitmap.getBounds().height * _scale; var self = this; var enabled = 0; function init() { createCanvas(); createIconObj(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); iconObj.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { iconObj.set({alpha:0}); } else { iconObj.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = iconObj.on("mouseover", mouseOver); mouseOutHandler = iconObj.on("mouseout", mouseOut); mouseClickHandler = iconObj.on("click", mouseClick); } function disableMouseHandler() { iconObj.removeEventListener("mouseover", mouseOverHandler); iconObj.removeEventListener("mouseout", mouseOutHandler); iconObj.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { canvas = document.createElement('canvas'); canvas.id = "theme_menu"; canvas.width = bitmapX+border*2; canvas.height = bitmapY+border*2; var left = (_screenX1 - canvas.width - screenBorder), //top = (_screenY1 - bitmapY*7)|0; top = (_screenY1 - bitmapY*8.6)|0; canvas.style.left = left + "px"; canvas.style.top = top + "px"; canvas.style.position = "absolute"; document.body.appendChild(canvas); } this.updateSoundImage = function() { iconObj.removeAllChildren(); iconObj.addChild(bgObj); if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) { if(demoSoundOff) iconObj.addChild(_soundOffBitmap); else iconObj.addChild(_soundOnBitmap); } else { if(soundOff) iconObj.addChild(_soundOffBitmap); else iconObj.addChild(_soundOnBitmap); } stage.update(); } function createIconObj() { stage = new createjs.Stage(canvas); iconObj = new createjs.Container(); //create background shape bgObj = new createjs.Shape(); bgObj.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); bgObj.alpha = 0; //change bitmap size _soundOnBitmap.setTransform(border, border, _scale, _scale); _soundOffBitmap.setTransform(border, border, _scale, _scale); iconObj.set({alpha:0}) stage.addChild(iconObj); self.updateSoundImage(); stage.update(); } function mouseOver() { if( gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING) ) return; stage.cursor = "pointer"; bgObj.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; bgObj.alpha = 0; stage.update(); } function mouseClick() { if( gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING) ) return; if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) { if((demoSoundOff ^= 1)) { soundStop(soundDig); soundStop(soundFall); } } else { if((soundOff ^= 1)) { soundStop(soundDig); soundStop(soundFall); } } resumeAudioContext(); //2021/08/25 self.updateSoundImage(); mouseOut(); } init(); } function repeatActionIconClass( _screenX1, _screenY1, _scale, _repeatActionOnBitmap, _repeatActionOffBitmap) { var border = 4 * _scale; var canvas, stage; var iconObj, bgObj; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _repeatActionOnBitmap.getBounds().width * _scale; var bitmapY = _repeatActionOnBitmap.getBounds().height * _scale; var self = this; var enabled = 0; function init() { createCanvas(); createIconObj(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); iconObj.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { iconObj.set({alpha:0}); } else { iconObj.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = iconObj.on("mouseover", mouseOver); mouseOutHandler = iconObj.on("mouseout", mouseOut); mouseClickHandler = iconObj.on("click", mouseClick); } function disableMouseHandler() { iconObj.removeEventListener("mouseover", mouseOverHandler); iconObj.removeEventListener("mouseout", mouseOutHandler); iconObj.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { canvas = document.createElement('canvas'); canvas.id = "theme_menu"; canvas.width = bitmapX+border*2; canvas.height = bitmapY+border*2; var left = (_screenX1 - canvas.width - screenBorder), top = (_screenY1 - bitmapY*6.4)|0; canvas.style.left = left + "px"; canvas.style.top = top + "px"; canvas.style.position = "absolute"; document.body.appendChild(canvas); } this.updateRepeatActionImage = function() { iconObj.removeAllChildren(); iconObj.addChild(bgObj); if(repeatAction) iconObj.addChild(_repeatActionOnBitmap); else iconObj.addChild(_repeatActionOffBitmap); stage.update(); } function createIconObj() { stage = new createjs.Stage(canvas); iconObj = new createjs.Container(); //create background shape bgObj = new createjs.Shape(); bgObj.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); bgObj.alpha = 0; //change bitmap size _repeatActionOnBitmap.setTransform(border, border, _scale, _scale); _repeatActionOffBitmap.setTransform(border, border, _scale, _scale); iconObj.set({alpha:0}) stage.addChild(iconObj); self.updateRepeatActionImage(); stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING) || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE || playMode == PLAY_EDIT) return; stage.cursor = "pointer"; bgObj.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; bgObj.alpha = 0; stage.update(); } function mouseClick() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING) || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE || playMode == PLAY_EDIT) return; toggleRepeatAction(); self.updateRepeatActionImage(); mouseOut(); } init(); } function infoIconClass( _screenX1, _screenY1, _scale, _bitmap) { var border = 4 * _scale; var canvas, stage; var iconObj, bgObj; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _bitmap.getBounds().width * _scale; var bitmapY = _bitmap.getBounds().height * _scale; var self = this; var enabled = 0; function init() { createCanvas(); createIconObj(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); iconObj.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { iconObj.set({alpha:0}); } else { iconObj.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = iconObj.on("mouseover", mouseOver); mouseOutHandler = iconObj.on("mouseout", mouseOut); mouseClickHandler = iconObj.on("click", mouseClick); } function disableMouseHandler() { iconObj.removeEventListener("mouseover", mouseOverHandler); iconObj.removeEventListener("mouseout", mouseOutHandler); iconObj.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { canvas = document.createElement('canvas'); canvas.id = "info_menu"; canvas.width = bitmapX+border*2; canvas.height = bitmapY+border*2; var left = (_screenX1 - canvas.width - screenBorder), top = (_screenY1 - bitmapY*4.8); canvas.style.left = left + "px"; canvas.style.top = top + "px"; canvas.style.position = "absolute"; document.body.appendChild(canvas); } function createIconObj() { stage = new createjs.Stage(canvas); iconObj = new createjs.Container(); //create background shape bgObj = new createjs.Shape(); bgObj.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); bgObj.alpha = 0; //change bitmap size _bitmap.setTransform(border, border, _scale, _scale); iconObj.addChild(bgObj); iconObj.addChild(_bitmap); iconObj.set({alpha:0}) stage.addChild(iconObj); stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; stage.cursor = "pointer"; bgObj.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; bgObj.alpha = 0; stage.update(); } function mouseClick() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; saveState(); infoMenu(restoreState, null); mouseOut(); } function saveState() { saveStateObj = saveKeyHandler(noKeyDown); gamePause(); if(playMode == PLAY_EDIT) { if(editLevelModified()) saveTestState(); stopEditTicker(); } else { stopPlayTicker(); stopAllSpriteObj(); } self.disable(); } function restoreState() { restoreKeyHandler(saveStateObj); if(playMode == PLAY_EDIT) { startEditTicker(); } else { startAllSpriteObj(); startPlayTicker(); } gameResume(); self.enable(); } init(); } function helpIconClass( _screenX1, _screenY1, _scale, _bitmap) { var border = 4 * _scale; var canvas, stage; var iconObj, bgObj; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _bitmap.getBounds().width * _scale; var bitmapY = _bitmap.getBounds().height * _scale; var self = this; var enabled = 0; function init() { createCanvas(); createIconObj(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); iconObj.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { iconObj.set({alpha:0}); } else { iconObj.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = iconObj.on("mouseover", mouseOver); mouseOutHandler = iconObj.on("mouseout", mouseOut); mouseClickHandler = iconObj.on("click", mouseClick); } function disableMouseHandler() { iconObj.removeEventListener("mouseover", mouseOverHandler); iconObj.removeEventListener("mouseout", mouseOutHandler); iconObj.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { canvas = document.createElement('canvas'); canvas.id = "help_menu"; canvas.width = bitmapX+border*2; canvas.height = bitmapY+border*2; var left = (_screenX1 - canvas.width - screenBorder), top = (_screenY1 - bitmapY*3.2); canvas.style.left = left + "px"; canvas.style.top = top + "px"; canvas.style.position = "absolute"; document.body.appendChild(canvas); } function createIconObj() { stage = new createjs.Stage(canvas); iconObj = new createjs.Container(); //create background shape bgObj = new createjs.Shape(); bgObj.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); bgObj.alpha = 0; //change bitmap size _bitmap.setTransform(border, border, _scale, _scale); iconObj.addChild(bgObj); iconObj.addChild(_bitmap); iconObj.set({alpha:0}) stage.addChild(iconObj); stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; stage.cursor = "pointer"; bgObj.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; bgObj.alpha = 0; stage.update(); } function mouseClick() { if(gameState == GAME_PAUSE || (gameState != GAME_START && gameState != GAME_RUNNING && playMode != PLAY_EDIT)) return; saveState(); helpMenu(restoreState); mouseOut(); } function saveState() { saveStateObj = saveKeyHandler(noKeyDown); gamePause(); if(playMode == PLAY_EDIT) { if(editLevelModified()) saveTestState(); stopEditTicker(); } else { stopPlayTicker(); stopAllSpriteObj(); } self.disable(); } function restoreState() { restoreKeyHandler(saveStateObj); if(playMode == PLAY_EDIT) { startEditTicker(); } else { startAllSpriteObj(); startPlayTicker(); } gameResume(); self.enable(); } init(); } function themeIconClass( _screenX1, _screenY1, _scale, _themeBitmapApple2, _themeBitmapC64) { var border = 4 * _scale; var themeCanvas, stage; var themeIcon, themeBG; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _themeBitmapApple2.getBounds().width * _scale; var bitmapY = _themeBitmapApple2.getBounds().height * _scale; var self = this; var enabled = 0; var outColor = backgroundColor; init(); function init() { createCanvas(); createThemeIcon(); } this.enable = function () { if(enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); themeIcon.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function (hidden) { disableMouseHandler(); if(hidden) { themeIcon.set({alpha:0}); } else { themeIcon.set({alpha:1}) } stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = themeIcon.on("mouseover", mouseOver); mouseOutHandler = themeIcon.on("mouseout", mouseOut); mouseClickHandler = themeIcon.on("click", mouseClick); } function disableMouseHandler() { themeIcon.removeEventListener("mouseover", mouseOverHandler); themeIcon.removeEventListener("mouseout", mouseOutHandler); themeIcon.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { themeCanvas = document.createElement('canvas'); themeCanvas.id = "theme_menu"; themeCanvas.width = bitmapX+border*2; themeCanvas.height = bitmapY+border*2; var left = (_screenX1 - themeCanvas.width - screenBorder), top = (_screenY1 - bitmapY*1.5); themeCanvas.style.left = left + "px"; themeCanvas.style.top = top + "px"; themeCanvas.style.position = "absolute"; document.body.appendChild(themeCanvas); } function createThemeIcon() { stage = new createjs.Stage(themeCanvas); themeIcon = new createjs.Container(); //create background shape themeBG = new createjs.Shape(); themeBG.graphics.beginFill(outColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); //themeBG.alpha = 0; //change bitmap size _themeBitmapApple2.setTransform(border, border, _scale, _scale); _themeBitmapC64.setTransform(border, border, _scale, _scale); themeIcon.set({alpha:0}) stage.addChild(themeIcon); updateThemeImage(0); } function updateThemeImage(showTips) { themeIcon.removeAllChildren(); themeIcon.addChild(themeBG); if(curTheme == THEME_APPLE2) { themeIcon.addChild(_themeBitmapApple2); //if(showTips) setTimeout(function() {showTipsText("APPLE-II THEME MODE", 2500);}, 50); } else { themeIcon.addChild(_themeBitmapC64); //if(showTips) setTimeout(function() {showTipsText("C64 THEME MODE", 2500);}, 50); } stage.update(); } function mouseOver() { if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; stage.cursor = "pointer"; stage.update(); } function mouseOut() { stage.cursor = "default"; stage.update(); } function mouseClick() { if(gameState == GAME_PAUSE || (gameState == GAME_WAITING && playMode != PLAY_EDIT)) return; curTheme = (curTheme == THEME_APPLE2?THEME_C64:THEME_APPLE2); saveState(); soundStop(soundDig); soundStop(soundFall); themeDataReset(1); updateThemeImage(1); themeColorIconUpdate(); if(playMode == PLAY_EDIT) { startEditMode(); } else { changeThemeScreen(); //real time change theme screen } } function saveState() { setThemeMode(curTheme); if(playMode == PLAY_EDIT) { if(editLevelModified()) saveTestState(); stopEditTicker(); } } } function themeColorIconUpdate() { themeColorObj.themeChange(); } // For EDIT mode function pasteIconClass( _screenX1, _screenY1, _scale, _bitmap) { var border = 4 * _scale; var canvas, stage; var iconObj, bgObj; var saveStateObj; var mouseOverHandler = null, mouseOutHandler = null, mouseClickHandler = null; var bitmapX = _bitmap.getBounds().width * _scale; var bitmapY = _bitmap.getBounds().height * _scale; var self = this; var enabled = 0; init(); function init() { createCanvas(); createIconObj(); } this.enable = function () { if (enabled) return; enabled = 1; disableMouseHandler(); enableMouseHandler(); document.body.appendChild(canvas); //overlay with demoCanvas, make zIndex up ? iconObj.set({alpha:1}) stage.enableMouseOver(60); stage.update(); } this.disable = function () { if (!enabled) return; disableMouseHandler(); iconObj.set({alpha:0}); stage.update(); enabled = 0; stage.enableMouseOver(0); } function enableMouseHandler() { mouseOverHandler = iconObj.on("mouseover", mouseOver); mouseOutHandler = iconObj.on("mouseout", mouseOut); mouseClickHandler = iconObj.on("click", mouseClick); } function disableMouseHandler() { iconObj.removeEventListener("mouseover", mouseOverHandler); iconObj.removeEventListener("mouseout", mouseOutHandler); iconObj.removeEventListener("click", mouseClickHandler); stage.cursor = "default"; stage.update(); } function createCanvas() { canvas = document.createElement('canvas'); canvas.id = "paste_icon"; canvas.width = bitmapX+border*2; canvas.height = bitmapY+border*2; var left = (_screenX1 - canvas.width - screenBorder), top = (canvas.height*2 + bitmapY*3/2)|0; canvas.style.left = left + "px"; canvas.style.top = top + "px"; canvas.style.position = "absolute"; document.body.appendChild(canvas); } function createIconObj() { stage = new createjs.Stage(canvas); iconObj = new createjs.Container(); //create mouseOver shape bgObj = new createjs.Shape(); bgObj.graphics.beginFill(mouseOverBGColor) .drawRect(0, 0, bitmapX+border*2, bitmapY+border*2).endFill(); bgObj.alpha = 0; //change bitmap size _bitmap.setTransform(border, border, _scale, _scale); iconObj.addChild(bgObj); iconObj.addChild(_bitmap); iconObj.set({alpha:0}) stage.addChild(iconObj); stage.update(); } function mouseOver() { if(playMode != PLAY_EDIT) return; stage.cursor = "pointer"; bgObj.alpha = 1; stage.update(); } function mouseOut() { stage.cursor = "default"; bgObj.alpha = 0; stage.update(); } function mouseClick() { if(playMode != PLAY_EDIT) return; mouseOut(); editPasteMap(); } } //====================================== // BEGIN: Change Theme Screen real time //====================================== function changeThemeScreen() { rebuildMap(); //Change runner theme runner.sprite.spriteSheet = runnerData; //change guard theme for(var i = 0; i < guardCount; i++) { if(redhatMode && guard[i].hasGold > 0) guard[i].sprite.spriteSheet = redhatData; else guard[i].sprite.spriteSheet = guardData; } //change holeObj theme holeObj.sprite.spriteSheet = holeData; //change fillHoleObj theme for(var i = 0; i < fillHoleObj.length; i++) { fillHoleObj[i].spriteSheet = holeData; } moveSprite2Top(); clearGround(); clearInfo(); initInfoVariable(); buildGroundInfo(); } function rebuildMap() { var curTile; for(var x = 0; x < NO_OF_TILES_X; x++) { for(var y = 0; y < NO_OF_TILES_Y; y++) { switch(map[x][y].base) { default: case EMPTY_T: //empty continue; case BLOCK_T: //Normal Brick curTile = getThemeBitmap("brick"); if(map[x][y].bitmap.alpha < 1) curTile.set({alpha:0}); //hide brick digging break; case SOLID_T: //Solid Brick curTile = getThemeBitmap("solid"); break; case LADDR_T: //Ladder curTile = getThemeBitmap("ladder"); break; case BAR_T: //Line of rope curTile = getThemeBitmap("rope"); break; case TRAP_T: //False brick curTile = getThemeBitmap("brick"); if(map[x][y].bitmap.alpha < 1) curTile.set({alpha:0.5}); //show trap tile break; case HLADR_T: //Ladder appears at end of level curTile = getThemeBitmap("ladder"); curTile.set({alpha:0}); //hide the laddr break; case GOLD_T: //Gold curTile = getThemeBitmap("gold"); break; } mainStage.removeChild(map[x][y].bitmap); //remove old curTile.setTransform(x * tileWScale, y * tileHScale, tileScale, tileScale); //x,y, scaleX, scaleY mainStage.addChild(curTile); //add new map[x][y].bitmap = curTile; //replace bitmap } } } function clearGround() { for(var i = 0; i < groundTile.length; i++) mainStage.removeChild(groundTile[i]); } function clearInfo() { var i; if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) { for(i = 0; i < scoreTxt.length; i++) mainStage.removeChild(scoreTxt[i]); for(i = 0; i < scoreTile.length; i++) mainStage.removeChild(scoreTile[i]); if(playMode == PLAY_DEMO) { for(i = 0; i < demoTxt.length; i++) mainStage.removeChild(demoTxt[i]); } else { for(i = 0; i < lifeTxt.length; i++) mainStage.removeChild(lifeTxt[i]); for(i = 0; i < lifeTile.length; i++) mainStage.removeChild(lifeTile[i]); } } else { //PLAY_MODERN, PLAY_DEMO_ONCE for(i = 0; i < goldTxt.length; i++) mainStage.removeChild(goldTxt[i]); for(i = 0; i < goldTile.length; i++) mainStage.removeChild(goldTile[i]); for(i = 0; i < guardTxt.length; i++) mainStage.removeChild(guardTxt[i]); for(i = 0; i < guardTile.length; i++) mainStage.removeChild(guardTile[i]); for(i = 0; i < timeTxt.length; i++) mainStage.removeChild(timeTxt[i]); for(i = 0; i < timeTile.length; i++) mainStage.removeChild(timeTile[i]); } for(i = 0; i < levelTxt.length; i++) mainStage.removeChild(levelTxt[i]); for(i = 0; i < levelTile.length; i++) mainStage.removeChild(levelTile[i]); } //====================================== // END: Change Theme Screen real time //====================================== ================================================ FILE: lodeRunner.info.js ================================================ var classicInfo = [ {type: 'TITLE', contain: " Classic Lode Runner " }, {type: 'TEXT' , contain: "Release year : 1983, 1984"}, {type: 'TEXT' , contain: "Platform : APPLE-II, Commodore 64, IBM PC, NES ..."}, {type: 'TEXT' , contain: "Publisher : Br\u00F8derbund & Ariolasoft" }, //Brøderbund {type: 'TEXT' , contain: "Developer : Douglas E. Smith" }, {type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605" } //★ ★ ★ ]; //ref: http://www.gb64.com/game.php?id=5906&d=42 var proInfo = [ {type: 'TITLE', contain: " Professional Lode Runner " }, {type: 'TEXT' , contain: "Release year : 1984, 1985"}, {type: 'TEXT' , contain: "Platform : Commodore 64"}, {type: 'TEXT' , contain: "Publisher : DodoSoft & AlphaSoft" }, {type: 'TEXT' , contain: "Developer : Unknown" }, {type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★ ]; //ref:http://www.vizzed.com/play/revenge-of-lode-runner-appleii-online-apple-ii-6223-game var revengeInfo = [ {type: 'TITLE', contain: " Revenge of Lode Runner " }, {type: 'TEXT' , contain: "Release year : 1985, 1986"}, {type: 'TEXT' , contain: "Platform : APPLE-II"}, {type: 'TEXT' , contain: "Publisher : Br\u00F8derbund" }, //Brøderbund {type: 'TEXT' , contain: "Developer : Mad Man" }, {type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★ ]; var fanBookInfo = [ {type: 'TITLE', contain: " Lode Runner Fan Book " }, {type: 'TEXT' , contain: 'From : "Apple Lode Runner - The Remake 1.0h"'}, {type: 'TEXT' , contain: "Platform : Microsoft Windows"}, {type: 'TEXT' , contain: "Publisher : Spoonbill Software" }, {type: 'TEXT' , contain: 'Developer : Custom levels'}, {type: 'TEXT_LINK' , text: "URL : ", textLink: "http://www.spoonbillsoftware.com.au/loderunner.htm", url: "http://www.spoonbillsoftware.com.au/loderunner.htm" }, {type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★ ★ ]; var championInfo = [ {type: 'TITLE', contain: " Championship Lode Runner " }, {type: 'TEXT' , contain: "Release year : 1984, 1985"}, {type: 'TEXT' , contain: "Platform : APPLE-II, Commodore 64, NES ..."}, {type: 'TEXT' , contain: "Publisher : Br\u00F8derbund & Hudson Soft" }, //Brøderbund {type: 'TEXT' , contain: "Developer : Douglas E. Smith" }, {type: 'TEXT' , contain: "Difficulty : \u2605 \u2605 \u2605 \u2605 \u2605" } //★ ★ ★ ★ ★ ]; //========================================================================================= var editInfo = [ {type: 'TITLE', contain: "Edit Custom Level"}, {type: 'TEXT' , contain: "NEW : New or clear editing level"}, {type: 'TEXT' , contain: "LOAD : Load exists level for customization"}, {type: 'TEXT' , contain: "TEST : Test editing level" }, {type: 'TEXT' , contain: "SAVE : Save current level" } ]; var testInfo = [ {type: 'TITLE', contain: "Test Custom Level"}, {type: 'TEXT' , contain: "If test success, players can save it. "} ]; var customInfo = [ {type: 'TITLE', contain: "Custom Levels"}, {type: 'TEXT' , contain: "Players can create new levels or edit exists levels."} ]; var demoHelp = [ {type: 'TITLE', contain: " Demo Mode "}, {type: 'TEXT' , contain: " Demo data collected from players," }, {type: 'TEXT' , contain: " Only demo the fastest passed levels or" }, {type: 'TEXT' , contain: "Recently passed levels of current player." } ]; function createDemoInfo() { var titleName = playDataToTitleName(playData); var player = playerDemoData[curLevel-1].player; if(player == "") player = "Unknown"; var demoInfo = [ {type: 'TITLE', contain: " " + playDataToTitleName(playData)+ " " }, {type: 'TEXT' , contain: "Demo level : " + curLevel}, {type: 'TEXT' , contain: "Player : " + player }, {type: 'TEXT_flagID_MSG' , text: "Location : ", flagId: playerDemoData[curLevel-1].cId.toLowerCase(), msg: " " + playerDemoData[curLevel-1].location }, {type: 'TEXT' , contain: "Date : " + playerDemoData[curLevel-1].date+ " (" + playerDemoData[curLevel-1].ai+")" } ]; return demoInfo; } function infoMenu(callbackFun, args) { var infoMsg = null; switch(playMode) { case PLAY_CLASSIC: case PLAY_MODERN: if(playData == PLAY_DATA_USERDEF) { infoMsg = customInfo; } else { infoMsg = getPlayVerInfo(playData); } break; case PLAY_DEMO: case PLAY_DEMO_ONCE: infoMsg = createDemoInfo(); break; case PLAY_EDIT: infoMsg = editInfo; break; case PLAY_TEST: infoMsg = testInfo; break; } if(infoMsg) infoObj.showInfo(infoMsg, callbackFun, args); else { if(callbackFun) callbackFun(args); error("Error: playMode = " + playMode); } } function infoMenuClass(_stage, _scale) { var coverBackground, closeIcon; var infoBorder, infoBackground; var infoObj = []; var INFO_BORDER_SIZE = 24 * _scale; var INFO_BORDER_HALF = INFO_BORDER_SIZE / 2; var TITLE_TEXT_SIZE = 40 * _scale; var TITLE_TEXT_COLOR = "white"; var TITLE_TEXT_SHADOW_COLOR = "#FF0"; var ITEM_TEXT_SIZE = 32 * _scale; var ITEM_TEXT_COLOR = "yellow"; var FLAG_SCALE = _scale * 5/4; var FLAG_MSG_SIZE = 28 * _scale; var FLAG_MSG_COLOR = "white"; var TOP_BORDER_SIZE = TITLE_TEXT_SIZE/2 | 0; var BOTTOM_BORDER_SIZE = ITEM_TEXT_SIZE/ 2 | 0; var BORDER_WIDTH = ITEM_TEXT_SIZE; var CLOSE_BOX_SIZE = 12 * _scale + 2; var menuX, menuY, startX, startY; var callBackFun, callBackArgs; var saveStateObj; this.showInfo = function(info, callback, args) { if(typeof args == "undefined") args = null; callBackFun = callback; callBackArgs = args; closeIcon = null; initInfo(info); drawBackground(); drawInfoBackground(); drawInfo(); drawCloseIcon(0); _stage.update(); saveStateObj = saveKeyHandler(InfoKeyDown); } function initInfo(infoList) { var textLength; var maxTextWidth =0; infoObj = []; menuX = menuY = 0; for(var i = 0; i < infoList.length; i++) { switch( infoList[i].type) { case 'TITLE': infoObj[i] = {}; infoObj[i].type = 'TITLE'; infoObj[i].text = new createjs.Text(infoList[i].contain, "bold " + TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR); infoObj[i].text.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 1, 1, 1 ); infoObj[i].width = infoObj[i].text.getBounds().width; infoObj[i].height = infoObj[i].text.getBounds().height; menuY += (infoObj[i].height * 3/2|0); break; case 'TEXT': infoObj[i] = {}; infoObj[i].type = 'TEXT'; infoObj[i].text = new createjs.Text(infoList[i].contain, "bold " + ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); infoObj[i].width = infoObj[i].text.getBounds().width; infoObj[i].height = infoObj[i].text.getBounds().height; menuY += (infoObj[i].height * 3/2|0); break; case 'TEXT_flagID_MSG': infoObj[i] = {}; infoObj[i].type = 'TEXT_flagID_MSG'; infoObj[i].text = new createjs.Text(infoList[i].text, "bold " + ITEM_TEXT_SIZE + "px Helvetica", ITEM_TEXT_COLOR); infoObj[i].textWidth = infoObj[i].text.getBounds().width; infoObj[i].textHeight = infoObj[i].text.getBounds().height; if(infoList[i].flagId in countryId) { infoObj[i].flag = new createjs.Sprite(countryFlagData, infoList[i].flagId); } else { infoObj[i].flag = new createjs.Sprite(countryFlagData, "unknown"); } infoObj[i].flag.setTransform(0, 0, FLAG_SCALE, FLAG_SCALE); infoObj[i].flagWidth = infoObj[i].flag.getTransformedBounds().width; infoObj[i].flagHeight = infoObj[i].flag.getTransformedBounds().height; infoObj[i].msg = new createjs.Text(infoList[i].msg, "bold " + FLAG_MSG_SIZE + "px Helvetica", FLAG_MSG_COLOR); infoObj[i].msg.set({alpha:0}); infoObj[i].msgWidth = infoObj[i].msg.getBounds().width; infoObj[i].msgHeight = infoObj[i].msg.getBounds().height; infoObj[i].flag.msgObj = infoObj[i].msg; infoObj[i].flag.on('mouseover',function(evt) { this.msgObj.set({alpha:1}); _stage.update(); }); infoObj[i].flag.on('mouseout', function(evt){ this.msgObj.set({alpha:0}); _stage.update(); }); infoObj[i].width = infoObj[i].textWidth + infoObj[i].flagWidth + infoObj[i].msgWidth; menuY += (infoObj[i].textHeight * 3/2|0); break; case 'TEXT_LINK': infoObj[i] = {}; infoObj[i].type = 'TEXT_LINK'; infoObj[i].text = new createjs.Text(infoList[i].text, "bold " + ITEM_TEXT_SIZE + "px Helvetica", ITEM_TEXT_COLOR); infoObj[i].textWidth = infoObj[i].text.getBounds().width; infoObj[i].textHeight = infoObj[i].text.getBounds().height; infoObj[i].textLink = new createjs.Text(infoList[i].textLink, "bold " + ITEM_TEXT_SIZE + "px Helvetica", ITEM_TEXT_COLOR); infoObj[i].texLinktWidth = infoObj[i].textLink.getBounds().width; infoObj[i].texLinktHeight = infoObj[i].textLink.getBounds().height; infoObj[i].textLink.url = infoList[i].url; infoObj[i].textLink.on('mouseover',function(evt) { _stage.cursor = "pointer"; _stage.update(); }); infoObj[i].textLink.on('mouseout', function(evt){ _stage.cursor = "default"; _stage.update(); }); infoObj[i].textLink.on('click', function(evt){ window.open(this.url).focus(); _stage.cursor = "default"; _stage.update(); }); infoObj[i].width = infoObj[i].textWidth + infoObj[i].texLinktWidth; menuY += (infoObj[i].textHeight * 3/2|0); break; default: error("Error: type don't support, type = " + infoList[i].type); continue; } if(maxTextWidth < infoObj[i].width) maxTextWidth = infoObj[i].width; } menuX = maxTextWidth + BORDER_WIDTH * 2; menuY += (TOP_BORDER_SIZE + BOTTOM_BORDER_SIZE); startX = (_stage.canvas.width-menuX)/2|0; startY = (_stage.canvas.height-menuY)/2|0; if(startX < 0) startX = 0; if(startY < 0) startY = 0; } function drawBackground() { coverBackground = new createjs.Shape(); coverBackground.graphics.beginFill("black").drawRect(0, 0, _stage.canvas.width, _stage.canvas.height).endFill(); coverBackground.alpha = 0.3; _stage.addChild(coverBackground); } function removeBackground() { _stage.removeChild(coverBackground); } function drawInfoBackground() { infoBorder = new createjs.Shape(); infoBackground = new createjs.Shape(); infoBorder.alpha = 0.8; infoBorder.graphics.beginFill("#FF0") .drawRoundRect(startX-INFO_BORDER_HALF, startY-INFO_BORDER_HALF, menuX+INFO_BORDER_SIZE, menuY+INFO_BORDER_SIZE, INFO_BORDER_HALF).endFill(); infoBackground.alpha = 0.6; infoBackground.graphics.beginFill("#190218") .drawRoundRect(startX, startY, menuX, menuY, INFO_BORDER_HALF/2).endFill(); _stage.addChild(infoBorder); _stage.addChild(infoBackground); } function removeInfoBackground() { _stage.removeChild(infoBackground); _stage.removeChild(infoBorder); } function drawInfo() { var tmpY = startY; for(var i = 0; i < infoObj.length; i++) { switch( infoObj[i].type) { case 'TITLE': tmpY += (infoObj[i].height/2|0); infoObj[i].text.x = startX + (menuX - infoObj[i].width)/2|0; infoObj[i].text.y = tmpY; tmpY += infoObj[i].height *3/2|0; _stage.addChild(infoObj[i].text); break; case 'TEXT': infoObj[i].text.x = startX + BORDER_WIDTH; infoObj[i].text.y = tmpY; tmpY += infoObj[i].height *3/2|0; _stage.addChild(infoObj[i].text); break; case 'TEXT_flagID_MSG': infoObj[i].text.x = startX + BORDER_WIDTH; infoObj[i].text.y = tmpY; infoObj[i].flag.x = startX + BORDER_WIDTH + infoObj[i].textWidth; infoObj[i].flag.y = tmpY+ (infoObj[i].textHeight - infoObj[i].flagHeight)/3; infoObj[i].msg.x = startX + BORDER_WIDTH + infoObj[i].textWidth + infoObj[i].flagWidth; infoObj[i].msg.y = tmpY+ (infoObj[i].textHeight - infoObj[i].msgHeight); tmpY += infoObj[i].textHeight *3/2|0; _stage.addChild(infoObj[i].text); _stage.addChild(infoObj[i].flag); _stage.addChild(infoObj[i].msg); break; case 'TEXT_LINK': infoObj[i].text.x = startX + BORDER_WIDTH; infoObj[i].text.y = tmpY; infoObj[i].textLink.x = startX + BORDER_WIDTH + infoObj[i].textWidth; infoObj[i].textLink.y = tmpY; tmpY += infoObj[i].textHeight *3/2|0; _stage.addChild(infoObj[i].text); _stage.addChild(infoObj[i].textLink); break; default: error("Error: type don't support, type = " + infoObj[i].type); continue; } } } function removeInfo() { for(var i = 0; i < infoObj.length; i++) { switch(infoObj[i].type) { case 'TITLE': case 'TEXT': _stage.removeChild(infoObj[i].text); break; case 'TEXT_flagID_MSG': _stage.removeChild(infoObj[i].text); _stage.removeChild(infoObj[i].flag); break; case 'TEXT_LINK': _stage.removeChild(infoObj[i].text); _stage.removeChild(infoObj[i].textLink); break; default: error("Error: type don't support, type = " + infoObj[i].type); continue; } } } function InfoKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.keyCode == KEYCODE_ESC) { closeInfoMenu(); } return false; } function drawCloseIcon(mouseOver) { var cycle, cross; var alpha, cycColor, crosColor; if(closeIcon == null) { closeIcon = new createjs.Container(); cross = new createjs.Shape(); cycle = new createjs.Shape(); closeIcon.addChild(cycle, cross); closeIcon.on("mouseover", handleMouseOver); closeIcon.on("mouseout", handleMouseOut); closeIcon.on("click", closeInfoMenu); closeIcon.x = startX+menuX - CLOSE_BOX_SIZE*3; closeIcon.y = startY + CLOSE_BOX_SIZE*2; _stage.enableMouseOver(30); _stage.addChild(closeIcon); } else { cycle = closeIcon.getChildAt(0); cross = closeIcon.getChildAt(1); } if(mouseOver) { alpha = 0.6; cycColor = "red"; crosColor = "white"; } else { alpha = 0.01; cycColor = "gold"; crosColor = "white"; } var g = cycle.graphics; g.clear(); cycle.alpha = alpha; g.beginFill(cycColor).dc(CLOSE_BOX_SIZE/2, CLOSE_BOX_SIZE/2, CLOSE_BOX_SIZE*5/4); g = cross.graphics; g.clear(); //cross.alpha = 1; g.setStrokeStyle(CLOSE_BOX_SIZE/4).beginStroke(crosColor).moveTo(0,0) .lineTo(CLOSE_BOX_SIZE,CLOSE_BOX_SIZE).closePath(); g.moveTo(CLOSE_BOX_SIZE,0).lineTo(0,CLOSE_BOX_SIZE).closePath(); _stage.update(); } function removeCloseIcon() { _stage.removeChild(closeIcon); } function handleMouseOver(event) { _stage.cursor = 'pointer'; drawCloseIcon(1); } function handleMouseOut(event) { _stage.cursor = 'default'; drawCloseIcon(0); } function closeInfoMenu() { removeCloseIcon(); removeInfo(); removeInfoBackground(); removeBackground(); _stage.cursor = 'default'; _stage.update(); _stage.enableMouseOver(0); restoreKeyHandler(saveStateObj); //add setTimeout just don't cause mouse event (click) cascade! if(callBackFun) setTimeout(function() { callBackFun(callBackArgs);}, 10); } } ================================================ FILE: lodeRunner.key.js ================================================ var keyAction = ACT_STOP; //// keyLastLeftRight = ACT_RIGHT; var shiftLevelNum = 0; var runnerDebug = 0; function pressShiftKey(code) { /* cheat key code disable 5/16/2015 switch(code) { case KEYCODE_PERIOD: //SHIFT-. = '>', change to next level shiftLevelNum = 1; gameState = GAME_NEXT_LEVEL; break; case KEYCODE_COMMA: //SHIFT-, = '<', change to previous level shiftLevelNum = 1; gameState = GAME_PREV_LEVEL; break; case KEYCODE_UP: //SHIFT-UP, inc runner if(playMode == PLAY_CLASSIC && runnerLife < 10) { //bug fixed: add check playMode, 12/15/2014 runnerLife++; drawLife(); } break; case KEYCODE_X: //SHIFT-X toggleTrapTile(); break; case KEYCODE_G: //SHIFT-G, toggle god mode toggleGodMode(); break; default: if(runnerDebug) debugKeyPress(code); break; } */ } function pressCtrlKey(code) { switch(code) { case KEYCODE_A: //CTRL-A : abort level gameState = GAME_RUNNER_DEAD; break; case KEYCODE_C: //CTRL-C : copy current level copyLevelMap = levelData[curLevel-1]; copyLevelPassed = 1; //means copy from exists level showTipsText("COPY MAP", 1500); break; case KEYCODE_J: //CTRL-J : gamepad toggle toggleGamepadMode(1); //if(gamepadIconObj) gamepadIconObj.updateGamepadImage(); break; case KEYCODE_K: //CTRL-K : repeat actions On/Off toggleRepeatAction(); repeatActionIconObj.updateRepeatActionImage(); break; case KEYCODE_R: //CTRL-R : abort game runnerLife = 1; gameState = GAME_RUNNER_DEAD; break; case KEYCODE_X: //CTRL-X toggleTrapTile(); break; // case KEYCODE_Z: //CTRL-Z, toggle god mode // toggleGodMode(); // break; case KEYCODE_S: //CTRL-S, toggle sound if( (soundOff ^= 1) == 1) { soundStop(soundDig); soundStop(soundFall); showTipsText("SOUND OFF", 1500); } else { showTipsText("SOUND ON", 1500); } soundIconObj.updateSoundImage(); //toggle sound On/Off icon break; case KEYCODE_LEFT: //SHIFT + <- : speed down setSpeed(-1); break; case KEYCODE_RIGHT: //SHIFT + -> : speed up setSpeed(1); break; case KEYCODE_H: //CTRL-H : redHat mode on/off toggleRedhatMode(); break; case KEYCODE_1: //CTRL-1 case KEYCODE_2: //CTRL-2 case KEYCODE_3: //CTRL-3 case KEYCODE_4: //CTRL-4 case KEYCODE_5: //CTRL-5 themeColorChange(code - KEYCODE_1); break; } } function debugKeyPress(code) { switch(code) { case KEYCODE_1: //SHIFT-1 , add 5 level shiftLevelNum = 5; gameState = GAME_NEXT_LEVEL; break; case KEYCODE_2: //SHIFT-2 , add 10 level shiftLevelNum = 10; gameState = GAME_NEXT_LEVEL; break; case KEYCODE_3: //SHIFT-3 , add 20 level shiftLevelNum = 20; gameState = GAME_NEXT_LEVEL; break; case KEYCODE_4: //SHIFT-4 , add 50 level shiftLevelNum = 50; gameState = GAME_NEXT_LEVEL; break; case KEYCODE_6: //SHIFT-6 , dec 5 level shiftLevelNum = 5; gameState = GAME_PREV_LEVEL; break; case KEYCODE_7: //SHIFT-7 , dec 10 level shiftLevelNum = 10; gameState = GAME_PREV_LEVEL; break; case KEYCODE_8: //SHIFT-8 , dec 20 level shiftLevelNum = 20; gameState = GAME_PREV_LEVEL; break; case KEYCODE_9: //SHIFT-9 , dec 50 level shiftLevelNum = 50; gameState = GAME_PREV_LEVEL; break; } } var repeatAction = 0; //1: keyboard repeat on, 0: keyboard repeat Off var repeatActionPressed = 0; var gamepadMode = 1; //0: disable, 1: enable var redhatMode = 1; var godMode = 0, godModeKeyPressed = 0; function initHotKeyVariable() { godMode = 0; godModeKeyPressed = 0; repeatActionPressed = 0; } function toggleRepeatAction() { if( (repeatAction ^= 1) == 1) { showTipsText("REPEAT ACTIONS ON", 2500); } else { showTipsText("REPEAT ACTIONS OFF", 2500); } if(gameState != GAME_START) repeatActionPressed=1; //player change the "repeatAction" Mode at running setRepeatAction(); } function toggleGamepadMode(textMsg) { if(!gamepadSupport()) { if(textMsg) showTipsText("GAMEPAD NOT SUPPORTED", 2500); gamepadMode = 0; } else { if( (gamepadMode ^= 1) == 1) { gamepadEnable(); if(textMsg) showTipsText("GAMEPAD ON", 2500); } else { gamepadDisable(); if(textMsg) showTipsText("GAMEPAD OFF", 2500); } } setGamepadMode(); } function toggleRedhatMode() { if( (redhatMode ^= 1) == 1 ) { //enable for(var i = 0; i < guardCount; i++) { if(guard[i].hasGold > 0) guard[i].sprite.spriteSheet = redhatData; else guard[i].sprite.spriteSheet = guardData; } showTipsText("REDHAT MODE ON", 1500); } else { //disable for(var i = 0; i < guardCount; i++) { guard[i].sprite.spriteSheet = guardData; } showTipsText("REDHAT MODE OFF", 1500); } } function toggleGodMode() { godModeKeyPressed = 1; //means player press the god-mod hot-key sometimePlayInGodMode = 1; // 12/23/2014 godMode ^= 1; if(godMode) { showTipsText("GOD MODE ON", 1500); } else { showTipsText("GOD MODE OFF", 1500); } } function setSpeed(v) { speed += v; if(speed < 0) speed = 0; if(speed >= speedMode.length) speed = speedMode.length-1; createjs.Ticker.setFPS(speedMode[speed]); showTipsText(speedText[speed], 1500); } function helpCallBack() //help complete call back { pressKey(KEYCODE_ESC); } function pressKey(code) { switch(code) { case KEYCODE_LEFT: case KEYCODE_J: case KEYCODE_A: keyAction = ACT_LEFT; break; case KEYCODE_RIGHT: case KEYCODE_L: case KEYCODE_D: keyAction = ACT_RIGHT; break; case KEYCODE_UP: case KEYCODE_I: case KEYCODE_W: keyAction = ACT_UP; break; case KEYCODE_DOWN: case KEYCODE_K: case KEYCODE_S: keyAction = ACT_DOWN; break; case KEYCODE_Z: case KEYCODE_Y: //Y key to dig left, for German keyboards case KEYCODE_U: case KEYCODE_Q: case KEYCODE_COMMA: //, keyAction = ACT_DIG_LEFT; break; case KEYCODE_X: case KEYCODE_O: case KEYCODE_E: case KEYCODE_PERIOD: //. keyAction = ACT_DIG_RIGHT; break; case KEYCODE_ESC: //help & pause if(gameState == GAME_PAUSE) { gameResume(); showTipsText("", 1000); //clear text } else { gamePause(); showTipsText("PAUSE", 0); //display "PAUSE" //helpObj.showHelp(helpCallBack); } break; case KEYCODE_ENTER: //display hi-score if(playMode == PLAY_CLASSIC) { menuIconDisable(1); gamePause(); showScoreTable(playData, null, function() { menuIconEnable(); gameResume();}); return; //don't record this key code ! } else { keyAction = ACT_UNKNOWN; } break; default: keyAction = ACT_UNKNOWN; //debug("keycode = " + code); break; } if(recordMode && code != KEYCODE_ESC) saveKeyCode(code, keyAction); } function gameResume() { gameState = lastGameState; soundResume(soundFall); soundResume(soundDig); } function gamePause() { lastGameState = gameState; gameState = GAME_PAUSE; soundPause(soundFall); soundPause(soundDig); } function handleKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.shiftKey) { if(gameState == GAME_START || gameState == GAME_RUNNING) { pressShiftKey(event.keyCode); } } else if (event.ctrlKey) { if(gameState == GAME_START || gameState == GAME_RUNNING) { pressCtrlKey(event.keyCode); } } else { if((gameState == GAME_PAUSE && event.keyCode == KEYCODE_ESC) || gameState == GAME_START || gameState == GAME_RUNNING) { if(recordMode != RECORD_PLAY && playMode != PLAY_AUTO) { pressKey(event.keyCode); } } } if(event.keyCode >= 112 && event.keyCode <= 123) return true; //F1 ~ F12 return false; } function handleKeyUp(event) { if(repeatAction) return true; if(!event){ event = window.event; } if(recordKeyCode == event.keyCode && keyPressed != -1) keyPressed = 0; return true; } ================================================ FILE: lodeRunner.main.js ================================================ /** * @license ================================================================================== * Lode Runner main program * * This program is a HTML5 remake of the Lode Runner games (APPLE II & C64 version). * * The program code base on CreateJS JavaScript libraries ! * http://www.createjs.com/ * * The AI algorithm reference book: * http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538 * http://www.amazon.co.jp/Lode-Runnerで学ぶ実践C言語-ビー・エヌ・エヌ企画部/dp/4893690116 * * Source Code: https://github.com/SimonHung/LodeRunner_TotalRecall * Web page: http://LodeRunnerWebGame.com * * by Simon Hung 06/20/2014, 06/13/2015, 09/28/2016 * ================================================================================== */ window.name = 'lodeRunnerParent'; //for world high score switch back 5/31/2015 var screenX1, screenY1; var canvasX, canvasY; var screenBorder; var tileW, tileH; //tile width & tile height var tileWScale, tileHScale; //tile width/height with scale var W2, W4; //W2: 1/2 tile-width, W4: 1/4 tile width var H2, H4; //H2: 1/2 tile-height, H4: 1/4 tile height var mainStageX, mainStageY; var scroeStageX, scoreStageY; var canvas; var mainStage, scoreStage; var loadingTxt; var gameState, lastGameState; var tileScale, xMove, yMove; var speedMode = [14, 18, 23, 29, 35]; //slow normal fast , slow down all speed 6/2/2016 var speedText = ["VERY SLOW", "SLOW", "NORMAL", "FAST", "VERY FAST"]; var speed = 2; //normal var demoSpeed = 35; var levelData = defaultLevelData(); //Classic Lode Runner var curLevel = 1, maxLevel = 1, passedLevel = 0; var playMode = PLAY_CLASSIC; var playData = 1; //classic lode runner var curTime = 0; //count from 0 to MAX_TIME_COUNT var backgroundColor = "#250535"; //background color var playerName = ""; var playerUId = ""; var curTheme = THEME_APPLE2; //support 2 themes: apple2 & C64 var dbName = "LodeRunner"; function init() { var screenSize = getScreenSize(); screenX1 = screenSize.x; screenY1 = screenSize.y; canvasReSize(); createStage(); setBackground(); initAutoDemoRnd(); //init auto demo random levels loadStoreVariable(); //load data from localStorage initMenuVariable(); //init menu variable getLastPlayInfo(); initDemoData(); //get demo data from server ////genUserLevel(MAX_EDIT_LEVEL); //for debug only getEditLevelInfo(); //load edit levels showLoadingPage(); //preload function } function loadStoreVariable() { playerName = getPlayerName(); if( ((playerUid = getUid()) == "" || playerUid.length != 32) && typeof(uId) != "undefined" ) { playerUid = uId; //uId variable in lodeRunner.wData.jss setUid(playerUid); } curTheme = getThemeMode(); getThemeColor(); getRepeatAction(); if(getGamepadMode()) gamepadEnable(); } function canvasReSize() { var iconSizeX; for (var scale = MAX_SCALE*100; scale >= MIN_SCALE*100; scale -= 5) { tileScale = scale / 100; canvasX = BASE_SCREEN_X * tileScale; canvasY = BASE_SCREEN_Y * tileScale; //if (canvasX <= screenX1 && canvasY <= screenY1 || tileScale <= MIN_SCALE) break; iconSizeX = BASE_ICON_X * 2 * tileScale; if( (canvasX+iconSizeX) <= screenX1 && canvasY <= screenY1 || tileScale <= MIN_SCALE) break; } debug("SCALE=" + tileScale); //debug("screenX1 = " + screenX1 + " screenY1 = " + screenY1 + "scale = " + scale); screenBorder = (screenX1 - (canvasX+iconSizeX))/2; if(screenBorder > ICON_BORDER*2) screenBorder = ICON_BORDER*2; else if (screenBorder < 0) screenBorder = 0; screenBorder = (screenBorder * tileScale) | 0; canvas = document.getElementById('canvas'); canvas.width = canvasX; canvas.height = canvasY; //Set canvas top left position var left = ((screenX1 - canvasX)/2|0), top = ((screenY1 - canvasY)/2|0); canvas.style.left = (left>0?left:0) + "px"; canvas.style.top = (top>0?top:0) + "px"; canvas.style.position = "absolute"; canvas.style.cursor = "default"; tileW = BASE_TILE_X; //tileW and tileH for detection so don't change scale tileH = BASE_TILE_Y; tileWScale = BASE_TILE_X * tileScale; tileHScale = BASE_TILE_Y * tileScale; W2 = (tileW/2|0); //20, 15, 10, H2 = (tileH/2|0); //22, 16, 11 W4 = (tileW/4|0); //10, 7, 5, H4 = (tileH/4|0); //11, 8, 5, } function createStage() { mainStage = new createjs.Stage(canvas); loadingTxt = new createjs.Text(" ", "36px Arial", "#FF0000"); loadingTxt.x = (canvas.width - loadingTxt.getBounds().width) / 2 | 0; loadingTxt.y = (canvas.height - loadingTxt.getBounds().height) / 2 | 0; mainStage.addChild(loadingTxt); mainStage.update(); } function setBackground() { //set background color var background = new createjs.Shape(); background.graphics.beginFill("#000000").drawRect(0, 0, canvas.width, canvas.height); mainStage.addChild(background); document.body.style.background = backgroundColor; } function showCoverPage() { menuIconDisable(1); clearIdleDemoTimer(); mainStage.removeAllChildren(); mainStage.addChild(titleBackground); //colorful background mainStage.addChild(coverBitmap); mainStage.addChild(signetBitmap); mainStage.addChild(remakeBitmap); mainStage.update(); waitIdleDemo(3000); } var idleTimer=null, startIdleTime; function clearIdleDemoTimer() { if(idleTimer) clearInterval(idleTimer); idleTimer = null; } function waitIdleDemo(maxIdleTime) { startIdleTime = new Date(); idleTimer = setInterval(function(){ checkIdleTime(maxIdleTime);}, 200); anyKeyStopDemo(); } function anyKeyStopDemo() { document.onkeydown = anyKeyDown; //any key press enableStageClickEvent(); } function stopDemoAndPlay() { var showStartMsg = 1; if(changingLevel) return false; clearIdleDemoTimer(); disableStageClickEvent(); soundStop(soundFall); stopAllSpriteObj(); resumeAudioContext(); //05/15/2018, chrome 66 default mute autoplay, need resume it if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) selectIconObj.disable(1); if(playMode == PLAY_DEMO_ONCE) showStartMsg = 0; ////genUserLevel(MAX_EDIT_LEVEL); //for debug only ////getEditLevelInfo(); //load edit levels selectGame(showStartMsg); } var stageClickListener = null, stagePressListener = null; function enableStageClickEvent() { disableStageClickEvent(); //createjs.Touch.enable(mainStage); stageClickListener = mainStage.on("click", function(evt) { stopDemoAndPlay(); }); //stagePressListener = mainStage.on("press", function(evt) { stopDemoAndPlay(); }); } function disableStageClickEvent() { var rc = 0; if(stageClickListener) { rc = 1; mainStage.off("click", stageClickListener); } //if(stagePressListener) { rc = 1; mainStage.off("press", stagePressListener); } stageClickListener = stagePressListener = null; //createjs.Touch.disable(mainStage); return rc; } function noKeyDown() { return false; } function anyKeyDown() { stopDemoAndPlay(); } function checkIdleTime(maxIdleTime) { var idleTime = (new Date() - startIdleTime); if(idleTime > maxIdleTime){ //start demo clearIdleDemoTimer(); playMode = PLAY_AUTO; anyKeyStopDemo(); startGame(); } } //========================== // Get playMode & playData //========================== function getLastPlayInfo() { var infoJSON = getStorage(STORAGE_LASTPLAY_MODE); playMode = PLAY_NONE; if(infoJSON) { var infoObj = JSON.parse(infoJSON); playMode = infoObj.m; //mode= 1: classic, 2:time playData = infoObj.d; //1: classic lode runner, 2: professional lode runner, 3: lode runner 3 .... } if( (playMode != PLAY_CLASSIC && playMode != PLAY_MODERN) || (playData < 1 || (playData > maxPlayId && playData != PLAY_DATA_USERDEF) ) ){ playMode = PLAY_CLASSIC; playData = 1; //classic lode runner } } function selectGame(showDataMsg) { getLastPlayInfo(); playData2GameVersionMenuId(); document.onkeydown = handleKeyDown; document.onkeyup = handleKeyUp; initShowDataMsg(showDataMsg); startGame(); } var gameTicker = null; var changingLevel = 0; function startPlayTicker() { stopPlayTicker(); //createjs.Ticker.timingMode = createjs.Ticker.RAF; if(playMode == PLAY_AUTO || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) { createjs.Ticker.setFPS(demoSpeed); //06/12/2014 } else { createjs.Ticker.setFPS(speedMode[speed]); } gameTicker = createjs.Ticker.on("tick", mainTick); } function stopPlayTicker() { if(gameTicker) { createjs.Ticker.off("tick", gameTicker); gameTicker = null; } } function startGame(noCycle) { var levelMap; gameState = GAME_WAITING; startPlayTicker(); changingLevel = 1; curAiVersion = AI_VERSION; //07/04/2014 initHotKeyVariable(); //07/09/2014 switch(playMode) { case PLAY_CLASSIC: getClassicInfo(); levelMap = levelData[curLevel-1]; if(curLevel >= levelData.length && (passedLevel+1) >= levelData.length) { loadEndingMusic(); //6/15/2015, music prepare for winner } break; case PLAY_MODERN: getModernInfo(); levelMap = levelData[curLevel-1]; break; case PLAY_TEST: levelMap = getTestLevelMap(); break; case PLAY_DEMO: getDemoInfo(); levelMap = levelData[curLevel-1]; break; case PLAY_DEMO_ONCE: getDemoOnceInfo(); levelMap = levelData[curLevel-1]; break; case PLAY_AUTO: getAutoDemoLevel(1); levelMap = levelData[curLevel-1]; break; } showLevel(levelMap); if(noCycle) { beginPlay(); } else { addCycScreen(); setTimeout(function() { openingScreen(cycDiff*2);}, 5); } } var maxTileX = NO_OF_TILES_X - 1, maxTileY = NO_OF_TILES_Y - 1; var runner = null, guard= []; var map; //[x][y] = { base: base map, act : active map, state:, bitmap: } var guardCount, goldCount, goldComplete; function initVariable() { guard = []; keyAction = holeObj.action = ACT_STOP; goldCount = guardCount = goldComplete = 0; runner = null; dspTrapTile = 0; initRnd(); initModernVariable(); initGuardVariable(); initInfoVariable(); initCycVariable(); initStillFrameVariable(); //05/01/2015 replace sprite with still frame image setSpeedByAiVersion(); //07/04/2014 debug("curAiVersion = " + curAiVersion); } function buildLevelMap(levelMap) { var index = 0; var mapGuardCount = 0; //Number of original guards //(1) create empty map[x][y] array; map = []; for(var x = 0; x < NO_OF_TILES_X; x++) { map[x] = []; for(var y = 0; y < NO_OF_TILES_Y; y++) { map[x][y] = {}; if(levelMap.charAt(index++) == '0') mapGuardCount++; } } //(2) draw map index = 0; for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { var id = levelMap.charAt(index++); var curTile; switch(id) { default: case ' ': //empty map[x][y].base = EMPTY_T; map[x][y].act = EMPTY_T; map[x][y].bitmap = null; continue; case '#': //Normal Brick map[x][y].base = BLOCK_T; map[x][y].act = BLOCK_T; curTile = map[x][y].bitmap = getThemeBitmap("brick"); break; case '@': //Solid Brick map[x][y].base = SOLID_T; map[x][y].act = SOLID_T; curTile = map[x][y].bitmap = getThemeBitmap("solid"); break; case 'H': //Ladder map[x][y].base =LADDR_T; map[x][y].act =LADDR_T; curTile = map[x][y].bitmap = getThemeBitmap("ladder"); break; case '-': //Line of rope map[x][y].base = BAR_T; map[x][y].act = BAR_T; curTile = map[x][y].bitmap = getThemeBitmap("rope"); break; case 'X': //False brick map[x][y].base = TRAP_T; //behavior same as empty map[x][y].act = TRAP_T; curTile = map[x][y].bitmap = getThemeBitmap("brick"); break; case 'S': //Ladder appears at end of level map[x][y].base = HLADR_T; //behavior same as empty before end of level map[x][y].act = EMPTY_T; //behavior same as empty before end of level curTile = map[x][y].bitmap = getThemeBitmap("ladder"); curTile.set({alpha:0}); //hide the laddr break; case '$': //Gold chest map[x][y].base = GOLD_T; //keep gold on base map map[x][y].act = EMPTY_T; curTile = map[x][y].bitmap = getThemeBitmap("gold"); goldCount++; break; case '0': //Guard map[x][y].base = EMPTY_T; map[x][y].act = GUARD_T; map[x][y].bitmap = null; if(--mapGuardCount >= maxGuard) { map[x][y].act = EMPTY_T; continue; //too many guards, set this tile as empty } curTile = new createjs.Sprite(guardData, "runLeft"); guard[guardCount] = { sprite: curTile, pos: { x:x, y:y, xOffset:0, yOffset:0}, action: ACT_STOP, shape: "runLeft", lastLeftRight: "ACT_LEFT", hasGold: 0 }; guardCount++; curTile.stop(); break; case '&': //Player map[x][y].base = EMPTY_T; map[x][y].act = RUNNER_T; map[x][y].bitmap = null; if(runner != null) { map[x][y].act = EMPTY_T; continue; //too many runner, set this tile as empty } runner = {}; curTile = runner.sprite = new createjs.Sprite(runnerData, "runRight"); runner.pos = { x:x, y:y, xOffset:0, yOffset:0}; runner.action = ACT_UNKNOWN; runner.shape = "runRight"; runner.lastLeftRight = "ACT_RIGHT"; curTile.stop(); break; } curTile.setTransform(x * tileWScale, y * tileHScale, tileScale, tileScale); //x,y, scaleX, scaleY mainStage.addChild(curTile); } } assert(mapGuardCount == 0, "Error: mapCuardCount design error !" ); moveSprite2Top(); } function moveSprite2Top() { //move guard to top (z index) for(var i = 0; i < guardCount; i++) { moveChild2Top(mainStage, guard[i].sprite); } if(runner == null) { error("Without runner ???"); } else { //move runner to top (z index) moveChild2Top(mainStage, runner.sprite); } //move fill hole object to top moveFillHoleObj2Top(); //move debug text to top moveChild2Top(mainStage, loadingTxt); //for debug } function buildGroundInfo() { drawGround(); drawInfo(); } var groundTile; function drawGround() { groundTile = []; for(var x = 0; x < NO_OF_TILES_X; x++) { groundTile[x] = getThemeBitmap("ground"); groundTile[x].setTransform(x * tileWScale, NO_OF_TILES_Y * tileHScale, tileScale, tileScale); mainStage.addChild(groundTile[x]); } } var runnerLife = RUNNER_LIFE; var curScore = 0; var curGetGold = 0, curGuardDeadNo = 0; //for modern mode var sometimePlayInGodMode = 0; //if sometime play in god mode then don't save to hi-scoe, 12/23/2014 var infoY; var scoreTxt, scoreTile, lifeTxt, lifeTile, levelTxt, levelTile, demoTxt; var goldTxt, goldTile, guardTxt, guardTile, timeTxt, timeTile; //============================= // initial modern mode variable //============================= function initModernVariable() { //curTime = MAX_TIME_COUNT; curTime = curGetGold = curGuardDeadNo = 0; } function initInfoVariable() { infoY = (NO_OF_TILES_Y * BASE_TILE_Y + GROUND_TILE_Y) * tileScale; scoreTxt = []; scoreTile = []; lifeTxt = []; lifeTile = []; demoTxt = []; levelTxt = []; levelTile = []; goldTxt = []; goldTile = []; guardTxt = []; guardTile = []; timeTxt = []; timeTile = []; } function drawInfo() { if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) { //SCORE drawScoreTxt(); drawScore(0); if(playMode == PLAY_DEMO) { drawDemoTxt(); } else { //MEN drawLifeTxt(); drawLife(); } } else { //GOLD drawGoldTxt(); drawGold(0); //GUARD drawGuardTxt(); drawGuard(0); //TIME drawTimeTxt(); drawTime(0); } //LEVEL drawLevelTxt(); drawLevel(); } //for classic & auto demo mode function drawScoreTxt() { scoreTxt = drawText(0, infoY, "SCORE", mainStage); } function drawLifeTxt() { lifeTxt = drawText(13*tileWScale, infoY, "MEN", mainStage); } function drawLevelTxt() { var xOffset = 20; levelTxt = drawText(xOffset*tileWScale, infoY, "LEVEL", mainStage); } //for demo mode function drawDemoTxt() { demoTxt = drawText(14*tileWScale, infoY, "DEMO", mainStage); } //for time & edit mode function drawGoldTxt() { goldTxt = drawText(0*tileWScale, infoY, "@", mainStage); } function drawGuardTxt() { guardTxt = drawText((5+2/3)*tileWScale, infoY, "#", mainStage); } function drawTimeTxt() { timeTxt = drawText((11+1/3)*tileWScale, infoY, "TIME", mainStage); } // draw score number function drawScore(addScore) { var digitNo; curScore += addScore; for(var i = 0; i < scoreTile.length; i++) mainStage.removeChild(scoreTile[i]); scoreTile = drawText(5*tileWScale, infoY, ("000000"+curScore).slice(-7), mainStage); } function drawLife() { for(var i = 0; i < lifeTile.length; i++) mainStage.removeChild(lifeTile[i]); lifeTile = drawText(16*tileWScale, infoY, ("00"+runnerLife).slice(-3), mainStage); } function drawLevel() { for(var i = 0; i < levelTile.length; i++) mainStage.removeChild(levelTile[i]); switch(playMode) { case PLAY_AUTO: levelTile = drawText(25*tileWScale, infoY, ("00"+demoLevel).slice(-3), mainStage); break; case PLAY_CLASSIC: default: levelTile = drawText(25*tileWScale, infoY, ("00"+curLevel).slice(-3), mainStage); break; } } function drawGold(addGold) { curGetGold += addGold; for(var i = 0; i < goldTile.length; i++) mainStage.removeChild(goldTile[i]); goldTile = drawText(1*tileWScale, infoY, ("00"+curGetGold).slice(-3), mainStage); } function drawGuard(addGuard) { curGuardDeadNo += addGuard; if(curGuardDeadNo > 100) curGuardDeadNo = 100; for(var i = 0; i < guardTile.length; i++) mainStage.removeChild(guardTile[i]); guardTile = drawText((6+2/3)*tileWScale, infoY, ("00"+curGuardDeadNo).slice(-3), mainStage); } function countTime(addTime) { if(curTime >= MAX_TIME_COUNT) return; if(addTime) curTime++; if(curTime > MAX_TIME_COUNT) { curTime = MAX_TIME_COUNT;} } function drawTime(addTime) { countTime(addTime); for(var i = 0; i < timeTile.length; i++) mainStage.removeChild(timeTile[i]); timeTile = drawText((15+1/3)*tileWScale, infoY, ("00"+curTime).slice(-3), mainStage); } function setGroundInfoOrder() { var i; for(i = 0; i < groundTile.length; i++) moveChild2Top(mainStage, groundTile[i]); if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) { for(i = 0; i < scoreTxt.length; i++) moveChild2Top(mainStage, scoreTxt[i]); for(i = 0; i < scoreTile.length; i++) moveChild2Top(mainStage, scoreTile[i]); if(playMode == PLAY_DEMO) { for(i = 0; i < demoTxt.length; i++) moveChild2Top(mainStage, demoTxt[i]); } else { for(i = 0; i < lifeTxt.length; i++) moveChild2Top(mainStage, lifeTxt[i]); for(i = 0; i < lifeTile.length; i++) moveChild2Top(mainStage, lifeTile[i]); } } else { //PLAY_MODERN, PLAY_DEMO_ONCE for(i = 0; i < goldTxt.length; i++) moveChild2Top(mainStage, goldTxt[i]); for(i = 0; i < goldTile.length; i++) moveChild2Top(mainStage, goldTile[i]); for(i = 0; i < guardTxt.length; i++) moveChild2Top(mainStage, guardTxt[i]); for(i = 0; i < guardTile.length; i++) moveChild2Top(mainStage, guardTile[i]); for(i = 0; i < timeTxt.length; i++) moveChild2Top(mainStage, timeTxt[i]); for(i = 0; i < timeTile.length; i++) moveChild2Top(mainStage, timeTile[i]); } for(i = 0; i < levelTxt.length; i++) moveChild2Top(mainStage, levelTxt[i]); for(i = 0; i < levelTile.length; i++) moveChild2Top(mainStage, levelTile[i]); } function drawText(x, y, str, parentObj, numberType) { var text = str.toUpperCase(); var textTile = []; if(typeof numberType == "undefined") numberType = "N"; for(var i = 0; i < text.length; i++) { var code = text.charCodeAt(i); switch(true) { case (code >=48 && code <=57): //N0 ~ N9 or D0 ~ D9 textTile[i] = new createjs.Sprite(textData, numberType+String.fromCharCode(code)); break; case (code >=65 && code <= 90): textTile[i] = new createjs.Sprite(textData, String.fromCharCode(code)); break; case (code == 46): //'.' textTile[i] = new createjs.Sprite(textData, "DOT"); break; case (code == 60): //'<' textTile[i] = new createjs.Sprite(textData, "LT"); break; case (code == 62): //'>' textTile[i] = new createjs.Sprite(textData, "GT"); break; case (code == 45): //'-' textTile[i] = new createjs.Sprite(textData, "DASH"); break; case (code == 58): //':' textTile[i] = new createjs.Sprite(textData, "COLON"); break; case (code == 95): //'_' textTile[i] = new createjs.Sprite(textData, "UNDERLINE"); break; case (code == 35): //'#': guard dead in trap hole textTile[i] = new createjs.Sprite(textData, String.fromCharCode(code)); break; case (code == 64): //'@': gold textTile[i] = new createjs.Sprite(textData, String.fromCharCode(code)); break; default: //space textTile[i] = new createjs.Sprite(textData, "SPACE"); break; } textTile[i].setTransform(x + i*tileWScale, y, tileScale, tileScale).stop(); parentObj.addChild(textTile[i]); } return textTile; } var playTickTimer = 0; function playGame(deltaS) { if(goldComplete && runner.pos.y == 0 && runner.pos.yOffset == 0) { gameState = GAME_FINISH; return; } if(++playTickTimer >= TICK_COUNT_PER_TIME) { if(playMode != PLAY_CLASSIC && playMode != PLAY_AUTO && playMode != PLAY_DEMO) drawTime(1); else countTime(1); playTickTimer = 0; } if(playMode == PLAY_AUTO || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) playDemo(); if(recordMode) processRecordKey(); if(!isDigging()) moveRunner(); else processDigHole(); if(gameState != GAME_RUNNER_DEAD) moveGuard(); if(curAiVersion >= 3) { processGuardShake(); processFillHole(); processReborn(); } } //*********************** // BEGIN show new level * //*********************** function showLevel(levelMap) { mainStage.removeAllChildren(); loadingTxt.text = ""; //loadingTxt.text = tileScale; //for debug mainStage.addChild(loadingTxt); //for debug initVariable(); setBackground(); buildLevelMap(levelMap); buildGroundInfo(); } var tipsText = null, tipsRect = null; var tipsText1 = null, tipsRect1 = null; function showTipsText(text, time, text1) { var x, y, width, height; if(tipsText != null) { mainStage.removeChild(tipsText); } if(tipsRect != null) { mainStage.removeChild(tipsRect); } if(tipsText1 != null) { mainStage.removeChild(tipsText1); tipsText1 = null; } if(tipsRect1 != null) { mainStage.removeChild(tipsRect1); tipsRect1 = null; } tipsText = new createjs.Text("test", "bold " + (48*tileScale) + "px Helvetica", "#ee1122"); tipsText.text = text; tipsText.set({alpha:1}); if(text.length) { width = tipsText.getBounds().width; height = tipsText.getBounds().height; } else { width = height = 0; } x = tipsText.x = (canvas.width - width) / 2 | 0; y = tipsText.y = (NO_OF_TILES_Y*tileHScale - height) / 2 | 0; tipsText.shadow = new createjs.Shadow("white", 2, 2, 1); tipsRect = new createjs.Shape(); tipsRect.graphics.beginFill("#020722"); tipsRect.graphics.drawRect(-1, -1,width+2, height+2); tipsRect.setTransform(x, y).set({alpha:0.8}); mainStage.addChild(tipsRect); mainStage.addChild(tipsText); if(time){ createjs.Tween.get(tipsRect,{override:true}).set({alpha:0.8}).to({alpha:0}, time); createjs.Tween.get(tipsText,{override:true}).set({alpha:1}).to({alpha:0}, time); } if(text1 != null) { //second tips tipsText1 = new createjs.Text("test", "bold " + (48*tileScale) + "px Helvetica", "#ee1122"); tipsText1.text = text1; tipsText1.set({alpha:1}); if(text1.length) { width = tipsText1.getBounds().width; height = tipsText1.getBounds().height; } else { width = height = 0; } x = tipsText1.x = (canvas.width - width) / 2 | 0; y = tipsText1.y = (NO_OF_TILES_Y*tileHScale - height) / 2 + tipsText.getBounds().height*2 | 0; tipsText1.shadow = new createjs.Shadow("white", 2, 2, 1); tipsRect1 = new createjs.Shape(); tipsRect1.graphics.beginFill("#020722"); tipsRect1.graphics.drawRect(-1, -1,width+2, height+2); tipsRect1.setTransform(x, y).set({alpha:0.8}); mainStage.addChild(tipsRect1); mainStage.addChild(tipsText1); if(time){ createjs.Tween.get(tipsRect1,{override:true}).set({alpha:0.8}).to({alpha:0}, time); createjs.Tween.get(tipsText1,{override:true}).set({alpha:1}).to({alpha:0}, time); } } mainStage.update(); } var dspTrapTile = 0; function toggleTrapTile() { dspTrapTile ^= 1; for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { if( map[x][y].base == TRAP_T) { if(dspTrapTile) { map[x][y].bitmap.set({alpha:0.5}); //show trap tile } else { map[x][y].bitmap.set({alpha:1}); //hide trap tile } } } } if(dspTrapTile) { showTipsText("SHOW TRAP TILE", 2000); } else { showTipsText("HIDE TRAP TILE", 2000); } } function startAllSpriteObj() { //(1) runner stop if(runner && !runner.paused) runner.sprite.play(); //(2) guard stop for(var i = 0; i < guardCount; i++) { if(!guard[i].paused) guard[i].sprite.play(); } if(curAiVersion < 3) { //for sprite only //(3) fill hole stop for(var i = 0; i < fillHoleObj.length; i++) fillHoleObj[i].play(); //(4) hole digging if(holeObj.action == ACT_DIGGING) holeObj.sprite.play(); } } function stopAllSpriteObj() { //(1) runner stop if(runner) { runner.paused = runner.sprite.paused; runner.sprite.stop(); } //(2) guard stop for(var i = 0; i < guardCount; i++) { guard[i].paused = guard[i].sprite.paused; guard[i].sprite.stop(); } if(curAiVersion < 3) { //for sprite only //(3) fill hole stop for(var i = 0; i < fillHoleObj.length; i++) fillHoleObj[i].stop(); //(4) hole digging if(holeObj.action == ACT_DIGGING) holeObj.sprite.stop(); } } function gameOverAnimation() { var gameOverImage = getThemeBitmap("over"); var bound = gameOverImage.getBounds(); var x = (NO_OF_TILES_X*tileWScale)/2|0; var y = (NO_OF_TILES_Y*tileHScale)/2|0; var regX = (bound.width)/2|0; var regY = (bound.height)/2|0; var rectBlock = new createjs.Shape(); rectBlock.graphics.beginFill("black"); rectBlock.graphics.drawRect(-1, -1,bound.width+2, bound.height+2); rectBlock.setTransform(x, y, tileScale, tileScale).set({regX:regX, regY:regY}); gameOverImage.setTransform(x, y, tileScale, tileScale).set({regX:regX, regY:regY}); createjs.Tween.get(gameOverImage) .to({scaleY:-tileScale},80) .to({scaleY:tileScale},80) .to({scaleY:-tileScale},100) .to({scaleY:tileScale},100) .to({scaleY:-tileScale},150) .to({scaleY:tileScale},150) .to({scaleY:-tileScale},300) .to({scaleY:tileScale},300) .to({scaleY:-tileScale},450) .to({scaleY:tileScale},450) .to({scaleY:-tileScale},750) .to({scaleY:tileScale},750) .wait(1500) .call(function(){ if(gameState == GAME_OVER_ANIMATION) gameState = GAME_OVER;}); /* BUG: while in PLAY_AUTO MODE and demo dead into the gameOverAnimation() At this time if player press any key or click mouse will cause gameState changed to "GAME_START" and start play the game, and after the TWEEN function into final "call( function() { gameState = GAME_OVER;})" will cause program orderless and want player record hiscore table BUG FIXED: 9/15/2015 if TWEEN complete and into call() func need check gameState MUST = "GAME_OVER_ANIMATION" ==> call(function(){ if(gameState == GAME_OVER_ANIMATION) gameState = GAME_OVER;}); */ mainStage.addChild(rectBlock); mainStage.addChild(gameOverImage); //stopAllSpriteObj(); } var cycScreen, cycMaxRadius, cycDiff, cycX, cycY function initCycVariable() { cycX = NO_OF_TILES_X * tileWScale/2; cycY = NO_OF_TILES_Y * tileHScale/2; cycMaxRadius = Math.sqrt(cycX*cycX+cycY*cycY)|0+1; cycDiff = (cycMaxRadius/CLOSE_SCREEN_SPEED)|0; } function addCycScreen() { cycScreen = new createjs.Shape(); mainStage.addChild(cycScreen); setGroundInfoOrder(); } function removeCycScreen() { mainStage.removeChild(cycScreen); } function newLevel(r) { changingLevel = 1; //menuIconDisable(0); addCycScreen(); //close screen setTimeout(function() { closingScreen(cycMaxRadius);}, 100); } function closingScreen(r) { removeCycScreen(); addCycScreen(); cycScreen.graphics.beginFill("black").arc( cycX, cycY, r, 0, 2*Math.PI, true) cycScreen.graphics.arc( cycX, cycY, cycMaxRadius, 0, 2*Math.PI, false); mainStage.update(); if(r > 0) { r -= cycDiff; if(r < cycDiff*2) r = 0; setTimeout(function() { closingScreen(r);}, 5); } else { var levelMap; curAiVersion = AI_VERSION; //07/04/2014 initHotKeyVariable(); //07/09/2014 if(playMode == PLAY_AUTO) getAutoDemoLevel(0); if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) getNextDemoLevel(); if(playMode == PLAY_TEST) { levelMap = getTestLevelMap(); } else { levelMap = levelData[curLevel-1]; } showLevel(levelMap); addCycScreen(); setTimeout(function() { openingScreen(cycDiff*2);}, 5); } } function menuIconEnable() { mainMenuIconObj.enable(); if(playMode == PLAY_MODERN || playMode == PLAY_DEMO) { selectIconObj.enable(); } if(playMode == PLAY_MODERN) demoIconObj.enable(); if(playMode != PLAY_EDIT) { soundIconObj.enable(); soundIconObj.updateSoundImage(); repeatActionIconObj.enable(); themeColorObj.enable(); } else { if(!editInNarrowScreen) themeColorObj.enable(); } infoIconObj.enable(); helpIconObj.enable(); themeIconObj.enable(); } function menuIconDisable(hidden) { mainMenuIconObj.disable(hidden); if(playMode == PLAY_MODERN) { selectIconObj.disable(hidden); } demoIconObj.disable(hidden); soundIconObj.disable(hidden); infoIconObj.disable(hidden); helpIconObj.disable(hidden); repeatActionIconObj.disable(hidden); themeIconObj.disable(hidden); themeColorObj.disable(hidden); } var showStartTipsMsg = 1; function initShowDataMsg(showMsg) { if(typeof showMsg == "undefined") showMsg = 1; showStartTipsMsg = showMsg; } function showDataMsg() { if(showStartTipsMsg) { var nameTxt = null; var nameTxt1 = null; nameTxt = playDataToTitleName(playData); switch(playMode) { case PLAY_EDIT: nameTxt1 = "Edit Mode"; break; case PLAY_TEST: nameTxt1 = "Test Mode"; break; case PLAY_DEMO: nameTxt1 = "Demo Mode"; break; case PLAY_CLASSIC: if(playData != PLAY_DATA_USERDEF) nameTxt1 = "Challenge Mode"; else nameTxt1 = "Play Mode"; break; case PLAY_MODERN: if(playData != PLAY_DATA_USERDEF) nameTxt1 = "Training Mode"; else nameTxt1 = "Play Mode"; break; } if(nameTxt) showTipsMsg(nameTxt, mainStage, tileScale, nameTxt1); showStartTipsMsg = 0; } } function showHelpMenu() { if(firstPlay) { helpObj.showHelp(0, initForPlay, tileScale, null); setFirstPlayInfo(); } else { initForPlay(); } } function initForPlay() { menuIconEnable(); showDataMsg(); } function openingScreen(r) { removeCycScreen(); addCycScreen(); cycScreen.graphics.beginFill("black").arc( cycX, cycY, r, 0, 2*Math.PI, true) cycScreen.graphics.arc( cycX, cycY, cycMaxRadius, 0, 2*Math.PI, false); mainStage.update(); if(r < cycMaxRadius) { r += cycDiff; if(r > cycMaxRadius) r = cycMaxRadius; setTimeout(function() { openingScreen(r);}, 5); } else { removeCycScreen(); beginPlay(); } } function beginPlay() { gameState = GAME_START; keyAction = ACT_STOP; runner.sprite.gotoAndPlay(); changingLevel = 0; if(recordMode) initRecordVariable(); if(playMode == PLAY_AUTO || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) { initPlayDemo(); if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) initForPlay(); } else { if(playerName == "" || playerName.length <= 1) { inputPlayerName(mainStage, showHelpMenu); } else { showHelpMenu(); } if(playMode != PLAY_TEST && playMode != PLAY_EDIT) { enableAutoDemoTimer(); //while start game and idle too long will into demo mode } } } function incLevel(incValue, passed) { var wrap = 0; curLevel += incValue; while (curLevel > levelData.length) { curLevel-= levelData.length; wrap = 1; } if(playMode == PLAY_CLASSIC) setClassicInfo(passed); if(playMode == PLAY_MODERN) setModernInfo(); return wrap; } function decLevel(decValue) { curLevel -= decValue while (curLevel <= 0) curLevel += levelData.length; if(playMode == PLAY_CLASSIC) setClassicInfo(0); if(playMode == PLAY_MODERN) setModernInfo(); } function updateModernScoreInfo() { var lastHiScore = modernScoreInfo[curLevel-1]; var levelScore = ((MAX_TIME_COUNT - curTime) + curGetGold + curGuardDeadNo) * SCORE_VALUE_PER_POINT; if(lastHiScore < levelScore) { modernScoreInfo[curLevel-1] = levelScore; setModernScoreInfo(); } if(lastHiScore < 0) lastHiScore = 0; return lastHiScore; } function gameFinishActiveNew(level) { curLevel = level; setModernInfo(); startGame(); } function gameFinishCloseIcon() { startGame(); } function gameFinishCallback(selectMode) { switch(selectMode) { case 0: //return (same level) gameState = GAME_NEW_LEVEL; break; case 1: //menu selection //incLevel(1); activeSelectMenu(gameFinishActiveNew, gameFinishCloseIcon); break; case 2: //new level incLevel(1,0); gameState = GAME_NEW_LEVEL; break; default: debug("design error !"); break; } } function gameFinishTestModeCallback() { back2EditMode(1); } var lastScoreTime, scoreDuration; var scoreIncValue, finalScore; function mainTick(event) { var deltaS = event.delta/1000; var scoreInfo; switch(gameState) { case GAME_START: countAutoDemoTimer(); if(keyAction != ACT_STOP && keyAction != ACT_UNKNOWN) { disableAutoDemoTimer(); gamepadClearId(); gameState = GAME_RUNNING; if(playMode == PLAY_MODERN) demoIconObj.disable(1); playTickTimer = 0; //modern mode time counter if(goldCount <= 0) showHideLaddr(); } break; case GAME_RUNNING: playGame(deltaS); break; case GAME_RUNNER_DEAD: //console.log("Time=" + curTime + ", Tick= " + playTickTimer); //if(recordMode) recordModeToggle(GAME_RUNNER_DEAD); //for debug only (if enable it must disable below statement) if(recordMode == RECORD_KEY) recordModeDump(GAME_RUNNER_DEAD); soundStop(soundFall); stopAllSpriteObj(); themeSoundPlay("dead"); switch(playMode) { case PLAY_CLASSIC: case PLAY_AUTO: --runnerLife; drawLife(); if(runnerLife <= 0) { gameOverAnimation(); menuIconDisable(1); if(playMode == PLAY_CLASSIC) clearClassicInfo(); gameState = GAME_OVER_ANIMATION; } else { setTimeout(function() {gameState = GAME_NEW_LEVEL; }, 500); gameState = GAME_WAITING; if(playMode == PLAY_CLASSIC) setClassicInfo(0); } break; case PLAY_DEMO: error("DEMO dead level=" + curLevel); setTimeout(function() {incLevel(1,0); gameState = GAME_NEW_LEVEL; }, 500); gameState = GAME_WAITING; break; case PLAY_DEMO_ONCE: error("DEMO dead level=" + curLevel); disableStageClickEvent(); document.onkeydown = handleKeyDown; setTimeout(function() {playMode = PLAY_MODERN; startGame(); }, 500); gameState = GAME_WAITING; break; case PLAY_MODERN: setTimeout(function() {gameState = GAME_NEW_LEVEL; }, 500); gameState = GAME_WAITING; break; case PLAY_TEST: setTimeout(function() { back2EditMode(0); }, 500); gameState = GAME_WAITING; break; default: debug("GAME_RUNNER_DEAD: desgin error !"); break; } break; case GAME_OVER_ANIMATION: break; case GAME_OVER: scoreInfo = null; if(playMode == PLAY_CLASSIC && !sometimePlayInGodMode) { scoreInfo = {s:curScore, l: passedLevel+1 }; } showScoreTable(playData, scoreInfo , function() { showCoverPage();}); gameState = GAME_WAITING; return; case GAME_FINISH: stopAllSpriteObj(); //console.log("Time=" + curTime + ", Tick= " + playTickTimer); switch(playMode) { case PLAY_CLASSIC: case PLAY_AUTO: case PLAY_DEMO: soundPlay(soundPass); finalScore = curScore + SCORE_COMPLETE_LEVEL; scoreDuration = ((soundPass.getDuration()) /(SCORE_COUNTER+1))| 0; lastScoreTime = event.time; scoreIncValue = SCORE_COMPLETE_LEVEL/SCORE_COUNTER|0; drawScore(scoreIncValue); gameState = GAME_FINISH_SCORE_COUNT; break; case PLAY_DEMO_ONCE: soundPlay(soundEnding); disableStageClickEvent(); document.onkeydown = handleKeyDown; setTimeout(function() {playMode = PLAY_MODERN; startGame(); }, 500); gameState = GAME_WAITING; break; case PLAY_MODERN: soundPlay(soundEnding); var lastHiScore = lastHiScore = updateModernScoreInfo(); levelPassDialog(curLevel, curGetGold, curGuardDeadNo, curTime, lastHiScore, returnBitmap, select1Bitmap, nextBitmap, mainStage, tileScale, gameFinishCallback); gameState = GAME_WAITING; break; case PLAY_TEST: soundPlay(soundEnding); setTimeout(function() { back2EditMode(1);},500); gameState = GAME_WAITING; break; default: error("design error, playMode =" + playMode); break; } //if(recordMode) recordModeToggle(GAME_FINISH); //for debug only (if enable it must comment below if statement) if(recordMode == RECORD_KEY) { recordModeDump(GAME_FINISH); if( (playMode == PLAY_CLASSIC || playMode == PLAY_MODERN) && playData <= maxPlayId ) { updatePlayerDemoData(playData, curDemoData); //update current player demo data } } break; case GAME_FINISH_SCORE_COUNT: if(event.time > lastScoreTime+ scoreDuration) { lastScoreTime += scoreDuration; if(curScore + scoreIncValue >= finalScore) { curScore = finalScore; drawScore(0); gameState = GAME_NEW_LEVEL; switch(playMode) { case PLAY_TEST: setTimeout(function() { back2EditMode(1);},500); break; case PLAY_CLASSIC: if(++runnerLife > RUNNER_MAX_LIFE) runnerLife = RUNNER_MAX_LIFE; break; case PLAY_AUTO: if(demoCount >= demoMaxCount) { setTimeout(function(){ showCoverPage();}, 500); gameState = GAME_WAITING; } break; } if(recordMode != RECORD_PLAY) { if(incLevel(1, 1) && playMode == PLAY_CLASSIC && passedLevel >= levelData.length) gameState = GAME_WIN; } } else { drawScore(scoreIncValue); } } break; case GAME_NEXT_LEVEL: soundStop(soundFall); stopAllSpriteObj(); incLevel(shiftLevelNum, 0); gameState = GAME_NEW_LEVEL; return; case GAME_PREV_LEVEL: soundStop(soundFall); stopAllSpriteObj(); decLevel(shiftLevelNum); gameState = GAME_NEW_LEVEL; return; case GAME_NEW_LEVEL: gameState = GAME_WAITING; newLevel(); break; case GAME_WIN: scoreInfo = {s:curScore, l: levelData.length, w:1 }; //winner menuIconDisable(1); clearClassicInfo(); showScoreTable(playData, scoreInfo , function() { showCoverPage();}); gameState = GAME_WAITING; return; case GAME_LOADING: break; case GAME_PAUSE: default: return; } mainStage.update(); } ================================================ FILE: lodeRunner.menu.js ================================================ function saveKeyHandler(newHandler) { var keyHandler, clickState; keyHandler = document.onkeydown; clickState = disableStageClickEvent(); document.onkeydown = newHandler; return { keyHandler: keyHandler, clickState: clickState }; } function restoreKeyHandler(stateObj) { document.onkeydown = stateObj.keyHandler; if(stateObj.clickState) enableStageClickEvent(); } function helpMenuClass(_stage, _bitmap, _editBitmap, _scale) { var HELP_BORDER_SIZE = 24; var saveStateObj; var playScale, curScale; var stage, helpBitmap = [], bitmapId; var helpBorder, helpBackground, versionText; var startX, startY, menuX, menuY; var closeBoxSize; var callBackFun, callBackArgs; var coverBackgroundObj, closeIcon; stage = _stage; helpBitmap[0] = _bitmap; helpBitmap[1] = _editBitmap; bitmapId = 0; playScale = _scale; this.showHelp = function(id, callback, scale, args) { curScale = scale; if(typeof args == "undefined") args = null; callBackFun = callback; callBackArgs = args; closeBoxSize = 12*curScale+2; closeIcon = null; bitmapId = id; drawBackground(); drawHelpMenu(); drawCloseIcon(0); stage.update(); saveStateObj = saveKeyHandler(helpKeyDown); } function drawBackground() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill("black").drawRect(0, 0, stage.canvas.width, stage.canvas.height).endFill(); coverBackgroundObj.alpha = 0.3; stage.addChild(coverBackgroundObj); } function removeBackground() { stage.removeChild(coverBackgroundObj); } function drawHelpMenu() { var borderSize = HELP_BORDER_SIZE * curScale; var halfBorder = borderSize/2; var bitmapW = helpBitmap[bitmapId].getBounds().width * curScale; var bitmapH = helpBitmap[bitmapId].getBounds().height * curScale; menuX = bitmapW + borderSize; menuY = bitmapH + borderSize; startX = (stage.canvas.width - menuX)/2; startY = (stage.canvas.height - menuY)/2; if(startX < 0) startX = 0; if(startY < 0) startY = 0; helpBorder = new createjs.Shape(); helpBackground = new createjs.Shape(); versionText = new createjs.Text( "Ver " + VERSION + "." + AI_VERSION + "." + playScale , (16*curScale) + "px Helvetica", "#FFF"); var helpG = helpBorder.graphics; helpBorder.alpha = 0.8; helpG.beginFill("#FF0").drawRoundRect(startX, startY, menuX, menuY, halfBorder).endFill(); var helpB = helpBackground.graphics; helpBackground.alpha = 0.6; helpB.beginFill("#190218") .drawRoundRect(startX + halfBorder, startY + halfBorder, bitmapW, bitmapH, halfBorder/2).endFill(); helpBitmap[bitmapId].setTransform(startX + halfBorder, startY + halfBorder, curScale, curScale); //helpBitmap.set({alpha:0.8}); versionText.x = startX + (menuX - versionText.getBounds().width-borderSize); versionText.y = startY + (menuY - versionText.getBounds().height*2.5); stage.addChild(helpBorder); stage.addChild(helpBackground); stage.addChild(helpBitmap[bitmapId]); stage.addChild(versionText); } function removeHelpMenu() { stage.removeChild(versionText); stage.removeChild(helpBitmap[bitmapId]); stage.removeChild(helpBackground); stage.removeChild(helpBorder); } function helpKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.keyCode == KEYCODE_ESC) { closeHelpMenu(); } return false; } function drawCloseIcon(mouseOver) { var cycle, cross; var alpha, cycColor, crosColor; if(closeIcon == null) { closeIcon = new createjs.Container(); cross = new createjs.Shape(); cycle = new createjs.Shape(); closeIcon.addChild(cycle, cross); closeIcon.on("mouseover", handleMouseOver); closeIcon.on("mouseout", handleMouseOut); closeIcon.on("click", closeHelpMenu); closeIcon.x = startX+menuX - closeBoxSize*3; closeIcon.y = startY + closeBoxSize*2; stage.enableMouseOver(30); stage.addChild(closeIcon); } else { cycle = closeIcon.getChildAt(0); cross = closeIcon.getChildAt(1); } if(mouseOver) { alpha = 0.6; cycColor = "red"; crosColor = "white"; } else { alpha = 0.01; cycColor = "gold"; crosColor = "white"; } var g = cycle.graphics; g.clear(); cycle.alpha = alpha; g.beginFill(cycColor).dc(closeBoxSize/2, closeBoxSize/2, closeBoxSize*5/4); g = cross.graphics; g.clear(); //cross.alpha = 1; g.setStrokeStyle(closeBoxSize/4).beginStroke(crosColor).moveTo(0,0) .lineTo(closeBoxSize,closeBoxSize).closePath(); g.moveTo(closeBoxSize,0).lineTo(0,closeBoxSize).closePath(); stage.update(); } function removeCloseIcon() { stage.removeChild(closeIcon); } function handleMouseOver(event) { stage.cursor = 'pointer'; drawCloseIcon(1); } function handleMouseOut(event) { stage.cursor = 'default'; drawCloseIcon(0); } function closeHelpMenu() { firstPlay = 0; // 01/12/2015 removeCloseIcon(); removeHelpMenu(); removeBackground(); stage.cursor = 'default'; stage.update(); stage.enableMouseOver(0); restoreKeyHandler(saveStateObj); if(callBackFun) setTimeout(function() { callBackFun(callBackArgs);}, 10); //add setTimeout just don't cause mouse event (click) cascade! } } function closeIconClass(_width, _height, _stage, _scale, _activeColor, _callBack, _args) { var closeBoxSize = 12*_scale+2; var closeIcon = null;; drawCloseIcon(0); return closeIcon; //must remove by contractor function drawCloseIcon(mouseOver) { var cycle, cross; var alpha, cycColor, crosColor; if(closeIcon == null) { closeIcon = new createjs.Container(); cross = new createjs.Shape(); cycle = new createjs.Shape(); closeIcon.addChild(cycle, cross); closeIcon.on("mouseover", handleMouseOver); closeIcon.on("mouseout", handleMouseOut); closeIcon.on("click", handleMouseClick); closeIcon.x = _width - closeBoxSize*3; closeIcon.y = _height + closeBoxSize*2; //_stage.enableMouseOver(30); _stage.addChild(closeIcon); } else { cycle = closeIcon.getChildAt(0); cross = closeIcon.getChildAt(1); } if(mouseOver) { alpha = 1; cycColor = _activeColor; crosColor = "white"; } else { alpha = 0.01; cycColor = _activeColor; crosColor = "white"; } var g = cycle.graphics; g.clear(); cycle.alpha = alpha; g.beginFill(cycColor).dc(closeBoxSize/2, closeBoxSize/2, closeBoxSize*5/4); g = cross.graphics; g.clear(); //cross.alpha = 1; g.setStrokeStyle(closeBoxSize/4).beginStroke(crosColor).moveTo(0,0) .lineTo(closeBoxSize,closeBoxSize).closePath(); g.moveTo(closeBoxSize,0).lineTo(0,closeBoxSize).closePath(); _stage.update(); } function handleMouseOver(event) { _stage.cursor = 'pointer'; drawCloseIcon(1); } function handleMouseOut(event) { _stage.cursor = 'default'; drawCloseIcon(0); } function handleMouseClick(event) { _stage.cursor = 'default'; if(_callBack) setTimeout(function(){_callBack(_args);},10); } } // -+-- +-------------------------------------------------------------+ // TOP_BORDER1 | | Lode Runner 1 | // | | | // -+-- | #-----------+-----------+ | // TOP_BORDER2 | | | 001 - 030 | 031 - 060 | | // -+-- | +-----------+-----------+-----------------------------+ | // BORDER2 | | | | | // -+-- | | +---------------------------------------------+ | | // | | | 001 002 003 | | | // | | | +----------+ +----------+ +----------+ | | | // | | | | | | | | | | | | // | | | | | | | | | | | | // | | | +----------+ +----------+ +----------+ | | | // | | | 004 005 006 | | | // | | | +----------+ +----------+ +----------+ | | | // | | | | | | | | | | | | // | | | | | | | | | | | | // | | | +----------+ +----------+ +----------+ | | | // -+-- | | +---------------------------------------------+ | | // BORDER2 | | | | | // -+-- | +-----------------------------------------------------+ | // BORDER1 | | | // -+-- +-------------------------------------------------------------+ // |<1>|<2>| // // # : (TABS_START_X, TABS_START_Y) // <1> : BORDER1 // <2> : BORDER2 // // // // |< 3 >| |<4>|<4>| // -+- +--------------------------------------------------------+ -+- // SLIDE_GAP_Y | | 001 | 002 | 003 | | // -+- | +----------+ +----------+ +----------+ | // SELECT_SIZE_Y | | | | | | | | | | | // | | | | | | | | | // -+- | +----------+ | +----------+ | +----------+ | // SLIDE_GAP_Y1 | | | // -+- | - - - - - - - - | - - - - - - - - | - - - - - - - - | SLIDE_AREA_Y // | 004 005 006 | // | +----------+ | +----------+ | +----------+ | // | | | | | | | | // | | | | | | | | | | // | +----------+ +----------+ +----------+ | // | | | | | // +--------------------------------------------------------+ -+- // // |< SLIDE_AREA_X >| // // // < 3 > : SELECT_SIZE_X // < 4 > : SLIDE_GAP_X function selectDialog(_titleName, _checkBitmap, _levelData, _activeLevel, _screenX1, _screenY1, _parentStage, _scale, _activeFun, _closeFun, _postFun) { var TITLE_TEXT_SIZE = 36 * _scale; var TABS_TEXT_SIZE = 20 * _scale; var TOP_BORDER1 = TITLE_TEXT_SIZE * 2 | 0; //new: *2, old: *3/2 var TOP_BORDER2 = TABS_TEXT_SIZE * 3/2 | 0; var BORDER1 = 20 * _scale; var BORDER2 = 16 * _scale; var TABS_START_X = BORDER1; var TABS_START_Y = TOP_BORDER1; var MAP_SCALE = _scale * 0.2; var SELECT_SIZE_X = NO_OF_TILES_X*BASE_TILE_X*MAP_SCALE; var SELECT_SIZE_Y = NO_OF_TILES_Y*BASE_TILE_Y*MAP_SCALE; var SLIDE_PAGE_ITEMS = 3 * 10; var SLIDE_GAP_X = BASE_TILE_X * _scale * 3/5; //new: 3/5, old: 3/4 var SLIDE_GAP_Y = BASE_TILE_Y * _scale * 3/4; var SLIDE_GAP_Y1 = BASE_TILE_Y * _scale * 2/4; //new: 2/4, old: 3/4 var SLIDE_ITEM_X = 3; var SLIDE_ITEM_Y = 3; var SLIDE_AREA_X = (SLIDE_GAP_X*2+SELECT_SIZE_X)*SLIDE_ITEM_X; var SLIDE_AREA_Y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y)*SLIDE_ITEM_Y; var CANVAS_SIZE_X = (BORDER1+BORDER2)*2 + SLIDE_AREA_X; var CANVAS_SIZE_Y = TOP_BORDER1 + TOP_BORDER2 + BORDER2 + SLIDE_AREA_Y +BORDER1+BORDER2; var BACKGROUND_COLOR = "#ff5050"; var BORDER1_COLOR = BACKGROUND_COLOR; var BORDER2_COLOR = "white"; var TABS_ACTIVE_FILL_COLOR = BORDER2_COLOR; var TABS_ACTIVE_LINE_COLOR = BORDER2_COLOR; var TABS_ACTIVE_TEXT_COLOR = "black"; var TABS_INACTIVE_FILL_COLOR = "#ccc"; var TABS_INACTIVE_LINE_COLOR = "#aaa"; var TABS_INACTIVE_TEXT_COLOR = "#888"; var SLIDE_BACKGROUND = "#EEEEFF"; var SLIDE_BOUNDLINE_COLOR = "red"; var SELECT_TEXT_COLOR = "black"; var SELECT_TEXT_ACTIVE_COLOR = "red"; var SELECT_TEXT_SIZE = 20 * _scale; var SELECT_MOUSE_OVER_COLOR = "gold"; var SELECT_MAP_BACKGROUND_COLOR = "black"; var SELECT_SCORE_COLOR = "white"; var SELECT_SCORE_SHADOW = "black"; var SELECT_CHECK_SHADOW_COLOR = "white"; var TITLE_TEXT_COLOR = "white"; var TITLE_TEXT_SHADOW_COLOR = "gold"; var CLOSE_ICON_ACTIVE_COLOR = "#8080ff"; ////////////////////////////////////////////////// var canvas1; var coverBackgroundObj; var dialogStage; var slider; var boundLine1, boundLine2; var tabs = [], tabsLine; var maxPages, activePage; //0 - var lastWheelFun = null; var activeState = 0; //for edit mode only (1: active level shift, -1: active level deleted) var levelDeleted = 0; //for edit mode only var saveKeyStateObj; init(); function init() { saveKeyState(); createCanvas1(); createDialogStage(); setBackground(); initVariable(); drawCoverBackground(); createSliderPage(); createSliderBoundLine(); createBorder1(); createBorder2(); createTabs(0); createTitle(); new closeIconClass(CANVAS_SIZE_X, 0, dialogStage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeBox, null); dialogStage.update(); } function initVariable() { maxPages = Math.ceil(_levelData.length / SLIDE_PAGE_ITEMS); if(playMode == PLAY_EDIT && _activeLevel <= 0) { _activeLevel = activePage = 0; } else { if(_activeLevel <= 0 || _activeLevel > _levelData.length) _activeLevel = 1; activePage = Math.ceil(_activeLevel / SLIDE_PAGE_ITEMS)-1; } } function drawCoverBackground() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill("black") .drawRect(0, 0, _parentStage.canvas.width, _parentStage.canvas.height).endFill(); coverBackgroundObj.alpha = 0.6; _parentStage.addChild(coverBackgroundObj); _parentStage.update(); } function removeCoverBackground() { _parentStage.removeChild(coverBackgroundObj); } function createCanvas1() { canvas1 = document.createElement('canvas'); canvas1.id = "canvas1"; canvas1.width = CANVAS_SIZE_X; canvas1.height = CANVAS_SIZE_Y; var left = ((_screenX1 - canvas1.width)/2|0), top = ((_screenY1 - canvas1.height)/2|0); canvas1.style.left = (left>0?left:0) + "px"; canvas1.style.top = (top>0?top:0) + "px"; canvas1.style.position = "absolute"; document.body.appendChild(canvas1); } function saveKeyState() { saveKeyStateObj = saveKeyHandler(handleEscKeyDown); } function restoreKeyState() { restoreKeyHandler(saveKeyStateObj); } function handleEscKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.shiftKey || event.ctrlKey) return false; switch(event.keyCode) { case KEYCODE_ESC: closeBox(); break; default: //debug("keycode = " + code); break; } return false; } function closeBox() { removeCanvas1(); removeCoverBackground(); restoreKeyState(); if(_postFun) _postFun(); if(_closeFun) _closeFun(levelDeleted, _activeLevel, activeState); //for edit mode } function removeCanvas1() { dialogStage.removeAllChildren(); dialogStage.enableMouseOver(0); dialogStage.cursor ="default"; createjs.Ticker.removeEventListener(dialogStage); document.body.removeChild(canvas1); } function createDialogStage() { dialogStage = new createjs.Stage(canvas1); dialogStage.enableMouseOver(60); createjs.Ticker.setFPS(60); createjs.Ticker.addEventListener("tick", dialogStage); } function setBackground() { var background = new createjs.Shape(); background.graphics.beginFill(BACKGROUND_COLOR).drawRoundRect(0, 0, CANVAS_SIZE_X, CANVAS_SIZE_Y, 8*_scale) .endFill(); dialogStage.addChild(background); } function createSliderPage() { slider = new createjs.Container(); dialogStage.addChild(slider); } function createSliderBoundLine() { boundLine1 = new createjs.Shape(); boundLine2 = new createjs.Shape(); boundLine1.graphics.setStrokeStyle(2).beginStroke(SLIDE_BOUNDLINE_COLOR) .moveTo(BORDER1+BORDER2, TOP_BORDER1+TOP_BORDER2+BORDER2+1) .lineTo(SLIDE_AREA_X+BORDER1+BORDER2, TOP_BORDER1+TOP_BORDER2+BORDER2+1).endStroke(); boundLine1.alpha = 0; boundLine2.graphics.setStrokeStyle(2).beginStroke(SLIDE_BOUNDLINE_COLOR) .moveTo(BORDER1+BORDER2, CANVAS_SIZE_Y-BORDER1-BORDER2-1) .lineTo(SLIDE_AREA_X+BORDER1+BORDER2, CANVAS_SIZE_Y-BORDER1-BORDER2-1).endStroke(); boundLine2.alpha = 0; dialogStage.addChild(boundLine2, boundLine1); } function createBorder1() { var border1 = new createjs.Container(); var vBorder1 = new createjs.Shape(); var vBorder2 = new createjs.Shape(); vBorder1.graphics.beginFill(BORDER1_COLOR) .drawRect(BORDER1+BORDER2-1, 0, SLIDE_AREA_X+2, TOP_BORDER1+TOP_BORDER2).endFill(); vBorder2.graphics.beginFill(BORDER1_COLOR) .drawRect(BORDER1+BORDER2-1, CANVAS_SIZE_Y-BORDER1, SLIDE_AREA_X+2, BORDER1).endFill(); border1.addChild(vBorder1, vBorder2); border1.on("mouseover", function() { dialogStage.cursor ="default"; }); dialogStage.addChild(border1); } function createBorder2() { var border2 = new createjs.Container(); var vBorder1 = new createjs.Shape(); var vBorder2 = new createjs.Shape(); var hBorder1 = new createjs.Shape(); var hBorder2 = new createjs.Shape(); vBorder1.graphics.beginFill(BORDER2_COLOR) .drawRect(BORDER1, TOP_BORDER1+TOP_BORDER2, CANVAS_SIZE_X-2*BORDER1, BORDER2+1).endFill(); vBorder2.graphics.beginFill(BORDER2_COLOR) .drawRect(BORDER1, CANVAS_SIZE_Y-BORDER1-BORDER2-1, CANVAS_SIZE_X-2*(BORDER1)-BORDER2,BORDER2+1).endFill(); hBorder1.graphics.beginFill(BORDER2_COLOR) .drawRect(BORDER1, TOP_BORDER1+TOP_BORDER2+BORDER2, BORDER2+2, CANVAS_SIZE_Y-BORDER1-BORDER2-TOP_BORDER1-TOP_BORDER2).endFill(); hBorder2.graphics.beginFill(BORDER2_COLOR) .drawRect(CANVAS_SIZE_X-BORDER1-BORDER2-1, TOP_BORDER1+TOP_BORDER2+BORDER2, BORDER2+1, CANVAS_SIZE_Y-BORDER1-BORDER2-TOP_BORDER1-TOP_BORDER2).endFill(); border2.addChild(vBorder1, vBorder2, hBorder1, hBorder2); dialogStage.addChild(border2); } function clearTabs() { for(var i = 0; i < tabs.length; i++) { dialogStage.removeChild(tabs[i]); } dialogStage.removeChild(tabsLine); } function createTabs(tabsOnly) { var tabBackground, tabText; var textWidth, textHeight; var tabsStartX = BORDER1; for(var i = 0; i < maxPages; i++) { var tabsName = ("00" + (i * SLIDE_PAGE_ITEMS + 1)).slice(-3) + " - " + ("00" + (i==maxPages-1?_levelData.length:((i+1) * SLIDE_PAGE_ITEMS))).slice(-3); //debug(tabsName); tabs[i] = new createjs.Container(); tabBackground = new createjs.Shape(); tabText = new createjs.Text(tabsName, TABS_TEXT_SIZE + "px Arial", TABS_INACTIVE_TEXT_COLOR); textHeight = tabText.getBounds().height+4*_scale; textWidth = tabText.getBounds().width+textHeight; tabText.x = textHeight; tabs[i].x = tabsStartX; tabs[i].y = TOP_BORDER1+TOP_BORDER2 - textHeight; tabsStartX += (textHeight/2+textWidth); tabs[i].addChild(tabBackground, tabText); tabsActive(i); dialogStage.addChild(tabs[i]); tabs[i].tabId = i; tabs[i].on("mouseover", function(){ dialogStage.cursor = 'pointer'; dialogStage.update();}); tabs[i].on("mouseout", function() { dialogStage.cursor = 'default'; dialogStage.update();}); tabs[i].on("click", tabMouseClick); } tabsLine = new createjs.Shape(); tabsLine.graphics.setStrokeStyle(2).beginStroke(TABS_ACTIVE_LINE_COLOR) .moveTo(BORDER1, TOP_BORDER1+TOP_BORDER2) .lineTo(SLIDE_AREA_X+BORDER1+2*BORDER2, TOP_BORDER1+TOP_BORDER2).endStroke(); dialogStage.addChild(tabsLine); tabsInActiveAll(); tabsActive(activePage); if(!tabsOnly) setSlidePage(activePage); function tabsActive(id) { tabBackground = tabs[id].getChildAt(0); tabText = tabs[id].getChildAt(1); tabBackground.graphics.clear().setStrokeStyle(1) .beginStroke(TABS_ACTIVE_LINE_COLOR).beginFill(TABS_ACTIVE_FILL_COLOR) .moveTo(0, textHeight).lineTo(textHeight/2, 0) .lineTo(textHeight/2+textWidth, 0).lineTo(textHeight+textWidth, textHeight) .lineTo(0, textHeight).endFill(); tabText.color = TABS_ACTIVE_TEXT_COLOR; moveChild2Top(dialogStage, tabs[id]); dialogStage.update(); } function tabsInActive(id) { tabBackground = tabs[id].getChildAt(0); tabText = tabs[id].getChildAt(1); tabBackground.graphics.clear().setStrokeStyle(1) .beginStroke(TABS_INACTIVE_LINE_COLOR).beginFill(TABS_INACTIVE_FILL_COLOR) .moveTo(0, textHeight).lineTo(textHeight/2, 0) .lineTo(textHeight/2+textWidth, 0).lineTo(textHeight+textWidth, textHeight) .lineTo(0, textHeight).endFill(); tabText.color = TABS_INACTIVE_TEXT_COLOR; moveChild2Top(dialogStage, tabs[id]); } function tabsInActiveAll() { for(var i = maxPages; i > 0; i--) { tabsInActive(i-1); moveChild2Top(dialogStage, tabs[i-1]); } moveChild2Top(dialogStage, tabsLine); } function tabMouseClick() { if(activePage != this.tabId) { tabsInActiveAll(); tabsActive(this.tabId); setSlidePage(this.tabId); activePage = this.tabId; } } } function setSlidePage(pages) { var startLevel = SLIDE_PAGE_ITEMS * pages+1; var endLevel = (pages == maxPages-1)?_levelData.length:SLIDE_PAGE_ITEMS * (pages+1); var pageItems = endLevel - startLevel+1; var selectItemX = SLIDE_ITEM_X; var selectItemY = Math.ceil(pageItems/SLIDE_ITEM_X); var slideX = SLIDE_AREA_X; var slideY = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * (selectItemY < SLIDE_ITEM_Y?SLIDE_ITEM_Y:selectItemY); var slideStartX = BORDER1 + BORDER2; var slideStartY = TOP_BORDER1 + TOP_BORDER2 + BORDER2; var maxSliderY = slideStartY; var minSliderY = slideStartY + SLIDE_AREA_Y - slideY; var background = new createjs.Shape(); var selectRect = [], selectText = []; var delSelectObj = []; var sliderMoved = 0; //while move ths silder don't active mouse click var firstPressMoveY = 0; //keep Y position while first press move var closeClicked = 0, closeOver = 0; var activeItemY = -1; //for scroll to active Item init(); function init() { var diffY; slider.removeAllChildren(); slider.removeAllEventListeners(); background.graphics.beginFill(SLIDE_BACKGROUND).drawRect(0, 0, slideX, slideY); slider.addChild(background); var id = -1; levelLoop: for(var y = 0; y < selectItemY; y++) { for(var x = 0; x < selectItemX; x++) { if(++id >= pageItems) break levelLoop; createSelectLevel(x, y); } } background.on("mouseover", function() { dialogStage.cursor = "url('cursor/openhand.cur'), auto";} ); background.on("mouseout", function() { dialogStage.cursor = "default";} ); slider.on("mousedown", function(evt) { diffY = evt.currentTarget.y - evt.stageY; }); slider.on("pressmove",function(evt) { debug("pressmove (1) x=" + evt.stageX + ", y=" + evt.stageY); if(sliderMoved++ <= 0) firstPressMoveY = evt.stageY; boundLine1.alpha = boundLine2.alpha = 0; dialogStage.cursor = "url('cursor/closedhand.cur'), auto"; evt.currentTarget.y = evt.stageY + diffY; if(evt.currentTarget.y > maxSliderY) { evt.currentTarget.y = maxSliderY; boundLine1.alpha = 1; } else if(evt.currentTarget.y < minSliderY ) { evt.currentTarget.y = minSliderY; boundLine2.alpha = 1; } dialogStage.update(); }); slider.on("pressup", function(evt) { debug("press-up (0)"); sliderMoved = firstPressMoveY = 0; dialogStage.cursor = "url('cursor/openhand.cur'), auto"; boundLine1.alpha = boundLine2.alpha = 0; //--------------------- // move to block bound //--------------------- var blockSizeY = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y); var startY = maxSliderY var mod = (maxSliderY - slider.y) % blockSizeY; //division remainder value to block bound if(blockSizeY/2 > mod) { evt.currentTarget.y += mod; //shift down } else { evt.currentTarget.y -= (blockSizeY - mod); //shift up } dialogStage.update(); }); slider.x = slideStartX; slider.y = slideStartY; if(activeItemY > 0) { //scroll to active level slider.y -= activeItemY*(SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y); } dialogStage.update(); enableMouseWheel(); } function createSelectLevel(x, y) { var id = y*selectItemX+x; var textColor = SELECT_TEXT_COLOR, level = startLevel+id;; if(_activeLevel == level) { activeItemY = y; if(activeItemY + SLIDE_ITEM_Y > selectItemY) { activeItemY = selectItemY - SLIDE_ITEM_Y; } textColor = SELECT_TEXT_ACTIVE_COLOR; } selectText[id] = new createjs.Text(("00"+level).slice(-3), SELECT_TEXT_SIZE + "px Arial", textColor); selectText[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X; selectText[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y - SELECT_TEXT_SIZE*4/3; slider.addChild(selectText[id]); selectRect[id] = buildSelectMap(level, id); selectRect[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X; selectRect[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y; slider.addChild(selectRect[id]); if(playMode != PLAY_DEMO || (playMode == PLAY_DEMO && (typeof demoData[level-1] != "undefined"))) { selectRect[id].on('click', selectClick); selectRect[id].on('mouseover', selectMouseOver); selectRect[id].on('mouseout', selectMouseOut); } selectRect[id].myId = id; selectRect[id].myLevel = level; } function delSelectLevel(level) { var id = level - startLevel; //level = startLevel + id var x, y; var tabsOnly = 1; //(1) remove deleted level slider.removeChild(selectText[id]); slider.removeChild(selectRect[id]); //(2) remove close icon object delSelectObj.splice(id,1); //(3) shift level+1 - endLevel while(level < endLevel) { id = level - startLevel; y = id /selectItemX|0; x = id - y * selectItemX; selectText[id] = selectText[id+1]; selectText[id].text = ("00"+level).slice(-3); selectText[id].color = (_activeLevel == level)?SELECT_TEXT_ACTIVE_COLOR:SELECT_TEXT_COLOR; selectText[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X; selectText[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y - SELECT_TEXT_SIZE*4/3; selectRect[id] = selectRect[id+1]; selectRect[id].x = (SLIDE_GAP_X*2+SELECT_SIZE_X) * x + SLIDE_GAP_X; selectRect[id].y = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * y + SLIDE_GAP_Y; selectRect[id].myLevel = level; selectRect[id].myId = level - startLevel; level++; } //(3) add one if could add if(level <= editLevels) { // add new level id = level - startLevel; y = id /selectItemX|0; x = id - y * selectItemX; createSelectLevel(x,y); maxPages = Math.ceil(_levelData.length / SLIDE_PAGE_ITEMS); } else { // no more level (remove last level) if(level == startLevel) { //end pages and no more levels in this pages maxPages--; if(maxPages > 0) { tabsOnly = 0; activePage = maxPages-1; //move to previous page } else { //no any level in select menu !!! ==> close it (maxPages < 0) } } endLevel--; pageItems = endLevel - startLevel+1; selectItemY = Math.ceil(pageItems/SLIDE_ITEM_X); slideY = (SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y) * (selectItemY < SLIDE_ITEM_Y?SLIDE_ITEM_Y:selectItemY); minSliderY = slideStartY + SLIDE_AREA_Y - slideY; if(slider.y < minSliderY) slider.y = minSliderY; //shift slider } //(3) redraw tabs page clearTabs() createTabs(tabsOnly); if(maxPages <= 0) closeBox(); } function buildSelectMap(level, id) { var levelMap = _levelData[level-1]; var selectMap = new createjs.Container(); var border = new createjs.Shape(); var background = new createjs.Shape(); var borderSize = _scale*4+2; border.graphics.beginFill(SELECT_MOUSE_OVER_COLOR) .drawRoundRect(-borderSize, -borderSize, SELECT_SIZE_X+2*borderSize, SELECT_SIZE_Y+2*borderSize, borderSize); border.alpha = 0; background.graphics.beginFill(SELECT_MAP_BACKGROUND_COLOR).drawRect(0, 0, SELECT_SIZE_X, SELECT_SIZE_Y); selectMap.addChild(border, background); selectMap.addChild(level2Bitmap(levelMap)); switch(playMode) { case PLAY_EDIT: if(editLevelData == _levelData) { //del box only for "custom levels", NOT for "LOAD" button delSelectObj[id] = new delIcon(); selectMap.addChild(delSelectObj[id].getCloseObj()); } break; case PLAY_DEMO: setDemoLevelInfo(selectMap, level); break; default: setLevelInfo(selectMap, level); break; } return selectMap; } function level2Bitmap(levelMap) { var container = new createjs.Container(); var guardCount = 0, runner = 0; var bitmap; //-------------------------------------------- // Parser map from right-bottom to left-top // for drop guards if too manys //-------------------------------------------- var index = NO_OF_TILES_Y * NO_OF_TILES_X - 1; for(var y = NO_OF_TILES_Y-1; y >= 0; y--) { for(var x = NO_OF_TILES_X-1; x >= 0; x--) { var id = levelMap.charAt(index--); var curTile; switch(id) { default: case ' ': //empty continue; case '#': //Normal Brick curTile = getThemeBitmap("brick"); break; case '@': //Solid Brick curTile = getThemeBitmap("solid"); break; case 'H': //Ladder curTile = getThemeBitmap("ladder"); break; case '-': //Line of rope curTile = getThemeBitmap("rope"); break; case 'X': //False brick curTile = getThemeBitmap("brick"); break; case 'S': //Ladder appears at end of level continue; case '$': //Gold chest curTile = getThemeBitmap("gold"); break; case '0': //Guard if(++guardCount > MAX_NEW_GUARD) { continue; //too many guard , set this tile as empty } curTile = new createjs.Sprite(guardData, "runLeft"); curTile.stop(); break; case '&': //Player if(++runner > 1) { continue; //too many runner, set this tile as empty } curTile = new createjs.Sprite(runnerData, "runRight"); curTile.stop(); break; } curTile.setTransform(x * BASE_TILE_X*MAP_SCALE, y * BASE_TILE_Y*MAP_SCALE,MAP_SCALE, MAP_SCALE); container.addChild(curTile); } } container.cache(0, 0, SELECT_SIZE_X, SELECT_SIZE_Y); bitmap = new createjs.Bitmap( container.cacheCanvas); //change "cont.getCacheDataURL()" to "cont.cacheCanvas" container.removeAllChildren(); return bitmap; } //for demo mode function setDemoLevelInfo(selectObj, level) { if( typeof demoData[level-1] != "undefined") { var bitmap = _checkBitmap.clone(); var startX = (SELECT_SIZE_X - _checkBitmap.getBounds().width*_scale)/2|0; var startY = (SELECT_SIZE_Y - _checkBitmap.getBounds().height*_scale)/4|0; bitmap.setTransform(startX, startY, _scale, _scale); bitmap.set({alpha:0.9}); bitmap.shadow = new createjs.Shadow(SELECT_CHECK_SHADOW_COLOR, 2, 2, 5); selectObj.addChild(bitmap); } } function setLevelInfo(selectObj, level) { if(modernScoreInfo[level-1] >= 0) { var bitmap = _checkBitmap.clone(); var scoreText = new createjs.Text(modernScoreInfo[level-1], "bold "+SELECT_TEXT_SIZE +"px Helvetica",SELECT_SCORE_COLOR); var startX = (SELECT_SIZE_X - _checkBitmap.getBounds().width*_scale)/2|0; var startY = (SELECT_SIZE_Y - _checkBitmap.getBounds().height*_scale)/4|0; bitmap.setTransform(startX, startY, _scale, _scale); bitmap.set({alpha:0.9}); bitmap.shadow = new createjs.Shadow(SELECT_CHECK_SHADOW_COLOR, 2, 2, 5); selectObj.addChild(bitmap); scoreText.x = (SELECT_SIZE_X - scoreText.getBounds().width)/2|0; scoreText.y = SELECT_SIZE_Y - scoreText.getBounds().height; scoreText.shadow = new createjs.Shadow( SELECT_SCORE_SHADOW, 2, 2, 3); selectObj.addChild(scoreText); } } function selectClick(evt) { debug("selectClick(0) x=" + evt.stageX + ", y=" + evt.stageY + "(" + Math.abs(firstPressMoveY-evt.stageY) +")"); //============================================================================================================= // BUG FIX: This is not a root solution !!! 6/16/2014 // sometime when click on slect map level, also will do "pressmove" command // (1) pressmove => (2) select click ==> (3) pressup // so currently use sliderMoved count > 10 or (click Y-pos not equal to pressmove Y-pos ) acts as move slider // otherwise acts as click the selection! //============================================================================================================= if(sliderMoved > 10 || (sliderMoved && firstPressMoveY != evt.stageY) || closeClicked) { //while move the silder or click on delete level icon don't active mouse click debug("sliderMoved = " + sliderMoved + " closeClicked = " + closeClicked); sliderMoved = firstPressMoveY = closeClicked = 0; return; } debug("selectClick"); removeCanvas1(); removeCoverBackground(); restoreKeyState(); if(_postFun) _postFun(); _activeFun(this.myLevel); } function selectMouseOver() { var border = this.getChildAt(0); if(playMode == PLAY_EDIT && editLevelData == _levelData) { //del box only for "custom levels", NOT for "LOAD" delSelectObj[this.myId].selectOver(); } border.alpha = 1; dialogStage.cursor = 'pointer'; dialogStage.update(); } function selectMouseOut() { var border = this.getChildAt(0); if(playMode == PLAY_EDIT && editLevelData == _levelData) { //del box only for "custom levels", NOT for "LOAD" if(this.myId < delSelectObj.length) delSelectObj[this.myId].selectOut(); ////else debug("mouse out: select deleted"); } border.alpha = 0; dialogStage.cursor = "url('cursor/openhand.cur'), auto"; dialogStage.update(); } function wheelScroll(e) { var direction = e.detail?-e.detail:e.wheelDelta; //e.detail: for fireFox, e.wheelDelta: for chrome, IE direction = (direction>0)?1: -1; slider.y += ((SLIDE_GAP_Y+SLIDE_GAP_Y1+SELECT_SIZE_Y)) * direction; //boundLine1.alpha = boundLine2.alpha = 0; if(slider.y > maxSliderY) { slider.y = maxSliderY; //boundLine1.alpha = 1; } else if(slider.y < minSliderY ) { slider.y = minSliderY; //boundLine2.alpha = 1; } dialogStage.update(); } function enableMouseWheel() { if(lastWheelFun) { canvas1.removeEventListener("mousewheel", lastWheelFun, false); canvas1.removeEventListener('DOMMouseScroll', lastWheelFun, false); } lastWheelFun = wheelScroll; //for chrome canvas1.addEventListener("mousewheel", wheelScroll, false); //for firefox canvas1.addEventListener('DOMMouseScroll', wheelScroll, false); } function delIcon() { var closeBoxSize = 12*_scale+1; var cross, cycle, delIconObj; createCloseIcon(); this.getCloseObj = function () { return delIconObj; } this.selectOver = function () { ////debug("select over"); if(closeOver) return; drawIcon(1); } this.selectOut = function () { ////debug("select out"); drawIcon(0); } function createCloseIcon() { cross = new createjs.Shape(); cycle = new createjs.Shape(); delIconObj = new createjs.Container(); delIconObj.addChild(cycle, cross); delIconObj.on("mouseover", handleMouseOver); delIconObj.on("mouseout", handleMouseOut); delIconObj.on("click", handleMouseClick); delIconObj.x = SELECT_SIZE_X - closeBoxSize*2; delIconObj.y = closeBoxSize; drawIcon(0); } function drawIcon(state) { var cycAlpha, crosAlpha, cycColor, crosColor; crosColor = "white"; switch(state) { case 0: cycColor = "#888"; cycAlpha = crosAplha = 0; break; case 1: cycColor = "#888"; crosAlpha = 1; cycAlpha = 0.7; break; case 2: cycColor = "red"; crosAlpha = cycAlpha = 1; break; } var g = cycle.graphics; g.clear(); cycle.alpha = cycAlpha; g.beginFill(cycColor).dc(closeBoxSize/2, closeBoxSize/2, closeBoxSize*7/6); //g.beginFill(cycColor).dr(-closeBoxSize/2, - closeBoxSize/2, closeBoxSize*2, closeBoxSize*2); g = cross.graphics; g.clear(); cross.alpha = crosAlpha; g.setStrokeStyle(closeBoxSize/4).beginStroke(crosColor).moveTo(0,0) .lineTo(closeBoxSize,closeBoxSize).closePath(); g.moveTo(closeBoxSize,0).lineTo(0,closeBoxSize).closePath(); } function handleMouseOver(event) { ////debug("close over"); closeOver = 1; drawIcon(2); } function handleMouseOut(event) { ////debug("close out"); closeOver = 0; drawIcon(1); } function handleMouseClick(event) { closeClicked = 1; ////debug("delete level = " + delIconObj.parent.myLevel); delLevel(delIconObj.parent.myLevel); //get level from parent's property } } //------------------------------- // for edit mode to delete level //------------------------------- function delLevel(level) { //(1) remove from local storage & variable delEditLevel(level); levelDeleted = 1; //(2) shift or delete active level if(_activeLevel == level) { _activeLevel = 0; activeState = -1; //active level deleted clearTestLevel(); //test level deleted } else if( _activeLevel > level) { _activeLevel--; activeState = 1; //active level shift getTestLevel(testLevelInfo); testLevelInfo.level = _activeLevel; // change level no setTestLevel(testLevelInfo); } else if (_activeLevel == 0) { //0 meaings test level is new level if(testLevelInfo.modified == 1) { testLevelInfo.level = editLevels+1; setTestLevel(testLevelInfo); } } //(3) shift or delete playInfo of user created playData = PLAY_DATA_USERDEF; if(editLevels > 0) { getModernInfo(); if(curLevel == level) { //play level deleted curLevel = 1; setModernInfo(); } else if ( curLevel > level) { //level shift curLevel--; setModernInfo(); } } else { clearModernInfo(); } //(4) remove from slider delSelectLevel(level); ////debug("delete level = " + level); } } function createTitle() { var titleText = new createjs.Text(_titleName, "italic bold " + TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR); titleText.x = (CANVAS_SIZE_X - titleText.getBounds().width)/2|0; titleText.y = (TOP_BORDER1 - titleText.getBounds().height)/2|0; titleText.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 ); dialogStage.addChild(titleText); } } function handleMenuKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.shiftKey || event.ctrlKey) return false; switch(event.keyCode) { case KEYCODE_UP: keyAction = ACT_UP; break; case KEYCODE_DOWN: keyAction = ACT_DOWN; break; case KEYCODE_ENTER: break; case KEYCODE_ESC: break; default: keyAction = ACT_UNKNOWN; //debug("keycode = " + code); break; } return false; } //============== // select menu //============== function menuDialog(_titleName, _itemList, _stage, _scale, _closeIconEnable, _closeCallBack, _args) { var TITLE_TEXT_SIZE = 48 * _scale; var ITEM_TEXT_SIZE = 40 * _scale; var TITLE_TEXT_COLOR = "white"; var TITLE_TEXT_SHADOW_COLOR = "gold"; var ITEM_TEXT_COLOR = "white"; var ITEM_TEXT_SHADOW_COLOR = "gold"; var TITLE_AREA_Y = TITLE_TEXT_SIZE * 2.5 | 0; var ITEM_AREA_Y = ITEM_TEXT_SIZE * 3/2 | 0; var ITEM_GAP_Y = ITEM_TEXT_SIZE * 2/3 | 0; var BOTTOM_AREA_Y = ITEM_AREA_Y/2|0; var BUTTON_BORDER_SIZE = 8 * _scale; var BUTTON_ROUND_RADIUD = 2+ 4 * _scale; var COVER_BACKGROUND_COLOR = "black"; var BUTTON_BACKGROUND_BORDER_COLOR = "white"; var BUTTON_BACKGROUND_COLOR = "#5b0680"; //"#890ee0"; var BUTTON_BACKGROUND_SHADOW = "gold"; var BUTTON_BACKGROUND_BORDER_SIZE = 8 * _scale;; var BUTTON_BORDER_COLOR = "gold"; var BUTTON_COLOR = "#5d7cff"; var CLOSE_ICON_ACTIVE_COLOR = "#ff5050"; var screenX1 = _stage.canvas.width; var screenY1 = _stage.canvas.height; var titleTextObj, titleWidth, titleHeight; var itemText = [], maxItemTextWidth, itemTextHeight; var menuX, menuY; var startX, startY; var coverBackgroundObj, background1Obj, background2Obj, menuButtonObj; var closeIconObj = null; var saveKeyStateObj; var activeItemBackup = _itemList[0].activeItem; //recover menu active item if press ESC or close init(); function init() { createText(); coverParentStage(); creatBackground(); createTitle(); createItemList(); if(_closeIconEnable) { closeIconObj = new closeIconClass(startX+menuX, startY, _stage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeBox, null); } _stage.enableMouseOver(120); _stage.update(); saveKeyStateObj = saveKeyHandler(handleMenuKeyDown); } function coverParentStage() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill(); coverBackgroundObj.alpha = 0.6; _stage.addChild(coverBackgroundObj); } function createText() { var textLength; titleTextObj = new createjs.Text(_titleName, "bold " + TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR); titleWidth = titleTextObj.getBounds().width; titleHeight = titleTextObj.getBounds().height; maxItemTextWidth =0; for(var i = 1; i < _itemList.length; i++) { itemText[i-1] = new createjs.Text(_itemList[i].name, "bold " + ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); textLength = itemText[i-1].getBounds().width; if(maxItemTextWidth < textLength) maxItemTextWidth = textLength; } maxItemTextWidth += ITEM_TEXT_SIZE; menuX = (maxItemTextWidth > titleWidth? maxItemTextWidth: titleWidth) + TITLE_TEXT_SIZE * 2; menuY = TITLE_AREA_Y + BOTTOM_AREA_Y + (ITEM_AREA_Y+ITEM_GAP_Y)*(_itemList.length-1); startX = (screenX1-menuX)/2|0; startY = (screenY1-menuY)/2|0; } function creatBackground() { background1Obj = new createjs.Shape(); background1Obj.graphics.beginFill(BUTTON_BACKGROUND_BORDER_COLOR) .drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill(); background1Obj.shadow = new createjs.Shadow(BUTTON_BACKGROUND_SHADOW, 3, 3, 5 ); background2Obj = new createjs.Shape(); background2Obj.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(startX+BUTTON_BACKGROUND_BORDER_SIZE, startY+BUTTON_BACKGROUND_BORDER_SIZE, menuX-BUTTON_BACKGROUND_BORDER_SIZE*2, menuY-BUTTON_BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill(); _stage.addChild(background1Obj, background2Obj); } function createTitle() { titleTextObj.x = startX + (menuX - titleWidth)/2|0; titleTextObj.y = startY + (TITLE_AREA_Y - titleHeight)/2|0; titleTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 10 ); _stage.addChild(titleTextObj); } function createItemList() { menuButtonObj = [] for(var i = 0; i < itemText.length; i++) { menuButtonObj[i] = new createjs.Container(); //child id = 0 var border = new createjs.Shape(); border.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, maxItemTextWidth+BUTTON_BORDER_SIZE*2, ITEM_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); //child id = 1 var button = new createjs.Shape(); button.graphics.beginFill(BUTTON_COLOR).drawRoundRect(0, 0, maxItemTextWidth, ITEM_AREA_Y,BUTTON_ROUND_RADIUD).endFill(); //child id = 2 itemText[i].textAlign = "center"; itemText[i].x = maxItemTextWidth/2|0; itemText[i].y = (ITEM_AREA_Y - itemText[i].getBounds().height)/2|0; menuButtonObj[i].addChild(border, button,itemText[i]); menuButtonObj[i].x = startX+(menuX - maxItemTextWidth)/2|0; menuButtonObj[i].y = startY+TITLE_AREA_Y+(ITEM_AREA_Y+ITEM_GAP_Y) * i; menuButtonObj[i].myId = i; menuButtonObj[i].on('click', buttonClick); menuButtonObj[i].on('mouseover', buttonMouseOver); menuButtonObj[i].on('mouseout', buttonMouseOut); _stage.addChild(menuButtonObj[i]); } buttonActive(menuButtonObj[_itemList[0].activeItem]); } function closeBox() { _itemList[0].activeItem = activeItemBackup; //recover menu active item restoreKeyHandler(saveKeyStateObj); removeAllObj(); _stage.cursor = 'default'; _stage.enableMouseOver(0); if(_closeCallBack) _closeCallBack(_args); } function removeAllObj() { _stage.removeChild(coverBackgroundObj, titleTextObj, background1Obj, background2Obj); for(var i = 0; i < itemText.length; i++) { _stage.removeChild(menuButtonObj[i]); } if(closeIconObj) _stage.removeChild(closeIconObj); _stage.update(); } function buttonClick() { restoreKeyHandler(saveKeyStateObj); removeAllObj(); _stage.cursor = 'default'; _stage.enableMouseOver(0); if(_itemList[_itemList[0].activeItem+1].activeFun) { _itemList[_itemList[0].activeItem+1].activeFun(_itemList[0].activeItem, _args); } } function buttonActive(buttonObj) { var border = buttonObj.getChildAt(0); var text = buttonObj.getChildAt(2); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, maxItemTextWidth+BUTTON_BORDER_SIZE*2, ITEM_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); text.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 ); } function buttonInactive(buttonObj) { var border = buttonObj.getChildAt(0); var text = buttonObj.getChildAt(2); border.graphics.clear(); border.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, maxItemTextWidth+BUTTON_BORDER_SIZE*2, ITEM_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); text.shadow = null; } function buttonMouseOver() { if(this.myId != _itemList[0].activeItem) { buttonInactive(menuButtonObj[_itemList[0].activeItem]); buttonActive(this); _itemList[0].activeItem = this.myId; } _stage.cursor = 'pointer'; _stage.update(); } function buttonMouseOut() { _stage.cursor = 'default'; _stage.update(); } function handleMenuKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.shiftKey || event.ctrlKey) return false; switch(event.keyCode) { case KEYCODE_UP: buttonInactive(menuButtonObj[_itemList[0].activeItem]); if(--_itemList[0].activeItem < 0) _itemList[0].activeItem = menuButtonObj.length-1; buttonActive(menuButtonObj[_itemList[0].activeItem]); _stage.update(); break; case KEYCODE_DOWN: buttonInactive(menuButtonObj[_itemList[0].activeItem]); if(++_itemList[0].activeItem > (menuButtonObj.length-1)) _itemList[0].activeItem = 0; buttonActive(menuButtonObj[_itemList[0].activeItem]); _stage.update(); break; case KEYCODE_ENTER: buttonClick(); break; case KEYCODE_ESC: if(closeIconObj != null) closeBox(); break; default: //debug("keycode = " + code); break; } return false; } } function mainMenuClose(callbackFun) { if(callbackFun) callbackFun(); } var playVersionInfo = [ { id:1, verData: classicData, name: gameVersionName[0], info: classicInfo }, { id:3, verData: proData, name: gameVersionName[2], info: proInfo }, { id:4, verData: revengeData, name: gameVersionName[3], info: revengeInfo }, { id:5, verData: fanBookData, name: gameVersionName[4], info: fanBookInfo }, { id:2, verData: championData, name: gameVersionName[1], info: championInfo } ]; //var customItemInfo = { id:999, name:" Custom Levels " }; var customItemIdx = -1; var maxPlayId; var gameVersionMenuList = [ { activeItem: 0 } //game version menu ID ]; function getCustomItemInfo(withLevel) { var customItemName = " Custom Levels "; if(withLevel) { if (editLevels == 1) { return customItemName + "(1 Level)"; } else if(editLevels > 1) { return customItemName + "(" + editLevels + " Levels)"; } } return customItemName; } function initMenuVariable() { maxPlayId = 0; for(var i = 0; i < playVersionInfo.length; i++) { //ex: { name: "Classic Lode Runner (150 Levels) ", activeFun: subGameMenu }, gameVersionMenuList.push( { name: playVersionInfo[i].name + " (" + playVersionInfo[i].verData.length + " Levels) ", activeFun: subGameMenu } ); if(maxPlayId < playVersionInfo[i].id) maxPlayId = playVersionInfo[i].id; } var customItemName = getCustomItemInfo(1); gameVersionMenuList.push({name: customItemName, activeFun: subEditMenu}); customItemIdx = gameVersionMenuList.length-1; } function getPlayVerData(id) { for(var i = 0; i < playVersionInfo.length; i++) { if(playVersionInfo[i].id == id) return playVersionInfo[i].verData; } error("Error: versionData can not find, id = " + id ); return playVersionInfo[0].verData; } function getPlayVerInfo(id) { for(var i = 0; i < playVersionInfo.length; i++) { if(playVersionInfo[i].id == id) return playVersionInfo[i].info; } error("Error: version info can not find, id = " + id ); return playVersionInfo[0].info; } function defaultLevelData() { return playVersionInfo[0].verData; } function menuIdToPlayData(menuId) { if(menuId == playVersionInfo.length) return PLAY_DATA_USERDEF; //user created else if (menuId < playVersionInfo.length) return playVersionInfo[menuId].id; error("design error, menuId =" + menuId ); return playVersionInfo[0].id; } var playDataNameUserDef = "Custom Levels"; function playDataToTitleName(verId) { if(verId == PLAY_DATA_USERDEF) return playDataNameUserDef; for(var i = 0; i < playVersionInfo.length; i++) { if(playVersionInfo[i].id == verId) return playVersionInfo[i].name; } error("design error, id =" + verId ); return "Unknown"; } function mainMenu(callbackFun) { gameVersionMenuList[customItemIdx].name = getCustomItemInfo(1); menuDialog(" Select Game Version ", gameVersionMenuList, mainStage, tileScale, 0, mainMenuClose, callbackFun); } function gameVersionMenu(id, callbackFun) { gameVersionMenuList[customItemIdx].name = getCustomItemInfo(1); menuDialog(" Select Game Version ", gameVersionMenuList, mainStage, tileScale, 1, mainMenuClose, callbackFun); } //set main menu id from playData function playData2GameVersionMenuId() { if(playData == PLAY_DATA_USERDEF) { gameVersionMenuList[0].activeItem = playVersionInfo.length; return gameVersionMenuList[0].activeItem; } else { for(var i = 0; i < playVersionInfo.length; i++) { if(playVersionInfo[i].id == playData) { gameVersionMenuList[0].activeItem = i; return i; } } } error("design error, value =" + playData ); gameVersionMenuList[0].activeItem = 0; return 0; } //========================================= // Add menu item if the item is not exist //========================================= function addMenuItem(menuList, addItemObj, addPosition) { if(addPosition >= 0) { menuList.splice(addPosition, 0, addItemObj); //add item to position } else { menuList.push(addItemObj); //append } } function gameMenu(callbackFun) { var titleName; var demoItemObj = { name: " Demo Mode ", activeFun: demoPlay }; var editPlayItemObj = { name: " Play Mode ", activeFun: editPlay }; var editBackupItemObj = { name: " Backup ", activeFun: backupDialog }; var editRestoreItemObj = { name: " Restore ", activeFun: restoreDialog }; var gameMenuList = [ { activeItem: 0 }, { name: " Challenge Mode ", activeFun: classicPlay }, { name: " Training Mode ", activeFun: modernPlay }, // { name: " Demo Mode ", activeFun: demoPlay }, { name: " Change Game Version ", activeFun: gameVersionMenu } ]; var editMenuList = [ { activeItem: 0 }, //[0] { name: " Edit Mode", activeFun: editEdit }, //[1] // { name: " Play ", activeFun: editPlay }, { name: " Change Game Version ", activeFun: gameVersionMenu } //[2] ]; switch(true) { case (gameVersionMenuList[0].activeItem == playVersionInfo.length): titleName = getCustomItemInfo(0); if(playMode == PLAY_EDIT || playMode == PLAY_TEST) { editMenuList[0].activeItem = 0; //edit.edit } else editMenuList[0].activeItem = 1; // edit.play addMenuItem(editMenuList, editRestoreItemObj, 2); if(editLevels > 0) { addMenuItem(editMenuList, editBackupItemObj, 2); addMenuItem(editMenuList, editPlayItemObj, 2); } menuDialog(titleName, editMenuList, mainStage, tileScale, 1, mainMenuClose, callbackFun); return; case (gameVersionMenuList[0].activeItem < playVersionInfo.length): titleName = playVersionInfo[gameVersionMenuList[0].activeItem].name; if(playerDemoData.length > 0) addMenuItem(gameMenuList, demoItemObj, 3); break default: error("design error, value =" + gameVersionMenuList[0].activeItem ); return; } //set active menu id for play mode switch(playMode) { case PLAY_CLASSIC: gameMenuList[0].activeItem = 0; break; case PLAY_MODERN: case PLAY_DEMO_ONCE: gameMenuList[0].activeItem = 1; break; case PLAY_DEMO: gameMenuList[0].activeItem = 2; break; } menuDialog(" " + titleName + " ", gameMenuList, mainStage, tileScale, 1, mainMenuClose, callbackFun); return; } function subGameMenu(id, callbackFun) { gameVersionMenuList[0].activeItem = id; playData = menuIdToPlayData(gameVersionMenuList[0].activeItem); //================================================ // get demo data for current playData from server //------------------------------------------------ if(demoPlayData != playData) initDemoData(); //================================================ classicPlay(id, callbackFun); //set as classic mode } function subEditMenu(id, callbackFun) { gameVersionMenuList[0].activeItem = id; //menuDialog(" Your Own Levels ", editMenuList, mainStage, tileScale, 1, mainMenu, callbackFun); editEdit(id, callbackFun); //set as edit mode } function classicPlay(id, callbackFun) { if(callbackFun != null) callbackFun(); if(playMode == PLAY_EDIT) canvasReSize(); playMode = PLAY_CLASSIC; soundStop(soundDig); soundStop(soundFall); disableStageClickEvent(); document.onkeydown = handleKeyDown; setLastPlayMode(); selectIconObj.disable(1); demoIconObj.disable(1); pasteIconObj.disable(); initShowDataMsg(); startGame(); } function modernPlay(id, callbackFun) { if(callbackFun != null) callbackFun(); if(playMode == PLAY_EDIT) canvasReSize(); playMode = PLAY_MODERN; soundStop(soundDig); soundStop(soundFall); disableStageClickEvent(); document.onkeydown = handleKeyDown; pasteIconObj.disable(); setLastPlayMode(); initShowDataMsg(); startGame(); } function demoPlay(id, callbackFun) { if(callbackFun != null) callbackFun(); if(playMode == PLAY_EDIT) canvasReSize(); playMode = PLAY_DEMO; soundStop(soundDig); soundStop(soundFall); demoSoundOff = 1; //always sound off when start demo anyKeyStopDemo(); initShowDataMsg(); demoIconObj.disable(1); pasteIconObj.disable(); startGame(); } function editPlay(id, callbackFun) { if(callbackFun != null) callbackFun(); if(playMode == PLAY_EDIT) canvasReSize(); playMode = PLAY_MODERN; playData = PLAY_DATA_USERDEF; disableStageClickEvent(); document.onkeydown = handleKeyDown; setLastPlayMode(); //selectIconObj.disable(1); demoIconObj.disable(1); pasteIconObj.disable(); if (id < 0) { //id < 0 ==> means call from restore custom levels initShowDataMsg(0); //no tips message setTimeout(function() { showTipsText("RESTORE COMPLETE", 2500);}, 50); startGame(1); // no cycle } else { initShowDataMsg(); startGame(); } } function editEdit(id, callbackFun) { if(callbackFun != null) callbackFun(); disableStageClickEvent(); demoIconObj.disable(1); pasteIconObj.disable(); if (id < 0) { //id < 0 ==> means call from restore custom levels initShowDataMsg(0); setTimeout(function() { showTipsText("RESTORE COMPLETE", 2500);}, 50); } else { initShowDataMsg(); } startEditMode(); } function helpMenu(callbackFun) { var id = 0; if(playMode == PLAY_EDIT) id = 1; if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) { infoObj.showInfo(demoHelp, callbackFun, null); } else { helpObj.showHelp(id, callbackFun, tileScale, null); } } function activeSelectMenu(activeFun, postFun) { if(playMode == PLAY_EDIT) { var editLevel = testLevelInfo.level> editLevels?0:testLevelInfo.level; selectDialog(playDataNameUserDef, checkBitmap, editLevelData, editLevel, screenX1, screenY1, mainStage, tileScale, activeFun, editSelectMenuClose, postFun) } else { var titleName = playDataToTitleName(playData); if(playMode == PLAY_DEMO) titleName = "DEMO: " + titleName; selectDialog(titleName, checkBitmap, levelData, curLevel, screenX1, screenY1, mainStage, tileScale, activeFun, null, postFun) } } // if _level < 0 means "share level" pass dialog function levelPassDialog(_level, _getGold, _guardDead, _time, _hiScore, _button1Bitmap, _button2Bitmap, _button3Bitmap, _stage, _scale, _callBack) { var TITLE_TEXT_SIZE = 48 * _scale; var ITEM_TEXT_SIZE = 40 * _scale; var GOLD_X = 32 * _scale; var TITLE_TEXT_COLOR = "white"; var TITLE_SHADOW_COLOR = "yellow"; var ITEM_TEXT_COLOR = "white"; var TIME_NAME_COLOR = "#fad292"; var SCORE_NAME_COLOR = TIME_NAME_COLOR; var HISCORE_NAME_COLOR = TIME_NAME_COLOR; var TEXT_GAP_Y = ITEM_TEXT_SIZE * 2/3 | 0; var COVER_BACKGROUND_COLOR = "black"; var BACKGROUND_BORDER_COLOR = "white" var BACKGROUND_COLOR = "#5b0680"; var BACKGROUND_SHADOW = "gold"; var BACKGROUND_BORDER_SIZE = 8 * _scale; var BUTTON_BORDER_SIZE = 8 * _scale; var BUTTON_ROUND_RADIUD = 2+ 4 * _scale; var BUTTON_BORDER_COLOR = "gold"; var BUTTON_COLOR = "#eeffff" var BUTTON_BACKGROUND_COLOR = BACKGROUND_COLOR; var buttonX = _button1Bitmap.getBounds().width * _scale, buttonY = _button1Bitmap.getBounds().height * _scale; var titleTextObj, goldTextObj, guardTextObj, timeTextObj; var goldObj, guardObj, timeNameObj; var scoreNameObj, scoreTextObj, hiScoreNameObj, hiScoreTextObj; var coverBackgroundObj, background1Obj, background2Obj, menuButtonObj; var screenX1 = _stage.canvas.width; var screenY1 = _stage.canvas.height; var menuX, menuY, startX, startY var timeNameX, maxTextSize; var menuButton = []; var bitmap = [ _button1Bitmap, _button2Bitmap, _button3Bitmap ]; var centerX, xOffset, yOffset; var levelScore = 0, goldPoint = 0, guardPoint = 0, timePoint = MAX_TIME_COUNT; var countTime = 85, onePointValue = 100, countAddValue = 47; init(); function init() { initContent(); coverParentStage(); creatBackground(); createContent(); _stage.enableMouseOver(120); _stage.update(); setTimeout(function() { goldScoreCounting(1);}, 200); } function initContent() { titleTextObj = new createjs.Text("LEVEL " + ("00"+_level).slice(-3), "bold "+TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR); titleTextObj.shadow = new createjs.Shadow(TITLE_SHADOW_COLOR, 0, 0, 10 ); goldTextObj = new createjs.Text("000", ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); guardTextObj = new createjs.Text("000", ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); timeTextObj = new createjs.Text(("00"+MAX_TIME_COUNT).slice(-3), ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); timeNameObj = new createjs.Text("TIME", "bold " + ITEM_TEXT_SIZE + "px Helvetica", TIME_NAME_COLOR); scoreNameObj = new createjs.Text("SCORE", "bold " + ITEM_TEXT_SIZE + "px Helvetica", SCORE_NAME_COLOR); scoreTextObj = new createjs.Text("000000", ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); hiScoreNameObj = new createjs.Text("HI-SCORE", "bold " + ITEM_TEXT_SIZE + "px Helvetica", HISCORE_NAME_COLOR); hiScoreTextObj = new createjs.Text( ("00000"+_hiScore).slice(-6), ITEM_TEXT_SIZE + "px Helvetica",ITEM_TEXT_COLOR); timeNameX = timeNameObj.getBounds().width; maxTextSize = hiScoreNameObj.getBounds().width + hiScoreTextObj.getBounds().width; menuX = maxTextSize + TITLE_TEXT_SIZE * 5; menuY = TITLE_TEXT_SIZE * 2 + (ITEM_TEXT_SIZE+TEXT_GAP_Y) * 5 + buttonY*3; startX = (screenX1-menuX)/2|0; startY = (screenY1-menuY)/2|0; } function coverParentStage() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill(); coverBackgroundObj.alpha = 0.6; _stage.addChild(coverBackgroundObj); } function creatBackground() { background1Obj = new createjs.Shape(); background1Obj.graphics.beginFill(BACKGROUND_BORDER_COLOR) .drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill(); background1Obj.shadow = new createjs.Shadow(BACKGROUND_SHADOW, 3, 3, 5 ); background2Obj = new createjs.Shape(); background2Obj.graphics.beginFill(BACKGROUND_COLOR) .drawRoundRect(startX+BACKGROUND_BORDER_SIZE, startY+BACKGROUND_BORDER_SIZE, menuX-BACKGROUND_BORDER_SIZE*2, menuY-BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill(); _stage.addChild(background1Obj, background2Obj); } function createContent() { titleTextObj.x = startX + (menuX - titleTextObj.getBounds().width)/2|0; titleTextObj.y = startY + TITLE_TEXT_SIZE; _stage.addChild(titleTextObj); var centerGap = 8*_scale; centerX = startX+ menuX/2|0; xOffset = centerX; yOffset = startY+TITLE_TEXT_SIZE*3; goldObj = drawText(xOffset, yOffset-TEXT_GAP_Y/3, "@", _stage); //@: gold var xOffset = centerX - GOLD_X - centerGap; goldObj[0].x = xOffset; goldObj[0].alpha = 0; goldTextObj.x = centerX + centerGap; goldTextObj.y = yOffset; goldTextObj.alpha = 0; _stage.addChild(goldTextObj); yOffset += (ITEM_TEXT_SIZE + TEXT_GAP_Y); guardObj = drawText(xOffset, yOffset-TEXT_GAP_Y/3, "#", _stage); //#: trap (陷井) guardObj[0].alpha = 0; guardTextObj.x =centerX + centerGap; guardTextObj.y = yOffset; guardTextObj.alpha = 0; _stage.addChild(guardTextObj); var xOffset = centerX - timeNameX - centerGap; yOffset += (ITEM_TEXT_SIZE + TEXT_GAP_Y); timeNameObj.x = xOffset; timeNameObj.y = yOffset; timeNameObj.alpha = 0; timeTextObj.x = centerX + centerGap; timeTextObj.y = yOffset; timeTextObj.alpha = 0; _stage.addChild(timeNameObj, timeTextObj); xOffset = centerX - scoreNameObj.getBounds().width - centerGap; yOffset += (ITEM_TEXT_SIZE + TEXT_GAP_Y); scoreNameObj.x = xOffset; scoreNameObj.y = yOffset; scoreTextObj.x = centerX + centerGap; scoreTextObj.y = yOffset; _stage.addChild(scoreNameObj, scoreTextObj); xOffset = centerX - hiScoreNameObj.getBounds().width - centerGap; yOffset += (ITEM_TEXT_SIZE+ TEXT_GAP_Y/3); hiScoreNameObj.x = xOffset; hiScoreNameObj.y = yOffset; hiScoreTextObj.x = centerX + centerGap; hiScoreTextObj.y = yOffset; _stage.addChild(hiScoreNameObj, hiScoreTextObj); yOffset += (ITEM_TEXT_SIZE + buttonY); //yOffset for menu button } function updateHiScore() { if(_hiScore < levelScore) { hiScoreTextObj.text = ("00000" + (levelScore)).slice(-6); hiScoreTextObj.color = "gold"; } } function goldScoreCounting(firstTime) { var endCount = 0; if(firstTime) { goldObj[0].alpha = 1; goldTextObj.alpha = 1; soundPlay("scoreBell"); if(_getGold <= 0) { endCount = 1; } else { setTimeout(function() { goldScoreCounting(0); }, countTime ); } } else { var addCount = countAddValue, endCount = 0; if(goldPoint + addCount >= _getGold) { endCount = 1; addCount = _getGold - goldPoint; } soundPlay("scoreCount"); goldPoint += addCount; levelScore += (addCount * onePointValue); goldTextObj.text = ("00" + (goldPoint)).slice(-3); scoreTextObj.text = ("00000" + (levelScore)).slice(-6); updateHiScore(); if(!endCount) { setTimeout(function() { goldScoreCounting(0); }, countTime ); } } if(endCount) { setTimeout(function() { guardScoreCounting(1); }, countTime*4); } _stage.update(); } function guardScoreCounting(firstTime) { var endCount = 0; if(firstTime) { guardObj[0].alpha = 1; guardTextObj.alpha = 1; soundPlay("scoreBell"); if(_guardDead <= 0) { endCount = 1; } else { setTimeout(function() { guardScoreCounting(0); }, countTime ); } } else { var addCount = countAddValue, endCount = 0; if(guardPoint + addCount >= _guardDead) { endCount = 1; addCount = _guardDead - guardPoint; } soundPlay("scoreCount"); guardPoint += addCount; levelScore += (addCount * onePointValue); guardTextObj.text = ("00" + (guardPoint)).slice(-3); scoreTextObj.text = ("00000" + (levelScore)).slice(-6); updateHiScore(); if(!endCount) { setTimeout(function() { guardScoreCounting(0); }, countTime ); } } if(endCount) { setTimeout(function() { timeScoreCounting(1); }, countTime*4 ); } _stage.update(); } function timeScoreCounting(firstTime) { var endCount = 0; if(firstTime) { timeNameObj.alpha = 1; timeTextObj.alpha = 1; soundPlay("scoreBell"); if(_time >= MAX_TIME_COUNT) { endCount = 1; } else { setTimeout(function() { timeScoreCounting(0); }, countTime ); } } else { var addCount = countAddValue, endCount = 0; if(timePoint - addCount <= _time) { endCount = 1; addCount = timePoint - _time; } soundPlay("scoreCount"); timePoint -= addCount; levelScore += (addCount * onePointValue); timeTextObj.text = ("00" + (timePoint)).slice(-3); scoreTextObj.text = ("00000" + (levelScore)).slice(-6); updateHiScore(); if(!endCount) { setTimeout(function() { timeScoreCounting(0); }, countTime ); } } if(endCount) { soundPlay("scoreEnding"); setTimeout(function() { createButton(); }, 100 ); } _stage.update(); } function createButton() { var border, button; for(var i = 0; i < 3; i++ ) { menuButton[i] = new createjs.Container(); border = new createjs.Shape(); button = new createjs.Shape(); xOffset = centerX - buttonX*3 + (buttonX *5/2*i)|0; //id = 0 border.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2, buttonX+4*BUTTON_BORDER_SIZE, buttonY+4*BUTTON_BORDER_SIZE,BUTTON_ROUND_RADIUD).endFill(); //id = 1 button.graphics.beginFill(BUTTON_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, buttonX+BUTTON_BORDER_SIZE*2, buttonY+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); //id = 2 bitmap[i].setTransform(0, 0, _scale, _scale); menuButton[i].x = xOffset; menuButton[i].y = yOffset; menuButton[i].addChild(border, button, bitmap[i]); menuButton[i].on('click', buttonClick); menuButton[i].on('mouseover', buttonMouseOver); menuButton[i].on('mouseout', buttonMouseOut); menuButton[i].myId = i; _stage.addChild(menuButton[i]); } _stage.update(); } function buttonClick() { removeAllObj(); _stage.cursor = 'default'; _stage.enableMouseOver(0); if(_callBack) _callBack(this.myId); //debug(this.myId); } function buttonMouseOver() { var border = this.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2, buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill(); _stage.cursor = 'pointer'; _stage.update(); } function buttonMouseOut() { var border = this.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2, buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill(); _stage.cursor = 'default'; _stage.update(); } function removeAllObj() { _stage.removeChild(coverBackgroundObj, background1Obj, background2Obj, titleTextObj); _stage.removeChild(goldObj[0], goldTextObj); _stage.removeChild(guardObj[0], guardTextObj); _stage.removeChild(timeNameObj, timeTextObj); _stage.removeChild(scoreNameObj, scoreTextObj); _stage.removeChild(hiScoreNameObj, hiScoreTextObj); for(var i = 0; i < 3; i++) { _stage.removeChild(menuButton[i]); } _stage.update(); } } function yesNoDialog(_txtMsg, _yesBitmap, _noBitmap, _stage, _scale, _callBack) { var TEXT_MSG_SIZE = 48 * _scale; var TEXT_GAP_Y = TEXT_MSG_SIZE * 3/4 | 0; var TEXT_MSG_COLOR = "white"; var TEXT_MSG_SHADOW_COLOR = "yellow"; var COVER_BACKGROUND_COLOR = "black"; var BACKGROUND_BORDER_COLOR = "white" var BACKGROUND_COLOR = "#5b0680"; var BACKGROUND_SHADOW = "gold"; var BACKGROUND_BORDER_SIZE = 8 * _scale; var BUTTON_BORDER_SIZE = 8 * _scale; var BUTTON_ROUND_RADIUD = 2+ 4 * _scale; var BUTTON_BORDER_COLOR = "gold"; var BUTTON_COLOR = "#eeffff" var BUTTON_BACKGROUND_COLOR = BACKGROUND_COLOR; var saveStateObj; var textObj; var coverBackgroundObj, background1Obj, background2Obj; var screenX1 = _stage.canvas.width; var screenY1 = _stage.canvas.height; var buttonX = _yesBitmap.getBounds().width * _scale, buttonY = _yesBitmap.getBounds().height * _scale; var menuX, menuY, startX, startY var menuButton = []; var bitmap = [ _yesBitmap, _noBitmap ]; init(); function init() { saveKeyState(); initTxtMsg(); coverParentStage(); creatBackground(); createTxtMsg(); createButton(); _stage.enableMouseOver(60); _stage.update(); } function saveKeyState() { saveStateObj = saveKeyHandler(noKeyDown); } function restoreKeyState() { restoreKeyHandler(saveStateObj); } function initTxtMsg() { var maxTextSize = 0, tmpTextSize; textObj = []; for(var i = 0; i < _txtMsg.length; i++) { textObj[i] = new createjs.Text(_txtMsg[i], "bold " + TEXT_MSG_SIZE + "px Helvetica",TEXT_MSG_COLOR); if( i == 0 ) //only first line message has shadow textObj[i].shadow = new createjs.Shadow(TEXT_MSG_SHADOW_COLOR, 0, 0, 10 ); tmpTextSize = textObj[i].getBounds().width; if(maxTextSize < tmpTextSize) maxTextSize = tmpTextSize; } if(maxTextSize < buttonX * 4) maxTextSize = buttonX * 4; menuY = (TEXT_GAP_Y + TEXT_MSG_SIZE) * _txtMsg.length + TEXT_MSG_SIZE * 2 + buttonY; menuX = maxTextSize + TEXT_MSG_SIZE * 2; startX = (screenX1-menuX)/2|0; startY = (screenY1-menuY)/2|0; } function coverParentStage() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill(); coverBackgroundObj.alpha = 0.6; _stage.addChild(coverBackgroundObj); } function creatBackground() { background1Obj = new createjs.Shape(); background1Obj.graphics.beginFill(BACKGROUND_BORDER_COLOR) .drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill(); background1Obj.shadow = new createjs.Shadow(BACKGROUND_SHADOW, 3, 3, 5 ); background2Obj = new createjs.Shape(); background2Obj.graphics.beginFill(BACKGROUND_COLOR) .drawRoundRect(startX+BACKGROUND_BORDER_SIZE, startY+BACKGROUND_BORDER_SIZE, menuX-BACKGROUND_BORDER_SIZE*2, menuY-BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill(); _stage.addChild(background1Obj, background2Obj); } function createTxtMsg() { for(var i = 0; i < textObj.length; i++) { textObj[i].x = startX + (menuX - textObj[i].getBounds().width)/2|0 textObj[i].y = startY + (TEXT_GAP_Y + TEXT_MSG_SIZE) * i + TEXT_GAP_Y; _stage.addChild(textObj[i]); } } function createButton() { var border, button; var centerX = startX+ menuX/2|0; for(var i = 0; i < 2; i++ ) { menuButton[i] = new createjs.Container(); border = new createjs.Shape(); button = new createjs.Shape(); //id = 0 border.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2, buttonX+4*BUTTON_BORDER_SIZE, buttonY+4*BUTTON_BORDER_SIZE,BUTTON_ROUND_RADIUD).endFill(); //id = 1 button.graphics.beginFill(BUTTON_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, buttonX+BUTTON_BORDER_SIZE*2, buttonY+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); //id = 2 bitmap[i].setTransform(0, 0, _scale, _scale); menuButton[i].x = centerX - buttonX*2.5 + (buttonX*4*i); menuButton[i].y = textObj[textObj.length-1].y + TEXT_MSG_SIZE*2; menuButton[i].addChild(border, button, bitmap[i]); menuButton[i].on('click', buttonClick); menuButton[i].on('mouseover', buttonMouseOver); menuButton[i].on('mouseout', buttonMouseOut); menuButton[i].myId = i; _stage.addChild(menuButton[i]); } _stage.update(); } function buttonClick() { restoreKeyState(); removeAllObj(); _stage.cursor = 'default'; _stage.enableMouseOver(0); if(_callBack) _callBack(!this.myId+0); //debug(this.myId); } function buttonMouseOver() { var border = this.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2, buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill(); _stage.cursor = 'pointer'; _stage.update(); } function buttonMouseOut() { var border = this.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE*2, -BUTTON_BORDER_SIZE*2, buttonX+BUTTON_BORDER_SIZE*4, buttonY+BUTTON_BORDER_SIZE*4,BUTTON_ROUND_RADIUD).endFill(); _stage.cursor = 'default'; _stage.update(); } function removeAllObj() { _stage.removeChild(coverBackgroundObj, background1Obj, background2Obj); for(var i = 0; i < textObj.length; i++) { _stage.removeChild(textObj[i]); } for(var i = 0; i < menuButton.length; i++) { _stage.removeChild(menuButton[i]); } _stage.update(); } } function backupDialog(id, _callBackFun) { var _stage = mainStage; var _scale = tileScale; var TITLE_TEXT_SIZE = 48 * _scale; var MSG_TEXT_SIZE = 40 * _scale; var BUTTON_TEXT_SIZE = 40 * _scale; var BUTTON_BORDER_SIZE = 8 * _scale; var BUTTON_ROUND_RADIUD = 2+ 4 * _scale; var COVER_BACKGROUND_COLOR = "black"; var BUTTON_BACKGROUND_BORDER_COLOR = "white"; var BUTTON_BACKGROUND_SHADOW = "gold"; var BUTTON_BACKGROUND_COLOR = "#5b0680"; //"#890ee0"; var BUTTON_BACKGROUND_BORDER_SIZE = 8 * _scale;; var TITLE_TEXT_COLOR = "white"; var TITLE_TEXT_SHADOW_COLOR = "gold"; var MSG_TEXT_COLOR = "white"; var BUTTON_TEXT_COLOR = "white" var BUTTON_TEXT_SHADOW_COLOR = "gold"; var BUTTON_BORDER0_COLOR = "white"; //"#890ee0"; var BUTTON_COLOR = "#5d7cff"; var BUTTON_BORDER1_COLOR = "gold"; var CLOSE_ICON_ACTIVE_COLOR = "#ff5050"; var MSG_AREA_Y = MSG_TEXT_SIZE * 3/2 | 0; var MSG_GAP_Y = MSG_TEXT_SIZE * 2/3 | 0; var coverBackgroundObj; var background1Obj, background2Obj; var titleTextObj, msgTextObj; var buttonTextObj, buttonObj; var closeIconObj; var saveKeyStateObj; var buttonSizeX; var menuX, menuY; var startX, startY; var screenX1 = _stage.canvas.width; var screenY1 = _stage.canvas.height; init(); function init() { saveKeyState(); coverParentStage(); initContent(); creatBackground(); createContent(); closeIconObj = new closeIconClass(startX+menuX, startY, _stage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeDialog, null); _stage.enableMouseOver(120); _stage.update(); } function saveKeyState() { saveKeyStateObj = saveKeyHandler(handleEscKeyDown); } function restoreKeyState() { restoreKeyHandler(saveKeyStateObj); } function coverParentStage() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, screenX1, screenY1).endFill(); coverBackgroundObj.alpha = 0.6; _stage.addChild(coverBackgroundObj); } function initContent() { titleTextObj = new createjs.Text(" Backup ", "bold "+TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR); titleTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 10 ); msgTextObj = new createjs.Text("Back up all custom levels to a file", "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR); buttonTextObj = new createjs.Text("Backup", "bold " + BUTTON_TEXT_SIZE + "px Helvetica", BUTTON_TEXT_COLOR); buttonSizeX = buttonTextObj.getBounds().width + BUTTON_TEXT_SIZE; menuX = msgTextObj.getBounds().width + TITLE_TEXT_SIZE * 2; menuY = TITLE_TEXT_SIZE * 2.5 + (MSG_TEXT_SIZE *2) + MSG_GAP_Y * 4|0; startX = (screenX1-menuX)/2|0; startY = (screenY1-menuY)/2|0; } function creatBackground() { background1Obj = new createjs.Shape(); background1Obj.graphics.beginFill(BUTTON_BACKGROUND_BORDER_COLOR) .drawRoundRect(startX, startY, menuX, menuY, 8*_scale).endFill(); background1Obj.shadow = new createjs.Shadow(BUTTON_BACKGROUND_SHADOW, 3, 3, 5 ); background2Obj = new createjs.Shape(); background2Obj.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(startX+BUTTON_BACKGROUND_BORDER_SIZE, startY+BUTTON_BACKGROUND_BORDER_SIZE, menuX-BUTTON_BACKGROUND_BORDER_SIZE*2, menuY-BUTTON_BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill(); _stage.addChild(background1Obj, background2Obj); } function createContent() { titleTextObj.x = startX + (menuX - titleTextObj.getBounds().width)/2|0; titleTextObj.y = startY + TITLE_TEXT_SIZE*3/4; _stage.addChild(titleTextObj); var yOffset = (TITLE_TEXT_SIZE*2.2)|0; msgTextObj.x = startX + (menuX - msgTextObj.getBounds().width)/2|0; msgTextObj.y = startY + yOffset; _stage.addChild(msgTextObj); buttonObj = new createjs.Container(); //child id = 0 var border = new createjs.Shape(); border.graphics.beginFill(BUTTON_BORDER0_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE ,BUTTON_ROUND_RADIUD).endFill(); //child id = 1 var button = new createjs.Shape(); button.graphics.beginFill(BUTTON_COLOR).drawRoundRect(0, 0, buttonSizeX, MSG_AREA_Y,BUTTON_ROUND_RADIUD).endFill(); //child id = 2 buttonTextObj.textAlign = "center"; buttonTextObj.x = buttonSizeX/2|0; buttonTextObj.y = (MSG_AREA_Y - msgTextObj.getBounds().height)/2|0; yOffset += (MSG_GAP_Y*2 + TITLE_TEXT_SIZE/2)|0; buttonObj.addChild(border, button, buttonTextObj); buttonObj.x = startX + (menuX - buttonSizeX)/2|0; buttonObj.y = startY+ yOffset; buttonObj.on('click', buttonClick); buttonObj.on('mouseover', buttonMouseOver); buttonObj.on('mouseout', buttonMouseOut); _stage.addChild(buttonObj); } function buttonClick() { var downloadfileName = downloadCustomLevelData(); restoreKeyState(); removeAllObj(); _stage.cursor = 'default'; _stage.enableMouseOver(0); if(_callBackFun) _callBackFun(); setTimeout(function() { showTipsText("BACKUP IS COMPLETE", 2500);}, 50); } function removeAllObj() { _stage.removeChild(coverBackgroundObj, background1Obj, background2Obj); _stage.removeChild(titleTextObj, msgTextObj, buttonObj); _stage.removeChild(closeIconObj); _stage.update(); } function buttonMouseOver() { var border = buttonObj.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER1_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, buttonSizeX+BUTTON_BORDER_SIZE*2, MSG_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); buttonTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 ); _stage.cursor = 'pointer'; _stage.update(); } function buttonMouseOut() { var border = buttonObj.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER0_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill(); buttonTextObj.shadow = null; _stage.cursor = 'default'; _stage.update(); } function closeDialog() { restoreKeyState(); removeAllObj(); _stage.cursor = 'default'; _stage.enableMouseOver(0); if(_callBackFun) _callBackFun(); } function getBackupFileName(d) { //var d = new Date(); //LR-05.10.21.141804.lrwg return 'LR'+ ('0'+(d.getMonth()+1)).slice(-2) + ('0'+d.getDate()).slice(-2) + ('0'+d.getFullYear()).slice(-2) + '-'+ ('0'+d.getHours()).slice(-2) + ('0'+d.getMinutes()).slice(-2) + ('0'+d.getSeconds()).slice(-2) + '-' + ('00'+editLevels).slice(-3) + '.lrwg'; } function downloadCustomLevelData() { var date = new Date(); var fileName = getBackupFileName(date); download(fileName, backupCustomLevelData(date)); return fileName; function download(filename, text) { //reference: https://ourcodeworld.com/articles/read/189/how-to-create-a-file-and-generate-a-download-with-javascript-in-the-browser-without-a-server var element = document.createElement('a'); element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text)); element.setAttribute('download', filename); element.style.display = 'none'; document.body.appendChild(element); element.click(); document.body.removeChild(element); } } function handleEscKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.shiftKey || event.ctrlKey) return false; switch(event.keyCode) { case KEYCODE_ESC: closeDialog(); break; default: //debug("keycode = " + code); break; } return false; } } function restoreDialog(id, _callBackFun) { //LODE RUNNER WEB GAME.Wed May 12 2021 19:04:16 GMT+0800 (台北標準時間).PLAYER.XXXXX\n var _scale = tileScale; var MAX_DISPLAY_FILENAME_LEN = 26; var TITLE_TEXT_SIZE = 48 * _scale; var MSG_TEXT_SIZE = 40 * _scale; var BUTTON_TEXT_SIZE = 40 * _scale; var FILEINFO_TEXT_SIZE = 36 * _scale; var MAPNO_TEXT_SIZE = 20 * _scale; var TOTALLEVEL_TEXT_SIZE = 28 * _scale; var BUTTON_BORDER_SIZE = 8 * _scale; var BUTTON_ROUND_RADIUD = 2+ 4 * _scale; var COVER_BACKGROUND_COLOR = "black"; var BUTTON_BACKGROUND_BORDER_COLOR = "white"; var BUTTON_BACKGROUND_SHADOW = "gold"; var BUTTON_BACKGROUND_COLOR = "#5b0680"; //"#890ee0"; var BUTTON_BACKGROUND_BORDER_SIZE = 8 * _scale; var PREVIEWMAP_BUTTON_COLOR = "white"; var PREVIEWMAP_BUTTON_BORDER_SIZE = 4 * _scale; var PREVIEWMAP_BUTTON_GRAY_ALPHA = 0.2; var TITLE_TEXT_COLOR = "white"; var TITLE_TEXT_SHADOW_COLOR = "gold"; var MSG_TEXT_COLOR = "white"; var WRONG_TEXT_COLOR = "#f54B42"; var WRONG_TEXT_OUTLINE_COLOR = "#FFFFB0"; var WRONG_TEXT_SHADOW_COLOR = "#404040"; var BUTTON_TEXT_COLOR = "white" var BUTTON_TEXT_SHADOW_COLOR = "gold"; var BUTTON_BORDER0_COLOR = "white"; var BUTTON_COLOR = "#5d7cff"; var BUTTON_BORDER1_COLOR = "gold"; var OPENBUTTON_BACKGROUND_COLOR = BUTTON_BACKGROUND_COLOR, OPENBUTTON_COLOR = "#FFFFFF", OPENBUTTON_BORDER_COLOR = "gold"; var OPENBUTTON_BORDER_SIZE = 8 * _scale, OPENBUTTON_ROUND_RADIUD = 2+ 4 * _scale; var FILEINFO_TEXT_COLOR = "#EEEEEE"; var CLOSE_ICON_ACTIVE_COLOR = "#ff5050"; var MSG_AREA_Y = MSG_TEXT_SIZE * 3/2 | 0; var MSG_GAP_Y = MSG_TEXT_SIZE * 2/3 | 0; var PREVIEW_MAP_SCALE = tileScale * 0.13; var previewMapX = NO_OF_TILES_X*BASE_TILE_X*PREVIEW_MAP_SCALE, previewMapY = NO_OF_TILES_Y*BASE_TILE_Y*PREVIEW_MAP_SCALE; var previewMapGapX = 16*tileScale, previewMapPerLine = 5; var coverBackgroundObj; var restoreCanvas; var dialogStage; var background1Obj, background2Obj; var titleTextObj, msgTextObj; var fileTextObj, fileNameTextObj, fileNameBackgroundObj; var openFolderButtonObj; var wrongText1Obj, wrongText2Obj; var fileInfoTextObj; var buttonTextObj, buttonObj; var fileNameObj = null; var closeIconObj; var saveKeyStateObj; var maxFileNameSize, totalFileNameSizeX, totalPreviewMapSizeX; var previewNoYOffset, previewMapYOffset; var buttonSizeX; var menuX, menuY; var fileNameX, fileNameY; var wrongMsgEnable = 0; var openFolderButtonScale = 0.9; var openFolderButtonX = openFolderBitmap.getBounds().width * tileScale * openFolderButtonScale, openFolderButtonY = openFolderBitmap.getBounds().height * tileScale * openFolderButtonScale; var nextButtonX = nextBitmap.getBounds().width * tileScale, nextButtonY = nextBitmap.getBounds().height * tileScale; var inputFileElement = null; var tmpCustomLevels; var levelMapNoObj = levelMapObjs = []; var totalLevelTextObj = null; var nextMapButtonObj, prevMapButtonObj; var previewvMapFirst = previewMapLast = -1; init(); function init() { saveKeyState(); coverParentStage(); createInputFileElement(); initContent(); createCanvas(); createDialogStage(); creatBackground(); createContent(); closeIconObj = new closeIconClass(menuX, 0, dialogStage, _scale, CLOSE_ICON_ACTIVE_COLOR, closeDialog, null); } function saveKeyState() { saveKeyStateObj = saveKeyHandler(handleEscKeyDown); } function restoreKeyState() { restoreKeyHandler(saveKeyStateObj); } function coverParentStage() { coverBackgroundObj = new createjs.Shape(); coverBackgroundObj.graphics.beginFill(COVER_BACKGROUND_COLOR).drawRect(0, 0, mainStage.canvas.width, mainStage.canvas.height).endFill(); coverBackgroundObj.alpha = 0.6; mainStage.addChild(coverBackgroundObj); // mainStage mainStage.update(); } function createInputFileElement() { inputFileElement = document.createElement('input'); inputFileElement.type = 'file'; inputFileElement.accept = '.lrwg'; inputFileElement.style.display = 'none'; document.body.appendChild(inputFileElement); inputFileElement.addEventListener('change', readRestoreFile); } function initContent() { titleTextObj = new createjs.Text("Restore", "bold "+TITLE_TEXT_SIZE + "px Helvetica",TITLE_TEXT_COLOR); titleTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 0, 0, 10 ); msgTextObj = new createjs.Text("Restore custom levels from backup files", "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR); fileTextObj = new createjs.Text("File:", "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR); wrongText1Obj = new createjs.Text("Wrong file format !", "bold " + MSG_TEXT_SIZE + "px Helvetica", WRONG_TEXT_OUTLINE_COLOR); wrongText1Obj.outline = _scale; wrongText2Obj = new createjs.Text("Wrong file format !", "bold " + MSG_TEXT_SIZE + "px Helvetica", WRONG_TEXT_COLOR); wrongText2Obj.shadow = new createjs.Shadow(WRONG_TEXT_SHADOW_COLOR, _scale, _scale*2, 1); //get maximun file name text size (width) var tmpObj = new createjs.Text("X", "bold "+ MSG_TEXT_SIZE + "px Courier New", MSG_TEXT_COLOR); maxFileNameSize = tmpObj.getBounds().width * MAX_DISPLAY_FILENAME_LEN; fileInfoTextObj = new createjs.Text("Preview","bold " + FILEINFO_TEXT_SIZE + "px Helvetica", FILEINFO_TEXT_COLOR); totalFileNameSizeX = fileTextObj.getBounds().width + maxFileNameSize + (tileWScale*2/3) + openFolderButtonX; totalPreviewMapSizeX = (previewMapX+previewMapGapX) * previewMapPerLine + previewMapGapX; menuX = TITLE_TEXT_SIZE * 2 + (totalFileNameSizeX > totalPreviewMapSizeX?totalFileNameSizeX:totalPreviewMapSizeX) |0; menuY = (TITLE_TEXT_SIZE * 2.5 + (MSG_TEXT_SIZE+MSG_GAP_Y)*2) + ((MSG_TEXT_SIZE+MSG_GAP_Y)*2+ previewMapY + TITLE_TEXT_SIZE) + (MSG_GAP_Y*3 + BUTTON_TEXT_SIZE) |0; buttonTextObj = new createjs.Text(" Restore ", "bold " + BUTTON_TEXT_SIZE + "px Helvetica", BUTTON_TEXT_COLOR); buttonSizeX = buttonTextObj.getBounds().width + BUTTON_TEXT_SIZE; } function createCanvas() { restoreCanvas = document.createElement('canvas'); restoreCanvas.id = "restoreDialog"; restoreCanvas.width = menuX+10; //10 px for shadow restoreCanvas.height = menuY+10; //10 px for shadow var left = (screenX1 - restoreCanvas.width)/2|0, top = (screenY1 - restoreCanvas.height)/2|0; restoreCanvas.style.left = left + "px"; restoreCanvas.style.top = top + "px"; restoreCanvas.style.position = "absolute"; document.body.appendChild(restoreCanvas); } function createDialogStage() { dialogStage = new createjs.Stage(restoreCanvas); dialogStage.enableMouseOver(60); //createjs.Ticker.setFPS(20); createjs.Ticker.addEventListener("tick", dialogStage); } function creatBackground() { background1Obj = new createjs.Shape(); background1Obj.graphics.beginFill(BUTTON_BACKGROUND_BORDER_COLOR) .drawRoundRect(0, 0, menuX, menuY, 8*_scale).endFill(); background1Obj.shadow = new createjs.Shadow(BUTTON_BACKGROUND_SHADOW, 3, 3, 5 ); background2Obj = new createjs.Shape(); background2Obj.graphics.beginFill(BUTTON_BACKGROUND_COLOR) .drawRoundRect(BUTTON_BACKGROUND_BORDER_SIZE, BUTTON_BACKGROUND_BORDER_SIZE, menuX-BUTTON_BACKGROUND_BORDER_SIZE*2, menuY-BUTTON_BACKGROUND_BORDER_SIZE*2, 8*_scale).endFill(); dialogStage.addChild(background1Obj, background2Obj); } function createContent() { titleTextObj.x = (menuX - titleTextObj.getBounds().width)/2|0; titleTextObj.y = TITLE_TEXT_SIZE*3/4|0; dialogStage.addChild(titleTextObj); var yOffset = TITLE_TEXT_SIZE*2.2|0; msgTextObj.x = (menuX - msgTextObj.getBounds().width)/2|0; msgTextObj.y = yOffset; dialogStage.addChild(msgTextObj); yOffset += (MSG_TEXT_SIZE+MSG_GAP_Y)|0; fileTextObj.x = (menuX - totalFileNameSizeX)/2|0; fileTextObj.y = yOffset; dialogStage.addChild(fileTextObj); fileNameX = fileTextObj.x + fileTextObj.getBounds().width + (tileWScale/3)|0; fileNameY = yOffset; fileNameBackgroundObj = new createjs.Shape(); fileNameBackgroundObj.graphics.beginFill("white").drawRect( fileNameX, fileNameY, maxFileNameSize, MSG_TEXT_SIZE).endFill(); fileNameBackgroundObj.alpha = 0.2; dialogStage.addChild(fileNameBackgroundObj); addOpenButton(fileNameX+maxFileNameSize+(tileWScale*1/3)|0, fileNameY+(MSG_TEXT_SIZE-openFolderButtonY)/2|0); yOffset += (MSG_TEXT_SIZE+MSG_GAP_Y)|0; // fileInfo Box yOffset var fileInfoBackgroundObj = new createjs.Shape(); var fileInfoTextBarObj = new createjs.Shape(); var fileInfoBoxSizeY = (MSG_TEXT_SIZE+MSG_GAP_Y)*2 + previewMapY + MSG_TEXT_SIZE | 0; var fileInfoBoxYOffset = yOffset; fileInfoBackgroundObj.graphics.beginFill("white").drawRoundRect(TITLE_TEXT_SIZE, yOffset, menuX-TITLE_TEXT_SIZE*2, fileInfoBoxSizeY, 16*_scale).endFill(); fileInfoBackgroundObj.alpha = 0.5; dialogStage.addChild(fileInfoBackgroundObj); fileInfoTextObj.x = (menuX-fileInfoTextObj.getBounds().width)/2; fileInfoTextObj.y = yOffset+ (MSG_GAP_Y/2)|0; // prevew text yOffset dialogStage.addChild(fileInfoTextObj); previewNoYOffset = fileInfoTextObj.y + (MSG_TEXT_SIZE+MSG_GAP_Y/2)|0; previewMapYOffset = previewNoYOffset + MSG_GAP_Y; //set Wrong file format x,y wrongText1Obj.x = wrongText2Obj.x = (menuX-wrongText1Obj.getBounds().width)/2|0; wrongText1Obj.y = wrongText2Obj.y = fileInfoBoxYOffset + (fileInfoBoxSizeY- wrongText1Obj.getBounds().height)/2; //Y center of preview box Y shift title createPreviewMapButton(); // create Restore button buttonObj = new createjs.Container(); //child id = 0 var border = new createjs.Shape(); border.graphics.beginFill(BUTTON_BORDER0_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE ,BUTTON_ROUND_RADIUD).endFill(); //child id = 1 var button = new createjs.Shape(); button.graphics.beginFill(BUTTON_COLOR).drawRoundRect(0, 0, buttonSizeX, MSG_AREA_Y,BUTTON_ROUND_RADIUD).endFill(); //child id = 2 buttonTextObj.textAlign = "center"; buttonTextObj.x = buttonSizeX/2|0; buttonTextObj.y = (MSG_AREA_Y - msgTextObj.getBounds().height)/2|0; buttonObj.addChild(border, button, buttonTextObj); buttonObj.x = (menuX - buttonSizeX)/2|0; buttonObj.y = fileInfoBoxYOffset + fileInfoBoxSizeY + MSG_GAP_Y|0; buttonObj.on('click', buttonClick); buttonObj.on('mouseover', buttonMouseOver); buttonObj.on('mouseout', buttonMouseOut); buttonObj.alpha = 0; dialogStage.addChild(buttonObj); } function createPreviewMapButton() { var nextMapX = nextMapBitmap.getBounds().width*_scale, nextMapY = nextMapBitmap.getBounds().height*_scale*2/3; var borderNext = new createjs.Shape(); var borderPrev = new createjs.Shape(); nextMapButtonObj = new createjs.Container(); prevMapButtonObj = new createjs.Container(); //Preview Map Next button borderNext.graphics.beginFill(PREVIEWMAP_BUTTON_COLOR) .drawRoundRect(-PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, -PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, nextMapX+PREVIEWMAP_BUTTON_BORDER_SIZE, nextMapY+PREVIEWMAP_BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill(); borderNext.alpha =PREVIEWMAP_BUTTON_GRAY_ALPHA; nextMapBitmap.setTransform(0, 0, _scale, _scale*2/3); nextMapButtonObj.x = TITLE_TEXT_SIZE + (previewMapGapX + previewMapX)*previewMapPerLine - nextMapX-PREVIEWMAP_BUTTON_BORDER_SIZE/2; nextMapButtonObj.y = previewMapYOffset + previewMapY + previewMapGapX/2; nextMapButtonObj.myId = 1; nextMapButtonObj.addChild(borderNext, nextMapBitmap); nextMapButtonObj.on('click', PreviewButtonClick); nextMapButtonObj.on('mouseover', PreviewButtonMouseOver); nextMapButtonObj.on('mouseout', PreviewButtonMouseOut); nextMapButtonObj.alpha = 0; dialogStage.addChild(nextMapButtonObj); //Preview Map Prev Button borderPrev.graphics.beginFill(PREVIEWMAP_BUTTON_COLOR) .drawRoundRect(-PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, -PREVIEWMAP_BUTTON_BORDER_SIZE/2|0, nextMapX+PREVIEWMAP_BUTTON_BORDER_SIZE, nextMapY+PREVIEWMAP_BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill(); borderPrev.alpha =PREVIEWMAP_BUTTON_GRAY_ALPHA; prevMapBitmap.setTransform(0, 0, _scale, _scale*2/3); prevMapButtonObj.x = TITLE_TEXT_SIZE + previewMapGapX + PREVIEWMAP_BUTTON_BORDER_SIZE/2; prevMapButtonObj.y = previewMapYOffset + previewMapY + previewMapGapX/2; prevMapButtonObj.myId = 2; prevMapButtonObj.addChild(borderPrev, prevMapBitmap); prevMapButtonObj.on('click', PreviewButtonClick); prevMapButtonObj.on('mouseover', PreviewButtonMouseOver); prevMapButtonObj.on('mouseout', PreviewButtonMouseOut); prevMapButtonObj.alpha = 0; dialogStage.addChild(prevMapButtonObj); function PreviewButtonClick() { var myId = this.myId; var totalLevels = tmpCustomLevels.length; switch(myId) { case 1: //next page previewMapFirst += previewMapPerLine; previewMapLast += previewMapPerLine; if (previewMapLast >= totalLevels) previewMapLast = totalLevels-1; break; case 2: //previous page previewMapFirst -= previewMapPerLine; previewMapLast = previewMapFirst + previewMapPerLine-1; if (previewMapLast >= totalLevels) previewMapLast = totalLevels-1; break; default: error("Error: Design Error myId = " + myId ); return; } removePreviewMap(); displayPreviewMap(myId); } function PreviewButtonMouseOver() { var backgroundObj = this.getChildAt(0); backgroundObj.alpha = 1; dialogStage.cursor = 'pointer'; dialogStage.update(); } function PreviewButtonMouseOut() { var backgroundObj = this.getChildAt(0); backgroundObj.alpha = PREVIEWMAP_BUTTON_GRAY_ALPHA; dialogStage.cursor = 'default'; dialogStage.update(); } } function removePreviewObj() { if (wrongMsgEnable) { dialogStage.removeChild(wrongText1Obj, wrongText2Obj); //dialogStage.removeChild(wrongText2Obj); wrongMsgEnable = 0; } removePreviewMap(); disableMapButton(); dialogStage.removeChild(totalLevelTextObj); dialogStage.update(); } function readRestoreFile(e) { var file; var readFiler; var fileSize, totalLevels, fileChecksum; removePreviewObj(); buttonObj.alpha = 0; //disable restore button (hide) if (e.target.files.length <= 0) { displayFileName(""); return; } file = e.target.files[0]; displayFileName(file.name); // (1) First only read header for check file format readHeaderInfo(); //reference: https://developer.mozilla.org/en-US/docs/Web/API/FileReader function readHeaderInfo() { var readHeader = new FileReader(); var blob = file.slice(0, 150); //read 0 - 150 bytes readHeader.onloadend = function(e) { if (e.target.readyState == FileReader.DONE) { checkHeaderInfo(e.target.result); } }; readHeader.readAsText(blob); } function checkHeaderInfo(headerInfo) { //LODE RUNNER WEB GAME.Sun May 16 2021 11:12:20 GMT+0800 (台北標準時間).SISS.MTAyMDAwNDA5YTg1NExS var maxFileSize = 150 + NO_OF_TILES_X * NO_OF_TILES_Y * 256; var newLinePos = headerInfo.indexOf('\n'); if(newLinePos < 0) { displayAlertMsg("wrong header"); return; } var lastDotPos = headerInfo.substr(0, newLinePos).lastIndexOf('.'); if (lastDotPos < 0 || newLinePos - lastDotPos != 21) { displayAlertMsg("wrong fileInfo"); return; } else { try { var fileInfo = atob(headerInfo.substr(lastDotPos+1, newLinePos-lastDotPos-1)); } catch(e) { // wrong base64 displayAlertMsg("wrong base64"); return; } var verInfo = fileInfo.charAt(0); if ( verInfo != '1' && verInfo != '2') { displayAlertMsg("wrong fileInfo.version (" + verInfo + ")"); return; } if (headerInfo.indexOf(LRWG_FILE_START_INFO) != 0) { displayAlertMsg("wrong startInfo"); return; } totalLevels = parseInt(fileInfo.substr(1,2), 16); fileSize = parseInt(fileInfo.substr(3,6), 16); fileChecksum = parseInt(fileInfo.substr(9,4), 16); if (totalLevels > MAX_EDIT_LEVEL || totalLevels <= 0) { displayAlertMsg("wrong edit levels (" + totalLevels + ")"); return; } if (file.size > maxFileSize) { displayAlertMsg("Error: file size too large (" + file.size + ")"); return; } if (fileSize != file.size) { displayAlertMsg("wrong file size"); return; } // (2) Read all file readAllFile = new FileReader(); readAllFile.onloadend = function(e) { if (e.target.readyState == FileReader.DONE) { readCustomLevels(e.target.result, verInfo); } } readAllFile.readAsText(file); } } function readCustomLevels(fileData, verInfo) { var firstNewLinePos = fileData.indexOf('\n'); var dataChecksum = 0; var levelData = fileData.substr(firstNewLinePos); //skip header for(var i = 0; i < levelData.length; i++) { dataChecksum += levelData.charCodeAt(i); } if (fileChecksum != (dataChecksum & 0xFFFF)) { displayAlertMsg("wrong file checksum"); return; } tmpCustomLevels = []; if (verInfo == '1') { // v1: level format // ------------------------------- // level map format: // // +----- startLevelPos // V // \n tile * NO_OF_TILES_X // \n tile * NO_OF_TILES_X // .... // \n tile * NO_OF_TILES_X // \n checksum // ------------------------------ var oneLevelSize = (NO_OF_TILES_X+1) * NO_OF_TILES_Y+2; // +2: checksum + '\n' if(levelData.length != totalLevels * oneLevelSize) { displayAlertMsg("wrong levels data size (1)"); return; } for(var curLevel = 0; curLevel < totalLevels; curLevel++) { var startLevelPos = curLevel * oneLevelSize + 1; // +1: skip first '\n' var curLevelMap = ''; for(var tileY = 0; tileY < NO_OF_TILES_Y; tileY++) { // (startLevelPos+1), +1 : skip \n curLevelMap += levelData.substr(startLevelPos+tileY*(NO_OF_TILES_X+1), NO_OF_TILES_X); } var checksum = levelData.charAt(startLevelPos+oneLevelSize-2); var levelChecksum = getShareChecksum(curLevelMap); if (checksum != levelChecksum) { displayAlertMsg("wrong level checksum (" + (curLevel+1) + ")"); return; } tmpCustomLevels.push(curLevelMap); } } else { // v2: level format // ----------------------------- // \n zipLevelData // \n zipLevelData // ....... // \n zipLevelData // ----------------------------- var startLevelPos = 1; // begin from pos = 1 var nextNewLinePos; var zipLevelData, curLevelMap; for(var curLevel = 0; curLevel < totalLevels; curLevel++) { nextNewLinePos = levelData.indexOf('\n', startLevelPos); if (nextNewLinePos < 0) { displayAlertMsg("wrong level data @" + (curLevel+1)); return; } curLevelMap = unzipLevelMap(levelData.substr(startLevelPos, nextNewLinePos-startLevelPos)); if (!curLevelMap) { displayAlertMsg("wrong ziplevel data @" + (curLevel+1)); return; } tmpCustomLevels.push(curLevelMap); startLevelPos = nextNewLinePos+1; } if (levelData.length != startLevelPos) { displayAlertMsg("wrong levels data size (2)"); return; } } // SUCCESS displayFileInfo(); buttonObj.alpha = 1; //enable restore button } function displayAlertMsg(errMsg) { debug(errMsg); wrongMsgEnable = 1; dialogStage.addChild(wrongText1Obj, wrongText2Obj); dialogStage.update(); } } function displayFileName(fileName) { if (fileNameObj) { dialogStage.removeChild(fileNameObj); fileNameObj = null; } if (fileName.length <= 0) { dialogStage.update(); return; } if (stringDisplayWidth(fileName) > MAX_DISPLAY_FILENAME_LEN) { fileName = cutFileName(fileName); } fileNameObj = new createjs.Text(fileName, "bold " + MSG_TEXT_SIZE + "px Helvetica", MSG_TEXT_COLOR); if(fileNameObj.getBounds().width > maxFileNameSize) { fileNameObj = new createjs.Text(fileName, "bold " + MSG_TEXT_SIZE + "px Courier New", MSG_TEXT_COLOR); } fileNameObj.x = fileNameX; fileNameObj.y = fileNameY; dialogStage.addChild(fileNameObj); dialogStage.update(); function stringDisplayWidth(str) { // 0x00-0xFF assume 1 char others assume 2 chars //reference: https://blog.typeart.cc/JavaScript計算含中英文字的字串長度/ return str.replace(/[^\x00-\xff]/g,"xx").length; } function cutFileName(str) { var oneSideSize = (MAX_DISPLAY_FILENAME_LEN - 3)/2|0; var leftName = '', rightName = ''; for(var i = 0, width=0; width < oneSideSize; i++, width++) { var charCode = str.charCodeAt(i); if (charCode <= 0xFF) { leftName += str.charAt(i); } else { if(++width < oneSideSize) { leftName += str.charAt(i); } else { break; } } } for(var i = str.length-1, width=0; width < oneSideSize; i--, width++) { var charCode = str.charCodeAt(i); if (charCode <= 0xFF) { rightName = str.charAt(i) + rightName; } else { if(++width < oneSideSize) { rightName = str.charAt(i) + rightName; } else { break; } } } return leftName + "...." + rightName; } } function addOpenButton(xOffset, yOffset) { openFolderButtonObj = new createjs.Container(); border = new createjs.Shape(); button = new createjs.Shape(); //id = 0 border.graphics.beginFill(OPENBUTTON_BACKGROUND_COLOR) .drawRoundRect(-OPENBUTTON_BORDER_SIZE, -OPENBUTTON_BORDER_SIZE, openFolderButtonX+OPENBUTTON_BORDER_SIZE*2, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2, OPENBUTTON_ROUND_RADIUD).endFill(); //id = 1 button.graphics.beginFill(OPENBUTTON_COLOR) .drawRect(-OPENBUTTON_BORDER_SIZE/3, -OPENBUTTON_BORDER_SIZE/3, openFolderButtonX+OPENBUTTON_BORDER_SIZE*2/3, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2/3).endFill(); button.alpha = 0.9; //id = 2 openFolderBitmap.setTransform(0, 0, _scale*openFolderButtonScale, _scale*openFolderButtonScale); openFolderButtonObj.x = xOffset; openFolderButtonObj.y = yOffset; openFolderButtonObj.addChild(border, button, openFolderBitmap); openFolderButtonObj.on('click', openButtonClick); openFolderButtonObj.on('mouseover', openButtonMouseOver); openFolderButtonObj.on('mouseout', openButtonMouseOut); dialogStage.addChild(openFolderButtonObj); function openButtonClick() { inputFileElement.click(); openButtonMouseOut(); } function openButtonMouseOver() { var border = openFolderButtonObj.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(OPENBUTTON_BORDER_COLOR) .drawRoundRect(-OPENBUTTON_BORDER_SIZE, -OPENBUTTON_BORDER_SIZE, openFolderButtonX+OPENBUTTON_BORDER_SIZE*2, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2, OPENBUTTON_ROUND_RADIUD).endFill(); dialogStage.cursor = 'pointer'; dialogStage.update(); } function openButtonMouseOut() { var border = openFolderButtonObj.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(OPENBUTTON_BACKGROUND_COLOR) .drawRoundRect(-OPENBUTTON_BORDER_SIZE, -OPENBUTTON_BORDER_SIZE, openFolderButtonX+OPENBUTTON_BORDER_SIZE*2, openFolderButtonY+OPENBUTTON_BORDER_SIZE*2, OPENBUTTON_ROUND_RADIUD).endFill(); dialogStage.cursor = 'default'; dialogStage.update(); } } function removePreviewMap() { for(var i=0 ; i < levelMapObjs.length; i++) { dialogStage.removeChild(levelMapObjs[i]); } for(var i=0 ; i < levelMapNoObj.length; i++) { dialogStage.removeChild(levelMapNoObj[i]); } } function disableMapButton() { prevMapButtonObj.alpha = 0; //disable next map button (hide) nextMapButtonObj.alpha = 0; //disable prev map button (hide) } function displayPreviewMap(myId=0) { var borderSize = _scale < 1?1:_scale; var scaleX = scaleY = PREVIEW_MAP_SCALE; levelMapObjs = []; levelMapNoObj = []; for(var level=previewMapFirst, i=0; level <= previewMapLast; level++, i++) { var levelMap = new createjs.Container(); var border = new createjs.Shape(); var background = new createjs.Shape(); var mapOffsetX = TITLE_TEXT_SIZE + previewMapGapX + (previewMapX+previewMapGapX) * i; levelMapNoObj[i] = new createjs.Text(("00"+(level+1)).slice(-3), "bold " + MAPNO_TEXT_SIZE + "px Helvetica", "black"); levelMapNoObj[i].x = mapOffsetX; levelMapNoObj[i].y = previewNoYOffset; levelMapNoObj[i].alpha = 0.6; dialogStage.addChild(levelMapNoObj[i]); border.graphics.beginFill("white") .drawRoundRect(-borderSize, -borderSize, previewMapX+2*borderSize, previewMapY+2*borderSize, borderSize); background.graphics.beginFill("black").drawRect(0, 0, previewMapX, previewMapY); levelMap.addChild(border, background, level2Bitmap(tmpCustomLevels[level], scaleX, scaleY)); levelMapObjs[i] = levelMap; levelMapObjs[i].x = mapOffsetX; levelMapObjs[i].y = previewMapYOffset|0; dialogStage.addChild(levelMapObjs[i]); } if (previewMapFirst <= 0) { prevMapButtonObj.alpha = 0; //disable } else prevMapButtonObj.alpha = 1; //enable if (previewMapLast+1 >= tmpCustomLevels.length) { nextMapButtonObj.alpha = 0; //disable } else nextMapButtonObj.alpha = 1; //enable dialogStage.update(); } function displayFileInfo() { var totalLevels = tmpCustomLevels.length; var levelText = totalLevels > 1? " Levels": " Level"; previewMapFirst = 0; previewMapLast = previewMapPerLine-1; if(previewMapLast+1 >= totalLevels) previewMapLast = totalLevels-1; displayPreviewMap(); totalLevelTextObj = new createjs.Text("Total: " + tmpCustomLevels.length + levelText, "bold " + TOTALLEVEL_TEXT_SIZE + "px Helvetica", "black"); totalLevelTextObj.x = (menuX-totalLevelTextObj.getBounds().width)/2|0; totalLevelTextObj.y = previewMapYOffset + previewMapY + previewMapGapX*2; totalLevelTextObj.alpha = 0.6; dialogStage.addChild(totalLevelTextObj); dialogStage.update(); } function level2Bitmap(levelMap, scaleX, scaleY) { var container = new createjs.Container(); var guardCount = 0, runner = 0; var bitmap; //-------------------------------------------- // Parser map from right-bottom to left-top // for drop guards if too manys //-------------------------------------------- var index = NO_OF_TILES_Y * NO_OF_TILES_X - 1; for(var y = NO_OF_TILES_Y-1; y >= 0; y--) { for(var x = NO_OF_TILES_X-1; x >= 0; x--) { var id = levelMap.charAt(index--); var curTile; switch(id) { default: case ' ': //empty continue; case '#': //Normal Brick curTile = getThemeBitmap("brick"); break; case '@': //Solid Brick curTile = getThemeBitmap("solid"); break; case 'H': //Ladder curTile = getThemeBitmap("ladder"); break; case '-': //Line of rope curTile = getThemeBitmap("rope"); break; case 'X': //False brick curTile = getThemeBitmap("brick"); break; case 'S': //Ladder appears at end of level continue; case '$': //Gold chest curTile = getThemeBitmap("gold"); break; case '0': //Guard if(++guardCount > MAX_NEW_GUARD) { continue; //too many guard , set this tile as empty } curTile = new createjs.Sprite(guardData, "runLeft"); curTile.stop(); break; case '&': //Player if(++runner > 1) { continue; //too many runner, set this tile as empty } curTile = new createjs.Sprite(runnerData, "runRight"); curTile.stop(); break; } curTile.setTransform(x*BASE_TILE_X*scaleX, y*BASE_TILE_Y*scaleX, scaleX, scaleY); container.addChild(curTile); } } container.cache(0, 0, previewMapX, previewMapY); bitmap = new createjs.Bitmap( container.cacheCanvas); // change "cont.getCacheDataURL()" to "cont.cacheCanvas" container.removeAllChildren(); return bitmap; } function restoreConfirm(rc) { var tmpTestInfo = {level: 1}; // "level:1" for data safe var oldEditLevels = editLevels; // 1 - if(rc) { //yes restore custom levels //------------------------------------------------------------------------------------ //(1) clear edit levels getTestLevel(tmpTestInfo); clearEditLevelInfo(); //clear edit level info clearStorage(STORAGE_USER_SCORE_INFO); //clear user score info clearTestLevel(); //clear test level initEditLevelInfo(); //(2) add levelmap to storage editLevelData = []; for(var i=0; i < tmpCustomLevels.length; i++) { setEditLevel(++editLevels, tmpCustomLevels[i]); //editLevels: 1 - MAX_EDIT_LEVEL } //(3) save edit info setEditLevelInfo(); if(tmpTestInfo.level > oldEditLevels && editLevels < MAX_EDIT_LEVEL && !levelMapIsEmpty(tmpTestInfo.levelMap)) { //still have space for save new editing level tmpTestInfo.level = editLevels+1; setTestLevel(tmpTestInfo); } //----------------------------------------------------------------------------------- restoreKeyState(); curLevel = 1; setModernInfo(); // set current level = 1 for play mode if(playMode == PLAY_EDIT) { editEdit(-1, _callBackFun); } else { editPlay(-1, _callBackFun); } } else { restoreKeyState(); if(_callBackFun) _callBackFun(); } } //restore button click function buttonClick() { removeCanvas(); removeCoverBackground(); yesNoDialog(["Warning", "Overwrite existing custom levels ?"], yesBitmap, noBitmap, mainStage, tileScale, restoreConfirm); } //restore button mouse over function buttonMouseOver() { var border = buttonObj.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER1_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE, -BUTTON_BORDER_SIZE, buttonSizeX+BUTTON_BORDER_SIZE*2, MSG_AREA_Y+BUTTON_BORDER_SIZE*2,BUTTON_ROUND_RADIUD).endFill(); buttonTextObj.shadow = new createjs.Shadow(TITLE_TEXT_SHADOW_COLOR, 2, 2, 10 ); dialogStage.cursor = 'pointer'; dialogStage.update(); } //restore button mouse out function buttonMouseOut() { var border = buttonObj.getChildAt(0); border.graphics.clear(); border.graphics.beginFill(BUTTON_BORDER0_COLOR) .drawRoundRect(-BUTTON_BORDER_SIZE/2, -BUTTON_BORDER_SIZE/2, buttonSizeX+BUTTON_BORDER_SIZE, MSG_AREA_Y+BUTTON_BORDER_SIZE, BUTTON_ROUND_RADIUD).endFill(); buttonTextObj.shadow = null; dialogStage.cursor = 'default'; dialogStage.update(); } function removeCanvas() { dialogStage.removeAllChildren(); dialogStage.enableMouseOver(0); createjs.Ticker.removeEventListener(dialogStage); document.body.removeChild(restoreCanvas); } function removeCoverBackground() { mainStage.removeChild(coverBackgroundObj); } function closeDialog() { restoreKeyState(); removeCanvas(); removeCoverBackground(); if(_callBackFun) _callBackFun(); } function handleEscKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist if(event.shiftKey || event.ctrlKey) return false; switch(event.keyCode) { case KEYCODE_ESC: closeDialog(); break; default: //debug("keycode = " + code); break; } return false; } } ================================================ FILE: lodeRunner.misc.js ================================================ //============ // MISC //============ var DEBUG = 0; var demoSoundOff = 1; function debug(string) { if(DEBUG) console.log(string); } function assert(expression, msg) { console.assert(expression, msg); } function error(string) { console.log("Error In " + error.caller.name + "( ): " + string); } function getScreenSize() { var x, y; //---------------------------------------------------------------------- // Window size and scrolling: // URL: http://www.howtocreate.co.uk/tutorials/javascript/browserwindow //---------------------------------------------------------------------- if (typeof (window.innerWidth) == 'number') { //Non-IE x = window.innerWidth; y = window.innerHeight; } else if ((document.documentElement) && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { //IE 6+ in 'standards compliant mode' x = document.documentElement.clientWidth; y = document.documentElement.clientHeight; } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { //IE 4 compatible x = document.body.clientWidth; y = document.body.clientHeight; } return {x:x, y:y}; } //================================ // show tips messgae //=============================== function showTipsMsg(_tipsTxt, _stage, _scale, _tipsTxt1) { var TEXT_SIZE = 72 * _scale; var TEXT1_SIZE = 66 * _scale; var TEXT_COLOR = "#FF2020"; var TEXT1_COLOR = "#FF2020"; var tipsText = new createjs.Text(_tipsTxt, "bold " + TEXT_SIZE + "px Helvetica", TEXT_COLOR); var screenX1 = _stage.canvas.width; var screenY1 = _stage.canvas.height; tipsText.x = (screenX1) / 2 | 0; tipsText.y = screenY1/2 - tipsText.getBounds().height*5/4 | 0; tipsText.shadow = new createjs.Shadow("white", 3, 3, 2); tipsText.textAlign = "center"; _stage.addChild(tipsText); createjs.Tween.get(tipsText).set({alpha:1}).wait(50).to({scaleX:1.2, scaleY:1.2, alpha:0}, 3500) .call(function(){_stage.removeChild(tipsText);}); if(_tipsTxt1 != null) { // two tips var tipsText1 = new createjs.Text(_tipsTxt1, "bold " + TEXT1_SIZE + "px Helvetica", TEXT1_COLOR); tipsText1.x = (screenX1) / 2 | 0; tipsText1.y = screenY1/2 | 0; tipsText1.shadow = new createjs.Shadow("white", 3, 3, 2); tipsText1.textAlign = "center"; _stage.addChild(tipsText1); createjs.Tween.get(tipsText1).set({alpha:1}).wait(50).to({scaleX:1.2, scaleY:1.2, alpha:0}, 3500) .call(function(){_stage.removeChild(tipsText1);}); } } //========================================== // move z-index to top for a child of stage //========================================== function moveChild2Top(stage, obj) { stage.setChildIndex(obj, stage.getNumChildren() - 1); } //========================== // BEGIN for Sound function //========================== var soundOff = 0; function themeSoundPlay(name) { soundPlay(name + curTheme); } function soundDisable() { if(playMode == PLAY_AUTO) return 1; if(playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) return demoSoundOff; else return soundOff; } function soundPlay(name) { if(soundDisable()) return; if(typeof name == "string") { return createjs.Sound.play(name); } else { name.stop(); //12/21/2014 , for support soundJS 0.6.0 name.play(); } } function soundStop(name) { if(typeof name == "string") { return createjs.Sound.stop(name); } else { name.stop(); } } function soundPause(name) { if(soundDisable()) return; if(typeof name == "string") { return createjs.Sound.pause(name); } else { name.paused=true; //SoundJS 0.6.2 API Changed, 8/28/2016 } } function soundResume(name) { if(soundDisable()) return; if(typeof name == "string") { return createjs.Sound.resume(name); } else { name.paused=false; //SoundJS 0.6.2 API Changed, 8/28/2016 } } //============================== // get time zone for php format //============================== function phpTimeZone() { var d = new Date() var n = d.getTimezoneOffset(); var n1 = Math.abs(n); //------------------------------------------------------------------------------------ // AJAX POST and Plus Sign ( + ) — How to Encode: // Use encodeURIComponent() in JS and in PHP you should receive the correct values. // http://stackoverflow.com/questions/1373414/ajax-post-and-plus-sign-how-to-encode //------------------------------------------------------------------------------------ //+0:00, +1:00, +8:00, -8:00 .... return ((n <=0)?encodeURIComponent("+"):"-")+ (n1/60|0) + ":" + ("0"+n1%60).slice(-2); } //======================================== // get local time (YYYY-MM-DD HH:MM:SS) //======================================== function getLocalTime(d) { if (d == null) d = new Date(); return (("000"+d.getFullYear()).slice(-4)+ "-" +("0"+(d.getMonth() + 1)).slice(-2)+ "-" +("0"+d.getDate()).slice(-2)+ " " + ("0"+d.getHours()).slice(-2) + ":" + ("0"+d.getMinutes()).slice(-2) + ":" + ("0"+d.getSeconds()).slice(-2)); } // ====================================================================== // return format : "2021-06-08 12:09:08 GMT+0800 (Taipei Standard Time)" // ====================================================================== function getLocalTimeZone(d) { if (d == null) d = new Date(); var dString = d.toString(); // format: "Tue Jun 08 2021 12:09:08 GMT+0800 (台北標準時間)" var dGMTOffset = dString.indexOf('GMT'); var dGMT = "" if(dGMTOffset >= 0) dGMT = ' ' + dString.substr(dGMTOffset); return getLocalTime(d) + dGMT; } //=============== // Random Object //=============== function rangeRandom(minValue, maxValue, seedValue) { var rndList, idx, items; var min, max; var reset; var seed = 0; function rndStart() { var swapId, tmp; rndList = []; for(var i = 0; i < items; i++) rndList[i] = min + i; for(var i = 0; i < items; i++) { if(seedValue > 0) { seed = seedValue; swapId = (seedRandom() * items) | 0; } else { swapId = (Math.random() * items) | 0; } tmp = rndList[i]; rndList[i] = rndList[swapId]; rndList[swapId] = tmp; } idx = 0; //debug(rndList); } function seedRandom() { var x = Math.sin(seed++) * 10000; return x - Math.floor(x); } this.get = function () { if( idx >= items) { rndStart(); reset = 1; } else { reset = 0; } return rndList[idx++]; } this.rndReset = function () { return reset; } //--------- // initial //--------- reset = 0; min = minValue; max = maxValue; if(min > max) { //swap var tmp; tmp = min; min = max; max = tmp; } items = max - min + 1; rndStart(); } //====================================== // get demo data by playData (wData.js) //====================================== function getDemoData(playData) { wDemoData = []; switch(playData) { case 1: if( typeof wfastDemoData1 !== "undefined" ) wDemoData = wfastDemoData1; break; case 2: if( typeof wfastDemoData2 !== "undefined" ) wDemoData = wfastDemoData2; break; case 3: if( typeof wfastDemoData3 !== "undefined" ) wDemoData = wfastDemoData3; break; case 4: if( typeof wfastDemoData4 !== "undefined" ) wDemoData = wfastDemoData4; break; case 5: if( typeof wfastDemoData5 !== "undefined" ) wDemoData = wfastDemoData5; break; } for(var i = 0; i < wDemoData.length; i++) { //temp playerDemoData[wDemoData[i].level-1] = wDemoData[i]; } } //=========================================================================== // Chrome 66 policy changes default mute autoplay, need resume it // https://developers.google.com/web/updates/2017/09/autoplay-policy-changes // // Reference: https://github.com/CreateJS/SoundJS/issues/297 //=========================================================================== function resumeAudioContext() { // handler for fixing suspended audio context in Chrome //------------------------------------------------------------------ // Error Msgs: // "The AudioContext was not allowed to start. // It must be resume (or created) after a user gesture on the page. // https://goo.gl/7K7WLu" //------------------------------------------------------------------ try { if (createjs.WebAudioPlugin.context.state === "suspended") { createjs.WebAudioPlugin.context.resume(); console.log("Resume Web Audio context..."); } } catch (e) { // SoundJS context or web audio plugin may not exist console.error("There was an error while trying to resume the SoundJS Web Audio context..."); console.error(e); } } ================================================ FILE: lodeRunner.preload.js ================================================ var RUNNER_SPEED = 0.65; var DIG_SPEED = 0.68; //for support champLevel, change DIG_SPEED and FILL_SPEED, 2014/04/12 var FILL_SPEED = 0.24; var GUARD_SPEED = 0.3; var FLASH_SPEED = 0.25; //for flash cursor (hi-score input mode) var COVER_PROGRESS_BAR_H = 32; var COVER_PROGRESS_UNDER_Y = 90; var COVER_RUNNER_UNDER_Y = 136; var COVER_SIDE_X = 56; var SIGNET_UNDER_X = 30; var SIGNET_UNDER_Y = 30; //********************* // preload cover page //********************* var coverBitmap, titleBackground, remakeBitmap, signetBitmap; var helpObj, helpBitmap, editHelpBitmap; var mainMenuIconBitmap, mainMenuIconObj; var selectIconBitmap, selectIconObj; var demoIconBitmap, demoIconObj; var pasteIconBitmap, pasteIconObj; // paste icon var soundOnIconBitmap, soundOffIconBitmap, soundIconObj; var helpIconBitmap, helpIconObj; var infoObj, infoIconBitmap, infoIconObj; var repeatActionOnIconBitmap, repeatActionOffIconBitmap, repeatActionIconObj; var apple2IconBitmap, C64IconBitmap, themeIconObj, themeColorObj; var checkBitmap; var returnBitmap, select1Bitmap, nextBitmap; var openFolderBitmap; // for restore custom levels var nextMapBitmap, prevMapBitmap; // for restore custom levels var yesBitmap, noBitmap; var coverPageLoad; var noCache = "?" + VERSION+ ".1051230"; function showLoadingPage() { var coverPageImages = [ { src: "image/cover.png"+noCache, id: "cover" }, { src: themeImagePath + THEME_APPLE2 + "/runner.png"+noCache, id: "runner" } ]; coverPageLoad = new createjs.LoadQueue(true); coverPageLoad.on("error", handleCoverPageError); coverPageLoad.on("fileload", handleCoverPageFileLoad); coverPageLoad.on("complete", handleCoverPageComplete); coverPageLoad.loadManifest(coverPageImages); function handleCoverPageError(e) { console.log("error", e); } function handleCoverPageFileLoad(e) { switch(e.item.id) { case "cover": addCover2Screen(e.result); break; case "runner": createRunnerSpriteSheet(e.result); break; } } function handleCoverPageComplete(e) { preloadResource(); } function addCover2Screen(image) { coverBitmap = new createjs.Bitmap(image); coverBitmap.setTransform(0, 0, tileScale, tileScale); //x,y, scaleX, scaleY addTitleBackground(coverBitmap.getBounds().width*tileScale|0, coverBitmap.getBounds().height*tileScale|0); mainStage.addChild(coverBitmap); mainStage.update(); } function addTitleBackground(width, height) { titleBackground = new createjs.Shape(); titleBackground.graphics.beginFill("white").drawRect(0, 0, width, height); mainStage.addChild(titleBackground); } } function createRunnerSpriteSheet(runnerImage) { runnerData = new createjs.SpriteSheet({ images: [runnerImage], frames: { regX:0, height: BASE_TILE_Y, regY:0, width: BASE_TILE_X}, animations: { runRight: [0,2, "runRight", RUNNER_SPEED], runLeft : [3,5, "runLeft", RUNNER_SPEED], runUpDn : [6,7, "runUpDn", RUNNER_SPEED], barRight: { frames: [ 18, 19, 19, 20, 20 ], next: "barRight", speed: RUNNER_SPEED }, barLeft: { frames: [ 21, 22, 22, 23, 23 ], next: "barLeft", speed: RUNNER_SPEED }, digRight: 24, digLeft : 25, fallRight : 8, fallLeft: 26 } }); } //***************************************************************************** //BEGIN of preload //***************************************************************************** var preload; //preload resource object var firstPlay = 0; var runnerData; var guardData = {}, redhatData = {}; var holeData, holeObj = {}; var textData; var countryFlagData; var soundFall, soundDig, soundPass, soundEnding; var themeImagePath = "image/Theme/"; var themeSoundPath = "sound/Theme/"; function preloadResource() { var runnerSprite = new createjs.Sprite(runnerData, "runRight"); var progress = new createjs.Shape(); var progressBorder = new createjs.Shape(); var percentTxt = new createjs.Text("0", (COVER_PROGRESS_BAR_H* tileScale) + "px Arial", "#FF0000"); var resource = [ { src: "image/remake.png"+noCache, id: "remake" }, { src: "image/signet.png"+noCache, id: "signet" }, { src: themeImagePath + THEME_APPLE2 + "/empty.png"+noCache, id: "empty" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/brick.png"+noCache, id: "brick" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/block.png"+noCache, id: "solid" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/ladder.png"+noCache, id: "ladder" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/rope.png"+noCache, id: "rope" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/trap.png"+noCache, id: "trapBrick" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/hladder.png"+noCache, id: "hladder" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/gold.png"+noCache, id: "gold" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/guard1.png"+noCache, id: "guard1" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/runner1.png"+noCache, id: "runner1" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/runner.png"+noCache, id: "runner" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/guard.png"+noCache, id: "guard" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/redhat.png"+noCache, id: "redhat" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/hole.png"+noCache, id: "hole" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/ground.png"+noCache, id: "ground" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/over.png"+noCache, id: "over" + THEME_APPLE2 }, { src: themeImagePath + THEME_APPLE2 + "/text.png"+noCache, id: "text" + THEME_APPLE2 }, { src: themeImagePath + THEME_C64 + "/empty.png"+noCache, id: "empty" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/brick.png"+noCache, id: "brick" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/block.png"+noCache, id: "solid" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/ladder.png"+noCache, id: "ladder" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/rope.png"+noCache, id: "rope" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/trap.png"+noCache, id: "trapBrick" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/hladder.png"+noCache, id: "hladder" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/gold.png"+noCache, id: "gold" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/guard1.png"+noCache, id: "guard1" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/runner1.png"+noCache, id: "runner1" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/runner.png"+noCache, id: "runner" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/guard.png"+noCache, id: "guard" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/redhat.png"+noCache, id: "redhat" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/hole.png"+noCache, id: "hole" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/ground.png"+noCache, id: "ground" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/over.png"+noCache, id: "over" + THEME_C64 }, { src: themeImagePath + THEME_C64 + "/text.png"+noCache, id: "text" + THEME_C64 }, { src: "image/eraser.png"+noCache, id: "eraser" }, { src: "image/help.png"+noCache, id: "help" }, { src: "image/editHelp.png"+noCache,id: "editHelp" }, { src: "image/menu.png"+noCache, id: "menu" }, { src: "image/select.png"+noCache, id: "select" }, { src: "image/check.png"+noCache, id: "check" }, //check icon for select menu { src: "image/return.png"+noCache, id: "return" }, { src: "image/select1.png"+noCache, id: "select1" }, { src: "image/next.png"+noCache, id: "next" }, { src: "image/openFolder.png"+noCache, id: "openFolder" }, //05/17/2021 { src: "image/nextMap.png"+noCache, id: "nextMap" }, //05/21/2021 { src: "image/prevMap.png"+noCache, id: "prevMap" }, //05/21/2021 { src: "image/yes.png"+noCache, id: "yes" }, { src: "image/no.png"+noCache, id: "no" }, { src: "image/demo.png"+noCache,id: "demo" }, { src: "image/paste.png"+noCache,id: "paste" }, //04/23/2021 { src: "image/soundOn.png"+noCache, id: "soundOn" }, { src: "image/soundOff.png"+noCache, id: "soundOff" }, { src: "image/infoIcon.png"+noCache, id: "infoIcon" }, { src: "image/helpIcon.png"+noCache, id: "helpIcon" }, { src: "image/repeatOn.png"+noCache, id: "repeatOn" }, { src: "image/repeatOff.png"+noCache, id: "repeatOff" }, { src: "image/apple2.png"+noCache, id: "apple2" }, { src: "image/commodore64.png"+noCache,id: "C64" }, { src: "image/flags32.png"+noCache, id: "flag" }, { src: themeSoundPath + THEME_APPLE2 + "/born.ogg"+noCache, id:"reborn" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/dead.ogg"+noCache, id:"dead" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/dig.ogg"+noCache, id:"dig" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/getGold.ogg"+noCache, id:"getGold" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/fall.ogg"+noCache, id:"fall" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/down.ogg"+noCache, id:"down" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/pass.ogg"+noCache, id:"pass" + THEME_APPLE2}, { src: themeSoundPath + THEME_APPLE2 + "/trap.ogg"+noCache, id:"trap" + THEME_APPLE2}, { src: themeSoundPath + THEME_C64 + "/born.ogg"+noCache, id:"reborn" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/dead.ogg"+noCache, id:"dead" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/dig.ogg"+noCache, id:"dig" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/getGold.ogg"+noCache, id:"getGold" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/fall.ogg"+noCache, id:"fall" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/down.ogg"+noCache, id:"down" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/pass.ogg"+noCache, id:"pass" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/trap.ogg"+noCache, id:"trap" + THEME_C64}, { src: themeSoundPath + THEME_C64 + "/goldFinish1.ogg"+noCache, id:"goldFinish1"}, { src: themeSoundPath + THEME_C64 + "/goldFinish2.ogg"+noCache, id:"goldFinish2"}, { src: themeSoundPath + THEME_C64 + "/goldFinish3.ogg"+noCache, id:"goldFinish3"}, { src: themeSoundPath + THEME_C64 + "/goldFinish4.ogg"+noCache, id:"goldFinish4"}, { src: themeSoundPath + THEME_C64 + "/goldFinish5.ogg"+noCache, id:"goldFinish5"}, { src: themeSoundPath + THEME_C64 + "/goldFinish6.ogg"+noCache, id:"goldFinish6"}, { src: "sound/goldFinish.ogg"+noCache, id:"goldFinish"}, { src: "sound/ending.ogg"+noCache, id:"ending"}, { src: "sound/scoreBell.ogg"+noCache, id:"scoreBell"}, { src: "sound/scoreCount.ogg"+noCache, id:"scoreCount"}, { src: "sound/scoreEnding.ogg"+noCache, id:"scoreEnding"}, { src: "sound/beep.ogg"+noCache, id:"beep"}, { src: "cursor/openhand.cur"+noCache, id:"openHand"}, //preload cursor { src: "cursor/closedhand.cur"+noCache, id:"closeHand"} ]; preload = new createjs.LoadQueue(true); createjs.Sound.alternateExtensions = ["mp3"]; preload.installPlugin(createjs.Sound); preload.on("error", handleFileError); preload.on("progress", handleProgress); preload.on("complete", handleComplete); preload.loadManifest(resource); createjs.Ticker.setFPS(30); var preloadTicker = createjs.Ticker.on("tick", mainStage); //Set runner sprite size & position runnerSprite.setTransform(COVER_SIDE_X* tileScale, (BASE_SCREEN_Y - COVER_RUNNER_UNDER_Y)* tileScale, tileScale, tileScale); runnerSprite.gotoAndPlay(); var width = canvas.width - 2*COVER_SIDE_X* tileScale; var height = COVER_PROGRESS_BAR_H * tileScale; //Set progress & progressborder size & position progressBorder.graphics.beginStroke("gold").drawRect(0,0,width,height); progress.x = progressBorder.x = COVER_SIDE_X * tileScale; progress.y = progressBorder.y = (BASE_SCREEN_Y - COVER_PROGRESS_UNDER_Y) * tileScale; //Set percentTxt position percentTxt.x = (canvas.width - percentTxt.getBounds().width) / 2 | 0; percentTxt.y = (BASE_SCREEN_Y - COVER_PROGRESS_UNDER_Y) * tileScale + height/12; // move percent number Lower mainStage.addChild(runnerSprite, progress, progressBorder, percentTxt); function handleFileError(event) { console.log("error", event); } function handleProgress(event) { progress.graphics.clear(); progress.graphics.beginFill("gold").drawRect(0,0,width*(event.loaded / event.total),height); percentTxt.text = (100*(event.loaded / event.total)|0) + "%"; percentTxt.x = (canvas.width - percentTxt.getBounds().width) / 2 | 0; } function handleComplete(event) { percentTxt.text = "100%"; mainStage.update(); createSoundInstance(); createBaseBitmapInstance(); //9/1/2016 setTimeout(clearLoadingInfo, 500); } function clearLoadingInfo() { mainStage.removeChild(runnerSprite, progress, progressBorder, percentTxt); colorTitleBackground(); showSignetBitmap(); mainStage.addChild(signetBitmap); showRemakeBitmap(); mainStage.addChild(remakeBitmap); mainStage.update(); } //change title color to rainbow gradient color function colorTitleBackground() { var width = coverBitmap.getBounds().width*tileScale|0; var height = coverBitmap.getBounds().height*tileScale|0; //rainbow gradient color titleBackground.graphics .clear().beginLinearGradientFill( //https://simple.wikipedia.org/wiki/Rainbow ["#FF0000", "#FF7F00", "#FFFF00", "#00FF00", "#0000FF", "#4B0082", "#8B00FF"], [0, .14, .28, .42, .56, .70, .84, .98], 0, height/5,width*6/5,height*2/5) .drawRect(0, 0, width, height); } function showSignetBitmap() { var x, y; signetBitmap = new createjs.Bitmap(preload.getResult("signet")); x = (BASE_SCREEN_X - SIGNET_UNDER_X - signetBitmap.getBounds().width )* tileScale; y = (BASE_SCREEN_Y - SIGNET_UNDER_Y - signetBitmap.getBounds().height)* tileScale; signetBitmap.setTransform(x, y, tileScale, tileScale); //x,y, scaleX, scaleY signetBitmap.set({alpha:0.8}); createjs.Tween.get(signetBitmap).set({alpha:0.8}).to({alpha:1}, 500); } //create remake image function showRemakeBitmap() { var x = 372 * tileScale; var y = 130 * tileScale; remakeBitmap = new createjs.Bitmap(preload.getResult("remake")); remakeBitmap.setTransform(x, y, tileScale, tileScale); //x,y, scaleX, scaleY remakeBitmap.rotation = -5; remakeBitmap.set({alpha:0.6}); createjs.Tween.get(remakeBitmap).set({alpha:0.6}).to({alpha:1}, 800).call(preloadComplet); } function createHelpObj() { helpBitmap = new createjs.Bitmap(preload.getResult("help")); editHelpBitmap = new createjs.Bitmap(preload.getResult("editHelp")); //demoHelpBitmap = new createjs.Bitmap(preload.getResult("demoHelp")); //replace by infoMenu, 5/14/2015 helpObj = new helpMenuClass(mainStage, helpBitmap, editHelpBitmap, tileScale); } function createMenuBitmapIcon() { mainMenuIconBitmap = new createjs.Bitmap(preload.getResult("menu")); mainMenuIconObj = new mainMenuIconClass(screenX1, screenY1, tileScale, mainMenuIconBitmap); selectIconBitmap = new createjs.Bitmap(preload.getResult("select")); selectIconObj = new selectIconClass(screenX1, screenY1, tileScale, selectIconBitmap); demoIconBitmap = new createjs.Bitmap(preload.getResult("demo")); //04/18/2015 demoIconObj = new demoIconClass(screenX1, screenY1, tileScale, demoIconBitmap); pasteIconBitmap = new createjs.Bitmap(preload.getResult("paste")); //04/23/2021 pasteIconObj = new pasteIconClass(screenX1, screenY1, tileScale, pasteIconBitmap); soundOnIconBitmap = new createjs.Bitmap(preload.getResult("soundOn")); //04/18/2015 soundOffIconBitmap = new createjs.Bitmap(preload.getResult("soundOff")); soundIconObj = new soundIconClass(screenX1, screenY1, tileScale, soundOnIconBitmap, soundOffIconBitmap); infoIconBitmap = new createjs.Bitmap(preload.getResult("infoIcon")); //05/12/2015 infoIconObj = new infoIconClass(screenX1, screenY1, tileScale, infoIconBitmap); infoObj = new infoMenuClass(mainStage, tileScale); helpIconBitmap = new createjs.Bitmap(preload.getResult("helpIcon")); //04/21/2015 helpIconObj = new helpIconClass(screenX1, screenY1, tileScale, helpIconBitmap); repeatActionOnIconBitmap = new createjs.Bitmap(preload.getResult("repeatOn")); //05/17/2015 repeatActionOffIconBitmap = new createjs.Bitmap(preload.getResult("repeatOff")); repeatActionIconObj = new repeatActionIconClass(screenX1, screenY1, tileScale, repeatActionOnIconBitmap, repeatActionOffIconBitmap); apple2IconBitmap = new createjs.Bitmap(preload.getResult("apple2")); //04/18/2015 C64IconBitmap = new createjs.Bitmap(preload.getResult("C64")); themeIconObj = new themeIconClass(screenX1, screenY1, tileScale, apple2IconBitmap, C64IconBitmap); themeColorObj = new colorSelectorClass(screenX1, screenY1, tileWScale); checkBitmap = new createjs.Bitmap(preload.getResult("check")); returnBitmap = new createjs.Bitmap(preload.getResult("return")); select1Bitmap = new createjs.Bitmap(preload.getResult("select1")); nextBitmap = new createjs.Bitmap(preload.getResult("next")); openFolderBitmap = new createjs.Bitmap(preload.getResult("openFolder")); // for restore custom levels nextMapBitmap = new createjs.Bitmap(preload.getResult("nextMap")); // for restore custom levels prevMapBitmap = new createjs.Bitmap(preload.getResult("prevMap")); yesBitmap = new createjs.Bitmap(preload.getResult("yes")); noBitmap = new createjs.Bitmap(preload.getResult("no")); } function preloadComplet() { createHelpObj(); createMenuBitmapIcon(); getFirstPlayInfo(); createjs.Ticker.off("tick", preloadTicker); //remove ticker of cover page waitIdleDemo(4000); //wait user key or show demo level } } function createSoundInstance() { soundFall = createjs.Sound.createInstance("fall" + curTheme); soundDig = createjs.Sound.createInstance("dig" + curTheme); soundPass = createjs.Sound.createInstance("pass" + curTheme); soundEnding = createjs.Sound.createInstance("ending"); //for training mode only } //============================== // support different AI-version //============================== var spriteSpeed = [ { runnerSpeed: 0.65, guardSpeed: 0.3, digSpeed: 0.68, fillSpeed: 0.24, xMoveBase: 8, yMoveBase: 8 }, //ver 1 { runnerSpeed: 0.70, guardSpeed: 0.35, digSpeed: 0.68, fillSpeed: 0.27, xMoveBase: 8, yMoveBase: 9 }, //ver 2 { runnerSpeed: 0.8, guardSpeed: 0.4, digSpeed: 1, fillSpeed: 1, xMoveBase: 8, yMoveBase: 9 } //ver 3 & 4 ]; var curAiVersion = AI_VERSION; var maxGuard = MAX_NEW_GUARD; function setSpeedByAiVersion() { var idx = (curAiVersion > spriteSpeed.length)?(spriteSpeed.length-1):(curAiVersion-1); //array index don't overflow var speedObj = spriteSpeed[idx]; RUNNER_SPEED = speedObj.runnerSpeed; GUARD_SPEED = speedObj.guardSpeed; DIG_SPEED = speedObj.digSpeed; FILL_SPEED = speedObj.fillSpeed; xMove = speedObj.xMoveBase; yMove = speedObj.yMoveBase; //------------------------------------------------------------------------------------ // Change move policy for support LR FAN BOOK with one guard // Original policy for one guard is [0, 1, 1] ==> 2/3 speed of runner // while AI_VERSION >= 3 change policy to [ 0, 1, 0, 1, 0, 1 ] ==> 1/2 speed of runner //------------------------------------------------------------------------------------ if(curAiVersion < 3) { movePolicy[1] = [0, 1, 1, 0, 1, 1]; maxGuard = MAX_OLD_GUARD; } else { movePolicy[1] = [0, 1, 0, 1, 0, 1]; //slow down the guard when only one guard maxGuard = MAX_NEW_GUARD; //change max guard } themeDataReset(1); //4/16/2015 createHoleObj(); //6/27/2016 } function themeDataReset(resetAll) { if(resetAll) createSoundInstance(); //Base on current theme createSpriteSheet(); //Base on theme & Ai Version } function createSpriteSheet() { //createRunnerSpriteSheet(coverPageLoad.getResult("runner")); createRunnerSpriteSheet(getThemeBitmap("runner").image); createPreloadSpriteSheet(); createFlagSpriteSheet(); } function createPreloadSpriteSheet() { guardData = createGuardObj("guard"); redhatData = createGuardObj("redhat"); holeData = new createjs.SpriteSheet( { images: [getThemeBitmap("hole").image], frames: [ //dig hole Left [BASE_TILE_X*0,0,BASE_TILE_X,BASE_TILE_Y*2], //0 [x,y, width, height] [BASE_TILE_X*1,0,BASE_TILE_X,BASE_TILE_Y*2], //1 [BASE_TILE_X*2,0,BASE_TILE_X,BASE_TILE_Y*2], //2 [BASE_TILE_X*3,0,BASE_TILE_X,BASE_TILE_Y*2], //3 [BASE_TILE_X*4,0,BASE_TILE_X,BASE_TILE_Y*2], //4 [BASE_TILE_X*5,0,BASE_TILE_X,BASE_TILE_Y*2], //5 [BASE_TILE_X*6,0,BASE_TILE_X,BASE_TILE_Y*2], //6 [BASE_TILE_X*7,0,BASE_TILE_X,BASE_TILE_Y*2], //7 //dig hole right [BASE_TILE_X*0,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //08 [BASE_TILE_X*1,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //09 [BASE_TILE_X*2,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //10 [BASE_TILE_X*3,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //11 [BASE_TILE_X*4,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //12 [BASE_TILE_X*5,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //13 [BASE_TILE_X*6,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //14 [BASE_TILE_X*7,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y*2], //15 //fill hole [BASE_TILE_X*7,BASE_TILE_Y*2,BASE_TILE_X,BASE_TILE_Y], //16 [BASE_TILE_X*8,BASE_TILE_Y, BASE_TILE_X,BASE_TILE_Y], //17 [BASE_TILE_X*8,0, BASE_TILE_X,BASE_TILE_Y], //18 [BASE_TILE_X*8,BASE_TILE_Y*3,BASE_TILE_X,BASE_TILE_Y] //19 ], animations: { digHoleLeft: [0, 7, false, DIG_SPEED], digHoleRight: [8,15, false, DIG_SPEED], fillHole: { frames: [16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 18, 18, 19 ], //delay fill time for champLevel, 2014/04/12 next: false, speed: FILL_SPEED } } }); textData = new createjs.SpriteSheet({ images: [getThemeBitmap("text").image], frames: {regX:0, height: BASE_TILE_Y, regY: 0, width: BASE_TILE_X}, animations: { "N0": 0, "N1": 1, "N2": 2, "N3": 3, "N4": 4, "N5": 5, "N6": 6, "N7": 7, "N8": 8, "N9": 9, "A": 10, "B": 11, "C": 12, "D": 13, "E": 14, "F": 15, "G": 16, "H": 17, "I": 18, "J": 19, "K": 20, "L": 21, "M": 22, "N": 23, "O": 24, "P": 25, "Q": 26, "R": 27, "S": 28, "T": 29, "U": 30, "V": 31, "W": 32, "X": 33, "Y": 34, "Z": 35, "DOT": 36, "LT": 37, "GT": 38, "DASH": 39, "@":40, //gold "#":41, //trap "FLASH": { //42 & 43 frames: [42, 42, 43, 43], next: "FLASH", speed: FLASH_SPEED }, "SPACE":43, "COLON":44, "UNDERLINE": 45, "D0": 50, "D1": 51, "D2": 52, "D3": 53, "D4": 54, //blue digit number for player name, 11/17/2014 "D5": 55, "D6": 56, "D7": 57, "D8": 58, "D9": 59 } }); } function createGuardObj(imageName) { var guard = new createjs.SpriteSheet( { images: [getThemeBitmap(imageName).image], frames: {regX:0, height: BASE_TILE_Y, regY: 0, width: BASE_TILE_X}, animations: { runRight: [0,2, "runRight", GUARD_SPEED], runLeft : [3,5, "runLeft", GUARD_SPEED], runUpDn : [6,7, "runUpDn", GUARD_SPEED], barRight: { frames: [ 22, 23, 23, 24, 24 ], next: "barRight", speed: GUARD_SPEED }, barLeft: { frames: [ 25, 26, 26, 27, 27 ], next: "barLeft", speed: GUARD_SPEED }, reborn: { frames: [ 28, 28, 29 ], //if change frame idx, don't forgot change "rebornFrame" speed: GUARD_SPEED }, fallRight : 8, fallLeft: 30, shakeRight: { frames: [ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 10, 9, 10, 8 ], next: null, speed: GUARD_SPEED }, shakeLeft: { frames: [ 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 32, 31, 32, 30], next: null, speed: GUARD_SPEED } } }); return guard; } function createHoleObj() { holeObj.sprite = new createjs.Sprite(holeData, "digHoleLeft"); if(curAiVersion < 3) { holeObj.digLimit = 6; //for check guard is close to runner when digging } else { holeObj.digLimit = 8; //for check guard is close to runner when digging } holeObj.action = ACT_STOP; //no digging } //======================================= // country flag for demo info 5/14/2015 //======================================= function createFlagSpriteSheet() { countryFlagData = new createjs.SpriteSheet({ images: [preload.getResult("flag")], frames: {regX:0, height: 32, regY: 0, width: 32}, animations: countryId }); } ================================================ FILE: lodeRunner.runner.js ================================================ //============================================================================= // AI reference book: "玩 Lode Runner 學 C 語言" // http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538 //============================================================================= var STATE_OK_TO_MOVE = 1, STATE_FALLING = 2; function moveRunner() { var x = runner.pos.x; var xOffset = runner.pos.xOffset; var y = runner.pos.y; var yOffset = runner.pos.yOffset; var curState; var curToken, nextToken; curToken = map[x][y].base; if ( curToken == LADDR_T || (curToken == BAR_T && yOffset == 0) ) { //ladder & bar curState = STATE_OK_TO_MOVE; //ok to move (on ladder or bar) } else if (yOffset < 0) { //no ladder && yOffset < 0 ==> falling curState = STATE_FALLING; } else if (y < maxTileY) { //no laddr && y < maxTileY && yOffset >= 0 nextToken = map[x][y+1].act; switch (true) { case (nextToken == EMPTY_T): curState = STATE_FALLING; break; case ( nextToken == BLOCK_T || nextToken == LADDR_T || nextToken == SOLID_T): curState = STATE_OK_TO_MOVE; break; case ( nextToken == GUARD_T): curState = STATE_OK_TO_MOVE; break; default: curState = STATE_FALLING; break; } } else { // no laddr && y == maxTileY curState = STATE_OK_TO_MOVE; } if ( curState == STATE_FALLING ) { stayCurrPos = ( y >= maxTileY || (nextToken = map[x][y+1].act) == BLOCK_T || nextToken == SOLID_T || nextToken == GUARD_T); runnerMoveStep(ACT_FALL, stayCurrPos); return; } /****** Check Key Action ******/ var moveStep = ACT_STOP; var stayCurrPos = 1; switch(keyAction) { case ACT_UP: stayCurrPos = ( y <= 0 || ( nextToken = map[x][y-1].act) == BLOCK_T || nextToken == SOLID_T || nextToken == TRAP_T ); if (y > 0 && map[x][y].base != LADDR_T && yOffset < H4 && yOffset > 0 && map[x][y+1].base == LADDR_T) { stayCurrPos = 1; moveStep = ACT_UP; } else if (!( map[x][y].base != LADDR_T && (yOffset <= 0 || map[x][y+1].base != LADDR_T) || (yOffset <= 0 && stayCurrPos ) ) ) { moveStep = ACT_UP; } break; case ACT_DOWN: stayCurrPos = ( y >= maxTileY || (nextToken = map[x][y+1].act) == BLOCK_T || nextToken == SOLID_T); if (!(yOffset >= 0 && stayCurrPos)) moveStep = ACT_DOWN; break; case ACT_LEFT: stayCurrPos = ( x <= 0 || (nextToken = map[x-1][y].act) == BLOCK_T || nextToken == SOLID_T || nextToken == TRAP_T); if (!(xOffset <= 0 && stayCurrPos)) moveStep = ACT_LEFT; break; case ACT_RIGHT: stayCurrPos = ( x >= maxTileX || (nextToken = map[x+1][y].act) == BLOCK_T || nextToken == SOLID_T || nextToken == TRAP_T); if (!(xOffset >= 0 && stayCurrPos)) moveStep = ACT_RIGHT; break; case ACT_DIG_LEFT: case ACT_DIG_RIGHT: if(ok2Dig(keyAction)) { runnerMoveStep(keyAction, stayCurrPos); digHole(keyAction); } else { runnerMoveStep(ACT_STOP, stayCurrPos); } keyAction = ACT_STOP; return; } runnerMoveStep(moveStep, stayCurrPos); } function runnerMoveStep(action, stayCurrPos ) { var x = runner.pos.x; var xOffset = runner.pos.xOffset; var y = runner.pos.y; var yOffset = runner.pos.yOffset; var curToken, nextToken, centerX, centerY; var curShape, newShape; curShape = newShape = runner.shape; centerX = centerY = ACT_STOP; switch(action) { case ACT_DIG_LEFT: case ACT_DIG_RIGHT: xOffset = 0; yOffset = 0; break; case ACT_UP: case ACT_DOWN: case ACT_FALL: if ( xOffset > 0 ) centerX = ACT_LEFT; else if (xOffset < 0) centerX = ACT_RIGHT; break; case ACT_LEFT: case ACT_RIGHT: if( yOffset > 0 ) centerY = ACT_UP; else if (yOffset < 0) centerY = ACT_DOWN; break; } curToken = map[x][y].base; if ( action == ACT_UP ) { yOffset -= yMove; if(stayCurrPos && yOffset < 0) yOffset = 0; //stay on current position else if(yOffset < -H2) { //move to y-1 position if ( curToken == BLOCK_T || curToken == HLADR_T ) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x][y-1], so set [x][y].act to previous state y--; yOffset = tileH + yOffset; if(map[x][y].act == GUARD_T && guardAlive(x,y)) setRunnerDead(); //collision } newShape = "runUpDn"; } if ( centerY == ACT_UP ) { yOffset -= yMove; if( yOffset < 0) yOffset = 0; //move to center Y } if ( action == ACT_DOWN || action == ACT_FALL) { var holdOnBar = 0; if(curToken == BAR_T) { if( yOffset < 0) holdOnBar = 1; else { //when runner with bar and press down will into falling state // except "laddr" or "guard" at below, 11/25/2016 if(action == ACT_DOWN && y < maxTileY && map[x][y+1].act != LADDR_T && map[x][y+1].act != GUARD_T) { action = ACT_FALL; } } } yOffset += yMove; if(holdOnBar == 1 && yOffset >= 0) { yOffset = 0; //fall and hold on bar action = ACT_FALL_BAR; } if(stayCurrPos && yOffset > 0) yOffset = 0; //stay on current position else if(yOffset > H2) { //move to y+1 position if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x][y+1], so set [x][y].act to previous state y++; yOffset = yOffset - tileH; if(map[x][y].act == GUARD_T && guardAlive(x,y)) setRunnerDead(); //collision } if(action == ACT_DOWN) { newShape = "runUpDn"; } else { //ACT_FALL or ACT_FALL_BAR if (y < maxTileY && map[x][y+1].act == GUARD_T) { //over guard //don't collision var id = getGuardId(x, y+1); if(yOffset > guard[id].pos.yOffset) yOffset = guard[id].pos.yOffset; } if (action == ACT_FALL_BAR) { if(runner.lastLeftRight == ACT_LEFT) newShape = "barLeft"; else newShape = "barRight"; } else { if(runner.lastLeftRight == ACT_LEFT) newShape = "fallLeft"; else newShape = "fallRight"; } } } if ( centerY == ACT_DOWN ) { yOffset += yMove; if ( yOffset > 0 ) yOffset = 0; //move to center Y } if ( action == ACT_LEFT) { xOffset -= xMove; if(stayCurrPos && xOffset < 0) xOffset = 0; //stay on current position else if ( xOffset < -W2) { //move to x-1 position if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x-1][y], so set [x][y].act to previous state x--; xOffset = tileW + xOffset; if(map[x][y].act == GUARD_T && guardAlive(x,y)) setRunnerDead(); //collision } if(curToken == BAR_T) newShape = "barLeft"; else newShape = "runLeft"; } if ( centerX == ACT_LEFT ) { xOffset -= xMove; if ( xOffset < 0) xOffset = 0; //move to center X } if ( action == ACT_RIGHT ) { xOffset += xMove; if(stayCurrPos && xOffset > 0) xOffset = 0; //stay on current position else if ( xOffset > W2) { //move to x+1 position if(curToken == BLOCK_T || curToken == HLADR_T) curToken = EMPTY_T; //in hole or hide laddr map[x][y].act = curToken; //runner move to [x+1][y], so set [x][y].act to previous state x++; xOffset = xOffset - tileW; if(map[x][y].act == GUARD_T && guardAlive(x,y)) setRunnerDead(); //collision } if(curToken == BAR_T) newShape = "barRight"; else newShape = "runRight"; } if ( centerX == ACT_RIGHT ) { xOffset += xMove; if ( xOffset > 0) xOffset = 0; //move to center X } if(action == ACT_STOP ) { if(runner.action == ACT_FALL) { soundStop(soundFall); themeSoundPlay("down"); } if(runner.action != ACT_STOP){ runner.sprite.stop(); runner.action = ACT_STOP; } } else { runner.sprite.x = (x * tileW + xOffset) * tileScale | 0; runner.sprite.y = (y * tileH + yOffset) * tileScale | 0; runner.pos = { x:x, y:y, xOffset:xOffset, yOffset:yOffset}; if(curShape != newShape) { runner.sprite.gotoAndPlay(newShape); runner.shape = newShape; } if(action != runner.action){ if(runner.action == ACT_FALL) { soundStop(soundFall); themeSoundPlay("down"); } else if ( action == ACT_FALL) { soundPlay(soundFall); } runner.sprite.play(); } if(action == ACT_LEFT || action == ACT_RIGHT) runner.lastLeftRight = action; runner.action = action; } map[x][y].act = RUNNER_T; //show trap tile if runner fall into the tile, 9/12/2015 if(map[x][y].base == TRAP_T) map[x][y].bitmap.set({alpha:0.5}); //show trap tile // Check runner to get gold (MAX MOVE MUST < H4 & W4) if( map[x][y].base == GOLD_T && ((!xOffset && yOffset >= 0 && yOffset < H4) || (!yOffset && xOffset >= 0 && xOffset < W4) || (y < maxTileY && map[x][y+1].base == LADDR_T && yOffset < H4) // gold above laddr ) ) { removeGold(x,y); themeSoundPlay("getGold"); decGold(); //debug("gold = " + goldCount); if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) { drawScore(SCORE_GET_GOLD); } else { //for modern mode , edit mode drawGold(1); //get gold } } //if(!goldCount && !goldComplete) showHideLaddr(); //check collision with guard ! checkCollision(x, y); } //dec gold count function decGold() { if(--goldCount <= 0) { showHideLaddr(); if(runner.pos.y > 0) { if(curTheme == "C64") soundPlay("goldFinish" + ((curLevel-1)%6+1)); //six sounds else soundPlay("goldFinish"); //for all apple2 mode, 9/12/2015 } } } function removeGold(x,y) { map[x][y].base = EMPTY_T; mainStage.removeChild(map[x][y].bitmap); map[x][y].bitmap = null; } function addGold(x, y) { var tile; map[x][y].base = GOLD_T; tile = map[x][y].bitmap = getThemeBitmap("gold"); tile.setTransform(x * tileWScale, y * tileHScale,tileScale, tileScale); //x,y, scaleX, scaleY mainStage.addChild(tile); moveSprite2Top(); //reset runner, guard & fill hole object order } function showHideLaddr() { var haveHLadder = 0; for(var y = 0; y < NO_OF_TILES_Y; y++) { for(var x = 0; x < NO_OF_TILES_X; x++) { if( map[x][y].base == HLADR_T) { haveHLadder = 1; map[x][y].base =LADDR_T; map[x][y].act =LADDR_T; map[x][y].bitmap.set({alpha:1}); //display laddr } } } goldComplete = 1; return haveHLadder; } function checkCollision(runnerX, runnerY) { var x = -1, y = -1; //var dbg = "NO"; switch(true) { case ( runnerY > 0 && map[runnerX][runnerY-1].act == GUARD_T): x = runnerX; y = runnerY-1; //dbg = "UP"; break; case ( runnerY < maxTileY && map[runnerX][runnerY+1].act == GUARD_T): x = runnerX; y = runnerY+1; //dbg = "DN"; break; case ( runnerX > 0 && map[runnerX-1][runnerY].act == GUARD_T): x = runnerX-1; y = runnerY; //dbg = "LF"; break; case ( runnerX < maxTileX && map[runnerX+1][runnerY].act== GUARD_T): x = runnerX+1; y = runnerY; //dbg = "RT"; break; } //if( dbg != "NO") debug(dbg); if( x >= 0) { for(var i = 0; i < guardCount; i++) { if( guard[i].pos.x == x && guard[i].pos.y == y) break; } assert( (i < guardCount), "checkCollision design error !"); if(guard[i].action != ACT_REBORN) { //only guard alive need check collection //var dw = Math.abs(runner.sprite.x - guard[i].sprite.x); //var dh = Math.abs(runner.sprite.y - guard[i].sprite.y); //change detect method ==> don't depend on scale var runnerPosX = runner.pos.x*tileW+runner.pos.xOffset; var runnerPosY = runner.pos.y*tileH+runner.pos.yOffset; var guardPosX = guard[i].pos.x*tileW+guard[i].pos.xOffset; var guardPosY = guard[i].pos.y*tileH+guard[i].pos.yOffset; var dw = Math.abs(runnerPosX - guardPosX); var dh = Math.abs(runnerPosY - guardPosY); if( dw <= W4*3 && dh <= H4*3 ) { setRunnerDead(); //07/04/2014 //debug("runner dead!"); } } } } //Page 276 misc.c (book) function ok2Dig(nextMove) { var x = runner.pos.x; var y = runner.pos.y; var token, rc = 0; switch(nextMove) { case ACT_DIG_LEFT: // debug("[x-1][y+1] = " + map[x-1][y+1].act + " [x-1][y] = " + map[x-1][y].act + // "[x-1][y].base = " + map[x-1][y].base ); if( y < maxTileY && x > 0 && map[x-1][y+1].act == BLOCK_T && map[x-1][y].act == EMPTY_T && map[x-1][y].base != GOLD_T) rc = 1; break; case ACT_DIG_RIGHT: // debug("[x+1][y+1] = " + map[x+1][y+1].act + " [x+1][y] = " + map[x+1][y].act + // "[x+1][y].base = " + map[x+1][y].base ); if( y < maxTileY && x < maxTileX && map[x+1][y+1].act == BLOCK_T && map[x+1][y].act == EMPTY_T && map[x+1][y].base != GOLD_T) rc = 1; break; } return rc; } //======================= // BEGIN NEW DIG METHOD //======================= var digHoleLeft = [ 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7 ]; var digHoleRight = [ 8, 9, 10, 10, 11, 12, 12, 13, 14, 14, 15 ]; function processDigHole() { if(curAiVersion < 3) return; if(++holeObj.curFrameIdx < holeObj.shapeFrame.length) { // change frame holeObj.sprite.gotoAndStop(holeObj.shapeFrame[holeObj.curFrameIdx]); holeObj.sprite.currentAnimationFrame = holeObj.curFrameIdx; } else { //dig complete digComplete(); } } //======================== // END NEW DIG METHOD //======================== var digTimeStart, shakeTimeStart; //for debug var fillHoleTimeStart, rebornTimeStart; //for debug function digHole(action) { var x,y, holeShape; if(action == ACT_DIG_LEFT) { x = runner.pos.x-1; y = runner.pos.y; runner.shape = "digLeft"; holeShape = "digHoleLeft"; } else { //DIG RIGHT x = runner.pos.x+1; y = runner.pos.y; runner.shape = "digRight"; holeShape = "digHoleRight"; } soundPlay(soundDig); map[x][y+1].bitmap.set({alpha:0}); //hide block (replace with digging image) runner.sprite.gotoAndPlay(runner.shape); holeObj.action = ACT_DIGGING; holeObj.pos = { x: x, y: y }; holeObj.sprite.setTransform(x * tileWScale, y * tileHScale,tileScale, tileScale); digTimeStart = recordCount; //for debug if(curAiVersion < 3) { holeObj.sprite.gotoAndPlay(holeShape); holeObj.sprite.on("animationend", digComplete); } else { if(action == ACT_DIG_LEFT) holeShape = digHoleLeft; else holeShape = digHoleRight; holeObj.sprite.gotoAndStop(holeShape[0]); holeObj.shapeFrame = holeShape; holeObj.curFrameIdx = 0; } mainStage.addChild(holeObj.sprite); } var DEBUG_DIG=0; function isDigging() { var rc = 0; if(holeObj.action == ACT_DIGGING) { var x = holeObj.pos.x, y = holeObj.pos.y; if(map[x][y].act == GUARD_T) { //guard come close to the digging hole ! var id = getGuardId(x, y); if(holeObj.sprite.currentAnimationFrame < holeObj.digLimit && guard[id].pos.yOffset > -H4) { if(DEBUG_DIG) loadingTxt.text = "dig : " + holeObj.sprite.currentAnimationFrame + " (X)"; stopDigging(x,y); } else { if(DEBUG_DIG) loadingTxt.text = "dig : " + holeObj.sprite.currentAnimationFrame + " (O)"; if(curAiVersion >= 3) { //This is a bug while AI VERSION < 3 map[x][y+1].act = EMPTY_T; //assume hole complete rc = 1; } } } else { switch( runner.shape ) { case "digLeft": if(holeObj.sprite.currentAnimationFrame > 2 ) { runner.sprite.gotoAndStop("runLeft"); //change shape runner.shape = "runLeft"; runner.action = ACT_STOP; } break; case "digRight": if(holeObj.sprite.currentAnimationFrame > 2) { runner.sprite.gotoAndStop("runRight"); //change shape runner.shape = "runRight"; runner.action = ACT_STOP; } break; } rc = 1; } } return rc; } function stopDigging(x,y) { //(1) remove holeObj holeObj.sprite.removeAllEventListeners ("animationend"); holeObj.action = ACT_STOP; //no digging mainStage.removeChild(holeObj.sprite); //(2) fill hole y++; map[x][y].act = map[x][y].base; //BLOCK_T assert(map[x][y].base == BLOCK_T, "fill hole != BLOCK_T"); map[x][y].bitmap.set({alpha:1}); //display block //(3) change runner shape switch( runner.shape ) { case "digLeft": runner.sprite.gotoAndStop("runLeft"); runner.shape = "runLeft"; runner.action = ACT_STOP; break; case "digRight": runner.sprite.gotoAndStop("runRight"); runner.shape = "runRight"; runner.action = ACT_STOP; break; } soundStop(soundDig); //stop sound of digging } function digComplete() { var x = holeObj.pos.x; var y = holeObj.pos.y + 1; map[x][y].act = EMPTY_T; holeObj.sprite.removeAllEventListeners ("animationend"); holeObj.action = ACT_STOP; //no digging mainStage.removeChild(holeObj.sprite); if(DEBUG_TIME) loadingTxt.text = "DigTime = " + (recordCount - digTimeStart); fillHole(x, y); } var fillHoleObj = []; function fillHole(x, y) { var fillSprite = new createjs.Sprite(holeData, "fillHole"); fillSprite.pos = { x:x, y:y }; //save position 11/18/2014 fillSprite.setTransform(x * tileWScale, y * tileHScale, tileScale, tileScale); if(curAiVersion < 3) { fillSprite.on("animationend", fillComplete, null, false, {obj:fillSprite} ); fillSprite.play(); } else { fillSprite.curFrameIdx = 0; fillSprite.curFrameTime = -1; fillSprite.gotoAndStop(fillHoleFrame[0]); } mainStage.addChild(fillSprite); fillHoleObj.push(fillSprite); fillHoleTimeStart = recordCount; //for debug } function moveFillHoleObj2Top() { for(var i = 0; i < fillHoleObj.length; i++) { moveChild2Top(mainStage, fillHoleObj[i]); } } function fillComplete(evt, data) { //don't use "divide command", it will cause loss of accuracy while scale changed (ex: tileScale = 0.6...) //var x = this.x / tileWScale | 0; //this : scope default to the dispatcher //var y = this.y / tileHScale | 0; var fillObj = data.obj; var x = fillObj.pos.x, y = fillObj.pos.y; //get position map[x][y].bitmap.set({alpha:1}); //display block fillObj.removeAllEventListeners ("animationend"); mainStage.removeChild(fillObj); removeFillHoleObj(fillObj); switch(map[x][y].act) { case RUNNER_T : // runner dead //loadingTxt.text = "RUNNER DEAD"; gameState = GAME_RUNNER_DEAD; runner.sprite.set({alpha:0}); //hidden runner --> dead break; case GUARD_T: //guard dead var id = getGuardId(x,y); if(curAiVersion >= 3 && guard[id].action == ACT_IN_HOLE) removeFromShake(id); if(guard[id].hasGold > 0) { //guard has gold and not fall into the hole decGold(); guard[id].hasGold = 0; guardRemoveRedhat(guard[id]); //9/4/2016 } guardReborn(x,y); if(playMode == PLAY_CLASSIC || playMode == PLAY_AUTO || playMode == PLAY_DEMO) { drawScore(SCORE_GUARD_DEAD); } else { //for modern mode & edit mode drawGuard(1); //guard dead, add count } break; } map[x][y].act = BLOCK_T; if(DEBUG_TIME) loadingTxt.text = "FillHoleTime = " + (recordCount - fillHoleTimeStart); //for debug } function removeFillHoleObj(spriteObj) { for(var i = 0; i < fillHoleObj.length; i++) { if(fillHoleObj[i] == spriteObj) { fillHoleObj.splice(i,1); return; } } error("design error !"); } //======================================= // BEGIN NEW fill Hold (Ai version >= 3) //======================================= var fillHoleFrame = [ 16, 17, 18, 19]; var fillHoleTime = [ 166, 8, 8, 4]; function initFillHoleVariable() { fillHoleObj = []; } function processFillHole() { var curIdx, curFillObj; for(var i = 0; i < fillHoleObj.length;) { curFillObj = fillHoleObj[i]; curIdx = curFillObj.curFrameIdx; if(++curFillObj.curFrameTime >= fillHoleTime[curIdx]) { if(++curFillObj.curFrameIdx < fillHoleFrame.length) { //change frame curFillObj.curFrameTime = 0; curFillObj.gotoAndStop(fillHoleFrame[curFillObj.curFrameIdx]); } else { //fill hole complete fillComplete(null, {obj: curFillObj}); continue; } } i++; } } //==================== // END NEW fill Hold //==================== //================================== // Check guard is alive or not // 2014/10/31 //================================== function guardAlive(x, y) { for(var i = 0; i < guardCount; i++) { if( guard[i].pos.x == x && guard[i].pos.y == y) break; } assert( (i < guardCount), "guardAlive() design error !"); if(guard[i].action != ACT_REBORN) return 1; //alive return 0; //reborn } ================================================ FILE: lodeRunner.share.js ================================================ //================================================================================= // For share custom level to other players // -------------------------------------------------------------------------------- // Version 1 url parameter format: // // ?shareLevel=[LEVEL DATA].[s]([v][m][t][r][creator][pading]) // // [LEVEL DATA] : ZIP level data // [s]: checksum ([v]..[pading]) // [v]: version = 1 [0] // [m]: share mode (1:Fackbook, 2:twitter, 3:weibo, 4:link) [1] // [t]: theme mode (1:apple2, 2:c64) [2] // [r]: reserved 3 bytes [3..5] // [creator]: creator name [6-] // [pading]: pading "@" let length([v]+[m]+[t]+[creator]+[pading]) multiplier of 3 //================================================================================= var SHARE_DATA_VERSION = 1; var shareLevelData = [""]; var shareInfo = null; // { ver:1, mode:1-4 [m], theme:1-2 [t], creator: } var shareFirstTime = 1; function getQueryStringParameterValue(queryString, parameterName) { var ParameterValue = ""; var valueLength = 0 queryString = decodeURIComponent(queryString); //url decode var beginIdxOfParameter = queryString.indexOf(parameterName + "="); if (beginIdxOfParameter >= 0) { var startIdx = beginIdxOfParameter + parameterName.length + 1; // skip "parameterName=" for (var endIdx=startIdx; queryString.charAt(endIdx) !='&' && endIdx < queryString.length; endIdx++) valueLength++; ParameterValue = queryString.substr(startIdx, valueLength); } return ParameterValue; } function getShareChecksum(strData) { var checksum = 0; for(var i = 0; i < strData.length; i++) { checksum += strData.charCodeAt(i); } return value2OutValue((checksum & 0x1F)+1); //1..32 } function getShareVerInfo(encUrlVerData) { var verInfo = null; var infoChecksum = encUrlVerData.charAt(0); var urlVerData = atob(encUrlVerData.substr(1,)); //base64 decode var strChecksum = getShareChecksum(urlVerData); var version = urlVerData.charAt(0); if(infoChecksum == strChecksum && (urlVerData.length % 3) == 0 && urlVerData.length >= 9 && version == '1') { var shareMode = urlVerData.charCodeAt(1)-'0'.charCodeAt(0); //[m] var theme = urlVerData.charCodeAt(2)-'0'.charCodeAt(0); //[t] var creator = urlVerData.substr(6,); //[creator] var creatorLength = creator.length; // remove last '@' chars while(creatorLength > 0) { if (creator.charAt(creatorLength-1) == '@') creatorLength--; else break; } if (creator.length != creatorLength) creator = creator.substr(0, creatorLength); if(shareMode > 0 && shareMode <= 4 && theme > 0 && theme <=2 && creatorLength > 0 && vaildPlayerName(creator)) { verInfo = {}; verInfo.ver = 1; verInfo.mode = shareMode; verInfo.theme = theme; verInfo.creator = creator; } } if(!verInfo) error("wrong verInfo"); return verInfo; } function getShareUrlInfo() { if (!shareFirstTime) return; shareFirstTime = 0; var shareUrlData = getQueryStringParameterValue(location.search, "shareLevel"); if (shareUrlData) { var dotPos = shareUrlData.indexOf("."); if (dotPos > 0) { var unzipLevel = unzipLevelMap(shareUrlData.substr(0, dotPos)); if(unzipLevel && shareUrlData.length > dotPos) { shareInfo = getShareVerInfo(shareUrlData.substr(dotPos+1,)); } if (shareInfo) { shareLevelData[0] = unzipLevel; copyShareLevelForEditing(); playMode = PLAY_MODERN; playData = PLAY_DATA_SHARE; ///////////////////////////////////////////////// sendShareLevel2Server(unzipLevel, shareInfo, null); //new or update share count ///////////////////////////////////////////////// } // remove "share.html" var removeString = "/share.html"; var removeLength = removeString.length; var newPathName = location.pathname; if(newPathName.substr(-removeLength) == removeString) newPathName = newPathName.substr(0, newPathName.length-removeLength+1); //console.log(newPathName); // change URL to normal path (adds an entry to the browser's session history stack) history.pushState({}, "Lode Runner Web Game", newPathName); } } } function converLevel2ShareUrl(level, shareMode, creator) { var theme =(curTheme == THEME_APPLE2)?1:2; var padingTimes = (3-creator.length%3) % 3; var zipLevel = zipLevelMap(level); var verInfo = `1${shareMode}${theme} ${creator}${'@'.repeat(padingTimes)}`; var checksum = getShareChecksum(verInfo); var leftSlash = location.pathname.lastIndexOf("/"); var pathName = leftSlash < 0 ? "/": location.pathname.substr(0,leftSlash+1); var host = location.host; //host = "loderunnerwebgame.com/game"; return location.protocol + "//" + host + pathName + "share.html?shareLevel=" + zipLevel + "." + checksum + encodeURIComponent(btoa(verInfo)); } var zipIdToMap = [' ', '#', '@', 'H', '-', 'X', 'S', '$', '0', '&']; var mapToZipId = {' ':0, '#':1, '@':2, 'H':3, '-': 4, 'X':5, 'S':6, '$':7, '0':8, '&':9 } // value range [1..52] ==> A..Z + a..z // (01-26) ==> 'A'-'Z' (0x41 - 0x5A) // (27-52) ==> 'a'-'z' (0x61 - 0x7A) function value2OutValue(value) { assert(value >= 1 && value <= 52 , "Error: value not in range 1..52"); if (value <= 26) { var outValue = String.fromCharCode(value-1 + 'A'.charCodeAt(0)); //'A' ==> 1 , 'B' ==> 2 ... } else { var outValue = String.fromCharCode(value-27 + 'a'.charCodeAt(0)); //'a' ==> 27 , 'b' ==> 28 ... } return outValue; } function appendZipTile(tileType, tileCount) { var rcTile = ''; var outTile = String.fromCharCode(mapToZipId[tileType] + '0'.charCodeAt(0)); //0 ==> '0' , 1 ==> '1' switch(tileCount) { case 0: error("design error, tileType = None"); break; case 1: rcTile = outTile; break case 2: rcTile = outTile + outTile; break; default: outCount = value2OutValue(tileCount); rcTile = outCount + outTile break; } return rcTile; } function zipLevelMap(level) { var zipLevel = ""; assert(level.length == (NO_OF_TILES_X * NO_OF_TILES_Y), "Error: zipShareLevel tiles != totalTiles"); var lastTile = ''; // begin with a fake tile var tileCount = 0; var checksum = 0; // checksum for(var tileIdx = 0; tileIdx < level.length; tileIdx++) { curTile = level.charAt(tileIdx); checksum += mapToZipId[curTile]; //XOR if (lastTile == curTile) { tileCount += 1; if (tileCount < 52) continue; // the maximun compress count = 52 (a-z + A-Z) else curTile = ''; //fake tile } if (tileCount > 0) zipLevel += appendZipTile(lastTile, tileCount); lastTile = curTile; if (lastTile == '') tileCount = 0; // compress count > max compress count (append a fake tile) else tileCount = 1; } if (tileCount > 0) zipLevel += appendZipTile(lastTile, tileCount); zipLevel += value2OutValue((checksum & 0x1F)+1); // checksum 1..32 return zipLevel; } function unzipLevelMap(zipLevel) { var dupNum = 1; var unzipLevel = ''; var checksum = 0; var caseType = 1; for (var curIdx = 0; curIdx < zipLevel.length && caseType > 0; curIdx++) { curChar = zipLevel.charAt(curIdx); switch (true) { case curChar >= '0' && curChar <= '9': // tileType caseType = 1; tileIdx = curChar.charCodeAt(0) - '0'.charCodeAt(0); unzipLevel += Array(dupNum+1).join(zipIdToMap[tileIdx]); // char * dupNum checksum += (tileIdx * dupNum); dupNum = 1 break; case curChar >= 'A' && curChar <= 'Z': // dup number 1-26 if (dupNum > 1) { caseType = -1; //error error("Error: before A-Z still a dupNumber"); } else { caseType = 2; dupNum = curChar.charCodeAt(0) - 'A'.charCodeAt(0) + 1; } break; case curChar >= 'a' && curChar <= 'z': // dup number 27-52 if (dupNum > 1) { caseType = -1; //error error("Error: before a-z still a dupNumber"); } else { caseType = 2; dupNum = curChar.charCodeAt(0) - 'a'.charCodeAt(0) + 27; } break; default: caseType = -1; //error error("Error: wrong tileType = '" + curChar + "'"); break; } } if (caseType < 0) return ''; // Error checksum = (checksum & 0x1F) + 1; // 1..32 if(caseType != 2 || checksum != dupNum) { error("Error: wrong checksum !"); return ''; } else if (unzipLevel.length != (NO_OF_TILES_X * NO_OF_TILES_Y)) { error("Error: wrong tile size (" + unzipLevel.length + ") !"); return ''; } return unzipLevel; } // ============================================================================================== // Generate custom level backup data // // (1) HeaderInfo: "LODE RUNNER WEB GAME.2021-06-08 12:09:08 GMT+0800 (台北標準時間).player." // (2) zipInfo: [v][l][s][c] // // [v]: version [0] ==> 1 or 2 // [l]: levels [1:2] ==> [01-FF] // [s]: size [3:8] ==> [000000-FFFFFF] // [c]: checksum [9:12] ==> [0000-FFFF] // [r]: reserved [13:14] ==> "LR" // // (3) level map data: // ------------------------------ // v1: // +----- startLevelPos // V // \n tile * NO_OF_TILES_X // \n tile * NO_OF_TILES_X // .... // \n tile * NO_OF_TILES_X // \n checksum // ------------------------------ // v2: // \n zipLevelData // \n zipLevelData // ....... // \n zipLevelData // \n // ------------------------------ // ============================================================================================== function backupCustomLevelData(date) { var curTimeInfo = getLocalTimeZone(date); var headerInfo = LRWG_FILE_START_INFO + curTimeInfo + "." + playerName + "."; var levelSize = ("0" + editLevels.toString(16)).slice(-2); var fileSize = encodeURI(headerInfo).replace(/%../g,'.').length + 20; //20 : length of zipInfo var zipLevelData = ""; var zipChecksum = 0; /* version 1 var verInfo = '1'; for(var i = 0; i < editLevels; i++) { var curLevel = editLevelData[i]; for(var startPos = 0; startPos < curLevel.length; startPos += NO_OF_TILES_X) { zipLevelData += '\n' + curLevel.substr(startPos, NO_OF_TILES_X); } zipLevelData += '\n' + getShareChecksum(curLevel); } */ var verInfo = '2'; for(var i = 0; i < editLevels; i++) { zipLevelData += '\n' + zipLevelMap(editLevelData[i]); // \nzipLevel \nzipLevel.... \nzipLevel } zipLevelData += '\n'; // \nzipLevel \nzipLevel.... \nzipLevel \n for(var i = 0; i < zipLevelData.length; i++) { zipChecksum += zipLevelData.charCodeAt(i); } zipChecksum = ("000" + (zipChecksum & 0xFFFF).toString(16)).slice(-4); fileSize = ("00000" + (fileSize + zipLevelData.length).toString(16)).slice(-6); var zipInfo = btoa(verInfo + levelSize + fileSize + zipChecksum + "LR"); return headerInfo + zipInfo + zipLevelData; } ================================================ FILE: lodeRunner.storage.js ================================================ var modernScoreInfo, editScoreInfo; //======================= // LOCAL STORAGE SET/GET //======================= function setLastPlayMode() { var infoObj = { m:playMode, d:playData }; var infoJSON = JSON.stringify(infoObj); setStorage(STORAGE_LASTPLAY_MODE, infoJSON); } function initClassicInfo() { curScore = 0; curLevel = maxLevel = 1; passedLevel = 0; //6/3/2015 runnerLife = RUNNER_LIFE; sometimePlayInGodMode = 0; } function base64Decode(str) { //---------------------------------------------------------------------------------------------------------- // check string is base64 or not // ref: http://stackoverflow.com/questions/8571501/how-to-check-whether-the-string-is-base64-encoded-or-not //---------------------------------------------------------------------------------------------------------- var pattern = new RegExp("^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$"); if(pattern.test(str) == true) { return atob(str); //base64 decode } return null; //string is not base64 } function getClassicInfo() { var infoJSON = null; var needEncode = 0; if(playData >= 1 && playData <= maxPlayId) { infoJSON = getStorage(STORAGE_CLASSIC_INFO+playData); //================================== // BEGIN for support base64 encode //================================== /* for backward compatible disable it ! if(infoJSON) { if(infoJSON.charAt(0) != '{' ) { //assume base64 encoded infoJSON = base64Decode(infoJSON); //base64 decode } else { //no encode (for backward compatibility) if( getStorage(STORAGE_FIRST_PLAY) >= VERSION) infoJSON = null; //something wrong, reset it else { setFirstPlayInfo(); //set current version } needEncode = 1; } } */ //================================ // END for support base64 encode //================================ } else { error("design error, value =" + playData ); playData = 1; } levelData = getPlayVerData(playData); if(infoJSON == null) { initClassicInfo(); } else { var infoObj = JSON.parse(infoJSON); if( ! (infoObj && ("s" in infoObj) && ("l" in infoObj) && ("m" in infoObj) ) ) { initClassicInfo(); //something wrong, reset it ! } else { if(!infoObj.hasOwnProperty('g')) infoObj.g = 0; //god-mode if(!infoObj.hasOwnProperty('p')) infoObj.p = infoObj.l-1; //passed level curScore = infoObj.s; curLevel = infoObj.l; maxLevel = infoObj.m; passedLevel = infoObj.p; runnerLife = infoObj.r; sometimePlayInGodMode = infoObj.g; } } if(needEncode) setClassicInfo(0); } function setClassicInfo(passed) { maxLevel = (maxLevel < curLevel)?curLevel:maxLevel; if(passed) passedLevel++; var infoObj = { s:curScore, l:curLevel, r:runnerLife, m: maxLevel, g: sometimePlayInGodMode, p: passedLevel}; var infoJSON = JSON.stringify(infoObj); // for backward compatible disable it ! // infoJSON = btoa(infoJSON); //base64 encode, 6/3/2015 if(playData >= 1 && playData <= maxPlayId) { setStorage(STORAGE_CLASSIC_INFO+playData, infoJSON); } else { error("design error, value =" + playData ); } } function clearClassicInfo() { clearStorage(STORAGE_CLASSIC_INFO + playData); } function getModernInfo() { var infoJSON; switch(true) { case (playData >= 1 && playData <= maxPlayId): infoJSON = getStorage(STORAGE_MODERN_INFO+playData); levelData = getPlayVerData(playData); break; case (playData == PLAY_DATA_USERDEF): if(editLevels > 0) { infoJSON = getStorage(STORAGE_USER_INFO); levelData = editLevelData; } else { //no any user created level ! playData = 1; playData2GameVersionMenuId(); infoJSON = getStorage(STORAGE_MODERN_INFO+1); levelData = getPlayVerData(playData); } break; default: error("design error, value =" + playData ); playData = 1; break; } if(infoJSON == null) { curScore = 0; curLevel = 1; runnerLife = RUNNER_LIFE; } else { var infoObj = JSON.parse(infoJSON); curScore = 0; curLevel = infoObj.l; runnerLife = RUNNER_LIFE; } getModernScoreInfo(); } function setModernInfo() { var infoObj = { l:curLevel}; var infoJSON = JSON.stringify(infoObj); switch(true) { case (playData >= 1 && playData <= maxPlayId): setStorage(STORAGE_MODERN_INFO + playData, infoJSON); break; case (playData == PLAY_DATA_USERDEF): setStorage(STORAGE_USER_INFO, infoJSON); //user created break; default: error("design error, value =" + playData ); break; } } function clearModernInfo() { switch(true) { case (playData >= 1 && playData <= maxPlayId): clearStorage(STORAGE_MODERN_INFO+playData); break; case (playData == PLAY_DATA_USERDEF): clearStorage(STORAGE_USER_INFO); break; default: error("design error, value =" + playData ); break; } } function getModernScoreInfo() { var infoJSON, levelSize; switch(true) { case (playData >= 1 && playData <= maxPlayId): infoJSON = getStorage(STORAGE_MODERN_SCORE_INFO+playData); levelSize = levelData.length; break; case (playData == PLAY_DATA_USERDEF): infoJSON = getStorage(STORAGE_USER_SCORE_INFO); //user created levelSize = MAX_EDIT_LEVEL; break; default: error("design error, value =" + playData ); break; } if(infoJSON) { modernScoreInfo = JSON.parse(infoJSON); if(modernScoreInfo.length != levelSize) infoJSON = null; } if(infoJSON == null) { modernScoreInfo = []; for(var i = 0; i < levelSize; i++) modernScoreInfo[i] = -1; } } function setModernScoreInfo() { var infoJSON = JSON.stringify(modernScoreInfo); switch(true) { case (playData >= 1 && playData <= maxPlayId): setStorage(STORAGE_MODERN_SCORE_INFO+playData, infoJSON); break; case (playData == PLAY_DATA_USERDEF): setStorage(STORAGE_USER_SCORE_INFO, infoJSON); break; default: error("design error, value =" + playData ); break; } } function getFirstPlayInfo() { var firstValue; firstValue = parseFloat(getStorage(STORAGE_FIRST_PLAY)); if( isNaN(firstValue) || firstValue < parseFloat(VERSION) ) { firstPlay = 1; } } function setFirstPlayInfo() { setStorage(STORAGE_FIRST_PLAY, VERSION); } //===================== // for edit mode //===================== var editLevelData, editLevels = -1, editLevelInfo; function delEditLevel(level) { if(level > editLevels || level< 1) return false; var delId = editLevelInfo[level-1]; editLevelInfo.splice(level-1,1); //delete id and shift others editLevelInfo.push(delId); //put the deleted id to last of array clearStorage(STORAGE_USER_LEVEL+("00"+(delId)).slice(-3)); if(--editLevels <= 0) { clearEditLevelInfo(); //no edit levels clearStorage(STORAGE_USER_SCORE_INFO); //clear user score info initEditLevelInfo(); } else { setEditLevelInfo(); delUserLevelScore(level); } editLevelData.splice(level-1,1); return true; } function addEditLevel(levelMap) { if(editLevels >= MAX_EDIT_LEVEL) return false; setEditLevel(++editLevels, levelMap); setEditLevelInfo(); return true; } function setEditLevel(level, levelMap) { setStorage(STORAGE_USER_LEVEL+("00"+(editLevelInfo[level-1])).slice(-3), levelMap); editLevelData[level-1] = levelMap; } function initEditLevelInfo() { editLevels = 0; editLevelInfo = []; for(var i = 0; i < MAX_EDIT_LEVEL; i++) { editLevelInfo[i] = i+1; } } function getEditLevelInfo() { var infoJSON, levelMap; if(editLevels >= 0) return; //just once infoJSON = getStorage(STORAGE_EDIT_INFO); editLevelData = []; if(infoJSON) { var infoObj = JSON.parse(infoJSON); editLevels = infoObj.no; editLevelInfo = infoObj.id; } else { initEditLevelInfo(); if(getStorage(STORAGE_FIRST_PLAY) == null) { createUserDefaultLevel(); //first time, create user default level } } for(var i = 0; i < editLevels; i++) { levelMap = getStorage(STORAGE_USER_LEVEL + ("00"+(editLevelInfo[i])).slice(-3)); if(levelMap == null || levelMap.length != NO_OF_TILES_X * NO_OF_TILES_Y) { debug("LOCAL STORAGE: get edit level map failed (" + i + ") !"); editLevels =i; break; } editLevelData[i] = levelMap; } curScore = 0; curLevel = editLevels+1; runnerLife = RUNNER_LIFE; } function setEditLevelInfo() { var infoObj = { no:editLevels, id: editLevelInfo}; var infoJSON = JSON.stringify(infoObj); setStorage(STORAGE_EDIT_INFO, infoJSON); } function clearEditLevelInfo() { clearStorage(STORAGE_EDIT_INFO); } function initNewLevelInfo(testInfo) { testInfo.level = editLevels+1; testInfo.levelMap = ""; testInfo.pass = 0; testInfo.modified = 0; testInfo.fromPlayData = -1; testInfo.fromLevel = -1; for(var i = 0; i < NO_OF_TILES_X * NO_OF_TILES_Y; i++) testInfo.levelMap += " "; //empty map } function compareWithExist(existLevelMap, testLevelMap) { for(var i = 0; i < NO_OF_TILES_X * NO_OF_TILES_Y; i++) { if(existLevelMap.charAt(i) != testLevelMap.charAt(i)) return 1; } return 0; } function getTestLevel(testInfo) { var infoJSON; if((infoJSON = getStorage(STORAGE_TEST_LEVEL)) == null) { initNewLevelInfo(testInfo); } else { var init = testInfo.level<0?1:0; var infoObj = JSON.parse(infoJSON); //add statements for testInfo safer if(!('level' in infoObj) || !('map' in infoObj) || !('pass' in infoObj) || infoObj.level < 0 || infoObj.level > editLevels+1 || infoObj.map.length != NO_OF_TILES_X * NO_OF_TILES_Y) { //wrong map data clear it clearTestLevel(); initNewLevelInfo(testInfo); return; } testInfo.level = infoObj.level; testInfo.levelMap = infoObj.map; testInfo.pass = infoObj.pass; if(('fromPlayData' in infoObj) && ('fromLevel' in infoObj)) { testInfo.fromPlayData = infoObj.fromPlayData; testInfo.fromLevel = infoObj.fromLevel; } else { testInfo.fromPlayData = testInfo.fromLevel = -1; } //BEGIN for debug ==================== //var i = 0; //for(var y = 0; y < NO_OF_TILES_Y; y++) { // var string = "" // for(var x = 0; x < NO_OF_TILES_X; x++) { // string += testInfo.levelMap[i++]; // } // //debug('"' + string + '"'); //} //END for debug ==================== if(testInfo.level > editLevels) { testInfo.modified = 1; } else { if(compareWithExist(editLevelData[infoObj.level-1], testInfo.levelMap) == 0) { if(init) { //same as exist level, new level clearTestLevel(); initNewLevelInfo(testInfo); } } else { testInfo.modified = 1; } } } } function setTestLevel(testInfo) { var infoObj = { level:testInfo.level, map: testInfo.levelMap, pass: testInfo.pass, fromPlayData: testInfo.fromPlayData, fromLevel: testInfo.fromLevel }; var infoJSON = JSON.stringify(infoObj); setStorage(STORAGE_TEST_LEVEL, infoJSON); } function clearTestLevel() { clearStorage(STORAGE_TEST_LEVEL); } function createUserDefaultLevel() { var myDefaultLevel = //Double Happy 2014/05/25 "0-------- ------- ---------0" + "H & # $ # H" + "H #######S####### H" + "H $ # # $ H" + "H @@@#@@@S@@@#@@@ H" + "H # # H" + "H ####### ####### H" + "H # $ # # $ # H" + "H #@@#### ####@@# H" + "H X X H" + "H @@@#@@@X@@@#@@@ H" + "H # # H" + "H ####### ####### H" + "H # $ # # $ # H" + "H ####### ####### H" + "H # # H"; addEditLevel(myDefaultLevel); } //====================== // Repeat Action ON/OFF //====================== function getRepeatAction() { if((repeatAction = getStorage(STORAGE_REPEAT_ACTION)) == null) { repeatAction = 0; //set default off (NES keyboard mode) } else { repeatAction = parseInt(repeatAction); } } function setRepeatAction() { setStorage(STORAGE_REPEAT_ACTION, repeatAction); } //======================== // Gamepad Enable/Disable //======================== function getGamepadMode() { if((gamepadMode = getStorage(STORAGE_GAMEPAD_MODE)) == null) { gamepadMode = 1; //set default enable } else { gamepadMode = parseInt(gamepadMode)?1:0; } return gamepadMode; } function setGamepadMode() { setStorage(STORAGE_GAMEPAD_MODE, gamepadMode); } //==================== // Theme color state //==================== function getThemeColor() { var colorId, themeName; for(var i = 0; i < themeNameList.length; i++) { themeName = themeNameList[i]; if((colorId = getStorage(STORAGE_THEME_COLOR + themeName)) == null) { colorId = 0; } else { colorId = parseInt(colorId); if(colorId < 0 || colorId >= maxThemeColor) colorId = 0; } curColorId[themeName] = colorId; } } function setThemeColor() { setStorage(STORAGE_THEME_COLOR + curTheme, curColorId[curTheme]); } //=================== // Theme state //=================== function getThemeMode() { var themeName; if((themeName = getStorage(STORAGE_THEME_MODE)) == null) { themeName = THEME_APPLE2; } return themeName; } function setThemeMode(themeName) { setStorage(STORAGE_THEME_MODE, themeName); } //=================== // player name //=================== function getPlayerName() { var name; if((name = getStorage(STORAGE_PLAYER_NAME)) == null) { name = ""; } return name; } function setPlayerName(name) { setStorage(STORAGE_PLAYER_NAME, name); } //=================== // uid //=================== function getUid() { var uid; if((uid = getStorage(STORAGE_UID)) == null) { uid = ""; } return uid; } function setUid(uid) { setStorage(STORAGE_UID, uid); } //========================= // for debug only //========================= function genUserLevel(levels) { var levelMap = " H " + " &H " + " ## " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " + " " ; getEditLevelInfo(); while(editLevels > 0) delEditLevel(1); //clear all user level for(var i = 1; i <= levels; i++) { var tmpMap = levelMap; var no = i%5; var str = "##########"; for(var j = 0; j < no; j++) { var index = (no+j*2)*NO_OF_TILES_X; tmpMap = tmpMap.substr(0, index) + str + tmpMap.substr(index+str.length); } addEditLevel(tmpMap); } } //======================================= // BEGIN for set|get|clear localstorage //======================================= function setStorage(key, value) { if(typeof(window.localStorage) != 'undefined'){ window.localStorage.setItem(key,value); } } function getStorage(key) { var value = null; if(typeof(window.localStorage) != 'undefined'){ value = window.localStorage.getItem(key); } return value; } function clearStorage(key) { if(typeof(window.localStorage) != 'undefined'){ window.localStorage.removeItem(key); } } ================================================ FILE: lodeRunner.v.championship.js ================================================ //************************************************************ //* All levels extract from: //* Championship Lode Runner (Apple-II 1984) DISK IMAGE //* by Simon Hung 2014/02/20 //* //* "level 51" : Championship demo level (2014/04/27) //************************************************************ var championData = [ //======<<< Level 001 >>>====== " " + "H--------------------------H" + "H $ $ $$$$ $ $ $$ H" + "H $ $ $ $ $ $ $ H" + "H $$$$ $$$ $ $ $ $ H" + "H $ $ $ $ $ $ $ H" + "H $ $ $$$$ $$$$ $$$$ $$ H" + "H 0 0H" + "H--HHH---HHH---HHH--HHHH---H" + "H&S S S S S S S S H" + "H#H# S S S S S H##H" + "H#S #HH S S S S S###S #H" + "H#S S#H# S S H#H S #H" + "H# SSSS SHH#$$HHH SSSS #H" + "H# #H" + "############################", //======<<< Level 002 >>>====== "$0 @@ S$S 0 & $" + "H-----@-@----H----@@-------H" + "H----$@--@---H----@-@------H" + "H---@@@------H---$@--@-----H" + "H---@@@------H--@@@--------H" + "H------------H--@@@--------H" + "H0 $$$ 0 0H" + "H $ $$ H" + "H------------H---------@@--H" + "H--------@@--H---------@-@-H" + "H--------@-@-H--------$@--@H" + "H-------$@--@H-------@@@---H" + "H------@@@-----------@@@---H" + "H @@@ $$$ H" + "H H" + "H$$$$$$$$$$$$$$$$$$$$$$$$$$H", //======<<< Level 003 >>>====== "HHHHH$HH0HHHHHHHH&HHH S" + "HHHHHHHHHHHHHHHHHHHHH@ S" + "HHHHHHHHHHHHHHHHHHHHH@ S" + "$HHHHH0HHHH$HHHHHHHHH@######" + "HHHH@@@@@@@@@@@@@@@@@@@@@@@@" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH" + "HHHHH$HHHHHHHH0HH$HHHHHHHHHH" + "@@@@@@@@@@@@@@@@@@@@@@@@HHHH" + "HHHHHHHH$HHHHHHHHHH$HHH@HHH$" + "HHHHHHHHHHHHHHHHHHHHHHH@HHHH" + "HHHHHHHHHHHHHHHHHHHHHHH@HHHH" + "HHHH$HHHHHHHHH$HHHHHHH$@$HHH" + "HHHH@@@@@@@@@@@@@@HHHHH@HHHH" + "HHHHHHHHHHHHHHHHH@HHHHHHHHHH" + "HHHHHHHHHHH0H$H$H@HHHHHHHHHH" + "@@@@@@@@@@@@@@@#@@H$HHHHHHH$", //======<<< Level 004 >>>====== " H " + "-------------S--------------" + " $S$ H" + " $ H#H# 0$ H" + "H@@@@@@@@@@@@H@@@@@@@@@@@@@@" + "H S " + "H $S$ " + "H 0 $ ##H##H $ 0 " + "@@@@@@@@@@@@@H@@@@@@@@@@@@@H" + " S H" + " $S$ H" + " $ H###H### $ 0 H" + "H@@@@@@@@@@@@H@@@@@@@@@@@@@@" + "H S " + "H $S$ " + "H $& ####H####H $ 0 ", //======<<< Level 005 >>>====== "########################### " + "###########################S" + "& $ # S" + "H@#@#@#@#@#@# # ###########H" + "H@#@#@#@#@#@#@# # ####### #H" + "H $ # ####### #H" + "H#@#@#@#@#@# # # #-###-# #H" + "H#@#@#@#@#@#@# # #-###-# #H" + "H $ # #-# #-# #H" + "H@#@#@#@#@# # # #-# #-# #H" + "H@#@#@#@#@#@# # #-# #-# #H" + "H $ # #-# #-# #H" + "H#@#@#@#@# # #$#$#$#$#$#H" + "H#@#@#@#@#@# #X#########H" + "H 0000H" + "H########### ############", //======<<< Level 006 >>>====== "H--------------------------H" + "H# # # # $ ### # # H" + "H### ### # # # # ### H" + "H $ $ ### $ &H" + "H # # ### $ ### # #H" + "H ### # #$ ### # # ###H" + "H$ $ # # # # 0 H" + "H# # # # ### $ # # H" + "H### ### $ # # ### H" + "H $ $ # # ### $ H" + "H # # ### ### $ # # H" + "H ### # # # # ### H" + "H $ # # ### 0 H" + "H # # # # ###$ $ ### H" + "H ### ### # # # # H" + "H 000 $ ### $ $H", //======<<< Level 007 >>>====== "HHHHHHHHHHHHHHHHHHHHHHHHHHHH" + "H H" + "H $$ H" + "H $XX$ H" + "H #XX# H" + "H $ $#XX#$ $ H" + "H #$# $ ##$# H" + "H $ $### #$ ###$ $ H" + "H #$### $##$ ###$# H" + "H #### #### #### H" + "H $ $## $ $# ##$ $ ##$ $ H" + "H #$## #$## ##$# ##$# H" + "H #X $ $### ###$ $ X# H" + "H ## #$### ###$# ## H" + "H ## ### $$$$$$ ### ## H" + "H & H######H 0000 H", //======<<< Level 008 >>>====== "H$H##H$H@@H$H##H$H@@H$H##H$H" + "H@@H H##H H@@H H##H0H@@H H#H" + "HH0H@@H H##H0H@@H H##H H@@HH" + "HH##H H@@H H##H H@@H H##H HH" + "H@H H##H H@@H H##H H@@H H##H" + "H H@@H H##H H@@H H##H H@@H H" + "H##H H@@H H##H H@@H H##H0H@H" + "HH H##H H@@H H##H H@@H H##HH" + "HH@@H H##H H@@H H##H H@@H HH" + "H#H H@@H H##H H@@H H##H H@@H" + "H H##H H@@H H##H H@@H H##H H" + "H@@H H##H H@@H H##H H@@H H#H" + "HH H@@H H##H0H@@H H##H H@@HH" + "HH##H H@@H H##H H@@H H##H HH" + "H@H H##H H@@H H##H H@@H H##H" + "H&H@@H$H##H$H@@H$H##H H@@H$H", //======<<< Level 009 >>>====== "############S # S##########S" + "## 0HHH HH 0S S0HH HH 0#S" + " $## $# $#HH H#$ ##$ ##$S" + "$## $# $#HH H##$ ##$ ##S" + "## $# $#HH $ & H ##$ ##$ ##" + "# $# $#HH $####H$ ##$ ##$ #" + " $ # $#HH $## ##H$ ##$ ##$ " + "H## $#HH $## $$ ##H$ ##$ ## " + "H# $#HH $##$H##H$##H$ ##$ ##" + "H $#HH $##$H# #H$##H$ ##$ " + "H$#HH $##$H# $$ #H$##H$ ##$0" + "H#HH $##$H# $##$ #H$##H$ ##H" + "HHH $##$H# $####$ #H$##H$ #H" + "HH $##$H# $##$$##$ #H$##H$ H" + "H$ ##$H# $ ## $ #H$##H$H" + "##H $#H ############ H# $H##", //======<<< Level 010 >>>====== "H--- #### $HH ######## " + "H $##$### $H $## # " + "H $####$## $H $##$H####### " + "H$######$# H$ -##$H ## " + "H######### $H -# H ## " + "H --$$#$$# H$ -#H $# " + "H$ ##$##$ $H -#H# H# " + "&H $##$## H$ -#H#$H#$H#$H# " + " #H ##$##$ $H -#H@@@@@@@@@# " + "0#H $##$## H$ -#H # " + " #H ##$##$ $H -######H##### " + " #H $##$## #H -##$ #H# $# " + " $H ##$##$# H - # 0#H# ## " + " #H ##### H ## ###H#### " + " H--- ##### #HHHHH### " + " S ", //======<<< Level 011 >>>====== "H--------------------------H" + "H & H" + "H ##### ##### ##### ##### H" + "H # $ # # $ # # $ # # $ # H" + "H #@### ##### ##### #@### H" + "H # # # # H" + "H ###@# ##### ##### ###@# H" + "H # $ # # $ # # $ # # $ # H" + "H #@### ##### ##### #@### H" + "H # # # # H" + "H ###@# ##### ##### ###@# H" + "H # $ # # $ # # $ # # $ # H" + "H ##### ##### ##### ##### H" + "H # # # # H" + "H0 # # 0H" + "############################", //======<<< Level 012 >>>====== "S ------------------------H" + " #S X 0 # # 0 # # # H" + " $XS $#$ $X$ $#$ $X$ $#$ H" + "X #X#S### #X# ##X XX# ### H" + " # S # # # # # H" + "$#$ $XS SXS $#$ $X$ $X$ $#$H" + "X## ###S##XSX## #XX ### ###H" + " # # 0 # S # 0 X # # H" + " $X$ $#$ $XS $X$ $#$ $#$ H" + "X ### ### ###S### X## X#X H" + " # # # S # # # H" + "$#$ $#$ $X$ $#S $#$ $#$ $#$H" + "X## ### ### ###S##X ### ##XH" + " # $ # $ # $ # S # $ # $ # H" + "& H#H HXH H#H S# H#H H#H 0H" + "##H H H H H H H H H H H H##H", //======<<< Level 013 >>>====== "@ @@@@@@@@@@@@@@@@@@@@@@@@@S" + "@S&H H$H H$H H$H H$H H$H H@S" + "@@@H@@@@@@@H@@@@@@@H@@@@@H@S" + "@H@H$H H$H@H$H H$H@H$H@H@H@S" + "@H@@@@@@@H@H@@@@@@@@@H@H@H@S" + "@H$H H$H@H@H@H$H H$H@H@H@H@S" + "@@@H@@@@@H@H@H@@@@@H@H@H@H@S" + "@H@H@H H$H@H@H@H$H@H@H H$H@S" + "@H@H@H@@@@@H@H@H@H@H@@@@@H@S" + "@H$H H$H@H$H@H$H@H@H H$H@H@S" + "@H@@@@@H@H@H@@@H@H@@@@@H@H@S" + "@H@H$H H@H@H$H@H@H H$H@H@H@S" + "@H@H@@@@@@@@@@@H@H@@@H@H@@@S" + "@H@H H$H H$H H$H@H@H@H@H0H@S" + "@H@@@@@@@@@@@@@@@H@H@H@@@H@S" + "@H0H$H H@H H$H H$H@H$H H@H ", //======<<< Level 014 >>>====== " & 0 0 0 0 0 S" + "###H#X#H###H#X#H###H#X#H###H" + "###H#X#H###H#X#H###H#X#H###H" + "###H#X#H###H#X#H###H#X#H###H" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH" + "###H#X# #X#H### #X#H#X# ###H" + "###H#X# #X#H### #X#H#X# ###H" + "###H#X#$#X#H###$#X#H#X#$###H" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH" + "#X# ###H#X# ###H#X# ###H#X#H" + "#X# ###H#X# ###H#X# ###H#X#H" + "#X#$###H#X#$###H#X#$###H#X#H" + "H$HHH$HHH$HHH$HHH$HHH$HHH$HH" + "###H###H###H###H###H###H###H" + "###H###H###H###H###H###H###H" + "###H###H###H###H###H###H###H", //======<<< Level 015 >>>====== "0 " + "&$ $ $ $ $ $ $ $ S " + " H- H- H- H- H- H- H- H- H- " + " H H H H0 H H H0 H H " + " H H H H H H H H H " + " H H H H H H H H H " + " H H H H H H H H -H " + " H H H H H H H -H " + " H H H H H H -H " + " H H H H H -H #####H" + " H H H H -H #$######H" + " H H H -H ###########H" + " H H -H ##############H" + " H -H # ###############H" + "-H ####################H" + " S #######################H", //======<<< Level 016 >>>====== "HHHH HHHHHHHHHHHHHHHHHHHHHH" + "H $## @@ $ @H$0 @@$ @H $H" + "H $## @@0$ @H$ @@$ @HH" + "H$## $ @@ $ @H$ @@$ H" + "H## H## @@ $ @H$ @@$H" + "H@ $ HX# @@ $ @H$ @H" + "H @@ $ H#X @@ $ @H$ H" + "H$ @# ## $@@ $ @@H" + "H@H$ @@ $ H## @@ $ H" + "H$ @H$ @@ $ HX# @@&H" + "H@$ @H$0 @@ $ H#X $#H" + "H @@$0 @H$ @# ## $#@@H" + "H$ @@ $ @H$ @@ $ $#@ H" + "H@H$ @@$ @H$ @@ $ $#@ H" + "H0 @H @@ @H ## ## H" + "HHHHHHHHHHHHHHHHHHHH#######H", //======<<< Level 017 >>>====== " S S " + " $ S S " + " H@#H0 S S H#@H $ " + "H@#H H@@H H@@H H@@H" + "H& $ $ H#@H $H#@H $ $ H" + "@@H $ $ SH@@H H@#" + " H#@H0 H@@S$ H@@H H@#H $" + "H@@$ H#@H $ HS@@H$ H@@" + "H $ H#@H0 H@#S H#@H " + "H#@S $ H@@S H $ H 0 " + " $ S@@H H@@ S#@H H@#@H " + " H@#H $ H@@H $ H " + " H@#H $H@@H H#@H H " + "H@@H H#@H H@#H H@#H$ H@@H " + "H S S 0S S$ S$S S S $S " + "H@@@@@@@@H# @@#@@H# @@@@@@@@", //======<<< Level 018 >>>====== "########################### " + "& - #H ##H ##H ## ##H" + "##-###H###-#H###-#H###-# ##H" + "##-#X#H###-#H###-#H#$#-# ##H" + "##-#X#H##- #H###-#H#X- # ##H" + "##-#X#H - ##H -#H #####H" + "##-#X#H ####H#X#-#H#### # #H" + "##-#X#H# ###H###-#H#### # #H" + "##-#X#H##$##H###-#H####$ #H" + "##-#$ H#XX H#$#- H# $### #H" + "###X#########X##X###X######H" + " SSS -------------------0 0H" + "S SS S SS S SS S S 0 H" + " SS S S SS SS SS H" + " S S S S S S H" + "SSS SS S S S S H", //======<<< Level 019 >>>====== " -- @ - @@@ - @@" + "#H@$#@@H #$#@ H# $#@ H-$ " + "#H ##$ @H @@ H#$ #@ H # " + "#@@@@# @H 0H@# @## H #@ " + "$ #@@@H#@@@#@@#@@ H #@@ " + "X H@ H# -- ----H ##$@ " + "X@H @@#@@#@ $ @# @X@ #@@ " + " @@H - @@#@@@# @@$@@ @@ " + " @@H @#$@ $#@@@X@@@ @ " + "-- @@H @# @@@ ---H @@$ " + "$ H @@H H H @@ " + " #H @H H#@H---- @H @@ " + " #H@## @H#@# H 0 #0@ H " + "@# $##@ H@$##@@#S #@# HXS " + "@@@### H#@@## $#S#$@ H@$@S$" + "@$ #H@H &#@@ @S@# H X S@", //======<<< Level 020 >>>====== "S " + "S$ 0 ------------$$" + "H@------------ $$$$$$$$ $$@H" + "H@X#######X###X###X####X##@H" + "H@ $ 0 $ $ $ $ @H" + "H@ @@@@@@@@@@@ ###X####X##@H" + "H@ $$$0$$$$$ @ @ $$$$$$$$ @H" + "H@ ######### @ @ ######## @H" + "H@ $ 0 $ $ @ $ $ @H" + "H#H###########X##########H#H" + "H#H$ 0 $ $ $ $ $ H#H" + "H############# @@@@@@@@@@##H" + "H $ & $ $@ $ $ $ $ H" + "H############# ########## #H" + "H $ $ $ $@ $ $ $ $ H" + "H############# ############H", //======<<< Level 021 >>>====== "###########################S" + "####--------#--------- #S" + "### & # 0 H# #S" + "### #### ######### H# #S" + "## ##### ###$##$## H# #S" + "## $## #$#####$# H# #S" + "# 0 ###$####$ H# #S" + "# #### #$####$## H# #S" + "#X######@@ ###$#$### H# #S" + "#X#$$$$$#HH #$#####$# H# #S" + "#X######HH ####$####$ H# #S" + "#X#### ###$####$## HX #S" + "#X####H# ############ H####S" + "# H # ### H# #S" + "# H ### # H# $#S" + "########### #############XSS", //======<<< Level 022 >>>====== "@@ @@@@@@@@@@S@@@@@@@@@@@ @@" + "#H$$$$$$$$$$$S&$$$$$$0$$$$H#" + "@H@@@@@@@@@@@H@@@@@@@@@@@@H@" + "#H@0$$$$$$$H H H$$$$$$$$ @H#" + "@H#$@@@@#@@H$H$H@@#@@@@@$#H@" + "#H@$#H$$$0@HHHHH@ $0$$ #$@H#" + "@H#$@H@@@X@@HHH@@X@@@@H@$#H@" + "#H@$#H@ $$$$HHH$$$ $H@H#$@H#" + "@H#$@H#$@@@@HHH@@@$@H#H@$#H@" + "#H@$#H@$$ $$HHH$$0$$H@H#$@H#" + "@H#$@H@@@X@@HHH@@X@@@@H@$#H@" + "#H@$#H$$$$#HHHHH#$$$$$H#$@H#" + "@H#$@@@@@@@H@$@H@@@@@@@@$#H@" + "#H@$$$$$$$$H#$#H$$$$$$$$$@H#" + "@H@@@@@@@@@@@$@@@@@@@@@@@@H@" + "#H$$$$$$$$$$$$$$$$$$$$$$$$H#", //======<<< Level 023 >>>====== "########################### " + "#& # # # # -- -- --H" + "#$ # $H# $ # # $# #$ H" + "####H############### ##H###H" + "# #H$# # $# # $ #$H# H" + "# #H # # H#----H# H" + "#####H#####################H" + "# # H# # # $# $ #$H# H" + "# $ H#$ # #H HH#$ H" + "# #########################H" + "# # # #$H# # H# # H" + "# $ # # # $H# # # H" + "# ##H########H#############H" + "# $#H # # H$# #$ # H" + "# #H $ #H S# $H" + "############################", //======<<< Level 024 >>>====== "H---------------- 0#### ----" + "H----- 0 ------- ####### ---" + "H--- ### ---- ######## ---" + "H-- ####### - ####### ----" + "H- # ####### ###### -----" + "H- # $ ############ ##### --" + "H-- ### ########## ######## " + "H------- ########## ########" + "H ############ #######" + "H ###$###$###### ######" + "H ############## ######" + "H -----########-----######" + "H ----## ###------#####" + "H-- ###S####H##### #### ####" + "H #$##S ###### ###### ###" + "H&HXH###S ##H#H## ###", //======<<< Level 025 >>>====== "##########HHHHHHHH##########" + "#######HHHH00 &HHHH#######" + "######HH ###### HH######" + "#####HH #####-###### HH#####" + "####HH ######--# #$## HH####" + "###HH ##$####--####### HH###" + "###H ####0 -- 0#### H###" + "###H ########--######## H###" + "###H #####--#--#--##### H###" + "###H ####--##--##--#### H###" + "###HH ##- ## --###$-## HH###" + "####HH ###### -###### HH####" + "#####HH ###### ##### HH#####" + "######HH ###### HH######" + "#######HHHH HHHH#######" + "##########HHHHHHHH##########", //======<<< Level 026 >>>====== "#####HHHHHHHHHHHHHHHHH######" + "####HH HH#####" + "###HH & 0 HH####" + "##HH H######H######H HH###" + "##H H# $ #H# $ #H H###" + "##H---H@$ #H# $@H---H###" + "##H$$$H## ###H### ##H$$$H###" + "##H$$$H # X@@@@@# # H$$$H###" + "##H H ### ### H H###" + "##H---H $$$ H---H###" + "##H H ########### H H###" + "##H0 $HHHHH$ 0H####" + "###H XX#XXXXX#XX H#####" + "####H0 0H######" + "#####H H#######" + "######H$$$$$$$$$$$$H########", //======<<< Level 027 >>>====== " @0 @ " + " @H@@@@@@@@ @ " + " @H@@ @ " + " @H@@ @@@@@@@ " + " H H " + " H H " + " H H " + " H H @@@@@@@@@@@@@@@@@@@S" + " H $$@$$$$$$$$$$$$$$$$$$H" + " H @@@@@@@@@@@@@@@@@@@@@@" + " H " + " H $$$$$$$$$$$$$$$$$$$$$H" + " H @@@@@@@@@@@@@@@@@@@@@@" + " H " + " H $$$$$$$$$$$$$$$$$$$$$H" + "& H @@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 028 >>>====== " & 0 " + "##S#####X#########S#########" + " S # #S " + "S##########X##########X###S#" + "S # # S " + "####S###############X### S " + " S------------ S " + " - H ### ####H" + "####--H########### ---H" + "####- H - H" + "##0#- #####H####### - H" + "####- H $ - H#" + "##0#- ##H###### H##H # - H##" + "####- H H H H###" + "#$$# H H H H###" + "############################", //======<<< Level 029 >>>====== "HHH#H H#& 0#0HHHH" + "X#X#H $ $ $ $ H###$##X##H" + "H#X#H HHHHHHHH $HHH#$0$$0#H" + "H#HHH H#X#XXXH $ H#####$##" + "H##HH H#SS$$XHHHHH HHHHH#$$0" + "X##H$ H#$SS#X#XX#H $ $ H#X##" + "HHHHH H#SS$#XS$$#HHHHH HHHHH" + "H###H H###X#XSS##X#X#H $$$S" + "H$$#H HHHHH#$$$##$SS#H $HHHH" + "HHH#H$ H#X####SS$#H $HXX" + "HXH#H HHHHH#$$$$#H $HXH" + "HXH#####H$ H####X#H HHHXH" + "HXHHHHH#H HHHHHHHH H#XXH" + "HX##X#H#X###H$ $ $ $H#HHH" + "HHHH$#HHHH###HHHH HHHH#H#X" + "XXXXH###$HHH#XXXH$ $HXXX#H#H", //======<<< Level 030 >>>====== "##############S#############" + "# 0 $ 0 &SSS 0 $ 0 #" + "#S########### ##########S#" + " H------------------------H " + " H S H " + " H S H " + " H S H " + " H S H " + " H S H " + " H S H " + " H S H " + " H S$ H " + " H $ @ $ H " + " H @ @ @ H " + "H @ @ @ 0 H" + "H##### #### @ #### ####H", //======<<< Level 031 >>>====== " SS---S---S---S---S---S---SS" + " H##X###X###X###X###X###X##H" + " H#---# #-- # --# #---#H" + " H#X#X#X#X#X#X#X#####X#X#X#H" + " H# #---# # X---# #H" + " H##X#X#X#X#X#X#X###X#X#X##H" + " H# # #---#---# # #H" + " H#X#X#X###X#X#X#X#X#X#X#X#H" + " H# X H#---#---# # #H" + " H##XXX#X#X#X#X#X#####X#X##H" + " H# #---# X #H--# #H" + " H#X#X#X#X#X#XX######X#X#X#H" + " H#--- # # #H # #--#H" + " H##X#X#X#X#XXXXX#X#X#X#X##H" + " H&00 $ 000H" + " ############S S############", //======<<< Level 032 >>>====== " S & S " + " H H##########@@@@@@@@@@@ H " + " H H# H H " + " H H@$#H# $ 0 $H#H H " + " H H@@@@@@@@@@@@@@@@@@##H H " + " H H# ---H H " + " H H#$ 0 0 0 $#H# $#H H " + " H H#######@@@@@@@@@@#H H " + " H---H--- # H " + " H H#$ #H# $$ @H H " + " H H######@@@@@@@@@@H H " + " H H@ H " + " H H@$0 #H#H $$ #H H " + " H H@#@@@@@@@@@@@#H H " + " H H " + " H H ", //======<<< Level 033 >>>====== "-------------H$-------------" + " $ $0$ $H $&$ $ " + "######## H$ ########" + "## ## $H ## ##" + "#S# # # H$ # # #S#" + "#SS# # # $H # # #SS#" + "#SSS#0 # # H$ # # 0#SSS#" + "#SSSSXX###X##$H##X###XXSSSS#" + "#SSSSX # #H$# # XSSSS#" + "#####X##$ #$H# $##X#####" + " #HHHXHH#$ #H$# $#HHXHHH# " + " #HHXHHH#$ #$H# $#HHHXHH# " + "H #HXHHHHX$#H$#$XHHHHXH# H" + "HH #XHHHHHX#$H#XHHHHHX# HH" + " H XX####X#H$#X####XX H " + "##HH $H HH##", //======<<< Level 034 >>>====== " S - 0 " + "@S H #H @--------X" + " H@H#@@@@##@H###@H H H" + "H@@@H - @ $ @H##@H @ @ H" + "H@$ H$ $@H0-HH#@H--$ $-@H" + "H@@H H H@@H @@H@H @ $-@ H" + "H$@H H @$ H $@H@H--$ @ $-@H" + "H@$H-H@@H H $H@H@H @-$ @ H" + "H$@H @$ H H XH H@H--$ @ $-@H" + "H@$H@@H H H @$@H@H @ $-@ H" + "H@@@$ H H H $X$H@H--$ @ $-@H" + "H$@@H H H H H@@@ H @-$ @ H" + "@@$ H H H H H@ #H--$ @ $-@H" + "@ H H H H H H #H@H @ @ H" + "$@H@H@H@H@H @@@ &H@S 00 H" + "H H H H H H #H@@@####@@#@", //======<<< Level 035 >>>====== "S S" + "S $ 0 $ $ $ 0 $S" + "@@@@@@@@@@#H H#@@@@@@@@@@@@" + " H H " + " H##H " + "$ 0$ $ H H $ 0 $ " + "#@#@#@#@#@#@HH@#@#@#@#@#@#@#" + " HH " + "------ $ HH $ --------" + " H@@@@@@@@@@@@H " + " H H " + " $ 0 H $ $ H $0 $ " + "@@@@X#######HH#######X@@@@@@" + " HH " + " HH " + " $ &$ HH $ $ ", //======<<< Level 036 >>>====== " SSSSSSSSSSSSSSSSSSSSSSSSS " + " S 0 ----- & S " + " S######### H #########S " + " SSH-H-H-H #HHH# H-H-H-HSS " + " #-H-H-H-H-#H H#-H-H-H-H-# " + " #-H$H H$H-#HHH#-H$H H$H-# " + " ######### HHH ######### " + " H H " + " HHH ### " + " HHH #--H $ " + "H# -----$ H H # $ H### " + "H@$ --- # HHH-- @ # H-- " + "H#@#$- #H#@#@#H# # H " + "H #@#@#H 0 H #@#@#@#@# $@" + "@H @# #@#H#H $ $ #@" + "#@#@H$#H $ H#@#@#@#@#@#", //======<<< Level 037 >>>====== " S " + " H------------------HS " + " H- - - - - - - -###H " + " H # # # # # # # # H " + " H############### ### H " + " H# #### # ### # X#### H " + " H###############X####H " + " 0 H### ##### #####X#### H " + "H########## #### $ X#### H " + "H##-############X##X#### H" + "H#### $### ####X##X#### H " + "H# H##### ###-X#-X#-## H " + "HX###HX####$ ##X##XX####H " + "HX#-###--####--X##X--### H " + "HX####----##----##----## H " + "H HH 0 HH $ HH $ HH & H", //======<<< Level 038 >>>====== "&HHHH#### H###H-----####HHHH" + "H###H-----H###H#### ####H##H" + "H### ##X#0H###H####-----H##H" + "H $0$0 $0$H $ H$ $ $$ $ H" + "### @@X# #HX#H##H# X#X# #XH#" + "### $X# #HX#H##H# $#X# ##H#" + "#X# ##X# #HHHH##H# X#X# H HH" + "$$ $--------- $H $ $ $ $ " + "## XH##0#X## #X#H #X#H ##XX " + "## XH## #X#$-HHHH #$#H------" + "## XH## #X## ###H #X#H #### " + "$ $ H $ $ $$ H $$ H $$ $" + "#HXH#XHX### ####HX##XH#### #" + "#HXH##HX### ####HX##XH#### #" + "#HHHHHHX### ####HX##XH#### #" + "$H$$$$$$$$$$$$$$H$$$$H$$$$$$", //======<<< Level 039 >>>====== " 0 -- & " + " H####### ######H " + " H####### ######H-H- SS " + " H ### ### 0 H S S" + "H--H ### ### H S S" + "H H ### ### H SS " + "H 0 ### ### H " + "H ### $$ $$ ### H S S " + "H ### ## ## ### H SS " + "H ### ### H S SS" + "H ### ##### ### H " + "H ### ##### ### H#@##H" + "H ## ### ### # $ #H" + "#####H### $#$ ###---# # #H" + "# $ #H ###########----## ##H" + "# # #H ## ## H", //======<<< Level 040 >>>====== " " + "H---- " + "H &0 H###H --------- H###H" + "H #H#####H ----- H#####H" + "H ##H#H###H## ##H###H#H" + "H ##H#H###H## ### ##H###H#H" + "H #H###H#### H ####H###H" + "H H###H#### #H# ####H###H" + "H #H#H###H## #H# ##H###H#H" + "H ##H#H###H## #H# ##H###H#H" + "H ##H###H#### #H# ####H###H" + "H #H###H#### #H# ####H###H" + "H H H###H## #H# ##H###H#H" + "#H H##H###H #H# H###H#H" + "##HH##### $ ##H## $ ###H" + "######################### H", //======<<< Level 041 >>>====== " 0 S #S" + "## H### S # #S######S" + " ##H #S###### ### #S" + " H # ##### # H# #S" + " #S###### ####### #S" + " ### ####### 0 ##S" + " # ####### S" + "#### ## & ####H # S" + " H#### H H###S" + " H## H $ ####H H#### $ S" + "#H ### H### $ H#XS" + " H $ H $ H### H " + " ######H## ##### H ####H " + " $ 0 H $ H H " + "### ######H ### ####H H###" + " H H H ", //======<<< Level 042 >>>====== " ---- SS0 " + " H #######S S###### " + " H##### # #S S# # " + " H# ##### #&SS # H#####" + "H#H### # #H ###H## H# # #" + "H# # # #H # H H### #" + "H# $# # #H#######H H# #" + "H# ##### #H ###H# #####" + "H# # # # ### #H## H####H " + "H##### ### H##### H# #H " + "H # #$H # #######H #H$ " + "H # ###### # # 0 # $H#### " + "#H###H# 0# # # # # H# 0# " + "#H #H# $##### # ##### # " + "#H #H###### ##### #X## " + "#####H # X ", //======<<< Level 043 >>>====== " ###H### ###H### " + " ### H #### H ### " + " # H###### ######H # " + " ##S#### ####S## " + " #S H### ###H S# " + "X #S#####H H#####S# X" + "X@@S@@@@@@@@H H@@@@@@@@S@@X" + "X S $ # H H # $ S X" + "X@@S@@@@@@H@ -- @H@@@@@@S@@X" + " S H # # H S " + "0# S #H & H## ##H 0 H# S #0" + " #####H####H# #H####H##### " + "0 #H##$ H#$$#H $##H# 0" + "## ##H #--H#$$#H--# H## ##" + "### H ########## H ###" + "########H H########", //======<<< Level 044 >>>====== " & S" + " ##H#H#######H#########H###S" + " H #H# H #H# H # S" + " ##H##H## #H####H##S#######S" + " H S H H H H H S" + " #H H# ##H #H# #H # H- " + " # H H - #H ### #H###H " + " #H# #H##$#H#H # H #H " + " H# #H#-H# H-#H# H #H#H " + " H H####0## H #### H#H " + " #H - #H#- # #H - H#H " + " #H # H#### H# H H#$## H#H " + " H H#H---## #H HH#---H#H " + " ##H H H #H# # H#####HH " + " ###H- H----H---##-----H " + " 0 ", //======<<< Level 045 >>>====== "############# " + "#& # # $ # H ----------" + "# #$ H# $#-H H " + "#####H#######0H SH ####### " + "# #$H# #$ # H S H $###$## " + "#$ # H#$ #-HS H #$####$ " + "## ##H####### H $###$## " + "# $# H# $#H # H #$####$ " + "# $H# #$ # H $###$## " + "#####H####### H #$####$ " + "#--# H#--# # H " + "#--# H#--# 0# H#########" + "############# H# H# $#" + "#H # # H#########" + "#H0 # $ H# H# #H $#" + "############################", //======<<< Level 046 >>>====== " 0S S0 " + "@@ @@ @S & S@@ @ @@@@@ " + "@ @ @ @ S H S @ @ @ @@@ " + "@ @ @ SHS @ @@ @@@@@ " + "#####X###@#H########## 0## " + "H- H - - $-$$#H###H" + "H $#####$#H#$H# H# H##H #H" + "H $$#####$#H#@@@XX#H#X#$###H" + "H$$$#####$#H $ @@ $ $ H" + "H#$######$#HX@@#X######@@##H" + "H @@X$X@@@H@ $XX# $#@ $@@@H" + "##H@@$$$@@@H#H###@#########H" + "# H@$$$$$@@H@$ $ $#H" + "#H#########H@@@@@@ #####@@#H" + "#H $ $ $ $ H #####H#$ $H" + "############@ ####H0#H#S####", //======<<< Level 047 >>>====== "H - 0 0 0 0 - - - &-H" + "H# ##$##$##$##$## ## ## ## H" + "H## ## ## ## ## ## ## ## ##H" + "H ## ## ## ## ## ## ## ## #H" + "H# ## ## ## ## ## ## ## ## H" + "H## ## ## ## ## ## ## ## ##H" + "H ## ## ## ## ## ## ## ## #H" + "H# ## ## ## ## ## ## ## ## H" + "H## ## ## ## ## ## ## ## ##H" + "H ## ## ## ## ## ## ## ## #H" + "H# ## ## ## ## ## ## ## ## H" + "H## ## ## ## ## ## ## ## ##H" + "H ##$##$##$##$##$##$##$##$#H" + "H# ## ## ## ## ## ## ## ## H" + "H H" + "############################", //======<<< Level 048 >>>====== " S S " + " S S " + " # S S # " + " #@@X#H#X@@@@X#H#X@@# " + " #$$X#H#X X#H#X$$# " + " ### @H# #### #H@ ### " + " @@H@@ @@H@@ " + " #@@X@HH@ @HH@X@@# " + " #$$X@H##@X@@X@##H@X$$# " + " ### @H#$$X@@X$$#H@ ### " + " @@H### @@ ###H@@ " + " #@@X@HH @@@@ HH@X@@# " + " #$$X@H H@X$$# " + " ### @H H@ ### " + " 00 @HH & 00HH@ 0 " + "####H H##############H H####", //======<<< Level 049 >>>====== "##S S###" + "#####S0 & 0S######" + "#########SH#####HS##########" + " $ HX XH $ " + " H## H##$##H ##H " + "H#### H# H#####H #H #####H" + "H H##S#######S##H H" + "H 0 HX #S# X$ #SX #H 0 H" + "H######$#S#$### #S#$#######H" + "H #X#S#####X#S#X# H" + "X#H S S H###" + "X####H# S#########S #H###XX#" + "X$ #H##SH# $#$ #HS##H # $#" + "##$ H ##H# X#X #H## H # ##" + "### H H#######H H# " + "#####H###H H###H######", //======<<< Level 050 >>>====== "& -- -- ---- # $0$ $" + "0#H H@ $ @H#$#$# #H#X# H" + "@#####@H# ##H# # ####HH## H" + "@#####@H # #H#-- #$##H ##- H" + " H H########H $ H" + "H######XH H--# #$## ## ##" + "H# #H #H# $# H#$ ###@@ ###" + "H#$ # $#H## # H###$H $" + "H ##### H # H#$##H- $ #H##" + "H# H# #H #0#H###$H ## $H#$" + "H#$ # $XH ##H#$# H#$H# # " + "H ##### H #H# 0#H#HH####" + "H# # #H -H $ #HH ## $" + " #$ # $#H H $ # #H H##" + "$#######H H # #@HH H## H#$" + " H# # #@ H H##$H# ", //======<<< Level 051 >>>====== "& #0000# $ $ " + "# #----#H##########S##### " + " # #H# - S - - " + " $ #H#H###S####$## ## ##" + "### #H#H#$#S#####$## ## #" + "HH #H#H# #S ##$## ## " + "HH HH#H###S ##$## ##" + "HH H# S ##$## #" + "### ###H# S ##$## " + "@@@@@@@@@@##S#######H ##$##" + " S#$H# H ## #" + "$ #HS# # H " + "#########H####@@########H##H" + " H # # H" + "$ H HXH $#####$ H" + "#########################XH#" ]; ================================================ FILE: lodeRunner.v.classic.js ================================================ //************************************************************ //* All levels extract from: //* Lode Runner (Apple-II 1983) DISK IMAGE //* by Simon Hung 2014/02/20 //************************************************************ var classicData = [ //======<<< Level 001 >>>====== " S " + " $ S " + "#######H####### S " + " H----------S $ " + " H ##H #######H##" + " H ##H H " + " 0 H ##H $0 H " + "##H##### ########H#######" + " H H " + " H 0 H " + "#########H##########H " + " H H " + " $ H----------H $ " + " H###### #######H" + " H & $ H" + "############################", //======<<< Level 002 >>>====== " $ H" + "H@@#@@H $ H" + "H H H#########H $ H" + "H $ 0 H H H####XH" + "H#@#@#H H H S" + "H H----H------ 0H S" + "H H H H###@@@@@@H" + "H H H $ H H" + "H 0 H $ H#####H H" + "@###@##@##@H H###H##" + "@###@ H H H " + "@$ @ H ------H H $" + "########H###@@@@ H ####" + " H H " + " H & H " + "############################", //======<<< Level 003 >>>====== " S" + "---------- $ S" + "H $ H##########H S" + "#####H H H@@@@@@@" + " H 0 H $ H " + " H######H#####H## " + " $ H H H -- " + "####H# H 0 H -- " + " H H######H## --$" + " H----H H 0 #" + " H H#########H " + " H H#########H " + "###H########## $ #####H#" + "###H########## H###H #####H#" + " H & H###H $ H " + "############################", //======<<< Level 004 >>>====== "S " + "S----------- " + "H H # $ # H " + "H $ HHH $ ##### $ HHH $ " + "H HH H HH HH H HH " + "H H HHHHH H H HHHHH H " + "H H $0$ H H H $0$ H " + "H H#####H HHH H#####H " + "H HHHHH HH H HH HHHHH " + "H H HHHHH H " + "H $ H $0$ H $ " + "H######H H#####H H#######" + "H H HHHHH H " + "H H H " + "H H $ & H " + "############################", //======<<< Level 005 >>>====== " S " + " S $ 0 " + "### S ####H#######" + " ## S ## H " + " ## S ## H " + "$0 ### S $### H $ " + "##H#### S ####H###H#######" + " H ## S ## H " + " H$0 ##H## H $ " + "H###H H #H##H### " + "H H H " + "H H $ 0 H " + "H H#######H######H#####H##" + "H H H " + "H H & H " + "############################", //======<<< Level 006 >>>====== "##################S#########" + "# $ S# 0 $ #" + "#X###H####H $ S#######H#" + "#X###H############## ### H#" + "# H $ 0 #### ### H#" + "#H#########H######## ### H#" + "#H ######H#####$$# ###$ H#" + "#H ######H##############H#" + "#H # $H $ 0 $ #H#" + "#H ###H#######H#######H#H#" + "#H $###H H#######H#H#" + "#H##X# H & H ## H#H#" + "#H##X#H#####H########$$ H#H#" + "#H##X#H#####H######$######H#" + "#H0 H##$##H $ 0 H#" + "############################", //======<<< Level 007 >>>====== " S " + " S --------" + " S 0 H H" + "#####H# #H### 0H $ H" + " H H ###H#######" + " 0 H $ H H " + "#####H#### H H " + " H H H " + " $ H $ H H " + "##H############H H #### H" + " H H $ H #### H" + " H $ H----H # $# H" + "#######H H #####H" + " H H H" + " H & $ H 0 H" + "############################", //======<<< Level 008 >>>====== " S S " + " S S " + " $ 0 H#S S#H 0 $ " + "H#####H--H#S S#H--H#####H" + "H# #H #S S# H# #H" + "H# #H #S S# H# #H" + "H# $ #H #S S# H# $ #H" + "H#####H #S S# H#####H" + "H# #H #S S# H# #H" + "H# #H---#H####H#---H# #H" + "H# # H#H H#H # #H" + "H#0$ # H#H $0H#H # $0#H" + "H##X## H#@@@@@@#H ##X##H" + "H X H H X H" + "H X0H & H X H" + "############################", //======<<< Level 009 >>>====== "S " + "S---------------------------" + "H# 0 # # #" + "H ##### ##### " + "H # ### #$### " + "H ##### 0 0 0 ##### " + "H ### #X################# # " + "H #####X### $## $########H# " + "H #####X#################H# " + "H #####X#################H# " + "H #####X#### #########H# " + "H #####X#### #########H# " + "H #####X#### $H########H# " + "H ####H--------H " + "H @@@@ " + "H & @@@@ 0 ", //======<<< Level 010 >>>====== " $ S " + " H####### $ S " + " $ H ###### S " + "##########H $ S " + " H######S#####H## " + "0 H S H " + "##########H S 0 H $" + "##########H#######@@ H####" + "##########H H " + "##########H $ ---H " + "## ##H ## H " + "## $$ ##H $ H " + "###########H#######H H " + " H ########H" + " $ & H H" + "############################", //======<<< Level 011 >>>====== " H " + " 0$ H $0 " + "H##0$ H $0##H" + "H ## H####SH#####H ## H" + "H HH$ H H" + "H $HH H H" + "H HH$ H" + "H $HH H" + "H HH$ H" + "H $HH H" + "H HH$ H" + "H $HH H" + "H HH$ H" + "H $HH H" + "H & HH$ H" + "H H################H H", //======<<< Level 012 >>>====== " $ $ H " + "H#################H H " + "H $ H-----H $" + "#########H######### H###" + "########HH H " + "#######HH-------H H " + "#$ $##HH 0 H $ 0 H $" + "#####HH H####@@@####H###" + " H H H " + " H H H " + " 0H $ H-----------H $" + "H###########H $ $ H###" + "H H ######### H " + "H H H " + "H $ H & $ H " + "############################", //======<<< Level 013 >>>====== " 0 0 " + "XHXHXHXHXHXHXHXHXHXHXHXHXHXS" + "XHXHXHXHXHXHXHXHXHXHXHXHXHXS" + "$H#H H#H$H#H H#H$H#H H#H$H#S" + "XH#HXH#HXH#HXH#HXH#HXH#HXH#S" + "XH#HXH#HXH#HXH#HXH#HXH#HXH#S" + "XH#HXH#HXH#HXH#HXH#HXH#HXH#S" + " H#H$H#H H#H$H#H H#H$H#H H#S" + "XH#HXH#HXH#HXH#HXH#HXH#HXH#S" + "XH#HXH#HXH#HXH#HXH#HXH#HXH#S" + "$H H H H H H H H H H H H H#S" + "H##########################S" + "H $ 0 $ $ 0 S" + "H@@@@@@@@@@@@@@@@@@@@@@@@@@S" + "H$ & $S" + "############################", //======<<< Level 014 >>>====== " H 0 - 0-H H- $" + " -H -H- - - H- H - H" + "- H - H - - H - H - H" + "$ H - H - - H -$H -H" + " H- -H -- H$ -H H" + "H- - H- -- - H------ - " + "H - -H -$ - H - H - " + "H- - H$--H - H -H -" + "H - - H-- H - H - H -" + "H- $ -0H- H - -H- - H -" + "H -H - H - - H -" + "H- H - H - - - H -" + "H -H - - H$- - - H $-" + "H- H - - H- - $- - H - " + "H -H - -H - - - -H- " + " H $ $& H ", //======<<< Level 015 >>>====== "S S" + "S $ 0 $ $ 0 $ S" + "SSSS########H H########SSS" + " H H " + " H#############H " + "$ 0 $H $ $ H$ 0 $" + "#######H $ $#####$ $ H######" + " H #### #### H " + " $ H $ H $ " + " H######################H " + " H & H " + " H $ $H#######H$ $ H " + "##########H H#########" + " H H " + " $ H H $ " + "#@#@#@#@#@#@#@#@#@#@#@#@#@#@", //======<<< Level 016 >>>====== " S " + " & S " + " X####HH######HHHHH S" + " H # H S " + " $ H H# H S " + " #$ HH# H S " + " ###$ H# H S " + " #####$ H# H S " + "######## H# H S " + " $##### H# H S " + " ### H# H S " + " # H# H S " + " 0 H# H 0 S" + " H##############X######### S" + " ############### H#S" + "################ $$$$$$H##", //======<<< Level 017 >>>====== "S S" + "S S" + "S 0 S" + "H###X######################H" + "H###X######################H" + "H $ ##--------## H" + "H $#H 0 $## 0 H" + "H ### ##H ######## #####H" + "H #$# ##H ## ##$##H" + "H & ##H ## #####H" + "H ### ########HH## ##$##H" + "H ### ########HH## #####H" + "H ### ## H ## H" + "H ### ## $H ## $ H" + "##########H#########H#######" + "####### $H###### $ H#######", //======<<< Level 018 >>>====== " S " + " S $ $ $" + "HX#H H###H H###H# #H" + "H ###### H#####H H $ H" + "H$ 0 H H #### H" + "HX#### ###H# H" + "H @#### ## H# H" + "H @##### ## H#H H" + "H @########### $ H ##" + "H @########### ### H " + "H @ ### ### H 0$" + "H @ $ ## $ ## 0 H ##" + "H @H###########H######H ##" + "H H H H ##" + "H H & H ##" + "############################", //======<<< Level 019 >>>====== " H##H " + " 0$H##H$0 " + " H######H " + " $H######H$ " + " H##########H " + " 0$H##########H$0 " + " H##############H " + " $H $$$$$$$$ H$ " + " H##################H " + " $H##################H$ " + " H######################H " + " H######################H " + " H H " + " H H " + " H & H " + "############################", //======<<< Level 020 >>>====== " 0$ " + " ########H 0 $ " + " 0 $ H#H#####H" + " $#####H H H H" + "###X### H-------H H$ H" + " H H #######" + " $ H H " + "###H#######H H--------" + "$ H 0 H $ H $" + "######### ########H ####" + " $ $ H " + "#####H###X###H $ H $ " + " H ##############H" + " H H" + " H $ & $ H" + "############################", //======<<< Level 021 >>>====== "@@@@@@@@@@@@@@@@@@@@@@@@@@S#" + "H----------------------HSSS#" + "H H ## 0 $ HS$ #" + "H H #####################H#" + "H H ### $ H#" + "H H # ###################" + "H H H# $ # $ # $ # $ #" + "H H H##H##################" + "H H--H H##### ##### #" + "H H H H # $# 0 #" + "H H H H--H ####H--#######" + "H H H H H H #######" + "H H H H H--H H #######" + "H H H H H H #H### $$$ #" + "H H& H H 0H H H###H#####" + "##################H $$H#####", //======<<< Level 022 >>>====== " $ $ " + "$$################H " + "## $ $ H " + " H########H $ $ " + " H H######## " + " $ 0$ H " + " H######H------ $ " + " H H H#########H" + " $ H H H H" + "###H 0 H 0 $ H $ H" + " H###H######H H#####" + " H-------- $ H " + " $ H$ H######H $ " + "#######H H H#####" + " H H " + " H $ & H $ ", //======<<< Level 023 >>>====== " @@@@@@@@@ S " + " @ @ S @@ " + " @ $$ 0 #H S @@ " + "@@##H########@@H 0 S$@@ " + "@###H###########H##@@@#H@@@@" + "@##HHH#-------#HHH#----H---H" + "@##H H# $ #H H# $ $ H" + "@##H H# & #H H# H" + "@##H$H####H####H$H#@ @H" + "@#########H################H" + "@ ##HHH## $ $ $ H" + "@------#HH HH--------------H" + "@ $ #H H 0 H" + "@ H H ########### H" + "@@@@ H H ### $## $ ##H" + "@######@H$ $H #############", //======<<< Level 024 >>>====== " S " + " SS " + " SS " + " SS " + " SS " + " S " + " H##H " + " H##H$ " + " H#######H 0 " + " #H 0 H# $ $ #H #H#H " + " ###H############H###H " + " ## $ #### $ H$ ##H " + " ####H $ ###H H##H #H " + " #$#H###H $ H H$#H$#H " + " 0 ##################H & " + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 025 >>>====== " @ @ @ S@" + " @ @ @ $ S@" + " @X####@ @#### ###S@" + "### ###H0 $ $S@" + "###########H H######## #H@" + " & H ##H# $ #H@" + "#H#########H $#H# #####H #H@" + "#--------##H ##H# # H #H@" + "# # # $##H HH # ###H #H@" + "# # # #HH####H##$###H #H@" + "# # $# #H# # ###H H@" + "# #### #H# #### # H#HH@" + "#H## ##HHH# #$## #######H @" + "#H @@#HH## # ##$ H#@" + "#H @ H##X####X#######H#@" + "#H### H 0 H @", //======<<< Level 026 >>>====== " S " + " 0 S " + "H##########H 0 $ $ S " + "H H#####H ###H###" + "H $ $ H @H H " + "H # ### # H $$ @H 0 H " + "H # ### # H @@ @#########@@" + "H # ### # H @@ @$" + "H # ### # H @------- $ @H" + "H #$ ### # H @$ ####H@H" + "H ##### # H @@ H H" + "H ######## H @@ $ H##" + "H H @@ ###### H " + "H@@@@@@@@#@@@@@ H " + "H & H " + "############################", //======<<< Level 027 >>>====== "S S" + "S & 0 S" + "S @#H#@----------@#H#@ S" + "S @$H @ $ $ @ H @ S" + "S @## H ##@ @## H$##@ S" + "SS@$ H $@ $ $@ $ H #$@SS" + "@S### H ##@ @#####H # #S@" + "@ H @ $@$ H # $@" + "@ H#####@H#@## $H ## #@" + "@ $ 0 H 0 H ##H @" + "@H####H @##H###@ H #H@" + " H@ $ H # H $ # H 0@H " + " H@## H ### H ### H ##@H " + " H $@ H @ H $@ H @$ H " + " H ### H ### H " + "############################", //======<<< Level 028 >>>====== " S " + "----------- S " + " $ $ @H S $ " + "#########@@@@@@@H $H@H " + "#@#@#@#@@@@@ @@@@@@@H " + " @@ $ @H 0$ " + "--------H @@#####H @@####H" + " H @@ H0 ####H" + " H @@ ########H ####H" + " $ $ H @@ # #H ####H" + "###0 # H @@ # $ #H ##$#H" + "####### H @@ ########H ## #H" + " H # $ #H #H" + "############## H##H #######H" + " & H $H H" + "############################", //======<<< Level 029 >>>====== " 0 -- - 0 " + "#### H - ##H " + "#### H ## - 0 -##H " + "#$$# H ##- ####### -H " + "#### H ####### H H### " + " H--- ####### H #$# " + " - H ####### H ### " + " #### H ##$$$## H " + " - #### H ####### H " + "###- #$$# H- - -H " + "#$# #### H - - H #### " + "### H & H #### " + " H ### H #$$# " + " ## H #$# H #### " + " ## H #X# H " + " H H ", //======<<< Level 030 >>>====== "@ S" + "@ $$$$0 0 0 & S" + "@##########X###############H" + " H" + " @ $ $ $ $@ H" + " @#######X#######X####@ H" + " H" + " @ $ $ $ @ H" + " @###X######X#####@ H" + " H" + " @ $ $ $@ H" + " @@##############@ H" + " H" + " H" + "$$$$ 0 0 H@ H" + "##########@@@@@@#######@@@ H", //======<<< Level 031 >>>====== " S " + " S " + "$ SS $" + "#H H----------S---------H H#" + "##HH 0 $ HH##" + "###H H------ ---------H H###" + "####HH $ HH####" + "####XH H------ -----H0HX####" + "####X#HH $ HH#X####" + "####X##H H--- ----H H##X####" + "####X###HH $ HH###X####" + "####X####H H-- -H H####X####" + "####X#####HH HH#####X####" + "####X######H H######X####" + "####X#######H&$H#######X####" + "####0 H##H ####", //======<<< Level 032 >>>====== " " + "###S#### ------ 0 " + " S -- 0 @@@@@H" + " H# #####H######--- # H" + "H#### #$---H-----# ####H#" + "H #### ###H# #$ H " + "H #----H----H# #- H " + "H &# #H$#$H$#H$H# # H$" + "#H## ############ ##H###" + " H $# $ # H " + " H ## ###H # H " + " H $# # H #$ H#####" + " H # # $ H ## H " + " H$# # H######H # #$H " + " H# $ # H# $ #H #H " + "############################", //======<<< Level 033 >>>====== "#####S################# ####" + " #S# ------- #" + "S##S S# #$ #H# 0 #" + "S ##### ######H#####$ #H####" + "#S $---####H########H# ##" + "####### # #H### ####H# ##" + " 0 #H### ## #H#$ #" + "H#######H#H$ #H### ## #H####" + "H H#####H###$ # #H## #" + "H ####H###### #H##$#" + "H # H H #" + "H###H####H#@#@#@#@#@#@#H#@#@" + "H###H####H###### #####H#@#@" + "H H H####### ####H " + "H########H########$ #######H" + "H& H $ ###### 0 H", //======<<< Level 034 >>>====== " --------$$######$$-------- " + "H $###HHHH###$ H" + "H $##HHH00HHH##$ H" + "H ##HH HH## H" + "H $#HH HH#$ H" + "H ##H$ $H## H" + "H #HH$ $HH# H" + "H #H$$ $$H# H" + "H #HH$ $HH# H" + "H ##H$ $H## H" + "H #HH$ $HH# H" + "H #XHH$$ $$HHX# H" + "H X#HHH$$HHH#X H" + "H ###HHHH### H" + "H& 0 ###### 0 H" + "#########H H#########", //======<<< Level 035 >>>====== "S ## S" + "S @@ S" + "S $ $ ## $ $ S" + "@#@#@#@#@#@#H@@H#@#@#@#@#@#@" + " $ $ H##H $ $ " + "H@#@#@#@#@#@#@@#@#@#@#@#@#@H" + "H $ $ ## $ $ H" + "@#@#@#@#@#@#H@@H#@#@#@#@#@#@" + " $0 0$ H##H $0 0$ " + "H@#@#@#@#@#@#@@#@#@#@#@#@#@H" + "H $ $ ## $ $ H" + "@#@#@#@#@#@#H@@H#@#@#@#@#@#@" + " $ $ H##H $ $ " + "H@#@#@#@#@#@#@@#@#@#@#@#@#@H" + "H & H" + "#@#@#@#@#@#@#@#@#@#@#@#@#@#@", //======<<< Level 036 >>>====== " $ $ $ 0$ " + "H######H### #####H### #####H" + "H H H H" + " H H - H H " + "H H - - H H" + " H H- - H --------H " + "H------H - H H" + " 0 H- -H H " + "###### H - - H 0$ $ H" + "## ### H - - H -###@@@" + " $ $ H - H -###@@@" + "##X### H - - H -###@@@" + "##X# # H - - H -##$$@@" + " $ $ H- -H -@@@@@@" + "###### H $ & H $ @@@@@@" + "############################", //======<<< Level 037 >>>====== "S " + "S 0 " + "S##########@@@@@@#@@@@#@@@@H" + "$ H H" + "## @ $ $---$ H" + "#####HH#HH######## # # H" + " #HH HH# @@#### 0 H" + " #HH$HH# @ #### ###H####H" + " ####### @$### H H" + " H H" + " & #H#####H@@@@H" + "##H########H### H $$ H H" + " H H H @@ ##H" + " H##$# H ### @@###### H" + " H#### 0H $ @@ H" + "##################@@####@@@@", //======<<< Level 038 >>>====== "S S" + "S S" + "######H####H0 0H####H#######" + " - H H@H@H H - " + "H ##### H $ ###### H" + "H ##### #HHHHHHH# ###### H" + "H ###$# #H@@@@@H# ##$### H" + "H ##### #HHHHHHH# ###### H" + "H ------- H" + "H 0 H @ H 0 H" + "H@@@@@H $@@@$ H@@@@@@H" + "H H @@@@@ H H" + "H#####H @@@@@@@ H######H" + "H H $@@@@@@@@@$ H H" + "H@@@@@H @@@@@@@@@@@ H@@@@@@H" + "$ H@@@@@@@@@@@@@H & $", //======<<< Level 039 >>>====== "### S ## ## ## S ###" + "#### S#### 0#### 0####S ####" + "H ##H# ##H# #H## #H## H" + "H #H--H #H $H# H--H# H" + "H 0####$H####HH####H$#### &H" + "H### ##H# #H## #H## ###H" + "H## #H$ H# $H# ##H" + "H### ####HH####HH#### ###H" + "H ##H# ##H# #H## #H## H" + "H #H #H $H# H# H" + "H ####HH####HH####HH#### H" + "H### ##H# #H## #H## ###H" + "H## #H H# H# ##H" + "H### ####HH####HH#### ###H" + "H $ HH $ HH $ H" + "H##########################H", //======<<< Level 040 >>>====== "S #################" + "S ########@ ------#" + "S $ H# $ @H # $ #" + "#########H@####### @H ######" + " $ H@ $ @H ######" + "H#########@ ##X### @H ######" + "H 0$ @ $ @H 0 " + "#########H@ ##XXX# ########H" + " $ H@ $ H" + "H#########@ ##X### H" + "H $ @ $ H" + "#########H@ ##XXX# ##### H" + " $H@ $ # $# H" + "H#########@ ##X### H## H" + "H 0 & H# $ H" + "############################", //======<<< Level 041 >>>====== " --$ --------0----- -----" + " H $#$ H- # -H $$$" + "$&H $# #$ H- ### -H $$" + "## $# #$ H- # # -H $" + " 0 X # # H- ## ## -H 0" + "H## ### @@@- #$$$# -#H" + "H # # $ HH### H" + "H - ### $H H##H# H" + "H - # $H H$$H -------H" + "H - $H H@@@@H H" + "@@@H ---H H$ $H ------H" + " H H######H H" + "###H###H H$ $H -----H" + " H H@@@@@@@@H H" + " H 0 H$ 0 $H ----H" + "########@@@@@########H H", //======<<< Level 042 >>>====== " $ $ $ $ " + "H### H### H##########H" + "H $ $ H $ H $ $ H" + "H###H###H #####@##@####@##" + "H H 0H --------------- " + "####H######H $ $0 H" + " H H @####@@@@@@###H" + " H@@@@@ H @ $ $ H" + "# H $ @ H @ @@@@@@@@@ H" + "#$$@@@###@ H @ @ $ $ @ H" + "###@@@###@ H @ $ @ H####H@ H" + " $ $ H @@X@@ H H@ H" + "######### H @ H 0H@ H" + " $ $ @ H @########@@@@ H" + "######H @@@@####@ $ $ &H" + "####$#H H#########", //======<<< Level 043 >>>====== " " + " S S " + " H#######################H " + " H H## $ $ 0 $ ##H H " + " H###H###############H###H " + " H H H ### $ $0##H H H H " + " ##H###H H#######H H###H## " + " H H H H H H###H H H H H H " + " H###H###H H $ H H###H###H " + "$ H H H H H0H@@@H0H H H H H$" + "####H###H$H@H@@@H@H$H###H###" + "##H H H H@H@H@@@H@H@H H H H#" + "##H## H@H@H@H@@@H@H@H@H ##H#" + "##H H@H@H@H@H@@@H@H@H@H@H H#" + "##H@H H H H H &H H H H H@H#" + "############H#$#H###########", //======<<< Level 044 >>>====== "###########################S" + "# HHHHHHHHHHHHHHHHHHH #S" + "# & H HHH H HH H 0 #S" + "####H HHH HH H HH H HHH####S" + "# H HHH HH H HH H H #S" + "# 0 H HHH HH H HH H HHH 0 #S" + "####H H H HH H####S" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHS" + "H $ H $ H $ H $ H $ H $ HS" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHS" + "H H H H HH H HH H H HS" + "H H H H H H H H H HHH H HS" + "H HH H H H H H H H HHS" + "H H H H H HH H HH H HHH H HS" + "H H H H HH H HH H H H HS" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHS", //======<<< Level 045 >>>====== "@@@@@@@@@@@@@@@ S @@@@@@@@@" + " 0H H--- S H $ " + "@@@S##@@@@@#X#@@@S H@@@@ H@#" + "@--H H----H H #####" + "@ H $ #$#H0 H $ ##" + "$ XH H @#H @@####@#" + "@#XH-------H-----@H-------H@" + "#$ @ H $H@@@ H#" + "@@X# $$$H H@---- $ HH" + "@ H H@H $ X#@H" + "###X## H & H@H H" + "#H---- H@###@##X@@H H" + "#H$ #H H#H @#### H" + "#H@--###H H@H # $ @ H" + "#H ###@#H 0 H H #@@#@@" + "@#####@@@@##############@###", //======<<< Level 046 >>>====== " $ S " + "####H 0 S " + " $ H H######H $ " + "########H######H #######" + " H H $ $ " + " $ H H############" + "#H######H $ H " + " H $ H@@@@@@H $ " + "#H######H #####H######H" + " H 0 $ H H" + " $ H###H#######@@@@@@@@" + "###H##### H $ $ 0 " + " H H########H#######" + " H-------H H " + " H & H $ " + "#######################S####", //======<<< Level 047 >>>====== "@ @@@@@@@@@@@S" + "@0 0 @ $ @ S" + "@@------#####H &@ H@ @H@###S" + "@##### $ ###@@ H@ @H@###S" + "@ ###### H@ @H@ S" + "###H ####H $ H@ @H@ $ S" + "# ###@#H H###@@ @H@###S" + "# $ ##@#H H @ @H@###S" + "##### ###@#H @ @H@ S" + "# $ #@H# ##@##H@ @H@$$ S" + "### H##@@# $ @H@ @H@###S" + "# #@##H ###@@#@H@ @H@###S" + "# ###@##H $ @H@ @H@ ##S" + "# H## $###@@#H#@H@ @H@ #S" + "# H# H $H@ H $S" + "#$H#@####@#####@##@@##@#####", //======<<< Level 048 >>>====== " $ " + " ------- ####H& " + "H $ H $ $ " + "H H@@@@ #######H#####" + "H H $ H " + "H######H ####H H " + "H H $ H0H###########H" + "H H H@@@@ H@@@@@@@@@@@H" + "H $H# H$ H@ $ @H" + "H H# ####H H@H@@@@@@@H@H" + "H $H# $H H@H@ $ H@H" + "H H# H@@@@ H@H@@@@@@@@@H" + "H H# H $ H@H $ H" + "HH# ####H H@@@@@@@@@@@@" + "HH 0 S H 0 " + "############################", //======<<< Level 049 >>>====== " - - - - $ $ " + "- - - - H - - H######" + " - - - - H - - H " + " - - H -- H 0 " + " $ $ $ H - H@@@@@H" + "@@@@@@@X@@@@@@H- H@ $ @H" + " @ H@H@$@H" + " $@ & $ H@H@$@H" + "H##########H#@@H####-H@H@$@H" + "H 0 H##HH H@H@$@H" + "H ## H##H $0 @H@$@H" + "H ### ### H##@@#####H@H----" + "H ### ### H## H " + "H ###$$### H# --$H #### " + "H $ $##$ $ H## H# #H##$$##" + "############################", //======<<< Level 050 >>>====== "H - H----" + "H H H @ " + "H H 0 H @$$" + "H $ H#### $ $H#####X#H###" + "H## H ######### HH#X" + "H H HHX" + "H H-------------------HH" + "H H H" + "H H $ 0 $ $H" + "H #####H@@@@@@@@@@##X###" + "H--- H --- " + " 0$ H H " + "#########H H $ H- $ " + " #####H@@@H#### #$###" + "$ & H H 0 #####" + "#############H H##########", //======<<< Level 051 >>>====== "#@#@@# S@#@@###@" + "##@@## S#@@###@@" + " @#@# $ $ S#@ @" + "H# @##@###@H##@ S#@ #@H @" + "H#@ @#@@###@H ## $S@ #@H @" + "H## @##@@H #@### $#@H @" + "H@##$ #@@#H ##@H$ " + "H#@#### @##H -------#@@#H" + "H @@#@##$ #@H $ #@ H" + "H H## @@#@@#@ #@ H" + "@###@@H@## $#@ H" + "#@#@@@H#@##$ 0 $###@ H" + " $ H@@###X@@@@@@X###@@H##" + "H#@###@@ 0 & H@#" + "H@###@ H##@@#@@##@#@@##@@@#" + "H $ H 0 @#@", //======<<< Level 052 >>>====== " H " + " H $ 0 " + "---- $ S @@@@@@@@@@@@H" + "H @@@@@@@ H" + "H ----- ----- H@@@@" + "H--------- H H " + " 0 $ H# H " + "H@@@@@@@@@@@@@@@@@@# @@@@H" + "H HH" + "H $ $ 0 @ H " + "@@@@##@@@@H #@@#@@@@@@@@ H " + " H H " + " $ H $ H " + "H@@@@@@@@@@ @@@@@@@@ H " + "H ------H " + "H & 0 ", //======<<< Level 053 >>>====== " " + " 0 0 $ $S" + " H############## H####" + " H ############ H#####" + "H###### #$##$##$## H######" + "H####### 0H#######" + "H#############X######### " + "H########$ $ $ $##### $$ " + "H#########X###X#############" + "H 0 $###### " + "H H#####H#####H -H#### $H" + "H H H H H H ### $H##" + "H H$$H$$H$$H$$H # $H####" + "H H#####H#####H $H######" + "H & H########" + "H###########################", //======<<< Level 054 >>>====== "S #############" + "S $ $ #############" + "##############H $ " + "###########################H" + " $ 0 0 $ H" + "H###########################" + "H $ $ " + "###########################H" + " $ $ $ H" + "H###########################" + "H $ 0 0 0 $ " + "###########################H" + " $ $ $ $ H" + "H###########################" + "H $ $ & " + "############################", //======<<< Level 055 >>>====== "############S ##############" + "#---------# S #---------# " + " #$ H $# S #$ H $# " + " #$ H $# S #$ H $# " + " #$H$# S #$H$# " + " #H# S@@@@@##H# " + " & #H# S@ $ #H# 0 " + "###H#H######X#######H######H" + " H H 0 H H" + "H##@#H##############H#@#####" + "H---#H#------------#H# " + "H $# H #$ $# H # " + "H$# $H$ #$ $# H # " + "H# $#H#$ #$ H### H # $ " + "H $##H$#HH#@H#@# 0 H $ ###" + "#########H H $#############", //======<<< Level 056 >>>====== "$$$----$$$ $$$-----------$$$" + "### ###H### ###" + "### ###H### ###" + "### ###H### $$$ ###" + "### ###H### ### ###" + "### ###H### ### ###" + "### ###H### ### ###" + "### ###H### ### ###" + "### ###H### ### ###" + "###$--$###H###$--$###$--$###" + "####$$####H####$$#####$$####" + "##########H#################" + " ######## H ####### ####### " + " ###### H ##### ##### " + " 0 &H 0 " + "############################", //======<<< Level 057 >>>====== "#S##########################" + "#S------------------------ #" + "#S#@@@#@@@#@@@#@@#@H#@---#H#" + "#S# $ $ $ H $H#H#" + "#S$H@@@@@@@@@@@@@@@@@@@@H@H#" + "#S#H#----------------@ $H#H#" + "#S$H# @@@@@@@@@@@@@@@@####H#" + "#S#H# @ $$$$$$$$$$$$ $#$H#" + "#S$H# @###@@@@@@#@@@@@H###H#" + "#S#H# 0 H$#$H#" + "#S$H#@@@@@@@@@@@##@@@@H# @H#" + "#S#H------------------ H#H#" + "#S#@@##@@H@@#@#@@H@@@@@@H$H#" + "#S 0 H @@ H 0 $H#H#" + "#@@@#@###@@@@H@@#@#@@##@@#H#" + " & H H#", //======<<< Level 058 >>>====== "##################### S#" + "# &##--- @@ $ S#" + "# #@ $ H@@######HH H#H H S#" + "# # H @@# HH$H H H S#" + "# #H####@##$ # HH H H#H S#" + "# #H# @## HH H H H S#" + "#$ H# $ #@# H# H H H H S#" + "##HH##X#@###@# H#$#S##H#H S#" + "##H 0 H#X#S# H H S#" + "##H##@#######@HHH #S# H H S#" + "##H #@#######@HH #S# H H0H#" + "# H @ $ @H #S#HH###H#" + "# HH#@#######@H $ #S#H0 H#" + "# #H#@#######@H@@@#S#### H#" + "# #H# $ @@# S # H#" + "# $H #@@@@@@@@@# 0 S #####", //======<<< Level 059 >>>====== " -- $ -$ $ " + " H ## H ## ##H " + " H $0 H H $" + " $H-- ## $H 0$ HH##" + "##H H$0 ##H ## $ H " + " $ H## H ## H " + " ## H- --0$---H H " + " $ H ## $ $- H$ " + " ## H ## ## H$H## " + " - $H $ H## " + " H ##H ## $ H " + " $ H $ ## $ H$ " + "H##H ## ## H## " + "H " + "H & " + "############################", //======<<< Level 060 >>>====== " ----- " + " ----H 0$ $ " + " ----H 0 $ #######H" + " ---H $ ##### $ #H" + "H &$ #### $0#X#H#H" + "H X#X ## #### $ #X### #H#H" + "H $ $ $ # $ ##X# $ #H#H" + "H ## X#X # #### $###H#H#H" + "H $ $ $ # # $ #X#X #H#H#H" + "H ### X# # # ##X# $ #H#H#H" + "H $ $ $ # # # $ ##H#H#H#H" + "H #X X## # # # #####H#H#H#H" + "H $ $ $ # # # # #H#H#H#H" + "H ##X X# # # # # $ #H#H#H#H" + "H 0# # # #####H#H#H#H" + "########### H H H H", //======<<< Level 061 >>>====== " S " + " S " + " $ 0 $ @H@ -------- & " + "H@###@@# @H$ #### " + "H@ @H@ $ $" + "H@---- @H@ ####--- H" + "H@ $@H@ $ $ H" + "H $@###@@H@### H#### H" + "H@#@@ @H@ 0$ H# H" + "H@-------$H@ ######## H" + "H@ $ @H@ $ $ H" + "H@ @###@H@--####-- H## H" + "H@$ @H@ $ H H" + "H@## @H@ ##### H" + "H 0 H H" + "@###@####@@@@###@####@@##@@@", //======<<< Level 062 >>>====== "##S####S#####S#####S#####S##" + "# S$0 S S $ S $ S #" + "#H########X####X##########H#" + "#H#$ 0$ $ #H#" + "#H#####X########X#######H#H#" + "#H# $ $ #H#H#" + "#H#H####X####X#####X##H#H#H#" + "#H#H# #H#H#H#" + "#H#H#H#$ 0 $ #H#H#H#" + "#H#H#H###X##X###X#####H#H#H#" + "#H#H#H $ $ H#H#H#" + "#H#H###X############X###H#H#" + "#H#H $ $ H#H#" + "#H###X####X####X######X###H#" + "#H 0 $ & $ 0 H#" + "############################", //======<<< Level 063 >>>====== " 0 " + "###########################S" + "$ 0 # $ # $ S" + "###H# #H#H######## #H# ##H##" + "###H#H#H#H# $ # #H# ##H##" + "###H#H# #H# #### # #H# H H" + "#$#H#H#H#H#H#& # # #H# ####H" + "# H#H#H#H#H## # # #H# #H H" + " H#H#H#H#H#H $# # #H# #H###" + "H### H#H#H###### # #H# #H H" + "H## #H#H#H $ # #H -####H" + "H -#H#H########## #H# #H H" + "H## #H#H #H# #H###" + "--# #H##############H# #H H" + " H 0 H# ####H" + "###################### 0 H", //======<<< Level 064 >>>====== "@S S@" + "@S 0$$$$$$$$ $$$$$$$$$0 S@" + "@@@@@@@@@@@@@S@@@@@@@@@@@@@@" + " $ $ S $ $ " + " @H@@@@ S @H@@@@@ " + " H$ $ S H$ $ " + " @@@@@@H@ S @@@@@@@H@ " + " $ $H S $ $H " + " @H@@@@@@@@ S @H@@@@@@@@@ " + " H $ $ S H $ $ " + " @@@@@@@@@@H@S@@@@@@@@@@@H@ " + " $ $ H S $ $ H " + " @H@@@@@@@@@@S@@@@@@@@@@@@@ " + " H " + " H $ $ & $ $ 0" + "############################", //======<<< Level 065 >>>====== " ####### " + "----------$ 0S ###### " + "H H#H---- S ######H" + "H HX#XH $H$ S ## #H" + "H-------HX#XH ###H S #$ #H" + "H HX#XH0###H S ###H" + "H0 HHHHH ###H S ##H" + "#----- @XHX@ ###H S #H" + "##$ H @XHX@ H SSH" + "###$ H @XHX@ H--H---------H" + "####$H @XHX@ H " + "#####H0 @XHX@ H------H##$###" + " H @XHX@ H H@######" + " H @XHX@ H H@#######" + " H &H H H@#######" + "############################", //======<<< Level 066 >>>====== "#######HH----------HH#######" + "######HH - - HH######" + "#####HH #00# HH#####" + "####HH - #### - HH####" + "###HH - ###### - HH###" + "##HH----- ######## -----HH##" + "#HH - ####$$#### - HH#" + "HH ############ HH" + "#HH - ####$$#### - HH#" + "##HH - ######## - HH##" + "###HH - ###### - HH###" + "####HH - #### - HH####" + "#####HH - - HH#####" + "######HH HH######" + "#######HH0 & 0HH#######" + "############################", //======<<< Level 067 >>>====== "S " + "S # 0 # 0 0 " + "S------$H#H ##H##SS#SS##H " + "H #H #H# H# $# $# H " + "H & # # H# H# # H " + "##### ## H# # # H " + " # $# H# $# # --- H " + " # # HHH # # #####H" + " $# $# #HH# ## X H" + "## # $# H# # # # H" + "# $# # H# # # #$ H" + " # $# H# $# H# #$ # H" + " $# # H# # H # # # H" + " # $# H# # H #$ # # H" + " # # HH $ H # #H" + " H################## H", //======<<< Level 068 >>>====== "@@@@@@@@@@@@@@@@@@@@@@S @" + "@ 0 S @" + "@ H#@##@@#H@ S @" + "@ H SH@#@##@@#S @" + "@ ##@H HSH# # 0#-------@" + "@$ H $SHS## # @# $@" + "@ H HSHS# # # 0@" + "@H H HSHS# $#& # #@" + "@H H HS@## ## # $#@" + "@H@@@@X#@@S@ # # ##@" + "@H --------@-----# # $ #@" + "@H $ H ## # ###@" + "@H H@X@@@H@@@#H# # $# @" + "@H H@ @H@ #H####X#@# $ @" + "@H H@ @H@$ #H ##@@" + "@H $H@ 0 @H@#####@@###@####@", //======<<< Level 069 >>>====== "H 0 ## ------------" + "H##### ##H " + "H##### ##H #@#@#@#@#@#" + "H##### ##H $ $ $ $ $ $" + "H##$## ##H#X#X#X#X#X#X" + "H##### $ 0 ##H#X#X#X#X#X#X" + "H##############H------------" + "H##############H @ @ @ @ @" + "H & 0 H #X#X#X###" + "H########H########H X###" + "H########H #####H####HX###" + "H########H##$ ###H####HX###" + "H########H####$ #H 0 HX###" + " H###### H####HX###" + " $ $ H########H####HX###" + "##################H $$ HX###", //======<<< Level 070 >>>====== " S" + " S" + " 0-$$$-S" + " $-$- H$###$H" + "$H# # $- $H#####H" + "#H # $ #H##$##H" + " H $- #H-H#####H" + " H # $ -H $###$ " + " H #H " + " H $ H $$$$ " + " H # $ -H $####$ " + " H #H ####HX " + " H $- H ###HX# " + " H # $-H ##HX## " + " H $# H #HX### " + " H & # H 0 HX#### ", //======<<< Level 071 >>>====== " S " + " S 0 " + " S H#####H " + " $H####H#H0 $ H# #H " + "#H#####H#####H##H######H###H" + "#H @H $ @H @H @# #H $H" + "#H ###@H @# @H @H $@# #H ##H" + "#H $##@H $@H @H # # #H ##H" + "#H ###@H # #@H @H @@ #H ##H" + "#H $@H @ H$#H ##$ #H0 $H" + "#H#####H#####HX#H######H###H" + "$H------- $$ H 0 ## @$H" + "@@@H ##@@@##H@@#$ $@H" + " H###$#@@@@@#H@@@@@@H@@@@H" + "& H#$##$$$$$$ H$ H H" + "@@@@@@####@@@@@@@###########", //======<<< Level 072 >>>====== "S " + "S ------------------###" + "H $0 H #" + "H##X#### H #" + "H # H $0H ## $ #" + "H $ H # $ ---H###H#######" + "H###H$ ##### $ H H " + " H##########XH H $" + "H H## $ ####XH $#H-----##" + "H###H##########XH###H $ H ##" + "H #---------H#$#HX##H ##" + "H$0H # $ H###H H ##" + "###H # $ ## H###H H ##" + " H # $ ## H###H H ##" + " H &#### $ H###H 0H ##" + "############################", //======<<< Level 073 >>>====== " " + " SSSSSSS&S S " + " 0 S SS SS0@ " + " $H$ S SS SS @@@ " + " $HHH$ S SS SS @@@@@ " + "$HHHHH$ S SSS @@@@@@@" + "HHHHHHH--S $0 $ S----HHH " + " H ############ H " + " $@$ # $ $ # H " + " $@@@$ # -------- # H " + " @@@@@ # H H # H " + " @@@ # H H # H " + "H#####H #$H 0 H$# H " + "H H ############ H " + "H H H H H " + "H#####HH############HH#####H", //======<<< Level 074 >>>====== " S " + " S @@@@@@@@@@@" + "@@@@@S@@@@@H----H @" + "@ S H & H 0 @" + "#####H######################" + "##H H H### #### ##" + "#HH#####H### ## ############" + "#H###### H## $# ### ## ## #" + "#H# ### #H## ## ### $### $ #" + "#H## $ ##H## ### ## $## #" + "#H#######H#########X########" + "#H # #$ HH 0H#" + "#H####### H########H######H#" + "#H $### H ##H H#" + "#H 0 H $ ##H $ H#" + "############################", //======<<< Level 075 >>>====== " $ $ " + " $ $ ##H## $ $ $ " + " ##H## H ##H## #H#" + " H H H H " + " H H H H " + " H 0H $$ H H " + " H H ## H ---- H" + " H H H H " + " H H ------ H H& " + " H ----- 0H H ##" + " H $$ H H " + " H ## H H " + " 0 H H H 0 " + "#####XXXXXXXXXXXXXXX#######H" + " H" + "############################", //======<<< Level 076 >>>====== "############### S" + "# # S" + "# ------------HH#######$ S" + "# H# $ # #---H" + "#$ $0 & H# # #0 H" + "#H######H@@@@@@#@@ H ## H" + "#H #H ### H H" + "#H$ #H------- 0 #H H" + "#H ##@H #######H H#" + "#H ##$@H ### #H#####" + "#H # @H $##$# $$ #H## ##" + "#H## @H ## #######H# # #" + "#H#$ @H ## #-----#H## ##" + "#H HHH# # $ #H#$# #" + "#H H#H #H## ##" + "############################", //======<<< Level 077 >>>====== " ---- $$$$$$$ ---- " + "H ################## H" + "H @@@##################@@@ H" + "H ################## H" + "H0@H ################## H@0H" + "@@@H # # # ### H@@@" + " H #$$$$#$$$$#$$$$### H " + " H ################## H " + " H ################## H " + " H ################## H " + " H ### # # # H " + " H ###$$$$#$$$$#$$$$# H " + " H ################## H " + " H ################## H " + " H ################## H " + " H &H ", //======<<< Level 078 >>>====== "# #S" + "# $ 0 -----------$#S" + "#############HH 0 $ H##S" + "#### HH########### S" + "##### $ 0 HH ## S" + "#############HH $ ###H S" + "####### HH######## H S" + " $ ## $ HH ###X#H S" + "H############HH $ ## H S" + "H## # #### HH##### $ H S" + "H H#H# $## HH #####X##H S" + "@@@H H#H####&HH ## $ H S" + "@@@@@H H# ###HH#####X####H S" + "@@@@@@@HHH# #HH# H S" + " H H HH H S" + "############################", //======<<< Level 079 >>>====== " S " + " 0 @ S 0 $" + "H@@@@@ @@@@@@@H@@ #S#H####" + "H --- H@$##H#S#H####" + "##H## ## H#0 H ###H#S#H##$#" + " H ##$# H # H## H#S#H####" + "H# ####XH #H H###S#H " + "H & H # H# S ####H" + "H######## # $# $H#H#######H" + "H########X# # ####H## H" + "H########X# $##H ######" + "H##$ ##X#----H# #H------ " + "H## $##X#H # #$ # #H" + "H########X#H #######H###$#H" + "H ##$ H ## H ###H" + "H##########H########### H", //======<<< Level 080 >>>====== " -----------$ " + "@@@@@@ ## #@@@@@@#H " + "@------ $$ # #H " + "@H ###X # 0 $#H " + "@H$$ $ $ ######X#H " + "@@@@H $ #X## 0HH " + " H $ $ 0-- H " + " H #@@@@@@@@@#-- H " + " H$0 $ #0 $ # H " + " H####H######X#### H " + " # #H H " + " # #H H " + " #$$#H H " + " ##X#H H " + " H 0 & H " + "###@@@@@###@@@@###@@@@###@@@", //======<<< Level 081 >>>====== "S " + "S " + "@@@@@@@H H@@@@" + " H 0 0 H " + " H#######@@@#####H " + " # H H " + " # --H H " + " # $ $H $#$ $$$H " + " # #$#H-- # # $$$ ###H-- " + " # #$#H$ $--$# ### #$#H$ $-" + " # ###H#$# $#$ $$$ ###H#$# " + " # #H$#$ ### ### #$#H$#$ " + "# #H#$# ###H#$# " + " H-H H-H " + " H & H " + "###@@@#########@@@@#########", //======<<< Level 082 >>>====== "@@@@@@@@@@@@ S @@@@@@@@@@@@@" + "@--------H#@-S-@#H---------@" + "@ $ H#--S--#H $ @" + "@ $ ##H--$S$--H## $ @" + "@ $##X-HH#@#S#@#HH-#X# $ @" + "@ $##--H-#X-HSH-X#-H--###$ @" + "#$##--H-----HSH-----H---##$@" + "#X---H------HSH------H----X#" + "#---H0------HSH------0H----#" + "# H######XH&HX######H #" + "# $ H ### H $ #" + "H H 0 #$# 0 H H" + "H---H#X#####H H#####X#H----H" + "H $ H H H H $ H" + "H H $ H H $ H H" + "#########@#######@######@@@@", //======<<< Level 083 >>>====== " ----$ $ $&#S" + " #H H#####S" + " #H HX#####S" + " #H H#X## #S" + " #H H##X##$ #S" + " $ 0 #H H#$#X##XX#S" + "#### #H H# H#X## #S" + "$ #$ #H$ H# $H#X## #S" + "###H # ##H H####H#X## #S" + "$ #H #$ #H$0H# $ $H#X## #S" + "##H #H # ##H######H#X## #S" + "$ #H #H #$ #H $ $ -H#X## #S" + "#H #H #H # #H##### H#X##XX#S" + " #H #H #H H#X## S" + " H H H 0 H S" + "############################", //======<<< Level 084 >>>====== " S " + " S " + "0 $#$ S#$ " + "#####H########H#H##########H" + "$ #H $ H#H # H" + "###H#####H##########H#H#####" + "$ H H 0 H#H $" + "#H##############H###########" + "$H##$ # $#H 0 #$ " + "#########H#########H########" + "##H 0H###$ ## H ## $#" + "##H####H#########H###H######" + "$ H####H# $#####$H###H ##" + "##H####H#########H######H###" + "##H #H # & H # H $" + "############################", //======<<< Level 085 >>>====== " 0 $ " + " $ ######H# $ " + " ###X#### H#####X# " + " # # H# # " + " # 0$ # H# # " + " ######## $ #$ #H#####$$# " + " # ###X#####H #X####" + " # # $ #H 0$ - #" + " # # H########### H#" + " # $ $# H# $ H#" + " # ##### H# $ H#H H####" + " #### # $#H#### H###X# " + " # $ ####H # $H# " + " ##### #H ###X# " + " H & " + "@#@#@#@#@#@#@#@#@#@#@#@#@#@#", //======<<< Level 086 >>>====== "S S" + "S--------------------------S" + "HH HH" + "H #X## ###X## ###### H" + "H # ## # # # X H" + "H # ## # # H" + "H # # # # H" + "H # $# # $ # H" + "H # ## # ## # $ H" + "H #$ ## # $# #$ $# H" + "H #### ###X## ##X### H" + "H & H" + "H H###### ###### #H#### H" + "H H# $# ######H #H##$# H" + "H0H# # 0## $##H H#### H" + "############################", //======<<< Level 087 >>>====== " S " + " S " + " H$ $H $H $H " + " $H H$ H$ H$ " + " H$ $H $H $H " + " $H H$ H$ H$ " + " H$ $H $H $H " + " $H H$ H$ H$ " + " H$ $H $H $H " + " $H H$ H$ H$ " + " H$ $H $H $H " + " $H H$ H$ H$ " + " H$ $H $H $H " + " $H H$ H$ H$ " + "&H$ $H 0$H 0 $H 0 " + "############################", //======<<< Level 088 >>>====== " --------# 0 " + "H # $ H####H # #H" + "H XXXXXX #####H@ H@ H # #H" + "H XXXXXX # $ H@ H@H@ H # #H" + "H XXXXXX #H####@ H@H@ H # #H" + "H XX$$XX #H $ @ H@H@ H # #H" + "H XXXXXX #####H@ H@H@ H # #H" + "H XXXXXX # $ H@ H@H@ H #$#H" + "H 0#H####@ H@H@ H ##XH" + "H#########H $ @ H@H@ H H" + "H#############H@##@H@######H" + "H######### $ H@@@@H@@@@###H" + "H##$$#####H####@ $ S $ @$##H" + "H########$H@#@@@@@@@@@@@###H" + "H@@@@@@@@@@ $ 0$ H" + "H & H################", //======<<< Level 089 >>>====== "@S#@@@#@@##@##@@#@ @@#@@##@#" + "@HSSSSS@S@#@@#S@SSSSSS@@####" + "@H & $S@S $$$ S S 0 S $ S#" + "@H@#@#S@S#@##@H#H@###H####S#" + "@H $ S@S $$$ H H $##H###@S#" + "@H@#@SS@S ### H H @@$H$##$S#" + "@HSSS $@S H$H #@H@#@@S#" + "@H S##@S $ H@H $ H----S#" + "@H$ 0S @S ### H@H #@H $@##" + "@H####H@S # H$H # H ##$S#" + "@H @ H@SSSSSSH@H # H @H@" + "@H @ H---------H$0# H@$$$H#" + "@H @$H@####H $@H###########" + "@H @#H@ #####@#@-------H#" + "@H $ H $ $ 0 $$$H#" + "@######@#@@@@@@@@@@@@#@@@@H#", //======<<< Level 090 >>>====== " H S " + " -- H S " + "$ $ -- H --H $S0 " + "####H-- H 0 ---#X##H#H " + " H @#X#H ---$#$ S#H " + "XX###H $ H-H@@ @######H " + "X$ H @ H @@@@ --H " + " X$ H $H $ H@ " + " #$ H#X##H@@@@@@H#X@H@ " + " H#$H H $ H H@ " + " H XH@ H#X####H##@H@ " + " H -H $ H $ H @H@ " + " H@ $ @ H####X#H @$H$@ " + " H @ H $ H @@H@@ " + " H H##X###H 0H " + "##########H 0 &H##########", //======<<< Level 091 >>>====== " S " + " S " + " S " + " ------ 0 H#H 0 ------" + " H---H#$H#H$#H---H " + " H#$ #H H#######H H# $#H" + " H#### H-H# #H-H ####H" + " HH## H###H ##HH" + " H## H# #H ##H " + " H## H###H ##H " + " H## H# #H ##H " + " H## H###H ##H " + " H## H# #H & 0 ##H " + " H#########H###H#########H " + "$ H## $ #H $ H# $ ##H$" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 092 >>>====== " S " + " $ #0#S# " + " H---H########### #S# " + "$ ----H # $ # #S# " + "#H # ###### #S# " + "##H 0 # $ #S# " + "###H $ # ----- #S# " + "####H -----#$ $# H S " + "@@@@@@H ###### H--S " + " H ###### H #####" + " H ###### H #$ 0 " + " H ###### H ####H" + " H H H" + " --H H H" + "0 $# H & H H" + "#### H##$###########H ###H", //======<<< Level 093 >>>====== " SS " + " 0 HHHHH $$SS$$ HHHHH 0 " + " HHHHH H######H HHH H " + " H#H H H H $ H H H H#H " + " H#H H H H######H H H H#H " + " #H H H-H & $ H-H H H# " + " $@ H @-########-@ H @$ " + " XH H H-H######H-H H HX " + " HXH H H-H######H-H H HXH " + " HHH H H H#XX#H H H HHH " + " HHH H H H#XX#H H H HHH " + " HH H H #$$# H H HH " + " HHH H H HHH " + " HHHH HHHH " + " HHH HHH " + " 0H##########H0 ", //======<<< Level 094 >>>====== "$ ############S############" + "H#--- - $#S# #" + "H#$# #### #####S#H###H####H#" + "H#$# # # $ #S#H###H####H#" + "H#$# #$$#######S#H #H 0$#H#" + "H#$# ##########S###H#H####H#" + "H#$# $ 0 S #H#H####H#" + "H#$#####H####$ S $#H#H H#" + "H#$# H #######H######H#" + "H#$#H###$##H $ #H $ #H#" + "H#$#H# $ #######H########H#" + "H#$#H H##H0$ #H $ #H#" + "H#$############H########H#H#" + "H#$#$ # $ # $ H$ # $ H#H#" + "H#X#H#H#H#H#H######H######H#" + "H $ H#H$H#H$H#& $ H $ H#", //======<<< Level 095 >>>====== " S " + " S " + " S ----- -----H" + " 0H - H -- 0H H" + "X#H---H #X## H## ##H ##X##" + "X# H##X### H## ##H ##X# " + "X# H##0- H## ##H ## " + "X# H##H ## H## ##H- # " + "X# $ H##H$## H##$ ##$HXX$& " + "X --H-H##H ## H## ## H#### " + "## HH ##H # H## ## H#### " + "##HH ##H X -H## ## H## " + "##H ##H ## ## ## H## " + "##H $--##H $ # $# H $ " + "#####H ######H ##X# H####H" + "#####H $#### H $#X$ H#####", //======<<< Level 096 >>>====== " - 0 #### 0 $ #### " + "H H####H####H###### #######H" + "H H####H $ H###$## ####$##H" + "H H#$$#H########### ####H" + "H #####H --------------H" + "H #H0 $ $ " + "H#X#H #H#####X#######H $ $ " + "H$ #H #H----- -----H@@@@@@@@" + "## #H #H $ $ H &$ $ " + " $H #H#####X#####H#######H" + "##H@@ #H-----------H H" + "##H $H $ @######H H" + "##H##############S@ $ H H" + "$#H# S@#####X# H" + "##H# $ $ S@ 0 H" + "############################", //======<<< Level 097 >>>====== " HH----HHHHH####" + " H##H---H$$ H####" + " H####H HH$H H H" + " H######H HH$H$H" + " H######H HHHHH" + " H#@#@X@H H H H" + " H$@#@X$H H H H" + " H#@#@X@H H$H$H" + "$---------H#@#@X@H HHHHH" + "H$ H$@#@X$H H H H" + "#H$ H#@#@X@H H H H" + "##H$ H#@#@X@H H$H$H" + "###H$ H$###X$H HHHHH" + "####H$ H######H H H H" + "#####H$ H@# #@ #@H &H$H$H" + "######H 0H@# #@ #@H0 H######", //======<<< Level 098 >>>====== "@S @" + "@S@@@@ @@@@@@@@@#@@@@@@@@@$@" + "@S $ $---- --------H@" + "@S H## ##### ##H@" + "@S $ H $# # $#$H@" + "@S ###H $ & ## #X##@H@" + "@S $ H#####H # 0 H@" + "@S ### H# #H #---H####@" + "@S 0 H#$ #H # H--- @" + "@S H#########H### H $ @" + "@### H#$ # $ # # H ###@" + "@$ ##H######### # H # @" + "@####H---$$@$$#$ ##@@@H@##@" + "@ #H ###@#####H# H $@" + "@ $ #H $ HH 0 H#H @" + "#####H############H#########", //======<<< Level 099 >>>====== " --- $ $ --- @ #H" + "## #H H####H H0 ##@ H" + " ## #H H##########H ##@ #H" + "## #H#####$##$#####H #$@##H" + "$##$#H 0 H #H" + "#################X#########H" + " $ 0 $ & 0 H" + "@@@@@@@@@@@@@@@@H###########" + " ------------- @H " + "H - H@H---------- " + "H - - H@## ## ## ##H" + "H - # - H@@@@@@@@@@@@H" + "H - ### - H------------H" + "H - ##### - HX#X#X#X#X#X#X" + "H - ##$$$## - H@ " + "H- ######### -H@ 0 ", //======<<< Level 100 >>>====== " 0 0 0- " + " H###### H###H" + " H# # H###H" + " H###### # H###H" + " H# # # H###H" + " H###### #$$$# H###H" + " H# # ##### H###H" + " H###### #$$$# H###H" + " 0H# # ##### H#######H" + "###### #$$$# 0H# ##H" + "# # ##### H###### ##H" + "# #$$$# H# # ##H" + "# ##### H##### $$$#$$$##H" + "#$$$$# H#@@@@@@#@@@#@@@H" + "###### H##### & H" + " H####################", //======<<< Level 101 >>>====== "H H" + "H H#$##H H##$#H H" + "H0$ H####H H####H $H" + "####H H####H-----H####H H###" + " H H##$#H H#$##H H " + " $0H H####H H####H H$ " + "H#### H####H H####H ###H" + "H H#$##H-----H$###H H" + "H $ H####H H#$##H $ H" + "####H H##$#H H####H H###" + " H H$###H H##$#H H " + " $ H H####H-----H####H H $ " + "H#### H#$##H H###$H ###H" + "H H####H H#$##H H" + "H & H##$$H 0 H####H 0 H" + "############################", //======<<< Level 102 >>>====== "--------- H ----- " + " H H H " + " ------H $ H H " + " H $ 0 ### H H " + " H #### H --- H $$-- " + " H H $ H @@ " + " H---- $ H @ H $" + " H ## H H #" + " H H @@@###@##" + " H H -- " + " $0$ H H @ @" + " #### H---- H @@@@@@@ @" + "$ $$ H $ $ $0@" + "@ @@ H # #########" + " & H " + "#####@@@#########@@@########", //======<<< Level 103 >>>====== "-----------------------H " + " $ $ $ $ H " + "#### #### ###X ##X# H " + " $ $ $ H " + "# #X## ##X# X### # H " + " $ $ $ $ H " + "#### #### ###X ##X# H " + " $ $ $ H " + "# ##X# #X## X### # H " + " $ $ $ $ H " + "#### #### ###X ##X# H " + "0 & 0 H 0" + "########################S###" + "########################S###" + "###################### S #" + "###################### 0S0 #", //======<<< Level 104 >>>====== " 0 S" + " $ $ S" + " H###H ##H## H###H S" + " H# $ #HH##HHHHH##HH# $ #H S" + "#H#####H##HHHHHHH#H######H#S" + " 0 HHHH$HHHH S" + "#########HHHHHHHHH#########S" + " ##$## #HHHHHHH# ##$## S" + " ### #HHHHH# ### S" + " # #HHH# # S" + " #H# S" + " #H# S" + " #H# S" + " #H# S" + " 0 H & S" + "###########################S", //======<<< Level 105 >>>====== "####@@#####################S" + "# $ @ $ 0 & #S" + "#H#H @#X#H######X######## #S" + "#H##H #X#HH##$--------$ #S" + "#H ##H X##HH##$ $ $##H #S" + "#H ##H ###HH##$ $## H#HS" + "#HH ##H ##HHH##$ $## HHHS" + "#HHH$ #HH #H#HH## ## #HH#S" + "#HHHH H#H H##HH#X## #HHH#S" + "#$HHHH0H##HH###HHX# HHH$H#S" + "#HH$ HH ##H ###HX $#HHHH##S" + "###H####$ ##H ##H #HHH0HH#S" + "#HHHHHHHH #HH HH0HHH$ HH#S" + "#H HH $ H H#HHH#HH#####H#S" + "#$ H#H####H HHH$ H S" + "#####HHHH$H#####HH##########", //======<<< Level 106 >>>====== "@@@@@@@@@@@@S @@@ @#@" + "#######@##@@S ##@ #@#" + " $ #@#@#@S @#@ # " + "H@###X# @S 0 #@ $# $" + "H#### ----H##@#@X#####H@ H" + "H# $# ---@#@H# X@####H# H" + "H###--- @#@H#----X@####H@#H" + "H##--- H@ $ ##@H##H" + "H#--$ ##@#H# X##@@#H##H" + "H-- @-------H ----- ##H #H" + " @#0 $ @HX##@ & $ H##H" + "##X#@## @##@HX##@@#@@#@ H" + "##X#@ @HX 0 $ @#####" + "##X#@-------HX## ####@ $ #" + "## $ @H #####" + "#@####@##H H H###@########", //======<<< Level 107 >>>====== " ---------- & ---------- " + "H ---- ###### ---- H" + "H --- ########## --- H" + "H -- ############ -- H" + "H - #####$$$$##### - H" + "H - ############## - H" + "H ################ H" + "H ##$$$$####$$$$## H" + "H ################ H" + "H ######$$$$###### H" + "H ############## H" + "H - ############## - H" + "H - #$$$$##$$$$# - H" + "H -- ########## -- H" + "H0$$$---$ ###### $---$$$0H" + "#########H$$$$$$$$H#########", //======<<< Level 108 >>>====== "############ ######@@###S" + "#--------------------- ## #S" + "# H#########H S#-----H----S" + "& H$@$$$$ H S#$ $$H $S" + "##H#####@###H S###H###X#H#S" + "# HHHHH @ $H S#$ H-----H S" + "#$ @$H $$#H S#@ H @@@ H$S" + "#######X####H S#$ H0 $$H@H" + "# $@$$ @ #H S######H####H" + "# @@@@ @ #H--H#$ H $$S" + "# $$$ $$@$ #H$0H#@$ H ###H" + "#H###X####H#########H######H" + "#H--------H### -----H-@ ---H" + "#H $ $$$ H $H $ $ H @H$ $#" + "##H##H@#H###X#H##@#X#####H##" + " $H$$H0 H H $$H$$", //======<<< Level 109 >>>====== "HH #####0H@@@ @@@H0##### HH@" + "H@HH $ HH@HHHHHHH@HH $ HH@HH" + "$H@H#H#H@H$##H##$H@H#H#H@H$#" + "# H@HHH@H # HHH # H@HHH@H #H" + " #HH@H@HH# H H #HH@H@HH# " + "H# HHHHH #H ### H# HHHHH #H#" + "H#H H#H# $ #H#H H#H&" + "H# HHHHH #H ### H# HHHHH #H#" + " #HH@H@HH# H H #HH@H@HH# " + "X H@HHH@H # HHH # H@HHH@H #H" + "$H@H#H#H@H$##H##$H@H#H#H@H$#" + "H@HH $ HH@HHHHHHH@HH $ HH@HH" + "@H ##### H@@@H@@@H ##### H@@" + "@H H $ H H@@HHH@@H H $ H H@@" + "@H H#H#H0HH@HHH@HH0H#H#H H@@" + "H@H@HHH@H@HHHHHHH@H@HHH@H@HH", //======<<< Level 110 >>>====== " @------- --- HH##H S" + "$ 0$@------$## HH##HH S" + "###H##@ $## HH##HH$ S" + " H @ $## HH##HH$ @@S" + "$ H $@ $## HH##HH$ @@ S" + "###H##@ $## HH##HH$ @@ S" + " &H @ $## HH##HH$ @@ $$S" + "###H $@$## HH##HH$ @@ H## " + "###H##@## HH##HH$ @@ H$$ " + "#$#H @ $ HH0 HH$ @@ H#### " + "###H $@###########H@ H$ 0$ " + "$##H##@-----------H@ H##### " + "###H $@$ $ H @ H$ $ " + "#@@@@@@### H #### @ H##### " + " 0H##$$##@ H$ $ " + "############@######@ #######", //======<<< Level 111 >>>====== " HHH " + " HHHH " + " HH " + " 0 HHHH 0 " + "-----------HHHHHH-----------" + "-----------HHHHHH-----------" + " ----------HHHHHH---------- " + " --------HHHHHH-------- " + " ------HHHHHH------ " + " ---HHHHHH--- " + "$ $ $ $ $ HHHHHH $ $ $ $ $" + " HH0&HH " + "###########HH##HH###########" + "###########HH##HH###########" + " $ $ $ $ H H $ $ $ $ " + "############################", //======<<< Level 112 >>>====== " @@@@@@H" + "-------------- 0 H" + "H H@@@@@@@ H# HS#" + "H 0H@H H-----H #H #H " + "@@@@@H@H@ & H ## S#X" + "H----H H#X###@@@ ##H ##HSS#X" + "H H H# $# $ H # H#--X" + "H H# $#### @@H $H#$ $$" + "H H# 0##### H #H# #" + "HX$ # #####$ @@HSSH#H###" + "H # # $##### $ H # H## " + "H # # ###### H@H ###H ##" + "H # #H $#$ # H H # H# $" + "H # H###### H@H # ## ##" + "H # H " + "##@@@#########@@@@#@#@@@#@@@", //======<<< Level 113 >>>====== "S " + "S " + "###############H## $ & " + " 0 0 H##X#@@@@@@@H" + "$ HHHHHHHHHHH H H" + "#$ H HHHHHHHH H $ $ H#####H" + " #$H H H #S# ######H" + " #H H$ $ $ $ H # H" + " #$ H#X#X#X# H 0$ $ $H" + " # H H #H####H" + " H H H H H H " + " H H H 0 " + " H H H H #####H" + " H H H H H" + " 0 $S# H 0 H" + "############################", //======<<< Level 114 >>>====== " -- -- -- " + " ######$-H########H-$####$- " + " #######$H########H$######$ " + " ########H########H######## " + " ### ####H### H### ## " + " ### ###H###$$$ H###$$$-- " + " ### ###H###### H######$- " + " ### ###H###### H ######$ " + " ### ###H###### H ###### " + " ### $###H### H ### " + " ###$####H###$$$$$H##$$$### " + " ########H########H##X##### " + " ####### H########H #X#### " + " ###### H########H X### " + " 0 0 H & H 0 0 " + "#########S###HH###S#########", //======<<< Level 115 >>>====== " S" + "-------- #H $ $S" + " $#$ H#H#@#@#@#@#@X@#@#@#" + " $# #$ H#H $ $ ------" + " $# #$H##@#@#@#@#@#H H" + " # XH#@@@@@@@@@@@H $ H" + " H----------H###X###H" + " H# H" + " $ &$ H# H" + "H#######H 0 $ $ H# $ $0H" + "H 0$ $ H#@#@#@#@#@#@@#@X@#H" + "H#######H######$ ### H" + "H $ $ H######## ## H" + "H#######H######### # H" + "H $ $ H########## $ $ H" + "############################", //======<<< Level 116 >>>====== "##S#@#@#@#@#@@# #S#@ ##S####" + "##S######@#@@H@ @S@# # S H#" + "#@S #@ H S $ 0S H#" + "###X##H------H##X#########H#" + " & $ H$H#@$ H @ @#@ # H#" + "#####H##H@#@ $ @ @ ---H#" + " @# H@ H@@@#@@# @ -----#H#" + "$ 0 H H #---------@ $##H#" + "#X@##H H$@@#$ #@$ @ ## H#" + "@X @ H $@#@@#$ @#---H# H#" + " # H $@ $$$ @$ @ H H " + "H----H$@ H#@# @$ #H######" + "H H @@--H @ $ H @@@@@" + "H H#@#$$ H--H H ####H @ #" + "H H$ $##$0$$H--H ##@H 0$#" + "############H $H$###########", //======<<< Level 117 >>>====== " ### S" + " $ 0 $ @@@ $0 $ S" + "H##############H############" + "H---------- @@@H " + " H###H --------- " + " ----------H@@@H$ H" + "H $ ----& ###### $H#" + "##### #H @@@@@@ 0$H###" + " - # #H ###### $H#####" + "##$H# #H @@@@@@ $H#######" + "$##H# #H----- $H#########" + "##$H# #H @@@ H@@@@@@@@@@@" + "$##H# $$ #H ### H " + "##$H####X#H @@@ H##########H" + "$##H 0 H$###$H#$ H" + "############@@@###@@@@@@@@@@", //======<<< Level 118 >>>====== "---------------- " + " $ H0 " + " $$$ HHH " + " $$$ HHH " + " $$ HH " + " $$ $$$ HH HHH --------" + "$$ $$ $$ HH HH HH 0 " + " HH HH HHHHH " + " 0 HHH HHH $$$$$ " + "HHHH HH HHHH HH HHHHH " + " HH HH $$$$$ " + " HH & HH HHHHH " + "############H###############" + " H " + " H " + "############################", //======<<< Level 119 >>>====== " S " + " $ S " + "H@## S@@H" + "H@$## $ $S@@H" + "H #$### 0 #######H" + "H # # ###$ ### $ H" + "H-- #$ # # $ ##$ @@@@ H" + "H ###### ###X# ###@H" + "H$ & #@@@H# $ H" + "H@@@@-------- H###$ H" + "H @ 0$$$$ H ####" + "H $ @$ @@@@@@@@@@ H $@ $" + "H##### H##@@##" + "H----H------ H " + " H H0 " + " $ H ###################", //======<<< Level 120 >>>====== " S " + " S " + " H S H " + " ######H H------------H " + " # $ #H H 0 H " + " # #H H@@@@@@##@@##@@" + "@#@@#@@#@@#@@H#-----#X### #" + " $0 $ $ H# H #-- # #" + "#######X#####H# H#$$#$#H#$ #" + " ------------H# H####X#H# #" + "H0 H# H$ --HHH##" + "H############H######H $ H " + "H &H H## HHH" + "H$##### $ ###H## $ #H#$-- H" + "H## $ #####$ H$#####H##$ ##H" + "####################H #####", //======<<< Level 121 >>>====== " " + "######HS SH######" + "###HHH$S S$HHH###" + "HH###HHH$ $HHH#X#HH" + "$HHH#X#HHH$0 0$HHH###HHH$" + " $HHH###HHH$ $HHH#X#HHH$ " + " $HHH#X#HHHHHH###HHH$ " + " $HHH###HH###HHH$ " + " $HHH#HH#HHH$ " + " $HHH###HH###HHH$ " + " $HHH###HHHHHH#X#HHH$ " + " $HHH#X#HHH$ $HHH###HHH$ " + "$HHH###HHH$ $HHH#X#HHH$" + "HH#X#HHH$ $HHH###HH" + "###HHH$S S$HHH###" + "######HS & SH######", //======<<< Level 122 >>>====== "S " + "S 0 $ " + "S @@H@@@@ @@@@H@@@@@" + "S H #$ # H# ---" + "S---H-----# #-----H@H $" + "#$ H $ # # H#H-- " + " #0 H--- #H # # $ H@ H" + " # # H X H#$ H" + "& # # H $ H@ --H" + "@@# # # H# ------ # H#H " + " #X H # $ # H@H 0 " + "$H### H # # $ H####H" + "#H@-------H # # ##H####H" + " H XX H H" + " H H H" + "@@@@@@#######@@@@####@@@@@@@", //======<<< Level 123 >>>====== " S " + " -------- -S--- " + " H H- H H####H " + " H-------0H------ H# H- #H " + " H H# --- H# H $ XH" + " H HX #H H# H $#" + " H -- H# #H - &---H----#" + "H #HHS H#$H## #H # #" + "H# #HS H#######H #### #####" + "##X##S H# #$ #H-H - 0H" + "##X##S H####### H#### ####H" + "# $ #S H# $# #H H#$## ####H" + "#####S H#######H H#### ##$#H" + "#####S H# #$ H H# # H" + "# #S H#######H H##X###X##H" + "# $ S#H #H#H # $ H", //======<<< Level 124 >>>====== "S S" + "S S" + "S-----H H------H# #H" + " H-----H H# $ #H" + " $ H H 0 $ H#####X#H" + "### $ #HH #############X#H" + "####### H $ $ H" + "#####$ H## $#$ ## H" + "######$ H## $###$ ## H" + "#######$H## $#####$ ## 0 $ H" + "########H##X###########H@@#H" + "# 0H H ##H" + "# $ ##H & H ##H" + "########H----H####H$---H ##H" + "# $ H $ H##$#H# #H$##H" + "##################H####H###H", //======<<< Level 125 >>>====== " ------ - " + " ### H-- 0 H#### " + " #$ H-- ######H#### " + " ### -- X####XH#$$# " + " ###X X####XH#### " + " ###X ##-X#$$#XH X###" + " #$$X ## X####XH X###" + " ###X H X$$#" + " H X###" + " X##X H " + "X###X X$$X HX### " + "X###X X##X HX### ## " + "X $ X HX$$# ## " + "X###X HX### " + " 0 H & " + "############################", //======<<< Level 126 >>>====== " $ - - 0 - -0" + "H### H####$#$#####H - - H" + "H $ H############H -$ - $ H" + "H### H##$#####$###H- - - -H" + "H $ H############H $ $ H" + "H### H#$#######$##H -- - H" + "H $ H############H - $ -$-H" + "H### H##$#####$###H - - H" + "H $ H############H - - H" + "H### H###$###$####H- - - -H" + "H $ H############H $ - H" + "H### H####$#$#####H -- $ H" + "H $ H############H - - - H" + "H### H###$###$####H $ - - -H" + "H 0 H############H & " + "H####H##$#####$###H#########", //======<<< Level 127 >>>====== " S S" + " S 0 S" + "--- 0 S------#####H 0 S" + "H##@### #######H$##########H" + "H##$### @$ H#H## $ $ H" + "H###### @@@@@H@H ------- H" + "H ----H H H H" + "##X###H H H # H" + "--- H###### #######H######" + "$ H## ----# HHHHHHHH--" + " H# @@@H #$HHHHHHHH $" + "H#### # @@@H #-HHHHHHHH -" + "H # H####H #$HHHHHHHH " + "H H# H####H #-HHHHHHHH " + "H& H#H H# $#H ###########H" + "############### H", //======<<< Level 128 >>>====== " - - " + "H ######################## H" + "H # # $ $# # # H" + "H # $ ####X### # # H" + "H #X#### # $0 $ # $# H" + "H # # ############# H" + "H # $ # # # # H" + "H ##### $ 0 # # # H" + "H # ######### # $ # H" + "H # # #$ 0 ##X### H" + "H # $ $ # ####### # H" + "H ###X#### # # # H" + "H # $ #$ 0$ #$ # $ # H" + "H ###X##########X######X## H" + "H & 0 H" + "############################", //======<<< Level 129 >>>====== " HH " + " 0H HH H 0 " + " ##H## ##HH## ##H## " + "##$H$## ###HH### ##$H$##" + "# H ##$ HH $## # H " + "##$H$ ---## HH ##$H$ " + " ##H## ##$ HH0$ ##H## " + " $H$## ###HH## $H$##" + " H # ##HH### -- H #" + "##$H$## $ HH $## ##$H$##" + " #XHX# HH ## ##HX# " + " H ##$ HH0$## H " + " ###HH### " + " ##HH## " + " & HH " + "#############HH#############", //======<<< Level 130 >>>====== "H " + "H -- -----------------" + "H S $H $ H 0 H" + "### #######H-------H H H@@@@" + " $ H $ H H H " + "@@@H### 0 H-------H H @@@@H" + " H $ ##### $ H H H" + " & H #####$#-------H H H@@@@" + "H# H---------------H H H $ " + "H#######X##### 0 H @@@@H" + "H$ #### #$ ####H H" + "H#############@@ ######H####" + "H@############ ######H###$" + "H@############H@ ##$###H####" + "H@ $##########H@ H " + "H #######$ H@############", //======<<< Level 131 >>>====== " S " + "# #$S$# # " + " #---H-----#H#-----H---# " + " #$ H 0 $H$ 0 H $# " + " #-H-H---#H#---H-H-# " + " # H X H X H # " + " H---# H #--H--# H #------H " + " H-H #H# #H# H-H " + " H #H# #H# H " + " H-H #H# & $ #H#### H-H " + " H #H#########H#### H " + " H-H #H# ##### #H##$# H-H " + " $H #H# ##$## #H#### H$ " + " H-H0 #H# ##### #H# 0H-H " + " H---- H - - H -------H " + " H #H# ##### #H# H ", //======<<< Level 132 >>>====== "#S #" + "#S-------------------------#" + "#S X###H###X #" + "#S $X#X H X## $ #" + "#S $X#X$$$$$H$$0$$#X# $ #" + "#S ##X#X#####H######X#X# $ #" + "#### H #X#X#" + "## $$$$ H0 $$$$ #X#" + "# H######XH#######H #" + "# H H H #" + "# $H $$$$$H $ $$$$H 0 #" + "# HX#########HX#########H #" + "# H H H #" + "# H H H #" + "# H H & H #" + "############################", //======<<< Level 133 >>>====== "-------------H--------------" + " $ $ H $ $ 0$ $" + "0$ $ 0 $ H $ $ $ " + " #X##X#H H#X####H H#X# " + " #X##X##HH#X####XHH#X# " + " #X##X##XH#X####X#H#X# " + " #X# ##XH#X# #X#H#X# " + " #X# ##XH#X# #X#H#X# " + " #X# ##XH#X# #X#H#X# " + " #X# ##XH#X# #X#H#X# " + " #X# $##XH#X# $#X#H#X# " + " #X#X###XH#X#X##X#H#X###X## " + " #X#X### H#X#X##X H#X###X## " + " #X#X## H#X#X## H#X###X## " + " H & H " + "############################", //======<<< Level 134 >>>====== "$0 #####################" + "##H #####################" + "H####H ##################" + "H#######H 0 ###############" + "H##### ####H ############" + "H##### #######H #########" + "H##### ##########H 0 ######" + "H#### $ ############H ###" + "H####### $ ############H " + "H##### #### $ #############H" + "H##### ####### $ ##########H" + "H##### #########H $ #######H" + "H##### #########H### ######H" + "H$ $ $ $ #H### ######H" + "############## H### &H" + "############################", //======<<< Level 135 >>>====== " S " + " S " + " S H@@@@@@@@@@@@@@@@" + "##HH###H###H 0 -------" + "#$#H# #H# #H############ $ " + "# #H#$#H#$#HHHH$HHHH$HHH###H" + "#XHH###H# #HH@@@@HH@@@HH H" + "HHHHHHHHHHHHH@ $HH@ HH##H$" + "HH H ## HH@ -@HH@ $HH# H#" + "HH ###H #$#HH@@@@HH@@@HH#H #" + "HH #$ H ##HH---- HHHHHH#H " + "HH ## H # #H $ HHHHH####H" + "HH H&## H####### $H###$H" + "HHHHHHH@@@@H#HHHHH@ ##H### H" + "H $ @@H#H H H@ ##H ##H#" + "#####H 0 #H H$H@ $H# 0H#", //======<<< Level 136 >>>====== " 000 " + " $$$$$$S " + " $$$$$$S####### " + " $$$$$$S@@@@@@@ " + " S####### " + " SS " + " S " + "$$$$S " + "####H " + "##########H " + "###############H " + "###################H " + "######################H " + "########################H " + "#########################H " + "#########################H& ", //======<<< Level 137 >>>====== "S " + "S $ $ $0 0$ $ $ " + "##############S#############" + " H " + " #H# " + " $H$ " + " 0 ##H## 0 " + " H $ H $ H " + " #H# ###H### #H# " + " $H$ $ H $ $H$ " + " ##H## ####H#### ##H## " + " $ H $ $ H $ $ H $ " + "###H### #####H##### ###H###" + "$ H $ $ H $ $ H $" + " H H & H " + "############################", //======<<< Level 138 >>>====== " S " + " S " + " 0 S $--- " + " --------H@@@@#X## H " + "H H $ H " + "H ######@@@####### " + "H #$ # # # # " + "H 0 $$ # # $# $$# $$# $ " + "H####### ################# " + "H# # ##### # " + "H# $# $ # H$ # & $ " + "H###########@H@#######X#####" + "H H --- " + "H H H $ " + "H $ H H ###" + "#############H $ 0 H $ ", //======<<< Level 139 >>>====== "S S @#### " + "S###############S @ $H# $ " + "S-----------H #H--@##H# @@@" + "$H#@# $ H--#H $ H# H" + "@H ## H #H @##H# $H" + "@H## $# &H #H $@0 H#H--H" + "HH $########H #H @#H##H H" + "H ### @H #H H H $ " + "H ## $@H ##H H H###" + "HH ######@H0 ###H H H " + "@H###------@##H ###HH H##H" + "#H 0 #@H ##H# H" + "#H#######H #@H H# H" + "#H##$####H#####H###@@HH### H" + "#H#####$#H#####H$ $ HH#$ H" + "#H###################H#####H", //======<<< Level 140 >>>====== " " + " SSSSSSSS " + " H######H " + " 0 H# 0 #H 0 " + " H# $ #H " + " H################H " + " H# # # #H " + " H# # # #H " + " H# # # #H " + " H# $ #0 $ # $ #H " + "H#############X############H" + "H# # # # # #H" + "H# # # # # #H" + "H# $ # $ # $ # $ # $ #H" + "H#H##H#H##H#H##H#H##H#H##H#H" + "H H##H H##H&H##H0H##H H##H H", //======<<< Level 141 >>>====== "---------- ----------" + "H ######## H" + "H ############ H" + "H 0 ############## 0 H" + "H @@@@################@@@@ H" + "H ########## H" + "H @H #### H@ H" + "@@@H H@@@" + " H $ $ $ $ $ $ H " + " H H " + " H #### H " + " H ###XXXX### & H " + " H ###XXXXXXXXXX### H " + " H XXXXXXXXXXXXXX H " + " H XXXXXXXXXXXX H " + " H XXXXXXXX H ", //======<<< Level 142 >>>====== "----------- " + " H # - - " + " $ $ $ 0H---- #### H ####" + "########### H#### H X###" + "$$ $$ ----H#### H X###" + "##$ $##H # ## H X$$#" + "###$ $###H---- # ## H X###" + "####$ $#### H# ## H X$$#" + "#####$##### 0 H# ## H X###" + "###########H######$$# H X$$#" + " H #### H X###" + "#S# & H 0H X$$#" + "#S###########H##########X###" + "#S ###$###H#####$ " + "#S ####$##H##$ $##H $" + "#S$ $##### H ############", //======<<< Level 143 >>>====== "########S###################" + "& @ @@@S @H # H------- " + "#H H @H@@ @H$#H@@H " + "$H@@#H @H@@ H H $ " + "##H H @H ###H@H----- " + "$@H##@$@H##---H@H ####" + " H @H@ $@ H@## $ " + " 0H $ @H@####H@ H 0 " + "@@##H# @H@ H--H@@@@@@@@@@" + "H @H# H@###### H @-----@" + "H# H###H@ $#$ ###H @ H @" + "H@ H@@ @H@ # H H @" + "H@ H@ $@H ###########H@ @" + "H ### @@H@### H @" + "H 0 H@$ @H $ $ H @" + "#########@##$H@@####@@@H $@", //======<<< Level 144 >>>====== " " + " ---S --- - --" + "H H -#@@@@@@ #### @@H " + "H$ H$ # @$ H $" + "##H-@@H @H @@#@ XXXX## H#X#" + " $H 0$H @H @$ H " + "H##-H@@ @HH @@#H X X H " + "H$ H$ @ HH @H #$$# H " + "##H-@@H @ HH @H ##H--H $ " + "0$H $H @ HH@H H ##X#" + "H##-H@@ @ H@H 0 H " + "H$ H$0 @ @H@@@@@@@@H $ " + "##H-@@H @ @H# $ $ #H#X#" + " $H $H @ @H#H#@#@##H " + "H##-@@@ @0$$H# H#H $ $ H " + "H & ######@@##@#@#@#@#@#", //======<<< Level 145 >>>====== " 0 S S 0 " + " S S " + " S S " + " $###H###$ " + " #$#$H$#$# " + " $ #$H H#H H$# $ $ " + " ##H#H######H H######H#H## " + " $# H#H HHH H#H$# " + " # HH#HHHHHHHHHHHHHHHHH#HH #" + " #H0$ #HHHHHHH#HHHHHHH# $0H#" + " ###H #H $ H H $ H# H### " + " $##H#######H#######H##$ " + " ## H $ H $ H ## " + " # H##HHHHHH#HHHHHH##H # " + " $ H###HHH#HHHHH#HHH###H&$ " + "############################", //======<<< Level 146 >>>====== "# - & - # $ " + "####H ########## H#### ####H" + "####H # ##### # H#### $ H" + "#$##H # ##### # H##$# H####" + "####H # ##### # H#### H$ " + "##$#H # ##### # H#$## ####H" + "####H # ##### # H#### $H" + "#$##H # ##### # H#### H####" + "####H # ##### # H ### H $ " + "##$#H # ##### # H#### ####H" + "####H # #### # H#$## $ H" + "#$##H #$#####$$# H#### H####" + "####H ########## H##$ H $ " + "##$#H ########## H#### ####H" + "####H 0 0 H#### 0 H" + "############################", //======<<< Level 147 >>>====== " S " + " 0- -& S - " + " H H H H S H H H" + "H HH H H S H H H" + " #$H H H #$# HS H #$# H-H" + " ##H ---H0### H---H0#H# H" + "@##H##X##@##@##@##X##@H#X##H" + "# H X # $### $# #H X H" + "#--H--X--# H#----H----H-#--H" + "# H X # H# # HXH #0 $ H" + "#X@H#@#X@##H##@##@XH@##@#X#H" + " X#### ##H## #XH## X#H" + " H--- --#H#-- --XH#-- --#H" + " #H# $ #H# $ #H $ #H" + " $#H# @ #H# @ #H# @ #H" + "#X H X#@## H ##@## H ##@#X H", //======<<< Level 148 >>>====== " " + " 00 SS 00 " + " $$$S##S$$$ " + " $$$$$S@@@@@@@@@@S$$$$$ " + " S###### ######S " + " SSS SSS " + " S S " + " S S " + " S S " + " S S " + " S S " + " S S " + " S S " + " S S " + " S & S " + "@######@#####@@#####@######@", //======<<< Level 149 >>>====== " " + " H## ##H " + " H## ##H " + " H## ##H " + " H##$ 0 $##H " + " $--H################H--$0 " + " H#H ##$ $## H#H " + " HH#H ## $ $ ## H#HH " + " $HH#H0 #### #### H#HH$ " + " $HH#H ### ### H#HH$ " + " $HH#H ##$&## H#HH$ " + " $HH#H #### H#HH$ " + " $HH#H HH H#HH$ " + " $HH#H HH H#HH$ " + "$ 0 $H##H HH H##H$ 0 $" + "############################", //======<<< Level 150 >>>====== " ---- 0& ---- " + "H ##H$ $H## H" + "H ##H$ $H## H" + "H ##H$ $H## H" + "H$ $ ##H$ $H## $ $H" + "H####H ##H$ $H## H####H" + "H$ $H ##H$ $H## H$ $H" + "H#####H ##H$ $H## H#####H" + "H$0 0$H ##H$ $H## H$0 0$H" + "H######H ##H$ $H## H######H" + "H$ $H ##H$ $H## H$ $H" + "H#######H ##H$$H## H#######H" + "H$ $H ######## H$ $H" + "H########H ###X## H########H" + "H$ $H $$#X$$ H$ $H" + "#############@@##S##########" ]; ================================================ FILE: lodeRunner.v.fanBookMod.js ================================================ //****************************************************************** //* All levels convert from: LR Fan Book.lms //* reference: http://www.spoonbillsoftware.com.au/loderunner.htm //* converted by Simon Hung 2015/01/22 //****************************************************************** var fanBookData = [ //======<<< Level 001 >>>====== /* FIRST LEVEL 001 */ " & --- --- " + " # ### -H####- # ##$ #H" + " # $H# # H# # # # # #H" + " # H#$ # H# $ #S $# # #$ #H" + " # H###--HX## ##@@# # # #H" + " #$ H# # X # # # #$#H" + " ### # # # # # # ##H" + " - H" + " #### H### -H### H# # H" + " # @H# H# # #H# # H" + " # $#H# H# # #H#$# H" + " #H## H# $H# # $ #H## H" + " #H H# # -H# # --#H###$ H" + " #H # # # # #H# # --H" + " #### ### ### # # " + " ", /////////////////////////// BEGIN FOR NORMAL EASY ////////////////////////// //======<<< Level 006 >>>====== /* NORMAL EASY 002 */ "H---------- & -----------H" + "H ##### H" + "H - ####### - H" + "H ##-###-## H" + "H ## ### ## H" + "HH # ### X ### # HH" + "H H #$$$$$$$$$$$# H H" + "H H #$ $ $# H H" + "H H #$$$$#$$$$# H H" + "H H ###@@#@@### H H" + "H H ##HHHHH## H H" + "H H ####### H H" + "H H ##### H H" + "H H ### H H" + "H H##### H H" + " ######### ", //======<<< Level 019 >>>====== /* NORMAL EASY 003 */ "@######### #S# ########@" + "@ # H#0 ##S## 0#H # @" + "@ # H##### S #####H --#H@" + "@0 # H#### S ####H #H@" + "@ # #### S#S ##### #H@" + "@ & ## # S###S # ## H@" + "@ 00##### S#####S #####H@" + "@ $ S $ S $ H@" + "@ $H$S $H$ S$H$ H@" + "@ $H H$ $H H$ $H H$ H@" + "@ $H H$$H H$$H H$ H@" + "@ H $ HH $ HH $ H H@" + "@ H H H H H H H@" + "@ $H H$ $H H$ $H H$ H@" + "@ --H------H------H-- H@" + "@ $ $ $ H@", //======<<< Level 042 >>>====== /* NORMAL EASY 004 */ "@ ######### S @" + "@ # & # S @" + "@-------###########S------H@" + "@H ##H - - H## H@" + "@H # H # # H # H@" + "@H $# H H #$ H@" + "@H $# $H0 0H$ #$ H@" + "@H $# $# H $ H #$ #$ H@" + "@H $# $# $H H$ #$ #$ H@" + "@H $# $# $# HH #$ #$ #$ H@" + "@H # $# $# HH #$ #$ # H@" + "@H $# $# ##H# #$ #$ H@" + "@H # $# ##$H## #$ # H@" + "@H # ##@H$@## # HHH@" + "@H ###@H@@### H @" + "@H HHHHHHHHHHHH HH @", //======<<< Level 032 >>>====== /* NORMAL EASY 005 */ " $ $ $ " + "##H##X####H####X####H###X##H" + " H H H---- H" + " H 0 H 0 H" + "######H#X#H#H#####X#H###H###" + " H---H H H H " + " $ H H $ H H $" + "###HX########H##X########X##" + " H H " + "$ H H 0 $ " + "######H##X#########H########" + " H H " + " $ H H $" + "##H######X######X######H####" + " H H " + " H & H ", //======<<< Level 077 >>>====== /* NORMAL EASY 006 */ "@@H@HH@@HH@HH@HHH@H@@@@H@@H@" + "@HHHH@H@@@H@@0@@H@@H@H@@H@@@" + "@@H@H@HHHH@HHHHH@HHHHH@HHH@@" + "@HHH@@@@H@@@@@@H@@H@@H@H@@@@" + "@H@H@HHHHH@HHH@H@HHH@@@H@HH@" + "@H@H@HH@@H@H@@@HH@H@HHHHHHH@" + "@H@H@@HH@HHHHH@H@@H@H@@@@H@@" + "@H@H@H@H@@@H@H@H@HHHH@HH@HH@" + "@H@HHH@HHH@@@H@H@H@@H@@HHH@@" + "@H@@@@@H@H@HHH@H@H@H@@H@H@H@" + "@HHHH@HH@H@H@@@H@HHHHH@HH@@@" + "@@@H@H@@@H@H@HHH@@H@@HH@HHH@" + "@0HH@HHH@H@H@@@HHHHH@H@H@@H@" + "@@H@@H@HHH@HHH@@@@@@@HHH@@H@" + "@@HHHH@H@HHH@HHHHH@HHH@@&$H@" + "@HH@H@@H@H0H@H@H@HHH@H@0H@H@", //======<<< Level 026 >>>====== /* NORMAL EASY 007 */ "$& 0 $#HHHHH$##" + "##-#############-#H#H# #H###" + " H#H# #H ##" + " ## ###### H######H# #H ##" + "@@ # H ##### # #H ##" + " # #########H #### # #H ##" + " # $ #H ### # #H ##" + " ######### #H ## # #H ##" + "$ #$ $#HHHH## # #H ##" + "## ######H#### H # #H ##" + " #$ H $ H ### #H ##" + "H# ####### ######H # #H ##" + "H ## ###########H# $# #H ##" + "H #################### #H ##" + " $# - H ##" + " S#$########H####### #H$##", //======<<< Level 027 >>>====== /* NORMAL EASY 008 */ " $ 0H " + " ############H ## " + " HHH H- ## " + " H $ $H - ## " + " #H##### 0#H#0 --- 0 ## " + " #H $# H # $ ---- " + " H## $ $H$H # $ " + "H H###### # H # # $$# " + " H #H# ##$## " + "H#### $ H ### " + "H ####H#######$##### " + "H H ##$###$ " + "H $$ H H $ $######$ " + "H# ############ ##$$$#$ " + "H $ $ $& #### ## " + "##############H $ $ H@# $ ", //======<<< Level 030 >>>====== /* NORMAL EASY 009 */ " 0 0 0 & S 0 0 " + " S " + " S " + "H-- - - - --- S - --H " + "H # # # # # #### # H### " + "H # # # ##$# # # # H# " + "H # # # #### # # H### " + "H#$# # # # ## #$## #$#H# " + "HX## ### # # #### ##XH### " + "H H " + "H#############H###H###H# $$ " + "H#$# - #$#H H #H#####" + "H## H### #H# #H#$$H###H H" + "H# $H#$# H# #H---H#$######H" + "H $#H# # H ### ## H" + "############################", //======<<< Level 031 >>>====== /* NORMAL EASY 010*/ " " + " ########H###########$#####" + "$-#$$$$$$#H$$$###$$$########" + "#$@@@@@##$H#######H###$$$###" + "#$$$$ ###H-------HH ######" + "#$#######$H$$$$$$$HH########" + "#$$$$$$$$#H########H########" + "#$########H####$###H#$$$####" + "#$########H##$$$$$#H########" + "#X#################H########" + "# $$$$$$ ---$$$$$$$H$$$$####" + "# ######H$-$################" + "# #### H###################" + "# ### H " + "$ H & 00000" + "# ##H###################", //======<<< Level 037 >>>====== /* NORMAL EASY 011 */ "@ S@" + "@------------------------#S@" + "@H & H 0 H #S@" + "@###### ###H ##@###H## #S@" + "@###### $H ##@###H $# #S@" + "@##### H ### ##H #S@" + "@# # H # #H #S@" + "@# # H # #H $ #S@" + "@# - $# H # #H H# #S@" + "@#H ### H # $ #H H ##S@" + "@#H ## H # # #H H #S@" + "@#H ##$ H # $ #H H #S@" + "@#H H # # #H H S@" + "@###### $ H # #H H S###@" + "@######H H 0H H $@" + "@$ HHHHH###############@", //////////////////////////// BEGIN FOR NORMAL NORMAL //////////////////////////// //======<<< Level 015 >>>====== /* Normal Normal 012 */ "@ S @" + //"@ ------------S ----$---- @" + "@ ------------S --------- @" + //Modified: can not reborn on gold position for this platform "@H#H $ #H# 0 & #H@" + "@H #H######H# H ######### H@" + "@H #H#-- H##H##### #### H@" + "@H #H#H-###H H H----H-H@" + "@H- H # -###S###$H H H@" + "@H # #H $#$# S ##H#H# # H@" + "@H ###H ### S ### #H# H@" + "@H $ # # S H## H@" + "@H # @$## S # #$## H@" + "@H ####X # S ###### H@" + "@H $ # S #$ H@" + "@H ##H## # S ####H# H@" + "@H #H #### S ##$#H# H@" + "@H$#H $# $ S $ ## H## H@", //======<<< Level 016 >>>====== /* NORMAL NORMAL 013 */ "@ H----@---H--H------#@@" + "@0 0 H H H $ $-#@@" + "@#### H ##$ $##H HH #$# #@@" + "@ 0 H ## ## --H H###H#@@" + "@ H# H ### H #$# #@@" + "@H $#HHH ##&## H #H# #@@" + "@H#$# H H #-# #@@" + "@H #@ ### #####H#HH#H#$# #@@" + "@H#$H #$$H### #H#HH#H### #@@" + "@H### # #$$ # #HH #@@" + "@H#$# ####### # H####H #@@" + "@H#$# ####### H#$$## #@@" + "@HH# H##H## #@@" + "@HHHHH ########H#####H## #@@" + "@H # $$ # #@@" + "@#########################@@", //======<<< Level 017 >>>====== /* NORMAL NORMAL 014 */ "@0 # -- $ #$ @" + "@ &# H ###- ######H@" + "@- $## H - # H@" + "@$#### $ H # $#$H @" + "@#$# $ H### H$#H #H###$H @" + "@ #H#### $#### H #H####H @" + "@#--H-$$ ## $ H #H#$$##H@" + "@$$$S ## H###### $#H#-H H@" + "@H#H- $$$$$ $##H#$$$ H@" + "@H# H H###H $# #H######@" + "@H#H$$H$ $H$$$$$#$H@ @" + "@H####################H @" + "@H--------------- ---H#$-H@" + "@H# 0 0 $ # H@" + "@H####################### H@" + "@H H@", //======<<< Level 018 >>>====== /* NORMAL NORMAL 015 */ "@ @" + "@ #######H& ###H @" + "@ #########H-----#####H @" + "@ #########$# #####H @" + "@ ##### ### #######H @" + "@ #### #######H @" + "@ ##### ------ ####$##H @" + "@ ##$#### $ ### # H @" + "@ ####### ##H ##H @" + "@ @#### ## #H @" + "@ #### ## #H @" + "@H##@ #### S###########H@" + "@H#$# ##### S###########H@" + "@H ######### S#$#H $# #H@" + "@H #####$# @@@### ###H@" + "@H H@", //======<<< Level 024 >>>====== /* NORMAL NORMAL 016 */ "@ &0$ @" + "@ S H $########H### # @" + "@# H-#####$-$ $ $ $H### @" + "@#H### ### H ########### @" + "@#H #-----H#$$######### @" + "@@@@@H@@@@ @@@@@@@@@@@### @" + "@ H----S- $ $ $ $ $ $ @" + "@H# S##########H @" + "@H########S#H # @" + "@H#$ #######H # @" + "@H##########H # @" + "@H#$#$######H # @" + "@H##########H$ $ $ $# @" + "@H$ $ $ $ $#H############ @" + "@H######### H @" + "@H #0# 000 @", //======<<< Level 025 >>>====== /* NORMAL NORMAL 017 */ "@ - - - - &$ @" + "@H##$#$#$#H####H#####H-H#$#@" + "@H# ###########-#$H$## ####@" + "@H#H#### -###$H$#$#$---$--@" + "@H#H#####$ # -#H#$X$## H###@" + "@H#H# - #$#H###### H#$#@" + "@H#H#HHHH# #$##H HH H###@" + "@H#H#H--- $##$-H##$$##H - 0@" + "@H#H# H# #$##HH$##$#H # @" + "@H#H####H### #H##$###H ##@" + "@H#H#---H------H###$##H 0@" + "@H#H#H----------H$##$HH # @" + "@H#H#H ##$$##H ##@" + "@H#H HH#################H @" + "@H H--------------------H#$@" + "@###XXX####################@", //======<<< Level 028 >>>====== /* NORMAL NORMAL 018 */ "### #### #####" + "# #H#####H# ####H####HH# ###" + "##HH##$##H###$##H##$#H #####" + " H #####H ####H#####H ##" + " H##$#HHH H###$#H ##" + " HH####H H######H ##" + " H #$ #H & HHH##$#H ##" + "HH#####HHH#####HH H###$#H ##" + "H #0###HHH##0##HH H#0# H ##" + " ####HHH H#####H H####XH##" + " #$#HH H #0# H H@$##H##" + "####H #########H H###H##" + "#$#HH ###$####H###H H##" + "###H #########HH#$#H###H##" + " H H####H#$#H##" + "################H#$S# #$#H##", //======<<< Level 034 >>>====== /* NORMAL NORMAL 019 */ " S " + " &S " + "#H H#H ##S " + "H#############H#########H#S " + "H $ $ $ $#$$$$H#$ $ $ $ H#S " + "H H H H H#$X##H#H H H H H#S " + "H$H$H$H$H#$$$$H#H$H$H$H$H#S " + "##########$X##H##X########S " + " #$$$$H S " + " #$X##H$ S " + " #$$$$H$ S " + " #$X##H$ S " + " #$ H$ S " + " #$ H$ S " + " #$ H$ S " + " #$ H$ S ", //======<<< Level 035 >>>====== /* NORMAL NORMAL 020 */ "@ S @" + "@ & S @" + "@#########################S@" + "@#########################S@" + "@## ### H#H ## ###H@" + "@# ###$#H###H#H###H#H## ##H@" + "@# #####H###HHH###H#H### #H@" + "@# #####H###H# # #H#H### #H@" + "@# #####H###H# # #HHH#####H@" + "@# ##$H# ###H# # #H#H### #H@" + "@# ### # ###H# # #H#H### #H@" + "@# ### # ###H#H###H# #-$##S@" + "@## ###$ H###HHH$# # #H@" + "@######################## S@" + "@#########################S@" + "@00000 S@", //======<<< Level 039 >>>====== /* NORMAL NORMAL 021 */ "@ S @" + "@ ---------------- S-- @" + "@H 0 H @" + "@H #####H##### H###H @" + "@H H -H- H H $ @" + "@H H$- H -$H H @" + "@H H- -H- -H H @" + "@H H -$H$- H H0H H###H @" + "@H# H- H -H H#H $ H @" + "@H# H - H - H H#H H @" + "@H# H-$-H-$-H H#H H @" + "@H# H H H- #H H###H @" + "@H## H---H---H #H H$ @" + "@H#$ H ###H H $ @" + "@H 0 H ###$#H H 0#H&@" + "@H#########H$H#############@", //======<<< Level 040 >>>====== /* NORMAL NORMAL 022 */ "@ S @" + "@##$ S 0 $ @" + "@ @@H---HSH-----HH@#@@#H @" + "@ H H-H #######H @" + "@$0--H @@H#######H @" + "@## H --H-------H @" + "@@ $ H# 0 # H H @" + "@@ $ H####$$$ # H 0 H @" + "@@ #@@## H #### H @" + "@######## H ####H#H#H@" + "@ # H $$ H H@" + "@ ------H-----H H@" + "@ H H## H@" + "@ $$ H H#$@H@" + "@ H#############H H#$@H@" + "@ H & H H#$#H@", //======<<< Level 044 >>>====== /* NORMAL NORMAL 023 */ "@##### S @" + "@ ## ### # S## @" + "@## ###H #$ ##H ###### @" + "@ $ #######HH#H ###H- ---H @" + "@@@@#H- $$ H#H--$#H - H @" + "@ H @@@@@H# ##H ####H @" + "@$$$0 # #H&##H H ##$#H @" + "@#@@@@@ - ####@HH######### @" + "@-- ## #- H#@H #0 @" + "@ ## ##@# #H#$H #########@@" + "@ ## # ###H#@H ##### @" + "@ ###@ H @H- #H#####$@" + "@$##$#@@@@@@@#@H$ ##H#####H@" + "@#####H H H ###H H@" + "@ H $ H0$ H####H ##@" + "@##########################@", ////////////////////////////// BEGIN FOR NORMAL HARD //////////////////////////// //======<<< Level 002 >>>====== /* NORMAL HARD 024 */ //" ---0 - --&-----$-- 0--" + " ---0 - --&-----$-- 0 -" + //"modified for this platform, 1/20/2015 "## ##H$### # $H- #X# " + "##$ $##H##### # $H#-##X## " + " ## ## H#####$# $H##$##X## " + " # # H ## ###H $H##H### ###" + " # # H## ##H$H## H## ##" + " ### H## ##H### H## ##" + " ### H## ##H#$ H## ##" + " # H## ##H##$ H## ##" + " # H## ##H ##$ H## ##" + " # H##$ $##H ##$H##$ $##" + " # H### ###H ##H### ###" + " # S ##### #H # #######" + " # S ##### #H ## ##### " + " # S ### #H ## ### " + "##H$H###H$$$H#$#H$$$$H#$$$H#", //======<<< Level 013 >>>====== /* NORMAL HARD 025 */ " - # " + "H# # H## #H####### #H##$##H" + "H$####H##X H# #H# ## H" + "H# H- # H#---- $ #H# $ H" + "H H## # H ########H# H" + "H H## # # #H###### H# H " + "H H#$ # H ##H# # ##H#H H " + "H H ### # #H# ---#H### # H " + "H H # #H#$$#$#H# ## H " + "HH##### #$ #H#HH-H#H## # H" + " H $ ### H##### H# # # #H" + " #####H # H $ H#$#$ #HH" + "# ##H############H #$# H" + "& #H $ # ## # H ###H" + "H#####H###H$H #$ HH-#####H" + "H##$##H H H###H #H# H", //======<<< Level 020 >>>====== /* NORMAL HARD 026 */ "@& 0$ $$$$@" + "@## # H#0$ #H ###H@" + "@ ### H# # #H $ H@" + "@ H ## $ #H # ###H@" + "@##### #$ H# # ## #H ## #H@" + "@ $H- H#$$# ###H #H@" + "@$$$$ ## H$###0# #H#$#$##H@" + "@H##H H#$# #$$$####0##H@" + "@HH #- #$ H##$$######H####H@" + "@#H## $H- H#H## #$$ #H H@" + "@#H## ## H#H##$####H#H####@" + "@$H# $ H#H###$ ##$$H### @" + "@H#### #$ H#H#### ####H####@" + "@H $H#HH#H####$####H$## @" + "@H$$ #####HH---##$-HHH#0##@" + "@H### #H# S##H#H# @", //======<<< Level 021 >>>====== /* NORMAL HARD 027 */ "@#$#-& # # # @" + "@#H# ######@@@@@H##-#-H-H$H@" + "@#H#H--#-$-#H$H @H#$#H$# H#@" + "@#H#H$H HHH # H@@@@# H#H$ @" + "@#H#H# H H H H#H#H ###$@" + "@#H-H# H# H#H H H H H ---@" + "@###H# H# # H ####H######H@" + "@ #H# H# # 0 H -# ##- # H@" + "@H#-H-H H - #H ## #- #$#H@" + "@H#- H # #$#H # # ##0#H@" + "@H##### H# ### HH### ##$##H@" + "@H#$## H #$##H####-# # H@" + "@H####H#H###--#H# #------H@" + "@H#$ #H# #- ###H ###H- # H @" + "@H # H #$# H # H #$ H@" + "@H##$##### H####H#$#$### #H@", //======<<< Level 041 >>>====== /* NORMAL HARD 028 */ "@ H --- @" + "@---------H- H-----------@" + "@ H# # $ H@" + "@H###@@ #@## ######H 0H###@" + "@HH$ -- ####$ H H# #@" + "@ H $ ###--0 ####H H H###@" + "@ H $#$# - $####H H H @" + "@ H ###-- #######H $0###H@" + "@ H0 H& $ #H #$#H@" + "@ H#######H #####H#### #$#H@" + "@ H # #H # -## # ###H@" + "@ HH#### #H # $## $ # #--H@" + "@ H #$ #$#H ########## #H$ @" + "@ H#######H ## - ###H@" + "@ H# $ #H ##H#$H - H@" + "@ H ##### 0##H##H ###H H@", //======<<< Level 050 >>>====== /* NORMAL HARD 029 */ "@# # $ @" + "@# --- #####H##@" + "@# #H H H###H $##H#0@" + "@#H# H H $ H#$ #H #H##@" + "@#H##H H0 ###########H#$@" + "@ H ##H####@#H # H##@" + "@ H# H ## #H###### #$ H##@" + "@H### H ## #H #--H##@" + "@H# $ H ## #H $ $ $ $H##@" + "@H# H ## $#H########--H##@" + "@H# H #####H #$ H#$ H#$@" + "@H# H & ##### H#--H##@" + "@H# ######## H# $H##@" + "@H#######$ #$ ##H# H# H##@" + "@H $ 0########H H# H##@" + "@######H $ $ #H0 H#H H#$@", //======<<< Level 057 >>>====== /* NORMAL HARD 030 */ "@ & @" + "@ -H------H H------H@" + "@ - H H H H@" + "@ - H #$###H H #$###H@" + "@$- -H #####H- -H #####H@" + "@# - H 0H - - H 0H@" + "@ - H @@@#H - H ####H@" + "@$- -H $ H - - H $ H@" + "@# - H######H- -H ## ##H@" + "@ - H######H -$- H #####H@" + "@$- -H------H - H------H@" + "@# - H 0H$- -$H 0H@" + "@ - H @@@@#H- -H ####H@" + "@$- H $ H - - H H@" + "@# --H######H - H###$##H@" + "@ S ###### - - ###### @", //======<<< Level 066 >>>====== /* NORMAL HARD 031 */ "@ HHH 00000 HHH @" + "@ H H ----- H H @" + "@ H & H -H $ $ H @" + "@ H - - H H H @" + "@ H H H $$$ H # H @" + "@#- H # H ### H H ## @" + "@# HHH # # HHH # @" + "@ # $$H$$ # # H # @" + "@ ###H### ###H### @" + "@ H H @" + "@ H H @" + "@ HHH H @" + "@ H HH H H @" + "@ H H H H @" + "@## $ H H H @" + "@ H## ##H H##S$ @", //======<<< Level 070 >>>====== /* NORMAL HARD 032 */ "@ @" + "@ #0#H------$------H#0# @" + "@ #$#H # H#$# # @" + "@ #$# H----H H----H #$# @" + "@ # H H # @" + "@ H--------H0H @" + "@ H # --------H @" + "@ H #H# H @" + "@ H ##H## H @" + "@ H H ##$H$## H H @" + "@ H ##$#H#$## H H @" + "@ H ##$# H #$## H H @" + "@ H ##$X H X$## H H@" + "@ H H H # #H@" + "@ H& H H#$#$S@" + "@##########################@", //======<<< Level 074 >>>====== /* NORMAL HARD 033 */ "@ H#H @" + "@ H#H @" + "@H#####H H#H H#####H @" + "@H# $ #H H#H H#- -#H @" + "@H# 0 #H H#H H#-$-#H @" + "@H#####H H#H HHHH#-0-#H @" + "@HHHHHHHHHH# #H H#####H @" + "@ H# #H HHHHHHH @" + "@#########H# $ #H @" + "@ H# 0 #H##########@" + "@ H#H#H#HHH#####H @" + "@ H#H# #H HHHHHHHHH#####H @" + "@ H#$#H#H # H# #H @" + "@ H# 0 #H # H# $ #H @" + "@ H#####H # H# 0 #H @" + "@ HHHHHHH # & H#####H @", ////////////// BEGIN FOR NORMAL HARD HARD ////////////////////// //======<<< Level 043 >>>====== /* NORMAL HARD HARD 034 */ "@ #### S @" + "@ 0 ##############S @" + "@H#HH#H0 S#####@" + "@H ################ @H----H@" + "@H H---- & H-H###H H@" + "@H H - H H-H H---H H@" + "@H H -H--H $ H@" + "@H H H H@" + "@H H $ $ H H@" + "@H H $0 H - 0 -$$ H@" + "@ H ##H###H#### #### ## H@" + "@ H H H H@" + "@ H---H H H@" + "@ H H H@" + "@ H H H@" + "@$ H 0H $@", //======<<< Level 048 >>>====== /* NORMAL HARD HARD 035 */ "@ H-HHH HHH-H S @" + "@---H HHHHH HHHHH0#####S#@" + "@H ############### - S @" + "@H @@################# -$S@" + "@H #-----------# H#@" + "@H0#H # -# H-S @" + "@@@@HH# ### ### #H###S$ @" + "@ HH# $ $ $ #H# ###H @" + "@###H$# $ #$ # $ H @" + "@$##H$# $ #$- ## H @" + "@###H$# #$ # H @" + "@#$#H # ----- # - # H @" + "@###H # 0 # # H @" + "@$##H ####### - # H @" + "@###H HH&$0HH #$ $H$@" + "@##########################@", //======<<< Level 049 >>>====== /* NORMAL HARD HARD 036 */ "@ S @" + "@ S @" + "@H - - 0 S 0 &- - 0H @" + "@H### # ##H# #### # ###H @" + "@H # # # # @#### # # # # H @" + "@H# # # # # # # # # # # #H @" + "@H # # # # ##### # # # # H @" + "@H#$# #$# # ### # #$# #$#H @" + "@H # # # # # # # # H @" + "@H # H###H # H @" + "@H#######################H @" + "@H##$##$ ###$### $#0 $#H @" + "@H#0 ### ##$$$## #######H @" + "@H##### ####HHH#### #####H @" + "@H HHH H @" + "@##########################@", //======<<< Level 063 >>>====== /* NORMAL HARD HARD 037 */ "@ S S @" + "@ # S & S @" + "@ #$###H############H######@" + "@H## ##H############H#@####@" + "@H# #H#HHH$H$HHHH#H##@# H@" + "@H## ##H#HHHHHH#HHH#H#H ##@" + "@HH ###H#H#HH HHHH##H# H# #@" + "@HH ###H#HH$H##$HHH#H# H#H#@" + "@# ##H#HHHHHHH#HH#H#HH#$#@" + "@## ###H#$H#H$HHH$H#H#H H##@" + "@#$####H#HHHHHHHHHH#H#H# $#@" + "@ H#HH$H#H$HHH#H#H## #@" + "@######H#HHHHHHH#HH#H######@" + "@0 H#HH#HHHHHHH#H 0@" + "@H###### H$HHHHH$H ######H@" + "@H $ #@@@@@@@@@@# $ H@", //======<<< Level 067 >>>====== /* NORMAL HARD HARD 038 */ "@ ------- & ------- @" + "@ $#H### ###### ###H#$ @" + "@--#H0# ### ### #0H#--@" + "@###HH # ###### # HH###@" + "@# #HH # H# #### #H # HH#$#@" + "@####H-H H- -H H-H####@" + "@ ##H H ###### H#H## @" + "@### ##H#H#$##H#$#H#H## ###@" + "@$ #H#H#-#H #-#H#H# $@" + "@#$##$#H#H ##$H## H#H#$##$#@" + "@$ ####H#H ###### H#H#### $@" + "@## $ H #H X# H# H $ ##@" + "@ HHH ##$X#$## HHH @" + "@##H##H #H #$$# # H##H##@" + "@ H H ##HH##HH## H H @" + "@H####$#H0 HH 0H#$####H@", //======<<< Level 075 >>>====== /* NORMAL HARD HARD 039 */ "@ @" + "@H################# #H#### @" + "@H $## 0## #H##$# @" + "@H### $##0 H# @" + "@H###0 -$####$ ##$### @" + "@H ##$$# ##$ # # @" + "@H# ##### ##$ ##$ # $ @" + "@H## #####$ ##$ #$ $##@" + "@H ## #####$ ## # # $## @" + "@H $## #####$ ##$ ##H @" + "@H$# ## ##### # # H @" + "@H# $### H## # @H@@H $H$@" + "@H $# $## H#### @H @H $H$@" + "@H # # ## H @H$@H $H$@" + "@H 0 &H @@@@H ####@" + "@###############H H#####@", ////////////////////////////// BEGIN FOR SPECIAL NORMAL //////////////////////////// //======<<< Level 053 >>>====== /* SPECIAL NORMAL 040 */ "@ H - @" + "@---H--- ### H @" + "@$ H $ H##@@@@@@@@@@#$# @H@" + "@# H # H-- $ $ ### #H@" + "@# $H # H - H#H H#H $H@" + "@# #H # H# #@@@@@@@@@@@ ##H@" + "@# -- # H#- $ $ -H#- $-H@" + "@ #$ ## H# #@@ @@@# H $ #H@" + "@ ## H# # 0$ #H ###H@" + "@ H#$##########H --H@" + "@ H@@@@@# # #0#H@" + "@H H@#####H@#@@#@@#@@#####H@" + "@@@@@#####H $ $ $ @H@" + "@& H H@" + "@@@@@@@@@@H@@@@@@@@@@@@@@@@@" + "@$ H 0 $$@", //======<<< Level 059 >>>====== /* SPECIAL NORMAL 041 */ "@S#0 @" + "@S## @" + "@S### $- @" + "@S#### #0 ######H@" + "@S##### - #########H@" + "@S###### $- ##### #H@" + "@S $ # #$ #H$#H@" + "@ ##H H# ##### HH##H #H@" + "@ 0#H H# $- ######HH#HH##H@" + "@###H H# @ #$ #H## #H@" + "@ H H# ########H#H#H#H##H@" + "@ H H# #H#H H##H# H#H$#H@" + "@ H H# #$H#H$H#H ##H# #H@" + "@ S H# #################H@" + "@ $ S#H & 0 H@" + "@##########################@", //======<<< Level 003 >>>====== /* SPECIAL NORMAL 042 */ "&-- $$ H - @ " + "H # ## $ H###0# @@@@H### " + "H #### # H#$$# $$ H#$#H" + "H @ ## HH## # H## H#$$#" + "H @@@ @ H0 $ H##$#" + "H @ $@ H#### ## ######" + "H @ $ @@@ H # ## H $H" + "H0 #$ @ H # ### #H #H" + "######## @ HH ### ##H " + " $ @ H @ # ###H " + " $####H @ H @@@ ####H " + " $### H H @ #####H " + "######HH $H# #H@$######H " + "# H#$HH ### # H@#######H $ " + "# $ ##HH H H # " + "######## #####H### #####H## ", //======<<< Level 005 >>>====== /* SPECIAL NORMAL 043 */ "# - & #H #" + "###$###H###$#H#H#######H####" + "#######H#$###H#H###H#$#H#H##" + "#######H##$$#H#$#$# #H####" + "########H##$#H##$@@0@@0@@0@@" + "#########H###H### $# $# $# " + "#########H###H###H#$H#$H# $" + " ###H$#H##############" + "H############H# #" + "H#$#$##$ $ $#H# #########H#" + "H$ $#########H#$ ## H H H#H#" + "H#$##########H### $#$#$#$#H$" + "H##$#########H####H H H H H#" + "H$##$$$####$$H##@@#@#@#@#@$#" + "H#$##H#$#$###H#$ #$ #$ #$ ##" + "H#$#####$####H$#H$#H$#H$#H$#", //======<<< Level 007 >>>====== /* SPECIAL NORMAL 044 */ "@ $------& -------- $ @" + "@$#0#####H#0# ####H$#H####@" + "@# ######H#### #H# H $ @" + "@ $ ###H ## $$ #H# H ###@" + "@# ## H ## #H# H $ @" + "@# ## H# #### H##H##0#@" + "@### ###H# $ #H H # @" + "@# ##H###### #H# #H $ @" + "@# ####$ H ## $ #H@ ##@" + "@# ###H ## #$ H@ @" + "@## #####H##### ## #HH ## @" + "@ $# $ #H #H # @" + "@ ### H#######H### H####@@@@" + "@ $ H# #H H# $ @" + "@########H############H####@" + "@ $#H$ $#H$ @", //======<<< Level 008 >>>====== /* SPECIAL NORMAL 045 */ "@#H# # # H #######-$H@" + "@$H$ H#$HH##-$--H------ ##H@" + "@H ##HH#--H #H H# H H@" + "@H- H ##H #H ## H#$# #- H@" + "@ H ## #H ## H H # #H@" + "@H#-# # # H# ##H - H # H@" + "@H# # ##$##H# H -H # H@" + "@H# ##H H#&H-H # # H H@" + "@H H ## # H-H0#H H## #H@" + "@H # # H- H #H##$## # #H@" + "@H # H H## #H # # #-#H@" + "@H# # H H ## H# ## H S@" + "@H -# #$#H ## H# H## H H@" + "@H #H H# H--#HH## H@" + "@H## ------H--$ ##HH$#H $H$@" + "@H ####### H # # #H#@", //======<<< Level 009 >>>====== /* SPECIAL NORMAL 046 */ "@S --$ & $0 -$ $@" + "@S 0------#H###H#$H$$####H@" + "@S #H #$ $ -##H# #0$#H@" + "@S #H # # H## #H ###H@" + "@S # H# $# H$# $#H #H###H@" + "@S ##H ## #H ## #H #H@" + "@S ## H#$H#- #H # ## H@" + "@S ###H##X# H ##H# H##@" + "@S ###H #$H H####$ @" + "@S ###H $$ ### #$#H H @" + "@S ###H # H @" + "@S ###H###H # H#H####@" + "@H#####H H#HH#######H# @" + "@H $####### H#H## $H-#H @" + "@HSH# $ # H $# ##### #H@" + "@ 00 # #H $## $ H@", //======<<< Level 010 >>>====== /* SPECIAL NORMAL 047 */ "@ #### $@" + "@###########H## #HHH$@H@" + "@ - 0 #H #####H - H@" + "@H##H# ##HH-H H ##@" + "@H## #H# ##H #H H @" + "@H##H#$# H######HHHH 0 @" + "@H@@@@@@ H#$ @" + "@H H##### @" + "@H $ H# ###H#&$ @" + "@H H#H##H H ## @" + "@H#H ---H#H H H # @" + "@H #H #0 ####H# @" + "@$H#H #############H H # @" + "@#H#### - H#### @" + "@$ H##########H #H #$ @" + "@ $H $ # $ H#0 H#H$ @", //======<<< Level 012 >>>====== /* SPECIAL NORMAL 048 */ " 0 - - " + " & H########0#$####H###" + " #$# H#$# # #### H#$#" + " X H## - # - H#$#" + " H $ ##$ $ H###" + "#H#0# H#H-H#$# H#$#" + "#H ### H## ### H########" + "#H $ H $ H-- -- #" + "# ####S# ######### H# $0" + "# S H # H H " + "$#H--#H ###########H##$#H " + "## H ### H # " + "#$H###H-$ # # # H # # #" + " H$ $# # # # H # " + "$H####H H # H " + "$H$$$$#H #### #####H H 0$", //======<<< Level 047 >>>====== /* SPECIAL NORMAL 049 */ "@ $ ----###@" + "@ $$ #H00 # #H#@@@ ###@" + "@######H ####H# #@" + "@ -H # #H#$ # ###--#@" + "@##@H -H #####H######@@ #@" + "@$$ H -H #####H--H $# ##@" + "@ H -H$$ -- H $#H# #$@" + "@ ##H & H H#$#H@" + "@ ####H#########H######HH@" + "@ H#$# # #H H$@" + "@######H #$#H###H#HH### ##H@" + "@--####H##$##H##H#HH# $ #$H@" + "@$0####H##$###$ H#HH# ##H@" + "@######HH#$####-H#HH### #$H@" + "@ $ #########HH@@@@@@H@" + "@######H 0 HH H@", //======<<< Level 052 >>>====== /* SPECIAL NORMAL 050 */ "@ -- @" + "@ #@#@#H---H--##H#@#@#@#@" + "@ ## 0# H # #H# 0 $ @" + "@# ## #0H$ # -#H#H@@@@@@" + "@ # # $H $#H #H#H @" + "@ $ # H #HH# #H###@@ @" + "@# # # H $ ##H$ @ @" + "@ ###$ -### # # ##H #H @" + "@ ## # ##$# #$ #######H@" + "@ # ### # # - - - - H@" + "@ ---H#$## #$H#@#@#H ## @" + "@ & # H##### #H H $##@" + "@##@# # H H H ##$@" + "@###### H#######H $ $ H ##@" + "@ H H# H##H# #H###$@" + "@ H###H H#$H#$ ##########@", //======<<< Level 061 >>>====== /* SPECIAL NORMAL 051 */ "@##################### S@" + "@# - - - - - S@" + "@ 0H#$#$#$#$#$#H & S@" + "@################H########H@" + "@ #H-----H H@" + "@ #H-- -- # H H@" + "@ #H #### H# ####$##H H@" + "@ ##H## # H# #$#####H H@" + "@ ##H##### H# #### --H H@" + "@ ## H# # H# #$##H H@" + "@ ## H#### H# ### H##$ #H@" + "@ ##$H# # H# #$##H#####H@" + "@ ## H#### H# ### H###$#H@" + "@ ######$###H# #$##H## #H@" + "@ ###### #H$ #######@@#H@" + "@ ##########H# S@", //======<<< Level 065 >>>====== /* SPECIAL NORMAL 052 */ "@H #-------####### H####@" + "@H # 0 # $ $ # $ #H# &@" + "@H ######H##H######## H H##@" + "@H # ### H#$H#H#$#### H## H@" + "@H # ### H##H#H# #### H## H@" + "@H # $ H## ###### # H@" + "@H # # H## # H# ####H@" + "@H ##H H $ ####H# 0$ H H@" + "@H #H##### #####HH##0#H $ @" + "@##H#H $$ ##H---# H#H# #@" + "@ H###########H$$$$ H#H# #@" + "@H## ##########H@# #@#H @" + "@H # ### -H#@@@@###H## @" + "@H 0 -### H#@@# H# $@" + "@H#####$#$### H H#H H# @" + "@H ###### H############@", //======<<< Level 078 >>>====== /* SPECIAL NORMAL 053 */ "@S---- - 0 @" + "@H 0 @@@@ #0 @" + "@H# # ######### 0 @" + "@H##### # $@" + "@H 0 ########### & H@" + "@H# # # H@" + "@H#### ###########H H@" + "@H $ H @" + "@H# # $ ############ H@" + "@H### ## $ H @" + "@H $- ## H# @" + "@H $# # $ H#$# $@" + "@H#######@ H# #####@" + "@H ------$ H# # #####@" + "@H# S H#$#######@" + "@##@@@@@@@ ####H#########@", //======<<< Level 079 >>>====== /* SPECIAL NORMAL 054 */ "@## ## & -H######@" + "@$ #H ########H# H @" + "@### H#### # ### H#### ###H@" + "@### H# $ H#### # H@" + "@ ## H# H#H## H# $#----H#H@" + "@##0#H # H ###### H#H@" + "@ #######$#H ### H#H@" + "@ #### #H##H### ### H#H@" + "@### H H#$H##H$H#H# @" + "@# H@#### H H# H H H#H#H@" + "@ H $H### #### H H#H#H@" + "@$H## H $H## $##### H#H@" + "@H@H$H### H$H#########H##H@" + "@H#H H###### H#0#$## -H #H@" + "@H#@#H########## ##H# H##H@" + "@ H $ H#0@$#H@", //======<<< Level 080 >>>====== /* SPECIAL NORMAL 055 */ "@ -- - - - ------- @" + "@H######-H$#$#$#$#$H #$@" + "@H###### H#########H--#####@" + "@H###### # - H @" + "@H#####$ ###H# ####### ###H@" + "@H###### #$ H$ #### $ $H@" + "@H- $# ###H# # #H## #H##@" + "@H #H ## #H# ###H$ H $@" + "@$#$H# #$#H$ #-$#H## #H##@" + "@H##H###-###H#$####H$ H &@" + "@$#$H#-# H##############@" + "@###H#$# ##H- ---- -# @" + "@ H ## #$H ####S ##$# #@" + "@H####- # H###$###H - @" + "@H -#$#$ H #$##$#H####$#@" + "@H#### ####H #$#####H#$ #H$@", /////////////////// BEGIN FOR SPECIAL HARD //////////////////////////// //======<<< Level 022 >>>====== /* SPECIAL HARD 056 */ "@& 0# - -- @" + "@X#X H# #H##$H$$#H###H####H@" + "@ H## # #H$$#H # ###H #H@" + "@## H# ##H###$ H# H#H@" + "@## H$$# #$$ $$H### # #H#H@" + "@$$ H# H$H ###$H ##### H#H@" + "@## HHH H HH $$$#H$#- @$#H@" + "@$$ $ $ H#H# # ###H# ## $#H@" + "@## ###H###- # # H # ### H@" + "@ H- #H $# ## $ H# $####H@" + "@H#H$##H $ #####0#H### ###H@" + "@$#H#$ HH-## # #$H$# ###H@" + "@$#H ## # # $#H#$#0##0H@" + "@H#H#### H#$ ####$H$# ####H@" + "@ H #H######H### -H@" + "@##H###H#H H # ####0H@", //======<<< Level 023 >>>====== /* SPECIAL HARD 057 */ "@& # @" + "@##HH ####### ----H- - - H@" + "@#### ## H # # #H @" + "@ ####H##$$####H# # #$ $@" + "@ #####H ## H # # X$ @" + "@ ###$0#H##$0####H# # #$ $@" + "@ # #####H ## H # # X$ @" + "@#$ ##$$####H# # #$ $@" + "@ # #####H ## H # # X$ @" + "@ ##$0##H##$0####H# # #$ $@" + "@ ####H ## H # # X$ @" + "@ ###H##$$####H# # #$ $@" + "@ H ## H # # XH @" + "@ H H # H # H@" + "@ $ H H H X #@" + "@H## ####H### ############@", //======<<< Level 069 >>>====== /* SPECIAL HARD 058 */ "@#########################H@" + "@#########################H@" + "@H - $ - S@" + "@H##H###H# #0####H### #0##H@" + "@H H#$#H ######H ## ### H@" + "@ #$#H #H $ ###H# --HS@" + "@H######## #H#####H $ $-H S@" + "@-- -- $ H#$#$ H## # HS@" + "@0H# $#H####H### H# H@" + "@##H###H-H##H#######H # $#H@" + "@--H$##H H--- H#### H@" + "@###@#H H ####H H# #H@" + "@ 0 H##H##H##$#H# ######H@" + "@H#### H H####H## $0 H@" + "@H##$# # -- H--&-H H ###H@" + "@H###H$H# $#H #$$$$H $ H@", ///////////////// BEGIN FOR SPECIAL HARD HARD /////////////////////// //======<<< Level 083 >>>====== /* SPECIAL HARD HARD 059 */ " " + " H##################00000#" + " H--------------- ##### " + "H@ H& $ $ $ $ " + "H#@#@# ##X#####X" + "H-------------------------- " + "H- H" + " H#H## H" + " H#X## " + " H$$$ @@@@@@@@#############" + " H S$$$$$$ @# ## # #" + " H@#@X@#@#@#H@# ## # #### #" + " H H@# # #### #" + " H H@# #### ######" + " H H@# ##### # #" + " S @#############", //" @#############", //add a hide ladder //======<<< Level 072 >>>====== /* SPECIAL HARD HARD 060 */ "@@ @@@@@@@@@@@@@@@@@@@@@ @S@" + "@@- -@S@" + "@@H##########$ ########HH@S@" + "@@H#$ $#0#H H #HH@S@" + "@@H###SH##### ###### H# H@S@" + "@@H#$#H #$ # #$ #H$#H #H@S@" + "@@H@@@@@@@@@@@@@@@@@@@@@H S@" + "@@H0 & 0H@ @" + "@@H#####################H@ @" + "@@H$## $## $ # $ ##$ ##$H@ @" + "@@H#####################H@ @" + "@@H######### #H#H#H#H#H@ @" + "@@H H#H#H#H#$$$#H#H#H#H#H@ @" + //"@@H HXH#H#H#$$$#H#H#H#H#H@ @" + //change one trap to block (harder) "@@H@@@@@@@@#####@@@@@@@@H@ @" + "@@H ##### H @" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 081 >>>====== /* SPECIAL HARD HARD 061 */ "& -------- " + "H####### H## ##H " + "H# H# # H# H####H #H " + "H#$ # $# H# H#$$#H #H " + "H ##### H# #H#--#H# #H " + "H# H# # H############H " + "H#$ # $# H H " + "H ##### H# H####H #H " + "H# H# # H# H#$$#H #H " + "H#$ # $# H# H# # # #H #H " + "H ##### H##############H " + "H#HH# # H H " + " #$ # $# H#SH#SH####H #H #H " + "$####### H# H# H#$$#H #H #H " + " H#$H#$H# #H$#H$#H " + "############################", //======<<< Level 082 >>>====== /* SPECIAL HARD HARD 062 */ " S S" + "---------- $$$ S " + "H ##################H H" + " H00000 ------------------H " + "H #H ##### H" + " H #H & H " + "H #H H###H #H H" + " H #H H#$#H #H#H H " + "H #H - # # $#H# #H H" + " H #H #####- #$#$#H H " + "H H ##### @@@#@@@ H" + " H #- H##### H " + "H $-H $ ###HS#H H" + " H #$#H #H H " + "H #H##H H" + "H# ######### S##H####", //======<<< Level 085 >>>====== /* SPECIAL HARD HARD 063 */ " - - - - - " + "# # # # # @@@@@@HH H H HHH " + " # # # # @# H H HH H " + "# # # # @ H H H H H " + " # # # @H- H HHH H H H " + "# # # @#H H 0 H H 0 H HHH" + " # # @# H ##################" + "# # @# -H -- " + "$#$@ -H #H###H#000-- # H" + " H #H###HH### #### H" + "####H## #H####H### ##@ H" + " - #######H####H$## #$ H" + "H# H #H# #####H & H" + "H## ##H### H H#---H#H##### H" + "H#####H####H@## H H#H -S# H" + "$##H##$##$#H@$$# #H#H##S$# H", //------------------------------------------------------------ // BEGIN // Levels from "Lode Runner Fan Book (4 levels) DISK IMAGE" // URL: http://ww3.tiki.ne.jp/~maclr/lr/lr.html // By maclrse //------------------------------------------------------------ //======<<< Level 064 >>>====== "& -------- " + "H####### S H## ##H S " + "H# H# # S H# H####H #H S " + "H#$ # $# S H# H#$$#H #H S " + "H ##### S H# @H#--#H@ #H S " + "H# H# # S H############H S " + "H#$ # $# H SSSSSSSSSS H " + "H ##### H# H####H #H " + "H# H# # H# H#$$#H #H " + "H#$ # $# H# H# # # #H #H " + "H ##### H##############H " + "H# H# # H SSSSSSSSSSSS H " + " #$ # $# H# H# H####H #H #H " + "$####### H# H# H# #H #H #H " + " H#$H#$H#$$#H$#H$#H " + "############################", //======<<< Level 065 >>>====== " " + "----------- S " + "H ##################H H" + " H00000 ------------------H " + "H #H ##### H" + " H #H & H " + "H #H H###H #H H" + " H #H H#$#H #H#H H " + "H #H # # $#H# #H H" + " H #H -#####- # # #H H " + "H H ##### ####### H" + " H #-H ##### H " + "H $-H $ ###H #H H" + " H #$#H #H H " + "H #HX#H H" + "H# ######### ##H####", //======<<< Level 066 >>>====== " - - - - " + "# # # # # @@@@@@HH H H HHH " + " # # # # @# H H HH H " + "# # # # @ H H H H H " + " # # # @H- H HHH H H H " + "# # # @#H H 0 H H 0 H HHH" + " # # @# H ##################" + "# # @# -H -- " + "$#$@ H #H###H@000-- # H" + " H# #H##XHH@##- #### H" + "#####H# #HX###H###-##@ H" + " - ######H####H$## #$ H" + "H## H #H#X ###@## & H" + "H### ##H## H H#---H@H##### H" + "H######H####### H H@H # H" + "$###H##$##$##$$# #H@H###$# H" //------------------------------------------------------------ // END // Levels from "Lode Runner Fan Book (4 levels) DISK IMAGE" // URL: http://ww3.tiki.ne.jp/~maclr/lr/lr.html // By maclrse //------------------------------------------------------------ ///////////////// END FOR SPECIAL HARD HARD /////////////////////// //======<<< Level 004 >>>====== /* TOO BUSY " - - - --& -- - - - " + "H @@@ @ @@@ #H @@@ @ @@@ H" + "H $ $ HH $ $ H" + "H #H# # #H# H# #H# # #H# H" + "H H H H HH H H H" + "H -H- - -H- #H -H- - -H- H" + "H#0 HH 0#H" + "H########## H# ##########H" + "H########## HH ##########H" + "H #H H" + "H ######### HH ######### H" + "H# $ $ H# $ $ #H" + "H#### # ### HH ### # ####H" + "H---- - ----H#HH---- - ----H" + "H # H H # H" + "H H H H H H H H", */ //======<<< Level 011 >>>====== /* " - ##" + " ###H########H##-#####H#####" + " H & H @@@H# ##" + "# S@ #0# H # H #H##" + " #S@ @ ## H # @@@##HH##" + " S @ #@ H # # HH##" + " S @ H #H H##" + "#$ S H # H##" + " # S $ H $ @ H##" + " S H @ H##" + "# S # H # @ @H##" + " # S $ H $ @ @H##" + " S$@ -- H # @@@H##" + "# H#H#@ H @ @H##" + " # # #H #H## H##" + "# H#H#H#HH H##HHHH###", */ //======<<< Level 014 >>>====== /* NEED MODIFIED for this platform " - & " + " H 0 0 " + " H X # #H" + " $$$ H #$# ###H" + "##### H # $ # H" + " H # ## # #$#$#H" + " H #$$ H # #####H" + "- HHHH#### H # H" + "0#$# H #$#0# H# #$#$#$#H" + "# #$# H #X### H # #######H" + "0# # HHHHH$ $ H# $$ H" + "# # # H # H $$# #### H" + " H # H$$ H # $$ H" + " H # #### # #### H" + "$ $ $ H $$ $$ H" + "#####H#H####### ###H H", */ //======<<< Level 029 >>>====== /* NEED MORE CHECK "-0 & ---- ----- " + "$###H###$$$####$$$$$##H##$##" + "#X##H#$#####$$########H##-$#" + " X##H#-##$########H---H##-##" + "#$# H# H " + "## #H#$#########H######## #H" + "#$# H##$####$###H###$#### #H" + " # #H###$####$#$H#$###$ ###H" + "# ##H#### 0####H ## ###H0 H" + "$ ##H##$ ### ##H## 0 ##H# ##" + " ###HH ####$ $#H$##### H####" + "## H### ######H$#### H H " + " #H###$ ### #HH##-- #H " + "$#H ###### $ H#$ ###$#H" + " # #HH$$H#$ ####HH## ##H H" + "################H### $# ###H", */ //======<<< Level 033 >>>====== /* SKIP (TOO MANY TRAP) " ---------------------------" + "H#X#X#X#X#X##X##X#X#X#X#X#X#" + "H X X X X # # # # X X X X X " + "H###X#X#X####X##########X###" + "H# X # # # # X # # # # X # X" + "H#######X#########X#########" + "H # X # X # X # # X # X X # " + "H##X#X##X###################" + "H# # X # # X # # X # X # X #" + "H###########################" + "H # X X # X # # X # X # X X " + "H###########################" + "H# X # X # # # # X # X # X #" + "HX##########################" + "H # # # # # # # # X # # # " + "H&#H $ $ $ $ $ $ $ $ $ $ $ $", */ //======<<< Level 036 >>>====== /* TOO MANY GUARD "@ & @" + "@0 -------S------- $@" + "@H##### H #####@" + "@H $ ------S------ 0$@" + "@H ##### H ##### @" + "@H $0 -----S----- $ @" + "@H ##### H #### @" + "@H $ ----S---- 0$ @" + "@H #### H #### @" + "@H $ ---S--- $ @" + "@H ### H ### @" + "@H $ --S-- $ @" + "@H ## H ## @" + "@H $ -S- $ @" + "@#########H###H###H########@" + "@#$$$$$$$H#H$$ $$H#H$$$$$$$@", */ //======<<< Level 038 >>>====== /* "@ S @" + "@ S @" + "@ #H# # 00# @" + "@ #H# ##### @" + "@ #H# @" + "@ #H# @" + "@ #H# H---- - -----@" + "@ #H# H -# # H@" + "@ - #H# H # # H@" + "@ -#@@@#H# H#####$### H@" + "@ - #H# # H ####### H@" + "@ - #H# # H #$$##$# H@" + "@ $# #H# # H ####### H@" + "@@@@@@@#H############ ##H##@" + "@ 00 H & 0 H @" + "@#######H###############H##@", */ //======<<< Level 045 >>>====== /* TOO MANY GUARD "@ &S @" + "@ S $@" + "@HHHHHHHHHHHHHHHH-H-H-H-H-H@" + "@HHHHHHHHHHHHHHHHH-H-H-H-H-@" + "@HHHHHHH$$HHHHHHH-H-H-H-H-H@" + "@HHHHHH-##-HHHHHHH-H-H-H-H-@" + "@HHHHH-HHHHHHHHHH-H-H-H-H-H@" + "@HHHHHHHHHHHHHHHH - -0@" + "@HHH--HH--HH--HHH#####H H@" + "@HHHHHHHHHHHHHHHHH-H######H@" + "@HHHHHHHHHHHHHHHH-H# ##H@" + "@H$$HH$$HH$$HH$$HH-H## $##H@" + "@H##HH##HH##HH##H-H#$$#$##H@" + "@HHH$$HH$$HH$$HHHH-H######H@" + "@HHH##HH##HH##HHH-H-H-H-H-H@" + "@HHH0 HH0 HH0 HHH $@", */ //======<<< Level 046 >>>====== /* TOO MANY GUARD "@$ $ $ @" + "@#H H# $ H# $ ##H0 @" + "@ #H H H#H H## H$@" + "@ #H 0 H # H H 0 H@" + "@ HH#H H #H H $@# H @" + "@ #H #$ H H ##H $# H@" + "@ $H H H H H $H @" + "@@# $ H ##$ H# H $##H@" + "@ ##$ H @#& H## H$# H@" + "@$H #H $ H#H $ H HH @" + "@#$ H ##@H$ H H$0 ## H $@" + "@ # H H#@H $@#H H #@" + "@ # $ 0H# H $# #H$ H# @" + "@ # H# H#@ #H H# @" + "@ #H## H ##H @" + "@ $ H HHH H $@", */ //======<<< Level 051 >>>====== /* NORMAL HARD BAD "@ S @" + "@ S @" + "@ S @" + "@ S @" + "@ S @" + "@00 S&S 00 @" + "@HHHH#####H##H##H#####HHHH @" + "@$ H#H H H#H $ @" + "@########H###H###H@@@@@@@# @" + "@ #H# @" + "@HHH#####H###H###H#@@@#HHH @" + "@$ H#H H H#H $ @" + "@#######H####H#@@@H@@@@@@# @" + "@ #H# @" + "@HH#@@@#H#@@#H#@@#H#@@@#HH @" + "@$ H#H H H#H $ @", */ //======<<< Level 054 >>>====== /* BAD CAN REMOVE "@ & @" + "@####H $@" + "@ ###S H###H####@" + "@ S H####H H$ @" + "@ 0 H#####H H $@" + "@$$H###H H####@" + "@##H $ H###H$ @" + "@ H####H H $@" + "@ H####H H####@" + "@$$0H###H $ H$ @" + "@###H H###H $@" + "@ $ H##H H####@" + "@ H###H H$ @" + "@ H###H H###H $@" + "@$$0H##H H####H H####@" + "@H###$$ H####$$ H $@", */ //======<<< Level 055 >>>====== /* BAD CAN REMOVE "@ & S @" + "@ S @" + "@ S @" + "@ 0 0 S 0 @" + "@H######H H######H H######H@" + "@ H $ H H@" + "@H######H H######H H######H@" + "@HH $$ HH @" + "@H#H####H0H######H H#H####H@" + "@ $ H #H H@" + "@H#X X#HH @@@@@@@@ H## XX#H@" + "@H XX H H##X$##H@" + "@HH#$##HH H######H H###X##H@" + "@ H $ H H $$ H $ H@" + "@H######H H##X###H H######H@" + "@H H H H 0 H@", */ //======<<< Level 056 >>>====== /* TOO HARD MAY BE DROP "@##@# H #@@##@###@#@##@@###@" + "@@## H H ##@#@###@#@##H##H#@" + "@$& H$H$H 0 0 $@#@ #@###@H#@" + "@##H H H H###@### H @##H@H#@" + "@#@ H$H$H @###@@ H$H @###@#@" + "@$ @ H H $ H H H $@" + "@##@# H #######H$H$H$H#####@" + "@# $##H## ###H# H H H ##0$#@" + "@#####H H ##$## H$H ## ###@" + "@#####H H H #### H ## H ##@" + "@$ H$H$H $ H # H$H #@" + "@#####H H H H######H H H H @" + "@#H### H$H$H ##$ ## H$H$H$H@" + "@##$ ## H H ##0##### H H H @" + "@####### H #### ##### H$H @" + "@$ H $ H $@", */ //======<<< Level 058 >>>====== /* TOO MANY GUARD REMOVE "@ &0 @" + "@ $ $-$ $-$ $SS$-$-$ $-$ $ @" + "@ @H@ #H# @H@SS@H@ #H# @H@ @" + "@0HH$$$HHH$H$HH$H$HHH$$$HH0@" + "@HHH@@@HHH@#@HH@#@HHH@@@HHH@" + "@HH H$$HH$$HH$$HH$$HH$$H HH@" + "@H$$H@@HH##HH@@HH##HH@@H$$H@" + "@H##HHH$$HH$$HH$$HH$$HHH##H@" + "@H$$$HH@@HH##HH##HH@@HH$$$H@" + "@H#@#H HH$$HH00HH$$HH H#@#H@" + "@H$HH$$HH##HH$$HH##HH$$HH H@" + "@H#HH@@ $$ H@@H $$ @@HH#H@" + "@HHHHHHH##H$$HH$$H##HHH HHH@" + "@HH$$HH$$HH@@HH@@HH$$HH$$HH@" + "@HH##HH@@HHHHHHHHHH@@HH##HH@" + "@$H HH HH HH HH HH H$@", */ //======<<< Level 060 >>>====== /* BAD LEVEL "@ ######## H @" + "@ #$$00$$# H @" + "@ #H# @#H# & H @" + "@ #H#H@$H#H#@@@@@@@@@@#H# @" + "@ #H######H# $$$$$$$$ @H# @" + "@ #H$$$$$$H#H#@@@@@@@H#H# @" + "@@##@@@@@@#H#H@$$$$$$#H#H# @" + "@# $$$$$ @H#H#H#@ #H#H#H# @" + "@#H#@#@ #H#H#H#H#0H0@#H#H# @" + "@#H@$@0H#H#H#H#H#####@H#H# @" + "@#H#H@@##H@H#H#H$$$$$$H#H# @" + "@#H@H$$$$H@H#H#@######@#H# @" + "@#H##@@@@##H#H$$$$$$$$$$H# @" + "@#H$$$$$$$$H#@@###@#####@# @" + "@#@##@####@H @" + "@ H @", */ //======<<< Level 062 >>>====== /* TOO BAD "@ H---0##0---H @" + "@ H # # H @" + "@ H #$ $# H @" + "@ H # $$ # H @" + "@ H##########H @" + "@ H--- ## ---H @" + "@ H #$$# H @" + "@ H #$ $# H @" + "@ H # # H @" + "@ H##########H @" + "@ H--- ## ---H @" + "@ H # # H @" + "@ H #$ $# H @" + "@ H #$ & $# H @" + "@ H##########H @" + "@ H H @", */ //======<<< Level 064 >>>====== /* BAD TOO HARD REMOVE "@ @" + "@#######H $- &@" + "@ SS --- #00000#@" + "@ SS $ #######@" + "@ SS # ###########@" + "@ SS #HHH HHHH#@" + "@ SS -- ###H H H#@" + "@ S $- # H HH H H#@" + "@ SS # # H H H H#@" + "@SS - #### HHHH HHHH#@" + "@S $- ### #@" + "@S # # H H H H H #@" + "@S$- ### HH HH H H HH H #@" + "@## ## H H H HHH H HH #@" + "@ # H H H H H H #@" + "@##########################@", */ //======<<< Level 068 >>>====== /* NORMAL HARD HARD MAY BE CAN REMOVE "@# #0# #0# #0# #0# #0# # # @" + "@ H X H X H X H X H X H # H@" + "@$ H $ H $ H H $ H $ H $ H @" + "@ H H H H H H H@" + "@H H H H H H H H H H H H H @" + "@ # H - # H - # H - H H - H@" + "@H H H H H H H H H H H H H @" + "@ H #$# H #$# H #$# H #$# H@" + "@H H # H H # H H # H H # H @" + "@ # H # H # H # H #@" + "@ # H # H # H # H @" + "@ $ H H $ H H $ H H $ H H $@" + "@ H H H H @" + "@ H H H H H@" + "@H H H H H H H H H @" + "@ H H &H H H@", */ //======<<< Level 071 >>>====== /* TOO HARD TO GET TOP GOLD ??? "@ S @" + "@ S @" + "@ S @" + "@ S @" + "@ S$ & @" + "@H########## ###H ####H##@" + "@H H ####H##@" + "@H H#@@@@#H#### H ####H#0@" + "@H H# #H# $# H ####H##@" + "@H H####H#H#### # ##0#H##@" + "@H H#$ #H# $# #####$##H##@" + "@H H@ $ #H##@@ ##$$#H##H##@" + "@H H## #@#H# $ ###H#H##H#$@" + "@H H######H#### ##$##H##H##@" + "@ H 0 H H @" + "@##########H H###########@", */ //======<<< Level 073 >>>====== /* CAN NOT PASSED "@ S S @" + "@ S & S @" + "@####H################H####@" + "@$## H####### ########H $@" + "@## H #############H ##@" + "@$## H################H $@" + "@## H# #H ##@" + "@$## H##############H#H $@" + "@## H# $ H#H ##@" + "@0## H#H##############H $@" + "@## H#H # H ##@" + "@$## H#############H #H $@" + "@## H# H# H# ##@" + "@$## H############## #H # $@" + "@## H # H ##@" + "@$###H 0 H $@", */ //======<<< Level 076 >>>====== /* NORMAL HARD HARD */ /* "@ S @" + "@ S @" + "@ & H 0 @" + "@ #@@#@@@@#S@@#@@@@#@ @" + "@ H 0 $ @" + "@ ##@@#@##S##@@###@# @" + "@ $ H @" + "@ @####@#@#S#@##@#@### @" + "@ 0 H $ @" + "@ #@##@#@#S#@#@@### @" + "@ $ H @" + "@ ###@@#@##S##@#@## @" + "@ H 0 $ @" + "@ @@###@##@#S###@###@## @" + "@ $ H @" + "@##########################@", */ //======<<< Level 084 >>>====== /* IMPOSSIBLE for this platform */ /* "@ H-----H----------H@" + "@& -$ H H H@" + "@#0$## H ## - # # # ##H@" + "@## H #$# #-# # # X-H@" + "@ ## $ H ## #$# #$ # $#H@" + "@ ## --H # # ## # ##H@" + "@ H##0 H H@" + "@ # H## H H@" + "@#@@@@## H################H@" + "@0 H-H-------- ---H---H@" + "@#####HH# # ## - # H H@" + "@ # H# # # # # # H H@" + "@ # ##H# ## # # # # H H@" + "@$#$# H# # #$# #$#H# # H@" + "@ # #H # # # # X H##$# H@" + "@ H H#$# #H@", */ ]; ================================================ FILE: lodeRunner.v.professional.js ================================================ //************************************************************ //* All levels extract from: //* Lode Runner I (C64) DISK IMAGE //* by Simon Hung 2015/01/05 //************************************************************ var proData = [ //======<<< Level 001 >>>====== "0 & 0" + "#S########### ###########S#" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH" + "$HH HHH HH HHH HH$" + "$HH H HH HH HH H HH HH HH$" + "$HH HH HH HH HH HH HH HH HH$" + "$HH H HH HH HH H HH HH HH$" + "$HH HHH HH HHH HH$" + "$HHHHHHHHHHHHHHHHHHHHHHHHHH$" + "$HHHHHHHHHHHHHHHHHHHHHHHHHH$" + "$HH HH HH H HH$" + "$HH HHHHH HH HH HHHHHH HHHH$" + "$HH HH HH HH HHHH HHHH$" + "$HHHHH HH HH HH HHHHHH HHHH$" + "$HH HH HH HHHHHH HHHH$" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH", //======<<< Level 002 >>>====== " SSSSSSS " + " SSSS " + " SSSS " + "H------ H & " + "H #H H@########## " + "H #H H@######### " + "H #H H@@## ## " + "H ## 0 H@@##$ $# " + "H @@##@@@X@### # " + "H @#HHHHHHHHH######### " + "H @#$ $######### " + "H @#X#################$ " + "H 0@@#X###########$$$$$###X " + "H @@@@$$$@$$$@@@@@ $$$ @@$ " + "H $ $ $ 0" + "############################", //======<<< Level 003 >>>====== "S@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "S $ @@@@@ - @ --- @@" + "####H#$ - -0H @ H H@@$$$" + "@@@@H##H@$@H H H H@@###" + "@@@ H$$H@$@H H- -H @@###" + "@@ -@##@@$@ -0 H @ @#X" + "@ - @ @$@H #### - $ " + " - @@@#H@$@$H #H## @ @H " + "$ @ #H@$@H$ $$$$$H$$@@ $H " + "# @ #H@$@$H #H######@@H@ " + " -@ #H@$@H$ $H $ $@@H$ " + "##@ #H@$@$H ######H#@@ @H " + "H@ $#H@$@H$ $ $ H @@ $H " + "H######H@$@$H ##### H @ H@ " + "H H H & H#######H" + "#@#@#@#@#@#@#@#@#@#H$$$$$$X ", //======<<< Level 004 >>>====== "@@@@@@@@@@@@@@@@@@@@@@@@@@@S" + "$ @ 00$ $ & $ $00 @ $ S" + "@H@@@@@@ @@@@@@@@ @@@@@@H@@$" + " H H @$" + "$H $ $ $ $ H$@$" + "######H# ######H# ######H#@$" + "$ H$ $ H$ $ H$@$" + "#H###### #H###### #H######@$" + "$H $ $H $ $H $@$" + "######H# ######H# ######H#@$" + "$ H$ $ H$ $ H$@$" + "#H###### #H###### #H######@$" + "$H $ $H $ $H $@$" + "######H# ######## ######H#@$" + " H H " + "#@#@#@#@#@#@#@#@#@#@#@#@#@#@", //======<<< Level 005 >>>====== " " + "$ 0S0 $" + "#@#@H@#@#@#@#@#@#@#@#@#H#@#@" + " H$ $ $H " + "#######H#######H###########H" + "$ @ $ @H $ @H $ H" + "#@##@##@##@##@##@##H##@##@##" + " $ @ $ @$ H @ $" + "@#@@H@@#@@#@@#@@H@@#@@H@@#@@" + "$ @H @ $ @$@H @H " + "#@#@#@H@#@#@#@H@#@#@H@#@#@#H" + "$ H @ &H @ H@ $ H" + "#########H########H#########" + " H H " + " H H " + "$$$$H##@##@##@##@##@##@H$$$$", //======<<< Level 006 >>>====== " - - - - - " + "H@@0@@@@0@@@@&@@@@0@@@@0@@@H" + "H H" + "H --------------------- H" + "H H" + "H $ H" + "H $ H" + "H ########### H" + "H # # - H" + "H # # $- H" + "H # ---------------### H" + "H ## ########## ####$ H" + "H ### $ ########## $ ##### H" + "H $$$ $$$ H" + "H $ $ H" + "############################", //======<<< Level 007 >>>====== " S " + " S " + " 0 $---------S----------$ 0 " + "H### $$$ S $$$ ###H" + "H $ $###$S$###$ $ H" + "H## $X #$# X$ ##H" + "H $ # X # $ H" + "H## #$ $# ##H" + "H $ #$ $# $ H" + "H### #$ $# ###H" + "H $ #$ $# $ H" + "H#### #$ $# ####H" + "H $ #$# $ H" + "H##### X #####H" + "H0 & 0H" + "############################", //======<<< Level 008 >>>====== " S" + " ------------------------- S" + "H $ $ $ #$" + "H ### - ### - ### - ##" + "H - H - H - H " + "H 0 H 0 H 0 H " + "###### ###### ###### ###H" + "$ H H" + "#### H##########H ####" + "$ ##H -- H HH " + "H## H@$$@ #####H###### H " + "H ######## #####H H " + "H ##$##H & H " + "#######H#########H####### " + " H ---H#$$$$$H## " + "$H###########H$$$H$#######H$", //======<<< Level 009 >>>====== " HH----HHHHH####" + " H##H---H$$ H####" + " H####H HH$H H H" + " H######H HH$H$H" + " H######H HHHHH" + " H#@#@#@H H H H" + " H$@#@#$H H H H" + " H#@#@#@H H$H$H" + "$---------H#@#@#@H HHHHH" + "H$ H$@#@#$H H H H" + "#H$ H#@#@#@H H H H" + "##H$ H#@#@#@H H$H$H" + "###H$ H$####$H HHHHH" + "####H$ H######H H H H" + "#####H$ H@# #@ #@H &H$H$H" + "######H 0H@# #@ #@H0 H######", //======<<< Level 010 >>>====== "#####S######################" + " #S# ------ # ---------- " + "S##S S# ######S# @ $ $ H" + "S ##### # #S# @ ### ### H" + "#S -#S##S S# @ $ $ H" + "####### #S ##### @ ### ### H" + "0 $ ##S $ -@ 0$ $0 H" + "H###### ######## @ ### ### H" + "H--------------------------H" + "H $H $H $H @HHHHHHHHH@ -$ H" + "H H$ H$ H$ @HH@@@@@HH@ $- H" + "H $H $H $H @HHHHHHHHH@ -$ H" + "H H$ H$ H$ $ $- H" + "H $H $H $H @#@#@#@#@ -$ H" + "H H$ H$ H$ &- - - - H" + "###########H$H##H$H##H$H####", //======<<< Level 011 >>>====== "S " + "S " + "S#@@############@H00 $ " + "SX@@ ---------- @##########H" + "S $@ $$$ H@ $ H" + "S#@@ $$$ ##### H@H##########" + "SX@@ $$$ ##$## H@H $ " + "S $@ ##### H@##########H" + "S#@@ H@ $ H" + "SX@@ ---- $ -H@H##########" + "S $@H #@#@# @H $ " + "S#@@H -- @##########H" + "SX@@H@$$@H $$ @ $ H" + "S $@H##### #### @H##########" + "S##@H 00@H $ &" + "S#X H########### H##########", //======<<< Level 012 >>>====== " 00 " + "X##########################H" + "$# - #####################@H" + "$#H#$# - #################@H" + "$#H#$#H#$# - #############@H" + "$#H#$#H#$#H#$# - #########@H" + "$#H#$#H#$#H#$#H#$# - #####@H" + "$#H#$#H#$#H#$#H#$#H#$# - #@H" + "$#H#$#H#$#H#$#H#$#H#$#H#$ @H" + "$#H#$#H#$#H#$#H#$#H#$#H##H@H" + "$#H#$#H#$#H#$#H#$#H# H##H@H" + "$#H#$#H#$#H#$#H# H#### HH@H" + "$#H#$#H#$#H# H####@@@ H@@@H" + "$#H#$#H# H######## H@H @H" + "$#H# H############0$ H#@H" + " H#####################H#&H", //======<<< Level 013 >>>====== " @#0 $ & @ " + "S@ - @####X##X#@ " + "S@###$@H $ @@@@ # @@@@ " + "S@$###@H HXH$- ---------$" + "S@###$@H HXHH - - H" + "S@$###@H H H - - H" + "S@###$@H H- H - - H" + //"S@$###@H-H H - - H" + "S@$###@H-H H -- -- H" + //modified for this platform "S@####@H H - - H" + "S -- H $ ---- $ H" + "H#@#@#@H#$$#H@#@@ -- @@#@H" + "H H@##@H -- H" + "H0 0H H -- H" + "X@@@@@@@ $$ H $ -- $ H" + "X$$$$$$@ H -- H" + "#@#@#@#-----H#### -- H###H", //======<<< Level 014 >>>====== "S " + "S# @@@@@@@@@@@@@@ " + "S# -H @@@@#@#@#@@@$H " + "S# #- H H 0 @@H " + "S# #- H H --H####### @HH " + "S-S#- H@H X#X H- @H " + " #S#- $H X$X H - --H " + " #S$ H@H XXX H - -& # " + " #S# $H - H - - #X" + " @@ H@HX#X H - " + " H@HX$X H - " + " ##X H@HXXX H - " + " $ H@H - H - " + " H@@@X@H@H- H " + " H@@@@@H@H0 H $" + " H H@##############S####", //======<<< Level 015 >>>====== "@ @ SS @ @" + "@ $ $ @ SS @ $ $ @" + "@@@@@XX@@@@@S S@@@@@XX@@@@@" + "H------ -- SS -@ $$$$$$$" + "H $#$ $H $ SS @ H@@@@@@@" + "H#X#X###H $S S @ H$$$$$ " + "H$X#X$ S S @@@@@@@@H " + "H# #X#X @0$ &@ $$$$H " + "H###X#X ####X##### HH@@@@@@" + "H --H -H--------HH ---- $" + "@@@ H - H $$ H @@@" + " -H H- H $$ H H- " + "$H - H H - H$" + "H @@ H H - @@ H" + "H 0 H H 0 H" + "H$###########X############$H", //======<<< Level 016 >>>====== " " + "S -- @ @ - - " + "S# #- H@H@H@HX###########H $" + "S# #- H$H@H$HX H $" + "S#$#- ###@###X##########@H $" + "S###- $ 00X H $" + "S# $ H######XH@@@@@@@@H@H $" + "S# # H $XH@ @H@H $" + "S@X@ ######HXH@#@@@@H@H@H $" + "S @ $ HXH@$ @H@H@H $" + " @@@ H######XH H@H@H $" + " H $X@@@@@@@@@H@H $" + " -----######H H H $" + " $$$$$ HH@@@@@@@@@@@H $" + " HH& 0H " + " ###########HH###########H##", //======<<< Level 017 >>>====== " @@ " + "S $ @X X@ $ S" + "S $ @# 00 #@ $ S" + "S $ @# -------- #@ $ S" + "S $ @# $ H #@ $ S" + "S$ @@###X###X#####HH###@@ $S" + "S@@-------# $ # H#----@@S" + "S# # $$$ @H @ #S" + "S# $ H------@ H@ $ #S" + "S# $$ H HH H $$$#S" + "S#H###########X##########H#S" + "S#H #-------------# H#S" + "S#H # # H#S" + "S#H # # H#S" + "SHH$ H $ & $ H HHS" + "############################", //======<<< Level 018 >>>====== " S S " + " $S S$ " + "H@@@@@@@@ H@HH@H @@@@@@@@H" + "H #H@HH@H# H" + "@@@@@@@@@@@H@HH@H@@@@@@@@@@@" + "$ H@HH@H $" + "############@HH@############" + "- - 0 -HH- 0 - -" + "$H$@#######@$HH$@#######@$H$" + " H @ ### @ HH @ ### @ H " + " H @ ### @ HH @ ### @ H " + " H @###$###@ HH @###$###@ H " + " H @ ### @ HH @ ### @ H " + " H $-H---H-$ HH $-H---H-$ H " + " H # H $ H #&HH # H $ H # H " + "############################", //======<<< Level 019 >>>====== "#$H 0#H###H#$H #H###H#$H 0#" + "###H#$H #H###H#$H #H###H#$" + " $#H###H#$H #H###H#$H #H##" + "H#$H #H###H#$H #H###H#$H " + "H###H#$H #H###H#$H #H###H#" + "H $#H###H#$H #H###H#$H #H#" + "#H#$H #H###H#$H #H###H#$H " + "#H###H#$H #H###H#$H #H###H" + "$H #H###H#$H #H###H#$H #H" + "##H#$H #H###H#$H #H###H#$H" + "$#H###H#$H #H###H#$H #H###" + "X$H #H###H#$H #H###H#$H #" + "###H#$H #H###H#$H #H###H#$" + " $#H###H#$H #H###H#$H #H##" + "H#$H #H###H#$H &#H###H#$H " + "############################", //======<<< Level 020 >>>====== " S 0 " + "-& ---- S-S $SSSSS$" + " #X##X 0#####HS# # S# #H" + " X # #HS# # # #H" + " $$$ X # #HS# # #- #H" + " $$$ X # #HS# # # - #H" + " $$$ X # #HS#$$$# ## -#H" + " $$$ X # #HS##### # # #H" + " $$$ X # #HS##### #-$##H" + " $$$ X # #HS# $ # # -$#H" + " - X # #HS# # # -#H" + "$ X # $$#HS# # # #H" + " X #0$$#HS# # # #H" + " ####X #####HS# # # #H" + " HS H" + "@@#@@#@#HXH##HS######X#####H", //======<<< Level 021 >>>====== "S#00$$$$$$$$$$$$$$$$$$$$$$$#" + "S#########################H#" + "S#$$$$$$$$$$$$$$$$$$$$$$$$H#" + "S#@@@#@#@#@###############H#" + "S#$$$$$$$$$$$$$$$$$$$$$$$$H#" + "S#########################H#" + "S#$$$$$$$$$$$$$$$$$$$$$$$&H#" + "S#H#########################" + "S#H$$$$$$$$$$$$$$$$$$$$$$$$#" + "S#H###########@#@#@#@#@@@@@#" + "S#H$$$$$$$$$$$$$$$$$$$$$$$$#" + "S#H#########################" + "S#H$$$$$$$$$$$$$$$$$$$$$$$$#" + "S#########################H#" + "S000$$$$$$$$$$$$$$$$$$$$$$H#" + "############################", //======<<< Level 022 >>>====== "0 - H--$-- 0------------H" + "SH -H @ - H ----------H" + "HS - @ H - H $ $ $ $ " + "SH - @ H- - H ----------H" + "HS ## - H - -H-H -H" + "SH ## - H - - H-----H H-X" + "HS $$ -H - -H $ $H $H $" + "SH - $ $ $ $ H---H--H-#" + "HS - - H H " + "SH $ -########H##########X--" + "HS - $ H H $ - -" + "SH - $ H H-H ### -- - " + "HS $ H H-H $ $ -- H" + "SH H-H $ ###-- & H" + "HS H $ @@H###" + "####################H H##$", //======<<< Level 023 >>>====== "#######HH----------HH#######" + "######HH - - HH######" + "#####HH #00# HH#####" + "####HH - #### - HH####" + "###HH - ###### - HH###" + "##HH----- ######## -----HH##" + "#HH - ####$$#### - HH#" + "HH ############ HH" + "#HH - ####$$#### - HH#" + "##HH - ######## - HH##" + "###HH - ###### - HH###" + "####HH - #### - HH####" + "#####HH - - HH#####" + "######HH HH######" + "#######HH0 & 0HH#######" + "############################", //======<<< Level 024 >>>====== " HHH#-----------------" + " H$$$#SS SS H 0" + " H #S S S H @" + " H #SS S S @H@$ @" + " H $#S S SSS @H@XXXXX@" + " H $# SS $$$$@H@ $ @" + " H ###H ####@H@XXXXX@" + "H ###H ##& @H@ $ @" + "H # $ H ####@H@XXXXX@" + "HH # # H ##$@H@ $ @" + " H # #H ## $@H@XXXXX@" + " H # #H ## $@H@ $@" + " HH $# #H ## $@H@XXXXX@" + " 0H #H##$$$$$@H@ @" + "####################H#####X#" + "#$ $H$ $@", //======<<< Level 025 >>>====== "& $ $ ------H S" + "@@@@@@@ #######H$$# H S" + " ----- H # H@@@@@@" + " - #H$$ $ $H$$# H " + "-$ $#### ######### #######H" + "-##### $$ $--------H H" + "-----# #####$ $ $$$H H" + " 0 # ######## H--H $ # H" + "X#####$ $ #H--H ########H" + " ########$ #H H" + "######### $$#H# $ $ H" + "$ $ ## H# H#H##### #####H" + "######X## H#$H#H 0 H" + " $ $## H#############H H" + "X#######H$H##$#$ $#H H" + " $ $H##@#@#@#@#@#@#@#@#@", //======<<< Level 026 >>>====== " H" + " 0 H" + " H#X#H &H##############" + " H H $H " + " H H $H $ $ $ $ " + " H H $H $ $ $ $ $ " + " H$$ ###H $H $ $ $ $ " + " X##X 0 H $H " + " H$$H H $H##########X#H " + " H@@H H $H 0 H " + " H$$H H $H H " + " H@@H H $H H " + " H $H H " + " - H- $H H " + " # H###H H$H $-H " + "$#H##H$$#H X#XS # H ", //======<<< Level 027 >>>====== " - 0--------------H " + " @@## H " + " H " + " H--- H H " + " S $ ---H- H " + "#X H ##@@@ H @##H " + " H S $- H H " + " S H $ - H H " + " $ S $ ---HH H H " + " H $ H $ H$ H " + " H $ H S H$ H " + "@##@S#$ $ H H$ H " + "## S &---$-H H$ H " + " @ X@H H$ H " + "------ $ H $H$ H " + " H#@#@X#@@ H ", //======<<< Level 028 >>>====== " 0 &" + "S@@@@@@@ @@@@@@ @@@@@@ @@" + "S@ $ -- " + "S@ @@@@H --@###H##H##H##H##H" + "S@$ H- @0 H $H $H $H $H" + "S@@ -- @###H########H##H" + "S -- @0 H $ $ $H $H" + "S-- @H##############H" + "S$@H#$ $# H $ ###### H" + "@H@H## ## ######H ##### HH" + "HX@H###X### $ H #### HH#" + "XH@H## ## H###### $$# HH##" + "HX@H# # H ## HH###" + "XH@H#X###X########### HH####" + "HX@H HH#####" + "XH H##############H$HH######", //======<<< Level 029 >>>====== " " + " 0 ###H " + " $#######H " + " $## ###H " + " ## ######H " + " ## #####HH " + " ## H " + " ## 0H " + " ## #####H " + " ## ######H " + " ##$ $### H " + " ####### H " + " #### H " + " H " + "& H 0" + "############################", //======<<< Level 030 >>>====== " $ H#H $ H#H $ H#H $ H#H $ H" + "#H## ##H## ##H## ##H## ##H##" + " H # # H # # H # # H # # H #" + "H#H $ H#H $ H#H $ H#H $ H#H$" + "# ##H## ##H##&##H## ##H## ##" + "# # H # # H # # H # # H # # " + " $ H#H $ H#H $ H#H $ H#H $ H" + "#H## ##H## ##H## ##H## ##H##" + " H # # H # # H # # H # # H #" + "H#H $ H#H $ H#H $ H#H $ H#H$" + "# ##H## ##H## ##H## ##H## ##" + "# # H # # H # # H # # H # # " + "0$ H#H $ H#H $ H#H $ H#H $0H" + "#H## ##H## ##H## ##H## ##H##" + " H # # H # # H # # H # # H #" + "H#H $ H#H $ H#H $ H#H $ H#H$", //======<<< Level 031 >>>====== "00 & 00---------------" + "H###########H $" + "H#$ $#H$###########H#H" + "H###########H@@@@@@@@@@@@XHX" + "H-----------H $# $ # $ #HX$" + "HXXXXXXXXXXXH#H#H#HH#H#H#X#H" + "H H#H$H#HH$H#H H" + "H#####H#####H#####H##H##H#H#" + "H @H@H@H$ @H H$#H H#H$" + "H@H@H@H$H@H@H##H##########H#" + "H@H$H@H@H@H$H H $# H " + "H@H@H$H@H@H@H######H######H#" + "H$H@H@H@H@H@H # H $#$ H " + "H@H@H@H@H@H@H###H#########H#" + "H$H H H H H$H H H " + "H#H#H#H#H#H#H@#@#@#@#@#@#@#@", //======<<< Level 032 >>>====== " S 0 0" + " S $ $$$---" + "SSSSSSS ####H@ - H@ -H@@@@@ " + "S S H@@H@@@@X@@@@---" + "#H###H##H H#H H$ $ $ @ @@" + "0 H #########H-#H-#H@--@" + "##H H## ------H$$ 0" + " H-H H@#@#@#@#@ ####H" + "##@ @##H $&$ ####H####H" + "##@ @##H@#@#@H@#@# ---H H" + "$$@ @$$H H H ####H#" + "#######HH#########H#$ H " + "--- HH --- H # H####" + " H########H ###H # H 0" + " H $$ H $###H ###H#$" + "$ H########H #####H $ H#$", //======<<< Level 033 >>>====== " SS " + " -- SS " + " H - @@SS@@ " + " H # SS # -H-" + " H ######## - - H " + " H $ ###@@### H - $ H " + " H $ #@#@@#@# H - H " + " H # $@@$ # H - H " + " H #@####@# H -H $" + " H H 0" + " H ------ H H##" + " H H@ @H H H##@" + " H $ H@@@@@@H H H## $" + " H H H H#######" + "0H 0H$ & $H0 H $" + "############################", //======<<< Level 034 >>>====== " S " + "@$ 0 S " + "@#@@@@@@@@@@@@@@H-- S " + " $@ H -- S " + " @@@@@@@@@@@@#@ H -- S " + "H @$ H -- S " + "H @#@@@@@@@@@@ H -S$" + "H $@ H H @#" + "H @@@@@@@@#@ H H H@ " + "H H @$ H H H@ $" + "H H @#@@@@@@ H H H@ #@" + "H H $@ H H H H@ ##@" + "H H @@@@#@ H H H H@@@# @" + "H H H @$ H H H H@@@@#@@" + "H H H @#@@ H H H H 0 $" + "#####H0 &H#################", //======<<< Level 035 >>>====== "0##########################0" + "S#H---HHH---H H---HHH---H#S" + "S#H HH HH##HH HH H#S" + "S#HH HH H##H HH HH#S" + "S#H HHH H##H HHH H#S" + "S#H H HH##HH H H#S" + "S#H H HH H##H HH H H#S" + "S#H#H####H###$$###H####H#H#S" + "S#H#H####H###$$###H####H#H#S" + "S H H----HH0H##H0HH----H H S" + "S#H H HH##HH H H#S" + "S#H HHH H##H HHH H#S" + "S#HH HH H##H HH HH#S" + "S#H HH HH##HH HH H#S" + "S#$ HHH H &H HHH $#S" + "S##########################S", //======<<< Level 036 >>>====== "##########S#################" + "#HH$HHH$HHHHH$HHH$HH#@$HH$@#" + "#HHHHHHHHHHHHHHHHHHH#H@HH@H#" + "#H###H###HXH###H###H#HHHHHH#" + "#H0H-H--#HXH#H-H--0H#H@HH@H#" + "##XHX#XH#HXH#HX#XHX##@HHHH@#" + "#H H---HH$X$HHH--H H#HH$$HH#" + "#H##XXH##X#X##HXX##H#HHX#HH#" + "#H----H#$ $#H----H#H##$#H#" + "#HXXXXH###X###HXXXXH#HH#XHH#" + "#H# --H-------H-- #H#HH$$HH#" + "#H#H##H##XXX##H##H#H#@HHHH@#" + "#H H--H---X---H--H H#H@HH@H#" + "#H#H#H##XH#HX##H#H#H#HHHHHH#" + "#H H#H H&H$ H#H H H@HH@H#" + "#####################@$HH$@#", //======<<< Level 037 >>>====== "H & #" + "H#########################$#" + "H## ## ## ## ## ## ## ## ## " + "H ## ## ## ## ## ## ## ## # " + "H# ## ## ## ## ## ## ## ##$0" + "H## ## ## ## ## ## ## ## ##$" + "H ## ## ## ## ## ## ## ## # " + "H# ## ## ## ## ## ## ## ##$ " + "H## ## ## ## ## ## ## ## ## " + "H ## ## ## ## ## ## ## ## # " + "H# ## ## ## ## ## ## ## ##$0" + "H## ## ## ## ## ## ## ## ##$" + "H$##$##$##$##$##$##$##$##$# " + "H# ## ## ## ## ## ## ## ## " + "H " + "H###########################", //======<<< Level 038 >>>====== "----------------------------" + "H $ $$ $ $$ $ $$" + "H ####### ####### ####### " + "H ####### #######$ #######$" + "H ## ## ## ## " + "H ## ##$ ## ## " + "H0## ## 0 ##$ $" + "H ## $ $ ## ####### " + "H ## ### ## ####### " + "H ## ### ## ## " + "H ## ## ## ## " + "H ##$ $## ##$ $ $## " + "H ####### #######$ ####### " + "H #######$ ####### #######$" + "H & 0" + "H###########################", //======<<< Level 039 >>>====== " S " + "0 0 $#$ $#$S0" + "#########H###H##H###H######H" + "#########H# H #H H # H" + "# #######H$#### #H###$######" + "# #$$####H## #$ H $" + "$ #######H### ####H########" + "#########H#--- H $" + " H H######## @@@@@" + "#########@H H######### -- $" + "H####$ ##@H H & HH# HHH" + "H######$ @@@@#####H#XHH# H$" + "H $###$ @@@@@H#X#HH# HH" + "H##########H#$# H#X##HH#$H" + "H $ 0# H###H@ H#X###HH# " + "######### H$ H@@H $HH$", //======<<< Level 040 >>>====== " " + " S S " + " H#-HXS@@@@H@##@H@@@@SXH-#H " + " H S H H S H " + " H ### H H ### H " + "H-- $ $ -H 00 H- $ $ --H" + "H #X# ### ###### ### #X# H" + "H # H 00 H # H" + "H #$ $H#H--##--H#H$ $# H" + " H # H#H ## H#H # H " + " H #H ##$$## H# H " + " H $#H$---##$$##---$H#$ H " + "H - # H#H ## H#H # - H" + "H# # H#H ## H#H # #H" + "H H-- &--H H" + "H H####### ###### #######H H", //======<<< Level 041 >>>====== " SS " + " 0 0 SS 0 0 " + "$ H###H $ SS $ H###H $" + "@### ###@H########H@### ###@" + "@#$###$#@H # # H@#$###$#@" + "@### ###@##H#$$#H##@### ###@" + "@ ### @ H ## H @ ### @" + "@### ###@H########H@### ###@" + "@#$###$#@H H@#$###$#@" + "@### ###@H & H@### ###@" + "@ ### @####HH####@ ### @" + "@### ###@$ HH $@### ###@" + "@#$###$#@@@@H@@H@@@@#$###$#@" + "@### ###@ H H @### ###@" + "@#@#@#@#@H@ H H @H@#@#@#@#@" + " $ H########H $ ", //======<<< Level 042 >>>====== "# ##########################" + "#S-------------------------#" + "#H######################## #" + "#H# ---------------------# #" + "#H##H################### # #" + "#H##H#-----------------# # #" + "#H##H#H############### # # #" + "#H##H#H# # # # #" + "#H##H#H#H@$ 0 $# # # #" + "#H##H#H#H############# # # #" + "#H##H#H#H0 $# # #" + "#H##H#H################# # #" + "#H##H#H0 $# #" + "#H##H##################### #" + "#H##H0 $#" + "#H&#########################", //======<<< Level 043 >>>====== "# SS #" + "#------------SS------------#" + "## HH ##" + "#@# ---------HH--------- #@#" + "#$ # HH # $#" + "#@@@# -------HH------- #@@@#" + "#$ # HH # $#" + "#@@@@@# -----HH----- #@@@@@#" + "#$ # HH # $#" + "#@@@@@@@# ---HH--- #@@@@@@@#" + "#$ # HH # $#" + "#@@@@@@@@@# -HH- #@@@@@@@@@#" + "#$ # HH # $#" + "#@@@@@@@@@@@#HH#@@@@@@@@@@@#" + "#$& HH 0$#" + "############################", //======<<< Level 044 >>>====== "S& 0S" + "S S" + "H--------------------------H" + " H H " + " #H @$$@ @$$@ H# " + " # H #### #### H # " + " # #H @$ $@ H# # " + " # #$H @ ##### @ H$# # " + " # # H @ @ H # # " + " #$@@@ H @$ $@ H @@@$# " + " # # H ######## H # # " + "$@@@@@@@ H H @@@@@@@$" + " # H H # " + "@@@@@@@@@@@H H@@@@@@@@@@@" + "$0 H H 0$" + "#############HH#############", //======<<< Level 045 >>>====== "H-------------------------HS" + "H& HS" + "H@##$##@##$##@##$##@##$##@HS" + "H#@#####$#####$#####$##@##HS" + "H 0HS" + "###########################S" + " 0#S" + "H##########################S" + "H####$################$####S" + "H 0H#S" + "#########################H#S" + "#####$################$##H#S" + "H 0H#S" + "H##########################S" + "H####$################$####S" + "H S", //======<<< Level 046 >>>====== " " + " 0 & S" + "H#@#@#@H@@#X@@@H # H@ @S" + "H$ X $#H@$ X $@H # H@#####@S" + "@#@@@#@H@#@@@#@H # H@###$#@S" + " H-- --H # H@#####@S" + "##H#####H#####H### H@@#@@@@S" + "##H H- HHH H@@ @@S" + "##H-----H -HHH#HHH@@@@@@#@@S" + "##H@$ $@H- HXXHXXH@ S" + "$#HH###HH -H H H@@@@@@@@@ " + "###H###H - H#H H#H #- " + " H H - H H0#######H###" + "####H#######H# 0#@ H " + "$ H H ##@H@@@@@@X@@" + "#################@H$ $X ", //======<<< Level 047 >>>====== " 0 &" + "SSSSSSSSSSSSSSSSSSSSSSSSSSSS" + "$H H H H H H H H HHHH@@@##@@" + "# # # # # # # # # H#$ ## $" + "$ X X X X X H###$@####@" + "@#@#@# - H $#H#@##@#" + " #@#@#@ H@@@ @@#H## " + "H##### H -@ -H-#@@@#" + "H $ H####H @ @ $ H " + "######H----H 0@ @H#XXH######" + "@@@@@@@ #H@@ @H $ H " + "HHHHHH$#### H@ $ @#########H" + "H#X#X##0 H@###@ H" + "H ####H##@###@H#########" + "H H H $" + "##################H#H H#H H#", //======<<< Level 048 >>>====== " S H- 0H- 0 $ S" + " S H - H - H#############" + " S H -H -H ------------" + " H##### ## ## ###########H" + " H $@ $$ $@ --H" + " H @@###### @@-------- H" + "H####### $ $ #$ # $ 0 H" + "H####### ####### #### ###H" + "H@@#@@@@ H" + "H##$## #H#######@##@H # H" + "H##X#####H#######@@# ####H##" + "H## ##$##H#######@@#$ ###H##" + "H --- H#######$@## H $" + "H $$$ H####$$$###@##H######" + "H& H 0 H --##" + "######################H$#H$$", //======<<< Level 049 >>>====== "@@S " + "@@S00 $ $ $ $ 0" + "@@@#@#@#@#@#@#@#@#@#@S@@@@@@" + "----------H@ S " + "@ $$$$ H@ $S$ & $" + "@@ H@@@@H#####@@@S######" + "$@@ H H##### S " + "H @@ H H@$@$@ S " + "H H H@@@@X#X@H@@S#####H" + "H#### H H $ S#####H" + "H H H $ H@@@@ S#####H" + "H ### H HH@@@ H S###$#H" + "H $#$ H HH H $ S$$###H" + "##### H @@@@@@@@@@ S H" + " H S ##H" + " $ $H###################H H", //======<<< Level 050 >>>====== "S@ 0 " + "S### 0 " + "S $@@@ $ " + "H@# $### $ @@" + "H@### $@@@ $ 0 ###-" + "H@##### $### $ 0 @@@---" + "H@####### $@@@ $ ###---H-" + "H@# $ ##@@# $ @@@---- H-" + "H@######@@@ $ ###---@ $@H-" + "H---- $ @@@---- @##@H-" + " H $ ###$---- H-" + "H####### @@@@@#### H-" + "H & H-" + "H##########################H" + "H $@@$ H" + "############H0 H############", //======<<< Level 051 >>>====== "-------S####################" + "H######S# ------------------" + "H# $#S# #################H" + "H#H####S# #-------------- #H" + "H#H S# #H############# #H" + "H######## #H#-----$0 #H" + "H-------# #H#$ $#########H" + "H######H# #H##### #$#---- #H" + "H# #H# #H----# #H#H### #H" + "H# ##H#H# #H###H# #H#H#$# #H" + "H# $#H#H# #H $#H# #H#H#H# #H" + "H####H#H# #####H# #H#H#H# #H" + "H----H#H# H# #H#H#H H" + "H######H######### #H#H######" + "H $$#H0 H#H &" + "############################", //======<<< Level 052 >>>====== "H------------ & -----------H" + "H####### -- 0###0 -- ######H" + "H $ - ####### - $ H" + "H##### - ###$ $### - ####H" + "H $ - ###$ $### - $ H" + "H### - ###$ $### - ##H" + "H $ -###$ ### $###- $H" + "H## ### ##### ### #H" + "H $ ### #$# ### $ H" + "H#### ---### ###--- ###H" + "H $ ###$ $### $ H" + "H###### ### ### #####H" + "H $ $ #### #### $ $ H" + "H### ##### ##### ##H" + "H 0 H" + "############################", //======<<< Level 053 >>>====== " H& -S" + " H@---------HHH---------@-S" + " H@0 H 0 S" + "H@ H @ $ S" + "H@@#@ $ $#H#$ $ @@# S" + "HH $@ ### @XHX@ ### S" + " HH@ $####@ $ @####$ @SS" + " H@ ## ##$ @ $## ## @SS " + " H ## ## @ ## ## SS $" + " HH@H ##$## ##$## SSS@ H" + " H@ H ## #X X# ##SS$@ H" + " @ $H @@##X@X##@@ S @ $H" + " @@@@H @@X#X@X#X@@ S@@@@H" + "----@H----------------H-- @H" + " @ H $ $ $ $ H H" + " H 0 0 0 H##H H", //======<<< Level 054 >>>====== " 0 S 0" + " --H S 0 " + "######H S " + "##########H- -HH- -H" + "#########@H - - HH - - H" + "#########@H - - HH - - H" + "##$ # $ @H - $ HH $ - H" + "#########@H $ - HH - $ H" + "#########@H- $ - HH - $ -H" + "### $ #@H - $ -HH- $ - H" + "#########@H - $ -- $ - H" + "#########@H - -- - H" + "#$ # $@H - - - - H" + "#########@H - $$ - H" + "& ## H H" + "###H $H#####################", //======<<< Level 055 >>>====== " 0 #S###########" + " ----H #SS####SSSSS#" + "# # H ##SSS##S###S#" + "######### H ##SSSS###S#" + " $@ --H# $S#" + "######### -- H@@@@@@@@@@@@@" + " $@ -- H 0" + "#########-- H-------H#####" + " $@-- H $ HH####" + "#######-- H HHH##$" + " -- H H######HHH##" + " -- ##H##$####HHH#" + " -- ##H########HHH" + " $ ##H#########HH" + "& H 0H" + "############################", //======<<< Level 056 >>>====== " & S " + "H#######H- H## S#" + "H $###$ H - H$ # S#" + "H ##### H - $#H H ##S#" + "H#######H#$ - ##H$H #S$#" + "H $###$ H## $###HH #S##" + "H ##### H ## #### H$ #$S#" + "H#######H ##$##### H ##S#" + "H$ #####H ####### $H #SS#" + "H #####$H###@###### H #S##" + "H#######H@#$@###### H #SS#" + "H$ #####H@##@###### H ##S#" + "H ####$#H H$ #SS#" + "H#######H ---- H #S##" + "H$ #####H@ @H H H#SS#" + "H0######H0####0H####H H0S##", //======<<< Level 057 >>>====== "@S@@H H@@S@" + "@S@@ H H @@S@" + "SSSSS S HH##$##HH SSSSS" + "S0@@ S H HH0#0HH H S@@0S" + "@@@@ S H $#$ H S@@@@" + " SSS H H#H H SS " + " S H H###H H S " + " S SSSH----- -###- ---H SS " + " S H $$ ####### H S " + "--S---H###############H@@-S-" + "---S--H#####$ ### $###H " + "----S-H###############H " + " S H - - H " + " S H H " + " S H & H " + "######H###############H#####", //======<<< Level 058 >>>====== "@0 $ @ @" + "@@@@@@@@@@@@@@@@@@@ @@@@H@@" + " H H H H H H @ H " + " H-H- H H -H H ----- H " + " H H -H -H - HH H@ $@ H " + " H H H - H- HH @@ --- S " + " H-H H- H$0 HH # @ HH " + " H H H #### H H $ -HH@@H0" + " H H H H H @ @ H H##" + " H-H H$ ####@H@# ##H " + "#H H #### HHH H##" + "#H H H-H- H " + "#H H H H #######S##" + "#H&H-------- H#@# @SSSSSS@" + "#@#@S S##@ @ @SSSSSS@" + "##@ S######S$@ @ @SSS0SS@", //======<<< Level 059 >>>====== " ## HHH0---------" + " $ ## H$H$H " + " H# -HHHHHH #######" + "H#$#H HHH-- HHHHH ##### #" + "H X HHHH H HHH$H #$### #" + "H H HHHH H HHHHH #### #" + "H HHH$H H$HHH ## # ##" + "H HHHHH HHHH ## ##" + "H $ $HHHHHHHHHHH ## ###" + "H HHHHHH$HH$HH ## ####" + "H HHHHHHHHHH ## ###" + "H HHHHHHHH&HHH #### ##" + "H H HHHHHHHHHH 0 ####$ #" + "H H$HH-H----HHHH # #######" + "H HH$H " + "############### HHH#########", //======<<< Level 060 >>>====== "0 $ ### " + "####################### ###S" + " SS #S" + "##HH##HHH####HHH#### HH #H#S" + "##HH#HHH## #HHHHH##H HH H#S" + "$#HH#HHH####HHHHH##H HH H##S" + "###H#HH## $#HHHH##H HHHHH#S" + "##HH#HH######HHHH##H HH #H#S" + "##HH#H##HHHHH#HHH##HSS& #H#S" + "##HH#H###HHHH##H####SHH #H#S" + " H0H S S H SS #H#S" + "###########0S############H#S" + "@ @@ $ H#S" + "@S@@@@@@@#S H#############S" + "@S @@@@@@@@@@@@@@@@@@S" + "@@S0S###S S", //======<<< Level 061 >>>====== "S@@@@@@@@@@@@@@@@@@@@@@@@000" + "S@ -----------H--------@@$" + "S@ #H -- H - H " + "S@ #H - H - H$" + "S@ #H - H - -- H " + "S@ #H -- H - H$" + "S@ #H ### - H -- - H " + "S@ #H ### -####### - H$" + "S@ #H ### -- $ $ - " + "S@ #H ### -# - - H$" + "S@ #H ### -- #H##### - - H " + "S@ #H ### H - H " + "S@ #H ### -- H - - H " + "S@ #H $ - H - - H " + "S$ #H & -- H - -H " + "############################", //======<<< Level 062 >>>====== " S& S " + " S@@S " + " S@@S " + " HH##HH " + " H ## H " + " H# #H SS " + " H##$$##H SS " + " H@@@ @@@H S " + " HH######HHSSSSSSSSS " + " H## ##H S @S00" + " H#0$ $0#H S @@@@" + " H@@@##HH##@@@H " + " HH####HH####HH " + " H### HH ###H " + " H HH H $0 " + "#####H#####HH#####H##### ###", //======<<< Level 063 >>>====== "@@@@@@@@@@@@@@@@@@@@@@@@@@&@" + "- -H----HH- -HH - HH- -HH@H@" + " #-H HH # HH# #HH # HH@H@" + "##-H####HH## HH#$#HH## HH@H@" + " #-H 0 HH # HH # HH # HH@H@" + "$# H####HH # HH# #HH # HH@H@" + "###H HH###HH# #HH###HH@H@" + " H HH HH HH HH@H@" + "###H####HH###HH###HH###HH@H@" + " H HH HH HH HH@H@" + "## H HH # HH# #HH## HH@H@" + "- #H####HH## HH#$#HH #HH@H@" + "$# H 0 HH # HH # HH # HH@H@" + "# H####HH # HH# #HH# HH@H@" + "###H HH###HH# #HH###HH H@" + " HHHHHHHHHHHHHHHHHHHHHH#@@", //======<<< Level 064 >>>====== "H--------------------------H" + "H0 0 @H" + "H@H----------------------H0H" + "H H# H#H" + "H#H H------------------H#H H" + "H$H@H @H$H@H" + "H@H H@H--------------H H@H H" + "H H#H H# H#H H#H" + "H#H H#H H----------H#H H#H H" + "H H@H H@H @H H@H H@H" + "H@H$H@H H@H------H H@H$H@H H" + "H H#H H#H H# H#H H#H H#H" + "H#H H#H H#H H--H#H H#H H#H H" + "H$H@H H@H H@H @H H@H H@H H@H" + "H@H H@H H@H H@&H@H H@H H@H$H" + "############################", //======<<< Level 065 >>>====== " H## H " + " H###H H#H " + " H ##H## ##H " + " H### H #HHHHH#H " + " HH# ## H#H SH#H " + " H## ## H#$H SHH#H " + " HH#HHH #####H### SSH#HS " + " H0-0H HH######HHH SH0H0H " + " H---H HHH####H SH-H-H " + " ----- HHH#H#H S--H-SS " + " ----- H &#H# H S--H--S " + " - - - H######H S--H--S " + " $ $ $ H######H S- H -S " + " H## ###H S$ H $S " + " H##$###H S H S " + "##########H H H#########", //======<<< Level 066 >>>====== "S ### ####H0 0H####" + "S ####### ####H$ $H####" + "S######### $H##H H##H##" + "S###HHH####H##H##H$ $H##H##" + "S#HHH HHH##H##HH0#H H##HH##" + "SHH HH#H##HH##H H##HH##" + "H H H##H##HHH##HH##HHH##" + "H H #### ##H H##HH##H H##" + "H H### ##H HH#HH##H H##" + "HH HH### ##H H#HH#H H##" + "# H HHH##H##H HHHHHH H##" + "##H H0H H##H##H HHHH H##" + "####HHH#H## ##H HHHH H##" + " ###-$ #H# ##H H##" + " ######H ##H H##" + " ### & H##########H##", //======<<< Level 067 >>>====== "##############S#############" + "# H0H H H H H H H H H H H0H#" + "# H#H#H#H#H#H#############H#" + "# H$H H H H H H H H H H$H#H#" + "# H ##########H#H#H#H#H#H#H#" + "# H #$H H H H H H H H$H#H#H#" + "# H # H#H#H#H#########H#H#H#" + "# H # H-H-H-H-H H H H#H#H#H#" + "# H # H H H H&H H H H#H#H#H#" + "# H # H#######H#H#H#H#H#H#H#" + "# H #$H H H H H H H H$H#H#H#" + "# H ####H#H#H###########H#H#" + "# H$H H H H H H H H H H$H#H#" + "# H#H#H#######H#H#H#H#H#H#H#" + "# H0H H H H H H H H H H H0H#" + "############################", //======<<< Level 068 >>>====== "@#############S############@" + "@H$ $ S $ $H@" + "@H@######################@H@" + "@H@H & H@H@" + "@H@H@#########H########@H@H@" + "@H@H@H H H@H@H@" + "@H@H@H@##############@H@H@H@" + "@H@H@H@--------------@H@H@H@" + "@H@H@H@$ $ H $ $@H@H@H@" + "@H@H@H@##X####H##X###@H@H@H@" + "@H@H@H0 H 0 H@H@H@" + "@H@H@#######X###X######@H@H@" + "@H@H H H@H@" + "@H@#####X#####H#####X####@H@" + "@H$ $ H $ $H@" + "@##########################@", //======<<< Level 069 >>>====== " S" + " S" + " &S" + " #####S##H## ##H####S######H" + " H ### H H" + " H 0 H H" + " H $#$ H H" + "H##########################X" + "H " + "H #H " + "H###########X##############H" + "S H" + "H############ ## H" + "H $ ###$#H#####0####H" + "H 0 # #### H $ H" + "############################", //======<<< Level 070 >>>====== "H------& " + "H " + "H " + "H " + "H ##@@@#########@@@## " + "H #####@@@#########@@@##### " + "H@####@ --------- @####@" + "H@$###@ @ $ $ $ $ $ @ @@##$@" + "H @#@@ @@0 @@ @@#@ " + "H 0@@#########@@ # " + "H @@@@@ $$$ @@@@@ #" + "H @@@@@ $@@@$ @@@@@ #" + "H @@@@@@ $@@@$ @@@@@@$## " + "H @@@@@@@ $$$ @@@@@@@## " + "H @@@@@@@@@#@@@@@@@@@ " + "####H H###", //======<<< Level 071 >>>====== " & S " + " #@$ S " + " $ ---- @@@ S " + "H########## H #@# S " + "H0 H $ S " + "##########H H $######### S " + " H H $## #######S " + "H########## H ## #### ##$" + "H H #### ##" + "##########H H ##$# ##" + " H H ------- ##" + "H########## H ## ##H # " + "H H $## $## H " + "##########H H ## ## H " + "$ H H # ## H " + "##########H H ## H 0", //======<<< Level 072 >>>====== " @ - 0S " + "0 $ $ @ --- S $ $ 0" + "@@@@@@ $ $ S-----S @@@@@@@" + " @@@@@@ S $ $ @ -H " + " -H -H@ $S @@@@@@ -- H " + " - H - H@@@S$ @ -----$ H " + "### H- H S@@@ @$ @$###H " + "### @ H S @##@ H " + "#$#$$ $$ H $S H " + "#X# H@@@S H#######H" + " H S H $ H" + " H $S H$ ####H" + "H############S####### " + "H S " + "H& S #H " + "########################@$H#", //======<<< Level 073 >>>====== "H-- H-------&--------H- " + "H ### --- # --- H - " + "H $ ##$ -###- $## H - $" + "###H #### ### #### H @@" + " H $###########$ HH - " + " $ H ####$#### H@H -$" + "H### # $X$ # H@@@@@" + "H ###$### H -H " + "H $ #### #### H- H " + "###H $### ###$ ### H " + " H ### ### H " + " $ H ## ## ##HH " + "H### $ 0 0 $ H " + "H H###H H###H H " + "H H H$ $H H H# $" + "########################H @@", //======<<< Level 074 >>>====== "0 H- S " + " ---- & H # S " + " H#####H ### S " + " #H####@H###$# S --S" + " ## ##H####@HH##### $S- S" + " #$ ###H####@ H####### S" + " ##$###H###$@H######## S" + " #X###H####@H###### @H@S" + " ###H####@H$#### @@@H@S" + " #$H####@H@ @ H@S" + " @@H HH@ @H@@@@S" + " --- @@@H H@@ @H @ S" + "# H@@ H H@@ @@@H@ S" + " # H @@HH HH@@ H@$S" + "$ # H @@H H@@@ H@@@@@@" + " #H HH H H 0", //======<<< Level 075 >>>====== " S S " + " --- --H-- &--H-- --- " + " H - ## S- ## -S ## - H " + " $H $#### S #### S ####$ H$ " + " H ######S######S###### H " + " H ######S######S###### H " + " H #####X######X##### H " + " H ###$X##$$##X$### H " + " H H " + " H ############ H " + " H ######## H " + " H $$ H " + " H ###### H " + " H ## H " + " H $$ H " + "0$H######################H$0", //======<<< Level 076 >>>====== " @ H " + " @ H " + "####H @0 $ HSSS----S$ 0" + "####H @@@@@$ $ -- S@@@@@" + "$###H--- @@@@@$ $ S " + "#### H - @@@@$ $S " + " H - H - @@@@S $" + " H- H - H S H###" + " H# H- H S H " + "H####$ $$$$$$$H S H - " + "H H S H- H" + "#####H H##H##S $ H" + "#####H H $ H" + "#####H H############# #####" + "#####H H $" + "$####H& H###################", //======<<< Level 077 >>>====== "S 0 " + "S---------------------------" + "SSSSSSSSSSSSSSSS & H" + "#####X $ $ S @@@@@@H" + "#####X ####S @@@@@@H" + "###$#X $ SSSSSS H###### H" + "## SSSSS##S $H###### H" + "# S $ SSSS H###### H" + " S### H###### H" + " $ S H###### H" + "###SS $H###### H" + " S H###### H" + " S H###### H" + " H####### H" + " $ H#######$$ H" + "############################", //======<<< Level 078 >>>====== "@@@@@@@@@@@S@@@@@@@@@@@@@@@@" + "H-- - S ----H -H" + "H$$@##@$############ 0H H" + "H @##@ ####$#####$# H H" + "H @ @ ### $ $ H H" + "H 0@##@ ### H H" + "H @ @ $### - H H" + "H @##@ #$# --- H H" + "H @ @ #$# ----- H H" + "H @##@ $##X --- H H" + "H @$ @ ### - H H" + "H @##@ 0### ## H" + "H ####$#####$# $ $ H" + "H ############ H" + "H & H" + "############################", //======<<< Level 079 >>>====== "0S 0 0 " + " S ---- - 0$" + "#@# H - H##########" + " @$@ - H - H &" + " @ # H - H @@@@@" + "$@@@@@ H -$ H $" + " #H #- H H####" + "@@@@@@@H - H H " + " H -- -H ####H" + "H@##### H@$$@H H" + "H@##### H@##@H ##### H####" + "H@##### H H ##### H " + "H@##### H H #$### ####H" + "H@####$ H H ##### $H" + "H H H H" + "############################", //======<<< Level 080 >>>====== " 00 " + "H############SS############H" + "H# $# # # ## # # #$ #H" + "H# # $# #$ $# #$ # #H" + "H#### # $#@ @#$ # ####H" + "H# # #$ $# # #H" + "H####### #@@ @@# #######H" + "H# # # #H" + "H@@@@@@@@@@@@$$@@@@@@@@@@@@H" + "H - # #H @ H" + "H###SS@ X#### #H# $#H#$#@@H" + "H@@@@#@$X # #H#@@#H @@@@H" + "H H#$# #H H H" + "H###X#####@@# ############H" + "H& 00H" + "H############SS#############", //======<<< Level 081 >>>====== " S " + " @@@@@@@@@S@@@@@@@@@@@@@@@H" + " 0# $ $ $ #S# #$HHHHH$@$H" + " &# H H H #S#H#H##HHHHHHH@@H" + "$0# ##H## #S#H#H##$HHHHH$@$H" + "# H H H# $ H@@H" + " ########XS###X#########@$H" + " $@S@ X @ #######@@H" + " @@@@@@@@@S@ @ @ ####### H" + " $ S@ @ @$####### H" + "SS@@@@@@@@@@@ @ @@####$## H" + "S $ @ ####### H" + "S @@@@@@@@@@@@@ $ H" + "S $ @ # #########H" + "S #H@@@@@@@@@@@ @@@@@@@@@@@H" + "S$#H H", //======<<< Level 082 >>>====== " " + "H#$# #$#H" + "H####$# #$####H" + "H ####$# -- #$#### H" + "H ####$# #$#### H" + "H#$# ### ### #$#H" + "H####$# #HH# #$####H" + "H ####$# HH #$#### H" + "H ####$#HH#$#### H" + "H#$# ###HH### #$#H" + "H####$# #HH# #$####H" + "H ####$# HH #$#### H" + "H ####$# #$#### H" + "H ### ### H" + "H& 00000H" + "############################", //======<<< Level 083 >>>====== "S -- S" + "SH- H##H # #######HS" + "SH - H##H # #$ #HS" + "SH - & - H##H # ##### #HS" + "SH H###H - H##H # #HS" + "SH H#$#H -H##H #########HS" + "SH H#$#H 0##0 HS" + "S##########################S" + "S##########################S" + "S# -0##0 $ S" + "S# #########H## H####H S" + "S#$#$#$ #H## H#$$#H S" + "S# # ###### H##$#HH#$$#H S" + "S# # #H############# S" + "S# ######## H## S" + "S# #H H###########S", //======<<< Level 084 >>>====== " & " + " 0000#S" + " S" + "H#$#$#$#$#H $ S" + "H#########H#########H# S" + "H $#$#$#$ H H $ S" + "H###X#X###H#########H## S" + "H#$#$#$#$#H H $ S" + "H###X#X###H#########H### S" + "H $#$#$#$ H H $ S" + "H###X#X###H#########H#### S" + "H#$#$#$#$#H H $ S" + "H###X#X###H#########H##### S" + "H $#$#$#$ H H $S" + "H###X#X###H#########H###### " + "H $ $ H H $", //======<<< Level 085 >>>====== "0$@ & @$0" + "H@@H@@@H@@@@@@@@@H@@@@H@H@@H" + "H@HH H@H H H H H HH@H H@H@@H" + "H@H@@@@@@H@@@H@@@@H H@@@H@@H" + "H@HH@@@H$H@H H H@H@@@H H@@H" + "HH@H H@@@@@@@@@H@H H H@H@@@H" + "@H@@@H$H H H H$H @@@@H@H H H" + "@H H$H@@H@@@@@@@H@@H H @@@@@" + "@H@@@@H H H H H H @H@@@@H H@" + "$H H @@@@@@@@@H@@@@H H HH@@@" + "@@@@H H @ H H H@H H@@@@@H H@" + "H H H@H$@@H@@@@@H@H H H@@@H$" + "H@@@@@@@H H H H H@@@@@H H@@@" + "H H H @@H@@@@@@@@$H H @@H H@" + "H@@@@H@@H H H@H@@@H@H@@@@@H@" + "H H$@H $H@@@@@H$H H H H H H@", //======<<< Level 086 >>>====== " S" + " $ & 0 0S" + "H@######@H########HHH S#H #S" + "H@######@ H H H H HH#H#H #S" + "H@######@H##########H@##H$#S" + "H@######@H ####H#S" + "H@######@H@@@@@@@@@@# @##H S" + "H@##$###@H @@@@#@####H" + "H@######@H##X###H@$@ @ $ H" + "H--------H##X$##H@H@#@@H####" + " # X@X@XXH H@ @H $ " + "#H##@#H@ #X@X@ @XH @#@####H" + "#H $@#H@ @X@$@X@#H @ $ H" + "#@@@@# @@@@ @@@@H####" + "$ @H# @H@@@@@@H H " + "###H H#H## H H#### ", //======<<< Level 087 >>>====== "&0 0 0 0@$ @######" + "#S S S S@@@@@@@H@####@SSSSSS" + " S#S S S@ @H@$###@S#####" + " S S#S S@H#####H@@@##@SSSSSS" + " S S S#S H#$###H - @@@@@@@H" + " S SSS S#HX####H-#H $ H" + " SS SS @#@H # #@#@#H" + " S -H- S --- H @@#@#@#H" + " - H - - H H" + " - -H- - - H H" + "$ - H - $ -H $$ H" + " - -H- - -- # # #@#@H" + " $- H -$ H#$$#H @@#@#@H" + " - -H- - H####H H" + " -$H$- H H H" + "################# ########H", //======<<< Level 088 >>>====== "# # ## # # ## # ## # # ## #S" + "# # ## # # ## # ## # # ## #S" + "# # ## # # ## # ## # # ## #S" + "#0#0## # # ## # ## # #0##0#S" + "#$#$##$#$#$##$#$##$#$#$##$#S" + "#X#X##X#X#X##X#X##X#X#X##X#S" + "#X#X##X#X#X##X#X##X#X#X##X#S" + "H - - - -- - --- S" + "H### # ### # # ### #####H" + "H# # # # # ## # # # # #H" + "H### # ### #### # # # #H" + "H# # # # #### # # # #H" + "H# # # # # ## # # @@ @@H" + "H# # # # #& # ### @@ @@H" + "H $ H" + "H##########################H", //======<<< Level 089 >>>====== "&@ ################## S" + " @H###0 #H#$##S" + " #H#$# #############H#H####S" + " #H### #0 #H#H####S" + " #H#$# # #########H#H#H####S" + " #H### # #0 #H#H#H##$#S" + " #H#$# # # #####H#H#H#H####S" + " #H### # # #0$ #H#H#H#H####S" + " #H#$# # # ###H#H#H#H#H####S" + " #H### # # $ H#H#H#H#H#$##S" + " #H#$# # #######H#H#H#H####S" + " #H### # $ H#H#H#H####S" + " #H#$# ###########H#H#H####S" + " #H### $ H#H#H##$#S" + " #H#################H#H####S" + " H# H H S", //======<<< Level 090 >>>====== "#############SS#############" + " # SS # " + " # SS # " + " #H@####H##########H####@H# " + "0 H@ H H @H 0" + "##H######################H##" + "##H######$ ## $######H##" + "##H##########$$##########H##" + "##H#####$# $##$ #$#####H##" + "##H###$##$###$$###$##$###H##" + "##H########$-##-$########H##" + "##H# $ # $ ##$$## $ # $ #H##" + "##H#########$##$#########H##" + "##H######################H##" + " H & H " + "############################", //======<<< Level 091 >>>====== "S 0 S" + "S--------------------------S" + "H H" + "H H" + "H #### - ### - H" + "H ##### #$#$# H" + "H ###$# $$ ##### H" + "H ##### $$ ##### H" + "H ##### ##### H" + "H #### # # # H" + "H H" + "H H" + "H H" + "H H" + "H00 & 00H" + "############################", //======<<< Level 092 >>>====== "$-------- --------$" + "H ########## H" + "H # # H" + "H # $$ $$ # H" + "H # ## ## # H" + "H # & # H" + "H # ## # H" + "H # ## # H" + "H # # H" + "H ###### H" + "H 0 #$$$$# 0 H" + "H ### ###### ### H" + "H $####### #######$ H" + "H ### $########$ ### H" + "H H" + "H H", //======<<< Level 093 >>>====== " " + "S # 0 0 0 " + "S ##S##H #H#-H#-H#-H#-H#-H#$" + "S S S #H " + "S ### #H #H#####H@# @#######" + "S @ #H #H#$#$#H # @#######" + "S @#H #H #H#####H # @#######" + "S @#H #H #H##$##H # @#######" + "S @#H #H #H#####H # @#######" + "S @#H$#H$#H#$#$#H # @#######" + "##@##@##@#H#####H#$ @###$###" + " $ @ H & H ##@#######" + "############H##### " + "$ ----------H-------@##X####" + "# H #H$" + "$H@#@#@#@#@#@#@#@#@#@#@#H# ", //======<<< Level 094 >>>====== " 00000 " + "@@@S@@@@@@@@@@@@@@@@@@@@@@@@" + "@$@S @" + "@H@S@@@@@@@@@@@@@@@@@@@@@@H@" + "@H@S@H H H H H H -- H@" + "@H@S@H@@@@@@@@@H@@@@@@@ @H@" + "@H@S@H H $H@@H@H $@@ @HH@" + "@H@S@@@@@@H $H@H@@@@@ @HHH@" + "@H@S@H H H@H@@@H $@@ @HH@H@" + "@H@S@H@@@H@H H@H@@@ @HH@@H@" + "@H@S@H H@H@@@H@H& $@HH@@@H@" + "@H@S@@@H@H H@H@@@H-@HH@@@@H@" + "@H@S@$ @@@H H@ H $ H@" + "@HHS@#@@@@@@@@@#@@@@@@@@@#H@" + "@ S H@" + "@##########################@", //======<<< Level 095 >>>====== "SSSSSSSSSSSSSSSSSSSSSSSSSSSS" + "H#############X############H" + "H##HHHHHHHH###X#########$##H" + //"H#############X############H" + "H###XXXXXXX###X############H" + //modified for easier passed "H# #H" + "H# $ $ $ $ $ $ $ $ $ $ HH #H" + "H# #H" + "H# $ $ $ $ $ $ $ $ $ HH #H" + "H# #H" + "H#0H $ $ $ $ $ $ $ $ H HH #H" + "H#0 #H" + "H#0HH $ $ $ $ $ $ $ HH HH #H" + "H#0 #H" + "H#0 HHHHHHHHHHHHHHHH& #H" + "H########################X#H" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH", //======<<< Level 096 >>>====== "#0000# " + "#X# # S" + "#$# $# # #$# $# # #$#S" + "#X##X# #$ #X##X# $ #$ #X#S" + " # #X##X# # #X##X# #S" + " $# # #$# $# # #$# $#S" + "#X# $ #$ #X##X# $ #$ #X##X#S" + " #X##X# # #X##X# # S" + " # #$# $# # #$# $# S" + " #$ #X##X# $ #$ #X##X# $ S" + "#X##X# # #X##X# # #X#S" + "# #$# $# # #$# $# # S" + " S" + "H##########################S" + "H & S" + "############################", //======<<< Level 097 >>>====== " " + "S###########################" + "SSSSSSSSSSSSSSSSSSSSSSSSSSSS" + " -------------------- S" + " & H S" + "$ -####H#####H####- ######H" + "$ -###$H##$##H$###- H" + "$ -####H# #H####- H#####$" + "$ -###$## ##$###- H######" + "$ -###############- H######" + "$ -###############- H----- " + "$ -###############- #X##X#H" + " -----000----- #$ $#H" + " H H0H H ######H" + " HH HH0HH HH H" + "###H#####H#H#####H#########H", //======<<< Level 098 >>>====== "& #0000# $ $ " + "###----#H##########S##### " + " # #H# - S - - " + " $ #H#H###S####$## ## ##" + "### #H#H#$#S#####$## ## #" + "HH #H#H# #S ##$## ## " + "HH HH#H###S ##$## ##" + "HH H# S ##$## #" + "### ###H# S ##$## " + "@@@@@@@@@@##S#######H ##$##" + " S#$H# H ## #" + "$ #HS# # H " + "#########H####@@########H##H" + " H # # H" + "$ H HXH $#####$ H" + "#########################XH#", //======<<< Level 099 >>>====== " - $ $ $00000" + "H# @#@#@#@#@#@#@#@#@#@#@#@#@" + "H# " + "H# $ $ $ " + "H# @#@#@#@X@#@#@#@#@X@#@X@#@" + "H# " + "H# $ $ $ " + "H# @#@#@X@#@#@X@#@#@X@#@X@#@" + "H# " + "H# $ $ $ " + "H# H#@#@#@X@#@#@X@#@X@#@X@#H" + "H# H H" + "H# H $ $ $ H" + "H H#@#@#@#@X@#@X@#@X@#@#@#H" + "##SH & H" + "############################", //======<<< Level 100 >>>====== "H------------------------ $ " + "H 000 & #H" + "H ###- ####### ####### H" + "H ####- ####### ####### H#" + "H #####- ##- -## ## ## H " + "H ###- ##- -## ## - ## #H" + "H ###- ##- -## ## - ## H" + "H ###- ##- -## ## - ## H#" + "H ###- ##- -## ## - ## H " + "H ###- ##- -## ## - ## #H" + "H ###- ##- -## ## ## H" + "H ###- ####### # ### # H#" + "H #$X- #$#$#$# #$###$# H " + "H-------------------------#H" + "H H" + "@#@#@#@#@#@#@#@#@#@#@#@#@#@#", //======<<< Level 101 >>>====== "& 0 S 0 " + " ## S H## " + " ######SS H###### " + "-----########SH########-----" + " ##########H ########## " + " ####0---H - H- H---0#### " + "-- ##$ H - H - H $## " + " @#$## H- H -H ##$#@ " + " @@# ## X# H #X ## #@@ " + " @@@#$## ## H ## ##$#@@@ " + " @@@@# ## ##H ## ## #@@@@ " + " @@@@@#$## # H# ##$#@@@@@ " + " @@@@@@# ## #H # ## #@@@@@@ " + " @@@@@@@#$### H###$#@@@@@@@ " + " @@@@@@@@# H #@@@@@@@@ " + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 102 >>>====== "S#@#@#@#@#@#@#@#@#@#@#@#@#@#" + "S- $ H" + "HX########### @ @#@#@#@#@#@H" + "H# ########## #@#@#@#@#@#@#H" + "H# ########## $ H" + "H# #-#@#-##-# @ @#@#@#@#@#H" + "H# #-#@#-##-# #@#@#@#@#@#@H" + "H# #-#@#-##-# $ H" + "H# #-#@#-##-# @ @#@#@#@#@H" + "H# #-#@#-##-# #@#@#@#@#@#H" + "H# #-#@#-##-# $ H" + "H#$#$#@#$##$# @ @#@#@#@#H" + "H#X########## #@#@#@#@#@H" + "H H" + "H& 00000H" + "H@#@#@#@#@#@#@#@#@#@#@#@#@#H", //======<<< Level 103 >>>====== " @#@#@#@#@#@#@#@#@#@#@#@#@#@" + "S0 & @#@#@#" + "S H " + "S# $ HH " + "S###################H# " + "S###################H#$ " + "S ########## ######H## " + "S ######H#### " + " SSS S S S ##H###H#### " + "S S S S$ H ##H ##### " + "S $$$ S S SS$ H$$#H #####$" + "S SSS S S S S$HXX#H #####X" + "S S S$$$S S SH H ###X" + " SSS SSS S S H ###X" + " H ###X" + "######################S ", //======<<< Level 104 >>>====== " S 0 " + " ------- S " + "H SSSSH@@@@@@@@@@@@@H" + "H ### H@ 00 #H" + "H#### # $## H# H#@#@#@#$ @H" + "H#### ###### H@ H@#@#@#@X@#H" + "H#### # #-H# H H" + "H#### ###### H@#@#@#@#@#@#@H" + "H#### # # SS " + "H#### ################## S " + "H#### #$ # $# 0# # S " + "H#### #########X######## SSS" + "H##$# # # $ ## $# S" + "HXXX# #########X######## S" + "H& 0 S" + "H#X############X########X###", //======<<< Level 105 >>>====== " &######### 0 - " + " H---------H@@@@@@@@@@@@ - " + " H H@$ $@ - " + " H H@@@@@@H@H@@@ -" + " HH###H H@$ H0H $@$$$$" + " HH#$#H H@@@@H@@H@@@@ 0 " + " HH#$#H H@ H H " + " ##########H###############H" + " ######## H $########## #H" + " #$ 0 #HH#### $########H" + " #####H#H#$ #X#### $# #H" + " # H H###H#X####X#######H" + " ##H########H#X####X#### $XH" + " ##H #H#X####X#X####XH" + " ###########H 0 X##H" + " ##########################H", //======<<< Level 106 >>>====== "#$ # #$#S" + "######H#H########H# $ @H#H#S" + "& #H#H#$$#####H# @@@H#H#S" + "#0000#H#H# #####H# H#H#S" + "# #H########$#H# $ @H#H#S" + "# #H# #H# @@@H#H#S" + "# H# @@@@@@@#H# H#H#S" + "## # ### H# $ @H#H#S" + " # ########### @@@H#H#S" + "#H # ---------# H#H#S" + "$#H # H $#$ #$ #@@@#@@H#S" + " #H # H ######## H#S" + " #H # H -------##@@@@@@#S" + " #H #H $ $ $ S" + " H H S" + "############################", //======<<< Level 107 >>>====== "################S###########" + "################S###########" + "#########H $ S # " + "#########H######S###########" + "#& #H------------H#####" + "#########H H $ ##" + "#########H############H#####" + "#########H# S #H## $ " + "#########H## S ##H#####" + "#########H### S ###H $0##" + "#####$ #H##### S$####H#####" + "#########H# $ #S#####H## $ " + "####### H######S#####H#####" + "################S#####H $0##" + " $$$ H#####" + "############################", //======<<< Level 108 >>>====== "S @ @###################@" + "S #$ 0H------------ " + "S ###H### $## H@####$" + "S $# H ## ## H@#####" + "H### H ## ## H@$####" + "H # H ## ## H@#####" + "H # H ## ## H@#####" + "H$0# H ## ## H " + "H### H ##$ ## ####H##" + "H # H ###########$ H " + "H # H #######$###H---- H0$" + "H # H # $$ #H @###@" + "H # H # ####### #H " + "H # H $ H " + "H @ @######H########H#####@" + "H$ $ H H & $ ", //======<<< Level 109 >>>====== "@@@@@@@@@S " + "@#######@S " + "@#@ $@@@@@@S " + "@ H@######@SS$ 0 H@@@@#H" + "@$--H@#$ @S @#@#@HH@ @@#H" + "@@@ H@###@H @SS @ $H@ @@#H" + "@$ H 0$@##@ S @ H @@#H" + "@H@@@#####@ SS0$@$ $@H@@#H" + "@H -H@####@ S@##@#@ @@H@ #H" + "@@@ H@$ ##@$ SS @ @H@$#H" + "@ H@####@#@ S @H--- H@X#H" + "@H@@H @ SS $@H H@ @$-H" + "@H @@@##@H@ S@##@H$ H@ @#H " + "@H $@$ @H@ S $@@@ H @##H" + "@H H@@##@H@##@H@#@ @H@$#H" + "@@@@@@ H & H H@H H H", //======<<< Level 110 >>>====== "$ &@##@@ S " + "########@$ 0$S $ $" + "########@@H@@#@S@ @H# #H##@@" + "# $ @$H@ $ S@ #H# #H " + "########@@H@S@#@@ #H# #####H" + "#######@ $H@S $ @ #H# # H" + "# $ #H@@@#@S@ #H# #H####" + "########@H @ $ S@$#H# #H $ " + "########@@H@S@#@@ #H# #####H" + "# $ @$H@S $ @ #H# # H" + "########@@H@@#@S@ #H# #H####" + "# #$ @$H@$ S@ #H #H 0 " + "#$ ####@@H@@##@@ #########H" + "##H # H H" + "$ H##H##H##################H" + "##H H##H 0$ H", //======<<< Level 111 >>>====== "@@@@@@@@@@@@@@@@ S" + "@--------------- S" + "@H@ @$ H@ @$ @$ -- S" + "@H# @##### @@####@ @ S" + " H# @$ @ # $#$ @- H@$S" + "H@###### @##@ ######@$@@@@S" + "H@ #$ # #$ # # $# S" + "H@ ##@@##X# #### ######@ S" + "H 0 $# #$ # # $#$ S" + "H@@#@@@@H##### #### ######X" + "H# @H #$0 #$ # 0$ X" + "H######@@@@@H#### #########X" + "H @ $@H # #$ ###X" + "H#####@@@#@@@@@H#### ######X" + "H $ & @H @ $" + "@###########@H H H######@", //======<<< Level 112 >>>====== "##################@0 S" + "XH----------------@#@#@#@#@S" + "XH $ $ $ $ @@ - $S" + "XH -----------H@H@ @@@@@ " + "XH 0 H@H - - " + "X##@@##@#@##@###@H@@@@@ @ @H" + "H----------------H- - H" + "H H# ####H#" + "H $ $ $ $ $H# # ##H#" + "H 0 H# # ##H$" + "H ######H@##@@##@#@@# # ##H#" + "H #$ H#$# $ # $ ## # $#H#" + "H H #H#H#H#H# $###H$" + "H##H######H#H#H#H#H#$#####H#" + "H #H #H#H#H#H#H#######H#" + "H ####H #H H#H H#H $& H#", //======<<< Level 113 >>>====== " S" + "################### 0 S" + "$H---- & --- H########" + "#H $ H#########$ ###########" + "$H@@@H###########HHH###$ ###" + "#H H# #$ ## ### $HHH## $##" + "$H-H H# ## ## ### $HHH####" + "#@ H H# $# $# $##@@ $HHH##" + "$ H H#############@@ $H #" + "#H-H- $###@@ #" + "$H $ H#@@@@#H @########@@@##" + "#H@@@H H #" + " H H---- H 0 " + "@##H $ H##############H" + " H 0 H -------- H" + "$ H########### 0 0 #####", //======<<< Level 114 >>>====== "##@####@#@ S 0 0 0 0 0@ " + "$H---H--- S#@##@#@##@#@ " + "#H $ H $ S## # " + "$H H #H# $ $ $ @ " + "@H##H###@H###@#@##@@H####X#@" + "#H#HHH# #H# $#HHH# $ #" + "#H#H#H# #H#H#######H#H#### #" + "#H#H$H# #H#H##$&###H H# $ #" + "#H##### #H#H#######H H#X####" + "#H $ $ #H#H ###H$H# $#" + "@###X##@HHH####H########@X@@" + "$H#H----H#H---HHH# H$" + "#H#H H H#--------H#" + "#HHH ######## H H# $ #@" + "##H ##$##$## HHH$##@#@#@H $" + "##H H #@$ H@#", //======<<< Level 115 >>>====== " S " + " 0 -0 S0 $0 0 $" + "H#######H # S $H########" + "H###$###H ## S $H " + "H @###@ H ### S$H $" + "H @#@ H #$ ##SH$ ######X#" + "H @ H #####S H$ " + "H & H ### #S H$ $" + "####H#### # ###S $H########" + " H $####S $H " + " H #####S$H #@###H" + "H##############SH$ @H H" + "H H$ @@# H" + "H H$ @@$## H" + "H H @@@ H" + "#@#@#@#@#@#@#@#@#@#@#@#@#@#@", //======<<< Level 116 >>>====== " " + " # # # # # # # # #S" + "S# S# S# S# S# S# S# S# S# S" + "S##X##X##X##X##X##X##X##X##X" + "S & #X #X " + "H#####@H##H#XH##H#XH####### " + "H###$#@H##H H##H H####### " + "H# ###@H##H H##H H####### " + "H###$#@H############## #### " + "H# ###@H#$#$ ##### ####-" + "H###$#@H ######H# $ # ####-" + "H# ###@H### 0 H ####$ #$# " + "H###$#@H $######H # ### " + "H# ###@H### ####H----- " + "H#####@H H$" + "H0 0H#@#@#@#@#@#@#@#-H#-H", //======<<< Level 117 >>>====== " - " + "H@X##H@ 0- " + "H@X##H#H#@@@@@@@# H#@#@#@#@#" + "H@X##H@H#$ $# H # ---$" + "H$X##H#H#@@@@@@@# H##### " + "H@X##H@H & H # H####" + "H$X##H#@@@@@@@@@H@@@@@@H####" + "H@X##H@---------H----- H####" + "H@$##H# $ H@#@#@ H###" + "H@#XXH@ ####### H#@#@# H###" + "H H# H H###" + "H#@#@#@#@H@#@#@#@#@#@#@H-H##" + "H @H $ $ $ H H##" + "@@@@#@@@@H ### ### ### H H##" + "$ H 0 0 H###$" + "#########H#############H ", //======<<< Level 118 >>>====== " SS S$ -----" + "H####H@0S S S#######H# X #" + "H## H@@HS S$ H# X #" + "H ## H H S S S#######H# X #" + "H ##H@0HS$$ S H# X #" + "H ## H@@#@#@#H#@#@#@#@X# X #" + "H## H ----H # # X #" + "H ## H@0 $ $H@#$#@H#X$# X #" + "H ##H@@H# #H@###@H # X #" + "H ## H H ## H@###@H#### X #" + "H## H@0H H H # X #" + "H ## H@@#H H#H H#####H# X #" + "H ##H ######## H#####" + "H ## H@ $ $H#$#$#" + "H#$$#H@0 H######H & H " + "H ## H ###@@@@@@##########S$", //======<<< Level 119 >>>====== " & " + "H@##########@HH@##########@H" + "H############HH############H" + "H##$#########HH##$#########H" + "H############HH#######$####H" + "H##$##H#$####HH############H" + "H#####-######HH#$$#####$$##H" + "H#####-######HH############H" + "H#####-#$ ###HH########## #H" + "H##### ##H###HH#########$$#H" + "H#######$H###HH$######$$###H" + "H########H###HH############H" + "H#$#####$H###HH@#$#########H" + "H############HH#######$####H" + "H0 0HH0 0H" + "############################", //======<<< Level 120 >>>====== "& 0" + " @#H#####H############H###" + " H H H H @@" + "@@ H H #S# @" + " @@H @@## H@ @ H#@@H###H@" + "@@@ H #-## H@ @ S@#H@H$ H@" + " H ## H@@ @@@@#@@@@$ H@" + " # H@H @$$@H H $@ $ #@@@@" + " #@ H ## H-@ @@@#@@H## " + "$H-@ H @ H @ --- @S#$- @ " + "#@@@ H @$#@H 0@@@H@@@@S#H " + "-- H @# H@#@H H @@@ " + " # - H # H@H$##H H H-H-H-H" + "#H#S#H 0 H @H-H# H@-H-H-H-" + "H$@@#H#H#S#H @@ @@H$@H-H-H-H" + "@#HHH##### H###@####@-H-H-H$", //======<<< Level 121 >>>====== "@@@@@@@@@@@H- - &00 " + "H -- H # # ###H @@@@" + "H### H $ $ #$#H " + "H#$# H # # # #H $ " + "H# #$@@@###@ #### ###H " + "H### @ $$$ --- H ####" + "H @#H H# #H H $###" + "####H@#H HH# #HH H #####" + //" H@#H H # $ # H H $" + " H@#H H # $ # H H $ " + //modified for easier passed "H####@#H HH##$ $##HH H " + "H @#H H #$ $# H H H####" + "####H@#H H#$ ### $#H H H " + " H@#H #0##### # H HHHHH" + "H####@#H $ ##### $ H ----H" + "H #H #$$$# H H" + "###########H H##########", //======<<< Level 122 >>>====== "SSSSSSSSSSSSSSSSSSSSSSSSSSSS" + "0 SSSS 0" + "H##########################H" + "H##########################H" + "H# $## #$$# ##$ #H" + "H ######$ #### $##### H" + "##H ####### & ####### H##" + " ##H #####0##0##### H## " + " ##H -- # $# # -- H## " + " $##$ ## H# ## #H ## $##$ " + "##$$## H### #$ ###H ##$$##" + " ## H##### ## #####H ## " + " H#### ####H " + " H#### H########H ####H " + "$#H H# $$ #H H#$" + "############################", //======<<< Level 123 >>>====== "#HSH H HS SH SS SS SHS#" + "#H0H H H S H S S S 0 H #" + "#HSH H H H S S SSS H #" + "#H H H H H S S S H #" + "#H$H$HSS$H$$ H $SS$$SS$$ H #" + "############SSS#############" + "HHHHHHHHHHHHHHHHHHHHHHHHHHHH" + " HHHH HHHH " + " HHH##################HHH " + " HHHHHHHHHHHHHHHHHHHHHH " + " HHHH & HHHH " + " HHH############HHH " + " HHHHHHHHHHHHHHHH " + " HHHH HHHH " + " HHH######HHH $0" + "$####H HHHHHHHHHH H## ##", //======<<< Level 124 >>>====== "@@##SSS S$S#SSS SSS##SSS " + "@@@##H H#H#H###S S#H@@####" + "@@#$#H@#HSH HS##SHH##HS@####" + "@@@##H@#S#S#S###H##H#H@@###$" + " H@$S#S#SSS#H##H HSS####" + "H@#@#@#@#@#@#@#@#@#@#@#@#@#H" + "H @ -- # #H" + "H H- -H @ H######H#H### #H" + "H H -- H @ H######H#H#$####H" + "H H- -H @ H##$$##H0H# ####H" + "H H#$$#H @@@@@@@@@@@@#### #H" + "H H H ------------- H" + "H H H $ $ $ $ H" + "H H H H" + "H H H & 00 H" + "H##########################H", //======<<< Level 125 >>>====== " H" + " H" + " H### H" + " H###### H" + " HH######## H" + " HH ########## H" + " HH ######## H" + " HH #######$ H" + " HH #####$$ H" + " HH ####$$ H" + " HH ##$$ H" + " HH # H" + " HH H" + " HH H" + " HH HH H" + "#########H00000 &H", //======<<< Level 126 >>>====== "&0 $ $ 0" + "@ H###- -H H##########" + "@ @ H - - H H##########" + " #$# H - H H##########" + " @#@#@H - - H H##########" + " -----H $ - -H H####$$####" + " #X## H##########" + " H#H H " + " ####H##H############H#####H" + " #$ # $#H H# #H" + " #@@#@@#H ### ### H# $ #H" + " 0 H ### ### HX #H" + " #######H#H $ $$ $ H#H#@@@XH" + " H H H H H" + " H0H H0H H" + "############################", //======<<< Level 127 >>>====== " & " + "SSSSSSSSSSSSSSSSSSSSSSSSSSSS" + "$ S------------------S $" + "####H@#####X@ @X#####@H####" + "$ H@@@@@@@ ## @@@@@@@H $" + "####H@@@@@@ #### @@@@@@H####" + "$ H@@@@@ ##$$## @@@@@H $" + "####H@@@@ ##$ $## @@@@H####" + " H@@@ ##$ $## @@@H " + "H#### ##$ $## ####H" + "H### ##$ $## ###H" + "H#### $##$ $##$ ####H" + "H@@@#@@@@ ##$ $## @@@@#@@@H" + "H@@@ @@@@@ ##$$## @@@@@ @@@H" + "H 00####00 H" + "###########H XX H###########", //======<<< Level 128 >>>====== " SSSSSSSSSS " + " SSSS 0000 SSSS " + " SSSS $ @@@@ $ SSSS " + "SSSS $ @@@@ @@@@ $ SSSS" + "S $ @@@@$ $@@@@ $ S" + "@@@@S $ @@@@HH@@@@ $ S@@@@" + " @@@@S $ @HH@ $ S@@@@ " + "$ @@@@S $HH$ S@@@@ $" + "####H @@@@HH@@@@ H####" + " ####H HH H#### " + " ####H HH H#### " + " ####HH#### " + " HH " + "#############HH#############" + " HH& " + "############################", //======<<< Level 129 >>>====== "& --- -- ----- - - - - " + "## # ## # H HHH HSH H " + "# # # # # # # #H S S H H H " + "# # # # # # # #H SSS HSH H S" + "#$# #$# #$# #$XH S H H SHS" + "#X X #X X S SSS HHH H" + " H" + "------------- -- -- - H" + "H HHH HHH HHH### # ### ###" + "H S S S S S #$ # # #$ # " + "H SSS SSS SSS### # # ## # " + "H S S S S $# #$# # # " + "H SSS SSS SSS### X # # " + "H 0000" + "@@@@@@@@@@@@@###############" + "#############@@@@@@@@@@@@@@@", //======<<< Level 130 >>>====== " & $$ 0 " + "S##########################S" + "S# $$ #S" + "S#@@@@@#H@@@@HH############S" + "S#@$ # $@HH #S" + "S##@@@@#@@@@#HH@#### ###S" + "S#-----------HH@### #0#$#S" + "S# - HH@## ####H#S" + "S#### #0# ## HH $# #$###H#S" + "S ### ### X$ HH # ####H H#S" + "S#### ### $# HH $$ H#H#S" + "S#$## $ ## HH@@@@@@@@H H#S" + "S# 0HH0 $$ H#H#S" + "S##########################S" + "S$ $S" + "############################", //======<<< Level 131 >>>====== " @@@ H- -H# &" + "H#$#H@ H ######H #H# H# $0" + "H###H@H $ H # # H@@@@@ " + "H###H@H XX#####H #H# H " + "H###H@H H # # H @@ " + "H###H@ H ######H #H# H # $# " + "H###H@@@@ ###H # # H #H## " + "H###H H#@#H ### H #H## " + "H###H# @@##-#H ### H #H## " + "H H# @@##-#H #$# H #H## " + "H@@@##X$ @@$#@@H H #H## " + "H $### @@#@@@######H #H " + "H@@X##$ 0 H #H-# " + "H @@@@@#@@@@@@@@@H #### " + "H0 0H " + "############################", //======<<< Level 132 >>>====== " $ 0 - " + "H### ################# ###H " + "H 0 ################# ###H " + "###H ################# ##HH " + "#$#H ######## ###### $ #HHH#" + "##HH ####### ####### H#H#" + " HH# ######$ $###### 0H#$#" + " H## ####### ####### #HH##" + "#HH# ######## ###$#### ##HH#" + "##HH ################# ##H " + "###H ######## ####### $##H " + " #HH ######## ######## ##HH#" + "$HH# ########$######## #HH##" + "HH## ########X######## HH#$$" + "H & H ##" + "############################", //======<<< Level 133 >>>====== "-------$------------$-------" + "H- - # - &HH - # - -H" + "H - - $ - -HH- - $ - - H" + "H - ### - HH - ### - H" + "H - $ - HH - $ - H" + "H ##### HH ##### H" + "H #-###-# HH #-###-# H" + "H # -#- ## HH ## -#- ## H" + "H ##-$#$-## HH ##-$#$-## H" + "H ###-#0#-###HH###-#0#-### H" + "H ## -# #- ##HH## -# #- ## H" + "H# -#$#- HH -#$#- #H" + "H#### -#- ###HH### -#- ####H" + "H0###-$#$-###HH###-$#$-###0H" + "H ## ### ## HH ## ### ## H" + "H H###H HH H###H H", //======<<< Level 134 >>>====== "H@@@@@@@ 0 & 00 @@@@@@@H" + "H @@@@ @@@@@#@@@@ @@@@ H" + "H@S0@ $HHH HHH$ @0S@H" + "H@@@@ @@##H@@@#@@H##@@ @@@@H" + "H@ HHHH HHHH @H" + "H@ #@@#H###@@@#@@###H#@@# @H" + "S HHHH HHHH S" + "#@@@@#@###H@@@@@@H###@#@@@@#" + "$ HHH HHH $" + "#@@X#@X@@@###HH###@@@X@#X@@#" + " $ HH $ " + "@@@X@#X@@@HHH HHH@@@X#@X@@@" + "$ HHHH HH HHHH $" + "#@@#@@XH HX@@XH HX@@#@@#" + "$ HHHHHX@@@HH@@@XHHHHH $" + "@@@XH H@HHHHHHHH@H HX@@@", //======<<< Level 135 >>>====== " @@@@@@@@H " + " H -- " + " 0 $ H-SSSSSSH - $ $" + " H#H##X@ - S0 H --H####" + " H@S $@$- S H@X#@ H " + " H@@@@@@@ @@H-H $ H@####" + " H-- @@@@ H @ H- H" + " --- @H $ H$ H-# @H" + "#-@-#@H@X#H@@@@@@H##X#H@#$@H" + "# #@H H @@ H H H#@H" + "##$##@H@##H##$@@ H @H H" + " ## H H ##$@@H $ H-H##@" + " H H#$##$@H @ $ H#$@" + "######H H##$## H ---@ HX#@" + " H0 H ##$##H H " + "######@###H& 0 H#######@##", //======<<< Level 136 >>>====== "S " + "S ----- " + "S & 0 H" + "S ################### H" + "S ######################$ H" + "S #### $ ## H" + "S ##$$ ## 0 $ #X H" + "$### #################$ H" + " X## ################ H" + " $## $ H" + " #### $ 0 ## H" + " #################$ H" + " ############### H" + " H" + "0 0 H" + "############################", //======<<< Level 137 >>>====== "S@ @@ @@@@@@ @@@@@@@@@@@@" + "S@ @@ ----- ---- -@" + "S----H-----@S H@@@@@@@@@H @" + "S$ H$ @S H $ @ H &" + "S#H#X@##H##@S H###@###@#H#@" + "S H-----H $@S H$ @ HHHHH @" + "S H @ @ H @@S H#$ H$@ $@" + "H@H$ 0H @S H####X@#@###@" + "H@@##H##@##@S H# @ $ @$ @" + "S$ H $@H--H# @ @@@@ @" + "H### H @@H0$H# $@ $ $ @" + "H####@#H##@@@##@#H#@##X###H@" + "H--- @-H----- #@#H--------H@" + "H$ H@ H $ H$ H $ $ H@" + "@#H#@@#@X#@##H#X#@#H#@H##H#@" + "$#H $ H H 0H$ H ", //======<<< Level 138 >>>====== " S #####& " + " S #$HHH$# ------H" + " ----- S #HHHHHH# H" + "H S #HHH0HHH# H" + "H ## S #HHHHHHH# H" + "H #$ #S #$HHHHH# H" + "H ## #HHH$## H" + "H ####### - H" + "H 0 ### H" + "HHHHHHH-#H S SS SSS##@ H" + "HHHHHHH #H S S S S $#@@ H" + "HHHHHHH #H S S S SS @@@H" + "HHHHHHH #H SSS S S @@@" + "HHHHHHH$#H S S SS SSS @@" + "--------#H 0 0" + "$ $ H######################", //======<<< Level 139 >>>====== "S##########################S" + "S----H@H----H##H----H@H----S" + "S H@H H & H H@H S" + "S H@H H##H H@H S" + "S HHH H##H HHH S" + "H@S H####H H####H S@H" + "H@0S H H##H H S0@H" + "H###########H##H###########H" + "H@@@@@@@@@@@@##@@@@@@@@@@@@H" + "H@0 @ @ 0@H" + "H@ H####H$$H####H @H" + "H H H##H H H" + "H H@H H##H H@H H" + "H H@H H $$ H H@H H" + "H $H@H$ @ H##H @ $H@H$ H" + "############################", //======<<< Level 140 >>>====== "0--------------H " + " $$ H " + "H###### HH @######H#####" + "H H@@H H#$$##" + "@#####H #H@@H# H# ##" + " H HHHH H######@##X##" + "######@ HH H $0" + "######@ HH -H # #########" + "######@ HH # ########" + "######@ HH # #######" + "######@ HH # ####$#" + "$#####@ HH # #####" + " ----- S###@#H " + "S SS##@@#H0 @@H " + "S S###@@#@####@@@H &" + "S S###@@#@####@@@@H-----", //======<<< Level 141 >>>====== "S##0#0################0#0##S" + "S H---H H---H S" + "S #$#H H-HH-H H#$# S" + "S ##X#$ ##HH## $#X## S" + "S $ ## HHHH ## $ S" + "S## ####$## H##H ##$#### ##S" + "S ##$##H##H##$## S" + "SHH### ##$ H H $## ###HHS" + "SHH#### ####HH#### ####HHS" + "SHH#$ $@H HH H@$ $#HHS" + "SHH#$#@ ####HH#### @#$#HHS" + "SHHX@@ $##$ HH& $##$ @@XHHS" + "HHHH ##$##HHHH##$## HHHH" + "HHHH####$## HHHH ##$####HHHH" + "HHHH ##$ HHHH $## HHHH" + "#######@H$@######@$H@#######", //======<<< Level 142 >>>====== " S" + "$ $@@$ -S" + "H0 H####H #####@&H" + "H0 H$@@$H #####H H" + "H0 H###@@###H ##$##@ H" + "H0 H$ @@ $H #####@ H" + "H H#####@@#####H #####@ H" + "H HH$ @@ $HH H" + "H#### H###@@###H #####H" + "H HH$ @@ $HH H" + "H H#@@#H H" + "H HH$$HH H" + "H HH H" + "H H@@H H" + "H$ H H $H" + "############################", //======<<< Level 143 >>>====== " " + "S & SSS0 SSS0 SSS0 SSS0 SSSS" + "H###H H##H H##H H##H H##H S" + "H#$#H H##H H##H H##H H##H S" + "HX#X# #### #### #### #### S" + "H H S" + "H H#$$# #### H@$# H### ####H" + "H # # @H$@ H@## H#$# #$ H" + "H #### @@@@ H@## #X## ##X#H" + "H HH H" + "H#### #### ##@H @@@@ @@@@ H" + "H##$# #$$# #$@H @$ $@ H" + "H#X## # # #X@H @@@H H@@@ H" + "H HH H" + "H HH H" + "############################", //======<<< Level 144 >>>====== "S@ --& @ " + "S@ H $$ @ " + "S@ H ## @ " + "S@ ##@HH #@@# HH@## @ " + "S@ ##@HH #@HH@# HH@## @ " + "S@ ##@HH #@HHHH@# HH@## @ " + "S@$##@HH #@HH--HH@# HH@##$@ " + "S@##@HH #@HH----HH@# HH@##@ " + "S@#0HH #@HH-- --HH@# HH0#@ " + "S@#HH #@HH-- $$ --HH@# HH#@ " + "S@HH #@HH-- ## --HH@# HH@ " + "S@H #@HH-- #### --HH@# H@ " + "S@H#@HH-- ##HH## --HH@# @ " + "S@#@HH-- ##HHHH## --HH@# " + "S@@HH--- ##HH$$HH## ---HH@# " + "SSHH--0 ##HH-##-HH## --HH##", //======<<< Level 145 >>>====== "HH$0H H H H 0H H H H0H" + "H #H #H #H #H #H H# H#$H#$HH" + "H#H #H #H #H #HH# H# H# H# H" + "HH #H #H #H #H H# H# H# H#H" + "H #H$#H #H #H H# H#$H# H# HH" + "H#H #H #H$#HH# H# H# H# H# H" + "HH #H #H #H H# H# H# H# H#H" + "H #H #H #H H# H#$H# H# H# HH" + "H#H #H #HH# H# H# H# H# H# H" + "HH #H #H& H# H# H# H# H# H#H" + "H #H #H H# H# H# H# H# H# HH" + "H#H #HH# H# H# H# H# H# H# H" + "HH #H H#$H# H#$H# H# H# H#H" + "H #H H# H# H# H# H# H# H# HH" + "H#HH# H# H# H# H# H# H# H# H" + "HH H H H H H H H H H", //======<<< Level 146 >>>====== " & - - - -- " + "H@#H#@H ###H@#H#@H H H ## H" + "H@#H#@H### H@#H#@H H H ## H" + "H@#H#@H ###H@#H#@H H H ## H" + "H@#H#@H### H@#H#@H H H ## H" + "HH#@#HH ###HH#@#HH H H ##0 H" + "0H#@#H ### 0H#@#H0 H H ## H" + " H#@#H @ @ H#@#H HH H ## H" + " H#@#HH@$ @HH#@#H H H ## H" + " HHH#@H ## H@#HHH H HH #$ H" + " H#@H ##H@#H H H ## H" + "HH H#@H ## H@#H HHH H ## H" + " H H#@H ##H@#H H H ## H" + " H HHHH@@ @HHHH H HHHH ## H" + " H H@ $@H H H H $# H" + " HHHH H@## H HHHH H H ## H", //======<<< Level 147 >>>====== "HHHHHHH- ----- & HHHH" + "HHHHHH ####### H## HHH" + "HHHHH ######### H## HH" + "HHHH ##$ $## H## H" + "HHH ## ## H## " + "HH $##$ $## $H##$" + "H #########H #####X####" + "H ##########H $####X####" + "HH ##H $ $##H ## " + "HHH ##H ##H ## " + "HHHH ##H ##H $ 0 ## H" + "HHHHH ##H0 #X####### HH" + "HHHHHH ##H X###### HHH" + "HHHHHHH $ HHHH" + "HHHHHHHH 0 HHHHH" + "############################", //======<<< Level 148 >>>====== "S- 0 & -H" + "S @@@#@@@#@@@##@@@#@@@#@@@ H" + "S#0 0#H" + "H@ HH HH HH HH @H" + "H@ H H H H $$ H H H H @H" + "H@ H H H H HH H H H H @H" + "H@ $HH$$$HH$ $HH$$$HH$ @H" + "H@ H H H H HH H H H H @H" + "H@ H H H H$ $H H H H @H" + "H@ HH HH HH HH @H" + "H@ @H" + "H @@@#@@@#@######@#@@@#@@@ H" + "H --------- #### --------- H" + "H $ $ H####H $ $ H" + "H 0 H#HH#H 0 H" + "@@@@@#@@@#@#$HH$#@#@@@#@@@@@", //======<<< Level 149 >>>====== "@@ - @@@ - @ -- " + " $-H @#$ #H @#$# H@@#$@H#" + " # H @# $#H @@ H@ $## H#" + " @# H ##@ #@H0 H@ #@@@@#" + " @@# H @@#@@#@@@#H@@@# $" + " @$## H---- -- #H @H X" + " @@# @X@ #@ $ @#@@#@@ H@X" + " @@ @@$@@ #@@@#@@ - H@@ " + " @ @@@X@@@#$ @$#@ H@@ " + " $@@ H--- @@@ #@ H@@ --" + " @@ H H H@@ H $" + " @@ H@ ----H@#H H@ H# " + " H @0# 0 H #@#H@ ##@H# " + " SXH #@# S#@@##$@H @##$ #@" + "$S@$@H @$#S#$ ##@@#H ###@@@" + "@S X H #@S@ @@#& H@H# $@", //======<<< Level 150 >>>====== "SSHSS H H HSH HSH H H HS " + " S S S S S SS S S S" + " S SSSS SS SS SS S S S" + " S S S S S S SS S S" + " H H H HSH HSH H SH HS " + "H@@@@@@@@@@@@@@@@@@@@@@@@@@H" + "H@#H$H#H$H#H0HH0H#H$H#H$H#@H" + "H@#H#H#H#H#H#HH#H#H#H#H#H#@H" + "H@$H#H$H#H$H#HH#H$H#H$H#H$@H" + "H############HH############H" + "H@$H#H$H#H$H#HH#H$H#H$H#H$@H" + "H@#H#H#H#H#H#HH#H#H#H#H#H#@H" + "H@#H0H#H$H#H HH H#H$H#H0H#@H" + "H@@@@@@@@@@@@HH@@@@@@@@@@@@H" + "H0$ HH $&H" + "##########H HH H##########" ]; ================================================ FILE: lodeRunner.v.revenge.js ================================================ //************************************************************ //* All levels extract from: //* Revenge of Lode Runner (Apple-II 1986) DISK IMAGE //* by Simon Hung 2015/01/08 //************************************************************ var revengeData = [ //======<<< Level 001 >>>====== "H@ SSS SS SS SSS @" + "H@ S S S S S S S @" + "H@ S SS S S S S S S @" + "H@ S S S S S S S S @" + "H@ SSS SS SS SSS @" + "H@@@@@@@@@@@@@@@@@@@@@@@@@@@" + "H " + "H########@##############- " + "H##H####@H ##H## #H#H##-@H " + "H##H####@H###H#H#####H##-@H&" + "H##H#$$#@H$##H#H##$##H##-@H0" + "H##H####@H ##H#H#####H##-@H " + "H#@#H $@@H H@#@#####H@#-@H " + "H@@@@@@@@@@@@@ @@@@@#@@ -@H " + "H00 $ @H " + "######################## ## ", //======<<< Level 002 >>>====== "S@ @ " + "S@ $ @ " + "S@H###H-H$H$H$H$H$H-H####H@ " + "S@H H$H$H$H$H $ H@ " + "S@H###H---H$H$H$H---H####H@ " + "S@H H$H$H $ H@ " + "S@H###H-----H$H-----H####H@ " + "S@H $$$$$$$H$$$$$$$$ H@ " + "S@@##########H########XXX@@ " + "S H " + "S ###### H ###### " + "S ##$$## H ##$$## " + "S ###### H ###### " + "S H " + "S & H $ 0" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 003 >>>====== " @S" + " ------- @S" + "######### H @S" + " ##$$$## $$ H $ @S" + " ##### -##############H@S" + " ### - ####HH@S" + " # - #$#HH#@S" + " - ##HH##@S" + " - $ #HH###@S" + " - $$ $ $HH####@S" + "$ - $$$ ###H#########@S" + "###X## $$$ H @S" + " H #### H @S" + " H H @S" + "$ H & $ H $ 00S" + "###H###S####################", //======<<< Level 004 >>>====== " " + " H@$ H@$ " + " -H@$ H@@$ H@@$ " + " H@X H@@XH@$ H@@@$ " + " $ H $H H@@$ H@@@@$ " + " X#########H@@@$ H@@@@@$ " + " ###$$$## H@@@@ H@@@@@@$" + " ###### H@@@@X H@@@@@@X" + " H H " + " $ H $$$ H $$$$ " + " #####################H" + " ## #$$$@$$$ - ##H" + " ### $$$@$$HX# ## H" + " ###@@@@@@@### H" + " 000 $$ $ $ $ &H" + " @@@@@@@@@@@@@@@@@@@@@@@@@H", //======<<< Level 005 >>>====== "@ S @" + "@ S @" + "@@@@@@@@@@S@@@@@@@@@@@@@@@@@" + "@@@@@@@@@@SSSSSSSSSSSSSSSS @" + "@ $ $ $ $$ $ $$H@" + "@H#########################@" + "@H 0000@" + "@#########################H@" + "@ $ $ $$$ H@" + "@H#########################@" + "@H $ $ @" + "@#########################H@" + "@ $ $ $$ $H@" + "@H@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@H $ $$&" + "@@@@@@@@@@@@@@@@@@@@@@@@@@@@", //======<<< Level 006 >>>====== "@S@@@@@@@@@@@@@@@@@@@@@@@@@@" + "@S ------------------- @" + "@S H H $ @" + "@X#XXXXH ####H@" + "@ H ######## H@" + "@ H #HHHHHHHH# H@" + "@XXXXXXH#HH $$$$ HH# H@" + "@$X X$XH#H ---- H# H@" + "@$X$X$XH#H H# H@" + "@$X$X$XH XH ---- H# H@" + "@$X$X$XH--##XXXX## H@" + "@ X$X XH H@" + "@XXXXXXH H@" + "@------H 00$$&H@" + "@####### ###########S######@" + " $$$ S ", //======<<< Level 007 >>>====== " ------------------------H" + " - H H - 00 - $$$$$$ H" + " & - H-$ -00 - $$$$$ -H" + " --- H $$ H $$$$ --H" + " - H - $$ $ $$$ ---H" + " - H - - H $$ ----H" + " - - H - - -----H" + " - - H $ $ -- $ H" + " $ - -H----- -$- $ H" + " H- H - - H- $ H" + " H - H - - H- $ H" + " - H-- - $ H" + " - H - -------- $ H" + " - H - - -- - $ H" + " ---H- - - $ H" + " H H", //======<<< Level 008 >>>====== "S# #" + "S# $$ #" + "S# #########################" + "S#0--- ### $ --- -- " + "S##H #H # #### H - ###H" + "S## ####H# H-- ##-XXH" + "S##$$$$#H $ 0 ##$XXH" + "S######################X##XH" + "S# ------------------------H" + "S#H#######X#######X##H######" + "S#H# 0 $ # $ H# " + "S#H# ######H# #######H# ###H" + "S#H # $ #H # $ #H # H" + "S##### H# ##### H# ##### H#" + "S$ &H# $ 0H# H#" + "############################", //======<<< Level 009 >>>====== " 0 ----------- @S" + "H##$ @@@@@@@ $##H @S @S" + "H###$ @@@@@ $###H @@@@S" + "H####$ @@@ $####H $0 @S" + "H#####$ @ $########H#####H@S" + "H######$ $###### H #H@S" + "H#######$#######$ #H@S" + "H####################H###H@S" + "H$ @H@ 0 H #H@S" + "######H@H@ #######H $#H@S" + " H@H@ ######$######H@S" + "H######@H@$ ###$# # $ #H@S" + "H##$###@H@###############H@S" + "H &@H@ $ $ H@S" + "@@@@@@@@H@@@@@#@@@@@@@@@@@@S" + " H $ $ S", //======<<< Level 010 >>>====== "S " + "S---- ------------------ " + "H S@S H $- $ - $ - $ " + "H S@H H $ - H - H - H " + "H $0S@H H -H---H----H----H $" + "H###S H H- - - - -- - -- - " + "H$ S@H H $ 00 " + "H###S@H #############H#####" + "H $S@H ###### H " + "H###S H ###### H $ " + "H $ S@H ###### H####H###" + "H###S@H ###$## H# H " + "H #S@H ###### H# $ $" + "##H#S@H H############" + "& H#S@H H $ $00" + "####S@H H##################", //======<<< Level 011 >>>====== "# ##########################" + "#S ## #" + "##S # H#######H----- #" + "###S# H####$##S S#H#S$ #" + "###S $ H#$#####S $ S#H#####" + "######################H " + " ######H" + "----#H $ ####H H" + " #H###H####H $ H" + "$ #H H##$#H########H####" + " #H $ H $ H $ " + " $ ##############H $ H###H" + " $ $ H####H $ H" + " H###### H####" + " $ &H 0H0000" + "S###########################", //======<<< Level 012 >>>====== "S " + "S $ ------- " + "S @@@@@$ H" + "@@@S @HHHHH@$ H" + "@ S @HH $ HH@$ H" + "@ @@@@@H@@@@XHH0$$$ HHX$ H" + "@ @ $ H@ @@@@#@@@@@@ H" + "@$@H@@@@@ --- @ H" + "@$@H@ H@ ###### H" + "@$@H@ $ $ H@ ###### H" + "@$@H@@@@@@@@@@ H@ ###### H" + "@$@H-------- @ $ H@ ##$### H" + "@ @H $ $$ $ H@@@#@@ ###### H" + "@ @H@@@#@@@@@@ $ ###### H" + "@ &H 0000 @@@@ H" + "@@@@@@@@@@@H H@@", //======<<< Level 013 >>>====== "@@@@@@@@@@@@@@@@@@@@@@@@@@ @" + "@ --------- S@" + "@ # $H#####S S @" + "@$# H#----#S S @" + "@$# H$ HH##S S @" + "@$# -$H#H HH#S S @" + "@$# H$#H#H H########@" + "@$ H##H#H $$ H# $$ @" + "@$# $H# #########H#####$@" + "@$#H##### $# -------H# $ #$@" + "@$#H# ####H $ #$@" + "@$#H# $ $ #H#######H####$@" + "@ #H# H H $# @" + "@ #H###H########H#########H@" + "@ &H H $$ H $0000H@" + "@#@@#@#@###@@##@@#@@#@###@@@", //======<<< Level 014 >>>====== "S " + "S " + "$##########################H" + "$# -------------H---------#H" + "$#H $ $ $ #H @H" + "$#H H########H##H ##### @H" + "$#XH H $ H #H ##$# @H" + "$#X#H##### $ H ##H ### @H" + "$#$#H #H####H $##HH ## @H" + "$#$#H $ #H H#####H # @H" + "$# #####H#H $ H ##H @H" + "$# $ H##H####H $ #H @H" + " #H#####H# H H#######H @H" + "$#H0000 H $ H $&##H@H" + "$##########################H" + " H", /************************************************************ This levels already exists in Classic Lode Runner (level 120) //======<<< Level 015 >>>====== " S " + " S " + " H S H " + " ######H H------------H " + " # $ #H H 0 H " + " # #H H@@@@@@##@@##@@" + "@#@@#@@#@@#@@H#-----#X### #" + " $0 $ $ H# H #-- # #" + "#######X#####H# H#$$#$#H#$ #" + " ------------H# H####X#H# #" + "H0 H# H$ --HHH##" + "H############H######H $ H " + "H &H H## HHH" + "H$##### $ ###H## $ #H#$-- H" + "H## $ #####$ H$#####H##$ ##H" + "####################H #####", ************************************************************/ //======<<< Level 016 >>>====== (become to level 015) " S" + " $ $ S" + "H#########-H#########H S" + "H H H $ S" + "H $ ------ ####XXH" + "##H######## H" + " H H#########" + " H $ H#########" + "H########H $ H####$####" + "H H##################" + "H $ H " + "####H######################H" + "####H#$$$$ $$ $ $$ $$$$$ H" + "#$##H#######################" + "####H00000 &" + "############################", /************************************************************ Below levels already exists in Champisonship Lode Runner or Classic Lode Runner //======<<< Level 017 >>>====== "H--- #### $HH ######## " + "H $##$### $H $## # " + "H $####$## $H $##$H####### " + "H$######$# H$ -##$H ## " + "H######### $H -# H ## " + "H --$$#$$# H$ -#H $# " + "H$ ##$##$ $H -#H# H# " + "&H $##$## H$ -#H#$H#$H#$H# " + " #H ##$##$ $H -#H@@@@@@@@@# " + "0#H $##$## H$ -#H # " + " #H ##$##$ $H -######H##### " + " #H $##$## #H -##$ #H# $# " + " $H ##$##$# H - # 0#H# ## " + " #H ##### H ## ###H#### " + " H--- ##### #HHHHH### " + " S ", //======<<< Level 018 >>>====== " ---- SS0 " + " H #######S S###### " + " H##### # #S S# # " + " H# ##### #&SS # H#####" + "H#H### # #H ###H## H# # #" + "H# # # #H # H H### #" + "H# $# # #H#######H H# #" + "H# ##### #H ###H# #####" + "H# # # # ### #H## H####H " + "H##### ### H##### H# #H " + "H # #$H # #######H #H$ " + "H # ###### # # 0 # $H#### " + "#H###H# 0# # # # # H# 0# " + "#H #H# $##### # ##### # " + "#H #H###### ##### #X## " + "#####H # X ", //======<<< Level 019 >>>====== " 0$ " + " ########H 0 $ " + " 0 $ H#H#####H" + " $#####H H H H" + "###X### H-------H H$ H" + " H H #######" + " $ H H " + "###H#######H H--------" + "$ H 0 H $ H $" + "######### ########H ####" + " $ $ H " + "#####H###X###H $ H $ " + " H ##############H" + " H H" + " H $ & $ H" + "############################", //======<<< Level 020 >>>====== "#@#@@# S@#@@###@" + "##@@## S#@@###@@" + " @#@# $ $ S#@ @" + "H# @##@###@H##@ S#@ #@H @" + "H#@ @#@@###@H ## $S@ #@H @" + "H## @##@@H #@### $#@H @" + "H@##$ #@@#H ##@H$ " + "H#@#### @##H -------#@@#H" + "H @@#@##$ #@H $ #@ H" + "H H## @@#@@#@ #@ H" + "@###@@H@## $#@ H" + "#@#@@@H#@##$ 0 $###@ H" + " $ H@@###X@@@@@@X###@@H##" + "H#@###@@ 0 & H@#" + "H@###@ H##@@#@@##@#@@##@@@#" + "H $ H 0 @#@", *******************************************************/ /******************************************************* * This level seems impossible to complete so change it * *******************************************************/ //======<<< Level 021 >>>====== (become to level 016) "S #########################" + "S& # # ------ ############ " + "H@ #H# H #### - 0 X" + "H@0#H#H#H H @###########$" + "H@ #H#######H $@#####-#####" + "H@ #H#$####H#H @######-####$" + "H@ #H#####H@#H ###$#-#$###" + "H@ #H # H######H ####X####$" + "H@ ###H#$H## $ H ##" + "H@ #H#X##########@ $" + "H@ ###H #H#####@ H#@@#H#" + "H@ #H####H$ #H# $ @ H# $#H$" + "H@ #H H#######SS####X####" + "H#X#######@@@@@@@@@@@@@@@#@@" + "H 000 " + "H@#@#@#@#@#@#@#@#@#@#@#@#@#@", //change some solid brick to normal brick 1/8/2015 //"H@@@@@@@@@@@@@@@@@@@@@@@@@@@", //original: all solid brick //======<<< Level 022 >>>====== (become to level 017) " # " + " ############H#S # " + "H#@ $$ 0 #H###### H###X#" + "H#@###@@@##H#H H@#$H #" + "H#@- #$$ #H#H & H@@##H #" + "H#@ ####H #H#######H --###X#" + "H#@@#$$ H #H #H @ $ " + "H#@@##### #######H###H @@@@#" + "H#@$ #H# H " + "H#### $ H# H H# " + "H# H#####@@@@@@##H#####H##" + "H# H# #H@@ H# # #H#$" + "H## H#0 #H@@H####### $ #H #" + "##H###### #@@H# ###X#H# " + "##H# # H# $ #H#$" + "##H#$$$ ######X############" /******************************************************* Below levels already exists in championship Lode Runner //======<<< Level 023 >>>====== "############# " + "#& # # $ # H ----------" + "# #$ H# $#-H H " + "#####H#######0H SH ####### " + "# #$H# #$ # H S H $###$## " + "#$ # H#$ #-HS H #$####$ " + "## ##H####### H $###$## " + "# $# H# $#H # H #$####$ " + "# $H# #$ # H $###$## " + "#####H####### H #$####$ " + "#--# H#--# # H " + "#--# H#--# 0# H#########" + "############# H# H# $#" + "#H # # H#########" + "#H0 # $ H# H# #H $#" + "############################", //======<<< Level 024 >>>====== " & S" + " ##H#H#######H#########H###S" + " H #H# H #H# H # S" + " ##H##H## #H####H##S#######S" + " H S H H H H H S" + " #H H# ##H #H# #H # H- " + " # H H - #H ### #H###H " + " #H# #H##$#H#H # H #H " + " H# #H#-H# H-#H# H #H#H " + " H H####0## H #### H#H " + " #H - #H#- # #H - H#H " + " #H # H#### H# H H#$## H#H " + " H H#H---## #H HH#---H#H " + " ##H H H #H# # H#####HH " + " ###H- H----H---##-----H " + " 0 ", //======<<< Level 025 >>>====== "& - -- ---- # $0$ $" + "0#H H@H $ @H#$#$# #H#X# H" + "@#####@H# ##H# # ####HH## H" + "@#####@H # #H#-- #$##H ##- H" + " H H########H $ H" + "H######XH H--# #$## ## ##" + "H# #H #H# $# H#$ ###@@ ###" + "H#$ # $#H## # H###$H $" + "H ##### H # H#$##H- $ #H##" + "H# H# #H #0#H###$H ## $H#$" + "H#$ # $XH X#H#$# H#$H# # " + "H ##### H ##H# 0#H#HH####" + "H# # #H -H $ #HH ## $" + " #$ # $#H H $ # #H H##" + " #######H H # #@HH H## H#$" + " H# # #@ H H##$H# " *******************************************************/ ]; ================================================ FILE: lodeRunner.win.js ================================================ var endingLoadFinish=0; function loadEndingMusic() { if(endingLoadFinish) return; createjs.Sound.alternateExtensions = ["mp3"]; createjs.Sound.registerSound({id:"win", src:"sound/ending/win.ogg"}); createjs.Sound.addEventListener("fileload", handleFileLoad); function handleFileLoad(event) { // A sound has been preloaded. //console.log("Preloaded:", event.id, event.src); endingLoadFinish = 1; } } function endingMusicPlay() { if(endingLoadFinish) soundPlay("win"); } function endingMusicStop() { if(endingLoadFinish) soundStop("win"); } ================================================ FILE: sound/Theme/fallSound-C64.js ================================================ //http://jsfiddle.net/s3mrkayp/1/ var audioContext = new (AudioContext || webkitAudioContext), osc1 = [] wide = 0.05; start = 1460 step=20 for(var i = 0; (start - i * step) > 0; i++) { var osc = [] osc[i] = audioContext.createOscillator(); osc[i].connect(audioContext.destination); osc[i].frequency.value = (start - i * step) ; osc[i].start(i*wide); osc[i].stop((i+1)*wide); } ================================================ FILE: tools/LodeRunnerDiskParser.cpp ================================================ /********************************************************************************** Read Lode Runner APPLE-II DISK IMAGE to extract all levels Each level is a 28x16 tiles, Lode Runner has 8 different tile types. Two additional tiles are used to represent the player and guard start positions. (reference : http://baetzler.de/c64/games/loderunner/) APPLE-II DISK data format: Since there are less than 16 different tiles, it is both convenient and efficient to store tiles as nibbles instead of bytes. Thus the 448 tiles of a Lode Runner level can be represented in 224 (0xE0) bytes The tile data for each level use 256 bytes (0x00 ~ 0xFF), level data starts at offset 0x00 to 0xDF, and reserved 0x20 bytes. (0x00 ~ 0xDF + 0x20 = 0x100 (256) bytes) The tiles are stored in left-to-right, to-to-bottom order, with a small twist: the low nibble of each byte encodes the left tile and the high nibble encodes the right tile in each byte of data. level start from disk offset 0x3000, Lode Runner Level value to map (10 different types): value | Character | Type ------+-----------+----------- 0x0 | | Empty space 0x1 | # | Normal Brick 0x2 | @ | Solid Brick 0x3 | H | Ladder 0x4 | - | Hand-to-hand bar (Line of rope) 0x5 | X | False brick 0x6 | S | Ladder appears at end of level 0x7 | $ | Gold chest 0x8 | 0 | Guard 0x9 | & | Player 2014/10/18 add support dump Revenge_of_Lode_Runner disk 2014/10/18 add support c64 codes **********************************************************************************/ #include #define MAX_TILE_TYPE (sizeof(tileType)/sizeof(char)) #define MAX_LEVEL_ROW (16) #define MAX_LEVEL_COL (28) #define READ_LEVEL_DATA_SIZE (256) #define ONE_LEVEL_DATA_SIZE (224) #define PLAYER_ID (0x09) //#define APPLE_DISK_NO (5) #define C64_DISK_NO (1) #ifdef APPLE_DISK_NO //APPLE-II #define MAP_START_POSITION (0x3000L) #if (APPLE_DISK_NO == 1) #define FILE_NAME "./apple2.dsk/Lode_Runner_Apple-II.dsk" #define MAX_LEVEL (150) #define TITLE_NAME "Classic Lode Runner (Apple-II 1983)" #define DATA_VAR_NAME "classicLevelData" #elif (APPLE_DISK_NO == 2) #define FILE_NAME "./apple2.dsk/Lode_Runner_Championship _Apple-II.dsk" #define MAX_LEVEL (50) #define TITLE_NAME "Championship Lode Runner (Apple-II 1984)" #define DATA_VAR_NAME "champLevelData" #elif (APPLE_DISK_NO == 3) #define FILE_NAME "./apple2.dsk/Revenge_of_Lode_Runner.dsk" #define MAX_LEVEL (25) #define TITLE_NAME "Revenge of Lode Runner (Apple-II 1986)" #define DATA_VAR_NAME "revengeLevelData" #elif (APPLE_DISK_NO == 4) #define FILE_NAME "./apple2.dsk/Lode Runner Fan Book (4 Levels).do" #define MAX_LEVEL (4) #define TITLE_NAME "Lode Runner Fan Book (4 levels)" #define TITLE_NOTES "Image got from: http://ww3.tiki.ne.jp/~maclr/lr/lr.html" #define DATA_VAR_NAME "fanBookLevelData" #elif (APPLE_DISK_NO == 5) #define FILE_NAME "./apple2.dsk/MYLODE.DSK" #define MAX_LEVEL (54) #define TITLE_NAME "Peter Ferrie's My Lode" #define TITLE_NOTES "Image got from: http://pferrie.host22.com/misc/appleii.htm" #define DATA_VAR_NAME "FerrieLevelData" #endif #elif defined C64_DISK_NO //C64 #define MAP_START_POSITION (0x2A00L) #define START_GOOD_BYTE 0x0D #define START_SKIP_BYTE1 0x4B #if (C64_DISK_NO == 1) #define FILE_NAME "./C64.dsk/Professional Lode Runner (1985)(Dodosoft).fixed.d64" //#define FILE_NAME "./C64.dsk/LODERUNNER[amg].fix.D64" //#define FILE_NAME "./C64.dsk/Lode Runner (1983)(Broderbund).d64" #define START_ALL_ISGOOD 1 #define MAX_LEVEL (200) #define TITLE_NAME "Lode Runner I (C64)" #define DATA_VAR_NAME "c64ver1" #elif (C64_DISK_NO == 2) #define FILE_NAME "./C64.dsk/LODERUN2.D64" #define MAX_LEVEL (21) #define TITLE_NAME "Lode Runner II (C64)" #define DATA_VAR_NAME "c64ver2" #elif (C64_DISK_NO == 3) #define FILE_NAME "./C64.dsk/Atlantis Lode Runner (19xx)(-)[cr TBC].d64" #define START_SKIP_BYTE2 0x48 #define START_SKIP_BYTE3 0x4D //Level 140: BAD SECTOR #define MAX_LEVEL (150) #define TITLE_NAME "Atlantis Lode Runner (C64)" #define DATA_VAR_NAME "c64Atlantis" #elif (C64_DISK_NO == 4) #define FILE_NAME "./C64.dsk/LODERUN4.D64" #define MAX_LEVEL (200) #define TITLE_NAME "Lode Runner IV (C64)" #define DATA_VAR_NAME "c64ver4" #elif (C64_DISK_NO == 5) #define FILE_NAME "./C64.dsk/LODERUN5.D64" #define MAX_LEVEL (200) #define TITLE_NAME "Lode Runner V (C64)" #define DATA_VAR_NAME "c64ver5" #elif (C64_DISK_NO == 6) #define FILE_NAME "./c64.dsk/Lode Runner (1983)(Broderbund).d64" #define START_ALL_ISGOOD 1 #define START_SKIP_BYTE2 0x02 #define START_SKIP_BYTE3 0x03 #define MAX_LEVEL (176) #define TITLE_NAME "Lode Runner Fans version (C64)" #define DATA_VAR_NAME "c64Fans" #elif (C64_DISK_NO == 7) #define FILE_NAME "./C64.dsk/LODERUN_CHAMP(FF).D64" #define START_ALL_ISGOOD 1 #define DATA_XOR_VALUE 0xFF #define MAX_LEVEL (50) #define TITLE_NAME "Championship Lode Runner (C64)" #define DATA_VAR_NAME "c64Champ" #endif #else //Error #error Please define "APPLE_DISK_NO" or "C64_DISK_NO" #endif char tileType[] = { ' ', //0x00: Empty space '#', //0x01:Normal Brick '@', //0x02:Solid Brick 'H', //0x03:Ladder '-', //0x04:Hand-to-hand bar (Line of rope) 'X', //0x05:False brick 'S', //0x06:Ladder appears at end of level '$', //0x07:Gold chest '0', //0x08:Guard '&' //0x09:Player }; int allZero(unsigned char *levelData) { int i; for(i = 0; i < ONE_LEVEL_DATA_SIZE; i++) { if(levelData[i]) return 0; } return 1; //all zero } int goodLevel(unsigned char *levelData) { int i; unsigned char leftTile, rightTile; int allZero = 1; int playerNo = 0; for(i = 0; i < ONE_LEVEL_DATA_SIZE; i++) { #ifdef DATA_XOR_VALUE levelData[i] = levelData[i] ^ DATA_XOR_VALUE; #endif leftTile = levelData[i] & 0xF; rightTile = levelData[i] >> 0x04; if(leftTile >= MAX_TILE_TYPE || rightTile >= MAX_TILE_TYPE) { return 0; } if(leftTile == PLAYER_ID) playerNo++; if(rightTile == PLAYER_ID) playerNo++; if(leftTile != 0 || rightTile != 0) allZero = 0; } if(playerNo != 1) return 0; return !allZero; return 1; //OK } void dumpTitle(void) { printf("//************************************************************\n"); printf("//* All levels extract from: \n"); printf("//* %s DISK IMAGE\n",TITLE_NAME ); #ifdef TITLE_NOTES printf("//* %s\n",TITLE_NOTES ); #endif printf("//* by Simon Hung 2015/01/05\n"); printf("//************************************************************\n\n"); } void dumpLevel(int level, unsigned char *levelData) { int row, col; unsigned char leftTile, rightTile; int offset = 0; printf("======<<< Level %03d >>>======\n\n", level); for(row = 0; row < MAX_LEVEL_ROW; row++){ for(col = 0; col < MAX_LEVEL_COL; col+=2){ //one byte contains 2 tile leftTile = levelData[offset] & 0xF; rightTile = levelData[offset] >> 0x04; printf("%c%c",tileType[leftTile],tileType[rightTile]); offset++; } printf("\n"); } printf("\n"); } void dumpLevel4JavaScript(int level, unsigned char *levelData) { int row, col; unsigned char leftTile, rightTile; int offset = 0; printf("//======<<< Level %03d >>>======\n\n", level); for(row = 0; row < MAX_LEVEL_ROW; row++){ printf("\""); for(col = 0; col < MAX_LEVEL_COL; col+=2){ //one byte contains 2 tile leftTile = levelData[offset] & 0xF; rightTile = levelData[offset] >> 0x04; printf("%c%c",tileType[leftTile],tileType[rightTile]); offset++; } if(row < MAX_LEVEL_ROW-1)printf("\" +\n"); else if (level < MAX_LEVEL)printf("\",\n"); else printf("\"\n"); } printf("\n"); } int main(void) { FILE *fp; unsigned char levelBuf[READ_LEVEL_DATA_SIZE]; unsigned char *levelData; int curLevel = 0; int readSize= 0, isGood = 1; unsigned long curPos = MAP_START_POSITION; unsigned long dspPos = curPos; if((fp = fopen(FILE_NAME, "rb")) ==NULL) { printf("Open file \"%s\" failed !\n", FILE_NAME); return 1; } if(fseek(fp, curPos, SEEK_SET) != 0) { printf("Fseek error ! @%d\n", __LINE__); fclose(fp); return 1; } dumpTitle(); printf("var %s = [\n", DATA_VAR_NAME); while( #ifndef START_ALL_ISGOOD isGood && #endif curLevel < MAX_LEVEL && (readSize = fread(levelBuf, sizeof(char), READ_LEVEL_DATA_SIZE, fp)) == READ_LEVEL_DATA_SIZE ){ levelData = levelBuf; #ifdef START_GOOD_BYTE unsigned char startByte = *(levelData++); switch(startByte) { case START_SKIP_BYTE1: #ifdef START_SKIP_BYTE2 case START_SKIP_BYTE2: #endif #ifdef START_SKIP_BYTE3 case START_SKIP_BYTE3: #endif #ifdef START_SKIP_BYTE4 case START_SKIP_BYTE4: #endif //printf("SKIP0 - %x\n", dspPos); break; case 0: //good if not allzero if(allZero(levelData)){ //printf("SKIP1 - %x\n", dspPos); break; } #ifdef START_ALL_ISGOOD default: #endif case START_GOOD_BYTE: #endif if((isGood = goodLevel(levelData))) { //dumpLevel(++curLevel, levelData); //printf("%x", dspPos); dumpLevel4JavaScript(++curLevel, levelData); } #ifdef START_GOOD_BYTE break; #ifndef START_ALL_ISGOOD default: isGood = 0; printf("%x", dspPos); break; #endif } #endif dspPos += READ_LEVEL_DATA_SIZE; } printf("];\n"); fclose(fp); } ================================================ FILE: tools/c64.dsk/Extended Championship Lode Runner (1985)(Doug Smith & Dane Bigham)[cr The A-Team].d64 ================================================ KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK|͌ߌίϯΈȯȠ٠FώȎȎȎnwwϿߎߪԠTa#CMn~ݝݝ̌̿̌ȌΏψȮΏΏˏȎǠԠgψϻӠϠ٠T ϙyϻތȌ،zȌ،Ȍ،Ȍ،Ȍ،Ȍ،Ȍ،ȌƠ٠b ټ˝|ǝٜgɝٜɝٜ鮙ɝݜ鞙鞙ݙəəΙ˛Ιؙ鞙ə˜əɜ͙ݙɜ蜙əɎޝȠȠRϿλˎ̎ݪڭݻ˻݈ޏʾʈŠӠŠàR~wΈŠ̠٠ΠR|oĠW[ΌώώόߎˎߏόΎ߈}ώόӠ̠3ɠYݭҠӠ)ϠW쌇lΠTwݝ̏ϏϏϏϏϏŠ٠Vݻww݌͈݌̠ͮĠv]oϻͻϻͻίΏύίϏΏͯΏ˯ΏΏΏΏ͏ϏϏϏϏΏՠˠ%Z˻~n~ŠϠŠǠWKKKKKܟܟoܟȈȈȈȈܼȈȈ܏ҠWϠDώϙώԠˠSk߼޿ݬجﮜ戴܌ ƠĠHɠ_o©ԠԠ` \Rwwλ߻޻ۈ޻μۈΎΎl̠٠]f̌όόόΠŠƠWϙwωϙϙəəޝϙϙޝ̈oԠˠNΠV}}}lԭԮIQ˻xφ|˻xϏx˻Ϗ˻Π Sl̏{̏{̏̏̏̏ˠb33˼o}ӠҠq ggg'WyώώώɠҠ@Q݌ϋݻϽϏߍߟoϏǠנU wwwwwwwϻΪΪ˪xxxxxϻm̠ĠBY~wϠƠpPﻻه٭Ύ٪٪܍ٮϻŠҠQ KKKKKlȎ׌}·ӠŠ wwͩݝ˻oǠŠ"àWϏ̌Ҡ͠U興興興쏎ӠGR܌܌܍܌݌܌Ȍ͇̌܌͌܍܌܌܌܌͍܌܌݌̌܌݌܌}݌̌݌ԭ̠eǠR˻˻ȏ˻˻˻}ȏ˻ˋmݍĠˠZn쌈|̠ fT߈߈wՠĠ͠X̜ɜɜɜɜɜɜɜɜx~ɜɜɜ̪ɜ̮l|ӠQ왙m}ŮΠwY[gޞҠΠ͠ȗUλϻκΊκΊܪκΊܪκȫΊܪκκܪκȻܪ̻}΍̠7]m،،͈ȍ،،ȍ،ؼ{}}ތ،ݍȍ͈،ȍތݍLjĠӠ_ƠS̿ώΎΎΎΎΎΈ̎Ϡ٠fĠ^~xxxλΪ؈܈Ԡ PoΎϏΎތތތͼӠ%QXKKKKKo~ΠȠD-AAACAAmyޝ؍͎ۻ~ۻ؍ۻϟȟϻР̠7475UKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK [[[\\\\[XiXY[YXPO 9ŠΠ̠yIF Ȍ 팩L V;O P  LީOP 9L`m  m  m  m  K    pP  @   @ @p @p`P@0 KKKKKKKKK       KKKKKKKKKK ՠ3"IҠ37Ҡ3Š32 7Š2 ϸ1 QŠ1161195͠0DˠƠŠI"U9DANE BIGHAMffffKKK ҠҠ  ! Ԡ*)͠ 21àjKKKKKKKKK STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~aDDDDDDDDD D D D D DDDDDDDDDDDDDDDDDDD D!D"D#D$D%D&D'  0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p`@`@`@`@!   $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,04 @@@@`2C8C nmmC EQDD`2ǂ@@@`2 "?N?o=E EQDUUUQCUU*C F ((C@`5 7;^~ CCC  L C +AUUU@UU( ( CÂ@`+ 8<66x8 D 9"@x886 6E@UA( (C( @F`+ @E`20 8 0l 6 6 0 l8  %UUUUUU(( (C(@҂`D!LD33'3-UD"D" U3 "D33D3 31DD 3DD3 DD3 DD3 DD3 D / f6f-UUD626 0 ` Db  Df 606D6/0`"f&UUf`06260 6 f `f60`f`f60`f`060` `060``06 0``06f6f3U6U6U6 6Ufb f`Uf*Uf`f606Df6fDf80f`fI ՠ·ՠ·Íՠ·čՠ·ư pADDa`@q3 q303 qE"Cq 71D1"D100  ŠR00p0p106103007003070307030703070 300H0`   $"2gok== M=h0ڏN`1ߥ>k<9cK !#%' âââ â     pP   @  %   %   J[[[\\\\[XiXY[YXPO 9HDC yIF D(D)D*D+D,D-D.D/D0D1D2D3D4D5D6D7D8D9D:D;DD?@@@PPPPPPPPP P P P P PP! 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 8<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|C C daaCAACDD`2@@`2 C8 C naaC AADD`2 {[7CC[DEP +AQ@@A"  ( (@@C@@`4   {7RW4W\ۛ;*U]slnUWV=VW;)igY򜪩Vus%)J 1 ̒ 0 1/@0,ȱ 1 ̒ 0ȱ 1/11L`/`-. -H - 3/%!  ̒ - --.H .ȱ 3/%!  ̒ .ȱ  ``hxp` 5RL,-OP7 OP y dL, 8RP ˒ O L N L  ڎ `OLhPvۋ-Ѝнpp Љ ߈ d Ջ ЍL@ "Q@C ;;;;<<<<;i;A [[[[\\\\[XiXY[YXPO 9HDC yIF Ȍ 팩L V ې.|ɠ'ɾ!ɮɨɩɯ ɭɼ`8|`ɍ Q@ ڎO` O`PO`PO& &`hh  HH`x`Ԡ8X`#! "# ڎ ,!"# ڎ! " !"LqH# ڎh`)I[I1 "` # !A = "'A o[[ "` o[[[ "` " b~Ȍg# [\ ih i# \\] ih iC g"п`,H#9B0<#! 8!i )h`  !#$%& K%H)h .%)$` ˒ `$%m$m%$`%C R.%$m$m% I`` Т@@``8Tp8TpIG I G !oJJV0KO0P  ϔ ϔ d z i X G 6`                      J ? "*" """ """ "CCŰ׍ĠұĠҲCCC׍``   zqq@\ O}w()FYNɪL!b`XUWȱUXUiUViVW)}WDJ!o}X`!"%*&( 1L~(#ȹ~ ``)(`hh8` ``hh8` ``>    z@Ҳ[ SSS-7CO[h hPP5 D uvp J i  PP_)(`hh8` ``hh8` `e<6e<g< DJ#uj귍hI  aUL@ kU8  L  Q^R(jQ0l^l\  wUuW ԧ H h@ [_ %QSIRb_L`LL..` # đȀ#`A; ˒  '0#8 PO PO yLd`1-P ˒ O  PO yL؏``` LL` LL``hxpPP ˒  Pؘ`Phx L,L ڎ R0L `HE Љp`OhPޘ39 ߈9 ؏L : ߈: ؏гh`P O  ڎp ڎ;O P  LީOP 9L`m  m  m  m  ةOP  s   s   s   s L) DJ#`dd  `i;Q@ ڎO` O`8u`ɰɺ)(`8`# #@$PO y A\%`& = "A# L%%[%&[ "` L%%[[%&[ "`? # !A = "A' o[I1[I1 "` o[I1[I1А ЍLݐ-ЍХ i2Э)'hh` @    5H!) =hg^m_s [] `@@D Hh` !,7BMXcny #(-27?@ABCDEFGHIJKLMNOPQR s9iP@R08OXT fi9 trXʽ= nə nLbșLb s f QOP 9Ġ٠Š͠J ȠӍFC ̠ōDHEH!w(  Ls (  PR0Q   C&O QHIh &&O :l :l :l :l` (08@Hɂu `  ,3WA4ZSE5RD6CFTX7YG8BHUV9IJ0MKON+PL-.:,\*;=/1 -2 Q` lR03 Qs fOP 9EӠEI ՠŠ # P 9ϠՠԠϠנҍԠĠٯΩ n(8` P 9٠ŠΠŠ̍ҠΠҠЍDΠĠJE OT fi lN n>8鰝>>m?xzx?m@x{x@  A74+ ̒   Ly  d0  L ˒     L  }! z`% ]{` { `& |`"Ly*L u +``-(), ̒ - -) - Ԇ, R< <( t)X<e)Lpt) )<R< <)    9) s  ) s  ) s  ) s  (( LsLtRt`t` (08@H '4AN[huCŠҠ΍EӠE  %Lv Lv  Lv Lv UO P 9ҠŠӠŠԠҍҠҠ٠ōCS мOT di(=     n # #mAx|xAm>x}x P 9נӠҠŠԍĮŠԠΠҍΠĠԠ׍Ġ̠ԠϠčDӠΠӠōIH$Ԡ٠ n(8`ɩL{L| ˒ ˒  `  d       L ˒ ȱ `  d   ȩ     L ˒  Q{LN{L|T 2 ٤ 2 Y  d  T T cb}Hʤ yh dTc}HʆOP yh ؏T{}P ڎT`ȄPO ڎTʽc}H yh d8`LLD} T 2ȱ פ 2ȱ Y }WDJ"}X`!"%*&( 1L~(#ȹ~# ~H~H`צ#`N` KZ?L}LbN`ʍL}ˍL}L}L}9I9L})M9 &``܅)) !%)LL` LL`ȆOP O ڎ P ڎPPO8`)Z N`)Z  ȌL}!66625F5 ؀5`FGGGG?G??E++,0126()*-./534  ˒  N QMP ˒ O LB PO y ؏  ߈ ؏L ߈ dt ߈ ؏L ؄ HH`E50L#눹   ߈ d    L ߈ d % ?   N    u ߈ ؏L ˒ ȱ   L ߈ d % ?  ȱ N     u ߈ ؏L,+)( ˒ - )- - Ԇ,,+-L`.(), ̒ . .) . Ԇ,,+)( ˒ . ). . Ԇ,,+.L ), ̒ ( () ( Ԇ,,+)( ˒ ( () ( Ԇ,,+`8`8`8i`8id`1`10 ˒ 0 10. 1 ˒ 0  1/OM0<1 ̒ 0ȱ 1 ˒ 0ȱ  1/ 1L`/`1`10 ̒ 0 1 ˒ 0 b, ??? 9ss289;360?8?8~`~cpqpsv66676 p0 `f<1a 0`[ s%Zʍ oe V n oe*9VS/.*(),p.p5ō)@ũLb  g b_--L?a/. d/x@8/Ԡ,Ԙ /XR0 3LbL`JLkb8*/.  Ȍ* q Wu ֓(P)l(ɪ ejAɔTfЩJL)Р  Р L` Э(ɍ Fg>fТmb234b  x' d ے Jl $ Lg`Lb sLbLb `kLwbLg` &&.DGIJKLMNOPQRSTUVWX f Э) Щ'''ccc c c'c(Lb!!'| hA700p0)Щ ȱi 5Ii1ܭ65`23`23332`2 }~x}8/ȱ}m3ȱ}0m3ȱ}/}i}~i~X`-|)ԭ|LeS8 |L,e*8|*| c@)L1H)h s fOP 9C̠ΠōHEE  OOɠL5g    OO    O :l :l :l :l )iɠLf` (l lQ Df Q 狩PO 9ӠŠHHFүӾϠF!P O di j >j Y YL^g=ȭQȭȭ ȭ ȭ ȭ  l Zn DfNLb W f 狩Q;L` j l Zn` Y Y`Y=<(<= n(?Z ōDCHG!үӾϠ PO di j Y YLejiH8     Ai l Zn h mW fV Q 狩@Q wd; lL` @( Qs fOP 9ӠӠŠ n`J nU Qs fPO 9ˠРԠĮԠ٠ n(L`R0J8 *mWDJ f`2Lm2Z8ENDANE BIGHAMTSP;' Zn lR0J3 I  Znhp.p %R)Y/m%%%R QPO s f 9ŠΠŠӍԠŠҠˮK--L``R0X` 0) 18 ^pi0_pDJ#i i0[p i0\p  YRp  BPй ˒ O - P0 pg8蘝`Phpx / !P  OOPP­:8`W f @``@Q cq QLqP O  OOPP` Wu    T nM tmX*.  $     ` $) tXi"Or") tX<<    9  %2088 THE ATEAM x4Ư8W_L S"****).) 6 ک7XLd\ruOQ``L6< =` 6LS = 6`e毠e`  HHEHPFHFPF`HHC*DUU?CWW*CUUCWW*CUUCWWCկD]]J*DUUFHDCFjHF`HH`XDHCDCD6CPD`HH`REME UU]]GjHE`%0 ZnDښC Zh2)~:껯ﻬCM n~z?ښPDUUDUU[ UF %U{뮻ﺮ*CUCU뻮껫ꪺCWԞ CU+yWCj*C 5U:{*UWꮪ*UV몪꫺꫺몮UUUVꮪ Т00 1iiiiץɠiLЭL```9 '`) !G %Yx5L  00      00000`C CC CCC C C CC CC CC C CCCCC CC { ЩݩЩȍЩЮ??>><|C S??>><|?C!c>88?X|> ?~8 >>|0x88><?<8<x8x8x~<8?8x88"q?|>?|>}|>||>>|>||>>||| ???(??? ?D SL6 D d`CCDCDCDCC CDڪDC絪GFDHDF__jZEDjZDEED jjDDDDPD`HHHHCCCzzC??ECHC~{EjCHEC _zzD kkEZCH+kjC UUj꺺VW:ꪾꪻ믻ﺮ믻ﺮ FUUW﫾뾯 FUUUUUnꮪUUWUmVUnUVUV Ѝ!Э) Т)ݭ Э 8ТrٝC HCM #EI O!;Щ=Щ؍Щݩ!Э ЩݩЩȍЩЩ7X DC + L -L`f ^/    ?x;8 T;X|< ?8>8<x8g|<>|?<8?p?qpqpp<?p?7/> |?||j-C~ !8o? #$??+??? ??? 0 ? ????10? ??A*|ASS PRESENTS:WE LOVE 1103 ANTIRAM JEDI2001OLEANDER2703 OTDGCS SNOOPY AND ABC EXT. CHAMP. L.R.b EXTENDED bb CHAMPIONSHIP bb LODE RUNNER bcccccccccccccc cccccccccccccc 11 cccccccccccc 27 cccccccccc  INSTRUCTIONS THE A-TEAM 1985KTHE A-TEAM 1985################# THIS VERSION ## RUNS ON ANY ## COMMODORE 64 ## WITH OR #11)# WITHOUT (!) #27# SPEED-DOS! #KK################ګ ############## 23 ############ INSTRUCTIONS1127KK`U@@@@L{}˄͢ʆ̠Mʠ0ȅ Lʈ LL0ȄȠQjȑ`tt t tKKKK. 2065 -L`FFFRTKKK %2088 THE A-TEAM 1985 x4Ư8W_L q"****).) 6 ک7XLd\ruOQ``L6< =` 6LS = 6`e毠e`  HHEHPFHFPF`HHC*DUU?CWW*CUUCWW*CUUCWWCկD]]J*DUUFHDCFjHF`HH`XDHCDCD6CPD`HH`REME UU]]GjHE`%0 ZnDښC Zh2)~:껯ﻬCM n~z?ښPDUUDUU[ UF %U{뮻ﺮ*CUCU뻮껫ꪺCWԞ CU+yWCj*C 5U:{*UWꮪ*UV몪꫺꫺몮UUUVꮪ Т00 1iiiiץɠiLЭL```9 '`) !G %Yx5L  00      00000`C CC CCC C C CC CC CC C CCCCC CC s ЩݩЩȍЩЮ8 T;X??>><|C S??>><|?C!c>8|?<8?~8 >>|0x88><?<8<x8x8x~7/>?|>?|>}|>||>>|>||? #$ ???(??D SL6 D d`CCDCDCDCC CDڪDC絪GFDHDF__jZEDjZDEED jjDDDDPD`HHHHCCCzzC??ECHC~{EjCHEC _zzD kkEZCH+kjC UUj꺺VW:ꪾꪻ믻ﺮ믻ﺮ FUUW﫾뾯 FUUUUUnꮪUUWUmVUnUVUV Ѝ!Э) Т)ݭ Э 8ТrٝC HCM #EI O!;Щ=Щ؍Щݩ!Э_7X C ` L LTHE A-TEAM 1985! ЩǍݩЩȍЩЩ ƽvXLRUN 3LDe ^/    ?x;8?X|> |< ?8>8<x8g|<><8?8x88"q?p?qpqpp<?p? >>||||?||j-C~ !8o ? ???+??? ???  ???? 9ss289;360?8?8~`~c  <f`a1p0 `f<1a 0`[ s%Zʍ oe V n oe*9VS/.*  x' d ے Jl $ g b_--L?a/. d/x@8/Ԡ,Ԙ /XR0 3LbL`JLkb8*/.  Ȍ* q Wu ֓(P)l(ɪ ejAɔT ȱi e ?ϩ tLb./o78é- ԍԽ7!ԹFԽ8!逍ԹFLc8!ԹFԭ7 ԭ8.` ԍ`h}h~1x}2/ȱ}ȱ}ȱ}/}i}~i|*| c@)L1H)h ))(L1)&i9i&ީ=f F JxdXԩԢ0Ш ЩCC i`f LؙɠLf` (l lQ Df Q 狩PO 9ӠϠŠŠΠӍĠϠŠΠ٠׍C EүӾϠŠ( n( LVh ?L"i YL^gPO 9GŠΠFGŠHFGүӾϠF P O di AiLTg`Y=<(<= n(?Z u,Yɰɺ!ɍ9ɈJɕUɠ,YP]ɮU۰Q<= <<T<OLziT=ɠ8`8`O<O<Lj<TO<Lzi Y YLzi= )8`)iɠ` )8`)iɠ`N( Qs fOP 9ӠӠŠȍŠŠƠ̍ӮŠՠŠٯΩ n( nN n``čʍ Zn` n8`` s  `R0J&pl;' Zn lR0J3 I; mP ˒ OJS)DJ iSO  OOPP pR L:m`L`SPP OJ # D !#SSOOPPƩLZnHh)HL.oJL.o0 ? ????10? ?pqpsv666760?8!ty p600?c6630? (),p.p5ō)@ũLb    XUV; Q wd mW f lV :m./>fЩJL)Р  Р L` Э(ɍ Fg>fТmb234bj Y YL^g=ȭQȭȭ ȭ ȭ ȭ  l Zn DfNLb W f 狩Q;L` j l Zn` Y YLb (l l DfOP 9CĠĠ٠ōDCHG!үӾϠ PO di j Y YLejiH8     Ai l Zn h mW fV Q 狩@Q wd; lL` @ P O 9O wV`J nЍU n`J nU Qs fPO 9ˠРԠĮԠ٠ n(L`R0J8 *mWDJ f`2Lm2Z8ENDANE BIGHAMTSP hin`Hp.p Znhp.p %R)Y/m%%%R QPO s f 9ŠΠŠӍԠŠҠˮK--L``R0X` 0) 18 ^pi0_pDJ#i i0[p i0   0L``  LPй ˒ O - P0 pg8蘝`Phpx / !P  OOPP­:8`W  <    9 s9iP@R08OXT fi9 trXʽ= nə nLbșLb s f QOP 9Ġ٠Š͠J ȠӍFC ̠ōD LsLtRt`t` (08@H '4AN[huPR0Q   C&O QHIh &&O :l :l :l :l` (08@Hɂu `  ,3WA4ZSE5RD6CFTX7YG8BHUV9IJ0MKON+PL-.:,\*;=/1 -2 Q` lR03 Qs fO     n # # # P 9ϠՠԠϠנҍԠĠٯΩ n(8` P 9٠ŠΠŠ̍ҠΠҠЍDΠĠJE OT fi lN nɩL{L| ˒  A74+ ̒   Ly  d0  L ˒     L  }! z`%   L ˒   ̒  &8`    d ˒ &       `  8`  d ˒  T 2ȱ פ 2ȱ Y  d  T Te b}H yh dTc}HOP yh ؏PTo} ڎT`ȄPȄO ڎT ʽc}H yh d8`L  %&&'' W !!""##$$()FYN``܅)) !%) ) `*`"`?+(4~E~H~L~T~i~\~v~E* # đQ}#`zt ˒  `N  Idd Idh Idl Idp dPO PO y dGGG?G??E++,0126()*-./534 Љ0 LaLL ˒  E;8/ ̒    L ߈ d 0 9*  ˒   \p  YRp  BhJDJLp  Zn /mȌ n` pLb1Tp  Sp Lo bp  Lp2Tp    Sp L?p bpLp#U1:02 0 03 00  f @``@Q cq QLqP O  OOPP` Wu    T nM tmX*.  $     ` $) tXi"Or") tX<HEH!w(  Ls ( R< <( t)X<e)Lpt) )<R< <)    9) s  ) s  ) s  ) s  ((P 9EӠEI ՠŠCŠҠ΍EӠE  %Lv Lv  Lv Lv UO P 9ҠŠӠŠԠҍҠҠ٠ōCS мOT di(=>8鰝>>m?xzx?m@x{x@mAx|xAm>x}x P 9נӠҠŠԍĮŠԠΠҍΠĠԠ׍Ġ̠ԠϠčDӠΠӠōI H$Ԡ٠ n(8` ]{` { `& |`"Ly*L u +``-,+)( ˒ ( () ( Ԇ,,+`8`8`8i`8id`1`10 ˒ 0 10. 1 ˒ 0  1/OM0<1 ̒ 0ȱ 1 ˒ 0ȱ  1/ 1L`/`1`1 .ȱ 3/%!  ̒ .ȱ ..` # đȀ#`A; ˒  '0#8 PO PO yLd`1-P ˒ O  PO yL؏``` LL`LhPvۋ-Ѝнpp Љ ߈ dPP ˒  Pؘ`Phx L,L ڎ R0L `HE Љp`OhPޘ39 ߈9 ؏L : ߈: ؏гh`P C yIF Ȍ 팩L V;O P  LީOP 9L`m  m  m  m  ةOP  s   s   s   s L) DJ#`dd# ڎ! " !"LqH# ڎh`)I)(`8`# #@$PO y A\%`& = "A# L%%[%&[ "` L%%[[%&[ "`? # !A = "A' o[I1[IC g"п`,H#9B0<#! 8!i )А ЍLݐ-ЍХ i2Э)'hh` @    5H!) =hg^m_s [] `@@D Hh` !,7BMXcny #(-27?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~aDDDDDDDDD D D D D DD 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p`@`@`@`@!   $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptC8 C naaC AADD`2@@@@`2C8C nmmC EQDD`2ǂ@@@`2 "?N?o=E EQDUUUQCUU*C F ((@C@@`4  CCC  L C +AUUU@UU( ( CÂ@`+ 8<66x8 D 9"@x886 6E@UA( (EA(C (((C( @E`20 8 0l 6 6 0 l8  %UUUUUU(( (C(@҂`D!LD33'3-UD"D" U3 "D33D3 31DD D D,`06 DD6 Df6U6UfL D/ f6f-UUD626 0 ` Db  Df 606D6/0`"f&UUf`06260 6 f `f60`f`f60`f`060` `060``06 0``06f6f3U6U6U6 6UfύΠҍĠҮԬCĠӬCCŰ׍ĠұĠҲCCC׍``   zqq@\ O}w()FYNɪL!b`XUWȱUXUiUViVW)}WDJ!o})(`hh8` ``hh8` ``)(`hh8` ``hh8` ``>    z@Ҳ[ SSS-7CO[h hPP5 D uvp J i  PP_ptťܥm2<(-Py0\|e<6e<g< DJ#uj귍hI  aUL@ kU8  L  Q^R(jQ0l^l\  wUuW ԧ H h@ [_ %}RLRɍg^H8 ^hZLɍR LͲɊRR% QLܤͲ Z@ -^ ş\[Z QY\[Z8`l6Lş_Ȍb_Ͳ] )YVORSPANN A-TEA1  !"DDDDDDDDDDDDDDDDD D!D"D#D$D%D&D'D(D)D*D+D,D-D.D/D0D1D2D3D4D5D6D7D8D9D:D;DD?@@@PPPPPPPPP P P P P PP! 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`px|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|C C daaCAACDD`2@@`2 C@`5 7;^~{[7CC[DEP +AQ@@A"  ( (@C( @F`+{7k<9cK !#%'*,/258;?C  p@ Qp@ 5       pP   @   @ @p @p`P@0  )   5HDC yIF Ȍ 팩L V;O P  LީOP 9#L`m  m  m  m  ةOP  s   s   s   s L) DJ ` 0) 18 ^pi0_pDJ#i i0[p i0\p  YRp  BhJDJLp  Zn /mȌ n` pLb1Tp  Sp Lo bp  Lp2Tp     OOPP­:8`W f @``@Q cq QLqP O  OOPP` Wu    T nM tmX*.  $    ٠Š͠J ȠӍFC ̠ōDHEH!w(  Ls ( R< <( t)X<e)Lpt) )<R< <)    9) s  ) sPL-.:,\*;=/1 -2 Q` lR03 Qs fOP 9EӠEI ՠŠCŠҠ΍EӠE  %Lv Lv  Lv Lv UO P 9ҠŠӠŠԠҍΠĠJE OT fi lN n>8鰝>>m?xzx?m@x{x@mAx|xAm>x}x P 9נӠҠŠԍĮŠԠΠҍΠĠԠ׍Ġ̠ԠϠčDӠưՠİՠ·Ÿՠ·ՠ·Íՠ·čՠ·ư pADDa`@q3 q303 qE"C1000Spq0LQĠՠԠ ŠR00p0p106103007003070307030703070 300H0`   $"2gok== M=h0ڏN âââ â         %   %   J[[[\\\\[XiXY[YXPO 9dd  `i;Q@ ڎO` O`8u`ɰɺې.|ɠ'ɾ!ɮɨɩɯ ɭɼ`8)!Э)DJ 8 Рؙٙڙۈߠ'`1ŠҠˮK--L``R0X`  Sp L?p bpLp#U1:02 0 03 00    0L``  LPй ˒ O - P0 pg8蘝`Phpx / !P ` $) tXi"Or") tX<<    9 s9iP@R08OXT fi9 trXʽ= nə nLbșLb s f QOP 9Ġ  ) s  ) s  (( LsLtRt`t` (08@H '4AN[huPR0Q   C&O QHIh &&O :l :l :l :l` (08@Hɂu `  ,3WA4ZSE5RD6CFTX7YG8BHUV9IJ0MKON+ ҠҠ٠ōCS мOT di(=     n # # # P 9ϠՠԠϠנҍԠĠٯΩ n(8` P 9٠ŠΠŠ̍ҠΠҠЍD ΠӠōIH$Ԡ٠ n(8`ɩL{L| ˒  A74+ ̒   Ly  d0  L ˒   `  d   ȩ     L ˒   ̒  &8`    d ˒ &       ` O ڎTʽc}H yh d8`LLD} T 2ȱ פ 2ȱ Y  d  T Te b}H yh dTc}HOP yh ؏PTo} ڎT`ȄPȄO ڎT ʽc}H yh d8`L  % L}L}9I9L})M9 &``܅)) !%) ) `*`"`?+(4~E~H~L~T~i~\~v~E* # đQ}#`zt ˒  `N  Idd Idh Idl IdpȌL}!66625F5 ؀5`FGGGG?G??E++,0126()*-./534 Љ0 LaLL |[)rm=ZOus)rv\+]OU)eVnUnk_ΪS}sZ7yn\u=TYU]~:[%ϪTs)JKKKKK   L  }! z`% ]{` { `& |`"Ly*L?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{?N?o=EQDUUUQUUUU* ((@ 7;^~>>>????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 8<66x8 "@x886 6E@UA( (((( @|}~PPTAAAQ@AA"  (( Dl>{[7[DEPAQ@@A"  Ln Ԉ( 􈮠(No)L?o) Ԉ) Ԉ) Ԉ 􈠠) c   􈠠) P  ) P  ) P  ) P  (( L|n` (08@Hɂfo ` 3WA4ZSE5RD6CFTX@@@888nmmEQDD@@@( ٘l8``#8;  Šͭ\    N pGNo*.  $     ` ) No"")No    9No~mm n9iPO}l}l   $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  daaAADD J i  PP_䐠䐭)(`hh8` `=B ==B ߇ ==ɤ`=9:789 ;:*<8;;<k<9cK !#%'*,/258;?C   ߇L懭O cP  Lm  m  m  m  ةOP  P   P   P   P L) JJJJ`dd  `i;Q@ O` O`ې.|ɠ'ɾH( F LB =L=CJI( MB =L꒱=H( C LB =L=EJJ( NB =L:=G( E KB =L`=DHJ( NB =L=G(D  126()*-./534 ʄ0 L[}LL|f  E;8/g w    L{} ك  }0 9* f   u ك Lf v `܅)) !%) ) `*`"`?+(3yCy^yhykyoywyyyyy l# ex#`ztf  `N  cz cz cz cz cPO PO 4 P  p``hxp` /RL&-OP7 OP 4 L& 8RPf v O L N L  `OLhPvՆ-Ѝнp 팤ȱ Y 2z  z zT zTe vxH 4h TwxHOP 4h PTx T`ȄPȄO T ʽwxH 4h 8`L{  %&&'' !!""##$$() FYN`XUWȱUXUiUVi 0 b, 1g 0 1/@0,ȱ 1g 0ȱ 1/11L`/`-. -H f v - 3/%! g - --.H f v .ȱ 3/%!   g  &8`e u   2z f v z&  f v   Jz z z`g w  8` 2z f v z'  f v-) - ΁,,+)(f - )- - ΁,,+-L`.(),g . .) . ΁,,+)(f . ). . ΁,,+.L),g ( () ( ΁,,+)(f ( (Lwf  A74+g w   Lt 2z 0 z JzLzf v   f v  Lz  x! u`% qv` v `& w`"L    L ك  % 9   N    o ك Lf v ȱ   L ك  % 9  ȱ N   p φ ЍL@ D O"Q@C ;;;;<<<<;i;A [[[[\\\\[RiRS[SRPO ŠΠ̠EyI   f v  N QMPf v O L<} PO 4 f v  ك L ك n} ك L  }H}H`~?}/~0L#눹f v  ``` 2z 'N` LJzLJz` LJzLJz`ȆOPf v O P PPO8`!66625F5 {5`?????????+,0 p ʄ ك PPf  Pؘ`Phxu L&L  R0L`HE ʄp`OhPޘ39 ك9 L : ك: гh`Pf v O  VW)xWJJJJxX`!"%*&( 1Ly(#ȹz# zHzH`צ#`NN` NLxN` ?LxLaN`ʍLxˍLxLxLx!I!Lx9I9Lx)M9 &`g .ȱ ..` l# {#`A;f  '0#8 PO PO 4L`1-Pf O  PO 4L``` LL` LL``hx  LevLbvLwT 팤 ٤ 팤 Y 2z  z zT zT cvxHʤ 4h TwxHʆOP 4h TxP T`ȄPO TʽwxH 4h 8`L{LXx T 팤ȱ פ ) ( ΁,,+`8`8`8i`8id`1`10f 0 10. 1f 0  1/OM0<1g 0ȱ 1f 0ȱ  1/ 1L`/`1`10g 0 1f t*LPu`f v  ` 2z  z    Jz  zLzf v ȱ ` 2z  z  ȩ  Jz   zLzf   o ك L()f (  0`)L(*?*)f *  )g * LH*ĩ`*)f *  )g *  *ĩ`+,() 8 o +``-(),g - g8蘝`Phpx / !P  OOPP­48` @``@Q ^s Q! 쐠Pf v O  OOPP`Lv ك  }f v 2 9  f v  N   o ك L$ȹf v  L ك  }f v 3 9  f v  N L ~L~f v mjb{2{3{4ub  s~ :d  $ X \{P--La/. d/x@8/Ԡ,Ԙ /XL`JL.b8*/.  * l Ď(P)c(ɎLe  e ?La./o78é- ԍԽ7!ԹFԽ8!逍ԹFL{c8!ԹFԭ7 ԭ8.` ԍ`h}h~1x}2/ȱ}ȱ}ȱ}/}i}~i~}~ǥ~H}HX`1Ѝ66Lc))(L1)'i9i'ީύe D!Ѝ xdXԩԢ0'ЈȌ'ЩШ `e Рؙٙڙۈ`@ ]ݩ    ;L^`Lf 􈍾Ҡ k j pLxfLf 􈍾Ԡ kLiLf 􈍾Š knl Ϡ kYl 􈍠Š kl jl p 􈍠Π kl jl pLxfLf 􈍾ōӠӠΠ pLxf 'kLxf D j2 e@Q ᆢZ oLfOP uk l"#Pf v O#Q FZ# L*i#ȹk# kHkH` L*iPPOOOOМPPВPHOH p 'kLi jLi UphOhPZ`OPL*i iL*iɕ iLiŮ 􈍍Ԡ٠ϠŠ  )(@Q ᆩ rhLe DeHs e QOP ŠΠŠӠԠŠҠˮLjPf v O )`"!%${isiiiiiiiȘ cO~l}l }l~lO}l}li; ) l8U $     ` ) No"")No    9No~mm n9iPO}l}l )( YoɍUɈ }lF}lOLzmɕ}l3O}lLzmɮ ɠ۰}l Ԉ}l}l}lOLzm   􈠠) P  ) P  ) P  ) P  (( L|n` (08@Hɂfo ` 3WA4ZSE5RD6CFTX7YG8BHUV9IJ0MKON+PL-.:,\*;=/12 QTSP; Hqr phqr %Yl%%%`` 0) 18 Iri0JrJJJJi0 18 Fri0Gr  Y=r  BhJAJLr  p lȌ p`Lb1?r  >r Lq Qr  Lvr2?r    >r L*r QrLvr#U1:02 0 03 00 U+    0L``  Mr LrLPйf v O - P0 p:::::53281,0:53280,0F:::::" "m :::::" LODE RUNNER":::::::::" NOW LOADING":::::::" JOYSTICK IN PORT 2" (:::::::::::::::" ` e  p*9!/.*(),qr5ō)@ũʍLb    XUV; Q d ۆ2 e o./eЩJ9)Р | Р |L` Т>(PPܭ&Y/bL^`La nLaLbL^` &&.DGIJKLMNOPQRSTUVWX D e Э) Р`hP X`H)Щ ȱi685Ii1ܭ65`23`23332`2 }~x}8/ȱ}m3ȱ}0m3ȱ}/}i}~i~X`-|)ԭ|LdS8 |Ld*8|*| c@)L1ꮍ ,fˍɖ Ds e Q(OP 􈠠ŠҠĠҍүӠ٠Ӡ٠čP ľ klfݭf Lxf fHfH`)$! ff%gAggxh 􈍾٠ k,NٍĠˠҠҍĠӮ̠٠ĠŠՠŠٯΩ kl p jL fH phLxf 􈍾ҠŠōӠӠŠȍŠŠƠ̍ӮŠՠŠٯΩ kl p iLi iL fZ` DeHs e QOP ̠ӠΠĠԍԠĮϠՠȠύŠĠ̠ٯΩ  )(' ihLe p 'kL f jL f` DeH Qs eOP ҠԠĠύŠҠ }lB}lOLk}l/O}lLk?Lxf l}l }l}l}lOLk Lk~liOid i m  ` )(?Lxf`(( ٘l8``#8;  Šͭ\    N pGNo*. Lzm pə pLa Ds eOP 􈠠ŠҠȠӍӠ̠ō(  Ln Ԉ( 􈮠(No)L?o) Ԉ) Ԉ) Ԉ 􈠠) c  p;Pf v OJS)JJJJSO  OOPP r Lo`L`SPPf v OJ # #SSOOPPƩLpHh)HL\qJLqh ip`  RIK "G 2:::::" "n 7:::::A0A1:"LODE RUNNER1",8,1 <:::::A1A2:"LODE RUNNER2",8,1 F:::::A2A3:24576ALODE RUNNERLR2A  LODE RUNNER LODE RUNNER1Y LODE RUNNER2 KKKKKKKKKKKKKKKKK 88? `8 8 8?88 8?888?a8?8 + 888pqpqq|-  ?? ??+??????? ???p!ppx| `p1;f73q@3~3y30p`pg `ffcf1;f73q@3~3y30p`pg `ffcfKKKK/  88 (X?>88?>888?88>>88?8>>880888?>>8>>888?  ?>~(? ????0?????? 0??;1&p``a1f|8lq9=7@~3?3y33s|8lp=72p`bxx| 819g ffff`p߿KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK ================================================ FILE: tools/c64.dsk/LODERUN4.D64 ================================================ KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK DDDDDDDDDD10ADDDDDD0p0DDDD0pppp0CDD4CD4000 0sww7D4CDDsw7010p33017s1000 DDDDtwwCDDDDsw0p1p0s000sp070s@07@0sp070s p010  """"""&""""""ffff""""""""""``&""" """``10a11`10`pa0p`p1`0`vpp1g00   """"""2DDCDD22pvwww'"""2&"""2DDD4QFDDD4Q1""0Q0Q0Wpq0Q 0p1 pqqDD11 117010101q0p111q11CD1Q11CD101sp DDDDDDD4CDD40DD0Bpw'rww7B0B0DD4wwCD40B7042p02  0"""R"2D40000CDDDD40@DCDD4 %" 0DDDD7p0 DDDDCDpq#"ps@2pqp0 "#0p0 "2@0p10 ""#"""0sD40p700 s000020G"""2 """01 aAD4p911p111111q1111p101C10110111110110101 CDDDCDDDDDDDqqQ1Dp1p100p0q#!00 !#w #""""""""""!2DDD !2#!!!202" `D`01D4p01ppp1u1p01113p001sp03p11sp0pp DDDDDDDDDDDCD4p00sp0QQ0pp0QQ0ppCD40pp0Q!!b!b!s"` !h CD@4@DD0q0sGDDD40D300CDppDCt0CD3pp0QR00pCDDD01p03p0p0 3p03 R""""3p00@DDD0'300w0@3"""302pp017p1p `DDDDDDt`a#qwaQa0D`0`2pRR"2p""ppq"QR!010s710qs ""`D@@ @p`1#"`1pqfU"!"!"#tt%"   31p# ! ! 30#p#0#!p#03G@DDD202pp03qpC0Q0p00 pp061#"!!"!""2337pppp0p3300sp30""370q03"2""CD323333#0"%"%p#"!3p@Dp0a3a1`  ! !1FDDDD!7vDDD41 0FDDD!'00DD4vp0p!00DD4p01v030100KKKKK bp `1!""!""11p11!""!11q@p11C!211p11C"!11pq11111p1p1@Q1ap0a0!h#!"! @DD@D0"" "vp2D1 "s"%2s""2pr2p "1p ""%2q"p2p "1"!%2"p00114p 07p!""11D@01p0q0#!00Q0Q1p0 ! !p@$#"R""CCD@4sp2D0rCD2Dpp0r 2C4@0D$""200pD40D0DSC00"pQp0r#0D$ "2"""%"#R"D4p p04qp 2DD0"R"""""2p 101 ``DD#""""2#bps"0"`D Rr0'Cd2#fBD$2"""p#`"0"CDRUBr0'r2#"2p#1" 0"C0 s70 2#Cp0!"R""1 CDD0DD4CD4swwCD4ww7DDsw70#""""""""""""2C@DD@D@@D4qqqqQpqPP #""""""""""""2wwwwwwww00 DD4CDDD&0pp0D4"""Q00DD4Q"!pw7Q0Q""2D407111q11pCD40"1p00v1 00 p`!"""""""""bDDDpDDDDDDDDD`#ppb#""!"!""b3BDDDDDDDD`3q1ppb11"""!"!"b171BDDDDDDDD`1111rpppb1111""""!"b1111BDDDDDDDD`1111ppppb1111"""!"!b1111rp`1718"""!"!"" SS `SSSS@D$`SSSs)`SSsSS!FDDSsSSSgSsSsesSSSSgSSSSeSSsSS gSSsS "sss1pp#"""""""""""p1p ! br`4!71DDqqDDD40QU101"!1qqq170 wgwwww""""b""""""""``!""""`@ b!'`"0"""` 0`#"""" 0 "2 0101""!""00"00011""01100! 9 `1p`" 3 p `" ` rp `r4 `!0@DDt`0p bD$"0@wb00 bp00@Dtb"%0pp bAD0DDpb1pp0C47""b1U10QU"`1p017 !&!!!b!p@#wg """""21p01D0!"!""211p1Q4""101pps1511G15111501Gu1111G7521s51G""p01p 101p `! `!``32a@DDd4D73CDDap0pa0QQpQ!00p00Q170p00!Q07p80p!Q1!Q!0p1Q!1p00!1p ``pp`1p`1p11a0ap0aQq0a0pa01aQ10afpP08aQ0a 0` `DDDDDDDDD`1`p717s`pp1`p7DD0cq0PUDDQ""""QAqD""pqq ""2p00""001100p Aq """""CQADGD413@Q011 QRU710@Qp017`DQ244"1pQp200Q27!02Q1D40!00x0GC#"&QaaQpaaQ1aa0h`KKKKK &"""""b""b"""bv p D33333333###3# pp0#3#3#7DDDDDDD4#""""0pppppCDDD40R%R"%R"%p80sss3"%%%0000000000000DDDDDDD4CDDD40pppspp0RRRR%%%%#%R"%033333333sss rsss00000 0 `! !!a@DCDsa ppps1"#1#33ysqs"%13Q!713D41DDs1DDDD10p103#!!73q0!'0 h`v``#"CDCD``@D13p02S"%%R"!S2UUC3@DDDD31C#"!"#7sCD #"021q010 ww!" "r'" "p "" &fffff# 2`p#pw2p` """ """""```pppppp` "`0DwDDDD#`fDDC0p1p#gs041"%"#c"00q333333C40Q30000000ppppp05!UU%R""UUUUU25D@DDD05303730335U007p0p5w33010C0 5003ps0433p03s770 pDDDDDD4PCDDDDx5wQqwS5wUUwS5pQS5PS5DDDDpYS5 s0p7QrS5"W5R%S1u"S5Q11S5"Q"11!S5 !11!S5!11!S5!11!S5w33x331wS y1CtGDDwD1@Q1D#Q0SFDQQaCDQRaQQQ`aDDdP2apehQPP`PUaQVQa`@DVQcQ5wP1CPEDDDDDSQQSQwwwwS !`a@ CD2PCDDDDD4rAq%p0D4UAU1GD4qq1FD4 A8`@D4!C2P`@D2P3033003000330pwp2Q#"#!QU DDDDDDDDDDDDqWwuWwuWwuWw1QQQQ111Q1Q3QwwqwQ30pwpwwpww001101 D4DDD"""wppw !@D0"" 3 0  w0    w0r "2""%0""%p pp0""%0""%""!!!1 333333333333330333303333#777 sss23333pp03333#sss 77723333pw03333#777 sss2333303333#sss 7772333303333#777ww sss2333303333#""""!""""2wp 03333333333 HDD4DDDDDDD4D4DD4DwwwwwD4DD4DDDA4DD4D4DA4DCDD4DpADDC4D4DDDDDDDDDC4DDDDDDDDDCDCDDDDDDC4DDCDDwwwGDD0pDsww"""0t#"""""8#"""""w7#""""2"0 ""0q00!10 `3DDww`f`03ww` 00`w7w7w#"2"2000000swpww00 0D0D4D4!0R!qpp0Q!04D4p 0pwp0Q!04 0"GD" 0 2p rp'p0p 2R0"0p"01 0!1#"20"!! CDDDDDDDCD@4p00DC0p0p00pp000CDDDDDDD0pwww0 CDDDDDDwwqpw"Q##1qp#pwpw#"#D#13pq w1ww!!!13  w333333wqwKKKKK 10"!""2""2ww"""211011111qw1Q1Qwww1q1p 0 pww"!"2!0 pQ!0!!"!p0pp#!"!2Qpp000p!!!!!!!!!1p70!!!!!!!!!0ppp"!!!!!!!"2ppwp0""!!!!!!! &""""&!p`""" !!"g&2 p 3&2D'! s`&02 "r` r0'#prh !"##! 2##`'p2 "D4` !2 r 0r` 0"# 7! #"#"r #pr##2!#"#""020""" """" """""""  '2  2 f" q 2` 142"gFD002 &p002 `&3100#b 0330#f'30#&!001#` 030 ` 01 `p'030 "!"01!000 `"""""" ` ! fpy !0CDGD#0q#0D41#b0x0DDt#b0!b0'b0 1 !b0p7 f0204pppp70 1!620722p """"""`p`D#b#b#b##pb'b##pb#b##ppb'b##qb#b##0DDd'0b"#2g !pFDD4 !3&03q0!0q00CD4CD4qqCDDD4p0A0DD4000002001202p 000r0 `r DDDDDD4p`1q1`q30q`101300100307p0100DD00w0000p0010 0p7 pDDDDDDD  p"!D4 BDr0!0 @D0!p!0 w0p'!C4 "!!"2DDDDD!p2!C!20! p!pp!  q# 1 q0 DD0p   DDDD p7 20#!0 #!# pDDDD4DD0q3p0q00p0810CDp0 "00p0"!" p  0s0DDD4 01000D0D0p00000DD40 00000p00p0""p `D`01D4p01ppp1u1p01113p001sp03p11sp0pp DD4@DD400000ppADDD0""q00Cqp00qp041070qpp00 CDDDDD spq ""2000"""#""0C ""20000"""00p ""2010100 @00303301q171q0311170p11110031qpppKKKKK CD 010#01#00#p00#0#03#212#1#12p020 ```"""""""CDD`DDD0D"""bf0pCDDDdCD4Q`0Qsp`P0qQaP0QaP2aP"""!S`paapqqqas` C0DDDCD4f@FDDD4`0s@q0pP`0p@P0ppp`0 "00101q00!w7  D40pq0DPCDDDDPPC4q0P0spppP0P0Pq00aCD0aqaQQ0!""b0q` DDDDDDDDDCDDDdswwwgqp`PCDDaPpaq0DDDa0a0p2a@4s2aqp0p2a0DDDC3a0fv CDDDDDDDDDD4 0@""0pPp0 uD0"#pP0"#p@0"#p0"#D0C#7'@0 00 """""""""p&"""10!FDDD4000DDDDDDDD00""DDD0!!0!00s0#003pq01211q20020# !&! !!&! !f`f#"DDDDDDDDDDfp p p p p`D0DDDDDDDDDD3#p0ppp7#"00""20 "2"""""CD0p1DD4@4q108#"  !` p`!CDD4DDd1pg30`1s`3@4hsp0p!#b00!C`100!`1400D#c000c000D#c0D40`00DD"217 DDDDp#f0`8fq0DDD`0!`0f00DDp """!0! f0 `!"""!`pwww`" `HFDDD2b!!!#1bqp1bQ #1bpq s1bQ!#1"&ps2a&Q!#0a'pQQqQQQ"""#!""#p"""# !  @D2!DDDDD#7p@FDps2@D@DD#7pD@s2 !p#7qpADDs2p#7@D@DDs2ppp#7 !033333s2010U5DDD#7s10 &!fb p`&!f171#fb&1sb&!f10!fb&7@0b`1p@0!&Q1@4Q1@'Q21DqvQ12"Q1!pq1QQ1000000 "ppv'"# &!2" 2'p b2" p`2 &!"p'# b2" p`2'p &!2" p2' !2"0011pp00 aq@pp`##""101as@DDa0! pqa0ppDa0 a0Dqa0!pQa0DqaQaDt`! ! 0110 &""""""""""""&CDDDp!v"pq#!q!2!0q!0!8Ruw"RDbpq"` bpq p!`110!b01 0!`KKKKK CDDC01q11!"%"1171p31a111a1131a31311111qG3131311qt1131q313111q71qG31!3131s1s11p311CD1p0p0 """"""DDDDD41QQQ71@@@05pQpQpQp55@D@D@D@D3ppppsDCDCDCDCD37q0CDDDDDDDD0ypp @DDDDD40Da00 Gwa00 Q"awq12D4 G`Qw12 `QQ12p Gpg0""U"R"""0CDDDDD41Dtp1SP1qP1qUp1P1 0 `````0DDDDDDDD`0pppppp0p00 ""DDDD@401p0@D000CD4DD02sp0q202" 02CD012110 `p@d1"!"bfs1pb p"q#!!1b 1bp#"1""#!2CD000!"111!qq11q111111111100p DDDs3#"s3s3sCs3s qqs p @C"!0!"s0#"0DD1!@DDD0p  p #!!3DD333333w7#3w0D307DD44CCDD30p#03"07030#0!!133!"117701!""111p00 @DDDDDDDDDDD1pp1pp@DDDD1pp1@DDDD1qp1ADDDq111p11  p@@DDDDDDDsFD1p0GD#sqFD"2fp0DDv#"pD1pp0""2!"""""0 p (`pw'rw`pww'""""rww````````````` 03qwpp4wp!wwpwwQ!"!333"qpppppqw%!31ppppp01 CD0s@D0DDDD4 p01p000D0Dp0p0p00pp00pDD40p 00p000p00p0""p wwp01ww0111pp0w3310 00wqp0013110 `D`01D4p01ppp1u1p01113p001sp03p11sp0pp p`!1`@!1`Q#""1333`Q333!1`Q"1w0Q"1!1Q10pQ""20Q33311333!!1w!1pp#!1"1pp!""20! CD0DD400DDp0p00p0ff@4D4DDD0Dd00DD0`C0Dp0pDD0gp0DDw0`D0`01@4`!2#"""20` """"""1"'20333333330"r2202"0"""""""""2 "!"!!!!!KKKKK `CDDpp`Qa1R!'Ra0R!'!"'a1R'pasp0R'!" a1'pa8R!!" a1R'DDa7R!"'a1R'a0" a1P!pa0!!a2` p1ppa0!a0!` 0`0DD` 0r`0!""` 0"CD `r0! `0" `p0" `#"!!!"""#``pp` 3333333333333333s0373pp33333037303333s339s30s303p0330373033333s03p03pp33333333333333333ssss7s033033733s0333s333s3sss3033333333333333333333333333333ppp333333333333333 "C""" #"%"" D@@@rw"'#"%"! 01 ` aGd7A0c1A0De0A#"e0@CCe0'pse0p2Dg02(p`02pg02P1a0G4Pa0q0P1a00Pap7a `!paq1a1""qaa1a`12"""%""""a14 av4pbp&C`""""""1p1 "!"!!!"11 !!!"""""1pp1#"""!"""""2 w0 p! &!ps011CDDDD@D1bp!11`p01CDD1DDD1spp3313!11101""""""""""""1@DDDDp1"""spppp#"""2110 1Da11p00p`1a1qa1DDDp pfq #vQQCDDD #g #`QCDDD#UWppQQpxQ0q1PC4q7s71 wwwvww """"""&"""""""ww """""bCD`ffDDD4)"f"7p`v0!f!""20001sppp w1 "&"1110"""2""&""#""""w0 w p 217r'0qw7`03!0Q1`073p0`Q"`q6ss3p`33`77`#!!w130100""""1www01  """"1Qpp0pPs1"R"PS1PS1QS1pS1S1psSSpSSQ#"""SS1""""""""0S1p01DS01y  ""pwwwvww """""""&""""p AD4"" &#" q0pp! "2""""2 0p`p0 "#""f0""" !p0! """# ""!2 p&p041""""""&""""01010  ! ``1"""""""""2`1p1`1"""""""21`111d1111 1q111711qp11111111411011'1""!111011""""""!""0417"""!0"" ``""""2""r10!pp0qqpp 0pp1C10111p01 ""!0110""!""""2100101 0 """"""""DDDDDDD$@p'2' # "!#v2@ p&"r 2qp2 !2p01""!2x011""1p0r0#""!"1# p01#! "b  "`@1qq1qQqQ1 @4qQ1!0Q10Q1q1""!""1Q1q11Q1Qq"""""21Q1t!"11Q"!"211Q11111Q110111Q1p008001pKKKKK r@D4""!"p0DDD4"0000101 pp01pww01"!01qw01 01ww0p11qwp1010p0 FDD1@DD4010w1833171s3p331s371s37p331sp371s37p331sp373s037p30s30 Dd@&`&f 12 12Q!0 qQ0pQ0202%"""""""!""1 p0 !"""""""Bpr#!"!""1#p0"!!!! pDDFD$p0@DDDDp G002`f D1""2Dd@D G1 7"bfp "D31CD2`DD G0q3p2fp 02@DD#GDCp2D#3s00p#GD0302#13#GD3#30# 0r6p# CD`@DDDDDap2a1`!!11 `01 w`b"!!1 ""10""!"!"!11q1W10Q"""2Qq2Qq12Q12Q121 07 """2DDD` @0`"#D4` s"2DDd""""#D2`DDDDDs"2g'#D"2f" "s 2`'#D"2` !s 2`'D#D"b "2s""!"b'1#rD""x1s"!Q13 D0217 (&!!!!DDDDDDDDSv rpppppppS "" #CDDDDDS#S# ""#!!Q@CDDDDDDD4101spppppppp0701"!"201qq107q1111001q11111111111101y0101000 av1pDd`p1"1p11q1011011p1q1C001100 CDDDDp0""""0000w0ppwpwQpppp 1p1s1pppp" !0 "!w "%2!"p""%"  ""%"2  ""%"3 p ""'2 r!""%3'"""w(""5""""#3 313 CDDDDDDDDDDDD40DDDDDDD0p7@DwpGD 7QQapPaUUaQUaQUaQUaQaQUaQUaQUaQUaQUQU p0110pp00"""""00000pp010w1qw01w0101000 v g!""""!!aappa""""""""!"aappa!""""""""aappa""""""""""aappa"!!""""""""a`1p0w0 p""""""""""&@DC!"1DDsBDC4FDD42003CDs7010 01""""""""""""1DDDD@DDDDD1pppp11pppp110 ``f2`ap0ba 0pqa00 101qp0C1 @4p00 00DDDDC4DD0pp0`b'0`a!0i`'p0r0KKKKKKKKKKK xu(P4uuϠvuPPPŠKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHAUPTMENUE>LADEN GAME>GNKH1LN"OIIQLYCRGIIPWKHY"BILDERN. TASTEN> (I.J.K.M 0-8)>SCHEK # # #  B    M #  B JEDI,      P          . # # # # # # #   ԒK (jȩ7JfJfJf))oلȥȥȥȥّȄƴ ۅhL(殩Fe涥LU & LF78麰ʅ0 Y ?SHURݤ0LU ݱ ȱ ݠ K R)Rz)zL*8e 9  L LLI) <  4  & L <  4  g  LLIL ) + T *Z LɈɁLoL6 Y  9 LFLC7 Y +HCDI@ØKKKKK ҅مT   SPECKI ͠ՓŒgh`, (` Щ!Ԡ ڵܙ(Bj 2Z"Jr   ?+HSICLFPH ,,,` ,,0,`j  @ܭ KĹ K ݩR ݠ ȱ ݩ) ݩJ #ʎ ȹ  B H?H`+ FCOPY V3.0  T  T   '  # # KA- ƢơH hI 0LRK- B () g0棦Åۥ]O7 )oJfJfLG OLI7 )oJfJfұ7)o &)ȩ@7J)oKKK  d 53280,0: 53281,0:646,1B 32,19,4,169,68,141,49,4,169d 66,141,50,4,32,19,4,76,0,96 169,1,162,8,160,255,32,186 255,32,192,255,169,2,162,49 160,4,32,189,255,169,0,32& 213,255,32,231,255,96,730 84,160:D %?CRM 2087 FCOPY III 8Lx4-ƭƬƯƮ楯ɿ    呮  ͩ7X [L``x5Le?'/Тн? Jnynnnn (("ˆˆ"" "@ "?>< HHH~($(H<$$I$I$I$)$)$<$@@HxHHH"H"HHHx @p L'H h(L1Э``ЩЭ  ``HH` hh` +e)eԱ e e _a^biű`iL``aԈ`H) F^F_b2  2 0 0 ) ' %!elVz`ݠ ݠ,݌,0` oLIЩI @A  "  ` @A  xB @L`W-ME-M  L1/EE 4E  @CLPP`<0<  0 0 L709< 7 , ,, , I Lhe5CC<5L<7C#ZFd 0P64. Lg ,  ;    Y { {!, u L Lu 9:;   KC e #^6,) C#ݥ L e LМL i  LF  PU F DP FP0U F DʠPQFi FвP  C F  VF P PȭY E .ȄF VPMP  ЬՓمΏy@ @N W f @NLHL7 `)o & `*gOT ?Ƭӥ`  E gP)   < ) 4 L{ R Rz z``5  /$ȥȽ)OȥȄLۦJO & &½J)O轺jJ/轺 >J/轺)/***)Oن)/Ƚ)OȥȄL71ѝ'EѝƢơ欦 N  ""::::H  " LODE RUNNER IV IS NOW LOADING FROM DISK"w : " PLEASE WAIT APPROXIMATELY 1.5 MINS" :::::::  " NOTE:": $ " * PLUG JOYSTICK INTO PORT #2": ) " * COPY ME! I WANT TO TRAVEL" . I55'@GТ G GG QV㝧L ? ?@@@?? @?@D @BB? ?@A~~ ` `ې`ې`ې``ۿэ  7X D Ў! Eڝڝʎ%G %G,  fGfG   >#Dd@j-d@rnJ _.^h` ->Qf{,:JY0`!:0 Bb" R  B  2 Ee2 U  E B50 R Bb0IB) 2 Ge0 U EE2 5 Bb" R  B  2 Ii2 Y  I B9  R Bb0JB) 2 Ii0 Y GI2 9 Bb R IB  2 Ri* Y II B90 2 B90@B) I DR0 Y B  0Re%)RT5)J {``#  25L,X0$ p0x`EEE 4Z VP$н V1P0P#0# 1#7Lh  L F Lip LRFL P% EEEE#УLϥ  L   LF, `, ``!)!`8X vx`RK- ) LLL1ʆN P  ; {<0    8. C  а, L( u  LF   C$3L {  ; {I$L ,,  LF LL <Ϝ0"x,,0--٩ LFB BAM-P STOPC D  D E  CI O   U B E  SI B B T C M   S D   ܢ eʆ & LF + * 棥* ݙ򠺭 ݙLJO & &½J)OjJ/ >J/)/***)Oن)?ƣ*T%Y݌ݭ ݥ-)Z L 0  g \  ܭ LLIܮLE < 4  | 膡 & ɀ_ + LE g + $LI d  < 9\296 5529664: I,(53281):, L I0 51: Q=  1024I,Q:C I @T  10244,76,0,96 169,1,162,8,160,255,32,186 255,32,192,255,169,2,162,49 160,4,32,189,255,169,0,32& 213,255,32,231,255,96,730 84,160:DA*DDHHTERLODERUNNER IVDB ITYHYPRA,8:FCOPY IIIK 3238 / o M - W   ii o M - E   L. ,ݢ**fjfI` R ,ݢ**fjfKK **fjf**fjf**fjfIд`x |@,Ʃ5Щ@`58`B0 L0HYɀ7h(X`"J)ݭ)L;ﭡ)`̛ )` `HKK ) ݩh`)L ZKR$ VP$ K LiP% EEEE LL "1L<EEEE 4Z VP$LQ VP0P 8GL :LU Rw,KK,0fw**fw**fw**fw**fw**fw**fw**fw**Э LLew,,0fw**fw**``X0x`xx 3xxX vx x   RL"KKĭL0L0Yɀ7LL0$ o  槥Lz L BITTE NUR FLOPPY ANSCHALTEN x7Lrst  KKC _P 5L BYTES FREE **** C64-HYPRA-LOAD-SYSTEM **** (C)84 TRIBAR H x7Lrst   /  88 (X?>88?>888?88>>88?8 >>880888?>>8>>888 ?  ?>~(? ? ???0?????? 0??;1&p``a1f|8lq9=7@~3?3y33s|8lp=72p`bxx| 819g ffff`p<???߿` e  p*9!/.*(),qr5ō)@ũʍLb    XUV; Q d ۆ- e o./eЩJ9)Р | Р |L` Т>(PPܭ&Y/bL^`La nLaLbL^` &&.DGIJKLMNOPQRSTUVWX D e Э) Р`hP X`H)Щ ȱi685Ii1ܭ65`23`23332`2 }~x}8/ȱ}m3ȱ}0m3ȱ}/}i}~i~X`-|)ԭ|LdS8 |Ld*8|*| c@)L1ꮍ ,fˍɖ Ds e Q(OP 􈠠ŠҠĠҍүӠ٠Ӡ٠čP ľ klfݭf Lxf fHfH`)$! ff%gAggxh 􈍾٠ k,N88? `8 8 8?88 8?888?a8?8 +888pqpqq|- ?? ??+??????? ???p!ppx| `p1;f73q@3~3y30p`pg `ffcf;f73q@3~3y30p`pg `ffcfmjb{2{3{4ub  s~ :d  $ X \{P--La/. d/x@8/Ԡ,Ԙ /XL`JL.b8*/.  * l Ď(P)c(ɎLe e ?La./o78é- ԍԽ7!ԹFԽ8!逍ԹFL{c8!ԹFԭ7 ԭ8.` ԍ`h}h~1x}2/ȱ}ȱ}ȱ}/}i}~i~}~ǥ~H}HX`1Ѝ66Lc ))(L1)'i9i'ީύe D!Ѝ xdXԩԢ0'ЈȌ'ЩШ `e Рؙٙڙۈ`@ ]ݩ    ; L^`Lf 􈍾Ҡ k j pLxfLf 􈍾Ԡ kLiLf 􈍾Š knl Ϡ kYl 􈍠Š kl jl p 􈍠Π kl jl pLxfLf 􈍾ōӠӠΠ  pLxf 'kLxf D j2 e@Q ᆢZ oLfOP uk l"#Pf v O#Q FZ# L*i#ȹk# kHkH` L*iPPOOOOМPPВPHOH p 'kLi jLi UphOhPZ`OPL*i iL*iɕ iLi Ů 􈍍Ԡ٠ϠŠ  )(@Q ᆩ rhLe DeHs e QOP ŠΠŠӠԠŠҠˮLjPf v O )`"!%${isiiiiiiiȘ cO~l}l }l~lO}l}li; ) l8U  $     ` ) No"")No    9No~mm n9iPO}l}l )( YoɍUɈ }lF}lOLzmɕ}l3O}lLzmɮ ɠ۰}l Ԉ}l}l}lOLzm   􈠠) P  ) P  ) P  ) P  (( L|n` (08@Hɂfo ` 3WA4ZSE5RD6CFTX7YG8BHUV9IJ0MKON+PL-.:,\*;=/12 QTSP;Hqr phqr %Yl%%%`` 0) 18 Iri0JrJJJJi0 18 Fri0Gr  Y=r  BhJAJLr  p lȌ p`Lb1?r  g8蘝`Phpx / !P  OOPP­48` @``@Q ^s Q! 쐠Pf v O  OOPP`Lvt*LPu`f v  ` 2z  z    Jz  zLzf v ȱ ` 2z  z  ȩ  Jz   zLzf   LevLbvLwT 팤 ٤ 팤 Y 2z  z zT zT cvxHʤ 4h TwxHʆOP 4h TxP T`ȄPO TʽwxH 4h 8`L{LXx T 팤ȱ פ VW)xWJJJJxX`!"%*&( 1Ly(#ȹz# zHzH`צ#`NN` NLxN` ?LxLaN`ʍLxˍLxLxLx!I!Lx9I9Lx)M9 &`ٍĠˠҠҍĠӮ̠٠ĠŠՠŠٯΩ kl p jL fH phLxf 􈍾ҠŠōӠӠŠȍŠŠƠ̍ӮŠՠŠٯΩ kl p iLi iL fZ` DeHs e QOP ̠ӠΠĠԍԠĮϠՠȠύŠĠ̠ٯΩ  )(' ihLe p 'kL f jL f` DeH Qs eOP ҠԠĠύŠҠ }lB}lOLk}l/O}lLk?Lxf l}l }l}l}lOLk Lk~liOid i m  ` )(?Lxf`(( ٘l8``#8;  Šͭ\    N pGNo*. Lzm pə pLa Ds eOP 􈠠ŠҠȠӍӠ̠ō(  Ln Ԉ( 􈮠(No)L?o) Ԉ) Ԉ) Ԉ 􈠠) c  p;Pf v OJS)JJJJSO  OOPP r Lo`L`SPPf v OJ # #SSOOPPƩLpHh)HL\qJLqh ip`>r Lq Qr  Lvr2?r    >r L*r QrLvr#U1:02 0 03 00 U+    0L``  Mr LrLPйf v O - P0 pLwf  A74+g w   Lt 2z 0 z JzLzf v   f v  Lz  x! u`% qv` v `& w`"L  g  &8`e u   2z f v z&  f v   Jz z z`g w  8` 2z f v z'  f v 팤ȱ Y 2z  z zT zTe vxH 4h TwxHOP 4h PTx T`ȄPȄO T ʽwxH 4h 8`L{  %&&'' !!""##$$() FYN`XUWȱUXUiUVi `܅)) !%) ) `*`"`?+(3yCy^yhykyoywyyyyy l# ex#`ztf  `N  cz cz cz cz cPO PO 4 P  126()*-./534 ʄ0 L[}LL|f  E;8/g w    L{} ك  }0 9* f   u ك Lf v  ك  }f v 2 9  f v  N   o ك L$ȹf v  L ك  }f v 3 9  f v  N L ~L~f v  o ك L()f (  0`)L(*?*)f *  )g * LH*ĩ`*)f *  )g *  *ĩ`+,() 8 o +``-(),g - ) ( ΁,,+`8`8`8i`8id`1`10f 0 10. 1f 0  1/OM0<1g 0ȱ 1f 0ȱ  1/ 1L`/`1`10g 0 1f g .ȱ ..` l# {#`A;f  '0#8 PO PO 4L`1-Pf O  PO 4L``` LL` LL``hxp ʄ ك PPf  Pؘ`Phxu L&L  R0L`HE ʄp`OhPޘ39 ك9 L : ك: гh`Pf v O   ߇L懭O cP  Lm  m  m  m  ةOP  P   P   P   P L) JJJJ`dd  `i;Q@ O` O`ې.|ɠ'ɾ \ ،A%& "A# %%[%&[ "` %%[[%&[ "`? # ،!A "A' *[I1[I1 "` *[I1[I1[I1 "` # \ ،!A "'hh` @  H!) h"(. [ `@@ ?HPh` !,7BMXcny #(-27k<9cK !#%'*,/258;?C        pP     O#Q FZ# L*i#ȹk# kHkH` L*iPPOOO p 'kL f jL f` DeH Qs eOP ҠԠĠύŠҠŮ 􈍍Ԡ٠ϠŠ  )(@Q ᆩ rhLe DeHs e QOP ŠΠŠӠԠŠҠˮLjPf v O ( ٘l8``#8;  Šͭ\    N pGNo*.  $     ` ) No"")No    9No~mm n9iPO}l}l  Ln Ԉ( 􈮠(No)L?o) Ԉ) Ԉ) Ԉ 􈠠) c   􈠠) P  ) P  ) P  ) P  (( L|n` (08@Hɂfo ` 3WA4ZSE5RD6CFTXV0KO0Pf v O '   OP 4 0L`((`02 D01 D34 D 35 D`20203070       < @   y  y  y  "*" """ """ """ "( " " " "* яݏ %1=Ih hPP5 cdp9 p<17 ?8*@? ?@*@;e???@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  daaAADD@@@888nmmEQDD@@@PPTAAAQ@AA"  (( Dl>{[7[DEPAQ@@A" @@ 8<66x8 "@x886 6E@UA( (((( @ 16l 6 ! 6P11l l 6UUEEAEA((((((( @0 8 0l 6 6 0 l8 UUU6 U6Df` 0)`D+`06g2Df+6 06UU6U6fJ`0 6f  DfDDDb61fbDf760`362f`6(Df6DUf-60`%fU f6 0 6D6D6"DDD'Uf60``0 63f b 262D D D,`06 DD6D6Df|}~ !!!!""""####$$$$%%%%&&&&''''(((())))****++++,,,,----....////0000111122223333444455556666777788889999::::;;;;<<<<====>>>>????@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p 0@P`p  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|@@888 naaAADD@?N?o=EQDUUUQUUUU* ((@ 7;^~ file2 return > 0 if file1 <= file 2 return < 0 if error return = 0 ***************************************************/ #include #include //#include #include #include #include int main ( int argc, char *argv[]) { struct stat fileAttrib1, fileAttrib2; struct tm *pTm1, *pTm2; time_t time1, time2; double seconds; if (argc != 3) { printf("Usage: %s \n", argv[0]); printf("compare modify date \n"); return(0); } if (stat(argv[1], &fileAttrib1) < 0) { printf("Get File (%s) attribute error, Message = %s\n", argv[1], strerror(errno)); return (0); } if (stat(argv[2], &fileAttrib2) < 0) { printf("Get File (%s) attribute error, Message = %s\n", argv[2], strerror(errno)); return (0); } pTm1 = gmtime(&fileAttrib1.st_mtime); time1 = mktime( pTm1 ); pTm2 = gmtime(&fileAttrib2.st_mtime); time2 = mktime( pTm2 ); //printf("time1 = %ld, time2 = %ld\n", time1, time2); seconds = difftime(time1,time2); //printf("seconds = %.f\n", seconds); return (seconds>0?1:-1); } ================================================ FILE: tools/pzlDiskParser.cpp ================================================ #include #include #define WORD unsigned __int16 #define BYTE unsigned __int8 #define IMAGE_HEAD_SIZE 0x70 #define IMAGE_HEAD_STRING "Lode Runner Puzzle Set" #define PZL_SIZE_ADDR (6) #define PZL_HEAD_SIZE (8) #define PZL_TITLE_SIZE (256) #define MAX_LAYERS (14) #define LAYER_X_SIZE (30) #define LAYER_Y_SIZE (18) #define ONE_LAYER_SIZE (LAYER_X_SIZE*LAYER_Y_SIZE) #define TOTAL_LAYER_SIZE (MAX_LAYERS * ONE_LAYER_SIZE) #define PZL_MAX_COMP_SIZE (PZL_HEAD_SIZE + PZL_TITLE_SIZE + TOTAL_LAYER_SIZE) //assume #define PZL_FULL_SIZE (7923) #define TEST_BYTE_VALUE (0xF5) #define TILE_Y_MIN (1) #define TILE_Y_MAX (16) #define LAYER_FIRST_ID (1) #define LAYER_LAST_ID (14) #define BUFFER_BASE (0x122) #define LAYER_STEP (540) //30*18 #define LAYER_ZERO (BUFFER_BASE - LAYER_STEP) #define LAYER_Y_INC (18) #define getTitle() (pzlBuf + PZL_HEAD_SIZE) #define PZL_FIRST_OFFSET (291) #define PZL_LAST_OFFSET (7849) #define TEXT_LINE_SIZE (16) const char *layerName[] = { "Layer 1: Tool Class", "Layer 2: Tool Subclass", "Layer 3: Unknown", "Layer 4: Unknown", "Layer 5: Transporter Destination X", "Layer 6: Transporter Destination Y", "Layer 7: Tool Hooks", "Layer 8: Turf Class", "Layer 9: Turf Subclass", "Layer 10: Turf Appearance", "Layer 11: Unknown", "Layer 12: Unknown", "Layer 13: Door levels > 255", "Layer 14: Turf Hooks" }; int checkHead(FILE *fp) { BYTE headBuf[IMAGE_HEAD_SIZE]; int nRead; if( (nRead = fread (headBuf,sizeof(BYTE), sizeof(headBuf), fp)) != IMAGE_HEAD_SIZE) { printf("Read head failed (%d)\n", nRead); return 1; } if(strncmp(IMAGE_HEAD_STRING, (char*) headBuf, sizeof(IMAGE_HEAD_STRING)-1) != 0) { printf("Bead Head String\n"); return 1; } return 0; } BYTE pzlBuf[PZL_FULL_SIZE+1]; //one byte for check int pzlDecompress(BYTE *pzlCompBuf, int pzlCompSize) { int error = 0; int bufIdx, compIdx; enum decompState { getCmd, getStringCnt, decompEnd, doRepeat, doString }; memset(pzlBuf, TEST_BYTE_VALUE, PZL_FULL_SIZE+1); //pzlBuf[PZL_FULL_SIZE-1] = TEST_BYTE_VALUE; //pzlBuf[PZL_FULL_SIZE] = TEST_BYTE_VALUE; //copy pzl header to pzl buffer memcpy(pzlBuf, pzlCompBuf, PZL_HEAD_SIZE); bufIdx = PZL_HEAD_SIZE; decompState state = getCmd; for(compIdx = PZL_HEAD_SIZE; !error && compIdx < pzlCompSize; compIdx++) { BYTE c = pzlCompBuf[compIdx]; BYTE copyCnt; switch (state) { case getCmd: switch(c) { case 0x00: state = decompEnd; break; case 0xFF: state = getStringCnt; //copy string mode break; default: state = doRepeat; //repeat mode copyCnt = c; // break; } break; case getStringCnt: if (c < 1) { //return 1; state = getCmd; } else { state = doString; copyCnt = c; if (compIdx + copyCnt >= PZL_FULL_SIZE) error = 1; } break; case decompEnd: pzlBuf[bufIdx++] = 0; error = 1; break; case doString: pzlBuf[bufIdx++] = c; if(--copyCnt <= 0) state = getCmd; break; case doRepeat: if (bufIdx + copyCnt >= PZL_FULL_SIZE) { error = 1; } else { while(copyCnt--) pzlBuf[bufIdx++] = c; state = getCmd; } break; } } if(state == decompEnd) error = 0; if(error || pzlBuf[PZL_FULL_SIZE] != TEST_BYTE_VALUE) { //buffer overrun printf("Error: Buffer overrun !\n"); return 1; } return 0; } void dspArray(int idx, int len) { int i, j; for (i = 0; i < len; i += TEXT_LINE_SIZE) { int offset = idx + i; printf("%4d: ", offset); for (j = 0; j < TEXT_LINE_SIZE; j++) { if (i + j < len) printf("%4d", (int) pzlBuf[idx + i + j]); else printf(" "); } printf(" "); for (j = 0; j < TEXT_LINE_SIZE; j++) { char ch = pzlBuf[idx + i + j]; if (i + j < len) { if (ch >= ' ' && ch < 127) printf("%c ", ch); else printf(". "); } } printf("\n"); } printf("\n\n"); } int getTile(int x, int y, int layer) { if (x < 0 || x > 29 || y < 0 || y > 18 || layer < LAYER_FIRST_ID || layer > LAYER_LAST_ID) return -1; int idx = LAYER_ZERO + layer * LAYER_STEP + x * LAYER_Y_INC + y; return pzlBuf[idx]; } void dspLayerArray(int layer) { int tile; printf("%s\n", layerName[layer-1]); printf(" "); for (int x = 1; x < 29; x++) printf("%4d", x); printf("\n"); for (int y = TILE_Y_MIN; y <= TILE_Y_MAX; y++) { printf("%2d", y); for (int x = 1; x < 29; x++) { tile = getTile(x, y, layer); if(tile) printf("%4d", tile); else printf(" "); } printf("\n"); } printf("\n\n"); } void displayTextPzl(int pzlNumber) { // write puzzle title printf("Puzzle %d, Title:\n%s\n\n" "Edited data must have the same number of bytes in each line or an error\n" "will occur. Edited data values have a range from 0-255. Use 0xNN format\n" "for hexadecimal values. All lines must have the same content. Extra carrage\n" "returns or deleted comments will cause an error. Data in layers is\n" "deconvoluted for easier interpretation. NotePad or an editor using a constant\n" "courier type will be more easily readable than an editor using a variable pitch\n" "font. An error message on the first error detected will be given. Subsequent\n" "errors will be shown after all previous errors are corrected. The first row\n" "and column of the layers are the row and column numbers. Some data is mondified\n" "when the puzzle file is saved.\n\n" "Puzzle Header: 8 consisting of:\n" "Two bytes compressed length (modified by this program)\n" "Two bytes zeros\n" "Two bytes puzzle number (modified by this program on save file)\n" "Two bytes which always seem to be 1 and 0\n" "Puzzle title block 256 bytes or so\n" "Sixteen bytes unknown.\n" "This is then followed by layer 1\n\n", pzlNumber, getTitle()); // write Puzzle title block dspArray(0, PZL_FIRST_OFFSET - 1); // write puzzle sets /* for (int layer = 1; layer <= 14; layer++) dspLayerArray(layer); */ dspLayerArray(1); dspLayerArray(2); dspLayerArray(8); dspLayerArray(9); dspLayerArray(10); printf("\n" "Player data: consists of data for Jake and Wes followed by data for monks.\n" "Most of this data is accessable through the player editor.\n\n"); dspArray(PZL_LAST_OFFSET + 1, PZL_FULL_SIZE - PZL_LAST_OFFSET); } //value | Character | Type //------+-----------+----------- // 0x0 | | Empty Space ==> No Truf (Layer 8, Layer 9) = (0,0) // 0x1 | # | Normal Brick ==> Turf (Layer 8, Layer 9) = (1,1) // 0x2 | @ | Solid Brick ==> Bedrock (Layer 8, Layer 9) = (1,2) // 0x3 | H | Ladder ==> Ladder (Layer 8, Layer 9) = (5,1) // 0x4 | - | Bar ==> Bar (Layer 8, Layer 9) = (6,1) // 0x5 | X | False Brick ==> Trap Truf (Layer 8, Layer 9) = (2,6) // 0x6 | S | Exit Ladder ==> Exit ladder (Layer 8, Layer 9) = (5,2) // 0x7 | $ | Gold ==> Coin (Layer 1, Layer 2) = (4,1) // 0x8 | 0 | Guard // 0x9 | & | Player #define CLASSIC_MAP_X_SIZE (28) #define CLASSIC_MAP_Y_SIZE (16) #define CLASSIC_MAP_SIZE (CLASSIC_MAP_X_SIZE * CLASSIC_MAP_Y_SIZE); BYTE mapClassic[CLASSIC_MAP_X_SIZE][CLASSIC_MAP_Y_SIZE]; #define CLASSIC_TILE_EMPTY (' ') #define CLASSIC_TILE_BRICK ('#') #define CLASSIC_TILE_SOLID ('@') #define CLASSIC_TILE_LADDER ('H') #define CLASSIC_TILE_BAR ('-') #define CLASSIC_TILE_TRAP ('X') #define CLASSIC_TILE_EXIT_LADDER ('S') #define CLASSIC_TILE_GOLD ('$') #define CLASSIC_TILE_GUARD ('0') #define CLASSIC_TILE_RUNNER ('&') #define RUNNER_CNT_ADDR (0x1eaa) //7850 #define RUNNER_BASE_ADDR (0x1eac) #define RUNNER_ENABLE_OFFSET (0) #define RUNNER_DATA_OFFSET (1) #define RUNNER_X_OFFSET (2) #define RUNNER_Y_OFFSET (3) #define RUNNER_STEP_SIZE (4) #define GUARD_CNT_ADDR (0x1eb4) //7860 #define GUARD_BASE_ADDR (0x1eb5) #define GUARD_DATA1_OFFSET (0) #define GUARD_ENABLE_OFFSET (1) #define GUARD_DATA2_OFFSET (2) #define GUARD_DOOR_OFFSET (3) #define GUARD_X_OFFSET (4) #define GUARD_Y_OFFSET (5) #define GUARD_STEP_SIZE (6) int mapClassicAddGuy() { BYTE *runnerBase = pzlBuf + RUNNER_BASE_ADDR; int runnerCnt = *(pzlBuf+RUNNER_CNT_ADDR); BYTE runnerX, runnerY; BYTE *guardBase = pzlBuf + GUARD_BASE_ADDR; int guardCnt = *(pzlBuf + GUARD_CNT_ADDR); BYTE guardX, guardY; if(runnerCnt != 1) { printf("Error: runner count != 1 (%d)\n", runnerCnt); return 1; } for (int i = 0; i < 2; i++) { if( !*(runnerBase + RUNNER_ENABLE_OFFSET)) { runnerBase += RUNNER_STEP_SIZE; continue; } runnerX = *(runnerBase + RUNNER_X_OFFSET); runnerY = *(runnerBase + RUNNER_Y_OFFSET); if(runnerX < 1 || runnerX > CLASSIC_MAP_X_SIZE) { printf("Error: wrong runnerX value (%d)\n", runnerX); return 1; } if(runnerY < 1 || runnerY > CLASSIC_MAP_Y_SIZE) { printf("Error: wrong runnerY value (%d)\n", runnerY); return 1; } if(mapClassic[runnerX-1][runnerY-1] != CLASSIC_TILE_EMPTY) { if(runnerY == 1 && getTile(runnerX, runnerY, 8) == 8) { mapClassic[runnerX-1][runnerY-1] = CLASSIC_TILE_RUNNER; } else { printf("Error runner position already has value exist (%d, %d)\n", runnerX, runnerY); } //return 1; } else { mapClassic[runnerX-1][runnerY-1] = CLASSIC_TILE_RUNNER; } break; } for(int i = 1; i <= guardCnt; i++) { guardX = *(guardBase + GUARD_X_OFFSET); guardY = *(guardBase + GUARD_Y_OFFSET); if(guardX < 1 || guardX > CLASSIC_MAP_X_SIZE) { //printf("Error: wrong guardX value (%d)\n", guardX); continue; } if(guardY < 1 || guardY > CLASSIC_MAP_Y_SIZE) { //printf("Error: wrong guardY value (%d)\n", guardY); continue; } if(mapClassic[guardX-1][guardY-1] != CLASSIC_TILE_EMPTY) { if(guardY == 1 && getTile(guardX, guardY, 8) == 8) { mapClassic[guardX-1][guardY-1] = CLASSIC_TILE_GUARD; } else { printf("Error guard position already has value exist (%d, %d)\n", guardX, guardY); } } else { mapClassic[guardX-1][guardY-1] = CLASSIC_TILE_GUARD; } guardBase += GUARD_STEP_SIZE;; } return 0; } int online2Classic(int pzlNumber) { //memset(mapClassic, CLASSIC_TILE_EMPTY, CLASSIC_MAP_SIZE); printf("//======<<< Level %03d >>>======\n\n", pzlNumber); //(1) Set Turf for(int x=1; x <= CLASSIC_MAP_X_SIZE; x++) { for(int y=1; y <= CLASSIC_MAP_Y_SIZE; y++) { int layer8 = getTile(x, y, 8); int layer9 = getTile(x, y, 9); int id = layer8 * 10 + layer9; switch(id) { case 0: //empty mapClassic[x-1][y-1] = CLASSIC_TILE_EMPTY; break; case 11: //normal brick mapClassic[x-1][y-1] = CLASSIC_TILE_BRICK; break; case 12: //solid brick mapClassic[x-1][y-1] = CLASSIC_TILE_SOLID; break; case 51: //ladder mapClassic[x-1][y-1] = CLASSIC_TILE_LADDER; break; case 61: //bar mapClassic[x-1][y-1] = CLASSIC_TILE_BAR; break; case 26: //trap brick mapClassic[x-1][y-1] = CLASSIC_TILE_TRAP; break; case 52: //end game ladder mapClassic[x-1][y-1] = CLASSIC_TILE_EXIT_LADDER; break; default: if(layer8 == 8) { if(layer9 == 1 && y == 1 && getTile(x, y+1, 8) == 5 && getTile(x, y+1, 9) == 2) { //exit door (layer8=8, layer9=1) at top position and pos(x,y+1) = exit ladder (5,2) // set this tile as "exit ladder" mapClassic[x-1][y-1] = CLASSIC_TILE_EXIT_LADDER; } else { //exit door set as empty mapClassic[x-1][y-1] = CLASSIC_TILE_EMPTY; } } else { printf("Error: can not recognize tile, (lay8, lay9) = (%d, %d)\n",layer8, layer9); } break; } } } //(2) Set Tool for(int x=1; x <= CLASSIC_MAP_X_SIZE; x++) { for(int y=1; y <= CLASSIC_MAP_Y_SIZE; y++) { int layer1 = getTile(x, y, 1); //int layer2 = getTile(x, y, 2); if(layer1 != 0) { if(mapClassic[x-1][y-1] != CLASSIC_TILE_EMPTY) { //skip //printf("Error: value exist (%d, %d)\n", x, y); } else { mapClassic[x-1][y-1] = CLASSIC_TILE_GOLD; } } } } //(3) Set Guy mapClassicAddGuy(); //(4) dump level for(int y=0; y < CLASSIC_MAP_Y_SIZE; y++) { printf("\""); for(int x=0; x < CLASSIC_MAP_X_SIZE; x++) { printf("%c", mapClassic[x][y]); } if(y < CLASSIC_MAP_Y_SIZE-1) printf("\" +\n"); else printf("\","); } printf("\n\n"); } int dumpPuzzlLevel(FILE *fp) { WORD pzlHeader[4]; BYTE pzlCompBuf[PZL_MAX_COMP_SIZE]; int pzlCompSize, nRead; if((nRead = fread(pzlHeader, 1, sizeof(pzlHeader), fp ) )!= sizeof(pzlHeader)) { if(nRead == 0) { //printf("End of File !!!\n"); } else { printf("Read puzzle head failed !\n"); } return 1; } pzlCompSize = pzlHeader[0] + PZL_SIZE_ADDR; //include header size if( pzlCompSize < 100 || pzlCompSize > PZL_MAX_COMP_SIZE) { printf("Puzzle Size too short or too long (%d)\n", pzlCompSize); return 1; } if (pzlHeader[1] != 0) { printf("Puzzle wrong format (header[1] != 0) \n"); return 1; } // copy the header to pzlBuf memcpy(pzlCompBuf, pzlHeader, sizeof(pzlHeader)); // read puzzle body (skip header) if(fread(pzlCompBuf+sizeof(pzlHeader), 1, pzlCompSize - sizeof(pzlHeader), fp ) != (pzlCompSize - sizeof(pzlHeader))) { printf("Read puzzle body failed !\n"); return 1; } // check for final byte to be a zero if (pzlCompBuf[pzlCompSize - 1] != 0) { printf("Puzzle body final byte != 0, failed !\n"); return 1; } if (pzlDecompress(pzlCompBuf, pzlCompSize) == 0) { //displayTextPzl(pzlHeader[2]); online2Classic(pzlHeader[2]); return 0; } return 1; } void dumpAllLevels(FILE *fp) { printf("//************************************************************\n"); printf("//* All levels extract from: \n"); printf("//* CGW \n"); printf("//* by Simon Hung 2015/01/14\n"); printf("//************************************************************\n"); printf("\nvar spoonbill = [\n"); while(dumpPuzzlLevel(fp) == 0); printf("];\n"); } void usage(char *fileName) { printf("%s \n", strrchr(fileName,'\\')+1 ); } int main(int argc, char *argv[]) { FILE *fp; if(argc < 2) { usage(argv[0]); return 1; } if((fp = fopen(argv[1], "rb")) == NULL) { printf("Open file %s failed \n", argv[1]); return 1; } //(1) check head if(checkHead(fp))return 1; //failed //(2) read puzzle block dumpAllLevels(fp); //dumpPuzzlLevel(fp); //dumpPuzzlLevel(fp); }