2017-12-17 00:25:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  collections  import  OrderedDict  
						 
					
						
							
								
									
										
										
										
											2018-02-17 18:38:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  copy  
						 
					
						
							
								
									
										
										
										
											2018-01-06 16:25:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  itertools  import  zip_longest  
						 
					
						
							
								
									
										
										
										
											2017-12-17 00:25:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  json  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  logging  
						 
					
						
							
								
									
										
										
										
											2019-05-30 01:10:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  os  
						 
					
						
							
								
									
										
										
										
											2017-12-17 00:25:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  random  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  time  
						 
					
						
							
								
									
										
										
										
											2020-01-04 22:08:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  zlib  
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  concurrent . futures  
						 
					
						
							
								
									
										
										
										
											2017-12-17 00:25:46 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-16 02:23:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  BaseClasses  import  World ,  CollectionState ,  Item ,  Region ,  Location  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  Shops  import  ShopSlotFill ,  create_shops ,  SHOP_ID_START  
						 
					
						
							
								
									
										
										
										
											2020-12-19 15:36:29 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  Items  import  ItemFactory ,  item_table ,  item_name_groups  
						 
					
						
							
								
									
										
										
										
											2021-01-16 02:23:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  Regions  import  create_regions ,  mark_light_world_regions ,  lookup_vanilla_location_to_entrance  
						 
					
						
							
								
									
										
										
										
											2019-07-27 09:13:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  InvertedRegions  import  create_inverted_regions ,  mark_dark_world_regions  
						 
					
						
							
								
									
										
										
										
											2021-01-02 22:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  EntranceShuffle  import  link_entrances ,  link_inverted_entrances ,  plando_connect  
						 
					
						
							
								
									
										
										
										
											2020-06-09 22:11:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  Rom  import  patch_rom ,  patch_race_rom ,  patch_enemizer ,  apply_rom_settings ,  LocalRom ,  get_hash_string  
						 
					
						
							
								
									
										
										
										
											2017-05-15 20:28:04 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  Rules  import  set_rules  
						 
					
						
							
								
									
										
										
										
											2017-10-15 13:52:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  Dungeons  import  create_dungeons ,  fill_dungeons ,  fill_dungeons_restrictive  
						 
					
						
							
								
									
										
										
										
											2021-01-16 02:23:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  Fill  import  distribute_items_restrictive ,  flood_items ,  balance_multiworld_progression ,  distribute_planned  
						 
					
						
							
								
									
										
										
										
											2020-08-20 15:43:22 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  ItemPool  import  generate_itempool ,  difficulties ,  fill_prizes  
						 
					
						
							
								
									
										
										
										
											2020-07-14 04:48:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  Utils  import  output_path ,  parse_player_names ,  get_options ,  __version__ ,  _version_tuple  
						 
					
						
							
								
									
										
										
										
											2020-07-10 22:43:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  Patch  
						 
					
						
							
								
									
										
										
										
											2017-05-15 20:28:04 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-28 00:24:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								seeddigits  =  20  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  get_seed ( seed = None ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  seed  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        random . seed ( None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  random . randint ( 0 ,  pow ( 10 ,  seeddigits )  -  1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  seed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-29 16:11:23 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-25 15:58:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  main ( args ,  seed = None ) :  
						 
					
						
							
								
									
										
										
										
											2019-12-28 17:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . outputpath : 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-10 07:25:16 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        os . makedirs ( args . outputpath ,  exist_ok = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-28 17:12:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        output_path . cached_path  =  args . outputpath 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 02:44:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2020-01-02 12:38:26 +11:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    start  =  time . perf_counter ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-15 20:28:04 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # initialize the world 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-22 06:28:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world  =  World ( args . multi ,  args . shuffle ,  args . logic ,  args . mode ,  args . swords ,  args . difficulty , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  args . item_functionality ,  args . timer ,  args . progressive . copy ( ) ,  args . goal ,  args . algorithm , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  args . accessibility ,  args . shuffleganon ,  args . retro ,  args . custom ,  args . customitemarray ,  args . hints ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-14 07:01:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger  =  logging . getLogger ( ' ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-28 00:24:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . seed  =  get_seed ( seed ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-14 07:01:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . race : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . secure ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . random . seed ( world . seed ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-18 09:50:12 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . remote_items  =  args . remote_items . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 21:46:47 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . mapshuffle  =  args . mapshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . compassshuffle  =  args . compassshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . keyshuffle  =  args . keyshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . bigkeyshuffle  =  args . bigkeyshuffle . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-14 07:01:51 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . crystals_needed_for_ganon  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        player :  world . random . randint ( 0 ,  7 )  if  args . crystals_ganon [ player ]  ==  ' random '  else  int ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            args . crystals_ganon [ player ] )  for  player  in  range ( 1 ,  world . players  +  1 ) } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . crystals_needed_for_gt  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        player :  world . random . randint ( 0 ,  7 )  if  args . crystals_gt [ player ]  ==  ' random '  else  int ( args . crystals_gt [ player ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  player  in  range ( 1 ,  world . players  +  1 ) } 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-11 03:23:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . open_pyramid  =  args . open_pyramid . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-17 15:55:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . boss_shuffle  =  args . shufflebosses . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-19 23:24:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . enemy_shuffle  =  args . enemy_shuffle . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-17 15:55:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . enemy_health  =  args . enemy_health . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . enemy_damage  =  args . enemy_damage . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-19 23:24:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . killable_thieves  =  args . killable_thieves . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . bush_shuffle  =  args . bush_shuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . tile_shuffle  =  args . tile_shuffle . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-30 03:03:53 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . beemizer  =  args . beemizer . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-02-02 20:10:56 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . timer  =  args . timer . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-28 16:20:59 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . countdown_start_time  =  args . countdown_start_time . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . red_clock_time  =  args . red_clock_time . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . blue_clock_time  =  args . blue_clock_time . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . green_clock_time  =  args . green_clock_time . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-18 12:51:10 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . shufflepots  =  args . shufflepots . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-22 06:28:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . progressive  =  args . progressive . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-12 15:46:32 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . dungeon_counters  =  args . dungeon_counters . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-04-16 11:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . glitch_boots  =  args . glitch_boots . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-17 01:02:54 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . triforce_pieces_available  =  args . triforce_pieces_available . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-07 15:22:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . triforce_pieces_required  =  args . triforce_pieces_required . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-23 15:03:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . shop_shuffle  =  args . shop_shuffle . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-23 20:05:04 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . shop_shuffle_slots  =  args . shop_shuffle_slots . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 03:54:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . progression_balancing  =  { player :  not  balance  for  player ,  balance  in  args . skip_progression_balancing . items ( ) } 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-20 04:35:45 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . shuffle_prizes  =  args . shuffle_prizes . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-06 13:22:03 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . sprite_pool  =  args . sprite_pool . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-07 19:51:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . dark_room_logic  =  args . dark_room_logic . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 12:49:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . plando_items  =  args . plando_items . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 16:44:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . plando_texts  =  args . plando_texts . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 22:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . plando_connections  =  args . plando_connections . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-07 19:51:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . restrict_dungeon_item_on_boss  =  args . restrict_dungeon_item_on_boss . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 23:00:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . required_medallions  =  args . required_medallions . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-08-11 08:55:38 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-07-15 23:01:29 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world . rom_seeds  =  { player :  random . Random ( world . random . randint ( 0 ,  999999999 ) )  for  player  in  range ( 1 ,  world . players  +  1 ) } 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-04-20 14:50:49 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' ALttP Berserker \' s Multiworld Version  %s   -  Seed:  %s \n ' ,  __version__ ,  world . seed ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 10:42:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    parsed_names  =  parse_player_names ( args . names ,  world . players ,  args . teams ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    world . teams  =  len ( parsed_names ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  i ,  team  in  enumerate ( parsed_names ,  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  world . players  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            logger . info ( ' %s %s ' ,  ' Team %d :  '  %  i  if  world . teams  >  1  else  ' Players:  ' ,  ' ,  ' . join ( team ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  player ,  name  in  enumerate ( team ,  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . player_names [ player ] . append ( name ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-14 10:42:27 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 17:46:21 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        world . difficulty_requirements [ player ]  =  difficulties [ world . difficulty [ player ] ] 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-04 01:06:22 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-06 19:13:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        for  tok  in  filter ( None ,  args . startinventory [ player ] . split ( ' , ' ) ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            item  =  ItemFactory ( tok . strip ( ) ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  item : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                world . push_precollected ( item ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-22 22:53:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # item in item_table gets checked in mystery, but not CLI - so we double-check here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . local_items [ player ]  =  { item . strip ( )  for  item  in  args . local_items [ player ] . split ( ' , ' )  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                     item . strip ( )  in  item_table } 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-22 14:29:11 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        world . non_local_items [ player ]  =  { item . strip ( )  for  item  in  args . non_local_items [ player ] . split ( ' , ' )  if 
							 
						 
					
						
							
								
									
										
										
										
											2020-11-22 22:53:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                         item . strip ( )  in  item_table } 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-05 09:56:20 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # enforce pre-defined local items. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  world . goal [ player ]  in  [ " localtriforcehunt " ,  " localganontriforcehunt " ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . local_items [ player ] . add ( ' Triforce Piece ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-11-22 22:53:31 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # items can't be both local and non-local, prefer local 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . non_local_items [ player ]  - =  world . local_items [ player ] 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-06 19:13:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-19 15:36:29 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # dungeon items can't be in non-local if the appropriate dungeon item shuffle setting is not set. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  world . mapshuffle [ player ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . non_local_items [ player ]  - =  item_name_groups [ ' Maps ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  world . compassshuffle [ player ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . non_local_items [ player ]  - =  item_name_groups [ ' Compasses ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  world . keyshuffle [ player ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . non_local_items [ player ]  - =  item_name_groups [ ' Small Keys ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  world . bigkeyshuffle [ player ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . non_local_items [ player ]  - =  item_name_groups [ ' Big Keys ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-12-19 16:23:21 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Not possible to place pendants/crystals out side of boss prizes yet. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . non_local_items [ player ]  - =  item_name_groups [ ' Pendants ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . non_local_items [ player ]  - =  item_name_groups [ ' Crystals ' ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-17 01:33:34 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        world . triforce_pieces_available [ player ]  =  max ( world . triforce_pieces_available [ player ] ,  world . triforce_pieces_required [ player ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  world . mode [ player ]  !=  ' inverted ' : 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 09:13:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            create_regions ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 09:13:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            create_inverted_regions ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-10 11:41:22 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        create_shops ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        create_dungeons ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-15 20:28:04 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Shuffling the World about. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-22 09:28:24 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  world . logic [ player ]  not  in  [ " noglitches " ,  " minorglitches " ]  and  world . shuffle [ player ]  in  \
							 
						 
					
						
							
								
									
										
										
										
											2020-07-16 04:14:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                { " vanilla " ,  " dungeonssimple " ,  " dungeonsfull " ,  " simple " ,  " restricted " ,  " full " } : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . fix_fake_world [ player ]  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  world . mode [ player ]  !=  ' inverted ' : 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 09:13:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            link_entrances ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mark_light_world_regions ( world ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 09:13:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            link_inverted_entrances ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mark_dark_world_regions ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 22:41:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        plando_connect ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 16:11:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Generating Item Pool. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        generate_itempool ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 16:11:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Calculating Access Rules. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        set_rules ( world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 16:11:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Placing Dungeon Prizes. ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-05 17:52:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 16:11:11 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    fill_prizes ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-05 17:52:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 12:49:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( " Running Item Plando " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 15:14:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    distribute_planned ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 12:49:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 21:32:31 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Placing Dungeon Items. ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 12:49:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . algorithm  in  [ ' balanced ' ,  ' vt26 ' ]  or  any ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            list ( args . mapshuffle . values ( ) )  +  list ( args . compassshuffle . values ( ) )  + 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            list ( args . keyshuffle . values ( ) )  +  list ( args . bigkeyshuffle . values ( ) ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-07 19:51:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        fill_dungeons_restrictive ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-15 13:52:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        fill_dungeons ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    logger . info ( ' Fill the world. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-25 15:58:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  args . algorithm  ==  ' flood ' : 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        flood_items ( world )   # different algo, biased towards early game progress items 
							 
						 
					
						
							
								
									
										
										
										
											2017-08-01 19:07:44 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    elif  args . algorithm  ==  ' vt25 ' : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 15:27:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        distribute_items_restrictive ( world ,  False ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-10-15 13:52:42 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    elif  args . algorithm  ==  ' vt26 ' : 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-02 12:49:43 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        distribute_items_restrictive ( world ,  True ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-11-11 18:05:06 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    elif  args . algorithm  ==  ' balanced ' : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 15:27:20 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        distribute_items_restrictive ( world ,  True ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-10 15:50:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 03:54:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  world . players  >  1 : 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        balance_multiworld_progression ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-16 02:23:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( " Filling Shop Slots " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ShopSlotFill ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-23 15:30:21 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Patching ROM. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-16 02:23:23 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-11 04:06:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-10 21:25:14 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    outfilebase  =  ' BM_ %s '  %  ( args . outputname  if  args . outputname  else  world . seed ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 18:39:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-04 22:08:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    rom_names  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-20 14:07:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  _gen_rom ( team :  int ,  player :  int ) : 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-19 23:24:17 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        use_enemizer  =  ( world . boss_shuffle [ player ]  !=  ' none '  or  world . enemy_shuffle [ player ] 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        or  world . enemy_health [ player ]  !=  ' default '  or  world . enemy_damage [ player ]  !=  ' default ' 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-04 10:57:30 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        or  world . shufflepots [ player ]  or  world . bush_shuffle [ player ] 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-22 01:05:48 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        or  world . killable_thieves [ player ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 01:10:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        rom  =  LocalRom ( args . rom ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        patch_rom ( world ,  rom ,  player ,  team ,  use_enemizer ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 01:10:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  use_enemizer : 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-04 10:57:30 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            patch_enemizer ( world ,  player ,  rom ,  args . enemizercli ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 01:10:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  args . race : 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-20 01:16:20 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            patch_race_rom ( rom ,  world ,  player ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        world . spoiler . hashes [ ( player ,  team ) ]  =  get_hash_string ( rom . hash ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-05-30 01:10:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 02:44:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        palettes_options = { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        palettes_options [ ' dungeon ' ] = args . uw_palettes [ player ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        palettes_options [ ' overworld ' ] = args . ow_palettes [ player ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        palettes_options [ ' hud ' ] = args . hud_palettes [ player ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        palettes_options [ ' sword ' ] = args . sword_palettes [ player ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        palettes_options [ ' shield ' ] = args . shield_palettes [ player ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        palettes_options [ ' link ' ] = args . link_palettes [ player ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        apply_rom_settings ( rom ,  args . heartbeep [ player ] ,  args . heartcolor [ player ] ,  args . quickswap [ player ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                           args . fastmenu [ player ] ,  args . disablemusic [ player ] ,  args . sprite [ player ] , 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-24 02:44:27 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                           palettes_options ,  world ,  player ,  True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        mcsb_name  =  ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  all ( [ world . mapshuffle [ player ] ,  world . compassshuffle [ player ] ,  world . keyshuffle [ player ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                world . bigkeyshuffle [ player ] ] ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            mcsb_name  =  ' -keysanity ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        elif  [ world . mapshuffle [ player ] ,  world . compassshuffle [ player ] ,  world . keyshuffle [ player ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								              world . bigkeyshuffle [ player ] ] . count ( True )  ==  1 : 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 15:06:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            mcsb_name  =  ' -mapshuffle '  if  world . mapshuffle [ player ]  else  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' -compassshuffle '  if  world . compassshuffle [ player ]  else  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' -universal_keys '  if  world . keyshuffle [ player ]  ==  " universal "  else  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' -keyshuffle '  if  world . keyshuffle [ player ]  else  ' -bigkeyshuffle ' 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        elif  any ( [ world . mapshuffle [ player ] ,  world . compassshuffle [ player ] ,  world . keyshuffle [ player ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                  world . bigkeyshuffle [ player ] ] ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            mcsb_name  =  ' - %s %s %s %s shuffle '  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' M '  if  world . mapshuffle [ player ]  else  ' ' ,  ' C '  if  world . compassshuffle [ player ]  else  ' ' , 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 15:06:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                ' U '  if  world . keyshuffle [ player ]  ==  " universal "  else  ' S '  if  world . keyshuffle [ player ]  else  ' ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ' B '  if  world . bigkeyshuffle [ player ]  else  ' ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        outfilepname  =  f ' _T { team  +  1 } '  if  world . teams  >  1  else  ' ' 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-02 22:11:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        outfilepname  + =  f ' _P { player } ' 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 15:06:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        outfilepname  + =  f " _ { world . player_names [ player ] [ team ] . replace ( '   ' ,  ' _ ' ) } "  \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  world . player_names [ player ] [ team ]  !=  ' Player %d '  %  player  else  ' ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        outfilestuffs  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " logic " :  world . logic [ player ] ,                                     # 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " difficulty " :  world . difficulty [ player ] ,                           # 1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " difficulty_adjustments " :  world . difficulty_adjustments [ player ] ,   # 2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " mode " :  world . mode [ player ] ,                                       # 3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " goal " :  world . goal [ player ] ,                                       # 4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " timer " :  str ( world . timer [ player ] ) ,                                # 5 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " shuffle " :  world . shuffle [ player ] ,                                 # 6 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " algorithm " :  world . algorithm ,                                     # 7 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " mscb " :  mcsb_name ,                                                # 8 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " retro " :  world . retro [ player ] ,                                     # 9 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " progressive " :  world . progressive ,                                 # A 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " hints " :  ' True '  if  world . hints [ player ]  else  ' False '               # B 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-11 04:06:25 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        #                  0  1  2  3  4 5  6  7 8 9 A B 
							 
						 
					
						
							
								
									
										
										
										
											2020-09-02 15:06:36 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        outfilesuffix  =  ( ' _ %s _ %s - %s - %s - %s %s _ %s - %s %s %s %s %s '  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          #  0          1      2      3    4     5    6      7     8        9         A     B           C 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # _noglitches_normal-normal-open-ganon-ohko_simple-balanced-keysanity-retro-prog_random-nohints 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # _noglitches_normal-normal-open-ganon     _simple-balanced-keysanity-retro 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # _noglitches_normal-normal-open-ganon     _simple-balanced-keysanity      -prog_random 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          # _noglitches_normal-normal-open-ganon     _simple-balanced-keysanity                  -nohints 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " logic " ] ,  # 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " difficulty " ] ,               # 1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " difficulty_adjustments " ] ,   # 2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " mode " ] ,                     # 3 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " goal " ] ,                     # 4 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " "  if  outfilestuffs [ " timer " ]  in  [ ' False ' ,  ' none ' ,  ' display ' ]  else  " - "  +  outfilestuffs [ " timer " ] ,  # 5 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " shuffle " ] ,      # 6 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " algorithm " ] ,    # 7 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          outfilestuffs [ " mscb " ] ,         # 8 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " -retro "  if  outfilestuffs [ " retro " ]  ==  " True "  else  " " ,   # 9 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " -prog_ "  +  outfilestuffs [ " progressive " ]  if  outfilestuffs [ " progressive " ]  in  [ ' off ' ,  ' random ' ]  else  " " ,   # A 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          " -nohints "  if  not  outfilestuffs [ " hints " ]  ==  " True "  else  " " )   # B 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        )  if  not  args . outputname  else  ' ' 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        rompath  =  output_path ( f ' { outfilebase } { outfilepname } { outfilesuffix } .sfc ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-16 11:13:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        rom . write_to_file ( rompath ,  hide_enemizer = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-09 21:52:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  args . create_diff : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            Patch . create_patch_file ( rompath ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-07-14 04:48:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  player ,  team ,  bytes ( rom . name ) . decode ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    pool  =  concurrent . futures . ThreadPoolExecutor ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-23 12:06:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    multidata_task  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-11 19:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    check_accessibility_task  =  pool . submit ( world . fulfills_accessibility ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-03-06 23:08:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  not  args . suppress_rom : 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        rom_futures  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  team  in  range ( world . teams ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                rom_futures . append ( pool . submit ( _gen_rom ,  team ,  player ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 05:40:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  get_entrance_to_region ( region :  Region ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  entrance  in  region . entrances : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  entrance . parent_region . type  in  ( RegionType . DarkWorld ,  RegionType . LightWorld ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    return  entrance 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  entrance  in  region . entrances :   # BFS might be better here, trying DFS for now. 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  get_entrance_to_region ( entrance . parent_region ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # collect ER hint info 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-15 17:04:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        er_hint_data  =  { player :  { }  for  player  in  range ( 1 ,  world . players  +  1 )  if  world . shuffle [ player ]  !=  " vanilla "  or  world . retro [ player ] } 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 05:40:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        from  Regions  import  RegionType 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  region  in  world . regions : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  region . player  in  er_hint_data  and  region . locations : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                main_entrance  =  get_entrance_to_region ( region ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  location  in  region . locations : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  type ( location . address )  ==  int :   # skips events and crystals 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-15 17:04:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  location . address  > =  SHOP_ID_START  +  33 :   continue 
							 
						 
					
						
							
								
									
										
										
										
											2020-06-20 12:22:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        if  lookup_vanilla_location_to_entrance [ location . address ]  !=  main_entrance . name : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            er_hint_data [ region . player ] [ location . address ]  =  main_entrance . name 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-18 05:40:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 15:18:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        ordered_areas  =  ( ' Light World ' ,  ' Dark World ' ,  ' Hyrule Castle ' ,  ' Agahnims Tower ' ,  ' Eastern Palace ' ,  ' Desert Palace ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         ' Tower of Hera ' ,  ' Palace of Darkness ' ,  ' Swamp Palace ' ,  ' Skull Woods ' ,  ' Thieves Town ' ,  ' Ice Palace ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                         ' Misery Mire ' ,  ' Turtle Rock ' ,  ' Ganons Tower ' ,  " Total " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        checks_in_area  =  { player :  { area :  list ( )  for  area  in  ordered_areas } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                          for  player  in  range ( 1 ,  world . players  +  1 ) } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            checks_in_area [ player ] [ " Total " ]  =  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  location  in  [ loc  for  loc  in  world . get_filled_locations ( )  if  type ( loc . address )  is  int ] : 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 15:32:05 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            main_entrance  =  get_entrance_to_region ( location . parent_region ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 15:18:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  location . parent_region . dungeon : 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-30 23:41:56 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                dungeonname  =  { ' Inverted Agahnims Tower ' :  ' Agahnims Tower ' , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                               ' Inverted Ganons Tower ' :  ' Ganons Tower ' } \
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    . get ( location . parent_region . dungeon . name ,  location . parent_region . dungeon . name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                checks_in_area [ location . player ] [ dungeonname ] . append ( location . address ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 15:18:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            elif  main_entrance . parent_region . type  ==  RegionType . LightWorld : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                checks_in_area [ location . player ] [ " Light World " ] . append ( location . address ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            elif  main_entrance . parent_region . type  ==  RegionType . DarkWorld : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                checks_in_area [ location . player ] [ " Dark World " ] . append ( location . address ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            checks_in_area [ location . player ] [ " Total " ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-15 17:04:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        oldmancaves  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  region  in  [ world . get_region ( " Old Man Sword Cave " ,  player )  for  player  in  range ( 1 ,  world . players  +  1 )  if  world . retro [ player ] ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            item  =  ItemFactory ( region . shop . inventory [ 0 ] [ ' item ' ] ,  region . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            player  =  region . player 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            location_id  =  SHOP_ID_START  +  33 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  region . type  ==  RegionType . LightWorld : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                checks_in_area [ player ] [ " Light World " ] . append ( location_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                checks_in_area [ player ] [ " Dark World " ] . append ( location_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            checks_in_area [ player ] [ " Total " ]  + =  1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2021-01-15 17:07:18 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            er_hint_data [ player ] [ location_id ]  =  get_entrance_to_region ( region ) . name 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-15 17:04:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            oldmancaves . append ( ( ( location_id ,  player ) ,  ( item . code ,  player ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 15:18:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-06-23 23:50:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        precollected_items  =  [ [ ]  for  player  in  range ( world . players ) ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  item  in  world . precollected_items : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            precollected_items [ item . player  -  1 ] . append ( item . code ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        def  write_multidata ( roms ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  future  in  roms : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                rom_name  =  future . result ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                rom_names . append ( rom_name ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-21 02:02:13 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            multidatatags  =  [ " ER " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  args . race : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                multidatatags . append ( " Race " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  args . create_spoiler : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                multidatatags . append ( " Spoiler " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  not  args . skip_playthrough : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    multidatatags . append ( " Play through " ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-09 18:11:24 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            minimum_versions  =  { " server " :  ( 1 ,  0 ,  0 ) } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            minimum_versions [ " clients " ]  =  client_versions  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  ( slot ,  team ,  name )  in  rom_names : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  world . shop_shuffle_slots [ slot ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    client_versions . append ( [ team ,  slot ,  [ 3 ,  6 ,  1 ] ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            multidata  =  zlib . compress ( json . dumps ( { " names " :  parsed_names , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  # backwards compat for < 2.4.1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " roms " :  [ ( slot ,  team ,  list ( name . encode ( ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                           for  ( slot ,  team ,  name )  in  rom_names ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " rom_strings " :  rom_names , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " remote_items " :  [ player  for  player  in  range ( 1 ,  world . players  +  1 )  if 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                                   world . remote_items [ player ] ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " locations " :  [ ( ( location . address ,  location . player ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                                 ( location . item . code ,  location . item . player ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                                for  location  in  world . get_filled_locations ( )  if 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-15 17:04:50 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                                type ( location . address )  is  int ]  +  oldmancaves , 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-29 15:18:21 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  " checks_in_area " :  checks_in_area , 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  " server_options " :  get_options ( ) [ " server_options " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " er_hint_data " :  er_hint_data , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " precollected_items " :  precollected_items , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                  " version " :  _version_tuple , 
							 
						 
					
						
							
								
									
										
										
										
											2020-12-29 19:23:14 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  " tags " :  multidatatags , 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-04 14:28:33 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  " minimum_versions " :  minimum_versions 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                                  } ) . encode ( " utf-8 " ) ,  9 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            with  open ( output_path ( ' %s .multidata '  %  outfilebase ) ,  ' wb ' )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                f . write ( multidata ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-23 12:06:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        multidata_task  =  pool . submit ( write_multidata ,  rom_futures ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-11 19:56:18 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  not  check_accessibility_task . result ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  world . can_beat_game ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  Exception ( " Game appears is unbeatable. Aborting. " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            logger . warning ( " Location Accessibility requirements not fulfilled. " ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  not  args . skip_playthrough : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logger . info ( ' Calculating playthrough. ' ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        create_playthrough ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-23 12:06:00 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  multidata_task : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        multidata_task . result ( )   # retrieve exception if one exists 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    pool . shutdown ( )   # wait for all queued tasks to complete 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  args . create_spoiler :   # needs spoiler.hashes to be filled, that depend on rom_futures being done 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        world . spoiler . to_file ( output_path ( ' %s _Spoiler.txt '  %  outfilebase ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-21 18:35:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logger . info ( ' Done. Enjoy. Total Time:  %s ' ,  time . perf_counter ( )  -  start ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-15 20:28:04 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  world 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-03-22 23:18:40 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 10:00:41 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  copy_world ( world ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # ToDo: Not good yet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret  =  World ( world . players ,  world . shuffle ,  world . logic ,  world . mode ,  world . swords ,  world . difficulty ,  world . difficulty_adjustments ,  world . timer ,  world . progressive ,  world . goal ,  world . algorithm ,  world . accessibility ,  world . shuffle_ganon ,  world . retro ,  world . custom ,  world . customitemarray ,  world . hints ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . teams  =  world . teams 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . player_names  =  copy . deepcopy ( world . player_names ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . remote_items  =  world . remote_items . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . required_medallions  =  world . required_medallions . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . swamp_patch_required  =  world . swamp_patch_required . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . ganon_at_pyramid  =  world . ganon_at_pyramid . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . powder_patch_required  =  world . powder_patch_required . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . ganonstower_vanilla  =  world . ganonstower_vanilla . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . treasure_hunt_count  =  world . treasure_hunt_count . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . treasure_hunt_icon  =  world . treasure_hunt_icon . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . sewer_light_cone  =  world . sewer_light_cone . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . light_world_light_cone  =  world . light_world_light_cone 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . dark_world_light_cone  =  world . dark_world_light_cone 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . seed  =  world . seed 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . can_access_trock_eyebridge  =  world . can_access_trock_eyebridge . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . can_access_trock_front  =  world . can_access_trock_front . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . can_access_trock_big_chest  =  world . can_access_trock_big_chest . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . can_access_trock_middle  =  world . can_access_trock_middle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . can_take_damage  =  world . can_take_damage 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . difficulty_requirements  =  world . difficulty_requirements . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . fix_fake_world  =  world . fix_fake_world . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . mapshuffle  =  world . mapshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . compassshuffle  =  world . compassshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . keyshuffle  =  world . keyshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . bigkeyshuffle  =  world . bigkeyshuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . crystals_needed_for_ganon  =  world . crystals_needed_for_ganon . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . crystals_needed_for_gt  =  world . crystals_needed_for_gt . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . open_pyramid  =  world . open_pyramid . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . boss_shuffle  =  world . boss_shuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . enemy_shuffle  =  world . enemy_shuffle . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . enemy_health  =  world . enemy_health . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . enemy_damage  =  world . enemy_damage . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . beemizer  =  world . beemizer . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . timer  =  world . timer . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . shufflepots  =  world . shufflepots . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-07 19:51:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ret . shuffle_prizes  =  world . shuffle_prizes . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-19 01:02:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ret . shop_shuffle  =   world . shop_shuffle . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2021-01-19 01:03:32 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ret . shop_shuffle_slots  =  world . shop_shuffle_slots . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-10-07 19:51:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ret . dark_room_logic  =  world . dark_room_logic . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . restrict_dungeon_item_on_boss  =  world . restrict_dungeon_item_on_boss . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 14:56:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  world . mode [ player ]  !=  ' inverted ' : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            create_regions ( ret ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            create_inverted_regions ( ret ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        create_shops ( ret ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        create_dungeons ( ret ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    copy_dynamic_regions_and_locations ( world ,  ret ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # copy bosses 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  dungeon  in  world . dungeons : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  level ,  boss  in  dungeon . bosses . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret . get_dungeon ( dungeon . name ,  dungeon . player ) . bosses [ level ]  =  boss 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  shop  in  world . shops : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copied_shop  =  ret . get_region ( shop . region . name ,  shop . region . player ) . shop 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copied_shop . inventory  =  copy . copy ( shop . inventory ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # connect copied world 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  region  in  world . regions : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copied_region  =  ret . get_region ( region . name ,  region . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copied_region . is_light_world  =  region . is_light_world 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        copied_region . is_dark_world  =  region . is_dark_world 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  exit  in  copied_region . exits : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            old_connection  =  world . get_entrance ( exit . name ,  exit . player ) . connected_region 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            exit . connect ( ret . get_region ( old_connection . name ,  old_connection . player ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # fill locations 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  location  in  world . get_locations ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  location . item  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            item  =  Item ( location . item . name ,  location . item . advancement ,  location . item . priority ,  location . item . type ,  player  =  location . item . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret . get_location ( location . name ,  location . player ) . item  =  item 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            item . location  =  ret . get_location ( location . name ,  location . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            item . world  =  ret 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  location . event : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret . get_location ( location . name ,  location . player ) . event  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  location . locked : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ret . get_location ( location . name ,  location . player ) . locked  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # copy remaining itempool. No item in itempool should have an assigned location 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  item  in  world . itempool : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret . itempool . append ( Item ( item . name ,  item . advancement ,  item . priority ,  item . type ,  player  =  item . player ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  item  in  world . precollected_items : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret . push_precollected ( ItemFactory ( item . name ,  item . player ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # copy progress items in state 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 10:00:41 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ret . state . prog_items  =  world . state . prog_items . copy ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ret . state . stale  =  { player :  True  for  player  in  range ( 1 ,  world . players  +  1 ) } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 14:56:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        set_rules ( ret ,  player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 10:00:41 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  ret 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 14:56:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  copy_dynamic_regions_and_locations ( world ,  ret ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  region  in  world . dynamic_regions : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_reg  =  Region ( region . name ,  region . type ,  region . hint_text ,  region . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret . regions . append ( new_reg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret . initialize_regions ( [ new_reg ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ret . dynamic_regions . append ( new_reg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Note: ideally exits should be copied here, but the current use case (Take anys) do not require this 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  region . shop : 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-25 14:31:20 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            new_reg . shop  =  region . shop . __class__ ( new_reg ,  region . shop . room_id ,  region . shop . shopkeeper_config , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                 region . shop . custom ,  region . shop . locked ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 14:56:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            ret . shops . append ( new_reg . shop ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  location  in  world . dynamic_locations : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_reg  =  ret . get_region ( location . parent_region . name ,  location . parent_region . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_loc  =  Location ( location . player ,  location . name ,  location . address ,  location . crystal ,  location . hint_text ,  new_reg ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # todo: this is potentially dangerous. later refactor so we 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # can apply dynamic region rules on top of copied world like other rules 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_loc . access_rule  =  location . access_rule 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_loc . always_allow  =  location . always_allow 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_loc . item_rule  =  location . item_rule 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_reg . locations . append ( new_loc ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-27 04:05:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ret . clear_location_cache ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-10 14:56:52 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  create_playthrough ( world ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # create a copy as we will modify it 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-04 16:15:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    old_world  =  world 
							 
						 
					
						
							
								
									
										
										
										
											2020-05-09 10:00:41 +10:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    world  =  copy_world ( world ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 09:53:34 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # get locations containing progress items 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-02 20:01:16 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    prog_locations  =  [ location  for  location  in  world . get_filled_locations ( )  if  location . item . advancement ] 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-01 15:55:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    state_cache  =  [ None ] 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    collection_spheres  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    state  =  CollectionState ( world ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sphere_candidates  =  list ( prog_locations ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-14 00:34:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    logging . debug ( ' Building up collection spheres. ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    while  sphere_candidates : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 22:37:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        state . sweep_for_events ( key_only = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-24 11:11:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        sphere  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # build up spheres of collection radius. Everything in each sphere is independent from each other in dependencies and only depends on lower spheres 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  location  in  sphere_candidates : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  state . can_reach ( location ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sphere . append ( location ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  location  in  sphere : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sphere_candidates . remove ( location ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-01 15:55:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            state . collect ( location . item ,  True ,  location ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-17 14:40:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        collection_spheres . append ( sphere ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-01 15:55:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        state_cache . append ( state . copy ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 09:55:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-08-14 00:34:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        logging . debug ( ' Calculated sphere  %i , containing  %i  of  %i  progress items. ' ,  len ( collection_spheres ) ,  len ( sphere ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                      len ( prog_locations ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 09:55:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  not  sphere : 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-14 00:34:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            logging . debug ( ' The following items could not be reached:  %s ' ,  [ ' %s  (Player  %d ) at  %s  (Player  %d ) '  %  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                location . item . name ,  location . item . player ,  location . name ,  location . player )  for  location  in 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                                                           sphere_candidates ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-17 12:14:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  any ( [ world . accessibility [ location . item . player ]  !=  ' none '  for  location  in  sphere_candidates ] ) : 
							 
						 
					
						
							
								
									
										
										
										
											2020-08-14 00:34:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                raise  RuntimeError ( f ' Not all progression items reachable ( { sphere_candidates } ).  ' 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                   f ' Something went terribly wrong here. ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 22:15:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-21 13:33:07 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                old_world . spoiler . unreachables  =  sphere_candidates . copy ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-23 22:15:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                break 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-26 09:55:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # in the second phase, we cull each sphere such that the game is still beatable, reducing each range of influence to the bare minimum required inside it 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-01 15:55:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  num ,  sphere  in  reversed ( list ( enumerate ( collection_spheres ) ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        to_delete  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  location  in  sphere : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # we remove the item at location and check if game is still beatable 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            logging . getLogger ( ' ' ) . debug ( ' Checking if  %s  (Player  %d ) is required to beat the game. ' ,  location . item . name ,  location . item . player ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            old_item  =  location . item 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            location . item  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-11 00:12:09 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  world . can_beat_game ( state_cache [ num ] ) : 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                to_delete . append ( location ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                # still required, got to keep it around 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                location . item  =  old_item 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # cull entries in spheres for spoiler walkthrough at end 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  location  in  to_delete : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sphere . remove ( location ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-01-09 08:31:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # second phase, sphere 0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  item  in  [ i  for  i  in  world . precollected_items  if  i . advancement ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logging . getLogger ( ' ' ) . debug ( ' Checking if  %s  (Player  %d ) is required to beat the game. ' ,  item . name ,  item . player ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . precollected_items . remove ( item ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        world . state . remove ( item ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  world . can_beat_game ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            world . push_precollected ( item ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-06 14:25:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # we are now down to just the required progress items in collection_spheres. Unfortunately 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # the previous pruning stage could potentially have made certain items dependant on others 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # in the same or later sphere (because the location had 2 ways to access but the item originally 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # used to access it was deemed not required.) So we need to do one final sphere collection pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # to build up the correct spheres 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    required_locations  =  [ item  for  sphere  in  collection_spheres  for  item  in  sphere ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    state  =  CollectionState ( world ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    collection_spheres  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  required_locations : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-13 22:37:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        state . sweep_for_events ( key_only = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-06 14:25:49 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sphere  =  list ( filter ( state . can_reach ,  required_locations ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  location  in  sphere : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            required_locations . remove ( location ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            state . collect ( location . item ,  True ,  location ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        collection_spheres . append ( sphere ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        logging . getLogger ( ' ' ) . debug ( ' Calculated final sphere  %i , containing  %i  of  %i  progress items. ' ,  len ( collection_spheres ) ,  len ( sphere ) ,  len ( required_locations ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  sphere : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  RuntimeError ( ' Not all required items reachable. Something went terribly wrong here. ' ) 
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-06-04 16:15:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # store the required locations for statistical analysis 
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    old_world . required_locations  =  [ ( location . name ,  location . player )  for  sphere  in  collection_spheres  for  location  in  sphere ] 
							 
						 
					
						
							
								
									
										
										
										
											2017-06-04 16:15:59 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-01 15:55:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  flist_to_iter ( node ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        while  node : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            value ,  node  =  node 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            yield  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2018-01-06 16:25:14 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    def  get_path ( state ,  region ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        reversed_path_as_flist  =  state . path . get ( region ,  ( region ,  None ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        string_path_flat  =  reversed ( list ( map ( str ,  flist_to_iter ( reversed_path_as_flist ) ) ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Now we combine the flat string list into (region, exit) pairs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pathsiter  =  iter ( string_path_flat ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pathpairs  =  zip_longest ( pathsiter ,  pathsiter ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  list ( pathpairs ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-04-18 11:23:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    old_world . spoiler . paths  =  dict ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  player  in  range ( 1 ,  world . players  +  1 ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        old_world . spoiler . paths . update ( {  str ( location )  :  get_path ( state ,  location . parent_region )  for  sphere  in  collection_spheres  for  location  in  sphere  if  location . player  ==  player } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  _ ,  path  in  dict ( old_world . spoiler . paths ) . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  any ( exit  ==  ' Pyramid Fairy '  for  ( _ ,  exit )  in  path ) : 
							 
						 
					
						
							
								
									
										
										
										
											2019-12-16 16:54:46 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                if  world . mode [ player ]  !=  ' inverted ' : 
							 
						 
					
						
							
								
									
										
										
										
											2019-07-27 09:13:13 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    old_world . spoiler . paths [ str ( world . get_region ( ' Big Bomb Shop ' ,  player ) ) ]  =  get_path ( state ,  world . get_region ( ' Big Bomb Shop ' ,  player ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    old_world . spoiler . paths [ str ( world . get_region ( ' Inverted Big Bomb Shop ' ,  player ) ) ]  =  get_path ( state ,  world . get_region ( ' Inverted Big Bomb Shop ' ,  player ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2018-01-01 15:55:13 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2017-05-16 21:23:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # we can finally output our playthrough 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-10 07:02:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    old_world . spoiler . playthrough  =  OrderedDict ( [ ( " 0 " ,  [ str ( item )  for  item  in  world . precollected_items  if  item . advancement ] ) ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2020-01-09 08:31:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  i ,  sphere  in  enumerate ( collection_spheres ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        old_world . spoiler . playthrough [ str ( i  +  1 ) ]  =  { str ( location ) :  str ( location . item )  for  location  in  sphere }