diff --git a/game/event/capture.py b/game/event/capture.py index d7ff5f37..aebe930a 100644 --- a/game/event/capture.py +++ b/game/event/capture.py @@ -18,9 +18,6 @@ class CaptureEvent(Event): def __str__(self): return "Attack from {} to {}".format(self.from_cp, self.to_cp) - def bonus(self): - return - @property def threat_description(self): descr = "{} aircraft + CAS, {} vehicles".format( diff --git a/game/event/event.py b/game/event/event.py index 21c880c7..7a846cc7 100644 --- a/game/event/event.py +++ b/game/event/event.py @@ -5,6 +5,7 @@ from theater import * from gen.environmentgen import EnvironmentSettings from userdata.debriefing import Debriefing +from userdata import persistency DIFFICULTY_LOG_BASE = 1.1 @@ -52,7 +53,7 @@ class Event: self.operation.prepare(self.game.theater.terrain, is_quick=False) self.operation.generate() - self.operation.mission.save("build/nextturn.miz") + self.operation.mission.save(persistency.mission_path_for("liberation_nextturn.miz")) self.environment_settings = self.operation.environment_settings def generate_quick(self): @@ -61,7 +62,7 @@ class Event: self.operation.prepare(self.game.theater.terrain, is_quick=True) self.operation.generate() - self.operation.mission.save('build/nextturn_quick.miz') + self.operation.mission.save(persistency.mission_path_for("liberation_nextturn_quick.miz")) def commit(self, debriefing: Debriefing): for country, losses in debriefing.destroyed_units.items(): diff --git a/game/game.py b/game/game.py index d2c07db8..fe1f4450 100644 --- a/game/game.py +++ b/game/game.py @@ -157,7 +157,7 @@ class Game: awarded_points = COMMISION_AMOUNTS_FACTORS[for_task] * math.pow(cp.importance, COMMISION_AMOUNTS_SCALE) * self.settings.multiplier points_to_spend = cp.base.append_commision_points(for_task, awarded_points) if points_to_spend > 0: - unittypes = self._commision_unit_types(cp, for_task) + unittypes = self.commision_unit_types(cp, for_task) d = {random.choice(unittypes): points_to_spend} print("Commision {}: {}".format(cp, d)) cp.base.commision_units(d) diff --git a/game/operation/infantrytransport.py b/game/operation/infantrytransport.py index 1c980137..2b259758 100644 --- a/game/operation/infantrytransport.py +++ b/game/operation/infantrytransport.py @@ -45,6 +45,7 @@ class InfantryTransportOperation(Operation): self.visualgen.generate_transportation_marker(self.conflict.ground_attackers_location) self.visualgen.generate_transportation_destination(self.conflict.position) + # TODO: horrible, horrible hack # this will disable vehicle activation triggers, # which aren't needed on this type of missions self.is_quick = True diff --git a/gen/aircraft.py b/gen/aircraft.py index a727174f..1dc7566b 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -10,7 +10,7 @@ from dcs.task import * from dcs.terrain.terrain import NoParkingSlotError SPREAD_DISTANCE_FACTOR = 1, 2 -ESCORT_MAX_DIST = 30000 +ESCORT_MAX_DIST = 80000 WORKAROUND_WAYP_DIST = 1000 WARM_START_ALTITUDE = 4600 @@ -20,7 +20,7 @@ RTB_ALTITUDE = 4600 TRANSPORT_LANDING_ALT = 4600 HELI_ALT = 900 -WARM_START_AIRSPEED = 540 +WARM_START_AIRSPEED = 550 INTERCEPTION_AIRSPEED = 1000 INTERCEPT_MAX_DISTANCE = 80000 @@ -117,7 +117,7 @@ class AircraftConflictGenerator: airport=None, position=pos, altitude=alt, - speed=WARM_START_AIRSPEED + random.randint(500, 3000), + speed=WARM_START_AIRSPEED, maintask=None, start_type=StartType.Warm, group_size=count) diff --git a/gen/conflictgen.py b/gen/conflictgen.py index 343c3b91..a0b5fe06 100644 --- a/gen/conflictgen.py +++ b/gen/conflictgen.py @@ -87,8 +87,11 @@ class Conflict: @classmethod def _find_ground_location(cls, initial: Point, max_distance: int, heading: int, theater: ConflictTheater) -> Point: for _ in range(0, int(max_distance), 800): - if theater.is_on_land(initial): - return initial + for _ in range(3): + if theater.is_on_land(initial): + return initial + + initial = initial.random_point_within(1000, 1000) initial = initial.point_from_heading(heading, 800) diff --git a/gen/environmentgen.py b/gen/environmentgen.py index eb0d0259..6b739fd3 100644 --- a/gen/environmentgen.py +++ b/gen/environmentgen.py @@ -28,8 +28,8 @@ RANDOM_TIME = { RANDOM_WEATHER = { 1: 5, # heavy rain - 2: 20, # rain - 3: 30, # dynamic + 2: 30, # rain + 3: 40, # dynamic 4: 50, # clear 5: 100, # random } diff --git a/gen/triggergen.py b/gen/triggergen.py index a0720fd7..3eef5404 100644 --- a/gen/triggergen.py +++ b/gen/triggergen.py @@ -52,6 +52,7 @@ class TriggersGenerator: activation_trigger_zone = self.mission.triggers.add_triggerzone(self.conflict.position, zone_size, name="Activation zone") activation_trigger = TriggerOnce(Event.NoEvent, "Activation trigger") activation_trigger.add_condition(PartOfCoalitionInZone(player_coalition, activation_trigger_zone.id)) + activation_trigger.add_condition(FlagIsTrue()) for group in activate_by_trigger: activation_trigger.add_action(ActivateGroup(group.id)) @@ -94,6 +95,7 @@ class TriggersGenerator: push_trigger.add_action(AITaskPush(group.id, 1)) message_string = self.mission.string("Task force is in the air, proceed with the objective.") push_trigger.add_action(MessageToAll(message_string, clearview=True)) + push_trigger.add_action(SetFlagValue()) self.mission.triggerrules.triggers.append(push_trigger) diff --git a/ui/eventmenu.py b/ui/eventmenu.py index e5e4c571..6538d9e6 100644 --- a/ui/eventmenu.py +++ b/ui/eventmenu.py @@ -132,7 +132,8 @@ class EventMenu(Menu): def client_one(self, unit_type: UnitType) -> typing.Callable: def action(): entry = self.aircraft_client_entries[unit_type] # type: Entry - amount = int(entry.get()) + value = entry.get() + amount = int(value and value or "0") entry.delete(0, END) entry.insert(0, str(amount+1)) return action diff --git a/ui/eventresultsmenu.py b/ui/eventresultsmenu.py index caad0b26..b5624b99 100644 --- a/ui/eventresultsmenu.py +++ b/ui/eventresultsmenu.py @@ -35,7 +35,8 @@ class EventResultsMenu(Menu): Button(self.frame, text="full losses, fail", command=self.simulate_result(1, 0)).grid(row=3, column=1) """ - Label(self.frame, text="Play the mission and save debriefing to {}".format(debriefing_directory_location())).grid(row=0, column=0) + Label(self.frame, text="Play the mission and save debriefing to").grid(row=0, column=0) + Label(self.frame, text=debriefing_directory_location()).grid(row=1, column=0) else: row = 0 if self.event.is_successfull(self.debriefing): diff --git a/userdata/debriefing.py b/userdata/debriefing.py index e857e608..87d2adc9 100644 --- a/userdata/debriefing.py +++ b/userdata/debriefing.py @@ -90,8 +90,9 @@ class Debriefing: enemy.name: self.alive_units.get(enemy.id, {}), } + def debriefing_directory_location() -> str: - return "build/debriefing" + return os.path.expanduser("~\Saved Games\DCS") def _logfiles_snapshot() -> typing.Dict[str, float]: @@ -108,11 +109,19 @@ def _poll_new_debriefing_log(snapshot: typing.Dict[str, float], callback: typing while should_run: for file, timestamp in _logfiles_snapshot().items(): if file not in snapshot or timestamp != snapshot[file]: - callback(Debriefing.parse(os.path.join(debriefing_directory_location(), file))) + for _ in range(0, 3): + # some solid programming going on in here + try: + debriefing = Debriefing.parse(os.path.join(debriefing_directory_location(), file)) + break + except: + time.sleep(3) + + callback(debriefing) should_run = False break - time.sleep(1) + time.sleep(3) def wait_for_debriefing(callback: typing.Callable): diff --git a/userdata/persistency.py b/userdata/persistency.py index 9b99cbaa..85096cda 100644 --- a/userdata/persistency.py +++ b/userdata/persistency.py @@ -3,22 +3,24 @@ import pickle import os import shutil -from game.game import Game - def _save_file() -> str: - return "build/save" + return os.path.expanduser("~\Saved Games\DCS\liberation_save") def _temporary_save_file() -> str: - return "build/save_tmp" + return os.path.expanduser("~\Saved Games\DCS\liberation_save_tmp") def _save_file_exists() -> bool: return os.path.exists(_save_file()) -def restore_game() -> typing.Optional[Game]: +def mission_path_for(name: str) -> str: + return os.path.expanduser("~\Saved Games\DCS\Missions\{}".format(name)) + + +def restore_game(): if not _save_file_exists(): return None @@ -30,7 +32,7 @@ def restore_game() -> typing.Optional[Game]: return None -def save_game(game: Game) -> bool: +def save_game(game) -> bool: try: with open(_temporary_save_file(), "wb") as f: pickle.dump(game, f)