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 |