Refactor the mod select changes, re-add accidentally deleted factions.

This commit is contained in:
Simon Clark 2021-06-21 01:14:07 +01:00
parent 11069cc219
commit 963ab38b2e
13 changed files with 341 additions and 138 deletions

View File

@ -54,7 +54,7 @@ class Event:
@property @property
def is_player_attacking(self) -> bool: def is_player_attacking(self) -> bool:
return self.attacker_name == self.game.player_name return self.attacker_name == self.game.player_faction.name
@property @property
def tasks(self) -> List[Type[Task]]: def tasks(self) -> List[Type[Task]]:

View File

@ -257,6 +257,76 @@ class Faction:
if unit.unit_class is unit_class: if unit.unit_class is unit_class:
yield unit yield unit
def apply_mod_settings(self, mod_settings) -> Faction:
# aircraft
if not mod_settings.a4_skyhawk:
self.remove_aircraft("A-4E-C")
if not mod_settings.hercules:
self.remove_aircraft("Hercules")
if not mod_settings.f22_raptor:
self.remove_aircraft("F-22A")
if not mod_settings.jas39_gripen:
self.remove_aircraft("JAS39Gripen")
self.remove_aircraft("JAS39Gripen_AG")
if not mod_settings.su57_felon:
self.remove_aircraft("Su-57")
# frenchpack
if not mod_settings.frenchpack:
self.remove_vehicle("AMX10RCR")
self.remove_vehicle("SEPAR")
self.remove_vehicle("ERC")
self.remove_vehicle("M120")
self.remove_vehicle("AA20")
self.remove_vehicle("TRM2000")
self.remove_vehicle("TRM2000_Citerne")
self.remove_vehicle("TRM2000_AA20")
self.remove_vehicle("TRMMISTRAL")
self.remove_vehicle("VABH")
self.remove_vehicle("VAB_RADIO")
self.remove_vehicle("VAB_50")
self.remove_vehicle("VIB_VBR")
self.remove_vehicle("VAB_HOT")
self.remove_vehicle("VAB_MORTIER")
self.remove_vehicle("VBL50")
self.remove_vehicle("VBLANF1")
self.remove_vehicle("VBL-radio")
self.remove_vehicle("VBAE")
self.remove_vehicle("VBAE_MMP")
self.remove_vehicle("AMX-30B2")
self.remove_vehicle("Tracma")
self.remove_vehicle("JTACFP")
self.remove_vehicle("SHERIDAN")
self.remove_vehicle("Leclerc_XXI")
self.remove_vehicle("Toyota_bleu")
self.remove_vehicle("Toyota_vert")
self.remove_vehicle("Toyota_desert")
self.remove_vehicle("Kamikaze")
# high digit sams
if not mod_settings.high_digit_sams:
self.remove_air_defenses("SA10BGenerator")
self.remove_air_defenses("SA12Generator")
self.remove_air_defenses("SA20Generator")
self.remove_air_defenses("SA20BGenerator")
self.remove_air_defenses("SA23Generator")
self.remove_air_defenses("SA17Generator")
self.remove_air_defenses("KS19Generator")
return self
def remove_aircraft(self, name):
for i in self.aircrafts:
if i.dcs_unit_type.id == name:
self.aircrafts.remove(i)
def remove_air_defenses(self, name):
for i in self.air_defenses:
if i == name:
self.air_defenses.remove(i)
def remove_vehicle(self, name):
for i in self.frontline_units:
if i.dcs_unit_type.id == name:
self.frontline_units.remove(i)
def load_ship(name: str) -> Optional[Type[ShipType]]: def load_ship(name: str) -> Optional[Type[ShipType]]:
if (ship := getattr(dcs.ships, name, None)) is not None: if (ship := getattr(dcs.ships, name, None)) is not None:

View File

