2021-11-11 09:42:08 +00:00
from itertools import chain
import logging
2021-11-16 14:24:30 +00:00
from worlds . generic . Rules import set_rule , add_rule
2023-10-30 03:05:49 +00:00
from BaseClasses import CollectionState
2021-11-11 09:42:08 +00:00
from . Hints import get_hint_area , HintAreaNotFound
from . Regions import TimeOfDay
def set_all_entrances_data ( world , player ) :
for type , forward_entry , * return_entry in entrance_shuffle_table :
forward_entrance = world . get_entrance ( forward_entry [ 0 ] , player )
forward_entrance . data = forward_entry [ 1 ]
forward_entrance . type = type
forward_entrance . primary = True
if type == ' Grotto ' :
forward_entrance . data [ ' index ' ] = 0x1000 + forward_entrance . data [ ' grotto_id ' ]
if return_entry :
return_entry = return_entry [ 0 ]
return_entrance = world . get_entrance ( return_entry [ 0 ] , player )
return_entrance . data = return_entry [ 1 ]
return_entrance . type = type
forward_entrance . bind_two_way ( return_entrance )
if type == ' Grotto ' :
return_entrance . data [ ' index ' ] = 0x7FFF
2023-10-30 03:05:49 +00:00
def assume_entrance_pool ( entrance_pool , ootworld , pool_type ) :
2021-11-11 09:42:08 +00:00
assumed_pool = [ ]
for entrance in entrance_pool :
2023-10-30 03:05:49 +00:00
assumed_forward = entrance . assume_reachable ( pool_type )
2021-11-14 13:30:40 +00:00
if entrance . reverse != None and not ootworld . decouple_entrances :
2023-10-30 03:05:49 +00:00
assumed_return = entrance . reverse . assume_reachable ( pool_type )
2021-11-14 13:06:09 +00:00
if not ( ootworld . mix_entrance_pools != ' off ' and ( ootworld . shuffle_overworld_entrances or ootworld . shuffle_special_interior_entrances ) ) :
if ( entrance . type in ( ' Dungeon ' , ' Grotto ' , ' Grave ' ) and entrance . reverse . name != ' Spirit Temple Lobby -> Desert Colossus From Spirit Lobby ' ) or \
( entrance . type == ' Interior ' and ootworld . shuffle_special_interior_entrances ) :
# In most cases, Dungeon, Grotto/Grave and Simple Interior exits shouldn't be assumed able to give access to their parent region
set_rule ( assumed_return , lambda state , * * kwargs : False )
2021-11-11 09:42:08 +00:00
assumed_forward . bind_two_way ( assumed_return )
assumed_pool . append ( assumed_forward )
return assumed_pool
2023-10-30 03:05:49 +00:00
def build_one_way_targets ( world , pool , types_to_include , exclude = ( ) , target_region_names = ( ) ) :
2021-11-11 09:42:08 +00:00
one_way_entrances = [ ]
for pool_type in types_to_include :
one_way_entrances + = world . get_shufflable_entrances ( type = pool_type )
valid_one_way_entrances = list ( filter ( lambda entrance : entrance . name not in exclude , one_way_entrances ) )
if target_region_names :
2023-10-30 03:05:49 +00:00
return [ entrance . get_new_target ( pool ) for entrance in valid_one_way_entrances
2021-11-11 09:42:08 +00:00
if entrance . connected_region . name in target_region_names ]
2023-10-30 03:05:49 +00:00
return [ entrance . get_new_target ( pool ) for entrance in valid_one_way_entrances ]
2021-11-11 09:42:08 +00:00
# Abbreviations
# DMC Death Mountain Crater
# DMT Death Mountain Trail
# GC Goron City
# GF Gerudo Fortress
# GS Gold Skulltula
# GV Gerudo Valley
# HC Hyrule Castle
# HF Hyrule Field
# KF Kokiri Forest
# LH Lake Hylia
# LLR Lon Lon Ranch
# LW Lost Woods
# OGC Outside Ganon's Castle
# SFM Sacred Forest Meadow
# ToT Temple of Time
# ZD Zora's Domain
# ZF Zora's Fountain
# ZR Zora's River
entrance_shuffle_table = [
( ' Dungeon ' , ( ' KF Outside Deku Tree -> Deku Tree Lobby ' , { ' index ' : 0x0000 } ) ,
( ' Deku Tree Lobby -> KF Outside Deku Tree ' , { ' index ' : 0x0209 , ' blue_warp ' : 0x0457 } ) ) ,
( ' Dungeon ' , ( ' Death Mountain -> Dodongos Cavern Beginning ' , { ' index ' : 0x0004 } ) ,
( ' Dodongos Cavern Beginning -> Death Mountain ' , { ' index ' : 0x0242 , ' blue_warp ' : 0x047A } ) ) ,
( ' Dungeon ' , ( ' Zoras Fountain -> Jabu Jabus Belly Beginning ' , { ' index ' : 0x0028 } ) ,
( ' Jabu Jabus Belly Beginning -> Zoras Fountain ' , { ' index ' : 0x0221 , ' blue_warp ' : 0x010E } ) ) ,
( ' Dungeon ' , ( ' SFM Forest Temple Entrance Ledge -> Forest Temple Lobby ' , { ' index ' : 0x0169 } ) ,
( ' Forest Temple Lobby -> SFM Forest Temple Entrance Ledge ' , { ' index ' : 0x0215 , ' blue_warp ' : 0x0608 } ) ) ,
( ' Dungeon ' , ( ' DMC Fire Temple Entrance -> Fire Temple Lower ' , { ' index ' : 0x0165 } ) ,
( ' Fire Temple Lower -> DMC Fire Temple Entrance ' , { ' index ' : 0x024A , ' blue_warp ' : 0x0564 } ) ) ,
( ' Dungeon ' , ( ' Lake Hylia -> Water Temple Lobby ' , { ' index ' : 0x0010 } ) ,
( ' Water Temple Lobby -> Lake Hylia ' , { ' index ' : 0x021D , ' blue_warp ' : 0x060C } ) ) ,
( ' Dungeon ' , ( ' Desert Colossus -> Spirit Temple Lobby ' , { ' index ' : 0x0082 } ) ,
( ' Spirit Temple Lobby -> Desert Colossus From Spirit Lobby ' , { ' index ' : 0x01E1 , ' blue_warp ' : 0x0610 } ) ) ,
( ' Dungeon ' , ( ' Graveyard Warp Pad Region -> Shadow Temple Entryway ' , { ' index ' : 0x0037 } ) ,
( ' Shadow Temple Entryway -> Graveyard Warp Pad Region ' , { ' index ' : 0x0205 , ' blue_warp ' : 0x0580 } ) ) ,
( ' Dungeon ' , ( ' Kakariko Village -> Bottom of the Well ' , { ' index ' : 0x0098 } ) ,
( ' Bottom of the Well -> Kakariko Village ' , { ' index ' : 0x02A6 } ) ) ,
( ' Dungeon ' , ( ' ZF Ice Ledge -> Ice Cavern Beginning ' , { ' index ' : 0x0088 } ) ,
( ' Ice Cavern Beginning -> ZF Ice Ledge ' , { ' index ' : 0x03D4 } ) ) ,
2022-05-01 18:05:52 +00:00
( ' Dungeon ' , ( ' Gerudo Fortress -> Gerudo Training Ground Lobby ' , { ' index ' : 0x0008 } ) ,
( ' Gerudo Training Ground Lobby -> Gerudo Fortress ' , { ' index ' : 0x03A8 } ) ) ,
2022-12-11 03:11:40 +00:00
( ' DungeonSpecial ' , ( ' Ganons Castle Grounds -> Ganons Castle Lobby ' , { ' index ' : 0x0467 } ) ,
( ' Ganons Castle Lobby -> Castle Grounds From Ganons Castle ' , { ' index ' : 0x023D } ) ) ,
2021-11-11 09:42:08 +00:00
( ' Interior ' , ( ' Kokiri Forest -> KF Midos House ' , { ' index ' : 0x0433 } ) ,
( ' KF Midos House -> Kokiri Forest ' , { ' index ' : 0x0443 } ) ) ,
( ' Interior ' , ( ' Kokiri Forest -> KF Sarias House ' , { ' index ' : 0x0437 } ) ,
( ' KF Sarias House -> Kokiri Forest ' , { ' index ' : 0x0447 } ) ) ,
( ' Interior ' , ( ' Kokiri Forest -> KF House of Twins ' , { ' index ' : 0x009C } ) ,
( ' KF House of Twins -> Kokiri Forest ' , { ' index ' : 0x033C } ) ) ,
( ' Interior ' , ( ' Kokiri Forest -> KF Know It All House ' , { ' index ' : 0x00C9 } ) ,
( ' KF Know It All House -> Kokiri Forest ' , { ' index ' : 0x026A } ) ) ,
( ' Interior ' , ( ' Kokiri Forest -> KF Kokiri Shop ' , { ' index ' : 0x00C1 } ) ,
( ' KF Kokiri Shop -> Kokiri Forest ' , { ' index ' : 0x0266 } ) ) ,
( ' Interior ' , ( ' Lake Hylia -> LH Lab ' , { ' index ' : 0x0043 } ) ,
( ' LH Lab -> Lake Hylia ' , { ' index ' : 0x03CC } ) ) ,
( ' Interior ' , ( ' LH Fishing Island -> LH Fishing Hole ' , { ' index ' : 0x045F } ) ,
( ' LH Fishing Hole -> LH Fishing Island ' , { ' index ' : 0x0309 } ) ) ,
( ' Interior ' , ( ' GV Fortress Side -> GV Carpenter Tent ' , { ' index ' : 0x03A0 } ) ,
( ' GV Carpenter Tent -> GV Fortress Side ' , { ' index ' : 0x03D0 } ) ) ,
( ' Interior ' , ( ' Market Entrance -> Market Guard House ' , { ' index ' : 0x007E } ) ,
( ' Market Guard House -> Market Entrance ' , { ' index ' : 0x026E } ) ) ,
( ' Interior ' , ( ' Market -> Market Mask Shop ' , { ' index ' : 0x0530 } ) ,
( ' Market Mask Shop -> Market ' , { ' index ' : 0x01D1 , ' addresses ' : [ 0xC6DA5E ] } ) ) ,
( ' Interior ' , ( ' Market -> Market Bombchu Bowling ' , { ' index ' : 0x0507 } ) ,
( ' Market Bombchu Bowling -> Market ' , { ' index ' : 0x03BC } ) ) ,
( ' Interior ' , ( ' Market -> Market Potion Shop ' , { ' index ' : 0x0388 } ) ,
( ' Market Potion Shop -> Market ' , { ' index ' : 0x02A2 } ) ) ,
( ' Interior ' , ( ' Market -> Market Treasure Chest Game ' , { ' index ' : 0x0063 } ) ,
( ' Market Treasure Chest Game -> Market ' , { ' index ' : 0x01D5 } ) ) ,
( ' Interior ' , ( ' Market Back Alley -> Market Bombchu Shop ' , { ' index ' : 0x0528 } ) ,
( ' Market Bombchu Shop -> Market Back Alley ' , { ' index ' : 0x03C0 } ) ) ,
( ' Interior ' , ( ' Market Back Alley -> Market Man in Green House ' , { ' index ' : 0x043B } ) ,
( ' Market Man in Green House -> Market Back Alley ' , { ' index ' : 0x0067 } ) ) ,
( ' Interior ' , ( ' Kakariko Village -> Kak Carpenter Boss House ' , { ' index ' : 0x02FD } ) ,
( ' Kak Carpenter Boss House -> Kakariko Village ' , { ' index ' : 0x0349 } ) ) ,
( ' Interior ' , ( ' Kakariko Village -> Kak House of Skulltula ' , { ' index ' : 0x0550 } ) ,
( ' Kak House of Skulltula -> Kakariko Village ' , { ' index ' : 0x04EE } ) ) ,
( ' Interior ' , ( ' Kakariko Village -> Kak Impas House ' , { ' index ' : 0x039C } ) ,
( ' Kak Impas House -> Kakariko Village ' , { ' index ' : 0x0345 } ) ) ,
( ' Interior ' , ( ' Kak Impas Ledge -> Kak Impas House Back ' , { ' index ' : 0x05C8 } ) ,
( ' Kak Impas House Back -> Kak Impas Ledge ' , { ' index ' : 0x05DC } ) ) ,
( ' Interior ' , ( ' Kak Backyard -> Kak Odd Medicine Building ' , { ' index ' : 0x0072 } ) ,
( ' Kak Odd Medicine Building -> Kak Backyard ' , { ' index ' : 0x034D } ) ) ,
( ' Interior ' , ( ' Graveyard -> Graveyard Dampes House ' , { ' index ' : 0x030D } ) ,
( ' Graveyard Dampes House -> Graveyard ' , { ' index ' : 0x0355 } ) ) ,
( ' Interior ' , ( ' Goron City -> GC Shop ' , { ' index ' : 0x037C } ) ,
( ' GC Shop -> Goron City ' , { ' index ' : 0x03FC } ) ) ,
( ' Interior ' , ( ' Zoras Domain -> ZD Shop ' , { ' index ' : 0x0380 } ) ,
( ' ZD Shop -> Zoras Domain ' , { ' index ' : 0x03C4 } ) ) ,
( ' Interior ' , ( ' Lon Lon Ranch -> LLR Talons House ' , { ' index ' : 0x004F } ) ,
( ' LLR Talons House -> Lon Lon Ranch ' , { ' index ' : 0x0378 } ) ) ,
( ' Interior ' , ( ' Lon Lon Ranch -> LLR Stables ' , { ' index ' : 0x02F9 } ) ,
( ' LLR Stables -> Lon Lon Ranch ' , { ' index ' : 0x042F } ) ) ,
( ' Interior ' , ( ' Lon Lon Ranch -> LLR Tower ' , { ' index ' : 0x05D0 } ) ,
( ' LLR Tower -> Lon Lon Ranch ' , { ' index ' : 0x05D4 } ) ) ,
( ' Interior ' , ( ' Market -> Market Bazaar ' , { ' index ' : 0x052C } ) ,
( ' Market Bazaar -> Market ' , { ' index ' : 0x03B8 , ' addresses ' : [ 0xBEFD74 ] } ) ) ,
( ' Interior ' , ( ' Market -> Market Shooting Gallery ' , { ' index ' : 0x016D } ) ,
( ' Market Shooting Gallery -> Market ' , { ' index ' : 0x01CD , ' addresses ' : [ 0xBEFD7C ] } ) ) ,
( ' Interior ' , ( ' Kakariko Village -> Kak Bazaar ' , { ' index ' : 0x00B7 } ) ,
( ' Kak Bazaar -> Kakariko Village ' , { ' index ' : 0x0201 , ' addresses ' : [ 0xBEFD72 ] } ) ) ,
( ' Interior ' , ( ' Kakariko Village -> Kak Shooting Gallery ' , { ' index ' : 0x003B } ) ,
( ' Kak Shooting Gallery -> Kakariko Village ' , { ' index ' : 0x0463 , ' addresses ' : [ 0xBEFD7A ] } ) ) ,
( ' Interior ' , ( ' Desert Colossus -> Colossus Great Fairy Fountain ' , { ' index ' : 0x0588 } ) ,
( ' Colossus Great Fairy Fountain -> Desert Colossus ' , { ' index ' : 0x057C , ' addresses ' : [ 0xBEFD82 ] } ) ) ,
( ' Interior ' , ( ' Hyrule Castle Grounds -> HC Great Fairy Fountain ' , { ' index ' : 0x0578 } ) ,
( ' HC Great Fairy Fountain -> Castle Grounds ' , { ' index ' : 0x0340 , ' addresses ' : [ 0xBEFD80 ] } ) ) ,
( ' Interior ' , ( ' Ganons Castle Grounds -> OGC Great Fairy Fountain ' , { ' index ' : 0x04C2 } ) ,
( ' OGC Great Fairy Fountain -> Castle Grounds ' , { ' index ' : 0x0340 , ' addresses ' : [ 0xBEFD6C ] } ) ) ,
( ' Interior ' , ( ' DMC Lower Nearby -> DMC Great Fairy Fountain ' , { ' index ' : 0x04BE } ) ,
( ' DMC Great Fairy Fountain -> DMC Lower Local ' , { ' index ' : 0x0482 , ' addresses ' : [ 0xBEFD6A ] } ) ) ,
( ' Interior ' , ( ' Death Mountain Summit -> DMT Great Fairy Fountain ' , { ' index ' : 0x0315 } ) ,
( ' DMT Great Fairy Fountain -> Death Mountain Summit ' , { ' index ' : 0x045B , ' addresses ' : [ 0xBEFD68 ] } ) ) ,
( ' Interior ' , ( ' Zoras Fountain -> ZF Great Fairy Fountain ' , { ' index ' : 0x0371 } ) ,
( ' ZF Great Fairy Fountain -> Zoras Fountain ' , { ' index ' : 0x0394 , ' addresses ' : [ 0xBEFD7E ] } ) ) ,
( ' SpecialInterior ' , ( ' Kokiri Forest -> KF Links House ' , { ' index ' : 0x0272 } ) ,
( ' KF Links House -> Kokiri Forest ' , { ' index ' : 0x0211 } ) ) ,
( ' SpecialInterior ' , ( ' ToT Entrance -> Temple of Time ' , { ' index ' : 0x0053 } ) ,
( ' Temple of Time -> ToT Entrance ' , { ' index ' : 0x0472 } ) ) ,
( ' SpecialInterior ' , ( ' Kakariko Village -> Kak Windmill ' , { ' index ' : 0x0453 } ) ,
( ' Kak Windmill -> Kakariko Village ' , { ' index ' : 0x0351 } ) ) ,
( ' SpecialInterior ' , ( ' Kakariko Village -> Kak Potion Shop Front ' , { ' index ' : 0x0384 } ) ,
( ' Kak Potion Shop Front -> Kakariko Village ' , { ' index ' : 0x044B } ) ) ,
( ' SpecialInterior ' , ( ' Kak Backyard -> Kak Potion Shop Back ' , { ' index ' : 0x03EC } ) ,
( ' Kak Potion Shop Back -> Kak Backyard ' , { ' index ' : 0x04FF } ) ) ,
( ' Grotto ' , ( ' Desert Colossus -> Colossus Grotto ' , { ' grotto_id ' : 0x00 , ' entrance ' : 0x05BC , ' content ' : 0xFD , ' scene ' : 0x5C } ) ,
( ' Colossus Grotto -> Desert Colossus ' , { ' grotto_id ' : 0x00 } ) ) ,
( ' Grotto ' , ( ' Lake Hylia -> LH Grotto ' , { ' grotto_id ' : 0x01 , ' entrance ' : 0x05A4 , ' content ' : 0xEF , ' scene ' : 0x57 } ) ,
( ' LH Grotto -> Lake Hylia ' , { ' grotto_id ' : 0x01 } ) ) ,
( ' Grotto ' , ( ' Zora River -> ZR Storms Grotto ' , { ' grotto_id ' : 0x02 , ' entrance ' : 0x05BC , ' content ' : 0xEB , ' scene ' : 0x54 } ) ,
( ' ZR Storms Grotto -> Zora River ' , { ' grotto_id ' : 0x02 } ) ) ,
( ' Grotto ' , ( ' Zora River -> ZR Fairy Grotto ' , { ' grotto_id ' : 0x03 , ' entrance ' : 0x036D , ' content ' : 0xE6 , ' scene ' : 0x54 } ) ,
( ' ZR Fairy Grotto -> Zora River ' , { ' grotto_id ' : 0x03 } ) ) ,
( ' Grotto ' , ( ' Zora River -> ZR Open Grotto ' , { ' grotto_id ' : 0x04 , ' entrance ' : 0x003F , ' content ' : 0x29 , ' scene ' : 0x54 } ) ,
( ' ZR Open Grotto -> Zora River ' , { ' grotto_id ' : 0x04 } ) ) ,
( ' Grotto ' , ( ' DMC Lower Nearby -> DMC Hammer Grotto ' , { ' grotto_id ' : 0x05 , ' entrance ' : 0x05A4 , ' content ' : 0xF9 , ' scene ' : 0x61 } ) ,
( ' DMC Hammer Grotto -> DMC Lower Local ' , { ' grotto_id ' : 0x05 } ) ) ,
( ' Grotto ' , ( ' DMC Upper Nearby -> DMC Upper Grotto ' , { ' grotto_id ' : 0x06 , ' entrance ' : 0x003F , ' content ' : 0x7A , ' scene ' : 0x61 } ) ,
( ' DMC Upper Grotto -> DMC Upper Local ' , { ' grotto_id ' : 0x06 } ) ) ,
( ' Grotto ' , ( ' GC Grotto Platform -> GC Grotto ' , { ' grotto_id ' : 0x07 , ' entrance ' : 0x05A4 , ' content ' : 0xFB , ' scene ' : 0x62 } ) ,
( ' GC Grotto -> GC Grotto Platform ' , { ' grotto_id ' : 0x07 } ) ) ,
( ' Grotto ' , ( ' Death Mountain -> DMT Storms Grotto ' , { ' grotto_id ' : 0x08 , ' entrance ' : 0x003F , ' content ' : 0x57 , ' scene ' : 0x60 } ) ,
( ' DMT Storms Grotto -> Death Mountain ' , { ' grotto_id ' : 0x08 } ) ) ,
( ' Grotto ' , ( ' Death Mountain Summit -> DMT Cow Grotto ' , { ' grotto_id ' : 0x09 , ' entrance ' : 0x05FC , ' content ' : 0xF8 , ' scene ' : 0x60 } ) ,
( ' DMT Cow Grotto -> Death Mountain Summit ' , { ' grotto_id ' : 0x09 } ) ) ,
( ' Grotto ' , ( ' Kak Backyard -> Kak Open Grotto ' , { ' grotto_id ' : 0x0A , ' entrance ' : 0x003F , ' content ' : 0x28 , ' scene ' : 0x52 } ) ,
( ' Kak Open Grotto -> Kak Backyard ' , { ' grotto_id ' : 0x0A } ) ) ,
( ' Grotto ' , ( ' Kakariko Village -> Kak Redead Grotto ' , { ' grotto_id ' : 0x0B , ' entrance ' : 0x05A0 , ' content ' : 0xE7 , ' scene ' : 0x52 } ) ,
( ' Kak Redead Grotto -> Kakariko Village ' , { ' grotto_id ' : 0x0B } ) ) ,
( ' Grotto ' , ( ' Hyrule Castle Grounds -> HC Storms Grotto ' , { ' grotto_id ' : 0x0C , ' entrance ' : 0x05B8 , ' content ' : 0xF6 , ' scene ' : 0x5F } ) ,
( ' HC Storms Grotto -> Castle Grounds ' , { ' grotto_id ' : 0x0C } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Tektite Grotto ' , { ' grotto_id ' : 0x0D , ' entrance ' : 0x05C0 , ' content ' : 0xE1 , ' scene ' : 0x51 } ) ,
( ' HF Tektite Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x0D } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Near Kak Grotto ' , { ' grotto_id ' : 0x0E , ' entrance ' : 0x0598 , ' content ' : 0xE5 , ' scene ' : 0x51 } ) ,
( ' HF Near Kak Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x0E } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Fairy Grotto ' , { ' grotto_id ' : 0x0F , ' entrance ' : 0x036D , ' content ' : 0xFF , ' scene ' : 0x51 } ) ,
( ' HF Fairy Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x0F } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Near Market Grotto ' , { ' grotto_id ' : 0x10 , ' entrance ' : 0x003F , ' content ' : 0x00 , ' scene ' : 0x51 } ) ,
( ' HF Near Market Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x10 } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Cow Grotto ' , { ' grotto_id ' : 0x11 , ' entrance ' : 0x05A8 , ' content ' : 0xE4 , ' scene ' : 0x51 } ) ,
( ' HF Cow Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x11 } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Inside Fence Grotto ' , { ' grotto_id ' : 0x12 , ' entrance ' : 0x059C , ' content ' : 0xE6 , ' scene ' : 0x51 } ) ,
( ' HF Inside Fence Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x12 } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Open Grotto ' , { ' grotto_id ' : 0x13 , ' entrance ' : 0x003F , ' content ' : 0x03 , ' scene ' : 0x51 } ) ,
( ' HF Open Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x13 } ) ) ,
( ' Grotto ' , ( ' Hyrule Field -> HF Southeast Grotto ' , { ' grotto_id ' : 0x14 , ' entrance ' : 0x003F , ' content ' : 0x22 , ' scene ' : 0x51 } ) ,
( ' HF Southeast Grotto -> Hyrule Field ' , { ' grotto_id ' : 0x14 } ) ) ,
( ' Grotto ' , ( ' Lon Lon Ranch -> LLR Grotto ' , { ' grotto_id ' : 0x15 , ' entrance ' : 0x05A4 , ' content ' : 0xFC , ' scene ' : 0x63 } ) ,
( ' LLR Grotto -> Lon Lon Ranch ' , { ' grotto_id ' : 0x15 } ) ) ,
( ' Grotto ' , ( ' SFM Entryway -> SFM Wolfos Grotto ' , { ' grotto_id ' : 0x16 , ' entrance ' : 0x05B4 , ' content ' : 0xED , ' scene ' : 0x56 } ) ,
( ' SFM Wolfos Grotto -> SFM Entryway ' , { ' grotto_id ' : 0x16 } ) ) ,
( ' Grotto ' , ( ' Sacred Forest Meadow -> SFM Storms Grotto ' , { ' grotto_id ' : 0x17 , ' entrance ' : 0x05BC , ' content ' : 0xEE , ' scene ' : 0x56 } ) ,
( ' SFM Storms Grotto -> Sacred Forest Meadow ' , { ' grotto_id ' : 0x17 } ) ) ,
( ' Grotto ' , ( ' Sacred Forest Meadow -> SFM Fairy Grotto ' , { ' grotto_id ' : 0x18 , ' entrance ' : 0x036D , ' content ' : 0xFF , ' scene ' : 0x56 } ) ,
( ' SFM Fairy Grotto -> Sacred Forest Meadow ' , { ' grotto_id ' : 0x18 } ) ) ,
( ' Grotto ' , ( ' LW Beyond Mido -> LW Scrubs Grotto ' , { ' grotto_id ' : 0x19 , ' entrance ' : 0x05B0 , ' content ' : 0xF5 , ' scene ' : 0x5B } ) ,
( ' LW Scrubs Grotto -> LW Beyond Mido ' , { ' grotto_id ' : 0x19 } ) ) ,
( ' Grotto ' , ( ' Lost Woods -> LW Near Shortcuts Grotto ' , { ' grotto_id ' : 0x1A , ' entrance ' : 0x003F , ' content ' : 0x14 , ' scene ' : 0x5B } ) ,
( ' LW Near Shortcuts Grotto -> Lost Woods ' , { ' grotto_id ' : 0x1A } ) ) ,
( ' Grotto ' , ( ' Kokiri Forest -> KF Storms Grotto ' , { ' grotto_id ' : 0x1B , ' entrance ' : 0x003F , ' content ' : 0x2C , ' scene ' : 0x55 } ) ,
( ' KF Storms Grotto -> Kokiri Forest ' , { ' grotto_id ' : 0x1B } ) ) ,
( ' Grotto ' , ( ' Zoras Domain -> ZD Storms Grotto ' , { ' grotto_id ' : 0x1C , ' entrance ' : 0x036D , ' content ' : 0xFF , ' scene ' : 0x58 } ) ,
( ' ZD Storms Grotto -> Zoras Domain ' , { ' grotto_id ' : 0x1C } ) ) ,
2022-12-11 03:11:40 +00:00
( ' Grotto ' , ( ' GF Entrances Behind Crates -> GF Storms Grotto ' , { ' grotto_id ' : 0x1D , ' entrance ' : 0x036D , ' content ' : 0xFF , ' scene ' : 0x5D } ) ,
( ' GF Storms Grotto -> GF Entrances Behind Crates ' , { ' grotto_id ' : 0x1D } ) ) ,
2021-11-11 09:42:08 +00:00
( ' Grotto ' , ( ' GV Fortress Side -> GV Storms Grotto ' , { ' grotto_id ' : 0x1E , ' entrance ' : 0x05BC , ' content ' : 0xF0 , ' scene ' : 0x5A } ) ,
( ' GV Storms Grotto -> GV Fortress Side ' , { ' grotto_id ' : 0x1E } ) ) ,
( ' Grotto ' , ( ' GV Grotto Ledge -> GV Octorok Grotto ' , { ' grotto_id ' : 0x1F , ' entrance ' : 0x05AC , ' content ' : 0xF2 , ' scene ' : 0x5A } ) ,
( ' GV Octorok Grotto -> GV Grotto Ledge ' , { ' grotto_id ' : 0x1F } ) ) ,
( ' Grotto ' , ( ' LW Beyond Mido -> Deku Theater ' , { ' grotto_id ' : 0x20 , ' entrance ' : 0x05C4 , ' content ' : 0xF3 , ' scene ' : 0x5B } ) ,
( ' Deku Theater -> LW Beyond Mido ' , { ' grotto_id ' : 0x20 } ) ) ,
( ' Grave ' , ( ' Graveyard -> Graveyard Shield Grave ' , { ' index ' : 0x004B } ) ,
( ' Graveyard Shield Grave -> Graveyard ' , { ' index ' : 0x035D } ) ) ,
( ' Grave ' , ( ' Graveyard -> Graveyard Heart Piece Grave ' , { ' index ' : 0x031C } ) ,
( ' Graveyard Heart Piece Grave -> Graveyard ' , { ' index ' : 0x0361 } ) ) ,
2022-05-01 18:05:52 +00:00
( ' Grave ' , ( ' Graveyard -> Graveyard Royal Familys Tomb ' , { ' index ' : 0x002D } ) ,
( ' Graveyard Royal Familys Tomb -> Graveyard ' , { ' index ' : 0x050B } ) ) ,
2021-11-11 09:42:08 +00:00
( ' Grave ' , ( ' Graveyard -> Graveyard Dampes Grave ' , { ' index ' : 0x044F } ) ,
( ' Graveyard Dampes Grave -> Graveyard ' , { ' index ' : 0x0359 } ) ) ,
( ' Overworld ' , ( ' Kokiri Forest -> LW Bridge From Forest ' , { ' index ' : 0x05E0 } ) ,
( ' LW Bridge -> Kokiri Forest ' , { ' index ' : 0x020D } ) ) ,
( ' Overworld ' , ( ' Kokiri Forest -> Lost Woods ' , { ' index ' : 0x011E } ) ,
( ' LW Forest Exit -> Kokiri Forest ' , { ' index ' : 0x0286 } ) ) ,
( ' Overworld ' , ( ' Lost Woods -> GC Woods Warp ' , { ' index ' : 0x04E2 } ) ,
( ' GC Woods Warp -> Lost Woods ' , { ' index ' : 0x04D6 } ) ) ,
( ' Overworld ' , ( ' Lost Woods -> Zora River ' , { ' index ' : 0x01DD } ) ,
2022-12-11 03:11:40 +00:00
( ' Zora River -> LW Underwater Entrance ' , { ' index ' : 0x04DA } ) ) ,
2021-11-11 09:42:08 +00:00
( ' Overworld ' , ( ' LW Beyond Mido -> SFM Entryway ' , { ' index ' : 0x00FC } ) ,
( ' SFM Entryway -> LW Beyond Mido ' , { ' index ' : 0x01A9 } ) ) ,
( ' Overworld ' , ( ' LW Bridge -> Hyrule Field ' , { ' index ' : 0x0185 } ) ,
( ' Hyrule Field -> LW Bridge ' , { ' index ' : 0x04DE } ) ) ,
( ' Overworld ' , ( ' Hyrule Field -> Lake Hylia ' , { ' index ' : 0x0102 } ) ,
( ' Lake Hylia -> Hyrule Field ' , { ' index ' : 0x0189 } ) ) ,
( ' Overworld ' , ( ' Hyrule Field -> Gerudo Valley ' , { ' index ' : 0x0117 } ) ,
( ' Gerudo Valley -> Hyrule Field ' , { ' index ' : 0x018D } ) ) ,
( ' Overworld ' , ( ' Hyrule Field -> Market Entrance ' , { ' index ' : 0x0276 } ) ,
( ' Market Entrance -> Hyrule Field ' , { ' index ' : 0x01FD } ) ) ,
( ' Overworld ' , ( ' Hyrule Field -> Kakariko Village ' , { ' index ' : 0x00DB } ) ,
( ' Kakariko Village -> Hyrule Field ' , { ' index ' : 0x017D } ) ) ,
( ' Overworld ' , ( ' Hyrule Field -> ZR Front ' , { ' index ' : 0x00EA } ) ,
( ' ZR Front -> Hyrule Field ' , { ' index ' : 0x0181 } ) ) ,
( ' Overworld ' , ( ' Hyrule Field -> Lon Lon Ranch ' , { ' index ' : 0x0157 } ) ,
( ' Lon Lon Ranch -> Hyrule Field ' , { ' index ' : 0x01F9 } ) ) ,
( ' Overworld ' , ( ' Lake Hylia -> Zoras Domain ' , { ' index ' : 0x0328 } ) ,
( ' Zoras Domain -> Lake Hylia ' , { ' index ' : 0x0560 } ) ) ,
( ' Overworld ' , ( ' GV Fortress Side -> Gerudo Fortress ' , { ' index ' : 0x0129 } ) ,
( ' Gerudo Fortress -> GV Fortress Side ' , { ' index ' : 0x022D } ) ) ,
( ' Overworld ' , ( ' GF Outside Gate -> Wasteland Near Fortress ' , { ' index ' : 0x0130 } ) ,
( ' Wasteland Near Fortress -> GF Outside Gate ' , { ' index ' : 0x03AC } ) ) ,
( ' Overworld ' , ( ' Wasteland Near Colossus -> Desert Colossus ' , { ' index ' : 0x0123 } ) ,
( ' Desert Colossus -> Wasteland Near Colossus ' , { ' index ' : 0x0365 } ) ) ,
( ' Overworld ' , ( ' Market Entrance -> Market ' , { ' index ' : 0x00B1 } ) ,
( ' Market -> Market Entrance ' , { ' index ' : 0x0033 } ) ) ,
( ' Overworld ' , ( ' Market -> Castle Grounds ' , { ' index ' : 0x0138 } ) ,
( ' Castle Grounds -> Market ' , { ' index ' : 0x025A } ) ) ,
( ' Overworld ' , ( ' Market -> ToT Entrance ' , { ' index ' : 0x0171 } ) ,
( ' ToT Entrance -> Market ' , { ' index ' : 0x025E } ) ) ,
( ' Overworld ' , ( ' Kakariko Village -> Graveyard ' , { ' index ' : 0x00E4 } ) ,
( ' Graveyard -> Kakariko Village ' , { ' index ' : 0x0195 } ) ) ,
( ' Overworld ' , ( ' Kak Behind Gate -> Death Mountain ' , { ' index ' : 0x013D } ) ,
( ' Death Mountain -> Kak Behind Gate ' , { ' index ' : 0x0191 } ) ) ,
( ' Overworld ' , ( ' Death Mountain -> Goron City ' , { ' index ' : 0x014D } ) ,
( ' Goron City -> Death Mountain ' , { ' index ' : 0x01B9 } ) ) ,
( ' Overworld ' , ( ' GC Darunias Chamber -> DMC Lower Local ' , { ' index ' : 0x0246 } ) ,
( ' DMC Lower Nearby -> GC Darunias Chamber ' , { ' index ' : 0x01C1 } ) ) ,
( ' Overworld ' , ( ' Death Mountain Summit -> DMC Upper Local ' , { ' index ' : 0x0147 } ) ,
( ' DMC Upper Nearby -> Death Mountain Summit ' , { ' index ' : 0x01BD } ) ) ,
( ' Overworld ' , ( ' ZR Behind Waterfall -> Zoras Domain ' , { ' index ' : 0x0108 } ) ,
( ' Zoras Domain -> ZR Behind Waterfall ' , { ' index ' : 0x019D } ) ) ,
( ' Overworld ' , ( ' ZD Behind King Zora -> Zoras Fountain ' , { ' index ' : 0x0225 } ) ,
( ' Zoras Fountain -> ZD Behind King Zora ' , { ' index ' : 0x01A1 } ) ) ,
2021-11-14 13:30:40 +00:00
( ' Overworld ' , ( ' GV Lower Stream -> Lake Hylia ' , { ' index ' : 0x0219 } ) ) ,
2021-11-11 09:42:08 +00:00
( ' OwlDrop ' , ( ' LH Owl Flight -> Hyrule Field ' , { ' index ' : 0x027E , ' addresses ' : [ 0xAC9F26 ] } ) ) ,
( ' OwlDrop ' , ( ' DMT Owl Flight -> Kak Impas Rooftop ' , { ' index ' : 0x0554 , ' addresses ' : [ 0xAC9EF2 ] } ) ) ,
( ' Spawn ' , ( ' Child Spawn -> KF Links House ' , { ' index ' : 0x00BB , ' addresses ' : [ 0xB06342 ] } ) ) ,
( ' Spawn ' , ( ' Adult Spawn -> Temple of Time ' , { ' index ' : 0x05F4 , ' addresses ' : [ 0xB06332 ] } ) ) ,
( ' WarpSong ' , ( ' Minuet of Forest Warp -> Sacred Forest Meadow ' , { ' index ' : 0x0600 , ' addresses ' : [ 0xBF023C ] } ) ) ,
( ' WarpSong ' , ( ' Bolero of Fire Warp -> DMC Central Local ' , { ' index ' : 0x04F6 , ' addresses ' : [ 0xBF023E ] } ) ) ,
( ' WarpSong ' , ( ' Serenade of Water Warp -> Lake Hylia ' , { ' index ' : 0x0604 , ' addresses ' : [ 0xBF0240 ] } ) ) ,
( ' WarpSong ' , ( ' Requiem of Spirit Warp -> Desert Colossus ' , { ' index ' : 0x01F1 , ' addresses ' : [ 0xBF0242 ] } ) ) ,
( ' WarpSong ' , ( ' Nocturne of Shadow Warp -> Graveyard Warp Pad Region ' , { ' index ' : 0x0568 , ' addresses ' : [ 0xBF0244 ] } ) ) ,
( ' WarpSong ' , ( ' Prelude of Light Warp -> Temple of Time ' , { ' index ' : 0x05F4 , ' addresses ' : [ 0xBF0246 ] } ) ) ,
( ' Extra ' , ( ' ZD Eyeball Frog Timeout -> Zoras Domain ' , { ' index ' : 0x0153 } ) ) ,
( ' Extra ' , ( ' ZR Top of Waterfall -> Zora River ' , { ' index ' : 0x0199 } ) ) ,
]
2022-12-11 03:11:40 +00:00
def _add_boss_entrances ( ) :
# Compute this at load time to save a lot of duplication
dungeon_data = { }
for type , forward , * reverse in entrance_shuffle_table :
if type != ' Dungeon ' :
continue
if not reverse :
continue
name , forward = forward
reverse = reverse [ 0 ] [ 1 ]
if ' blue_warp ' not in reverse :
continue
dungeon_data [ name ] = {
' dungeon_index ' : forward [ ' index ' ] ,
' exit_index ' : reverse [ ' index ' ] ,
' exit_blue_warp ' : reverse [ ' blue_warp ' ]
}
for type , source , target , dungeon , index , rindex , addresses in [
(
' ChildBoss ' , ' Deku Tree Boss Door ' , ' Queen Gohma Boss Room ' ,
' KF Outside Deku Tree -> Deku Tree Lobby ' ,
0x040f , 0x0252 , [ 0xB06292 , 0xBC6162 , 0xBC60AE ]
) ,
(
' ChildBoss ' , ' Dodongos Cavern Boss Door ' , ' King Dodongo Boss Room ' ,
' Death Mountain -> Dodongos Cavern Beginning ' ,
0x040b , 0x00c5 , [ 0xB062B6 , 0xBC616E ]
) ,
(
' ChildBoss ' , ' Jabu Jabus Belly Boss Door ' , ' Barinade Boss Room ' ,
' Zoras Fountain -> Jabu Jabus Belly Beginning ' ,
0x0301 , 0x0407 , [ 0xB062C2 , 0xBC60C2 ]
) ,
(
' AdultBoss ' , ' Forest Temple Boss Door ' , ' Phantom Ganon Boss Room ' ,
' SFM Forest Temple Entrance Ledge -> Forest Temple Lobby ' ,
0x000c , 0x024E , [ 0xB062CE , 0xBC6182 ]
) ,
(
' AdultBoss ' , ' Fire Temple Boss Door ' , ' Volvagia Boss Room ' ,
' DMC Fire Temple Entrance -> Fire Temple Lower ' ,
0x0305 , 0x0175 , [ 0xB062DA , 0xBC60CE ]
) ,
(
' AdultBoss ' , ' Water Temple Boss Door ' , ' Morpha Boss Room ' ,
' Lake Hylia -> Water Temple Lobby ' ,
0x0417 , 0x0423 , [ 0xB062E6 , 0xBC6196 ]
) ,
(
' AdultBoss ' , ' Spirit Temple Boss Door ' , ' Twinrova Boss Room ' ,
' Desert Colossus -> Spirit Temple Lobby ' ,
0x008D , 0x02F5 , [ 0xB062F2 , 0xBC6122 ]
) ,
(
' AdultBoss ' , ' Shadow Temple Boss Door ' , ' Bongo Bongo Boss Room ' ,
' Graveyard Warp Pad Region -> Shadow Temple Entryway ' ,
0x0413 , 0x02B2 , [ 0xB062FE , 0xBC61AA ]
)
] :
d = { ' index ' : index , ' patch_addresses ' : addresses }
d . update ( dungeon_data [ dungeon ] )
entrance_shuffle_table . append (
( type , ( f " { source } -> { target } " , d ) , ( f " { target } -> { source } " , { ' index ' : rindex } ) )
)
_add_boss_entrances ( )
2021-11-11 09:42:08 +00:00
# Basically, the entrances in the list above that go to:
# - DMC Central Local (child access for the bean and skull)
# - Desert Colossus (child access to colossus and spirit)
# - Graveyard Warp Pad Region (access to shadow, plus the gossip stone)
# We will always need to pick one from each list to receive a one-way entrance
# if shuffling warp songs (depending on other settings).
# Table maps: short key -> ([target regions], [allowed types])
priority_entrance_table = {
' Bolero ' : ( [ ' DMC Central Local ' ] , [ ' OwlDrop ' , ' WarpSong ' ] ) ,
' Nocturne ' : ( [ ' Graveyard Warp Pad Region ' ] , [ ' OwlDrop ' , ' Spawn ' , ' WarpSong ' ] ) ,
' Requiem ' : ( [ ' Desert Colossus ' , ' Desert Colossus From Spirit Lobby ' ] , [ ' OwlDrop ' , ' Spawn ' , ' WarpSong ' ] ) ,
}
2022-10-15 10:39:04 +00:00
# These hint texts have more than one entrance, so they are OK for impa's house and potion shop
multi_interior_regions = {
' Kokiri Forest ' ,
' Lake Hylia ' ,
' the Market ' ,
' Kakariko Village ' ,
' Lon Lon Ranch ' ,
}
interior_entrance_bias = {
2023-10-30 03:05:49 +00:00
' ToT Entrance -> Temple of Time ' : 4 ,
' Kakariko Village -> Kak Potion Shop Front ' : 3 ,
' Kak Backyard -> Kak Potion Shop Back ' : 3 ,
' Kakariko Village -> Kak Impas House ' : 2 ,
' Kak Impas Ledge -> Kak Impas House Back ' : 2 ,
2022-10-15 10:39:04 +00:00
' Market Entrance -> Market Guard House ' : 2 ,
2023-10-30 03:05:49 +00:00
' Goron City -> GC Shop ' : 1 ,
' Zoras Domain -> ZD Shop ' : 1 ,
2022-10-15 10:39:04 +00:00
}
2021-11-11 09:42:08 +00:00
class EntranceShuffleError ( Exception ) :
pass
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
def shuffle_random_entrances ( ootworld ) :
2022-11-01 02:41:21 +00:00
world = ootworld . multiworld
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
player = ootworld . player
# Gather locations to keep reachable for validation
2023-10-30 03:05:49 +00:00
all_state = ootworld . get_state_with_complete_itempool ( )
all_state . sweep_for_events ( locations = ootworld . get_locations ( ) )
2021-11-11 09:42:08 +00:00
locations_to_ensure_reachable = { loc for loc in world . get_reachable_locations ( all_state , player ) if not ( loc . type == ' Drop ' or ( loc . type == ' Event ' and ' Subrule ' in loc . name ) ) }
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Set entrance data for all entrances
2021-11-11 09:42:08 +00:00
set_all_entrances_data ( world , player )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Determine entrance pools based on settings
2021-11-11 09:42:08 +00:00
one_way_entrance_pools = { }
entrance_pools = { }
one_way_priorities = { }
if ootworld . owl_drops :
one_way_entrance_pools [ ' OwlDrop ' ] = ootworld . get_shufflable_entrances ( type = ' OwlDrop ' )
if ootworld . warp_songs :
one_way_entrance_pools [ ' WarpSong ' ] = ootworld . get_shufflable_entrances ( type = ' WarpSong ' )
2023-01-26 03:31:00 +00:00
# No more exceptions for NL here, causes cascading failures later
one_way_priorities [ ' Bolero ' ] = priority_entrance_table [ ' Bolero ' ]
one_way_priorities [ ' Nocturne ' ] = priority_entrance_table [ ' Nocturne ' ]
if not ootworld . shuffle_dungeon_entrances and not ootworld . shuffle_overworld_entrances :
one_way_priorities [ ' Requiem ' ] = priority_entrance_table [ ' Requiem ' ]
2022-02-12 05:17:28 +00:00
if ootworld . spawn_positions :
one_way_entrance_pools [ ' Spawn ' ] = ootworld . get_shufflable_entrances ( type = ' Spawn ' )
2022-12-11 03:11:40 +00:00
if ' child ' not in ootworld . spawn_positions :
one_way_entrance_pools [ ' Spawn ' ] . remove ( ootworld . get_entrance ( ' Child Spawn -> KF Links House ' ) )
if ' adult ' not in ootworld . spawn_positions :
one_way_entrance_pools [ ' Spawn ' ] . remove ( ootworld . get_entrance ( ' Adult Spawn -> Temple of Time ' ) )
if ootworld . shuffle_bosses == ' full ' :
entrance_pools [ ' Boss ' ] = ootworld . get_shufflable_entrances ( type = ' ChildBoss ' , only_primary = True )
entrance_pools [ ' Boss ' ] + = ootworld . get_shufflable_entrances ( type = ' AdultBoss ' , only_primary = True )
elif ootworld . shuffle_bosses == ' limited ' :
entrance_pools [ ' ChildBoss ' ] = ootworld . get_shufflable_entrances ( type = ' ChildBoss ' , only_primary = True )
entrance_pools [ ' AdultBoss ' ] = ootworld . get_shufflable_entrances ( type = ' AdultBoss ' , only_primary = True )
2021-11-11 09:42:08 +00:00
if ootworld . shuffle_dungeon_entrances :
entrance_pools [ ' Dungeon ' ] = ootworld . get_shufflable_entrances ( type = ' Dungeon ' , only_primary = True )
if ootworld . open_forest == ' closed ' :
2022-12-21 22:02:56 +00:00
entrance_pools [ ' Dungeon ' ] . remove ( ootworld . get_entrance ( ' KF Outside Deku Tree -> Deku Tree Lobby ' ) )
2022-12-11 03:11:40 +00:00
if ootworld . shuffle_special_dungeon_entrances :
entrance_pools [ ' Dungeon ' ] + = ootworld . get_shufflable_entrances ( type = ' DungeonSpecial ' , only_primary = True )
2021-11-14 13:30:40 +00:00
if ootworld . decouple_entrances :
entrance_pools [ ' DungeonReverse ' ] = [ entrance . reverse for entrance in entrance_pools [ ' Dungeon ' ] ]
2021-11-11 09:42:08 +00:00
if ootworld . shuffle_interior_entrances != ' off ' :
entrance_pools [ ' Interior ' ] = ootworld . get_shufflable_entrances ( type = ' Interior ' , only_primary = True )
if ootworld . shuffle_special_interior_entrances :
entrance_pools [ ' Interior ' ] + = ootworld . get_shufflable_entrances ( type = ' SpecialInterior ' , only_primary = True )
2021-11-14 13:30:40 +00:00
if ootworld . decouple_entrances :
entrance_pools [ ' InteriorReverse ' ] = [ entrance . reverse for entrance in entrance_pools [ ' Interior ' ] ]
2021-11-11 09:42:08 +00:00
if ootworld . shuffle_grotto_entrances :
entrance_pools [ ' GrottoGrave ' ] = ootworld . get_shufflable_entrances ( type = ' Grotto ' , only_primary = True )
entrance_pools [ ' GrottoGrave ' ] + = ootworld . get_shufflable_entrances ( type = ' Grave ' , only_primary = True )
2021-11-14 13:30:40 +00:00
if ootworld . decouple_entrances :
entrance_pools [ ' GrottoGraveReverse ' ] = [ entrance . reverse for entrance in entrance_pools [ ' GrottoGrave ' ] ]
2021-11-11 09:42:08 +00:00
if ootworld . shuffle_overworld_entrances :
2021-11-14 13:06:09 +00:00
exclude_overworld_reverse = ootworld . mix_entrance_pools == ' all ' and not ootworld . decouple_entrances
entrance_pools [ ' Overworld ' ] = ootworld . get_shufflable_entrances ( type = ' Overworld ' , only_primary = exclude_overworld_reverse )
2021-11-14 13:30:40 +00:00
if not ootworld . decouple_entrances :
2022-12-21 22:02:56 +00:00
entrance_pools [ ' Overworld ' ] . remove ( ootworld . get_entrance ( ' GV Lower Stream -> Lake Hylia ' ) )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Mark shuffled entrances
2021-11-11 09:42:08 +00:00
for entrance in chain ( chain . from_iterable ( one_way_entrance_pools . values ( ) ) , chain . from_iterable ( entrance_pools . values ( ) ) ) :
entrance . shuffled = True
if entrance . reverse :
entrance . reverse . shuffled = True
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
2021-11-14 13:06:09 +00:00
# Combine all entrance pools if mixing
if ootworld . mix_entrance_pools == ' all ' :
entrance_pools = { ' Mixed ' : list ( chain . from_iterable ( entrance_pools . values ( ) ) ) }
elif ootworld . mix_entrance_pools == ' indoor ' :
if ootworld . shuffle_overworld_entrances :
ow_pool = entrance_pools [ ' Overworld ' ]
entrance_pools = { ' Mixed ' : list ( filter ( lambda entrance : entrance . type != ' Overworld ' , chain . from_iterable ( entrance_pools . values ( ) ) ) ) }
if ootworld . shuffle_overworld_entrances :
entrance_pools [ ' Overworld ' ] = ow_pool
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Build target entrance pools
2021-11-11 09:42:08 +00:00
one_way_target_entrance_pools = { }
for pool_type , entrance_pool in one_way_entrance_pools . items ( ) :
if pool_type == ' OwlDrop ' :
valid_target_types = ( ' WarpSong ' , ' OwlDrop ' , ' Overworld ' , ' Extra ' )
2023-10-30 03:05:49 +00:00
one_way_target_entrance_pools [ pool_type ] = build_one_way_targets ( ootworld , pool_type , valid_target_types , exclude = [ ' Prelude of Light Warp -> Temple of Time ' ] )
2021-11-11 09:42:08 +00:00
for target in one_way_target_entrance_pools [ pool_type ] :
set_rule ( target , lambda state : state . _oot_reach_as_age ( target . parent_region , ' child ' , player ) )
elif pool_type in { ' Spawn ' , ' WarpSong ' } :
valid_target_types = ( ' Spawn ' , ' WarpSong ' , ' OwlDrop ' , ' Overworld ' , ' Interior ' , ' SpecialInterior ' , ' Extra ' )
2023-10-30 03:05:49 +00:00
one_way_target_entrance_pools [ pool_type ] = build_one_way_targets ( ootworld , pool_type , valid_target_types )
2021-11-16 14:24:30 +00:00
# Ensure that the last entrance doesn't assume the rest of the targets are reachable
for target in one_way_target_entrance_pools [ pool_type ] :
add_rule ( target , ( lambda entrances = entrance_pool : ( lambda state : any ( entrance . connected_region == None for entrance in entrances ) ) ) ( ) )
2021-11-11 09:42:08 +00:00
# Disconnect one-way entrances for priority placement
for entrance in chain . from_iterable ( one_way_entrance_pools . values ( ) ) :
entrance . disconnect ( )
target_entrance_pools = { }
for pool_type , entrance_pool in entrance_pools . items ( ) :
2023-10-30 03:05:49 +00:00
target_entrance_pools [ pool_type ] = assume_entrance_pool ( entrance_pool , ootworld , pool_type )
2021-11-11 09:42:08 +00:00
# Build all_state and none_state
2021-11-12 12:58:22 +00:00
all_state = ootworld . get_state_with_complete_itempool ( )
2023-10-30 03:05:49 +00:00
none_state = CollectionState ( ootworld . multiworld )
2021-11-11 09:42:08 +00:00
2021-11-20 21:36:57 +00:00
# Plando entrances
if world . plando_connections [ player ] :
rollbacks = [ ]
all_targets = { * * one_way_target_entrance_pools , * * target_entrance_pools }
for conn in world . plando_connections [ player ] :
try :
entrance = ootworld . get_entrance ( conn . entrance )
exit = ootworld . get_entrance ( conn . exit )
if entrance is None :
raise EntranceShuffleError ( f " Could not find entrance to plando: { conn . entrance } " )
if exit is None :
raise EntranceShuffleError ( f " Could not find entrance to plando: { conn . exit } " )
target_region = exit . name . split ( ' -> ' ) [ 1 ]
target_parent = exit . parent_region . name
pool_type = entrance . type
matched_targets_to_region = list ( filter ( lambda target : target . connected_region and target . connected_region . name == target_region ,
all_targets [ pool_type ] ) )
target = next ( filter ( lambda target : target . replaces . parent_region . name == target_parent , matched_targets_to_region ) )
replace_entrance ( ootworld , entrance , target , rollbacks , locations_to_ensure_reachable , all_state , none_state )
if conn . direction == ' both ' and entrance . reverse and ootworld . decouple_entrances :
replace_entrance ( ootworld , entrance . reverse , target . reverse , rollbacks , locations_to_ensure_reachable , all_state , none_state )
except EntranceShuffleError as e :
raise RuntimeError ( f " Failed to plando OoT entrances. Reason: { e } " )
except StopIteration :
raise RuntimeError ( f " Could not find entrance to plando: { conn . entrance } => { conn . exit } " )
finally :
for ( entrance , target ) in rollbacks :
confirm_replacement ( entrance , target )
# Check placed one way entrances and trim.
# The placed entrances are already pointing at their new regions.
placed_entrances = [ entrance for entrance in chain . from_iterable ( one_way_entrance_pools . values ( ) )
if entrance . replaces is not None ]
replaced_entrances = [ entrance . replaces for entrance in placed_entrances ]
# Remove replaced entrances so we don't place two in one target.
for remaining_target in chain . from_iterable ( one_way_target_entrance_pools . values ( ) ) :
if remaining_target . replaces and remaining_target . replaces in replaced_entrances :
delete_target_entrance ( remaining_target )
# Remove priority targets if any placed entrances point at their region(s).
for key , ( regions , _ ) in priority_entrance_table . items ( ) :
if key in one_way_priorities :
for entrance in placed_entrances :
if entrance . connected_region and entrance . connected_region . name in regions :
del one_way_priorities [ key ]
break
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Place priority entrances
2021-11-11 09:42:08 +00:00
shuffle_one_way_priority_entrances ( ootworld , one_way_priorities , one_way_entrance_pools , one_way_target_entrance_pools , locations_to_ensure_reachable , all_state , none_state , retry_count = 2 )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Delete priority targets from one-way pools
2021-11-11 09:42:08 +00:00
replaced_entrances = [ entrance . replaces for entrance in chain . from_iterable ( one_way_entrance_pools . values ( ) ) ]
for remaining_target in chain . from_iterable ( one_way_target_entrance_pools . values ( ) ) :
if remaining_target . replaces in replaced_entrances :
delete_target_entrance ( remaining_target )
for pool_type , entrance_pool in one_way_entrance_pools . items ( ) :
2022-10-15 10:39:04 +00:00
shuffle_entrance_pool ( ootworld , pool_type , entrance_pool , one_way_target_entrance_pools [ pool_type ] , locations_to_ensure_reachable , all_state , none_state , check_all = True , retry_count = 5 )
2021-11-11 09:42:08 +00:00
replaced_entrances = [ entrance . replaces for entrance in entrance_pool ]
for remaining_target in chain . from_iterable ( one_way_target_entrance_pools . values ( ) ) :
if remaining_target . replaces in replaced_entrances :
delete_target_entrance ( remaining_target )
for unused_target in one_way_target_entrance_pools [ pool_type ] :
delete_target_entrance ( unused_target )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Shuffle all entrance pools, in order
2021-11-11 09:42:08 +00:00
for pool_type , entrance_pool in entrance_pools . items ( ) :
2022-10-15 10:39:04 +00:00
shuffle_entrance_pool ( ootworld , pool_type , entrance_pool , target_entrance_pools [ pool_type ] , locations_to_ensure_reachable , all_state , none_state , check_all = True )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
2021-11-11 09:42:08 +00:00
# Multiple checks after shuffling to ensure everything is OK
# Check that all entrances hook up correctly
for entrance in ootworld . get_shuffled_entrances ( ) :
if entrance . connected_region == None :
logging . getLogger ( ' ' ) . error ( f ' { entrance } was shuffled but is not connected to any region ' )
if entrance . replaces == None :
logging . getLogger ( ' ' ) . error ( f ' { entrance } was shuffled but does not replace any entrance ' )
if len ( ootworld . get_region ( ' Root Exits ' ) . exits ) > 8 :
for exit in ootworld . get_region ( ' Root Exits ' ) . exits :
logging . getLogger ( ' ' ) . error ( f ' Root Exit: { exit } -> { exit . connected_region } ' )
logging . getLogger ( ' ' ) . error ( f ' Root has too many entrances left after shuffling entrances ' )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Game is beatable
2023-10-30 03:05:49 +00:00
new_all_state = ootworld . get_state_with_complete_itempool ( )
2021-11-11 09:42:08 +00:00
if not world . has_beaten_game ( new_all_state , player ) :
raise EntranceShuffleError ( ' Cannot beat game ' )
Ocarina of Time (#64)
* first commit (not including OoT data files yet)
* added some basic options
* rule parser works now at least
* make sure to commit everything this time
* temporary change to BaseClasses for oot
* overworld location graph builds mostly correctly
* adding oot data files
* commenting out world options until later since they only existed to make the RuleParser work
* conversion functions between AP ids and OOT ids
* world graph outputs
* set scrub prices
* itempool generates, entrances connected, way too many options added
* fixed set_rules and set_shop_rules
* temp baseclasses changes
* Reaches the fill step now, old event-based system retained in case the new way breaks
* Song placements and misc fixes everywhere
* temporary changes to make oot work
* changed root exits for AP fill framework
* prevent infinite recursion due to OoT sharing usage of the address field
* age reachability works hopefully, songs are broken again
* working spoiler log generation on beatable-only
* Logic tricks implemented
* need this for logic tricks
* fixed map/compass being placed on Serenade location
* kill unreachable events before filling the world
* add a bunch of utility functions to prepare for rom patching
* move OptionList into generic options
* fixed some silly bugs with OptionList
* properly seed all random behavior (so far)
* ROM generation working
* fix hints trying to get alttp dungeon hint texts
* continue fixing hints
* add oot to network data package
* change item and location IDs to 66000 and 67000 range respectively
* push removed items to precollected items
* fixed various issues with cross-contamination with multiple world generation
* reenable glitched logic (hopefully)
* glitched world files age-check fix
* cleaned up some get_locations calls
* added token shuffle and scrub shuffle, modified some options slightly to make the parsing work
* reenable MQ dungeons
* fix forest mq exception
* made targeting style an option for now, will be cosmetic later
* reminder to move targeting to cosmetics
* some oot option maintenance
* enabled starting time of day
* fixed issue breaking shop slots in multiworld generation
* added "off" option for text shuffle and hints
* shopsanity functionality restored
* change patch file extension
* remove unnecessary utility functions + imports
* update MIT license
* change option to "patch_uncompressed_rom" instead of "compress_rom"
* compliance with new AutoWorld systems
* Kill only internal events, remove non-internal big poe event in code
* re-add the big poe event and handle it correctly
* remove extra method in Range option
* fix typo
* Starting items, starting with consumables option
* do not remove nonexistent item
* move set_shop_rules to after shop items are placed
* some cleanup
* add retries for song placement
* flagged Skull Mask and Mask of Truth as advancement items
* update OoT to use LogicMixin
* Fixed trying to assign starting items from the wrong players
* fixed song retry step
* improved option handling, comments, and starting item replacements
* DefaultOnToggle writes Yes or No to spoiler
* enable compression of output if Compress executable is present
* clean up compression
* check whether (de)compressor exists before running the process
* allow specification of rom path in host.yaml
* check if decompressed file already exists before decompressing again
* fix triforce hunt generation
* rename all the oot state functions with prefix
* OoT: mark triforce pieces as completion goal for triforce hunt
* added overworld and any-dungeon shuffle for dungeon items
* Hide most unshuffled locations and events from the list of locations in spoiler
* build oot option ranges with a generic function instead of defining each separately
* move oot output-type control to host.yaml instead of individual yamls
* implement dungeon song shuffle
* minor improvements to overworld dungeon item shuffle
* remove random ice trap names in shops, mostly to avoid maintaining a massive censor list
* always output patch file to folder, remove option to generate ROM in preparation for removal
* re-add the fix for infinite recursion due to not being light or dark world
* change AP-sendable to Ocarina of Time model, since the triforce piece has some extra code apparently
* oot: remove item_names and location_names
* oot: minor fixes
* oot: comment out ROM patching
* oot: only add CollectionState objects on creation if actually needed
* main entrance shuffle method and entrances-based rules
* fix entrances based rules
* disable master quest and big poe count options for client compatibility
* use get_player_name instead of get_player_names
* fix OptionList
* fix oot options for new option system
* new coop section in oot rom: expand player names to 16 bytes, write AP_PLAYER_NAME at end of PLAYER_NAMES
* fill AP player name in oot rom with 0 instead of 0xDF
* encode player name with ASCII for fixed-width
* revert oot player name array to 8 bytes per name
* remove Pierre location if fast scarecrow is on
* check player name length
* "free_scarecrow" not "fast_scarecrow"
* OoT locations now properly store the AP ID instead of the oot internal ID
* oot __version__ updates in lockstep with AP version
* pull in unmodified oot cosmetic files
* also grab JSONDump since it's needed apparently
* gather extra needed methods, modify imports
* delete cosmetics log, replace all instances of SettingsList with OOTWorld
* cosmetic options working, except for sound effects (due to ear-safe issues)
* SFX, Music, and Fanfare randomization reenabled
* move OoT data files into the worlds folder
* move Compress and Decompress into oot data folder
* Replace get_all_state with custom method to avoid the cache
* OoT ROM: increment item counter before setting incoming item/player values to 0, preventing desync issues
* set data_version to 0
* make Kokiri Sword shuffle off by default
* reenable "Random Choice" for various cosmetic options
* kill Ruto's Letter turnin if open fountain
also fix for shopsanity
* place Buy Goron/Zora Tunic first in shop shuffle
* make ice traps appear as other items instead of breaking generation
* managed to break ice traps on non-major-only
* only handle ice traps if they are on
* fix shopsanity for non-oot games, and write player name instead of player number
* light arrows hint uses player name instead of player number
* Reenable "skip child zelda" option
* fix entrances_based_rules
* fix ganondorf hint if starting with light arrows
* fix dungeonitem shuffle and shopsanity interaction
* remove has_all_of, has_any_of, count_of in BaseClasses, replace usage with has_all, has_any, has_group
* force local giveable item on ZL if skip_child_zelda and shuffle_song_items is any
* keep bosses and bombchu bowling chus out of data package
* revert workaround for infinite recursion and fix it properly
* fix shared shop id caches during patching process
* fix shop text box overflows, as much as possible
* add default oot host.yaml option
* add .apz5, .n64, .z64 to gitignore
* Properly document and name all (functioning) OOT options
* clean up some imports
* remove unnecessary files from oot's data
* fix typo in gitignore
* readd the Compress and Decompress utilities, since they are needed for generation
* cleanup of imports and some minor optimizations
* increase shop offset for item IDs to 0xCB
* remove shop item AP ids entirely
* prevent triforce pieces for other players from being received by yourself
* add "excluded" property to Location
* Hint system adapted and reenabled; hints still unseeded
* make hints deterministic with lists instead of sets
* do not allow hints to point to Light Arrows on non-vanilla bridge
* foreign locations hint as their full name in OoT rather than their region
* checkedLocations now stores hint names by player ID, so that the same location in different worlds can have hints associated
* consolidate versioning in Utils
* ice traps appear as major items rather than any progression item
* set prescription and claim check as defaults for adult trade item settings
* add oot options to playerSettings
* allow case-insensitive logic tricks in yaml
* fix oot shopsanity option formatting
* Write OoT override info even if local item, enabling local checks to show up immediately in the client
* implement CollectionState.can_live_dmg for oot glitched logic
* filter item names for invalid characters when patching shops
* make ice traps appear according to the settings of the world they are shuffled into, rather than the original world
* set hidden-spoiler items and locations with Shop items to events
* make GF carpenters, Gerudo Card, Malon, ZL, and Impa events if the relevant settings are enabled, preventing them from appearing in the client on game start
* Fix oot Glitched and No Logic generation
* fix indenting
* Greatly reduce displayed cosmetic options
* Change oot data version to 1
* add apz5 distribution to webhost
* print player name if an ALttP dungeon contains a good item for OoT world
* delete unneeded commented code
* remove OcarinaSongs import to satisfy lint
2021-09-02 12:35:05 +00:00
# Validate world
2021-11-11 09:42:08 +00:00
validate_world ( ootworld , None , locations_to_ensure_reachable , all_state , none_state )
def replace_entrance ( ootworld , entrance , target , rollbacks , locations_to_ensure_reachable , all_state , none_state ) :
try :
check_entrances_compatibility ( entrance , target , rollbacks )
change_connections ( entrance , target )
validate_world ( ootworld , entrance , locations_to_ensure_reachable , all_state , none_state )
rollbacks . append ( ( entrance , target ) )
return True
except EntranceShuffleError as e :
logging . getLogger ( ' ' ) . debug ( f ' Failed to connect { entrance } to { target } , reason: { e } ' )
if entrance . connected_region :
restore_connections ( entrance , target )
return False
def shuffle_one_way_priority_entrances ( ootworld , one_way_priorities , one_way_entrance_pools , one_way_target_entrance_pools ,
locations_to_ensure_reachable , all_state , none_state , retry_count = 2 ) :
ootworld . priority_entrances = [ ]
while retry_count :
retry_count - = 1
rollbacks = [ ]
try :
for key , ( regions , types ) in one_way_priorities . items ( ) :
place_one_way_priority_entrance ( ootworld , key , regions , types , rollbacks , locations_to_ensure_reachable ,
all_state , none_state , one_way_entrance_pools , one_way_target_entrance_pools )
for entrance , target in rollbacks :
confirm_replacement ( entrance , target )
return
except EntranceShuffleError as error :
for entrance , target in rollbacks :
restore_connections ( entrance , target )
logging . getLogger ( ' ' ) . debug ( f ' Failed to place all priority one-way entrances, retrying { retry_count } more times ' )
raise EntranceShuffleError ( f ' Priority one-way entrance placement attempt count exceeded for world { ootworld . player } ' )
def place_one_way_priority_entrance ( ootworld , priority_name , allowed_regions , allowed_types , rollbacks , locations_to_ensure_reachable ,
all_state , none_state , one_way_entrance_pools , one_way_target_entrance_pools ) :
avail_pool = list ( chain . from_iterable ( one_way_entrance_pools [ t ] for t in allowed_types if t in one_way_entrance_pools ) )
2022-11-01 02:41:21 +00:00
ootworld . multiworld . random . shuffle ( avail_pool )
2021-11-11 09:42:08 +00:00
for entrance in avail_pool :
if entrance . replaces :
continue
2022-02-12 05:17:28 +00:00
# With mask hints, child needs to be able to access the gossip stone.
2021-11-11 09:42:08 +00:00
if entrance . parent_region . name == ' Adult Spawn ' and ( priority_name != ' Nocturne ' or ootworld . hints == ' mask ' ) :
continue
2022-02-12 05:17:28 +00:00
# With dungeons unshuffled, adult needs to be able to access Shadow Temple.
2021-11-11 09:42:08 +00:00
if not ootworld . shuffle_dungeon_entrances and priority_name == ' Nocturne ' :
if entrance . type != ' WarpSong ' and entrance . parent_region . name != ' Adult Spawn ' :
continue
2022-02-12 05:17:28 +00:00
# With overworld unshuffled, child can't spawn at Desert Colossus
if not ootworld . shuffle_overworld_entrances and priority_name == ' Requiem ' and entrance . parent_region . name == ' Child Spawn ' :
continue
2021-11-11 09:42:08 +00:00
for target in one_way_target_entrance_pools [ entrance . type ] :
if target . connected_region and target . connected_region . name in allowed_regions :
if replace_entrance ( ootworld , entrance , target , rollbacks , locations_to_ensure_reachable , all_state , none_state ) :
logging . getLogger ( ' ' ) . debug ( f ' Priority placing { entrance } as { target } for { priority_name } ' )
ootworld . priority_entrances . append ( entrance )
return
raise EntranceShuffleError ( f ' Unable to place priority one-way entrance for { priority_name } in world { ootworld . player } ' )
2023-10-30 03:05:49 +00:00
def shuffle_entrance_pool ( ootworld , pool_type , entrance_pool , target_entrances , locations_to_ensure_reachable , all_state , none_state , check_all = False , retry_count = 10 ) :
2021-11-11 09:42:08 +00:00
restrictive_entrances , soft_entrances = split_entrances_by_requirements ( ootworld , entrance_pool , target_entrances )
while retry_count :
retry_count - = 1
rollbacks = [ ]
try :
2022-10-15 10:39:04 +00:00
shuffle_entrances ( ootworld , pool_type + ' Rest ' , restrictive_entrances , target_entrances , rollbacks , locations_to_ensure_reachable , all_state , none_state )
2021-11-11 09:42:08 +00:00
if check_all :
2022-10-15 10:39:04 +00:00
shuffle_entrances ( ootworld , pool_type + ' Soft ' , soft_entrances , target_entrances , rollbacks , locations_to_ensure_reachable , all_state , none_state )
2021-11-11 09:42:08 +00:00
else :
2022-10-15 10:39:04 +00:00
shuffle_entrances ( ootworld , pool_type + ' Soft ' , soft_entrances , target_entrances , rollbacks , set ( ) , all_state , none_state )
2021-11-11 09:42:08 +00:00
validate_world ( ootworld , None , locations_to_ensure_reachable , all_state , none_state )
for entrance , target in rollbacks :
confirm_replacement ( entrance , target )
return
except EntranceShuffleError as e :
for entrance , target in rollbacks :
restore_connections ( entrance , target )
logging . getLogger ( ' ' ) . debug ( f ' Failed to place all entrances in pool, retrying { retry_count } more times ' )
raise EntranceShuffleError ( f ' Entrance placement attempt count exceeded for world { ootworld . player } ' )
2022-10-15 10:39:04 +00:00
def shuffle_entrances ( ootworld , pool_type , entrances , target_entrances , rollbacks , locations_to_ensure_reachable , all_state , none_state ) :
2022-11-01 02:41:21 +00:00
ootworld . multiworld . random . shuffle ( entrances )
2021-11-11 09:42:08 +00:00
for entrance in entrances :
if entrance . connected_region != None :
continue
2022-11-01 02:41:21 +00:00
ootworld . multiworld . random . shuffle ( target_entrances )
2022-10-15 10:39:04 +00:00
# Here we deliberately introduce bias by prioritizing certain interiors, i.e. the ones most likely to cause problems.
# success rate over randomization
if pool_type in { ' InteriorSoft ' , ' MixedSoft ' } :
target_entrances . sort ( reverse = True , key = lambda entrance : interior_entrance_bias . get ( entrance . replaces . name , 0 ) )
2021-11-11 09:42:08 +00:00
for target in target_entrances :
if target . connected_region == None :
continue
if replace_entrance ( ootworld , entrance , target , rollbacks , locations_to_ensure_reachable , all_state , none_state ) :
break
if entrance . connected_region == None :
raise EntranceShuffleError ( ' No more valid entrances ' )
def split_entrances_by_requirements ( ootworld , entrances_to_split , assumed_entrances ) :
player = ootworld . player
# Disconnect all root assumed entrances and save original connections
original_connected_regions = { }
entrances_to_disconnect = set ( assumed_entrances ) . union ( entrance . reverse for entrance in assumed_entrances if entrance . reverse )
for entrance in entrances_to_disconnect :
if entrance . connected_region :
original_connected_regions [ entrance ] = entrance . disconnect ( )
2023-10-30 03:05:49 +00:00
all_state = ootworld . get_state_with_complete_itempool ( )
2021-11-11 09:42:08 +00:00
restrictive_entrances = [ ]
soft_entrances = [ ]
for entrance in entrances_to_split :
all_state . age [ player ] = ' child '
if not all_state . can_reach ( entrance , ' Entrance ' , player ) :
restrictive_entrances . append ( entrance )
continue
all_state . age [ player ] = ' adult '
if not all_state . can_reach ( entrance , ' Entrance ' , player ) :
restrictive_entrances . append ( entrance )
continue
all_state . age [ player ] = None
if not all_state . _oot_reach_at_time ( entrance . parent_region . name , TimeOfDay . ALL , [ ] , player ) :
restrictive_entrances . append ( entrance )
continue
soft_entrances . append ( entrance )
# Reconnect assumed entrances
for entrance in entrances_to_disconnect :
if entrance in original_connected_regions :
entrance . connect ( original_connected_regions [ entrance ] )
return restrictive_entrances , soft_entrances
# Check to ensure the world is valid.
# TODO: improve this function
def validate_world ( ootworld , entrance_placed , locations_to_ensure_reachable , all_state_orig , none_state_orig ) :
2022-11-01 02:41:21 +00:00
world = ootworld . multiworld
2021-11-11 09:42:08 +00:00
player = ootworld . player
all_state = all_state_orig . copy ( )
none_state = none_state_orig . copy ( )
2023-10-30 03:05:49 +00:00
all_state . sweep_for_events ( locations = ootworld . get_locations ( ) )
none_state . sweep_for_events ( locations = ootworld . get_locations ( ) )
2021-11-12 12:58:22 +00:00
2021-11-11 09:42:08 +00:00
if ootworld . shuffle_interior_entrances or ootworld . shuffle_overworld_entrances or ootworld . spawn_positions :
time_travel_state = none_state . copy ( )
time_travel_state . collect ( ootworld . create_item ( ' Time Travel ' ) , event = True )
time_travel_state . _oot_update_age_reachable_regions ( player )
2021-11-14 13:30:40 +00:00
# Unless entrances are decoupled, we don't want the player to end up through certain entrances as the wrong age
2021-11-11 09:42:08 +00:00
# This means we need to hard check that none of the relevant entrances are ever reachable as that age
# This is mostly relevant when shuffling special interiors (such as windmill or kak potion shop)
# Warp Songs and Overworld Spawns can also end up inside certain indoors so those need to be handled as well
CHILD_FORBIDDEN = [ ' OGC Great Fairy Fountain -> Castle Grounds ' , ' GV Carpenter Tent -> GV Fortress Side ' ]
ADULT_FORBIDDEN = [ ' HC Great Fairy Fountain -> Castle Grounds ' , ' HC Storms Grotto -> Castle Grounds ' ]
2021-11-14 13:30:40 +00:00
if not ootworld . decouple_entrances :
for entrance in ootworld . get_shufflable_entrances ( ) :
if entrance . shuffled and entrance . replaces :
if entrance . replaces . name in CHILD_FORBIDDEN and not entrance_unreachable_as ( entrance , ' child ' , already_checked = [ entrance . replaces . reverse ] ) :
raise EntranceShuffleError ( f ' { entrance . replaces . name } replaced by an entrance with potential child access ' )
if entrance . replaces . name in ADULT_FORBIDDEN and not entrance_unreachable_as ( entrance , ' adult ' , already_checked = [ entrance . replaces . reverse ] ) :
raise EntranceShuffleError ( f ' { entrance . replaces . name } replaced by an entrance with potential adult access ' )
else :
if entrance . name in CHILD_FORBIDDEN and not entrance_unreachable_as ( entrance , ' child ' , already_checked = [ entrance . reverse ] ) :
raise EntranceShuffleError ( f ' { entrance . name } potentially accessible as child ' )
if entrance . name in ADULT_FORBIDDEN and not entrance_unreachable_as ( entrance , ' adult ' , already_checked = [ entrance . reverse ] ) :
raise EntranceShuffleError ( f ' { entrance . name } potentially accessible as adult ' )
2021-11-11 09:42:08 +00:00
2022-11-02 08:32:08 +00:00
# Check if all locations are reachable if not NL
2023-01-26 03:31:00 +00:00
if locations_to_ensure_reachable :
2022-10-15 10:39:04 +00:00
for loc in locations_to_ensure_reachable :
if not all_state . can_reach ( loc , ' Location ' , player ) :
raise EntranceShuffleError ( f ' { loc } is unreachable ' )
2021-11-11 09:42:08 +00:00
2021-11-15 14:36:00 +00:00
if ootworld . shuffle_interior_entrances and ( ootworld . misc_hints or ootworld . hints != ' none ' ) and \
( entrance_placed == None or entrance_placed . type in [ ' Interior ' , ' SpecialInterior ' ] ) :
2021-11-11 09:42:08 +00:00
# Ensure Kak Potion Shop entrances are in the same hint area so there is no ambiguity as to which entrance is used for hints
2022-10-15 10:39:04 +00:00
potion_front = get_entrance_replacing ( world . get_region ( ' Kak Potion Shop Front ' , player ) , ' Kakariko Village -> Kak Potion Shop Front ' , player )
potion_back = get_entrance_replacing ( world . get_region ( ' Kak Potion Shop Back ' , player ) , ' Kak Backyard -> Kak Potion Shop Back ' , player )
if potion_front is not None and potion_back is not None and not same_hint_area ( potion_front , potion_back ) :
2021-11-11 09:42:08 +00:00
raise EntranceShuffleError ( ' Kak Potion Shop entrances are not in the same hint area ' )
2022-10-15 10:39:04 +00:00
elif ( potion_front and not potion_back ) or ( not potion_front and potion_back ) :
# Check the hint area and ensure it's one of the ones with more than one entrance
potion_placed_entrance = potion_front if potion_front else potion_back
if get_hint_area ( potion_placed_entrance ) not in multi_interior_regions :
raise EntranceShuffleError ( ' Kak Potion Shop entrances can never be in the same hint area ' )
2021-11-11 09:42:08 +00:00
# When cows are shuffled, ensure the same thing for Impa's House, since the cow is reachable from both sides
if ootworld . shuffle_cows :
2022-10-15 10:39:04 +00:00
impas_front = get_entrance_replacing ( world . get_region ( ' Kak Impas House ' , player ) , ' Kakariko Village -> Kak Impas House ' , player )
impas_back = get_entrance_replacing ( world . get_region ( ' Kak Impas House Back ' , player ) , ' Kak Impas Ledge -> Kak Impas House Back ' , player )
if impas_front is not None and impas_back is not None and not same_hint_area ( impas_front , impas_back ) :
2021-11-11 09:42:08 +00:00
raise EntranceShuffleError ( ' Kak Impas House entrances are not in the same hint area ' )
2022-10-15 10:39:04 +00:00
elif ( impas_front and not impas_back ) or ( not impas_front and impas_back ) :
impas_placed_entrance = impas_front if impas_front else impas_back
if get_hint_area ( impas_placed_entrance ) not in multi_interior_regions :
raise EntranceShuffleError ( ' Kak Impas House entrances can never be in the same hint area ' )
2021-11-11 09:42:08 +00:00
# Check basic refills, time passing, return to ToT
if ( ootworld . shuffle_special_interior_entrances or ootworld . shuffle_overworld_entrances or ootworld . spawn_positions ) and \
( entrance_placed == None or entrance_placed . type in [ ' SpecialInterior ' , ' Overworld ' , ' Spawn ' , ' WarpSong ' , ' OwlDrop ' ] ) :
valid_starting_regions = { ' Kokiri Forest ' , ' Kakariko Village ' }
if not any ( region for region in valid_starting_regions if none_state . can_reach ( region , ' Region ' , player ) ) :
raise EntranceShuffleError ( ' Invalid starting area ' )
if not ( any ( region for region in time_travel_state . child_reachable_regions [ player ] if region . time_passes ) and
any ( region for region in time_travel_state . adult_reachable_regions [ player ] if region . time_passes ) ) :
raise EntranceShuffleError ( ' Time passing is not guaranteed as both ages ' )
if ootworld . starting_age == ' child ' and ( world . get_region ( ' Temple of Time ' , player ) not in time_travel_state . adult_reachable_regions [ player ] ) :
raise EntranceShuffleError ( ' Path to ToT as adult not guaranteed ' )
if ootworld . starting_age == ' adult ' and ( world . get_region ( ' Temple of Time ' , player ) not in time_travel_state . child_reachable_regions [ player ] ) :
raise EntranceShuffleError ( ' Path to ToT as child not guaranteed ' )
if ( ootworld . shuffle_interior_entrances or ootworld . shuffle_overworld_entrances ) and \
( entrance_placed == None or entrance_placed . type in [ ' Interior ' , ' SpecialInterior ' , ' Overworld ' , ' Spawn ' , ' WarpSong ' , ' OwlDrop ' ] ) :
# Ensure big poe shop is always reachable as adult
if world . get_region ( ' Market Guard House ' , player ) not in time_travel_state . adult_reachable_regions [ player ] :
raise EntranceShuffleError ( ' Big Poe Shop access not guaranteed as adult ' )
if ootworld . shopsanity == ' off ' :
# Ensure that Goron and Zora shops are accessible as adult
if world . get_region ( ' GC Shop ' , player ) not in all_state . adult_reachable_regions [ player ] :
raise EntranceShuffleError ( ' Goron City Shop not accessible as adult ' )
if world . get_region ( ' ZD Shop ' , player ) not in all_state . adult_reachable_regions [ player ] :
raise EntranceShuffleError ( ' Zora \' s Domain Shop not accessible as adult ' )
2022-11-02 08:32:08 +00:00
if ootworld . open_forest == ' closed ' :
# Ensure that Kokiri Shop is reachable as child with no items
if world . get_region ( ' KF Kokiri Shop ' , player ) not in none_state . child_reachable_regions [ player ] :
raise EntranceShuffleError ( ' Kokiri Forest Shop not accessible as child in closed forest ' )
2021-11-11 09:42:08 +00:00
# Recursively check if a given entrance is unreachable as a given age
def entrance_unreachable_as ( entrance , age , already_checked = [ ] ) :
already_checked . append ( entrance )
if entrance . type in { ' WarpSong ' , ' Overworld ' } :
return False
elif entrance . type == ' OwlDrop ' :
return age == ' adult '
elif entrance . name == ' Child Spawn -> KF Links House ' :
return age == ' adult '
elif entrance . name == ' Adult Spawn -> Temple of Time ' :
return age == ' child '
for parent_entrance in entrance . parent_region . entrances :
if parent_entrance in already_checked :
continue
unreachable = entrance_unreachable_as ( parent_entrance , age , already_checked )
if not unreachable :
return False
return True
def same_hint_area ( first , second ) :
try :
return get_hint_area ( first ) == get_hint_area ( second )
except HintAreaNotFound :
return False
def get_entrance_replacing ( region , entrance_name , player ) :
2022-11-01 02:41:21 +00:00
original_entrance = region . multiworld . get_entrance ( entrance_name , player )
2021-11-11 09:42:08 +00:00
if not original_entrance . shuffled :
return original_entrance
try :
return next ( filter ( lambda entrance : entrance . replaces and entrance . replaces . name == entrance_name and \
entrance . parent_region and entrance . parent_region . name != ' Root Exits ' and \
entrance . type not in ( ' OwlDrop ' , ' Spawn ' , ' WarpSong ' ) and entrance . player == player ,
region . entrances ) )
except StopIteration :
return None
def change_connections ( entrance , target ) :
entrance . connect ( target . disconnect ( ) )
entrance . replaces = target . replaces
2022-11-01 02:41:21 +00:00
if entrance . reverse and not entrance . multiworld . worlds [ entrance . player ] . decouple_entrances :
2021-11-11 09:42:08 +00:00
target . replaces . reverse . connect ( entrance . reverse . assumed . disconnect ( ) )
target . replaces . reverse . replaces = entrance . reverse
def restore_connections ( entrance , target ) :
target . connect ( entrance . disconnect ( ) )
entrance . replaces = None
2022-11-01 02:41:21 +00:00
if entrance . reverse and not entrance . multiworld . worlds [ entrance . player ] . decouple_entrances :
2021-11-11 09:42:08 +00:00
entrance . reverse . assumed . connect ( target . replaces . reverse . disconnect ( ) )
target . replaces . reverse . replaces = None
def check_entrances_compatibility ( entrance , target , rollbacks ) :
# An entrance shouldn't be connected to its own scene
if entrance . parent_region . get_scene ( ) and entrance . parent_region . get_scene ( ) == target . connected_region . get_scene ( ) :
raise EntranceShuffleError ( ' Self-scene connections are forbidden ' )
# One-way entrances shouldn't lead to the same scene as other one-ways
if entrance . type in { ' OwlDrop ' , ' Spawn ' , ' WarpSong ' } and \
any ( [ rollback [ 0 ] . connected_region . get_scene ( ) == target . connected_region . get_scene ( ) for rollback in rollbacks ] ) :
raise EntranceShuffleError ( ' Another one-way entrance leads to the same scene ' )
def confirm_replacement ( entrance , target ) :
delete_target_entrance ( target )
logging . getLogger ( ' ' ) . debug ( f ' Connected { entrance } to { entrance . connected_region } ' )
2022-11-01 02:41:21 +00:00
if entrance . reverse and not entrance . multiworld . worlds [ entrance . player ] . decouple_entrances :
2021-11-11 09:42:08 +00:00
replaced_reverse = target . replaces . reverse
delete_target_entrance ( entrance . reverse . assumed )
logging . getLogger ( ' ' ) . debug ( f ' Connected { replaced_reverse } to { replaced_reverse . connected_region } ' )
def delete_target_entrance ( target ) :
if target . connected_region != None :
target . disconnect ( )
if target . parent_region != None :
target . parent_region . exits . remove ( target )
target . parent_region = None
2022-10-15 10:39:04 +00:00
del target