diff --git a/.idea/dcs_pmcliberation.iml b/.idea/dcs_pmcliberation.iml index 1f377c84..9eedabcf 100644 --- a/.idea/dcs_pmcliberation.iml +++ b/.idea/dcs_pmcliberation.iml @@ -4,7 +4,7 @@ - + diff --git a/.idea/misc.xml b/.idea/misc.xml index 65531ca9..e524f659 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/__init__.py b/__init__.py index 16993968..d0f0f4d5 100755 --- a/__init__.py +++ b/__init__.py @@ -10,6 +10,7 @@ import ui.window import ui.mainmenu from game.game import Game +from theater import start_generator from theater.controlpoint import * from dcs.planes import * @@ -17,6 +18,8 @@ from dcs.vehicles import * m = dcs.Mission() theater = theater.caucasus.CaucasusTheater() + +start_generator.generate_initial(theater, "Russia") theater.kutaisi.base.aircraft = { F_15C: 4, A_10C: 2, diff --git a/game/event.py b/game/event.py index 79b26ca4..cb23bbf0 100644 --- a/game/event.py +++ b/game/event.py @@ -71,7 +71,7 @@ class GroundInterceptEvent(Event): else: pass - def player_attacking(self, position: Point, strikegroup: typing.Dict[PlaneType, int]): + def player_attacking(self, position: Point, strikegroup: db.PlaneDict, clients: db.PlaneDict): suitable_unittypes = db.find_unittype(CAP, self.defender.name) random.shuffle(suitable_unittypes) unittypes = suitable_unittypes[:self.TARGET_VARIETY] @@ -81,6 +81,8 @@ class GroundInterceptEvent(Event): self.operation = GroundInterceptOperation(mission=self.mission, attacker=self.attacker, defender=self.defender, + attacker_clients=clients, + defender_clients={}, position=position, target=targets, strikegroup=strikegroup) @@ -105,7 +107,7 @@ class InterceptEvent(Event): if self.to_cp.captured: self.to_cp.base.affect_strength(-self.STRENGTH_INFLUENCE) - def player_attacking(self, interceptors: typing.Dict[PlaneType, int]): + def player_attacking(self, interceptors: db.PlaneDict, clients: db.PlaneDict): escort = self.to_cp.base.scramble_sweep(self.to_cp) transport_unit = random.choice(db.find_unittype(Transport, self.defender.name)) assert transport_unit is not None @@ -113,13 +115,15 @@ class InterceptEvent(Event): self.operation = InterceptOperation(mission=self.mission, attacker=self.attacker, defender=self.defender, + attacker_clients=clients, + defender_clients={}, destination=self.to_cp, destination_port=self.to_cp.airport, escort=escort, transport={transport_unit: 1}, interceptors=interceptors) - def player_defending(self, escort: typing.Dict[PlaneType, int]): + def player_defending(self, escort: db.PlaneDict, clients: db.PlaneDict): interceptors = self.from_cp.base.scramble_interceptors_count(self.difficulty * self.ESCORT_AMOUNT_FACTOR) transport_unit = random.choice(db.find_unittype(Transport, self.defender.name)) assert transport_unit is not None @@ -127,6 +131,8 @@ class InterceptEvent(Event): self.operation = InterceptOperation(mission=self.mission, attacker=self.attacker, defender=self.defender, + attacker_clients={}, + defender_clients=clients, destination=self.to_cp, destination_port=self.to_cp.airport, escort=escort, @@ -156,7 +162,7 @@ class CaptureEvent(Event): if self.to_cp.captured: self.to_cp.captured = False - def player_defending(self, interceptors: typing.Dict[PlaneType, int]): + def player_defending(self, interceptors: db.PlaneDict, clients: db.PlaneDict): cas = self.from_cp.base.scramble_cas(self.to_cp) escort = self.from_cp.base.scramble_sweep(self.to_cp) attackers = self.from_cp.base.assemble_cap(self.to_cp) @@ -164,6 +170,8 @@ class CaptureEvent(Event): self.operation = CaptureOperation(mission=self.mission, attacker=self.attacker, defender=self.defender, + attacker_clients={}, + defender_clients=clients, from_cp=self.from_cp, to_cp=self.to_cp, cas=cas, @@ -173,12 +181,14 @@ class CaptureEvent(Event): defense=self.to_cp.base.armor, aa=self.to_cp.base.aa) - def player_attacking(self, cas: typing.Dict[PlaneType, int], escort: typing.Dict[PlaneType, int], armor: typing.Dict[Armor, int]): + def player_attacking(self, cas: db.PlaneDict, escort: db.PlaneDict, armor: db.ArmorDict, clients: db.PlaneDict): interceptors = self.to_cp.base.scramble_sweep(for_target=self.to_cp) self.operation = CaptureOperation(mission=self.mission, attacker=self.attacker, defender=self.defender, + attacker_clients=clients, + defender_clients={}, from_cp=self.from_cp, to_cp=self.to_cp, cas=cas, diff --git a/game/operation.py b/game/operation.py index c311c1e4..23232449 100644 --- a/game/operation.py +++ b/game/operation.py @@ -8,6 +8,7 @@ from dcs.vehicles import * from theater.controlpoint import * from theater.conflicttheater import * from theater.base import * +from shop import * from gen.armor import * from gen.aircraft import * @@ -38,19 +39,23 @@ class CaptureOperation(Operation): mission: Mission, attacker: Country, defender: Country, + attacker_clients: db.PlaneDict, + defender_clients: db.PlaneDict, from_cp: ControlPoint, to_cp: ControlPoint, - cas: typing.Dict[PlaneType, int], - escort: typing.Dict[PlaneType, int], - attack: typing.Dict[Armor, int], - intercept: typing.Dict[PlaneType, int], - defense: typing.Dict[Armor, int], - aa: typing.Dict[AirDefence, int]): + cas: db.PlaneDict, + escort: db.PlaneDict, + attack: db.ArmorDict, + intercept: db.PlaneDict, + defense: db.ArmorDict, + aa: db.AADict): conflict = to_cp.conflict_attack(from_cp, attacker, defender) super(CaptureOperation, self).__init__(mission, conflict) self.from_cp = from_cp self.to_cp = to_cp + self.attacker_clients = attacker_clients + self.defender_clients = defender_clients self.cas = cas self.escort = escort self.intercept = intercept @@ -62,9 +67,9 @@ class CaptureOperation(Operation): def generate(self): self.armorgen.generate(self.attack, self.defense) - self.airgen.generate_cas(self.cas) - self.airgen.generate_cas_escort(self.escort) - self.airgen.generate_defense(self.intercept) + self.airgen.generate_cas(self.cas, clients=self.attacker_clients) + self.airgen.generate_cas_escort(self.escort, clients=self.attacker_clients) + self.airgen.generate_defense(self.intercept, clients=self.defender_clients) self.aagen.generate(self.aa) @@ -73,11 +78,13 @@ class InterceptOperation(Operation): mission: Mission, attacker: Country, defender: Country, + attacker_clients: db.PlaneDict, + defender_clients: db.PlaneDict, destination: ControlPoint, destination_port: Airport, - escort: typing.Dict[PlaneType, int], - transport: typing.Dict[PlaneType, int], - interceptors: typing.Dict[PlaneType, int]): + escort: db.PlaneDict, + transport: db.PlaneDict, + interceptors: db.PlaneDict): conflict = Conflict.intercept_conflict( attacker=attacker, defender=defender, @@ -88,14 +95,16 @@ class InterceptOperation(Operation): super(InterceptOperation, self).__init__(mission, conflict) self.destination_port = destination_port + self.attacker_clients = attacker_clients + self.defender_clients = defender_clients self.escort = escort self.transport = transport self.interceptors = interceptors def generate(self): self.airgen.generate_transport(self.transport, self.destination_port) - self.airgen.generate_transport_escort(self.escort) - self.airgen.generate_interception(self.interceptors) + self.airgen.generate_transport_escort(self.escort, clients=self.defender_clients) + self.airgen.generate_interception(self.interceptors, clients=self.attacker_clients) class GroundInterceptOperation(Operation): @@ -103,9 +112,11 @@ class GroundInterceptOperation(Operation): mission: Mission, attacker: Country, defender: Country, + attacker_clients: db.PlaneDict, + defender_clients: db.PlaneDict, position: Point, - target: typing.Dict[VehicleType, int], - strikegroup: typing.Dict[PlaneType, int]): + target: db.ArmorDict, + strikegroup: db.PlaneDict): conflict = Conflict.ground_intercept_conflict( attacker=attacker, defender=defender, @@ -115,10 +126,12 @@ class GroundInterceptOperation(Operation): ) super(GroundInterceptOperation, self).__init__(mission, conflict) + self.attacker_clients = attacker_clients + self.defender_clients = defender_clients self.strikegroup = strikegroup self.target = target def generate(self): - self.airgen.generate_cas(self.strikegroup) + self.airgen.generate_cas(self.strikegroup, clients=self.attacker_clients) self.armorgen.generate({}, self.target) diff --git a/gen/aircraft.py b/gen/aircraft.py index b1fdbe65..fa0f5b95 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -6,6 +6,7 @@ from random import randint import globals +from shop import db from .conflictgen import * from .naming import * @@ -48,38 +49,44 @@ class AircraftConflictGenerator: self, name: str, side: Country, - unit: UnitType, + unit: PlaneType, count: int, + client_count: int, at: Point = None, - airport: Airport = None) -> PlaneGroup: - starttype = airport == None and StartType.Warm or StartType.Cold - print("generating {} ({}) at {} {}".format(unit, count, at, airport, side)) + airport: Airport = None) -> FlyingGroup: + starttype = airport is None and StartType.Warm or StartType.Cold assert count > 0 - return self.m.flight_group( - country=side, - name=name, - aircraft_type=unit, - airport=airport, - position=at, - altitude=WARM_START_ALTITUDE, - speed=WARM_START_AIRSPEED, - maintask=None, - start_type=starttype, - group_size=count) + group = self.m.flight_group( + country=side, + name=name, + aircraft_type=unit, + airport=airport, + position=at, + altitude=WARM_START_ALTITUDE, + speed=WARM_START_AIRSPEED, + maintask=None, + start_type=starttype, + group_size=count) - def _generate_escort(self, units: typing.Dict[PlaneType, int], airport: Airport, side: Country, location: Point): + for idx in range(client_count): + group.units[idx].set_client() + + return group + + def _generate_escort(self, units: db.PlaneDict, clients: db.PlaneDict, airport: Airport, side: Country, location: Point): if len(self.escort_targets) == 0: return for type, count in units.items(): group = self._generate_group( - name=namegen.next_escort_group_name(), - side=side, - unit=type, - count=count, - at=location, - airport=airport) + name=namegen.next_escort_group_name(), + side=side, + unit=type, + count=count, + client_count=clients.get(type, 0), + at=location, + airport=airport) group.task = Escort.name group.load_task_default_loadout(dcs.task.Escort) @@ -91,7 +98,7 @@ class AircraftConflictGenerator: for group in self.escort_targets: wayp.tasks.append(EscortTaskAction(group.id, engagement_max_dist=ESCORT_MAX_DIST)) - def generate_cas(self, attackers: typing.Dict[PlaneType, int], airport: Airport = None): + def generate_cas(self, attackers: db.PlaneDict, clients: db.PlaneDict, airport: Airport = None): assert len(self.escort_targets) == 0 for type, count in attackers.items(): @@ -100,6 +107,7 @@ class AircraftConflictGenerator: side=self.conflict.attackers_side, unit=type, count=count, + client_count=clients.get(type, 0), at=airport is None and self._group_point(self.conflict.air_attackers_location) or None, airport=airport) self.escort_targets.append(group) @@ -108,29 +116,32 @@ class AircraftConflictGenerator: group.task = CAS.name group.load_task_default_loadout(CAS) - def generate_cas_escort(self, attackers: typing.Dict[PlaneType, int], airport: Airport = None): + def generate_cas_escort(self, attackers: db.PlaneDict, clients: db.PlaneDict, airport: Airport = None): self._generate_escort( units=attackers, + clients=clients, airport=airport, side=self.conflict.attackers_side, location=airport is None and self._group_point(self.conflict.air_attackers_location) or None ) - def generate_transport_escort(self, escort: typing.Dict[PlaneType, int], airport: Airport = None): + def generate_transport_escort(self, escort: db.PlaneDict, clients: db.PlaneDict, airport: Airport = None): self._generate_escort( units=escort, + clients=clients, airport=airport, side=self.conflict.defenders_side, location=airport is None and self._group_point(self.conflict.air_defenders_location) or None ) - def generate_defense(self, defenders: typing.Dict[PlaneType, int], airport: Airport = None): + def generate_defense(self, defenders: db.PlaneDict, clients: db.PlaneDict, airport: Airport = None): for type, count in defenders.items(): group = self._generate_group( name=namegen.next_intercept_group_name(), side=self.conflict.defenders_side, unit=type, count=count, + client_count=clients.get(type, 0), at=airport is None and self._group_point(self.conflict.air_defenders_location) or None, airport=airport) @@ -140,7 +151,7 @@ class AircraftConflictGenerator: wayp.tasks.append(dcs.task.EngageTargets(max_distance=self.conflict.size * INTERCEPT_MAX_DISTANCE_FACTOR)) wayp.tasks.append(dcs.task.OrbitAction()) - def generate_transport(self, transport: typing.Dict[PlaneType, int], destination: Airport): + def generate_transport(self, transport: db.PlaneDict, destination: Airport): assert len(self.escort_targets) == 0 for type, count in transport.items(): @@ -149,6 +160,7 @@ class AircraftConflictGenerator: side=self.conflict.defenders_side, unit=type, count=count, + client_count=0, at=self._group_point(self.conflict.air_defenders_location), airport=None ) @@ -158,13 +170,14 @@ class AircraftConflictGenerator: self.escort_targets.append(group) group.land_at(destination) - def generate_interception(self, interceptors: typing.Dict[PlaneType, int], airport: Airport = None): + def generate_interception(self, interceptors: db.PlaneDict, clients: db.PlaneDict, airport: Airport = None): for type, count in interceptors.items(): group = self._generate_group( name=namegen.next_intercept_group_name(), side=self.conflict.attackers_side, unit=type, count=count, + client_count=clients.get(type, 0), at=airport is None and self._group_point(self.conflict.air_attackers_location) or None, airport=airport ) diff --git a/gen/armor.py b/gen/armor.py index c6789cd6..61319f9b 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -6,6 +6,7 @@ from random import randint import globals +from shop import db from .conflictgen import * from .naming import * @@ -21,6 +22,7 @@ from dcs.country import * SPREAD_DISTANCE_FACTOR = 0.1, 0.3 SPREAD_DISTANCE_SIZE_FACTOR = 0.1 + class ArmorConflictGenerator: def __init__(self, mission: Mission, conflict: Conflict): self.m = mission @@ -34,7 +36,7 @@ class ArmorConflictGenerator: return point.random_point_within(distance, self.conflict.size * SPREAD_DISTANCE_SIZE_FACTOR) - def _generate_group(self, side: Country, unit: UnitType, count: int, at: Point): + def _generate_group(self, side: Country, unit: VehicleType, count: int, at: Point): for c in range(count): group = self.m.vehicle_group( side, @@ -46,7 +48,7 @@ class ArmorConflictGenerator: wayp = group.add_waypoint(self.conflict.position) wayp.tasks = [] - def generate(self, attackers: typing.Dict[UnitType, int], defenders: typing.Dict[UnitType, int]): + def generate(self, attackers: db.ArmorDict, defenders: db.ArmorDict): for type, count in attackers.items(): self._generate_group( side=self.conflict.attackers_side, diff --git a/gen/conflictgen.py b/gen/conflictgen.py index 797f1d83..85e0eb32 100644 --- a/gen/conflictgen.py +++ b/gen/conflictgen.py @@ -39,7 +39,7 @@ class Conflict: air_defenders_location = None # type: Point @classmethod - def capture_conflict(self, attacker: Country, attack_heading: int, defender: Country, defense_heading: int, position: Point, size: int, radials: typing.List[int]): + def capture_conflict(self, attacker: Country, attack_heading: int, defender: Country, defense_heading: int, position: Point, size: int, radials: typing.Collection[int]): instance = self() instance.attackers_side = attacker instance.defenders_side = defender diff --git a/shop/db.py b/shop/db.py index def170cd..f1fc416a 100644 --- a/shop/db.py +++ b/shop/db.py @@ -40,21 +40,28 @@ PRICES = { Armor.ATGM_M1134_Stryker: 6, Armor.APC_BTR_80: 6, + + AirDefence.AAA_ZU_23_on_Ural_375: 4, } UNIT_BY_TASK = { FighterSweep: [Su_27, Su_33, Su_25, F_15C, MiG_15bis, MiG_21Bis, MiG_29A, ], CAS: [Su_25T, A_10A, A_10C, ], CAP: [Armor.MBT_T_90, Armor.MBT_T_80U, Armor.MBT_T_55, Armor.MBT_M1A2_Abrams, Armor.MBT_M60A3_Patton, Armor.ATGM_M1134_Stryker, Armor.APC_BTR_80, ], - AirDefence: [AirDefence.AAA_ZU_23_on_Ural_375, ], + AirDefence: [AirDefence.AAA_ZU_23_on_Ural_375, ], Transport: [IL_76MD, S_3B_Tanker, ], } UNIT_BY_COUNTRY = { - "Russia": [Su_25T, A_10C, Su_27, Su_33, Su_25, MiG_15bis, MiG_21Bis, MiG_29A, AirDefence.AAA_ZU_23_on_Ural_375, Armor.APC_BTR_80, Armor.MBT_T_90, Armor.MBT_T_80U, Armor.MBT_T_55, IL_76MD, ], +"Russia": [Su_25T, Su_27, Su_33, Su_25, MiG_15bis, MiG_21Bis, MiG_29A, AirDefence.AAA_ZU_23_on_Ural_375, Armor.APC_BTR_80, Armor.MBT_T_90, Armor.MBT_T_80U, Armor.MBT_T_55, IL_76MD, ], "USA": [F_15C, A_10C, Armor.MBT_M1A2_Abrams, Armor.MBT_M60A3_Patton, Armor.ATGM_M1134_Stryker, S_3B_Tanker], } +UnitsDict = typing.Dict[UnitType, int] +PlaneDict = typing.Dict[PlaneType, int] +ArmorDict = typing.Dict[VehicleType, int] +AADict = typing.Dict[AirDefence, int] + def unit_task(unit: UnitType) -> Task: for task, units in UNIT_BY_TASK.items(): diff --git a/theater/caucasus.py b/theater/caucasus.py index 08d31105..aaae9885 100644 --- a/theater/caucasus.py +++ b/theater/caucasus.py @@ -3,6 +3,7 @@ from dcs.terrain import caucasus from .conflicttheater import * from .base import * + class CaucasusTheater(ConflictTheater): kutaisi = ControlPoint(caucasus.Kutaisi, ALL_RADIALS, SIZE_SMALL, IMPORTANCE_LOW) senaki = ControlPoint(caucasus.Senaki, ALL_RADIALS, SIZE_REGULAR, IMPORTANCE_LOW) diff --git a/theater/start_generator.py b/theater/start_generator.py index 22cc9779..c46577d4 100644 --- a/theater/start_generator.py +++ b/theater/start_generator.py @@ -3,9 +3,33 @@ import random import dcs +from shop import db from theater.controlpoint import * from theater.base import * from theater.conflicttheater import * -def generate_initial(theater: ConflictTheater): - pass +UNIT_VARIETY = 2 +UNIT_AMOUNT_FACTOR = 1 + + +def generate_initial(theater: ConflictTheater, enemy: str): + for cp in theater.enemy_bases(): + if cp.captured: + continue + + for task in [CAP, FighterSweep, CAS, AirDefence]: + suitable_unittypes = db.find_unittype(task, enemy) + suitable_unittypes.sort(key=lambda x: db.PRICES[x]) + + importance = cp.importance * 10 - 10 + units_idx_start = int(importance * UNIT_VARIETY) + units_idx_end = units_idx_start + UNIT_VARIETY + + range_start = min(len(suitable_unittypes)-1, units_idx_start) + range_end = min(len(suitable_unittypes), units_idx_end) + unittypes = suitable_unittypes[range_start:range_end] + + typecount = max(math.floor(importance * UNIT_AMOUNT_FACTOR), 1) + units = {unittype: typecount for unittype in unittypes} + print("{} - {}".format(cp.name, units)) + cp.base.commision_units(units) diff --git a/ui/basemenu.py b/ui/basemenu.py index 23dbd7d8..678eed3e 100644 --- a/ui/basemenu.py +++ b/ui/basemenu.py @@ -62,7 +62,11 @@ class BaseMenu(Menu): def sell(self, unit_type): def action(): - if self.base.total_units_of_type(unit_type) > 0: + if self.event.units.get(unit_type, 0) > 0: + price = db.PRICES[unit_type] + self.game.budget += price + self.event.units[unit_type] = self.event.units[unit_type] - 1 + elif self.base.total_units_of_type(unit_type) > 0: price = db.PRICES[unit_type] self.game.budget += price self.base.commit_losses({unit_type: 1}) diff --git a/ui/eventmenu.py b/ui/eventmenu.py index 2effff4b..1e1827d2 100644 --- a/ui/eventmenu.py +++ b/ui/eventmenu.py @@ -2,13 +2,15 @@ from tkinter import * from ui.window import * from ui.eventresultsmenu import * +from shop import db from game.game import * from game import event class EventMenu(Menu): - aircraft_scramble_entries = None # type: typing.Dict[PlaneType, Entry] - armor_scramble_entries = None # type: typing.Dict[Armor, Entry] + aircraft_scramble_entries = None # type: typing.Dict[PlaneType , Entry] + aircraft_client_entries = None # type: typing.Dict[PlaneType, Entry] + armor_scramble_entries = None # type: typing.Dict[VehicleType, Entry] def __init__(self, window: Window, parent, game: Game, event: event.Event): super(EventMenu, self).__init__(window, parent, game) @@ -16,6 +18,7 @@ class EventMenu(Menu): self.event = event self.aircraft_scramble_entries = {} self.armor_scramble_entries = {} + self.aircraft_client_entries = {} self.frame = self.window.right_pane @@ -31,11 +34,24 @@ class EventMenu(Menu): def scrable_row(unit_type, unit_count): nonlocal row - Label(self.frame, text="{} ({})".format(unit_type.id and unit_type.id or unit_type.name, unit_count)).grid(row=row) - e = Entry(self.frame) - e.grid(column=1, row=row) + Label(self.frame, text="{} ({})".format(db.unit_type_name(unit_type), unit_count)).grid(row=row) + scramble_entry = Entry(self.frame) + scramble_entry.grid(column=1, row=row) + self.aircraft_scramble_entries[unit_type] = scramble_entry + + client_entry = Entry(self.frame) + client_entry.grid(column=2, row=row) + self.aircraft_client_entries[unit_type] = client_entry + + row += 1 + + def scramble_armor_row(unit_type, unit_count): + nonlocal row + Label(self.frame, text="{} ({})".format(db.unit_type_name(unit_type), unit_count)).grid(row=row) + scramble_entry = Entry(self.frame) + scramble_entry.grid(column=1, row=row) + self.armor_scramble_entries[unit_type] = scramble_entry - self.aircraft_scramble_entries[unit_type] = e row += 1 base = None # type: Base @@ -48,8 +64,12 @@ class EventMenu(Menu): for unit_type, count in base.aircraft.items(): scrable_row(unit_type, count) - Button(self.frame, text="Commit", command=self.start).grid(row=row) - Button(self.frame, text="Back", command=self.dismiss).grid(row=row) + label("Armor") + for unit_type, count in base.armor.items(): + scramble_armor_row(unit_type, count) + + Button(self.frame, text="Commit", command=self.start).grid(column=0, row=row) + Button(self.frame, text="Back", command=self.dismiss).grid(column=2, row=row) def start(self): scrambled_aircraft = {} @@ -67,6 +87,13 @@ class EventMenu(Menu): elif task == FighterSweep: scrambled_sweep[unit_type] = amount + scrambled_clients = {} + for unit_type, field in self.aircraft_client_entries.items(): + value = field.get() + if value and int(value) > 0: + amount = int(value) + scrambled_clients[unit_type] = amount + scrambled_armor = {} for unit_type, field in self.armor_scramble_entries.items(): value = field.get() @@ -78,18 +105,22 @@ class EventMenu(Menu): if self.game.is_player_attack(self.event): e.player_attacking(cas=scrambled_cas, escort=scrambled_sweep, - armor=scrambled_armor) + armor=scrambled_armor, + clients=scrambled_clients) else: - e.player_defending(interceptors=scrambled_aircraft) + e.player_defending(interceptors=scrambled_aircraft, + clients=scrambled_clients) elif type(self.event) is InterceptEvent: e = self.event # type: InterceptEvent if self.game.is_player_attack(self.event): - e.player_attacking(interceptors=scrambled_aircraft) + e.player_attacking(interceptors=scrambled_aircraft, + clients=scrambled_clients) else: - e.player_defending(escort=scrambled_aircraft) + e.player_defending(escort=scrambled_aircraft, + clients=scrambled_clients) elif type(self.event) is GroundInterceptEvent: e = self.event # type: GroundInterceptEvent - e.player_attacking(e.to_cp.position.random_point_within(30000), strikegroup=scrambled_aircraft) + e.player_attacking(e.to_cp.position.random_point_within(30000), strikegroup=scrambled_aircraft, clients=scrambled_clients) self.game.initiate_event(self.event) EventResultsMenu(self.window, self.parent, self.game, self.event).display() diff --git a/ui/mainmenu.py b/ui/mainmenu.py index 74957d46..be03dd02 100644 --- a/ui/mainmenu.py +++ b/ui/mainmenu.py @@ -44,12 +44,10 @@ class MainMenu(Menu): Button(self.frame, text=title, command=self.go_cp(cp)).grid(row=row, sticky=NW) row += 1 - statusbar = Frame(self.frame).grid(column=0, row=row, sticky=NSEW) + Label(self.frame, text="Budget: {}m".format(self.game.budget)).grid(column=0, row=0, sticky=NW) + Button(self.frame, text="Pass turn", command=self.pass_turn).grid(column=1, row=0, sticky=NE) row += 1 - Label(statusbar, text="Budget: {}m".format(self.game.budget)).grid(column=0, row=0, sticky=NW) - Button(statusbar, text="Pass turn", command=self.pass_turn).grid(column=1, row=0, sticky=NE) - for event in self.game.events: if not event.informational: continue