@ -35,7 +35,7 @@ from .infos.information import Information
from .navmesh import NavMesh from .navmesh import NavMesh
from .procurement import AircraftProcurementRequest, ProcurementAi from .procurement import AircraftProcurementRequest, ProcurementAi
from .profiling import logged_duration from .profiling import logged_duration
from .settings import ModSettings, Settings, AutoAtoBehavior from .settings import Settings, AutoAtoBehavior
from .squadrons import AirWing from .squadrons import AirWing
from .theater import ConflictTheater from .theater import ConflictTheater
from .theater.bullseye import Bullseye from .theater.bullseye import Bullseye
@ -88,23 +88,21 @@ class TurnState(Enum):
class Game: class Game:
def __init__( def __init__(
self, self,
player_name: str, player_faction: Faction,
enemy_name: str, enemy_faction: Faction,
theater: ConflictTheater, theater: ConflictTheater,
start_date: datetime, start_date: datetime,
settings: Settings, settings: Settings,
player_budget: float, player_budget: float,
enemy_budget: float, enemy_budget: float,
mod_settings: ModSettings,
) -> None: ) -> None:
self.settings = settings self.settings = settings
self.mod_settings = mod_settings
self.events: List[Event] = [] self.events: List[Event] = []
self.theater = theater self.theater = theater
self.player_name = player_name self.player_faction = player_faction
self.player_country = db.FACTIONS[player_name].country self.player_country = player_faction.country
self.enemy_name = enemy_name self.enemy_faction = enemy_faction
self.enemy_country = db.FACTIONS[enemy_name].country self.enemy_country = enemy_faction.country
# pass_turn() will be called when initialization is complete which will # pass_turn() will be called when initialization is complete which will
# increment this to turn 0 before it reaches the player. # increment this to turn 0 before it reaches the player.
self.turn = -1 self.turn = -1
@ -127,8 +125,6 @@ class Game:
self.conditions = self.generate_conditions() self.conditions = self.generate_conditions()
self.apply_mods()
self.blue_transit_network = TransitNetwork() self.blue_transit_network = TransitNetwork()
self.red_transit_network = TransitNetwork() self.red_transit_network = TransitNetwork()
@ -207,92 +203,6 @@ class Game:
else: else:
self.enemy_country = "Russia" self.enemy_country = "Russia"
def apply_mods(self):
# aircraft
if not self.mod_settings.a4_skyhawk:
self.remove_aircraft("A-4E-C")
if not self.mod_settings.hercules:
self.remove_aircraft("Hercules")
if not self.mod_settings.f22_raptor:
self.remove_aircraft("F-22A")
if not self.mod_settings.jas39_gripen:
self.remove_aircraft("JAS39Gripen")
self.remove_aircraft("JAS39Gripen_AG")
if not self.mod_settings.su57_felon:
self.remove_aircraft("Su-57")
# frenchpack
if not self.mod_settings.frenchpack:
self.remove_vehicle("AMX10RCR")
self.remove_vehicle("SEPAR")
self.remove_vehicle("ERC")
self.remove_vehicle("M120")
self.remove_vehicle("AA20")
self.remove_vehicle("TRM2000")
self.remove_vehicle("TRM2000_Citerne")
self.remove_vehicle("TRM2000_AA20")
self.remove_vehicle("TRMMISTRAL")
self.remove_vehicle("VABH")
self.remove_vehicle("VAB_RADIO")
self.remove_vehicle("VAB_50")
self.remove_vehicle("VIB_VBR")
self.remove_vehicle("VAB_HOT")
self.remove_vehicle("VAB_MORTIER")
self.remove_vehicle("VBL50")
self.remove_vehicle("VBLANF1")
self.remove_vehicle("VBL-radio")
self.remove_vehicle("VBAE")
self.remove_vehicle("VBAE_MMP")
self.remove_vehicle("AMX-30B2")
self.remove_vehicle("Tracma")
self.remove_vehicle("JTACFP")
self.remove_vehicle("SHERIDAN")
self.remove_vehicle("Leclerc_XXI")
self.remove_vehicle("Toyota_bleu")
self.remove_vehicle("Toyota_vert")
self.remove_vehicle("Toyota_desert")
self.remove_vehicle("Kamikaze")
# high digit sams
if not self.mod_settings.high_digit_sams:
self.remove_air_defenses("SA10BGenerator")
self.remove_air_defenses("SA12Generator")
self.remove_air_defenses("SA20Generator")
self.remove_air_defenses("SA20BGenerator")
self.remove_air_defenses("SA23Generator")
self.remove_air_defenses("SA17Generator")
self.remove_air_defenses("KS19Generator")
def remove_aircraft(self, name):
for i in self.player_faction.aircrafts:
if i.dcs_unit_type.id == name:
self.player_faction.aircrafts.remove(i)
for i in self.enemy_faction.aircrafts:
if i.dcs_unit_type.id == name:
self.enemy_faction.aircrafts.remove(i)
def remove_air_defenses(self, name):
for i in self.player_faction.air_defenses:
if i == name:
self.player_faction.air_defenses.remove(i)
for i in self.enemy_faction.air_defenses:
if i == name:
self.enemy_faction.air_defenses.remove(i)
def remove_vehicle(self, name):
for i in self.player_faction.frontline_units:
if i.dcs_unit_type.id == name:
self.player_faction.frontline_units.remove(i)
for i in self.enemy_faction.frontline_units:
if i.dcs_unit_type.id == name:
self.enemy_faction.frontline_units.remove(i)
@property
def player_faction(self) -> Faction:
return db.FACTIONS[self.player_name]
@property
def enemy_faction(self) -> Faction:
return db.FACTIONS[self.enemy_name]
def faction_for(self, player: bool) -> Faction: def faction_for(self, player: bool) -> Faction:
if player: if player:
return self.player_faction return self.player_faction
@ -332,8 +242,8 @@ class Game:
player_cp, player_cp,
enemy_cp, enemy_cp,
enemy_cp.position, enemy_cp.position,
self.player_name, self.player_faction.name,
self.enemy_name, self.enemy_faction.name,
) )
) )
@ -379,7 +289,7 @@ class Game:
return ( return (
event event
and event.attacker_name and event.attacker_name
and event.attacker_name == self.player_name and event.attacker_name == self.player_faction.name
) )
else: else:
raise RuntimeError(f"{event} was passed when an Event type was expected") raise RuntimeError(f"{event} was passed when an Event type was expected")

