72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			72 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import json | ||
|  | from pathlib import Path | ||
|  | from typing import Dict, Set, NamedTuple, List | ||
|  | 
 | ||
|  | from BaseClasses import Item | ||
|  | 
 | ||
|  | 
 | ||
|  | class ItemData(NamedTuple): | ||
|  |     name: str | ||
|  |     code: int | ||
|  |     item_type: str | ||
|  |     progression: bool | ||
|  | 
 | ||
|  | 
 | ||
|  | FF1_BRIDGE = 'Bridge' | ||
|  | 
 | ||
|  | 
 | ||
|  | FF1_STARTER_ITEMS = [ | ||
|  |     "Ship" | ||
|  | ] | ||
|  | 
 | ||
|  | FF1_PROGRESSION_LIST = [ | ||
|  |     "Rod", "Cube", "Lute", "Key", "Chime", "Oxyale", | ||
|  |     "Ship", "Canoe", "Floater", "Canal", | ||
|  |     "Crown", "Crystal", "Herb", "Tnt", "Adamant", "Slab", "Ruby", "Bottle", | ||
|  |     "Shard", | ||
|  |     "EarthOrb", "FireOrb", "WaterOrb", "AirOrb" | ||
|  | ] | ||
|  | 
 | ||
|  | 
 | ||
|  | class FF1Items: | ||
|  |     _item_table: List[ItemData] = [] | ||
|  |     _item_table_lookup: Dict[str, ItemData] = {} | ||
|  | 
 | ||
|  |     def _populate_item_table_from_data(self): | ||
|  |         base_path = Path(__file__).parent | ||
|  |         file_path = (base_path / "data/items.json").resolve() | ||
|  |         with open(file_path) as file: | ||
|  |             items = json.load(file) | ||
|  |             # Hardcode progression and categories for now | ||
|  |             self._item_table = [ItemData(name, code, "FF1Item", name in FF1_PROGRESSION_LIST) | ||
|  |                                 for name, code in items.items()] | ||
|  |             self._item_table_lookup = {item.name: item for item in self._item_table} | ||
|  | 
 | ||
|  |     def _get_item_table(self) -> List[ItemData]: | ||
|  |         if not self._item_table or not self._item_table_lookup: | ||
|  |             self._populate_item_table_from_data() | ||
|  |         return self._item_table | ||
|  | 
 | ||
|  |     def _get_item_table_lookup(self) -> Dict[str, ItemData]: | ||
|  |         if not self._item_table or not self._item_table_lookup: | ||
|  |             self._populate_item_table_from_data() | ||
|  |         return self._item_table_lookup | ||
|  | 
 | ||
|  |     def get_item_names_per_category(self) -> Dict[str, Set[str]]: | ||
|  |         categories: Dict[str, Set[str]] = {} | ||
|  | 
 | ||
|  |         for item in self._get_item_table(): | ||
|  |             categories.setdefault(item.item_type, set()).add(item.name) | ||
|  | 
 | ||
|  |         return categories | ||
|  | 
 | ||
|  |     def generate_item(self, name: str, player: int) -> Item: | ||
|  |         item = self._get_item_table_lookup().get(name) | ||
|  |         return Item(name, item.progression, item.code, player) | ||
|  | 
 | ||
|  |     def get_item_name_to_code_dict(self) -> Dict[str, int]: | ||
|  |         return {name: item.code for name, item in self._get_item_table_lookup().items()} | ||
|  | 
 | ||
|  |     def get_item(self, name: str) -> ItemData: | ||
|  |         return self._get_item_table_lookup()[name] |