Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Shivers: New features and removes two missed options using the old options API #3287

Merged
merged 49 commits into from
Jul 31, 2024
Merged
Show file tree
Hide file tree
Changes from 46 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
5a9bc60
Adds an option to have pot pieces placed local/non-local/anywhere
GodlFire Dec 3, 2023
efc4331
New option: Choose how many ixupi captures are needed for goal comple…
GodlFire Dec 3, 2023
629028b
Fixes rule logic for location 'puzzle solved three floor elevator'
GodlFire Jan 1, 2024
bb08c3f
Merge branch 'main' of https://github.com/GodlFire/Shivers
GodlFire Jan 1, 2024
2cfa159
Revert "Merge branch 'main' of https://github.com/GodlFire/Shivers"
GodlFire Jan 2, 2024
bc81103
Fixes issue with office elevator rule logic.
korydondzila Jan 8, 2024
031f1ad
Bug fix, missing logic requirement for location 'Final Riddle: Guillo…
GodlFire Jan 12, 2024
b29a50f
Moves plaque location to front for better tracker referencing.
korydondzila Feb 26, 2024
b65a05a
Tiki should be Shaman.
korydondzila Feb 26, 2024
61c19fe
Hanging should be Gallows.
korydondzila Feb 26, 2024
a17868a
Merrick spelling.
korydondzila Feb 26, 2024
e039da6
Clarity change.
korydondzila Feb 26, 2024
777f138
Merge branch 'ArchipelagoMW:main' into Changes
GodlFire Mar 7, 2024
fc4fb35
Merge branch 'pr/2869' into Changes
GodlFire Mar 7, 2024
00c5cc7
Changes new option to use new option API
GodlFire Mar 7, 2024
f97caa1
Added sub regions for Ixupi
GodlFire Mar 12, 2024
55fd4db
Adds option for ixupi captures to be priority locations
GodlFire Mar 12, 2024
1ef49e8
Consistency
GodlFire Mar 12, 2024
e453c64
Changes ixupi captures priority to default on toggle
GodlFire Mar 12, 2024
15c0e53
Docs update
GodlFire Mar 13, 2024
b06ccc3
New features/bug fixes
GodlFire Mar 17, 2024
8477d3c
Merge pull request #9 from ArchipelagoMW/main
GodlFire Mar 17, 2024
88c1596
Merge branch 'main' into Changes
GodlFire Mar 17, 2024
426b74e
Cleanup
GodlFire Mar 17, 2024
1098401
Fixed name for moved location
GodlFire Mar 17, 2024
630a3bd
Merge pull request #10 from ArchipelagoMW/main
GodlFire Apr 2, 2024
3abd9ce
Squashed commit of the following:
GodlFire Apr 2, 2024
fe6c9b9
Changes pot_completed_list to a instance variable instead of global.
GodlFire Apr 2, 2024
7ef896e
Removing deprecated options getter
Exempt-Medic May 8, 2024
53c1345
Merge pull request #11 from Exempt-Medic/patch-9
GodlFire May 12, 2024
75c9f59
Merge pull request #12 from ArchipelagoMW/main
GodlFire May 12, 2024
db67d05
Merge branch 'main' into Changes
GodlFire May 12, 2024
bdb713a
Adds back fix from main branch
GodlFire May 12, 2024
5990987
Removing messenger changes that somehow got on my branch?
GodlFire May 12, 2024
0b8bf2d
Removing messenger changes that are somehow on the Shivers branch
GodlFire May 12, 2024
1fc5e12
Still trying to remove Messenger changes on Shivers branch
GodlFire May 12, 2024
c7ef0a2
Review comments addressed. Early lobby access set as default.
GodlFire May 19, 2024
767c74d
Review comments addressed
GodlFire May 21, 2024
bfac4d5
Merge pull request #13 from ArchipelagoMW/main
GodlFire Jun 4, 2024
67e60e9
Review comments addressed. Option for priority locations removed.
GodlFire Jun 11, 2024
299f71c
Merge branch 'ArchipelagoMW:main' into main
GodlFire Jul 11, 2024
f3c979f
Merge branch 'main' into Changes
GodlFire Jul 11, 2024
944c416
Minor Change
GodlFire Jul 11, 2024
d6f5f89
Fixed ID 10 T Error
GodlFire Jul 12, 2024
11f6d04
Front door option added to slot data
GodlFire Jul 21, 2024
049805f
Add missing .value on slot data
GodlFire Jul 21, 2024
0eebe14
Small change to slot data
GodlFire Jul 25, 2024
3b77b83
Small change to slot data
GodlFire Jul 25, 2024
44d1059
Forgot list
GodlFire Jul 25, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 40 additions & 20 deletions worlds/shivers/Items.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,28 +33,38 @@ class ItemData(typing.NamedTuple):
"Lightning Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 17, "pot"),
"Sand Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 18, "pot"),
"Metal Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 19, "pot"),
"Water Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 20, "pot_type2"),
"Wax Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 21, "pot_type2"),
"Ash Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 22, "pot_type2"),
"Oil Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 23, "pot_type2"),
"Cloth Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 24, "pot_type2"),
"Wood Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 25, "pot_type2"),
"Crystal Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 26, "pot_type2"),
"Lightning Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 27, "pot_type2"),
"Sand Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 28, "pot_type2"),
"Metal Pot Complete": ItemData(SHIVERS_ITEM_ID_OFFSET + 29, "pot_type2"),

