Merge pull request #1 from jimmyGALLAND/change_keys

Feat: Support Azerty keyboard and improve cross-browser and environment compatibility
Cette révision appartient à :
jimmyGALLAND
2025-10-27 00:52:51 +01:00
révisé par GitHub
révision 6527966282
11 fichiers modifiés avec 588 ajouts et 506 suppressions
+114 -53
Voir le fichier
@@ -21,59 +21,6 @@ var MIN_SCALE = 0.5,
var MENU_ICON_X = 40, MENU_ICON_Y = 36, ICON_BORDER = 4; var MENU_ICON_X = 40, MENU_ICON_Y = 36, ICON_BORDER = 4;
var BASE_ICON_X = (MENU_ICON_X + ICON_BORDER * 2); 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, var SCORE_COMPLETE_LEVEL = 1500, SCORE_COUNTER = 15,
SCORE_GET_GOLD = 250, SCORE_GET_GOLD = 250,
@@ -198,3 +145,117 @@ var STORAGE_GAMEPAD_MODE = "loderunner_gamepadMode";
// backup & restore file header // backup & restore file header
//================================ //================================
var LRWG_FILE_START_INFO = "LODE RUNNER WEB GAME."; 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"
};
+28 -22
Voir le fichier
@@ -57,7 +57,6 @@ function countAutoDemoTimer()
{ {
if(demoCountEnable) { if(demoCountEnable) {
demoCountTime++; demoCountTime++;
//debug(demoCountTime);
if(demoCountTime > MAX_DEMO_WAIT_COUNT) { if(demoCountTime > MAX_DEMO_WAIT_COUNT) {
disableAutoDemoTimer(); disableAutoDemoTimer();
gameState = GAME_WAITING; gameState = GAME_WAITING;
@@ -88,7 +87,7 @@ function playDemo()
if(demoRecordIdx < demoRecord.length) { if(demoRecordIdx < demoRecord.length) {
if(demoRecord[demoRecordIdx*2] == demoTickCount) { if(demoRecord[demoRecordIdx*2] == demoTickCount) {
//loadingTxt.text = demoRecordIdx + " " + demoTickCount ; //for debug //loadingTxt.text = demoRecordIdx + " " + demoTickCount ; //for debug
pressKey(demoRecord[demoRecordIdx*2+1]); pressKey(keyCodeToEventCode(demoRecord[demoRecordIdx*2+1]));
demoRecordIdx++; demoRecordIdx++;
} }
} }
@@ -214,7 +213,7 @@ function getNextDemoLevel()
initDemoInfo(); initDemoInfo();
} }
function curDemoLevelIsVaild() function curDemoLevelIsValid()
{ {
if(playData == PLAY_DATA_USERDEF) return 0; if(playData == PLAY_DATA_USERDEF) return 0;
return (playerDemoData.length >= curLevel && typeof playerDemoData[curLevel-1] != "undefined"); return (playerDemoData.length >= curLevel && typeof playerDemoData[curLevel-1] != "undefined");
@@ -319,6 +318,7 @@ function recordModeDump(state)
dumpRecord(); dumpRecord();
} }
function recordModeToggle(state) function recordModeToggle(state)
{ {
if(recordMode == RECORD_KEY) { if(recordMode == RECORD_KEY) {
@@ -352,7 +352,8 @@ function recordKeyAction1()
if(!keyPressed) return; if(!keyPressed) return;
if(recordKeyCode != lastKeyCode || alwaysRecord) { if(recordKeyCode != lastKeyCode || alwaysRecord) {
playRecord.push(recordCount); playRecord.push(recordCount);
playRecord.push(recordKeyCode); code=codeToEventKeyCode(recordKeyCode)
playRecord.push(codeToEventKeyCode(recordKeyCode));
lastKeyCode = recordKeyCode; lastKeyCode = recordKeyCode;
} }
keyPressed = 0; keyPressed = 0;
@@ -366,16 +367,17 @@ function recordKeyAction2()
case 1: //pressed case 1: //pressed
if(recordKeyCode != lastKeyCode || alwaysRecord) { if(recordKeyCode != lastKeyCode || alwaysRecord) {
playRecord.push(recordCount); playRecord.push(recordCount);
playRecord.push(recordKeyCode); code=codeToEventKeyCode(recordKeyCode)
playRecord.push(codeToEventKeyCode(recordKeyCode));
lastKeyCode = recordKeyCode; lastKeyCode = recordKeyCode;
} }
if(alwaysRecord) keyPressed = -1; //floating if(alwaysRecord) keyPressed = -1; //floating
break; break;
case 0: //release case 0: //release
if(recordKeyCode != KEYCODE_SPACE) { if(recordKeyCode != "Space") {
playRecord.push(recordCount); playRecord.push(recordCount);
playRecord.push(KEYCODE_SPACE); playRecord.push(codeToEventKeyCode("Space"));
lastKeyCode = recordKeyCode = KEYCODE_SPACE; lastKeyCode = recordKeyCode = "Space";
keyAction = ACT_STOP; keyAction = ACT_STOP;
} }
break; break;
@@ -389,7 +391,8 @@ function recordPlayDemo()
if(recordIdx < playRecord.length) { if(recordIdx < playRecord.length) {
if(playRecord[recordIdx*2] == recordCount) { if(playRecord[recordIdx*2] == recordCount) {
//loadingTxt.text = recordIdx; //for debug //loadingTxt.text = recordIdx; //for debug
pressKey(playRecord[recordIdx*2+1]); code=playRecord[recordIdx*2+1];
pressKey(keyCodeToEventCode(demoRecord[demoRecordIdx*2+1]));
recordIdx++; recordIdx++;
} }
} }
@@ -429,17 +432,6 @@ function recordPlayTime(state)
recordState = (state == GAME_FINISH)?1:0; //finish or dead 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" //Remap action key to orignal "left, right, up down and Z, X"
//for backward compatible //for backward compatible
function remapActionKey() 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() function convertBornPos()
{ {
var len, offset = 1; var len, offset = 1;
@@ -475,7 +482,6 @@ var curDemoData = { ai: AI_VERSION, time: 0 }; //bug fixed: when press CTRL-C wi
function dumpRecord() function dumpRecord()
{ {
var txtStr; var txtStr;
curDemoData = {}; curDemoData = {};
curDemoData.level = curLevel; curDemoData.level = curLevel;
curDemoData.ai = AI_VERSION; curDemoData.ai = AI_VERSION;
@@ -511,7 +517,7 @@ function dumpRecord()
for(var i = 1; i < playRecord.length; i++) { for(var i = 1; i < playRecord.length; i++) {
txtStr += ", " + playRecord[i]; txtStr += ", " + playRecord[i];
} }
debug(txtStr+ " ], //" + (playRecord.length/2)); debug(txtStr+ " ],");
} else { } else {
debug(" action: [ ],"); debug(" action: [ ],");
} }
+3 -3
Voir le fichier
@@ -1032,15 +1032,15 @@ function editHandleKeyDown(event)
if(!event){ event = window.event; } //cross browser issues exist if(!event){ event = window.event; } //cross browser issues exist
if (event.ctrlKey) { if (event.ctrlKey) {
switch(event.keyCode) { switch(event.code) {
case KEYCODE_C: //CTRL-C : copy current level case "KeyC": //CTRL-C : copy current level
if (!editMapIsEmpty) { if (!editMapIsEmpty) {
copyLevelMap = copyEditingMap(); copyLevelMap = copyEditingMap();
copyLevelPassed = (!testLevelInfo.modified && lastRunner) || testLevelInfo.pass; copyLevelPassed = (!testLevelInfo.modified && lastRunner) || testLevelInfo.pass;
setTimeout(function() { showTipsText("COPY MAP", 1500);}, 50); setTimeout(function() { showTipsText("COPY MAP", 1500);}, 50);
} }
break; 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) { if(copyLevelMap != null && editMapIsEmpty && testLevelInfo.level <= MAX_EDIT_LEVEL) {
editPasteMap(); editPasteMap();
} }
+11 -11
Voir le fichier
@@ -108,15 +108,15 @@ function getLastGamepadInfo()
var keyCodeMapping = [ var keyCodeMapping = [
//[[keyCode1, ctrl, shift], [keyCode2, ctrl, shift] //[[keyCode1, ctrl, shift], [keyCode2, ctrl, shift]
[[KEYCODE_UP, 0, 0], [KEYCODE_UP, 0, 0]], //up [["ArrowUp", 0, 0], ["ArrowUp", 0, 0]], //up
[[KEYCODE_DOWN, 0, 0], [KEYCODE_DOWN, 0, 0]], //down [["ArrowDown", 0, 0], ["ArrowDown", 0, 0]], //down
[[KEYCODE_LEFT, 0, 0], [KEYCODE_LEFT, 0, 0]], //left [["ArrowLeft", 0, 0], ["ArrowLeft", 0, 0]], //left
[[KEYCODE_RIGHT, 0, 0], [KEYCODE_RIGHT, 0, 0]], //right [["ArrowRight", 0, 0], ["ArrowRight", 0, 0]], //right
[[KEYCODE_Z, 0, 0], [KEYCODE_ENTER, 0, 0]], //dig-left [["KeyZ", 0, 0], ["Enter", 0, 0]], //dig-left
[[KEYCODE_X, 0, 0], [KEYCODE_ENTER, 0, 0]], //dig-right [["KeyX", 0, 0], ["Enter", 0, 0]], //dig-right
[[KEYCODE_ESC, 0, 0], [KEYCODE_ENTER, 0, 0]], //pause [["Escape", 0, 0], ["Enter", 0, 0]], //pause
[[KEYCODE_ENTER, 0, 0], [KEYCODE_ENTER, 0, 0]], //enter [["Enter", 0, 0], ["Enter", 0, 0]], //enter
[[KEYCODE_A, 1, 0], [KEYCODE_ENTER, 0, 0]] //game abort [["KeyA", 1, 0], ["Enter", 0, 0]] //game abort
]; ];
var gameButtonMapping = [ var gameButtonMapping = [
@@ -237,7 +237,7 @@ function sendKeyUp(twinKey, id)
var key = (inputNameState)? twinKey[1]:twinKey[0]; var key = (inputNameState)? twinKey[1]:twinKey[0];
if(key[0] == null) return; 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 ); //console.log("sendKeyUp = %d",keyCode );
if(typeof document.onkeydown == "function" ) document.onkeyup(event); if(typeof document.onkeydown == "function" ) document.onkeyup(event);
gamepadLastId = id; gamepadLastId = id;
@@ -248,7 +248,7 @@ function sendKeyDown(twinKey, id)
var key = (inputNameState)? twinKey[1]:twinKey[0]; var key = (inputNameState)? twinKey[1]:twinKey[0];
if(key[0] == null) return; 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 ); //console.log("sendKeyDown = %d",keyCode );
if(typeof document.onkeydown == "function" ) document.onkeydown(event); if(typeof document.onkeydown == "function" ) document.onkeydown(event);
gamepadLastId = id; gamepadLastId = id;
+140 -115
Voir le fichier
@@ -309,65 +309,66 @@ function showScoreTable(_playData, _curScoreInfo, _callbackFun, _waitTime)
function handleHiScoreName(event) function handleHiScoreName(event)
{ {
if(!event){ event = window.event; } //cross browser issues exist if (!event) { event = window.event; }
var code = event.keyCode; let key = event.key;
if(curPos >= MAX_HISCORE_NAME_LENGTH && if (curPos >= MAX_HISCORE_NAME_LENGTH &&
code != KEYCODE_BKSPACE && code != KEYCODE_LEFT && code != KEYCODE_ENTER) key !== "Backspace" && key !== "ArrowLeft" && key !== "Enter") {
{ soundPlay("beep");
soundPlay("beep"); //wrong key code
return false; return false;
} }
switch(true) { switch (true) {
case (code >= 48 && code <= 57): // 0 ~ 9 // 0–9
if(curPos == 0) { soundPlay("beep"); break; } //first char except numbers case /^[0-9]$/.test(key):
name[curPos++] = String.fromCharCode(code); if (curPos === 0) { soundPlay("beep"); break; }
break; name[curPos++] = key;
case (code >=65 && code <= 90): // A ~ Z break;
case (code >= 97 && code <= 122): //a ~ z // A–Z a–z
if( code > 90) code -= 32; case /^[a-zA-Z]$/.test(key):
name[curPos++] = String.fromCharCode(code); name[curPos++] = key.toUpperCase();
break; break;
case (code == KEYCODE_DOT): //'.' case (key === "."):
if(curPos == 0) { soundPlay("beep"); break; } //first char except '.' if (curPos === 0) { soundPlay("beep"); break; } //first char except '. '
name[curPos++] = "."; name[curPos++] = ".";
break; break;
case (code == KEYCODE_DASH || code == KEYCODE_HYPHEN || code == KEYCODE_SUBTRACT): //'-' case (key === "-"):
if(curPos == 0) { soundPlay("beep"); break; } //first char except '-' if (curPos === 0) { soundPlay("beep"); break; } //first char except '-'
name[curPos++] = "-"; name[curPos++] = "-";
break; break;
case (code == KEYCODE_SPACE): //space case (key === " "): //space
if(curPos == 0) { soundPlay("beep"); break; } //first char except space if (curPos === 0) { soundPlay("beep"); break; } //first char except 'scace'
name[curPos++] = " "; name[curPos++] = " ";
break; break;
case (code == KEYCODE_BKSPACE): //backspace case (key === "Backspace"):
if(curPos == 0) break; if (curPos === 0) break;
name.splice(--curPos, 1); name.splice(--curPos, 1);
break; break;
case (code == KEYCODE_LEFT): //LEFT case (key === "ArrowLeft"):
if(curPos > 0) curPos--; if (curPos > 0) curPos--;
break; break;
case (code == KEYCODE_RIGHT): //RIGHT case (key === "ArrowRight"):
if(curPos < name.length) curPos++; if (curPos < name.length) curPos++;
break; break;
case (code == KEYCODE_UP): //UP case (key === "ArrowUp"):
name[curPos] = nextChar(name[curPos], 1); name[curPos] = nextChar(name[curPos], 1);
break; break;
case (code == KEYCODE_DOWN): //DOWN case (key === "ArrowDown"):
name[curPos] = nextChar(name[curPos], -1); name[curPos] = nextChar(name[curPos], -1);
break; break;
case (code == KEYCODE_ENTER): //ENTER case (key === "Enter"):
if(vaildPlayerName(name)) { if (validPlayerName(name)) {
restoreKeyDownHandler(); //avoid type "ENTER" twice restoreKeyDownHandler(); // avoid type "ENTER" twice
inputFinish(true); //async inputFinish(true); // async
} else soundPlay("beep"); } else {
break; soundPlay("beep");
default: }
//debug(code); break;
if(code > 32) soundPlay("beep"); //wrong key code
break; default:
if (key.length > 1) soundPlay("beep"); // wrong key code
break;
} }
redrawName(); redrawName();
@@ -434,7 +435,7 @@ function inputPlayerName(_stage, _callbackFun)
} }
} }
function vaildPlayerName(playerArray) function validPlayerName(playerArray)
{ {
var len = playerArray.length; var len = playerArray.length;
@@ -512,78 +513,102 @@ function inputString(_stage, _maxSize, _startX, _startY, _defaultString, _callba
function nextChar(charValue, nextMode) function nextChar(charValue, nextMode)
{ {
if(typeof(charValue) == "undefined") charValue = " "; if (typeof charValue !== "string" || charValue.length === 0) {
var code = charValue.charCodeAt(0); charValue = " ";
}
if(nextMode >=0) code++; else code--; let code = charValue.toUpperCase().charCodeAt(0);
if (code < 65 || code > 90) { //out of A-Z if (code < 65 || code > 90) { //out of A-Z
if(nextMode >=0) code = 65; code = 65;
else code= 90;
} }
// 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); return String.fromCharCode(code);
} }
function handleStringInput(event) function handleStringInput(event) {
{ if (!event) event = window.event;
if(!event){ event = window.event; } //cross browser issues exist
var code = event.keyCode; let key = event.key;
if(curPos >= _maxSize && code != KEYCODE_BKSPACE && code != KEYCODE_LEFT && code != KEYCODE_ENTER) if (
{ curPos >= _maxSize &&
soundPlay("beep"); //wrong key code !["Backspace", "ArrowLeft", "Enter"].includes(key)
) {
soundPlay("beep");
return false; return false;
} }
switch(true) { switch (true) {
case (code >= 48 && code <= 57): // 0 ~ 9 // 09
if(curPos == 0) { soundPlay("beep"); break; } //first char except numbers case /^[0-9]$/.test(key):
inputText[curPos++] = String.fromCharCode(code); if (curPos === 0) { soundPlay("beep"); break; }
break; inputText[curPos++] = key;
case (code >=65 && code <= 90): // A ~ Z break;
case (code >= 97 && code <= 122): //a ~ z
if( code > 90) code -= 32; // A–Z a-z
inputText[curPos++] = String.fromCharCode(code); case /^[a-zA-Z]$/.test(key):
break; inputText[curPos++] = key.toUpperCase();
case (code == KEYCODE_DOT): //'.' break;
if(curPos == 0) { soundPlay("beep"); break; } //first char except '.'
inputText[curPos++] = "."; // '.'
break; case key === ".":
case (code == KEYCODE_DASH || code == KEYCODE_HYPHEN || code == KEYCODE_SUBTRACT): //'-' if (curPos === 0) { soundPlay("beep"); break; }
if(curPos == 0) { soundPlay("beep"); break; } //first char except '-' inputText[curPos++] = ".";
inputText[curPos++] = "-"; break;
break;
case (code == KEYCODE_SPACE): //space // '-'
if(curPos == 0) { soundPlay("beep"); break; } //first char except space case key === "-":
inputText[curPos++] = " "; if (curPos === 0) { soundPlay("beep"); break; }
break; inputText[curPos++] = "-";
case (code == KEYCODE_BKSPACE): //backspace break;
if(curPos == 0) break;
inputText.splice(--curPos, 1); // Space
break; case key === " ":
case (code == KEYCODE_LEFT): //LEFT if (curPos === 0) { soundPlay("beep"); break; }
if(curPos > 0) curPos--; inputText[curPos++] = " ";
break; break;
case (code == KEYCODE_RIGHT): //RIGHT
if(curPos < inputText.length) curPos++; // Backscape
break; case key === "Backspace":
case (code == KEYCODE_UP): //UP if (curPos === 0) break;
inputText[curPos] = nextChar(inputText[curPos], 1); inputText.splice(--curPos, 1);
break; break;
case (code == KEYCODE_DOWN): //DOWN
inputText[curPos] = nextChar(inputText[curPos], -1); // arrows
break; case key === "ArrowLeft":
case (code == KEYCODE_ENTER): //ENTER if (curPos > 0) curPos--;
if(vaildPlayerName(inputText)) { break;
inputFinish(); case key === "ArrowRight":
return true; if (curPos < inputText.length) curPos++;
} else soundPlay("beep"); break;
break; case key === "ArrowUp":
default: inputText[curPos] = nextChar(inputText[curPos], 1);
//debug(code); break;
if(code > 32) soundPlay("beep"); //wrong key code case key === "ArrowDown":
break; 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(); drawString();
+1 -1
Voir le fichier
@@ -362,7 +362,7 @@ function demoIconClass( _screenX1, _screenY1, _scale, _bitmap)
this.enable = function () this.enable = function ()
{ {
if(!curDemoLevelIsVaild()) { if(!curDemoLevelIsValid()) {
self.disable(1); self.disable(1);
return; return;
} }
+1 -1
Voir le fichier
@@ -406,7 +406,7 @@ function infoMenuClass(_stage, _scale)
function InfoKeyDown(event) function InfoKeyDown(event)
{ {
if(!event){ event = window.event; } //cross browser issues exist if(!event){ event = window.event; } //cross browser issues exist
if(event.keyCode == KEYCODE_ESC) { if(event.code == "Escape") {
closeInfoMenu(); closeInfoMenu();
} }
return false; return false;
+255 -265
Voir le fichier
@@ -4,132 +4,134 @@ var runnerDebug = 0;
function pressShiftKey(code) function pressShiftKey(code)
{ {
/* cheat key code disable 5/16/2015 /*
switch(code) { // cheat key code disable 5/16/2015
case KEYCODE_PERIOD: //SHIFT-. = '>', change to next level switch(code) {
shiftLevelNum = 1; case "Period": // SHIFT + . = '>', next level
gameState = GAME_NEXT_LEVEL; shiftLevelNum = 1;
break; gameState = GAME_NEXT_LEVEL;
case KEYCODE_COMMA: //SHIFT-, = '<', change to previous level break;
shiftLevelNum = 1; case "Comma": // SHIFT + , = '<', previous level
gameState = GAME_PREV_LEVEL; shiftLevelNum = 1;
break; gameState = GAME_PREV_LEVEL;
case KEYCODE_UP: //SHIFT-UP, inc runner break;
if(playMode == PLAY_CLASSIC && runnerLife < 10) { //bug fixed: add check playMode, 12/15/2014 case "ArrowUp": // SHIFT + UP, increase runner life
runnerLife++; if (playMode == PLAY_CLASSIC && runnerLife < 10) {
drawLife(); runnerLife++;
} drawLife();
break; }
case KEYCODE_X: //SHIFT-X break;
toggleTrapTile(); case "KeyX": // SHIFT + X
break; toggleTrapTile();
case KEYCODE_G: //SHIFT-G, toggle god mode break;
toggleGodMode(); case "KeyG": // SHIFT + G, toggle god mode
break; toggleGodMode();
default: break;
if(runnerDebug) debugKeyPress(code); default:
break; if (runnerDebug) debugKeyPress(code);
} break;
*/ }
*/
} }
function pressCtrlKey(code) function pressCtrlKey(code)
{ {
switch(code) { switch (code) {
case KEYCODE_A: //CTRL-A : abort level case "KeyA": // CTRL-A : abort level
gameState = GAME_RUNNER_DEAD; case "KeyQ":
break; gameState = GAME_RUNNER_DEAD;
case KEYCODE_C: //CTRL-C : copy current level break;
copyLevelMap = levelData[curLevel-1]; case "KeyC": // CTRL-C : copy current level
copyLevelPassed = 1; //means copy from exists level copyLevelMap = levelData[curLevel - 1];
showTipsText("COPY MAP", 1500); copyLevelPassed = 1;
break; showTipsText("COPY MAP", 1500);
case KEYCODE_J: //CTRL-J : gamepad toggle break;
toggleGamepadMode(1); case "KeyJ": // CTRL-J : gamepad toggle
//if(gamepadIconObj) gamepadIconObj.updateGamepadImage(); toggleGamepadMode(1);
break; //if(gamepadIconObj) gamepadIconObj.updateGamepadImage();
case KEYCODE_K: //CTRL-K : repeat actions On/Off break;
toggleRepeatAction(); case "KeyK": // CTRL-K : repeat actions On/Off
repeatActionIconObj.updateRepeatActionImage(); toggleRepeatAction();
break; repeatActionIconObj.updateRepeatActionImage();
case KEYCODE_R: //CTRL-R : abort game break;
runnerLife = 1; case "KeyR": // CTRL-R : abort game
gameState = GAME_RUNNER_DEAD; runnerLife = 1;
break; gameState = GAME_RUNNER_DEAD;
case KEYCODE_X: //CTRL-X break;
toggleTrapTile(); case "KeyX": // CTRL-X
break; toggleTrapTile();
// case KEYCODE_Z: //CTRL-Z, toggle god mode break;
// toggleGodMode(); // case "KeyZ": //CTRL-Z, toggle god mode
// break; // toggleGodMode();
case KEYCODE_S: //CTRL-S, toggle sound // break;
if( (soundOff ^= 1) == 1) { case "KeyS": // CTRL-S, toggle sound
soundStop(soundDig); if ((soundOff ^= 1) == 1) {
soundStop(soundFall); soundStop(soundDig);
showTipsText("SOUND OFF", 1500); soundStop(soundFall);
} else { showTipsText("SOUND OFF", 1500);
showTipsText("SOUND ON", 1500); } else {
} showTipsText("SOUND ON", 1500);
soundIconObj.updateSoundImage(); //toggle sound On/Off icon }
break; soundIconObj.updateSoundImage();
case KEYCODE_LEFT: //SHIFT + <- : speed down break;
setSpeed(-1); case "ArrowLeft": // CTRL + ← : speed down
break; setSpeed(-1);
case KEYCODE_RIGHT: //SHIFT + -> : speed up break;
setSpeed(1); case "ArrowRight": // CTRL + → : speed up
break; setSpeed(1);
case KEYCODE_H: //CTRL-H : redHat mode on/off break;
toggleRedhatMode(); case "KeyH": // CTRL-H : redHat mode on/off
break; toggleRedhatMode();
case KEYCODE_1: //CTRL-1 break;
case KEYCODE_2: //CTRL-2 case "Digit1":
case KEYCODE_3: //CTRL-3 case "Digit2":
case KEYCODE_4: //CTRL-4 case "Digit3":
case KEYCODE_5: //CTRL-5 case "Digit4":
themeColorChange(code - KEYCODE_1); case "Digit5":
break; themeColorChange(parseInt(code.slice(-1)) - 1);
} break;
}
} }
function debugKeyPress(code) function debugKeyPress(code)
{ {
switch(code) { switch (code) {
case KEYCODE_1: //SHIFT-1 , add 5 level case "Digit1":
shiftLevelNum = 5; shiftLevelNum = 5;
gameState = GAME_NEXT_LEVEL; gameState = GAME_NEXT_LEVEL;
break; break;
case KEYCODE_2: //SHIFT-2 , add 10 level case "Digit2":
shiftLevelNum = 10; shiftLevelNum = 10;
gameState = GAME_NEXT_LEVEL; gameState = GAME_NEXT_LEVEL;
break; break;
case KEYCODE_3: //SHIFT-3 , add 20 level case "Digit3":
shiftLevelNum = 20; shiftLevelNum = 20;
gameState = GAME_NEXT_LEVEL; gameState = GAME_NEXT_LEVEL;
break; break;
case KEYCODE_4: //SHIFT-4 , add 50 level case "Digit4":
shiftLevelNum = 50; shiftLevelNum = 50;
gameState = GAME_NEXT_LEVEL; gameState = GAME_NEXT_LEVEL;
break; break;
case KEYCODE_6: //SHIFT-6 , dec 5 level case "Digit6":
shiftLevelNum = 5; shiftLevelNum = 5;
gameState = GAME_PREV_LEVEL; gameState = GAME_PREV_LEVEL;
break; break;
case KEYCODE_7: //SHIFT-7 , dec 10 level case "Digit7":
shiftLevelNum = 10; shiftLevelNum = 10;
gameState = GAME_PREV_LEVEL; gameState = GAME_PREV_LEVEL;
break; break;
case KEYCODE_8: //SHIFT-8 , dec 20 level case "Digit8":
shiftLevelNum = 20; shiftLevelNum = 20;
gameState = GAME_PREV_LEVEL; gameState = GAME_PREV_LEVEL;
break; break;
case KEYCODE_9: //SHIFT-9 , dec 50 level case "Digit9":
shiftLevelNum = 50; shiftLevelNum = 50;
gameState = GAME_PREV_LEVEL; gameState = GAME_PREV_LEVEL;
break; 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 repeatActionPressed = 0;
var gamepadMode = 1; //0: disable, 1: enable var gamepadMode = 1; //0: disable, 1: enable
var redhatMode = 1; var redhatMode = 1;
@@ -137,198 +139,186 @@ var godMode = 0, godModeKeyPressed = 0;
function initHotKeyVariable() function initHotKeyVariable()
{ {
godMode = 0; godMode = 0;
godModeKeyPressed = 0; godModeKeyPressed = 0;
repeatActionPressed = 0; repeatActionPressed = 0;
} }
function toggleRepeatAction() function toggleRepeatAction()
{ {
if( (repeatAction ^= 1) == 1) { if ((repeatAction ^= 1) == 1) {
showTipsText("REPEAT ACTIONS ON", 2500); showTipsText("REPEAT ACTIONS ON", 2500);
} else { } else {
showTipsText("REPEAT ACTIONS OFF", 2500); showTipsText("REPEAT ACTIONS OFF", 2500);
} }
if(gameState != GAME_START) repeatActionPressed=1; //player change the "repeatAction" Mode at running if (gameState != GAME_START) repeatActionPressed = 1;
setRepeatAction();
setRepeatAction();
} }
function toggleGamepadMode(textMsg) function toggleGamepadMode(textMsg)
{ {
if(!gamepadSupport()) { if (!gamepadSupport()) {
if(textMsg) showTipsText("GAMEPAD NOT SUPPORTED", 2500); if (textMsg) showTipsText("GAMEPAD NOT SUPPORTED", 2500);
gamepadMode = 0; gamepadMode = 0;
} else { } else {
if( (gamepadMode ^= 1) == 1) { if ((gamepadMode ^= 1) == 1) {
gamepadEnable(); gamepadEnable();
if(textMsg) showTipsText("GAMEPAD ON", 2500); if (textMsg) showTipsText("GAMEPAD ON", 2500);
} else { } else {
gamepadDisable(); gamepadDisable();
if(textMsg) showTipsText("GAMEPAD OFF", 2500); if (textMsg) showTipsText("GAMEPAD OFF", 2500);
} }
} }
setGamepadMode(); setGamepadMode();
} }
function toggleRedhatMode() function toggleRedhatMode()
{ {
if( (redhatMode ^= 1) == 1 ) { //enable if ((redhatMode ^= 1) == 1) {
for(var i = 0; i < guardCount; i++) { for (var i = 0; i < guardCount; i++) {
if(guard[i].hasGold > 0) guard[i].sprite.spriteSheet = guard[i].hasGold > 0 ? redhatData : guardData;
guard[i].sprite.spriteSheet = redhatData; }
else showTipsText("REDHAT MODE ON", 1500);
guard[i].sprite.spriteSheet = guardData; } else {
} for (var i = 0; i < guardCount; i++) {
showTipsText("REDHAT MODE ON", 1500); guard[i].sprite.spriteSheet = guardData;
} else { //disable }
for(var i = 0; i < guardCount; i++) { showTipsText("REDHAT MODE OFF", 1500);
guard[i].sprite.spriteSheet = guardData; }
}
showTipsText("REDHAT MODE OFF", 1500);
}
} }
function toggleGodMode() function toggleGodMode()
{ {
godModeKeyPressed = 1; //means player press the god-mod hot-key godModeKeyPressed = 1;
sometimePlayInGodMode = 1; // 12/23/2014 sometimePlayInGodMode = 1;
godMode ^= 1;
godMode ^= 1; showTipsText(godMode ? "GOD MODE ON" : "GOD MODE OFF", 1500);
if(godMode) {
showTipsText("GOD MODE ON", 1500);
} else {
showTipsText("GOD MODE OFF", 1500);
}
} }
function setSpeed(v) function setSpeed(v)
{ {
speed += v; speed += v;
if(speed < 0) speed = 0; if (speed < 0) speed = 0;
if(speed >= speedMode.length) speed = speedMode.length-1; if (speed >= speedMode.length) speed = speedMode.length - 1;
createjs.Ticker.setFPS(speedMode[speed]); createjs.Ticker.setFPS(speedMode[speed]);
showTipsText(speedText[speed], 1500); showTipsText(speedText[speed], 1500);
} }
function helpCallBack() //help complete call back function helpCallBack()
{ {
pressKey(KEYCODE_ESC); pressKey("Escape");
} }
function pressKey(code) function pressKey(code)
{ {
switch(code) { switch (code) {
case KEYCODE_LEFT: case "KeyA":
case KEYCODE_J: case "ArrowLeft":
case KEYCODE_A: case "KeyJ":
keyAction = ACT_LEFT; keyAction = ACT_LEFT;
break; break;
case KEYCODE_RIGHT: case "ArrowRight":
case KEYCODE_L: case "KeyL":
case KEYCODE_D: case "KeyD":
keyAction = ACT_RIGHT; keyAction = ACT_RIGHT;
break; break;
case KEYCODE_UP: case "KeyW":
case KEYCODE_I: case "ArrowUp":
case KEYCODE_W: case "KeyI":
keyAction = ACT_UP; keyAction = ACT_UP;
break; break;
case KEYCODE_DOWN: case "ArrowDown":
case KEYCODE_K: case "KeyK":
case KEYCODE_S: case "KeyS":
keyAction = ACT_DOWN; keyAction = ACT_DOWN;
break; break;
case KEYCODE_Z: case "KeyZ":
case KEYCODE_Y: //Y key to dig left, for German keyboards case "KeyQ":
case KEYCODE_U: case "KeyU":
case KEYCODE_Q: case "KeyY": //Y key to dig left, for German keyboards
case KEYCODE_COMMA: //, case "Comma":
keyAction = ACT_DIG_LEFT; keyAction = ACT_DIG_LEFT;
break; break;
case KEYCODE_X: case "KeyX":
case KEYCODE_O: case "KeyO":
case KEYCODE_E: case "KeyE":
case KEYCODE_PERIOD: //. case "Period":
keyAction = ACT_DIG_RIGHT; keyAction = ACT_DIG_RIGHT;
break; break;
case KEYCODE_ESC: //help & pause case "Escape": //help & pause
if(gameState == GAME_PAUSE) { if (gameState == GAME_PAUSE) {
gameResume(); gameResume();
showTipsText("", 1000); //clear text showTipsText("", 1000); //clear text
} else { } else {
gamePause(); gamePause();
showTipsText("PAUSE", 0); //display "PAUSE" showTipsText("PAUSE", 0); //display "PAUSE"
//helpObj.showHelp(helpCallBack); }
} break;
break; case "Enter": //display hi-score
case KEYCODE_ENTER: //display hi-score if (playMode == PLAY_CLASSIC) {
if(playMode == PLAY_CLASSIC) { menuIconDisable(1);
menuIconDisable(1); gamePause();
gamePause(); showScoreTable(playData, null, function () {
showScoreTable(playData, null, function() { menuIconEnable(); gameResume();}); menuIconEnable();
return; //don't record this key code ! gameResume();
} else { });
keyAction = ACT_UNKNOWN; return; //don't record this key code !
} } else {
break; keyAction = ACT_UNKNOWN;
default: //debug("keycode = " + code);
keyAction = ACT_UNKNOWN; }
//debug("keycode = " + code); break;
break; default:
} keyAction = ACT_UNKNOWN;
if(recordMode && code != KEYCODE_ESC) saveKeyCode(code, keyAction); break;
}
if (recordMode && code !== "Escape") saveKeyCode(code, keyAction);
} }
function gameResume() function gameResume()
{ {
gameState = lastGameState; gameState = lastGameState;
soundResume(soundFall); soundResume(soundFall);
soundResume(soundDig); soundResume(soundDig);
} }
function gamePause() function gamePause()
{ {
lastGameState = gameState; lastGameState = gameState;
gameState = GAME_PAUSE; gameState = GAME_PAUSE;
soundPause(soundFall); soundPause(soundFall);
soundPause(soundDig); soundPause(soundDig);
} }
function handleKeyDown(event) function handleKeyDown(event)
{ {
if(!event){ event = window.event; } //cross browser issues exist if (!event) event = window.event;
const key = event.key;
const code = event.code;
if(event.shiftKey) { if (event.shiftKey) {
if(gameState == GAME_START || gameState == GAME_RUNNING) { if (gameState == GAME_START || gameState == GAME_RUNNING) {
pressShiftKey(event.keyCode); pressShiftKey(code);
} }
} else } else if (event.ctrlKey && key != "Control" && // if CTRL with another key
if (event.ctrlKey) { (gameState == GAME_START || gameState == GAME_RUNNING) ) {
if(gameState == GAME_START || gameState == GAME_RUNNING) { pressCtrlKey(code);
pressCtrlKey(event.keyCode); }else if ((gameState == GAME_PAUSE && code === "Escape") ||
} gameState == GAME_START || gameState == GAME_RUNNING) {
} else { if (recordMode != RECORD_PLAY && playMode != PLAY_AUTO) {
if((gameState == GAME_PAUSE && event.keyCode == KEYCODE_ESC) || pressKey(code);
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 (key.startsWith("F") && key !== "F") return true; // allow F1... F12
return false;
} }
function handleKeyUp(event) function handleKeyUp(event)
{ {
if(repeatAction) return true; if (repeatAction) return true;
if(!event){ event = window.event; } if (!event) event = window.event;
if(recordKeyCode == event.keyCode && keyPressed != -1) keyPressed = 0; const key = event.key;
return true; if (recordKeyCode === event.code && keyPressed != -1) keyPressed = 0;
return true;
} }
+2 -2
Voir le fichier
@@ -1356,7 +1356,7 @@ function mainTick(event)
playGame(deltaS); playGame(deltaS);
break; break;
case GAME_RUNNER_DEAD: 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) recordModeToggle(GAME_RUNNER_DEAD); //for debug only (if enable it must disable below statement)
if(recordMode == RECORD_KEY) recordModeDump(GAME_RUNNER_DEAD); if(recordMode == RECORD_KEY) recordModeDump(GAME_RUNNER_DEAD);
@@ -1419,7 +1419,7 @@ function mainTick(event)
return; return;
case GAME_FINISH: case GAME_FINISH:
stopAllSpriteObj(); stopAllSpriteObj();
//console.log("Time=" + curTime + ", Tick= " + playTickTimer); //debug("Time=" + curTime + ", Tick= " + playTickTimer);
switch(playMode) { switch(playMode) {
case PLAY_CLASSIC: case PLAY_CLASSIC:
+17 -17
Voir le fichier
@@ -122,7 +122,7 @@ function helpMenuClass(_stage, _bitmap, _editBitmap, _scale)
function helpKeyDown(event) function helpKeyDown(event)
{ {
if(!event){ event = window.event; } //cross browser issues exist if(!event){ event = window.event; } //cross browser issues exist
if(event.keyCode == KEYCODE_ESC) { if(event.key == "Escape") {
closeHelpMenu(); closeHelpMenu();
} }
return false; return false;
@@ -490,8 +490,8 @@ function selectDialog(_titleName, _checkBitmap, _levelData, _activeLevel, _scree
if(event.shiftKey || event.ctrlKey) return false; if(event.shiftKey || event.ctrlKey) return false;
switch(event.keyCode) { switch(event.key) {
case KEYCODE_ESC: case "Escape":
closeBox(); closeBox();
break; break;
default: default:
@@ -1313,16 +1313,16 @@ function handleMenuKeyDown(event)
if(event.shiftKey || event.ctrlKey) return false; if(event.shiftKey || event.ctrlKey) return false;
switch(event.keyCode) { switch(event.key) {
case KEYCODE_UP: case "ArrowUp":
keyAction = ACT_UP; keyAction = ACT_UP;
break; break;
case KEYCODE_DOWN: case "ArrowDown":
keyAction = ACT_DOWN; keyAction = ACT_DOWN;
break; break;
case KEYCODE_ENTER: case "Enter":
break; break;
case KEYCODE_ESC: case "Escape":
break; break;
default: default:
keyAction = ACT_UNKNOWN; keyAction = ACT_UNKNOWN;
@@ -1569,23 +1569,23 @@ function menuDialog(_titleName, _itemList, _stage, _scale, _closeIconEnable, _cl
if(event.shiftKey || event.ctrlKey) return false; if(event.shiftKey || event.ctrlKey) return false;
switch(event.keyCode) { switch(event.key) {
case KEYCODE_UP: case "ArrowUp":
buttonInactive(menuButtonObj[_itemList[0].activeItem]); buttonInactive(menuButtonObj[_itemList[0].activeItem]);
if(--_itemList[0].activeItem < 0) _itemList[0].activeItem = menuButtonObj.length-1; if(--_itemList[0].activeItem < 0) _itemList[0].activeItem = menuButtonObj.length-1;
buttonActive(menuButtonObj[_itemList[0].activeItem]); buttonActive(menuButtonObj[_itemList[0].activeItem]);
_stage.update(); _stage.update();
break; break;
case KEYCODE_DOWN: case "ArrowDown":
buttonInactive(menuButtonObj[_itemList[0].activeItem]); buttonInactive(menuButtonObj[_itemList[0].activeItem]);
if(++_itemList[0].activeItem > (menuButtonObj.length-1)) _itemList[0].activeItem = 0; if(++_itemList[0].activeItem > (menuButtonObj.length-1)) _itemList[0].activeItem = 0;
buttonActive(menuButtonObj[_itemList[0].activeItem]); buttonActive(menuButtonObj[_itemList[0].activeItem]);
_stage.update(); _stage.update();
break; break;
case KEYCODE_ENTER: case "Enter":
buttonClick(); buttonClick();
break; break;
case KEYCODE_ESC: case "Escape":
if(closeIconObj != null) closeBox(); if(closeIconObj != null) closeBox();
break; break;
default: default:
@@ -2785,8 +2785,8 @@ function backupDialog(id, _callBackFun)
if(event.shiftKey || event.ctrlKey) return false; if(event.shiftKey || event.ctrlKey) return false;
switch(event.keyCode) { switch(event.key) {
case KEYCODE_ESC: case "Escape":
closeDialog(); closeDialog();
break; break;
default: default:
@@ -3758,8 +3758,8 @@ function restoreDialog(id, _callBackFun)
if(event.shiftKey || event.ctrlKey) return false; if(event.shiftKey || event.ctrlKey) return false;
switch(event.keyCode) { switch(event.key) {
case KEYCODE_ESC: case "Escape":
closeDialog(); closeDialog();
break; break;
default: default:
BIN
Voir le fichier
Fichier binaire non affiché.