diff --git a/worlds/dkc3/Locations.py b/worlds/dkc3/Locations.py index e8d5409b1563..6d8833872b03 100644 --- a/worlds/dkc3/Locations.py +++ b/worlds/dkc3/Locations.py @@ -2,6 +2,7 @@ from BaseClasses import Location from .Names import LocationName +from worlds.AutoWorld import World class DKC3Location(Location): @@ -321,13 +322,13 @@ def __init__(self, player: int, name: str = '', address: int = None, parent=None location_table = {} -def setup_locations(world, player: int): +def setup_locations(world: World): location_table = {**level_location_table, **boss_location_table, **secret_cave_location_table} - if False:#world.include_trade_sequence[player].value: + if False:#world.options.include_trade_sequence: location_table.update({**brothers_bear_location_table}) - if world.kongsanity[player].value: + if world.options.kongsanity: location_table.update({**kong_location_table}) return location_table diff --git a/worlds/dkc3/Options.py b/worlds/dkc3/Options.py index 7c0f532cfc76..06be30cf15ae 100644 --- a/worlds/dkc3/Options.py +++ b/worlds/dkc3/Options.py @@ -1,6 +1,7 @@ +from dataclasses import dataclass import typing -from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionList +from Options import Choice, Range, Option, Toggle, DeathLink, DefaultOnToggle, OptionList, PerGameCommonOptions class Goal(Choice): @@ -158,21 +159,21 @@ class StartingLifeCount(Range): default = 5 -dkc3_options: typing.Dict[str, type(Option)] = { - #"death_link": DeathLink, # Disabled - "goal": Goal, - #"include_trade_sequence": IncludeTradeSequence, # Disabled - "dk_coins_for_gyrocopter": DKCoinsForGyrocopter, - "krematoa_bonus_coin_cost": KrematoaBonusCoinCost, - "percentage_of_extra_bonus_coins": PercentageOfExtraBonusCoins, - "number_of_banana_birds": NumberOfBananaBirds, - "percentage_of_banana_birds": PercentageOfBananaBirds, - "kongsanity": KONGsanity, - "level_shuffle": LevelShuffle, - "difficulty": Difficulty, - "autosave": Autosave, - "merry": MERRY, - "music_shuffle": MusicShuffle, - "kong_palette_swap": KongPaletteSwap, - "starting_life_count": StartingLifeCount, -} +@dataclass +class DKC3Options(PerGameCommonOptions): + #death_link: DeathLink # Disabled + goal: Goal + #include_trade_sequence: IncludeTradeSequence # Disabled + dk_coins_for_gyrocopter: DKCoinsForGyrocopter + krematoa_bonus_coin_cost: KrematoaBonusCoinCost + percentage_of_extra_bonus_coins: PercentageOfExtraBonusCoins + number_of_banana_birds: NumberOfBananaBirds + percentage_of_banana_birds: PercentageOfBananaBirds + kongsanity: KONGsanity + level_shuffle: LevelShuffle + difficulty: Difficulty + autosave: Autosave + merry: MERRY + music_shuffle: MusicShuffle + kong_palette_swap: KongPaletteSwap + starting_life_count: StartingLifeCount diff --git a/worlds/dkc3/Regions.py b/worlds/dkc3/Regions.py index ca6545ca14cc..ae505b78d84b 100644 --- a/worlds/dkc3/Regions.py +++ b/worlds/dkc3/Regions.py @@ -4,38 +4,39 @@ from .Items import DKC3Item from .Locations import DKC3Location from .Names import LocationName, ItemName +from worlds.AutoWorld import World -def create_regions(world, player: int, active_locations): - menu_region = create_region(world, player, active_locations, 'Menu', None) +def create_regions(world: World, active_locations): + menu_region = create_region(world, active_locations, 'Menu', None) overworld_1_region_locations = {} - if world.goal[player] != "knautilus": + if world.options.goal != "knautilus": overworld_1_region_locations.update({LocationName.banana_bird_mother: []}) - overworld_1_region = create_region(world, player, active_locations, LocationName.overworld_1_region, + overworld_1_region = create_region(world, active_locations, LocationName.overworld_1_region, overworld_1_region_locations) overworld_2_region_locations = {} - overworld_2_region = create_region(world, player, active_locations, LocationName.overworld_2_region, + overworld_2_region = create_region(world, active_locations, LocationName.overworld_2_region, overworld_2_region_locations) overworld_3_region_locations = {} - overworld_3_region = create_region(world, player, active_locations, LocationName.overworld_3_region, + overworld_3_region = create_region(world, active_locations, LocationName.overworld_3_region, overworld_3_region_locations) overworld_4_region_locations = {} - overworld_4_region = create_region(world, player, active_locations, LocationName.overworld_4_region, + overworld_4_region = create_region(world, active_locations, LocationName.overworld_4_region, overworld_4_region_locations) - lake_orangatanga_region = create_region(world, player, active_locations, LocationName.lake_orangatanga_region, None) - kremwood_forest_region = create_region(world, player, active_locations, LocationName.kremwood_forest_region, None) - cotton_top_cove_region = create_region(world, player, active_locations, LocationName.cotton_top_cove_region, None) - mekanos_region = create_region(world, player, active_locations, LocationName.mekanos_region, None) - k3_region = create_region(world, player, active_locations, LocationName.k3_region, None) - razor_ridge_region = create_region(world, player, active_locations, LocationName.razor_ridge_region, None) - kaos_kore_region = create_region(world, player, active_locations, LocationName.kaos_kore_region, None) - krematoa_region = create_region(world, player, active_locations, LocationName.krematoa_region, None) + lake_orangatanga_region = create_region(world, active_locations, LocationName.lake_orangatanga_region, None) + kremwood_forest_region = create_region(world, active_locations, LocationName.kremwood_forest_region, None) + cotton_top_cove_region = create_region(world, active_locations, LocationName.cotton_top_cove_region, None) + mekanos_region = create_region(world, active_locations, LocationName.mekanos_region, None) + k3_region = create_region(world, active_locations, LocationName.k3_region, None) + razor_ridge_region = create_region(world, active_locations, LocationName.razor_ridge_region, None) + kaos_kore_region = create_region(world, active_locations, LocationName.kaos_kore_region, None) + krematoa_region = create_region(world, active_locations, LocationName.krematoa_region, None) lakeside_limbo_region_locations = { @@ -44,9 +45,9 @@ def create_regions(world, player: int, active_locations): LocationName.lakeside_limbo_bonus_2 : [0x657, 3], LocationName.lakeside_limbo_dk : [0x657, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: lakeside_limbo_region_locations[LocationName.lakeside_limbo_kong] = [] - lakeside_limbo_region = create_region(world, player, active_locations, LocationName.lakeside_limbo_region, + lakeside_limbo_region = create_region(world, active_locations, LocationName.lakeside_limbo_region, lakeside_limbo_region_locations) doorstop_dash_region_locations = { @@ -55,9 +56,9 @@ def create_regions(world, player: int, active_locations): LocationName.doorstop_dash_bonus_2 : [0x65A, 3], LocationName.doorstop_dash_dk : [0x65A, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: doorstop_dash_region_locations[LocationName.doorstop_dash_kong] = [] - doorstop_dash_region = create_region(world, player, active_locations, LocationName.doorstop_dash_region, + doorstop_dash_region = create_region(world, active_locations, LocationName.doorstop_dash_region, doorstop_dash_region_locations) tidal_trouble_region_locations = { @@ -66,9 +67,9 @@ def create_regions(world, player: int, active_locations): LocationName.tidal_trouble_bonus_2 : [0x659, 3], LocationName.tidal_trouble_dk : [0x659, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: tidal_trouble_region_locations[LocationName.tidal_trouble_kong] = [] - tidal_trouble_region = create_region(world, player, active_locations, LocationName.tidal_trouble_region, + tidal_trouble_region = create_region(world, active_locations, LocationName.tidal_trouble_region, tidal_trouble_region_locations) skiddas_row_region_locations = { @@ -77,9 +78,9 @@ def create_regions(world, player: int, active_locations): LocationName.skiddas_row_bonus_2 : [0x65D, 3], LocationName.skiddas_row_dk : [0x65D, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: skiddas_row_region_locations[LocationName.skiddas_row_kong] = [] - skiddas_row_region = create_region(world, player, active_locations, LocationName.skiddas_row_region, + skiddas_row_region = create_region(world, active_locations, LocationName.skiddas_row_region, skiddas_row_region_locations) murky_mill_region_locations = { @@ -88,9 +89,9 @@ def create_regions(world, player: int, active_locations): LocationName.murky_mill_bonus_2 : [0x65C, 3], LocationName.murky_mill_dk : [0x65C, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: murky_mill_region_locations[LocationName.murky_mill_kong] = [] - murky_mill_region = create_region(world, player, active_locations, LocationName.murky_mill_region, + murky_mill_region = create_region(world, active_locations, LocationName.murky_mill_region, murky_mill_region_locations) barrel_shield_bust_up_region_locations = { @@ -99,9 +100,9 @@ def create_regions(world, player: int, active_locations): LocationName.barrel_shield_bust_up_bonus_2 : [0x662, 3], LocationName.barrel_shield_bust_up_dk : [0x662, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: barrel_shield_bust_up_region_locations[LocationName.barrel_shield_bust_up_kong] = [] - barrel_shield_bust_up_region = create_region(world, player, active_locations, + barrel_shield_bust_up_region = create_region(world, active_locations, LocationName.barrel_shield_bust_up_region, barrel_shield_bust_up_region_locations) @@ -111,9 +112,9 @@ def create_regions(world, player: int, active_locations): LocationName.riverside_race_bonus_2 : [0x664, 3], LocationName.riverside_race_dk : [0x664, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: riverside_race_region_locations[LocationName.riverside_race_kong] = [] - riverside_race_region = create_region(world, player, active_locations, LocationName.riverside_race_region, + riverside_race_region = create_region(world, active_locations, LocationName.riverside_race_region, riverside_race_region_locations) squeals_on_wheels_region_locations = { @@ -122,9 +123,9 @@ def create_regions(world, player: int, active_locations): LocationName.squeals_on_wheels_bonus_2 : [0x65B, 3], LocationName.squeals_on_wheels_dk : [0x65B, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: squeals_on_wheels_region_locations[LocationName.squeals_on_wheels_kong] = [] - squeals_on_wheels_region = create_region(world, player, active_locations, LocationName.squeals_on_wheels_region, + squeals_on_wheels_region = create_region(world, active_locations, LocationName.squeals_on_wheels_region, squeals_on_wheels_region_locations) springin_spiders_region_locations = { @@ -133,9 +134,9 @@ def create_regions(world, player: int, active_locations): LocationName.springin_spiders_bonus_2 : [0x661, 3], LocationName.springin_spiders_dk : [0x661, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: springin_spiders_region_locations[LocationName.springin_spiders_kong] = [] - springin_spiders_region = create_region(world, player, active_locations, LocationName.springin_spiders_region, + springin_spiders_region = create_region(world, active_locations, LocationName.springin_spiders_region, springin_spiders_region_locations) bobbing_barrel_brawl_region_locations = { @@ -144,9 +145,9 @@ def create_regions(world, player: int, active_locations): LocationName.bobbing_barrel_brawl_bonus_2 : [0x666, 3], LocationName.bobbing_barrel_brawl_dk : [0x666, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: bobbing_barrel_brawl_region_locations[LocationName.bobbing_barrel_brawl_kong] = [] - bobbing_barrel_brawl_region = create_region(world, player, active_locations, + bobbing_barrel_brawl_region = create_region(world, active_locations, LocationName.bobbing_barrel_brawl_region, bobbing_barrel_brawl_region_locations) @@ -156,9 +157,9 @@ def create_regions(world, player: int, active_locations): LocationName.bazzas_blockade_bonus_2 : [0x667, 3], LocationName.bazzas_blockade_dk : [0x667, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: bazzas_blockade_region_locations[LocationName.bazzas_blockade_kong] = [] - bazzas_blockade_region = create_region(world, player, active_locations, LocationName.bazzas_blockade_region, + bazzas_blockade_region = create_region(world, active_locations, LocationName.bazzas_blockade_region, bazzas_blockade_region_locations) rocket_barrel_ride_region_locations = { @@ -167,9 +168,9 @@ def create_regions(world, player: int, active_locations): LocationName.rocket_barrel_ride_bonus_2 : [0x66A, 3], LocationName.rocket_barrel_ride_dk : [0x66A, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: rocket_barrel_ride_region_locations[LocationName.rocket_barrel_ride_kong] = [] - rocket_barrel_ride_region = create_region(world, player, active_locations, LocationName.rocket_barrel_ride_region, + rocket_barrel_ride_region = create_region(world, active_locations, LocationName.rocket_barrel_ride_region, rocket_barrel_ride_region_locations) kreeping_klasps_region_locations = { @@ -178,9 +179,9 @@ def create_regions(world, player: int, active_locations): LocationName.kreeping_klasps_bonus_2 : [0x658, 3], LocationName.kreeping_klasps_dk : [0x658, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: kreeping_klasps_region_locations[LocationName.kreeping_klasps_kong] = [] - kreeping_klasps_region = create_region(world, player, active_locations, LocationName.kreeping_klasps_region, + kreeping_klasps_region = create_region(world, active_locations, LocationName.kreeping_klasps_region, kreeping_klasps_region_locations) tracker_barrel_trek_region_locations = { @@ -189,9 +190,9 @@ def create_regions(world, player: int, active_locations): LocationName.tracker_barrel_trek_bonus_2 : [0x66B, 3], LocationName.tracker_barrel_trek_dk : [0x66B, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: tracker_barrel_trek_region_locations[LocationName.tracker_barrel_trek_kong] = [] - tracker_barrel_trek_region = create_region(world, player, active_locations, LocationName.tracker_barrel_trek_region, + tracker_barrel_trek_region = create_region(world, active_locations, LocationName.tracker_barrel_trek_region, tracker_barrel_trek_region_locations) fish_food_frenzy_region_locations = { @@ -200,9 +201,9 @@ def create_regions(world, player: int, active_locations): LocationName.fish_food_frenzy_bonus_2 : [0x668, 3], LocationName.fish_food_frenzy_dk : [0x668, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: fish_food_frenzy_region_locations[LocationName.fish_food_frenzy_kong] = [] - fish_food_frenzy_region = create_region(world, player, active_locations, LocationName.fish_food_frenzy_region, + fish_food_frenzy_region = create_region(world, active_locations, LocationName.fish_food_frenzy_region, fish_food_frenzy_region_locations) fire_ball_frenzy_region_locations = { @@ -211,9 +212,9 @@ def create_regions(world, player: int, active_locations): LocationName.fire_ball_frenzy_bonus_2 : [0x66D, 3], LocationName.fire_ball_frenzy_dk : [0x66D, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: fire_ball_frenzy_region_locations[LocationName.fire_ball_frenzy_kong] = [] - fire_ball_frenzy_region = create_region(world, player, active_locations, LocationName.fire_ball_frenzy_region, + fire_ball_frenzy_region = create_region(world, active_locations, LocationName.fire_ball_frenzy_region, fire_ball_frenzy_region_locations) demolition_drain_pipe_region_locations = { @@ -222,9 +223,9 @@ def create_regions(world, player: int, active_locations): LocationName.demolition_drain_pipe_bonus_2 : [0x672, 3], LocationName.demolition_drain_pipe_dk : [0x672, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: demolition_drain_pipe_region_locations[LocationName.demolition_drain_pipe_kong] = [] - demolition_drain_pipe_region = create_region(world, player, active_locations, + demolition_drain_pipe_region = create_region(world, active_locations, LocationName.demolition_drain_pipe_region, demolition_drain_pipe_region_locations) @@ -234,9 +235,9 @@ def create_regions(world, player: int, active_locations): LocationName.ripsaw_rage_bonus_2 : [0x660, 3], LocationName.ripsaw_rage_dk : [0x660, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: ripsaw_rage_region_locations[LocationName.ripsaw_rage_kong] = [] - ripsaw_rage_region = create_region(world, player, active_locations, LocationName.ripsaw_rage_region, + ripsaw_rage_region = create_region(world, active_locations, LocationName.ripsaw_rage_region, ripsaw_rage_region_locations) blazing_bazookas_region_locations = { @@ -245,9 +246,9 @@ def create_regions(world, player: int, active_locations): LocationName.blazing_bazookas_bonus_2 : [0x66E, 3], LocationName.blazing_bazookas_dk : [0x66E, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: blazing_bazookas_region_locations[LocationName.blazing_bazookas_kong] = [] - blazing_bazookas_region = create_region(world, player, active_locations, LocationName.blazing_bazookas_region, + blazing_bazookas_region = create_region(world, active_locations, LocationName.blazing_bazookas_region, blazing_bazookas_region_locations) low_g_labyrinth_region_locations = { @@ -256,9 +257,9 @@ def create_regions(world, player: int, active_locations): LocationName.low_g_labyrinth_bonus_2 : [0x670, 3], LocationName.low_g_labyrinth_dk : [0x670, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: low_g_labyrinth_region_locations[LocationName.low_g_labyrinth_kong] = [] - low_g_labyrinth_region = create_region(world, player, active_locations, LocationName.low_g_labyrinth_region, + low_g_labyrinth_region = create_region(world, active_locations, LocationName.low_g_labyrinth_region, low_g_labyrinth_region_locations) krevice_kreepers_region_locations = { @@ -267,9 +268,9 @@ def create_regions(world, player: int, active_locations): LocationName.krevice_kreepers_bonus_2 : [0x673, 3], LocationName.krevice_kreepers_dk : [0x673, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: krevice_kreepers_region_locations[LocationName.krevice_kreepers_kong] = [] - krevice_kreepers_region = create_region(world, player, active_locations, LocationName.krevice_kreepers_region, + krevice_kreepers_region = create_region(world, active_locations, LocationName.krevice_kreepers_region, krevice_kreepers_region_locations) tearaway_toboggan_region_locations = { @@ -278,9 +279,9 @@ def create_regions(world, player: int, active_locations): LocationName.tearaway_toboggan_bonus_2 : [0x65F, 3], LocationName.tearaway_toboggan_dk : [0x65F, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: tearaway_toboggan_region_locations[LocationName.tearaway_toboggan_kong] = [] - tearaway_toboggan_region = create_region(world, player, active_locations, LocationName.tearaway_toboggan_region, + tearaway_toboggan_region = create_region(world, active_locations, LocationName.tearaway_toboggan_region, tearaway_toboggan_region_locations) barrel_drop_bounce_region_locations = { @@ -289,9 +290,9 @@ def create_regions(world, player: int, active_locations): LocationName.barrel_drop_bounce_bonus_2 : [0x66C, 3], LocationName.barrel_drop_bounce_dk : [0x66C, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: barrel_drop_bounce_region_locations[LocationName.barrel_drop_bounce_kong] = [] - barrel_drop_bounce_region = create_region(world, player, active_locations, LocationName.barrel_drop_bounce_region, + barrel_drop_bounce_region = create_region(world, active_locations, LocationName.barrel_drop_bounce_region, barrel_drop_bounce_region_locations) krack_shot_kroc_region_locations = { @@ -300,9 +301,9 @@ def create_regions(world, player: int, active_locations): LocationName.krack_shot_kroc_bonus_2 : [0x66F, 3], LocationName.krack_shot_kroc_dk : [0x66F, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: krack_shot_kroc_region_locations[LocationName.krack_shot_kroc_kong] = [] - krack_shot_kroc_region = create_region(world, player, active_locations, LocationName.krack_shot_kroc_region, + krack_shot_kroc_region = create_region(world, active_locations, LocationName.krack_shot_kroc_region, krack_shot_kroc_region_locations) lemguin_lunge_region_locations = { @@ -311,9 +312,9 @@ def create_regions(world, player: int, active_locations): LocationName.lemguin_lunge_bonus_2 : [0x65E, 3], LocationName.lemguin_lunge_dk : [0x65E, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: lemguin_lunge_region_locations[LocationName.lemguin_lunge_kong] = [] - lemguin_lunge_region = create_region(world, player, active_locations, LocationName.lemguin_lunge_region, + lemguin_lunge_region = create_region(world, active_locations, LocationName.lemguin_lunge_region, lemguin_lunge_region_locations) buzzer_barrage_region_locations = { @@ -322,9 +323,9 @@ def create_regions(world, player: int, active_locations): LocationName.buzzer_barrage_bonus_2 : [0x676, 3], LocationName.buzzer_barrage_dk : [0x676, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: buzzer_barrage_region_locations[LocationName.buzzer_barrage_kong] = [] - buzzer_barrage_region = create_region(world, player, active_locations, LocationName.buzzer_barrage_region, + buzzer_barrage_region = create_region(world, active_locations, LocationName.buzzer_barrage_region, buzzer_barrage_region_locations) kong_fused_cliffs_region_locations = { @@ -333,9 +334,9 @@ def create_regions(world, player: int, active_locations): LocationName.kong_fused_cliffs_bonus_2 : [0x674, 3], LocationName.kong_fused_cliffs_dk : [0x674, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: kong_fused_cliffs_region_locations[LocationName.kong_fused_cliffs_kong] = [] - kong_fused_cliffs_region = create_region(world, player, active_locations, LocationName.kong_fused_cliffs_region, + kong_fused_cliffs_region = create_region(world, active_locations, LocationName.kong_fused_cliffs_region, kong_fused_cliffs_region_locations) floodlit_fish_region_locations = { @@ -344,9 +345,9 @@ def create_regions(world, player: int, active_locations): LocationName.floodlit_fish_bonus_2 : [0x669, 3], LocationName.floodlit_fish_dk : [0x669, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: floodlit_fish_region_locations[LocationName.floodlit_fish_kong] = [] - floodlit_fish_region = create_region(world, player, active_locations, LocationName.floodlit_fish_region, + floodlit_fish_region = create_region(world, active_locations, LocationName.floodlit_fish_region, floodlit_fish_region_locations) pothole_panic_region_locations = { @@ -355,9 +356,9 @@ def create_regions(world, player: int, active_locations): LocationName.pothole_panic_bonus_2 : [0x677, 3], LocationName.pothole_panic_dk : [0x677, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: pothole_panic_region_locations[LocationName.pothole_panic_kong] = [] - pothole_panic_region = create_region(world, player, active_locations, LocationName.pothole_panic_region, + pothole_panic_region = create_region(world, active_locations, LocationName.pothole_panic_region, pothole_panic_region_locations) ropey_rumpus_region_locations = { @@ -366,9 +367,9 @@ def create_regions(world, player: int, active_locations): LocationName.ropey_rumpus_bonus_2 : [0x675, 3], LocationName.ropey_rumpus_dk : [0x675, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: ropey_rumpus_region_locations[LocationName.ropey_rumpus_kong] = [] - ropey_rumpus_region = create_region(world, player, active_locations, LocationName.ropey_rumpus_region, + ropey_rumpus_region = create_region(world, active_locations, LocationName.ropey_rumpus_region, ropey_rumpus_region_locations) konveyor_rope_clash_region_locations = { @@ -377,9 +378,9 @@ def create_regions(world, player: int, active_locations): LocationName.konveyor_rope_clash_bonus_2 : [0x657, 3], LocationName.konveyor_rope_clash_dk : [0x657, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: konveyor_rope_clash_region_locations[LocationName.konveyor_rope_clash_kong] = [] - konveyor_rope_clash_region = create_region(world, player, active_locations, LocationName.konveyor_rope_clash_region, + konveyor_rope_clash_region = create_region(world, active_locations, LocationName.konveyor_rope_clash_region, konveyor_rope_clash_region_locations) creepy_caverns_region_locations = { @@ -388,9 +389,9 @@ def create_regions(world, player: int, active_locations): LocationName.creepy_caverns_bonus_2 : [0x678, 3], LocationName.creepy_caverns_dk : [0x678, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: creepy_caverns_region_locations[LocationName.creepy_caverns_kong] = [] - creepy_caverns_region = create_region(world, player, active_locations, LocationName.creepy_caverns_region, + creepy_caverns_region = create_region(world, active_locations, LocationName.creepy_caverns_region, creepy_caverns_region_locations) lightning_lookout_region_locations = { @@ -399,9 +400,9 @@ def create_regions(world, player: int, active_locations): LocationName.lightning_lookout_bonus_2 : [0x665, 3], LocationName.lightning_lookout_dk : [0x665, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: lightning_lookout_region_locations[LocationName.lightning_lookout_kong] = [] - lightning_lookout_region = create_region(world, player, active_locations, LocationName.lightning_lookout_region, + lightning_lookout_region = create_region(world, active_locations, LocationName.lightning_lookout_region, lightning_lookout_region_locations) koindozer_klamber_region_locations = { @@ -410,9 +411,9 @@ def create_regions(world, player: int, active_locations): LocationName.koindozer_klamber_bonus_2 : [0x679, 3], LocationName.koindozer_klamber_dk : [0x679, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: koindozer_klamber_region_locations[LocationName.koindozer_klamber_kong] = [] - koindozer_klamber_region = create_region(world, player, active_locations, LocationName.koindozer_klamber_region, + koindozer_klamber_region = create_region(world, active_locations, LocationName.koindozer_klamber_region, koindozer_klamber_region_locations) poisonous_pipeline_region_locations = { @@ -421,9 +422,9 @@ def create_regions(world, player: int, active_locations): LocationName.poisonous_pipeline_bonus_2 : [0x671, 3], LocationName.poisonous_pipeline_dk : [0x671, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: poisonous_pipeline_region_locations[LocationName.poisonous_pipeline_kong] = [] - poisonous_pipeline_region = create_region(world, player, active_locations, LocationName.poisonous_pipeline_region, + poisonous_pipeline_region = create_region(world, active_locations, LocationName.poisonous_pipeline_region, poisonous_pipeline_region_locations) stampede_sprint_region_locations = { @@ -433,9 +434,9 @@ def create_regions(world, player: int, active_locations): LocationName.stampede_sprint_bonus_3 : [0x67B, 4], LocationName.stampede_sprint_dk : [0x67B, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: stampede_sprint_region_locations[LocationName.stampede_sprint_kong] = [] - stampede_sprint_region = create_region(world, player, active_locations, LocationName.stampede_sprint_region, + stampede_sprint_region = create_region(world, active_locations, LocationName.stampede_sprint_region, stampede_sprint_region_locations) criss_cross_cliffs_region_locations = { @@ -444,9 +445,9 @@ def create_regions(world, player: int, active_locations): LocationName.criss_cross_cliffs_bonus_2 : [0x67C, 3], LocationName.criss_cross_cliffs_dk : [0x67C, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: criss_cross_cliffs_region_locations[LocationName.criss_cross_cliffs_kong] = [] - criss_cross_cliffs_region = create_region(world, player, active_locations, LocationName.criss_cross_cliffs_region, + criss_cross_cliffs_region = create_region(world, active_locations, LocationName.criss_cross_cliffs_region, criss_cross_cliffs_region_locations) tyrant_twin_tussle_region_locations = { @@ -456,9 +457,9 @@ def create_regions(world, player: int, active_locations): LocationName.tyrant_twin_tussle_bonus_3 : [0x67D, 4], LocationName.tyrant_twin_tussle_dk : [0x67D, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: tyrant_twin_tussle_region_locations[LocationName.tyrant_twin_tussle_kong] = [] - tyrant_twin_tussle_region = create_region(world, player, active_locations, LocationName.tyrant_twin_tussle_region, + tyrant_twin_tussle_region = create_region(world, active_locations, LocationName.tyrant_twin_tussle_region, tyrant_twin_tussle_region_locations) swoopy_salvo_region_locations = { @@ -468,147 +469,147 @@ def create_regions(world, player: int, active_locations): LocationName.swoopy_salvo_bonus_3 : [0x663, 4], LocationName.swoopy_salvo_dk : [0x663, 5], } - if world.kongsanity[player]: + if world.options.kongsanity: swoopy_salvo_region_locations[LocationName.swoopy_salvo_kong] = [] - swoopy_salvo_region = create_region(world, player, active_locations, LocationName.swoopy_salvo_region, + swoopy_salvo_region = create_region(world, active_locations, LocationName.swoopy_salvo_region, swoopy_salvo_region_locations) rocket_rush_region_locations = { LocationName.rocket_rush_flag : [0x67E, 1], LocationName.rocket_rush_dk : [0x67E, 5], } - rocket_rush_region = create_region(world, player, active_locations, LocationName.rocket_rush_region, + rocket_rush_region = create_region(world, active_locations, LocationName.rocket_rush_region, rocket_rush_region_locations) belchas_barn_region_locations = { LocationName.belchas_barn: [0x64F, 1], } - belchas_barn_region = create_region(world, player, active_locations, LocationName.belchas_barn_region, + belchas_barn_region = create_region(world, active_locations, LocationName.belchas_barn_region, belchas_barn_region_locations) arichs_ambush_region_locations = { LocationName.arichs_ambush: [0x650, 1], } - arichs_ambush_region = create_region(world, player, active_locations, LocationName.arichs_ambush_region, + arichs_ambush_region = create_region(world, active_locations, LocationName.arichs_ambush_region, arichs_ambush_region_locations) squirts_showdown_region_locations = { LocationName.squirts_showdown: [0x651, 1], } - squirts_showdown_region = create_region(world, player, active_locations, LocationName.squirts_showdown_region, + squirts_showdown_region = create_region(world, active_locations, LocationName.squirts_showdown_region, squirts_showdown_region_locations) kaos_karnage_region_locations = { LocationName.kaos_karnage: [0x652, 1], } - kaos_karnage_region = create_region(world, player, active_locations, LocationName.kaos_karnage_region, + kaos_karnage_region = create_region(world, active_locations, LocationName.kaos_karnage_region, kaos_karnage_region_locations) bleaks_house_region_locations = { LocationName.bleaks_house: [0x653, 1], } - bleaks_house_region = create_region(world, player, active_locations, LocationName.bleaks_house_region, + bleaks_house_region = create_region(world, active_locations, LocationName.bleaks_house_region, bleaks_house_region_locations) barboss_barrier_region_locations = { LocationName.barboss_barrier: [0x654, 1], } - barboss_barrier_region = create_region(world, player, active_locations, LocationName.barboss_barrier_region, + barboss_barrier_region = create_region(world, active_locations, LocationName.barboss_barrier_region, barboss_barrier_region_locations) kastle_kaos_region_locations = { LocationName.kastle_kaos: [0x655, 1], } - kastle_kaos_region = create_region(world, player, active_locations, LocationName.kastle_kaos_region, + kastle_kaos_region = create_region(world, active_locations, LocationName.kastle_kaos_region, kastle_kaos_region_locations) knautilus_region_locations = { LocationName.knautilus: [0x656, 1], } - knautilus_region = create_region(world, player, active_locations, LocationName.knautilus_region, + knautilus_region = create_region(world, active_locations, LocationName.knautilus_region, knautilus_region_locations) belchas_burrow_region_locations = { LocationName.belchas_burrow: [0x647, 1], } - belchas_burrow_region = create_region(world, player, active_locations, LocationName.belchas_burrow_region, + belchas_burrow_region = create_region(world, active_locations, LocationName.belchas_burrow_region, belchas_burrow_region_locations) kong_cave_region_locations = { LocationName.kong_cave: [0x645, 1], } - kong_cave_region = create_region(world, player, active_locations, LocationName.kong_cave_region, + kong_cave_region = create_region(world, active_locations, LocationName.kong_cave_region, kong_cave_region_locations) undercover_cove_region_locations = { LocationName.undercover_cove: [0x644, 1], } - undercover_cove_region = create_region(world, player, active_locations, LocationName.undercover_cove_region, + undercover_cove_region = create_region(world, active_locations, LocationName.undercover_cove_region, undercover_cove_region_locations) ks_cache_region_locations = { LocationName.ks_cache: [0x642, 1], } - ks_cache_region = create_region(world, player, active_locations, LocationName.ks_cache_region, + ks_cache_region = create_region(world, active_locations, LocationName.ks_cache_region, ks_cache_region_locations) hill_top_hoard_region_locations = { LocationName.hill_top_hoard: [0x643, 1], } - hill_top_hoard_region = create_region(world, player, active_locations, LocationName.hill_top_hoard_region, + hill_top_hoard_region = create_region(world, active_locations, LocationName.hill_top_hoard_region, hill_top_hoard_region_locations) bounty_beach_region_locations = { LocationName.bounty_beach: [0x646, 1], } - bounty_beach_region = create_region(world, player, active_locations, LocationName.bounty_beach_region, + bounty_beach_region = create_region(world, active_locations, LocationName.bounty_beach_region, bounty_beach_region_locations) smugglers_cove_region_locations = { LocationName.smugglers_cove: [0x648, 1], } - smugglers_cove_region = create_region(world, player, active_locations, LocationName.smugglers_cove_region, + smugglers_cove_region = create_region(world, active_locations, LocationName.smugglers_cove_region, smugglers_cove_region_locations) arichs_hoard_region_locations = { LocationName.arichs_hoard: [0x649, 1], } - arichs_hoard_region = create_region(world, player, active_locations, LocationName.arichs_hoard_region, + arichs_hoard_region = create_region(world, active_locations, LocationName.arichs_hoard_region, arichs_hoard_region_locations) bounty_bay_region_locations = { LocationName.bounty_bay: [0x64A, 1], } - bounty_bay_region = create_region(world, player, active_locations, LocationName.bounty_bay_region, + bounty_bay_region = create_region(world, active_locations, LocationName.bounty_bay_region, bounty_bay_region_locations) sky_high_secret_region_locations = {} - if False:#world.include_trade_sequence[player]: + if False:#world.options.include_trade_sequence: sky_high_secret_region_locations[LocationName.sky_high_secret] = [0x64B, 1] - sky_high_secret_region = create_region(world, player, active_locations, LocationName.sky_high_secret_region, + sky_high_secret_region = create_region(world, active_locations, LocationName.sky_high_secret_region, sky_high_secret_region_locations) glacial_grotto_region_locations = { LocationName.glacial_grotto: [0x64C, 1], } - glacial_grotto_region = create_region(world, player, active_locations, LocationName.glacial_grotto_region, + glacial_grotto_region = create_region(world, active_locations, LocationName.glacial_grotto_region, glacial_grotto_region_locations) cifftop_cache_region_locations = {} - if False:#world.include_trade_sequence[player]: + if False:#world.options.include_trade_sequence: cifftop_cache_region_locations[LocationName.cifftop_cache] = [0x64D, 1] - cifftop_cache_region = create_region(world, player, active_locations, LocationName.cifftop_cache_region, + cifftop_cache_region = create_region(world, active_locations, LocationName.cifftop_cache_region, cifftop_cache_region_locations) sewer_stockpile_region_locations = { LocationName.sewer_stockpile: [0x64E, 1], } - sewer_stockpile_region = create_region(world, player, active_locations, LocationName.sewer_stockpile_region, + sewer_stockpile_region = create_region(world, active_locations, LocationName.sewer_stockpile_region, sewer_stockpile_region_locations) # Set up the regions correctly. - world.regions += [ + world.multiworld.regions += [ menu_region, overworld_1_region, overworld_2_region, @@ -693,7 +694,7 @@ def create_regions(world, player: int, active_locations): blue_region_locations = {} blizzard_region_locations = {} - if False:#world.include_trade_sequence[player]: + if False:#world.options.include_trade_sequence: bazaar_region_locations.update({ LocationName.bazaars_general_store_1: [0x615, 2, True], LocationName.bazaars_general_store_2: [0x615, 3, True], @@ -713,19 +714,19 @@ def create_regions(world, player: int, active_locations): blizzard_region_locations[LocationName.blizzards_basecamp] = [0x625, 4, True] - bazaar_region = create_region(world, player, active_locations, LocationName.bazaar_region, bazaar_region_locations) - bramble_region = create_region(world, player, active_locations, LocationName.bramble_region, + bazaar_region = create_region(world, active_locations, LocationName.bazaar_region, bazaar_region_locations) + bramble_region = create_region(world, active_locations, LocationName.bramble_region, bramble_region_locations) - flower_spot_region = create_region(world, player, active_locations, LocationName.flower_spot_region, + flower_spot_region = create_region(world, active_locations, LocationName.flower_spot_region, flower_spot_region_locations) - barter_region = create_region(world, player, active_locations, LocationName.barter_region, barter_region_locations) - barnacle_region = create_region(world, player, active_locations, LocationName.barnacle_region, + barter_region = create_region(world, active_locations, LocationName.barter_region, barter_region_locations) + barnacle_region = create_region(world, active_locations, LocationName.barnacle_region, barnacle_region_locations) - blue_region = create_region(world, player, active_locations, LocationName.blue_region, blue_region_locations) - blizzard_region = create_region(world, player, active_locations, LocationName.blizzard_region, + blue_region = create_region(world, active_locations, LocationName.blue_region, blue_region_locations) + blizzard_region = create_region(world, active_locations, LocationName.blizzard_region, blizzard_region_locations) - world.regions += [ + world.multiworld.regions += [ bazaar_region, bramble_region, flower_spot_region, @@ -736,41 +737,41 @@ def create_regions(world, player: int, active_locations): ] -def connect_regions(world, player, level_list): +def connect_regions(world: World, level_list): names: typing.Dict[str, int] = {} # Overworld - connect(world, player, names, 'Menu', LocationName.overworld_1_region) - connect(world, player, names, LocationName.overworld_1_region, LocationName.overworld_2_region, - lambda state: (state.has(ItemName.progressive_boat, player, 1))) - connect(world, player, names, LocationName.overworld_2_region, LocationName.overworld_3_region, - lambda state: (state.has(ItemName.progressive_boat, player, 3))) - connect(world, player, names, LocationName.overworld_1_region, LocationName.overworld_4_region, - lambda state: (state.has(ItemName.dk_coin, player, world.dk_coins_for_gyrocopter[player].value) and - state.has(ItemName.progressive_boat, player, 3))) + connect(world, world.player, names, 'Menu', LocationName.overworld_1_region) + connect(world, world.player, names, LocationName.overworld_1_region, LocationName.overworld_2_region, + lambda state: (state.has(ItemName.progressive_boat, world.player, 1))) + connect(world, world.player, names, LocationName.overworld_2_region, LocationName.overworld_3_region, + lambda state: (state.has(ItemName.progressive_boat, world.player, 3))) + connect(world, world.player, names, LocationName.overworld_1_region, LocationName.overworld_4_region, + lambda state: (state.has(ItemName.dk_coin, world.player, world.options.dk_coins_for_gyrocopter.value) and + state.has(ItemName.progressive_boat, world.player, 3))) # World Connections - connect(world, player, names, LocationName.overworld_1_region, LocationName.lake_orangatanga_region) - connect(world, player, names, LocationName.overworld_1_region, LocationName.kremwood_forest_region) - connect(world, player, names, LocationName.overworld_1_region, LocationName.bounty_beach_region) - connect(world, player, names, LocationName.overworld_1_region, LocationName.bazaar_region) + connect(world, world.player, names, LocationName.overworld_1_region, LocationName.lake_orangatanga_region) + connect(world, world.player, names, LocationName.overworld_1_region, LocationName.kremwood_forest_region) + connect(world, world.player, names, LocationName.overworld_1_region, LocationName.bounty_beach_region) + connect(world, world.player, names, LocationName.overworld_1_region, LocationName.bazaar_region) - connect(world, player, names, LocationName.overworld_2_region, LocationName.cotton_top_cove_region) - connect(world, player, names, LocationName.overworld_2_region, LocationName.mekanos_region) - connect(world, player, names, LocationName.overworld_2_region, LocationName.kong_cave_region) - connect(world, player, names, LocationName.overworld_2_region, LocationName.bramble_region) + connect(world, world.player, names, LocationName.overworld_2_region, LocationName.cotton_top_cove_region) + connect(world, world.player, names, LocationName.overworld_2_region, LocationName.mekanos_region) + connect(world, world.player, names, LocationName.overworld_2_region, LocationName.kong_cave_region) + connect(world, world.player, names, LocationName.overworld_2_region, LocationName.bramble_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.k3_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.razor_ridge_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.kaos_kore_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.krematoa_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.undercover_cove_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.flower_spot_region) - connect(world, player, names, LocationName.overworld_3_region, LocationName.barter_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.k3_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.razor_ridge_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.kaos_kore_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.krematoa_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.undercover_cove_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.flower_spot_region) + connect(world, world.player, names, LocationName.overworld_3_region, LocationName.barter_region) - connect(world, player, names, LocationName.overworld_4_region, LocationName.belchas_burrow_region) - connect(world, player, names, LocationName.overworld_4_region, LocationName.ks_cache_region) - connect(world, player, names, LocationName.overworld_4_region, LocationName.hill_top_hoard_region) + connect(world, world.player, names, LocationName.overworld_4_region, LocationName.belchas_burrow_region) + connect(world, world.player, names, LocationName.overworld_4_region, LocationName.ks_cache_region) + connect(world, world.player, names, LocationName.overworld_4_region, LocationName.hill_top_hoard_region) # Lake Orangatanga Connections @@ -786,7 +787,7 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(lake_orangatanga_levels)): - connect(world, player, names, LocationName.lake_orangatanga_region, lake_orangatanga_levels[i]) + connect(world, world.player, names, LocationName.lake_orangatanga_region, lake_orangatanga_levels[i]) # Kremwood Forest Connections kremwood_forest_levels = [ @@ -800,10 +801,10 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(kremwood_forest_levels) - 1): - connect(world, player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[i]) + connect(world, world.player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[i]) - connect(world, player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[-1], - lambda state: (state.can_reach(LocationName.riverside_race_flag, "Location", player))) + connect(world, world.player, names, LocationName.kremwood_forest_region, kremwood_forest_levels[-1], + lambda state: (state.can_reach(LocationName.riverside_race_flag, "Location", world.player))) # Cotton-Top Cove Connections cotton_top_cove_levels = [ @@ -818,7 +819,7 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(cotton_top_cove_levels)): - connect(world, player, names, LocationName.cotton_top_cove_region, cotton_top_cove_levels[i]) + connect(world, world.player, names, LocationName.cotton_top_cove_region, cotton_top_cove_levels[i]) # Mekanos Connections mekanos_levels = [ @@ -831,14 +832,14 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(mekanos_levels)): - connect(world, player, names, LocationName.mekanos_region, mekanos_levels[i]) + connect(world, world.player, names, LocationName.mekanos_region, mekanos_levels[i]) - if False:#world.include_trade_sequence[player]: - connect(world, player, names, LocationName.mekanos_region, LocationName.sky_high_secret_region, - lambda state: (state.has(ItemName.bowling_ball, player, 1))) + if False:#world.options.include_trade_sequence: + connect(world, world.player, names, LocationName.mekanos_region, LocationName.sky_high_secret_region, + lambda state: (state.has(ItemName.bowling_ball, world.player, 1))) else: - connect(world, player, names, LocationName.mekanos_region, LocationName.sky_high_secret_region, - lambda state: (state.can_reach(LocationName.bleaks_house, "Location", player))) + connect(world, world.player, names, LocationName.mekanos_region, LocationName.sky_high_secret_region, + lambda state: (state.can_reach(LocationName.bleaks_house, "Location", world.player))) # K3 Connections k3_levels = [ @@ -853,7 +854,7 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(k3_levels)): - connect(world, player, names, LocationName.k3_region, k3_levels[i]) + connect(world, world.player, names, LocationName.k3_region, k3_levels[i]) # Razor Ridge Connections razor_ridge_levels = [ @@ -866,13 +867,13 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(razor_ridge_levels)): - connect(world, player, names, LocationName.razor_ridge_region, razor_ridge_levels[i]) + connect(world, world.player, names, LocationName.razor_ridge_region, razor_ridge_levels[i]) - if False:#world.include_trade_sequence[player]: - connect(world, player, names, LocationName.razor_ridge_region, LocationName.cifftop_cache_region, - lambda state: (state.has(ItemName.wrench, player, 1))) + if False:#world.options.include_trade_sequence: + connect(world, world.player, names, LocationName.razor_ridge_region, LocationName.cifftop_cache_region, + lambda state: (state.has(ItemName.wrench, world.player, 1))) else: - connect(world, player, names, LocationName.razor_ridge_region, LocationName.cifftop_cache_region) + connect(world, world.player, names, LocationName.razor_ridge_region, LocationName.cifftop_cache_region) # KAOS Kore Connections kaos_kore_levels = [ @@ -885,7 +886,7 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(kaos_kore_levels)): - connect(world, player, names, LocationName.kaos_kore_region, kaos_kore_levels[i]) + connect(world, world.player, names, LocationName.kaos_kore_region, kaos_kore_levels[i]) # Krematoa Connections krematoa_levels = [ @@ -897,22 +898,22 @@ def connect_regions(world, player, level_list): ] for i in range(0, len(krematoa_levels)): - connect(world, player, names, LocationName.krematoa_region, krematoa_levels[i], - lambda state, i=i: (state.has(ItemName.bonus_coin, player, world.krematoa_bonus_coin_cost[player].value * (i+1)))) + connect(world, world.player, names, LocationName.krematoa_region, krematoa_levels[i], + lambda state, i=i: (state.has(ItemName.bonus_coin, world.player, world.options.krematoa_bonus_coin_cost.value * (i+1)))) - if world.goal[player] == "knautilus": - connect(world, player, names, LocationName.kaos_kore_region, LocationName.knautilus_region) - connect(world, player, names, LocationName.krematoa_region, LocationName.kastle_kaos_region, - lambda state: (state.has(ItemName.krematoa_cog, player, 5))) + if world.options.goal == "knautilus": + connect(world, world.player, names, LocationName.kaos_kore_region, LocationName.knautilus_region) + connect(world, world.player, names, LocationName.krematoa_region, LocationName.kastle_kaos_region, + lambda state: (state.has(ItemName.krematoa_cog, world.player, 5))) else: - connect(world, player, names, LocationName.kaos_kore_region, LocationName.kastle_kaos_region) - connect(world, player, names, LocationName.krematoa_region, LocationName.knautilus_region, - lambda state: (state.has(ItemName.krematoa_cog, player, 5))) + connect(world, world.player, names, LocationName.kaos_kore_region, LocationName.kastle_kaos_region) + connect(world, world.player, names, LocationName.krematoa_region, LocationName.knautilus_region, + lambda state: (state.has(ItemName.krematoa_cog, world.player, 5))) -def create_region(world: MultiWorld, player: int, active_locations, name: str, locations=None): +def create_region(world: World, active_locations, name: str, locations=None): # Shamelessly stolen from the ROR2 definition - ret = Region(name, player, world) + ret = Region(name, world.player, world.multiworld) if locations: for locationName, locationData in locations.items(): loc_id = active_locations.get(locationName, 0) @@ -921,16 +922,16 @@ def create_region(world: MultiWorld, player: int, active_locations, name: str, l loc_bit = locationData[1] if (len(locationData) > 1) else 0 loc_invert = locationData[2] if (len(locationData) > 2) else False - location = DKC3Location(player, locationName, loc_id, ret, loc_byte, loc_bit, loc_invert) + location = DKC3Location(world.player, locationName, loc_id, ret, loc_byte, loc_bit, loc_invert) ret.locations.append(location) return ret -def connect(world: MultiWorld, player: int, used_names: typing.Dict[str, int], source: str, target: str, +def connect(world: World, player: int, used_names: typing.Dict[str, int], source: str, target: str, rule: typing.Optional[typing.Callable] = None): - source_region = world.get_region(source, player) - target_region = world.get_region(target, player) + source_region = world.multiworld.get_region(source, player) + target_region = world.multiworld.get_region(target, player) if target not in used_names: used_names[target] = 1 diff --git a/worlds/dkc3/Rom.py b/worlds/dkc3/Rom.py index 4255a0a38280..efe8033d0fa5 100644 --- a/worlds/dkc3/Rom.py +++ b/worlds/dkc3/Rom.py @@ -1,5 +1,6 @@ import Utils from Utils import read_snes_rom +from worlds.AutoWorld import World from worlds.Files import APDeltaPatch from .Locations import lookup_id_to_name, all_locations from .Levels import level_list, level_dict @@ -475,11 +476,10 @@ def read_from_file(self, file): -def patch_rom(world, rom, player, active_level_list): - local_random = world.per_slot_randoms[player] +def patch_rom(world: World, rom: LocalRom, active_level_list): # Boomer Costs - bonus_coin_cost = world.krematoa_bonus_coin_cost[player] + bonus_coin_cost = world.options.krematoa_bonus_coin_cost inverted_bonus_coin_cost = 0x100 - bonus_coin_cost rom.write_byte(0x3498B9, inverted_bonus_coin_cost) rom.write_byte(0x3498BA, inverted_bonus_coin_cost) @@ -491,7 +491,7 @@ def patch_rom(world, rom, player, active_level_list): rom.write_byte(0x349862, bonus_coin_cost) # Gyrocopter Costs - dk_coin_cost = world.dk_coins_for_gyrocopter[player] + dk_coin_cost = world.options.dk_coins_for_gyrocopter rom.write_byte(0x3484A6, dk_coin_cost) rom.write_byte(0x3484D5, dk_coin_cost) rom.write_byte(0x3484D7, 0x90) @@ -508,8 +508,8 @@ def patch_rom(world, rom, player, active_level_list): rom.write_bytes(0x34ACD0, bytearray([0xEA, 0xEA])) # Banana Bird Costs - if world.goal[player] == "banana_bird_hunt": - banana_bird_cost = math.floor(world.number_of_banana_birds[player] * world.percentage_of_banana_birds[player] / 100.0) + if world.options.goal == "banana_bird_hunt": + banana_bird_cost = math.floor(world.options.number_of_banana_birds * world.options.percentage_of_banana_birds / 100.0) rom.write_byte(0x34AB85, banana_bird_cost) rom.write_byte(0x329FD8, banana_bird_cost) rom.write_byte(0x32A025, banana_bird_cost) @@ -528,65 +528,65 @@ def patch_rom(world, rom, player, active_level_list): # Palette Swap rom.write_byte(0x3B96A5, 0xD0) - if world.kong_palette_swap[player] == "default": + if world.options.kong_palette_swap == "default": rom.write_byte(0x3B96A9, 0x00) rom.write_byte(0x3B96A8, 0x00) - elif world.kong_palette_swap[player] == "purple": + elif world.options.kong_palette_swap == "purple": rom.write_byte(0x3B96A9, 0x00) rom.write_byte(0x3B96A8, 0x3C) - elif world.kong_palette_swap[player] == "spooky": + elif world.options.kong_palette_swap == "spooky": rom.write_byte(0x3B96A9, 0x00) rom.write_byte(0x3B96A8, 0xA0) - elif world.kong_palette_swap[player] == "dark": + elif world.options.kong_palette_swap == "dark": rom.write_byte(0x3B96A9, 0x05) rom.write_byte(0x3B96A8, 0xA0) - elif world.kong_palette_swap[player] == "chocolate": + elif world.options.kong_palette_swap == "chocolate": rom.write_byte(0x3B96A9, 0x1D) rom.write_byte(0x3B96A8, 0xA0) - elif world.kong_palette_swap[player] == "shadow": + elif world.options.kong_palette_swap == "shadow": rom.write_byte(0x3B96A9, 0x45) rom.write_byte(0x3B96A8, 0xA0) - elif world.kong_palette_swap[player] == "red_gold": + elif world.options.kong_palette_swap == "red_gold": rom.write_byte(0x3B96A9, 0x5D) rom.write_byte(0x3B96A8, 0xA0) - elif world.kong_palette_swap[player] == "gbc": + elif world.options.kong_palette_swap == "gbc": rom.write_byte(0x3B96A9, 0x20) rom.write_byte(0x3B96A8, 0x3C) - elif world.kong_palette_swap[player] == "halloween": + elif world.options.kong_palette_swap == "halloween": rom.write_byte(0x3B96A9, 0x70) rom.write_byte(0x3B96A8, 0x3C) - if world.music_shuffle[player]: + if world.options.music_shuffle: for address in music_rom_data: - rand_song = local_random.choice(level_music_ids) + rand_song = world.random.choice(level_music_ids) rom.write_byte(address, rand_song) # Starting Lives - rom.write_byte(0x9130, world.starting_life_count[player].value) - rom.write_byte(0x913B, world.starting_life_count[player].value) + rom.write_byte(0x9130, world.options.starting_life_count.value) + rom.write_byte(0x913B, world.options.starting_life_count.value) # Cheat options cheat_bytes = [0x00, 0x00] - if world.merry[player]: + if world.options.merry: cheat_bytes[0] |= 0x01 - if world.autosave[player]: + if world.options.autosave: cheat_bytes[0] |= 0x02 - if world.difficulty[player] == "tufst": + if world.options.difficulty == "tufst": cheat_bytes[0] |= 0x80 cheat_bytes[1] |= 0x80 - elif world.difficulty[player] == "hardr": + elif world.options.difficulty == "hardr": cheat_bytes[0] |= 0x00 cheat_bytes[1] |= 0x00 - elif world.difficulty[player] == "norml": + elif world.options.difficulty == "norml": cheat_bytes[1] |= 0x40 rom.write_bytes(0x8303, bytearray(cheat_bytes)) # Handle Level Shuffle Here - if world.level_shuffle[player]: + if world.options.level_shuffle: for i in range(len(active_level_list)): rom.write_byte(level_dict[level_list[i]].nameIDAddress, level_dict[active_level_list[i]].nameID) rom.write_byte(level_dict[level_list[i]].levelIDAddress, level_dict[active_level_list[i]].levelID) @@ -611,7 +611,7 @@ def patch_rom(world, rom, player, active_level_list): rom.write_byte(0x34C213, (0x32 + level_dict[active_level_list[25]].levelID)) rom.write_byte(0x34C21B, (0x32 + level_dict[active_level_list[26]].levelID)) - if world.goal[player] == "knautilus": + if world.options.goal == "knautilus": # Swap Kastle KAOS and Knautilus rom.write_byte(0x34D4E1, 0xC2) rom.write_byte(0x34D4E2, 0x24) @@ -621,7 +621,7 @@ def patch_rom(world, rom, player, active_level_list): rom.write_byte(0x32F339, 0x55) # Handle KONGsanity Here - if world.kongsanity[player]: + if world.options.kongsanity: # Arich's Hoard KONGsanity fix rom.write_bytes(0x34BA8C, bytearray([0xEA, 0xEA])) @@ -668,7 +668,7 @@ def patch_rom(world, rom, player, active_level_list): rom.write_bytes(0x32A5EE, bytearray([0x00, 0x03, 0x50, 0x4F, 0x52, 0x59, 0x47, 0x4F, 0x4E, 0xC5])) # "PORYGONE" from Utils import __version__ - rom.name = bytearray(f'D3{__version__.replace(".", "")[0:3]}_{player}_{world.seed:11}\0', 'utf8')[:21] + rom.name = bytearray(f'D3{__version__.replace(".", "")[0:3]}_{world.player}_{world.multiworld.seed:11}\0', 'utf8')[:21] rom.name.extend([0] * (21 - len(rom.name))) rom.write_bytes(0x7FC0, rom.name) diff --git a/worlds/dkc3/Rules.py b/worlds/dkc3/Rules.py index dc90eefd1367..cc45e4ef3ad5 100644 --- a/worlds/dkc3/Rules.py +++ b/worlds/dkc3/Rules.py @@ -1,32 +1,31 @@ import math -from BaseClasses import MultiWorld from .Names import LocationName, ItemName -from worlds.AutoWorld import LogicMixin +from worlds.AutoWorld import LogicMixin, World from worlds.generic.Rules import add_rule, set_rule -def set_rules(world: MultiWorld, player: int): +def set_rules(world: World): - if False:#world.include_trade_sequence[player]: - add_rule(world.get_location(LocationName.barnacles_island, player), - lambda state: state.has(ItemName.shell, player)) + if False:#world.options.include_trade_sequence: + add_rule(world.multiworld.get_location(LocationName.barnacles_island, world.player), + lambda state: state.has(ItemName.shell, world.player)) - add_rule(world.get_location(LocationName.blues_beach_hut, player), - lambda state: state.has(ItemName.present, player)) + add_rule(world.multiworld.get_location(LocationName.blues_beach_hut, world.player), + lambda state: state.has(ItemName.present, world.player)) - add_rule(world.get_location(LocationName.brambles_bungalow, player), - lambda state: state.has(ItemName.flower, player)) + add_rule(world.multiworld.get_location(LocationName.brambles_bungalow, world.player), + lambda state: state.has(ItemName.flower, world.player)) - add_rule(world.get_location(LocationName.barters_swap_shop, player), - lambda state: state.has(ItemName.mirror, player)) + add_rule(world.multiworld.get_location(LocationName.barters_swap_shop, world.player), + lambda state: state.has(ItemName.mirror, world.player)) - if world.goal[player] != "knautilus": + if world.options.goal != "knautilus": required_banana_birds = math.floor( - world.number_of_banana_birds[player].value * (world.percentage_of_banana_birds[player].value / 100.0)) + world.options.number_of_banana_birds.value * (world.options.percentage_of_banana_birds.value / 100.0)) - add_rule(world.get_location(LocationName.banana_bird_mother, player), - lambda state: state.has(ItemName.banana_bird, player, required_banana_birds)) + add_rule(world.multiworld.get_location(LocationName.banana_bird_mother, world.player), + lambda state: state.has(ItemName.banana_bird, world.player, required_banana_birds)) - world.completion_condition[player] = lambda state: state.has(ItemName.victory, player) + world.multiworld.completion_condition[world.player] = lambda state: state.has(ItemName.victory, world.player) diff --git a/worlds/dkc3/__init__.py b/worlds/dkc3/__init__.py index 462e1416d9e6..dfb42bd04ca8 100644 --- a/worlds/dkc3/__init__.py +++ b/worlds/dkc3/__init__.py @@ -1,3 +1,4 @@ +import dataclasses import os import typing import math @@ -5,9 +6,10 @@ import settings from BaseClasses import Item, MultiWorld, Tutorial, ItemClassification +from Options import PerGameCommonOptions from .Items import DKC3Item, ItemData, item_table, inventory_table, junk_table from .Locations import DKC3Location, all_locations, setup_locations -from .Options import dkc3_options +from .Options import DKC3Options from .Regions import create_regions, connect_regions from .Levels import level_list from .Rules import set_rules @@ -50,8 +52,11 @@ class DKC3World(World): mystery of why Donkey Kong and Diddy disappeared while on vacation. """ game: str = "Donkey Kong Country 3" - option_definitions = dkc3_options settings: typing.ClassVar[DK3Settings] + + options_dataclass = DKC3Options + options: DKC3Options + topology_present = False data_version = 2 #hint_blacklist = {LocationName.rocket_rush_flag} @@ -74,24 +79,25 @@ def stage_assert_generate(cls, multiworld: MultiWorld): def _get_slot_data(self): return { - #"death_link": self.world.death_link[self.player].value, + #"death_link": self.options.death_link.value, "active_levels": self.active_level_list, } def fill_slot_data(self) -> dict: slot_data = self._get_slot_data() - for option_name in dkc3_options: - option = getattr(self.multiworld, option_name)[self.player] + for option_name in (attr.name for attr in dataclasses.fields(DKC3Options) + if attr not in dataclasses.fields(PerGameCommonOptions)): + option = getattr(self.options, option_name) slot_data[option_name] = option.value return slot_data def create_regions(self): - location_table = setup_locations(self.multiworld, self.player) - create_regions(self.multiworld, self.player, location_table) + location_table = setup_locations(self) + create_regions(self, location_table) # Not generate basic - self.topology_present = self.multiworld.level_shuffle[self.player].value + self.topology_present = self.options.level_shuffle.value itempool: typing.List[DKC3Item] = [] # Levels @@ -103,12 +109,12 @@ def create_regions(self): number_of_cogs = 4 self.multiworld.get_location(LocationName.rocket_rush_flag, self.player).place_locked_item(self.create_item(ItemName.krematoa_cog)) number_of_bosses = 8 - if self.multiworld.goal[self.player] == "knautilus": + if self.options.goal == "knautilus": self.multiworld.get_location(LocationName.kastle_kaos, self.player).place_locked_item(self.create_item(ItemName.victory)) number_of_bosses = 7 else: self.multiworld.get_location(LocationName.banana_bird_mother, self.player).place_locked_item(self.create_item(ItemName.victory)) - number_of_banana_birds = self.multiworld.number_of_banana_birds[self.player] + number_of_banana_birds = self.options.number_of_banana_birds # Bosses total_required_locations += number_of_bosses @@ -116,15 +122,15 @@ def create_regions(self): # Secret Caves total_required_locations += 13 - if self.multiworld.kongsanity[self.player]: + if self.options.kongsanity: total_required_locations += 39 ## Brothers Bear - if False:#self.world.include_trade_sequence[self.player]: + if False:#self.options.include_trade_sequence: total_required_locations += 10 - number_of_bonus_coins = (self.multiworld.krematoa_bonus_coin_cost[self.player] * 5) - number_of_bonus_coins += math.ceil((85 - number_of_bonus_coins) * self.multiworld.percentage_of_extra_bonus_coins[self.player] / 100) + number_of_bonus_coins = (self.options.krematoa_bonus_coin_cost * 5) + number_of_bonus_coins += math.ceil((85 - number_of_bonus_coins) * self.options.percentage_of_extra_bonus_coins / 100) itempool += [self.create_item(ItemName.bonus_coin) for _ in range(number_of_bonus_coins)] itempool += [self.create_item(ItemName.dk_coin) for _ in range(41)] @@ -142,20 +148,17 @@ def create_regions(self): self.active_level_list = level_list.copy() - if self.multiworld.level_shuffle[self.player]: - self.multiworld.random.shuffle(self.active_level_list) + if self.options.level_shuffle: + self.random.shuffle(self.active_level_list) - connect_regions(self.multiworld, self.player, self.active_level_list) + connect_regions(self, self.active_level_list) self.multiworld.itempool += itempool def generate_output(self, output_directory: str): try: - world = self.multiworld - player = self.player - rom = LocalRom(get_base_rom_path()) - patch_rom(self.multiworld, rom, self.player, self.active_level_list) + patch_rom(self, rom, self.active_level_list) self.active_level_list.append(LocationName.rocket_rush_region) @@ -163,15 +166,15 @@ def generate_output(self, output_directory: str): rom.write_to_file(rompath) self.rom_name = rom.name - patch = DKC3DeltaPatch(os.path.splitext(rompath)[0]+DKC3DeltaPatch.patch_file_ending, player=player, - player_name=world.player_name[player], patched_path=rompath) + patch = DKC3DeltaPatch(os.path.splitext(rompath)[0]+DKC3DeltaPatch.patch_file_ending, player=self.player, + player_name=self.multiworld.player_name[self.player], patched_path=rompath) patch.write() except: raise finally: + self.rom_name_available_event.set() # make sure threading continues and errors are collected if os.path.exists(rompath): os.unlink(rompath) - self.rom_name_available_event.set() # make sure threading continues and errors are collected def modify_multidata(self, multidata: dict): import base64 @@ -183,6 +186,7 @@ def modify_multidata(self, multidata: dict): new_name = base64.b64encode(bytes(self.rom_name)).decode() multidata["connect_names"][new_name] = multidata["connect_names"][self.multiworld.player_name[self.player]] + def extend_hint_information(self, hint_data: typing.Dict[int, typing.Dict[int, str]]): if self.topology_present: world_names = [ LocationName.lake_orangatanga_region, @@ -200,7 +204,8 @@ def modify_multidata(self, multidata: dict): level_region = self.multiworld.get_region(self.active_level_list[world_index * 5 + level_index], self.player) for location in level_region.locations: er_hint_data[location.address] = world_names[world_index] - multidata['er_hint_data'][self.player] = er_hint_data + + hint_data[self.player] = er_hint_data def create_item(self, name: str, force_non_progression=False) -> Item: data = item_table[name] @@ -220,4 +225,4 @@ def get_filler_item_name(self) -> str: return self.multiworld.random.choice(list(junk_table.keys())) def set_rules(self): - set_rules(self.multiworld, self.player) + set_rules(self)