#Keys
"Key for Office Elevator": ItemData(SHIVERS_ITEM_ID_OFFSET + 20, "key"),
"Key for Bedroom Elevator": ItemData(SHIVERS_ITEM_ID_OFFSET + 21, "key"),
"Key for Three Floor Elevator": ItemData(SHIVERS_ITEM_ID_OFFSET + 22, "key"),
"Key for Workshop": ItemData(SHIVERS_ITEM_ID_OFFSET + 23, "key"),
"Key for Office": ItemData(SHIVERS_ITEM_ID_OFFSET + 24, "key"),
"Key for Prehistoric Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 25, "key"),
"Key for Greenhouse Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 26, "key"),
"Key for Ocean Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 27, "key"),
"Key for Projector Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 28, "key"),
"Key for Generator Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 29, "key"),
"Key for Egypt Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 30, "key"),
"Key for Library Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 31, "key"),
"Key for Shaman Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 32, "key"),
"Key for UFO Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 33, "key"),
"Key for Torture Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 34, "key"),
"Key for Puzzle Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 35, "key"),
"Key for Bedroom": ItemData(SHIVERS_ITEM_ID_OFFSET + 36, "key"),
"Key for Underground Lake Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 37, "key"),
"Key for Janitor Closet": ItemData(SHIVERS_ITEM_ID_OFFSET + 38, "key"),
"Key for Front Door": ItemData(SHIVERS_ITEM_ID_OFFSET + 39, "key-optional"),
"Key for Office Elevator": ItemData(SHIVERS_ITEM_ID_OFFSET + 30, "key"),
"Key for Bedroom Elevator": ItemData(SHIVERS_ITEM_ID_OFFSET + 31, "key"),
"Key for Three Floor Elevator": ItemData(SHIVERS_ITEM_ID_OFFSET + 32, "key"),
"Key for Workshop": ItemData(SHIVERS_ITEM_ID_OFFSET + 33, "key"),
"Key for Office": ItemData(SHIVERS_ITEM_ID_OFFSET + 34, "key"),
"Key for Prehistoric Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 35, "key"),
"Key for Greenhouse Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 36, "key"),
"Key for Ocean Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 37, "key"),
"Key for Projector Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 38, "key"),
"Key for Generator Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 39, "key"),
"Key for Egypt Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 40, "key"),
"Key for Library Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 41, "key"),
"Key for Shaman Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 42, "key"),
"Key for UFO Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 43, "key"),
"Key for Torture Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 44, "key"),
"Key for Puzzle Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 45, "key"),
"Key for Bedroom": ItemData(SHIVERS_ITEM_ID_OFFSET + 46, "key"),
"Key for Underground Lake Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 47, "key"),
"Key for Janitor Closet": ItemData(SHIVERS_ITEM_ID_OFFSET + 48, "key"),
"Key for Front Door": ItemData(SHIVERS_ITEM_ID_OFFSET + 49, "key-optional"),

#Abilities
"Crawling": ItemData(SHIVERS_ITEM_ID_OFFSET + 50, "ability"),
Expand Down Expand Up @@ -83,6 +93,16 @@ class ItemData(typing.NamedTuple):
"Lightning Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 87, "potduplicate"),
"Sand Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 88, "potduplicate"),
"Metal Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 89, "potduplicate"),
"Water Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 140, "potduplicate_type2"),
"Wax Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 141, "potduplicate_type2"),
"Ash Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 142, "potduplicate_type2"),
"Oil Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 143, "potduplicate_type2"),
"Cloth Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 144, "potduplicate_type2"),
"Wood Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 145, "potduplicate_type2"),
"Crystal Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 146, "potduplicate_type2"),
"Lightning Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 147, "potduplicate_type2"),
"Sand Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 148, "potduplicate_type2"),
"Metal Pot Complete DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 149, "potduplicate_type2"),

