diff --git a/client/public/images/favicons/android-chrome-192x192.png b/client/public/images/favicons/android-chrome-192x192.png new file mode 100644 index 00000000..94156476 Binary files /dev/null and b/client/public/images/favicons/android-chrome-192x192.png differ diff --git a/client/public/images/favicons/android-chrome-512x512.png b/client/public/images/favicons/android-chrome-512x512.png new file mode 100644 index 00000000..1b1a4c17 Binary files /dev/null and b/client/public/images/favicons/android-chrome-512x512.png differ diff --git a/client/public/images/favicons/apple-touch-icon.png b/client/public/images/favicons/apple-touch-icon.png new file mode 100644 index 00000000..8aa1651e Binary files /dev/null and b/client/public/images/favicons/apple-touch-icon.png differ diff --git a/client/public/images/favicons/favicon-16x16.png b/client/public/images/favicons/favicon-16x16.png new file mode 100644 index 00000000..01d279f2 Binary files /dev/null and b/client/public/images/favicons/favicon-16x16.png differ diff --git a/client/public/images/favicons/favicon-32x32.png b/client/public/images/favicons/favicon-32x32.png new file mode 100644 index 00000000..63c55bd2 Binary files /dev/null and b/client/public/images/favicons/favicon-32x32.png differ diff --git a/client/public/images/favicons/favicon.ico b/client/public/images/favicons/favicon.ico new file mode 100644 index 00000000..5bb88640 Binary files /dev/null and b/client/public/images/favicons/favicon.ico differ diff --git a/client/public/images/favicons/site.webmanifest b/client/public/images/favicons/site.webmanifest new file mode 100644 index 00000000..44c84eb7 --- /dev/null +++ b/client/public/images/favicons/site.webmanifest @@ -0,0 +1,16 @@ +{ + "name": "DCS Olympus", + "short_name": "DCS Olympus", + "icons": [{ + "src": "/images/favicons/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, { + "src": "/images/favicons/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + }], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/client/public/stylesheets/style/style.css b/client/public/stylesheets/style/style.css index deafa238..f8f1a1be 100644 --- a/client/public/stylesheets/style/style.css +++ b/client/public/stylesheets/style/style.css @@ -687,6 +687,19 @@ nav.ol-panel> :last-child { width:10px; } +@keyframes lock-prompt { + 100% { + opacity: 1; + } + 0% { + opacity: 0; + } +} + +.ol-navbar-buttons-group > .protectable > button[data-protected].lock.prompt svg { + animation: lock-prompt .25s alternate infinite; +} + .ol-navbar-buttons-group > .protectable > button.lock svg.locked * { fill:white !important; } diff --git a/client/src/unit/unit.ts b/client/src/unit/unit.ts index 5260fd7d..cba3ca14 100644 --- a/client/src/unit/unit.ts +++ b/client/src/unit/unit.ts @@ -682,10 +682,8 @@ export abstract class Unit extends CustomMarker { /* Hide the unit if it does not belong to the commanded coalition and it is not detected by a method that can pinpoint its location (RWR does not count) */ (!this.belongsToCommandedCoalition() && (this.#detectionMethods.length == 0 || (this.#detectionMethods.length == 1 && this.#detectionMethods[0] === RWR))) || /* Hide the unit if grouping is activated, the unit is not the group leader, it is not selected, and the zoom is higher than the grouping threshold */ - (getApp().getMap().getVisibilityOptions()[HIDE_GROUP_MEMBERS] && !this.#isLeader && this.getCategory() == "GroundUnit" && getApp().getMap().getZoom() < GROUPING_ZOOM_TRANSITION && - (this.belongsToCommandedCoalition() || (!this.belongsToCommandedCoalition() && this.#detectionMethods.length == 0)))) && - !(this.getSelected() - ); + (getApp().getMap().getVisibilityOptions()[HIDE_GROUP_MEMBERS] && !this.#isLeader && this.getCategory() == "GroundUnit" && getApp().getMap().getZoom() < GROUPING_ZOOM_TRANSITION && + (this.belongsToCommandedCoalition() || (!this.belongsToCommandedCoalition() && this.#detectionMethods.length == 0)))); /* Force dead units to be hidden */ this.setHidden(hidden || !this.#alive); diff --git a/client/src/unit/unitsmanager.ts b/client/src/unit/unitsmanager.ts index d58be772..2aa31d09 100644 --- a/client/src/unit/unitsmanager.ts +++ b/client/src/unit/unitsmanager.ts @@ -260,6 +260,10 @@ export class UnitsManager { if (options.showProtectionReminder === true && numProtectedUnits > selectedUnits.length && selectedUnits.length === 0) { const messageText = (numProtectedUnits === 1) ? `Unit is protected` : `All selected units are protected`; (getApp().getPopupsManager().get("infoPopup") as Popup).setText(messageText); + // Cheap way for now until we use more locks + let lock = document.querySelector("#unit-visibility-control button.lock"); + lock.classList.add("prompt"); + setTimeout(() => lock.classList.remove("prompt"), 4000); } if (options.onlyOnePerGroup) { @@ -891,7 +895,7 @@ export class UnitsManager { */ delete(explosion: boolean = false, explosionType: string = "", units: Unit[] | null = null) { if (units === null) - units = this.getSelectedUnits({ excludeProtected: true }); /* Can be applied to humans too */ + units = this.getSelectedUnits({ excludeProtected: true, showProtectionReminder: true }); /* Can be applied to humans too */ if (units.length === 0) return; diff --git a/client/views/index.ejs b/client/views/index.ejs index 1dd037ec..6ecfaba2 100644 --- a/client/views/index.ejs +++ b/client/views/index.ejs @@ -3,14 +3,18 @@ Olympus client - - + + - - - + + + + + + +