mirror of
				https://github.com/MarioSpore/Grinch-AP.git
				synced 2025-10-21 20:21:32 -06:00 
			
		
		
		
	Timespinner: some reformatting and type fixes
This commit is contained in:
		| @@ -4,14 +4,16 @@ from .Options import is_option_enabled | ||||
|  | ||||
| EventId: Optional[int] = None | ||||
|  | ||||
|  | ||||
| class LocationData(NamedTuple): | ||||
|     region: str | ||||
|     name: str | ||||
|     code: Optional[int] | ||||
|     rule: Callable = lambda state: True | ||||
|  | ||||
| def get_locations(world: MultiWorld, player: int): | ||||
|     location_table: Tuple[LocationData] = ( | ||||
|  | ||||
| def get_locations(world: Optional[MultiWorld], player: Optional[int]): | ||||
|     location_table: Tuple[LocationData, ...] = ( | ||||
|         # PresentItemLocations | ||||
|         LocationData('Tutorial', 'Yo Momma 1',  1337000), | ||||
|         LocationData('Tutorial', 'Yo Momma 2',  1337001), | ||||
| @@ -194,7 +196,7 @@ def get_locations(world: MultiWorld, player: int): | ||||
|         LocationData('Ancient Pyramid (right)', 'Killed Nightmare',  EventId) | ||||
|     ) | ||||
|  | ||||
|     downloadable_items: Tuple[LocationData] = ( | ||||
|     downloadable_items: Tuple[LocationData, ...] = ( | ||||
|         # DownloadTerminals | ||||
|         LocationData('Libary', 'Library terminal 1',  1337157, lambda state: state.has('Tablet', player)), | ||||
|         LocationData('Libary', 'Library terminal 2',  1337156, lambda state: state.has('Tablet', player)), | ||||
| @@ -217,7 +219,7 @@ def get_locations(world: MultiWorld, player: int): | ||||
|     else: | ||||
|         return location_table | ||||
|  | ||||
| starter_progression_locations: Tuple[str] = ( | ||||
| starter_progression_locations: Tuple[str, ...] = ( | ||||
|     'Starter chest 2', | ||||
|     'Starter chest 3', | ||||
|     'Starter chest 1', | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| from typing import Dict, List | ||||
| from typing import Dict, List, Set | ||||
| from BaseClasses import Item, MultiWorld | ||||
| from ..AutoWorld import World | ||||
| from .LogicMixin import TimespinnerLogic | ||||
| @@ -8,6 +8,7 @@ from .Regions import create_regions | ||||
| from .Options import is_option_enabled, timespinner_options | ||||
| from .PyramidKeys import get_pyramid_keys_unlock | ||||
|  | ||||
|  | ||||
| class TimespinnerWorld(World): | ||||
|     options = timespinner_options | ||||
|     game = "Timespinner" | ||||
| @@ -16,7 +17,7 @@ class TimespinnerWorld(World): | ||||
|     hidden = True | ||||
|  | ||||
|     item_name_to_id = {name: data.code for name, data in item_table.items()} | ||||
|     location_name_to_id = {location.name: location.code for location in get_locations(None, None)}  | ||||
|     location_name_to_id = {location.name: location.code for location in get_locations(None, None)} | ||||
|  | ||||
|     locked_locations: Dict[int, List[str]] = {} | ||||
|     pyramid_keys_unlock: Dict[int, str] = {} | ||||
| @@ -28,7 +29,8 @@ class TimespinnerWorld(World): | ||||
|         self.item_name_groups = get_item_name_groups() | ||||
|  | ||||
|     def create_regions(self): | ||||
|         create_regions(self.world, self.player, get_locations(self.world, self.player), self.pyramid_keys_unlock[self.player]) | ||||
|         create_regions(self.world, self.player, get_locations(self.world, self.player), | ||||
|                        self.pyramid_keys_unlock[self.player]) | ||||
|  | ||||
|     def create_item(self, name: str) -> Item: | ||||
|         return create_item(name, self.player) | ||||
| @@ -43,11 +45,12 @@ class TimespinnerWorld(World): | ||||
|  | ||||
|         assign_starter_items(self.world, self.player, excluded_items, self.locked_locations[self.player]) | ||||
|  | ||||
|         if not is_option_enabled(self.world, self.player, "QuickSeed") or not is_option_enabled(self.world, self.player, "Inverted"): | ||||
|         if not is_option_enabled(self.world, self.player, "QuickSeed") or \ | ||||
|                 not is_option_enabled(self.world, self.player, "Inverted"): | ||||
|             place_first_progression_item(self.world, self.player, excluded_items, self.locked_locations[self.player]) | ||||
|  | ||||
|         pool = get_item_pool(self.world, self.player, excluded_items) | ||||
|          | ||||
|  | ||||
|         fill_item_pool_with_dummy_items(self.world, self.player, self.locked_locations[self.player], pool) | ||||
|  | ||||
|         self.world.itempool += pool | ||||
| @@ -62,14 +65,16 @@ class TimespinnerWorld(World): | ||||
|         slot_data["StinkyMaw"] = 1 | ||||
|         slot_data["ProgressiveVerticalMovement"] = 0 | ||||
|         slot_data["ProgressiveKeycards"] = 0 | ||||
|         slot_data["PyramidKeysGate"] = self.pyramid_keys_unlock[self.player]  | ||||
|         slot_data["PyramidKeysGate"] = self.pyramid_keys_unlock[self.player] | ||||
|  | ||||
|         return slot_data | ||||
|  | ||||
|  | ||||
| def create_item(name: str, player: int) -> Item: | ||||
|     data = item_table[name] | ||||
|     return Item(name, data.progression, data.code, player) | ||||
|  | ||||
|  | ||||
| def get_excluded_items_based_on_options(world: MultiWorld, player: int) -> List[str]: | ||||
|     excluded_items = [] | ||||
|  | ||||
| @@ -79,9 +84,10 @@ def get_excluded_items_based_on_options(world: MultiWorld, player: int) -> List[ | ||||
|         excluded_items.append('Meyef') | ||||
|     if is_option_enabled(world, player, "QuickSeed"): | ||||
|         excluded_items.append('Talaria Attachment') | ||||
|      | ||||
|  | ||||
|     return excluded_items | ||||
|  | ||||
|  | ||||
| def assign_starter_items(world: MultiWorld, player: int, excluded_items: List[str], locked_locations: List[str]): | ||||
|     melee_weapon = world.random.choice(starter_melee_weapons) | ||||
|     spell = world.random.choice(starter_spells) | ||||
| @@ -91,13 +97,14 @@ def assign_starter_items(world: MultiWorld, player: int, excluded_items: List[st | ||||
|  | ||||
|     melee_weapon_item = create_item(melee_weapon, player) | ||||
|     spell_item = create_item(spell, player) | ||||
|      | ||||
|  | ||||
|     world.get_location('Yo Momma 1', player).place_locked_item(melee_weapon_item) | ||||
|     world.get_location('Yo Momma 2', player).place_locked_item(spell_item) | ||||
|  | ||||
|     locked_locations.append('Yo Momma 1') | ||||
|     locked_locations.append('Yo Momma 2') | ||||
|  | ||||
|  | ||||
| def get_item_pool(world: MultiWorld, player: int, excluded_items: List[str]) -> List[Item]: | ||||
|     pool = [] | ||||
|  | ||||
| @@ -109,22 +116,26 @@ def get_item_pool(world: MultiWorld, player: int, excluded_items: List[str]) -> | ||||
|  | ||||
|     return pool | ||||
|  | ||||
|  | ||||
| def fill_item_pool_with_dummy_items(world: MultiWorld, player: int, locked_locations: List[str], pool: List[Item]): | ||||
|     for _ in range(len(get_locations(world, player)) - len(locked_locations) - len(pool)): | ||||
|         item = create_item(world.random.choice(filler_items), player) | ||||
|         pool.append(item) | ||||
|  | ||||
| def place_first_progression_item(world: MultiWorld, player: int, excluded_items: List[str], locked_locations: List[str]): | ||||
|  | ||||
| def place_first_progression_item(world: MultiWorld, player: int, excluded_items: List[str], | ||||
|                                  locked_locations: List[str]): | ||||
|     progression_item = world.random.choice(starter_progression_items) | ||||
|     location =  world.random.choice(starter_progression_locations) | ||||
|     location = world.random.choice(starter_progression_locations) | ||||
|  | ||||
|     excluded_items.append(progression_item) | ||||
|     locked_locations.append(location) | ||||
|      | ||||
|  | ||||
|     item = create_item(progression_item, player) | ||||
|  | ||||
|     world.get_location(location, player).place_locked_item(item) | ||||
|   | ||||
|  | ||||
|  | ||||
| def update_progressive_state_based_flags(world: MultiWorld, player: int, name: str, data: Item) -> Item: | ||||
|     if not data.advancement: | ||||
|         return data | ||||
| @@ -136,6 +147,7 @@ def update_progressive_state_based_flags(world: MultiWorld, player: int, name: s | ||||
|  | ||||
|     return data | ||||
|  | ||||
|  | ||||
| def setup_events(world: MultiWorld, player: int, locked_locations: List[str]): | ||||
|     for location in get_locations(world, player): | ||||
|         if location.code == EventId: | ||||
| @@ -146,10 +158,11 @@ def setup_events(world: MultiWorld, player: int, locked_locations: List[str]): | ||||
|  | ||||
|             location.place_locked_item(item) | ||||
|  | ||||
| def get_item_name_groups() -> Dict[str, List[str]]: | ||||
|     groups: Dict[str, List[str]] = {} | ||||
|  | ||||
| def get_item_name_groups() -> Dict[str, Set[str]]: | ||||
|     groups: Dict[str, Set[str]] = {} | ||||
|  | ||||
|     for name, data in item_table.items(): | ||||
|         groups[data.category] = [ name ] if data.category not in groups else groups[data.category] + [ name ] | ||||
|         groups.setdefault(data.category, set()).add(name) | ||||
|  | ||||
|     return groups | ||||
|     return groups | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Fabian Dill
					Fabian Dill