Clique: Update to new options API (#3759)
This commit is contained in:
parent
8e06ab4f68
commit
68a92b0c6f
|
@ -1,6 +1,9 @@
|
||||||
from typing import Callable, Dict, NamedTuple, Optional
|
from typing import Callable, Dict, NamedTuple, Optional, TYPE_CHECKING
|
||||||
|
|
||||||
from BaseClasses import Item, ItemClassification, MultiWorld
|
from BaseClasses import Item, ItemClassification
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from . import CliqueWorld
|
||||||
|
|
||||||
|
|
||||||
class CliqueItem(Item):
|
class CliqueItem(Item):
|
||||||
|
@ -10,7 +13,7 @@ class CliqueItem(Item):
|
||||||
class CliqueItemData(NamedTuple):
|
class CliqueItemData(NamedTuple):
|
||||||
code: Optional[int] = None
|
code: Optional[int] = None
|
||||||
type: ItemClassification = ItemClassification.filler
|
type: ItemClassification = ItemClassification.filler
|
||||||
can_create: Callable[[MultiWorld, int], bool] = lambda multiworld, player: True
|
can_create: Callable[["CliqueWorld"], bool] = lambda world: True
|
||||||
|
|
||||||
|
|
||||||
item_data_table: Dict[str, CliqueItemData] = {
|
item_data_table: Dict[str, CliqueItemData] = {
|
||||||
|
@ -21,11 +24,11 @@ item_data_table: Dict[str, CliqueItemData] = {
|
||||||
"Button Activation": CliqueItemData(
|
"Button Activation": CliqueItemData(
|
||||||
code=69696968,
|
code=69696968,
|
||||||
type=ItemClassification.progression,
|
type=ItemClassification.progression,
|
||||||
can_create=lambda multiworld, player: bool(getattr(multiworld, "hard_mode")[player]),
|
can_create=lambda world: world.options.hard_mode,
|
||||||
),
|
),
|
||||||
"A Cool Filler Item (No Satisfaction Guaranteed)": CliqueItemData(
|
"A Cool Filler Item (No Satisfaction Guaranteed)": CliqueItemData(
|
||||||
code=69696967,
|
code=69696967,
|
||||||
can_create=lambda multiworld, player: False # Only created from `get_filler_item_name`.
|
can_create=lambda world: False # Only created from `get_filler_item_name`.
|
||||||
),
|
),
|
||||||
"The Urge to Push": CliqueItemData(
|
"The Urge to Push": CliqueItemData(
|
||||||
type=ItemClassification.progression,
|
type=ItemClassification.progression,
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
from typing import Callable, Dict, NamedTuple, Optional
|
from typing import Callable, Dict, NamedTuple, Optional, TYPE_CHECKING
|
||||||
|
|
||||||
from BaseClasses import Location, MultiWorld
|
from BaseClasses import Location
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from . import CliqueWorld
|
||||||
|
|
||||||
|
|
||||||
class CliqueLocation(Location):
|
class CliqueLocation(Location):
|
||||||
|
@ -10,7 +13,7 @@ class CliqueLocation(Location):
|
||||||
class CliqueLocationData(NamedTuple):
|
class CliqueLocationData(NamedTuple):
|
||||||
region: str
|
region: str
|
||||||
address: Optional[int] = None
|
address: Optional[int] = None
|
||||||
can_create: Callable[[MultiWorld, int], bool] = lambda multiworld, player: True
|
can_create: Callable[["CliqueWorld"], bool] = lambda world: True
|
||||||
locked_item: Optional[str] = None
|
locked_item: Optional[str] = None
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,7 +25,7 @@ location_data_table: Dict[str, CliqueLocationData] = {
|
||||||
"The Item on the Desk": CliqueLocationData(
|
"The Item on the Desk": CliqueLocationData(
|
||||||
region="The Button Realm",
|
region="The Button Realm",
|
||||||
address=69696968,
|
address=69696968,
|
||||||
can_create=lambda multiworld, player: bool(getattr(multiworld, "hard_mode")[player]),
|
can_create=lambda world: world.options.hard_mode,
|
||||||
),
|
),
|
||||||
"In the Player's Mind": CliqueLocationData(
|
"In the Player's Mind": CliqueLocationData(
|
||||||
region="The Button Realm",
|
region="The Button Realm",
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
from typing import Dict
|
from dataclasses import dataclass
|
||||||
|
from Options import Choice, Toggle, PerGameCommonOptions, StartInventoryPool
|
||||||
from Options import Choice, Option, Toggle
|
|
||||||
|
|
||||||
|
|
||||||
class HardMode(Toggle):
|
class HardMode(Toggle):
|
||||||
|
@ -25,10 +24,11 @@ class ButtonColor(Choice):
|
||||||
option_black = 11
|
option_black = 11
|
||||||
|
|
||||||
|
|
||||||
clique_options: Dict[str, type(Option)] = {
|
@dataclass
|
||||||
"color": ButtonColor,
|
class CliqueOptions(PerGameCommonOptions):
|
||||||
"hard_mode": HardMode,
|
color: ButtonColor
|
||||||
|
hard_mode: HardMode
|
||||||
|
start_inventory_from_pool: StartInventoryPool
|
||||||
|
|
||||||
# DeathLink is always on. Always.
|
# DeathLink is always on. Always.
|
||||||
# "death_link": DeathLink,
|
# death_link: DeathLink
|
||||||
}
|
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
from typing import Callable
|
from typing import Callable, TYPE_CHECKING
|
||||||
|
|
||||||
from BaseClasses import CollectionState, MultiWorld
|
from BaseClasses import CollectionState
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from . import CliqueWorld
|
||||||
|
|
||||||
|
|
||||||
def get_button_rule(multiworld: MultiWorld, player: int) -> Callable[[CollectionState], bool]:
|
def get_button_rule(world: "CliqueWorld") -> Callable[[CollectionState], bool]:
|
||||||
if getattr(multiworld, "hard_mode")[player]:
|
if world.options.hard_mode:
|
||||||
return lambda state: state.has("Button Activation", player)
|
return lambda state: state.has("Button Activation", world.player)
|
||||||
|
|
||||||
return lambda state: True
|
return lambda state: True
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
from typing import List
|
from typing import List, Dict, Any
|
||||||
|
|
||||||
from BaseClasses import Region, Tutorial
|
from BaseClasses import Region, Tutorial
|
||||||
from worlds.AutoWorld import WebWorld, World
|
from worlds.AutoWorld import WebWorld, World
|
||||||
from .Items import CliqueItem, item_data_table, item_table
|
from .Items import CliqueItem, item_data_table, item_table
|
||||||
from .Locations import CliqueLocation, location_data_table, location_table, locked_locations
|
from .Locations import CliqueLocation, location_data_table, location_table, locked_locations
|
||||||
from .Options import clique_options
|
from .Options import CliqueOptions
|
||||||
from .Regions import region_data_table
|
from .Regions import region_data_table
|
||||||
from .Rules import get_button_rule
|
from .Rules import get_button_rule
|
||||||
|
|
||||||
|
@ -38,7 +38,8 @@ class CliqueWorld(World):
|
||||||
|
|
||||||
game = "Clique"
|
game = "Clique"
|
||||||
web = CliqueWebWorld()
|
web = CliqueWebWorld()
|
||||||
option_definitions = clique_options
|
options: CliqueOptions
|
||||||
|
options_dataclass = CliqueOptions
|
||||||
location_name_to_id = location_table
|
location_name_to_id = location_table
|
||||||
item_name_to_id = item_table
|
item_name_to_id = item_table
|
||||||
|
|
||||||
|
@ -48,7 +49,7 @@ class CliqueWorld(World):
|
||||||
def create_items(self) -> None:
|
def create_items(self) -> None:
|
||||||
item_pool: List[CliqueItem] = []
|
item_pool: List[CliqueItem] = []
|
||||||
for name, item in item_data_table.items():
|
for name, item in item_data_table.items():
|
||||||
if item.code and item.can_create(self.multiworld, self.player):
|
if item.code and item.can_create(self):
|
||||||
item_pool.append(self.create_item(name))
|
item_pool.append(self.create_item(name))
|
||||||
|
|
||||||
self.multiworld.itempool += item_pool
|
self.multiworld.itempool += item_pool
|
||||||
|
@ -61,41 +62,40 @@ class CliqueWorld(World):
|
||||||
|
|
||||||
# Create locations.
|
# Create locations.
|
||||||
for region_name, region_data in region_data_table.items():
|
for region_name, region_data in region_data_table.items():
|
||||||
region = self.multiworld.get_region(region_name, self.player)
|
region = self.get_region(region_name)
|
||||||
region.add_locations({
|
region.add_locations({
|
||||||
location_name: location_data.address for location_name, location_data in location_data_table.items()
|
location_name: location_data.address for location_name, location_data in location_data_table.items()
|
||||||
if location_data.region == region_name and location_data.can_create(self.multiworld, self.player)
|
if location_data.region == region_name and location_data.can_create(self)
|
||||||
}, CliqueLocation)
|
}, CliqueLocation)
|
||||||
region.add_exits(region_data_table[region_name].connecting_regions)
|
region.add_exits(region_data_table[region_name].connecting_regions)
|
||||||
|
|
||||||
# Place locked locations.
|
# Place locked locations.
|
||||||
for location_name, location_data in locked_locations.items():
|
for location_name, location_data in locked_locations.items():
|
||||||
# Ignore locations we never created.
|
# Ignore locations we never created.
|
||||||
if not location_data.can_create(self.multiworld, self.player):
|
if not location_data.can_create(self):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
locked_item = self.create_item(location_data_table[location_name].locked_item)
|
locked_item = self.create_item(location_data_table[location_name].locked_item)
|
||||||
self.multiworld.get_location(location_name, self.player).place_locked_item(locked_item)
|
self.get_location(location_name).place_locked_item(locked_item)
|
||||||
|
|
||||||
# Set priority location for the Big Red Button!
|
# Set priority location for the Big Red Button!
|
||||||
self.multiworld.priority_locations[self.player].value.add("The Big Red Button")
|
self.options.priority_locations.value.add("The Big Red Button")
|
||||||
|
|
||||||
def get_filler_item_name(self) -> str:
|
def get_filler_item_name(self) -> str:
|
||||||
return "A Cool Filler Item (No Satisfaction Guaranteed)"
|
return "A Cool Filler Item (No Satisfaction Guaranteed)"
|
||||||
|
|
||||||
def set_rules(self) -> None:
|
def set_rules(self) -> None:
|
||||||
button_rule = get_button_rule(self.multiworld, self.player)
|
button_rule = get_button_rule(self)
|
||||||
self.multiworld.get_location("The Big Red Button", self.player).access_rule = button_rule
|
self.get_location("The Big Red Button").access_rule = button_rule
|
||||||
self.multiworld.get_location("In the Player's Mind", self.player).access_rule = button_rule
|
self.get_location("In the Player's Mind").access_rule = button_rule
|
||||||
|
|
||||||
# Do not allow button activations on buttons.
|
# Do not allow button activations on buttons.
|
||||||
self.multiworld.get_location("The Big Red Button", self.player).item_rule =\
|
self.get_location("The Big Red Button").item_rule = lambda item: item.name != "Button Activation"
|
||||||
lambda item: item.name != "Button Activation"
|
|
||||||
|
|
||||||
# Completion condition.
|
# Completion condition.
|
||||||
self.multiworld.completion_condition[self.player] = lambda state: state.has("The Urge to Push", self.player)
|
self.multiworld.completion_condition[self.player] = lambda state: state.has("The Urge to Push", self.player)
|
||||||
|
|
||||||
def fill_slot_data(self):
|
def fill_slot_data(self) -> Dict[str, Any]:
|
||||||
return {
|
return {
|
||||||
"color": getattr(self.multiworld, "color")[self.player].current_key
|
"color": self.options.color.current_key
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue