diff --git a/README.md b/README.md
index 8bf9a04..c045821 100644
--- a/README.md
+++ b/README.md
@@ -1,35 +1,86 @@
-Lode Runner (超級運動員)
+Lode Runner - Total Recall
=======================================
+## (超級運動員 - 全面回憶)
This program build with Javascript + [CreateJS](http://www.createjs.com).
-Game levels include [Lode Runner (150 levels) & Championship Lode Runner (50 levels)](http://strategywiki.org/wiki/Lode_Runner/Walkthrough)
+### * 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 |
+
+
+
-### GAME Mode
+###* Include 5 Game Versions
-### PLAY
+### * Provide 2 Theme
+
+
+(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
http://loderunnerwebgame.com/game/
------------------------------------
diff --git a/flag32Id.js b/flag32Id.js
new file mode 100644
index 0000000..26bc83e
--- /dev/null
+++ b/flag32Id.js
@@ -0,0 +1,55 @@
+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
+};
\ No newline at end of file
diff --git a/image/block.png b/image/Theme/APPLE2/block.png
similarity index 100%
rename from image/block.png
rename to image/Theme/APPLE2/block.png
diff --git a/image/brick.png b/image/Theme/APPLE2/brick.png
similarity index 100%
rename from image/brick.png
rename to image/Theme/APPLE2/brick.png
diff --git a/image/empty.png b/image/Theme/APPLE2/empty.png
similarity index 100%
rename from image/empty.png
rename to image/Theme/APPLE2/empty.png
diff --git a/image/gold.png b/image/Theme/APPLE2/gold.png
similarity index 100%
rename from image/gold.png
rename to image/Theme/APPLE2/gold.png
diff --git a/image/ground.png b/image/Theme/APPLE2/ground.png
similarity index 100%
rename from image/ground.png
rename to image/Theme/APPLE2/ground.png
diff --git a/image/guard.png b/image/Theme/APPLE2/guard.png
similarity index 100%
rename from image/guard.png
rename to image/Theme/APPLE2/guard.png
diff --git a/image/guard1.png b/image/Theme/APPLE2/guard1.png
similarity index 100%
rename from image/guard1.png
rename to image/Theme/APPLE2/guard1.png
diff --git a/image/hladder.png b/image/Theme/APPLE2/hladder.png
similarity index 100%
rename from image/hladder.png
rename to image/Theme/APPLE2/hladder.png
diff --git a/image/Theme/APPLE2/hole.png b/image/Theme/APPLE2/hole.png
new file mode 100644
index 0000000..464ff33
Binary files /dev/null and b/image/Theme/APPLE2/hole.png differ
diff --git a/image/ladder.png b/image/Theme/APPLE2/ladder.png
similarity index 100%
rename from image/ladder.png
rename to image/Theme/APPLE2/ladder.png
diff --git a/image/over.png b/image/Theme/APPLE2/over.png
similarity index 100%
rename from image/over.png
rename to image/Theme/APPLE2/over.png
diff --git a/image/rope.png b/image/Theme/APPLE2/rope.png
similarity index 100%
rename from image/rope.png
rename to image/Theme/APPLE2/rope.png
diff --git a/image/runner.png b/image/Theme/APPLE2/runner.png
similarity index 100%
rename from image/runner.png
rename to image/Theme/APPLE2/runner.png
diff --git a/image/runner1.png b/image/Theme/APPLE2/runner1.png
similarity index 100%
rename from image/runner1.png
rename to image/Theme/APPLE2/runner1.png
diff --git a/image/Theme/APPLE2/text.png b/image/Theme/APPLE2/text.png
new file mode 100644
index 0000000..77e2bed
Binary files /dev/null and b/image/Theme/APPLE2/text.png differ
diff --git a/image/trap.png b/image/Theme/APPLE2/trap.png
similarity index 100%
rename from image/trap.png
rename to image/Theme/APPLE2/trap.png
diff --git a/image/Theme/C64/block.png b/image/Theme/C64/block.png
new file mode 100644
index 0000000..7d1af4b
Binary files /dev/null and b/image/Theme/C64/block.png differ
diff --git a/image/Theme/C64/brick.png b/image/Theme/C64/brick.png
new file mode 100644
index 0000000..ecb541a
Binary files /dev/null and b/image/Theme/C64/brick.png differ
diff --git a/image/Theme/C64/empty.png b/image/Theme/C64/empty.png
new file mode 100644
index 0000000..154f026
Binary files /dev/null and b/image/Theme/C64/empty.png differ
diff --git a/image/Theme/C64/gold.png b/image/Theme/C64/gold.png
new file mode 100644
index 0000000..ac34d0f
Binary files /dev/null and b/image/Theme/C64/gold.png differ
diff --git a/image/Theme/C64/ground.png b/image/Theme/C64/ground.png
new file mode 100644
index 0000000..7e1535f
Binary files /dev/null and b/image/Theme/C64/ground.png differ
diff --git a/image/Theme/C64/guard.png b/image/Theme/C64/guard.png
new file mode 100644
index 0000000..1f9308d
Binary files /dev/null and b/image/Theme/C64/guard.png differ
diff --git a/image/Theme/C64/guard1.png b/image/Theme/C64/guard1.png
new file mode 100644
index 0000000..a1c50a7
Binary files /dev/null and b/image/Theme/C64/guard1.png differ
diff --git a/image/Theme/C64/hladder.png b/image/Theme/C64/hladder.png
new file mode 100644
index 0000000..f90fb17
Binary files /dev/null and b/image/Theme/C64/hladder.png differ
diff --git a/image/Theme/C64/hole.png b/image/Theme/C64/hole.png
new file mode 100644
index 0000000..6a93b96
Binary files /dev/null and b/image/Theme/C64/hole.png differ
diff --git a/image/Theme/C64/ladder.png b/image/Theme/C64/ladder.png
new file mode 100644
index 0000000..ef98d70
Binary files /dev/null and b/image/Theme/C64/ladder.png differ
diff --git a/image/Theme/C64/over.png b/image/Theme/C64/over.png
new file mode 100644
index 0000000..171855a
Binary files /dev/null and b/image/Theme/C64/over.png differ
diff --git a/image/Theme/C64/rope.png b/image/Theme/C64/rope.png
new file mode 100644
index 0000000..ceaa801
Binary files /dev/null and b/image/Theme/C64/rope.png differ
diff --git a/image/Theme/C64/runner.png b/image/Theme/C64/runner.png
new file mode 100644
index 0000000..6905a5f
Binary files /dev/null and b/image/Theme/C64/runner.png differ
diff --git a/image/Theme/C64/runner1.png b/image/Theme/C64/runner1.png
new file mode 100644
index 0000000..a989dd6
Binary files /dev/null and b/image/Theme/C64/runner1.png differ
diff --git a/image/Theme/C64/text.png b/image/Theme/C64/text.png
new file mode 100644
index 0000000..d91e380
Binary files /dev/null and b/image/Theme/C64/text.png differ
diff --git a/image/Theme/C64/trap.png b/image/Theme/C64/trap.png
new file mode 100644
index 0000000..9c50e3e
Binary files /dev/null and b/image/Theme/C64/trap.png differ
diff --git a/image/apple2.png b/image/apple2.png
new file mode 100644
index 0000000..2be4e12
Binary files /dev/null and b/image/apple2.png differ
diff --git a/image/blank32.png b/image/blank32.png
new file mode 100644
index 0000000..b23b356
Binary files /dev/null and b/image/blank32.png differ
diff --git a/image/closeBoxOn.png b/image/closeBoxOn.png
new file mode 100644
index 0000000..7ca41a2
Binary files /dev/null and b/image/closeBoxOn.png differ
diff --git a/image/closeBoxOut.png b/image/closeBoxOut.png
new file mode 100644
index 0000000..b4d87c1
Binary files /dev/null and b/image/closeBoxOut.png differ
diff --git a/image/commodore64.png b/image/commodore64.png
new file mode 100644
index 0000000..2a48ea3
Binary files /dev/null and b/image/commodore64.png differ
diff --git a/image/cover.png b/image/cover.png
index a3951a9..b32988a 100644
Binary files a/image/cover.png and b/image/cover.png differ
diff --git a/image/cover1.png b/image/cover1.png
new file mode 100644
index 0000000..32add38
Binary files /dev/null and b/image/cover1.png differ
diff --git a/image/crown.png b/image/crown.png
new file mode 100644
index 0000000..29add10
Binary files /dev/null and b/image/crown.png differ
diff --git a/image/demo.png b/image/demo.png
new file mode 100644
index 0000000..bf984fc
Binary files /dev/null and b/image/demo.png differ
diff --git a/image/flags32.png b/image/flags32.png
new file mode 100644
index 0000000..bac47b7
Binary files /dev/null and b/image/flags32.png differ
diff --git a/image/help.png b/image/help.png
index b6722ba..a4cf9e2 100644
Binary files a/image/help.png and b/image/help.png differ
diff --git a/image/helpIcon.png b/image/helpIcon.png
new file mode 100644
index 0000000..c2f33c2
Binary files /dev/null and b/image/helpIcon.png differ
diff --git a/image/hole.png b/image/hole.png
deleted file mode 100644
index b928876..0000000
Binary files a/image/hole.png and /dev/null differ
diff --git a/image/infoIcon.png b/image/infoIcon.png
new file mode 100644
index 0000000..21597b0
Binary files /dev/null and b/image/infoIcon.png differ
diff --git a/image/lodeRunner.gif b/image/lodeRunner.gif
new file mode 100644
index 0000000..ccac2f0
Binary files /dev/null and b/image/lodeRunner.gif differ
diff --git a/image/lodeRunner2.png b/image/lodeRunner2.png
new file mode 100644
index 0000000..fcbdd87
Binary files /dev/null and b/image/lodeRunner2.png differ
diff --git a/image/lodeRunner3.png b/image/lodeRunner3.png
new file mode 100644
index 0000000..8bab6c4
Binary files /dev/null and b/image/lodeRunner3.png differ
diff --git a/image/remake.png b/image/remake.png
index 6585338..1e110c6 100644
Binary files a/image/remake.png and b/image/remake.png differ
diff --git a/image/repeatOff.png b/image/repeatOff.png
new file mode 100644
index 0000000..1b42700
Binary files /dev/null and b/image/repeatOff.png differ
diff --git a/image/repeatOn.png b/image/repeatOn.png
new file mode 100644
index 0000000..332c43f
Binary files /dev/null and b/image/repeatOn.png differ
diff --git a/image/signet.png b/image/signet.png
new file mode 100644
index 0000000..3c3e61a
Binary files /dev/null and b/image/signet.png differ
diff --git a/image/simon.png b/image/simon.png
new file mode 100644
index 0000000..70c71ba
Binary files /dev/null and b/image/simon.png differ
diff --git a/image/soundOff.png b/image/soundOff.png
new file mode 100644
index 0000000..f89c539
Binary files /dev/null and b/image/soundOff.png differ
diff --git a/image/soundOn.png b/image/soundOn.png
new file mode 100644
index 0000000..208432b
Binary files /dev/null and b/image/soundOn.png differ
diff --git a/image/text.png b/image/text.png
deleted file mode 100644
index 2db32d2..0000000
Binary files a/image/text.png and /dev/null differ
diff --git a/lodeRunner.def.js b/lodeRunner.def.js
index df70bd1..972e318 100644
--- a/lodeRunner.def.js
+++ b/lodeRunner.def.js
@@ -1,5 +1,5 @@
-var VERSION = "1.00c";
-var AI_VERSION = 2;
+var VERSION = "2.01a";
+var AI_VERSION = 3;
var NO_OF_TILES_X = 28,
NO_OF_TILES_Y = 16;
@@ -18,6 +18,9 @@ var BASE_SCREEN_Y = (NO_OF_TILES_Y * BASE_TILE_Y + GROUND_TILE_Y + TEXT_TILE_Y);
var MIN_SCALE = 0.5,
MAX_SCALE = 2;
+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,
@@ -43,7 +46,7 @@ var KEYCODE_BKSPACE = 8, //backspace
KEYCODE_L = 76, //move right
KEYCODE_I = 73, //move up
KEYCODE_K = 75, //move down
-
+
KEYCODE_PERIOD = 190, //'.'
KEYCODE_COMMA = 188, //','
@@ -73,15 +76,16 @@ var SCORE_COMPLETE_LEVEL = 1500, SCORE_COUNTER = 15;
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;
-
+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_NEXT_LEVEL = 10, GAME_PREV_LEVEL = 11,
+ GAME_LOADING = 12, GAME_WIN = 13;
var ACT_UNKNOWN = -1, ACT_STOP = 0,
ACT_LEFT = 1, ACT_RIGHT = 2,
@@ -120,42 +124,60 @@ var REBORN_T = 0x10; //template: for reborn
var CLOSE_SCREEN_SPEED = 35; //20 ~ 80
-var MAX_GUARD = 6; //maximum number of guards
+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 = 150 * TICK_COUNT_PER_TIME;
+var MAX_DEMO_WAIT_COUNT = 200 * TICK_COUNT_PER_TIME;
var MAX_EDIT_LEVEL = 120;
-var MAX_HISCORE_RECORD = 10, MAX_HISCORE_NAME_LENGTH = 10;
+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_INFO1 = "loderunner_classicInfo1";
-var STORAGE_CLASSIC_INFO2 = "loderunner_classicInfo2";
+var STORAGE_CLASSIC_INFO = "loderunner_classicInfo";
-var STORAGE_MODERN_INFO1 = "loderunner_modernInfo1";
-var STORAGE_MODERN_INFO2 = "loderunner_modernInfo2";
+var STORAGE_MODERN_INFO = "loderunner_modernInfo";
-var STORAGE_DEMO_INFO1 = "loderunner_demoInfo1";
-var STORAGE_DEMO_INFO2 = "loderunner_demoInfo2";
+var STORAGE_DEMO_INFO = "loderunner_demoInfo";
var STORAGE_FIRST_PLAY = "loderunner_firstRun";
-var STORAGE_MODERN_SCORE_INFO1 = "loderunner_modernScore1";
-var STORAGE_MODERN_SCORE_INFO2 = "loderunner_modernScore2";
+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_INFO1 = "loderunner_hiScore1";
-var STORAGE_HISCORE_INFO2 = "loderunner_hiScore2";
+var STORAGE_HISCORE_INFO = "loderunner_hiScore";
+
+var STORAGE_PLAYER_NAME = "loderunner_player";
+var STORAGE_UID = "loderunner_uid";
+
+var STORAGE_THEME_MODE = "loderunner_theme";
+
+var STORAGE_REPEAT_ACTION = "loderunner_actRepeat";
diff --git a/lodeRunner.demo.js b/lodeRunner.demo.js
index 7984f5b..359f493 100644
--- a/lodeRunner.demo.js
+++ b/lodeRunner.demo.js
@@ -23,7 +23,7 @@ function getAutoDemoLevel(initValue)
curScore = 0;
runnerLife = 1;
/* auto demo data always use demoData1 (because now can select demo levels from demo mode) , 6/12/2014
- if(playData == 2) { //lode runner 2 demo data
+ if(playData == PLAY_DATA_2) { //lode runner 2 demo data
demoLevel = 1;
demoCount = 1;
demoMaxCount = 2;
@@ -36,7 +36,7 @@ function getAutoDemoLevel(initValue)
demoCount = 1;
demoMaxCount = 3;
demoData = demoData1;
- levelData = levelData1;
+ levelData = playVersionInfo[0].verData;
demoIdx = 0;
// }
} else {
@@ -88,7 +88,13 @@ 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()
@@ -122,25 +128,90 @@ function getDemoBornPos()
// for demo mode (User select level)
//====================================
-var playerDemoData1 = [], playerDemoData2 = [];
-var noDemoData1 = 1, noDemoData2 = 1;
+//var playerDemoData = [], noDemoData = [];
+//var wDemoData1 = [], wDemoData2 = [], wDemoData3 = [], wDemoData4 = [], wDemoData5 = []; //temp temp temp
+
+var playerDemoData = [], wDemoData = [];
+var demoPlayData = 0; //for syn demo data with current playData
+var demoDataLoading = 0;
+
+/* No used
+function showGameLoading()
+{
+ lastGameState = gameState;
+ gameState = GAME_LOADING;
+ showTipsText("Loading ...", 0, 3/4); //display "Loading"
+}
+
+function hideGameLoading()
+{
+ gameState = lastGameState;
+ showTipsText("", 100); //clear text
+ //if(playMode == PLAY_MODERN && gameState == GAME_START ) demoIconObj.enable();
+}
+*/
+
+function initDemoData()
+{
+ demoPlayData = playData;
+ playerDemoData = [];
+ wDemoData = [];
+ demoDataLoading = 1;
+ getDemoData(playData); //ajax
+}
-var wHighScores1 = [], wHighScores2 = [];
-var wDemoData1 = [], wDemoData2 = [];
+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(arguments.callee.name, "Wrong Demo Data: " + jsonTxt);
+ }
+ demoDataLoading = 0;
+ if(playMode == PLAY_MODERN && gameState == GAME_START ) demoIconObj.enable();
+
+ //hideGameLoading();
+}
+/*
function initDemoModeVariable()
{
- for(var i = 0; i < wDemoData1.length; i++) {
- playerDemoData1[wDemoData1[i].level-1] = wDemoData1[i];
+ for(var i = 0; i < maxPlayId; i++) {
+ playerDemoData[i] = [];
+ noDemoData[i] = 1;
+ //wHighScore[i] = [];
+ }
+
+
+ for(var i = 0; i < wDemoData1.length; i++) { //temp
+ playerDemoData[0][wDemoData1[i].level-1] = wDemoData1[i];
+ }
+
+ for(var i = 0; i < wDemoData2.length; i++) { //temp
+ playerDemoData[1][wDemoData2[i].level-1] = wDemoData2[i];
+ }
+
+ for(var i = 0; i < wDemoData3.length; i++) { //temp
+ playerDemoData[2][wDemoData3[i].level-1] = wDemoData3[i];
+ }
+
+ for(var i = 0; i < wDemoData4.length; i++) { //temp
+ playerDemoData[3][wDemoData4[i].level-1] = wDemoData4[i];
}
- for(var i = 0; i < wDemoData2.length; i++) {
- playerDemoData2[wDemoData2[i].level-1] = wDemoData2[i];
+ for(var i = 0; i < wDemoData5.length; i++) { //temp
+ playerDemoData[4][wDemoData5[i].level-1] = wDemoData5[i];
}
- if(playerDemoData1.length > 0) noDemoData1 = 0;
- if(playerDemoData2.length > 0) noDemoData2 = 0;
+ for(var i = 0; i < maxPlayId; i++) {
+ if(playerDemoData[i].length > 0) noDemoData[i] = 0;
+ }
}
+*/
+
function initDemoInfo()
{
@@ -159,19 +230,25 @@ function initDemoInfo()
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 == 5) {
- infoJSON = getStorage(STORAGE_DEMO_INFO2);
- levelData = levelData2;
- demoData = playerDemoData2;
+
+ if (playData >= 1 && playData <= maxPlayId) {
+ infoJSON = getStorage(STORAGE_DEMO_INFO + playData);
+ levelData = getPlayVerData(playData);
+ //demoData = playerDemoData[playData-1];
+ demoData = playerDemoData;
} else {
- infoJSON = getStorage(STORAGE_DEMO_INFO1);
- levelData = levelData1;
- demoData = playerDemoData1;
- }
+ error(arguments.callee.name, "design error, value =" + playData );
+ }
if(infoJSON == null) {
curLevel = 1;
@@ -187,16 +264,12 @@ function setDemoInfo()
{
var infoObj = { l:curLevel};
var infoJSON = JSON.stringify(infoObj);
-
- switch(playData) {
- default:
- case 4:
- setStorage(STORAGE_DEMO_INFO1, infoJSON);
- break;
- case 5:
- setStorage(STORAGE_DEMO_INFO2, infoJSON);
- break;
- }
+
+ if (playData >= 1 && playData <= maxPlayId) {
+ setStorage(STORAGE_DEMO_INFO + playData, infoJSON);
+ } else {
+ error(arguments.callee.name, "design error, value =" + playData );
+ }
}
function getValidDemoLevel()
@@ -213,50 +286,77 @@ function getNextDemoLevel()
initDemoInfo();
}
+function curDemoLevelIsVaild()
+{
+ if(playData == PLAY_DATA_USERDEF) return 0;
+ //return (typeof playerDemoData[playData-1][curLevel-1] != "undefined");
+ return (typeof playerDemoData[curLevel-1] != "undefined");
+}
+
function updatePlayerDemoData(playData, demoDataInfo)
{
- var playerDemoData = null;
var level = demoDataInfo.level;
- switch(playData) {
- case 1:
- playerDemoData = playerDemoData1;
- break;
- case 2:
- playerDemoData = playerDemoData2;
- break;
- }
+ 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(playerDemoData != null) {
- if(typeof playerDemoData[level-1] == "undefined") {
- // new
- 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 //07/09/2014
- };
- } else { // always update local data
- //if( playerDemoData[level-1].time >= demoDataInfo.time) { //only udate best time
-
- //update
- playerDemoData[level-1].level = demoDataInfo.level;
- playerDemoData[level-1].ai = demoDataInfo.ai;
- playerDemoData[level-1].time = demoDataInfo.time;
- playerDemoData[level-1].state = demoDataInfo.state;
- playerDemoData[level-1].action = demoDataInfo.action;
- playerDemoData[level-1].goldDrop = demoDataInfo.goldDrop;
- playerDemoData[level-1].bornPos = demoDataInfo.bornPos;
- playerDemoData[level-1].godMode = demoDataInfo.godMode; //07/09/2014
-
+ 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(arguments.callee.name, "Wrong resp Data: " + jsonTxt);
}
}
+/*
+function updatePlayerDemoData(playData, demoDataInfo)
+{
+ var updateDemoData = playerDemoData[playData-1];
+ var level = demoDataInfo.level;
+
+ if(updateDemoData == null) updateDemoData = [];
+
+ updateDemoData[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
+ };
+ noDemoData[playData-1] = 0;
+}
+*/
+
//==============================
// Record play action for demo
//==============================
@@ -316,7 +416,7 @@ function recordModeDump(state)
function recordModeToggle(state)
{
if(recordMode == RECORD_KEY) {
- if(playMode != PLAY_AUTO && playMode != PLAY_DEMO) recordMode = RECORD_PLAY;
+ if(playMode != PLAY_AUTO && playMode != PLAY_DEMO && playMode != PLAY_DEMO_ONCE) recordMode = RECORD_PLAY;
recordModeDump(state);
} else recordMode = RECORD_KEY;
}
@@ -335,6 +435,13 @@ function processRecordKey()
}
function recordKeyAction()
+{
+ if(repeatAction) recordKeyAction1();
+ else recordKeyAction2()
+}
+
+//record key for "keyboard repeat on"
+function recordKeyAction1()
{
if(!keyPressed) return;
if(recordKeyCode != lastKeyCode || alwaysRecord) {
@@ -345,6 +452,30 @@ function recordKeyAction()
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()
@@ -423,7 +554,7 @@ function dumpRecord()
curDemoData.level = curLevel;
curDemoData.ai = AI_VERSION;
curDemoData.time = playRecordTime;
- curDemoData.state = recordState;
+ curDemoData.state = recordState; //game finish or not
curDemoData.action = [];
curDemoData.goldDrop = [];
curDemoData.bornPos = [];
diff --git a/lodeRunner.edit.js b/lodeRunner.edit.js
index 03b2d44..c489038 100644
--- a/lodeRunner.edit.js
+++ b/lodeRunner.edit.js
@@ -34,12 +34,16 @@ var tileInfo = [
var baseTile=[];
var lastRunner = null;
var lastGuardList = [];
-var editBorder;
+var editBorder, editStartX;
var testLevelInfo = {level: -1};
+var mouseInStage = 1;
function startEditMode()
{
+ soundIconObj.disable(1);
+ repeatActionIconObj.disable(1);
playMode = PLAY_EDIT;
+ playData = PLAY_DATA_USERDEF; //for title name only
mainStage.removeAllChildren();
//document.onkeydown = function() { return true; };
document.onkeydown = editHandleKeyDown;
@@ -52,6 +56,7 @@ function startEditMode()
createEditMap();
startEditTicker();
setButtonState();
+ initForPlay(); // 1/19/2015
}
function setEditSelectMenu()
@@ -82,7 +87,7 @@ function saveTestState()
function startTestMode()
{
playMode = PLAY_TEST;
- playData = 3;
+ playData = PLAY_DATA_USERDEF;
curLevel = testLevelInfo.level;
stopEditTicker();
@@ -103,46 +108,51 @@ var EDIT_PADDING = 1;
function canvasEditReSize()
{
- for (var scale = MAX_SCALE; scale >= MIN_SCALE; scale -= 0.25) {
- canvasX = (BASE_SCREEN_X+BASE_TILE_X*2) * scale+ EDIT_PADDING * (NO_OF_TILES_X+1);
- canvasY = BASE_SCREEN_Y * scale + EDIT_PADDING * (NO_OF_TILES_Y+1);
- if (canvasX <= screenX1 && canvasY <= screenY1 || scale <= MIN_SCALE) break;
+ 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');
+
+ //(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("screenX1 = " + screenX1 + " screenY1 = " + screenY1 + "scale = " + scale);
+ debug("EDIT SCALE = " + tileScale);
- canvas = document.getElementById('canvas');
+ var left = ((screenX1 - canvasX)/2|0),
+ top = ((screenY1 - canvasY)/2|0);
+
+ if(left < menuIconAreaX) left = ((screenX1 - canvasX - menuIconAreaX)/2|0);
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";
- //initial constant value
- tileScale = scale;
- tileW = BASE_TILE_X * scale;
- tileH = BASE_TILE_Y * scale;
-
- 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,
+ tileWScale = BASE_TILE_X * tileScale;
+ tileHScale = BASE_TILE_Y * tileScale;
editBorder = 4 * tileScale;
+ editStartX = (tileWScale + W2 * tileScale);
}
function createBaseTile()
{
for(var id = 0; id < tileInfo.length; id++) {
- baseTile[id] = { image: preload.getResult(tileInfo[id][0]), id: id };
+ baseTile[id] = { image: getThemeImage(tileInfo[id][0]), id: id };
}
- emptyTile = { image: preload.getResult("empty"), id: 0 };
+ emptyTile = { image: getThemeImage("empty"), id: 0 };
actTile = baseTile[1];
}
@@ -150,12 +160,11 @@ function createEditMap()
{
var tile, backColor, bitmap;
- setEditBackground();
- drawEditArea(0,0,
- (tileW+EDIT_PADDING)*NO_OF_TILES_X+EDIT_PADDING,
- (tileH+EDIT_PADDING)*NO_OF_TILES_Y+EDIT_PADDING
+ 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);
@@ -174,7 +183,7 @@ function createEditMap()
tile = new createjs.Container();
backColor = new createjs.Shape();
- backColor.graphics.beginFill("black").drawRect(0, 0, tileW, tileH).endFill();
+ backColor.graphics.beginFill("black").drawRect(0, 0, tileWScale, tileHScale).endFill();
if(id == 0) {
bitmap = new createjs.Bitmap(emptyTile.image);
} else {
@@ -183,26 +192,36 @@ function createEditMap()
bitmap.scaleX = bitmap.scaleY = tileScale;
tile.addChild(backColor, bitmap);
- tile.x = (tileW + EDIT_PADDING) * x+EDIT_PADDING;
- tile.y = (tileH + EDIT_PADDING) * y+EDIT_PADDING;
+ 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();
drawSaveButton();
drawTestButton();
drawNewButton();
+ drawLoadButton();
enableTestButton();
+ 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();
@@ -225,7 +244,7 @@ function tile2Id(tileChar)
}
}
-function setEditBackground()
+function setCanvasBackground()
{
//set background color
var background = new createjs.Shape();
@@ -233,23 +252,41 @@ function setEditBackground()
mainStage.addChild(background);
document.body.style.background = "#301050";
}
-
-function drawEditArea(startX, startY, width, height)
+
+function setEditBackground(startX, startY, width, height)
{
var editBack = new createjs.Shape();
- editBack.alpha = 0.5;
+ 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;
+ //editBack.graphics.beginFill("gold").drawRect(startX, startY, width, height);
+
+ 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 y = (tileH + EDIT_PADDING) * NO_OF_TILES_Y+EDIT_PADDING;
- var x = (tileW + EDIT_PADDING) * NO_OF_TILES_X+EDIT_PADDING;
+ 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("#0DA1FF").drawRect(0, 0, x, 10*tileScale);
+ groundTile.graphics.beginFill(getThemeTileColor()).drawRect(0, 0, x, 10*tileScale);
groundTile.x = 0;
groundTile.y = y;
@@ -258,13 +295,14 @@ function drawEditGround()
function addSelectIcon()
{
- var x = (tileW+EDIT_PADDING)*NO_OF_TILES_X+tileW/2;
+ //var x = (tileWScale+EDIT_PADDING)*NO_OF_TILES_X+tileWScale/2;
+ var x = W4 * tileScale;
var y;
for(var i = 1; i < baseTile.length; i++) {
- y = (tileH*3/2)*(i-1) + tileH*3/2;
+ y = (tileHScale*5/3)*(i-1) + tileHScale*1/4;
drawSelectIcon(i, x, y);
}
- y = (tileH*3/2)*(i-1) + tileH*3/2;
+ y = (tileHScale*5/3)*(i-1) + tileHScale*1/4;
drawSelectIcon(0, x, y);
}
@@ -275,7 +313,7 @@ function addCursorTile()
cursorTileObj = new createjs.Container();
backColor = new createjs.Shape();
- backColor.graphics.beginFill("black").drawRect(0, 0, tileW, tileH).endFill();
+ backColor.graphics.beginFill("black").drawRect(0, 0, tileWScale, tileHScale).endFill();
bitmap = new createjs.Bitmap(actTile.image);
bitmap.scaleX = bitmap.scaleY = tileScale;
@@ -326,11 +364,11 @@ function drawSelectIcon(id, x, y)
} else {
selColor = "black";
}
- border.graphics.beginFill(selColor).drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
+ 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, tileW, tileH).endFill();
+ backColor.graphics.beginFill("black").drawRect(0, 0, tileWScale, tileHScale).endFill();
//child id = 2
if(id == 0) {
@@ -358,10 +396,10 @@ function selectTileClick()
var inActBorder = selectedTile.getChildAt(0);
inActBorder.graphics.clear();
- inActBorder.graphics.beginFill("black").drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
+ inActBorder.graphics.beginFill("black").drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
actBorder.graphics.clear();
- actBorder.graphics.beginFill("red").drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
+ actBorder.graphics.beginFill("red").drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
actTile = baseTile[this.myId];
cursorTileObj.getChildAt(1).image = actTile.image;
@@ -373,7 +411,7 @@ function selectTileMouseOver()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
mainStage.cursor = 'pointer'
mouseOver = 1;
@@ -385,51 +423,53 @@ function selectTileMouseOut()
var color = (actTile.id == this.myId)?"red":"black";
border.graphics.clear();
- border.graphics.beginFill(color).drawRect(-editBorder, -editBorder, tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill(color).drawRect(-editBorder, -editBorder, tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
mouseOver = 0;
}
function drawEditLevel()
{
- var y = canvas.height - tileH - editBorder*2;
+ var x = 17.2*(tileWScale+EDIT_PADDING)+EDIT_PADDING;
+ var y = canvas.height - tileHScale - editBorder;
- drawText(0, y, "LEVEL", mainStage);
+ 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 - tileH - editBorder*2;
+ var y = canvas.height - tileHScale - editBorder;
for(var i = 0; i < editLevelNoObj.length; i++)
mainStage.removeChild(editLevelNoObj[i]);
- editLevelNoObj = drawText(5*tileW, y, ("00"+(testLevelInfo.level)).slice(-3), mainStage);
+ editLevelNoObj = drawText(26.5*(tileWScale+EDIT_PADDING), y, ("00"+(testLevelInfo.level)).slice(-3), mainStage);
}
-var testButton, newButton, saveButton;
+var testButton, newButton, saveButton, loadButton;
function drawTestButton()
{
var border, backColor, text;
var textSting = "TEST";
- var width = textSting.length * tileW;
- //var x = canvas.width - width * 1.5;
- var x = 20*(tileW+EDIT_PADDING)+EDIT_PADDING;
- var y = canvas.height - tileH - editBorder;
+ 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("black").drawRect(-editBorder, -editBorder, width+editBorder*2, tileH+editBorder*2).endFill();
+ 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, tileH).endFill();
+ backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill();
testButton.addChild(border, backColor);
@@ -446,6 +486,7 @@ function drawTestButton()
function testButtonClick()
{
+ mainStage.cursor = 'default';
startTestMode();
}
@@ -454,8 +495,12 @@ function drawTestButton()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill("red").drawRect(-editBorder, -editBorder, 4*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#ffa").drawRect(0, 0, width, tileHScale).endFill();
+
mainStage.cursor = 'pointer';
mouseOver = 1;
}
@@ -465,8 +510,13 @@ function drawTestButton()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
-
+ border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, 4*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill();
+
+
mouseOver = 0;
}
}
@@ -476,20 +526,19 @@ function drawSaveButton()
var border, backColor, text;
var textSting = "SAVE";
- var width = textSting.length * tileW;
- //var x = canvas.width - width * 1.5;
- var x = 15*(tileW+EDIT_PADDING)+EDIT_PADDING;
- var y = canvas.height - tileH - editBorder;
+ 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("black").drawRect(-editBorder, -editBorder, width+editBorder*2, tileH+editBorder*2).endFill();
+ 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, tileH).endFill();
+ backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill();
saveButton.addChild(border, backColor);
@@ -517,7 +566,11 @@ function drawSaveButton()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill("red").drawRect(-editBorder, -editBorder, 4*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#ffa").drawRect(0, 0, width, tileHScale).endFill();
mainStage.cursor = 'pointer';
mouseOver = 1;
@@ -528,7 +581,11 @@ function drawSaveButton()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, 4*tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, 4*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#fff").drawRect(0, 0, width, tileHScale).endFill();
mouseOver = 0;
}
@@ -548,7 +605,7 @@ function drawSaveButton()
function startPlayUserLevel()
{
playMode = PLAY_MODERN;
- playData = 3;
+ playData = PLAY_DATA_USERDEF;
curLevel = testLevelInfo.level;
setModernInfo();
@@ -568,7 +625,7 @@ function editLevelModified()
function editConfirmAbortState(callbackFun)
{
stopEditTicker();
- yesNoDialog(["Abort current edit ?"], yesBitmap, noBitmap, mainStage, tileScale,
+ yesNoDialog(["Abort current editing ?"], yesBitmap, noBitmap, mainStage, tileScale,
function(rc) { if(rc) callbackFun(); else startEditTicker(); });
}
@@ -576,19 +633,19 @@ function drawNewButton()
{
var border, backColor, text;
var textSting = "NEW";
- var width = textSting.length * tileW;
- var x = 25*(tileW+EDIT_PADDING)+EDIT_PADDING;
- var y = canvas.height - tileH - editBorder;
+ 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("black").drawRect(-editBorder, -editBorder, width+editBorder*2, tileH+editBorder*2).endFill();
+ 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, tileH).endFill();
+ backColor.graphics.beginFill("#FFF").drawRect(0, 0, width, tileHScale).endFill();
newButton.addChild(border, backColor);
@@ -616,6 +673,8 @@ function drawNewButton()
disableTestButton();
}
clearTestLevel();
+ testLevelInfo.fromPlayData = -1;
+ testLevelInfo.fromLevel = -1;
}
startEditTicker();
}
@@ -624,7 +683,7 @@ function drawNewButton()
{
stopEditTicker();
if(testLevelInfo.modified) {
- yesNoDialog(["Abort current edit ?"], yesBitmap, noBitmap, mainStage, tileScale, newLevel);
+ yesNoDialog(["Abort current editing ?"], yesBitmap, noBitmap, mainStage, tileScale, newLevel);
} else {
newLevel(1);
}
@@ -635,7 +694,11 @@ function drawNewButton()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("gold").drawRect(-editBorder, -editBorder, 3*tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill("red").drawRect(-editBorder, -editBorder, 3*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#ffa").drawRect(0, 0, width, tileHScale).endFill();
mainStage.cursor = 'pointer';
mouseOver = 1;
@@ -646,8 +709,154 @@ function drawNewButton()
var border = this.getChildAt(0);
border.graphics.clear();
- border.graphics.beginFill("black").drawRect(-editBorder, -editBorder, 3*tileW+editBorder*2, tileH+editBorder*2).endFill();
+ border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, 3*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#fff").drawRect(0, 0, width, tileHScale).endFill();
+
+ mouseOver = 0;
+ }
+}
+
+//========================
+// LOAD BUTTON
+// 05/21/2015
+//========================
+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);
+ loadButton.on('mouseover', loadButtonMouseOver);
+ loadButton.on('mouseout', loadButtonMouseOut);
+ mainStage.addChild(loadButton);
+ initLoadVariable();
+
+
+ function saveState()
+ {
+ saveStateObj = saveKeyHandler(noKeyDown);
+ stopEditTicker();
+ }
+
+ function restoreState()
+ {
+ restoreKeyHandler(saveStateObj);
+ startEditTicker();
+ }
+
+ 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 loadButtonMouseOver()
+ {
+ var border = this.getChildAt(0);
+
+ border.graphics.clear();
+ border.graphics.beginFill("red").drawRect(-editBorder, -editBorder, 4*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#ffa").drawRect(0, 0, width, tileHScale).endFill();
+
+ mainStage.cursor = 'pointer';
+ mouseOver = 1;
+ }
+
+ function loadButtonMouseOut()
+ {
+ var border = this.getChildAt(0);
+
+ border.graphics.clear();
+ border.graphics.beginFill("#40F").drawRect(-editBorder, -editBorder, 4*tileWScale+editBorder*2, tileHScale+editBorder*2).endFill();
+ var backColor = this.getChildAt(1);
+ backColor.graphics.clear();
+ backColor.graphics.beginFill("#fff").drawRect(0, 0, width, tileHScale).endFill();
+
mouseOver = 0;
}
}
@@ -691,7 +900,7 @@ function disableTestButton()
function clearUserLevelScore()
{
- playData = 3;
+ playData = PLAY_DATA_USERDEF;
getModernScoreInfo();
modernScoreInfo[testLevelInfo.level-1] = -1;
setModernScoreInfo();
@@ -699,7 +908,7 @@ function clearUserLevelScore()
function delUserLevelScore(level)
{
- playData = 3;
+ playData = PLAY_DATA_USERDEF;
getModernScoreInfo();
modernScoreInfo.splice(level-1, 1);
modernScoreInfo[MAX_EDIT_LEVEL-1] = -1;
@@ -808,7 +1017,7 @@ function delManCheck(id, x, y)
guardTile.id = emptyTile.id;
lastGuardList.splice(removeId,1);
} else {
- console.log("design error !");
+ error(arguments.callee.name, "design error !");
}
break;
}
@@ -845,6 +1054,7 @@ function editSelectLevel(level)
{
testLevelInfo.level = level;
testLevelInfo.levelMap = editLevelData[level-1];
+ testLevelInfo.fromPlayData = testLevelInfo.fromLevel = -1;
setTestLevel(testLevelInfo);
startEditMode();
}
@@ -861,6 +1071,28 @@ function map2LevelData()
}
}
+function editMapIsEmpty()
+{
+ 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) return 0;
+ }
+ }
+ return 1;
+}
+
+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
//==============================
@@ -870,13 +1102,13 @@ function editWarningMsg(hidden)
var x, y, width, height;
if(editWarningText == null)
- editWarningText = new createjs.Text("Too many user created levels !",
+ editWarningText = new createjs.Text("Too many custom levels !",
"bold " + (64*tileScale) + "px Helvetica", "#fc5c1c");
width = editWarningText.getBounds().width;
height = editWarningText.getBounds().height;
- x = editWarningText.x = (NO_OF_TILES_X*(tileW+EDIT_PADDING) - width) / 2 | 0;
- y = editWarningText.y = (NO_OF_TILES_Y*tileH - height) / 2 | 0;
+ x = editWarningText.x = (NO_OF_TILES_X*(tileWScale+EDIT_PADDING) - width) / 2 | 0;
+ y = editWarningText.y = (NO_OF_TILES_Y*tileHScale - height) / 2 | 0;
editWarningText.shadow = new createjs.Shadow("white", 2, 2, 1);
if(hidden) {
@@ -887,21 +1119,30 @@ function editWarningMsg(hidden)
mainStage.update();
}
-var copyLevelMap = null;
+var copyLevelMap = null, copyLevelPassed = 0;
function editHandleKeyDown(event)
{
if(!event){ event = window.event; } //cross browser issues exist
if (event.ctrlKey) {
- if(event.keyCode == KEYCODE_V) { //CTRL-V
+ switch(event.keyCode) {
+ case KEYCODE_C: //CTRL-C : copy current level
+ 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) {
testLevelInfo.levelMap = copyLevelMap;
- testLevelInfo.pass = 1;
+ testLevelInfo.modified = 1;
+ testLevelInfo.pass = copyLevelPassed;
+ testLevelInfo.fromPlayData = testLevelInfo.fromLevel = -1;
setTestLevel(testLevelInfo);
startEditMode();
////setButtonState();
- setTimeout(function() { showTipsText("PASTE MAP", 0);}, 50);
+ setTimeout(function() { showTipsText("PASTE MAP", 1500);}, 50);
}
+ break;
}
}
return true;
@@ -909,21 +1150,23 @@ function editHandleKeyDown(event)
function editTick()
{
- var x = ((mainStage.mouseX-EDIT_PADDING) / (tileW+EDIT_PADDING) )| 0;
- var y = ((mainStage.mouseY-EDIT_PADDING) / (tileH+EDIT_PADDING) )| 0;
+ 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) {
mainStage.cursor = 'default';
mainStage.update();
return;
}
- if(x >= 0 && x < NO_OF_TILES_X && y >= 0 && y < NO_OF_TILES_Y) {
+ //debug(mainStage.mouseX,editStartX, x,y);
+ if(mouseInStage && x >= 0 && x < NO_OF_TILES_X && y >= 0 && y < NO_OF_TILES_Y) {
//edit area
mainStage.cursor = 'pointer';
if( x != lastDown.x || y != lastDown.y) {
cursorTileObj.alpha = 1;
- cursorTileObj.x = (tileW + EDIT_PADDING) * x+EDIT_PADDING;
- cursorTileObj.y = (tileH + EDIT_PADDING) * y+EDIT_PADDING;
+ cursorTileObj.x = (tileWScale + EDIT_PADDING) * x+EDIT_PADDING + editStartX;
+ cursorTileObj.y = (tileHScale + EDIT_PADDING) * y+EDIT_PADDING;
if(mouseDown) {
var clickTile = editMap[x][y];
diff --git a/lodeRunner.gameVerName.js b/lodeRunner.gameVerName.js
new file mode 100644
index 0000000..b0f7a8f
--- /dev/null
+++ b/lodeRunner.gameVerName.js
@@ -0,0 +1 @@
+var gameVersionName = [ " Classic Lode Runner ", " Championship Lode Runner ", " Professional Lode Runner ", " Revenge of Lode Runner ", " Lode Runner Fan Book " ];
\ No newline at end of file
diff --git a/lodeRunner.guard.js b/lodeRunner.guard.js
index 53b7b29..bad7f32 100644
--- a/lodeRunner.guard.js
+++ b/lodeRunner.guard.js
@@ -3,23 +3,25 @@
// http://www.kingstone.com.tw/book/book_page.asp?kmcode=2014710650538
//=============================================================================
-var movePolicy = [ [0, 0, 0], //* move_map is used to find *//
- [0, 1, 1], //* wheather to move a enm *//
- [1, 1, 1], //* by indexing into it with *//
- [1, 2, 1], //* enm_byte + num_enm + *//
- [1, 2, 2], //* set_num to get a byte. *//
- [2, 2, 2], //* then that byte is checked*//
- [2, 2, 3], //* for !=0 and then decrmnt *//
- [2, 3, 3], //* for next test until = 0 *//
- [3, 3, 3],
- [3, 3, 4],
- [3, 4, 4],
- [4, 4, 4]
+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
//********************************
@@ -36,7 +38,7 @@ function moveGuard()
if(!guardCount) return; //no guard
- if( ++moveOffset >= 3 ) moveOffset = 0;
+ if( ++moveOffset >= numOfMoveItems ) moveOffset = 0;
moves = movePolicy[guardCount][moveOffset]; // get next moves
while ( moves-- > 0) { // slows guard relative to runner
@@ -198,7 +200,11 @@ function guardMoveStep( id, action)
if(map[x][y].act == RUNNER_T) setRunnerDead(); //collision
//map[x][y].act = GUARD_T;
}
- if(action == ACT_DOWN && yOffset >= 0 && yOffset < yMove) { //try drop gold
+
+ //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
}
@@ -213,10 +219,16 @@ function guardMoveStep( id, action)
decGold(); //gold disappear
}
curGuard.hasGold = 0;
- curGuard.sprite.on("animationend", function() { climbOut(id); });
- soundPlay("trap");
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 {
@@ -326,8 +338,10 @@ function guardMoveStep( id, action)
)
)
{
- curGuard.hasGold = ((Math.random()*26)+14)|0; //14 - 39
- if(playMode == PLAY_AUTO || playMode == PLAY_DEMO) getDemoGold(curGuard);
+ //curGuard.hasGold = ((Math.random()*26)+14)|0; //14 - 39
+ curGuard.hasGold = ((Math.random()*26)+12)|0; //12 - 37 change gold drop steps
+
+ 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);
@@ -368,6 +382,95 @@ function dropGold(id)
}
}
+
+//=============================================
+// BEGIN NEW SHAKE METHOD for AI version >= 3
+//=============================================
+var DEBUG_TIME = 0;
+var shakeRight = [ 8, 9, 10, 9, 10, 8 ];
+var shakeLeft = [ 19, 20, 21, 20, 21, 19 ];
+var shakeTime = [ 36, 3, 3, 3, 3, 3 ];
+
+var shakingGuardList = [];
+
+function initStillFrameVariable()
+{
+ initGuardShakeVariable();
+ initFillHoleVariable();
+ initRebornVariable();
+}
+
+function initGuardShakeVariable()
+{
+ shakingGuardList = [];
+}
+
+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(arguments.callee.name, "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(arguments.callee.name, "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(arguments.callee.name, "remove id =" + id + "(" + shakingGuardList + ")" );
+ return;
+ }
+ }
+ error(arguments.callee.name, "design error id =" + id + "(" + shakingGuardList + ")" );
+}
+
+//======================
+// END NEW SHAKE METHOD
+//======================
+
function climbOut(id)
{
var curGuard = guard[id]
@@ -377,6 +480,8 @@ function climbOut(id)
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)
@@ -704,14 +809,17 @@ function guardReborn(x, y)
var bornX = bornRndX.get();
var rndStart = bornX;
- while(map[bornX][bornY].act != EMPTY_T) { //BUG FIXED for level 115 (can not reborn at bornX=27)
- if( (bornX = bornRndX.get()) == rndStart) {
+
+ 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) {
+ if(playMode == PLAY_AUTO || playMode == PLAY_DEMO || playMode == PLAY_DEMO_ONCE) {
var bornPos = getDemoBornPos();
bornX = bornPos.x;
bornY = bornPos.y;
@@ -732,9 +840,15 @@ function guardReborn(x, y)
curGuard.pos = { x:bornX, y:bornY, xOffset:0, yOffset: 0 };
curGuard.sprite.x = bornX * tileWScale | 0;
curGuard.sprite.y = bornY * tileHScale | 0;
- curGuard.sprite.on("animationend", function() { rebornComplete(id); });
- curGuard.sprite.gotoAndPlay("reborn");
+ 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;
@@ -752,10 +866,66 @@ function rebornComplete(id)
guard[id].shape = "fallRight";
//guard[id].hasGold = 0;
guard[id].sprite.gotoAndPlay("fallRight");
- soundPlay("reborn");
+ 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 = [ 17, 18 ];
+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
+//====================
diff --git a/lodeRunner.hiscore.js b/lodeRunner.hiscore.js
index 9c03bd2..e231d1e 100644
--- a/lodeRunner.hiscore.js
+++ b/lodeRunner.hiscore.js
@@ -1,5 +1,5 @@
-function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
+function showScoreTable(_playData, _curScoreInfo, _callbackFun, _waitTime)
{
var hiScoreInfo;
var canvas2, scoreStage;
@@ -12,7 +12,7 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
function init()
{
- getHiScoreInfo();
+ var haveInfo = getHiScoreInfo();
if(_curScoreInfo) {
recordId = updateScoreInfo();
@@ -22,13 +22,20 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
}
}
+ if(!haveInfo && !_curScoreInfo) {
+ if(_callbackFun) _callbackFun();
+ return; //no score info don't need display
+ }
+
createCanvas2();
createScoreStage();
setScoreBackground();
drawHiScoreList();
scoreStage.update();
if(recordId >= 0) {
- inputHiScoreName();
+ var winner = 0;
+ if('w' in _curScoreInfo) winner = 1;
+ inputHiScoreName(winner);
} else {
anyKeyHandler();
if(typeof _waitTime == "undefined") _waitTime = 3500;
@@ -45,55 +52,30 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
function getHiScoreInfo()
{
- var infoJSON, levelMap;
-
- if(_dataId == 1) {
- infoJSON = getStorage(STORAGE_HISCORE_INFO2);
- } else {
- infoJSON = getStorage(STORAGE_HISCORE_INFO1);
- }
+ 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};
}
-
- if(_dataId == 1) {
- hiScoreInfo[0].n = "STEVE JOBS";
- hiScoreInfo[0].l = 1;
- hiScoreInfo[0].s = 2500;
-
- hiScoreInfo[1].n = "BILL GATES";
- hiScoreInfo[1].l = 1;
- hiScoreInfo[1].s = 1500;
- } else {
- hiScoreInfo[0].n = "SIMON";
- hiScoreInfo[0].l = 1;
- hiScoreInfo[0].s = 3500;
-
- hiScoreInfo[1].n = "PETER PAN";
- hiScoreInfo[1].l = 1;
- hiScoreInfo[1].s = 2000;
-
- hiScoreInfo[2].n = "DASH PARR"; // The Incredibles. He is the son of Bob Parr and Helen Parr (小飛)
- hiScoreInfo[2].l = 1;
- hiScoreInfo[2].s = 1000;
- }
}
+ return rc;
}
function setHiScoreInfo()
{
var infoJSON = JSON.stringify(hiScoreInfo);
-
- if(_dataId == 1)
- setStorage(STORAGE_HISCORE_INFO2, infoJSON);
- else
- setStorage(STORAGE_HISCORE_INFO1, infoJSON);
+ setStorage(STORAGE_HISCORE_INFO + _playData, infoJSON);
+
}
function updateScoreInfo()
@@ -153,7 +135,7 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
function getNameStartPos(nameLength, itemId)
{
- var x = (4+(MAX_HISCORE_NAME_LENGTH-nameLength)/2)*tileWScale;
+ var x = (3.75+(MAX_HISCORE_NAME_LENGTH-nameLength)/2)*tileWScale;
var y = (itemId * 1.2 + 5) * tileHScale;
return { x: x, y: y };
@@ -161,16 +143,22 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
function drawHiScoreList()
{
- var title = "LODE RUNNER " + ((_dataId == 1)?"2":"1") + " HIGH SCORES";
+ //var title = playDataName[_playData-1] + " HIGH SCORES";
+ var title = playDataToTitleName(_playData);
+ var localHighScore = "LOCAL HIGH SCORES";
var barTile;
- drawText((NO_OF_TILES_X-title.length)/2*tileWScale, 0.5*tileHScale, title, scoreStage);
+ //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*tileWScale, 3*tileHScale, "NAME", scoreStage);
- drawText(14.5*tileWScale, 3*tileHScale, "LEVEL SCORE", 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 = new createjs.Bitmap(preload.getResult("ground"));
+ barTile = new createjs.Bitmap(getThemeImage("ground"));
barTile.setTransform(x * tileWScale, 4.5*tileHScale , tileScale, tileScale);
scoreStage.addChild(barTile);
}
@@ -178,14 +166,14 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
for(var i = 0; i < MAX_HISCORE_RECORD; i++) {
var pos = getNameStartPos(hiScoreInfo[i].n.length, i);
- drawText(0.5*tileWScale, pos.y, ("0"+(i+1)).slice(-2) + ".", scoreStage); //no
+ 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(15.5*tileWScale, pos.y, ("00"+hiScoreInfo[i].l).slice(-3), scoreStage); //level
- drawText(20.5*tileWScale, pos.y, ("000000"+hiScoreInfo[i].s).slice(-7), scoreStage); //score
+ 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
}
}
}
@@ -208,25 +196,29 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
document.onkeydown = savedKeyDownHander;
}
- function inputHiScoreName()
+ 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()
{
- name = []; //array of char
+ curPos = playerName.length;
+ name = playerName.split(""); //string to array;
nameText = []; //text object
- var pos = getNameStartPos(0, recordId);
+ 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);
}
@@ -237,22 +229,27 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
document.onkeydown = handleHiScoreName;
}
- function cutTailSpace()
+ 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;
}
- }
-
- function inputFinish()
- {
- cutTailSpace();
+
+ var nameString = name.join(""); //array to string
redrawName();
//update name for score info
- hiScoreInfo[recordId].n = array2String(name);
+ hiScoreInfo[recordId].n = nameString;
setHiScoreInfo();
+
+ if(nameString != playerName && nameString != "???") { //set and save playerName
+ playerName = nameString;
+ setPlayerName(nameString);
+ }
//remove cursor
scoreStage.removeChild(cursor);
@@ -267,21 +264,12 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
for(var i = 0; i < nameText.length; i++)
scoreStage.removeChild(nameText[i]);
}
-
- function array2String(name)
- {
- var nameString = "";
- for(var i = 0; i < name.length; i++) {
- nameString += name[i];
- }
- return nameString;
- }
-
+
function redrawName()
{
var pos = getNameStartPos(name.length, recordId);
removeNameText();
- nameText = drawText(pos.x, pos.y, array2String(name), scoreStage, "D");
+ nameText = drawText(pos.x, pos.y, name.join(""), scoreStage, "D");
//change cursor position
if(name.length > 0) cursor.x = pos.x + curPos * tileWScale;
@@ -339,6 +327,7 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
case (code == KEYCODE_ENTER): //ENTER
if(name.length > 0) inputFinish(true); //async
else soundPlay("beep");
+ break;
default:
//debug(code);
if(code > 32) soundPlay("beep"); //wrong key code
@@ -350,3 +339,194 @@ function showScoreTable(_dataId, _curScoreInfo, _callbackFun, _waitTime)
}
}
}
+
+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 inputString(_stage, _maxSize, _startX, _startY, _defaultString, _callbackFun)
+{
+ var inputText, inputObj;
+ var curPos = 0;
+ var savedKeyDownHander, hiScoreTicker;
+ var cursor;
+
+ initInput();
+
+ function initInput()
+ {
+ 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 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_ENTER): //ENTER
+ if(inputText.length > 0) {
+ 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(""));
+ }
+}
diff --git a/lodeRunner.html b/lodeRunner.html
index ab6e994..60215c5 100644
--- a/lodeRunner.html
+++ b/lodeRunner.html
@@ -13,31 +13,44 @@
*
* 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
*
- * by Simon Hung 06/20/2014, 11/23/2014 (http://simonsays-tw.com)
+ * by Simon Hung 06/20/2014, 11/23/2014, 06/29/2015 (http://simonsays-tw.com)
* =============================================================================
-->
+
-
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
@@ -45,10 +58,12 @@
+
+
-
-
-
+
+
+