#Filler
"Empty": ItemData(SHIVERS_ITEM_ID_OFFSET + 90, "filler"),
Expand Down
63 changes: 55 additions & 8 deletions worlds/shivers/Options.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,37 @@
from Options import Choice, DefaultOnToggle, Toggle, PerGameCommonOptions
from Options import Choice, DefaultOnToggle, Toggle, PerGameCommonOptions, Range
from dataclasses import dataclass


class IxupiCapturesNeeded(Range):
"""
Number of Ixupi Captures needed for goal condition.
"""
display_name = "Number of Ixupi Captures Needed"
range_start = 1
range_end = 10
default = 10

class LobbyAccess(Choice):
"""Chooses how keys needed to reach the lobby are placed.
"""
Chooses how keys needed to reach the lobby are placed.
- Normal: Keys are placed anywhere
- Early: Keys are placed early
- Local: Keys are placed locally"""
- Local: Keys are placed locally
"""
display_name = "Lobby Access"
option_normal = 0
option_early = 1
option_local = 2
default = 1

class PuzzleHintsRequired(DefaultOnToggle):
"""If turned on puzzle hints will be available before the corresponding puzzle is required. For example: The Shaman
Drums puzzle will be placed after access to the security cameras which give you the solution. Turning this off
allows for greater randomization."""
"""
If turned on puzzle hints/solutions will be available before the corresponding puzzle is required.

For example: The Red Door puzzle will be logically required only after access to the Beth's Address Book which gives you the solution.

Turning this off allows for greater randomization.
"""
display_name = "Puzzle Hints Required"

class InformationPlaques(Toggle):
Expand All @@ -26,7 +42,9 @@ class InformationPlaques(Toggle):
display_name = "Include Information Plaques"

class FrontDoorUsable(Toggle):
"""Adds a key to unlock the front door of the museum."""
"""
Adds a key to unlock the front door of the museum.
"""
display_name = "Front Door Usable"

class ElevatorsStaySolved(DefaultOnToggle):
Expand All @@ -37,7 +55,9 @@ class ElevatorsStaySolved(DefaultOnToggle):
display_name = "Elevators Stay Solved"

class EarlyBeth(DefaultOnToggle):
"""Beth's body is open at the start of the game. This allows any pot piece to be placed in the slide and early checks on the second half of the final riddle."""
"""
Beth's body is open at the start of the game. This allows any pot piece to be placed in the slide and early checks on the second half of the final riddle.
"""
display_name = "Early Beth"

