1
0
forked from sent/waves
waves/public/assets/g/iwbtc/keyboard.js
2025-04-09 17:11:14 -05:00

216 lines
4.7 KiB
JavaScript

"use strict";
var KEY_UP = 38,
KEY_DOWN = 40,
KEY_LEFT = 37,
KEY_RIGHT = 39,
KEY_JUMP = 32,
KEY_RESTART = 82,
KEY_MUTE = 77,
KEY_SHOOT = 84,
KEY_SUICIDE = 81;
var KBD_STORAGE_KEY = "keyboard_settings";
/** @constructor */
function KeyboardManager(game)
{
this.keysPressed = {};
this.keyWasPressed = {};
this.game = game;
var fromSettings = game.storage.getItem(KBD_STORAGE_KEY);
if(fromSettings)
{
this.gameKeys = fromSettings;
}
else
{
this.resetKeys();
}
window.addEventListener("keydown", this.onkeydown.bind(this), false);
window.addEventListener("keyup", this.onkeyup.bind(this), false);
window.addEventListener("blur", this.onblur.bind(this), false);
var self = this;
var click_count = 0;
document.getElementById("reset_keys").addEventListener("click",
function()
{
this.textContent = [
"Done.",
"Keys resetted.",
"You keep failing at this, huh?",
"undefined",
"Just kidding.",
"Bored?",
"Okay ...",
"There once was a girl from Kentucky ..."
][click_count++];
if(click_count === 8)
{
location.href = "https://www.youtube.com/watch?v=oHg5SJYRHA0";
}
self.resetKeys();
self.saveSettings();
}, false);
[
["left", KEY_LEFT],
["right", KEY_RIGHT],
["shoot", KEY_SHOOT],
["jump", KEY_JUMP],
["mute", KEY_MUTE],
["restart", KEY_RESTART],
].forEach(addKeyChanger);
function addKeyChanger(key)
{
var name = key[0],
keyNumber = key[1],
id = "change_" + name,
element = document.getElementById(id),
keyField = document.getElementById("keys"),
msgField = document.getElementById("press_key_msg");
element.addEventListener("click", function()
{
keyField.style.display = "none";
msgField.style.display = "block";
window.addEventListener("keydown", function changeKey(e)
{
if(e.which === 27)
{
// escape
}
else
{
Object.deleteByValue(self.gameKeys, keyNumber);
self.gameKeys[e.which] = keyNumber;
self.saveSettings();
}
window.removeEventListener("keydown", changeKey, false);
keyField.style.display = "block";
msgField.style.display = "none";
e.preventDefault();
}, false);
}, false);
}
};
KeyboardManager.prototype.resetKeys = function()
{
this.gameKeys = {
38: KEY_UP,
40: KEY_DOWN,
37: KEY_LEFT,
39: KEY_RIGHT,
32: KEY_JUMP,
82: KEY_RESTART,
77: KEY_MUTE,
84: KEY_SHOOT,
81: KEY_SUICIDE,
};
};
KeyboardManager.prototype.saveSettings = function()
{
this.game.storage.setItem(KBD_STORAGE_KEY, this.gameKeys);
};
KeyboardManager.prototype.isValid = function(e)
{
return !(
e.ctrlKey || e.altKey || e.metaKey ||
e.target instanceof HTMLTextAreaElement ||
e.target instanceof HTMLInputElement ||
!this.gameKeys[e.which]
);
};
KeyboardManager.prototype.onkeydown = function(e)
{
if(this.keysPressed[e.which])
{
e.preventDefault();
}
else if(this.isValid(e))
{
this.keysPressed[e.which] = true;
this.handleKey(false, e.which);
e.preventDefault();
}
}
KeyboardManager.prototype.onkeyup = function(e)
{
if(this.isValid(e))
{
this.keysPressed[e.which] = false;
this.handleKey(true, e.which);
e.preventDefault();
}
}
KeyboardManager.prototype.onblur = function()
{
var keys = Object.keys(this.keysPressed);
for(var i = 0; i < keys.length; i++)
{
var key = keys[i];
if(this.keysPressed[key])
{
this.handleKey(true, Number(key));
}
}
this.keysPressed = {};
}
KeyboardManager.prototype.handleKey = function(is_up, keyCode)
{
var code = this.gameKeys[keyCode];
if(code === KEY_MUTE)
{
if(!is_up)
{
this.game.toggleMute();
}
}
else if(code === KEY_RESTART)
{
if(!is_up)
{
this.game.restart();
}
}
if(code === KEY_SUICIDE)
{
if(!is_up)
{
this.game.die();
}
}
else
{
this.keyWasPressed[code] = !is_up;
}
};