diff --git a/changelog.md b/changelog.md
index cc88f99a..50252a96 100644
--- a/changelog.md
+++ b/changelog.md
@@ -10,6 +10,7 @@ Saves from 2.5 are not compatible with 3.0.
* **[Campaign AI]** Every 30 minutes the AI will plan a CAP, so players can customize their mission better.
* **[Campaign AI]** AI now considers Ju-88s for CAS, strike, and DEAD missions.
* **[Campaign AI]** Fix purchase of aircraft by priority (the faction's list was being used as the priority list rather than the game's).
+* **[Flight Planner]** AI strike flight plans now include the correct target actions for building groups.
* **[UI]** Added new web based map UI. This is mostly functional but many of the old display options are a WIP. Revert to the old map with --old-map.
* **[UI]** Campaigns generated for an older or newer version of the game will now be marked as incompatible. They can still be played, but bugs may be present.
* **[UI]** DCS loadouts are now selectable in the loadout setup menu.
diff --git a/game/data/alic.py b/game/data/alic.py
new file mode 100644
index 00000000..de99075c
--- /dev/null
+++ b/game/data/alic.py
@@ -0,0 +1,40 @@
+from dcs.unit import Unit
+from dcs.vehicles import AirDefence
+
+
+class AlicCodes:
+ CODES = {
+ AirDefence.EWR_1L13.id: 101,
+ AirDefence.EWR_55G6.id: 102,
+ AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR.id: 103,
+ AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR.id: 104,
+ AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR.id: 107,
+ AirDefence.SAM_SA_6_Kub_Long_Track_STR.id: 108,
+ AirDefence.MCC_SR_Sborka_Dog_Ear_SR.id: 109,
+ AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR.id: 110,
+ AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL.id: 115,
+ AirDefence.SAM_SA_8_Osa_Gecko_TEL.id: 117,
+ AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL.id: 118,
+ AirDefence.SAM_SA_15_Tor_Gauntlet.id: 119,
+ AirDefence.SAM_SA_19_Tunguska_Grison.id: 120,
+ AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish.id: 121,
+ AirDefence.SAM_P19_Flat_Face_SR__SA_2_3.id: 122,
+ AirDefence.SAM_SA_3_S_125_Low_Blow_TR.id: 123,
+ AirDefence.SAM_Rapier_Blindfire_TR.id: 124,
+ AirDefence.SAM_Rapier_LN.id: 125,
+ AirDefence.SAM_SA_2_S_75_Fan_Song_TR.id: 126,
+ AirDefence.HQ_7_Self_Propelled_LN.id: 127,
+ AirDefence.HQ_7_Self_Propelled_STR.id: 128,
+ AirDefence.SAM_Roland_ADS.id: 201,
+ AirDefence.SAM_Patriot_STR.id: 202,
+ AirDefence.SAM_Hawk_SR__AN_MPQ_50.id: 203,
+ AirDefence.SAM_Hawk_TR__AN_MPQ_46.id: 204,
+ AirDefence.SAM_Roland_EWR.id: 205,
+ AirDefence.SAM_Hawk_CWAR_AN_MPQ_55.id: 206,
+ AirDefence.SPAAA_Gepard.id: 207,
+ AirDefence.SPAAA_Vulcan_M163.id: 208,
+ }
+
+ @classmethod
+ def code_for(cls, unit: Unit) -> int:
+ return cls.CODES[unit.type]
diff --git a/game/data/weapons.py b/game/data/weapons.py
index 38133fe0..9b6d8e0c 100644
--- a/game/data/weapons.py
+++ b/game/data/weapons.py
@@ -85,7 +85,7 @@ class Pylon:
def equip(self, group: FlyingGroup, weapon: Weapon) -> None:
if not self.can_equip(weapon):
- raise ValueError(f"Pylon {self.number} cannot equip {weapon.name}")
+ logging.error(f"Pylon {self.number} cannot equip {weapon.name}")
group.load_pylon(self.make_pydcs_assignment(weapon), self.number)
def make_pydcs_assignment(self, weapon: Weapon) -> PydcsWeaponAssignment:
diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py
index 414d18b6..f2e96a88 100644
--- a/game/theater/controlpoint.py
+++ b/game/theater/controlpoint.py
@@ -1,5 +1,4 @@
from __future__ import annotations
-from game.scenery_group import SceneryGroup
import heapq
import itertools
@@ -9,7 +8,7 @@ from abc import ABC, abstractmethod
from dataclasses import dataclass, field
from enum import Enum
from functools import total_ordering
-from typing import Any, Dict, Iterator, List, Optional, Set, TYPE_CHECKING, Type
+from typing import Any, Dict, Iterator, List, Optional, Set, TYPE_CHECKING, Type, Union
from dcs.mapping import Point
from dcs.ships import (
@@ -19,10 +18,12 @@ from dcs.ships import (
Type_071_Amphibious_Transport_Dock,
)
from dcs.terrain.terrain import Airport, ParkingSlot
+from dcs.unit import Unit
from dcs.unittype import FlyingType
from game import db
from game.point_with_heading import PointWithHeading
+from game.scenery_group import SceneryGroup
from gen.flights.closestairfields import ObjectiveDistanceCache
from gen.ground_forces.ai_ground_planner_db import TYPE_SHORAD
from gen.ground_forces.combat_stance import CombatStance
@@ -781,6 +782,10 @@ class ControlPoint(MissionTarget, ABC):
return self.captured != other.captured
+ @property
+ def strike_targets(self) -> List[Union[MissionTarget, Unit]]:
+ return []
+
class Airfield(ControlPoint):
def __init__(
diff --git a/game/theater/missiontarget.py b/game/theater/missiontarget.py
index 9a5fe8cd..8d026625 100644
--- a/game/theater/missiontarget.py
+++ b/game/theater/missiontarget.py
@@ -1,8 +1,9 @@
from __future__ import annotations
-from typing import Iterator, TYPE_CHECKING
+from typing import Iterator, TYPE_CHECKING, List, Union
from dcs.mapping import Point
+from dcs.unit import Unit
if TYPE_CHECKING:
from gen.flights.flight import FlightType
@@ -42,3 +43,7 @@ class MissionTarget:
# TODO: FlightType.EWAR,
# TODO: FlightType.RECON,
]
+
+ @property
+ def strike_targets(self) -> List[Union[MissionTarget, Unit]]:
+ raise NotImplementedError
diff --git a/game/theater/theatergroundobject.py b/game/theater/theatergroundobject.py
index f768992d..18131a42 100644
--- a/game/theater/theatergroundobject.py
+++ b/game/theater/theatergroundobject.py
@@ -2,7 +2,7 @@ from __future__ import annotations
import itertools
import logging
-from typing import Iterator, List, TYPE_CHECKING
+from typing import Iterator, List, TYPE_CHECKING, Union
from dcs.mapping import Point
from dcs.triggers import TriggerZone
@@ -185,6 +185,10 @@ class TheaterGroundObject(MissionTarget):
"""True if this TGO is the group for the control point itself (CVs and FOBs)."""
return False
+ @property
+ def strike_targets(self) -> List[Union[MissionTarget, Unit]]:
+ return self.units
+
class BuildingGroundObject(TheaterGroundObject):
def __init__(
@@ -233,6 +237,15 @@ class BuildingGroundObject(TheaterGroundObject):
def kill(self) -> None:
self._dead = True
+ def iter_building_group(self) -> Iterator[TheaterGroundObject]:
+ for tgo in self.control_point.ground_objects:
+ if tgo.obj_name == self.obj_name and not tgo.is_dead:
+ yield tgo
+
+ @property
+ def strike_targets(self) -> List[Union[MissionTarget, Unit]]:
+ return list(self.iter_building_group())
+
class SceneryGroundObject(BuildingGroundObject):
def __init__(
diff --git a/gen/aircraft.py b/gen/aircraft.py
index 63e9ca1d..92cead03 100644
--- a/gen/aircraft.py
+++ b/gen/aircraft.py
@@ -5,7 +5,7 @@ import random
from dataclasses import dataclass
from datetime import timedelta
from functools import cached_property
-from typing import Dict, List, Optional, TYPE_CHECKING, Type, Union
+from typing import Dict, List, Optional, TYPE_CHECKING, Type, Union, Iterable
from dcs import helicopters
from dcs.action import AITaskPush, ActivateGroup
@@ -70,6 +70,7 @@ from dcs.task import (
)
from dcs.terrain.terrain import Airport, NoParkingSlotError
from dcs.triggers import Event, TriggerOnce, TriggerRule
+from dcs.unit import Unit
from dcs.unitgroup import FlyingGroup, ShipGroup, StaticGroup
from dcs.unittype import FlyingType, UnitType
@@ -85,6 +86,7 @@ from game.theater.controlpoint import (
NavalControlPoint,
OffMapSpawn,
)
+from game.theater.missiontarget import MissionTarget
from game.theater.theatergroundobject import TheaterGroundObject
from game.transfers import MultiGroupTransport
from game.unitmap import UnitMap
@@ -1629,7 +1631,9 @@ class PydcsWaypointBuilder:
else:
return False
- def register_special_waypoints(self, targets) -> None:
+ def register_special_waypoints(
+ self, targets: Iterable[Union[MissionTarget, Unit]]
+ ) -> None:
"""Create special target waypoints for various aircraft"""
for i, t in enumerate(targets):
if self.group.units[0].unit_type == JF_17 and i < 4:
@@ -1850,29 +1854,16 @@ class StrikeIngressBuilder(PydcsWaypointBuilder):
def build_strike(self) -> MovingPoint:
waypoint = super().build()
for target in self.waypoint.targets:
+ bombing = Bombing(target.position)
+ # If there is only one target, drop all ordnance in one pass.
+ if len(self.waypoint.targets) == 1:
+ bombing.params["expend"] = "All"
+ bombing.params["weaponType"] = WeaponType.Auto.value
+ bombing.params["groupAttack"] = True
+ waypoint.tasks.append(bombing)
- targets = [target]
- # If the target type is a group of units,
- # then target each unit in the group with a Bombing task on their position
- # (It is not perfect, we should have an engage Group task instead,
- # but we don't have the group ref in the model there)
- # TODO : for building group, engage all the buildings as well
- if isinstance(target, TheaterGroundObject):
- if len(target.units) > 0:
- targets = target.units
-
- for t in targets:
- bombing = Bombing(t.position)
- # If there is only one target, drop all ordnance in one pass
- if len(self.waypoint.targets) == 1 and len(targets) == 1:
- bombing.params["expend"] = "All"
- bombing.params["weaponType"] = WeaponType.Auto.value
- bombing.params["groupAttack"] = True
- waypoint.tasks.append(bombing)
- print(bombing)
-
- # Register special waypoints
- self.register_special_waypoints(targets)
+ # Register special waypoints
+ self.register_special_waypoints(self.waypoint.targets)
return waypoint
diff --git a/gen/flights/flight.py b/gen/flights/flight.py
index 1e3c4d4d..397399ed 100644
--- a/gen/flights/flight.py
+++ b/gen/flights/flight.py
@@ -2,10 +2,11 @@ from __future__ import annotations
from datetime import timedelta
from enum import Enum
-from typing import List, Optional, TYPE_CHECKING, Type
+from typing import List, Optional, TYPE_CHECKING, Type, Union
from dcs.mapping import Point
from dcs.point import MovingPoint, PointAction
+from dcs.unit import Unit
from dcs.unittype import FlyingType
from game import db
@@ -107,7 +108,7 @@ class FlightWaypoint:
# Only used in the waypoint list in the flight edit page. No sense
# having three names. A short and long form is enough.
self.description = ""
- self.targets: List[MissionTarget] = []
+ self.targets: List[Union[MissionTarget, Unit]] = []
self.obj_name = ""
self.pretty_name = ""
self.only_for_player = False
diff --git a/gen/flights/waypointbuilder.py b/gen/flights/waypointbuilder.py
index d125ac9e..ffb1e6ab 100644
--- a/gen/flights/waypointbuilder.py
+++ b/gen/flights/waypointbuilder.py
@@ -202,8 +202,7 @@ class WaypointBuilder:
waypoint.pretty_name = "INGRESS on " + objective.name
waypoint.description = "INGRESS on " + objective.name
waypoint.name = "INGRESS"
- # TODO: This seems wrong, but it's what was there before.
- waypoint.targets.append(objective)
+ waypoint.targets = objective.strike_targets
return waypoint
def egress(self, position: Point, target: MissionTarget) -> FlightWaypoint:
diff --git a/gen/kneeboard.py b/gen/kneeboard.py
index d1de5456..c0035b06 100644
--- a/gen/kneeboard.py
+++ b/gen/kneeboard.py
@@ -26,23 +26,25 @@ import datetime
from collections import defaultdict
from dataclasses import dataclass
from pathlib import Path
-from typing import Dict, List, Optional, TYPE_CHECKING, Tuple
+from typing import Dict, List, Optional, TYPE_CHECKING, Tuple, Iterator
from PIL import Image, ImageDraw, ImageFont
from dcs.mission import Mission
+from dcs.unit import Unit
from dcs.unittype import FlyingType
from tabulate import tabulate
-from game.theater import ConflictTheater
+from game.data.alic import AlicCodes
+from game.db import find_unittype, unit_type_from_name
+from game.theater import ConflictTheater, TheaterGroundObject, LatLon
from game.utils import meters
from .aircraft import AIRCRAFT_DATA, FlightData
from .airsupportgen import AwacsInfo, TankerInfo
from .briefinggen import CommInfo, JtacInfo, MissionInfoGenerator
-from .flights.flight import FlightWaypoint, FlightWaypointType
+from .flights.flight import FlightWaypoint, FlightWaypointType, FlightType
from .radios import RadioFrequency
from .runways import RunwayData
-
if TYPE_CHECKING:
from game import Game
@@ -138,6 +140,11 @@ class KneeboardPage:
"""Writes the kneeboard page to the given path."""
raise NotImplementedError
+ def format_ll(self, ll: LatLon) -> str:
+ ns = "N" if ll.latitude >= 0 else "S"
+ ew = "E" if ll.longitude >= 0 else "W"
+ return f"{ll.latitude:.4}°{ns} {ll.longitude:.4}°{ew}"
+
@dataclass(frozen=True)
class NumberedWaypoint:
@@ -415,39 +422,88 @@ class BriefingPage(KneeboardPage):
return local_time.strftime(f"%H:%M:%S")
-class TargetInfoPage(KneeboardPage):
- """A kneeboard page containing target information."""
+class SeadTaskPage(KneeboardPage):
+ """A kneeboard page containing SEAD/DEAD target information."""
def __init__(
- self,
- flight: FlightData,
- targets: List[FlightWaypoint],
- dark_kneeboard: bool,
- theater: ConflictTheater,
+ self, flight: FlightData, dark_kneeboard: bool, theater: ConflictTheater
) -> None:
self.flight = flight
- self.targets = targets
self.dark_kneeboard = dark_kneeboard
self.theater = theater
+ @property
+ def target_units(self) -> Iterator[Unit]:
+ if isinstance(self.flight.package.target, TheaterGroundObject):
+ yield from self.flight.package.target.units
+
+ @staticmethod
+ def alic_for(unit: Unit) -> str:
+ try:
+ return str(AlicCodes.code_for(unit))
+ except KeyError:
+ return ""
+
def write(self, path: Path) -> None:
writer = KneeboardPageWriter(dark_theme=self.dark_kneeboard)
if self.flight.custom_name is not None:
custom_name_title = ' ("{}")'.format(self.flight.custom_name)
else:
custom_name_title = ""
- writer.title(f"{self.flight.callsign} Target Info{custom_name_title}")
+ task = "DEAD" if self.flight.flight_type == FlightType.DEAD else "SEAD"
+ writer.title(f"{self.flight.callsign} {task} Target Info{custom_name_title}")
writer.table(
- [self.target_info_row(t) for t in self.targets],
- headers=["Description", "Location"],
+ [self.target_info_row(t) for t in self.target_units],
+ headers=["Description", "ALIC", "Location"],
)
writer.write(path)
- def target_info_row(self, target: FlightWaypoint) -> List[str]:
- ll = self.theater.point_to_ll(target.position)
- return [target.pretty_name, f"{ll.latitude} {ll.longitude}"]
+ def target_info_row(self, unit: Unit) -> List[str]:
+ ll = self.theater.point_to_ll(unit.position)
+ unit_type = unit_type_from_name(unit.type)
+ name = unit.name if unit_type is None else unit_type.name
+ return [name, self.alic_for(unit), self.format_ll(ll)]
+
+
+class StrikeTaskPage(KneeboardPage):
+ """A kneeboard page containing strike target information."""
+
+ def __init__(
+ self,
+ flight: FlightData,
+ dark_kneeboard: bool,
+ theater: ConflictTheater,
+ ) -> None:
+ self.flight = flight
+ self.dark_kneeboard = dark_kneeboard
+ self.theater = theater
+
+ @property
+ def targets(self) -> Iterator[NumberedWaypoint]:
+ for idx, waypoint in enumerate(self.flight.waypoints):
+ if waypoint.waypoint_type == FlightWaypointType.TARGET_POINT:
+ yield NumberedWaypoint(idx, waypoint)
+
+ def write(self, path: Path) -> None:
+ writer = KneeboardPageWriter(dark_theme=self.dark_kneeboard)
+ if self.flight.custom_name is not None:
+ custom_name_title = ' ("{}")'.format(self.flight.custom_name)
+ else:
+ custom_name_title = ""
+ writer.title(f"{self.flight.callsign} Strike Task Info{custom_name_title}")
+
+ writer.table(
+ [self.target_info_row(t) for t in self.targets],
+ headers=["Steerpoint", "Description", "Location"],
+ )
+
+ writer.write(path)
+
+ def target_info_row(self, target: NumberedWaypoint) -> List[str]:
+ ll = self.theater.point_to_ll(target.waypoint.position)
+ return [str(target.number), target.waypoint.pretty_name, self.format_ll(ll)]
class KneeboardGenerator(MissionInfoGenerator):
@@ -491,17 +547,12 @@ class KneeboardGenerator(MissionInfoGenerator):
)
return all_flights
- def generate_target_page(self, flight: FlightData) -> Optional[KneeboardPage]:
- target_waypoints = [
- w
- for w in flight.waypoints
- if w.waypoint_type == FlightWaypointType.TARGET_GROUP_LOC
- ]
- if not target_waypoints:
- return None
- return TargetInfoPage(
- flight, target_waypoints, self.dark_kneeboard, self.game.theater
- )
+ def generate_task_page(self, flight: FlightData) -> Optional[KneeboardPage]:
+ if flight.flight_type in (FlightType.DEAD, FlightType.SEAD):
+ return SeadTaskPage(flight, self.dark_kneeboard, self.game.theater)
+ elif flight.flight_type is FlightType.STRIKE:
+ return StrikeTaskPage(flight, self.dark_kneeboard, self.game.theater)
+ return None
def generate_flight_kneeboard(self, flight: FlightData) -> List[KneeboardPage]:
"""Returns a list of kneeboard pages for the given flight."""
@@ -517,7 +568,7 @@ class KneeboardGenerator(MissionInfoGenerator):
),
]
- if (target_page := self.generate_target_page(flight)) is not None:
+ if (target_page := self.generate_task_page(flight)) is not None:
pages.append(target_page)
return pages
diff --git a/resources/ui/ground_assets/aa_blue_alive.svg b/resources/ui/ground_assets/aa_blue_alive.svg
new file mode 100644
index 00000000..d6af6e07
--- /dev/null
+++ b/resources/ui/ground_assets/aa_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/aa_blue_damaged.svg b/resources/ui/ground_assets/aa_blue_damaged.svg
new file mode 100644
index 00000000..c098893b
--- /dev/null
+++ b/resources/ui/ground_assets/aa_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/aa_blue_destroyed.svg b/resources/ui/ground_assets/aa_blue_destroyed.svg
new file mode 100644
index 00000000..ed5960aa
--- /dev/null
+++ b/resources/ui/ground_assets/aa_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/aa_red_alive.svg b/resources/ui/ground_assets/aa_red_alive.svg
new file mode 100644
index 00000000..3375cf66
--- /dev/null
+++ b/resources/ui/ground_assets/aa_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/aa_red_damaged.svg b/resources/ui/ground_assets/aa_red_damaged.svg
new file mode 100644
index 00000000..7e56fd59
--- /dev/null
+++ b/resources/ui/ground_assets/aa_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/aa_red_destroyed.svg b/resources/ui/ground_assets/aa_red_destroyed.svg
new file mode 100644
index 00000000..b861fc4f
--- /dev/null
+++ b/resources/ui/ground_assets/aa_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/allycamp_blue_alive.svg b/resources/ui/ground_assets/allycamp_blue_alive.svg
new file mode 100644
index 00000000..fdcb4754
--- /dev/null
+++ b/resources/ui/ground_assets/allycamp_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/allycamp_blue_damaged.svg b/resources/ui/ground_assets/allycamp_blue_damaged.svg
new file mode 100644
index 00000000..e37e3eab
--- /dev/null
+++ b/resources/ui/ground_assets/allycamp_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/allycamp_blue_destroyed.svg b/resources/ui/ground_assets/allycamp_blue_destroyed.svg
new file mode 100644
index 00000000..4f58f9c0
--- /dev/null
+++ b/resources/ui/ground_assets/allycamp_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/allycamp_red_alive.svg b/resources/ui/ground_assets/allycamp_red_alive.svg
new file mode 100644
index 00000000..4c3338fc
--- /dev/null
+++ b/resources/ui/ground_assets/allycamp_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/allycamp_red_damaged.svg b/resources/ui/ground_assets/allycamp_red_damaged.svg
new file mode 100644
index 00000000..ce234ce9
--- /dev/null
+++ b/resources/ui/ground_assets/allycamp_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/allycamp_red_destroyed.svg b/resources/ui/ground_assets/allycamp_red_destroyed.svg
new file mode 100644
index 00000000..640ff25d
--- /dev/null
+++ b/resources/ui/ground_assets/allycamp_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ammo_blue_alive.svg b/resources/ui/ground_assets/ammo_blue_alive.svg
new file mode 100644
index 00000000..e100dd64
--- /dev/null
+++ b/resources/ui/ground_assets/ammo_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ammo_blue_damaged.svg b/resources/ui/ground_assets/ammo_blue_damaged.svg
new file mode 100644
index 00000000..39f2f524
--- /dev/null
+++ b/resources/ui/ground_assets/ammo_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ammo_blue_destroyed.svg b/resources/ui/ground_assets/ammo_blue_destroyed.svg
new file mode 100644
index 00000000..56e7b193
--- /dev/null
+++ b/resources/ui/ground_assets/ammo_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ammo_red_alive.svg b/resources/ui/ground_assets/ammo_red_alive.svg
new file mode 100644
index 00000000..6672db0d
--- /dev/null
+++ b/resources/ui/ground_assets/ammo_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ammo_red_damaged.svg b/resources/ui/ground_assets/ammo_red_damaged.svg
new file mode 100644
index 00000000..ec899cba
--- /dev/null
+++ b/resources/ui/ground_assets/ammo_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ammo_red_destroyed.svg b/resources/ui/ground_assets/ammo_red_destroyed.svg
new file mode 100644
index 00000000..5a5f0e92
--- /dev/null
+++ b/resources/ui/ground_assets/ammo_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/armor_blue_alive.svg b/resources/ui/ground_assets/armor_blue_alive.svg
new file mode 100644
index 00000000..e8127d8a
--- /dev/null
+++ b/resources/ui/ground_assets/armor_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/armor_blue_damaged.svg b/resources/ui/ground_assets/armor_blue_damaged.svg
new file mode 100644
index 00000000..22b2b5df
--- /dev/null
+++ b/resources/ui/ground_assets/armor_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/armor_blue_destroyed.svg b/resources/ui/ground_assets/armor_blue_destroyed.svg
new file mode 100644
index 00000000..a9390423
--- /dev/null
+++ b/resources/ui/ground_assets/armor_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/armor_red_alive.svg b/resources/ui/ground_assets/armor_red_alive.svg
new file mode 100644
index 00000000..60f41ca0
--- /dev/null
+++ b/resources/ui/ground_assets/armor_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/armor_red_damaged.svg b/resources/ui/ground_assets/armor_red_damaged.svg
new file mode 100644
index 00000000..a02c58ef
--- /dev/null
+++ b/resources/ui/ground_assets/armor_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/armor_red_destroyed.svg b/resources/ui/ground_assets/armor_red_destroyed.svg
new file mode 100644
index 00000000..73272413
--- /dev/null
+++ b/resources/ui/ground_assets/armor_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/coastal_blue_alive.svg b/resources/ui/ground_assets/coastal_blue_alive.svg
new file mode 100644
index 00000000..c978973c
--- /dev/null
+++ b/resources/ui/ground_assets/coastal_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/coastal_blue_damaged.svg b/resources/ui/ground_assets/coastal_blue_damaged.svg
new file mode 100644
index 00000000..275bfb74
--- /dev/null
+++ b/resources/ui/ground_assets/coastal_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/coastal_blue_destroyed.svg b/resources/ui/ground_assets/coastal_blue_destroyed.svg
new file mode 100644
index 00000000..a5b66ea1
--- /dev/null
+++ b/resources/ui/ground_assets/coastal_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/coastal_red_alive.svg b/resources/ui/ground_assets/coastal_red_alive.svg
new file mode 100644
index 00000000..80ffd3e8
--- /dev/null
+++ b/resources/ui/ground_assets/coastal_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/coastal_red_damaged.svg b/resources/ui/ground_assets/coastal_red_damaged.svg
new file mode 100644
index 00000000..72146d2f
--- /dev/null
+++ b/resources/ui/ground_assets/coastal_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/coastal_red_destroyed.svg b/resources/ui/ground_assets/coastal_red_destroyed.svg
new file mode 100644
index 00000000..bf6f2cd5
--- /dev/null
+++ b/resources/ui/ground_assets/coastal_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/comms_blue_alive.svg b/resources/ui/ground_assets/comms_blue_alive.svg
new file mode 100644
index 00000000..8492da13
--- /dev/null
+++ b/resources/ui/ground_assets/comms_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/comms_blue_damaged.svg b/resources/ui/ground_assets/comms_blue_damaged.svg
new file mode 100644
index 00000000..c2a82bc8
--- /dev/null
+++ b/resources/ui/ground_assets/comms_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/comms_blue_destroyed.svg b/resources/ui/ground_assets/comms_blue_destroyed.svg
new file mode 100644
index 00000000..7180db20
--- /dev/null
+++ b/resources/ui/ground_assets/comms_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/comms_red_alive.svg b/resources/ui/ground_assets/comms_red_alive.svg
new file mode 100644
index 00000000..48dec8e2
--- /dev/null
+++ b/resources/ui/ground_assets/comms_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/comms_red_damaged.svg b/resources/ui/ground_assets/comms_red_damaged.svg
new file mode 100644
index 00000000..8040ea4a
--- /dev/null
+++ b/resources/ui/ground_assets/comms_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/comms_red_destroyed.svg b/resources/ui/ground_assets/comms_red_destroyed.svg
new file mode 100644
index 00000000..8ed19b3f
--- /dev/null
+++ b/resources/ui/ground_assets/comms_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/derrick_blue_alive.svg b/resources/ui/ground_assets/derrick_blue_alive.svg
new file mode 100644
index 00000000..088202c3
--- /dev/null
+++ b/resources/ui/ground_assets/derrick_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/derrick_blue_damaged.svg b/resources/ui/ground_assets/derrick_blue_damaged.svg
new file mode 100644
index 00000000..da58acec
--- /dev/null
+++ b/resources/ui/ground_assets/derrick_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/derrick_blue_destroyed .svg b/resources/ui/ground_assets/derrick_blue_destroyed .svg
new file mode 100644
index 00000000..139ea116
--- /dev/null
+++ b/resources/ui/ground_assets/derrick_blue_destroyed .svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/derrick_red_alive.svg b/resources/ui/ground_assets/derrick_red_alive.svg
new file mode 100644
index 00000000..7a103a23
--- /dev/null
+++ b/resources/ui/ground_assets/derrick_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/derrick_red_damaged.svg b/resources/ui/ground_assets/derrick_red_damaged.svg
new file mode 100644
index 00000000..f6859a06
--- /dev/null
+++ b/resources/ui/ground_assets/derrick_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/derrick_red_destroyed.svg b/resources/ui/ground_assets/derrick_red_destroyed.svg
new file mode 100644
index 00000000..2ba91be4
--- /dev/null
+++ b/resources/ui/ground_assets/derrick_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ewr_blue_alive.svg b/resources/ui/ground_assets/ewr_blue_alive.svg
new file mode 100644
index 00000000..1ffa8d5b
--- /dev/null
+++ b/resources/ui/ground_assets/ewr_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ewr_blue_damaged.svg b/resources/ui/ground_assets/ewr_blue_damaged.svg
new file mode 100644
index 00000000..99792494
--- /dev/null
+++ b/resources/ui/ground_assets/ewr_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ewr_blue_destroyed.svg b/resources/ui/ground_assets/ewr_blue_destroyed.svg
new file mode 100644
index 00000000..81b1872a
--- /dev/null
+++ b/resources/ui/ground_assets/ewr_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ewr_red_alive.svg b/resources/ui/ground_assets/ewr_red_alive.svg
new file mode 100644
index 00000000..2447a2fe
--- /dev/null
+++ b/resources/ui/ground_assets/ewr_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ewr_red_damaged.svg b/resources/ui/ground_assets/ewr_red_damaged.svg
new file mode 100644
index 00000000..4872e6ca
--- /dev/null
+++ b/resources/ui/ground_assets/ewr_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ewr_red_destroyed.svg b/resources/ui/ground_assets/ewr_red_destroyed.svg
new file mode 100644
index 00000000..b783ce70
--- /dev/null
+++ b/resources/ui/ground_assets/ewr_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/factory_blue_alive.svg b/resources/ui/ground_assets/factory_blue_alive.svg
new file mode 100644
index 00000000..b89968bd
--- /dev/null
+++ b/resources/ui/ground_assets/factory_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/factory_blue_damaged.svg b/resources/ui/ground_assets/factory_blue_damaged.svg
new file mode 100644
index 00000000..d21c47aa
--- /dev/null
+++ b/resources/ui/ground_assets/factory_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/factory_blue_destroyed.svg b/resources/ui/ground_assets/factory_blue_destroyed.svg
new file mode 100644
index 00000000..2933295b
--- /dev/null
+++ b/resources/ui/ground_assets/factory_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/factory_red_alive.svg b/resources/ui/ground_assets/factory_red_alive.svg
new file mode 100644
index 00000000..d8aaf876
--- /dev/null
+++ b/resources/ui/ground_assets/factory_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/factory_red_damaged.svg b/resources/ui/ground_assets/factory_red_damaged.svg
new file mode 100644
index 00000000..d71c65cd
--- /dev/null
+++ b/resources/ui/ground_assets/factory_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/factory_red_destroyed.svg b/resources/ui/ground_assets/factory_red_destroyed.svg
new file mode 100644
index 00000000..4354ee70
--- /dev/null
+++ b/resources/ui/ground_assets/factory_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/farp_blue_alive.svg b/resources/ui/ground_assets/farp_blue_alive.svg
new file mode 100644
index 00000000..1c76cbbe
--- /dev/null
+++ b/resources/ui/ground_assets/farp_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/farp_blue_damaged.svg b/resources/ui/ground_assets/farp_blue_damaged.svg
new file mode 100644
index 00000000..2eaec315
--- /dev/null
+++ b/resources/ui/ground_assets/farp_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/farp_blue_destroyed.svg b/resources/ui/ground_assets/farp_blue_destroyed.svg
new file mode 100644
index 00000000..f6af1443
--- /dev/null
+++ b/resources/ui/ground_assets/farp_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/farp_red_alive.svg b/resources/ui/ground_assets/farp_red_alive.svg
new file mode 100644
index 00000000..bfa7662c
--- /dev/null
+++ b/resources/ui/ground_assets/farp_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/farp_red_damaged.svg b/resources/ui/ground_assets/farp_red_damaged.svg
new file mode 100644
index 00000000..3da498bd
--- /dev/null
+++ b/resources/ui/ground_assets/farp_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/farp_red_destroyed.svg b/resources/ui/ground_assets/farp_red_destroyed.svg
new file mode 100644
index 00000000..697ae951
--- /dev/null
+++ b/resources/ui/ground_assets/farp_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fob_blue_alive.svg b/resources/ui/ground_assets/fob_blue_alive.svg
new file mode 100644
index 00000000..01eed590
--- /dev/null
+++ b/resources/ui/ground_assets/fob_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fob_blue_damaged.svg b/resources/ui/ground_assets/fob_blue_damaged.svg
new file mode 100644
index 00000000..e9dacd53
--- /dev/null
+++ b/resources/ui/ground_assets/fob_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fob_blue_destroyed.svg b/resources/ui/ground_assets/fob_blue_destroyed.svg
new file mode 100644
index 00000000..f9b1e2a0
--- /dev/null
+++ b/resources/ui/ground_assets/fob_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fob_red_alive.svg b/resources/ui/ground_assets/fob_red_alive.svg
new file mode 100644
index 00000000..68ee8a5e
--- /dev/null
+++ b/resources/ui/ground_assets/fob_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fob_red_damaged.svg b/resources/ui/ground_assets/fob_red_damaged.svg
new file mode 100644
index 00000000..bfb93b9a
--- /dev/null
+++ b/resources/ui/ground_assets/fob_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fob_red_destroyed.svg b/resources/ui/ground_assets/fob_red_destroyed.svg
new file mode 100644
index 00000000..4b150097
--- /dev/null
+++ b/resources/ui/ground_assets/fob_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fuel_blue_alive.svg b/resources/ui/ground_assets/fuel_blue_alive.svg
new file mode 100644
index 00000000..ec3b1951
--- /dev/null
+++ b/resources/ui/ground_assets/fuel_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fuel_blue_damaged.svg b/resources/ui/ground_assets/fuel_blue_damaged.svg
new file mode 100644
index 00000000..24c9fca4
--- /dev/null
+++ b/resources/ui/ground_assets/fuel_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fuel_blue_destroyed.svg b/resources/ui/ground_assets/fuel_blue_destroyed.svg
new file mode 100644
index 00000000..1c6f9d56
--- /dev/null
+++ b/resources/ui/ground_assets/fuel_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fuel_red_alive.svg b/resources/ui/ground_assets/fuel_red_alive.svg
new file mode 100644
index 00000000..df4b610d
--- /dev/null
+++ b/resources/ui/ground_assets/fuel_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fuel_red_damaged.svg b/resources/ui/ground_assets/fuel_red_damaged.svg
new file mode 100644
index 00000000..84f029a6
--- /dev/null
+++ b/resources/ui/ground_assets/fuel_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/fuel_red_destroyed.svg b/resources/ui/ground_assets/fuel_red_destroyed.svg
new file mode 100644
index 00000000..110ed58d
--- /dev/null
+++ b/resources/ui/ground_assets/fuel_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/missile_blue_alive.svg b/resources/ui/ground_assets/missile_blue_alive.svg
new file mode 100644
index 00000000..91bfa0b9
--- /dev/null
+++ b/resources/ui/ground_assets/missile_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/missile_blue_damaged.svg b/resources/ui/ground_assets/missile_blue_damaged.svg
new file mode 100644
index 00000000..841b8ba9
--- /dev/null
+++ b/resources/ui/ground_assets/missile_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/missile_blue_destroyed.svg b/resources/ui/ground_assets/missile_blue_destroyed.svg
new file mode 100644
index 00000000..801cc220
--- /dev/null
+++ b/resources/ui/ground_assets/missile_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/missile_red_alive.svg b/resources/ui/ground_assets/missile_red_alive.svg
new file mode 100644
index 00000000..faf9b1c9
--- /dev/null
+++ b/resources/ui/ground_assets/missile_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/missile_red_damaged.svg b/resources/ui/ground_assets/missile_red_damaged.svg
new file mode 100644
index 00000000..f4b69b86
--- /dev/null
+++ b/resources/ui/ground_assets/missile_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/missile_red_destroyed.svg b/resources/ui/ground_assets/missile_red_destroyed.svg
new file mode 100644
index 00000000..24b2fef3
--- /dev/null
+++ b/resources/ui/ground_assets/missile_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/oil_blue_alive.svg b/resources/ui/ground_assets/oil_blue_alive.svg
new file mode 100644
index 00000000..088202c3
--- /dev/null
+++ b/resources/ui/ground_assets/oil_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/oil_blue_damaged.svg b/resources/ui/ground_assets/oil_blue_damaged.svg
new file mode 100644
index 00000000..da58acec
--- /dev/null
+++ b/resources/ui/ground_assets/oil_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/oil_blue_destroyed.svg b/resources/ui/ground_assets/oil_blue_destroyed.svg
new file mode 100644
index 00000000..139ea116
--- /dev/null
+++ b/resources/ui/ground_assets/oil_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/oil_red_alive.svg b/resources/ui/ground_assets/oil_red_alive.svg
new file mode 100644
index 00000000..7a103a23
--- /dev/null
+++ b/resources/ui/ground_assets/oil_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/oil_red_damaged.svg b/resources/ui/ground_assets/oil_red_damaged.svg
new file mode 100644
index 00000000..f6859a06
--- /dev/null
+++ b/resources/ui/ground_assets/oil_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/oil_red_destroyed.svg b/resources/ui/ground_assets/oil_red_destroyed.svg
new file mode 100644
index 00000000..2ba91be4
--- /dev/null
+++ b/resources/ui/ground_assets/oil_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/poewr_blue_damaged.svg b/resources/ui/ground_assets/poewr_blue_damaged.svg
new file mode 100644
index 00000000..edc02ac8
--- /dev/null
+++ b/resources/ui/ground_assets/poewr_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/power_blue_alive.svg b/resources/ui/ground_assets/power_blue_alive.svg
new file mode 100644
index 00000000..5459d166
--- /dev/null
+++ b/resources/ui/ground_assets/power_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/power_blue_destroyed.svg b/resources/ui/ground_assets/power_blue_destroyed.svg
new file mode 100644
index 00000000..1d648453
--- /dev/null
+++ b/resources/ui/ground_assets/power_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/power_red_alive.svg b/resources/ui/ground_assets/power_red_alive.svg
new file mode 100644
index 00000000..443b5dd5
--- /dev/null
+++ b/resources/ui/ground_assets/power_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/power_red_damaged.svg b/resources/ui/ground_assets/power_red_damaged.svg
new file mode 100644
index 00000000..f628a2a0
--- /dev/null
+++ b/resources/ui/ground_assets/power_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/power_red_destroyed.svg b/resources/ui/ground_assets/power_red_destroyed.svg
new file mode 100644
index 00000000..48b8f196
--- /dev/null
+++ b/resources/ui/ground_assets/power_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ship_blue_alive.svg b/resources/ui/ground_assets/ship_blue_alive.svg
new file mode 100644
index 00000000..8ae1393f
--- /dev/null
+++ b/resources/ui/ground_assets/ship_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ship_blue_damaged.svg b/resources/ui/ground_assets/ship_blue_damaged.svg
new file mode 100644
index 00000000..edcb3cd9
--- /dev/null
+++ b/resources/ui/ground_assets/ship_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ship_blue_destroyed.svg b/resources/ui/ground_assets/ship_blue_destroyed.svg
new file mode 100644
index 00000000..8ed1ee02
--- /dev/null
+++ b/resources/ui/ground_assets/ship_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ship_red_alive.svg b/resources/ui/ground_assets/ship_red_alive.svg
new file mode 100644
index 00000000..538cf721
--- /dev/null
+++ b/resources/ui/ground_assets/ship_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ship_red_damaged.svg b/resources/ui/ground_assets/ship_red_damaged.svg
new file mode 100644
index 00000000..f97a1109
--- /dev/null
+++ b/resources/ui/ground_assets/ship_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ship_red_destroyed.svg b/resources/ui/ground_assets/ship_red_destroyed.svg
new file mode 100644
index 00000000..176e9ae5
--- /dev/null
+++ b/resources/ui/ground_assets/ship_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/village_blue_alive.svg b/resources/ui/ground_assets/village_blue_alive.svg
new file mode 100644
index 00000000..c8bdb38f
--- /dev/null
+++ b/resources/ui/ground_assets/village_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/village_blue_damaged.svg b/resources/ui/ground_assets/village_blue_damaged.svg
new file mode 100644
index 00000000..c54784b6
--- /dev/null
+++ b/resources/ui/ground_assets/village_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/village_blue_destroyed.svg b/resources/ui/ground_assets/village_blue_destroyed.svg
new file mode 100644
index 00000000..827ef39d
--- /dev/null
+++ b/resources/ui/ground_assets/village_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/village_red_alive.svg b/resources/ui/ground_assets/village_red_alive.svg
new file mode 100644
index 00000000..d70c0dcb
--- /dev/null
+++ b/resources/ui/ground_assets/village_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/village_red_damaged.svg b/resources/ui/ground_assets/village_red_damaged.svg
new file mode 100644
index 00000000..bb32e616
--- /dev/null
+++ b/resources/ui/ground_assets/village_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/village_red_destroyed.svg b/resources/ui/ground_assets/village_red_destroyed.svg
new file mode 100644
index 00000000..d8924600
--- /dev/null
+++ b/resources/ui/ground_assets/village_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ware_blue_alive.svg b/resources/ui/ground_assets/ware_blue_alive.svg
new file mode 100644
index 00000000..ec3b1951
--- /dev/null
+++ b/resources/ui/ground_assets/ware_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ware_blue_damaged.svg b/resources/ui/ground_assets/ware_blue_damaged.svg
new file mode 100644
index 00000000..24c9fca4
--- /dev/null
+++ b/resources/ui/ground_assets/ware_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ware_blue_destroyed.svg b/resources/ui/ground_assets/ware_blue_destroyed.svg
new file mode 100644
index 00000000..1c6f9d56
--- /dev/null
+++ b/resources/ui/ground_assets/ware_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ware_red_alive.svg b/resources/ui/ground_assets/ware_red_alive.svg
new file mode 100644
index 00000000..df4b610d
--- /dev/null
+++ b/resources/ui/ground_assets/ware_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ware_red_damaged.svg b/resources/ui/ground_assets/ware_red_damaged.svg
new file mode 100644
index 00000000..84f029a6
--- /dev/null
+++ b/resources/ui/ground_assets/ware_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ware_red_destroyed.svg b/resources/ui/ground_assets/ware_red_destroyed.svg
new file mode 100644
index 00000000..110ed58d
--- /dev/null
+++ b/resources/ui/ground_assets/ware_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ww2bunker_blue_alive.svg b/resources/ui/ground_assets/ww2bunker_blue_alive.svg
new file mode 100644
index 00000000..01eed590
--- /dev/null
+++ b/resources/ui/ground_assets/ww2bunker_blue_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ww2bunker_blue_damaged.svg b/resources/ui/ground_assets/ww2bunker_blue_damaged.svg
new file mode 100644
index 00000000..e9dacd53
--- /dev/null
+++ b/resources/ui/ground_assets/ww2bunker_blue_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ww2bunker_blue_destroyed.svg b/resources/ui/ground_assets/ww2bunker_blue_destroyed.svg
new file mode 100644
index 00000000..f9b1e2a0
--- /dev/null
+++ b/resources/ui/ground_assets/ww2bunker_blue_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ww2bunker_red_alive.svg b/resources/ui/ground_assets/ww2bunker_red_alive.svg
new file mode 100644
index 00000000..68ee8a5e
--- /dev/null
+++ b/resources/ui/ground_assets/ww2bunker_red_alive.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ww2bunker_red_damaged.svg b/resources/ui/ground_assets/ww2bunker_red_damaged.svg
new file mode 100644
index 00000000..bfb93b9a
--- /dev/null
+++ b/resources/ui/ground_assets/ww2bunker_red_damaged.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/ground_assets/ww2bunker_red_destroyed.svg b/resources/ui/ground_assets/ww2bunker_red_destroyed.svg
new file mode 100644
index 00000000..4b150097
--- /dev/null
+++ b/resources/ui/ground_assets/ww2bunker_red_destroyed.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/ui/map/canvas.html b/resources/ui/map/canvas.html
index 10c3186e..84fcb831 100644
--- a/resources/ui/map/canvas.html
+++ b/resources/ui/map/canvas.html
@@ -24,20 +24,6 @@
integrity="sha384-XAr1poM2RCR9/QQFki7ylrGSdmvYE0NuHghuRuxb/k9zJQA53y6qR5te5jJRZlcL"
crossorigin="">
-
-
-
-