diff --git a/client/plugins/controltips/index.js b/client/plugins/controltips/index.js new file mode 100644 index 00000000..4acea1ed --- /dev/null +++ b/client/plugins/controltips/index.js @@ -0,0 +1,346 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i { + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + __classPrivateFieldGet(this, _ControlTipsPlugin_shortcutManager, "f").onKeyUp(() => { + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("airbaseMouseover", (ev) => { + __classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverAirbase, true, "f"); + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("airbaseMouseout", (ev) => { + __classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverAirbase, false, "f"); + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("unitDeselection", (ev) => { + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("unitMouseover", (ev) => { + __classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverUnit, true, "f"); + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("unitMouseout", (ev) => { + __classPrivateFieldSet(this, _ControlTipsPlugin_cursorIsHoveringOverUnit, false, "f"); + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("unitSelection", (ev) => { + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("mapVisibilityOptionsChanged", () => { + this.toggle(!__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getMap().getVisibilityOptions()[SHOW_CONTROL_TIPS]); + }); + document.addEventListener("mouseover", (ev) => { + if (ev.target instanceof HTMLElement) { + __classPrivateFieldSet(this, _ControlTipsPlugin_mouseoverElement, ev.target, "f"); + } + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + document.addEventListener("mouseup", (ev) => { + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + }); + __classPrivateFieldGet(this, _ControlTipsPlugin_instances, "m", _ControlTipsPlugin_updateTips).call(this); + __classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getMap().addVisibilityOption(SHOW_CONTROL_TIPS, true); + return true; + } + getElement() { + return __classPrivateFieldGet(this, _ControlTipsPlugin_element, "f"); + } + toggle(bool) { + this.getElement().classList.toggle("hide", bool); + } +} +exports.ControlTipsPlugin = ControlTipsPlugin; +_ControlTipsPlugin_element = new WeakMap(), _ControlTipsPlugin_app = new WeakMap(), _ControlTipsPlugin_shortcutManager = new WeakMap(), _ControlTipsPlugin_cursorIsHoveringOverUnit = new WeakMap(), _ControlTipsPlugin_cursorIsHoveringOverAirbase = new WeakMap(), _ControlTipsPlugin_mouseoverElement = new WeakMap(), _ControlTipsPlugin_instances = new WeakSet(), _ControlTipsPlugin_updateTips = function _ControlTipsPlugin_updateTips() { + const combos = [ + { + "keys": [], + "tips": [ + { + "key": `SHIFT`, + "action": `Box select`, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false, + "showIfUnitSelected": false + }, + { + "key": `Mouse1`, + "action": `Deselect`, + "showIfUnitSelected": true + }, + { + "key": `Mouse1+drag`, + "action": `Move map`, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false, + "showIfUnitSelected": false + }, + { + "key": `Mouse2`, + "action": `Spawn menu`, + "showIfUnitSelected": false, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false + }, + { + "key": `Mouse2`, + "action": `Quick options`, + "showIfUnitSelected": false, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": true + }, + { + "key": `Mouse2`, + "action": `Airbase menu`, + "showIfUnitSelected": false, + "showIfHoveringOverAirbase": true, + "showIfHoveringOverUnit": false + }, + { + "key": `Mouse2`, + "action": `Set first waypoint`, + "showIfHoveringOverAirbase": false, + "showIfUnitSelected": true, + "unitsMustBeControlled": true + }, + { + "key": `Mouse2 (hold)`, + "action": `Interact (ground)`, + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false, + "unitsMustBeControlled": true + }, + { + "key": `Shift`, + "action": " in formation...", + "showIfUnitSelected": true, + "minSelectedUnits": 2 + }, + { + "key": "CTRL", + "action": " ... more", + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": false, + "unitsMustBeControlled": true + }, + { + "key": "CTRL", + "action": " Pin tool", + "showIfUnitSelected": false, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false, + "unitsMustBeControlled": true + }, + { + "key": "CTRL+Mouse2", + "action": " Airbase menu", + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": true, + "unitsMustBeControlled": true + }, + { + "key": `Mouse1`, + "action": "Toggle Blue/Red", + "mouseoverSelector": "#coalition-switch .ol-switch-fill" + }, + { + "key": `Mouse2`, + "action": "Set Neutral", + "mouseoverSelector": "#coalition-switch .ol-switch-fill" + } + ] + }, + { + "keys": ["ControlLeft"], + "tips": [ + { + "key": `Mouse1`, + "action": "Toggle pin", + "showIfUnitSelected": false, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false + }, + { + "key": `Mouse1`, + "action": "Toggle selection", + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": true + }, + { + "key": `Mouse2`, + "action": `Add waypoint`, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false, + "showIfUnitSelected": true, + "unitsMustBeControlled": true + }, + { + "key": `Mouse2`, + "action": `Interact (airbase)`, + "showIfHoveringOverAirbase": true, + "showIfUnitSelected": true, + "unitsMustBeControlled": true + }, + { + "key": `Mouse2`, + "action": `Interact (unit)`, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": true, + "showIfUnitSelected": true, + "unitsMustBeControlled": true + }, + { + "key": `Shift`, + "action": " in formation...", + "showIfUnitSelected": true, + "minSelectedUnits": 2 + }, + { + "key": `[Num 1-9]`, + "action": "Set hotgroup", + "showIfUnitSelected": true + } + ] + }, + { + "keys": ["ShiftLeft"], + "tips": [ + { + "key": `Mouse1+drag`, + "action": "Box select", + "showIfUnitSelected": false + }, + { + "key": `Mouse2`, + "action": "Set first formation waypoint", + "showIfUnitSelected": true, + "minSelectedUnits": 2 + }, + { + "key": "CTRL", + "action": " ... more", + "minSelectedUnits": 2, + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": false, + "unitsMustBeControlled": true + } + ] + }, + { + "keys": ["ControlLeft", "ShiftLeft"], + "tips": [ + { + "key": `Mouse2`, + "action": "Add formation waypoint", + "showIfUnitSelected": true, + "minSelectedUnits": 2, + "unitsMustBeControlled": true + } + ] + } + ]; + const currentCombo = combos.find((combo) => __classPrivateFieldGet(this, _ControlTipsPlugin_shortcutManager, "f").keyComboMatches(combo.keys)) || combos[0]; + const element = this.getElement(); + element.innerHTML = ""; + let numSelectedUnits = 0; + let numSelectedControlledUnits = 0; + let unitSelectionContainsControlled = false; + if (__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getUnitsManager()) { + let selectedUnits = Object.values(__classPrivateFieldGet(this, _ControlTipsPlugin_app, "f").getUnitsManager().getSelectedUnits()); + numSelectedUnits = selectedUnits.length; + numSelectedControlledUnits = selectedUnits.filter((unit) => unit.getControlled()).length; + unitSelectionContainsControlled = numSelectedControlledUnits > 0; + } + const tipsIncludesActiveMouseover = (currentCombo.tips.some((tip) => { + if (!tip.mouseoverSelector) { + return false; + } + if (__classPrivateFieldGet(this, _ControlTipsPlugin_mouseoverElement, "f") instanceof HTMLElement === false) { + return false; + } + if (!__classPrivateFieldGet(this, _ControlTipsPlugin_mouseoverElement, "f").matches(tip.mouseoverSelector)) { + return false; + } + return true; + })); + currentCombo.tips.filter((tip) => { + if (numSelectedUnits > 0) { + if (tip.showIfUnitSelected === false) { + return false; + } + if (tip.unitsMustBeControlled === true && unitSelectionContainsControlled === false) { + return false; + } + if (typeof tip.minSelectedUnits === "number" && numSelectedControlledUnits < tip.minSelectedUnits) { + return false; + } + } + if (numSelectedUnits === 0 && tip.showIfUnitSelected === true) { + return false; + } + if (typeof tip.showIfHoveringOverAirbase === "boolean") { + if (tip.showIfHoveringOverAirbase !== __classPrivateFieldGet(this, _ControlTipsPlugin_cursorIsHoveringOverAirbase, "f")) { + return false; + } + } + if (typeof tip.showIfHoveringOverUnit === "boolean") { + if (tip.showIfHoveringOverUnit !== __classPrivateFieldGet(this, _ControlTipsPlugin_cursorIsHoveringOverUnit, "f")) { + return false; + } + } + if (tipsIncludesActiveMouseover && typeof tip.mouseoverSelector !== "string" && !__classPrivateFieldGet(this, _ControlTipsPlugin_mouseoverElement, "f").matches(tip.mouseoverSelector)) { + return false; + } + if (!tipsIncludesActiveMouseover && typeof tip.mouseoverSelector === "string") { + return false; + } + element.innerHTML += `
${tip.key}${tip.action}
`; + }); +}; + +},{}],2:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const controltipsplugin_1 = require("./controltipsplugin"); +globalThis.getOlympusPlugin = () => { + return new controltipsplugin_1.ControlTipsPlugin(); +}; + +},{"./controltipsplugin":1}]},{},[2]); diff --git a/client/plugins/controltips/src/controltipsplugin.ts b/client/plugins/controltips/src/controltipsplugin.ts index 1f6e7033..5977d9e3 100644 --- a/client/plugins/controltips/src/controltipsplugin.ts +++ b/client/plugins/controltips/src/controltipsplugin.ts @@ -70,6 +70,10 @@ export class ControlTipsPlugin implements OlympusPlugin { this.#updateTips(); }); + document.addEventListener( "mouseup", ( ev: MouseEvent ) => { + this.#updateTips(); + }); + this.#updateTips(); this.#app.getMap().addVisibilityOption(SHOW_CONTROL_TIPS, true); @@ -137,21 +141,27 @@ export class ControlTipsPlugin implements OlympusPlugin { "showIfUnitSelected": true, "unitsMustBeControlled": true }, - { - "key": "CTRL+Mouse2", - "action": "Add waypoint", - "showIfUnitSelected": true, - "showIfHoveringOverAirbase": false, - "unitsMustBeControlled": true - }, { "key": `Mouse2 (hold)`, - "action": `Point operations`, + "action": `Interact (ground)`, "showIfUnitSelected": true, "showIfHoveringOverAirbase": false, "showIfHoveringOverUnit": false, "unitsMustBeControlled": true }, + { + "key": `Shift`, + "action": " in formation...", + "showIfUnitSelected": true, + "minSelectedUnits": 2 + }, + { + "key": "CTRL", + "action": " ... more", + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": false, + "unitsMustBeControlled": true + }, { "key": "CTRL", "action": " Pin tool", @@ -168,18 +178,12 @@ export class ControlTipsPlugin implements OlympusPlugin { "unitsMustBeControlled": true }, { - "key": `Delete`, - "action": `Delete unit`, - "showIfHoveringOverAirbase": false, - "showIfUnitSelected": true - }, - { - "key": `mouse1`, + "key": `Mouse1`, "action": "Toggle Blue/Red", "mouseoverSelector": "#coalition-switch .ol-switch-fill" }, { - "key": `mouse2`, + "key": `Mouse2`, "action": "Set Neutral", "mouseoverSelector": "#coalition-switch .ol-switch-fill" } @@ -206,15 +210,35 @@ export class ControlTipsPlugin implements OlympusPlugin { "key": `Mouse2`, "action": `Add waypoint`, "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": false, "showIfUnitSelected": true, "unitsMustBeControlled": true }, { "key": `Mouse2`, - "action": `Airbase menu`, + "action": `Interact (airbase)`, "showIfHoveringOverAirbase": true, "showIfUnitSelected": true, "unitsMustBeControlled": true + }, + { + "key": `Mouse2`, + "action": `Interact (unit)`, + "showIfHoveringOverAirbase": false, + "showIfHoveringOverUnit": true, + "showIfUnitSelected": true, + "unitsMustBeControlled": true + }, + { + "key": `Shift`, + "action": " in formation...", + "showIfUnitSelected": true, + "minSelectedUnits": 2 + }, + { + "key": `[Num 1-9]`, + "action": "Set hotgroup", + "showIfUnitSelected": true } ] }, @@ -222,8 +246,35 @@ export class ControlTipsPlugin implements OlympusPlugin { "keys": ["ShiftLeft"], "tips": [ { - "key": `mouse1+drag`, - "action": "Box select" + "key": `Mouse1+drag`, + "action": "Box select", + "showIfUnitSelected": false + }, + { + "key": `Mouse2`, + "action": "Set first formation waypoint", + "showIfUnitSelected": true, + "minSelectedUnits": 2 + }, + { + "key": "CTRL", + "action": " ... more", + "minSelectedUnits": 2, + "showIfUnitSelected": true, + "showIfHoveringOverAirbase": false, + "unitsMustBeControlled": true + } + ] + }, + { + "keys": ["ControlLeft", "ShiftLeft"], + "tips": [ + { + "key": `Mouse2`, + "action": "Add formation waypoint", + "showIfUnitSelected": true, + "minSelectedUnits": 2, + "unitsMustBeControlled": true } ] } @@ -236,12 +287,14 @@ export class ControlTipsPlugin implements OlympusPlugin { element.innerHTML = ""; let numSelectedUnits = 0; + let numSelectedControlledUnits = 0; let unitSelectionContainsControlled = false; if (this.#app.getUnitsManager()) { let selectedUnits = Object.values(this.#app.getUnitsManager().getSelectedUnits()); - numSelectedUnits = selectedUnits.length; - unitSelectionContainsControlled = selectedUnits.some((unit: any) => unit.getControlled()); + numSelectedUnits = selectedUnits.length; + numSelectedControlledUnits = selectedUnits.filter((unit: any) => unit.getControlled()).length; + unitSelectionContainsControlled = numSelectedControlledUnits > 0; } const tipsIncludesActiveMouseover = ( currentCombo.tips.some( ( tip:any ) => { @@ -269,6 +322,10 @@ export class ControlTipsPlugin implements OlympusPlugin { if (tip.unitsMustBeControlled === true && unitSelectionContainsControlled === false) { return false; } + + if ( typeof tip.minSelectedUnits === "number" && numSelectedControlledUnits < tip.minSelectedUnits ) { + return false; + } } if (numSelectedUnits === 0 && tip.showIfUnitSelected === true) { @@ -295,10 +352,8 @@ export class ControlTipsPlugin implements OlympusPlugin { return false; } - return true; + element.innerHTML += `
${tip.key}${tip.action}
`; - }).forEach( (tip:any) => { - element.innerHTML += `
${tip.key}${tip.action}
` }); } } \ No newline at end of file