From 7d2dd0bcbeb880db5e1996170ad9b7e070130f14 Mon Sep 17 00:00:00 2001 From: MetalStormGhost <89945461+MetalStormGhost@users.noreply.github.com> Date: Tue, 13 Dec 2022 20:08:56 +0200 Subject: [PATCH] Add option to only generate night missions (#36) Replaces the existing checkbox to disable night missions with a selector that allows you to choose between Day/Night/Day&Night --- changelog.md | 1 + game/settings/settings.py | 12 +++++++++--- game/weather.py | 23 +++++++++++++++++++---- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/changelog.md b/changelog.md index 86d113d7..604a4f98 100644 --- a/changelog.md +++ b/changelog.md @@ -12,6 +12,7 @@ * **[Mission Generation]** Use Escort & SEAD tasks for Escort & SEAD Escort flights * **[Mission Generation]** Variable flight-size (2/3/4-ship) for BAI/ANTISHIP/DEAD/STRIKE/BARCAP/CAS/OCA/AIR-ASSAULT (main) missions +* **[Mission Generation]** Add option to only generate night missions * **[Modding]** Support for F-15D 'Baz' mod version 1.0 * **[Modding]** Support for Su-30 mod version 2.01B * **[Modding]** Support for A-6A Intruder version 2.7.5.01 diff --git a/game/settings/settings.py b/game/settings/settings.py index 556be28b..0fa94c6a 100644 --- a/game/settings/settings.py +++ b/game/settings/settings.py @@ -14,6 +14,7 @@ from .minutesoption import minutes_option from .optiondescription import OptionDescription, SETTING_DESCRIPTION_KEY from .skilloption import skill_option from ..ato.starttype import StartType +from ..weather import NightMissions @unique @@ -105,11 +106,16 @@ class Settings: section=MISSION_DIFFICULTY_SECTION, default=True, ) - night_disabled: bool = boolean_option( - "No night missions", + night_day_missions: NightMissions = choices_option( + "Night/day mission options", page=DIFFICULTY_PAGE, section=MISSION_DIFFICULTY_SECTION, - default=False, + choices={ + "Generate night and day missions": NightMissions.DayAndNight, + "Only generate day missions": NightMissions.OnlyDay, + "Only generate night missions": NightMissions.OnlyNight, + }, + default=NightMissions.DayAndNight, ) # Mission Restrictions labels: str = choices_option( diff --git a/game/weather.py b/game/weather.py index 22deb6c7..b1e52187 100644 --- a/game/weather.py +++ b/game/weather.py @@ -5,6 +5,7 @@ import logging import math import random from dataclasses import dataclass, field +from enum import Enum from typing import Optional, TYPE_CHECKING from dcs.cloud_presets import Clouds as PydcsClouds @@ -28,6 +29,12 @@ if TYPE_CHECKING: from game.theater.seasonalconditions import SeasonalConditions +class NightMissions(Enum): + DayAndNight = "nightmissions_nightandday" + OnlyDay = "nightmissions_onlyday" + OnlyNight = "nightmissions_onlynight" + + @dataclass(frozen=True) class AtmosphericConditions: #: Pressure at sea level. @@ -424,7 +431,7 @@ class Conditions: _start_time = datetime.datetime.combine(day, forced_time) else: _start_time = cls.generate_start_time( - theater, day, time_of_day, settings.night_disabled + theater, day, time_of_day, settings.night_day_missions ) return cls( @@ -439,11 +446,11 @@ class Conditions: theater: ConflictTheater, day: datetime.date, time_of_day: TimeOfDay, - night_disabled: bool, + night_day_missions: NightMissions, ) -> datetime.datetime: - if night_disabled: - from game.theater import DaytimeMap + from game.theater import DaytimeMap + if night_day_missions == NightMissions.OnlyDay: logging.info("Skip Night mission due to user settings") time_range = DaytimeMap( dawn=(datetime.time(hour=8), datetime.time(hour=9)), @@ -451,6 +458,14 @@ class Conditions: dusk=(datetime.time(hour=12), datetime.time(hour=14)), night=(datetime.time(hour=14), datetime.time(hour=17)), ).range_of(time_of_day) + elif night_day_missions == NightMissions.OnlyNight: + logging.info("Skip Day mission due to user settings") + time_range = DaytimeMap( + dawn=(datetime.time(hour=0), datetime.time(hour=3)), + day=(datetime.time(hour=3), datetime.time(hour=6)), + dusk=(datetime.time(hour=21), datetime.time(hour=22)), + night=(datetime.time(hour=22), datetime.time(hour=23)), + ).range_of(time_of_day) else: time_range = theater.daytime_map.range_of(time_of_day)