Hylics 2: Update to new options API (#3147)
This commit is contained in:
parent
5996a8163d
commit
c3060a8b66
|
@ -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
|
||||
}
|
||||
@dataclass
|
||||
class Hylics2Options(PerGameCommonOptions):
|
||||
party_shuffle: PartyShuffle
|
||||
gesture_shuffle: GestureShuffle
|
||||
medallion_shuffle: MedallionShuffle
|
||||
random_start: RandomStart
|
||||
extra_items_in_logic: ExtraLogic
|
||||
death_link: Hylics2DeathLink
|
|
@ -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:
|
||||
|
|
|
@ -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"]]))
|
||||
|
|
Loading…
Reference in New Issue