mirror of
https://github.com/tobspr/shapez.io.git
synced 2026-02-24 00:39:20 +00:00
working keyCodes[] settings (edit, reset)
This commit is contained in:
parent
de71c39947
commit
f18c670225
@ -15,69 +15,69 @@ function key(str) {
|
|||||||
|
|
||||||
export const KEYMAPPINGS = {
|
export const KEYMAPPINGS = {
|
||||||
general: {
|
general: {
|
||||||
confirm: { keyCode: 13 }, // enter
|
confirm: { keyCodes: [13] }, // enter
|
||||||
back: { keyCode: 27, builtin: true }, // escape
|
back: { keyCodes: [27], builtin: true }, // escape
|
||||||
},
|
},
|
||||||
|
|
||||||
ingame: {
|
ingame: {
|
||||||
menuOpenShop: { keyCode: key("F") },
|
menuOpenShop: { keyCodes: [key("F")] },
|
||||||
menuOpenStats: { keyCode: key("G") },
|
menuOpenStats: { keyCodes: [key("G")] },
|
||||||
|
|
||||||
toggleHud: { keyCode: 113 }, // F2
|
toggleHud: { keyCodes: [113] }, // F2
|
||||||
exportScreenshot: { keyCode: 114 }, // F3
|
exportScreenshot: { keyCodes: [114] }, // F3
|
||||||
toggleFPSInfo: { keyCode: 115 }, // F4
|
toggleFPSInfo: { keyCodes: [115] }, // F4
|
||||||
},
|
},
|
||||||
|
|
||||||
navigation: {
|
navigation: {
|
||||||
mapMoveUp: { keyCode: key("W") },
|
mapMoveUp: { keyCodes: [key("W")] },
|
||||||
mapMoveRight: { keyCode: key("D") },
|
mapMoveRight: { keyCodes: [key("D")] },
|
||||||
mapMoveDown: { keyCode: key("S") },
|
mapMoveDown: { keyCodes: [key("S")] },
|
||||||
mapMoveLeft: { keyCode: key("A") },
|
mapMoveLeft: { keyCodes: [key("A")] },
|
||||||
mapMoveFaster: { keyCode: 16 }, //shift
|
mapMoveFaster: { keyCodes: [16] }, //shift
|
||||||
|
|
||||||
centerMap: { keyCode: 32 }, // SPACE
|
centerMap: { keyCodes: [32] }, // SPACE
|
||||||
mapZoomIn: { keyCode: 187, repeated: true }, // "+"
|
mapZoomIn: { keyCodes: [187], repeated: true }, // "+"
|
||||||
mapZoomOut: { keyCode: 189, repeated: true }, // "-"
|
mapZoomOut: { keyCodes: [189], repeated: true }, // "-"
|
||||||
|
|
||||||
createMarker: { keyCode: key("M") },
|
createMarker: { keyCodes: [key("M")] },
|
||||||
},
|
},
|
||||||
|
|
||||||
buildings: {
|
buildings: {
|
||||||
belt: { keyCode: key("1") },
|
belt: { keyCodes: [key("1")] },
|
||||||
splitter: { keyCode: key("2") },
|
splitter: { keyCodes: [key("2")] },
|
||||||
underground_belt: { keyCode: key("3") },
|
underground_belt: { keyCodes: [key("3")] },
|
||||||
miner: { keyCode: key("4") },
|
miner: { keyCodes: [key("4")] },
|
||||||
cutter: { keyCode: key("5") },
|
cutter: { keyCodes: [key("5")] },
|
||||||
rotater: { keyCode: key("6") },
|
rotater: { keyCodes: [key("6")] },
|
||||||
stacker: { keyCode: key("7") },
|
stacker: { keyCodes: [key("7")] },
|
||||||
mixer: { keyCode: key("8") },
|
mixer: { keyCodes: [key("8")] },
|
||||||
painter: { keyCode: key("9") },
|
painter: { keyCodes: [key("9")] },
|
||||||
trash: { keyCode: key("0") },
|
trash: { keyCodes: [key("0")] },
|
||||||
},
|
},
|
||||||
|
|
||||||
placement: {
|
placement: {
|
||||||
abortBuildingPlacement: { keyCode: key("Q") },
|
abortBuildingPlacement: { keyCodes: [key("Q")] },
|
||||||
rotateWhilePlacing: { keyCode: key("R") },
|
rotateWhilePlacing: { keyCodes: [key("R")] },
|
||||||
rotateInverseModifier: { keyCode: 16 }, // SHIFT
|
rotateInverseModifier: { keyCodes: [16] }, // SHIFT
|
||||||
cycleBuildingVariants: { keyCode: key("T") },
|
cycleBuildingVariants: { keyCodes: [key("T")] },
|
||||||
cycleBuildings: { keyCode: 9 }, // TAB
|
cycleBuildings: { keyCodes: [9] }, // TAB
|
||||||
switchDirectionLockSide: { keyCode: key("R") },
|
switchDirectionLockSide: { keyCodes: [key("R")] },
|
||||||
},
|
},
|
||||||
|
|
||||||
massSelect: {
|
massSelect: {
|
||||||
massSelectStart: { keyCode: 17 }, // CTRL
|
massSelectStart: { keyCodes: [17] }, // CTRL
|
||||||
massSelectSelectMultiple: { keyCode: 16 }, // SHIFT
|
massSelectSelectMultiple: { keyCodes: [16] }, // SHIFT
|
||||||
massSelectCopy: { keyCode: key("C") },
|
massSelectCopy: { keyCodes: [key("C")] },
|
||||||
massSelectCut: { keyCode: key("X") },
|
massSelectCut: { keyCodes: [key("X")] },
|
||||||
confirmMassDelete: { keyCode: 46 }, // DEL
|
confirmMassDelete: { keyCodes: [46] }, // DEL
|
||||||
pasteLastBlueprint: { keyCode: key("V") },
|
pasteLastBlueprint: { keyCodes: [key("V")] },
|
||||||
},
|
},
|
||||||
|
|
||||||
placementModifiers: {
|
placementModifiers: {
|
||||||
lockBeltDirection: { keyCode: 16 }, // SHIFT
|
lockBeltDirection: { keyCodes: [16] }, // SHIFT
|
||||||
placementDisableAutoOrientation: { keyCode: 17 }, // CTRL
|
placementDisableAutoOrientation: { keyCodes: [17] }, // CTRL
|
||||||
placeMultiple: { keyCode: 16 }, // SHIFT
|
placeMultiple: { keyCodes: [16] }, // SHIFT
|
||||||
placeInverse: { keyCode: 18 }, // ALT
|
placeInverse: { keyCodes: [18] }, // ALT
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -244,15 +244,11 @@ export class Keybinding {
|
|||||||
* @param {KeyActionMapper} keyMapper
|
* @param {KeyActionMapper} keyMapper
|
||||||
* @param {Application} app
|
* @param {Application} app
|
||||||
* @param {object} param0
|
* @param {object} param0
|
||||||
* @param {number} [param0.keyCode]
|
* @param {number[]} param0.keyCodes
|
||||||
* @param {number[]} [param0.keyCodes]
|
|
||||||
* @param {boolean=} param0.builtin
|
* @param {boolean=} param0.builtin
|
||||||
* @param {boolean=} param0.repeated
|
* @param {boolean=} param0.repeated
|
||||||
*/
|
*/
|
||||||
constructor(keyMapper, app, { keyCode = 0, keyCodes = [], builtin = false, repeated = false }) {
|
constructor(keyMapper, app, { keyCodes, builtin = false, repeated = false }) {
|
||||||
if (keyCode && keyCode != keyCodes[0]) {
|
|
||||||
keyCodes.unshift(keyCode);
|
|
||||||
}
|
|
||||||
for (let keyCode of keyCodes) {
|
for (let keyCode of keyCodes) {
|
||||||
assert(Number.isInteger(keyCode), "Invalid key code: " + keyCode);
|
assert(Number.isInteger(keyCode), "Invalid key code: " + keyCode);
|
||||||
}
|
}
|
||||||
@ -344,12 +340,18 @@ export class KeyActionMapper {
|
|||||||
for (const key in KEYMAPPINGS[category]) {
|
for (const key in KEYMAPPINGS[category]) {
|
||||||
let payload = Object.assign({}, KEYMAPPINGS[category][key]);
|
let payload = Object.assign({}, KEYMAPPINGS[category][key]);
|
||||||
if (overrides[key]) {
|
if (overrides[key]) {
|
||||||
payload.keyCode = overrides[key];
|
payload.keyCodes[0] = overrides[key];
|
||||||
}
|
}
|
||||||
payload.keyCodes = payload.keyCodes || [];
|
|
||||||
let index = 1;
|
let index = 1;
|
||||||
while (overrides[`${key}_${index + 1}`]) {
|
while (overrides[`${key}_${index}`]) {
|
||||||
payload.keyCodes.push(overrides[`${key}_${index + 1}`]);
|
if (!+overrides[`${key}_${index}`]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (payload.keyCodes.length < index) {
|
||||||
|
payload.keyCodes.push(overrides[`${key}_${index}`]);
|
||||||
|
} else {
|
||||||
|
payload.keyCodes[index] = overrides[`${key}_${index}`];
|
||||||
|
}
|
||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,10 +420,7 @@ export class KeyActionMapper {
|
|||||||
for (const key in this.keybindings) {
|
for (const key in this.keybindings) {
|
||||||
/** @type {Keybinding} */
|
/** @type {Keybinding} */
|
||||||
const binding = this.keybindings[key];
|
const binding = this.keybindings[key];
|
||||||
if (
|
if (binding.keyCodes.includes(keyCode) && (initial || binding.repeated)) {
|
||||||
binding.keyCodes.includes(keyCode) &&
|
|
||||||
(initial || binding.repeated)
|
|
||||||
) {
|
|
||||||
/** @type {Signal} */
|
/** @type {Signal} */
|
||||||
const signal = this.keybindings[key].signal;
|
const signal = this.keybindings[key].signal;
|
||||||
if (signal.dispatch() === STOP_PROPAGATION) {
|
if (signal.dispatch() === STOP_PROPAGATION) {
|
||||||
|
|||||||
@ -373,7 +373,11 @@ export class ApplicationSettings extends ReadWriteProxy {
|
|||||||
* @param {string} id
|
* @param {string} id
|
||||||
*/
|
*/
|
||||||
resetKeybindingOverride(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();
|
return this.writeAsync();
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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() {
|
onEnter() {
|
||||||
const keybindingsElem = this.htmlElement.querySelector(".keybindings");
|
const keybindingsElem = this.htmlElement.querySelector(".keybindings");
|
||||||
|
|
||||||
@ -57,43 +75,19 @@ export class KeybindingsState extends TextualGameState {
|
|||||||
title.innerText = T.keybindings.mappings[keybindingId] || `unset(${keybindingId})`;
|
title.innerText = T.keybindings.mappings[keybindingId] || `unset(${keybindingId})`;
|
||||||
elem.appendChild(title);
|
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");
|
const resetBtn = document.createElement("button");
|
||||||
resetBtn.classList.add("styledButton", "resetKeybinding");
|
resetBtn.classList.add("styledButton", "resetKeybinding");
|
||||||
const resetBtn2 = document.createElement("button");
|
|
||||||
resetBtn2.classList.add("styledButton", "resetKeybinding");
|
|
||||||
resetBtn2.classList.add("styledButton", "resetKeybinding_2");
|
|
||||||
|
|
||||||
if (mapped.builtin) {
|
if (mapped.builtin) {
|
||||||
editBtn.classList.add("disabled");
|
|
||||||
resetBtn.classList.add("disabled");
|
resetBtn.classList.add("disabled");
|
||||||
editBtn2.classList.add("disabled");
|
|
||||||
resetBtn2.classList.add("disabled");
|
|
||||||
} else {
|
} else {
|
||||||
this.trackClicks(editBtn, () => this.editKeybinding(keybindingId));
|
|
||||||
this.trackClicks(resetBtn, () => this.resetKeybinding(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(resetBtn);
|
||||||
elem.appendChild(mappingDiv2);
|
|
||||||
elem.appendChild(editBtn2);
|
mapped.keyCodes = mapped.keyCodes.filter(Boolean);
|
||||||
elem.appendChild(resetBtn2);
|
for (let i = 0; i < mapped.keyCodes.length; i++) {
|
||||||
|
this.addEditField(elem, keybindingId, i, mapped.builtin);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.updateKeybindings();
|
this.updateKeybindings();
|
||||||
@ -158,28 +152,21 @@ export class KeybindingsState extends TextualGameState {
|
|||||||
const container = this.htmlElement.querySelector("[data-keybinding='" + keybindingId + "']");
|
const container = this.htmlElement.querySelector("[data-keybinding='" + keybindingId + "']");
|
||||||
assert(container, "Container for keybinding not found: " + keybindingId);
|
assert(container, "Container for keybinding not found: " + keybindingId);
|
||||||
|
|
||||||
let keyCode = mapped.keyCode;
|
let allRaw = true;
|
||||||
if (overrides[keybindingId]) {
|
for (let i = 0; i < mapped.keyCodes.length; i++) {
|
||||||
keyCode = overrides[keybindingId];
|
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");
|
const resetBtn = container.querySelector("button.resetKeybinding");
|
||||||
resetBtn.classList.toggle("disabled", mapped.builtin || !overrides[keybindingId]);
|
resetBtn.classList.toggle("disabled", allRaw);
|
||||||
|
|
||||||
const resetBtn2 = container.querySelector("button.resetKeybinding_2");
|
|
||||||
resetBtn2.classList.toggle("disabled", mapped.builtin || !overrides[keybindingId + "_2"]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user