diff --git a/lodeRunner.def.js b/lodeRunner.def.js index 461ad18..589f9f6 100644 --- a/lodeRunner.def.js +++ b/lodeRunner.def.js @@ -21,59 +21,6 @@ var MIN_SCALE = 0.5, 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, @@ -198,3 +145,117 @@ var STORAGE_GAMEPAD_MODE = "loderunner_gamepadMode"; // backup & restore file header //================================ var LRWG_FILE_START_INFO = "LODE RUNNER WEB GAME."; + +//================================ +// keyCode and code relations +//================================ + +var actionKeyMapping = [ + [ "KeyA", "ArrowLeft"], //move left + [ "KeyD", "ArrowRight"], //move right + [ "KeyW", "ArrowUp"], //move up + [ "KeyS", "ArrowDown"], //move down + [ "KeyQ", "KeyZ"], //dig left + [ "KeyE", "KeyX"], //dig right + [ "Comma", "KeyZ"], //dig left + [ "Period", "KeyX"] //dig right + ]; + +var MAPKEYCODE = { + 8: "Backspace", + 9: "Tab", + 13: "Enter", + 16: "ShiftLeft", + 17: "ControlLeft", + 18: "AltLeft", + 19: "Pause", + 20: "CapsLock", + 27: "Escape", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "ArrowLeft", + 38: "ArrowUp", + 39: "ArrowRight", + 40: "ArrowDown", + 45: "Insert", + 46: "Delete", + 48: "Digit0", + 49: "Digit1", + 50: "Digit2", + 51: "Digit3", + 52: "Digit4", + 53: "Digit5", + 54: "Digit6", + 55: "Digit7", + 56: "Digit8", + 57: "Digit9", + 65: "KeyA", + 66: "KeyB", + 67: "KeyC", + 68: "KeyD", + 69: "KeyE", + 70: "KeyF", + 71: "KeyG", + 72: "KeyH", + 73: "KeyI", + 74: "KeyJ", + 75: "KeyK", + 76: "KeyL", + 77: "KeyM", + 78: "KeyN", + 79: "KeyO", + 80: "KeyP", + 81: "KeyQ", + 82: "KeyR", + 83: "KeyS", + 84: "KeyT", + 85: "KeyU", + 86: "KeyV", + 87: "KeyW", + 88: "KeyX", + 89: "KeyY", + 90: "KeyZ", + 91: "MetaLeft", + 93: "ContextMenu", + 96: "Numpad0", + 97: "Numpad1", + 98: "Numpad2", + 99: "Numpad3", + 100: "Numpad4", + 101: "Numpad5", + 102: "Numpad6", + 103: "Numpad7", + 104: "Numpad8", + 105: "Numpad9", + 106: "NumpadMultiply", + 107: "NumpadAdd", + 109: "NumpadSubtract", + 110: "NumpadDecimal", + 111: "NumpadDivide", + 112: "F1", + 113: "F2", + 114: "F3", + 115: "F4", + 116: "F5", + 117: "F6", + 118: "F7", + 119: "F8", + 120: "F9", + 121: "F10", + 122: "F11", + 123: "F12", + 186: "Semicolon", + 187: "Equal", + 188: "Comma", + 189: "Minus", + 190: "Period", + 191: "Slash", + 192: "Backquote", + 219: "BracketLeft", + 220: "Backslash", + 221: "BracketRight", + 222: "Quote" + }; \ No newline at end of file diff --git a/lodeRunner.demo.js b/lodeRunner.demo.js index e0ec858..20f722b 100644 --- a/lodeRunner.demo.js +++ b/lodeRunner.demo.js @@ -57,7 +57,6 @@ function countAutoDemoTimer() { if(demoCountEnable) { demoCountTime++; - //debug(demoCountTime); if(demoCountTime > MAX_DEMO_WAIT_COUNT) { disableAutoDemoTimer(); gameState = GAME_WAITING; @@ -88,7 +87,7 @@ function playDemo() if(demoRecordIdx < demoRecord.length) { if(demoRecord[demoRecordIdx*2] == demoTickCount) { //loadingTxt.text = demoRecordIdx + " " + demoTickCount ; //for debug - pressKey(demoRecord[demoRecordIdx*2+1]); + pressKey(keyCodeToEventCode(demoRecord[demoRecordIdx*2+1])); demoRecordIdx++; } } @@ -214,7 +213,7 @@ function getNextDemoLevel() initDemoInfo(); } -function curDemoLevelIsVaild() +function curDemoLevelIsValid() { if(playData == PLAY_DATA_USERDEF) return 0; return (playerDemoData.length >= curLevel && typeof playerDemoData[curLevel-1] != "undefined"); @@ -319,6 +318,7 @@ function recordModeDump(state) dumpRecord(); } + function recordModeToggle(state) { if(recordMode == RECORD_KEY) { @@ -352,7 +352,8 @@ function recordKeyAction1() if(!keyPressed) return; if(recordKeyCode != lastKeyCode || alwaysRecord) { playRecord.push(recordCount); - playRecord.push(recordKeyCode); + code=codeToEventKeyCode(recordKeyCode) + playRecord.push(codeToEventKeyCode(recordKeyCode)); lastKeyCode = recordKeyCode; } keyPressed = 0; @@ -366,19 +367,20 @@ function recordKeyAction2() case 1: //pressed if(recordKeyCode != lastKeyCode || alwaysRecord) { playRecord.push(recordCount); - playRecord.push(recordKeyCode); + code=codeToEventKeyCode(recordKeyCode) + playRecord.push(codeToEventKeyCode(recordKeyCode)); lastKeyCode = recordKeyCode; } if(alwaysRecord) keyPressed = -1; //floating break; case 0: //release - if(recordKeyCode != KEYCODE_SPACE) { + if(recordKeyCode != "Space") { playRecord.push(recordCount); - playRecord.push(KEYCODE_SPACE); - lastKeyCode = recordKeyCode = KEYCODE_SPACE; + playRecord.push(codeToEventKeyCode("Space")); + lastKeyCode = recordKeyCode = "Space"; keyAction = ACT_STOP; } - break; + break; } } @@ -389,7 +391,8 @@ function recordPlayDemo() if(recordIdx < playRecord.length) { if(playRecord[recordIdx*2] == recordCount) { //loadingTxt.text = recordIdx; //for debug - pressKey(playRecord[recordIdx*2+1]); + code=playRecord[recordIdx*2+1]; + pressKey(keyCodeToEventCode(demoRecord[demoRecordIdx*2+1])); recordIdx++; } } @@ -429,17 +432,6 @@ function recordPlayTime(state) 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() @@ -454,6 +446,21 @@ function remapActionKey() } } +function codeToEventKeyCode(code) +{ + for (const [key, value] of Object.entries(MAPKEYCODE)) { + if (value === code) { + return Number(key); + } + } + return 0; +} + +function keyCodeToEventCode(keyCode) +{ + return MAPKEYCODE[keyCode] || ""; +} + function convertBornPos() { var len, offset = 1; @@ -475,7 +482,6 @@ var curDemoData = { ai: AI_VERSION, time: 0 }; //bug fixed: when press CTRL-C wi function dumpRecord() { var txtStr; - curDemoData = {}; curDemoData.level = curLevel; curDemoData.ai = AI_VERSION; @@ -511,7 +517,7 @@ function dumpRecord() for(var i = 1; i < playRecord.length; i++) { txtStr += ", " + playRecord[i]; } - debug(txtStr+ " ], //" + (playRecord.length/2)); + debug(txtStr+ " ],"); } else { debug(" action: [ ],"); } diff --git a/lodeRunner.edit.js b/lodeRunner.edit.js index 2128dc4..6441113 100644 --- a/lodeRunner.edit.js +++ b/lodeRunner.edit.js @@ -1032,15 +1032,15 @@ 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 + switch(event.code) { + case "KeyC": //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 + case "KeyV": //CTRL-V : paste copy map if(copyLevelMap != null && editMapIsEmpty && testLevelInfo.level <= MAX_EDIT_LEVEL) { editPasteMap(); } diff --git a/lodeRunner.gamepad.js b/lodeRunner.gamepad.js index 4488cbe..d32c82d 100644 --- a/lodeRunner.gamepad.js +++ b/lodeRunner.gamepad.js @@ -108,15 +108,15 @@ function getLastGamepadInfo() 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 + [["ArrowUp", 0, 0], ["ArrowUp", 0, 0]], //up + [["ArrowDown", 0, 0], ["ArrowDown", 0, 0]], //down + [["ArrowLeft", 0, 0], ["ArrowLeft", 0, 0]], //left + [["ArrowRight", 0, 0], ["ArrowRight", 0, 0]], //right + [["KeyZ", 0, 0], ["Enter", 0, 0]], //dig-left + [["KeyX", 0, 0], ["Enter", 0, 0]], //dig-right + [["Escape", 0, 0], ["Enter", 0, 0]], //pause + [["Enter", 0, 0], ["Enter", 0, 0]], //enter + [["KeyA", 1, 0], ["Enter", 0, 0]] //game abort ]; var gameButtonMapping = [ @@ -237,7 +237,7 @@ 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]}; + var event = {code: key[0], ctrlKey: key[1], shiftKey: key[2]}; //console.log("sendKeyUp = %d",keyCode ); if(typeof document.onkeydown == "function" ) document.onkeyup(event); gamepadLastId = id; @@ -248,7 +248,7 @@ 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]}; + var event = {code: key[0], ctrlKey: key[1], shiftKey: key[2]}; //console.log("sendKeyDown = %d",keyCode ); if(typeof document.onkeydown == "function" ) document.onkeydown(event); gamepadLastId = id; diff --git a/lodeRunner.hiscore.js b/lodeRunner.hiscore.js index fb4f093..d679994 100644 --- a/lodeRunner.hiscore.js +++ b/lodeRunner.hiscore.js @@ -309,73 +309,74 @@ function showScoreTable(_playData, _curScoreInfo, _callbackFun, _waitTime) 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 + if (!event) { event = window.event; } + + let key = event.key; + + if (curPos >= MAX_HISCORE_NAME_LENGTH && + key !== "Backspace" && key !== "ArrowLeft" && key !== "Enter") { + soundPlay("beep"); 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; + + switch (true) { + // 0–9 + case /^[0-9]$/.test(key): + if (curPos === 0) { soundPlay("beep"); break; } + name[curPos++] = key; + break; + // A–Z a–z + case /^[a-zA-Z]$/.test(key): + name[curPos++] = key.toUpperCase(); + break; + case (key === "."): + if (curPos === 0) { soundPlay("beep"); break; } //first char except '. ' + name[curPos++] = "."; + break; + case (key === "-"): + if (curPos === 0) { soundPlay("beep"); break; } //first char except '-' + name[curPos++] = "-"; + break; + case (key === " "): //space + if (curPos === 0) { soundPlay("beep"); break; } //first char except 'scace' + name[curPos++] = " "; + break; + case (key === "Backspace"): + if (curPos === 0) break; + name.splice(--curPos, 1); + break; + case (key === "ArrowLeft"): + if (curPos > 0) curPos--; + break; + case (key === "ArrowRight"): + if (curPos < name.length) curPos++; + break; + case (key === "ArrowUp"): + name[curPos] = nextChar(name[curPos], 1); + break; + case (key === "ArrowDown"): + name[curPos] = nextChar(name[curPos], -1); + break; + case (key === "Enter"): + if (validPlayerName(name)) { + restoreKeyDownHandler(); // avoid type "ENTER" twice + inputFinish(true); // async + } else { + soundPlay("beep"); + } + break; + + default: + if (key.length > 1) soundPlay("beep"); // wrong key code + break; } - + redrawName(); return false; } } } - + function inputPlayerName(_stage, _callbackFun) { var constString = "PLAYER NAME:" @@ -434,7 +435,7 @@ function inputPlayerName(_stage, _callbackFun) } } -function vaildPlayerName(playerArray) +function validPlayerName(playerArray) { var len = playerArray.length; @@ -512,80 +513,104 @@ function inputString(_stage, _maxSize, _startX, _startY, _defaultString, _callba 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; + if (typeof charValue !== "string" || charValue.length === 0) { + charValue = " "; } + + let code = charValue.toUpperCase().charCodeAt(0); + + if (code < 65 || code > 90) { //out of A-Z + code = 65; + } + + // nextMode >= 0 → next char else previous + code += (nextMode >= 0) ? 1 : -1; + + if (code > 90) code = 65; + if (code < 65) 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 + function handleStringInput(event) { + if (!event) event = window.event; + + let key = event.key; + + if ( + curPos >= _maxSize && + !["Backspace", "ArrowLeft", "Enter"].includes(key) + ) { + soundPlay("beep"); return false; } + + switch (true) { + // 0–9 + case /^[0-9]$/.test(key): + if (curPos === 0) { soundPlay("beep"); break; } + inputText[curPos++] = key; + break; + + // A–Z a-z + case /^[a-zA-Z]$/.test(key): + inputText[curPos++] = key.toUpperCase(); + break; + + // '.' + case key === ".": + if (curPos === 0) { soundPlay("beep"); break; } + inputText[curPos++] = "."; + break; + + // '-' + case key === "-": + if (curPos === 0) { soundPlay("beep"); break; } + inputText[curPos++] = "-"; + break; + + // Space + case key === " ": + if (curPos === 0) { soundPlay("beep"); break; } + inputText[curPos++] = " "; + break; + + // Backscape + case key === "Backspace": + if (curPos === 0) break; + inputText.splice(--curPos, 1); + break; - 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; + // arrows + case key === "ArrowLeft": + if (curPos > 0) curPos--; + break; + case key === "ArrowRight": + if (curPos < inputText.length) curPos++; + break; + case key === "ArrowUp": + inputText[curPos] = nextChar(inputText[curPos], 1); + break; + case key === "ArrowDown": + inputText[curPos] = nextChar(inputText[curPos], -1); + break; + + // validation + case key === "Enter": + if (validPlayerName(inputText)) { + inputFinish(); + return true; + } else { + soundPlay("beep"); + } + break; + + default: + //wrong key code + if (key.length === 1 && key.charCodeAt(0) > 32) soundPlay("beep"); + break; } - + drawString(); return false; } diff --git a/lodeRunner.iconClass.js b/lodeRunner.iconClass.js index 79001eb..b75de37 100644 --- a/lodeRunner.iconClass.js +++ b/lodeRunner.iconClass.js @@ -362,7 +362,7 @@ function demoIconClass( _screenX1, _screenY1, _scale, _bitmap) this.enable = function () { - if(!curDemoLevelIsVaild()) { + if(!curDemoLevelIsValid()) { self.disable(1); return; } diff --git a/lodeRunner.info.js b/lodeRunner.info.js index af534e5..43e7278 100644 --- a/lodeRunner.info.js +++ b/lodeRunner.info.js @@ -406,7 +406,7 @@ function infoMenuClass(_stage, _scale) function InfoKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist - if(event.keyCode == KEYCODE_ESC) { + if(event.code == "Escape") { closeInfoMenu(); } return false; diff --git a/lodeRunner.key.js b/lodeRunner.key.js index b37638e..fafc09e 100644 --- a/lodeRunner.key.js +++ b/lodeRunner.key.js @@ -4,132 +4,134 @@ 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; - } -*/ + /* + // cheat key code disable 5/16/2015 + switch(code) { + case "Period": // SHIFT + . = '>', next level + shiftLevelNum = 1; + gameState = GAME_NEXT_LEVEL; + break; + case "Comma": // SHIFT + , = '<', previous level + shiftLevelNum = 1; + gameState = GAME_PREV_LEVEL; + break; + case "ArrowUp": // SHIFT + UP, increase runner life + if (playMode == PLAY_CLASSIC && runnerLife < 10) { + runnerLife++; + drawLife(); + } + break; + case "KeyX": // SHIFT + X + toggleTrapTile(); + break; + case "KeyG": // 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; - } + switch (code) { + case "KeyA": // CTRL-A : abort level + case "KeyQ": + gameState = GAME_RUNNER_DEAD; + break; + case "KeyC": // CTRL-C : copy current level + copyLevelMap = levelData[curLevel - 1]; + copyLevelPassed = 1; + showTipsText("COPY MAP", 1500); + break; + case "KeyJ": // CTRL-J : gamepad toggle + toggleGamepadMode(1); + //if(gamepadIconObj) gamepadIconObj.updateGamepadImage(); + break; + case "KeyK": // CTRL-K : repeat actions On/Off + toggleRepeatAction(); + repeatActionIconObj.updateRepeatActionImage(); + break; + case "KeyR": // CTRL-R : abort game + runnerLife = 1; + gameState = GAME_RUNNER_DEAD; + break; + case "KeyX": // CTRL-X + toggleTrapTile(); + break; + // case "KeyZ": //CTRL-Z, toggle god mode + // toggleGodMode(); + // break; + case "KeyS": // CTRL-S, toggle sound + if ((soundOff ^= 1) == 1) { + soundStop(soundDig); + soundStop(soundFall); + showTipsText("SOUND OFF", 1500); + } else { + showTipsText("SOUND ON", 1500); + } + soundIconObj.updateSoundImage(); + break; + case "ArrowLeft": // CTRL + ← : speed down + setSpeed(-1); + break; + case "ArrowRight": // CTRL + → : speed up + setSpeed(1); + break; + case "KeyH": // CTRL-H : redHat mode on/off + toggleRedhatMode(); + break; + case "Digit1": + case "Digit2": + case "Digit3": + case "Digit4": + case "Digit5": + themeColorChange(parseInt(code.slice(-1)) - 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; - } + switch (code) { + case "Digit1": + shiftLevelNum = 5; + gameState = GAME_NEXT_LEVEL; + break; + case "Digit2": + shiftLevelNum = 10; + gameState = GAME_NEXT_LEVEL; + break; + case "Digit3": + shiftLevelNum = 20; + gameState = GAME_NEXT_LEVEL; + break; + case "Digit4": + shiftLevelNum = 50; + gameState = GAME_NEXT_LEVEL; + break; + case "Digit6": + shiftLevelNum = 5; + gameState = GAME_PREV_LEVEL; + break; + case "Digit7": + shiftLevelNum = 10; + gameState = GAME_PREV_LEVEL; + break; + case "Digit8": + shiftLevelNum = 20; + gameState = GAME_PREV_LEVEL; + break; + case "Digit9": + shiftLevelNum = 50; + gameState = GAME_PREV_LEVEL; + break; + } } -var repeatAction = 0; //1: keyboard repeat on, 0: keyboard repeat Off +var repeatAction = 0; //1: keyboard repeat on, 0: keyboard repeat Off var repeatActionPressed = 0; var gamepadMode = 1; //0: disable, 1: enable var redhatMode = 1; @@ -137,198 +139,189 @@ var godMode = 0, godModeKeyPressed = 0; function initHotKeyVariable() { - godMode = 0; - godModeKeyPressed = 0; - repeatActionPressed = 0; + 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(); + if ((repeatAction ^= 1) == 1) { + showTipsText("REPEAT ACTIONS ON", 2500); + } else { + showTipsText("REPEAT ACTIONS OFF", 2500); + } + if (gameState != GAME_START) repeatActionPressed = 1; + 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(); + 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); - } + if ((redhatMode ^= 1) == 1) { + for (var i = 0; i < guardCount; i++) { + guard[i].sprite.spriteSheet = guard[i].hasGold > 0 ? redhatData : guardData; + } + showTipsText("REDHAT MODE ON", 1500); + } else { + 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); - } + godModeKeyPressed = 1; + sometimePlayInGodMode = 1; + godMode ^= 1; + showTipsText(godMode ? "GOD MODE ON" : "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); + 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 +function helpCallBack() { - pressKey(KEYCODE_ESC); + pressKey("Escape"); } 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); + switch (code) { + case "KeyA": + case "ArrowLeft": + case "KeyJ": + keyAction = ACT_LEFT; + break; + case "ArrowRight": + case "KeyL": + case "KeyD": + keyAction = ACT_RIGHT; + break; + case "KeyW": + case "ArrowUp": + case "KeyI": + keyAction = ACT_UP; + break; + case "ArrowDown": + case "KeyK": + case "KeyS": + keyAction = ACT_DOWN; + break; + case "KeyZ": + case "KeyQ": + case "KeyU": + case "KeyY": //Y key to dig left, for German keyboards + case "Comma": + case "ControlRight": + keyAction = ACT_DIG_LEFT; + break; + case "KeyX": + case "KeyO": + case "KeyE": + case "Period": + case "Numpad0": + case "End": + keyAction = ACT_DIG_RIGHT; + break; + case "Escape": //help & pause + if (gameState == GAME_PAUSE) { + gameResume(); + showTipsText("", 1000); //clear text + } else { + gamePause(); + showTipsText("PAUSE", 0); //display "PAUSE" + } + break; + case "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; + //debug("keycode = " + code); + } + break; + default: + keyAction = ACT_UNKNOWN; + break; + } + if (recordMode && code !== "Escape") saveKeyCode(code, keyAction); } function gameResume() { - gameState = lastGameState; - soundResume(soundFall); - soundResume(soundDig); + gameState = lastGameState; + soundResume(soundFall); + soundResume(soundDig); } function gamePause() { - lastGameState = gameState; - gameState = GAME_PAUSE; - soundPause(soundFall); - soundPause(soundDig); + lastGameState = gameState; + gameState = GAME_PAUSE; + soundPause(soundFall); + soundPause(soundDig); } -function handleKeyDown(event) +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; - -} + if (!event) event = window.event; + const key = event.key; + const code = event.code; + + if (event.shiftKey) { + if (gameState == GAME_START || gameState == GAME_RUNNING) { + pressShiftKey(code); + } + } else if (event.ctrlKey && key != "Control" && // if CTRL with another key + (gameState == GAME_START || gameState == GAME_RUNNING) ) { + pressCtrlKey(code); + }else if ((gameState == GAME_PAUSE && code === "Escape") || + gameState == GAME_START || gameState == GAME_RUNNING) { + if (recordMode != RECORD_PLAY && playMode != PLAY_AUTO) { + pressKey(code); + } + } + + if (key.startsWith("F") && key !== "F") return true; // allow 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; + if (repeatAction) return true; + if (!event) event = window.event; + const key = event.key; + if (recordKeyCode === event.code && keyPressed != -1) keyPressed = 0; + return true; } diff --git a/lodeRunner.main.js b/lodeRunner.main.js index b5fa9d5..53395d8 100644 --- a/lodeRunner.main.js +++ b/lodeRunner.main.js @@ -1356,7 +1356,7 @@ function mainTick(event) playGame(deltaS); break; case GAME_RUNNER_DEAD: - //console.log("Time=" + curTime + ", Tick= " + playTickTimer); + //debug("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); @@ -1419,7 +1419,7 @@ function mainTick(event) return; case GAME_FINISH: stopAllSpriteObj(); - //console.log("Time=" + curTime + ", Tick= " + playTickTimer); + //debug("Time=" + curTime + ", Tick= " + playTickTimer); switch(playMode) { case PLAY_CLASSIC: diff --git a/lodeRunner.menu.js b/lodeRunner.menu.js index d630e83..34be443 100644 --- a/lodeRunner.menu.js +++ b/lodeRunner.menu.js @@ -122,7 +122,7 @@ function helpMenuClass(_stage, _bitmap, _editBitmap, _scale) function helpKeyDown(event) { if(!event){ event = window.event; } //cross browser issues exist - if(event.keyCode == KEYCODE_ESC) { + if(event.key == "Escape") { closeHelpMenu(); } return false; @@ -490,8 +490,8 @@ function selectDialog(_titleName, _checkBitmap, _levelData, _activeLevel, _scree if(event.shiftKey || event.ctrlKey) return false; - switch(event.keyCode) { - case KEYCODE_ESC: + switch(event.key) { + case "Escape": closeBox(); break; default: @@ -1313,16 +1313,16 @@ function handleMenuKeyDown(event) if(event.shiftKey || event.ctrlKey) return false; - switch(event.keyCode) { - case KEYCODE_UP: + switch(event.key) { + case "ArrowUp": keyAction = ACT_UP; break; - case KEYCODE_DOWN: + case "ArrowDown": keyAction = ACT_DOWN; break; - case KEYCODE_ENTER: + case "Enter": break; - case KEYCODE_ESC: + case "Escape": break; default: keyAction = ACT_UNKNOWN; @@ -1569,23 +1569,23 @@ function menuDialog(_titleName, _itemList, _stage, _scale, _closeIconEnable, _cl if(event.shiftKey || event.ctrlKey) return false; - switch(event.keyCode) { - case KEYCODE_UP: + switch(event.key) { + case "ArrowUp": 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: + case "ArrowDown": 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: + case "Enter": buttonClick(); break; - case KEYCODE_ESC: + case "Escape": if(closeIconObj != null) closeBox(); break; default: @@ -2785,8 +2785,8 @@ function backupDialog(id, _callBackFun) if(event.shiftKey || event.ctrlKey) return false; - switch(event.keyCode) { - case KEYCODE_ESC: + switch(event.key) { + case "Escape": closeDialog(); break; default: @@ -3758,8 +3758,8 @@ function restoreDialog(id, _callBackFun) if(event.shiftKey || event.ctrlKey) return false; - switch(event.keyCode) { - case KEYCODE_ESC: + switch(event.key) { + case "Escape": closeDialog(); break; default: diff --git a/lodeRunner.misc.js b/lodeRunner.misc.js index 680b4d1..358c7a3 100644 --- a/lodeRunner.misc.js +++ b/lodeRunner.misc.js @@ -1,7 +1,7 @@ //============ // MISC //============ -var DEBUG = 0; +var DEBUG = 1; var demoSoundOff = 1; function debug(string) diff --git a/lodeRunner.wData.js b/lodeRunner.wData.js index 99644c8..6c6d2f6 100644 Binary files a/lodeRunner.wData.js and b/lodeRunner.wData.js differ