| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2025-05-22 11:35:38 -04:00
										 |  |  | import pkgutil | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | from typing import Dict, Set, NamedTuple, List | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-17 03:23:27 +02:00
										 |  |  | from BaseClasses import Item, ItemClassification | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ItemData(NamedTuple): | 
					
						
							|  |  |  |     name: str | 
					
						
							|  |  |  |     code: int | 
					
						
							|  |  |  |     item_type: str | 
					
						
							| 
									
										
										
										
											2022-06-20 15:17:57 -04:00
										 |  |  |     classification: ItemClassification | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | FF1_BRIDGE = 'Bridge' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FF1_STARTER_ITEMS = [ | 
					
						
							|  |  |  |     "Ship" | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | FF1_PROGRESSION_LIST = [ | 
					
						
							|  |  |  |     "Rod", "Cube", "Lute", "Key", "Chime", "Oxyale", | 
					
						
							| 
									
										
										
										
											2022-09-05 03:21:00 -04:00
										 |  |  |     "Ship", "Canoe", "Floater", "Mark", "Sigil", "Canal", | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  |     "Crown", "Crystal", "Herb", "Tnt", "Adamant", "Slab", "Ruby", "Bottle", | 
					
						
							|  |  |  |     "Shard", | 
					
						
							|  |  |  |     "EarthOrb", "FireOrb", "WaterOrb", "AirOrb" | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-20 15:17:57 -04:00
										 |  |  | FF1_USEFUL_LIST = [ | 
					
						
							|  |  |  |     "Tail", "Masamune", "Xcalber", "Katana", "Vorpal", | 
					
						
							|  |  |  |     "DragonArmor", "Opal", "AegisShield",  "Ribbon" | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | class FF1Items: | 
					
						
							|  |  |  |     _item_table: List[ItemData] = [] | 
					
						
							|  |  |  |     _item_table_lookup: Dict[str, ItemData] = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def _populate_item_table_from_data(self): | 
					
						
							| 
									
										
										
										
											2025-05-22 11:35:38 -04:00
										 |  |  |         file = pkgutil.get_data(__name__, "data/items.json").decode("utf-8") | 
					
						
							|  |  |  |         items = json.loads(file) | 
					
						
							|  |  |  |         # Hardcode progression and categories for now | 
					
						
							|  |  |  |         self._item_table = [ItemData(name, code, "FF1Item", ItemClassification.progression if name in | 
					
						
							|  |  |  |                             FF1_PROGRESSION_LIST else ItemClassification.useful if name in FF1_USEFUL_LIST else | 
					
						
							|  |  |  |                             ItemClassification.filler) for name, code in items.items()] | 
					
						
							|  |  |  |         self._item_table_lookup = {item.name: item for item in self._item_table} | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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) | 
					
						
							| 
									
										
										
										
											2022-06-20 15:17:57 -04:00
										 |  |  |         return Item(name, item.classification, | 
					
						
							| 
									
										
										
										
											2022-06-17 03:23:27 +02:00
										 |  |  |                     item.code, player) | 
					
						
							| 
									
										
										
										
											2021-11-28 14:32:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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] |