mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
568 lines
10 KiB
Python
568 lines
10 KiB
Python
from __future__ import annotations
|
|
|
|
import random
|
|
import time
|
|
from typing import List, Any, TYPE_CHECKING
|
|
|
|
from dcs.country import Country
|
|
|
|
from game.dcs.aircrafttype import AircraftType
|
|
from game.dcs.unittype import UnitType
|
|
|
|
if TYPE_CHECKING:
|
|
from game.ato.flight import Flight
|
|
|
|
ALPHA_MILITARY = [
|
|
"Alpha",
|
|
"Bravo",
|
|
"Charlie",
|
|
"Delta",
|
|
"Echo",
|
|
"Foxtrot",
|
|
"Golf",
|
|
"Hotel",
|
|
"India",
|
|
"Juliet",
|
|
"Kilo",
|
|
"Lima",
|
|
"Mike",
|
|
"November",
|
|
"Oscar",
|
|
"Papa",
|
|
"Quebec",
|
|
"Romeo",
|
|
"Sierra",
|
|
"Tango",
|
|
"Uniform",
|
|
"Victor",
|
|
"Whisky",
|
|
"XRay",
|
|
"Yankee",
|
|
"Zulu",
|
|
"Zero",
|
|
]
|
|
|
|
ANIMALS: tuple[str, ...] = (
|
|
"AARDVARK",
|
|
"AARDWOLF",
|
|
"ADDER",
|
|
"ALBACORE",
|
|
"ALBATROSS",
|
|
"ALLIGATOR",
|
|
"ALPACA",
|
|
"ANACONDA",
|
|
"ANOLE",
|
|
"ANTEATER",
|
|
"ANTELOPE",
|
|
"ANTLION",
|
|
"ARAPAIMA",
|
|
"ARCHERFISH",
|
|
"ARGALI",
|
|
"ARMADILLO",
|
|
"ASP",
|
|
"AUROCHS",
|
|
"AXOLOTL",
|
|
"BABIRUSA",
|
|
"BABOON",
|
|
"BADGER",
|
|
"BANDICOOT",
|
|
"BARRACUDA",
|
|
"BARRAMUNDI",
|
|
"BASILISK",
|
|
"BASS",
|
|
"BAT",
|
|
"BEAR",
|
|
"BEAVER",
|
|
"BEETLE",
|
|
"BELUGA",
|
|
"BETTONG",
|
|
"BINTURONG",
|
|
"BISON",
|
|
"BLOODHOUND",
|
|
"BOA",
|
|
"BOBCAT",
|
|
"BONGO",
|
|
"BONITO",
|
|
"BUFFALO",
|
|
"BULLDOG",
|
|
"BULLFROG",
|
|
"BULLSHARK",
|
|
"BUMBLEBEE",
|
|
"BUNNY",
|
|
"BUTTERFLY",
|
|
"CAIMAN",
|
|
"CAMEL",
|
|
"CANARY",
|
|
"CAPYBARA",
|
|
"CARACAL",
|
|
"CARP",
|
|
"CASTOR",
|
|
"CAT",
|
|
"CATERPILLAR",
|
|
"CATFISH",
|
|
"CENTIPEDE",
|
|
"CHAMELEON",
|
|
"CHEETAH",
|
|
"CHICKEN",
|
|
"CHIMAERA",
|
|
"CICADA",
|
|
"CICHLID",
|
|
"CIVET",
|
|
"COBIA",
|
|
"COBRA",
|
|
"COCKATOO",
|
|
"COD",
|
|
"COELACANTH",
|
|
"COLT",
|
|
"CONDOR",
|
|
"COPPERHEAD",
|
|
"CORAL",
|
|
"CORGI",
|
|
"COTTONMOUTH",
|
|
"COUGAR",
|
|
"COW",
|
|
"COYOTE",
|
|
"CRAB",
|
|
"CRANE",
|
|
"CRICKET",
|
|
"CROCODILE",
|
|
"CROW",
|
|
"CUTTLEFISH",
|
|
"DACHSHUND",
|
|
"DEER",
|
|
"DINGO",
|
|
"DIREWOLF",
|
|
"DODO",
|
|
"DOG",
|
|
"DOLPHIN",
|
|
"DONKEY",
|
|
"DOVE",
|
|
"DRACO",
|
|
"DRAGON",
|
|
"DRAGONFLY",
|
|
"DUCK",
|
|
"DUGONG",
|
|
"EAGLE",
|
|
"EARWIG",
|
|
"ECHIDNA",
|
|
"EEL",
|
|
"ELEPHANT",
|
|
"ELK",
|
|
"EMU",
|
|
"ERMINE",
|
|
"FALCON",
|
|
"FANGTOOTH",
|
|
"FAWN",
|
|
"FENNEC",
|
|
"FERRET",
|
|
"FINCH",
|
|
"FIREFLY",
|
|
"FISH",
|
|
"FLAMINGO",
|
|
"FLEA",
|
|
"FLOUNDER",
|
|
"FOX",
|
|
"FRINGEHEAD",
|
|
"FROG",
|
|
"FROGMOUTH",
|
|
"GAR",
|
|
"GAZELLE",
|
|
"GECKO",
|
|
"GENET",
|
|
"GERBIL",
|
|
"GHARIAL",
|
|
"GIBBON",
|
|
"GIRAFFE",
|
|
"GOOSE",
|
|
"GOPHER",
|
|
"GORILLA",
|
|
"GOSHAWK",
|
|
"GRASSHOPPER",
|
|
"GREYHOUND",
|
|
"GRIZZLY",
|
|
"GROUPER",
|
|
"GROUSE",
|
|
"GRYPHON",
|
|
"GUANACO",
|
|
"GULL",
|
|
"GUPPY",
|
|
"HADDOCK",
|
|
"HAGFISH",
|
|
"HALIBUT",
|
|
"HAMSTER",
|
|
"HARAMBE",
|
|
"HARE",
|
|
"HARRIER",
|
|
"HAWK",
|
|
"HEDGEHOG",
|
|
"HERMITCRAB",
|
|
"HERON",
|
|
"HERRING",
|
|
"HIPPO",
|
|
"HORNBILL",
|
|
"HORNET",
|
|
"HORSE",
|
|
"HUNTSMAN",
|
|
"HUSKY",
|
|
"HYENA",
|
|
"IBEX",
|
|
"IBIS",
|
|
"IGUANA",
|
|
"IMPALA",
|
|
"INSECT",
|
|
"IRUKANDJI",
|
|
"ISOPOD",
|
|
"JACKAL",
|
|
"JAGUAR",
|
|
"JELLYFISH",
|
|
"JERBOA",
|
|
"KAKAPO",
|
|
"KANGAROO",
|
|
"KATYDID",
|
|
"KEA",
|
|
"KINGFISHER",
|
|
"KITTEN",
|
|
"KIWI",
|
|
"KOALA",
|
|
"KOMODO",
|
|
"KRAIT",
|
|
"LADYBUG",
|
|
"LAMPREY",
|
|
"LEMUR",
|
|
"LEOPARD",
|
|
"LIGHTFOOT",
|
|
"LION",
|
|
"LIONFISH",
|
|
"LIZARD",
|
|
"LLAMA",
|
|
"LOACH",
|
|
"LOBSTER",
|
|
"LOCUST",
|
|
"LORIKEET",
|
|
"LUNGFISH",
|
|
"LYNX",
|
|
"MACAW",
|
|
"MAGPIE",
|
|
"MALLARD",
|
|
"MAMBA",
|
|
"MAMMOTH",
|
|
"MANATEE",
|
|
"MANDRILL",
|
|
"MANTA",
|
|
"MANTIS",
|
|
"MARE",
|
|
"MARLIN",
|
|
"MARMOT",
|
|
"MARTEN",
|
|
"MASTIFF",
|
|
"MASTODON",
|
|
"MAVERICK",
|
|
"MAYFLY",
|
|
"MEERKAT",
|
|
"MILLIPEDE",
|
|
"MINK",
|
|
"MOA",
|
|
"MOCKINGBIRD",
|
|
"MOLE",
|
|
"MOLERAT",
|
|
"MOLLY",
|
|
"MONGOOSE",
|
|
"MONKEY",
|
|
"MONKFISH",
|
|
"MONSTER",
|
|
"MOOSE",
|
|
"MORAY",
|
|
"MOSQUITO",
|
|
"MOTH",
|
|
"MOUSE",
|
|
"MUDSKIPPER",
|
|
"MULE",
|
|
"MUSK",
|
|
"MYNA",
|
|
"NARWHAL",
|
|
"NAUTILUS",
|
|
"NEWT",
|
|
"NIGHTINGALE",
|
|
"NUMBAT",
|
|
"OCELOT",
|
|
"OCTOPUS",
|
|
"OKAPI",
|
|
"OLM",
|
|
"OPAH",
|
|
"OPOSSUM",
|
|
"ORCA",
|
|
"ORYX",
|
|
"OSPREY",
|
|
"OSTRICH",
|
|
"OTTER",
|
|
"OWL",
|
|
"OX",
|
|
"OYSTER",
|
|
"PADDLEFISH",
|
|
"PADEMELON",
|
|
"PANDA",
|
|
"PANGOLIN",
|
|
"PANTHER",
|
|
"PARAKEET",
|
|
"PARROT",
|
|
"PEACOCK",
|
|
"PELICAN",
|
|
"PENGUIN",
|
|
"PERCH",
|
|
"PEREGRINE",
|
|
"PETRAL",
|
|
"PHEASANT",
|
|
"PIG",
|
|
"PIGEON",
|
|
"PIGLET",
|
|
"PIKE",
|
|
"PIRANHA",
|
|
"PLATYPUS",
|
|
"POODLE",
|
|
"PORCUPINE",
|
|
"PORPOISE",
|
|
"POSSUM",
|
|
"POTOROO",
|
|
"PRONGHORN",
|
|
"PUFFERFISH",
|
|
"PUFFIN",
|
|
"PUG",
|
|
"PUMA",
|
|
"PYTHON",
|
|
"QUAGGA",
|
|
"QUAIL",
|
|
"QUOKKA",
|
|
"QUOLL",
|
|
"RABBIT",
|
|
"RACOON",
|
|
"RAGDOLL",
|
|
"RAT",
|
|
"RATTLESNAKE",
|
|
"RAVEN",
|
|
"REINDEER",
|
|
"RHINO",
|
|
"ROACH",
|
|
"ROBIN",
|
|
"SABERTOOTH",
|
|
"SAILFISH",
|
|
"SALAMANDER",
|
|
"SALMON",
|
|
"SANDFLY",
|
|
"SARDINE",
|
|
"SAWFISH",
|
|
"SCARAB",
|
|
"SCORPION",
|
|
"SEAHORSE",
|
|
"SEAL",
|
|
"SEALION",
|
|
"SERVAL",
|
|
"SHARK",
|
|
"SHEEP",
|
|
"SHOEBILL",
|
|
"SHRIKE",
|
|
"SHRIMP",
|
|
"SIDEWINDER",
|
|
"SILKWORM",
|
|
"SKATE",
|
|
"SKINK",
|
|
"SKUNK",
|
|
"SLOTH",
|
|
"SLUG",
|
|
"SNAIL",
|
|
"SNAKE",
|
|
"SNAPPER",
|
|
"SNOOK",
|
|
"SPARROW",
|
|
"SPIDER",
|
|
"SPRINGBOK",
|
|
"SQUID",
|
|
"SQUIRREL",
|
|
"STAGHORN",
|
|
"STARFISH",
|
|
"STINGRAY",
|
|
"STINKBUG",
|
|
"STOUT",
|
|
"STURGEON",
|
|
"SUGARGLIDER",
|
|
"SUNBEAR",
|
|
"SWALLOW",
|
|
"SWAN",
|
|
"SWIFT",
|
|
"SWORDFISH",
|
|
"TAIPAN",
|
|
"TAKAHE",
|
|
"TAMARIN",
|
|
"TANG",
|
|
"TAPIR",
|
|
"TARANTULA",
|
|
"TARPON",
|
|
"TARSIER",
|
|
"TAURUS",
|
|
"TERMITE",
|
|
"TERRIER",
|
|
"TETRA",
|
|
"THRUSH",
|
|
"THYLACINE",
|
|
"TIGER",
|
|
"TOAD",
|
|
"TORTOISE",
|
|
"TOUCAN",
|
|
"TREADFIN",
|
|
"TREVALLY",
|
|
"TRIGGERFISH",
|
|
"TROUT",
|
|
"TUATARA",
|
|
"TUNA",
|
|
"TURKEY",
|
|
"TURTLE",
|
|
"URCHIN",
|
|
"VIPER",
|
|
"VULTURE",
|
|
"WALLABY",
|
|
"WALLAROO",
|
|
"WALLEYE",
|
|
"WALRUS",
|
|
"WARTHOG",
|
|
"WASP",
|
|
"WATERBUCK",
|
|
"WEASEL",
|
|
"WEEVIL",
|
|
"WEKA",
|
|
"WHALE",
|
|
"WILDCAT",
|
|
"WILDEBEEST",
|
|
"WOLF",
|
|
"WOLFHOUND",
|
|
"WOLVERINE",
|
|
"WOMBAT",
|
|
"WOODCHUCK",
|
|
"WOODPECKER",
|
|
"WORM",
|
|
"WRASSE",
|
|
"WYVERN",
|
|
"YAK",
|
|
"ZEBRA",
|
|
"ZEBU",
|
|
)
|
|
|
|
|
|
class NameGenerator:
|
|
number = 0
|
|
infantry_number = 0
|
|
aircraft_number = 0
|
|
convoy_number = 0
|
|
cargo_ship_number = 0
|
|
|
|
animals: list[str] = list(ANIMALS)
|
|
existing_alphas: List[str] = []
|
|
|
|
@classmethod
|
|
def reset(cls) -> None:
|
|
cls.number = 0
|
|
cls.infantry_number = 0
|
|
cls.convoy_number = 0
|
|
cls.cargo_ship_number = 0
|
|
cls.animals = list(ANIMALS)
|
|
cls.existing_alphas = []
|
|
|
|
@classmethod
|
|
def reset_numbers(cls) -> None:
|
|
cls.number = 0
|
|
cls.infantry_number = 0
|
|
cls.aircraft_number = 0
|
|
cls.convoy_number = 0
|
|
cls.cargo_ship_number = 0
|
|
|
|
@classmethod
|
|
def next_aircraft_name(
|
|
cls, country: Country, parent_base_id: int, flight: Flight
|
|
) -> str:
|
|
cls.aircraft_number += 1
|
|
try:
|
|
if flight.custom_name:
|
|
name_str = flight.custom_name
|
|
else:
|
|
name_str = "{} {}".format(
|
|
flight.package.target.name, flight.flight_type
|
|
)
|
|
except AttributeError: # Here to maintain save compatibility with 2.3
|
|
name_str = "{} {}".format(flight.package.target.name, flight.flight_type)
|
|
return "{}|{}|{}|{}|{}|".format(
|
|
name_str,
|
|
country.id,
|
|
cls.aircraft_number,
|
|
parent_base_id,
|
|
flight.unit_type.name,
|
|
)
|
|
|
|
@classmethod
|
|
def next_unit_name(
|
|
cls, country: Country, parent_base_id: int, unit_type: UnitType[Any]
|
|
) -> str:
|
|
cls.number += 1
|
|
return "unit|{}|{}|{}|{}|".format(
|
|
country.id, cls.number, parent_base_id, unit_type.name
|
|
)
|
|
|
|
@classmethod
|
|
def next_infantry_name(
|
|
cls, country: Country, parent_base_id: int, unit_type: UnitType[Any]
|
|
) -> str:
|
|
cls.infantry_number += 1
|
|
return "infantry|{}|{}|{}|{}|".format(
|
|
country.id,
|
|
cls.infantry_number,
|
|
parent_base_id,
|
|
unit_type.name,
|
|
)
|
|
|
|
@classmethod
|
|
def next_awacs_name(cls, country: Country) -> str:
|
|
cls.number += 1
|
|
return "awacs|{}|{}|0|".format(country.id, cls.number)
|
|
|
|
@classmethod
|
|
def next_tanker_name(cls, country: Country, unit_type: AircraftType) -> str:
|
|
cls.number += 1
|
|
return "tanker|{}|{}|0|{}".format(country.id, cls.number, unit_type.name)
|
|
|
|
@classmethod
|
|
def next_carrier_name(cls, country: Country) -> str:
|
|
cls.number += 1
|
|
return "carrier|{}|{}|0|".format(country.id, cls.number)
|
|
|
|
@classmethod
|
|
def next_convoy_name(cls) -> str:
|
|
cls.convoy_number += 1
|
|
return f"Convoy {cls.convoy_number:03}"
|
|
|
|
@classmethod
|
|
def next_cargo_ship_name(cls) -> str:
|
|
cls.cargo_ship_number += 1
|
|
return f"Cargo Ship {cls.cargo_ship_number:03}"
|
|
|
|
@classmethod
|
|
def random_objective_name(cls) -> str:
|
|
if cls.animals:
|
|
animal = random.choice(cls.animals)
|
|
cls.animals.remove(animal)
|
|
return animal
|
|
|
|
for _ in range(10):
|
|
alpha = random.choice(ALPHA_MILITARY).upper()
|
|
number = random.randint(0, 100)
|
|
alpha_mil_name = f"{alpha} #{number:02}"
|
|
if alpha_mil_name not in cls.existing_alphas:
|
|
cls.existing_alphas.append(alpha_mil_name)
|
|
return alpha_mil_name
|
|
|
|
# At this point, give up trying - something has gone wrong and we haven't been
|
|
# able to make a new name in 10 tries. We'll just make a longer name using the
|
|
# current unix epoch in nanoseconds. That should be unique... right?
|
|
last_chance_name = alpha_mil_name + str(time.time_ns())
|
|
cls.existing_alphas.append(last_chance_name)
|
|
return last_chance_name
|
|
|
|
|
|
namegen = NameGenerator
|