diff --git a/client/app.js b/client/app.js
index 85d5c31d..651c2b73 100644
--- a/client/app.js
+++ b/client/app.js
@@ -3,7 +3,6 @@ var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var fs = require('fs');
-var basicAuth = require('express-basic-auth')
var atcRouter = require('./routes/api/atc');
var airbasesRouter = require('./routes/api/airbases');
@@ -37,15 +36,7 @@ if (config["server"] != undefined)
module.exports = app;
const DemoDataGenerator = require('./demo.js');
-var demoDataGenerator = new DemoDataGenerator(10);
-app.get('/demo/units', (req, res) => demoDataGenerator.units(req, res));
-app.get('/demo/logs', (req, res) => demoDataGenerator.logs(req, res));
-app.get('/demo/bullseyes', (req, res) => demoDataGenerator.bullseyes(req, res));
-app.get('/demo/airbases', (req, res) => demoDataGenerator.airbases(req, res));
-app.get('/demo/mission', (req, res) => demoDataGenerator.mission(req, res));
-
-app.use('/demo', basicAuth({
- users: { 'admin': 'socks' }
-}))
+var demoDataGenerator = new DemoDataGenerator(app);
+
diff --git a/client/demo.js b/client/demo.js
index be34fce8..d7fcebf0 100644
--- a/client/demo.js
+++ b/client/demo.js
@@ -1,7 +1,8 @@
+var basicAuth = require('express-basic-auth')
var enc = new TextEncoder();
const DEMO_UNIT_DATA = {
- ["1"]:{ alive: true, human: false, controlled: true, coalition: 2, country: 0, name: "KC-135", unitName: "Cool guy 1-1", groupName: "Cool group 1", state: 3, task: "Being cool!",
+ ["1"]:{ category: "Aircraft", alive: true, human: false, controlled: true, coalition: 2, country: 0, name: "KC-135", unitName: "Cool guy 1-1 who also has a very long name", groupName: "Cool group 1", state: 3, task: "Being cool!",
hasTask: true, position: { lat: 37, lng: -116, alt: 1000 }, speed: 200, heading: 45, isTanker: true, isAWACS: false, onOff: true, followRoads: false, fuel: 50,
desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0,
formationOffset: { x: 0, y: 0, z: 0 },
@@ -14,15 +15,15 @@ const DEMO_UNIT_DATA = {
radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 },
generalSettings: { prohibitAA: false, prohibitAfterburner: false, prohibitAG: false, prohibitAirWpn: false, prohibitJettison: false },
ammo: [{ quantity: 2, name: "A cool missile", guidance: 0, category: 0, missileCategory: 0 } ],
- contacts: [],
- activePath: [ {lat: 38, lng: -115, alt: 0}, {lat: 38, lng: -114, alt: 0} ]
+ contacts: [{ID: 2, detectionMethod: 1}],
+ activePath: [{lat: 38, lng: -115, alt: 0}, {lat: 38, lng: -114, alt: 0}]
},
- ["2"]:{ alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "KC-135", unitName: "Cool guy 1-2", groupName: "Cool group 2", state: 1, task: "Being cool",
- hasTask: false, position: { lat: 36.9, lng: -116, alt: 1000 }, speed: 200, heading: 0, isTanker: false, isAWACS: false, onOff: true, followRoads: false, fuel: 50,
+ ["2"]:{ category: "Aircraft", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "FA-18C_hornet", unitName: "Cool guy 1-2", groupName: "Cool group 2", state: 1, task: "Being cool",
+ hasTask: false, position: { lat: 36.9, lng: -116, alt: 1000 }, speed: 200, heading: 315 * Math.PI / 180, isTanker: false, isAWACS: false, onOff: true, followRoads: false, fuel: 50,
desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0,
formationOffset: { x: 0, y: 0, z: 0 },
targetID: 0,
- targetPosition: { lat: 38, lng: -117, alt: 1000 },
+ targetPosition: { lat: 0, lng: 0, alt: 0 },
ROE: 2,
reactionToThreat: 1,
emissionsCountermeasures: 1,
@@ -30,15 +31,57 @@ const DEMO_UNIT_DATA = {
radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 },
generalSettings: { prohibitAA: false, prohibitAfterburner: false, prohibitAG: false, prohibitAirWpn: false, prohibitJettison: false },
ammo: [{ quantity: 2, name: "A cool missile", guidance: 0, category: 0, missileCategory: 0 } ],
- contacts: [{ID: 1, detectionMethod: 4}],
- activePath: [ {lat: 38, lng: -115, alt: 0}, {lat: 38, lng: -114, alt: 0} ]
+ contacts: [{ID: 1, detectionMethod: 16}],
+ activePath: [ ]
+ }, ["3"]:{ category: "GroundUnit", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "M-60", unitName: "Cool guy 1-3", groupName: "Cool group 3", state: 1, task: "Being cool",
+ hasTask: false, position: { lat: 37.1, lng: -116, alt: 1000 }, speed: 200, heading: 315 * Math.PI / 180, isTanker: false, isAWACS: false, onOff: true, followRoads: false, fuel: 50,
+ desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0,
+ formationOffset: { x: 0, y: 0, z: 0 },
+ targetID: 0,
+ targetPosition: { lat: 0, lng: 0, alt: 0 },
+ ROE: 2,
+ reactionToThreat: 1,
+ emissionsCountermeasures: 1,
+ TACAN: { isOn: false, XY: 'Y', callsign: 'TKR', channel: 40 },
+ radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 },
+ generalSettings: { prohibitAA: false, prohibitAfterburner: false, prohibitAG: false, prohibitAirWpn: false, prohibitJettison: false },
+ ammo: [{ quantity: 2, name: "A cool missile", guidance: 0, category: 0, missileCategory: 0 } ],
+ contacts: [{ID: 1, detectionMethod: 16}],
+ activePath: [ ]
+ }, ["4"]:{ category: "Helicopter", alive: true, human: false, controlled: false, coalition: 1, country: 0, name: "AH-64D_BLK_II", unitName: "Cool guy 1-4", groupName: "Cool group 3", state: 1, task: "Being cool",
+ hasTask: false, position: { lat: 37.1, lng: -116.1, alt: 1000 }, speed: 200, heading: 315 * Math.PI / 180, isTanker: false, isAWACS: false, onOff: true, followRoads: false, fuel: 50,
+ desiredSpeed: 300, desiredSpeedType: 1, desiredAltitude: 1000, desiredAltitudeType: 1, leaderID: 0,
+ formationOffset: { x: 0, y: 0, z: 0 },
+ targetID: 0,
+ targetPosition: { lat: 0, lng: 0, alt: 0 },
+ ROE: 2,
+ reactionToThreat: 1,
+ emissionsCountermeasures: 1,
+ TACAN: { isOn: false, XY: 'Y', callsign: 'TKR', channel: 40 },
+ radio: { frequency: 124000000, callsign: 1, callsignNumber: 1 },
+ generalSettings: { prohibitAA: false, prohibitAfterburner: false, prohibitAG: false, prohibitAirWpn: false, prohibitJettison: false },
+ ammo: [{ quantity: 2, name: "A cool missile", guidance: 0, category: 0, missileCategory: 0 } ],
+ contacts: [{ID: 1, detectionMethod: 16}],
+ activePath: [ ]
}
}
class DemoDataGenerator {
- constructor()
+ constructor(app)
{
-
+ app.get('/demo/units', (req, res) => this.units(req, res));
+ app.get('/demo/logs', (req, res) => this.logs(req, res));
+ app.get('/demo/bullseyes', (req, res) => this.bullseyes(req, res));
+ app.get('/demo/airbases', (req, res) => this.airbases(req, res));
+ app.get('/demo/mission', (req, res) => this.mission(req, res));
+
+ app.use('/demo', basicAuth({
+ users: {
+ 'admin': 'socks',
+ 'blue': 'bluesocks',
+ 'red': 'redsocks'
+ },
+ }))
}
units(req, res){
@@ -48,7 +91,7 @@ class DemoDataGenerator {
for (let idx in DEMO_UNIT_DATA) {
const unit = DEMO_UNIT_DATA[idx];
array = this.concat(array, this.uint32ToByteArray(idx));
- array = this.appendString(array, "Aircraft", 1);
+ array = this.appendString(array, unit.category, 1);
array = this.appendUint8(array, unit.alive, 2);
array = this.appendUint8(array, unit.human, 3);
array = this.appendUint8(array, unit.controlled, 4);
@@ -300,8 +343,23 @@ class DemoDataGenerator {
};
mission(req, res){
- var ret = {mission: {theatre: "Nevada"}};
+ var ret = {mission: {theatre: "Syria"}};
ret.time = Date.now();
+ var auth = req.get("Authorization");
+ if (auth) {
+ var username = atob(auth.replace("Basic ", "")).split(":")[0];
+ switch (username) {
+ case "admin":
+ ret.mission.visibilityMode = "Game master";
+ break
+ case "blue":
+ ret.mission.visibilityMode = "Blue commander";
+ break;
+ case "red":
+ ret.mission.visibilityMode = "Red commander";
+ break;
+ }
+ }
res.send(JSON.stringify(ret));
}
diff --git a/client/public/stylesheets/markers/units.css b/client/public/stylesheets/markers/units.css
index 62ca82b6..d4f88333 100644
--- a/client/public/stylesheets/markers/units.css
+++ b/client/public/stylesheets/markers/units.css
@@ -14,11 +14,11 @@
background: var(--secondary-gunmetal-grey);
display: flex;
justify-self: center;
- padding-bottom: calc((var(--unit-aircraft-width) / 2) + var(--unit-stroke-width));
+ padding-bottom: calc((var(--unit-width) / 2) + var(--unit-stroke-width));
position: absolute;
transform-origin: bottom;
translate: 0 -50%;
- width: var(--unit-aircraft-vvi-width);
+ width: var(--unit-vvi-width);
}
.unit-hotgroup {
@@ -100,13 +100,13 @@
/*** Fuel indicator ***/
[data-object|="unit"] .unit-fuel {
background: white;
- border: var(--unit-aircraft-fuel-border-width) solid var(--secondary-dark-steel);
+ border: var(--unit-fuel-border-width) solid var(--secondary-dark-steel);
border-radius: var(--border-radius-sm);
display: none;
- height: var(--unit-aircraft-fuel-height);
+ height: var(--unit-fuel-height);
position: absolute;
- translate: var(--unit-aircraft-fuel-x) var(--unit-aircraft-fuel-y);
- width: var(--unit-aircraft-fuel-width);
+ translate: var(--unit-fuel-x) var(--unit-fuel-y);
+ width: var(--unit-fuel-width);
}
[data-object|="unit"] .unit-fuel-level {
@@ -117,19 +117,19 @@
/*** Ammo indicator ***/
[data-object|="unit"] .unit-ammo {
- column-gap: var(--unit-aircraft-ammo-spacing);
+ column-gap: var(--unit-ammo-spacing);
display: none;
height: fit-content;
position: absolute;
- translate: var(--unit-aircraft-ammo-x) var(--unit-aircraft-ammo-y);
+ translate: var(--unit-ammo-x) var(--unit-ammo-y);
width: fit-content;
}
[data-object|="unit"] .unit-ammo>* {
background-color: white;
- border: var(--unit-aircraft-ammo-border-width) solid var(--secondary-dark-steel);
+ border: var(--unit-ammo-border-width) solid var(--secondary-dark-steel);
border-radius: 50%;
- padding: var(--unit-aircraft-ammo-radius);
+ padding: var(--unit-ammo-radius);
}
/*** Unit summary ***/
@@ -150,7 +150,7 @@
1px -1px 0 #000,
-1px 1px 0 #000,
1px 1px 0 #000;
- translate: -60px 0;
+ right: 100%;
width: fit-content;
}
@@ -171,7 +171,7 @@
width: 80px;
}
-[data-object|="unit"] .unit-summary .unit-callsign:hover {
+[data-object|="unit"]:hover .unit-summary .unit-callsign{
direction: rtl;
overflow: visible;
}
@@ -292,24 +292,24 @@
}
/*** Dead unit ***/
-[data-object|="unit-aircraft"][data-is-dead] .unit-selected-spotlight,
-[data-object|="unit-aircraft"][data-is-dead] .unit-short-label,
-[data-object|="unit-aircraft"][data-is-dead] .unit-vvi,
-[data-object|="unit-aircraft"][data-is-dead] .unit-hotgroup,
-[data-object|="unit-aircraft"][data-is-dead] .unit-hotgroup-id,
-[data-object|="unit-aircraft"][data-is-dead] .unit-state,
-[data-object|="unit-aircraft"][data-is-dead] .unit-fuel,
-[data-object|="unit-aircraft"][data-is-dead] .unit-ammo,
-[data-object|="unit-aircraft"][data-is-dead]:hover .unit-fuel,
-[data-object|="unit-aircraft"][data-is-dead]:hover .unit-ammo {
+[data-object|="unit"][data-is-dead] .unit-selected-spotlight,
+[data-object|="unit"][data-is-dead] .unit-short-label,
+[data-object|="unit"][data-is-dead] .unit-vvi,
+[data-object|="unit"][data-is-dead] .unit-hotgroup,
+[data-object|="unit"][data-is-dead] .unit-hotgroup-id,
+[data-object|="unit"][data-is-dead] .unit-state,
+[data-object|="unit"][data-is-dead] .unit-fuel,
+[data-object|="unit"][data-is-dead] .unit-ammo,
+[data-object|="unit"][data-is-dead]:hover .unit-fuel,
+[data-object|="unit"][data-is-dead]:hover .unit-ammo {
display: none;
}
-[data-object|="unit-aircraft"][data-is-dead] .unit-summary>* {
+[data-object|="unit"][data-is-dead] .unit-summary>* {
display: none;
}
-[data-object|="unit-aircraft"][data-is-dead] .unit-summary .unit-callsign {
+[data-object|="unit"][data-is-dead] .unit-summary .unit-callsign {
display: block;
}
diff --git a/client/public/stylesheets/olympus.css b/client/public/stylesheets/olympus.css
index 480d5ab7..f35985db 100644
--- a/client/public/stylesheets/olympus.css
+++ b/client/public/stylesheets/olympus.css
@@ -812,16 +812,16 @@ nav.ol-panel> :last-child {
font-weight: bold;
}
-#connection-status {
+#login-status {
margin-bottom: 5px;
}
-#connection-status[data-status="connecting"]::before {
+#login-status[data-status="connecting"]::before {
animation: blinker 1s linear infinite;
content: "Connecting...";
}
-#connection-status[data-status="failed"]::before {
+#login-status[data-status="failed"]::before {
color: var(--primary-red);
content: "Incorrect username/password!";
}
@@ -865,6 +865,19 @@ nav.ol-panel> :last-child {
translate: 0% -300%;
}
+#visibiliy-mode {
+ font-size: 14px;
+ font-weight: bolder;
+}
+
+#visibiliy-mode[data-mode="Blue commander"] {
+ color: var(--primary-blue);
+}
+
+#visibiliy-mode[data-mode="Red commander"] {
+ color: var(--primary-red);
+}
+
.ol-destination-preview-icon {
background-image: url("/resources/theme/images/markers/move.svg");
height: 52px;
@@ -1182,14 +1195,6 @@ input[type=number]::-webkit-outer-spin-button {
background-color: var(--primary-neutral);
}
-.ol-context-menu>div:nth-child(2) {
- align-items: center;
- display: flex;
- flex-direction: row;
- justify-content: space-between;
- padding-right: 0px;
-}
-
.ol-context-menu>ul {
max-height: 200px;
overflow-x: hidden;
@@ -1205,21 +1210,12 @@ input[type=number]::-webkit-outer-spin-button {
margin: 0px;
}
-.ol-context-menu>div:nth-child(n+3) {
- align-items: center;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- row-gap: 5px;
-}
-
.ol-context-menu .ol-select-container {
align-self: stretch;
flex: 0 0 auto;
width: 100%;
}
-
.ol-contexmenu-button {
border: none;
border-radius: 0px;
diff --git a/client/public/stylesheets/other/contextmenus.css b/client/public/stylesheets/other/contextmenus.css
index 99e8b35c..7e812f74 100644
--- a/client/public/stylesheets/other/contextmenus.css
+++ b/client/public/stylesheets/other/contextmenus.css
@@ -4,15 +4,38 @@
height: fit-content;
position: absolute;
row-gap: 5px;
- width: 280px;
+ width: 300px;
z-index: 9999;
}
-#aircraft-spawn-menu {
- height: fit-content;
+#map-contextmenu>div:nth-child(2) {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ padding-right: 0px;
}
-#ground-unit-spawn-menu {
+#map-contextmenu>div:nth-child(3) {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ padding-right: 0px;
+}
+
+#map-contextmenu>div:nth-child(n+4) {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ row-gap: 5px;
+}
+
+#aircraft-spawn-menu,
+#helicopter-spawn-menu,
+#groundunit-spawn-menu,
+#navyunit-spawn-menu {
height: fit-content;
}
@@ -35,35 +58,28 @@
width: 50px;
}
-#aircraft-spawn-menu .ol-select.is-open .ol-select-options {
+#aircraft-spawn-menu .ol-select.is-open .ol-select-options,
+#helicopter-spawn-menu .ol-select.is-open .ol-select-options {
max-height: 300px;
}
-#aircraft-spawn-menu>button,
-#ground-unit-spawn-menu>button,
-#iads-menu>button {
+.deploy-unit-button {
+ margin-top: 5px;
text-align: center;
width: 100%;
}
-#aircraft-spawn-button {
- background-image: url("/resources/theme/images/buttons/spawn/aircraft.svg");
- background-size: 48px;
+.upper-bar svg>* {
+ fill: white;
}
-#ground-ol-contexmenu-button {
- background-image: url("/resources/theme/images/buttons/spawn/ground.svg");
- background-size: 48px;
+.upper-bar svg {
+ width: 22px;
+ margin: 0px 5px;
}
-#smoke-spawn-button {
- background-image: url("/resources/theme/images/buttons/spawn/smoke.svg");
- background-size: 48px;
-}
-
-#explosion-spawn-button {
- background-image: url("/resources/theme/images/buttons/spawn/explosion.svg");
- background-size: 48px;
+.upper-bar button:nth-child(2) {
+ margin-left: auto;
}
[data-coalition="blue"]#active-coalition-label,
@@ -117,7 +133,8 @@
content: "Create neutral unit";
}
-#loadout-preview {
+#aircraft-loadout-preview,
+#helicopter-loadout-preview {
align-content: space-between;
align-items: center;
column-gap: 20px;
@@ -126,14 +143,16 @@
width: 100%;
}
-#loadout-list {
+#aircaft-loadout-list,
+#helicopter-loadout-list {
align-content: center;
display: flex;
flex-direction: column;
height: 100%;
}
-#unit-image {
+#aircraft-unit-image,
+#helicopter-unit-image {
filter: invert(100%);
height: 100px;
margin-bottom: 10px;
@@ -186,17 +205,28 @@
background-color: orange;
}
-#aircraft-spawn-menu .ol-slider-value {
+.ol-context-menu .ol-slider-value {
color: var(--accent-light-blue);
cursor: pointer;
font-size: 14px;
font-weight: bold;
}
-#aircraft-spawn-altitude-slider {
+.ol-context-menu .ol-slider-container {
padding: 0px 10px;
}
+.contextmenu-options-container {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding-left: 10px;
+}
+
+.contextmenu-options-container>*:nth-child(2) {
+ width: 120px;
+}
+
/* Unit context menu */
#unit-contextmenu {
display: flex;
@@ -350,7 +380,7 @@
height: fit-content;
position: absolute;
row-gap: 5px;
- width: 250px;
+ width: 300px;
z-index: 9999;
}
@@ -360,30 +390,14 @@
width: 50px;
}
-#iads-button {
- background-image: url("/resources/theme/images/buttons/spawn/sam.svg");
- background-size: 48px;
-}
-
-#cap-button {
- background-image: url("/resources/theme/images/buttons/spawn/aircraft.svg");
- background-size: 48px;
-}
-
-#coalitionarea-back-button {
- background-image: url("/resources/theme/images/buttons/other/back.svg");
- background-size: 48px;
-}
-
-#coalitionarea-delete-button {
- background-image: url("/resources/theme/images/buttons/other/delete.svg");
- background-size: 48px;
-}
-
#coalition-area-contextmenu .ol-checkbox {
align-self: flex-start;
}
+#coalition-units-checkbox {
+ padding: 10px 10px;
+}
+
#iads-menu .ol-select-options>* {
padding-top: 8px;
padding-bottom: 8px;
@@ -404,3 +418,25 @@
#iads-menu {
row-gap: 10px;
}
+
+#coalition-area-contextmenu>div:nth-child(2) {
+ align-items: center;
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ padding-right: 0px;
+}
+
+#coalition-area-contextmenu>div:nth-child(n+3) {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ row-gap: 5px;
+}
+
+.create-iads-button {
+ margin-top: 5px;
+ text-align: center;
+ width: 100%;
+}
\ No newline at end of file
diff --git a/client/public/themes/olympus/images/buttons/other/back.svg b/client/public/themes/olympus/images/buttons/other/back.svg
index 52c98f94..0b86d7f1 100644
--- a/client/public/themes/olympus/images/buttons/other/back.svg
+++ b/client/public/themes/olympus/images/buttons/other/back.svg
@@ -23,9 +23,9 @@
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
- inkscape:zoom="26.15625"
- inkscape:cx="20.587814"
- inkscape:cy="20.109916"
+ inkscape:zoom="13.078125"
+ inkscape:cx="19.918757"
+ inkscape:cy="17.663082"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1912"
@@ -34,8 +34,8 @@
inkscape:current-layer="svg4" />
diff --git a/client/public/themes/olympus/images/buttons/other/delete.svg b/client/public/themes/olympus/images/buttons/other/delete.svg
index c290353d..68a91a1a 100644
--- a/client/public/themes/olympus/images/buttons/other/delete.svg
+++ b/client/public/themes/olympus/images/buttons/other/delete.svg
@@ -24,8 +24,8 @@
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="13.078125"
- inkscape:cx="27.794504"
- inkscape:cy="19.192354"
+ inkscape:cx="27.870968"
+ inkscape:cy="20.415771"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1912"
@@ -34,7 +34,7 @@
inkscape:current-layer="svg1940" />
+ style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0589579;stroke-opacity:1" />
diff --git a/client/public/themes/olympus/images/buttons/other/edit.svg b/client/public/themes/olympus/images/buttons/other/edit.svg
new file mode 100644
index 00000000..a690992f
--- /dev/null
+++ b/client/public/themes/olympus/images/buttons/other/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/client/public/themes/olympus/images/buttons/spawn/aircraft.svg b/client/public/themes/olympus/images/buttons/spawn/aircraft.svg
index beb45a25..50b02231 100644
--- a/client/public/themes/olympus/images/buttons/spawn/aircraft.svg
+++ b/client/public/themes/olympus/images/buttons/spawn/aircraft.svg
@@ -1,20 +1,19 @@
diff --git a/client/public/themes/olympus/images/buttons/spawn/explosion.svg b/client/public/themes/olympus/images/buttons/spawn/explosion.svg
index 192784b0..b3803f61 100644
--- a/client/public/themes/olympus/images/buttons/spawn/explosion.svg
+++ b/client/public/themes/olympus/images/buttons/spawn/explosion.svg
@@ -24,7 +24,7 @@
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="13.078125"
- inkscape:cx="19.53644"
+ inkscape:cx="18.389486"
inkscape:cy="12.157706"
inkscape:window-width="1920"
inkscape:window-height="1017"
@@ -34,9 +34,9 @@
inkscape:current-layer="svg4" />
+ style="fill-opacity:1;stroke-width:0.0537019" />
diff --git a/client/public/themes/olympus/images/buttons/spawn/ground.svg b/client/public/themes/olympus/images/buttons/spawn/ground.svg
deleted file mode 100644
index f0d8bf1c..00000000
--- a/client/public/themes/olympus/images/buttons/spawn/ground.svg
+++ /dev/null
@@ -1,83 +0,0 @@
-
-
diff --git a/client/public/themes/olympus/images/buttons/spawn/groundunit.svg b/client/public/themes/olympus/images/buttons/spawn/groundunit.svg
new file mode 100644
index 00000000..28c22079
--- /dev/null
+++ b/client/public/themes/olympus/images/buttons/spawn/groundunit.svg
@@ -0,0 +1,89 @@
+
+
diff --git a/client/public/themes/olympus/images/buttons/spawn/helicopter.svg b/client/public/themes/olympus/images/buttons/spawn/helicopter.svg
new file mode 100644
index 00000000..585c9678
--- /dev/null
+++ b/client/public/themes/olympus/images/buttons/spawn/helicopter.svg
@@ -0,0 +1,59 @@
+
+
diff --git a/client/public/themes/olympus/images/buttons/spawn/more.svg b/client/public/themes/olympus/images/buttons/spawn/more.svg
new file mode 100644
index 00000000..abeb13eb
--- /dev/null
+++ b/client/public/themes/olympus/images/buttons/spawn/more.svg
@@ -0,0 +1,70 @@
+
+
diff --git a/client/public/themes/olympus/images/buttons/spawn/navyunit.svg b/client/public/themes/olympus/images/buttons/spawn/navyunit.svg
new file mode 100644
index 00000000..b5d83ba2
--- /dev/null
+++ b/client/public/themes/olympus/images/buttons/spawn/navyunit.svg
@@ -0,0 +1,59 @@
+
+
diff --git a/client/public/themes/olympus/images/buttons/spawn/sam.svg b/client/public/themes/olympus/images/buttons/spawn/sam.svg
index 0109de6b..bf91d6f5 100644
--- a/client/public/themes/olympus/images/buttons/spawn/sam.svg
+++ b/client/public/themes/olympus/images/buttons/spawn/sam.svg
@@ -1,9 +1,7 @@
-