View File

@ -77,8 +77,8 @@ class Operation:
yield Conflict( yield Conflict(
cls.game.theater, cls.game.theater,
frontline, frontline,
cls.game.player_name, cls.game.player_faction.name,
cls.game.enemy_name, cls.game.enemy_faction.name,
cls.game.player_country, cls.game.player_country,
cls.game.enemy_country, cls.game.enemy_country,
frontline.position, frontline.position,
@ -95,8 +95,8 @@ class Operation:
return Conflict( return Conflict(
cls.game.theater, cls.game.theater,
FrontLine(player_cp, enemy_cp), FrontLine(player_cp, enemy_cp),
cls.game.player_name, cls.game.player_faction.name,
cls.game.enemy_name, cls.game.enemy_faction.name,
cls.game.player_country, cls.game.player_country,
cls.game.enemy_country, cls.game.enemy_country,
mid_point, mid_point,
@ -389,8 +389,8 @@ class Operation:
player_cp = front_line.blue_cp player_cp = front_line.blue_cp
enemy_cp = front_line.red_cp enemy_cp = front_line.red_cp
conflict = Conflict.frontline_cas_conflict( conflict = Conflict.frontline_cas_conflict(
cls.game.player_name, cls.game.player_faction.name,
cls.game.enemy_name, cls.game.enemy_faction.name,
cls.current_mission.country(cls.game.player_country), cls.current_mission.country(cls.game.player_country),
cls.current_mission.country(cls.game.enemy_country), cls.current_mission.country(cls.game.enemy_country),
front_line, front_line,

View File

@ -110,16 +110,3 @@ class Settings:
new_state = Settings().__dict__ new_state = Settings().__dict__
new_state.update(state) new_state.update(state)
self.__dict__.update(new_state) self.__dict__.update(new_state)
@dataclass
class ModSettings:
# Aircraft Mods
a4_skyhawk: bool = False
f22_raptor: bool = False
hercules: bool = False
jas39_gripen: bool = False
su57_felon: bool = False
# Ground Asset Mods
frenchpack: bool = False
high_digit_sams: bool = False

View File

@ -49,7 +49,7 @@ from . import (
OffMapSpawn, OffMapSpawn,
) )
from ..profiling import logged_duration from ..profiling import logged_duration
from ..settings import ModSettings, Settings from ..settings import Settings
GroundObjectTemplates = Dict[str, Dict[str, Any]] GroundObjectTemplates = Dict[str, Dict[str, Any]]
@ -78,11 +78,22 @@ class GeneratorSettings:
no_enemy_navy: bool no_enemy_navy: bool
@dataclass
class ModSettings:
a4_skyhawk: bool = False
f22_raptor: bool = False
hercules: bool = False
jas39_gripen: bool = False
su57_felon: bool = False
frenchpack: bool = False
high_digit_sams: bool = False
class GameGenerator: class GameGenerator:
def __init__( def __init__(
self, self,
player: str, player: Faction,
enemy: str, enemy: Faction,
theater: ConflictTheater, theater: ConflictTheater,
settings: Settings, settings: Settings,
generator_settings: GeneratorSettings, generator_settings: GeneratorSettings,
@ -101,14 +112,13 @@ class GameGenerator:
namegen.reset() namegen.reset()
self.prepare_theater() self.prepare_theater()
game = Game( game = Game(
player_name=self.player, player_faction=self.player.apply_mod_settings(self.mod_settings),
enemy_name=self.enemy, enemy_faction=self.enemy.apply_mod_settings(self.mod_settings),
theater=self.theater, theater=self.theater,
start_date=self.generator_settings.start_date, start_date=self.generator_settings.start_date,
settings=self.settings, settings=self.settings,
player_budget=self.generator_settings.player_budget, player_budget=self.generator_settings.player_budget,
enemy_budget=self.generator_settings.enemy_budget, enemy_budget=self.generator_settings.enemy_budget,
mod_settings=self.mod_settings,
) )
GroundObjectGenerator(game, self.generator_settings).generate() GroundObjectGenerator(game, self.generator_settings).generate()
@ -162,9 +172,9 @@ class ControlPointGroundObjectGenerator:
@property @property
def faction_name(self) -> str: def faction_name(self) -> str:
if self.control_point.captured: if self.control_point.captured:
return self.game.player_name return self.game.player_faction.name
else: else:
return self.game.enemy_name return self.game.enemy_faction.name
@property @property
def faction(self) -> Faction: def faction(self) -> Faction:

View File

@ -19,8 +19,8 @@ from game.data.weapons import (
Weapon, Weapon,
) )
from game.profiling import logged_duration from game.profiling import logged_duration
from game.settings import ModSettings, Settings from game.settings import Settings
from game.theater.start_generator import GameGenerator, GeneratorSettings from game.theater.start_generator import GameGenerator, GeneratorSettings, ModSettings
from qt_ui import ( from qt_ui import (
liberation_install, liberation_install,
liberation_theme, liberation_theme,

View File

@ -24,8 +24,8 @@ class QFactionsInfos(QGroupBox):
def setGame(self, game: Game): def setGame(self, game: Game):
if game is not None: if game is not None:
self.player_name.setText(game.player_name) self.player_name.setText(game.player_faction.name)
self.enemy_name.setText(game.enemy_name) self.enemy_name.setText(game.enemy_faction.name)
else: else:
self.player_name.setText("") self.player_name.setText("")
self.enemy_name.setText("") self.enemy_name.setText("")

View File

@ -267,8 +267,8 @@ class QTopPanel(QFrame):
closest_cps[0], closest_cps[0],
closest_cps[1], closest_cps[1],
self.game.theater.controlpoints[0].position, self.game.theater.controlpoints[0].position,
self.game.player_name, self.game.player_faction.name,
self.game.enemy_name, self.game.enemy_faction.name,
) )
unit_map = self.game.initiate_event(game_event) unit_map = self.game.initiate_event(game_event)

View File

@ -10,8 +10,9 @@ from PySide2.QtWidgets import QVBoxLayout, QTextEdit, QLabel, QCheckBox
from jinja2 import Environment, FileSystemLoader, select_autoescape from jinja2 import Environment, FileSystemLoader, select_autoescape
from game import db from game import db
from game.settings import Settings, ModSettings from game.settings import Settings
from game.theater.start_generator import GameGenerator, GeneratorSettings from game.theater.start_generator import GameGenerator, GeneratorSettings, ModSettings
from game.factions.faction import Faction
from qt_ui.widgets.QLiberationCalendar import QLiberationCalendar from qt_ui.widgets.QLiberationCalendar import QLiberationCalendar
from qt_ui.widgets.spinsliders import TenthsSpinSlider, TimeInputs, CurrencySpinner from qt_ui.widgets.spinsliders import TenthsSpinSlider, TimeInputs, CurrencySpinner
from qt_ui.windows.newgame.QCampaignList import ( from qt_ui.windows.newgame.QCampaignList import (
@ -112,8 +113,8 @@ class NewGameWizard(QtWidgets.QWizard):
high_digit_sams=self.field("high_digit_sams"), high_digit_sams=self.field("high_digit_sams"),
) )
blue_faction = [c for c in db.FACTIONS][self.field("blueFaction")] blue_faction = self.faction_selection_page.selected_blue_faction
red_faction = [c for c in db.FACTIONS][self.field("redFaction")] red_faction = self.faction_selection_page.selected_red_faction
generator = GameGenerator( generator = GameGenerator(
blue_faction, blue_faction,
red_faction, red_faction,
@ -258,6 +259,14 @@ class FactionSelection(QtWidgets.QWizardPage):
self.blueFactionDescription.setText(blue_faction_txt) self.blueFactionDescription.setText(blue_faction_txt)
self.redFactionDescription.setText(red_faction_txt) self.redFactionDescription.setText(red_faction_txt)
@property
def selected_blue_faction(self) -> Faction:
return db.FACTIONS[self.blueFactionSelect.currentText()]
@property
def selected_red_faction(self) -> Faction:
return db.FACTIONS[self.redFactionSelect.currentText()]
class TheaterConfiguration(QtWidgets.QWizardPage): class TheaterConfiguration(QtWidgets.QWizardPage):
def __init__( def __init__(

View File

@ -0,0 +1,79 @@
{
"country": "France",
"name": "France 1985",
"authors": "Colonel Panic",
"description": "<p>1980s French equipment using FrenchPack.</p>",
"locales": [
"fr_FR"
],
"doctrine": "coldwar",
"aircrafts": [
"Mirage 2000C",
"SA 342L Gazelle",
"SA 342M Gazelle",
"SA 342M Gazelle Mistral"
],
"awacs": [
"E-3A"
],
"tankers": [
"KC-130",
"KC-135 Stratotanker"
],
"frontline_units": [
"AMX.30B2",
"Leclerc S\u00e9ries 2",
"Leclerc S\u00e9ries 2",
"Pamela",
"Panhard",
"Roland 2 (Marder Chassis)",
"VAB .50",
"VAB Mephisto",
"VAB T20/13",
"VBL .50",
"VBL AANF1"
],
"artillery_units": [
"M109A6 Paladin",
"M270 Multiple Launch Rocket System"
],
"logistics_units": [
"Truck M818 6x6"
],
"infantry_units": [
"Infantry M249",
"Infantry M4",
"MANPADS Stinger"
],
"air_defenses": [
"RolandGenerator",
"HawkGenerator"
],
"aircraft_carrier": [],
"helicopter_carrier": [
"LHA_Tarawa"
],
"destroyers": [
"USS_Arleigh_Burke_IIa"
],
"cruisers": [
"TICONDEROG"
],
"requirements": {
"frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974"
},
"carrier_names": [
"R91 Charles de Gaulle"
],
"helicopter_carrier_names": [
"R97 Jeanne d'Arc",
"L9013 Mistral",
"L9014 Tonerre",
"L9015 Dixmude"
],
"navy_generators": [
"ArleighBurkeGroupGenerator"
],
"has_jtac": true,
"jtac_unit": "SA 342L Gazelle"
}

View File

@ -0,0 +1,86 @@
{
"country": "France",
"name": "France 2005",
"authors": "HerrTom",
"description": "<p>French equipment using the Frenchpack, but without the Rafale mod.</p>",
"locales": [
"fr_FR"
],
"aircrafts": [
"Mirage 2000-5",
"Mirage 2000C",
"SA 342L Gazelle",
"SA 342M Gazelle",
"SA 342M Gazelle Mistral"
],
"awacs": [
"E-2C Hawkeye",
"E-3A"
],
"tankers": [
"KC-130",
"KC-135 Stratotanker"
],
"frontline_units": [
"AMX.30B2",
"Leclerc S\u00e9ries 2",
"Leclerc S\u00e9ries 2",
"Leclerc_XXI",
"Pamela",
"Panhard",
"Roland 2 (Marder Chassis)",
"VAB .50",
"VAB Mephisto",
"VAB T20/13",
"VAB T20/13",
"VBAE CRAB",
"VBAE CRAB MMP",
"VBL .50",
"VBL AANF1"
],
"artillery_units": [
"M109A6 Paladin",
"M270 Multiple Launch Rocket System"
],
"logistics_units": [
"Truck M818 6x6"
],
"infantry_units": [
"Infantry M249",
"Infantry M4",
"MANPADS Stinger"
],
"air_defenses": [
"RolandGenerator",
"HawkGenerator"
],
"aircraft_carrier": [
"Stennis"
],
"helicopter_carrier": [
"LHA_Tarawa"
],
"destroyers": [
"USS_Arleigh_Burke_IIa"
],
"cruisers": [
"TICONDEROG"
],
"requirements": {
"frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974"
},
"carrier_names": [
"R91 Charles de Gaulle"
],
"helicopter_carrier_names": [
"R97 Jeanne d'Arc",
"L9013 Mistral",
"L9014 Tonerre",
"L9015 Dixmude"
],
"navy_generators": [
"ArleighBurkeGroupGenerator"
],
"has_jtac": true,
"jtac_unit": "MQ-9 Reaper"
}

View File

@ -0,0 +1,52 @@
{
"country": "Sweden",
"name": "Sweden 2002",
"authors": "Khopa (updated with Gripen by bgreman)",
"description": "<p>Sweden in 2002 after the addition of the Gripen-C.</p>",
"locales": [
"sv_SE"
],
"aircrafts": [
"AJS-37 Viggen",
"JAS 39 Gripen",
"JAS 39 Gripen A/G",
"UH-1H Iroquois"
],
"awacs": [
"E-3A"
],
"tankers": [
"KC-130",
"KC-135 Stratotanker"
],
"frontline_units": [
"FV510 Warrior",
"Leopard 2A4",
"M1097 Heavy HMMWV Avenger",
"M1126 Stryker ICV (M2 HMG)"
],
"artillery_units": [],
"logistics_units": [
"Truck M818 6x6"
],
"infantry_units": [
"Infantry M249",
"Infantry M4",
"MANPADS Stinger"
],
"air_defenses": [
"AvengerGenerator",
"HawkGenerator"
],
"ewrs": [
"HawkEwrGenerator"
],
"navy_generators": [
"OliverHazardPerryGroupGenerator"
],
"requirements": {
"JAS39 Gripen Mod by Community": "https://github.com/whisky-actual/Community-JAS-39-C"
},
"has_jtac": true,
"jtac_unit": "MQ-9 Reaper"
}