catch plando boss placement errors in yaml.
This commit is contained in:
		
							parent
							
								
									ed51ed3d52
								
							
						
					
					
						commit
						58d748d7ff
					
				
							
								
								
									
										32
									
								
								Bosses.py
								
								
								
								
							
							
						
						
									
										32
									
								
								Bosses.py
								
								
								
								
							|  | @ -147,6 +147,22 @@ boss_table = { | ||||||
|     'Agahnim2': ('Agahnim2', AgahnimDefeatRule) |     'Agahnim2': ('Agahnim2', AgahnimDefeatRule) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | boss_location_table = [ | ||||||
|  |         ['Ganons Tower', 'top'], | ||||||
|  |         ['Tower of Hera', None], | ||||||
|  |         ['Skull Woods', None], | ||||||
|  |         ['Ganons Tower', 'middle'], | ||||||
|  |         ['Eastern Palace', None], | ||||||
|  |         ['Desert Palace', None], | ||||||
|  |         ['Palace of Darkness', None], | ||||||
|  |         ['Swamp Palace', None], | ||||||
|  |         ['Thieves Town', None], | ||||||
|  |         ['Ice Palace', None], | ||||||
|  |         ['Misery Mire', None], | ||||||
|  |         ['Turtle Rock', None], | ||||||
|  |         ['Ganons Tower', 'bottom'], | ||||||
|  |     ] | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def can_place_boss(boss: str, dungeon_name: str, level: Optional[str] = None) -> bool: | def can_place_boss(boss: str, dungeon_name: str, level: Optional[str] = None) -> bool: | ||||||
|     # blacklist approach |     # blacklist approach | ||||||
|  | @ -183,21 +199,7 @@ def place_bosses(world, player: int): | ||||||
|     if world.boss_shuffle[player] == 'none': |     if world.boss_shuffle[player] == 'none': | ||||||
|         return |         return | ||||||
|     # Most to least restrictive order |     # Most to least restrictive order | ||||||
|     boss_locations = [ |     boss_locations = boss_location_table.copy() | ||||||
|         ['Ganons Tower', 'top'], |  | ||||||
|         ['Tower of Hera', None], |  | ||||||
|         ['Skull Woods', None], |  | ||||||
|         ['Ganons Tower', 'middle'], |  | ||||||
|         ['Eastern Palace', None], |  | ||||||
|         ['Desert Palace', None], |  | ||||||
|         ['Palace of Darkness', None], |  | ||||||
|         ['Swamp Palace', None], |  | ||||||
|         ['Thieves Town', None], |  | ||||||
|         ['Ice Palace', None], |  | ||||||
|         ['Misery Mire', None], |  | ||||||
|         ['Turtle Rock', None], |  | ||||||
|         ['Ganons Tower', 'bottom'], |  | ||||||
|     ] |  | ||||||
| 
 | 
 | ||||||
|     all_bosses = sorted(boss_table.keys())  # sorted to be deterministic on older pythons |     all_bosses = sorted(boss_table.keys())  # sorted to be deterministic on older pythons | ||||||
|     placeable_bosses = [boss for boss in all_bosses if boss not in ['Agahnim', 'Agahnim2', 'Ganon']] |     placeable_bosses = [boss for boss in all_bosses if boss not in ['Agahnim', 'Agahnim2', 'Ganon']] | ||||||
|  |  | ||||||
							
								
								
									
										20
									
								
								Mystery.py
								
								
								
								
							
							
						
						
									
										20
									
								
								Mystery.py
								
								
								
								
							|  | @ -294,6 +294,8 @@ def prefer_int(input_data: str) -> typing.Union[str, int]: | ||||||
| 
 | 
 | ||||||
| available_boss_names: typing.Set[str] = {boss.lower() for boss in Bosses.boss_table if boss not in | available_boss_names: typing.Set[str] = {boss.lower() for boss in Bosses.boss_table if boss not in | ||||||
|                                          {'Agahnim', 'Agahnim2', 'Ganon'}} |                                          {'Agahnim', 'Agahnim2', 'Ganon'}} | ||||||
|  | available_boss_locations: typing.Set[str] = {f"{loc.lower()}{f' {level}' if level else ''}" for loc, level in | ||||||
|  |                                              Bosses.boss_location_table} | ||||||
| 
 | 
 | ||||||
| boss_shuffle_options = {None: 'none', | boss_shuffle_options = {None: 'none', | ||||||
|                         'none': 'none', |                         'none': 'none', | ||||||
|  | @ -381,7 +383,23 @@ def get_plando_bosses(boss_shuffle: str, plando_options: typing.Set[str]) -> str | ||||||
|         for boss in options: |         for boss in options: | ||||||
|             if boss in boss_shuffle_options: |             if boss in boss_shuffle_options: | ||||||
|                 remainder_shuffle = boss_shuffle_options[boss] |                 remainder_shuffle = boss_shuffle_options[boss] | ||||||
|             elif boss not in available_boss_names and not "-" in boss: |             elif "-" in boss: | ||||||
|  |                 loc, boss_name = boss.split("-") | ||||||
|  |                 if boss_name not in available_boss_names: | ||||||
|  |                     raise ValueError(f"Unknown Boss name {boss_name}") | ||||||
|  |                 if loc not in available_boss_locations: | ||||||
|  |                     raise ValueError(f"Unknown Boss Location {loc}") | ||||||
|  |                 level = '' | ||||||
|  |                 if loc.split(" ")[-1] in {"top", "middle", "bottom"}: | ||||||
|  |                     # split off level | ||||||
|  |                     loc = loc.split(" ") | ||||||
|  |                     level = f" {loc[-1]}" | ||||||
|  |                     loc = " ".join(loc[:-1]) | ||||||
|  |                 loc = loc.title().replace("Of", "of") | ||||||
|  |                 if not Bosses.can_place_boss(boss_name.title(), loc, level): | ||||||
|  |                     raise ValueError(f"Cannot place {boss_name} at {loc}{level}") | ||||||
|  |                 bosses.append(boss) | ||||||
|  |             elif boss not in available_boss_names: | ||||||
|                 raise ValueError(f"Unknown Boss name or Boss shuffle option {boss}.") |                 raise ValueError(f"Unknown Boss name or Boss shuffle option {boss}.") | ||||||
|             else: |             else: | ||||||
|                 bosses.append(boss) |                 bosses.append(boss) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue