1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-02-13 03:19:19 +00:00

working keyCodes[] settings (edit, reset)

This commit is contained in:
Dimava 2020-06-12 17:19:51 +03:00
parent de71c39947
commit f18c670225
3 changed files with 95 additions and 105 deletions

View File

@ -15,69 +15,69 @@ function key(str) {
export const KEYMAPPINGS = {
general: {
confirm: { keyCode: 13 }, // enter
back: { keyCode: 27, builtin: true }, // escape
confirm: { keyCodes: [13] }, // enter
back: { keyCodes: [27], builtin: true }, // escape
},
ingame: {
menuOpenShop: { keyCode: key("F") },
menuOpenStats: { keyCode: key("G") },
menuOpenShop: { keyCodes: [key("F")] },
menuOpenStats: { keyCodes: [key("G")] },
toggleHud: { keyCode: 113 }, // F2
exportScreenshot: { keyCode: 114 }, // F3
toggleFPSInfo: { keyCode: 115 }, // F4
toggleHud: { keyCodes: [113] }, // F2
exportScreenshot: { keyCodes: [114] }, // F3
toggleFPSInfo: { keyCodes: [115] }, // F4
},
navigation: {
mapMoveUp: { keyCode: key("W") },
mapMoveRight: { keyCode: key("D") },
mapMoveDown: { keyCode: key("S") },
mapMoveLeft: { keyCode: key("A") },
mapMoveFaster: { keyCode: 16 }, //shift
mapMoveUp: { keyCodes: [key("W")] },
mapMoveRight: { keyCodes: [key("D")] },
mapMoveDown: { keyCodes: [key("S")] },
mapMoveLeft: { keyCodes: [key("A")] },
mapMoveFaster: { keyCodes: [16] }, //shift
centerMap: { keyCode: 32 }, // SPACE
mapZoomIn: { keyCode: 187, repeated: true }, // "+"
mapZoomOut: { keyCode: 189, repeated: true }, // "-"
centerMap: { keyCodes: [32] }, // SPACE
mapZoomIn: { keyCodes: [187], repeated: true }, // "+"
mapZoomOut: { keyCodes: [189], repeated: true }, // "-"
createMarker: { keyCode: key("M") },
createMarker: { keyCodes: [key("M")] },
},
buildings: {
belt: { keyCode: key("1") },
splitter: { keyCode: key("2") },
underground_belt: { keyCode: key("3") },
miner: { keyCode: key("4") },
cutter: { keyCode: key("5") },
rotater: { keyCode: key("6") },
stacker: { keyCode: key("7") },
mixer: { keyCode: key("8") },
painter: { keyCode: key("9") },
trash: { keyCode: key("0") },
belt: { keyCodes: [key("1")] },
splitter: { keyCodes: [key("2")] },
underground_belt: { keyCodes: [key("3")] },
miner: { keyCodes: [key("4")] },
cutter: { keyCodes: [key("5")] },
rotater: { keyCodes: [key("6")] },
stacker: { keyCodes: [key("7")] },
mixer: { keyCodes: [key("8")] },
painter: { keyCodes: [key("9")] },
trash: { keyCodes: [key("0")] },
},
placement: {
abortBuildingPlacement: { keyCode: key("Q") },
rotateWhilePlacing: { keyCode: key("R") },
rotateInverseModifier: { keyCode: 16 }, // SHIFT
cycleBuildingVariants: { keyCode: key("T") },
cycleBuildings: { keyCode: 9 }, // TAB
switchDirectionLockSide: { keyCode: key("R") },
abortBuildingPlacement: { keyCodes: [key("Q")] },
rotateWhilePlacing: { keyCodes: [key("R")] },
rotateInverseModifier: { keyCodes: [16] }, // SHIFT
cycleBuildingVariants: { keyCodes: [key("T")] },
cycleBuildings: { keyCodes: [9] }, // TAB
switchDirectionLockSide: { keyCodes: [key("R")] },
},
massSelect: {
massSelectStart: { keyCode: 17 }, // CTRL
massSelectSelectMultiple: { keyCode: 16 }, // SHIFT
massSelectCopy: { keyCode: key("C") },
massSelectCut: { keyCode: key("X") },
confirmMassDelete: { keyCode: 46 }, // DEL
pasteLastBlueprint: { keyCode: key("V") },
massSelectStart: { keyCodes: [17] }, // CTRL
massSelectSelectMultiple: { keyCodes: [16] }, // SHIFT
massSelectCopy: { keyCodes: [key("C")] },
massSelectCut: { keyCodes: [key("X")] },
confirmMassDelete: { keyCodes: [46] }, // DEL
pasteLastBlueprint: { keyCodes: [key("V")] },
},
placementModifiers: {
lockBeltDirection: { keyCode: 16 }, // SHIFT
placementDisableAutoOrientation: { keyCode: 17 }, // CTRL
placeMultiple: { keyCode: 16 }, // SHIFT
placeInverse: { keyCode: 18 }, // ALT
lockBeltDirection: { keyCodes: [16] }, // SHIFT
placementDisableAutoOrientation: { keyCodes: [17] }, // CTRL
placeMultiple: { keyCodes: [16] }, // SHIFT
placeInverse: { keyCodes: [18] }, // ALT
},
};
@ -244,15 +244,11 @@ export class Keybinding {
* @param {KeyActionMapper} keyMapper
* @param {Application} app
* @param {object} param0
* @param {number} [param0.keyCode]
* @param {number[]} [param0.keyCodes]
* @param {number[]} param0.keyCodes
* @param {boolean=} param0.builtin
* @param {boolean=} param0.repeated
*/
constructor(keyMapper, app, { keyCode = 0, keyCodes = [], builtin = false, repeated = false }) {
if (keyCode && keyCode != keyCodes[0]) {
keyCodes.unshift(keyCode);
}
constructor(keyMapper, app, { keyCodes, builtin = false, repeated = false }) {
for (let keyCode of keyCodes) {
assert(Number.isInteger(keyCode), "Invalid key code: " + keyCode);
}
@ -344,12 +340,18 @@ export class KeyActionMapper {
for (const key in KEYMAPPINGS[category]) {
let payload = Object.assign({}, KEYMAPPINGS[category][key]);
if (overrides[key]) {
payload.keyCode = overrides[key];
payload.keyCodes[0] = overrides[key];
}
payload.keyCodes = payload.keyCodes || [];
let index = 1;
while (overrides[`${key}_${index + 1}`]) {
payload.keyCodes.push(overrides[`${key}_${index + 1}`]);
while (overrides[`${key}_${index}`]) {
if (!+overrides[`${key}_${index}`]) {
break;
}
if (payload.keyCodes.length < index) {
payload.keyCodes.push(overrides[`${key}_${index}`]);
} else {
payload.keyCodes[index] = overrides[`${key}_${index}`];
}
index++;
}
@ -418,10 +420,7 @@ export class KeyActionMapper {
for (const key in this.keybindings) {
/** @type {Keybinding} */
const binding = this.keybindings[key];
if (
binding.keyCodes.includes(keyCode) &&
(initial || binding.repeated)
) {
if (binding.keyCodes.includes(keyCode) && (initial || binding.repeated)) {
/** @type {Signal} */
const signal = this.keybindings[key].signal;
if (signal.dispatch() === STOP_PROPAGATION) {

View File

@ -373,7 +373,11 @@ export class ApplicationSettings extends ReadWriteProxy {
* @param {string} id
*/
resetKeybindingOverride(id) {
delete this.getAllSettings().keybindingOverrides[id];
let overrides = this.getAllSettings().keybindingOverrides;
delete overrides[id];
for (let index = 1; overrides[id + "_" + index]; index++) {
delete overrides[id + "_" + index];
}
return this.writeAsync();
}
/**

View File

@ -29,6 +29,24 @@ export class KeybindingsState extends TextualGameState {
`;
}
addEditField(elem, keybindingId, index = 0, builtin) {
if (index) {
keybindingId += "_" + index;
}
const mappingDiv = document.createElement("span");
mappingDiv.classList.add("mapping", "mapping_" + index);
const editBtn = document.createElement("button");
editBtn.classList.add("styledButton", "editKeybinding", "editKeybinding_" + index);
if (builtin) {
editBtn.classList.add("disabled");
} else {
this.trackClicks(editBtn, () => this.editKeybinding(keybindingId));
}
elem.querySelector(".resetKeybinding").before(mappingDiv, editBtn);
}
onEnter() {
const keybindingsElem = this.htmlElement.querySelector(".keybindings");
@ -57,43 +75,19 @@ export class KeybindingsState extends TextualGameState {
title.innerText = T.keybindings.mappings[keybindingId] || `unset(${keybindingId})`;
elem.appendChild(title);
const mappingDiv = document.createElement("span");
mappingDiv.classList.add("mapping");
elem.appendChild(mappingDiv);
const editBtn = document.createElement("button");
editBtn.classList.add("styledButton", "editKeybinding");
const mappingDiv2 = document.createElement("span");
mappingDiv2.classList.add("mapping");
mappingDiv2.classList.add("mapping_2");
const editBtn2 = document.createElement("button");
editBtn2.classList.add("styledButton", "editKeybinding");
editBtn2.classList.add("styledButton", "editKeybinding_2");
const resetBtn = document.createElement("button");
resetBtn.classList.add("styledButton", "resetKeybinding");
const resetBtn2 = document.createElement("button");
resetBtn2.classList.add("styledButton", "resetKeybinding");
resetBtn2.classList.add("styledButton", "resetKeybinding_2");
if (mapped.builtin) {
editBtn.classList.add("disabled");
resetBtn.classList.add("disabled");
editBtn2.classList.add("disabled");
resetBtn2.classList.add("disabled");
} else {
this.trackClicks(editBtn, () => this.editKeybinding(keybindingId));
this.trackClicks(resetBtn, () => this.resetKeybinding(keybindingId));
this.trackClicks(editBtn2, () => this.editKeybinding(keybindingId + "_2"));
this.trackClicks(resetBtn2, () => this.resetKeybinding(keybindingId + "_2"));
}
elem.appendChild(editBtn);
elem.appendChild(resetBtn);
elem.appendChild(mappingDiv2);
elem.appendChild(editBtn2);
elem.appendChild(resetBtn2);
mapped.keyCodes = mapped.keyCodes.filter(Boolean);
for (let i = 0; i < mapped.keyCodes.length; i++) {
this.addEditField(elem, keybindingId, i, mapped.builtin);
}
}
}
this.updateKeybindings();
@ -158,28 +152,21 @@ export class KeybindingsState extends TextualGameState {
const container = this.htmlElement.querySelector("[data-keybinding='" + keybindingId + "']");
assert(container, "Container for keybinding not found: " + keybindingId);
let keyCode = mapped.keyCode;
if (overrides[keybindingId]) {
keyCode = overrides[keybindingId];
let allRaw = true;
for (let i = 0; i < mapped.keyCodes.length; i++) {
let raw = mapped.keyCodes[i];
let kid = keybindingId + (!i ? "" : "_" + i);
let over = overrides[kid];
let mappingDiv = container.querySelector(".mapping_" + i);
mappingDiv.innerHTML = getStringForKeyCode(over || raw);
mappingDiv.classList.toggle("changed", over != raw);
if (over && over != raw) {
allRaw = false;
}
}
let keyCode2 = mapped.keyCode2;
if (overrides[keybindingId + "_2"]) {
keyCode2 = overrides[keybindingId + "_2"];
}
const mappingDiv = container.querySelector(".mapping");
mappingDiv.innerHTML = getStringForKeyCode(keyCode);
mappingDiv.classList.toggle("changed", !!overrides[keybindingId]);
const mappingDiv2 = container.querySelector(".mapping_2");
mappingDiv2.innerHTML = getStringForKeyCode(keyCode2);
mappingDiv2.classList.toggle("changed", !!overrides[keybindingId + "_2"]);
const resetBtn = container.querySelector("button.resetKeybinding");
resetBtn.classList.toggle("disabled", mapped.builtin || !overrides[keybindingId]);
const resetBtn2 = container.querySelector("button.resetKeybinding_2");
resetBtn2.classList.toggle("disabled", mapped.builtin || !overrides[keybindingId + "_2"]);
resetBtn.classList.toggle("disabled", allRaw);
}
}
}