From 7a5361c0577ee7f0fdd5f6914aa81608ab75fca1 Mon Sep 17 00:00:00 2001 From: Vasyl Horbachenko Date: Mon, 10 Sep 2018 01:38:50 +0300 Subject: [PATCH] minor updates and strike mission objects expand --- game/event/event.py | 8 +++-- game/event/strike.py | 4 +++ gen/briefinggen.py | 4 +-- gen/environmentgen.py | 2 +- gen/groundobjectsgen.py | 2 ++ resources/cau_groundobjects.p | Bin 7332 -> 15162 bytes resources/tools/cau_groundobjects.miz | Bin 15096 -> 22598 bytes resources/tools/generate_groundobjectsmap.py | 19 +++++++++++- theater/theatergroundobject.py | 4 +++ ui/eventmenu.py | 29 +++++++++++++------ ui/eventresultsmenu.py | 1 + ui/newgamemenu.py | 3 ++ ui/overviewcanvas.py | 6 ++-- 13 files changed, 64 insertions(+), 18 deletions(-) diff --git a/game/event/event.py b/game/event/event.py index c5bb75b8..db39a61a 100644 --- a/game/event/event.py +++ b/game/event/event.py @@ -50,11 +50,15 @@ class Event: def threat_description(self) -> str: return "" - def flight_name(self, for_task: typing.Type[Task]) -> str: + def flight_name(self, for_task: typing.Type[typing.Type[Task]]) -> str: return "Flight" @property - def tasks(self) -> typing.Collection[Task]: + def tasks(self) -> typing.Collection[typing.Type[Task]]: + return [] + + @property + def ai_banned_tasks(self) -> typing.Collection[typing.Type[Task]]: return [] def bonus(self) -> int: diff --git a/game/event/strike.py b/game/event/strike.py index 9c65353d..50a50152 100644 --- a/game/event/strike.py +++ b/game/event/strike.py @@ -29,6 +29,10 @@ class StrikeEvent(Event): else: return [CAP] + @property + def ai_banned_tasks(self): + return [CAS] + def flight_name(self, for_task: typing.Type[Task]) -> str: if for_task == CAP: if self.is_player_attacking: diff --git a/gen/briefinggen.py b/gen/briefinggen.py index 851fe3fd..468d0d8e 100644 --- a/gen/briefinggen.py +++ b/gen/briefinggen.py @@ -37,12 +37,12 @@ class BriefingGenerator: description += "\n\n" + self.description if self.freqs: - description += "\n\n RADIO:" + description += "\n\nCOMMS:" for name, freq in self.freqs: description += "\n{}: {}".format(name, freq) if self.targets: - description += "\n\n TARGETS:" + description += "\n\nTARGETS:" for name, tp in self.targets: description += "\n{} {}".format(name, "(TP {})".format(tp) if tp else "") diff --git a/gen/environmentgen.py b/gen/environmentgen.py index 6f1a3cdd..4c3db832 100644 --- a/gen/environmentgen.py +++ b/gen/environmentgen.py @@ -49,7 +49,7 @@ class EnviromentGenerator: self.game = game def _gen_random_time(self): - start_time = datetime.combine(datetime.today(), time()) + start_time = datetime.fromtimestamp(1527206400) time_range = None for k, v in RANDOM_TIME.items(): if self.game.settings.night_disabled and k == "night": diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index ccbd4220..558c4c31 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -14,6 +14,8 @@ CATEGORY_MAPPING = { "fuel": [Warehouse.Tank], "ammo": [Warehouse.Ammunition_depot], "farp": [Fortification.FARP_Tent], + "comms": [Fortification.TV_tower], + "oil": [Fortification.Oil_platform], } diff --git a/resources/cau_groundobjects.p b/resources/cau_groundobjects.p index 1cf0d8a63764de57843579f3fe077553998cf70e..54012b234c00f1914abf4c6f96fb2ca2c9547d01 100644 GIT binary patch literal 15162 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 literal 7332 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 IE=F_Ezc@Klv;Y7A diff --git a/resources/tools/cau_groundobjects.miz b/resources/tools/cau_groundobjects.miz index 6f1976f4f218edd3eedca6537a247454a7b31f1f..87eef17a472cb92137d6cff23809faa9a89d104d 100644 GIT binary patch delta 20558 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 delta 13001 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 typing.Tuple: args = str(name.split()[0]).split("|") + if len(args) == 2: + global group_id_counter + group_id_counter += 1 + args.append(str(group_id_counter)) + else: + global previous_group_id + if previous_group_id != args[2]: + group_id_counter += 1 + previous_group_id = args[2] + return args[0], int(args[1]), int(args[2]) @@ -46,9 +59,11 @@ for group in m.country("Russia").static_group + m.country("Russia").vehicle_grou ids_counters_key = "{}_{}".format(cp_id, group_id) ids_counters[ids_counters_key] = ids_counters.get(ids_counters_key, 0) + 1 object_id = ids_counters[ids_counters_key] + cp_counters[cp_id] = cp_counters.get(cp_id, 0) + 1 + append_group(cp_id, category, group_id, object_id, group.position, group.units[0].heading) -GROUP_TRESHOLD = 300 +GROUP_TRESHOLD = 2000 did_check_pairs = [] for group_id, objects_in_group in result_by_groups.items(): for a in objects_in_group: @@ -62,6 +77,8 @@ for group_id, objects_in_group in result_by_groups.items(): print("Objects {} and {} in group {} are too far apart ({})!".format(a.string_identifier, b.string_identifier, group_id, distance)) print("Total {} objects".format(sum([len(x) for x in result.values()]))) +for cp_id, count in cp_counters.items(): + print("{} - {} objects".format(cp_id, count)) with open("../cau_groundobjects.p", "wb") as f: diff --git a/theater/theatergroundobject.py b/theater/theatergroundobject.py index 1dc30230..3e091fa2 100644 --- a/theater/theatergroundobject.py +++ b/theater/theatergroundobject.py @@ -9,6 +9,8 @@ NAME_BY_CATEGORY = { "defense": "AA Defense Site", "warehouse": "Warehouse", "farp": "FARP", + "comms": "Comms. tower", + "oil": "Oil platform" } ABBREV_NAME = { @@ -18,6 +20,8 @@ ABBREV_NAME = { "defense": "AA", "warehouse": "WARE", "farp": "FARP", + "comms": "COMMST", + "oil": "OILP" } diff --git a/ui/eventmenu.py b/ui/eventmenu.py index a7893cd9..d8d4b027 100644 --- a/ui/eventmenu.py +++ b/ui/eventmenu.py @@ -38,10 +38,10 @@ class EventMenu(Menu): Label(head, text=text, **STYLES[style]).grid() row += 1 - def label(text, _row=None, _column=None, sticky=None): + def label(text, _row=None, _column=None, columnspan=None, sticky=None): nonlocal row new_label = Label(self.frame, text=text, **STYLES["widget"]) - new_label.grid(row=_row and _row or row, column=_column and _column or 0, sticky=sticky) + new_label.grid(row=_row and _row or row, column=_column and _column or 0, columnspan=columnspan, sticky=sticky) if _row is None: row += 1 @@ -105,7 +105,7 @@ class EventMenu(Menu): row += 1 header("Ready?") - self.error_label = label("") + self.error_label = label("", columnspan=4) self.error_label["fg"] = RED Button(self.frame, text="Commit", command=self.start, **STYLES["btn-primary"]).grid(column=0, row=row, sticky=E, padx=5, pady=(10,10)) Button(self.frame, text="Back", command=self.dismiss, **STYLES["btn-warning"]).grid(column=3, row=row, sticky=E, padx=5, pady=(10,10)) @@ -141,15 +141,18 @@ class EventMenu(Menu): self.event.is_awacs_enabled = False flights = {k: {} for k in self.event.tasks} # type: ScrambledFlightsDict - total_counts_scrambled = {} # type: typing.Dict[typing.Type[UnitType], int] + units_scramble_counts = {} # type: typing.Dict[typing.Type[UnitType], int] + tasks_scramble_counts = {} # type: typing.Dict[typing.Type[Task], int] + tasks_clients_counts = {} # type: typing.Dict[typing.Type[Task], int] - def dampen_count(unit_type: typing.Type[UnitType], count: int) -> int: - nonlocal total_counts_scrambled + def dampen_count(for_task: typing.Type[Task], unit_type: typing.Type[UnitType], count: int) -> int: + nonlocal units_scramble_counts total_count = self.base.total_units_of_type(unit_type) - total_scrambled = total_counts_scrambled.get(unit_type, 0) + total_scrambled = units_scramble_counts.get(unit_type, 0) dampened_value = count if count + total_scrambled < total_count else total_count - total_scrambled - total_counts_scrambled[unit_type] = total_counts_scrambled.get(unit_type, 0) + dampened_value + units_scramble_counts[unit_type] = units_scramble_counts.get(unit_type, 0) + dampened_value + return dampened_value for task_type, dict in self.scramble_entries.items(): @@ -164,8 +167,16 @@ class EventMenu(Menu): except: clients_count = 0 - flights[task_type][unit_type] = dampen_count(unit_type, count), clients_count + dampened_count = dampen_count(task_type, unit_type, count) + tasks_clients_counts[task_type] = tasks_clients_counts.get(task_type, 0) + clients_count + tasks_scramble_counts[task_type] = tasks_scramble_counts.get(task_type, 0) + dampened_count + flights[task_type][unit_type] = dampened_count, clients_count + + for task in self.event.ai_banned_tasks: + if tasks_clients_counts.get(task, 0) == 0 and tasks_scramble_counts.get(task, 0) > 0: + self.error_label["text"] = "Need at least one player in flight {}".format(self.event.flight_name(task)) + return if self.game.is_player_attack(self.event): self.event.player_attacking(flights) diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index b611b594..5f4e3ec9 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -78,6 +78,7 @@ class EventResultsMenu(Menu): header("Operation failed", "title-red") header("Player losses") + for unit_type, count in self.player_losses.items(): Label(self.frame, text=db.unit_type_name(unit_type), **STYLES["widget"]).grid(row=row) Label(self.frame, text="{}".format(count), **STYLES["widget"]).grid(column=1, row=row) diff --git a/ui/newgamemenu.py b/ui/newgamemenu.py index 8f34db6d..e30d3df2 100644 --- a/ui/newgamemenu.py +++ b/ui/newgamemenu.py @@ -98,6 +98,9 @@ class NewGameMenu(Menu): Label(terrain, text="Persian Gulf", **STYLES["widget"]).grid(row=2, column=1, sticky=W) self.create_label_image(terrain, "terrain_pg.png").grid(row=2, column=2, padx=5) + Label(terrain, text="Currently strike missions are only\navailable for a number of airports only in Caucasus", **STYLES["widget"]) \ + .grid(row=3, column=0, columnspan=3, sticky=W) + # Misc Options options = LabelFrame(body, text="Misc Options", **STYLES["label-frame"]) options.grid(row=0, column=2, sticky=NE, padx=5) diff --git a/ui/overviewcanvas.py b/ui/overviewcanvas.py index 5a56f101..d1323b06 100644 --- a/ui/overviewcanvas.py +++ b/ui/overviewcanvas.py @@ -99,7 +99,7 @@ class OverviewCanvas: color = self._enemy_color() cp_id = self.canvas.create_arc((coords[0] - arc_size/2, coords[1] - arc_size/2), - (coords[0]+arc_size/2, coords[1]+arc_size/2), + (coords[0] + arc_size/2, coords[1] + arc_size/2), fill=color, style=PIESLICE, start=start, @@ -118,8 +118,8 @@ class OverviewCanvas: self.create_cp_title((coords[0] + arc_size/4, coords[1] + arc_size/4), cp) units_title = "{}/{}/{}".format(cp.base.total_planes, cp.base.total_armor, cp.base.total_aa) - self.canvas.create_text(coords[0]+1, coords[1] - arc_size / 1.5 +1, text=units_title, font=("Helvetica", 10), fill=color) - self.canvas.create_text(coords[0], coords[1] - arc_size / 1.5, text=units_title, font=("Helvetica", 10), fill="white") + self.canvas.create_text(coords[0]+1, coords[1] - arc_size / 1.5 +1, text=units_title, font=("Helvetica", 8), fill=color) + self.canvas.create_text(coords[0], coords[1] - arc_size / 1.5, text=units_title, font=("Helvetica", 8), fill="white") def display(self, cp: ControlPoint): def action(_):