mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
fix save compat
This commit is contained in:
@@ -105,6 +105,15 @@ class Coalition:
|
||||
return state
|
||||
|
||||
def __setstate__(self, state: dict[str, Any]) -> None:
|
||||
# Migration: Convert old boolean player values to Player enum
|
||||
if "player" in state and isinstance(state["player"], bool):
|
||||
from game.theater.player import Player
|
||||
|
||||
if state["player"]:
|
||||
state["player"] = Player.BLUE
|
||||
else:
|
||||
state["player"] = Player.RED
|
||||
|
||||
self.__dict__.update(state)
|
||||
# Regenerate any state that was not persisted.
|
||||
self.on_load()
|
||||
|
||||
@@ -56,7 +56,7 @@ https://en.wikipedia.org/wiki/Hierarchical_task_network
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import TYPE_CHECKING
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
from game.ato.starttype import StartType
|
||||
from game.commander.tasks.compound.nextaction import PlanNextAction
|
||||
@@ -80,6 +80,18 @@ class TheaterCommander(Planner[TheaterState, TheaterCommanderTask]):
|
||||
self.game = game
|
||||
self.player = player
|
||||
|
||||
def __setstate__(self, state: dict[str, Any]) -> None:
|
||||
# Migration: Convert old boolean player values to Player enum
|
||||
if "player" in state and isinstance(state["player"], bool):
|
||||
from game.theater.player import Player
|
||||
|
||||
if state["player"]:
|
||||
state["player"] = Player.BLUE
|
||||
else:
|
||||
state["player"] = Player.RED
|
||||
|
||||
self.__dict__.update(state)
|
||||
|
||||
def plan_missions(self, now: datetime, tracer: MultiEventTracer) -> None:
|
||||
state = TheaterState.from_game(self.game, self.player, now, tracer)
|
||||
while True:
|
||||
|
||||
@@ -321,7 +321,7 @@ class MissionResultsProcessor:
|
||||
settings = cp.coalition.game.settings
|
||||
factor = (
|
||||
settings.frontline_reserves_factor
|
||||
if cp.captured
|
||||
if cp.captured.is_blue
|
||||
else settings.frontline_reserves_factor_red
|
||||
)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import itertools
|
||||
from collections import defaultdict
|
||||
from typing import Iterator, Optional, Sequence, TYPE_CHECKING
|
||||
from typing import Iterator, Optional, Sequence, TYPE_CHECKING, Any
|
||||
|
||||
from game.ato.closestairfields import ObjectiveDistanceCache
|
||||
from game.dcs.aircrafttype import AircraftType
|
||||
@@ -27,6 +27,18 @@ class AirWing:
|
||||
self.squadron_def_generator = SquadronDefGenerator(faction)
|
||||
self.settings = game.settings
|
||||
|
||||
def __setstate__(self, state: dict[str, Any]) -> None:
|
||||
# Migration: Convert old boolean player values to Player enum
|
||||
if "player" in state and isinstance(state["player"], bool):
|
||||
from game.theater.player import Player
|
||||
|
||||
if state["player"]:
|
||||
state["player"] = Player.BLUE
|
||||
else:
|
||||
state["player"] = Player.RED
|
||||
|
||||
self.__dict__.update(state)
|
||||
|
||||
def unclaim_squadron_def(self, squadron: Squadron) -> None:
|
||||
if squadron.aircraft in self.squadron_defs:
|
||||
for squadron_def in self.squadron_defs[squadron.aircraft]:
|
||||
|
||||
@@ -15,6 +15,7 @@ from faker import Faker
|
||||
from game.ato import Flight, FlightType, Package
|
||||
from game.settings import AutoAtoBehavior, Settings
|
||||
from game.theater import ParkingType
|
||||
from game.theater.player import Player
|
||||
from .pilot import Pilot, PilotStatus
|
||||
from ..db.database import Database
|
||||
from ..radio.radios import RadioFrequency
|
||||
@@ -24,7 +25,7 @@ if TYPE_CHECKING:
|
||||
from game import Game
|
||||
from game.coalition import Coalition
|
||||
from game.dcs.aircrafttype import AircraftType
|
||||
from game.theater import ControlPoint, MissionTarget, Player
|
||||
from game.theater import ControlPoint, MissionTarget
|
||||
from .operatingbases import OperatingBases
|
||||
from .squadrondef import SquadronDef
|
||||
|
||||
|
||||
@@ -38,7 +38,16 @@ from collections import defaultdict
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from functools import singledispatchmethod
|
||||
from typing import Generic, Iterator, List, Optional, Sequence, TYPE_CHECKING, TypeVar
|
||||
from typing import (
|
||||
Any,
|
||||
Generic,
|
||||
Iterator,
|
||||
List,
|
||||
Optional,
|
||||
Sequence,
|
||||
TYPE_CHECKING,
|
||||
TypeVar,
|
||||
)
|
||||
|
||||
from dcs.mapping import Point
|
||||
|
||||
@@ -246,10 +255,7 @@ class Airlift(Transport):
|
||||
|
||||
@property
|
||||
def player_owned(self) -> bool:
|
||||
if self.transfer.player.is_blue:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
return self.transfer.player.is_blue
|
||||
|
||||
def find_escape_route(self) -> Optional[ControlPoint]:
|
||||
# TODO: Move units to closest base.
|
||||
@@ -395,10 +401,9 @@ class MultiGroupTransport(MissionTarget, Transport):
|
||||
self.transfers: List[TransferOrder] = []
|
||||
|
||||
def is_friendly(self, to_player: Player) -> bool:
|
||||
if self.origin.captured.is_blue:
|
||||
if self.origin.captured == to_player:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
return False
|
||||
|
||||
def add_units(self, transfer: TransferOrder) -> None:
|
||||
self.transfers.append(transfer)
|
||||
@@ -590,6 +595,18 @@ class PendingTransfers:
|
||||
self.cargo_ships = CargoShipMap()
|
||||
self.pending_transfers: List[TransferOrder] = []
|
||||
|
||||
def __setstate__(self, state: dict[str, Any]) -> None:
|
||||
# Migration: Convert old boolean player values to Player enum
|
||||
if "player" in state and isinstance(state["player"], bool):
|
||||
from game.theater.player import Player
|
||||
|
||||
if state["player"]:
|
||||
state["player"] = Player.BLUE
|
||||
else:
|
||||
state["player"] = Player.RED
|
||||
|
||||
self.__dict__.update(state)
|
||||
|
||||
def __iter__(self) -> Iterator[TransferOrder]:
|
||||
yield from self.pending_transfers
|
||||
|
||||
|
||||
Reference in New Issue
Block a user