diff --git a/worlds/hylics2/Options.py b/worlds/hylics2/Options.py index ac57e666..85cf36b1 100644 --- a/worlds/hylics2/Options.py +++ b/worlds/hylics2/Options.py @@ -1,4 +1,5 @@ -from Options import Choice, Toggle, DefaultOnToggle, DeathLink +from dataclasses import dataclass +from Options import Choice, Toggle, DefaultOnToggle, DeathLink, PerGameCommonOptions class PartyShuffle(Toggle): """Shuffles party members into the pool. @@ -31,11 +32,11 @@ class Hylics2DeathLink(DeathLink): Note that this also includes death by using the PERISH gesture. Can be toggled via in-game console command "/deathlink".""" -hylics2_options = { - "party_shuffle": PartyShuffle, - "gesture_shuffle" : GestureShuffle, - "medallion_shuffle" : MedallionShuffle, - "random_start" : RandomStart, - "extra_items_in_logic": ExtraLogic, - "death_link": Hylics2DeathLink -} \ No newline at end of file +@dataclass +class Hylics2Options(PerGameCommonOptions): + party_shuffle: PartyShuffle + gesture_shuffle: GestureShuffle + medallion_shuffle: MedallionShuffle + random_start: RandomStart + extra_items_in_logic: ExtraLogic + death_link: Hylics2DeathLink \ No newline at end of file diff --git a/worlds/hylics2/Rules.py b/worlds/hylics2/Rules.py index 5fd46719..2ecd1490 100644 --- a/worlds/hylics2/Rules.py +++ b/worlds/hylics2/Rules.py @@ -129,6 +129,12 @@ def set_rules(hylics2world): world = hylics2world.multiworld player = hylics2world.player + extra = hylics2world.options.extra_items_in_logic + party = hylics2world.options.party_shuffle + medallion = hylics2world.options.medallion_shuffle + random_start = hylics2world.options.random_start + start_location = hylics2world.start_location + # Afterlife add_rule(world.get_location("Afterlife: TV", player), lambda state: cave_key(state, player)) @@ -346,7 +352,7 @@ def set_rules(hylics2world): lambda state: upper_chamber_key(state, player)) # extra rules if Extra Items in Logic is enabled - if world.extra_items_in_logic[player]: + if extra: for i in world.get_region("Foglast", player).entrances: add_rule(i, lambda state: charge_up(state, player)) for i in world.get_region("Sage Airship", player).entrances: @@ -368,7 +374,7 @@ def set_rules(hylics2world): )) # extra rules if Shuffle Party Members is enabled - if world.party_shuffle[player]: + if party: for i in world.get_region("Arcade Island", player).entrances: add_rule(i, lambda state: party_3(state, player)) for i in world.get_region("Foglast", player).entrances: @@ -406,7 +412,7 @@ def set_rules(hylics2world): lambda state: party_3(state, player)) # extra rules if Shuffle Red Medallions is enabled - if world.medallion_shuffle[player]: + if medallion: add_rule(world.get_location("New Muldul: Upper House Medallion", player), lambda state: upper_house_key(state, player)) add_rule(world.get_location("New Muldul: Vault Rear Left Medallion", player), @@ -461,7 +467,7 @@ def set_rules(hylics2world): lambda state: upper_chamber_key(state, player)) # extra rules if Shuffle Red Medallions and Party Shuffle are enabled - if world.party_shuffle[player] and world.medallion_shuffle[player]: + if party and medallion: add_rule(world.get_location("New Muldul: Vault Rear Left Medallion", player), lambda state: party_3(state, player)) add_rule(world.get_location("New Muldul: Vault Rear Right Medallion", player), @@ -493,8 +499,7 @@ def set_rules(hylics2world): add_rule(i, lambda state: enter_hylemxylem(state, player)) # random start logic (default) - if ((not world.random_start[player]) or \ - (world.random_start[player] and hylics2world.start_location == "Waynehouse")): + if not random_start or random_start and start_location == "Waynehouse": # entrances for i in world.get_region("Viewax", player).entrances: add_rule(i, lambda state: ( @@ -509,7 +514,7 @@ def set_rules(hylics2world): add_rule(i, lambda state: airship(state, player)) # random start logic (Viewax's Edifice) - elif (world.random_start[player] and hylics2world.start_location == "Viewax's Edifice"): + elif random_start and start_location == "Viewax's Edifice": for i in world.get_region("Waynehouse", player).entrances: add_rule(i, lambda state: ( air_dash(state, player) @@ -540,7 +545,7 @@ def set_rules(hylics2world): add_rule(i, lambda state: airship(state, player)) # random start logic (TV Island) - elif (world.random_start[player] and hylics2world.start_location == "TV Island"): + elif random_start and start_location == "TV Island": for i in world.get_region("Waynehouse", player).entrances: add_rule(i, lambda state: airship(state, player)) for i in world.get_region("New Muldul", player).entrances: @@ -559,7 +564,7 @@ def set_rules(hylics2world): add_rule(i, lambda state: airship(state, player)) # random start logic (Shield Facility) - elif (world.random_start[player] and hylics2world.start_location == "Shield Facility"): + elif random_start and start_location == "Shield Facility": for i in world.get_region("Waynehouse", player).entrances: add_rule(i, lambda state: airship(state, player)) for i in world.get_region("New Muldul", player).entrances: diff --git a/worlds/hylics2/__init__.py b/worlds/hylics2/__init__.py index cb7ae449..93ec43f8 100644 --- a/worlds/hylics2/__init__.py +++ b/worlds/hylics2/__init__.py @@ -1,7 +1,8 @@ from typing import Dict, List, Any from BaseClasses import Region, Entrance, Location, Item, Tutorial, ItemClassification from worlds.generic.Rules import set_rule -from . import Exits, Items, Locations, Options, Rules +from . import Exits, Items, Locations, Rules +from .Options import Hylics2Options from worlds.AutoWorld import WebWorld, World @@ -32,7 +33,9 @@ class Hylics2World(World): item_name_to_id = {data["name"]: item_id for item_id, data in all_items.items()} location_name_to_id = {data["name"]: loc_id for loc_id, data in all_locations.items()} - option_definitions = Options.hylics2_options + + options_dataclass = Hylics2Options + options: Hylics2Options data_version = 3 @@ -55,7 +58,7 @@ class Hylics2World(World): # set random starting location if option is enabled def generate_early(self): - if self.multiworld.random_start[self.player]: + if self.options.random_start: i = self.random.randint(0, 3) if i == 0: self.start_location = "Waynehouse" @@ -77,17 +80,17 @@ class Hylics2World(World): pool.append(self.create_item(item["name"])) # add party members if option is enabled - if self.multiworld.party_shuffle[self.player]: + if self.options.party_shuffle: for item in Items.party_item_table.values(): pool.append(self.create_item(item["name"])) # handle gesture shuffle - if not self.multiworld.gesture_shuffle[self.player]: # add gestures to pool like normal + if not self.options.gesture_shuffle: # add gestures to pool like normal for item in Items.gesture_item_table.values(): pool.append(self.create_item(item["name"])) # add '10 Bones' items if medallion shuffle is enabled - if self.multiworld.medallion_shuffle[self.player]: + if self.options.medallion_shuffle: for item in Items.medallion_item_table.values(): for _ in range(item["count"]): pool.append(self.create_item(item["name"])) @@ -98,7 +101,7 @@ class Hylics2World(World): def pre_fill(self): # handle gesture shuffle options - if self.multiworld.gesture_shuffle[self.player] == 2: # vanilla locations + if self.options.gesture_shuffle == 2: # vanilla locations gestures = Items.gesture_item_table self.multiworld.get_location("Waynehouse: TV", self.player)\ .place_locked_item(self.create_item("POROMER BLEB")) @@ -119,13 +122,13 @@ class Hylics2World(World): self.multiworld.get_location("Sage Airship: TV", self.player)\ .place_locked_item(self.create_item("BOMBO - GENESIS")) - elif self.multiworld.gesture_shuffle[self.player] == 1: # TVs only + elif self.options.gesture_shuffle == 1: # TVs only gestures = [gesture["name"] for gesture in Items.gesture_item_table.values()] tvs = [tv["name"] for tv in Locations.tv_location_table.values()] # if Extra Items in Logic is enabled place CHARGE UP first and make sure it doesn't get # placed at Sage Airship: TV or Foglast: TV - if self.multiworld.extra_items_in_logic[self.player]: + if self.options.extra_items_in_logic: tv = self.random.choice(tvs) while tv == "Sage Airship: TV" or tv == "Foglast: TV": tv = self.random.choice(tvs) @@ -144,11 +147,11 @@ class Hylics2World(World): def fill_slot_data(self) -> Dict[str, Any]: slot_data: Dict[str, Any] = { - "party_shuffle": self.multiworld.party_shuffle[self.player].value, - "medallion_shuffle": self.multiworld.medallion_shuffle[self.player].value, - "random_start" : self.multiworld.random_start[self.player].value, + "party_shuffle": self.options.party_shuffle.value, + "medallion_shuffle": self.options.medallion_shuffle.value, + "random_start" : self.options.random_start.value, "start_location" : self.start_location, - "death_link": self.multiworld.death_link[self.player].value + "death_link": self.options.death_link.value } return slot_data @@ -186,7 +189,7 @@ class Hylics2World(World): # create entrance and connect it to parent and destination regions ent = Entrance(self.player, f"{reg.name} {k}", reg) reg.exits.append(ent) - if k == "New Game" and self.multiworld.random_start[self.player]: + if k == "New Game" and self.options.random_start: if self.start_location == "Waynehouse": ent.connect(region_table[2]) elif self.start_location == "Viewax's Edifice": @@ -209,13 +212,13 @@ class Hylics2World(World): .append(Hylics2Location(self.player, data["name"], i, region_table[data["region"]])) # add party member locations if option is enabled - if self.multiworld.party_shuffle[self.player]: + if self.options.party_shuffle: for i, data in Locations.party_location_table.items(): region_table[data["region"]].locations\ .append(Hylics2Location(self.player, data["name"], i, region_table[data["region"]])) # add medallion locations if option is enabled - if self.multiworld.medallion_shuffle[self.player]: + if self.options.medallion_shuffle: for i, data in Locations.medallion_location_table.items(): region_table[data["region"]].locations\ .append(Hylics2Location(self.player, data["name"], i, region_table[data["region"]]))