@@ -130,7 +130,7 @@ def copy_dependencies(zip_path, file):
130130 from randomizer .Spoiler import Spoiler
131131 from randomizer .Settings import Settings
132132 from randomizer .ShuffleWarps import LinkWarps
133- from randomizer .Enums .Settings import ShuffleLoadingZones
133+ from randomizer .Enums .Settings import LogicType , ShuffleLoadingZones
134134 from randomizer .Patching .ApplyRandomizer import patching_response
135135 from version import version
136136 from randomizer .Patching .EnemyRando import randomize_enemies_0
@@ -141,9 +141,11 @@ def copy_dependencies(zip_path, file):
141141 from randomizer .Enums .Levels import Levels
142142 from randomizer .Enums .Maps import Maps
143143 from randomizer .Enums .Locations import Locations as DK64RLocations
144- from randomizer .Enums .Settings import WinConditionComplex , SwitchsanityLevel
144+ from randomizer .Enums .Settings import WinConditionComplex , SwitchsanityLevel , GlitchesSelected
145145 from randomizer .Enums .Switches import Switches
146+ from randomizer .Enums .SwitchTypes import SwitchType
146147 from randomizer .Lists import Item as DK64RItem
148+ from randomizer .Lists .Switches import SwitchInfo
147149 from worlds .LauncherComponents import Component , components , Type , icon_paths
148150 import randomizer .ShuffleExits as ShuffleExits
149151 from Utils import open_filename
@@ -283,7 +285,24 @@ def generate_early(self):
283285 settings_dict ["medal_requirement" ] = self .options .medal_requirement .value
284286 settings_dict ["rareware_gb_fairies" ] = self .options .rareware_gb_fairies .value
285287 settings_dict ["krool_key_count" ] = self .options .krool_key_count .value
288+ if hasattr (self .multiworld , "generation_is_fake" ):
289+ settings_dict ["krool_key_count" ] = 8 # if gen is fake, don't pick random keys to start with, trust the slot data
286290 settings_dict ["switchsanity" ] = self .options .switchsanity .value
291+ settings_dict ["logic_type" ] = self .options .logic_type .value
292+ settings_dict ["glitches_selected" ] = []
293+ for glitch in self .options .glitches_selected :
294+ if glitch == "advanced_platforming" :
295+ settings_dict ["glitches_selected" ].append (GlitchesSelected .advanced_platforming )
296+ elif glitch == "moonkicks" :
297+ settings_dict ["glitches_selected" ].append (GlitchesSelected .moonkicks )
298+ elif glitch == "phase_swimming" :
299+ settings_dict ["glitches_selected" ].append (GlitchesSelected .phase_swimming )
300+ elif glitch == "swim_through_shores" :
301+ settings_dict ["glitches_selected" ].append (GlitchesSelected .swim_through_shores )
302+ elif glitch == "troff_n_scoff_skips" :
303+ settings_dict ["glitches_selected" ].append (GlitchesSelected .troff_n_scoff_skips )
304+ elif glitch == "moontail" :
305+ settings_dict ["glitches_selected" ].append (GlitchesSelected .moontail )
287306 settings_dict ["starting_keys_list_selected" ] = []
288307 for item in self .options .start_inventory :
289308 if item == "Key 1" :
@@ -305,25 +324,46 @@ def generate_early(self):
305324 if self .options .goal == Goal .option_all_keys :
306325 settings_dict ["win_condition_item" ] = WinConditionComplex .req_key
307326 settings_dict ["win_condition_count" ] = 8
327+ if self .options .goal == Goal .option_dk_rap :
328+ settings_dict ["win_condition_item" ] = WinConditionComplex .dk_rap_items
308329 settings = Settings (settings_dict , self .random )
309330 # Set all the static slot data that UT needs to know. Most of these would have already been decided in normal generation by now, so they are just overwritten here.
310331 if hasattr (self .multiworld , "generation_is_fake" ):
311332 if hasattr (self .multiworld , "re_gen_passthrough" ):
312333 if "Donkey Kong 64" in self .multiworld .re_gen_passthrough :
313334 passthrough = self .multiworld .re_gen_passthrough ["Donkey Kong 64" ]
314335 settings .level_order = passthrough ["LevelOrder" ]
336+ # Switch logic lifted out of level shuffle due to static levels for UT
337+ if settings .alter_switch_allocation :
338+ allocation = [1 , 1 , 1 , 1 , 2 , 2 , 3 , 3 ]
339+ for x in range (8 ):
340+ level = settings .level_order [x + 1 ]
341+ settings .switch_allocation [level ] = allocation [x ]
315342 settings .starting_kong_list = passthrough ["StartingKongs" ]
343+ settings .starting_kong = settings .starting_kong_list [0 ] # fake a starting kong so that we don't force a different kong
344+ settings .medal_requirement = passthrough ["JetpacReq" ]
345+ settings .rareware_gb_fairies = passthrough ["FairyRequirement" ]
346+ settings .medal_cb_req = passthrough ["MedalCBRequirement" ]
316347 settings .BossBananas = passthrough ["BossBananas" ]
317348 settings .boss_maps = passthrough ["BossMaps" ]
318349 settings .boss_kongs = passthrough ["BossKongs" ]
319350 settings .lanky_freeing_kong = passthrough ["LankyFreeingKong" ]
320351 settings .helm_order = passthrough ["HelmOrder" ]
352+ settings .logic_type = LogicType [passthrough ["LogicType" ]]
353+ settings .glitches_selected = passthrough ["GlitchesSelected" ]
354+ settings .open_lobbies = passthrough ["OpenLobbies" ]
355+ settings .starting_key_list = passthrough ["StartingKeyList" ]
321356 # There's multiple sources of truth for helm order.
322357 settings .helm_donkey = 0 in settings .helm_order
323358 settings .helm_diddy = 4 in settings .helm_order
324359 settings .helm_lanky = 3 in settings .helm_order
325360 settings .helm_tiny = 2 in settings .helm_order
326361 settings .helm_chunky = 1 in settings .helm_order
362+ # Switchsanity
363+ for switch , data in passthrough ["SwitchSanity" ].items ():
364+ needed_kong = Kongs [data ["kong" ]]
365+ switch_type = SwitchType [data ["type" ]]
366+ settings .switchsanity_data [Switches [switch ]] = SwitchInfo (switch , needed_kong , switch_type , 0 , 0 , [])
327367 # We need to set the freeing kongs here early, as they won't get filled in any other part of the AP process
328368 settings .diddy_freeing_kong = self .random .randint (0 , 4 )
329369 # Lanky freeing kong actually changes logic, so UT should use the slot data rather than genning a new one.
@@ -577,6 +617,8 @@ def fill_slot_data(self) -> dict:
577617 "ClimbingShuffle" : self .options .climbing_shuffle .value ,
578618 "PlayerNum" : self .player ,
579619 "death_link" : self .options .death_link .value ,
620+ "ring_link" : self .options .ring_link .value ,
621+ "tag_link" : self .options .tag_link .value ,
580622 "receive_notifications" : self .options .receive_notifications .value ,
581623 "LevelOrder" : ", " .join ([level .name for order , level in self .logic_holder .settings .level_order .items ()]),
582624 "StartingKongs" : ", " .join ([kong .name for kong in self .logic_holder .settings .starting_kong_list ]),
@@ -596,6 +638,9 @@ def fill_slot_data(self) -> dict:
596638 "OpenLobbies" : self .logic_holder .settings .open_lobbies ,
597639 "KroolInBossPool" : self .logic_holder .settings .krool_in_boss_pool ,
598640 "SwitchSanity" : {switch .name : {"kong" : data .kong .name , "type" : data .switch_type .name } for switch , data in self .logic_holder .settings .switchsanity_data .items ()},
641+ "LogicType" : self .logic_holder .settings .logic_type .name ,
642+ "GlitchesSelected" : ", " .join ([glitch .name for glitch in self .logic_holder .settings .glitches_selected ]),
643+ "StartingKeyList" : ", " .join ([key .name for key in self .logic_holder .settings .starting_key_list ]),
599644 }
600645
601646 def write_spoiler (self , spoiler_handle : typing .TextIO ):
@@ -648,6 +693,9 @@ def create_item(self, name: str, force_non_progression=False) -> Item:
648693 classification = ItemClassification .filler
649694 elif data .progression :
650695 classification = ItemClassification .progression
696+ elif hasattr (self .multiworld , "generation_is_fake" ):
697+ # UT needs to classify things as progression or it won't track them
698+ classification = ItemClassification .progression
651699 else :
652700 classification = ItemClassification .filler
653701
@@ -667,17 +715,35 @@ def interpret_slot_data(self, slot_data: dict[str, any]) -> dict[str, any]:
667715 # Parse the string data
668716 level_order = slot_data ["LevelOrder" ].split (", " )
669717 starting_kongs = slot_data ["StartingKongs" ].split (", " )
718+ medal_cb_req = slot_data ["MedalCBRequirement" ]
719+ fairy_req = slot_data ["FairyRequirement" ]
720+ pearl_req = slot_data ["MermaidPearls" ]
721+ jetpac_req = slot_data ["JetpacReq" ]
670722 boss_bananas = slot_data ["BossBananas" ].split (", " )
671723 boss_maps = slot_data ["BossMaps" ].split (", " )
672724 boss_kongs = slot_data ["BossKongs" ].split (", " )
673725 helm_order = slot_data ["HelmOrder" ].split (", " )
726+ open_lobbies = slot_data ["OpenLobbies" ]
727+ switchsanity = slot_data ["SwitchSanity" ]
728+ logic_type = slot_data ["LogicType" ]
729+ glitches_selected = slot_data ["GlitchesSelected" ].split (", " )
730+ starting_key_list = slot_data ["StartingKeyList" ].split (", " )
674731
675732 relevant_data = {}
676733 relevant_data ["LevelOrder" ] = dict (enumerate ([Levels [level ] for level in level_order ], start = 1 ))
677734 relevant_data ["StartingKongs" ] = [Kongs [kong ] for kong in starting_kongs ]
735+ relevant_data ["MedalCBRequirement" ] = medal_cb_req
736+ relevant_data ["FairyRequirement" ] = fairy_req
737+ relevant_data ["MermaidPearls" ] = pearl_req
738+ relevant_data ["JetpacReq" ] = jetpac_req
678739 relevant_data ["BossBananas" ] = [int (cost ) for cost in boss_bananas ]
679740 relevant_data ["BossMaps" ] = [Maps [map ] for map in boss_maps ]
680741 relevant_data ["BossKongs" ] = [Kongs [kong ] for kong in boss_kongs ]
681742 relevant_data ["LankyFreeingKong" ] = slot_data ["LankyFreeingKong" ]
682743 relevant_data ["HelmOrder" ] = [int (room ) for room in helm_order ]
744+ relevant_data ["SwitchSanity" ] = switchsanity
745+ relevant_data ["OpenLobbies" ] = open_lobbies
746+ relevant_data ["LogicType" ] = logic_type
747+ relevant_data ["GlitchesSelected" ] = [GlitchesSelected [glitch ] for glitch in glitches_selected if glitch != "" ]
748+ relevant_data ["StartingKeyList" ] = [DK64RItems [key ] for key in starting_key_list if key != "" ]
683749 return relevant_data
0 commit comments