class EarlyLightning(Toggle):
Expand All @@ -47,13 +67,40 @@ class EarlyLightning(Toggle):
"""
display_name = "Early Lightning"

class LocationPotPieces(Choice):
"""
Chooses where pot pieces will be located within the multiworld.
- Own World: Pot pieces will be located within your own world
- Different World: Pot pieces will be located in another world
- Any World: Pot pieces will be located in any world
"""
display_name = "Location of Pot Pieces"
option_own_world = 0
option_different_world = 1
option_any_world = 2

class FullPots(Choice):
"""
Chooses if pots will be in pieces or already completed
- Pieces: Only pot pieces will be added to the item pool
- Complete: Only completed pots will be added to the item pool
- Mixed: Each pot will be randomly chosen to be pieces or already completed.
"""
display_name = "Full Pots"
option_pieces = 0
option_complete = 1
option_mixed = 2


@dataclass
class ShiversOptions(PerGameCommonOptions):
ixupi_captures_needed: IxupiCapturesNeeded
lobby_access: LobbyAccess
puzzle_hints_required: PuzzleHintsRequired
include_information_plaques: InformationPlaques
front_door_usable: FrontDoorUsable
elevators_stay_solved: ElevatorsStaySolved
early_beth: EarlyBeth
early_lightning: EarlyLightning
location_pot_pieces: LocationPotPieces
full_pots: FullPots
55 changes: 31 additions & 24 deletions worlds/shivers/Rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,58 +8,58 @@


def water_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Lobby", "Region", player) or (state.can_reach("Janitor Closet", "Region", player) and cloth_capturable(state, player))) \
and state.has_all({"Water Pot Bottom", "Water Pot Top", "Water Pot Bottom DUPE", "Water Pot Top DUPE"}, player)
return state.has_all({"Water Pot Bottom", "Water Pot Top", "Water Pot Bottom DUPE", "Water Pot Top DUPE"}, player) or \
state.has_all({"Water Pot Complete", "Water Pot Complete DUPE"}, player)


def wax_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Library", "Region", player) or state.can_reach("Anansi", "Region", player)) \
and state.has_all({"Wax Pot Bottom", "Wax Pot Top", "Wax Pot Bottom DUPE", "Wax Pot Top DUPE"}, player)
return state.has_all({"Wax Pot Bottom", "Wax Pot Top", "Wax Pot Bottom DUPE", "Wax Pot Top DUPE"}, player) or \
state.has_all({"Wax Pot Complete", "Wax Pot Complete DUPE"}, player)


def ash_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Office", "Region", player) or state.can_reach("Burial", "Region", player)) \
and state.has_all({"Ash Pot Bottom", "Ash Pot Top", "Ash Pot Bottom DUPE", "Ash Pot Top DUPE"}, player)
return state.has_all({"Ash Pot Bottom", "Ash Pot Top", "Ash Pot Bottom DUPE", "Ash Pot Top DUPE"}, player) or \
state.has_all({"Ash Pot Complete", "Ash Pot Complete DUPE"}, player)


def oil_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Prehistoric", "Region", player) or state.can_reach("Tar River", "Region", player)) \
and state.has_all({"Oil Pot Bottom", "Oil Pot Top", "Oil Pot Bottom DUPE", "Oil Pot Top DUPE"}, player)
return state.has_all({"Oil Pot Bottom", "Oil Pot Top", "Oil Pot Bottom DUPE", "Oil Pot Top DUPE"}, player) or \
state.has_all({"Oil Pot Complete", "Oil Pot Complete DUPE"}, player)


def cloth_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Egypt", "Region", player) or state.can_reach("Burial", "Region", player) or state.can_reach("Janitor Closet", "Region", player)) \
and state.has_all({"Cloth Pot Bottom", "Cloth Pot Top", "Cloth Pot Bottom DUPE", "Cloth Pot Top DUPE"}, player)
return state.has_all({"Cloth Pot Bottom", "Cloth Pot Top", "Cloth Pot Bottom DUPE", "Cloth Pot Top DUPE"}, player) or \
state.has_all({"Cloth Pot Complete", "Cloth Pot Complete DUPE"}, player)


def wood_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Workshop", "Region", player) or state.can_reach("Blue Maze", "Region", player) or state.can_reach("Gods Room", "Region", player) or state.can_reach("Anansi", "Region", player)) \
and state.has_all({"Wood Pot Bottom", "Wood Pot Top", "Wood Pot Bottom DUPE", "Wood Pot Top DUPE"}, player)
return state.has_all({"Wood Pot Bottom", "Wood Pot Top", "Wood Pot Bottom DUPE", "Wood Pot Top DUPE"}, player) or \
state.has_all({"Wood Pot Complete", "Wood Pot Complete DUPE"}, player)


def crystal_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Lobby", "Region", player) or state.can_reach("Ocean", "Region", player)) \
and state.has_all({"Crystal Pot Bottom", "Crystal Pot Top", "Crystal Pot Bottom DUPE", "Crystal Pot Top DUPE"}, player)
return state.has_all({"Crystal Pot Bottom", "Crystal Pot Top", "Crystal Pot Bottom DUPE", "Crystal Pot Top DUPE"}, player) or \
state.has_all({"Crystal Pot Complete", "Crystal Pot Complete DUPE"}, player)


def sand_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Greenhouse", "Region", player) or state.can_reach("Ocean", "Region", player)) \
and state.has_all({"Sand Pot Bottom", "Sand Pot Top", "Sand Pot Bottom DUPE", "Sand Pot Top DUPE"}, player)
return state.has_all({"Sand Pot Bottom", "Sand Pot Top", "Sand Pot Bottom DUPE", "Sand Pot Top DUPE"}, player) or \
state.has_all({"Sand Pot Complete", "Sand Pot Complete DUPE"}, player)


def metal_capturable(state: CollectionState, player: int) -> bool:
return (state.can_reach("Projector Room", "Region", player) or state.can_reach("Prehistoric", "Region", player) or state.can_reach("Bedroom", "Region", player)) \
and state.has_all({"Metal Pot Bottom", "Metal Pot Top", "Metal Pot Bottom DUPE", "Metal Pot Top DUPE"}, player)
return state.has_all({"Metal Pot Bottom", "Metal Pot Top", "Metal Pot Bottom DUPE", "Metal Pot Top DUPE"}, player) or \
state.has_all({"Metal Pot Complete", "Metal Pot Complete DUPE"}, player)


def lightning_capturable(state: CollectionState, player: int) -> bool:
return (first_nine_ixupi_capturable or state.multiworld.early_lightning[player].value) \
and state.can_reach("Generator", "Region", player) \
and state.has_all({"Lightning Pot Bottom", "Lightning Pot Top", "Lightning Pot Bottom DUPE", "Lightning Pot Top DUPE"}, player)
return (first_nine_ixupi_capturable(state, player) or state.multiworld.worlds[player].options.early_lightning.value) \
and (state.has_all({"Lightning Pot Bottom", "Lightning Pot Top", "Lightning Pot Bottom DUPE", "Lightning Pot Top DUPE"}, player) or \
state.has_all({"Lightning Pot Complete", "Lightning Pot Complete DUPE"}, player))


def beths_body_available(state: CollectionState, player: int) -> bool:
return (first_nine_ixupi_capturable(state, player) or state.multiworld.early_beth[player].value) \
return (first_nine_ixupi_capturable(state, player) or state.multiworld.worlds[player].options.early_beth.value) \
and state.can_reach("Generator", "Region", player)


Expand Down Expand Up @@ -123,7 +123,8 @@ def get_rules_lookup(player: int):
"To Burial From Egypt": lambda state: state.can_reach("Egypt", "Region", player),
"To Gods Room From Anansi": lambda state: state.can_reach("Gods Room", "Region", player),
"To Slide Room": lambda state: all_skull_dials_available(state, player),
"To Lobby From Slide Room": lambda state: (beths_body_available(state, player))
"To Lobby From Slide Room": lambda state: beths_body_available(state, player),
"To Water Capture From Janitor Closet": lambda state: cloth_capturable(state, player)
},
"locations_required": {
"Puzzle Solved Anansi Musicbox": lambda state: state.can_reach("Clock Tower", "Region", player),
Expand Down Expand Up @@ -207,8 +208,10 @@ def set_rules(world: "ShiversWorld") -> None:
# forbid cloth in janitor closet and oil in tar river
forbid_item(multiworld.get_location("Accessible: Storage: Janitor Closet", player), "Cloth Pot Bottom DUPE", player)
forbid_item(multiworld.get_location("Accessible: Storage: Janitor Closet", player), "Cloth Pot Top DUPE", player)
forbid_item(multiworld.get_location("Accessible: Storage: Janitor Closet", player), "Cloth Pot Complete DUPE", player)
forbid_item(multiworld.get_location("Accessible: Storage: Tar River", player), "Oil Pot Bottom DUPE", player)
forbid_item(multiworld.get_location("Accessible: Storage: Tar River", player), "Oil Pot Top DUPE", player)
forbid_item(multiworld.get_location("Accessible: Storage: Tar River", player), "Oil Pot Complete DUPE", player)

# Filler Item Forbids
forbid_item(multiworld.get_location("Puzzle Solved Lyre", player), "Easier Lyre", player)
Expand All @@ -234,4 +237,8 @@ def set_rules(world: "ShiversWorld") -> None:
forbid_item(multiworld.get_location("Ixupi Captured Metal", player), "Metal Always Available in Prehistoric", player)

# Set completion condition
multiworld.completion_condition[player] = lambda state: (first_nine_ixupi_capturable(state, player) and lightning_capturable(state, player))
multiworld.completion_condition[player] = lambda state: ((
water_capturable(state, player) + wax_capturable(state, player) + ash_capturable(state, player) \
+ oil_capturable(state, player) + cloth_capturable(state, player) + wood_capturable(state, player) \
+ crystal_capturable(state, player) + sand_capturable(state, player) + metal_capturable(state, player) \
+ lightning_capturable(state, player)) >= world.options.ixupi_captures_needed.value)
NewSoupVi marked this conversation as resolved.
Show resolved Hide resolved
Loading
Loading