157 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from collections import defaultdict
							 | 
						||
| 
								 | 
							
								from dataclasses import dataclass
							 | 
						||
| 
								 | 
							
								from typing import Optional, Dict
							 | 
						||
| 
								 | 
							
								from BaseClasses import Location, Region
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from .Data import get_boosts_data, get_new_civics_data, get_new_techs_data
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from .Enum import CivVICheckType, EraType
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								CIV_VI_AP_LOCATION_ID_BASE = 5041000
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Locs that should not have progression items
							 | 
						||
| 
								 | 
							
								GOODY_HUT_LOCATION_NAMES = [
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_1",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_2",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_3",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_4",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_5",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_6",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_7",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_8",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_9",
							 | 
						||
| 
								 | 
							
								    "GOODY_HUT_10",
							 | 
						||
| 
								 | 
							
								]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								@dataclass
							 | 
						||
| 
								 | 
							
								class CivVILocationData:
							 | 
						||
| 
								 | 
							
								    name: str
							 | 
						||
| 
								 | 
							
								    cost: int
							 | 
						||
| 
								 | 
							
								    uiTreeRow: int
							 | 
						||
| 
								 | 
							
								    civ_id: int
							 | 
						||
| 
								 | 
							
								    era_type: str
							 | 
						||
| 
								 | 
							
								    location_type: CivVICheckType
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    game: str = "Civilization VI"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    @property
							 | 
						||
| 
								 | 
							
								    def code(self):
							 | 
						||
| 
								 | 
							
								        return self.civ_id + CIV_VI_AP_LOCATION_ID_BASE
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CivVILocation(Location):
							 | 
						||
| 
								 | 
							
								    game: str = "Civilization VI"
							 | 
						||
| 
								 | 
							
								    location_type: CivVICheckType
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __init__(
							 | 
						||
| 
								 | 
							
								        self,
							 | 
						||
| 
								 | 
							
								        player: int,
							 | 
						||
| 
								 | 
							
								        name: str = "",
							 | 
						||
| 
								 | 
							
								        address: Optional[int] = None,
							 | 
						||
| 
								 | 
							
								        parent: Optional[Region] = None,
							 | 
						||
| 
								 | 
							
								    ):
							 | 
						||
| 
								 | 
							
								        super().__init__(player, name, address, parent)
							 | 
						||
| 
								 | 
							
								        category = name.split("_")[0]
							 | 
						||
| 
								 | 
							
								        if "victory" in category:
							 | 
						||
| 
								 | 
							
								            self.location_type = CivVICheckType.EVENT
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            self.location_type = CivVICheckType(category)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def generate_flat_location_table() -> Dict[str, CivVILocationData]:
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Generates a flat location table in the following format:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      "TECH_AP_ANCIENT_00": CivVILocationData,
							 | 
						||
| 
								 | 
							
								      "TECH_AP_ANCIENT_01": CivVILocationData,
							 | 
						||
| 
								 | 
							
								      "CIVIC_AP_ANCIENT_00": CivVILocationData,
							 | 
						||
| 
								 | 
							
								      ...
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    era_locations = generate_era_location_table()
							 | 
						||
| 
								 | 
							
								    flat_locations: Dict[str, CivVILocationData] = {}
							 | 
						||
| 
								 | 
							
								    for locations in era_locations.values():
							 | 
						||
| 
								 | 
							
								        for location_id, location_data in locations.items():
							 | 
						||
| 
								 | 
							
								            flat_locations[location_id] = location_data
							 | 
						||
