diff --git a/changelog.md b/changelog.md index 5107f6fe..b1a7ec6c 100644 --- a/changelog.md +++ b/changelog.md @@ -37,15 +37,28 @@ Saves from 2.3 are not compatible with 2.4. * **[Campaigns]** Reworked Golan Heights campaign on Syria, (Added FOB and preset locations for SAMS) * **[Campaigns]** Added a lite version of the Golan Heights campaign * **[Campaigns]** Reworked Syrian Civil War campaign (Added FOB and preset locations for SAMS) +* **[Campaigns]** Reworked Emirates campaign +* **[Campaigns]** AA units added to frontlines and updated all factions to include some frontline AA units. +* **[Mission Generator]** Infantry will only be generated for APC and IFV groups +* **[Mission Generator]** Infantry squads size is not randomized anymore +* **[Mission Generator]** Infantry squads can have a mortar. +* **[Mission Generator]** SCUD missiles sites will now fire on enemy controls points in range when possible * **[Factions]** Updated Nato Desert Storm to include F-14A * **[Factions]** Updated Iraq 1991 factions to include Zsu-57 and Mig-29A +* **[Factions]** Germany 1944, added Stug III and Stug IV +* **[Factions]** Added factions Insurgents (Hard) with better and more weapons * **[Plugins]** [The EWRS plugin](https://github.com/Bob7heBuilder/EWRS) is now included. * **[UI]** Added enemy intelligence summary and details window. ## Fixes: * **[Factions]** AI would never buy artillery units for the frontline - fixed -* **[Factions]** Removed the F-111 unit from the NATO desert storm faction. (Recruiting it would cause crashes in DCS, since it is not a valid unit) +* **[Factions]** Removed the F-111 unit from the NATO desert storm faction. (Recruiting it would cause crashes in DCS, since it is not a valid unit) +* **[Campaign]** Automatic redeployment of ground units would sometimes fail - fixed +* **[Mission Generator]** Artillery groups would retreat in the wrong direction - fixed * **[Units]** Fixed SPG_Stryker_M1128_MGS not being in db +* **[UI]** Fixed and added many missing ground units icons +* **[UI]** Ship groups could be replaced by SAM sites in the UI, which would lead to broken mission being generated - fixed +* **[New Game Wizard]** Removed the "mid game" campaign generator option which is currently broken * **[Mission Generator]** Empty navy groups will no longer be generated * **[Mission Generator]** Fixed BAI, SEAD, and DEAD flights ocassionally being assigned the wrong targets. * **[Flight Planner]** Fixed not being able to plan packages against opfor carriers diff --git a/game/db.py b/game/db.py index c02a9936..3a331588 100644 --- a/game/db.py +++ b/game/db.py @@ -266,7 +266,7 @@ PRICES = { FW_190A8: 14, A_20G: 22, Ju_88A4: 24, - + F_5E_3: 8, MiG_15bis: 4, MiG_19P: 6, @@ -329,7 +329,7 @@ PRICES = { Tu_22M3: 40, Tu_95MS: 35, F_111F: 21, - + # special IL_76MD: 30, An_26B: 25, @@ -415,6 +415,7 @@ PRICES = { Artillery.MLRS_BM_21_Grad: 15, Artillery.MLRS_9K57_Uragan_BM_27: 50, Artillery.MLRS_9A52_Smerch: 40, + Artillery._2B11_mortar: 4, Artillery.SpGH_Dana: 26, Unarmed.Transport_UAZ_469: 3, @@ -444,6 +445,7 @@ PRICES = { Armor.LAC_M8_Greyhound: 8, Armor.TD_M10_GMC: 14, Armor.StuG_III_Ausf__G: 12, + Armor.StuG_IV: 14, Artillery.M12_GMC: 10, Artillery.Sturmpanzer_IV_Brummbär: 10, Armor.Daimler_Armoured_Car: 8, @@ -695,8 +697,8 @@ UNIT_BY_TASK = { ], AWACS: [ E_3A, - E_2C, - A_50, + E_2C, + A_50, KJ_2000 ], PinpointStrike: [ @@ -835,6 +837,7 @@ UNIT_BY_TASK = { Armor.TD_M10_GMC, Armor.TD_M10_GMC, Armor.StuG_III_Ausf__G, + Armor.StuG_IV, Artillery.M12_GMC, Artillery.Sturmpanzer_IV_Brummbär, Armor.Daimler_Armoured_Car, @@ -870,6 +873,13 @@ UNIT_BY_TASK = { AirDefence.SAM_Avenger_M1097, AirDefence.SAM_Roland_ADS, AirDefence.HQ_7_Self_Propelled_LN, + AirDefence.AAA_8_8cm_Flak_18, + AirDefence.AAA_8_8cm_Flak_36, + AirDefence.AAA_8_8cm_Flak_37, + AirDefence.AAA_8_8cm_Flak_41, + AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_M1_37mm, + AirDefence.AA_gun_QF_3_7, frenchpack.DIM__TOYOTA_BLUE, frenchpack.DIM__TOYOTA_DESERT, @@ -1277,6 +1287,7 @@ INFANTRY: List[VehicleType] = [ Infantry.Soldier_RPG, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Soldier_M249, + Artillery._2B11_mortar, Infantry.Soldier_AK, Infantry.Soldier_AK, Infantry.Soldier_AK, Infantry.Soldier_AK, Infantry.Soldier_AK, Infantry.Paratrooper_RPG_16, Infantry.Georgian_soldier_with_M4, Infantry.Georgian_soldier_with_M4, Infantry.Georgian_soldier_with_M4, diff --git a/game/theater/base.py b/game/theater/base.py index 88ede52f..28fd5666 100644 --- a/game/theater/base.py +++ b/game/theater/base.py @@ -114,11 +114,11 @@ class Base: self.armor = {k: v for k, v in self.armor.items() if k in applicable_units} def commision_units(self, units: typing.Dict[typing.Any, int]): - for value in units.values(): - assert value > 0 - assert value == math.floor(value) for unit_type, unit_count in units.items(): + if unit_count <= 0: + continue + for_task = db.unit_task(unit_type) target_dict = None diff --git a/gen/armor.py b/gen/armor.py index 9cc0c090..8e54c8ca 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -50,6 +50,8 @@ FIGHT_DISTANCE = 3500 RANDOM_OFFSET_ATTACK = 250 +INFANTRY_GROUP_SIZE = 5 + @dataclass(frozen=True) class JtacInfo: @@ -226,7 +228,7 @@ class GroundConflictGenerator: heading=forward_heading, move_formation=PointAction.OffRoad) - for i in range(random.randint(3, 10)): + for i in range(INFANTRY_GROUP_SIZE): u = random.choice(possible_infantry_units) position = infantry_position.random_point_within(55, 5) self.mission.vehicle_group( @@ -281,7 +283,7 @@ class GroundConflictGenerator: # Hold position dcs_group.points[1].tasks.append(Hold()) - retreat = self.find_retreat_point(dcs_group, heading_sum(forward_heading, 180), (int)(RETREAT_DISTANCE/3)) + retreat = self.find_retreat_point(dcs_group, forward_heading, (int)(RETREAT_DISTANCE/3)) dcs_group.add_waypoint(dcs_group.position.point_from_heading(forward_heading, 1), PointAction.OffRoad) dcs_group.points[2].tasks.append(Hold()) dcs_group.add_waypoint(retreat, PointAction.OffRoad) diff --git a/gen/ground_forces/ai_ground_planner_db.py b/gen/ground_forces/ai_ground_planner_db.py index 794cb128..c448611d 100644 --- a/gen/ground_forces/ai_ground_planner_db.py +++ b/gen/ground_forces/ai_ground_planner_db.py @@ -189,6 +189,8 @@ TYPE_SHORAD = [ AirDefence.HQ_7_Self_Propelled_LN, AirDefence.AAA_8_8cm_Flak_18, + AirDefence.AAA_8_8cm_Flak_36, + AirDefence.AAA_8_8cm_Flak_37, AirDefence.AAA_8_8cm_Flak_41, AirDefence.AAA_Bofors_40mm, AirDefence.AAA_M1_37mm, diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index 2c9c858c..a19f38ae 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -9,20 +9,21 @@ from __future__ import annotations import logging import random -from typing import Dict, Iterator, Optional, TYPE_CHECKING, Type +from typing import Dict, Iterator, Optional, TYPE_CHECKING, Type, List -from dcs import Mission +from dcs import Mission, Point from dcs.country import Country from dcs.statics import fortification_map, warehouse_map from dcs.task import ( ActivateBeaconCommand, ActivateICLSCommand, EPLRS, - OptAlarmState, + OptAlarmState, FireAtPoint, ) from dcs.unit import Ship, Unit, Vehicle from dcs.unitgroup import Group, ShipGroup, StaticGroup, VehicleGroup from dcs.unittype import StaticType, UnitType +from dcs.vehicles import vehicle_map from game import db from game.data.building_data import FORTIFICATION_UNITS, FORTIFICATION_UNITS_ID @@ -31,7 +32,7 @@ from game.theater import ControlPoint, TheaterGroundObject from game.theater.theatergroundobject import ( BuildingGroundObject, CarrierGroundObject, GenericCarrierGroundObject, - LhaGroundObject, ShipGroundObject, + LhaGroundObject, ShipGroundObject, MissileSiteGroundObject, ) from game.unitmap import UnitMap from game.utils import knots, mps @@ -50,7 +51,7 @@ AA_CP_MIN_DISTANCE = 40000 class GenericGroundObjectGenerator: """An unspecialized ground object generator. - Currently used only for SAM and missile (V1/V2) sites. + Currently used only for SAM """ def __init__(self, ground_object: TheaterGroundObject, country: Country, game: Game, mission: Mission, unit_map: UnitMap) -> None: @@ -111,6 +112,58 @@ class GenericGroundObjectGenerator: persistence_group, miz_group) +class MissileSiteGenerator(GenericGroundObjectGenerator): + + def generate(self) -> None: + super(MissileSiteGenerator, self).generate() + # Note : Only the SCUD missiles group can fire (V1 site cannot fire in game right now) + # TODO : Should be pre-planned ? + # TODO : Add delay to task to spread fire task over mission duration ? + for group in self.ground_object.groups: + vg = self.m.find_group(group.name) + if vg is not None: + targets = self.possible_missile_targets(vg) + if targets: + target = random.choice(targets) + real_target = target.point_from_heading(random.randint(0, 360), random.randint(0, 2500)) + vg.points[0].add_task(FireAtPoint(real_target)) + logging.info("Set up fire task for missile group.") + else: + logging.info("Couldn't setup missile site to fire, no valid target in range.") + else: + logging.info("Couldn't setup missile site to fire, group was not generated.") + + def possible_missile_targets(self, vg: Group) -> List[Point]: + """ + Find enemy control points in range + :param vg: Vehicle group we are searching a target for (There is always only oe group right now) + :return: List of possible missile targets + """ + targets: List[Point] = [] + for cp in self.game.theater.controlpoints: + if cp.captured != self.ground_object.control_point.captured: + distance = cp.position.distance_to_point(vg.position) + if distance < self.missile_site_range: + targets.append(cp.position) + return targets + + @property + def missile_site_range(self) -> int: + """ + Get the missile site range + :return: Missile site range + """ + site_range = 0 + for group in self.ground_object.groups: + vg = self.m.find_group(group.name) + if vg is not None: + for u in vg.units: + if u.type in vehicle_map: + if vehicle_map[u.type].threat_range > site_range: + site_range = vehicle_map[u.type].threat_range + return site_range + + class BuildingSiteGenerator(GenericGroundObjectGenerator): """Generator for building sites. @@ -421,8 +474,11 @@ class GroundObjectsGenerator: generator = ShipObjectGenerator( ground_object, country, self.game, self.m, self.unit_map) + elif isinstance(ground_object, MissileSiteGroundObject): + generator = MissileSiteGenerator( + ground_object, country, self.game, self.m, + self.unit_map) else: - generator = GenericGroundObjectGenerator( ground_object, country, self.game, self.m, self.unit_map) diff --git a/qt_ui/windows/groundobject/QGroundObjectMenu.py b/qt_ui/windows/groundobject/QGroundObjectMenu.py index ed2d04b4..1341eb39 100644 --- a/qt_ui/windows/groundobject/QGroundObjectMenu.py +++ b/qt_ui/windows/groundobject/QGroundObjectMenu.py @@ -21,6 +21,7 @@ from game import Game, db from game.data.building_data import FORTIFICATION_BUILDINGS from game.db import PRICES, PinpointStrike, REWARDS, unit_type_of from game.theater import ControlPoint, TheaterGroundObject +from game.theater.theatergroundobject import NavalGroundObject from gen.defenses.armor_group_generator import \ generate_armor_group_of_type_and_size from gen.sam.sam_group_generator import get_faction_possible_sams_generator @@ -81,9 +82,10 @@ class QGroundObjectMenu(QDialog): self.buy_replace.clicked.connect(self.buy_group) self.buy_replace.setProperty("style", "btn-success") - if self.total_value > 0: - self.actionLayout.addWidget(self.sell_all_button) - self.actionLayout.addWidget(self.buy_replace) + if not isinstance(self.ground_object, NavalGroundObject): + if self.total_value > 0: + self.actionLayout.addWidget(self.sell_all_button) + self.actionLayout.addWidget(self.buy_replace) if self.cp.captured and self.ground_object.dcs_identifier == "AA": self.mainLayout.addLayout(self.actionLayout) diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 4f5f45e0..705675d4 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -81,7 +81,7 @@ class NewGameWizard(QtWidgets.QWizard): enemy_budget=int(self.field("enemy_starting_money")), # QSlider forces integers, so we use 1 to 50 and divide by 10 to # give 0.1 to 5.0. - midgame=self.field("midGame"), + midgame=False, inverted=self.field("invertMap"), no_carrier=self.field("no_carrier"), no_lha=self.field("no_lha"), @@ -271,10 +271,10 @@ class TheaterConfiguration(QtWidgets.QWizardPage): mapSettingsLayout.addWidget(QtWidgets.QLabel("Invert Map"), 0, 0) mapSettingsLayout.addWidget(invertMap, 0, 1) - mapSettingsLayout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0) - midgame = QtWidgets.QCheckBox() - self.registerField('midGame', midgame) - mapSettingsLayout.addWidget(midgame, 1, 1) + #mapSettingsLayout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0) + #midgame = QtWidgets.QCheckBox() + #self.registerField('midGame', midgame) + #mapSettingsLayout.addWidget(midgame, 1, 1) mapSettingsGroup.setLayout(mapSettingsLayout) # Time Period diff --git a/resources/campaigns/emirates.json b/resources/campaigns/emirates.json index 147295e3..6579d3e8 100644 --- a/resources/campaigns/emirates.json +++ b/resources/campaigns/emirates.json @@ -3,106 +3,5 @@ "theater": "Persian Gulf", "authors": "Khopa", "description": "

In this scenario, you can play an invasion of the Emirates and Oman, where your forces starts in Fujairah.

Note: Fujairah airfield has very few slots for aircrafts, so it recommended to operate from carriers at the start of the campaign. Thus, a carrier-capable faction is recommended.

", - "player_points": [ - { - "type": "airbase", - "id": "Fujairah Intl", - "radials": [ - 180, - 225, - 270, - 315, - 0 - ], - "size": 1000, - "importance": 1, - "captured_invert": true - }, - { - "type": "lha", - "id": 1002, - "x": -79770, - "y": 49430, - "captured_invert": true - }, - { - "type": "carrier", - "id": 1001, - "x": -61770, - "y": 69039, - "captured_invert": true - } - ], - "enemy_points": [ - { - "type": "airbase", - "id": "Al Dhafra AB", - "size": 2000, - "importance": 1.2 - }, - { - "type": "airbase", - "id": "Al Ain International Airport", - "size": 2000, - "importance": 1 - }, - { - "type": "airbase", - "id": "Al Maktoum Intl", - "size": 2000, - "importance": 1 - }, - { - "type": "airbase", - "id": "Al Minhad AB", - "size": 1000, - "importance": 1 - }, - { - "type": "airbase", - "id": "Sharjah Intl", - "size": 2000, - "importance": 1 - }, - { - "type": "airbase", - "id": "Ras Al Khaimah", - "size": 1000, - "importance": 1 - } - ], - "links": [ - [ - "Al Ain International Airport", - "Al Dhafra AB" - ], - [ - "Al Dhafra AB", - "Al Maktoum Intl" - ], - [ - "Al Ain International Airport", - "Fujairah Intl" - ], - [ - "Al Ain International Airport", - "Al Maktoum Intl" - ], - [ - "Al Maktoum Intl", - "Al Minhad AB" - ], - [ - "Al Minhad AB", - "Sharjah Intl" - ], - [ - "Ras Al Khaimah", - "Sharjah Intl" - ], - [ - "Fujairah Intl", - "Sharjah Intl" - ] - ] + "miz": "emirates.miz" } \ No newline at end of file diff --git a/resources/campaigns/emirates.miz b/resources/campaigns/emirates.miz new file mode 100644 index 00000000..949e6575 Binary files /dev/null and b/resources/campaigns/emirates.miz differ diff --git a/resources/factions/france_1995.json b/resources/factions/france_1995.json index b50f4422..25b897ac 100644 --- a/resources/factions/france_1995.json +++ b/resources/factions/france_1995.json @@ -37,7 +37,8 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", - "Stinger_MANPADS" + "Stinger_MANPADS", + "_2B11_mortar" ], "air_defenses": [ "RolandGenerator", diff --git a/resources/factions/germany_1944.json b/resources/factions/germany_1944.json index 297c3c08..7cd95b44 100644 --- a/resources/factions/germany_1944.json +++ b/resources/factions/germany_1944.json @@ -19,6 +19,8 @@ "Sd_Kfz_184_Elefant", "TD_Jagdpanther_G1", "TD_Jagdpanzer_IV", + "StuG_III_Ausf__G", + "StuG_IV", "AAA_8_8cm_Flak_18", "AAA_8_8cm_Flak_41" ], diff --git a/resources/factions/germany_1990.json b/resources/factions/germany_1990.json index 3e3f5560..c5275de1 100644 --- a/resources/factions/germany_1990.json +++ b/resources/factions/germany_1990.json @@ -33,6 +33,7 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", + "_2B11_mortar", "Stinger_MANPADS" ], "air_defenses": [ diff --git a/resources/factions/insurgents.json b/resources/factions/insurgents.json index 8634c534..f31a5966 100644 --- a/resources/factions/insurgents.json +++ b/resources/factions/insurgents.json @@ -22,6 +22,7 @@ "infantry_units": [ "Infantry_Soldier_Insurgents", "Soldier_RPG", + "_2B11_mortar", "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ diff --git a/resources/factions/insurgents_hard.json b/resources/factions/insurgents_hard.json index c0e9038f..f824e1c7 100644 --- a/resources/factions/insurgents_hard.json +++ b/resources/factions/insurgents_hard.json @@ -1,6 +1,6 @@ { "country": "Insurgents", - "name": "Insurgents", + "name": "Insurgents (Hard)", "authors": "Khopa", "description": "

Insurgents faction.

", "aircrafts": [ @@ -14,7 +14,6 @@ "IFV_BMP_1", "MBT_T_55", "AAA_ZU_23_Insurgent_on_Ural_375", - "AAA_ZSU_57_2", "AAA_ZSU_57_2" ], "artillery_units": [ @@ -28,6 +27,7 @@ "infantry_units": [ "Infantry_Soldier_Insurgents", "Soldier_RPG", + "_2B11_mortar", "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index 7649f5d5..5630494c 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -39,7 +39,8 @@ ], "infantry_units": [ "Infantry_Soldier_Rus", - "Soldier_RPG" + "Soldier_RPG", + "_2B11_mortar" ], "air_defenses": [ "ColdWarFlakGenerator", diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index ef0e75be..74c52bf3 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -44,6 +44,7 @@ "Paratrooper_AKS", "Infantry_Soldier_Rus", "Paratrooper_RPG_16", + "_2B11_mortar", "SAM_SA_18_Igla_S_MANPADS" ], "air_defenses": [ diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index 3617cdd3..bd6d037a 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -49,6 +49,7 @@ "Paratrooper_AKS", "Infantry_Soldier_Rus", "Paratrooper_RPG_16", + "_2B11_mortar", "SAM_SA_18_Igla_MANPADS" ], "air_defenses": [ diff --git a/resources/factions/uk_1990.json b/resources/factions/uk_1990.json index f79c71ab..2522d20b 100644 --- a/resources/factions/uk_1990.json +++ b/resources/factions/uk_1990.json @@ -34,6 +34,7 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", + "_2B11_mortar", "Stinger_MANPADS" ], "air_defenses": [ diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index 58b5ac14..e2da4d5f 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -45,7 +45,8 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", - "Stinger_MANPADS" + "Stinger_MANPADS", + "_2B11_mortar" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index 916c61a8..09a6fd1d 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -46,7 +46,8 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", - "Stinger_MANPADS" + "Stinger_MANPADS", + "_2B11_mortar" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usa_2005_c130.json b/resources/factions/usa_2005_c130.json index 60c5c6da..af749b94 100644 --- a/resources/factions/usa_2005_c130.json +++ b/resources/factions/usa_2005_c130.json @@ -47,7 +47,8 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", - "Stinger_MANPADS" + "Stinger_MANPADS", + "_2B11_mortar" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usa_2005_modded.json b/resources/factions/usa_2005_modded.json index 2e10263a..de7375e6 100644 --- a/resources/factions/usa_2005_modded.json +++ b/resources/factions/usa_2005_modded.json @@ -47,7 +47,8 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", - "Stinger_MANPADS" + "Stinger_MANPADS", + "_2B11_mortar" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index f6725b56..c976f371 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -33,6 +33,7 @@ "infantry_units": [ "Infantry_M4", "Soldier_M249", + "_2B11_mortar", "Stinger_MANPADS" ], "air_defenses": [ diff --git a/resources/ui/units/vehicles/BTR-82A_24.jpg b/resources/ui/units/vehicles/BTR-82A_24.jpg new file mode 100644 index 00000000..e5454a1d Binary files /dev/null and b/resources/ui/units/vehicles/BTR-82A_24.jpg differ diff --git a/resources/ui/units/vehicles/Bedford MWD_24.jpg b/resources/ui/units/vehicles/Bedford_MWD_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Bedford MWD_24.jpg rename to resources/ui/units/vehicles/Bedford_MWD_24.jpg diff --git a/resources/ui/units/vehicles/Blitz 3.6-6700A_24.jpg b/resources/ui/units/vehicles/Blitz_36-6700A_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Blitz 3.6-6700A_24.jpg rename to resources/ui/units/vehicles/Blitz_36-6700A_24.jpg diff --git a/resources/ui/units/vehicles/Centaur_IV_24.jpg b/resources/ui/units/vehicles/Centaur_IV_24.jpg new file mode 100644 index 00000000..dcbabd27 Binary files /dev/null and b/resources/ui/units/vehicles/Centaur_IV_24.jpg differ diff --git a/resources/ui/units/vehicles/M1043 HMMWV TOW_24.jpg b/resources/ui/units/vehicles/Churchill_VII_24.jpg similarity index 56% rename from resources/ui/units/vehicles/M1043 HMMWV TOW_24.jpg rename to resources/ui/units/vehicles/Churchill_VII_24.jpg index f24eddfd..2f46a79a 100644 Binary files a/resources/ui/units/vehicles/M1043 HMMWV TOW_24.jpg and b/resources/ui/units/vehicles/Churchill_VII_24.jpg differ diff --git a/resources/ui/units/vehicles/Cromwell IV_24.jpg b/resources/ui/units/vehicles/Cromwell_IV_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Cromwell IV_24.jpg rename to resources/ui/units/vehicles/Cromwell_IV_24.jpg diff --git a/resources/ui/units/vehicles/Daimler_AC_24.jpg b/resources/ui/units/vehicles/Daimler_AC_24.jpg new file mode 100644 index 00000000..a81db45e Binary files /dev/null and b/resources/ui/units/vehicles/Daimler_AC_24.jpg differ diff --git a/resources/ui/units/vehicles/Elefant_SdKfz_184_24.jpg b/resources/ui/units/vehicles/Elefant_SdKfz_184_24.jpg new file mode 100644 index 00000000..210967d7 Binary files /dev/null and b/resources/ui/units/vehicles/Elefant_SdKfz_184_24.jpg differ diff --git a/resources/ui/units/vehicles/Flakscheinwerfer_37_24.jpg b/resources/ui/units/vehicles/Flakscheinwerfer_37_24.jpg new file mode 100644 index 00000000..f0996252 Binary files /dev/null and b/resources/ui/units/vehicles/Flakscheinwerfer_37_24.jpg differ diff --git a/resources/ui/units/vehicles/FuMG-401_24.jpg b/resources/ui/units/vehicles/FuMG-401_24.jpg new file mode 100644 index 00000000..9d60a3cc Binary files /dev/null and b/resources/ui/units/vehicles/FuMG-401_24.jpg differ diff --git a/resources/ui/units/vehicles/Grad-Ural.jpg b/resources/ui/units/vehicles/Grad-Ural.jpg new file mode 100644 index 00000000..d2ceef28 Binary files /dev/null and b/resources/ui/units/vehicles/Grad-Ural.jpg differ diff --git a/resources/ui/units/vehicles/Jagdpanzer IV_24.jpg b/resources/ui/units/vehicles/JagdPz_IV_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Jagdpanzer IV_24.jpg rename to resources/ui/units/vehicles/JagdPz_IV_24.jpg diff --git a/resources/ui/units/vehicles/Jagdpanther_24.jpg b/resources/ui/units/vehicles/Jagdpanther_G1_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Jagdpanther_24.jpg rename to resources/ui/units/vehicles/Jagdpanther_G1_24.jpg diff --git a/resources/ui/units/vehicles/KDO_Mod40_24.jpg b/resources/ui/units/vehicles/KDO_Mod40_24.jpg new file mode 100644 index 00000000..76068edc Binary files /dev/null and b/resources/ui/units/vehicles/KDO_Mod40_24.jpg differ diff --git a/resources/ui/units/vehicles/Kubelwagen_82_24.jpg b/resources/ui/units/vehicles/Kubelwagen_82_24.jpg new file mode 100644 index 00000000..01907104 Binary files /dev/null and b/resources/ui/units/vehicles/Kubelwagen_82_24.jpg differ diff --git a/resources/ui/units/vehicles/M1045 HMMWV TOW_24.jpg b/resources/ui/units/vehicles/M1045 HMMWV TOW_24.jpg new file mode 100644 index 00000000..c37355f0 Binary files /dev/null and b/resources/ui/units/vehicles/M1045 HMMWV TOW_24.jpg differ diff --git a/resources/ui/units/vehicles/M10_GMC_24.jpg b/resources/ui/units/vehicles/M10_GMC_24.jpg new file mode 100644 index 00000000..c8c84ed6 Binary files /dev/null and b/resources/ui/units/vehicles/M10_GMC_24.jpg differ diff --git a/resources/ui/units/vehicles/M12_24.jpg b/resources/ui/units/vehicles/M12_GMC_24.jpg similarity index 100% rename from resources/ui/units/vehicles/M12_24.jpg rename to resources/ui/units/vehicles/M12_GMC_24.jpg diff --git a/resources/ui/units/vehicles/M1_37mm_24.jpg b/resources/ui/units/vehicles/M1_37mm_24.jpg new file mode 100644 index 00000000..4d9fd1f8 Binary files /dev/null and b/resources/ui/units/vehicles/M1_37mm_24.jpg differ diff --git a/resources/ui/units/vehicles/M2A1_halftrack_24.jpg b/resources/ui/units/vehicles/M2A1_halftrack_24.jpg new file mode 100644 index 00000000..42692c7d Binary files /dev/null and b/resources/ui/units/vehicles/M2A1_halftrack_24.jpg differ diff --git a/resources/ui/units/vehicles/M30 Cargo Carrier_24.jpg b/resources/ui/units/vehicles/M30_CC_24.jpg similarity index 100% rename from resources/ui/units/vehicles/M30 Cargo Carrier_24.jpg rename to resources/ui/units/vehicles/M30_CC_24.jpg diff --git a/resources/ui/units/vehicles/M45_Quadmount_24.jpg b/resources/ui/units/vehicles/M45_Quadmount_24.jpg new file mode 100644 index 00000000..640841bb Binary files /dev/null and b/resources/ui/units/vehicles/M45_Quadmount_24.jpg differ diff --git a/resources/ui/units/vehicles/M4A4 Sherman Firefly_24.jpg b/resources/ui/units/vehicles/M4A4_Sherman_FF_24.jpg similarity index 100% rename from resources/ui/units/vehicles/M4A4 Sherman Firefly_24.jpg rename to resources/ui/units/vehicles/M4A4_Sherman_FF_24.jpg diff --git a/resources/ui/units/vehicles/M4A4 Sherman_24.jpg b/resources/ui/units/vehicles/M4_Sherman_24.jpg similarity index 100% rename from resources/ui/units/vehicles/M4A4 Sherman_24.jpg rename to resources/ui/units/vehicles/M4_Sherman_24.jpg diff --git a/resources/ui/units/vehicles/M4_Tractor_24.jpg b/resources/ui/units/vehicles/M4_Tractor_24.jpg new file mode 100644 index 00000000..a9c8a3f1 Binary files /dev/null and b/resources/ui/units/vehicles/M4_Tractor_24.jpg differ diff --git a/resources/ui/units/vehicles/M8_Greyhound_24.jpg b/resources/ui/units/vehicles/M8_Greyhound_24.jpg new file mode 100644 index 00000000..5f73175f Binary files /dev/null and b/resources/ui/units/vehicles/M8_Greyhound_24.jpg differ diff --git a/resources/ui/units/vehicles/Maschinensatz_33_24.jpg b/resources/ui/units/vehicles/Maschinensatz_33_24.jpg new file mode 100644 index 00000000..08fd8984 Binary files /dev/null and b/resources/ui/units/vehicles/Maschinensatz_33_24.jpg differ diff --git a/resources/ui/units/vehicles/PzKpfw IV H_24.jpg b/resources/ui/units/vehicles/Pz_IV_H_24.jpg similarity index 100% rename from resources/ui/units/vehicles/PzKpfw IV H_24.jpg rename to resources/ui/units/vehicles/Pz_IV_H_24.jpg diff --git a/resources/ui/units/vehicles/Panther G_24.jpg b/resources/ui/units/vehicles/Pz_V_Panther_G_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Panther G_24.jpg rename to resources/ui/units/vehicles/Pz_V_Panther_G_24.jpg diff --git a/resources/ui/units/vehicles/QF_37_AA_24.jpg b/resources/ui/units/vehicles/QF_37_AA_24.jpg new file mode 100644 index 00000000..82f60ec5 Binary files /dev/null and b/resources/ui/units/vehicles/QF_37_AA_24.jpg differ diff --git a/resources/ui/units/vehicles/SAO 2-C9_24.jpg b/resources/ui/units/vehicles/SAO 2-C9_24.jpg new file mode 100644 index 00000000..12903bba Binary files /dev/null and b/resources/ui/units/vehicles/SAO 2-C9_24.jpg differ diff --git a/resources/ui/units/vehicles/SAU 2S3 Akatsia_24.jpg b/resources/ui/units/vehicles/SAU 2S3 Akatsia_24.jpg new file mode 100644 index 00000000..db08c862 Binary files /dev/null and b/resources/ui/units/vehicles/SAU 2S3 Akatsia_24.jpg differ diff --git a/resources/ui/units/vehicles/SAU Gvozdika_24.jpg b/resources/ui/units/vehicles/SAU Gvozdika_24.jpg new file mode 100644 index 00000000..30719cb1 Binary files /dev/null and b/resources/ui/units/vehicles/SAU Gvozdika_24.jpg differ diff --git a/resources/ui/units/vehicles/SAU Msta_24.jpg b/resources/ui/units/vehicles/SAU Msta_24.jpg new file mode 100644 index 00000000..10ea12a4 Binary files /dev/null and b/resources/ui/units/vehicles/SAU Msta_24.jpg differ diff --git a/resources/ui/units/vehicles/Sd_Kfz_234_2_Puma_24.jpg b/resources/ui/units/vehicles/Sd_Kfz_234_2_Puma_24.jpg new file mode 100644 index 00000000..2b514781 Binary files /dev/null and b/resources/ui/units/vehicles/Sd_Kfz_234_2_Puma_24.jpg differ diff --git a/resources/ui/units/vehicles/Sd_Kfz_251_24.jpg b/resources/ui/units/vehicles/Sd_Kfz_251_24.jpg new file mode 100644 index 00000000..fc45fc95 Binary files /dev/null and b/resources/ui/units/vehicles/Sd_Kfz_251_24.jpg differ diff --git a/resources/ui/units/vehicles/Sd_Kfz_2_24.jpg b/resources/ui/units/vehicles/Sd_Kfz_2_24.jpg new file mode 100644 index 00000000..0548a7a1 Binary files /dev/null and b/resources/ui/units/vehicles/Sd_Kfz_2_24.jpg differ diff --git a/resources/ui/units/vehicles/Sd_Kfz_7_24.jpg b/resources/ui/units/vehicles/Sd_Kfz_7_24.jpg new file mode 100644 index 00000000..ef52dc20 Binary files /dev/null and b/resources/ui/units/vehicles/Sd_Kfz_7_24.jpg differ diff --git a/resources/ui/units/vehicles/ShKH vz. 77 DANA_24.jpg b/resources/ui/units/vehicles/ShKH vz. 77 DANA_24.jpg new file mode 100644 index 00000000..7268a89d Binary files /dev/null and b/resources/ui/units/vehicles/ShKH vz. 77 DANA_24.jpg differ diff --git a/resources/ui/units/vehicles/Stug_III_24.jpg b/resources/ui/units/vehicles/Stug_III_24.jpg new file mode 100644 index 00000000..3539899e Binary files /dev/null and b/resources/ui/units/vehicles/Stug_III_24.jpg differ diff --git a/resources/ui/units/vehicles/Stug_IV_24.jpg b/resources/ui/units/vehicles/Stug_IV_24.jpg new file mode 100644 index 00000000..b1351db0 Binary files /dev/null and b/resources/ui/units/vehicles/Stug_IV_24.jpg differ diff --git a/resources/ui/units/vehicles/Sturmpanzer IV_24.jpg b/resources/ui/units/vehicles/Sturmpanzer IV_24.jpg new file mode 100644 index 00000000..21349a15 Binary files /dev/null and b/resources/ui/units/vehicles/Sturmpanzer IV_24.jpg differ diff --git a/resources/ui/units/vehicles/T-72B3_24.jpg b/resources/ui/units/vehicles/T-72B3_24.jpg new file mode 100644 index 00000000..8f08c893 Binary files /dev/null and b/resources/ui/units/vehicles/T-72B3_24.jpg differ diff --git a/resources/ui/units/vehicles/Tetrarch_24.jpg b/resources/ui/units/vehicles/Tetrarch_24.jpg new file mode 100644 index 00000000..cae41d37 Binary files /dev/null and b/resources/ui/units/vehicles/Tetrarch_24.jpg differ diff --git a/resources/ui/units/vehicles/Tiger II_24.jpg b/resources/ui/units/vehicles/Tiger_II_H_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Tiger II_24.jpg rename to resources/ui/units/vehicles/Tiger_II_H_24.jpg diff --git a/resources/ui/units/vehicles/Tiger I_24.jpg b/resources/ui/units/vehicles/Tiger_I_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Tiger I_24.jpg rename to resources/ui/units/vehicles/Tiger_I_24.jpg diff --git a/resources/ui/units/vehicles/Willys_MB_24.jpg b/resources/ui/units/vehicles/Willys_MB_24.jpg new file mode 100644 index 00000000..705eb2e1 Binary files /dev/null and b/resources/ui/units/vehicles/Willys_MB_24.jpg differ diff --git a/resources/ui/units/vehicles/ZSU-57-2_24.jpg b/resources/ui/units/vehicles/ZSU-57-2_24.jpg new file mode 100644 index 00000000..e518ad96 Binary files /dev/null and b/resources/ui/units/vehicles/ZSU-57-2_24.jpg differ diff --git a/resources/ui/units/vehicles/Bofors 40 mm_24.jpg b/resources/ui/units/vehicles/bofors40_24.jpg similarity index 100% rename from resources/ui/units/vehicles/Bofors 40 mm_24.jpg rename to resources/ui/units/vehicles/bofors40_24.jpg diff --git a/resources/ui/units/vehicles/flak18_24.jpg b/resources/ui/units/vehicles/flak18_24.jpg new file mode 100644 index 00000000..d8b4123b Binary files /dev/null and b/resources/ui/units/vehicles/flak18_24.jpg differ diff --git a/resources/ui/units/vehicles/flak30_24.jpg b/resources/ui/units/vehicles/flak30_24.jpg new file mode 100644 index 00000000..74cd7369 Binary files /dev/null and b/resources/ui/units/vehicles/flak30_24.jpg differ diff --git a/resources/ui/units/vehicles/flak36_24.jpg b/resources/ui/units/vehicles/flak36_24.jpg new file mode 100644 index 00000000..d039be18 Binary files /dev/null and b/resources/ui/units/vehicles/flak36_24.jpg differ diff --git a/resources/ui/units/vehicles/flak37_24.jpg b/resources/ui/units/vehicles/flak37_24.jpg new file mode 100644 index 00000000..b2008917 Binary files /dev/null and b/resources/ui/units/vehicles/flak37_24.jpg differ diff --git a/resources/ui/units/vehicles/flak38_24.jpg b/resources/ui/units/vehicles/flak38_24.jpg new file mode 100644 index 00000000..f54c1d37 Binary files /dev/null and b/resources/ui/units/vehicles/flak38_24.jpg differ diff --git a/resources/ui/units/vehicles/flak41_24.jpg b/resources/ui/units/vehicles/flak41_24.jpg new file mode 100644 index 00000000..10f7efa1 Binary files /dev/null and b/resources/ui/units/vehicles/flak41_24.jpg differ