LttP/Core: more ripping and tearing (#3160)

This commit is contained in:
Fabian Dill
2024-04-18 18:33:16 +02:00
committed by GitHub
parent f19a84222e
commit 6e56f31398
19 changed files with 374 additions and 655 deletions

View File

@@ -251,6 +251,17 @@ class ALTTPWorld(World):
dungeons: typing.Dict[str, Dungeon]
waterfall_fairy_bottle_fill: str
pyramid_fairy_bottle_fill: str
escape_assist: list
can_take_damage: bool = True
swamp_patch_required: bool = False
powder_patch_required: bool = False
ganon_at_pyramid: bool = True
ganonstower_vanilla: bool = True
fix_fake_world: bool = True
clock_mode: str = ""
treasure_hunt_count: int = 1
def __init__(self, *args, **kwargs):
self.dungeon_local_item_names = set()
@@ -265,6 +276,8 @@ class ALTTPWorld(World):
self.fix_skullwoods_exit = None
self.fix_palaceofdarkness_exit = None
self.fix_trock_exit = None
self.required_medallions = ["Ether", "Quake"]
self.escape_assist = []
super(ALTTPWorld, self).__init__(*args, **kwargs)
@classmethod
@@ -298,7 +311,7 @@ class ALTTPWorld(World):
"Bottle (Red Potion)", "Bottle (Green Potion)", "Bottle (Blue Potion)",
"Bottle (Bee)", "Bottle (Good Bee)"
]
if multiworld.difficulty[player] not in ["hard", "expert"]:
if multiworld.item_pool[player] not in ["hard", "expert"]:
bottle_options.append("Bottle (Fairy)")
self.waterfall_fairy_bottle_fill = self.random.choice(bottle_options)
self.pyramid_fairy_bottle_fill = self.random.choice(bottle_options)
@@ -344,7 +357,7 @@ class ALTTPWorld(World):
if option == "original_dungeon":
self.dungeon_specific_item_names |= self.item_name_groups[option.item_name_group]
multiworld.difficulty_requirements[player] = difficulties[multiworld.item_pool[player].current_key]
self.difficulty_requirements = difficulties[multiworld.item_pool[player].current_key]
# enforce pre-defined local items.
if multiworld.goal[player] in ["local_triforce_hunt", "local_ganon_triforce_hunt"]:
@@ -370,7 +383,7 @@ class ALTTPWorld(World):
if (multiworld.glitches_required[player] not in ["no_glitches", "minor_glitches"] and
multiworld.entrance_shuffle[player] in [
"vanilla", "dungeons_simple", "dungeons_full", "simple", "restricted", "full"]):
multiworld.fix_fake_world[player] = False
self.fix_fake_world = False
# seeded entrance shuffle
old_random = multiworld.random
@@ -438,15 +451,16 @@ class ALTTPWorld(World):
if 'Sword' in item_name:
if state.has('Golden Sword', item.player):
pass
elif state.has('Tempered Sword', item.player) and self.multiworld.difficulty_requirements[
item.player].progressive_sword_limit >= 4:
elif (state.has('Tempered Sword', item.player) and
self.difficulty_requirements.progressive_sword_limit >= 4):
return 'Golden Sword'
elif state.has('Master Sword', item.player) and self.multiworld.difficulty_requirements[
item.player].progressive_sword_limit >= 3:
elif (state.has('Master Sword', item.player) and
self.difficulty_requirements.progressive_sword_limit >= 3):
return 'Tempered Sword'
elif state.has('Fighter Sword', item.player) and self.multiworld.difficulty_requirements[item.player].progressive_sword_limit >= 2:
elif (state.has('Fighter Sword', item.player) and
self.difficulty_requirements.progressive_sword_limit >= 2):
return 'Master Sword'
elif self.multiworld.difficulty_requirements[item.player].progressive_sword_limit >= 1:
elif self.difficulty_requirements.progressive_sword_limit >= 1:
return 'Fighter Sword'
elif 'Glove' in item_name:
if state.has('Titans Mitts', item.player):
@@ -458,20 +472,22 @@ class ALTTPWorld(World):
elif 'Shield' in item_name:
if state.has('Mirror Shield', item.player):
return
elif state.has('Red Shield', item.player) and self.multiworld.difficulty_requirements[item.player].progressive_shield_limit >= 3:
elif (state.has('Red Shield', item.player) and
self.difficulty_requirements.progressive_shield_limit >= 3):
return 'Mirror Shield'
elif state.has('Blue Shield', item.player) and self.multiworld.difficulty_requirements[item.player].progressive_shield_limit >= 2:
elif (state.has('Blue Shield', item.player) and
self.difficulty_requirements.progressive_shield_limit >= 2):
return 'Red Shield'
elif self.multiworld.difficulty_requirements[item.player].progressive_shield_limit >= 1:
elif self.difficulty_requirements.progressive_shield_limit >= 1:
return 'Blue Shield'
elif 'Bow' in item_name:
if state.has('Silver Bow', item.player):
return
elif state.has('Bow', item.player) and (self.multiworld.difficulty_requirements[item.player].progressive_bow_limit >= 2
or self.multiworld.glitches_required[item.player] == 'no_glitches'
or self.multiworld.swordless[item.player]): # modes where silver bow is always required for ganon
elif state.has('Bow', item.player) and (self.difficulty_requirements.progressive_bow_limit >= 2
or self.glitches_required == 'no_glitches'
or self.swordless): # modes where silver bow is always required for ganon
return 'Silver Bow'
elif self.multiworld.difficulty_requirements[item.player].progressive_bow_limit >= 1:
elif self.difficulty_requirements.progressive_bow_limit >= 1:
return 'Bow'
elif item.advancement:
return item_name
@@ -660,7 +676,7 @@ class ALTTPWorld(World):
trash_counts = {}
for player in multiworld.get_game_players("A Link to the Past"):
world = multiworld.worlds[player]
if not multiworld.ganonstower_vanilla[player] or \
if not world.ganonstower_vanilla or \
world.options.glitches_required.current_key in {'overworld_glitches', 'hybrid_major_glitches', "no_logic"}:
pass
elif 'triforce_hunt' in world.options.goal.current_key and ('local' in world.options.goal.current_key or multiworld.players == 1):
@@ -701,10 +717,10 @@ class ALTTPWorld(World):
player_name = self.multiworld.get_player_name(self.player)
spoiler_handle.write("\n\nMedallions:\n")
spoiler_handle.write(f"\nMisery Mire ({player_name}):"
f" {self.multiworld.required_medallions[self.player][0]}")
f" {self.required_medallions[0]}")
spoiler_handle.write(
f"\nTurtle Rock ({player_name}):"
f" {self.multiworld.required_medallions[self.player][1]}")
f" {self.required_medallions[1]}")
spoiler_handle.write("\n\nFairy Fountain Bottle Fill:\n")
spoiler_handle.write(f"\nPyramid Fairy ({player_name}):"
f" {self.pyramid_fairy_bottle_fill}")
@@ -815,8 +831,8 @@ class ALTTPWorld(World):
slot_data = {option_name: getattr(self.multiworld, option_name)[self.player].value for option_name in slot_options}
slot_data.update({
'mm_medalion': self.multiworld.required_medallions[self.player][0],
'tr_medalion': self.multiworld.required_medallions[self.player][1],
'mm_medalion': self.required_medallions[0],
'tr_medalion': self.required_medallions[1],
}
)
return slot_data