Shivers: Implement New Game (#1836)
Co-authored-by: Mathx2 <Mathx2@gmail.com> Co-authored-by: Zach Parks <zach@alliware.com>
This commit is contained in:
parent
8173fd54e7
commit
8d41430cc8
|
@ -54,6 +54,7 @@ Currently, the following games are supported:
|
|||
* Lingo
|
||||
* Pokémon Emerald
|
||||
* DOOM II
|
||||
* Shivers
|
||||
|
||||
|
||||
For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
|
||||
|
|
|
@ -113,6 +113,9 @@
|
|||
# Risk of Rain 2
|
||||
/worlds/ror2/ @kindasneaki
|
||||
|
||||
# Shivers
|
||||
/worlds/shivers/ @GodlFire
|
||||
|
||||
# Sonic Adventure 2 Battle
|
||||
/worlds/sa2b/ @PoryGone @RaspberrySpace
|
||||
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
import os
|
||||
import json
|
||||
import pkgutil
|
||||
|
||||
def load_data_file(*args) -> dict:
|
||||
fname = os.path.join("data", *args)
|
||||
return json.loads(pkgutil.get_data(__name__, fname).decode())
|
||||
|
||||
location_id_offset: int = 27000
|
||||
|
||||
location_info = load_data_file("locations.json")
|
||||
location_name_to_id = {name: location_id_offset + index \
|
||||
for index, name in enumerate(location_info["all_locations"])}
|
||||
|
||||
exclusion_info = load_data_file("excluded_locations.json")
|
||||
|
||||
region_info = load_data_file("regions.json")
|
|
@ -0,0 +1,112 @@
|
|||
from BaseClasses import Item, ItemClassification
|
||||
import typing
|
||||
|
||||
class ShiversItem(Item):
|
||||
game: str = "Shivers"
|
||||
|
||||
class ItemData(typing.NamedTuple):
|
||||
code: int
|
||||
type: str
|
||||
classification: ItemClassification = ItemClassification.progression
|
||||
|
||||
SHIVERS_ITEM_ID_OFFSET = 27000
|
||||
|
||||
item_table = {
|
||||
#Pot Pieces
|
||||
"Water Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 0, "pot"),
|
||||
"Wax Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 1, "pot"),
|
||||
"Ash Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 2, "pot"),
|
||||
"Oil Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 3, "pot"),
|
||||
"Cloth Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 4, "pot"),
|
||||
"Wood Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 5, "pot"),
|
||||
"Crystal Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 6, "pot"),
|
||||
"Lightning Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 7, "pot"),
|
||||
"Sand Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 8, "pot"),
|
||||
"Metal Pot Bottom": ItemData(SHIVERS_ITEM_ID_OFFSET + 9, "pot"),
|
||||
"Water Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 10, "pot"),
|
||||
"Wax Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 11, "pot"),
|
||||
"Ash Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 12, "pot"),
|
||||
"Oil Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 13, "pot"),
|
||||
"Cloth Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 14, "pot"),
|
||||
"Wood Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 15, "pot"),
|
||||
"Crystal Pot Top": ItemData(SHIVERS_ITEM_ID_OFFSET + 16, "pot"),
|
||||
"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"),
|
||||
|
||||
#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 Tiki 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"),
|
||||
|
||||
#Abilities
|
||||
"Crawling": ItemData(SHIVERS_ITEM_ID_OFFSET + 50, "ability"),
|
||||
|
||||
#Event Items
|
||||
"Victory": ItemData(SHIVERS_ITEM_ID_OFFSET + 60, "victory"),
|
||||
|
||||
#Duplicate pot pieces for fill_Restrictive
|
||||
"Water Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 70, "potduplicate"),
|
||||
"Wax Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 71, "potduplicate"),
|
||||
"Ash Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 72, "potduplicate"),
|
||||
"Oil Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 73, "potduplicate"),
|
||||
"Cloth Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 74, "potduplicate"),
|
||||
"Wood Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 75, "potduplicate"),
|
||||
"Crystal Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 76, "potduplicate"),
|
||||
"Lightning Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 77, "potduplicate"),
|
||||
"Sand Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 78, "potduplicate"),
|
||||
"Metal Pot Bottom DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 79, "potduplicate"),
|
||||
"Water Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 80, "potduplicate"),
|
||||
"Wax Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 81, "potduplicate"),
|
||||
"Ash Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 82, "potduplicate"),
|
||||
"Oil Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 83, "potduplicate"),
|
||||
"Cloth Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 84, "potduplicate"),
|
||||
"Wood Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 85, "potduplicate"),
|
||||
"Crystal Pot Top DUPE": ItemData(SHIVERS_ITEM_ID_OFFSET + 86, "potduplicate"),
|
||||
"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"),
|
||||
|
||||
#Filler
|
||||
"Empty": ItemData(SHIVERS_ITEM_ID_OFFSET + 90, "filler"),
|
||||
"Easier Lyre": ItemData(SHIVERS_ITEM_ID_OFFSET + 91, "filler", ItemClassification.filler),
|
||||
"Water Always Available in Lobby": ItemData(SHIVERS_ITEM_ID_OFFSET + 92, "filler2", ItemClassification.filler),
|
||||
"Wax Always Available in Library": ItemData(SHIVERS_ITEM_ID_OFFSET + 93, "filler2", ItemClassification.filler),
|
||||
"Wax Always Available in Anansi Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 94, "filler2", ItemClassification.filler),
|
||||
"Wax Always Available in Tiki Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 95, "filler2", ItemClassification.filler),
|
||||
"Ash Always Available in Office": ItemData(SHIVERS_ITEM_ID_OFFSET + 96, "filler2", ItemClassification.filler),
|
||||
"Ash Always Available in Burial Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 97, "filler2", ItemClassification.filler),
|
||||
"Oil Always Available in Prehistoric Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 98, "filler2", ItemClassification.filler),
|
||||
"Cloth Always Available in Egypt": ItemData(SHIVERS_ITEM_ID_OFFSET + 99, "filler2", ItemClassification.filler),
|
||||
"Cloth Always Available in Burial Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 100, "filler2", ItemClassification.filler),
|
||||
"Wood Always Available in Workshop": ItemData(SHIVERS_ITEM_ID_OFFSET + 101, "filler2", ItemClassification.filler),
|
||||
"Wood Always Available in Blue Maze": ItemData(SHIVERS_ITEM_ID_OFFSET + 102, "filler2", ItemClassification.filler),
|
||||
"Wood Always Available in Pegasus Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 103, "filler2", ItemClassification.filler),
|
||||
"Wood Always Available in Gods Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 104, "filler2", ItemClassification.filler),
|
||||
"Crystal Always Available in Lobby": ItemData(SHIVERS_ITEM_ID_OFFSET + 105, "filler2", ItemClassification.filler),
|
||||
"Crystal Always Available in Ocean": ItemData(SHIVERS_ITEM_ID_OFFSET + 106, "filler2", ItemClassification.filler),
|
||||
"Sand Always Available in Greenhouse Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 107, "filler2", ItemClassification.filler),
|
||||
"Sand Always Available in Ocean": ItemData(SHIVERS_ITEM_ID_OFFSET + 108, "filler2", ItemClassification.filler),
|
||||
"Metal Always Available in Projector Room": ItemData(SHIVERS_ITEM_ID_OFFSET + 109, "filler2", ItemClassification.filler),
|
||||
"Metal Always Available in Bedroom": ItemData(SHIVERS_ITEM_ID_OFFSET + 110, "filler2", ItemClassification.filler),
|
||||
"Metal Always Available in Prehistoric": ItemData(SHIVERS_ITEM_ID_OFFSET + 111, "filler2", ItemClassification.filler),
|
||||
"Heal": ItemData(SHIVERS_ITEM_ID_OFFSET + 112, "filler3", ItemClassification.filler)
|
||||
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
from Options import Choice, DefaultOnToggle, Toggle, PerGameCommonOptions
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
class LobbyAccess(Choice):
|
||||
"""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"""
|
||||
display_name = "Lobby Access"
|
||||
option_normal = 0
|
||||
option_early = 1
|
||||
option_local = 2
|
||||
|
||||
class PuzzleHintsRequired(DefaultOnToggle):
|
||||
"""If turned on puzzle hints will be available before the corresponding puzzle is required. For example: The Tiki
|
||||
Drums puzzle will be placed after access to the security cameras which give you the solution. Turning this off
|
||||
allows for greater randomization."""
|
||||
display_name = "Puzzle Hints Required"
|
||||
|
||||
class InformationPlaques(Toggle):
|
||||
"""Adds Information Plaques as checks."""
|
||||
display_name = "Include Information Plaques"
|
||||
|
||||
class FrontDoorUsable(Toggle):
|
||||
"""Adds a key to unlock the front door of the museum."""
|
||||
display_name = "Front Door Usable"
|
||||
|
||||
class ElevatorsStaySolved(DefaultOnToggle):
|
||||
"""Adds elevators as checks and will remain open upon solving them."""
|
||||
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."""
|
||||
display_name = "Early Beth"
|
||||
|
||||
class EarlyLightning(Toggle):
|
||||
"""Allows lightning to be captured at any point in the game. You will still need to capture all ten Ixupi for victory."""
|
||||
display_name = "Early Lightning"
|
||||
|
||||
|
||||
@dataclass
|
||||
class ShiversOptions(PerGameCommonOptions):
|
||||
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
|
|
@ -0,0 +1,228 @@
|
|||
from typing import Dict, List, TYPE_CHECKING
|
||||
from collections.abc import Callable
|
||||
from BaseClasses import CollectionState
|
||||
from worlds.generic.Rules import forbid_item
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from . import ShiversWorld
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
def beths_body_available(state: CollectionState, player: int) -> bool:
|
||||
return (first_nine_ixupi_capturable(state, player) or state.multiworld.early_beth[player].value) \
|
||||
and state.can_reach("Generator", "Region", player)
|
||||
|
||||
|
||||
def first_nine_ixupi_capturable(state: CollectionState, player: int) -> bool:
|
||||
return water_capturable(state, player) and wax_capturable(state, player) \
|
||||
and ash_capturable(state, player) and oil_capturable(state, player) \
|
||||
and cloth_capturable(state, player) and wood_capturable(state, player) \
|
||||
and crystal_capturable(state, player) and sand_capturable(state, player) \
|
||||
and metal_capturable(state, player)
|
||||
|
||||
|
||||
def get_rules_lookup(player: int):
|
||||
rules_lookup: Dict[str, List[Callable[[CollectionState], bool]]] = {
|
||||
"entrances": {
|
||||
"To Office Elevator From Underground Blue Tunnels": lambda state: state.has("Key for Office Elevator", player),
|
||||
"To Office Elevator From Office": lambda state: state.has("Key for Office Elevator", player),
|
||||
"To Bedroom Elevator From Office": lambda state: state.has_all({"Key for Bedroom Elevator", "Crawling"}, player),
|
||||
"To Office From Bedroom Elevator": lambda state: state.has_all({"Key for Bedroom Elevator", "Crawling"}, player),
|
||||
"To Three Floor Elevator From Maintenance Tunnels": lambda state: state.has("Key for Three Floor Elevator", player),
|
||||
"To Three Floor Elevator From Blue Maze Bottom": lambda state: state.has("Key for Three Floor Elevator", player),
|
||||
"To Three Floor Elevator From Blue Maze Top": lambda state: state.has("Key for Three Floor Elevator", player),
|
||||
"To Workshop": lambda state: state.has("Key for Workshop", player),
|
||||
"To Lobby From Office": lambda state: state.has("Key for Office", player),
|
||||
"To Office From Lobby": lambda state: state.has("Key for Office", player),
|
||||
"To Library From Lobby": lambda state: state.has("Key for Library Room", player),
|
||||
"To Lobby From Library": lambda state: state.has("Key for Library Room", player),
|
||||
"To Prehistoric From Lobby": lambda state: state.has("Key for Prehistoric Room", player),
|
||||
"To Lobby From Prehistoric": lambda state: state.has("Key for Prehistoric Room", player),
|
||||
"To Greenhouse": lambda state: state.has("Key for Greenhouse Room", player),
|
||||
"To Ocean From Prehistoric": lambda state: state.has("Key for Ocean Room", player),
|
||||
"To Prehistoric From Ocean": lambda state: state.has("Key for Ocean Room", player),
|
||||
"To Projector Room": lambda state: state.has("Key for Projector Room", player),
|
||||
"To Generator": lambda state: state.has("Key for Generator Room", player),
|
||||
"To Lobby From Egypt": lambda state: state.has("Key for Egypt Room", player),
|
||||
"To Egypt From Lobby": lambda state: state.has("Key for Egypt Room", player),
|
||||
"To Janitor Closet": lambda state: state.has("Key for Janitor Closet", player),
|
||||
"To Tiki From Burial": lambda state: state.has("Key for Tiki Room", player),
|
||||
"To Burial From Tiki": lambda state: state.has("Key for Tiki Room", player),
|
||||
"To Inventions From UFO": lambda state: state.has("Key for UFO Room", player),
|
||||
"To UFO From Inventions": lambda state: state.has("Key for UFO Room", player),
|
||||
"To Torture From Inventions": lambda state: state.has("Key for Torture Room", player),
|
||||
"To Inventions From Torture": lambda state: state.has("Key for Torture Room", player),
|
||||
"To Torture": lambda state: state.has("Key for Puzzle Room", player),
|
||||
"To Puzzle Room Mastermind From Torture": lambda state: state.has("Key for Puzzle Room", player),
|
||||
"To Bedroom": lambda state: state.has("Key for Bedroom", player),
|
||||
"To Underground Lake From Underground Tunnels": lambda state: state.has("Key for Underground Lake Room", player),
|
||||
"To Underground Tunnels From Underground Lake": lambda state: state.has("Key for Underground Lake Room", player),
|
||||
"To Outside From Lobby": lambda state: state.has("Key for Front Door", player),
|
||||
"To Lobby From Outside": lambda state: state.has("Key for Front Door", player),
|
||||
"To Maintenance Tunnels From Theater Back Hallways": lambda state: state.has("Crawling", player),
|
||||
"To Blue Maze From Egypt": lambda state: state.has("Crawling", player),
|
||||
"To Egypt From Blue Maze": lambda state: state.has("Crawling", player),
|
||||
"To Lobby From Tar River": lambda state: (state.has("Crawling", player) and oil_capturable(state, player)),
|
||||
"To Tar River From Lobby": lambda state: (state.has("Crawling", player) and oil_capturable(state, player) and state.can_reach("Tar River", "Region", player)),
|
||||
"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: (
|
||||
state.can_reach("Prehistoric", "Region", player) and state.can_reach("Tar River", "Region",player) and
|
||||
state.can_reach("Egypt", "Region", player) and state.can_reach("Burial", "Region", player) and
|
||||
state.can_reach("Gods Room", "Region", player) and state.can_reach("Werewolf", "Region", player)),
|
||||
"To Lobby From Slide Room": lambda state: (beths_body_available(state, player))
|
||||
},
|
||||
"locations_required": {
|
||||
"Puzzle Solved Anansi Musicbox": lambda state: state.can_reach("Clock Tower", "Region", player),
|
||||
"Accessible: Storage: Janitor Closet": lambda state: cloth_capturable(state, player),
|
||||
"Accessible: Storage: Tar River": lambda state: oil_capturable(state, player),
|
||||
"Accessible: Storage: Theater": lambda state: state.can_reach("Projector Room", "Region", player),
|
||||
"Accessible: Storage: Slide": lambda state: beths_body_available(state, player) and state.can_reach("Slide Room", "Region", player),
|
||||
"Ixupi Captured Water": lambda state: water_capturable(state, player),
|
||||
"Ixupi Captured Wax": lambda state: wax_capturable(state, player),
|
||||
"Ixupi Captured Ash": lambda state: ash_capturable(state, player),
|
||||
"Ixupi Captured Oil": lambda state: oil_capturable(state, player),
|
||||
"Ixupi Captured Cloth": lambda state: cloth_capturable(state, player),
|
||||
"Ixupi Captured Wood": lambda state: wood_capturable(state, player),
|
||||
"Ixupi Captured Crystal": lambda state: crystal_capturable(state, player),
|
||||
"Ixupi Captured Sand": lambda state: sand_capturable(state, player),
|
||||
"Ixupi Captured Metal": lambda state: metal_capturable(state, player),
|
||||
"Final Riddle: Planets Aligned": lambda state: state.can_reach("Fortune Teller", "Region", player),
|
||||
"Final Riddle: Norse God Stone Message": lambda state: (state.can_reach("Fortune Teller", "Region", player) and state.can_reach("UFO", "Region", player)),
|
||||
"Final Riddle: Beth's Body Page 17": lambda state: beths_body_available(state, player),
|
||||
"Final Riddle: Guillotine Dropped": lambda state: beths_body_available(state, player),
|
||||
},
|
||||
"locations_puzzle_hints": {
|
||||
"Puzzle Solved Clock Tower Door": lambda state: state.can_reach("Three Floor Elevator", "Region", player),
|
||||
"Puzzle Solved Clock Chains": lambda state: state.can_reach("Bedroom", "Region", player),
|
||||
"Puzzle Solved Tiki Drums": lambda state: state.can_reach("Clock Tower", "Region", player),
|
||||
"Puzzle Solved Red Door": lambda state: state.can_reach("Maintenance Tunnels", "Region", player),
|
||||
"Puzzle Solved UFO Symbols": lambda state: state.can_reach("Library", "Region", player),
|
||||
"Puzzle Solved Maze Door": lambda state: state.can_reach("Projector Room", "Region", player),
|
||||
"Puzzle Solved Theater Door": lambda state: state.can_reach("Underground Lake", "Region", player),
|
||||
"Puzzle Solved Columns of RA": lambda state: state.can_reach("Underground Lake", "Region", player),
|
||||
"Final Riddle: Guillotine Dropped": lambda state: state.can_reach("Underground Lake", "Region", player)
|
||||
},
|
||||
"elevators": {
|
||||
"Puzzle Solved Underground Elevator": lambda state: ((state.can_reach("Underground Lake", "Region", player) or state.can_reach("Office", "Region", player)
|
||||
and state.has("Key for Office Elevator", player))),
|
||||
"Puzzle Solved Bedroom Elevator": lambda state: (state.can_reach("Office", "Region", player) and state.has_all({"Key for Bedroom Elevator","Crawling"}, player)),
|
||||
"Puzzle Solved Three Floor Elevator": lambda state: ((state.can_reach("Maintenance Tunnels", "Region", player) or state.can_reach("Blue Maze", "Region", player)
|
||||
and state.has("Key for Three Floor Elevator", player)))
|
||||
},
|
||||
"lightning": {
|
||||
"Ixupi Captured Lightning": lambda state: lightning_capturable(state, player)
|
||||
}
|
||||
}
|
||||
return rules_lookup
|
||||
|
||||
|
||||
def set_rules(world: "ShiversWorld") -> None:
|
||||
multiworld = world.multiworld
|
||||
player = world.player
|
||||
|
||||
rules_lookup = get_rules_lookup(player)
|
||||
# Set required entrance rules
|
||||
for entrance_name, rule in rules_lookup["entrances"].items():
|
||||
multiworld.get_entrance(entrance_name, player).access_rule = rule
|
||||
|
||||
# Set required location rules
|
||||
for location_name, rule in rules_lookup["locations_required"].items():
|
||||
multiworld.get_location(location_name, player).access_rule = rule
|
||||
|
||||
# Set option location rules
|
||||
if world.options.puzzle_hints_required.value:
|
||||
for location_name, rule in rules_lookup["locations_puzzle_hints"].items():
|
||||
multiworld.get_location(location_name, player).access_rule = rule
|
||||
if world.options.elevators_stay_solved.value:
|
||||
for location_name, rule in rules_lookup["elevators"].items():
|
||||
multiworld.get_location(location_name, player).access_rule = rule
|
||||
if world.options.early_lightning.value:
|
||||
for location_name, rule in rules_lookup["lightning"].items():
|
||||
multiworld.get_location(location_name, player).access_rule = rule
|
||||
|
||||
# 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: Tar River", player), "Oil Pot Bottom DUPE", player)
|
||||
forbid_item(multiworld.get_location("Accessible: Storage: Tar River", player), "Oil Pot Top DUPE", player)
|
||||
|
||||
# Filler Item Forbids
|
||||
forbid_item(multiworld.get_location("Puzzle Solved Lyre", player), "Easier Lyre", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Water", player), "Water Always Available in Lobby", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wax", player), "Wax Always Available in Library", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wax", player), "Wax Always Available in Anansi Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wax", player), "Wax Always Available in Tiki Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Ash", player), "Ash Always Available in Office", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Ash", player), "Ash Always Available in Burial Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Oil", player), "Oil Always Available in Prehistoric Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Cloth", player), "Cloth Always Available in Egypt", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Cloth", player), "Cloth Always Available in Burial Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wood", player), "Wood Always Available in Workshop", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wood", player), "Wood Always Available in Blue Maze", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wood", player), "Wood Always Available in Pegasus Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Wood", player), "Wood Always Available in Gods Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Crystal", player), "Crystal Always Available in Lobby", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Crystal", player), "Crystal Always Available in Ocean", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Sand", player), "Sand Always Available in Plants Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Sand", player), "Sand Always Available in Ocean", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Metal", player), "Metal Always Available in Projector Room", player)
|
||||
forbid_item(multiworld.get_location("Ixupi Captured Metal", player), "Metal Always Available in Bedroom", player)
|
||||
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))
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,178 @@
|
|||
from .Items import item_table, ShiversItem
|
||||
from .Rules import set_rules
|
||||
from BaseClasses import Item, Tutorial, Region, Location
|
||||
from Fill import fill_restrictive
|
||||
from worlds.AutoWorld import WebWorld, World
|
||||
from . import Constants, Rules
|
||||
from .Options import ShiversOptions
|
||||
|
||||
|
||||
class ShiversWeb(WebWorld):
|
||||
tutorials = [Tutorial(
|
||||
"Shivers Setup Guide",
|
||||
"A guide to setting up Shivers for Multiworld.",
|
||||
"English",
|
||||
"setup_en.md",
|
||||
"setup/en",
|
||||
["GodlFire", "Mathx2"]
|
||||
)]
|
||||
|
||||
class ShiversWorld(World):
|
||||
"""
|
||||
Shivers is a horror themed point and click adventure. Explore the mysteries of Windlenot's Museum of the Strange and Unusual.
|
||||
"""
|
||||
|
||||
game: str = "Shivers"
|
||||
topology_present = False
|
||||
web = ShiversWeb()
|
||||
options_dataclass = ShiversOptions
|
||||
options: ShiversOptions
|
||||
|
||||
item_name_to_id = {name: data.code for name, data in item_table.items()}
|
||||
location_name_to_id = Constants.location_name_to_id
|
||||
|
||||
def create_item(self, name: str) -> Item:
|
||||
data = item_table[name]
|
||||
return ShiversItem(name, data.classification, data.code, self.player)
|
||||
|
||||
def create_event(self, region_name: str, event_name: str) -> None:
|
||||
region = self.multiworld.get_region(region_name, self.player)
|
||||
loc = ShiversLocation(self.player, event_name, None, region)
|
||||
loc.place_locked_item(self.create_event_item(event_name))
|
||||
region.locations.append(loc)
|
||||
|
||||
def create_regions(self) -> None:
|
||||
# Create regions
|
||||
for region_name, exits in Constants.region_info["regions"]:
|
||||
r = Region(region_name, self.player, self.multiworld)
|
||||
self.multiworld.regions.append(r)
|
||||
for exit_name in exits:
|
||||
r.create_exit(exit_name)
|
||||
|
||||
|
||||
# Bind mandatory connections
|
||||
for entr_name, region_name in Constants.region_info["mandatory_connections"]:
|
||||
e = self.multiworld.get_entrance(entr_name, self.player)
|
||||
r = self.multiworld.get_region(region_name, self.player)
|
||||
e.connect(r)
|
||||
|
||||
# Locations
|
||||
# Build exclusion list
|
||||
self.removed_locations = set()
|
||||
if not self.options.include_information_plaques:
|
||||
self.removed_locations.update(Constants.exclusion_info["plaques"])
|
||||
if not self.options.elevators_stay_solved:
|
||||
self.removed_locations.update(Constants.exclusion_info["elevators"])
|
||||
if not self.options.early_lightning:
|
||||
self.removed_locations.update(Constants.exclusion_info["lightning"])
|
||||
|
||||
# Add locations
|
||||
for region_name, locations in Constants.location_info["locations_by_region"].items():
|
||||
region = self.multiworld.get_region(region_name, self.player)
|
||||
for loc_name in locations:
|
||||
if loc_name not in self.removed_locations:
|
||||
loc = ShiversLocation(self.player, loc_name, self.location_name_to_id.get(loc_name, None), region)
|
||||
region.locations.append(loc)
|
||||
|
||||
def create_items(self) -> None:
|
||||
#Add items to item pool
|
||||
itempool = []
|
||||
for name, data in item_table.items():
|
||||
if data.type in {"pot", "key", "ability", "filler2"}:
|
||||
itempool.append(self.create_item(name))
|
||||
|
||||
#Add Filler
|
||||
itempool += [self.create_item("Easier Lyre") for i in range(9)]
|
||||
|
||||
#Extra filler is random between Heals and Easier Lyre. Heals weighted 95%.
|
||||
filler_needed = len(self.multiworld.get_unfilled_locations(self.player)) - 24 - len(itempool)
|
||||
itempool += [self.random.choices([self.create_item("Heal"), self.create_item("Easier Lyre")], weights=[95, 5])[0] for i in range(filler_needed)]
|
||||
|
||||
|
||||
#Place library escape items. Choose a location to place the escape item
|
||||
library_region = self.multiworld.get_region("Library", self.player)
|
||||
librarylocation = self.random.choice([loc for loc in library_region.locations if not loc.name.startswith("Accessible:")])
|
||||
|
||||
#Roll for which escape items will be placed in the Library
|
||||
library_random = self.random.randint(1, 3)
|
||||
if library_random == 1:
|
||||
librarylocation.place_locked_item(self.create_item("Crawling"))
|
||||
|
||||
itempool = [item for item in itempool if item.name != "Crawling"]
|
||||
|
||||
elif library_random == 2:
|
||||
librarylocation.place_locked_item(self.create_item("Key for Library Room"))
|
||||
|
||||
itempool = [item for item in itempool if item.name != "Key for Library Room"]
|
||||
elif library_random == 3:
|
||||
librarylocation.place_locked_item(self.create_item("Key for Three Floor Elevator"))
|
||||
|
||||
librarylocationkeytwo = self.random.choice([loc for loc in library_region.locations if not loc.name.startswith("Accessible:") and loc != librarylocation])
|
||||
librarylocationkeytwo.place_locked_item(self.create_item("Key for Egypt Room"))
|
||||
|
||||
itempool = [item for item in itempool if item.name not in ["Key for Three Floor Elevator", "Key for Egypt Room"]]
|
||||
|
||||
#If front door option is on, determine which set of keys will be used for lobby access and add front door key to item pool
|
||||
lobby_access_keys = 1
|
||||
if self.options.front_door_usable:
|
||||
lobby_access_keys = self.random.randint(1, 2)
|
||||
itempool += [self.create_item("Key for Front Door")]
|
||||
else:
|
||||
itempool += [self.create_item("Heal")]
|
||||
|
||||
self.multiworld.itempool += itempool
|
||||
|
||||
#Lobby acess:
|
||||
if self.options.lobby_access == 1:
|
||||
if lobby_access_keys == 1:
|
||||
self.multiworld.early_items[self.player]["Key for Underground Lake Room"] = 1
|
||||
self.multiworld.early_items[self.player]["Key for Office Elevator"] = 1
|
||||
self.multiworld.early_items[self.player]["Key for Office"] = 1
|
||||
elif lobby_access_keys == 2:
|
||||
self.multiworld.early_items[self.player]["Key for Front Door"] = 1
|
||||
if self.options.lobby_access == 2:
|
||||
if lobby_access_keys == 1:
|
||||
self.multiworld.local_early_items[self.player]["Key for Underground Lake Room"] = 1
|
||||
self.multiworld.local_early_items[self.player]["Key for Office Elevator"] = 1
|
||||
self.multiworld.local_early_items[self.player]["Key for Office"] = 1
|
||||
elif lobby_access_keys == 2:
|
||||
self.multiworld.local_early_items[self.player]["Key for Front Door"] = 1
|
||||
|
||||
def pre_fill(self) -> None:
|
||||
# Prefills event storage locations with duplicate pots
|
||||
storagelocs = []
|
||||
storageitems = []
|
||||
self.storage_placements = []
|
||||
|
||||
for locations in Constants.location_info["locations_by_region"].values():
|
||||
for loc_name in locations:
|
||||
if loc_name.startswith("Accessible: "):
|
||||
storagelocs.append(self.multiworld.get_location(loc_name, self.player))
|
||||
|
||||
storageitems += [self.create_item(name) for name, data in item_table.items() if data.type == 'potduplicate']
|
||||
storageitems += [self.create_item("Empty") for i in range(3)]
|
||||
|
||||
state = self.multiworld.get_all_state(True)
|
||||
|
||||
self.random.shuffle(storagelocs)
|
||||
self.random.shuffle(storageitems)
|
||||
|
||||
fill_restrictive(self.multiworld, state, storagelocs.copy(), storageitems, True, True)
|
||||
|
||||
self.storage_placements = {location.name: location.item.name for location in storagelocs}
|
||||
|
||||
set_rules = set_rules
|
||||
|
||||
def fill_slot_data(self) -> dict:
|
||||
|
||||
return {
|
||||
"storageplacements": self.storage_placements,
|
||||
"excludedlocations": {str(excluded_location).replace('ExcludeLocations(', '').replace(')', '') for excluded_location in self.multiworld.exclude_locations.values()},
|
||||
"elevatorsstaysolved": {self.options.elevators_stay_solved.value},
|
||||
"earlybeth": {self.options.early_beth.value},
|
||||
"earlylightning": {self.options.early_lightning.value},
|
||||
}
|
||||
|
||||
|
||||
class ShiversLocation(Location):
|
||||
game = "Shivers"
|
|
@ -0,0 +1,52 @@
|
|||
{
|
||||
"plaques": [
|
||||
"Information Plaque: Transforming Masks (Lobby)",
|
||||
"Information Plaque: Jade Skull (Lobby)",
|
||||
"Information Plaque: Bronze Unicorn (Prehistoric)",
|
||||
"Information Plaque: Griffin (Prehistoric)",
|
||||
"Information Plaque: Eagles Nest (Prehistoric)",
|
||||
"Information Plaque: Large Spider (Prehistoric)",
|
||||
"Information Plaque: Starfish (Prehistoric)",
|
||||
"Information Plaque: Quartz Crystal (Ocean)",
|
||||
"Information Plaque: Poseidon (Ocean)",
|
||||
"Information Plaque: Colossus of Rhodes (Ocean)",
|
||||
"Information Plaque: Poseidon's Temple (Ocean)",
|
||||
"Information Plaque: Subterranean World (Underground Maze)",
|
||||
"Information Plaque: Dero (Underground Maze)",
|
||||
"Information Plaque: Tomb of the Ixupi (Egypt)",
|
||||
"Information Plaque: The Sphinx (Egypt)",
|
||||
"Information Plaque: Curse of Anubis (Egypt)",
|
||||
"Information Plaque: Norse Burial Ship (Burial)",
|
||||
"Information Plaque: Paracas Burial Bundles (Burial)",
|
||||
"Information Plaque: Spectacular Coffins of Ghana (Burial)",
|
||||
"Information Plaque: Cremation (Burial)",
|
||||
"Information Plaque: Animal Crematorium (Burial)",
|
||||
"Information Plaque: Witch Doctors of the Congo (Tiki)",
|
||||
"Information Plaque: Sarombe doctor of Mozambique (Tiki)",
|
||||
"Information Plaque: Fisherman's Canoe God (Gods)",
|
||||
"Information Plaque: Mayan Gods (Gods)",
|
||||
"Information Plaque: Thor (Gods)",
|
||||
"Information Plaque: Celtic Janus Sculpture (Gods)",
|
||||
"Information Plaque: Sumerian Bull God - An (Gods)",
|
||||
"Information Plaque: Sumerian Lyre (Gods)",
|
||||
"Information Plaque: Chuen (Gods)",
|
||||
"Information Plaque: African Creation Myth (Anansi)",
|
||||
"Information Plaque: Apophis the Serpent (Anansi)",
|
||||
"Information Plaque: Death (Anansi)",
|
||||
"Information Plaque: Cyclops (Pegasus)",
|
||||
"Information Plaque: Lycanthropy (Werewolf)",
|
||||
"Information Plaque: Coincidence or Extraterrestrial Visits? (UFO)",
|
||||
"Information Plaque: Planets (UFO)",
|
||||
"Information Plaque: Astronomical Construction (UFO)",
|
||||
"Information Plaque: Guillotine (Torture)",
|
||||
"Information Plaque: Aliens (UFO)"
|
||||
],
|
||||
"elevators": [
|
||||
"Puzzle Solved Underground Elevator",
|
||||
"Puzzle Solved Bedroom Elevator",
|
||||
"Puzzle Solved Three Floor Elevator"
|
||||
],
|
||||
"lightning": [
|
||||
"Ixupi Captured Lightning"
|
||||
]
|
||||
}
|
|
@ -0,0 +1,325 @@
|
|||
{
|
||||
"all_locations": [
|
||||
"Puzzle Solved Gears",
|
||||
"Puzzle Solved Stone Henge",
|
||||
"Puzzle Solved Workshop Drawers",
|
||||
"Puzzle Solved Library Statue",
|
||||
"Puzzle Solved Theater Door",
|
||||
"Puzzle Solved Clock Tower Door",
|
||||
"Puzzle Solved Clock Chains",
|
||||
"Puzzle Solved Atlantis",
|
||||
"Puzzle Solved Organ",
|
||||
"Puzzle Solved Maze Door",
|
||||
"Puzzle Solved Columns of RA",
|
||||
"Puzzle Solved Burial Door",
|
||||
"Puzzle Solved Chinese Solitaire",
|
||||
"Puzzle Solved Tiki Drums",
|
||||
"Puzzle Solved Lyre",
|
||||
"Puzzle Solved Red Door",
|
||||
"Puzzle Solved Fortune Teller Door",
|
||||
"Puzzle Solved Alchemy",
|
||||
"Puzzle Solved UFO Symbols",
|
||||
"Puzzle Solved Anansi Musicbox",
|
||||
"Puzzle Solved Gallows",
|
||||
"Puzzle Solved Mastermind",
|
||||
"Puzzle Solved Marble Flipper",
|
||||
"Puzzle Solved Skull Dial Door",
|
||||
"Flashback Memory Obtained Beth's Ghost",
|
||||
"Flashback Memory Obtained Merrick's Ghost",
|
||||
"Flashback Memory Obtained Windlenot's Ghost",
|
||||
"Flashback Memory Obtained Ancient Astrology",
|
||||
"Flashback Memory Obtained Scrapbook",
|
||||
"Flashback Memory Obtained Museum Brochure",
|
||||
"Flashback Memory Obtained In Search of the Unexplained",
|
||||
"Flashback Memory Obtained Egyptian Hieroglyphics Explained",
|
||||
"Flashback Memory Obtained South American Pictographs",
|
||||
"Flashback Memory Obtained Mythology of the Stars",
|
||||
"Flashback Memory Obtained Black Book",
|
||||
"Flashback Memory Obtained Theater Movie",
|
||||
"Flashback Memory Obtained Museum Blueprints",
|
||||
"Flashback Memory Obtained Beth's Address Book",
|
||||
"Flashback Memory Obtained Merick's Notebook",
|
||||
"Flashback Memory Obtained Professor Windlenot's Diary",
|
||||
"Ixupi Captured Water",
|
||||
"Ixupi Captured Wax",
|
||||
"Ixupi Captured Ash",
|
||||
"Ixupi Captured Oil",
|
||||
"Ixupi Captured Cloth",
|
||||
"Ixupi Captured Wood",
|
||||
"Ixupi Captured Crystal",
|
||||
"Ixupi Captured Sand",
|
||||
"Ixupi Captured Metal",
|
||||
"Final Riddle: Fortune Teller",
|
||||
"Final Riddle: Planets Aligned",
|
||||
"Final Riddle: Norse God Stone Message",
|
||||
"Final Riddle: Beth's Body Page 17",
|
||||
"Final Riddle: Guillotine Dropped",
|
||||
"Puzzle Hint Found: Combo Lock in Mailbox",
|
||||
"Puzzle Hint Found: Orange Symbol",
|
||||
"Puzzle Hint Found: Silver Symbol",
|
||||
"Puzzle Hint Found: Green Symbol",
|
||||
"Puzzle Hint Found: White Symbol",
|
||||
"Puzzle Hint Found: Brown Symbol",
|
||||
"Puzzle Hint Found: Tan Symbol",
|
||||
"Puzzle Hint Found: Basilisk Bone Fragments",
|
||||
"Puzzle Hint Found: Atlantis Map",
|
||||
"Puzzle Hint Found: Sirens Song Heard",
|
||||
"Puzzle Hint Found: Egyptian Sphinx Heard",
|
||||
"Puzzle Hint Found: Gallows Information Plaque",
|
||||
"Puzzle Hint Found: Mastermind Information Plaque",
|
||||
"Puzzle Hint Found: Elevator Writing",
|
||||
"Puzzle Hint Found: Tiki Security Camera",
|
||||
"Puzzle Hint Found: Tape Recorder Heard",
|
||||
"Information Plaque: Transforming Masks (Lobby)",
|
||||
"Information Plaque: Jade Skull (Lobby)",
|
||||
"Information Plaque: Bronze Unicorn (Prehistoric)",
|
||||
"Information Plaque: Griffin (Prehistoric)",
|
||||
"Information Plaque: Eagles Nest (Prehistoric)",
|
||||
"Information Plaque: Large Spider (Prehistoric)",
|
||||
"Information Plaque: Starfish (Prehistoric)",
|
||||
"Information Plaque: Quartz Crystal (Ocean)",
|
||||
"Information Plaque: Poseidon (Ocean)",
|
||||
"Information Plaque: Colossus of Rhodes (Ocean)",
|
||||
"Information Plaque: Poseidon's Temple (Ocean)",
|
||||
"Information Plaque: Subterranean World (Underground Maze)",
|
||||
"Information Plaque: Dero (Underground Maze)",
|
||||
"Information Plaque: Tomb of the Ixupi (Egypt)",
|
||||
"Information Plaque: The Sphinx (Egypt)",
|
||||
"Information Plaque: Curse of Anubis (Egypt)",
|
||||
"Information Plaque: Norse Burial Ship (Burial)",
|
||||
"Information Plaque: Paracas Burial Bundles (Burial)",
|
||||
"Information Plaque: Spectacular Coffins of Ghana (Burial)",
|
||||
"Information Plaque: Cremation (Burial)",
|
||||
"Information Plaque: Animal Crematorium (Burial)",
|
||||
"Information Plaque: Witch Doctors of the Congo (Tiki)",
|
||||
"Information Plaque: Sarombe doctor of Mozambique (Tiki)",
|
||||
"Information Plaque: Fisherman's Canoe God (Gods)",
|
||||
"Information Plaque: Mayan Gods (Gods)",
|
||||
"Information Plaque: Thor (Gods)",
|
||||
"Information Plaque: Celtic Janus Sculpture (Gods)",
|
||||
"Information Plaque: Sumerian Bull God - An (Gods)",
|
||||
"Information Plaque: Sumerian Lyre (Gods)",
|
||||
"Information Plaque: Chuen (Gods)",
|
||||
"Information Plaque: African Creation Myth (Anansi)",
|
||||
"Information Plaque: Apophis the Serpent (Anansi)",
|
||||
"Information Plaque: Death (Anansi)",
|
||||
"Information Plaque: Cyclops (Pegasus)",
|
||||
"Information Plaque: Lycanthropy (Werewolf)",
|
||||
"Information Plaque: Coincidence or Extraterrestrial Visits? (UFO)",
|
||||
"Information Plaque: Planets (UFO)",
|
||||
"Information Plaque: Astronomical Construction (UFO)",
|
||||
"Information Plaque: Guillotine (Torture)",
|
||||
"Information Plaque: Aliens (UFO)",
|
||||
"Puzzle Solved Underground Elevator",
|
||||
"Puzzle Solved Bedroom Elevator",
|
||||
"Puzzle Solved Three Floor Elevator",
|
||||
"Ixupi Captured Lightning"
|
||||
],
|
||||
"locations_by_region": {
|
||||
"Outside": [
|
||||
"Puzzle Solved Gears",
|
||||
"Puzzle Solved Stone Henge",
|
||||
"Ixupi Captured Water",
|
||||
"Ixupi Captured Wax",
|
||||
"Ixupi Captured Ash",
|
||||
"Ixupi Captured Oil",
|
||||
"Ixupi Captured Cloth",
|
||||
"Ixupi Captured Wood",
|
||||
"Ixupi Captured Crystal",
|
||||
"Ixupi Captured Sand",
|
||||
"Ixupi Captured Metal",
|
||||
"Ixupi Captured Lightning",
|
||||
"Puzzle Solved Underground Elevator",
|
||||
"Puzzle Solved Three Floor Elevator",
|
||||
"Puzzle Hint Found: Combo Lock in Mailbox",
|
||||
"Puzzle Hint Found: Orange Symbol",
|
||||
"Puzzle Hint Found: Silver Symbol",
|
||||
"Puzzle Hint Found: Green Symbol",
|
||||
"Puzzle Hint Found: White Symbol",
|
||||
"Puzzle Hint Found: Brown Symbol",
|
||||
"Puzzle Hint Found: Tan Symbol"
|
||||
],
|
||||
"Underground Lake": [
|
||||
"Flashback Memory Obtained Windlenot's Ghost",
|
||||
"Flashback Memory Obtained Egyptian Hieroglyphics Explained"
|
||||
],
|
||||
"Office": [
|
||||
"Flashback Memory Obtained Scrapbook",
|
||||
"Accessible: Storage: Desk Drawer",
|
||||
"Puzzle Hint Found: Atlantis Map",
|
||||
"Puzzle Hint Found: Tape Recorder Heard",
|
||||
"Puzzle Solved Bedroom Elevator"
|
||||
],
|
||||
"Workshop": [
|
||||
"Puzzle Solved Workshop Drawers",
|
||||
"Accessible: Storage: Workshop Drawers",
|
||||
"Puzzle Hint Found: Basilisk Bone Fragments"
|
||||
],
|
||||
"Bedroom": [
|
||||
"Flashback Memory Obtained Professor Windlenot's Diary"
|
||||
],
|
||||
"Library": [
|
||||
"Puzzle Solved Library Statue",
|
||||
"Flashback Memory Obtained In Search of the Unexplained",
|
||||
"Flashback Memory Obtained South American Pictographs",
|
||||
"Flashback Memory Obtained Mythology of the Stars",
|
||||
"Flashback Memory Obtained Black Book",
|
||||
"Accessible: Storage: Library Cabinet",
|
||||
"Accessible: Storage: Library Statue"
|
||||
],
|
||||
"Maintenance Tunnels": [
|
||||
"Flashback Memory Obtained Beth's Address Book"
|
||||
],
|
||||
"Three Floor Elevator": [
|
||||
"Puzzle Hint Found: Elevator Writing"
|
||||
],
|
||||
"Lobby": [
|
||||
"Puzzle Solved Theater Door",
|
||||
"Flashback Memory Obtained Museum Brochure",
|
||||
"Information Plaque: Jade Skull (Lobby)",
|
||||
"Information Plaque: Transforming Masks (Lobby)",
|
||||
"Accessible: Storage: Slide",
|
||||
"Accessible: Storage: Eagles Head"
|
||||
],
|
||||
"Generator": [
|
||||
"Final Riddle: Beth's Body Page 17"
|
||||
],
|
||||
"Theater Back Hallways": [
|
||||
"Puzzle Solved Clock Tower Door"
|
||||
],
|
||||
"Clock Tower Staircase": [
|
||||
"Puzzle Solved Clock Chains"
|
||||
],
|
||||
"Clock Tower": [
|
||||
"Flashback Memory Obtained Beth's Ghost",
|
||||
"Accessible: Storage: Clock Tower",
|
||||
"Puzzle Hint Found: Tiki Security Camera"
|
||||
],
|
||||
"Projector Room": [
|
||||
"Flashback Memory Obtained Theater Movie"
|
||||
],
|
||||
"Ocean": [
|
||||
"Puzzle Solved Atlantis",
|
||||
"Puzzle Solved Organ",
|
||||
"Flashback Memory Obtained Museum Blueprints",
|
||||
"Accessible: Storage: Ocean",
|
||||
"Puzzle Hint Found: Sirens Song Heard",
|
||||
"Information Plaque: Quartz Crystal (Ocean)",
|
||||
"Information Plaque: Poseidon (Ocean)",
|
||||
"Information Plaque: Colossus of Rhodes (Ocean)",
|
||||
"Information Plaque: Poseidon's Temple (Ocean)"
|
||||
],
|
||||
"Maze Staircase": [
|
||||
"Puzzle Solved Maze Door"
|
||||
],
|
||||
"Egypt": [
|
||||
"Puzzle Solved Columns of RA",
|
||||
"Puzzle Solved Burial Door",
|
||||
"Accessible: Storage: Egypt",
|
||||
"Puzzle Hint Found: Egyptian Sphinx Heard",
|
||||
"Information Plaque: Tomb of the Ixupi (Egypt)",
|
||||
"Information Plaque: The Sphinx (Egypt)",
|
||||
"Information Plaque: Curse of Anubis (Egypt)"
|
||||
],
|
||||
"Burial": [
|
||||
"Puzzle Solved Chinese Solitaire",
|
||||
"Flashback Memory Obtained Merick's Notebook",
|
||||
"Accessible: Storage: Chinese Solitaire",
|
||||
"Information Plaque: Norse Burial Ship (Burial)",
|
||||
"Information Plaque: Paracas Burial Bundles (Burial)",
|
||||
"Information Plaque: Spectacular Coffins of Ghana (Burial)",
|
||||
"Information Plaque: Animal Crematorium (Burial)",
|
||||
"Information Plaque: Cremation (Burial)"
|
||||
],
|
||||
"Tiki": [
|
||||
"Puzzle Solved Tiki Drums",
|
||||
"Accessible: Storage: Tiki Hut",
|
||||
"Information Plaque: Witch Doctors of the Congo (Tiki)",
|
||||
"Information Plaque: Sarombe doctor of Mozambique (Tiki)"
|
||||
],
|
||||
"Gods Room": [
|
||||
"Puzzle Solved Lyre",
|
||||
"Puzzle Solved Red Door",
|
||||
"Accessible: Storage: Lyre",
|
||||
"Final Riddle: Norse God Stone Message",
|
||||
"Information Plaque: Fisherman's Canoe God (Gods)",
|
||||
"Information Plaque: Mayan Gods (Gods)",
|
||||
"Information Plaque: Thor (Gods)",
|
||||
"Information Plaque: Celtic Janus Sculpture (Gods)",
|
||||
"Information Plaque: Sumerian Bull God - An (Gods)",
|
||||
"Information Plaque: Sumerian Lyre (Gods)",
|
||||
"Information Plaque: Chuen (Gods)"
|
||||
],
|
||||
"Blue Maze": [
|
||||
"Puzzle Solved Fortune Teller Door"
|
||||
],
|
||||
"Fortune Teller": [
|
||||
"Flashback Memory Obtained Merrick's Ghost",
|
||||
"Final Riddle: Fortune Teller"
|
||||
],
|
||||
"Inventions": [
|
||||
"Puzzle Solved Alchemy",
|
||||
"Accessible: Storage: Alchemy"
|
||||
],
|
||||
"UFO": [
|
||||
"Puzzle Solved UFO Symbols",
|
||||
"Accessible: Storage: UFO",
|
||||
"Final Riddle: Planets Aligned",
|
||||
"Information Plaque: Coincidence or Extraterrestrial Visits? (UFO)",
|
||||
"Information Plaque: Planets (UFO)",
|
||||
"Information Plaque: Astronomical Construction (UFO)",
|
||||
"Information Plaque: Aliens (UFO)"
|
||||
],
|
||||
"Anansi": [
|
||||
"Puzzle Solved Anansi Musicbox",
|
||||
"Flashback Memory Obtained Ancient Astrology",
|
||||
"Accessible: Storage: Skeleton",
|
||||
"Accessible: Storage: Anansi",
|
||||
"Information Plaque: African Creation Myth (Anansi)",
|
||||
"Information Plaque: Apophis the Serpent (Anansi)",
|
||||
"Information Plaque: Death (Anansi)",
|
||||
"Information Plaque: Cyclops (Pegasus)",
|
||||
"Information Plaque: Lycanthropy (Werewolf)"
|
||||
],
|
||||
"Torture": [
|
||||
"Puzzle Solved Gallows",
|
||||
"Accessible: Storage: Hanging",
|
||||
"Final Riddle: Guillotine Dropped",
|
||||
"Puzzle Hint Found: Gallows Information Plaque",
|
||||
"Information Plaque: Guillotine (Torture)"
|
||||
],
|
||||
"Puzzle Room Mastermind": [
|
||||
"Puzzle Solved Mastermind",
|
||||
"Puzzle Hint Found: Mastermind Information Plaque"
|
||||
],
|
||||
"Puzzle Room Marbles": [
|
||||
"Puzzle Solved Marble Flipper"
|
||||
],
|
||||
"Prehistoric": [
|
||||
"Information Plaque: Bronze Unicorn (Prehistoric)",
|
||||
"Information Plaque: Griffin (Prehistoric)",
|
||||
"Information Plaque: Eagles Nest (Prehistoric)",
|
||||
"Information Plaque: Large Spider (Prehistoric)",
|
||||
"Information Plaque: Starfish (Prehistoric)",
|
||||
"Accessible: Storage: Eagles Nest"
|
||||
],
|
||||
"Tar River": [
|
||||
"Accessible: Storage: Tar River",
|
||||
"Information Plaque: Subterranean World (Underground Maze)",
|
||||
"Information Plaque: Dero (Underground Maze)"
|
||||
],
|
||||
"Theater": [
|
||||
"Accessible: Storage: Theater"
|
||||
],
|
||||
"Greenhouse": [
|
||||
"Accessible: Storage: Greenhouse"
|
||||
],
|
||||
"Janitor Closet": [
|
||||
"Accessible: Storage: Janitor Closet"
|
||||
],
|
||||
"Skull Dial Bridge": [
|
||||
"Accessible: Storage: Skull Bridge",
|
||||
"Puzzle Solved Skull Dial Door"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,145 @@
|
|||
{
|
||||
"regions": [
|
||||
["Menu", ["To Registry"]],
|
||||
["Registry", ["To Outside From Registry"]],
|
||||
["Outside", ["To Underground Tunnels From Outside", "To Lobby From Outside"]],
|
||||
["Underground Tunnels", ["To Underground Lake From Underground Tunnels", "To Outside From Underground"]],
|
||||
["Underground Lake", ["To Underground Tunnels From Underground Lake", "To Underground Blue Tunnels From Underground Lake"]],
|
||||
["Underground Blue Tunnels", ["To Underground Lake From Underground Blue Tunnels", "To Office Elevator From Underground Blue Tunnels"]],
|
||||
["Office Elevator", ["To Underground Blue Tunnels From Office Elevator","To Office From Office Elevator"]],
|
||||
["Office", ["To Office Elevator From Office", "To Workshop", "To Lobby From Office", "To Bedroom Elevator From Office"]],
|
||||
["Workshop", ["To Office From Workshop"]],
|
||||
["Bedroom Elevator", ["To Office From Bedroom Elevator", "To Bedroom"]],
|
||||
["Bedroom", ["To Bedroom Elevator From Bedroom"]],
|
||||
["Lobby", ["To Office From Lobby", "To Library From Lobby", "To Theater From Lobby", "To Prehistoric From Lobby", "To Egypt From Lobby", "To Tar River From Lobby", "To Outside From Lobby"]],
|
||||
["Library", ["To Lobby From Library", "To Maintenance Tunnels From Library"]],
|
||||
["Maintenance Tunnels", ["To Library From Maintenance Tunnels", "To Three Floor Elevator From Maintenance Tunnels", "To Generator"]],
|
||||
["Generator", ["To Maintenance Tunnels From Generator"]],
|
||||
["Theater", ["To Lobby From Theater", "To Theater Back Hallways From Theater"]],
|
||||
["Theater Back Hallways", ["To Theater From Theater Back Hallways", "To Clock Tower Staircase From Theater Back Hallways", "To Maintenance Tunnels From Theater Back Hallways", "To Projector Room"]],
|
||||
["Clock Tower Staircase", ["To Theater Back Hallways From Clock Tower Staircase", "To Clock Tower"]],
|
||||
["Clock Tower", ["To Clock Tower Staircase From Clock Tower"]],
|
||||
["Projector Room", ["To Theater Back Hallways From Projector Room"]],
|
||||
["Prehistoric", ["To Lobby From Prehistoric", "To Greenhouse", "To Ocean From Prehistoric"]],
|
||||
["Greenhouse", ["To Prehistoric From Greenhouse"]],
|
||||
["Ocean", ["To Prehistoric From Ocean", "To Maze Staircase From Ocean"]],
|
||||
["Maze Staircase", ["To Ocean From Maze Staircase", "To Maze From Maze Staircase"]],
|
||||
["Maze", ["To Maze Staircase From Maze", "To Tar River"]],
|
||||
["Tar River", ["To Maze From Tar River", "To Lobby From Tar River"]],
|
||||
["Egypt", ["To Lobby From Egypt", "To Burial From Egypt", "To Blue Maze From Egypt"]],
|
||||
["Burial", ["To Egypt From Burial", "To Tiki From Burial"]],
|
||||
["Tiki", ["To Burial From Tiki", "To Gods Room"]],
|
||||
["Gods Room", ["To Tiki From Gods Room", "To Anansi From Gods Room"]],
|
||||
["Anansi", ["To Gods Room From Anansi", "To Werewolf From Anansi"]],
|
||||
["Werewolf", ["To Anansi From Werewolf", "To Night Staircase From Werewolf"]],
|
||||
["Night Staircase", ["To Werewolf From Night Staircase", "To Janitor Closet", "To UFO"]],
|
||||
["Janitor Closet", ["To Night Staircase From Janitor Closet"]],
|
||||
["UFO", ["To Night Staircase From UFO", "To Inventions From UFO"]],
|
||||
["Blue Maze", ["To Egypt From Blue Maze", "To Three Floor Elevator From Blue Maze Bottom", "To Three Floor Elevator From Blue Maze Top", "To Fortune Teller", "To Inventions From Blue Maze"]],
|
||||
["Three Floor Elevator", ["To Maintenance Tunnels From Three Floor Elevator", "To Blue Maze From Three Floor Elevator"]],
|
||||
["Fortune Teller", ["To Blue Maze From Fortune Teller"]],
|
||||
["Inventions", ["To Blue Maze From Inventions", "To UFO From Inventions", "To Torture From Inventions"]],
|
||||
["Torture", ["To Inventions From Torture", "To Puzzle Room Mastermind From Torture"]],
|
||||
["Puzzle Room Mastermind", ["To Torture", "To Puzzle Room Marbles From Puzzle Room Mastermind"]],
|
||||
["Puzzle Room Marbles", ["To Puzzle Room Mastermind From Puzzle Room Marbles", "To Skull Dial Bridge From Puzzle Room Marbles"]],
|
||||
["Skull Dial Bridge", ["To Puzzle Room Marbles From Skull Dial Bridge", "To Slide Room"]],
|
||||
["Slide Room", ["To Skull Dial Bridge From Slide Room", "To Lobby From Slide Room"]]
|
||||
],
|
||||
"mandatory_connections": [
|
||||
["To Registry", "Registry"],
|
||||
["To Outside From Registry", "Outside"],
|
||||
["To Outside From Underground", "Outside"],
|
||||
["To Outside From Lobby", "Outside"],
|
||||
["To Underground Tunnels From Outside", "Underground Tunnels"],
|
||||
["To Underground Tunnels From Underground Lake", "Underground Tunnels"],
|
||||
["To Underground Lake From Underground Tunnels", "Underground Lake"],
|
||||
["To Underground Lake From Underground Blue Tunnels", "Underground Lake"],
|
||||
["To Underground Blue Tunnels From Underground Lake", "Underground Blue Tunnels"],
|
||||
["To Underground Blue Tunnels From Office Elevator", "Underground Blue Tunnels"],
|
||||
["To Office Elevator From Underground Blue Tunnels", "Office Elevator"],
|
||||
["To Office Elevator From Office", "Office Elevator"],
|
||||
["To Office From Office Elevator", "Office"],
|
||||
["To Office From Workshop", "Office"],
|
||||
["To Office From Bedroom Elevator", "Office"],
|
||||
["To Office From Lobby", "Office"],
|
||||
["To Workshop", "Workshop"],
|
||||
["To Lobby From Office", "Lobby"],
|
||||
["To Lobby From Library", "Lobby"],
|
||||
["To Lobby From Tar River", "Lobby"],
|
||||
["To Lobby From Slide Room", "Lobby"],
|
||||
["To Lobby From Egypt", "Lobby"],
|
||||
["To Lobby From Theater", "Lobby"],
|
||||
["To Lobby From Prehistoric", "Lobby"],
|
||||
["To Lobby From Outside", "Lobby"],
|
||||
["To Bedroom Elevator From Office", "Bedroom Elevator"],
|
||||
["To Bedroom Elevator From Bedroom", "Bedroom Elevator"],
|
||||
["To Bedroom", "Bedroom"],
|
||||
["To Library From Lobby", "Library"],
|
||||
["To Library From Maintenance Tunnels", "Library"],
|
||||
["To Theater From Lobby", "Theater" ],
|
||||
["To Theater From Theater Back Hallways", "Theater"],
|
||||
["To Prehistoric From Lobby", "Prehistoric"],
|
||||
["To Prehistoric From Greenhouse", "Prehistoric"],
|
||||
["To Prehistoric From Ocean", "Prehistoric"],
|
||||
["To Egypt From Lobby", "Egypt"],
|
||||
["To Egypt From Burial", "Egypt"],
|
||||
["To Egypt From Blue Maze", "Egypt"],
|
||||
["To Maintenance Tunnels From Generator", "Maintenance Tunnels"],
|
||||
["To Maintenance Tunnels From Three Floor Elevator", "Maintenance Tunnels"],
|
||||
["To Maintenance Tunnels From Library", "Maintenance Tunnels"],
|
||||
["To Maintenance Tunnels From Theater Back Hallways", "Maintenance Tunnels"],
|
||||
["To Three Floor Elevator From Maintenance Tunnels", "Three Floor Elevator"],
|
||||
["To Three Floor Elevator From Blue Maze Bottom", "Three Floor Elevator"],
|
||||
["To Three Floor Elevator From Blue Maze Top", "Three Floor Elevator"],
|
||||
["To Generator", "Generator"],
|
||||
["To Theater Back Hallways From Theater", "Theater Back Hallways"],
|
||||
["To Theater Back Hallways From Clock Tower Staircase", "Theater Back Hallways"],
|
||||
["To Theater Back Hallways From Projector Room", "Theater Back Hallways"],
|
||||
["To Clock Tower Staircase From Theater Back Hallways", "Clock Tower Staircase"],
|
||||
["To Clock Tower Staircase From Clock Tower", "Clock Tower Staircase"],
|
||||
["To Projector Room", "Projector Room"],
|
||||
["To Clock Tower", "Clock Tower"],
|
||||
["To Greenhouse", "Greenhouse"],
|
||||
["To Ocean From Prehistoric", "Ocean"],
|
||||
["To Ocean From Maze Staircase", "Ocean"],
|
||||
["To Maze Staircase From Ocean", "Maze Staircase"],
|
||||
["To Maze Staircase From Maze", "Maze Staircase"],
|
||||
["To Maze From Maze Staircase", "Maze"],
|
||||
["To Maze From Tar River", "Maze"],
|
||||
["To Tar River", "Tar River"],
|
||||
["To Tar River From Lobby", "Tar River"],
|
||||
["To Burial From Egypt", "Burial"],
|
||||
["To Burial From Tiki", "Burial"],
|
||||
["To Blue Maze From Three Floor Elevator", "Blue Maze"],
|
||||
["To Blue Maze From Fortune Teller", "Blue Maze"],
|
||||
["To Blue Maze From Inventions", "Blue Maze"],
|
||||
["To Blue Maze From Egypt", "Blue Maze"],
|
||||
["To Tiki From Burial", "Tiki"],
|
||||
["To Tiki From Gods Room", "Tiki"],
|
||||
["To Gods Room", "Gods Room" ],
|
||||
["To Gods Room From Anansi", "Gods Room"],
|
||||
["To Anansi From Gods Room", "Anansi"],
|
||||
["To Anansi From Werewolf", "Anansi"],
|
||||
["To Werewolf From Anansi", "Werewolf"],
|
||||
["To Werewolf From Night Staircase", "Werewolf"],
|
||||
["To Night Staircase From Werewolf", "Night Staircase"],
|
||||
["To Night Staircase From Janitor Closet", "Night Staircase"],
|
||||
["To Night Staircase From UFO", "Night Staircase"],
|
||||
["To Janitor Closet", "Janitor Closet"],
|
||||
["To UFO", "UFO"],
|
||||
["To UFO From Inventions", "UFO"],
|
||||
["To Inventions From UFO", "Inventions"],
|
||||
["To Inventions From Blue Maze", "Inventions"],
|
||||
["To Inventions From Torture", "Inventions"],
|
||||
["To Fortune Teller", "Fortune Teller"],
|
||||
["To Torture", "Torture"],
|
||||
["To Torture From Inventions", "Torture"],
|
||||
["To Puzzle Room Mastermind From Torture", "Puzzle Room Mastermind"],
|
||||
["To Puzzle Room Mastermind From Puzzle Room Marbles", "Puzzle Room Mastermind"],
|
||||
["To Puzzle Room Marbles From Puzzle Room Mastermind", "Puzzle Room Marbles"],
|
||||
["To Puzzle Room Marbles From Skull Dial Bridge", "Puzzle Room Marbles"],
|
||||
["To Skull Dial Bridge From Puzzle Room Marbles", "Skull Dial Bridge"],
|
||||
["To Skull Dial Bridge From Slide Room", "Skull Dial Bridge"],
|
||||
["To Slide Room", "Slide Room"]
|
||||
]
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
# Shivers
|
||||
|
||||
## Where is the settings page?
|
||||
|
||||
The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
|
||||
configuration file.
|
||||
|
||||
## What does randomization do to this game?
|
||||
|
||||
All Ixupi pot pieces are randomized. Keys have been added to the game to lock off different rooms in the museum,
|
||||
these are randomized. Crawling has been added and is required to use any crawl space.
|
||||
|
||||
## What is considered a location check in Shivers?
|
||||
|
||||
1. All puzzle solves are location checks excluding elevator puzzles.
|
||||
2. All Ixupi captures are location checks excluding Lightning.
|
||||
3. Puzzle hints/solutions are location checks. For example, looking at the Atlantis map.
|
||||
4. Optionally information plaques are location checks.
|
||||
|
||||
## When the player receives an item, what happens?
|
||||
|
||||
If the player receives a key then the corresponding door will be unlocked. If the player receives a pot piece, it is placed into a pot piece storage location.
|
||||
|
||||
## What is the victory condition?
|
||||
|
||||
Victory is achieved when the player captures Lightning in the generator room.
|
||||
|
||||
## Encountered a bug?
|
||||
|
||||
Please contact GodlFire on Discord for bugs related to Shivers world generation.\
|
||||
Please contact GodlFire or mouse on Discord for bugs related to the Shivers Randomizer.
|
|
@ -0,0 +1,60 @@
|
|||
# Shivers Randomizer Setup Guide
|
||||
|
||||
|
||||
## Required Software
|
||||
|
||||
- [Shivers (GOG version)](https://www.gog.com/en/game/shivers) or original disc
|
||||
- [ScummVM](https://www.scummvm.org/downloads/) version 2.7.0 or later
|
||||
- [Shivers Randomizer](https://www.speedrun.com/shivers/resources)
|
||||
|
||||
## Setup ScummVM for Shivers
|
||||
|
||||
### GOG version of Shivers
|
||||
|
||||
1. Launch ScummVM
|
||||
2. Click Add Game...
|
||||
3. Locate the folder for Shivers (typically in GOG Galaxy\Games\Shivers)
|
||||
4. Click OK
|
||||
|
||||
### Disc copy of Shivers
|
||||
|
||||
1. Copy contents of Shivers disc to a desired location on your computer
|
||||
2. Launch ScummVM
|
||||
3. Click Add Game...
|
||||
4. Locate the folder for Shivers and click Choose
|
||||
5. Click OK
|
||||
|
||||
## Create a Config (.yaml) File
|
||||
|
||||
### What is a config file and why do I need one?
|
||||
|
||||
See the guide on setting up a basic YAML at the Archipelago setup
|
||||
guide: [Basic Multiworld Setup Guide](/tutorial/Archipelago/setup/en)
|
||||
|
||||
### Where do I get a config file?
|
||||
|
||||
The Player Settings page on the website allows you to configure your personal settings and export a config file from
|
||||
them. Player settings page: [Shivers Player Settings Page](/games/Shivers/player-settings)
|
||||
|
||||
### Verifying your config file
|
||||
|
||||
If you would like to validate your config file to make sure it works, you may do so on the YAML Validator page. YAML
|
||||
validator page: [YAML Validation page](/mysterycheck)
|
||||
|
||||
## Joining a MultiWorld Game
|
||||
|
||||
1. Launch ScummVM
|
||||
2. Highlight Shivers and click "Start"
|
||||
3. Launch the Shivers Randomizer
|
||||
4. Click "Attach"
|
||||
5. Click "Archipelago"
|
||||
6. Enter the Archipelago server address, slot name, and password
|
||||
7. Click "Connect"
|
||||
8. In Shivers click "New Game"
|
||||
|
||||
## What is a check
|
||||
|
||||
- Every puzzle
|
||||
- Every puzzle hint/solution
|
||||
- Every document that is considered a Flashback
|
||||
- Optionally information plaques.
|
Loading…
Reference in New Issue