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
### * 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 # # # " +
"HH $ $ $ $ $ $ $ $ $ $ $ $",
*/
//======<<< 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#CM n~ݝݝ̌̿̌ȌΏψȮΏΏˏȎ ǠԠ g ψϻ ӠϠ٠ T
ϙyϻތȌ،zȌ،Ȍ،Ȍ،Ȍ،Ȍ،Ȍ،Ȍ Ơ٠ b ټ˝|ǝٜgɝٜɝٜ鮙ɝݜ鞙鞙ݙəəΙ˛Ιؙ鞙ə˜əɜ͙ݙɜ蜙əɎޝ Ƞ ȠR Ͽλˎ̎ݪڭݻ˻݈ޏʾʈ ŠӠŠ àR ~wΈ Š̠٠ Π R |o Ġ W [ΌώώόߎˎߏόΎ߈}ώό Ӡ̠ 3ɠY ݭ ҠӠ )ϠW 쌇l Π T wݝ̏ϏϏϏϏϏ Š٠ V ݻww͈ͮ ̠Ġ v] oϻͻϻͻίΏύίϏΏͯΏ˯ΏΏΏΏ͏ϏϏϏϏΏ ՠˠ %Z ˻~n~ ŠϠŠ ǠW KKKKK ܟܟoܟȈȈȈȈܼȈȈ Ҡ WϠD ώϙώ Ԡˠ S kݬجﮜ戴܌ ƠĠ Hɠ_ o ©ԠԠ ` \R wwλۈμۈΎΎl ̠٠ ]f ̌όόό ΠŠ ƠW ϙwωϙϙəəޝϙϙޝ̈o Ԡˠ NΠV }}}l ԭԮ IQ ˻xφ|˻xϏx˻Ϗ˻ Π S l̏{̏{̏̏̏̏ ˠ b33 ˼o} ӠҠ q ggg'W yώώώ ɠҠ @Q ϋݻϽϏߍߟoϏ Ǡנ U wwwwwww ϻΪΪ˪xxxxxϻm ̠Ġ BY ~w ϠƠ pP ﻻه٭Ύ٪٪܍ٮϻ ŠҠ Q
KKKKK lȎ}· ӠŠ wwͩݝ˻o ǠŠ "àW Ϗ̌ Ҡ ͠U 興興興쏎 Ӡ GR ܌܌܍܌܌Ȍ͇̌܌͌܍܌܌܌܌͍܌܌̌܌܌}̌ ԭ̠ eǠR ˻˻ȏ˻˻˻}ȏ˻ˋmݍ Ġ ˠZ n쌈| ̠ fT ߈߈w ՠĠ͠ X ̜ɜɜɜɜɜɜɜɜx~ɜɜɜ̪ɜ̮l| Ӡ Q 왙m} ŮΠ wY [gޞ ҠΠ͠ ȗU λϻκΊκΊܪκΊܪκȫΊܪκκܪκȻܪ̻} ̠ 7] m،،͈ȍ،،ȍ،ؼ{}}ތ،ݍȍ͈،ȍތݍLj ĠӠ _ƠS ̿ώΎΎΎΎΎΈ̎ Ϡ٠ fĠ^ ~xxxλΪ؈܈ Ԡ P oΎϏΎތތތͼ Ӡ %QX KKKKK o~ ΠȠ D-AAACAA myޝ؍͎ۻ~ۻ؍ۻϟȟϻ Р̠ 7475U KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK [[[\\\\[XiXY[YXP O 9ŠΠ̠ yIF Ȍ 팩 L V;O P LީOP 9 L`m
m m m
K pP @@@p@p`P@0 KKKKKKKKK
KKKKKKKKKK
ՠ3"I Ҡ37 Ҡ3 Š3 2 7 Š2 ϸ1 Q Š1 161195 ͠0D ˠƠŠ I"U 9DANE BIGHAMffffKKK
Ҡ Ҡ
! Ԡ*) ͠ 21 à jKKKKKKKKK
STUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~a DDDDDDDDD D
DDD
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
@@ @@`2 C8C nmmCEQDD`2 ǂ @ @@`2 " ? N?o= E
EQDUUUQCUU*C F
(( C@`5 7;^~
CC C
LC +AUUU@UU(
(
CÂ@ `+ 8<66x8 D 9"@x886
6 E@UA(
(C(
@ F`+
@E `2 08
0l
6 60l8 %UUUUUU(( (C( @҂ `D !LD33' 3-UD"D"U3
" D 33D3 31DD 3DD3DD3DD3DD3D
/ f6f-UUD6260`Db
Df 606D6/0`"f&UUf`062606 f
`f60`f`f60`f`060` `060``06
0``06f6f3U6U6U6 6Ufbf`Uf*Uf`f606Df6fDf80f`fI
ՠ·ՠ·Íՠ·čՠ·ư pADDa ` @ q 3 q303 q E"Cq 7 1 D1"D10 0
ŠR0 0p0p1061 03 007 003070307030703070 30 0H 0` $"2gok== M= h0ڏN`1ߥ>k<9cK
!#%'
â â â â pP @
% % J[[[\\\\[XiXY[YXP O 9HDC yIF
D(D)D*D+D,D-D.D/D0D1D2D3D4D5D6D7D8D9D:D;DD? @ @ @PPPPPPPPP P
PPP
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| CC daa CAACDD`2 @@`2
C8C naaCAADD`2