| 
								 | 
							
								    return flat_locations
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def generate_era_location_table() -> Dict[str, Dict[str, CivVILocationData]]:
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    Uses the data from existing_tech.json to generate a location table in the following format:
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      "ERA_ANCIENT": {
							 | 
						||
| 
								 | 
							
								        "TECH_AP_ANCIENT_00": CivVILocationData,
							 | 
						||
| 
								 | 
							
								        "TECH_AP_ANCIENT_01": CivVILocationData,
							 | 
						||
| 
								 | 
							
								        "CIVIC_AP_ANCIENT_00": CivVILocationData,
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      ...
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    new_techs = get_new_techs_data()
							 | 
						||
| 
								 | 
							
								    era_locations: Dict[str, Dict[str, CivVILocationData]] = defaultdict(dict)
							 | 
						||
| 
								 | 
							
								    id_base = 0
							 | 
						||
| 
								 | 
							
								    # Techs
							 | 
						||
| 
								 | 
							
								    for data in new_techs:
							 | 
						||
| 
								 | 
							
								        era_type = data["EraType"]
							 | 
						||
| 
								 | 
							
								        era_locations[era_type][data["Type"]] = CivVILocationData(
							 | 
						||
| 
								 | 
							
								            data["Type"],
							 | 
						||
| 
								 | 
							
								            data["Cost"],
							 | 
						||
| 
								 | 
							
								            data["UITreeRow"],
							 | 
						||
| 
								 | 
							
								            id_base,
							 | 
						||
| 
								 | 
							
								            era_type,
							 | 
						||
| 
								 | 
							
								            CivVICheckType.TECH,
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        id_base += 1
							 | 
						||
| 
								 | 
							
								    # Civics
							 | 
						||
| 
								 | 
							
								    new_civics = get_new_civics_data()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for data in new_civics:
							 | 
						||
| 
								 | 
							
								        era_type = data["EraType"]
							 | 
						||
| 
								 | 
							
								        era_locations[era_type][data["Type"]] = CivVILocationData(
							 | 
						||
| 
								 | 
							
								            data["Type"],
							 | 
						||
| 
								 | 
							
								            data["Cost"],
							 | 
						||
| 
								 | 
							
								            data["UITreeRow"],
							 | 
						||
| 
								 | 
							
								            id_base,
							 | 
						||
| 
								 | 
							
								            era_type,
							 | 
						||
| 
								 | 
							
								            CivVICheckType.CIVIC,
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        id_base += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Eras
							 | 
						||
| 
								 | 
							
								    for era in EraType:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if era == EraType.ERA_ANCIENT:
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        era_locations[era.name][era.name] = CivVILocationData(
							 | 
						||
| 
								 | 
							
								            era.name, 0, 0, id_base, era.name, CivVICheckType.ERA
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        id_base += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Goody Huts, defaults to 10 goody huts as location checks (rarely will a player get more than this)
							 | 
						||
| 
								 | 
							
								    for i in range(10):
							 | 
						||
| 
								 | 
							
								        era_locations[EraType.ERA_ANCIENT.value]["GOODY_HUT_" + str(i + 1)] = (
							 | 
						||
| 
								 | 
							
								            CivVILocationData(
							 | 
						||
| 
								 | 
							
								                "GOODY_HUT_" + str(i + 1),
							 | 
						||
| 
								 | 
							
								                0,
							 | 
						||
| 
								 | 
							
								                0,
							 | 
						||
| 
								 | 
							
								                id_base,
							 | 
						||
| 
								 | 
							
								                EraType.ERA_ANCIENT.value,
							 | 
						||
| 
								 | 
							
								                CivVICheckType.GOODY,
							 | 
						||
| 
								 | 
							
								            )
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        id_base += 1
							 | 
						||
| 
								 | 
							
								    # Boosts
							 | 
						||
| 
								 | 
							
								    boosts = get_boosts_data()
							 | 
						||
| 
								 | 
							
								    for boost in boosts:
							 | 
						||
| 
								 | 
							
								        location = CivVILocationData(
							 | 
						||
| 
								 | 
							
								            boost.Type, 0, 0, id_base, boost.EraType, CivVICheckType.BOOST
							 | 
						||
| 
								 | 
							
								        )
							 | 
						||
| 
								 | 
							
								        era_locations["ERA_ANCIENT"][boost.Type] = location
							 | 
						||
| 
								 | 
							
								        id_base += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return era_locations
							 |