TLOZ: update to new options API (#2714)
This commit is contained in:
parent
5b93db121f
commit
6d393fe42b
|
@ -94,17 +94,17 @@ def get_pool_core(world):
|
||||||
# Starting Weapon
|
# Starting Weapon
|
||||||
start_weapon_locations = starting_weapon_locations.copy()
|
start_weapon_locations = starting_weapon_locations.copy()
|
||||||
final_starting_weapons = [weapon for weapon in starting_weapons
|
final_starting_weapons = [weapon for weapon in starting_weapons
|
||||||
if weapon not in world.multiworld.non_local_items[world.player]]
|
if weapon not in world.options.non_local_items]
|
||||||
if not final_starting_weapons:
|
if not final_starting_weapons:
|
||||||
final_starting_weapons = starting_weapons
|
final_starting_weapons = starting_weapons
|
||||||
starting_weapon = random.choice(final_starting_weapons)
|
starting_weapon = random.choice(final_starting_weapons)
|
||||||
if world.multiworld.StartingPosition[world.player] == StartingPosition.option_safe:
|
if world.options.StartingPosition == StartingPosition.option_safe:
|
||||||
placed_items[start_weapon_locations[0]] = starting_weapon
|
placed_items[start_weapon_locations[0]] = starting_weapon
|
||||||
elif world.multiworld.StartingPosition[world.player] in \
|
elif world.options.StartingPosition in \
|
||||||
[StartingPosition.option_unsafe, StartingPosition.option_dangerous]:
|
[StartingPosition.option_unsafe, StartingPosition.option_dangerous]:
|
||||||
if world.multiworld.StartingPosition[world.player] == StartingPosition.option_dangerous:
|
if world.options.StartingPosition == StartingPosition.option_dangerous:
|
||||||
for location in dangerous_weapon_locations:
|
for location in dangerous_weapon_locations:
|
||||||
if world.multiworld.ExpandedPool[world.player] or "Drop" not in location:
|
if world.options.ExpandedPool or "Drop" not in location:
|
||||||
start_weapon_locations.append(location)
|
start_weapon_locations.append(location)
|
||||||
placed_items[random.choice(start_weapon_locations)] = starting_weapon
|
placed_items[random.choice(start_weapon_locations)] = starting_weapon
|
||||||
else:
|
else:
|
||||||
|
@ -115,7 +115,7 @@ def get_pool_core(world):
|
||||||
|
|
||||||
# Triforce Fragments
|
# Triforce Fragments
|
||||||
fragment = "Triforce Fragment"
|
fragment = "Triforce Fragment"
|
||||||
if world.multiworld.ExpandedPool[world.player]:
|
if world.options.ExpandedPool:
|
||||||
possible_level_locations = [location for location in all_level_locations
|
possible_level_locations = [location for location in all_level_locations
|
||||||
if location not in level_locations[8]]
|
if location not in level_locations[8]]
|
||||||
else:
|
else:
|
||||||
|
@ -125,15 +125,15 @@ def get_pool_core(world):
|
||||||
if location in possible_level_locations:
|
if location in possible_level_locations:
|
||||||
possible_level_locations.remove(location)
|
possible_level_locations.remove(location)
|
||||||
for level in range(1, 9):
|
for level in range(1, 9):
|
||||||
if world.multiworld.TriforceLocations[world.player] == TriforceLocations.option_vanilla:
|
if world.options.TriforceLocations == TriforceLocations.option_vanilla:
|
||||||
placed_items[f"Level {level} Triforce"] = fragment
|
placed_items[f"Level {level} Triforce"] = fragment
|
||||||
elif world.multiworld.TriforceLocations[world.player] == TriforceLocations.option_dungeons:
|
elif world.options.TriforceLocations == TriforceLocations.option_dungeons:
|
||||||
placed_items[possible_level_locations.pop(random.randint(0, len(possible_level_locations) - 1))] = fragment
|
placed_items[possible_level_locations.pop(random.randint(0, len(possible_level_locations) - 1))] = fragment
|
||||||
else:
|
else:
|
||||||
pool.append(fragment)
|
pool.append(fragment)
|
||||||
|
|
||||||
# Level 9 junk fill
|
# Level 9 junk fill
|
||||||
if world.multiworld.ExpandedPool[world.player] > 0:
|
if world.options.ExpandedPool > 0:
|
||||||
spots = random.sample(level_locations[8], len(level_locations[8]) // 2)
|
spots = random.sample(level_locations[8], len(level_locations[8]) // 2)
|
||||||
for spot in spots:
|
for spot in spots:
|
||||||
junk = random.choice(list(minor_items.keys()))
|
junk = random.choice(list(minor_items.keys()))
|
||||||
|
@ -142,7 +142,7 @@ def get_pool_core(world):
|
||||||
|
|
||||||
# Finish Pool
|
# Finish Pool
|
||||||
final_pool = basic_pool
|
final_pool = basic_pool
|
||||||
if world.multiworld.ExpandedPool[world.player]:
|
if world.options.ExpandedPool:
|
||||||
final_pool = {
|
final_pool = {
|
||||||
item: basic_pool.get(item, 0) + minor_items.get(item, 0) + take_any_items.get(item, 0)
|
item: basic_pool.get(item, 0) + minor_items.get(item, 0) + take_any_items.get(item, 0)
|
||||||
for item in set(basic_pool) | set(minor_items) | set(take_any_items)
|
for item in set(basic_pool) | set(minor_items) | set(take_any_items)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import typing
|
import typing
|
||||||
from Options import Option, DefaultOnToggle, Choice
|
from dataclasses import dataclass
|
||||||
|
from Options import Option, DefaultOnToggle, Choice, PerGameCommonOptions
|
||||||
|
|
||||||
|
|
||||||
class ExpandedPool(DefaultOnToggle):
|
class ExpandedPool(DefaultOnToggle):
|
||||||
|
@ -32,9 +33,8 @@ class StartingPosition(Choice):
|
||||||
option_dangerous = 2
|
option_dangerous = 2
|
||||||
option_very_dangerous = 3
|
option_very_dangerous = 3
|
||||||
|
|
||||||
|
@dataclass
|
||||||
tloz_options: typing.Dict[str, type(Option)] = {
|
class TlozOptions(PerGameCommonOptions):
|
||||||
"ExpandedPool": ExpandedPool,
|
ExpandedPool: ExpandedPool
|
||||||
"TriforceLocations": TriforceLocations,
|
TriforceLocations: TriforceLocations
|
||||||
"StartingPosition": StartingPosition
|
StartingPosition: StartingPosition
|
||||||
}
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ if TYPE_CHECKING:
|
||||||
def set_rules(tloz_world: "TLoZWorld"):
|
def set_rules(tloz_world: "TLoZWorld"):
|
||||||
player = tloz_world.player
|
player = tloz_world.player
|
||||||
world = tloz_world.multiworld
|
world = tloz_world.multiworld
|
||||||
|
options = tloz_world.options
|
||||||
|
|
||||||
# Boss events for a nicer spoiler log play through
|
# Boss events for a nicer spoiler log play through
|
||||||
for level in range(1, 9):
|
for level in range(1, 9):
|
||||||
|
@ -23,7 +24,7 @@ def set_rules(tloz_world: "TLoZWorld"):
|
||||||
# No dungeons without weapons except for the dangerous weapon locations if we're dangerous, no unsafe dungeons
|
# No dungeons without weapons except for the dangerous weapon locations if we're dangerous, no unsafe dungeons
|
||||||
for i, level in enumerate(tloz_world.levels[1:10]):
|
for i, level in enumerate(tloz_world.levels[1:10]):
|
||||||
for location in level.locations:
|
for location in level.locations:
|
||||||
if world.StartingPosition[player] < StartingPosition.option_dangerous \
|
if options.StartingPosition < StartingPosition.option_dangerous \
|
||||||
or location.name not in dangerous_weapon_locations:
|
or location.name not in dangerous_weapon_locations:
|
||||||
add_rule(world.get_location(location.name, player),
|
add_rule(world.get_location(location.name, player),
|
||||||
lambda state: state.has_group("weapons", player))
|
lambda state: state.has_group("weapons", player))
|
||||||
|
@ -66,7 +67,7 @@ def set_rules(tloz_world: "TLoZWorld"):
|
||||||
lambda state: state.has("Recorder", player))
|
lambda state: state.has("Recorder", player))
|
||||||
add_rule(world.get_location("Level 7 Boss", player),
|
add_rule(world.get_location("Level 7 Boss", player),
|
||||||
lambda state: state.has("Recorder", player))
|
lambda state: state.has("Recorder", player))
|
||||||
if world.ExpandedPool[player]:
|
if options.ExpandedPool:
|
||||||
add_rule(world.get_location("Level 7 Key Drop (Stalfos)", player),
|
add_rule(world.get_location("Level 7 Key Drop (Stalfos)", player),
|
||||||
lambda state: state.has("Recorder", player))
|
lambda state: state.has("Recorder", player))
|
||||||
add_rule(world.get_location("Level 7 Bomb Drop (Digdogger)", player),
|
add_rule(world.get_location("Level 7 Bomb Drop (Digdogger)", player),
|
||||||
|
@ -75,13 +76,13 @@ def set_rules(tloz_world: "TLoZWorld"):
|
||||||
lambda state: state.has("Recorder", player))
|
lambda state: state.has("Recorder", player))
|
||||||
|
|
||||||
for location in food_locations:
|
for location in food_locations:
|
||||||
if world.ExpandedPool[player] or "Drop" not in location:
|
if options.ExpandedPool or "Drop" not in location:
|
||||||
add_rule(world.get_location(location, player),
|
add_rule(world.get_location(location, player),
|
||||||
lambda state: state.has("Food", player))
|
lambda state: state.has("Food", player))
|
||||||
|
|
||||||
add_rule(world.get_location("Level 8 Item (Magical Key)", player),
|
add_rule(world.get_location("Level 8 Item (Magical Key)", player),
|
||||||
lambda state: state.has("Bow", player) and state.has_group("arrows", player))
|
lambda state: state.has("Bow", player) and state.has_group("arrows", player))
|
||||||
if world.ExpandedPool[player]:
|
if options.ExpandedPool:
|
||||||
add_rule(world.get_location("Level 8 Bomb Drop (Darknuts North)", player),
|
add_rule(world.get_location("Level 8 Bomb Drop (Darknuts North)", player),
|
||||||
lambda state: state.has("Bow", player) and state.has_group("arrows", player))
|
lambda state: state.has("Bow", player) and state.has_group("arrows", player))
|
||||||
|
|
||||||
|
@ -106,13 +107,13 @@ def set_rules(tloz_world: "TLoZWorld"):
|
||||||
for location in stepladder_locations:
|
for location in stepladder_locations:
|
||||||
add_rule(world.get_location(location, player),
|
add_rule(world.get_location(location, player),
|
||||||
lambda state: state.has("Stepladder", player))
|
lambda state: state.has("Stepladder", player))
|
||||||
if world.ExpandedPool[player]:
|
if options.ExpandedPool:
|
||||||
for location in stepladder_locations_expanded:
|
for location in stepladder_locations_expanded:
|
||||||
add_rule(world.get_location(location, player),
|
add_rule(world.get_location(location, player),
|
||||||
lambda state: state.has("Stepladder", player))
|
lambda state: state.has("Stepladder", player))
|
||||||
|
|
||||||
# Don't allow Take Any Items until we can actually get in one
|
# Don't allow Take Any Items until we can actually get in one
|
||||||
if world.ExpandedPool[player]:
|
if options.ExpandedPool:
|
||||||
add_rule(world.get_location("Take Any Item Left", player),
|
add_rule(world.get_location("Take Any Item Left", player),
|
||||||
lambda state: state.has_group("candles", player) or
|
lambda state: state.has_group("candles", player) or
|
||||||
state.has("Raft", player))
|
state.has("Raft", player))
|
||||||
|
|
|
@ -13,7 +13,7 @@ from .ItemPool import generate_itempool, starting_weapons, dangerous_weapon_loca
|
||||||
from .Items import item_table, item_prices, item_game_ids
|
from .Items import item_table, item_prices, item_game_ids
|
||||||
from .Locations import location_table, level_locations, major_locations, shop_locations, all_level_locations, \
|
from .Locations import location_table, level_locations, major_locations, shop_locations, all_level_locations, \
|
||||||
standard_level_locations, shop_price_location_ids, secret_money_ids, location_ids, food_locations
|
standard_level_locations, shop_price_location_ids, secret_money_ids, location_ids, food_locations
|
||||||
from .Options import tloz_options
|
from .Options import TlozOptions
|
||||||
from .Rom import TLoZDeltaPatch, get_base_rom_path, first_quest_dungeon_items_early, first_quest_dungeon_items_late
|
from .Rom import TLoZDeltaPatch, get_base_rom_path, first_quest_dungeon_items_early, first_quest_dungeon_items_late
|
||||||
from .Rules import set_rules
|
from .Rules import set_rules
|
||||||
from worlds.AutoWorld import World, WebWorld
|
from worlds.AutoWorld import World, WebWorld
|
||||||
|
@ -63,7 +63,8 @@ class TLoZWorld(World):
|
||||||
This randomizer shuffles all the items in the game around, leading to a new adventure
|
This randomizer shuffles all the items in the game around, leading to a new adventure
|
||||||
every time.
|
every time.
|
||||||
"""
|
"""
|
||||||
option_definitions = tloz_options
|
options_dataclass = TlozOptions
|
||||||
|
options = TlozOptions
|
||||||
settings: typing.ClassVar[TLoZSettings]
|
settings: typing.ClassVar[TLoZSettings]
|
||||||
game = "The Legend of Zelda"
|
game = "The Legend of Zelda"
|
||||||
topology_present = False
|
topology_present = False
|
||||||
|
@ -132,7 +133,7 @@ class TLoZWorld(World):
|
||||||
|
|
||||||
for i, level in enumerate(level_locations):
|
for i, level in enumerate(level_locations):
|
||||||
for location in level:
|
for location in level:
|
||||||
if self.multiworld.ExpandedPool[self.player] or "Drop" not in location:
|
if self.options.ExpandedPool or "Drop" not in location:
|
||||||
self.levels[i + 1].locations.append(
|
self.levels[i + 1].locations.append(
|
||||||
self.create_location(location, self.location_name_to_id[location], self.levels[i + 1]))
|
self.create_location(location, self.location_name_to_id[location], self.levels[i + 1]))
|
||||||
|
|
||||||
|
@ -144,7 +145,7 @@ class TLoZWorld(World):
|
||||||
self.levels[level].locations.append(boss_event)
|
self.levels[level].locations.append(boss_event)
|
||||||
|
|
||||||
for location in major_locations:
|
for location in major_locations:
|
||||||
if self.multiworld.ExpandedPool[self.player] or "Take Any" not in location:
|
if self.options.ExpandedPool or "Take Any" not in location:
|
||||||
overworld.locations.append(
|
overworld.locations.append(
|
||||||
self.create_location(location, self.location_name_to_id[location], overworld))
|
self.create_location(location, self.location_name_to_id[location], overworld))
|
||||||
|
|
||||||
|
@ -311,7 +312,7 @@ class TLoZWorld(World):
|
||||||
return self.multiworld.random.choice(self.filler_items)
|
return self.multiworld.random.choice(self.filler_items)
|
||||||
|
|
||||||
def fill_slot_data(self) -> Dict[str, Any]:
|
def fill_slot_data(self) -> Dict[str, Any]:
|
||||||
if self.multiworld.ExpandedPool[self.player]:
|
if self.options.ExpandedPool:
|
||||||
take_any_left = self.multiworld.get_location("Take Any Item Left", self.player).item
|
take_any_left = self.multiworld.get_location("Take Any Item Left", self.player).item
|
||||||
take_any_middle = self.multiworld.get_location("Take Any Item Middle", self.player).item
|
take_any_middle = self.multiworld.get_location("Take Any Item Middle", self.player).item
|
||||||
take_any_right = self.multiworld.get_location("Take Any Item Right", self.player).item
|
take_any_right = self.multiworld.get_location("Take Any Item Right", self.player).item
|
||||||
|
|
Loading…
Reference in New Issue