| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  | from itertools import chain | 
					
						
							|  |  |  | import logging | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-16 08:24:30 -06:00
										 |  |  | from worlds.generic.Rules import set_rule, add_rule | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def assume_entrance_pool(entrance_pool, ootworld): | 
					
						
							|  |  |  |     assumed_pool = [] | 
					
						
							|  |  |  |     for entrance in entrance_pool: | 
					
						
							|  |  |  |         assumed_forward = entrance.assume_reachable() | 
					
						
							| 
									
										
										
										
											2021-11-14 07:30:40 -06:00
										 |  |  |         if entrance.reverse != None and not ootworld.decouple_entrances: | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |             assumed_return = entrance.reverse.assume_reachable() | 
					
						
							| 
									
										
										
										
											2021-11-14 07:06:09 -06: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 04:42:08 -05:00
										 |  |  |             assumed_forward.bind_two_way(assumed_return) | 
					
						
							|  |  |  |         assumed_pool.append(assumed_forward) | 
					
						
							|  |  |  |     return assumed_pool | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def build_one_way_targets(world, types_to_include, exclude=(), target_region_names=()): | 
					
						
							|  |  |  |     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: | 
					
						
							|  |  |  |         return [entrance.get_new_target() for entrance in valid_one_way_entrances | 
					
						
							|  |  |  |                 if entrance.connected_region.name in target_region_names] | 
					
						
							|  |  |  |     return [entrance.get_new_target() for entrance in valid_one_way_entrances] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #   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 })), | 
					
						
							|  |  |  |     ('Dungeon',         ('Gerudo Fortress -> Gerudo Training Grounds Lobby',                { 'index': 0x0008 }), | 
					
						
							|  |  |  |                         ('Gerudo Training Grounds Lobby -> Gerudo Fortress',                { 'index': 0x03A8 })), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ('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 })), | 
					
						
							|  |  |  |     ('Grotto',          ('Gerudo Fortress -> GF Storms Grotto',                             { 'grotto_id': 0x1D, 'entrance': 0x036D, 'content': 0xFF, 'scene': 0x5D }), | 
					
						
							|  |  |  |                         ('GF Storms Grotto -> Gerudo Fortress',                             { 'grotto_id': 0x1D })), | 
					
						
							|  |  |  |     ('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 })), | 
					
						
							|  |  |  |     ('Grave',           ('Graveyard -> Graveyard Composers Grave',                          { 'index': 0x002D }), | 
					
						
							|  |  |  |                         ('Graveyard Composers Grave -> Graveyard',                          { 'index': 0x050B })), | 
					
						
							|  |  |  |     ('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 }), | 
					
						
							|  |  |  |                         ('Zora River -> Lost Woods',                                        { 'index': 0x04DA })), | 
					
						
							|  |  |  |     ('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 07:30:40 -06:00
										 |  |  |     ('Overworld',       ('GV Lower Stream -> Lake Hylia',                                   { 'index': 0x0219 })), | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 })), | 
					
						
							|  |  |  | ] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 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']), | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | def shuffle_random_entrances(ootworld): | 
					
						
							|  |  |  |     world = ootworld.world | 
					
						
							|  |  |  |     player = ootworld.player | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Gather locations to keep reachable for validation | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |     all_state = world.get_all_state(use_cache=True) | 
					
						
							|  |  |  |     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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Set entrance data for all entrances | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Determine entrance pools based on settings | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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.spawn_positions: | 
					
						
							|  |  |  |         one_way_entrance_pools['Spawn'] = ootworld.get_shufflable_entrances(type='Spawn') | 
					
						
							|  |  |  |     if ootworld.warp_songs: | 
					
						
							|  |  |  |         one_way_entrance_pools['WarpSong'] = ootworld.get_shufflable_entrances(type='WarpSong') | 
					
						
							|  |  |  |         if world.accessibility[player].current_key != 'minimal' and ootworld.logic_rules == 'glitchless': | 
					
						
							|  |  |  |             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'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if ootworld.shuffle_dungeon_entrances: | 
					
						
							|  |  |  |         entrance_pools['Dungeon'] = ootworld.get_shufflable_entrances(type='Dungeon', only_primary=True) | 
					
						
							|  |  |  |         if ootworld.open_forest == 'closed': | 
					
						
							|  |  |  |             entrance_pools['Dungeon'].remove(world.get_entrance('KF Outside Deku Tree -> Deku Tree Lobby', player)) | 
					
						
							| 
									
										
										
										
											2021-11-14 07:30:40 -06:00
										 |  |  |         if ootworld.decouple_entrances: | 
					
						
							|  |  |  |             entrance_pools['DungeonReverse'] = [entrance.reverse for entrance in entrance_pools['Dungeon']] | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 07:30:40 -06:00
										 |  |  |         if ootworld.decouple_entrances: | 
					
						
							|  |  |  |             entrance_pools['InteriorReverse'] = [entrance.reverse for entrance in entrance_pools['Interior']] | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 07:30:40 -06:00
										 |  |  |         if ootworld.decouple_entrances: | 
					
						
							|  |  |  |             entrance_pools['GrottoGraveReverse'] = [entrance.reverse for entrance in entrance_pools['GrottoGrave']] | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |     if ootworld.shuffle_overworld_entrances: | 
					
						
							| 
									
										
										
										
											2021-11-14 07:06:09 -06: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 07:30:40 -06:00
										 |  |  |         if not ootworld.decouple_entrances: | 
					
						
							|  |  |  |             entrance_pools['Overworld'].remove(world.get_entrance('GV Lower Stream -> Lake Hylia', 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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Mark shuffled entrances | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-14 07:06:09 -06: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 08:35:05 -04:00
										 |  |  |     # Build target entrance pools | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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') | 
					
						
							|  |  |  |             one_way_target_entrance_pools[pool_type] = build_one_way_targets(ootworld, valid_target_types, exclude=['Prelude of Light Warp -> Temple of Time']) | 
					
						
							|  |  |  |             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') | 
					
						
							|  |  |  |             one_way_target_entrance_pools[pool_type] = build_one_way_targets(ootworld, valid_target_types) | 
					
						
							| 
									
										
										
										
											2021-11-16 08:24:30 -06: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 04:42:08 -05: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(): | 
					
						
							|  |  |  |         target_entrance_pools[pool_type] = assume_entrance_pool(entrance_pool, ootworld) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Build all_state and none_state | 
					
						
							| 
									
										
										
										
											2021-11-12 07:58:22 -05:00
										 |  |  |     all_state = ootworld.get_state_with_complete_itempool() | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |     none_state = all_state.copy() | 
					
						
							|  |  |  |     for item_tuple in none_state.prog_items: | 
					
						
							|  |  |  |         if item_tuple[1] == player: | 
					
						
							|  |  |  |             none_state.prog_items[item_tuple] = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-20 15:36:57 -06: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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Place priority entrances | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Delete priority targets from one-way pools | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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(): | 
					
						
							|  |  |  |         shuffle_entrance_pool(ootworld, entrance_pool, one_way_target_entrance_pools[pool_type], locations_to_ensure_reachable, all_state, none_state, check_all=True, retry_count=5) | 
					
						
							|  |  |  |         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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Shuffle all entrance pools, in order | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |     for pool_type, entrance_pool in entrance_pools.items(): | 
					
						
							|  |  |  |         shuffle_entrance_pool(ootworld, entrance_pool, target_entrance_pools[pool_type], locations_to_ensure_reachable, all_state, none_state) | 
					
						
							| 
									
										
											  
											
												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 08:35:05 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 08:35:05 -04:00
										 |  |  |     # Game is beatable | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |     new_all_state = world.get_all_state(use_cache=False) | 
					
						
							|  |  |  |     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 08:35:05 -04:00
										 |  |  |     # Validate world | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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)) | 
					
						
							|  |  |  |     ootworld.world.random.shuffle(avail_pool) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for entrance in avail_pool: | 
					
						
							|  |  |  |         if entrance.replaces: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if entrance.parent_region.name == 'Adult Spawn' and (priority_name != 'Nocturne' or ootworld.hints == 'mask'): | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         if not ootworld.shuffle_dungeon_entrances and priority_name == 'Nocturne': | 
					
						
							|  |  |  |             if entrance.type != 'WarpSong' and entrance.parent_region.name != 'Adult Spawn': | 
					
						
							|  |  |  |                 continue | 
					
						
							|  |  |  |         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}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-12 07:58:22 -05:00
										 |  |  | def shuffle_entrance_pool(ootworld, entrance_pool, target_entrances, locations_to_ensure_reachable, all_state, none_state, check_all=False, retry_count=20): | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05:00
										 |  |  |      | 
					
						
							|  |  |  |     restrictive_entrances, soft_entrances = split_entrances_by_requirements(ootworld, entrance_pool, target_entrances) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     while retry_count: | 
					
						
							|  |  |  |         retry_count -= 1 | 
					
						
							|  |  |  |         rollbacks = [] | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             shuffle_entrances(ootworld, restrictive_entrances, target_entrances, rollbacks, locations_to_ensure_reachable, all_state, none_state) | 
					
						
							|  |  |  |             if check_all: | 
					
						
							|  |  |  |                 shuffle_entrances(ootworld, soft_entrances, target_entrances, rollbacks, locations_to_ensure_reachable, all_state, none_state) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 shuffle_entrances(ootworld, soft_entrances, target_entrances, rollbacks, set(), all_state, none_state) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             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}') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def shuffle_entrances(ootworld, entrances, target_entrances, rollbacks, locations_to_ensure_reachable, all_state, none_state): | 
					
						
							|  |  |  |     ootworld.world.random.shuffle(entrances) | 
					
						
							|  |  |  |     for entrance in entrances: | 
					
						
							|  |  |  |         if entrance.connected_region != None: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  |         ootworld.world.random.shuffle(target_entrances) | 
					
						
							|  |  |  |         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): | 
					
						
							|  |  |  |     world = ootworld.world | 
					
						
							|  |  |  |     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() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     all_state = world.get_all_state(use_cache=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     world = ootworld.world | 
					
						
							|  |  |  |     player = ootworld.player | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     all_state = all_state_orig.copy() | 
					
						
							|  |  |  |     none_state = none_state_orig.copy() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-12 07:58:22 -05:00
										 |  |  |     all_state.sweep_for_events() | 
					
						
							|  |  |  |     none_state.sweep_for_events() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 07:30:40 -06:00
										 |  |  |     # Unless entrances are decoupled, we don't want the player to end up through certain entrances as the wrong age | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 07:30:40 -06: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 04:42:08 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Check if all locations are reachable if not beatable-only or game is not yet complete | 
					
						
							|  |  |  |     if locations_to_ensure_reachable: | 
					
						
							|  |  |  |         if world.accessibility[player].current_key != 'minimal' or not world.can_beat_game(all_state): | 
					
						
							|  |  |  |             for loc in locations_to_ensure_reachable: | 
					
						
							|  |  |  |                 if not all_state.can_reach(loc, 'Location', player): | 
					
						
							|  |  |  |                     raise EntranceShuffleError(f'{loc} is unreachable') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-15 08:36:00 -06: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 04:42:08 -05: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 | 
					
						
							|  |  |  |         potion_front_entrance = get_entrance_replacing(world.get_region('Kak Potion Shop Front', player), 'Kakariko Village -> Kak Potion Shop Front', player) | 
					
						
							|  |  |  |         potion_back_entrance = get_entrance_replacing(world.get_region('Kak Potion Shop Back', player), 'Kak Backyard -> Kak Potion Shop Back', player) | 
					
						
							|  |  |  |         if potion_front_entrance is not None and potion_back_entrance is not None and not same_hint_area(potion_front_entrance, potion_back_entrance): | 
					
						
							|  |  |  |             raise EntranceShuffleError('Kak Potion Shop entrances are not in the same hint area') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # When cows are shuffled, ensure the same thing for Impa's House, since the cow is reachable from both sides | 
					
						
							|  |  |  |         if ootworld.shuffle_cows: | 
					
						
							|  |  |  |             impas_front_entrance = get_entrance_replacing(world.get_region('Kak Impas House', player), 'Kakariko Village -> Kak Impas House', player) | 
					
						
							|  |  |  |             impas_back_entrance = get_entrance_replacing(world.get_region('Kak Impas House Back', player), 'Kak Impas Ledge -> Kak Impas House Back', player) | 
					
						
							|  |  |  |             if impas_front_entrance is not None and impas_back_entrance is not None and not same_hint_area(impas_front_entrance, impas_back_entrance): | 
					
						
							|  |  |  |                 raise EntranceShuffleError('Kak Impas House entrances are not in the same hint area') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # 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') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 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): | 
					
						
							|  |  |  |     original_entrance = region.world.get_entrance(entrance_name, player) | 
					
						
							|  |  |  |     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 | 
					
						
							| 
									
										
										
										
											2021-11-14 07:30:40 -06:00
										 |  |  |     if entrance.reverse and not entrance.world.worlds[entrance.player].decouple_entrances: | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 | 
					
						
							| 
									
										
										
										
											2021-11-14 07:30:40 -06:00
										 |  |  |     if entrance.reverse and not entrance.world.worlds[entrance.player].decouple_entrances: | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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}') | 
					
						
							| 
									
										
										
										
											2021-11-14 07:30:40 -06:00
										 |  |  |     if entrance.reverse and not entrance.world.worlds[entrance.player].decouple_entrances: | 
					
						
							| 
									
										
										
										
											2021-11-11 04:42:08 -05: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 |