mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-29 15:23:01 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fae9add351 |
@@ -610,6 +610,7 @@ if (DUSK_ENABLE_CODE_MODS AND CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR
|
||||
add_subdirectory(mods/template_mod)
|
||||
add_subdirectory(mods/ao_mod)
|
||||
add_subdirectory(mods/shadow_mod)
|
||||
add_subdirectory(mods/randomizer)
|
||||
endif ()
|
||||
|
||||
if (APPLE)
|
||||
|
||||
Vendored
+1
-1
Submodule extern/aurora updated: 81f12f31d2...2bbb1229a9
@@ -47,7 +47,7 @@ public:
|
||||
s32 getBgmLoadStatus(u32 wave) { return getWaveLoadStatus(wave, 1); }
|
||||
u8 getDemoSeWaveNum() { return loadedDemoWave; }
|
||||
|
||||
private:
|
||||
// private:
|
||||
/* 0x00 */ JAISoundID BGM_ID;
|
||||
/* 0x04 */ int sceneNum;
|
||||
/* 0x08 */ int timer;
|
||||
|
||||
@@ -1291,6 +1291,7 @@ public:
|
||||
}
|
||||
void set(const char*, s8, s16, s8, s8, u8);
|
||||
void offEnable() { enabled = 0; }
|
||||
void onEnable() { enabled = 1; }
|
||||
BOOL isEnable() const { return enabled; }
|
||||
s8 getWipe() const { return wipe; }
|
||||
u8 getWipeSpeed() const { return wipe_speed; }
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
project(randomizer CXX)
|
||||
|
||||
if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||
set(DUSK_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../.." CACHE PATH "Path to dusk source root")
|
||||
option(DUSK_MOD_USE_FULL_TREE "Use full build instead of the minimal mod SDK" OFF)
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
if (DUSK_MOD_USE_FULL_TREE)
|
||||
add_subdirectory("${DUSK_DIR}" dusk EXCLUDE_FROM_ALL)
|
||||
else ()
|
||||
add_subdirectory("${DUSK_DIR}/sdk" dusk-sdk EXCLUDE_FROM_ALL)
|
||||
endif ()
|
||||
endif ()
|
||||
|
||||
# Generator dependencies, linked statically into the mod library (no CRT crossing).
|
||||
include(FetchContent)
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
set(YAML_CPP_BUILD_TOOLS OFF CACHE BOOL "" FORCE)
|
||||
set(YAML_CPP_BUILD_CONTRIB OFF CACHE BOOL "" FORCE)
|
||||
set(YAML_BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
|
||||
|
||||
message(STATUS "randomizer: Fetching yaml-cpp")
|
||||
FetchContent_Declare(
|
||||
yaml-cpp
|
||||
GIT_REPOSITORY https://github.com/jbeder/yaml-cpp.git
|
||||
GIT_TAG yaml-cpp-0.9.0
|
||||
)
|
||||
message(STATUS "randomizer: Fetching base64pp")
|
||||
FetchContent_Declare(
|
||||
base64pp
|
||||
GIT_REPOSITORY https://github.com/matheusgomes28/base64pp.git
|
||||
GIT_TAG v0.2.0-rc0
|
||||
)
|
||||
|
||||
message(STATUS "randomizer: Fetching battery-embed")
|
||||
FetchContent_Declare(
|
||||
battery-embed
|
||||
GIT_REPOSITORY https://github.com/batterycenter/embed.git
|
||||
GIT_TAG fdbae3f
|
||||
)
|
||||
|
||||
FetchContent_MakeAvailable(yaml-cpp base64pp battery-embed)
|
||||
|
||||
set(RANDOMIZER_GENERATOR_SOURCES
|
||||
generator/logic/area.cpp
|
||||
generator/logic/dungeon.cpp
|
||||
generator/logic/entrance.cpp
|
||||
generator/logic/entrance_shuffle.cpp
|
||||
generator/logic/fill.cpp
|
||||
generator/logic/flatten/bits.cpp
|
||||
generator/logic/flatten/flatten.cpp
|
||||
generator/logic/flatten/simplify_algebraic.cpp
|
||||
generator/logic/hints.cpp
|
||||
generator/logic/item.cpp
|
||||
generator/logic/item_pool.cpp
|
||||
generator/logic/location.cpp
|
||||
generator/logic/plandomizer.cpp
|
||||
generator/logic/requirement.cpp
|
||||
generator/logic/search.cpp
|
||||
generator/logic/spoiler_log.cpp
|
||||
generator/logic/world.cpp
|
||||
generator/randomizer.cpp
|
||||
generator/seedgen/config.cpp
|
||||
generator/seedgen/seed.cpp
|
||||
generator/seedgen/settings.cpp
|
||||
generator/utility/color.cpp
|
||||
generator/utility/common.cpp
|
||||
generator/utility/endian.cpp
|
||||
generator/utility/file.cpp
|
||||
generator/utility/log.cpp
|
||||
generator/utility/path.cpp
|
||||
generator/utility/platform.cpp
|
||||
generator/utility/random.cpp
|
||||
generator/utility/string.cpp
|
||||
generator/utility/text.cpp
|
||||
generator/utility/time.cpp
|
||||
)
|
||||
|
||||
set(RANDOMIZER_SOURCES
|
||||
src/flags.cpp
|
||||
src/messages.cpp
|
||||
src/randomizer_context.cpp
|
||||
src/stages.cpp
|
||||
src/tools.cpp
|
||||
src/verify_item_functions.cpp
|
||||
src/paths.cpp
|
||||
src/session.cpp
|
||||
)
|
||||
|
||||
add_mod(randomizer
|
||||
FEATURES game
|
||||
SOURCES src/mod.cpp ${RANDOMIZER_GENERATOR_SOURCES} ${RANDOMIZER_SOURCES}
|
||||
MOD_JSON mod.json
|
||||
RES_DIR res
|
||||
)
|
||||
|
||||
target_link_libraries(randomizer PRIVATE yaml-cpp::yaml-cpp base64pp fmt::fmt)
|
||||
|
||||
string(LENGTH "${CMAKE_CURRENT_SOURCE_DIR}/" RANDOMIZER_SOURCE_PATH_SIZE)
|
||||
target_compile_definitions(randomizer PRIVATE
|
||||
RANDO_DATA_PATH="generator/data/"
|
||||
SOURCE_PATH_SIZE=${RANDOMIZER_SOURCE_PATH_SIZE}
|
||||
)
|
||||
|
||||
# Embed the generator's YAML data into the mod library. Paths are relative to this
|
||||
# directory and must match the RANDO_DATA_PATH-based b::embed<> identifiers in code.
|
||||
file(GLOB_RECURSE RANDOMIZER_DATA RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/generator/data/*")
|
||||
b_embed(randomizer "res/shadow_crystal.bti")
|
||||
foreach (RANDOMIZER_FILE IN LISTS RANDOMIZER_DATA)
|
||||
if (RANDOMIZER_FILE MATCHES "^generator/data/tests")
|
||||
continue()
|
||||
endif ()
|
||||
b_embed(randomizer "${RANDOMIZER_FILE}")
|
||||
endforeach ()
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,486 @@
|
||||
# Patches for NPC text flows
|
||||
|
||||
# NOTE: All data is expressed in little endian
|
||||
|
||||
0: # zel_00.bmg
|
||||
# Change the following indices of Midna's flows to jump to our custom choices
|
||||
# instead. These are all the flow jumps that normally determine which "Talk to Midna"
|
||||
# text is displayed.
|
||||
- index:
|
||||
- 0x1
|
||||
- 0x9
|
||||
- 0xC
|
||||
- 0x8F
|
||||
- 0x192
|
||||
- 0x1A4
|
||||
- 0x18F
|
||||
- 0x197
|
||||
- 0x1BC
|
||||
- 0x1C9
|
||||
type: event
|
||||
event: 42
|
||||
parameters: 0x00000000
|
||||
next node index: Custom Midna Call Begin
|
||||
|
||||
#1: # zel_01.bmg
|
||||
2: # zel_02.bmg
|
||||
# Patch Barnes branch to see if you can buy the bomb bag to use
|
||||
# query 54 (custom event check) instead of query 22 (how many bomb bags the player has)
|
||||
- index: 0x47C
|
||||
type: branch
|
||||
num results: 2
|
||||
query: 53
|
||||
parameters: 0x004D
|
||||
next node index: 0x340
|
||||
|
||||
#3: # zel_03.bmg
|
||||
4: # zel_04.bmg - Castle Town
|
||||
# Patch Charlo to check for 100 rupees instead of 30
|
||||
- index: 0x34A
|
||||
type: branch
|
||||
num results: 2
|
||||
query: 6
|
||||
parameters: 0x0064
|
||||
next node index: 0x222
|
||||
# Patch Charlo to take 100 rupees from Link instead of 30
|
||||
- index: 0x34E
|
||||
type: event
|
||||
event: 41
|
||||
parameters: 0x00000064
|
||||
next node index: 0x226
|
||||
# Patch Charlo to add 100 rupees to his counter instead of 30
|
||||
- index: 0x357
|
||||
type: event
|
||||
event: 3
|
||||
parameters: 0x00000064
|
||||
next node index: 0x22B
|
||||
# Patch Malo Mart door person to not check for time of day.
|
||||
# Change from branch node that checks time of day to event node
|
||||
# that does nothing.
|
||||
- index: 0x1A5
|
||||
type: event
|
||||
event: 42
|
||||
parameters: 0x00000000
|
||||
next node index: 0x10C
|
||||
|
||||
5: # zel_05.bmg
|
||||
# Patch Yeta flow to always give the map check even if the player has obtained the Ordon Cheese
|
||||
- index: 0x8
|
||||
type: event
|
||||
event: 42
|
||||
parameters: 0x00000000
|
||||
next node index: 0x8
|
||||
|
||||
# Patch Yeta flow to always give the map check even if the player has obtained the Ordon Cheese
|
||||
- index: 0x5
|
||||
type: event
|
||||
event: 42
|
||||
parameters: 0x00000000
|
||||
next node index: 0x3
|
||||
|
||||
# Patch Gor Liggs to not set the flag for the third key shard
|
||||
# Change event index 17 to event index 42 which does nothing
|
||||
- index: 0x258
|
||||
type: event
|
||||
event: 42
|
||||
parameters: 0x00000000
|
||||
next node index: 0x1AC
|
||||
|
||||
#6: # zel_06.bmg
|
||||
#7: # zel_07.bmg
|
||||
#8: # zel_08.bmg
|
||||
|
||||
# Custom Flow Nodes
|
||||
9:
|
||||
# Start of custom midna call tree. Begin by checking if we can change time
|
||||
# of day to see if we show that choice
|
||||
- name: Custom Midna Call Begin
|
||||
type: branch
|
||||
num results: 2
|
||||
query: 54
|
||||
parameters: 0x0000
|
||||
next node index: 0xFFFF
|
||||
results:
|
||||
- Custom Midna Call 3 Choice Select Setup # Can change time of day
|
||||
- Custom Midna Call 2 Choice Select Setup # Can not change time of day
|
||||
|
||||
#################################################
|
||||
# CUSTOM MIDNA CALL 2 CHOICE FLOW #
|
||||
#################################################
|
||||
|
||||
- name: Custom Midna Call 2 Choice Select Setup
|
||||
type: event
|
||||
event: 13
|
||||
parameters: 0x00000003
|
||||
next node index: Custom Midna Call 2 Choice Intro
|
||||
|
||||
- name: Custom Midna Call 2 Choice Intro
|
||||
type: message
|
||||
inf index: Custom Midna Call Need Something Text
|
||||
next flow index: Custom Midna Call 2 Choice
|
||||
|
||||
- name: Custom Midna Call 2 Choice
|
||||
type: message
|
||||
inf index: Custom Midna Call 2 Choice Text
|
||||
next flow index: Custom Midna Call 2 Choice Branch
|
||||
|
||||
- name: Custom Midna Call 2 Choice Branch
|
||||
type: branch
|
||||
num results: 3
|
||||
query: 35
|
||||
parameters: 0x0000
|
||||
next node index: 0xFFFF
|
||||
results:
|
||||
- Custom Midna Call Hints # Hints
|
||||
- Custom Midna Call Return to Spawn Branch # Return to Spawn
|
||||
- 0xFFFF # (B button pressed)
|
||||
|
||||
#################################################
|
||||
# CUSTOM MIDNA CALL 3 CHOICE FLOW #
|
||||
#################################################
|
||||
|
||||
- name: Custom Midna Call 3 Choice Select Setup
|
||||
type: event
|
||||
event: 13
|
||||
parameters: 0x00000004
|
||||
next node index: Custom Midna Call 3 Choice Intro
|
||||
|
||||
- name: Custom Midna Call 3 Choice Intro
|
||||
type: message
|
||||
inf index: Custom Midna Call Need Something Text
|
||||
next flow index: Custom Midna Call 3 Choice
|
||||
|
||||
- name: Custom Midna Call 3 Choice
|
||||
type: message
|
||||
inf index: Custom Midna Call 3 Choice Text
|
||||
next flow index: Custom Midna Call 3 Choice Branch
|
||||
|
||||
- name: Custom Midna Call 3 Choice Branch
|
||||
type: branch
|
||||
num results: 4
|
||||
query: 36
|
||||
parameters: 0x0000
|
||||
next node index: 0xFFFF
|
||||
results:
|
||||
- Custom Midna Call Hints # Hints
|
||||
- Custom Midna Call Change Time # Change time of day
|
||||
- Custom Midna Call Return to Spawn Branch # Return to Spawn
|
||||
- 0xFFFF # (B button pressed)
|
||||
|
||||
#################################################
|
||||
# CUSTOM MIDNA CALL CHOICE OPTIONS #
|
||||
#################################################
|
||||
|
||||
- name: Custom Midna Call Hints
|
||||
type: message
|
||||
inf index: Custom Midna Call Hints Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Custom Midna Call Change Time
|
||||
type: event
|
||||
event: 44
|
||||
parameters: 0x00000000
|
||||
next node index: 0x116
|
||||
|
||||
- name: Custom Midna Call Return to Spawn Branch
|
||||
type: branch
|
||||
num results: 3
|
||||
query: 55
|
||||
parameters: 0x0000
|
||||
next node index: 0xFFFF
|
||||
results:
|
||||
- Return to Spawn Dungeon Choice Select Setup
|
||||
- Return to Spawn Dungeon No Choice Select Setup
|
||||
- Return to Base Spawn
|
||||
|
||||
#################################################
|
||||
# RETURN TO SPAWN DUNGEON CHOICE FLOW #
|
||||
#################################################
|
||||
|
||||
- name: Return to Spawn Dungeon Choice Select Setup
|
||||
type: event
|
||||
event: 13
|
||||
parameters: 0x00000004
|
||||
next node index: Return to Spawn Dungeon Choice Intro
|
||||
|
||||
- name: Return to Spawn Dungeon Choice Intro
|
||||
type: message
|
||||
inf index: Return to Spawn Dungeon Intro Text
|
||||
next flow index: Return to Spawn Dungeon Choice
|
||||
|
||||
- name: Return to Spawn Dungeon Choice
|
||||
type: message
|
||||
inf index: Return to Spawn Dungeon Choice Text
|
||||
next flow index: Return to Spawn Dungeon Choice Branch
|
||||
|
||||
- name: Return to Spawn Dungeon Choice Branch
|
||||
type: branch
|
||||
num results: 4
|
||||
query: 36
|
||||
parameters: 0x0000
|
||||
next node index: 0xFFFF
|
||||
results:
|
||||
- Return to Dungeon Spawn # Dungeon entrance
|
||||
- 0xFFFF # Nevermind
|
||||
- Return to Base Spawn # Spawn
|
||||
- 0xFFFF # (B button pressed)
|
||||
|
||||
#################################################
|
||||
# RETURN TO SPAWN DUNGEON NO CHOICE FLOW #
|
||||
#################################################
|
||||
|
||||
- name: Return to Spawn Dungeon No Choice Select Setup
|
||||
type: event
|
||||
event: 13
|
||||
parameters: 0x00000003
|
||||
next node index: Return to Spawn Dungeon No Choice Intro
|
||||
|
||||
- name: Return to Spawn Dungeon No Choice Intro
|
||||
type: message
|
||||
inf index: Return to Spawn Dungeon Intro Text
|
||||
next flow index: Return to Spawn No Dungeon Choice
|
||||
|
||||
- name: Return to Spawn Dungeon No Choice
|
||||
type: message
|
||||
inf index: Return to Spawn Dungeon No Choice Text
|
||||
next flow index: Return to Spawn Dungeon No Choice Branch
|
||||
|
||||
- name: Return to Spawn Dungeon No Choice Branch
|
||||
type: branch
|
||||
num results: 3
|
||||
query: 35
|
||||
parameters: 0x0000
|
||||
next node index: 0xFFFF
|
||||
results:
|
||||
- 0xFFFF # Nevermind
|
||||
- Return to Base Spawn # Spawn
|
||||
- 0xFFFF # (B button pressed)
|
||||
|
||||
#################################################
|
||||
# RETURN TO SPAWN EVENTS #
|
||||
#################################################
|
||||
|
||||
# Use custom event index 45 to setup returning to spawn. A non-zero
|
||||
# parameter value indicates to try and use a place override if one
|
||||
# exists for the current stage
|
||||
- name: Return to Dungeon Spawn
|
||||
type: event
|
||||
event: 45
|
||||
parameters: 0x00000001
|
||||
next node index: 0x116
|
||||
|
||||
# Use custom event index 45 to setup returning to spawn. A parameter
|
||||
# value of zero indicates to always return to the starting spawn
|
||||
- name: Return to Base Spawn
|
||||
type: event
|
||||
event: 45
|
||||
parameters: 0x00000000
|
||||
next node index: 0x116
|
||||
|
||||
#################################################
|
||||
# HINT SIGNS #
|
||||
#################################################
|
||||
|
||||
- name: Ordon Hint Sign
|
||||
index: 21100
|
||||
type: message
|
||||
inf index: Ordon Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: South Faron Woods Hint Sign
|
||||
index: 21101
|
||||
type: message
|
||||
inf index: South Faron Woods Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Sacred Grove Hint Sign
|
||||
index: 21102
|
||||
type: message
|
||||
inf index: Sacred Grove Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Faron Field Hint Sign
|
||||
index: 21103
|
||||
type: message
|
||||
inf index: Faron Field Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Kakariko Gorge Hint Sign
|
||||
index: 21104
|
||||
type: message
|
||||
inf index: Kakariko Gorge Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Kakariko Village Hint Sign
|
||||
index: 21105
|
||||
type: message
|
||||
inf index: Kakariko Village Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Kakariko Graveyard Hint Sign
|
||||
index: 21106
|
||||
type: message
|
||||
inf index: Kakariko Graveyard Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Eldin Field Hint Sign
|
||||
index: 21107
|
||||
type: message
|
||||
inf index: Eldin Field Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: North Eldin Field Hint Sign
|
||||
index: 21108
|
||||
type: message
|
||||
inf index: North Eldin Field Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Hidden Village Hint Sign
|
||||
index: 21109
|
||||
type: message
|
||||
inf index: Hidden Village Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Lanayru Field Hint Sign
|
||||
index: 21110
|
||||
type: message
|
||||
inf index: Lanayru Field Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Beside Castle Town Hint Sign
|
||||
index: 21111
|
||||
type: message
|
||||
inf index: Beside Castle Town Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Castle Town Center Hint Sign
|
||||
index: 21112
|
||||
type: message
|
||||
inf index: Castle Town Center Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Outside South Castle Town Hint Sign
|
||||
index: 21113
|
||||
type: message
|
||||
inf index: Outside South Castle Town Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Lake Hylia Bridge Hint Sign
|
||||
index: 21114
|
||||
type: message
|
||||
inf index: Lake Hylia Bridge Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Lake Hylia Hint Sign
|
||||
index: 21115
|
||||
type: message
|
||||
inf index: Lake Hylia Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Lanayru Spring Hint Sign
|
||||
index: 21116
|
||||
type: message
|
||||
inf index: Lanayru Spring Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Lake Lantern Cave Hint Sign
|
||||
index: 21117
|
||||
type: message
|
||||
inf index: Lake Lantern Cave Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Fishing Hole Hint Sign
|
||||
index: 21118
|
||||
type: message
|
||||
inf index: Fishing Hole Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Zoras Domain Hint Sign
|
||||
index: 21119
|
||||
type: message
|
||||
inf index: Zoras Domain Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Snowpeak Hint Sign
|
||||
index: 21120
|
||||
type: message
|
||||
inf index: Snowpeak Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Gerudo Desert Hint Sign
|
||||
index: 21121
|
||||
type: message
|
||||
inf index: Gerudo Desert Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Bulblin Camp Hint Sign
|
||||
index: 21122
|
||||
type: message
|
||||
inf index: Bulblin Camp Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Forest Temple Hint Sign
|
||||
index: 21123
|
||||
type: message
|
||||
inf index: Forest Temple Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Goron Mines Hint Sign
|
||||
index: 21124
|
||||
type: message
|
||||
inf index: Goron Mines Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Lakebed Temple Hint Sign
|
||||
index: 21125
|
||||
type: message
|
||||
inf index: Lakebed Temple Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Arbiters Grounds Hint Sign
|
||||
index: 21126
|
||||
type: message
|
||||
inf index: Arbiters Grounds Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Snowpeak Ruins Hint Sign
|
||||
index: 21127
|
||||
type: message
|
||||
inf index: Snowpeak Ruins Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Temple of Time First Hint Sign
|
||||
index: 21128
|
||||
type: message
|
||||
inf index: Temple of Time First Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Temple of Time Second Hint Sign
|
||||
index: 21129
|
||||
type: message
|
||||
inf index: Temple of Time Second Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: City in the Sky Hint Sign
|
||||
index: 21130
|
||||
type: message
|
||||
inf index: City in the Sky Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Palace of Twilight Hint Sign
|
||||
index: 21131
|
||||
type: message
|
||||
inf index: Palace of Twilight Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Hyrule Castle Hint Sign
|
||||
index: 21132
|
||||
type: message
|
||||
inf index: Hyrule Castle Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
|
||||
- name: Cave of Ordeals Hint Sign
|
||||
index: 21133
|
||||
type: message
|
||||
inf index: Cave of Ordeals Hint Sign Text
|
||||
next flow index: 0xFFFF
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,256 @@
|
||||
# Macros are a way to shorten or make more explicit the logical requirements
|
||||
# for certain things. Macros can be used on logic statements like any item and do
|
||||
# not need any code modifications to run. Simply add them here and they can be used
|
||||
# in the world graph files.
|
||||
|
||||
Can Open Doors: Human_Link
|
||||
Can Climb Ladders: Human_Link
|
||||
Can Climb Vines: Human_Link
|
||||
Can Talk to Humans: Human_Link
|
||||
Can Swing on Monkeys: Human_Link
|
||||
Can Pickup Bomblings: Human_Link
|
||||
Can Pull Lakebed Levers: Human_Link
|
||||
Can Pull Blocks: Human_Link
|
||||
Can Ride Boars: Human_Link
|
||||
Can Summon Hawk: Human_Link
|
||||
Can Talk to Animals: Wolf_Link
|
||||
Can Use Senses: Wolf_Link
|
||||
Can Dig: Wolf_Link
|
||||
Can Howl: Wolf_Link
|
||||
Can Sniff: Wolf_Link
|
||||
Can Midna Jump: Wolf_Link
|
||||
Can Use Tightrope: Wolf_Link
|
||||
Not Twilight: Human_Link or Wolf_Link
|
||||
|
||||
Slingshot: Slingshot and 'Can_Refill_Slingshot_Seeds' and Human_Link
|
||||
Lantern: Lantern and 'Can_Refill_Lantern_Oil' and Human_Link
|
||||
Gale Boomerang: Gale_Boomerang and Human_Link
|
||||
Iron Boots: Iron_Boots and Human_Link
|
||||
Bow: Progressive_Bow and 'Can_Refill_Arrows' and Human_Link
|
||||
Regular Bombs: Bomb_Bag and 'Can_Refill_Regular_Bombs' and Human_Link
|
||||
Water Bombs: Bomb_Bag and 'Can_Refill_Water_Bombs' and Human_Link
|
||||
Bombs: Regular_Bombs or Water_Bombs
|
||||
Bomb Arrows: Bow and Bombs
|
||||
Spinner: Spinner and Human_Link
|
||||
Ball and Chain: Ball_and_Chain and Human_Link
|
||||
Zora Armor: Zora_Armor and Human_Link
|
||||
Magic Armor: Magic_Armor and Human_Link
|
||||
Shield: Hylian_Shield or 'Can_Buy_Wooden_Shield'
|
||||
Bottle: Empty_Bottle and Lantern # Can't empty lantern oil from a bottle until you have the lantern
|
||||
Asheis Sketch: Asheis_Sketch and Human_Link
|
||||
Aurus Memo: Aurus_Memo and Human_Link
|
||||
Renados Letter: Renados_Letter and Human_Link
|
||||
Invoice: Invoice and Human_Link
|
||||
Wooden Statue: Wooden_Statue and Human_Link
|
||||
Ilias Charm: Ilias_Charm and Human_Link
|
||||
|
||||
Fishing Rod: Progressive_Fishing_Rod and Human_Link
|
||||
Coral Earring: count(Progressive_Fishing_Rod, 2) and Human_Link
|
||||
Sword: Progressive_Sword and Human_Link
|
||||
Ordon Sword: count(Progressive_Sword, 2) and Human_Link
|
||||
Master Sword: count(Progressive_Sword, 3) and Human_Link
|
||||
Light Sword: count(Progressive_Sword, 4) and Human_Link
|
||||
Big Quiver: count(Progressive_Bow, 2) and 'Can_Refill_Arrows' and Human_Link
|
||||
Giant Quiver: count(Progressive_Bow, 3) and 'Can_Refill_Arrows' and Human_Link
|
||||
Clawshot: Progressive_Clawshot and Human_Link
|
||||
Double Clawshots: count(Progressive_Clawshot, 2) and Human_Link
|
||||
Dominion Rod: Progressive_Dominion_Rod and Human_Link
|
||||
Restored Dominion Rod: count(Progressive_Dominion_Rod, 2) and Human_Link
|
||||
Big Wallet: Progressive_Wallet
|
||||
Giant Wallet: count(Progressive_Wallet, 2)
|
||||
Collosal Wallet: count(Progressive_Wallet, 3)
|
||||
|
||||
Ending Blow: Sword and Progressive_Hidden_Skill
|
||||
Shield Attack: Shield and count(Progressive_Hidden_Skill, 2)
|
||||
Back Slice: Sword and count(Progressive_Hidden_Skill, 3)
|
||||
Helm Splitter: Sword and Shield_Attack and count(Progressive_Hidden_Skill, 4)
|
||||
Mortal Draw: Sword and count(Progressive_Hidden_Skill, 5)
|
||||
Jump Strike: Sword and count(Progressive_Hidden_Skill, 6)
|
||||
Great Spin: Sword and count(Progressive_Hidden_Skill, 7)
|
||||
|
||||
Can Use Back Slice as Sword: Back_Slice_as_Sword == On and count(Progressive_Hidden_Skill, 3)
|
||||
|
||||
Can Do Niche Stuff: Impossible # TODO: Make settings for all of these
|
||||
Can Do Difficult Combat: Impossible # TODO: Make settings for all of these
|
||||
|
||||
Can Use Hot Spring Water: Bottle and 'Can_Buy_Hot_Spring_Water'
|
||||
Can Use Bottled Fairy: Bottle and 'Fairy_Access'
|
||||
# This will have to change if we allow players to start with less than 3 hearts
|
||||
Can Survive Damage: Logic_Damage_Multiplier != OHKO or Can_Use_Bottled_Fairy
|
||||
Can Survive One Bonk: Bonks_Do_Damage == Off or Can_Survive_Damage
|
||||
Can Survive Two Bonks: Bonks_Do_Damage == Off or Logic_Damage_Multiplier != OHKO or
|
||||
(Can_Use_Bottled_Fairy and count(Empty_Bottle, 2))
|
||||
Can Survive Three Bonks: Bonks_Do_Damage == Off or Logic_Damage_Multiplier != OHKO or
|
||||
(Can_Use_Bottled_Fairy and count(Empty_Bottle, 3))
|
||||
Can Smash: Bombs or Ball_and_Chain
|
||||
Can Break Webs: Lantern or Bombs or (Ball_and_Chain and Ball_and_Chain_Webs == On)
|
||||
Can Light Torches: Lantern
|
||||
Can Extinguish Torches: Gale_Boomerang
|
||||
Can Launch Bombs: Bombs and (Gale_Boomerang or Bow)
|
||||
Can Break Monkey Cage: Sword or Iron_Boots or Spinner or Ball_and_Chain or Wolf_Link or Bombs or
|
||||
Bow or Clawshot or (Can_Do_Niche_Stuff and Shield_Attack)
|
||||
Can Cut Hanging Web: Clawshot or Bow or Gale_Boomerang or Ball_and_Chain
|
||||
Can Break Wooden Barrier: Sword or Can_Smash or Wolf_Link or Can_Use_Back_Slice_as_Sword
|
||||
Can Refill Air: Zora_Armor # or glitched logic water bombs
|
||||
Can Cross Quicksand: Wolf_Link or Spinner
|
||||
Can Break Armor: Ball_and_Chain
|
||||
Can Break Ice: Ball_and_Chain
|
||||
Can Launch Canonball: Bombs
|
||||
Can Knock Down Hyrule Castle Painting: Bow or (Can_Do_Niche_Stuff and (Bombs or Jump_Strike))
|
||||
Can Knock Down Hanging Baba: Bow or Clawshot or Gale_Boomerang or Slingshot
|
||||
|
||||
Has Damaging Item: Sword or Ball_and_Chain or Bow or Bombs or Iron_Boots or Wolf_Link or Spinner
|
||||
Can Hit Crystal Switch: Clawshot or Has_Damaging_Item
|
||||
Can Hit Crystal Switch at Range: Clawshot or Bow
|
||||
|
||||
Can Complete MDH: Skip_Midna's_Desparate_Hour == On or ('Can_Access_Castle_Town_South' and 'Can_Complete_Lakebed_Temple')
|
||||
|
||||
|
||||
|
||||
# REGULAR ENEMIES
|
||||
|
||||
# A lot of enemies use this identical logical requirement
|
||||
Can Defeat Generic Enemy: Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
|
||||
Can Defeat Shadow Beast: Sword or (Wolf_Link and Can_Complete_MDH)
|
||||
Can Defeat Keese: Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link or Slingshot or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Fire Keese: Can_Defeat_Keese
|
||||
Can Defeat Ice Keese: Can_Defeat_Keese
|
||||
Can Defeat Shadow Keese: Can_Defeat_Keese
|
||||
Can Defeat Rat: Slingshot or Can_Defeat_Generic_Enemy
|
||||
Can Defeat Ghoul Rat: Can_Use_Senses
|
||||
Can Defeat Bokoblin: Can_Defeat_Generic_Enemy or Slingshot
|
||||
Can Defeat Red Bokoblin: Sword or Ball_and_Chain or Giant_Quiver or Wolf_Link or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Difficult_Combat and (Iron_Boots or Spinner))
|
||||
Can Defeat Bulblin: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Deku Baba: Sword or Ball_and_Chain or Bow or Spinner or Shield_Attack or Slingshot or Clawshot or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Big Baba: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Baba Serpent: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Walltula: Ball_and_Chain or Slingshot or Bow or Gale_Boomerang or Clawshot
|
||||
Can Defeat Skulltula: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Deku Like: Bombs
|
||||
Can Launch Tileworm: Gale_Boomerang
|
||||
Can Defeat Tileworm: Gale_Boomerang and Can_Defeat_Generic_Enemy
|
||||
Can Defeat Stalhound: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Kargarok: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Goron: Sword or Ball_and_Chain or Bow or Spinner or Shield_Attack or Slingshot or Clawshot or Bombs or
|
||||
(Can_Do_Niche_Stuff and Iron_Boots) or (Can_Do_Difficult_Combat and Lantern) or Can_Use_Back_Slice_as_Sword
|
||||
Can Defeat Torch Slug: Sword or Ball_and_Chain or Bow or Wolf_Link or Bombs
|
||||
Can Defeat Dodongo: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Beamos: Ball_and_Chain or Bow or Bombs
|
||||
Can Defeat Leever: Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link or Bombs or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Helmasaur: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Tektite: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Toado: Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link
|
||||
Can Defeat Water Toadpoli: Sword or Ball_and_Chain or Bow or Shield_Attack or (Can_Do_Difficult_Combat and Wolf_Link)
|
||||
Can Defeat Shell Blade: Water_Bombs or (Sword and (Iron_Boots or (Can_Do_Niche_Stuff and Magic_Armor)))
|
||||
Can Defeat Lizalfos: Sword or Ball_and_Chain or Bow or Wolf_Link or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Dinalfos: Sword or Ball_and_Chain or Wolf_Link
|
||||
Can Defeat Chu: Can_Defeat_Generic_Enemy or Clawshot
|
||||
Can Defeat Chu Worm: (Bombs or Clawshot) and (Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link or Can_Use_Back_Slice_as_Sword)
|
||||
Can Defeat Bubble: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Fire Bubble: Can_Defeat_Bubble
|
||||
Can Defeat Ice Bubble: Can_Defeat_Bubble
|
||||
Can Defeat Skull Kid: Bow
|
||||
Can Defeat Poe: Can_Use_Senses
|
||||
Can Defeat Stalchild: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Stalfos: Can_Smash
|
||||
Can Defeat Redead Knight: Sword or Ball_and_Chain or Bow or Wolf_Link or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat White Wolfos: Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link or Bombs or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Chilfos: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Mini Freezard: Can_Defeat_Generic_Enemy
|
||||
Can Defeat Freezard: Ball_and_Chain
|
||||
Can Defeat Young Gohma: Sword or Ball_and_Chain or Bow or Spinner or Wolf_Link or Bombs or
|
||||
(Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Baby Gohma: Can_Defeat_Generic_Enemy or Slingshot or Clawshot
|
||||
Can Defeat Armos: Can_Defeat_Generic_Enemy or Clawshot
|
||||
Can Defeat Zant Head: Sword or Wolf_Link or Can_Use_Back_Slice_as_Sword
|
||||
|
||||
# MINIBOSSES
|
||||
|
||||
Can Defeat Ook: Sword or Ball_and_Chain or Bow or Wolf_Link or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Dangoro: Iron_Boots and (Sword or Wolf_Link or Bomb_Arrows or (Can_Do_Niche_Stuff and Ball_and_Chain))
|
||||
Can Defeat Deku Toad: Sword or Ball_and_Chain or Bow or Wolf_Link or Bombs or
|
||||
Can_Use_Back_Slice_as_Sword or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat King Bulblin Desert: Sword or Ball_and_Chain or Wolf_Link or Giant_Quiver or Can_Use_Back_Slice_as_Sword or
|
||||
(Can_Do_Difficult_Combat and (Spinner or Iron_Boots or Bombs or Big_Quiver))
|
||||
Can Defeat Deathsword: Can_Use_Senses and Sword and (Clawshot or Bow or Gale_Boomerang)
|
||||
Can Defeat Darkhammer: Sword or Ball_and_Chain or Bow or Wolf_Link or Bombs or
|
||||
(Can_Use_Back_Slice_as_Sword and Can_Do_Difficult_Combat) or (Can_Do_Niche_Stuff and Iron_Boots)
|
||||
Can Defeat Darknut: Sword or (Can_Do_Difficult_Combat and (Bombs or Ball_and_Chain))
|
||||
Can Defeat Aerolfos: Clawshot and (Sword or Ball_and_Chain or Wolf_Link or (Can_Do_Niche_Stuff and Iron_Boots))
|
||||
Can Defeat Phantom Zant: Sword or Wolf_Link
|
||||
Can Defeat King Bulblin Castle: Sword or Ball_and_Chain or Wolf_Link or Big_Quiver or (Can_Do_Difficult_Combat and
|
||||
(Spinner or Iron_Boots or Bombs or Can_Use_Back_Slice_as_Sword))
|
||||
|
||||
# BOSSES
|
||||
|
||||
Can Defeat Diababa: Can_Launch_Bombs or (Gale_Boomerang and
|
||||
(Sword or Ball_and_Chain or Wolf_Link or Bombs or
|
||||
(Can_Do_Difficult_Combat and Can_Use_Back_Slice_as_Sword) or (Can_Do_Niche_Stuff and Iron_Boots)))
|
||||
Can Defeat Fyrus: Bow and Iron_Boots and (Sword or (Can_Do_Difficult_Combat and Can_Use_Back_Slice_as_Sword))
|
||||
Can Defeat Morpheel: Iron_Boots and Clawshot and Sword and Can_Refill_Air
|
||||
Can Defeat Stallord: Spinner and (Sword or Can_Do_Difficult_Combat)
|
||||
Can Defeat Blizzeta: Ball_and_Chain
|
||||
Can Defeat Armogohma: Bow and Dominion_Rod
|
||||
Can Defeat Argorok: Double_Clawshots and Ordon_Sword and (Iron_Boots or (Can_Do_Niche_Stuff and Magic_Armor))
|
||||
Can Defeat Zant: Master_Sword and Gale_Boomerang and (Iron_Boots or (Can_Do_Niche_Stuff and Magic_Armor)) and
|
||||
Can_Refill_Air and Clawshot and Ball_and_Chain
|
||||
|
||||
Can Open North Faron Woods Gate: North_Faron_Woods_Gate_Key or Small_Keys == Keysy
|
||||
Can Complete Prologue: Skip_Prologue == On or (Sword and Slingshot and Can_Open_North_Faron_Woods_Gate)
|
||||
|
||||
# You can only use warp portals from certain stages.
|
||||
# 'Can_Warp' is an event added to any logical area
|
||||
# which is part of a stage that players can warp from.
|
||||
Can Use Warp Portals: Wolf_Link and 'Can_Warp' and Can_Complete_Prologue
|
||||
|
||||
Can Free All Monkeys in Forest Temple: "'Can_Free_Monkey_in_Entrance_Room' and 'Can_Free_Monkey_on_Totem' and
|
||||
'Can_Free_Monkey_in_Big_Baba_Room' and 'Can_Free_Monkey_in_West_Tileworm_Room' and
|
||||
'Can_Free_Monkey_in_East_Tileworm_Room' and 'Can_Free_Monkey_in_Dark_Spider_Room' and
|
||||
'Can_Free_Monkey_in_North_Deku_Like_Room'"
|
||||
|
||||
Has Sword For Temple of Time: Temple_of_Time_Sword_Requirement == None or
|
||||
(Temple_of_Time_Sword_Requirement == Wooden_Sword and Sword) or
|
||||
(Temple_of_Time_Sword_Requirement == Ordon_Sword and Ordon_Sword) or
|
||||
(Temple_of_Time_Sword_Requirement == Master_Sword and Master_Sword) or
|
||||
(Temple_of_Time_Sword_Requirement == Light_Sword and Light_Sword)
|
||||
|
||||
Can Complete Faron Twilight: Faron_Twilight_Cleared == On or count(Faron_Twilight_Tear, 16)
|
||||
Can Complete Eldin Twilight: Eldin_Twilight_Cleared == On or count(Eldin_Twilight_Tear, 16)
|
||||
Can Complete Lanayru Twilight: Lanayru_Twilight_Cleared == On or count(Lanayru_Twilight_Tear, 16)
|
||||
Can Complete All Twilight: Can_Complete_Faron_Twilight and Can_Complete_Eldin_Twilight and Can_Complete_Lanayru_Twilight
|
||||
|
||||
Can Defeat Faron Twilit Insect: Twilight
|
||||
Can Defeat Eldin Twilit Insect: Twilight
|
||||
Can Defeat Lanayru Twilit Insect: Twilight and Can_Complete_Eldin_Twilight
|
||||
|
||||
Can Clear Forest: Can_Complete_Faron_Twilight and ('Can_Complete_Forest_Temple' or Faron_Woods_Logic == Open)
|
||||
|
||||
Can Complete All Dungeons: "'Can_Complete_Forest_Temple' and 'Can_Complete_Goron_Mines' and 'Can_Complete_Lakebed_Temple' and
|
||||
'Can_Complete_Arbiters_Grounds' and 'Can_Complete_Snowpeak_Ruins' and 'Can_Complete_Temple_of_Time' and
|
||||
'Can_Complete_City_in_the_Sky' and 'Can_Complete_Palace_of_Twilight'"
|
||||
|
||||
Can Break Hyrule Castle Barrier: Hyrule_Barrier_Requirements == Open or
|
||||
(Hyrule_Barrier_Requirements == Vanilla and 'Can_Complete_Palace_of_Twilight') or
|
||||
(Hyrule_Barrier_Requirements == Fused_Shadows and count(Progressive_Fused_Shadow, Hyrule_Barrier_Fused_Shadows)) or
|
||||
(Hyrule_Barrier_Requirements == Mirror_Shards and count(Progressive_Mirror_Shard, Hyrule_Barrier_Mirror_Shards)) or
|
||||
(Hyrule_Barrier_Requirements == Dungeons and dungeons_completed(Hyrule_Barrier_Dungeons)) or
|
||||
(Hyrule_Barrier_Requirements == Poe_Souls and count(Poe_Soul, Hyrule_Barrier_Poe_Souls)) or
|
||||
(Hyrule_Barrier_Requirements == Hearts and hearts(Hyrule_Barrier_Hearts))
|
||||
|
||||
Can Open Hyrule Castle Big Key Gate: Hyrule_Castle_Big_Key_Requirements == None or
|
||||
(Hyrule_Castle_Big_Key_Requirements == Fused_Shadows and count(Progressive_Fused_Shadow, Hyrule_Castle_Big_Key_Fused_Shadows)) or
|
||||
(Hyrule_Castle_Big_Key_Requirements == Mirror_Shards and count(Progressive_Mirror_Shard, Hyrule_Castle_Big_Key_Mirror_Shards)) or
|
||||
(Hyrule_Castle_Big_Key_Requirements == Dungeons and dungeons_completed(Hyrule_Castle_Big_Key_Dungeons)) or
|
||||
(Hyrule_Castle_Big_Key_Requirements == Poe_Souls and count(Poe_Soul, Hyrule_Castle_Big_Key_Poe_Souls)) or
|
||||
(Hyrule_Castle_Big_Key_Requirements == Hearts and hearts(Hyrule_Castle_Big_Key_Hearts))
|
||||
|
||||
|
||||
Can Talk to Springwater Goron: Nothing # TODO
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,561 @@
|
||||
######################
|
||||
## Logic Settings ##
|
||||
######################
|
||||
|
||||
- Name: Logic Rules
|
||||
Default Option: All Locations Reachable
|
||||
Options:
|
||||
- All Locations Reachable: "Logic is considered when placing items. Tricks and Glitches can be enabled for consideration below."
|
||||
- Beatable Only: "Logic is considered when placing items only until the world is beatable. Remaining items are placed without logic consideration. Tricks and Glitches can be enabled for consideration below."
|
||||
- No Logic: "Maximize randomization, logic is not considered when placing items. MAY BE IMPOSSIBLE TO BEAT."
|
||||
# - Vanilla: "Items are placed in their vanilla locations."
|
||||
|
||||
######################
|
||||
## Access Options ##
|
||||
######################
|
||||
|
||||
- Name: Hyrule Barrier Requirements
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Open: "The barrier around Hyrule Castle is dispelled from the beginning."
|
||||
- Vanilla: "The barrier will be dispelled once Palace of Twilight is cleared."
|
||||
- Fused Shadows: "The barrier will be dispelled once the required number of Fused Shadows have been collected."
|
||||
- Mirror Shards: "The barrier will be dispelled once the required number of Mirror Shards have been collected."
|
||||
- Dungeons: "The barrier will be dispelled once the required number of Dungeons have been cleared."
|
||||
- Poe Souls: "The barrier will be dispelled once the required number of Poe Souls have been collected."
|
||||
- Hearts: "The barrier will be dispelled once the required number of Hearts have been reached."
|
||||
|
||||
- Name: Hyrule Barrier Fused Shadows
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-3: No description available.
|
||||
|
||||
- Name: Hyrule Barrier Mirror Shards
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-4: No description available.
|
||||
|
||||
- Name: Hyrule Barrier Dungeons
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-8: No description available.
|
||||
|
||||
- Name: Hyrule Barrier Poe Souls
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-60: No description available.
|
||||
|
||||
- Name: Hyrule Barrier Hearts
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 4
|
||||
Options:
|
||||
- 4-20: No description available. # Hehe 420
|
||||
|
||||
- Name: Palace of Twilight Requirements
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Open: "The Mirror of Twilight is open at the start of the game."
|
||||
- Fused Shadows: "The player must collect all 3 Fused Shadows."
|
||||
- Mirror Shards: "The player must collect all 4 Mirror Shards."
|
||||
- Vanilla: "The player must complete City in the Sky."
|
||||
|
||||
- Name: Faron Woods Logic
|
||||
Tracker Important: True
|
||||
Default Option: Closed
|
||||
Options:
|
||||
- Closed: "Midna will block the player from leaving Faron Woods until Forest Temple is completed."
|
||||
- Open: "Midna will not prevent the player from leaving Faron Woods."
|
||||
|
||||
- Name: Mirror Chamber Access
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: Open
|
||||
Options:
|
||||
- Open: "The entrance is open and operates like normal. If you start with the Mirror Chamber Portal, you can access the Stallord boss fight without going through Arbiter's Grounds."
|
||||
- Barrier: "A barrier is placed in front of the Mirror Chamber entrance and goes away once Stallord is defeated."
|
||||
- Closed: "The Mirror Chamber is isolated from the world and cannot be reached from the Stallord boss room. To access it, players will either need the portal or access from Palace of Twilight."
|
||||
|
||||
######################
|
||||
## Item Pool ##
|
||||
######################
|
||||
|
||||
- Name: Golden Bugs
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The Golden Bug locations across Hyrule will give the golden bug at that location in the base game."
|
||||
- "On": "The Golden Bug locations across Hyrule will be randomized."
|
||||
|
||||
- Name: Sky Characters
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The Sky Character locations across Hyrule will give Sky Characters."
|
||||
- "On": "The Sky Character locations across Hyrule will be randomized."
|
||||
|
||||
- Name: Gifts From NPCs
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Locations which involve an NPC giving you a gift will give the item expected from the base game."
|
||||
- "On": "Locations which involve an NPC giving you a gift will be randomized."
|
||||
|
||||
- Name: Shop Items
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Shop item locations will contain the item they have in the base game."
|
||||
- "On": "Shop items will be randomized."
|
||||
|
||||
- Name: Hidden Skills
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The golden wolf locations across Hyrule will give you Hidden Skills. You will be required to get at least one of them to obtain the Ending Blow."
|
||||
- "On": "The golden wolf locations across Hyrule will be randomized."
|
||||
|
||||
- Name: Hidden Rupees
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Rupees hidden in tricky locations will not be randomized."
|
||||
- "On": "Rupees hidden in tricky locations will be randomized."
|
||||
|
||||
- Name: Freestanding Rupees
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Rupees out in the open will not be randomized."
|
||||
- "On": "Rupees out in the open will be randomized."
|
||||
|
||||
- Name: Poe Souls
|
||||
Tracker Important: True
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Vanilla: "All poes will give poe souls as the item for beating them."
|
||||
- Overworld: "Overworld poes will give randomized items. Poes in dungeons will still give poe souls."
|
||||
- Dungeon: "Poes in dungeons will give randomized items. Overworld poes will will give poe souls."
|
||||
- All: "All poes will be randomized."
|
||||
|
||||
- Name: Ilia Memory Quest
|
||||
Tracker Important: True
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Vanilla: "The Ilia Memory Quest will work the same way as the base game. You'll start it by beating Temple of Time and then talking to Renado in Kakariko Village."
|
||||
- Letter: "Renado's Letter will be shuffled into the world somewhere. You'll start the quest by finding Renado's Letter and then showing it to Telma in her bar."
|
||||
- Invoice: "The Invoice will be shuffled into the world somewhere. You'll start the quest by finding the Invoice and showing it to the Doctor in Castle Town."
|
||||
- Statue: "The Wooden Statue will be shuffled into the world somewhere. You'll start the quest by finding the Wooden Statue and then showing it to Ilia in Kakariko Village."
|
||||
- Charm: "Ilia's Charm will be shuffled into the world somewhere. You'll start the quest by finding Ilia's Charm and then showing it to Ilia in Kakariko Village to complete the quest."
|
||||
|
||||
- Name: Item Scarcity
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Vanilla: "No changes to the item pool."
|
||||
- Minimal: "Removes unrequired items such as Heart Containers and Pieces, Hawkeye, etc. Has as few items as possible for Bomb Bags, Bows, Hidden Skills, and Wallets. No Magic Armor and 1 Hidden Skill if Glitchless logic."
|
||||
- Plentiful: "One extra copy of major items. There are 17 Heart Containers but no Pieces of Heart. Extra keys if `Keysanity` or `Any Dungeon`."
|
||||
|
||||
- Name: Trap Item Frequency
|
||||
Default Option: None
|
||||
Options:
|
||||
- None: "All items in the game will be genuine."
|
||||
- Few: "Approximately 12.5% of non-major items will be replaced with 'traps' that don't give the item they appear to be."
|
||||
- Many: "Approximately 39.1% of non-major items will be replaced with 'traps' that don't give the item they appear to be."
|
||||
- Mayhem: "Approximately 62.7% of non-major items will be replaced with 'traps' that don't give the item they appear to be."
|
||||
- Nightmare: "All of the non-major items will be replaced with 'traps' that don't give the item they appear to be."
|
||||
|
||||
######################
|
||||
## Dungeon Items ##
|
||||
######################
|
||||
|
||||
- Name: Small Keys
|
||||
Tracker Important: True
|
||||
Default Option: Vanilla
|
||||
Random Low: Own Dungeon
|
||||
Random High: Anywhere
|
||||
Options:
|
||||
- Vanilla: "Small Keys will appear in their vanilla locations."
|
||||
- Own Dungeon: "Small Keys will appear inside their respective dungeon."
|
||||
- Any Dungeon: "Small Keys can appear inside any dungeon."
|
||||
# - Own Region: "Small Keys will appear in their dungeon's region."
|
||||
- Overworld: "Small Keys will only appear in the overworld."
|
||||
- Anywhere: "Small Keys can appear anywhere."
|
||||
- Keysy: "Small Keys will not appear anywhere in the world and their locks will start opened."
|
||||
|
||||
- Name: Big Keys
|
||||
Tracker Important: True
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Vanilla: "Big Keys will appear in their vanilla locations."
|
||||
- Own Dungeon: "Big Keys will appear inside their respective dungeon."
|
||||
- Any Dungeon: "Big Keys can appear inside any dungeon."
|
||||
# - Own Region: "Big Keys appear in their dungeon's region."
|
||||
- Overworld: "Big Keys will only appear in the overworld."
|
||||
- Anywhere: "Big Keys can appear anywhere."
|
||||
- Keysy: "Big Keys will not appear anywhere in the world and boss doors will start opened."
|
||||
|
||||
- Name: Maps and Compasses
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Vanilla: "Maps and Compasses will appear in their vanilla locations."
|
||||
- Own Dungeon: "Maps and Compasses can appear anywhere inside their respective dungeon."
|
||||
- Any Dungeon: "Maps and Compasses can appear inside any dungeon."
|
||||
# - Own Region: "Maps and Compasses will appear in their dungeon's region."
|
||||
- Overworld: "Maps and Compasses will only appear in the overworld."
|
||||
- Anywhere: "Maps and Compasses can appear anywhere."
|
||||
- Start With: "The player starts with all Maps and Compasses."
|
||||
|
||||
- Name: Hyrule Castle Big Key Requirements
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: None
|
||||
Options:
|
||||
- None: "The gate is opened and the key is randomized according to the respective Big Key settings."
|
||||
- Fused Shadows: "The gate will open once the required number of Fused Shadows have been collected."
|
||||
- Mirror Shards: "The gate will open once the required number of Mirror Shards have been collected."
|
||||
- Dungeons: "The gate will open once the required number of Dungeons have been cleared."
|
||||
- Poe Souls: "The gate will open once the required number of Poe Souls have been collected."
|
||||
- Hearts: "The gate will open once the required number of Hearts have been reached."
|
||||
|
||||
- Name: Hyrule Castle Big Key Fused Shadows
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-3: No description available.
|
||||
|
||||
- Name: Hyrule Castle Big Key Mirror Shards
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-4: No description available.
|
||||
|
||||
- Name: Hyrule Castle Big Key Dungeons
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-8: No description available.
|
||||
|
||||
- Name: Hyrule Castle Big Key Poe Souls
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 1
|
||||
Options:
|
||||
- 1-60: No description available.
|
||||
|
||||
- Name: Hyrule Castle Big Key Hearts
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: 4
|
||||
Options:
|
||||
- 4-20: No description available. # Hehe 420
|
||||
|
||||
- Name: Dungeon Rewards Can Be Anywhere
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Dungeon reward items (Fused Shadows and Mirror Shards) will only appear at the end of dungeons."
|
||||
- "On": "Dungeon reward items (Fused Shadows and Mirror Shards) can appear anywhere."
|
||||
|
||||
- Name: No Small Keys on Bosses
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Small keys will not be placed on boss heart container or dungeon reward checks."
|
||||
- "On": "Small keys can potentially be placed on boss heart container or dungeon reward checks. You may be expected to defeat a dungeon's boss before progressing further into the dungeon."
|
||||
|
||||
- Name: Unrequired Dungeons Are Barren
|
||||
Tracker Important: True
|
||||
Default Option: "On"
|
||||
Options:
|
||||
- "Off": "Unrequired dungeons may contain items needed to beat the game."
|
||||
- "On": "Unrequired dungeons will not contain any items necessary to beat the game."
|
||||
|
||||
######################
|
||||
## Timesavers ##
|
||||
######################
|
||||
|
||||
- Name: Skip Prologue
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "You will be required to play through the prologue section of the game to begin the randomizer. This includes everything up to the second goat herding sequence."
|
||||
- "On": "The prologue section of the game will be completed from the start."
|
||||
|
||||
- Name: Faron Twilight Cleared
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "You will be required to complete the Castle Sewers and Faron Twilight section of the game."
|
||||
- "On": "The Castle Sewers and Faron Twilight section of the game will be completed from the start."
|
||||
|
||||
- Name: Eldin Twilight Cleared
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "You will be required to complete the Eldin Twilight section of the game."
|
||||
- "On": "The Eldin Twilight section of the game will be completed from the start."
|
||||
|
||||
- Name: Lanayru Twilight Cleared
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "You will be required to complete the Lanayru Twilight section of the game."
|
||||
- "On": "The Lanayru Twilight section of the game will be completed from the start."
|
||||
|
||||
- Name: Skip Midna's Desparate Hour
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "After completing Lakebed Temple, you will be required to complete the Midna's Desperate Hour section of the game. Note that some overworld poes require Midna's Desperate Hour to be completed before they spawn in."
|
||||
- "On": "The Midna's Desperate Hour section of the game will be completed from the start."
|
||||
|
||||
- Name: Skip Minor Cutscenes
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Minor cutscenes such as area introduction cutscenes and Midna text explanations will not be skipped."
|
||||
- "On": "Minor cutscenes such as area introduction cutscenes and Midna text explanations will not play."
|
||||
|
||||
- Name: Skip Major Cutscenes
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "If you want to skip a skippable cutscene, you must press the start button twice while the cutscene is playing."
|
||||
- "On": "The randomizer will automatically skip any skippable cutscene as fast as possible."
|
||||
|
||||
- Name: Unlock Map Regions
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The map will not start filled in at the beginning of the randomizer. You will have to travel to the different sections of the world to get them on the map."
|
||||
- "On": "The map will start as filled in as possible. Certain sections such as Eldin and Lanayru will only be filled in if their Twilight section is cleared from the start."
|
||||
|
||||
- Name: Open Door of Time
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "You will be required to lead the big statue down the Temple of Time to open the big door at the bottom."
|
||||
- "On": "The big statue will already be set in place at the bottom of the Temple of Time and the door will be opened from the start."
|
||||
|
||||
- Name: Active Goron Mines Magnets
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The switches to activate magnets in Goron Mines will need to be activated manually."
|
||||
- "On": "The switches to activate magnets in Goron Mines will be activated from the start except for the highest one in the main room."
|
||||
|
||||
- Name: Lower Hyrule Castle Chandelier
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The chandeliers in Hyrule Castle will all need to be lowered manually."
|
||||
- "On": "One of the chandeliers in the Hyrule Castle main hall will be lowered from the start. This skips requiring Gale Boomerang and either Lantern or Bow to complete Hyrule Castle."
|
||||
|
||||
- Name: Skip Bridge Donation
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "You will need to donate money at Kakariko Malo Mart to build the bridge between Eldin Field and Castle Town."
|
||||
- "On": "The bridge between Eldin Field and Castle Town will be automatically built after Eldin and Lanayru Twilight are both completed."
|
||||
|
||||
######################
|
||||
# Additional Settings#
|
||||
######################
|
||||
|
||||
- Name: Starting Form
|
||||
Tracker Important: True
|
||||
Default Option: Human
|
||||
Options:
|
||||
- Human: Start as Human Link
|
||||
- Wolf: Start as Wolf Link
|
||||
|
||||
- Name: Bonks Do Damage
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": No description available.
|
||||
- "On": No description available.
|
||||
|
||||
- Name: Starting Time of Day
|
||||
Default Option: Noon
|
||||
Options:
|
||||
- Morning: "Time of day will start at 9am."
|
||||
- Noon: "Time of day will start at noon."
|
||||
- Evening: "Time of day will start at 6pm."
|
||||
- Night: "Time of day will start at midnight."
|
||||
|
||||
- Name: Logic Transform Anywhere
|
||||
Default Option: "On"
|
||||
Options:
|
||||
- "Off": "You will not be expected to transform in places that you normally can't."
|
||||
- "On": "You may be expected to transform in places that require turning on the Dusklight Transform Anywhere setting."
|
||||
|
||||
- Name: Logic Increase Wallet Capacity
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Logic will assume you have the same wallet capacities as the base game."
|
||||
- "On": "Logic will assume that you have the Bigger Wallets Dusklight setting turned on."
|
||||
|
||||
- Name: Logic Damage Multiplier
|
||||
Default Option: Vanilla
|
||||
Options:
|
||||
- Vanilla: "Logic will assume your Dusklight Damage Multiplier is x1."
|
||||
- Double: "Logic will assume your Dusklight Damage Multiplier is x2."
|
||||
- Triple: "Logic will assume your Dusklight Damage Multiplier is x3."
|
||||
- Quadruple: "Logic will assume your Dusklight Damage Multiplier is x4."
|
||||
- OHKO: "Logic will assume your Dusklight Instant Death setting is turned on."
|
||||
|
||||
#############################
|
||||
# Dungeon Entrance Settings #
|
||||
#############################
|
||||
|
||||
- Name: Lakebed Does Not Require Water Bombs
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The entrance to Lakebed Temple will be blocked by a boulder and require using Water Bombs to blow up."
|
||||
- "On": "The rock blocking access to the entrance of Lakebed Temple will be gone, meaning you can get in without Water Bombs."
|
||||
|
||||
- Name: Arbiters Does Not Require Bulblin Camp
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Bulblin Camp will have to be completed to access the entrance to Arbiter's Grounds. This will require finding the Gerudo Desert Bulblin Camp Key."
|
||||
- "On": "Bulblin Camp will be cleared at the start of the randomizer."
|
||||
|
||||
- Name: Snowpeak Does Not Require Reekfish Scent
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Getting the reekfish scent will be required for running through the blizzard on Snowpeak Mountain. Getting the reekfish scent requires the Coral Earring."
|
||||
- "On": "The randomizer will start you with the reekfish scent, meaning you can go through the Snowpeak Mountain blizzard without needing the Coral Earring."
|
||||
|
||||
- Name: Sacred Grove Does Not Require Skull Kid
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Getting through the Lost Woods will require completing the Skull Kid chase sequence."
|
||||
- "On": "The Skull Kid chase sequence in the Lost Woods will start already completed."
|
||||
|
||||
- Name: City Does Not Require Filled Skybook
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "The canon to City in the Sky will spawn in Lake Hylia when the Sky Book has been completed."
|
||||
- "On": "The canon to City in the Sky will be in Lake Hylia from the start."
|
||||
|
||||
- Name: Goron Mines Entrance
|
||||
Tracker Important: True
|
||||
Default Option: Closed
|
||||
Options:
|
||||
- Closed: "Accessing Goron Mines will require climbing up to the Death Mountain Sumo Hall and wrestling with the Goron Elder."
|
||||
- No Wrestling: "Accessing Goron Mines will require climbing up to the Death Mountain Sumo Hall, but wrestling the Goron Elder will not be necessary."
|
||||
- Open: "The elevator shortcut to the Death Mountain Sumo Hall will be open, and can be used to access Goron Mines."
|
||||
|
||||
- Name: Temple of Time Sword Requirement
|
||||
Need In Game: True
|
||||
Tracker Important: True
|
||||
Default Option: None
|
||||
Options:
|
||||
- None: "The door to the past will be open from the start."
|
||||
- Wooden Sword: "The door to the past will require striking at least the Wooden Sword into the Master Sword pedestal."
|
||||
- Ordon Sword: "The door to the past will require striking at least the Ordon Sword into the Master Sword pedestal."
|
||||
- Master Sword: "The door to the past will require striking at least the Master Sword into the Master Sword pedestal."
|
||||
- Light Sword: "The door to the past will require striking the Light Sword into the Master Sword pedestal."
|
||||
|
||||
- Name: Randomize Starting Spawn
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Link will start outside his house."
|
||||
- "On": "Link will start in a random area."
|
||||
|
||||
- Name: Randomize Dungeon Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a dungeon will lead to the vanilla dungeon."
|
||||
- "On": "Entering a dungeon will lead to a random dungeon."
|
||||
- "On + Hyrule Castle": "Entering a dungeon will lead to a random dungeon. Hyrule Castle's entrance will be shuffled as well."
|
||||
|
||||
- Name: Randomize Boss Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a boss door will lead to the intended boss."
|
||||
- "On": "Entering a boss door will lead to a random boss."
|
||||
|
||||
- Name: Randomize Grotto Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a grotto will lead to the intended grotto."
|
||||
- "On": "Entering a grotto will lead to a random grotto."
|
||||
|
||||
- Name: Randomize Cave Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a door or loadzone that leads to a cave area will lead to the intended cave."
|
||||
- "On": "Entering a door or loadzone that leads to a cave area will lead to a random cave."
|
||||
|
||||
- Name: Randomize Interior Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a door or loadzone that leads to an interior area will lead to the intended area."
|
||||
- "On": "Entering a door or loadzone that leads to an interior area will lead to a random intended area."
|
||||
|
||||
- Name: Randomize Overworld Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a loadzone that leads to an overworld area will lead to the intended area."
|
||||
- "On": "Entering a loadzone that leads to an overworld area will lead to a random area."
|
||||
|
||||
- Name: Decouple Double Door Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a left door will lead to the same location as the corresponding right door."
|
||||
- "On": "Entering a left door may lead somewhere different than the corresponding right door (only if the door's type is randomized)."
|
||||
|
||||
- Name: Decouple Entrances
|
||||
Tracker Important: True
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Entering a location and taking the entrance behind you will take you back to where you came from."
|
||||
- "On": "Entering a location and taking the entrance behind you will take you to a random location."
|
||||
|
||||
|
||||
#############################
|
||||
## Logic Tricks ##
|
||||
#############################
|
||||
|
||||
- Name: Back Slice as Sword
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Back Slicing without a sword can be logically required to do damage."
|
||||
- "On": "Back Slicing without a sword can be logically required to do damage."
|
||||
|
||||
- Name: Ball and Chain Webs
|
||||
Default Option: "Off"
|
||||
Options:
|
||||
- "Off": "Ball and Chain will not be required to break webs."
|
||||
- "On": "Ball and Chain may be required to break webs."
|
||||
@@ -0,0 +1,609 @@
|
||||
# Flag values taken from: https://github.com/lunarsoap5/Randomizer-Web-Generator-1/blob/development/Generator/Assets/Flags.cs
|
||||
|
||||
EventFlags:
|
||||
- 0x0382 # Gave wooden sword to Talo. Talked to squirrel outside link's house
|
||||
- 0x0629 # Tame Epona, KB1 trigger activated, Warped Kakariko Bridge Back.
|
||||
- 0x0F40 # Talked to Doctor for the first time.
|
||||
- 0x1208 # Can use Sera's Shop.
|
||||
- 0x1410 # Put Bo outside, ready to wrestle
|
||||
- 0x0F01 # Got Lantern from Coro (Remove when adding Coro checks)
|
||||
- 0x0A2F # Bridge of Eldin Stolen, KB1 defeated, KB1 started
|
||||
- 0x0F68 # Bridge of Eldin Warped Back, forced text when entering dr. clinic, talked to dr before giving invoice
|
||||
- 0x4088 # Saved monkey from puppets, Visited Gerudo Desert for the first time.
|
||||
- 0x4118 # Talked to Fado after Faron and Eldin Twilight
|
||||
- 0x07A0 # Watched Colin CS after KB1, talked to Bo before sumo
|
||||
- 0x2020 # Master Sword Story Progression
|
||||
- 0x2010 # Arbiters Grounds Story Progression
|
||||
- 0x2C10 # Raised the mirror in the Mirror Chamber
|
||||
- 0x1B38 # Skip Monkey Escort
|
||||
- 0x1C20 # Talked to Bo after opening boots chest.
|
||||
- 0x5F20 # Shad leaves sanctuary.
|
||||
- 0xF701 # Add 256 Rupees to Charlo.
|
||||
- 0xF8F4 # Add 244 Rupees to Charlo.
|
||||
- 0x6001 # Talked to Fyer after Lanayru Twilight
|
||||
- 0x3880 # Talked to Jovani after defeating Poe.
|
||||
- 0x2208 # Talked to Yeto on top of the mountain after clearing SPR
|
||||
- 0x3B40 # Won Snowboard race against Yeto.
|
||||
- 0x2F80 # Talked to Goron outside East Castle Town
|
||||
- 0x1C10 # Win Sumo round 1 against Bo
|
||||
- 0x3902 # Released first caught fish in Ordon Day 2
|
||||
- 0x1002 # Talked to Jaggle after climbing vines.
|
||||
- 0x0B20 # Talked to Yeta in Snowpeak for the first time
|
||||
- 0x4308 # Senses unlocked
|
||||
- 0x4610 # Rode Epona back to Link's House
|
||||
- 0x0C10 # Midna accompanies Wolf
|
||||
- Skip_Prologue == On:
|
||||
- 0x0404 # Talked to Uli Day 1.
|
||||
- 0x4510 # Saved Talo
|
||||
- 0x4A60 # Completed Ordon Day 1 and Finished Sword Training.
|
||||
- 0x1601 # Completed Ordon Day 2.
|
||||
- 0x1580 # Watched CS for Goats 2 Done.
|
||||
- Faron_Twilight_Cleared == On:
|
||||
- 0x057F # Midna Charge Unlocked, Finished Sewers, Met Zelda in swers, Midna cut prison chain, watched sewers intro CS, Escaped Cell in Sewers.
|
||||
- 0x0610 # Cleared Faron Twilight
|
||||
- 0x0C08 # Sword and shield removed from wolf's back.
|
||||
- Eldin_Twilight_Cleared == On:
|
||||
- 0x0708 # Cleared Eldin Twilight
|
||||
- 0x0604 # Map Warping unlocked.
|
||||
- Lanayru_Twilight_Cleared == On:
|
||||
- 0x0880 # Zora's Domain Thawed.
|
||||
- 0x0C02 # Lanayru Twilight Story Flag.
|
||||
- 0x0A10 # Defeated Kargarok Rider at Lake (allows player to howl for Kargorok.);
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x0140 # Talked to Yeto First Time.
|
||||
- 0x0390 # Jaggle Calls out to Link, talked to Squirrel as Wolf in Ordon.
|
||||
- 0x06C0 # CS After beating Ordon Shadow, CS after entering Faron Twilight.
|
||||
- 0x0702 # First Time Talking to Gor Coron in Sumo Hall
|
||||
- 0x1501 # Talked to Agitha for the first time.
|
||||
- 0x2001 # Talked to Telma for the first time.
|
||||
- 0x5E10 # Midna text after beating Forest Temple.
|
||||
- 0x1D40 # Listened to Fyer at drained lake.
|
||||
- 0x2201 # Plumm initial CS watched.
|
||||
- 0x2310 # STAR initial CS watched.
|
||||
- 0x2602 # Talked to Yeto on Snowpeak.
|
||||
- 0x2840 # Used Ooccoo for the first time.
|
||||
- 0x3704 # Postman twilight text.
|
||||
- 0x3806 # Hena cabin first time CS, talked to Hena first time.
|
||||
- 0x3A01 # Talked to Ralis in Graveyard for the first time.
|
||||
- 0x4002 # Agreed to help Rusl after Snowpeak Ruins.
|
||||
- 0x4205 # Watched post-ToT Ooccoo CS. Watched Cutscene with Rusl in North Faron Woods.
|
||||
- 0x4508 # Allows postman letters to show up in inventory.
|
||||
- 0x4A10 # Saw Talo in cage CS.
|
||||
- 0x3E02 # City Ooccoo CS watched.
|
||||
- 0x5940 # Met Postman for the first time.
|
||||
- 0x5D40 # Midna text after Kargarok flight.
|
||||
- 0x2502 # Watched cutscene with Yeto on top of mountain
|
||||
- Faron_Woods_Logic == Open:
|
||||
- 0x0602 # Forest Temple Story Flag
|
||||
- 0x0C40 # Talked to Farone after clearing Forest Temple
|
||||
- 0x5E10 # Midna text after Forest Temple completed
|
||||
- Skip_Midna's_Desparate_Hour == On:
|
||||
- 0x0C01 # Midna's Desperate Hour started.
|
||||
- 0x1E08 # Midna's Deseperate Hour Completed.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x0850 # Zora Escort started and completed.
|
||||
- 0x0480 # Told Yeta about pumpkin.
|
||||
- 0x0003 # Yeto put pumpkin and cheese in soup.
|
||||
- 0x1460 # Snowpeak Ruins North and West doors unlocked.
|
||||
- 0x0120 # Told Yeta about cheese
|
||||
- Hyrule_Barrier_Requirements == Open:
|
||||
- 0x4208 # Remove Castle Barrier
|
||||
- Palace_of_Twilight_Requirements == Open:
|
||||
- 0x2B08 # Mirror of Twilight Repaired.
|
||||
- Goron_Mines_Entrance != Closed:
|
||||
- 0x0706 # Talked to Gor Coron, Won Sumo against Gor Coron.
|
||||
- Arbiters_Does_Not_Require_Bulblin_Camp == On:
|
||||
- 0x0B40 # Escaped Burning Tent in Bulblin Camp.
|
||||
- Snowpeak_Does_Not_Require_Reekfish_Scent == On:
|
||||
- 0x6120 # Got the reekfish and smelled it (removes void in Snowpeak).
|
||||
- City_Does_Not_Require_Filled_Skybook == On:
|
||||
- 0x3B08 # Sky Cannon Repaired.
|
||||
- Randomize_Starting_Spawn == On:
|
||||
- 0x057A # Finished Sewers, Midna text after entering Faron Twilight, Met Zelda in sewers, Midna cut prison chain, Watched Sewers intro CS, Escaped cell in sewers.
|
||||
- Ilia_Memory_Quest >= Letter:
|
||||
- 0x2004 # ToT Story Progression Flag
|
||||
- 0x0F80 # Renados Letter Check
|
||||
- Ilia_Memory_Quest >= Statue:
|
||||
- 0x2710 # Showed Invoice to Doctor
|
||||
- 0x2F04 # Got Medicine Scent
|
||||
- 0x2102 # Talked to Louise after Medicine Scent
|
||||
- 0x2204 # Got Wooden Statue
|
||||
- Ilia_Memory_Quest >= Charm:
|
||||
- 0x2340 # Gave statue to Ilia
|
||||
- 0x2E08 # HV barrier removed
|
||||
- 0x2280 # Got Ilia's Charm
|
||||
- Skip_Bridge_Donation == Off:
|
||||
- 0xF901 # Add 256 Rupees to Malo Mart.
|
||||
- 0xFAF4 # Add 244 Rupees to Malo Mart.
|
||||
|
||||
RegionFlags:
|
||||
Ordona Province:
|
||||
Index: 0x00
|
||||
Flags:
|
||||
- 0x57 # Spider on Link's Ladder killed.
|
||||
- 0x63 # Spawn the Chest in Link's House
|
||||
- 0x7E # Midna jumps to Shop unlocked
|
||||
- 0x6B # Ordon Spring Portal.
|
||||
- 0x44 # Midna Text after Ordon Shield (Spawns sword)
|
||||
- 0x46 # Midna Text after Ordon Sword
|
||||
- 0x68 # Approach faron wall with Midna
|
||||
- 0xA0 # Midna allows player to approach Faron Twilight Wall
|
||||
- 0xBA # Explored area outside Link's house as wolf
|
||||
- 0x61 # Defeated first bulblin outside link's house
|
||||
- 0x62 # Defeated second bulblin outside link's house
|
||||
- 0x60 # Defeated Hugo
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x4A # Ordon Day 3 Intro CS.
|
||||
- 0x4C # Knocked down Ordon bee nest CS.
|
||||
- 0x4E # Ordon Ranch first time CS.
|
||||
- 0x53 # Ilia spring CS watched.
|
||||
- 0x54 # Ilia spring CS started.
|
||||
- 0x55 # Ordon Village first time CS.
|
||||
- 0x56 # Ilia spring CS trigger.
|
||||
- 0x68 # Approach Faron Twilgiht with Midna CS.
|
||||
- 0x6E # Enter shield house as wolf CS.
|
||||
- 0x75 # Midna text after hearing Bo and Jaggle talk about the shield.
|
||||
- 0x7C # Midna text before jumping to Ordon Shop roof.
|
||||
- 0x7D # Rusl talking to Uli during wolf night CS.
|
||||
- 0xB8 # Enter Ordon Village as wolf CS.
|
||||
|
||||
Hyrule Castle Sewers and Rooftops:
|
||||
Index: 0x01
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x42 # Midna text after first gate in sewers.
|
||||
- 0x43 # Midna text after exiting to rooftops.
|
||||
- 0x51 # Zelda tower intro CS.
|
||||
- 0x57 # Outside top door intro CS.
|
||||
- 0x5A # Went to the otherside of the fence in sewers CS.
|
||||
- 0x5B # Top of stairway intro CS.
|
||||
- 0x5C # Stairway intro CS.
|
||||
- 0x7B # Midna text when approaching the rooftop guard.
|
||||
|
||||
Faron Woods:
|
||||
Index: 0x02
|
||||
Flags:
|
||||
- 0x63 # Trill lets you shop at his store.
|
||||
- 0x48 # Talked to Coro after bugs
|
||||
- 0x60 # Got Lantern Back from Monkey
|
||||
- 0x61 # Saw bugs move in Coro's house
|
||||
- 0x7D # Talked to Midna about Coro spirit
|
||||
- 0x4E # Saved Monkey from Puppets.
|
||||
- 0x62 # Midna text before jumping to lost woods
|
||||
- 0x95 # Midna text after warping to North Faron for bridge.
|
||||
- 0xBF # Burned First cobweb in faron cave
|
||||
- 0xBE # Burned second cobweb in faron cave
|
||||
- Skip_Prologue == On:
|
||||
- 0x4B # North Faron Gate Unlocked
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x74 # Faron intro CS.
|
||||
- 0x77 # See Faron Light Spirit from afar CS.
|
||||
- 0x7C # Entered mist area as human.
|
||||
- Faron_Twilight_Cleared == On:
|
||||
- 0x46 # Midna jump 1 mist area.
|
||||
- 0x47 # Midna jump 1 mist area.
|
||||
- 0x98 # South Faron Portal.
|
||||
# Re-enable once key situation is sorted out
|
||||
# - Small_Keys == Keysy:
|
||||
# - 0x53 # Coro gate unlocked.
|
||||
# - 0x4B # North Faron Gate Unlocked.
|
||||
|
||||
Kakariko and Death Mountain:
|
||||
Index: 0x03
|
||||
Flags:
|
||||
- 0xB9 # Barnes sells water bombs.
|
||||
- 0xB3 # Colin Rescued CS (Malo Mart is Open).
|
||||
- 0xA4 # Barnes Sells Bombs.
|
||||
- 0x42 # Big Rock fell at DMT
|
||||
- 0xA7 # Unlock Jumps to top of Sanctuary
|
||||
- 0x9A # Kakariko Village intro CS.
|
||||
- 0x54 # Custom flag. Sets the sign in Kak Malo mart slot 1 to appear.
|
||||
- 0x99 # Remove wooden shield from Kak Malo Mart counter.
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x49 # Death mountain intro CS.
|
||||
- 0x83 # Kakariko Graveyard intro CS.
|
||||
- 0x8C # Midna text after Meteor fell.
|
||||
- Eldin_Twilight_Cleared == On:
|
||||
- 0x14 # Collected Tear From Bomb Storage
|
||||
- 0x1A # Collected Tear From Bomb Storage
|
||||
- 0x1B # Collected Tear From Bomb Storage
|
||||
- 0x67 # Ant house entered from top
|
||||
- 0x64 # Ant house box pushed
|
||||
- 0x5E # Defeated Ant house Tears of Light bug
|
||||
- 0x1E # Collected Tear from Ant house
|
||||
- 0xBD # Done Midna jumps in ant house.
|
||||
- Small_Keys == Keysy:
|
||||
- 0xBA # Followed Rutella to graveyard.
|
||||
- 0xB6 # Started Rutella escort.
|
||||
- Goron_Mines_Entrance == Open:
|
||||
- 0x79 # moved death mountain rock to exit
|
||||
- 0x8F # moved death mountain rock to hot spring water
|
||||
- 0xB0 # Goron lets you enter elevator in sumo hall
|
||||
- Ilia_Memory_Quest >= Charm:
|
||||
- 0x70 # Darbus destroyed HV rocks
|
||||
|
||||
Lake Hylia and Zoras Domain:
|
||||
Index: 0x04
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x58 # Talked to Rutella in Lanayru Twilight.
|
||||
- 0x5F # Zora's domain intro CS twilight.
|
||||
- 0x67 # Midna text after jumping to Lake from burning bridge.
|
||||
- 0x6B # Zora's Domain exit flood water cutscene.
|
||||
- 0x72 # Midna text after arriving at frozen Upper Zora River.
|
||||
- 0x91 # Midna text after frozen Zora Domain intro CS.
|
||||
- 0xB0 # Watched CS of Ooccoo running to Sky Cannon.
|
||||
- Lanayru_Twilight_Cleared == On:
|
||||
- 0x7F # Lake Hylia has water on Lake Hylia Map.
|
||||
- Skip_Midna's_Desparate_Hour == On:
|
||||
- 0x51 # Set flag for MDH Cutscene in Lake Hylia
|
||||
- Lakebed_Does_Not_Require_Water_Bombs == On:
|
||||
- 0x70 # Blew up rock in front of lakebed CS.
|
||||
- 0x78 # Blew up rock in front of lakebed.
|
||||
|
||||
# Not sure what Index 5 is
|
||||
|
||||
Hyrule Field:
|
||||
Index: 0x06
|
||||
Flags:
|
||||
- 0x4C # Bridge of Eldin Warped back CS.
|
||||
- 0x7E # Kakariko Gorge placed CS
|
||||
- 0x83 # Set the flag for the Ganon Barriers in Hyrule Field during Eldin Twilight.
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x68 # Midna text after warping Gorge bridge.
|
||||
- 0x7C # Midna text after Lanayru Field twilight CS.
|
||||
- 0x72 # Faron Field intro CS.
|
||||
- 0x40 # Twilight Lanayru Field intro CS.
|
||||
- 0x4F # Cutscene of gate outside Kakariko Village.
|
||||
- 0xB3 # Midna text after entering Lanayru Twilight.
|
||||
- 0xB4 # Midna text when seeing Lanayru Twilight from far away.
|
||||
- 0xB6 # Midna text after entering Eldin Twilight.
|
||||
- 0xB7 # Midna text when seeing Eldin Twilight from far away.
|
||||
- Lanayru_Twilight_Cleared == On:
|
||||
- 0x58 # Lake Hylia has water on Hyrule Field Map
|
||||
- Ilia_Memory_Quest >= Charm:
|
||||
- 0x43 # Remove HV rocks from Hyrule field
|
||||
|
||||
Lost Woods and Sacred Grove:
|
||||
Index: 0x07
|
||||
Flags:
|
||||
- 0x58 # Sacred Grove MS Pedestal Map
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x42 # Midna text after pushing block shortcut as human after Grove 2.
|
||||
- 0x43 # cs after pushing block human
|
||||
- 0x44 # Lost Woods intro CS.
|
||||
- Temple_of_Time_Sword_Requirement == None:
|
||||
- 0x49 # Stairs to Temple of time created.
|
||||
- 0x4A # Struck master sword pedestal with sword.
|
||||
- 0x4B # Stairs and window appear and work properly (Past).
|
||||
- 0xBC # Statue in present is gone. (custom flag)
|
||||
- Sacred_Grove_Does_Not_Require_Skull_Kid == On:
|
||||
- 0xB6 # Skull Kid - Human defeated.
|
||||
- 0xB7 # Lost Woods Turns to day after defeating Skull Kid - Human
|
||||
- 0x5B # Block pushed down
|
||||
- 0x42 # Midna text after block pushed down
|
||||
- 0x43 # cs after pushing block human
|
||||
|
||||
|
||||
Snowpeak Province:
|
||||
Index: 0x08
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x45 # Snowpeak Summit intro CS.
|
||||
- 0x5E # Midna text outside SPR.
|
||||
- 0x5F # Snowpeak intro CS.
|
||||
- Snowpeak_Does_Not_Require_Reekfish_Scent == On:
|
||||
- 0x49 # Snowpeak summit cs.
|
||||
- 0x45 # Snowpeak Summit intro CS.
|
||||
|
||||
Castle Town:
|
||||
Index: 0x09
|
||||
Flags:
|
||||
- 0x40 # Original Jovani Poe killed. It is replaced with a custom actor.
|
||||
- 0x76 # Jovani Chest CS 2
|
||||
- 0x7F # Open Chest to Jovani
|
||||
- 0x7E # Jovani Chest CS
|
||||
- 0x50 # Set flag for Midna breaking Barrier CS.
|
||||
- 0xBC # Spawn Gengle by default as his actor interferes with the poe soul
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x55 # STAR Tent intro CS.
|
||||
- 0x7D # Jovani House intro CS.
|
||||
- Ilia_Memory_Quest >= Statue:
|
||||
- 0x56 # Remove invisible wall from Doctor
|
||||
|
||||
Gerudo Desert:
|
||||
Index: 0x0A
|
||||
Flags:
|
||||
- 0x99 # Desert Entrance CS.
|
||||
- 0x20 # Set Freestanding key flag.
|
||||
- 0x7F # Mirror Raised Cutscene Flag (Places Boar at desert entrance)
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x53 # Mirror Chamber Intro CS.
|
||||
- Arbiters_Does_Not_Require_Bulblin_Camp == On:
|
||||
- 0x43 # Explored part 9 of the Bulblin camp area
|
||||
- 0x44 # Explored part 8 of the Bulblin camp area
|
||||
- 0x45 # Explored part 7 of the Bulblin camp area
|
||||
- 0x46 # Explored part 6 of the Bulblin camp area
|
||||
- 0x47 # Explored part 5 of the Bulblin camp area
|
||||
- 0x4C # Explored part 2 of the Bulblin camp area
|
||||
- 0x4D # Explored part 4 of the Bulblin camp area
|
||||
- 0x4E # Explored part 3 of the Bulblin camp area
|
||||
|
||||
Forest Temple:
|
||||
Index: 0x10
|
||||
Flags:
|
||||
- 0x49 # FT Ook Bridge Destroyed
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x41 # Midna text after getting Boomerang.
|
||||
- 0x42 # Midna text after Ook breaks the bridge.
|
||||
- 0x47 # Midna text after freeing first monkey.
|
||||
- 0x49 # Bridge before Ook broken.
|
||||
- 0x56 # Bokoblins spot Link in windless bridge room.
|
||||
- 0x57 # Turned bridge in windless bridge room.
|
||||
- 0x72 # West Tile Worm room intro CS.
|
||||
- 0x76 # Second monkey room intro CS.
|
||||
- 0x7C # Big Baba room intro CS.
|
||||
- 0x7D # Midna text in room before boss room.
|
||||
- 0x7E # Midna text after saving monkey after defeating Ook.
|
||||
- 0x85 # Midna text after opening hanging chest.
|
||||
- 0x83 # East outside room intro CS.
|
||||
- 0xB6 # Forest Temple intro CS.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x54 # Unlocked door to Second Monkey.
|
||||
- 0x58 # Unlock windless bridge east door.
|
||||
- 0x61 # Opened big baba monkey cage.
|
||||
- 0x74 # Opened tile worm monkey cage.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x48 # Unlocked Forest Temple Boss Door.
|
||||
- 0xED # Got Forest Temple Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Forest Temple Compass.
|
||||
- 0xEF # Got Forest Temple Dungeon Map.
|
||||
|
||||
Goron Mines:
|
||||
Index: 0x11
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x43 # Cut rope of door in outside room CS.
|
||||
- 0x44 # Pressed second button of the main magnet room of the second floor CS trigger.
|
||||
- 0x45 # Pressed third button in entrance room CS.
|
||||
- 0x46 # Pressed second button in entrance room CS.
|
||||
- 0x47 # Cut rope of door in Toadpoli room CS.
|
||||
- 0x4A # Pressed first button of the main magnet room on the second floor CS.
|
||||
- 0x68 # Pressed outside magnet switch for first time CS.
|
||||
- 0x72 # Main magnet room intro CS.
|
||||
- 0x73 # Main magnet room intro CS trigger.
|
||||
- 0x7A # Outside room intro CS.
|
||||
- 0x80 # Room after Bow chest intro CS.
|
||||
- 0x81 # Pulled Beamos in outside room CS.
|
||||
- 0x84 # Open gate in Toadpoli room CS.
|
||||
- 0x85 # Pressed second button in Toadpoli room CS.
|
||||
- 0x88 # Magnet maze room intro CS.
|
||||
- 0x8A # Goron Mines intro CS.
|
||||
- 0x8B # Pressed first button in entrance room CS.
|
||||
- 0x8C # Open gate in entrance room CS.
|
||||
- 0xBC # Main magnet room second floor intro CS.
|
||||
- 0xBD # Main magnet room second floor intro CS trigger.
|
||||
- 0xBE # Hit crystal switch in room after bow chest CS.
|
||||
- 0xBF # Room after Bow chest intro CS trigger.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x60 # Unlock north door in toadpoli room.
|
||||
- 0x62 # Unlock west locked door in main magnet room.
|
||||
- 0x6C # Unlock east outside door.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x48 # Unlocked Goron Mines Boss Door.
|
||||
- 0xED # Got Goron Mines Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Goron Mines Compass.
|
||||
- 0xEF # Got Goron Mines Dungeon Map.
|
||||
- Active_Goron_Mines_Magnets == On:
|
||||
- 0xBB # activated magnet from water before first elder
|
||||
- 0x8F # activated ceiling maze magnet after first elder
|
||||
- 0x5B # activated main magnet room 1st magnet
|
||||
- 0x4A # watched main magnet room 1st magnet cs
|
||||
- 0x61 # activated main magnet room 2nd magnet
|
||||
- 0x44 # watched main magnet room 2nd magnet cs
|
||||
- 0x9E # crystal switch room 1st Iron Boots switch pressed
|
||||
- 0x83 # crystal switch room 1st Iron Boots switch cs shown
|
||||
- 0x82 # crystal switch room 1st magnet active
|
||||
- 0x9F # crystal switch room 2nd Iron Boots switch pressed
|
||||
- 0x85 # crystal switch room 2nd Iron Boots switch cs shown
|
||||
- 0x86 # crystal switch room 2nd magnet active
|
||||
- 0x54 # activated outside room magnet
|
||||
- 0x68 # watched outside room magnet cs
|
||||
- 0x8d # activated east wing dodongo room magnet
|
||||
# Note: the final magnet is not activated because there is a
|
||||
# softlock when you exit the main magnet room through the top door
|
||||
# as wolf while the gate beyond the door in the Dodongo room is not
|
||||
# open. Alternatively if we do open this gate, it leads to much
|
||||
# more complicated logic and some jank where you can walk through
|
||||
# Dangoro while he sits there (and the gate covering the door
|
||||
# animation is also a bit jank). Also you can die during the
|
||||
# Dangoro fight to appear on the north side of his arena. There are
|
||||
# too many nuances for it to be reasonable for glitchless logic,
|
||||
# and also every small key door would require 3 keys.
|
||||
|
||||
Lakebed Temple:
|
||||
Index: 0x12
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x46 # Midna Stalactite text in second room.
|
||||
- 0x7E # Horizontal wheel is turning in east room CS.
|
||||
- 0x7F # Horizontal wheel is turning in east room CS trigger.
|
||||
- 0xA5 # Central room intro CS.
|
||||
- 0xA6 # South bridge to main room intro CS.
|
||||
- 0xA7 # Lakebed Temple intro CS.
|
||||
- 0xAA # Rotate staircase main room CS.
|
||||
- 0xB4 # East water supply Chu Worm CS.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x6B # Unlock east door main room 2F.
|
||||
- 0x7B # Unlocked door in second east room 2F.
|
||||
- 0x7C # Unlocked door before Deku Toad.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x8A # Unlocked Lakebed Temple Boss Door.
|
||||
- 0xED # Got Lakebed Temple Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Lakebed Temple Compass.
|
||||
- 0xEF # Got Lakebed Temple Dungeon Map.
|
||||
|
||||
Arbiters Grounds:
|
||||
Index: 0x13
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x5A # Turn walls in third room Basement second floor CS.
|
||||
- 0x73 # Arbiters Grounds intro CS.
|
||||
- 0x94 # Risen tracks on pilar before boss CS.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x78 # Unlocked door in second east room 2F.
|
||||
- 0x84 # Unlocked door in elevator room 2B.
|
||||
- 0x85 # Unlocked door in first room.
|
||||
- 0x92 # Unlocked door in first east room 1F.
|
||||
- 0x99 # Unlocked door in fourth east room.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x47 # Unlocked Arbiter's Grounds Boss Door.
|
||||
- 0xED # Got Arbiter's Grounds Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Arbiter's Grounds Compass.
|
||||
- 0xEF # Got Arbiter's Grounds Dungeon Map.
|
||||
|
||||
Snowpeak Ruins:
|
||||
Index: 0x14
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x83 # First Floor Northwest room intro CS.
|
||||
- 0xA1 # Midna text after finding Bedroom Key.
|
||||
- 0xA7 # Snowpeak Ruins intro CS.
|
||||
- 0xAA # Freezard in cage CS.
|
||||
- 0xAC # Courtyard intro CS.
|
||||
- 0xAE # Pumpkin room intro CS.
|
||||
- 0xB2 # Midna text after getting Cheese.
|
||||
- 0xB4 # Midna text after getting Pumpkin.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x4D # Unlock North lobby door.
|
||||
- 0x4C # Unlock West lobby door.
|
||||
- 0x6F # Unlock door in southeast room 2F.
|
||||
- 0x73 # Unlock door in east outside hallway.
|
||||
- 0x74 # Unlock west door in courtyard.
|
||||
- 0x70 # Unlock door to lobby from Freezard room.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x57 # Unlocked Snowpeak Ruins Boss Door.
|
||||
- 0xED # Got Snowpeak Ruins Big Key.
|
||||
- 0x56 # Watched CS of Yeta entering boss room.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Snowpeak Ruins Compass.
|
||||
- 0xEF # Got Snowpeak Ruins Dungeon Map.
|
||||
|
||||
Temple of Time:
|
||||
Index: 0x15
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x40 # Midna text telling you to use your senses on the missing statue.
|
||||
- 0x41 # Midna text after using senses on missing statue.
|
||||
- 0x4A # Temple of Time intro CS.
|
||||
- 0x4B # Scales of Time room intro CS.
|
||||
- 0x4C # CS after changing the balance on the scales for the first time.
|
||||
- 0x4D # CS trigger after changing the balance on the scales for the first time.
|
||||
- 0x90 # Pressed button in room 1 for the first time CS.
|
||||
- 0x91 # Pressed the button on the seventh floor for the first time CS.
|
||||
- 0x94 # Pressed the button on the fifth floor for the first time CS.
|
||||
- 0x95 # Pressed buttons on third floor for the first time CS.
|
||||
- 0x96 # Pressed the button on the second floor for the first time CS.
|
||||
- 0x54 # statue getting possessed for the first time cs
|
||||
- Small_Keys == Keysy:
|
||||
- 0x44 # Unlock door in room 1.
|
||||
- 0x42 # Unlock door in room 6 on 8F.
|
||||
- 0x43 # Unlock door in 5F.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x7F # Unlocked Temple of Time Boss Door.
|
||||
- 0xED # Got Temple of Time Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Temple of Time Compass.
|
||||
- 0xEF # Got Temple of Time Dungeon Map.
|
||||
- Open_Door_of_Time == On:
|
||||
- 0x59 # deactivate statue slot in room 1 (opens door and deactivates statue)
|
||||
- 0x80 # open big door in room 1 cs part 2
|
||||
- 0x81 # open big door in room 1 cs part 1
|
||||
- 0xBC # big door in room 1 opens
|
||||
- 0xBE # open big door in room 1 cs part 1 trigger
|
||||
- 0xBD # open big door in room 1 cs part 2 trigger
|
||||
- 0xBF # statue placed in slot in room 1
|
||||
|
||||
City in the Sky:
|
||||
Index: 0x16
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x64 # North wing main room intro CS.
|
||||
- 0x65 # East wing fan room second floor intro CS.
|
||||
- 0x66 # Went beyond first gate outside shop intro CS.
|
||||
- 0x67 # City in The Sky intro CS.
|
||||
- 0x6E # East bridge extended CS.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x59 # Unlock east bridge door.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x58 # Unlocked City in The Sky Boss Door.
|
||||
- 0xED # Got City in The Sky Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got City in The Sky Compass.
|
||||
- 0xEF # Got City in The Sky Dungeon Map.
|
||||
|
||||
Palace of Twilight:
|
||||
Index: 0x17
|
||||
Flags:
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x4D # Phantom Zant 1 CS.
|
||||
- 0x66 # Midna text when west hand steals sol.
|
||||
- 0x6F # Midna text about black fog in west room.
|
||||
- 0x70 # Midna text after finding west sol.
|
||||
- 0x72 # Midna text trigger when seeing a Twili for the first time.
|
||||
- 0x78 # Midna text when seeing a Twili for the first time.
|
||||
- 0x79 # Midna text after Light Sword cutscene.
|
||||
- 0x95 # Midna text after re-entering west wing after sol was stolen.
|
||||
- 0x9E # Midna text at dungeon entrance.
|
||||
- 0xB3 # Watched east wing second room stairs CS.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x57 # Unlock door in north room 3.
|
||||
- 0x58 # Unlock door in east room 2.
|
||||
- 0x59 # Unlock door in west room 2.
|
||||
- 0x6C # Unlock door in north room 2.
|
||||
- 0x7A # Unlock door in norht room 1.
|
||||
- 0x7B # Unlock door in east room 1.
|
||||
- 0x7C # Unlock door in west room 1.
|
||||
- Big_Keys == Keysy:
|
||||
- 0x56 # Unlocked Palace of Twilight Boss Door.
|
||||
- 0xED # Got Palace of Twilight Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Palace of Twilight Compass.
|
||||
- 0xEF # Got Palace of Twilight Dungeon Map.
|
||||
|
||||
Hyrule Castle:
|
||||
Index: 0x18
|
||||
Flags:
|
||||
- 0x4B # Watched CS with Allies in HC.
|
||||
- Skip_Minor_Cutscenes == On:
|
||||
- 0x4F # Hyrule Castle Graveyard intro CS.
|
||||
- 0x8C # East garden intro CS.
|
||||
- 0x8D # East garden intro CS trigger.
|
||||
- 0x77 # Midna text at the east end of the east garden.
|
||||
- 0x82 # South garden intro CS.
|
||||
- 0x99 # Double Darknut room intro CS
|
||||
- 0xA4 # Midna text after Owl Statue chest in graveyard.
|
||||
- 0xB7 # Lit southeast torch in second floor north room for the first time CS.
|
||||
- 0xB8 # Lit northeast torch in second floor north room for the first time CS.
|
||||
- Small_Keys == Keysy:
|
||||
- 0x93 # Unlock door outside 3F.
|
||||
- 0xB0 # Unlock treasure room door.
|
||||
- 0xA3 # Unlock door in south garden.
|
||||
- Big_Keys == Keysy and Hyrule_Castle_Big_Key_Requirements == None:
|
||||
- 0xA1 # Unlocked Hyrule Castle Boss Door.
|
||||
- 0xED # Got Hyrule Castle Big Key.
|
||||
- Maps_and_Compasses == Start_With:
|
||||
- 0xEE # Got Hyrule Castle Compass.
|
||||
- 0xEF # Got Hyrule Castle Dungeon Map.
|
||||
- Lower_Hyrule_Castle_Chandelier == On:
|
||||
- 0x6F # watched double Dinalfos cs 1
|
||||
- 0x70 # watched double Dinalfos cs 2
|
||||
- 0x85 # watched focus on lowered chandelier cs
|
||||
- 0x9D # lower the main hall chandelier
|
||||
- 0xAF # defeated double Dinalfos (opens gates both sides)
|
||||
- Hyrule_Castle_Big_Key_Requirements == None:
|
||||
- 0x94 # Open HC BK gate
|
||||
@@ -0,0 +1,66 @@
|
||||
Seed: TESTTESTTEST
|
||||
Plandomizer: false
|
||||
Generate Spoiler Log: true
|
||||
Arbiters Does Not Require Bulblin Camp: Random
|
||||
Back Slice as Sword: Random
|
||||
Ball and Chain Webs: Random
|
||||
Big Keys: Random
|
||||
Bonks Do Damage: Random
|
||||
City Does Not Require Filled Skybook: Random
|
||||
Damage Multiplier: Random
|
||||
Dungeon Rewards Can Be Anywhere: Random
|
||||
Eldin Twilight Cleared: Random
|
||||
Faron Twilight Cleared: Random
|
||||
Faron Woods Logic: Random
|
||||
Fast Iron Boots: Random
|
||||
Gifts From NPCs: Random
|
||||
Golden Bugs: Random
|
||||
Goron Mines Entrance: Random
|
||||
Hidden Skills: Random
|
||||
Hyrule Barrier Requirements: Random
|
||||
Increase Spinner Speed: Random
|
||||
Increase Wallet Capacity: Random
|
||||
Instant Message Text: Random
|
||||
Item Scarcity: Random
|
||||
Lakebed Does Not Require Water Bombs: Random
|
||||
Lanayru Twilight Cleared: Random
|
||||
Logic Rules: Random
|
||||
Maps and Compasses: Random
|
||||
No Small Keys on Bosses: Random
|
||||
Open Door of Time: Random
|
||||
Palace of Twilight Requirements: Random
|
||||
Poe Souls: Random
|
||||
Quick Transform: Random
|
||||
Random Starting Item Count: 0
|
||||
Randomize Starting Spawn: Random
|
||||
Randomize Dungeon Entrances: Random
|
||||
Randomize Boss Entrances: Random
|
||||
Randomize Grotto Entrances: Random
|
||||
Randomize Cave Entrances: Random
|
||||
Randomize Interior Entrances: Random
|
||||
Randomize Overworld Entrances: Random
|
||||
Decouple Double Door Entrances: Random
|
||||
Decouple Entrances: Random
|
||||
Sacred Grove Does Not Require Skull Kid: Random
|
||||
Shop Items: Random
|
||||
Shops Display The Replaced Item: Random
|
||||
Skip Major Cutscenes: Random
|
||||
Skip Midna's Desparate Hour: Random
|
||||
Skip Minor Cutscenes: Random
|
||||
Skip Prologue: Random
|
||||
Sky Characters: Random
|
||||
Small Keys: Random
|
||||
Snowpeak Does Not Require Reekfish Scent: Random
|
||||
Starting Form: Random
|
||||
Starting Hearts: 3
|
||||
Starting Time of Day: Random
|
||||
Temple of Time Sword Requirement: Random
|
||||
Logic Transform Anywhere: Random
|
||||
Trap Item Frequency: Random
|
||||
Unlock Map Regions: Random
|
||||
Unrequired Dungeons Are Barren: Random
|
||||
trappable_items: major_items
|
||||
Starting Inventory:
|
||||
{}
|
||||
Excluded Locations:
|
||||
[]
|
||||
@@ -0,0 +1,4 @@
|
||||
Seed: TESTTESTTEST
|
||||
Small Keys: Any Dungeon
|
||||
Big Keys: Any Dungeon
|
||||
Maps and Compasses: Any Dungeon
|
||||
@@ -0,0 +1,4 @@
|
||||
Seed: TESTTESTTEST
|
||||
Small Keys: Anywhere
|
||||
Big Keys: Anywhere
|
||||
Maps and Compasses: Anywhere
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Dungeon Rewards Can Be Anywhere: On
|
||||
@@ -0,0 +1,5 @@
|
||||
Seed: TESTTESTTEST
|
||||
Bonks Do Damage: On
|
||||
Damage Multiplier: OHKO
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Eldin Twilight Cleared: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Lanayru Twilight Cleared: On
|
||||
@@ -0,0 +1 @@
|
||||
Seed: TESTTESTTEST
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Twilight Cleared: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Freestanding Rupees: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Gifts From NPCs: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Golden Bugs: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Hidden Rupees: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Hidden Skills: On
|
||||
@@ -0,0 +1,3 @@
|
||||
Seed: TESTTESTTEST
|
||||
Hyrule Barrier Requirements: Dungeons
|
||||
Hyrule Barrier Dungeons: 8
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Hyrule Barrier Requirements: Fused Shadows
|
||||
@@ -0,0 +1,3 @@
|
||||
seed: TESTTESTTEST
|
||||
Hyrule Barrier Requirements: Hearts
|
||||
Hyrule Barrier Hearts: 13
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Hyrule Barrier Requirements: Mirror Shards
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Hyrule Barrier Requirements: Open
|
||||
@@ -0,0 +1,3 @@
|
||||
seed: TESTTESTTEST
|
||||
Hyrule Barrier Requirements: Poe Souls
|
||||
Hyrule Barrier Poe Souls: 30
|
||||
@@ -0,0 +1,4 @@
|
||||
Seed: TESTTESTTEST
|
||||
Small Keys: Keysy
|
||||
Big Keys: Keysy
|
||||
Maps and Compasses: Start With
|
||||
@@ -0,0 +1,16 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
Skip Prologue: On
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Skip Midna's Desparate Hour: On
|
||||
Randomize Starting Spawn: On
|
||||
Randomize Dungeon Entrances: On
|
||||
Randomize Boss Entrances: On
|
||||
Randomize Grotto Entrances: On
|
||||
Randomize Cave Entrances: On
|
||||
Randomize Interior Entrances: On
|
||||
Randomize Overworld Entrances: On
|
||||
Decouple Double Door Entrances: On
|
||||
Decouple Entrances: On
|
||||
@@ -0,0 +1,15 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
Skip Prologue: On
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Skip Midna's Desparate Hour: On
|
||||
Randomize Starting Spawn: On
|
||||
Randomize Dungeon Entrances: On
|
||||
Randomize Grotto Entrances: On
|
||||
Randomize Cave Entrances: On
|
||||
Randomize Interior Entrances: On
|
||||
Randomize Overworld Entrances: On
|
||||
Mixed Entrance Pools:
|
||||
[["Dungeon", "Grotto"], ["Overworld", "Cave", "Interior"]]
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
@@ -0,0 +1,7 @@
|
||||
Seed: TESTTESTTEST
|
||||
Skip Prologue: On
|
||||
Faron Woods Logic: Open
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Unlock Map Regions: On
|
||||
@@ -0,0 +1,4 @@
|
||||
Seed: TESTTESTTEST
|
||||
Small Keys: Overworld
|
||||
Big Keys: Overworld
|
||||
Maps and Compasses: Overworld
|
||||
@@ -0,0 +1,4 @@
|
||||
Seed: TESTTESTTEST
|
||||
Small Keys: Own Dungeon
|
||||
Big Keys: Own Dungeon
|
||||
Maps and Compasses: Own Dungeon
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Palace of Twilight Requirements: Fused Shadows
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Palace of Twilight Requirements: Mirror Shards
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Palace of Twilight Requirements: Open
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Poe Souls: All
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Poe Souls: Dungeon
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Poe Souls: Overworld
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Randomize Boss Entrances: On
|
||||
@@ -0,0 +1,8 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
Skip Prologue: On
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Skip Midna's Desparate Hour: On
|
||||
Randomize Cave Entrances: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Randomize Dungeon Entrances: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Randomize Grotto Entrances: On
|
||||
@@ -0,0 +1,8 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
Skip Prologue: On
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Skip Midna's Desparate Hour: On
|
||||
Randomize Interior Entrances: On
|
||||
@@ -0,0 +1,8 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
Skip Prologue: On
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Skip Midna's Desparate Hour: On
|
||||
Randomize Overworld Entrances: On
|
||||
@@ -0,0 +1,8 @@
|
||||
Seed: TESTTESTTEST
|
||||
Faron Woods Logic: Open
|
||||
Skip Prologue: On
|
||||
Faron Twilight Cleared: On
|
||||
Eldin Twilight Cleared: On
|
||||
Lanayru Twilight Cleared: On
|
||||
Skip Midna's Desparate Hour: On
|
||||
Randomize Starting Spawn: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Item Scarcity: Minimal
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Item Scarcity: Plentiful
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Shop Items: On
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
Seed: TESTTESTTEST
|
||||
Lakebed Does Not Require Water Bombs: On
|
||||
Arbiters Does Not Require Bulblin Camp: On
|
||||
Snowpeak Does Not Require Reekfish Scent: On
|
||||
Sacred Grove Does Not Require Skull Kid: On
|
||||
City Does Not Require Filled Skybook: On
|
||||
Goron Mines Entrance: On
|
||||
Temple of Time Sword Requirement: None
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Skip Midna's Desparate Hour: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Skip Prologue: On
|
||||
@@ -0,0 +1,2 @@
|
||||
Seed: TESTTESTTEST
|
||||
Sky Characters: On
|
||||
+3
@@ -0,0 +1,3 @@
|
||||
Seed: TESTTESTTEST
|
||||
Unrequired Dungeons Are Barren: On
|
||||
Hyrule Barrier Requirements: Mirror Shards
|
||||
@@ -0,0 +1,4 @@
|
||||
Seed: TESTTESTTEST
|
||||
Starting Form: Wolf
|
||||
Skip Prologue: On
|
||||
Faron Woods Logic: Open
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,466 @@
|
||||
- Name: Foolish Get Item Text
|
||||
Group: 0
|
||||
Message Id: 120
|
||||
|
||||
#
|
||||
#- Name: Ordon Spring Portal Get Item Text
|
||||
# Group: 0
|
||||
# Message Id: 121
|
||||
#
|
||||
#- Name: South Faron Portal Get Item Text
|
||||
# Group: 0
|
||||
# Message Id: 122
|
||||
|
||||
- Name: Shadow Crystal Get Item Text
|
||||
Group: 0
|
||||
Message Id: 151
|
||||
|
||||
- Name: Restored Dominion Rod Text
|
||||
Group: 0
|
||||
Message Id: 177
|
||||
|
||||
- Name: Forest Temple Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 234
|
||||
|
||||
- Name: Goron Mines Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 235
|
||||
|
||||
- Name: Lakebed Temple Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 236
|
||||
|
||||
- Name: Arbiters Grounds Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 237
|
||||
|
||||
- Name: Snowpeak Ruins Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 238
|
||||
|
||||
- Name: Temple of Time Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 239
|
||||
|
||||
- Name: City in the Sky Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 240
|
||||
|
||||
- Name: Palace of Twilight Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 241
|
||||
|
||||
- Name: Hyrule Castle Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 242
|
||||
|
||||
- Name: Bulblin Camp Small Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 243
|
||||
|
||||
- Name: Forest Temple Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 247
|
||||
|
||||
- Name: Lakebed Temple Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 248
|
||||
|
||||
- Name: Arbiters Grounds Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 249
|
||||
|
||||
- Name: Temple of Time Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 250
|
||||
|
||||
- Name: City in the Sky Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 251
|
||||
|
||||
- Name: Palace of Twilight Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 252
|
||||
|
||||
- Name: Hyrule Castle Big Key Get Item Text
|
||||
Group: 0
|
||||
Message Id: 253
|
||||
|
||||
- Name: Forest Temple Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 254
|
||||
|
||||
- Name: Goron Mines Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 255
|
||||
|
||||
- Name: Lakebed Temple Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 256
|
||||
|
||||
- Name: Mirror Shard 2 Get item Text
|
||||
Group: 0
|
||||
Message Id: 266
|
||||
|
||||
- Name: Mirror Shard 3 Get item Text
|
||||
Group: 0
|
||||
Message Id: 267
|
||||
|
||||
- Name: Mirror Shard 4 Get item Text
|
||||
Group: 0
|
||||
Message Id: 268
|
||||
|
||||
- Name: Arbiters Grounds Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 269
|
||||
|
||||
- Name: Snowpeak Ruins Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 270
|
||||
|
||||
- Name: Temple of Time Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 271
|
||||
|
||||
- Name: City in the Sky Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 272
|
||||
|
||||
- Name: Palace of Twilight Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 273
|
||||
|
||||
- Name: Hyrule Castle Compass Get Item Text
|
||||
Group: 0
|
||||
Message Id: 274
|
||||
|
||||
- Name: Forest Temple Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 283
|
||||
|
||||
- Name: Goron Mines Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 284
|
||||
|
||||
- Name: Lakebed Temple Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 285
|
||||
|
||||
- Name: Arbiters Grounds Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 286
|
||||
|
||||
- Name: Snowpeak Ruins Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 287
|
||||
|
||||
- Name: Temple of Time Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 288
|
||||
|
||||
- Name: City in the Sky Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 289
|
||||
|
||||
- Name: Palace of Twilight Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 290
|
||||
|
||||
- Name: Hyrule Castle Dungeon Map Get Item Text
|
||||
Group: 0
|
||||
Message Id: 291
|
||||
|
||||
- Name: Fused Shadow 1 Get Item Text
|
||||
Group: 0
|
||||
Message Id: 317
|
||||
|
||||
- Name: Fused Shadow 2 Get Item Text
|
||||
Group: 0
|
||||
Message Id: 318
|
||||
|
||||
- Name: Fused Shadow 3 Get Item Text
|
||||
Group: 0
|
||||
Message Id: 319
|
||||
|
||||
- Name: Mirror Shard 1 Get Item Text
|
||||
Group: 0
|
||||
Message Id: 320
|
||||
|
||||
- Name: Poe Soul Get Item Text
|
||||
Group: 0
|
||||
Message Id: 325
|
||||
|
||||
- Name: Ending Blow Get Item Text
|
||||
Group: 0
|
||||
Message Id: 326
|
||||
|
||||
- Name: Shield Attack Get Item Text
|
||||
Group: 0
|
||||
Message Id: 327
|
||||
|
||||
- Name: Back Slice Get Item Text
|
||||
Group: 0
|
||||
Message Id: 328
|
||||
|
||||
- Name: Helm Splitter Get Item Text
|
||||
Group: 0
|
||||
Message Id: 329
|
||||
|
||||
- Name: Mortal Draw Get Item Text
|
||||
Group: 0
|
||||
Message Id: 330
|
||||
|
||||
- Name: Jump Strike Get Item Text
|
||||
Group: 0
|
||||
Message Id: 331
|
||||
|
||||
- Name: Great Spin Get Item Text
|
||||
Group: 0
|
||||
Message Id: 332
|
||||
|
||||
- Name: Partially Filled Sky Book Get Item Text
|
||||
Group: 0
|
||||
Message Id: 335
|
||||
|
||||
- Name: Midna Call As Human Two Choice
|
||||
Group: 0
|
||||
Message Id: 2004
|
||||
|
||||
- Name: Midna Call As Wolf Two Choice
|
||||
Group: 0
|
||||
Message Id: 2005
|
||||
|
||||
- Name: Midna Call As Wolf No Shadow Crystal Two Choice
|
||||
Group: 0
|
||||
Message Id: 2039
|
||||
|
||||
- Name: Midna Call As Human Three Choice
|
||||
Group: 0
|
||||
Message Id: 2040
|
||||
|
||||
- Name: Midna Call As Wolf Three Choice
|
||||
Group: 0
|
||||
Message Id: 2041
|
||||
|
||||
- Name: Slingshot Shop Text
|
||||
Group: 1
|
||||
Message Id: 7009
|
||||
|
||||
- Name: Slingshot Shop Too Expensive Text
|
||||
Group: 1
|
||||
Message Id: 7014
|
||||
|
||||
- Name: Slingshot Shop Purchase Confirmation Text
|
||||
Group: 1
|
||||
Message Id: 7015
|
||||
|
||||
- Name: Slingshot Shop After Purchase Text
|
||||
Group: 1
|
||||
Message Id: 7016
|
||||
|
||||
- Name: Links House Sign
|
||||
Group: 1
|
||||
Message Id: 9005
|
||||
|
||||
- Name: Barnes Special Offer Text
|
||||
Group: 2
|
||||
Message Id: 5155
|
||||
|
||||
- Name: Kakariko Malo Mart Wooden Shield Purchase Confirmation Text
|
||||
Group: 2
|
||||
Message Id: 5809
|
||||
|
||||
- Name: Kakariko Malo Mart Wooden Shield Too Expensive Text
|
||||
Group: 2
|
||||
Message Id: 5810
|
||||
|
||||
- Name: Kakariko Malo Mart Hylian Shield Purchase Confirmation Text
|
||||
Group: 2
|
||||
Message Id: 5813
|
||||
|
||||
- Name: Kakariko Malo Mart Hylian Shield Too Expensive Text
|
||||
Group: 2
|
||||
Message Id: 5814
|
||||
|
||||
- Name: Kakariko Malo Mart Hylian Shield After Purchase Text
|
||||
Group: 2
|
||||
Message Id: 5818
|
||||
|
||||
- Name: Kakariko Malo Mart Hawkeye Purchase Confirmation Text
|
||||
Group: 2
|
||||
Message Id: 5820
|
||||
|
||||
- Name: Kakariko Malo Mart Hawkeye Too Expensive Text
|
||||
Group: 2
|
||||
Message Id: 5821
|
||||
|
||||
- Name: Kakariko Malo Mart Hawkeye After Purchase Text
|
||||
Group: 2
|
||||
Message Id: 5822
|
||||
|
||||
- Name: Kakariko Malo Mart Red Potion Too Expensive Text
|
||||
Group: 2
|
||||
Message Id: 5824
|
||||
|
||||
- Name: Kakariko Malo Mart Red Potion Purchase Confirmation Text
|
||||
Group: 2
|
||||
Message Id: 5825
|
||||
|
||||
- Name: Kakariko Malo Mart Red Potion Text
|
||||
Group: 2
|
||||
Message Id: 5990
|
||||
|
||||
- Name: Kakariko Malo Mart Hawkeye Coming Soon Text
|
||||
Group: 2
|
||||
Message Id: 5991
|
||||
|
||||
- Name: Kakariko Malo Mart Hawkeye Text
|
||||
Group: 2
|
||||
Message Id: 5992
|
||||
|
||||
- Name: Kakariko Malo Mart Sold Out Text
|
||||
Group: 2
|
||||
Message Id: 5996
|
||||
|
||||
- Name: Kakariko Malo Mart Wooden Shield Text
|
||||
Group: 2
|
||||
Message Id: 5998
|
||||
|
||||
- Name: Kakariko Malo Mart Hylian Shield Text
|
||||
Group: 2
|
||||
Message Id: 5999
|
||||
|
||||
- Name: Chudleys Shop Magic Armor Text
|
||||
Group: 4
|
||||
Message Id: 5413
|
||||
|
||||
- Name: Castle Town Malo Mart Magic Armor After Purchase Text
|
||||
Group: 4
|
||||
Message Id: 5433
|
||||
|
||||
- Name: Castle Town Malo Mart Magic Armor Text
|
||||
Group: 4
|
||||
Message Id: 5440
|
||||
|
||||
- Name: Castle Town Malo Mart Magic Armor Sold Out Text
|
||||
Group: 4
|
||||
Message Id: 5451
|
||||
|
||||
- Name: Charlo Donation Ask Text
|
||||
Group: 4
|
||||
Message Id: 6402
|
||||
|
||||
- Name: Charlo Donation Choice Text
|
||||
Group: 4
|
||||
Message Id: 6403
|
||||
|
||||
- Name: Coro Bottle Offer 1 Text
|
||||
Group: 6
|
||||
Message Id: 5216
|
||||
|
||||
- Name: Coro Bottle Offer 2 Text
|
||||
Group: 6
|
||||
Message Id: 5223
|
||||
|
||||
- Name: Coro Bottle Offer 3 Text
|
||||
Group: 6
|
||||
Message Id: 5237
|
||||
|
||||
- Name: Coro Bottle Offer 4 Text
|
||||
Group: 6
|
||||
Message Id: 5253
|
||||
|
||||
- Name: Fishing Hole Sign Text
|
||||
Group: 7
|
||||
Message Id: 9502
|
||||
|
||||
# Completely Custom Text IDs
|
||||
- Name: Custom Midna Call Need Something Text
|
||||
Attributes: 0x07F60000150D0000FF00000000000400
|
||||
|
||||
- Name: Custom Midna Call 3 Choice Text
|
||||
Attributes: 0x07F8000015000000FF00000000000400
|
||||
|
||||
- Name: Custom Midna Call 2 Choice Text
|
||||
Attributes: 0x07F8000015000000FF00000000000400
|
||||
|
||||
- Name: Custom Midna Call Hints Text
|
||||
Attributes: 0x07F60000150D0000FF00000000000400
|
||||
|
||||
- Name: Return to Spawn Dungeon Intro Text
|
||||
Attributes: 0x07F60000150D0000FF00000000000400
|
||||
|
||||
- Name: Return to Spawn Dungeon Choice Text
|
||||
Attributes: 0x07F60000150D0000FF00000000000400
|
||||
|
||||
- Name: Return to Spawn Dungeon No Choice Text
|
||||
Attributes: 0x07F60000150D0000FF00000000000400
|
||||
|
||||
- Name: Ordon Hint Sign Text
|
||||
|
||||
- Name: South Faron Woods Hint Sign Text
|
||||
|
||||
- Name: Sacred Grove Hint Sign Text
|
||||
|
||||
- Name: Faron Field Hint Sign Text
|
||||
|
||||
- Name: Kakariko Gorge Hint Sign Text
|
||||
|
||||
- Name: Kakariko Village Hint Sign Text
|
||||
|
||||
- Name: Kakariko Graveyard Hint Sign Text
|
||||
|
||||
- Name: Eldin Field Hint Sign Text
|
||||
|
||||
- Name: North Eldin Field Hint Sign Text
|
||||
|
||||
- Name: Hidden Village Hint Sign Text
|
||||
|
||||
- Name: Lanayru Field Hint Sign Text
|
||||
|
||||
- Name: Beside Castle Town Hint Sign Text
|
||||
|
||||
- Name: Castle Town Center Hint Sign Text
|
||||
|
||||
- Name: Outside South Castle Town Hint Sign Text
|
||||
|
||||
- Name: Lake Hylia Bridge Hint Sign Text
|
||||
|
||||
- Name: Lake Hylia Hint Sign Text
|
||||
|
||||
- Name: Lanayru Spring Hint Sign Text
|
||||
|
||||
- Name: Lake Lantern Cave Hint Sign Text
|
||||
|
||||
- Name: Fishing Hole Hint Sign Text
|
||||
|
||||
- Name: Zoras Domain Hint Sign Text
|
||||
|
||||
- Name: Snowpeak Hint Sign Text
|
||||
|
||||
- Name: Gerudo Desert Hint Sign Text
|
||||
|
||||
- Name: Bulblin Camp Hint Sign Text
|
||||
|
||||
- Name: Forest Temple Hint Sign Text
|
||||
|
||||
- Name: Goron Mines Hint Sign Text
|
||||
|
||||
- Name: Lakebed Temple Hint Sign Text
|
||||
|
||||
- Name: Arbiters Grounds Hint Sign Text
|
||||
|
||||
- Name: Snowpeak Ruins Hint Sign Text
|
||||
|
||||
- Name: Temple of Time First Hint Sign Text
|
||||
|
||||
- Name: Temple of Time Second Hint Sign Text
|
||||
|
||||
- Name: City in the Sky Hint Sign Text
|
||||
|
||||
- Name: Palace of Twilight Hint Sign Text
|
||||
|
||||
- Name: Hyrule Castle Hint Sign Text
|
||||
|
||||
- Name: Cave of Ordeals Hint Sign Text
|
||||
@@ -0,0 +1,163 @@
|
||||
# These logic files contain the listings for each predefined logical area. Areas can contain
|
||||
# events, locations, and exits.
|
||||
#
|
||||
# EVENTS are logic variables which become true when their requirement evaluates
|
||||
# to true and are surrounded with single quotes when used in other logic statements
|
||||
# (unlike macros which are defined in macros.yaml). It's possible to add new events
|
||||
# to the logic simply by defining them in an area and then using them in whichever
|
||||
# logic statements you wish. No modifications to the code are necessary. Every logical
|
||||
# area that gets defined will also come with an automatically generated 'Can_Access_<Area_Name>'
|
||||
# event. This event is added to the area and has no requirements. If you start a logic statement
|
||||
# with an event, then the entire statement must be surrounded in double quotes due to how yaml
|
||||
# is parsed.
|
||||
#
|
||||
# LOCATIONS are places which can contain randomized items. Adding new locations
|
||||
# here will require adding them in locations.yaml as well.
|
||||
#
|
||||
# EXITS define how the areas of the world graph connect to each other. Each exit
|
||||
# is a one way connection, so when making new areas remember to define the exit
|
||||
# connections both ways if applicable. No modifications to the code are necessary
|
||||
# for adding new exits.
|
||||
#
|
||||
# Each dungeon in the world graph is at least defined on a room by room basis
|
||||
# (although in many cases rooms are split up into multiple parts). This is to
|
||||
# help simplify glitched logic (eventually).
|
||||
#
|
||||
# NOTE: When writing direct logic requirements for exits, do not write a logic
|
||||
# statement that requires both human link *and* wolf link to evaluate to true.
|
||||
# The search and flatten algorithms need to keep track of human-wolf/day-night
|
||||
# combinations separately and test them one at a time to know which forms
|
||||
# are allowed through any single exit. This doesn't work if both forms are
|
||||
# directly required. If you need to write a logic statement for an exit that
|
||||
# absolutely requires both human and wolf link, then hide away one (or both)
|
||||
# of the forms behind an event in the area.
|
||||
#
|
||||
# See the "Lost Woods Lower Battle Arena -> Lost Woods Baba Serpent Grotto" exit
|
||||
# for an example of the above.
|
||||
|
||||
# The following logical operators/functions are available for logic statements:
|
||||
# - and
|
||||
# - or
|
||||
# - <item>
|
||||
# - Human_Link
|
||||
# - Wolf_Link
|
||||
# - Day
|
||||
# - Night
|
||||
# - count(<item>, <number>)
|
||||
# - setting_name [<=, ==, >=, !=] option
|
||||
# - golden_bugs(count)
|
||||
|
||||
- Name: Root
|
||||
Exits:
|
||||
Root Human Day: (Human_Link and (Starting_Form == Human or Shadow_Crystal)) and (Starting_Time_of_Day == Morning or Starting_Time_of_Day == Noon)
|
||||
Root Human Night: (Human_Link and (Starting_Form == Human or Shadow_Crystal)) and (Starting_Time_of_Day == Evening or Starting_Time_of_Day == Night)
|
||||
Root Wolf Day: (Wolf_Link and (Starting_Form == Wolf or Shadow_Crystal)) and (Starting_Time_of_Day == Morning or Starting_Time_of_Day == Noon)
|
||||
Root Wolf Night: (Wolf_Link and (Starting_Form == Wolf or Shadow_Crystal)) and (Starting_Time_of_Day == Evening or Starting_Time_of_Day == Night)
|
||||
|
||||
- Name: Root Human Day
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Root Exits: Nothing
|
||||
|
||||
- Name: Root Human Night
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Root Exits: Nothing
|
||||
|
||||
- Name: Root Wolf Day
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Root Exits: Nothing
|
||||
|
||||
- Name: Root Wolf Night
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Root Exits: Nothing
|
||||
|
||||
- Name: Root Exits
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Links Spawn: Nothing
|
||||
Warp Portals: Can_Use_Warp_Portals
|
||||
|
||||
- Name: Links Spawn
|
||||
Exits:
|
||||
Outside Links House: Nothing
|
||||
|
||||
- Name: Warp Portals
|
||||
Exits:
|
||||
Ordon Spring Warp Portal: Ordon_Spring_Portal and (Unlock_Map_Regions == On or 'Ordona_Province_Map_Sector')
|
||||
South Faron Woods Warp Portal: South_Faron_Portal and (Unlock_Map_Regions == On or 'Faron_Province_Map_Sector')
|
||||
North Faron Woods Warp Portal: North_Faron_Portal and (Unlock_Map_Regions == On or 'Faron_Province_Map_Sector')
|
||||
Sacred Grove Warp Portal: Sacred_Grove_Portal and (Unlock_Map_Regions == On or 'Faron_Province_Map_Sector')
|
||||
Kakariko Gorge Warp Portal: Kakariko_Gorge_Portal and (Unlock_Map_Regions == On or 'Eldin_Province_Map_Sector')
|
||||
Kakariko Village Warp Portal: Kakariko_Village_Portal and (Unlock_Map_Regions == On or 'Eldin_Province_Map_Sector')
|
||||
Death Mountain Warp Portal: Death_Mountain_Portal and (Unlock_Map_Regions == On or 'Eldin_Province_Map_Sector')
|
||||
Bridge of Eldin Warp Portal: Bridge_of_Eldin_Portal and (Unlock_Map_Regions == On or 'Eldin_Province_Map_Sector')
|
||||
Castle Town Warp Portal: Castle_Town_Portal and (Unlock_Map_Regions == On or 'Lanayru_Province_Map_Sector')
|
||||
Lake Hylia Warp Portal: Lake_Hylia_Portal and (Unlock_Map_Regions == On or 'Lanayru_Province_Map_Sector')
|
||||
Upper Zoras River Warp Portal: Upper_Zoras_River_Portal and (Unlock_Map_Regions == On or 'Lanayru_Province_Map_Sector')
|
||||
Zoras Domain Warp Portal: Zoras_Domain_Portal and (Unlock_Map_Regions == On or 'Lanayru_Province_Map_Sector')
|
||||
Snowpeak Warp Portal: Snowpeak_Portal and (Unlock_Map_Regions == On or 'Snowpeak_Province_Map_Sector')
|
||||
Gerudo Desert Warp Portal: Gerudo_Desert_Portal and 'Desert_Province_Map_Sector'
|
||||
Mirror Chamber Warp Portal: Mirror_Chamber_Portal and 'Desert_Province_Map_Sector'
|
||||
|
||||
- Name: Ordon Spring Warp Portal
|
||||
Exits:
|
||||
Ordon Spring: Nothing
|
||||
|
||||
- Name: South Faron Woods Warp Portal
|
||||
Exits:
|
||||
South Faron Woods: Nothing
|
||||
|
||||
- Name: North Faron Woods Warp Portal
|
||||
Exits:
|
||||
North Faron Woods: Nothing
|
||||
|
||||
- Name: Sacred Grove Warp Portal
|
||||
Exits:
|
||||
Sacred Grove Lower: Nothing
|
||||
|
||||
- Name: Kakariko Gorge Warp Portal
|
||||
Exits:
|
||||
Kakariko Gorge: Nothing
|
||||
|
||||
- Name: Kakariko Village Warp Portal
|
||||
Exits:
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Death Mountain Warp Portal
|
||||
Exits:
|
||||
Death Mountain Volcano: Nothing
|
||||
|
||||
- Name: Bridge of Eldin Warp Portal
|
||||
Exits:
|
||||
Eldin Field North of Bridge: Nothing
|
||||
|
||||
- Name: Castle Town Warp Portal
|
||||
Exits:
|
||||
Outside Castle Town West: Nothing
|
||||
|
||||
- Name: Lake Hylia Warp Portal
|
||||
Exits:
|
||||
Lake Hylia: Nothing
|
||||
|
||||
- Name: Upper Zoras River Warp Portal
|
||||
Exits:
|
||||
Upper Zoras River: Nothing
|
||||
|
||||
- Name: Zoras Domain Warp Portal
|
||||
Exits:
|
||||
Zoras Throne Room: Nothing
|
||||
|
||||
- Name: Snowpeak Warp Portal
|
||||
Exits:
|
||||
Snowpeak Summit Upper: Nothing
|
||||
|
||||
- Name: Gerudo Desert Warp Portal
|
||||
Exits:
|
||||
Gerudo Desert Cave of Ordeals Plateau: Nothing
|
||||
|
||||
- Name: Mirror Chamber Warp Portal
|
||||
Exits:
|
||||
Mirror Chamber Upper: Nothing
|
||||
@@ -0,0 +1,347 @@
|
||||
|
||||
# ARBITERS GROUNDS ENTRANCE ROOM
|
||||
|
||||
- Name: Arbiters Grounds Entrance
|
||||
Region: Arbiters Grounds
|
||||
Dungeon Start Area: True
|
||||
Events:
|
||||
Can Pull Arbiters Entrance Chain: Clawshot or Can_Cross_Quicksand
|
||||
Exits:
|
||||
Arbiters Grounds Entrance Past Gate: "'Can_Pull_Arbiters_Entrance_Chain'"
|
||||
Outside Arbiters Grounds: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Entrance Past Gate
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Can Refill Lantern Oil: Nothing
|
||||
Locations:
|
||||
Arbiters Grounds Entrance Chest: Can_Break_Wooden_Barrier
|
||||
Exits:
|
||||
Arbiters Grounds Dark Lantern Room: Arbiters_Grounds_Small_Key or Small_Keys == Keysy
|
||||
Arbiters Grounds Entrance: "'Can_Pull_Arbiters_Entrance_Chain'"
|
||||
|
||||
# ARBITERS GROUNDS DARK LANTERN ROOM
|
||||
|
||||
- Name: Arbiters Grounds Dark Lantern Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Torch Room: Lantern
|
||||
Arbiters Grounds Entrance Past Gate: Nothing
|
||||
|
||||
# ARBITERS GROUNDS TORCH ROOM
|
||||
|
||||
- Name: Arbiters Grounds Torch Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Poe Scent: Can_Use_Senses and Can_Sniff
|
||||
Can Pull Torch Room Chain: "'Poe_Scent'"
|
||||
Arbiters Grounds Poe 1: Can_Use_Senses
|
||||
Locations:
|
||||
Arbiters Grounds Torch Room East Chest: Nothing
|
||||
Arbiters Grounds Torch Room West Chest: Nothing
|
||||
Arbiters Grounds Torch Room Poe: Can_Use_Senses
|
||||
Arbiters Grounds Hint Sign: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds East Turnable Room Middle: Nothing
|
||||
Arbiters Grounds Torch Room Near East Turnable Room Lower: "'Can_Pull_Torch_Room_Chain'"
|
||||
Arbiters Grounds West Chandelier Room Near Lower Torch Room: Nothing
|
||||
Arbiters Grounds Socket Room Near Torch Room: "'Arbiters_Grounds_Poe_1' and 'Arbiters_Grounds_Poe_2' and 'Arbiters_Grounds_Poe_3' and 'Arbiters_Grounds_Poe_4'"
|
||||
|
||||
- Name: Arbiters Grounds Torch Room Near East Turnable Room Lower
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds East Turnable Room Lower: Nothing
|
||||
Arbiters Grounds Torch Room: "'Can_Pull_Torch_Room_Chain'"
|
||||
|
||||
- Name: Arbiters Grounds Torch Room Chandelier
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Torch Room: Nothing
|
||||
Arbiters Grounds Ghoul Rat Room: Nothing
|
||||
Arbiters Grounds West Chandelier Room: Nothing
|
||||
|
||||
# ARBITERS GROUNDS EAST TURNABLE ROOM
|
||||
|
||||
- Name: Arbiters Grounds East Turnable Room Middle
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds East Chandelier Room Near Turnable Room: count(Arbiters_Grounds_Small_Key, 2) or Small_Keys == Keysy
|
||||
Arbiters Grounds Torch Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds East Turnable Room Lower
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds East Lower Turnable Redead Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds Poe 2 Room: Can_Defeat_Redead_Knight and Clawshot
|
||||
Arbiters Grounds Torch Room Near East Turnable Room Lower: Nothing
|
||||
|
||||
# ARBITERS GROUNDS POE 2 ROOM
|
||||
|
||||
- Name: Arbiters Grounds Poe 2 Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Arbiters Grounds Poe 2: Can_Use_Senses
|
||||
Locations:
|
||||
Arbiters Grounds East Turning Room Poe: Can_Use_Senses
|
||||
|
||||
# ARBITERS GROUNDS EAST CHANDELIER ROOM
|
||||
|
||||
- Name: Arbiters Grounds East Chandelier Room Near Turnable Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds East Chandelier Room Past Chandelier: Can_Pull_Blocks
|
||||
Arbiters Grounds East Turnable Room Middle: Nothing
|
||||
|
||||
- Name: Arbiters Grounds East Chandelier Room Past Chandelier
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds East Upper Turnable Chest: Nothing
|
||||
Arbiters Grounds East Upper Turnable Redead Chest: Can_Break_Wooden_Barrier
|
||||
Exits:
|
||||
Arbiters Grounds Poe 3 Room Near East Chandelier Room: count(Arbiters_Grounds_Small_Key, 3) or Small_Keys == Keysy
|
||||
Arbiters Grounds East Chandelier Room Near Turnable Room: Nothing
|
||||
|
||||
# ARBITERS GROUNDS POE 3 ROOM
|
||||
|
||||
- Name: Arbiters Grounds Poe 3 Room Near East Chandelier Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Arbiters Grounds Poe 3: Can_Use_Senses and Can_Defeat_Stalchild and Can_Defeat_Redead_Knight and 'Poe_Scent'
|
||||
Locations:
|
||||
Arbiters Grounds Hidden Wall Poe: Can_Use_Senses and Can_Defeat_Stalchild and Can_Defeat_Redead_Knight and 'Poe_Scent'
|
||||
Exits:
|
||||
Arbiters Grounds Poe 3 Room Near Ghoul Rat Room: Can_Defeat_Stalchild and Can_Defeat_Redead_Knight
|
||||
Arbiters Grounds East Chandelier Room Past Chandelier: Impossible # Wall
|
||||
|
||||
- Name: Arbiters Grounds Poe 3 Room Near Ghoul Rat Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Ghoul Rat Room: Nothing
|
||||
Arbiters Grounds Poe 3 Room Near East Chandelier Room: Can_Defeat_Stalchild and Can_Defeat_Redead_Knight
|
||||
|
||||
# ARBITERS GROUNDS GOUL RAT ROOM
|
||||
|
||||
- Name: Arbiters Grounds Ghoul Rat Room
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds Ghoul Rat Room Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds Torch Room Chandelier: count(Arbiters_Grounds_Small_Key, 4) or Small_Keys == Keysy
|
||||
Arbiters Grounds Poe 3 Room Near Ghoul Rat Room: Nothing
|
||||
|
||||
# ARBITERS GROUNDS WEST CHANDELIER ROOM
|
||||
|
||||
- Name: Arbiters Grounds West Chandelier Room Near Lower Torch Room
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds West Small Chest Behind Block: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds West Chandelier Room: "'Can_Push_West_Chandelier_Room_Block'"
|
||||
|
||||
- Name: Arbiters Grounds West Chandelier Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Can Push West Chandelier Room Block: Nothing
|
||||
Locations:
|
||||
Arbiters Grounds West Chandelier Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds West Chandelier Room Near Lower Torch Room: Nothing
|
||||
Arbiters Grounds Single Stalfos Room Near West Chandelier Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds West Chandelier Room High Platform
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Poe 4 Room: Nothing
|
||||
Arbiters Grounds West Chandelier Room: Nothing
|
||||
|
||||
# ARBITERS GROUNDS SINGLE STALFOS ROOM
|
||||
|
||||
- Name: Arbiters Grounds Single Stalfos Room Near West Chandelier Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Single Stalfos Room Near Lantern Puzzle Room: Can_Break_Wooden_Barrier
|
||||
Arbiters Grounds West Chandelier Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Single Stalfos Room Near Lantern Puzzle Room
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds West Stalfos West Chest: Nothing
|
||||
Arbiters Grounds West Stalfos Northeast Chest: Can_Break_Wooden_Barrier
|
||||
Exits:
|
||||
Arbiters Grounds Lantern Puzzle Room Near Single Stalfos Room: Can_Defeat_Stalfos
|
||||
Arbiters Grounds Single Stalfos Room Near West Chandelier Room: Can_Break_Wooden_Barrier
|
||||
|
||||
# ARBITERS GROUNDS LANTERN PUZZLE ROOM
|
||||
|
||||
- Name: Arbiters Grounds Lantern Puzzle Room Near Single Stalfos Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Can Light Arbiters Grounds Lantern Puzzle: Lantern
|
||||
Exits:
|
||||
Arbiters Grounds Lantern Puzzle Room Near Poe 4 Room: "'Can_Light_Arbiters_Grounds_Lantern_Puzzle'"
|
||||
Arbiters Grounds Single Stalfos Room Near Lantern Puzzle Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Lantern Puzzle Room Near Poe 4 Room
|
||||
Exits:
|
||||
Arbiters Grounds Poe 4 Room: Nothing
|
||||
Arbiters Grounds Lantern Puzzle Room Near Single Stalfos Room: "'Can_Light_Arbiters_Grounds_Lantern_Puzzle'"
|
||||
|
||||
# Arbiters GROUNDS POE 4 ROOM
|
||||
|
||||
- Name: Arbiters Grounds Poe 4 Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Arbiters Grounds Poe 4: Can_Use_Senses
|
||||
Locations:
|
||||
Arbiters Grounds West Poe: Can_Use_Senses
|
||||
Exits:
|
||||
Arbiters Grounds West Chandelier Room High Platform: Nothing
|
||||
Arbiters Grounds Lantern Puzzle Room Near Poe 4 Room: Nothing
|
||||
|
||||
# ARBITERS GROUNDS SOCKET ROOM
|
||||
|
||||
- Name: Arbiters Grounds Socket Room Near Torch Room
|
||||
Region: Arbiters Grounds
|
||||
Events:
|
||||
Can Spin Turning Wall Socket: Spinner
|
||||
Exits:
|
||||
Arbiters Grounds Socket Room Near North Turning Room: Clawshot # If the wall is already turned
|
||||
Arbiters Grounds Socket Room Bottom Tower: "'Can_Spin_Turning_Wall_Socket'"
|
||||
Arbiters Grounds Socket Room Near Torch Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Socket Room Near North Turning Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds North Turning Room Near Socket Room: Nothing
|
||||
# Can't assume access the other way because of the potential wall
|
||||
|
||||
- Name: Arbiters Grounds Socket Room Near Spinner Room
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds Big Key Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds Socket Room Near Torch Room: Spinner
|
||||
Arbiters Grounds Spinner Room Near Socket Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Socket Room Bottom Tower
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Socket Room Near Boss Door: Spinner
|
||||
Arbiters Grounds Socket Room Near Torch Room: "'Can_Spin_Turning_Wall_Socket'"
|
||||
|
||||
- Name: Arbiters Grounds Socket Room Near Boss Door
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Boss Room: Arbiters_Grounds_Big_Key or Big_Keys == Keysy
|
||||
Arbiters Grounds Socket Room Bottom Tower: Nothing
|
||||
|
||||
# ARBITERS GROUNDS NORTH TURNING ROOM
|
||||
|
||||
- Name: Arbiters Grounds North Turning Room Near Socket Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds North Turning Room Central Column: Nothing
|
||||
Arbiters Grounds Socket Room Near North Turning Room: Nothing
|
||||
|
||||
- Name: Arbiters Grounds North Turning Room Central Column
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds North Turning Room Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds North Turning Room Near Basement Spike Room: Nothing
|
||||
Arbiters Grounds North Turning Room Near Socket Room: Clawshot
|
||||
|
||||
- Name: Arbiters Grounds North Turning Room Near Basement Spike Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Basement Spike Room Near North Turning Room: count(Arbiters_Grounds_Small_Key, 5) or Small_Keys == Keysy
|
||||
|
||||
# ARBITERS GROUNDS BASEMENT SPIKE ROOM
|
||||
|
||||
- Name: Arbiters Grounds Basement Spike Room Near North Turning Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Basement Spike Room Near Spinner Traps: Can_Defeat_Ghoul_Rat
|
||||
Arbiters Grounds North Turning Room Near Basement Spike Room: count(Arbiters_Grounds_Small_Key, 5) or Small_Keys == Keysy
|
||||
|
||||
- Name: Arbiters Grounds Basement Spike Room Near Spinner Traps
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Triple Stalfos Room Center: Nothing
|
||||
|
||||
# ARBITERS GROUNDS TRIPLE STALFOS ROOM
|
||||
|
||||
- Name: Arbiters Grounds Triple Stalfos Room Center
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Triple Stalfos Room Near Miniboss Room: Can_Defeat_Stalfos
|
||||
Arbiters Grounds Triple Stalfos Room Near Spinner Room: Spinner
|
||||
|
||||
- Name: Arbiters Grounds Triple Stalfos Room Near Miniboss Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Deathsword Miniboss Room: Nothing
|
||||
Arbiters Grounds Triple Stalfos Room Near Spinner Room: Spinner
|
||||
Arbiters Grounds Triple Stalfos Room Center: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Triple Stalfos Room Near Spinner Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Spinner Room Bottom: Nothing
|
||||
Arbiters Grounds Triple Stalfos Room Center: Spinner
|
||||
Arbiters Grounds Triple Stalfos Room Near Miniboss Room: Spinner
|
||||
|
||||
# DEATHSWORD MINIBOSS ROOM
|
||||
|
||||
- Name: Deathsword Miniboss Room
|
||||
Locations:
|
||||
Arbiters Grounds Death Sword Chest: Can_Defeat_Deathsword
|
||||
Exits:
|
||||
Arbiters Grounds Triple Stalfos Room Near Miniboss Room: Can_Defeat_Deathsword
|
||||
|
||||
# ARBITERS GROUNDS SPINNER ROOM
|
||||
|
||||
- Name: Arbiters Grounds Spinner Room Bottom
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds Spinner Room First Small Chest: Can_Cross_Quicksand
|
||||
Arbiters Grounds Spinner Room Second Small Chest: Can_Cross_Quicksand
|
||||
Arbiters Grounds Spinner Room Lower Central Small Chest: Can_Cross_Quicksand
|
||||
Exits:
|
||||
Arbiters Grounds Spinner Room Near Single Stalfos: Spinner
|
||||
Arbiters Grounds Spinner Room Near Double Stalfos: Spinner
|
||||
Arbiters Grounds Triple Stalfos Room Near Spinner Room: Can_Cross_Quicksand
|
||||
|
||||
- Name: Arbiters Grounds Spinner Room Near Single Stalfos
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds Spinner Room Stalfos Alcove Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds Spinner Room Bottom: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Spinner Room Near Double Stalfos
|
||||
Region: Arbiters Grounds
|
||||
Locations:
|
||||
Arbiters Grounds Spinner Room Lower North Chest: Nothing
|
||||
Exits:
|
||||
Arbiters Grounds Spinner Room Near Socket Room: Spinner
|
||||
Arbiters Grounds Spinner Room Near Single Stalfos: Nothing
|
||||
Arbiters Grounds Spinner Room Bottom: Nothing
|
||||
|
||||
- Name: Arbiters Grounds Spinner Room Near Socket Room
|
||||
Region: Arbiters Grounds
|
||||
Exits:
|
||||
Arbiters Grounds Socket Room Near Spinner Room: Nothing
|
||||
Arbiters Grounds Spinner Room Near Double Stalfos: Nothing
|
||||
|
||||
# ARBITERS GROUNDS BOSS ROOM
|
||||
|
||||
- Name: Arbiters Grounds Boss Room
|
||||
Events:
|
||||
Can Complete Arbiters Grounds: Can_Defeat_Stallord
|
||||
Locations:
|
||||
Arbiters Grounds Stallord Heart Container: Can_Defeat_Stallord
|
||||
Arbiters Grounds Dungeon Reward: Can_Defeat_Stallord
|
||||
Exits:
|
||||
Mirror Chamber Lower: Can_Defeat_Stallord
|
||||
@@ -0,0 +1,406 @@
|
||||
# CITY IN THE SKY ENTRANCE
|
||||
|
||||
- Name: City in the Sky Entrance
|
||||
Region: City in the Sky
|
||||
Dungeon Start Area: True
|
||||
Locations:
|
||||
City in the Sky Underwater West Chest: Iron_Boots
|
||||
City in the Sky Underwater East Chest: Iron_Boots
|
||||
Exits:
|
||||
Lake Hylia: Clawshot # Or Nothing after fall entrance is set
|
||||
City in the Sky Oocca Hallway Near Entrance: Can_Hit_Crystal_Switch_at_Range
|
||||
City in the Sky Shop: Nothing
|
||||
|
||||
# CITY IN THE SKY SHOP
|
||||
|
||||
- Name: City in the Sky Shop
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Refill Regular Bombs: "'Can_Farm_Rupees'"
|
||||
Can Refill Arrows: "'Can_Farm_Rupees'"
|
||||
Can Refill Lantern Oil: "'Can_Farm_Rupees'"
|
||||
Exits:
|
||||
City in the Sky Entrance: Nothing
|
||||
|
||||
# CITY IN THE SKY OOCCA HALLWAY
|
||||
|
||||
- Name: City in the Sky Oocca Hallway Near Entrance
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Oocca Hallway Near Lobby: Clawshot
|
||||
City in the Sky Entrance: Clawshot
|
||||
|
||||
- Name: City in the Sky Oocca Hallway Near Lobby
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Lobby Floor: Nothing
|
||||
City in the Sky Oocca Hallway Near Entrance: Clawshot
|
||||
|
||||
# CITY IN THE SKY LOBBY
|
||||
|
||||
- Name: City in the Sky Lobby Floor
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky Hint Sign: Nothing
|
||||
Exits:
|
||||
City in the Sky Lobby Floor Near West Bridge: Double_Clawshots
|
||||
City in the Sky East Bridge Near Lobby: Nothing
|
||||
City in the Sky North Fan Passageway Near Lobby: Nothing
|
||||
City in the Sky Lobby Floor Upper West Ledge: Clawshot
|
||||
City in the Sky Lobby Above Ceiling Fan: Double_Clawshots and 'Can_Disable_City_in_the_Sky_Lobby_Ceiling_Fan'
|
||||
|
||||
- Name: City in the Sky Lobby Floor Near West Bridge
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky West Bridge Near Lobby: Nothing
|
||||
City in the Sky Lobby Floor: Clawshot
|
||||
|
||||
- Name: City in the Sky Lobby Floor Upper West Ledge
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky West Bridge Upper Ledge: Nothing
|
||||
City in the Sky Lobby Floor: Nothing
|
||||
|
||||
- Name: City in the Sky Lobby Above Ceiling Fan
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Turn on City in the Sky North Fan: Double_Clawshots and 'Can_Disable_City_in_the_Sky_Lobby_Ceiling_Fan'
|
||||
Locations:
|
||||
City in the Sky Chest Below Big Key Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky Outside Central Tower Ground: Nothing
|
||||
City in the Sky Lobby Floor: Can_Survive_Damage and 'Can_Disable_City_in_the_Sky_Lobby_Ceiling_Fan'
|
||||
|
||||
- Name: City in the Sky Lobby Above Highest Grating
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Disable City in the Sky Lobby Ceiling Fan: Iron_Boots and Clawshot
|
||||
Locations:
|
||||
City in the Sky Big Key Chest: Iron_Boots
|
||||
Exits:
|
||||
City in the Sky Lobby Above Ceiling Fan: Nothing
|
||||
City in the Sky Outside Central Tower Ropes: Nothing
|
||||
|
||||
# CITY IN THE SKY WEST BRIDGE
|
||||
|
||||
- Name: City in the Sky West Bridge Upper Ledge
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Extend City in the Sky West Bridge: Spinner
|
||||
Exits:
|
||||
City in the Sky West Bridge Near Lobby: Clawshot
|
||||
City in the Sky Lobby Floor Upper West Ledge: Nothing
|
||||
|
||||
- Name: City in the Sky West Bridge Near Lobby
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky West Bridge Near Double Clawshot Maze Room: Double_Clawshots or 'Can_Extend_City_in_the_Sky_West_Bridge'
|
||||
City in the Sky West Bridge Upper Ledge: Clawshot
|
||||
City in the Sky Lobby Floor Near West Bridge: Nothing
|
||||
|
||||
- Name: City in the Sky West Bridge Near Double Clawshot Maze Room
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Double Clawshot Maze Room Near West Bridge: Nothing
|
||||
City in the Sky West Bridge Near Lobby: Double_Clawshots or 'Can_Extend_City_in_the_Sky_West_Bridge'
|
||||
|
||||
# CITY IN THE SKY DOUBLE CLAWSHOT MAZE ROOM
|
||||
|
||||
- Name: City in the Sky Double Clawshot Maze Room Near West Bridge
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky West Wing First Chest: Clawshot
|
||||
Exits:
|
||||
City in the Sky Double Clawshot Maze Room Near Baba Tower: Double_Clawshots
|
||||
City in the Sky West Bridge Near Double Clawshot Maze Room: Nothing
|
||||
|
||||
- Name: City in the Sky Double Clawshot Maze Room Near Baba Tower
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky West Wing Baba Balcony Chest: Nothing
|
||||
City in the Sky West Wing Narrow Ledge Chest: Nothing
|
||||
City in the Sky West Wing Tile Worm Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky Baba Tower Bottom: Nothing
|
||||
|
||||
# CITY IN THE SKY BABA TOWER
|
||||
|
||||
- Name: City in the Sky Baba Tower Bottom
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky Baba Tower Top Small Chest: Can_Defeat_Baba_Serpent and Can_Defeat_Big_Baba and Double_Clawshots
|
||||
City in the Sky Baba Tower Narrow Ledge Chest: Can_Defeat_Baba_Serpent and Can_Defeat_Big_Baba and Double_Clawshots
|
||||
City in the Sky Baba Tower Alcove Chest: Can_Defeat_Baba_Serpent and Can_Defeat_Big_Baba and Double_Clawshots
|
||||
Exits:
|
||||
City in the Sky Baba Tower Top: Can_Defeat_Baba_Serpent and Can_Defeat_Big_Baba and Double_Clawshots
|
||||
City in the Sky Double Clawshot Maze Room Near Baba Tower: Nothing
|
||||
|
||||
- Name: City in the Sky Baba Tower Top
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky West Garden Near Baba Tower: Nothing
|
||||
City in the Sky Baba Tower Bottom: Double_Clawshots
|
||||
|
||||
# CITY IN THE SKY WEST GARDEN
|
||||
|
||||
- Name: City in the Sky West Garden Near Baba Tower
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky West Garden Middle: Clawshot
|
||||
City in the Sky Baba Tower Top: Nothing
|
||||
|
||||
- Name: City in the Sky West Garden Middle
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky West Garden Corner Chest: Nothing
|
||||
City in the Sky West Garden Lone Island Chest: Double_Clawshots
|
||||
City in the Sky Garden Island Poe: Double_Clawshots and Can_Defeat_Poe
|
||||
Exits:
|
||||
City in the Sky West Garden Near Peahat Train North: Double_Clawshots
|
||||
|
||||
- Name: City in the Sky West Garden Near Peahat Train North
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky West Garden Lower Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky Peahat Train Room North Near West Garden: Nothing
|
||||
City in the Sky West Garden Near Baba Tower: Clawshot
|
||||
|
||||
- Name: City in the Sky West Garden Near Peahat Train South
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky West Garden Ledge Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky West Garden Middle: Nothing
|
||||
City in the Sky Peahat Train Room South Near West Garden: Nothing
|
||||
|
||||
# CITY IN THE SKY PEAHAT TRAIN ROOM
|
||||
|
||||
- Name: City in the Sky Peahat Train Room North Near West Garden
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Peahat Train Room South Near West Garden: Double_Clawshots
|
||||
City in the Sky Peahat Train Room Near Outside Central Tower: Double_Clawshots
|
||||
City in the Sky West Garden Near Peahat Train North: Nothing
|
||||
|
||||
- Name: City in the Sky Peahat Train Room South Near West Garden
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Peahat Train Room North Near West Garden: Double_Clawshots
|
||||
City in the Sky Peahat Train Room Near Outside Central Tower: Double_Clawshots
|
||||
City in the Sky West Garden Near Peahat Train South: Nothing
|
||||
|
||||
- Name: City in the Sky Peahat Train Room Near Outside Central Tower
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Peahat Train Room North Near West Garden: Double_Clawshots
|
||||
City in the Sky Peahat Train Room South Near West Garden: Double_Clawshots
|
||||
City in the Sky Outside Central Tower Ground: Nothing
|
||||
|
||||
# CITY IN THE SKY OUTSIDE CENTRAL TOWER
|
||||
|
||||
- Name: City in the Sky Outside Central Tower Ground
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Outside Central Tower Ledge: Clawshot
|
||||
City in the Sky Lobby Above Ceiling Fan: Nothing
|
||||
City in the Sky Peahat Train Room Near Outside Central Tower: Nothing
|
||||
|
||||
- Name: City in the Sky Outside Central Tower Ledge
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Outside Central Tower Ropes: Can_Use_Tightrope
|
||||
|
||||
- Name: City in the Sky Outside Central Tower Ropes
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky Central Outside Ledge Chest: Can_Use_Tightrope and Can_Climb_Vines
|
||||
City in the Sky Central Outside Poe Island Chest: Can_Use_Tightrope and Can_Climb_Vines
|
||||
City in the Sky Poe Above Central Fan: Can_Use_Tightrope and Can_Defeat_Poe
|
||||
Exits:
|
||||
City in the Sky Lobby Above Highest Grating: Nothing
|
||||
City in the Sky Outside Central Tower Ground: Nothing
|
||||
|
||||
# CITY IN THE SKY EAST BRIDGE
|
||||
|
||||
- Name: City in the Sky East Bridge Near Lobby
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Spin City in the Sky East Bridge: Spinner
|
||||
Exits:
|
||||
City in the Sky Lobby Floor: Nothing
|
||||
City in the Sky East Bridge Near East Helmasaur Room: "'Can_Spin_City_in_the_Sky_East_Bridge'"
|
||||
|
||||
- Name: City in the Sky East Bridge Near East Helmasaur Room
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky East Helmasaur Room Top Near East Bridge: City_in_the_Sky_Small_Key or Small_Keys == Keysy
|
||||
City in the Sky East Bridge Near Lobby: "'Can_Spin_City_in_the_Sky_East_Bridge'"
|
||||
|
||||
- Name: City in the Sky Under East Bridge
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky East Helmasaur Room Bottom Near East Bridge: Nothing
|
||||
City in the Sky East Bridge Near Lobby: Double_Clawshots and 'Can_Spin_City_in_the_Sky_East_Bridge'
|
||||
|
||||
# CITY IN THE SKY EAST HELMASAUR ROOM
|
||||
|
||||
- Name: City in the Sky East Helmasaur Room Top Near East Bridge
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Hit City in the Sky East Helmasaur Room Crystal Switch: Can_Hit_Crystal_Switch_at_Range
|
||||
Exits:
|
||||
City in the Sky East Helmasaur Room Top Near Tower Before Miniboss: "'Can_Hit_City_in_the_Sky_East_Helmasaur_Room_Crystal_Switch'"
|
||||
City in the Sky East Bridge Near East Helmasaur Room: Nothing
|
||||
|
||||
- Name: City in the Sky East Helmasaur Room Top Near Tower Before Miniboss
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Tower Before Miniboss Higher Caged Area: Nothing
|
||||
City in the Sky East Helmasaur Room Top Near East Tileworm Room: "'Can_Hit_City_in_the_Sky_East_Helmasaur_Room_Crystal_Switch'"
|
||||
City in the Sky East Helmasaur Room Top Near East Bridge: "'Can_Hit_City_in_the_Sky_East_Helmasaur_Room_Crystal_Switch'"
|
||||
|
||||
- Name: City in the Sky East Helmasaur Room Top Near East Tileworm Room
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Hit City in the Sky East Helmasaur Room Crystal Switch: Can_Hit_Crystal_Switch_at_Range
|
||||
Exits:
|
||||
City in the Sky East Tileworm Room Near East Helmasaur Room: Nothing
|
||||
City in the Sky East Helmasaur Room Top Near Tower Before Miniboss: Nothing
|
||||
|
||||
- Name: City in the Sky East Helmasaur Room Bottom Near Tower Before Miniboss
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky East Helmasaur Room Bottom Near East Bridge: Double_Clawshots
|
||||
City in the Sky Tower Before Miniboss Lower Caged Area: Nothing
|
||||
|
||||
- Name: City in the Sky East Helmasaur Room Bottom Near East Bridge
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky East Wing Lower Level Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky Under East Bridge: Nothing
|
||||
City in the Sky East Helmasaur Room Bottom Near Tower Before Miniboss: Double_Clawshots
|
||||
|
||||
# CITY IN THE SKY EAST TILEWORM ROOM
|
||||
|
||||
- Name: City in the Sky East Tileworm Room Near East Helmasaur Room
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky East Tile Worm Small Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky East Tileworm Room Near Double Dinalfos Room: Can_Launch_Tileworm
|
||||
City in the Sky East Helmasaur Room Top Near East Tileworm Room: Nothing
|
||||
|
||||
- Name: City in the Sky East Tileworm Room Near Double Dinalfos Room
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Double Dinalfos Room Bottom: Nothing
|
||||
City in the Sky East Tileworm Room Near East Helmasaur Room: Clawshot or Can_Launch_Tileworm
|
||||
|
||||
# CITY IN THE SKY DOUBLE DINALFOS ROOM
|
||||
|
||||
- Name: City in the Sky Double Dinalfos Room Bottom
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Double Dinalfos Room Top: Can_Defeat_Dinalfos and Clawshot
|
||||
City in the Sky East Tileworm Room Near Double Dinalfos Room: Can_Defeat_Dinalfos # Room locks when you go in
|
||||
|
||||
- Name: City in the Sky Double Dinalfos Room Top
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Oocca Flight Room Near Double Dinalfos Room: Nothing
|
||||
City in the Sky Double Dinalfos Room Bottom: Nothing
|
||||
|
||||
# CITY IN THE SKY OOCCA FLIGHT ROOM
|
||||
|
||||
- Name: City in the Sky Oocca Flight Room Near Double Dinalfos Room
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky East Wing After Dinalfos Alcove Chest: Clawshot
|
||||
City in the Sky East Wing After Dinalfos Ledge Chest: Nothing
|
||||
Exits:
|
||||
City in the Sky Oocca Flight Room Near Tower Before Miniboss: Clawshot
|
||||
City in the Sky Double Dinalfos Room Top: Nothing
|
||||
|
||||
- Name: City in the Sky Oocca Flight Room Near Tower Before Miniboss
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky Tower Before Miniboss Top: Nothing
|
||||
|
||||
# CITY IN THE SKY TOWER BEFORE MINIBOSS
|
||||
|
||||
- Name: City in the Sky Tower Before Miniboss Top
|
||||
Region: City in the Sky
|
||||
Events:
|
||||
Can Open City in the Sky Tower Before Miniboss Upper Gate: Clawshot
|
||||
Exits:
|
||||
City in the Sky Tower Before Miniboss Higher Caged Area: "'Can_Open_City_in_the_Sky_Tower_Before_Miniboss_Upper_Gate'"
|
||||
City in the Sky Tower Before Miniboss Bottom: Nothing
|
||||
|
||||
- Name: City in the Sky Tower Before Miniboss Bottom
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
Aerolfos Miniboss Room: Nothing
|
||||
City in the Sky Tower Before Miniboss Lower Caged Area: Double_Clawshots
|
||||
|
||||
- Name: City in the Sky Tower Before Miniboss Higher Caged Area
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky East First Wing Chest After Fans: Nothing
|
||||
Exits:
|
||||
City in the Sky East Helmasaur Room Top Near Tower Before Miniboss: Nothing
|
||||
City in the Sky Tower Before Miniboss Bottom: "'Can_Open_City_in_the_Sky_Tower_Before_Miniboss_Upper_Gate'"
|
||||
|
||||
- Name: City in the Sky Tower Before Miniboss Lower Caged Area
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky East Helmasaur Room Bottom Near Tower Before Miniboss: Nothing
|
||||
|
||||
# AEROLFOS MINIBOSS ROOM
|
||||
|
||||
- Name: Aerolfos Miniboss Room
|
||||
Locations:
|
||||
City in the Sky Aeralfos Chest: Can_Defeat_Aerolfos
|
||||
Exits:
|
||||
City in the Sky Tower Before Miniboss Bottom: Can_Defeat_Aerolfos
|
||||
|
||||
# CITY IN THE SKY NORTH FAN PASSAGEWAY
|
||||
|
||||
- Name: City in the Sky North Fan Passageway Near Lobby
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky North Fan Passageway Near North Tower: Double_Clawshots and 'Can_Turn_on_City_in_the_Sky_North_Fan'
|
||||
City in the Sky Lobby Floor: Nothing
|
||||
|
||||
- Name: City in the Sky North Fan Passageway Near North Tower
|
||||
Region: City in the Sky
|
||||
Locations:
|
||||
City in the Sky Chest Behind North Fan: Clawshot
|
||||
Exits:
|
||||
City in the Sky North Tower Bottom: Nothing
|
||||
City in the Sky North Fan Passageway Near Lobby: Double_Clawshots and 'Can_Turn_on_City_in_the_Sky_North_Fan'
|
||||
|
||||
# CITY IN THE SKY NORTH TOWER
|
||||
|
||||
- Name: City in the Sky North Tower Bottom
|
||||
Region: City in the Sky
|
||||
Exits:
|
||||
City in the Sky North Tower Top: Can_Defeat_Aerolfos and Double_Clawshots
|
||||
City in the Sky North Fan Passageway Near North Tower: Nothing
|
||||
|
||||
- Name: City in the Sky North Tower Top
|
||||
Exits:
|
||||
City in the Sky Boss Room: City_in_the_Sky_Big_Key or Big_Keys == Keysy
|
||||
City in the Sky North Tower Bottom: Nothing
|
||||
|
||||
# CITY IN THE SKY BOSS ROOM
|
||||
|
||||
- Name: City in the Sky Boss Room
|
||||
Events:
|
||||
Can Complete City in the Sky: Can_Defeat_Argorok
|
||||
Locations:
|
||||
City in the Sky Argorok Heart Container: Can_Defeat_Argorok
|
||||
City in the Sky Dungeon Reward: Can_Defeat_Argorok
|
||||
Exits:
|
||||
City in the Sky Entrance: Can_Defeat_Argorok
|
||||
@@ -0,0 +1,277 @@
|
||||
|
||||
# FOREST TEMPLE ENTRANCE ROOM
|
||||
|
||||
- Name: Forest Temple Entrance
|
||||
Region: Forest Temple
|
||||
Dungeon Start Area: True
|
||||
Events:
|
||||
Can Free Monkey in Entrance Room: Can_Break_Monkey_Cage
|
||||
Locations:
|
||||
Forest Temple Entrance Vines Chest: Can_Defeat_Walltula or Clawshot
|
||||
Exits:
|
||||
Forest Temple Entrance Ledge Above Monkey Cage: Can_Defeat_Walltula and Can_Defeat_Bokoblin and Can_Break_Monkey_Cage and Can_Climb_Vines
|
||||
North Faron Woods: Nothing
|
||||
|
||||
- Name: Forest Temple Entrance Ledge Above Monkey Cage
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Lobby: Nothing
|
||||
Forest Temple Entrance: Nothing
|
||||
|
||||
# FOREST TEMPLE LOBBY
|
||||
|
||||
- Name: Forest Temple Lobby
|
||||
Region: Forest Temple
|
||||
Locations:
|
||||
Forest Temple Central Chest Behind Stairs: Gale_Boomerang # Incase the player blocks it by lighting the torches
|
||||
Forest Temple Central Chest Hanging From Web: Can_Cut_Hanging_Web
|
||||
Exits:
|
||||
Forest Temple Lobby North Ledge: Can_Light_Torches
|
||||
Forest Temple Lobby West Ledge: Clawshot or (Can_Swing_on_Monkeys and 'Can_Free_Monkey_on_Totem')
|
||||
Forest Temple East Water Room Near Lobby: Can_Swing_on_Monkeys and 'Can_Free_Monkey_in_Entrance_Room'
|
||||
Forest Temple Entrance Ledge Above Monkey Cage: Nothing
|
||||
|
||||
- Name: Forest Temple Lobby North Ledge
|
||||
Region: Forest Temple
|
||||
Locations:
|
||||
Forest Temple Central North Chest: Nothing
|
||||
Exits:
|
||||
Forest Temple Outside Center South Ledge: Nothing
|
||||
Forest Temple Lobby: Nothing
|
||||
|
||||
- Name: Forest Temple Lobby West Ledge
|
||||
Region: Forest Temple
|
||||
Locations:
|
||||
Forest Temple Hint Sign: Nothing
|
||||
Exits:
|
||||
Forest Temple Lobby West Ledge Behind Web: Can_Break_Webs
|
||||
Forest Temple Lobby: Nothing
|
||||
|
||||
- Name: Forest Temple Lobby West Ledge Behind Web
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple West Main Room: Nothing
|
||||
Forest Temple Lobby West Ledge: Can_Break_Webs
|
||||
|
||||
# FOREST TEMPLE WEST MAIN ROOM
|
||||
|
||||
- Name: Forest Temple West Main Room
|
||||
Region: Forest Temple
|
||||
Locations:
|
||||
Forest Temple West Deku Like Chest: Can_Defeat_Walltula
|
||||
Exits:
|
||||
Forest Temple West Main Room Ledge near Big Baba Room: Can_Defeat_Walltula
|
||||
Forest Temple West Main Room Behind Boulder: Can_Pickup_Bomblings
|
||||
Forest Temple West Main Room Ledge near Outside: Can_Climb_Vines
|
||||
|
||||
- Name: Forest Temple West Main Room Ledge near Big Baba Room
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Big Baba Room: Nothing
|
||||
Forest Temple West Main Room: Nothing
|
||||
|
||||
- Name: Forest Temple West Main Room Behind Boulder
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple West Tileworm Room: Nothing
|
||||
Forest Temple West Main Room: Can_Smash
|
||||
|
||||
- Name: Forest Temple West Main Room Ledge near Outside
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Outside West Ledge: Nothing
|
||||
Forest Temple West Main Room: Nothing
|
||||
|
||||
# FOREST TEMPLE BIG BABA ROOM
|
||||
|
||||
- Name: Forest Temple Big Baba Room
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Monkey in Big Baba Room: count(Forest_Temple_Small_Key, 4) or Small_Keys == Keysy
|
||||
Locations:
|
||||
Forest Temple Big Baba Key: Can_Defeat_Big_Baba
|
||||
Exits:
|
||||
Forest Temple West Main Room Ledge near Big Baba Room: Nothing
|
||||
|
||||
# FOREST TEMPLE WEST TILEWORM ROOM
|
||||
- Name: Forest Temple West Tileworm Room
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Monkey in West Tileworm Room: Can_Light_Torches and (count(Forest_Temple_Small_Key, 4) or Small_Keys == Keysy)
|
||||
Locations:
|
||||
Forest Temple Totem Pole Chest: Can_Survive_One_Bonk
|
||||
Forest Temple West Tile Worm Room Vines Chest: Nothing
|
||||
Forest Temple West Tile Worm Chest Behind Stairs: Gale_Boomerang
|
||||
Exits:
|
||||
Forest Temple West Main Room Behind Boulder: Nothing
|
||||
|
||||
# FOREST TEMPLE OUTSIDE WEST AND CENTER AREA
|
||||
|
||||
- Name: Forest Temple Outside Center South Ledge
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Outside Center North Ledge: Can_Swing_on_Monkeys and 'Can_Free_Monkey_on_Totem' and
|
||||
'Can_Free_Monkey_in_Big_Baba_Room' and 'Can_Free_Monkey_in_West_Tileworm_Room'
|
||||
Forest Temple Lobby North Ledge: Nothing
|
||||
|
||||
- Name: Forest Temple Outside West Ledge
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Outside Center North Ledge: Gale_Boomerang
|
||||
Forest Temple West Main Room Ledge near Outside: Nothing
|
||||
|
||||
- Name: Forest Temple Outside Center North Ledge
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Outside Monkey: Gale_Boomerang
|
||||
Exits:
|
||||
Ook Miniboss Room: Nothing
|
||||
Forest Temple Outside West Ledge: Gale_Boomerang
|
||||
|
||||
# OOK MINIBOSS ROOM
|
||||
|
||||
- Name: Ook Miniboss Room
|
||||
Locations:
|
||||
Forest Temple Gale Boomerang: Can_Defeat_Ook
|
||||
Exits:
|
||||
Forest Temple Outside Center North Ledge: Gale_Boomerang
|
||||
|
||||
# FOREST TEMPLE EAST WATER ROOM
|
||||
|
||||
- Name: Forest Temple East Water Room Near Lobby
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple East Water Room: Can_Pickup_Bomblings # Can burn the web with the bombling
|
||||
Forest Temple Lobby: Nothing
|
||||
|
||||
- Name: Forest Temple East Water Room
|
||||
Region: Forest Temple
|
||||
Locations:
|
||||
Forest Temple Big Key Chest: Gale_Boomerang
|
||||
Forest Temple East Water Cave Chest: Nothing
|
||||
Exits:
|
||||
Forest Temple Second Monkey Outside Room: count(Forest_Temple_Small_Key, 4) or Small_Keys == Keysy
|
||||
Forest Temple Outside East: Nothing
|
||||
Forest Temple East Water Room Near Lobby: Can_Break_Webs
|
||||
|
||||
# FOREST TEMPLE SECOND MONKEY OUTSIDE ROOM
|
||||
|
||||
- Name: Forest Temple Second Monkey Outside Room
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Monkey on Totem: Can_Survive_Three_Bonks and Can_Defeat_Bokoblin
|
||||
Locations:
|
||||
Forest Temple Second Monkey Under Bridge Chest: Nothing
|
||||
Exits:
|
||||
Forest Temple East Water Room: count(Forest_Temple_Small_Key, 4) or Small_Keys == Keysy
|
||||
|
||||
# FOREST TEMPLE OUTSIDE EAST
|
||||
|
||||
- Name: Forest Temple Outside East
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple North Cross Room South Side: Nothing
|
||||
Forest Temple East Water Room: Nothing
|
||||
|
||||
# FOREST TEMPLE NORTH CROSS ROOM
|
||||
|
||||
- Name: Forest Temple North Cross Room South Side
|
||||
Region: Forest Temple
|
||||
Locations:
|
||||
Forest Temple Windless Bridge Chest: Nothing
|
||||
Exits:
|
||||
Forest Temple North Cross Room East Side: Gale_Boomerang
|
||||
Forest Temple North Cross Room West Side: Gale_Boomerang
|
||||
Forest Temple North Cross Room North Side: Gale_Boomerang
|
||||
Forest Temple Outside East: Nothing
|
||||
|
||||
- Name: Forest Temple North Cross Room East Side
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple East Tileworm Room: count(Forest_Temple_Small_Key, 4) or Small_Keys == Keysy
|
||||
Forest Temple North Cross Room South Side: Gale_Boomerang
|
||||
Forest Temple North Cross Room West Side: Nothing
|
||||
Forest Temple North Cross Room North Side: Gale_Boomerang
|
||||
|
||||
- Name: Forest Temple North Cross Room West Side
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Dark Spider Room: Nothing
|
||||
Forest Temple North Cross Room South Side: Gale_Boomerang
|
||||
Forest Temple North Cross Room East Side: Nothing
|
||||
Forest Temple North Cross Room North Side: Gale_Boomerang
|
||||
|
||||
- Name: Forest Temple North Cross Room North Side
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Boss Door Room South Side: Nothing
|
||||
Forest Temple North Cross Room South Side: Gale_Boomerang
|
||||
Forest Temple North Cross Room East Side: Gale_Boomerang
|
||||
Forest Temple North Cross Room West Side: Gale_Boomerang
|
||||
|
||||
# FOREST TEMPLE EAST TILEWORM ROOM
|
||||
|
||||
- Name: Forest Temple East Tileworm Room
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Monkey in East Tileworm Room: Can_Defeat_Tileworm and Can_Defeat_Skulltula and Can_Defeat_Walltula and Gale_Boomerang # or Tileworm Boost
|
||||
Locations:
|
||||
Forest Temple East Tile Worm Chest: Can_Defeat_Tileworm and Can_Defeat_Skulltula and Can_Defeat_Walltula and Gale_Boomerang # or Tileworm Boost
|
||||
Exits:
|
||||
Forest Temple North Cross Room East Side: count(Forest_Temple_Small_Key, 4) or Small_Keys == Keysy
|
||||
|
||||
# FOREST TEMPLE DARK SPIDER ROOM
|
||||
|
||||
- Name: Forest Temple Dark Spider Room
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Monkey in Dark Spider Room: Can_Break_Webs and Can_Break_Monkey_Cage
|
||||
Exits:
|
||||
Forest Temple North Cross Room West Side: Nothing
|
||||
|
||||
# FOREST TEMPLE BOSS DOOR ROOM
|
||||
|
||||
- Name: Forest Temple Boss Door Room South Side
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Boss Door Room West Side: Gale_Boomerang or Clawshot
|
||||
Forest Temple Boss Door Room North Side: Can_Swing_on_Monkeys and Can_Free_All_Monkeys_in_Forest_Temple
|
||||
|
||||
- Name: Forest Temple Boss Door Room West Side
|
||||
Region: Forest Temple
|
||||
Exits:
|
||||
Forest Temple Boss Door Room North Side: Clawshot
|
||||
Forest Temple North Deku Like Room: Nothing
|
||||
Forest Temple Boss Door Room South Side: Gale_Boomerang # Can do a jumpslash, but it's a bit precise
|
||||
|
||||
- Name: Forest Temple Boss Door Room North Side
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Fairy Access: Nothing
|
||||
Exits:
|
||||
Forest Temple Boss Room: Forest_Temple_Big_Key or Big_Keys == Keysy
|
||||
Forest Temple Boss Door Room South Side: Can_Swing_on_Monkeys and Can_Free_All_Monkeys_in_Forest_Temple
|
||||
Forest Temple Boss Door Room West Side: Clawshot
|
||||
|
||||
# FOREST TEMPLE NORTH DEKU LIKE ROOM
|
||||
|
||||
- Name: Forest Temple North Deku Like Room
|
||||
Region: Forest Temple
|
||||
Events:
|
||||
Can Free Monkey in North Deku Like Room: Gale_Boomerang
|
||||
Locations:
|
||||
Forest Temple North Deku Like Chest: Can_Defeat_Deku_Like or Gale_Boomerang
|
||||
Exits:
|
||||
Forest Temple Boss Door Room West Side: Nothing
|
||||
|
||||
# FOREST TEMPLE BOSS ROOM
|
||||
|
||||
- Name: Forest Temple Boss Room
|
||||
Events:
|
||||
Can Complete Forest Temple: Can_Defeat_Diababa
|
||||
Locations:
|
||||
Forest Temple Diababa Heart Container: Can_Defeat_Diababa
|
||||
Forest Temple Dungeon Reward: Can_Defeat_Diababa
|
||||
Exits:
|
||||
South Faron Woods: Can_Defeat_Diababa
|
||||
|
||||
@@ -0,0 +1,336 @@
|
||||
|
||||
# GORON MINES ENTRANCE ROOM
|
||||
|
||||
- Name: Goron Mines Entrance
|
||||
Region: Goron Mines
|
||||
Dungeon Start Area: True
|
||||
Exits:
|
||||
Goron Mines Entrance Room Upper Platforms: Can_Break_Wooden_Barrier and Iron_Boots
|
||||
Death Mountain Sumo Hall Goron Mines Tunnel: Nothing
|
||||
|
||||
- Name: Goron Mines Entrance Room Upper Platforms
|
||||
Region: Goron Mines
|
||||
Events:
|
||||
Can Open Goron Mines Entrance Room Iron Gate: Iron_Boots
|
||||
Locations:
|
||||
Goron Mines Entrance Chest: Nothing
|
||||
Exits:
|
||||
Goron Mines Entrance Room Near Central Magnet Room: "'Can_Open_Goron_Mines_Entrance_Room_Iron_Gate'"
|
||||
Goron Mines Entrance: Nothing
|
||||
|
||||
- Name: Goron Mines Entrance Room Near Central Magnet Room # Behind the gate that opens
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Central Magnet Room Near Entrance: Nothing
|
||||
Goron Mines Entrance Room Upper Platforms: "'Can_Open_Goron_Mines_Entrance_Room_Iron_Gate'"
|
||||
|
||||
# GORON MINES CENTRAL MAGNET ROOM
|
||||
|
||||
- Name: Goron Mines Central Magnet Room Near Entrance
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Main Magnet Room Bottom Chest: Nothing
|
||||
Exits:
|
||||
Goron Mines Magnet Ceiling Room Lower: Goron_Mines_Small_Key or Small_Keys == Keysy
|
||||
Goron Mines Central Magnet Room Center Tower: (Active_Goron_Mines_Magnets == On and Iron_Boots) or 'Can_Activate_Central_Tower_Magnet'
|
||||
Goron Mines Entrance Room Near Central Magnet Room: Nothing
|
||||
|
||||
- Name: Goron Mines Central Magnet Room Center Tower
|
||||
Region: Goron Mines
|
||||
Events:
|
||||
Can Activate Central Tower Magnet: Iron_Boots
|
||||
Exits:
|
||||
Goron Mines Central Magnet Room Near Crystal Switch Room: "'Can_Activate_Central_Tower_Magnet'"
|
||||
Goron Mines Central Magnet Room Near Entrance: "'Can_Activate_Central_Tower_Magnet'"
|
||||
Goron Mines Magnet Ceiling Room Near Central Magnet Room: Nothing
|
||||
|
||||
- Name: Goron Mines Central Magnet Room Near Crystal Switch Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Crystal Switch Room Water Side: Nothing
|
||||
Goron Mines Central Magnet Room Center Tower: "'Can_Activate_Central_Tower_Magnet'"
|
||||
Goron Mines Central Magnet Room Near Ceiling Dodongo Room: "'Can_Activate_Highest_Central_Magnet'"
|
||||
|
||||
- Name: Goron Mines Central Magnet Room Near Ceiling Dodongo Room
|
||||
Region: Goron Mines
|
||||
Events:
|
||||
Can Activate Highest Central Magnet: Bow and Iron_Boots
|
||||
Locations:
|
||||
Goron Mines Main Magnet Room Top Chest: Nothing
|
||||
Exits:
|
||||
Goron Mines Central Magnet Room Near Crystal Switch Room: "'Can_Activate_Highest_Central_Magnet'"
|
||||
Goron Mines Ceiling Dodongo Room Near Central Magnet Room: Nothing
|
||||
|
||||
# GORON MINES MAGNET CEILING ROOM
|
||||
|
||||
- Name: Goron Mines Magnet Ceiling Room Lower
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Magnet Ceiling Room Lower Past Stone Wall: Nothing
|
||||
Goron Mines Central Magnet Room Near Entrance: Nothing
|
||||
|
||||
- Name: Goron Mines Magnet Ceiling Room Lower Past Stone Wall
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines First Magnet Floor Room Lower: Nothing
|
||||
|
||||
- Name: Goron Mines Magnet Ceiling Room Upper Near First Magnet Floor Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Magnet Ceiling Room Ceiling: Iron_Boots
|
||||
Goron Mines Magnet Ceiling Room Lower: Nothing
|
||||
|
||||
- Name: Goron Mines Magnet Ceiling Room Ceiling
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Magnet Maze Chest: Nothing
|
||||
Exits:
|
||||
Goron Mines Magnet Ceiling Room Near Central Magnet Room: Nothing
|
||||
Goron Mines Magnet Ceiling Room Upper Near First Magnet Floor Room: Nothing
|
||||
Goron Mines Magnet Ceiling Room Lower: Nothing
|
||||
|
||||
- Name: Goron Mines Magnet Ceiling Room Near Central Magnet Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Central Magnet Room Center Tower: Nothing
|
||||
Goron Mines Magnet Ceiling Room Lower: Nothing
|
||||
|
||||
# GORON MINES FIRST MAGNET FLOOR ROOM
|
||||
|
||||
- Name: Goron Mines First Magnet Floor Room Lower
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines First Magnet Floor Room Lower Near Gor Amatos Room: Iron_Boots
|
||||
|
||||
- Name: Goron Mines First Magnet Floor Room Lower Near Gor Amatos Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Gor Amato Room Lower: Nothing
|
||||
Goron Mines First Magnet Floor Room Lower: Nothing
|
||||
|
||||
- Name: Goron Mines First Magnet Floor Room Upper Near Gor Amatos Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines First Magnet Floor Room Upper Near Magnet Ceiling Room: Iron_Boots
|
||||
Goron Mines First Magnet Floor Room Lower Near Gor Amatos Room: Nothing
|
||||
Goron Mines Gor Amato Room Upper: Nothing
|
||||
|
||||
- Name: Goron Mines First Magnet Floor Room Upper Near Magnet Ceiling Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Magnet Ceiling Room Upper Near First Magnet Floor Room: Nothing
|
||||
Goron Mines First Magnet Floor Room Upper Near Gor Amatos Room: Iron_Boots
|
||||
Goron Mines First Magnet Floor Room Lower: Nothing
|
||||
|
||||
# GORON MINES GOR AMATO ROOM
|
||||
|
||||
- Name: Goron Mines Gor Amato Room Lower
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Gor Amato Chest: Nothing
|
||||
Goron Mines Gor Amato Small Chest: Nothing
|
||||
Goron Mines Gor Amato Key Shard: Can_Talk_to_Humans
|
||||
Exits:
|
||||
Goron Mines Gor Amato Room Upper: Can_Climb_Ladders
|
||||
Goron Mines First Magnet Floor Room Lower Near Gor Amatos Room: Nothing
|
||||
|
||||
- Name: Goron Mines Gor Amato Room Upper
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines First Magnet Floor Room Upper Near Gor Amatos Room: Nothing
|
||||
Goron Mines Gor Amato Room Lower: Nothing
|
||||
|
||||
# GORON MINES CRYSTAL SWITCH ROOM
|
||||
|
||||
- Name: Goron Mines Crystal Switch Room Water Side
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Crystal Switch Room Underwater Chest: Iron_Boots
|
||||
Goron Mines Crystal Switch Room Small Chest: Iron_Boots
|
||||
Exits:
|
||||
Goron Mines Crystal Switch Room Beamos Side: Can_Hit_Crystal_Switch_at_Range or (Can_Hit_Crystal_Switch and Iron_Boots)
|
||||
Goron Mines Central Magnet Room Near Crystal Switch Room: Nothing
|
||||
|
||||
- Name: Goron Mines Crystal Switch Room Beamos Side
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines After Crystal Switch Room Magnet Wall Chest: Iron_Boots
|
||||
Exits:
|
||||
Goron Mines Crystal Switch Room Near Outside Room: Bow or (Sword and Iron_Boots)
|
||||
Goron Mines Crystal Switch Room Water Side: Can_Hit_Crystal_Switch
|
||||
|
||||
- Name: Goron Mines Crystal Switch Room Near Outside Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Outside Room: count(Goron_Mines_Small_Key, 2) or Small_Keys == Keysy
|
||||
Goron Mines Crystal Switch Room Beamos Side: Nothing
|
||||
|
||||
# GORON MINES OUTSIDE ROOM
|
||||
|
||||
- Name: Goron Mines Outside Room
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Outside Beamos Chest: Nothing
|
||||
Goron Mines Outside Underwater Chest: Iron_Boots and (Sword or Water_Bombs) # Can also just swim over the barrier
|
||||
Goron Mines Outside Clawshot Chest: Clawshot and (Bow or Slingshot)
|
||||
Exits:
|
||||
Goron Mines Floor Turning Room Near Outside Room: count(Goron_Mines_Small_Key, 3) or Small_Keys == Keysy
|
||||
Goron Mines Outside Room Near Boss Door Room: Clawshot or (Can_Defeat_Beamos and Iron_Boots and Bow)
|
||||
|
||||
- Name: Goron Mines Outside Room Near Boss Door Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Boss Door Room Near Outside Room: Nothing
|
||||
Goron Mines Outside Room: Nothing
|
||||
|
||||
# GORON MINES FLOOR TURNING ROOM
|
||||
|
||||
- Name: Goron Mines Floor Turning Room Near Outside Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Floor Turning Room Near Gor Ebizo Room Lower: Iron_Boots
|
||||
Goron Mines Outside Room: Nothing
|
||||
|
||||
- Name: Goron Mines Floor Turning Room Near Gor Ebizo Room Lower
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Gor Ebizo Room Lower: Nothing
|
||||
Goron Mines Floor Turning Room Near Outside Room: Nothing
|
||||
|
||||
- Name: Goron Mines Floor Turning Room Near Gor Ebizo Room Upper
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Floor Turning Room Near Miniboss Room: Iron_Boots
|
||||
Goron Mines Floor Turning Room Near Gor Ebizo Room Lower: Nothing
|
||||
Goron Mines Floor Turning Room Near Outside Room: Nothing
|
||||
Goron Mines Gor Ebizo Room Upper: Nothing
|
||||
|
||||
- Name: Goron Mines Floor Turning Room Near Miniboss Room
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Chest Before Dangoro: Nothing
|
||||
Exits:
|
||||
Dangoro Miniboss Room North Side: Nothing
|
||||
Goron Mines Floor Turning Room Near Outside Room: Nothing
|
||||
|
||||
# GORON MINES GOR EBIZO ROOM
|
||||
|
||||
- Name: Goron Mines Gor Ebizo Room Lower
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Gor Ebizo Chest: Nothing
|
||||
Goron Mines Gor Ebizo Key Shard: Can_Talk_to_Humans
|
||||
Goron Mines Hint Sign: Nothing
|
||||
Exits:
|
||||
Goron Mines Gor Ebizo Room Upper: Can_Climb_Ladders
|
||||
Goron Mines Floor Turning Room Near Gor Ebizo Room Lower: Nothing
|
||||
|
||||
- Name: Goron Mines Gor Ebizo Room Upper
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Floor Turning Room Near Gor Ebizo Room Upper: Nothing
|
||||
Goron Mines Gor Ebizo Room Lower: Nothing
|
||||
|
||||
# DANGORO MINIBOSS ROOM
|
||||
|
||||
- Name: Dangoro Miniboss Room North Side
|
||||
Exits:
|
||||
Dangoro Miniboss Room South Side: Can_Defeat_Dangoro
|
||||
Goron Mines Floor Turning Room Near Miniboss Room: Nothing
|
||||
|
||||
- Name: Dangoro Miniboss Room South Side
|
||||
Exits:
|
||||
Goron Mines Beamos Circle Room Near Miniboss Room: Nothing
|
||||
Dangoro Miniboss Room North Side: Can_Defeat_Dangoro
|
||||
|
||||
# GORON MINES BEAMOS CIRCLE ROOM
|
||||
|
||||
- Name: Goron Mines Beamos Circle Room Near Miniboss Room
|
||||
Region: Goron Mines
|
||||
Events:
|
||||
Can Cut Down Iron Platform in Beamos Circle Room: Bow
|
||||
Locations:
|
||||
Goron Mines Dangoro Chest: Nothing
|
||||
Exits:
|
||||
Goron Mines Beamos Circle Room Center: "'Can_Cut_Down_Iron_Platform_in_Beamos_Circle_Room'"
|
||||
Dangoro Miniboss Room South Side: Nothing
|
||||
|
||||
- Name: Goron Mines Beamos Circle Room Center
|
||||
Region: Goron Mines
|
||||
Events:
|
||||
Can Kill Beamos in Beamos Circle Room: Can_Defeat_Beamos
|
||||
Locations:
|
||||
Goron Mines Beamos Room Chest: "'Can_Kill_Beamos_in_Beamos_Circle_Room'"
|
||||
Exits:
|
||||
Goron Mines Beamos Circle Room Near Gor Liggs Room: "'Can_Kill_Beamos_in_Beamos_Circle_Room'"
|
||||
Goron Mines Beamos Circle Room Near Ceiling Dodongo Room: "'Can_Kill_Beamos_in_Beamos_Circle_Room'"
|
||||
Goron Mines Beamos Circle Room Near Miniboss Room: "'Can_Cut_Down_Iron_Platform_in_Beamos_Circle_Room'"
|
||||
|
||||
- Name: Goron Mines Beamos Circle Room Near Gor Liggs Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Gor Liggs Room: Nothing
|
||||
Goron Mines Beamos Circle Room Center: "'Can_Kill_Beamos_in_Beamos_Circle_Room'"
|
||||
|
||||
- Name: Goron Mines Beamos Circle Room Near Ceiling Dodongo Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Ceiling Dodongo Room Near Beamos Circle Room: Nothing
|
||||
Goron Mines Beamos Circle Room Center: "'Can_Kill_Beamos_in_Beamos_Circle_Room'"
|
||||
|
||||
# GORON MINES GOR LIGGS ROOM
|
||||
|
||||
- Name: Goron Mines Gor Liggs Room
|
||||
Region: Goron Mines
|
||||
Locations:
|
||||
Goron Mines Gor Liggs Chest: Nothing
|
||||
Goron Mines Gor Liggs Key Shard: Can_Talk_to_Humans
|
||||
Exits:
|
||||
Goron Mines Beamos Circle Room Near Gor Liggs Room: Nothing
|
||||
|
||||
# GORON MINES CEILING DODONGO ROOM
|
||||
|
||||
- Name: Goron Mines Ceiling Dodongo Room Near Beamos Circle Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Ceiling Dodongo Room Near Central Magnet Room: Gale_Boomerang or Clawshot or Bow # to get rid of ceiling torch slugs
|
||||
Goron Mines Beamos Circle Room Near Ceiling Dodongo Room: Nothing
|
||||
|
||||
- Name: Goron Mines Ceiling Dodongo Room Near Ceiling Dodongo
|
||||
Region: Goron Mines
|
||||
Events:
|
||||
Can Hit Ceiling Dodongo Switch: Iron_Boots and Bow
|
||||
Exits:
|
||||
Goron Mines Ceiling Dodongo Room Near Central Magnet Room: "'Can_Hit_Ceiling_Dodongo_Switch'"
|
||||
Goron Mines Ceiling Dodongo Room Near Beamos Circle Room: Gale_Boomerang or Clawshot or Bow # to get rid of ceiling torch slugs
|
||||
|
||||
- Name: Goron Mines Ceiling Dodongo Room Near Central Magnet Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Central Magnet Room Near Ceiling Dodongo Room: Nothing
|
||||
Goron Mines Ceiling Dodongo Room Near Ceiling Dodongo: "'Can_Hit_Ceiling_Dodongo_Switch'"
|
||||
|
||||
# GORON MINES BOSS DOOR ROOM
|
||||
|
||||
- Name: Goron Mines Boss Door Room Near Outside Room
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Boss Door Room Near Boss Door: Bow
|
||||
Goron Mines Outside Room Near Boss Door Room: Nothing
|
||||
|
||||
- Name: Goron Mines Boss Door Room Near Boss Door
|
||||
Region: Goron Mines
|
||||
Exits:
|
||||
Goron Mines Boss Room: count(Goron_Mines_Key_Shard, 3) or Big_Keys == Keysy
|
||||
Goron Mines Boss Door Room Near Outside Room: Bow
|
||||
|
||||
# GORON MINES BOSS ROOM
|
||||
|
||||
- Name: Goron Mines Boss Room
|
||||
Events:
|
||||
Can Complete Goron Mines: Can_Defeat_Fyrus
|
||||
Locations:
|
||||
Goron Mines Fyrus Heart Container: Can_Defeat_Fyrus
|
||||
Goron Mines Dungeon Reward: Can_Defeat_Fyrus
|
||||
Exits:
|
||||
Lower Kakariko Village: Can_Defeat_Fyrus
|
||||
@@ -0,0 +1,215 @@
|
||||
# HYRULE CASTLE ENTRANCE
|
||||
|
||||
- Name: Hyrule Castle Entrance
|
||||
Region: Hyrule Castle
|
||||
Dungeon Start Area: True
|
||||
Locations:
|
||||
Hyrule Castle Hint Sign: Nothing
|
||||
Exits:
|
||||
Hyrule Castle Entrance Near West Courtyard: Can_Defeat_Red_Bokoblin
|
||||
Hyrule Castle Entrance Near East Courtyard: Can_Defeat_Red_Bokoblin
|
||||
Hyrule Castle Main Hall Near Entrance: Can_Open_Doors and (Hyrule_Castle_Small_Key or Small_Keys == Keysy)
|
||||
Castle Town North Inside Barrier: Nothing
|
||||
|
||||
- Name: Hyrule Castle Entrance Near West Courtyard
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle West Courtyard: Nothing
|
||||
Hyrule Castle Entrance: Can_Defeat_Red_Bokoblin
|
||||
|
||||
- Name: Hyrule Castle Entrance Near East Courtyard
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle East Courtyard Near Entrance: Nothing
|
||||
Hyrule Castle Entrance: Can_Defeat_Red_Bokoblin
|
||||
|
||||
# HYRULE CASTLE WEST COURTYARD
|
||||
|
||||
- Name: Hyrule Castle West Courtyard
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle West Courtyard North Small Chest: Can_Defeat_Bokoblin
|
||||
Hyrule Castle West Courtyard Central Small Chest: Can_Defeat_Bokoblin
|
||||
Hyrule Castle King Bulblin Key: Can_Defeat_Bokoblin and Can_Defeat_King_Bulblin_Castle
|
||||
|
||||
# HYRULE CASTLE EAST COURTYARD
|
||||
|
||||
- Name: Hyrule Castle East Courtyard Near Entrance
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle East Courtyard Near Graveyard: Human_Link # For riding the boar
|
||||
Hyrule Castle Entrance Near East Courtyard: Nothing
|
||||
|
||||
- Name: Hyrule Castle East Courtyard Near Graveyard
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle East Wing Boomerang Puzzle Chest: Gale_Boomerang
|
||||
Hyrule Castle East Wing Balcony Chest: Gale_Boomerang and Can_Climb_Ladders
|
||||
Exits:
|
||||
Hyrule Castle Graveyard: Can_Dig
|
||||
Hyrule Castle East Courtyard Near Entrance: Gale_Boomerang and Can_Climb_Ladders
|
||||
|
||||
# HYRULE CASTLE GRAVEYARD
|
||||
|
||||
- Name: Hyrule Castle Graveyard
|
||||
Region: Hyrule Castle
|
||||
Events:
|
||||
Can Refill Lantern Oil: Can_Smash
|
||||
Locations:
|
||||
Hyrule Castle Graveyard Grave Switch Room Right Chest: Can_Smash
|
||||
Hyrule Castle Graveyard Grave Switch Room Front Left Chest: Can_Smash
|
||||
Hyrule Castle Graveyard Grave Switch Room Back Left Chest: Can_Smash
|
||||
Hyrule Castle Graveyard Owl Statue Chest: Can_Smash and Lantern and Restored_Dominion_Rod
|
||||
|
||||
# HYRULE CASTLE MAIN HALL
|
||||
|
||||
- Name: Hyrule Castle Main Hall Near Entrance
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle Main Hall Bottom: Can_Defeat_Bokoblin and Can_Defeat_Lizalfos
|
||||
Hyrule Castle Entrance: Nothing
|
||||
|
||||
- Name: Hyrule Castle Main Hall Bottom
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle Main Hall Northeast Chest: Clawshot and (Lantern or (Can_Defeat_Bokoblin and Can_Defeat_Lizalfos))
|
||||
Exits:
|
||||
Hyrule Castle Main Hall Near Entrance: Can_Defeat_Bokoblin and Can_Defeat_Lizalfos
|
||||
Hyrule Castle Main Hall Near First Darknut Room: Double_Clawshots
|
||||
Hyrule Castle Main Hall Near Double Dinalfos Room: Double_Clawshots and Lower_Hyrule_Castle_Chandelier == On
|
||||
|
||||
- Name: Hyrule Castle Main Hall Near First Darknut Room
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle First Darknut Room Near Main Hall: Can_Open_Doors
|
||||
Hyrule Castle Main Hall Bottom: Nothing
|
||||
|
||||
- Name: Hyrule Castle Main Hall Near Double Darknut Room
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle Main Hall Southwest Chest: Nothing
|
||||
Hyrule Castle Main Hall Northwest Chest: Double_Clawshots
|
||||
Exits:
|
||||
Hyrule Castle Main Hall Bottom: Nothing
|
||||
Hyrule Castle Double Darknut Room: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Darknuts'
|
||||
|
||||
- Name: Hyrule Castle Main Hall Near Double Dinalfos Room
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle Double Dinalfos Room: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Dinalfos'
|
||||
Hyrule Castle Main Hall Bottom: Nothing
|
||||
|
||||
|
||||
# HYRULE CASTLE FIRST DARKNUT ROOM
|
||||
|
||||
- Name: Hyrule Castle First Darknut Room Near Main Hall
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle Lantern Staircase Chest: Can_Defeat_Darknut and Lantern and Gale_Boomerang
|
||||
Exits:
|
||||
Hyrule Castle First Darknut Room Past Lantern Staircase: Can_Defeat_Darknut and Lantern and Gale_Boomerang
|
||||
Hyrule Castle Main Hall Near First Darknut Room: Can_Open_Doors
|
||||
|
||||
- Name: Hyrule Castle First Darknut Room Past Lantern Staircase
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle Torch Puzzle Room: Can_Open_Doors
|
||||
Hyrule Castle Hanging Painting Room: Can_Open_Doors
|
||||
Hyrule Castle First Darknut Room Near Main Hall: Can_Defeat_Darknut
|
||||
|
||||
# HYRULE CASTLE HANGING PAINTING ROOM
|
||||
|
||||
- Name: Hyrule Castle Hanging Painting Room
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle Double Darknut Room: Can_Open_Doors and Can_Knock_Down_Hyrule_Castle_Painting
|
||||
Hyrule Castle First Darknut Room Past Lantern Staircase: Can_Open_Doors
|
||||
|
||||
# HYRULE CASTLE DOUBLE DARKNUT ROOM
|
||||
|
||||
- Name: Hyrule Castle Double Darknut Room
|
||||
Region: Hyrule Castle
|
||||
Events:
|
||||
Can Defeat Hyrule Castle Double Darknuts: Can_Defeat_Darknut
|
||||
Exits:
|
||||
Hyrule Castle Main Hall Near Double Darknut Room: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Darknuts'
|
||||
Hyrule Castle Outside Balcony: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Darknuts'
|
||||
Hyrule Castle Hanging Painting Room: Can_Open_Doors
|
||||
|
||||
# HYRULE CASTLE TORCH PUZZLE ROOM
|
||||
|
||||
- Name: Hyrule Castle Torch Puzzle Room
|
||||
Region: Hyrule Castle
|
||||
Exits:
|
||||
Hyrule Castle Double Dinalfos Room: Can_Open_Doors and Lantern
|
||||
Hyrule Castle First Darknut Room Past Lantern Staircase: Can_Open_Doors
|
||||
|
||||
# HYRULE CASTLE DOUBLE DINALFOS ROOM
|
||||
|
||||
- Name: Hyrule Castle Double Dinalfos Room
|
||||
Region: Hyrule Castle
|
||||
Events:
|
||||
Can Defeat Hyrule Castle Double Dinalfos: Can_Defeat_Dinalfos
|
||||
Exits:
|
||||
Hyrule Castle Outside Balcony: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Dinalfos'
|
||||
Hyrule Castle Main Hall Near Double Dinalfos Room: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Dinalfos'
|
||||
Hyrule Castle Torch Puzzle Room: Can_Open_Doors
|
||||
|
||||
# HYRULE CASTLE OUTSIDE BALCONY
|
||||
|
||||
- Name: Hyrule Castle Outside Balcony
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle Southeast Balcony Tower Chest: Can_Defeat_Aerolfos
|
||||
Hyrule Castle Big Key Chest: Can_Open_Hyrule_Castle_Big_Key_Gate
|
||||
Exits:
|
||||
Hyrule Castle Final Climb Near Outside Balcony: Can_Open_Doors and (count(Hyrule_Castle_Small_Key, 2) or Small_Keys == Keysy)
|
||||
Hyrule Castle Double Darknut Room: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Darknuts'
|
||||
Hyrule Castle Double Dinalfos Room: Can_Open_Doors and 'Can_Defeat_Hyrule_Castle_Double_Dinalfos'
|
||||
|
||||
# HYRULE CASTLE FINAL CLIMB
|
||||
|
||||
- Name: Hyrule Castle Final Climb Near Outside Balcony
|
||||
Region: Hyrule Castle
|
||||
Events:
|
||||
Follow Ghost Soldiers: Can_Use_Senses
|
||||
Exits:
|
||||
Hyrule Castle Final Climb Top: "'Follow_Ghost_Soldiers' and Can_Defeat_Dinalfos and Can_Defeat_Darknut and Double_Clawshots and Spinner"
|
||||
Hyrule Castle Outside Balcony: Can_Open_Doors
|
||||
|
||||
- Name: Hyrule Castle Final Climb Top
|
||||
Region: Hyrule Castle
|
||||
Events:
|
||||
Follow Ghost Soldiers: Can_Use_Senses
|
||||
Exits:
|
||||
Hyrule Castle Treasure Room: Can_Open_Doors and (count(Hyrule_Castle_Small_Key, 3) or Small_Keys == Keysy)
|
||||
Hyrule Castle Throne Room: Hyrule_Castle_Big_Key or Big_Keys == Keysy
|
||||
Hyrule Castle Final Climb Near Outside Balcony: "'Follow_Ghost_Soldiers' and Can_Defeat_Dinalfos and Can_Defeat_Darknut and Double_Clawshots and Spinner"
|
||||
|
||||
# HYRULE CASTLE TREASURE ROOM
|
||||
|
||||
- Name: Hyrule Castle Treasure Room
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Hyrule Castle Treasure Room First Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Second Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Third Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Fourth Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Fifth Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Sixth Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Seventh Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room Eighth Small Chest: Nothing
|
||||
Hyrule Castle Treasure Room First Chest: Nothing
|
||||
Hyrule Castle Treasure Room Second Chest: Nothing
|
||||
Hyrule Castle Treasure Room Third Chest: Nothing
|
||||
Hyrule Castle Treasure Room Fourth Chest: Nothing
|
||||
Hyrule Castle Treasure Room Fifth Chest: Nothing
|
||||
Exits:
|
||||
Hyrule Castle Final Climb Top: Can_Open_Doors
|
||||
|
||||
# HYRULE CASTLE THRONE ROOM
|
||||
|
||||
- Name: Hyrule Castle Throne Room
|
||||
Region: Hyrule Castle
|
||||
Locations:
|
||||
Defeat Ganondorf: Master_Sword and Wolf_Link and Ending_Blow
|
||||
@@ -0,0 +1,438 @@
|
||||
|
||||
# LAKEBED TEMPLE LOBBY
|
||||
|
||||
- Name: Lakebed Temple Entrance
|
||||
Region: Lakebed Temple
|
||||
Dungeon Start Area: True
|
||||
Exits:
|
||||
Lakebed Temple Lobby: Zora_Armor
|
||||
Lake Hylia Lakebed Temple Entrance: Nothing
|
||||
|
||||
- Name: Lakebed Temple Lobby
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Pull Lakebed Lobby Lever: Can_Pull_Lakebed_Levers
|
||||
Locations:
|
||||
Lakebed Temple Lobby Left Chest: Nothing
|
||||
Lakebed Temple Lobby Rear Chest: Nothing
|
||||
Exits:
|
||||
Lakebed Temple Lobby Near Stalactite Room: "'Can_Pull_Lakebed_Lobby_Lever'"
|
||||
Lakebed Temple Entrance: Zora_Armor
|
||||
|
||||
- Name: Lakebed Temple Lobby Near Stalactite Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Stalactite Room Near Lobby: Nothing
|
||||
Lakebed Temple Lobby: "'Can_Pull_Lakebed_Lobby_Lever'"
|
||||
|
||||
# LAKEBED TEMPLE STALACTITE ROOM
|
||||
|
||||
- Name: Lakebed Temple Stalactite Room Near Lobby
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Lobby Near Stalactite Room: Nothing
|
||||
Lakebed Temple Stalactite Room Near Circling Current Room: Can_Launch_Bombs
|
||||
|
||||
- Name: Lakebed Temple Stalactite Room Near Circling Current Room
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple Stalactite Room Chest: Can_Launch_Bombs
|
||||
Exits:
|
||||
Lakebed Temple Circling Current Room South: Nothing
|
||||
Lakebed Temple Stalactite Room Near Lobby: Nothing
|
||||
|
||||
# LAKEBED TEMPLE CIRCLING CURRENT ROOM
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room South
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Central Room: Can_Open_Doors
|
||||
Lakebed Temple Stalactite Room Near Circling Current Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room East Lower
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Circling Current Room: Nothing
|
||||
Lakebed Temple Central Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room East Upper
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor Near Circling Current Room: Nothing
|
||||
Lakebed Temple Central Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room West Lower Near Central Room
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple Hint Sign: Nothing
|
||||
Exits:
|
||||
Lakebed Temple Circling Current Room West Lower Near West Waterwheel Room Lower: "'Can_Pull_East_Water_Supply_Lever' and 'Can_Turn_Lakebed_Staircase_with_Clawshot'"
|
||||
Lakebed Temple Central Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room West Lower Near West Waterwheel Room Lower
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Circling Current Room West Lower Near Central Room: "'Can_Pull_East_Water_Supply_Lever' and 'Can_Turn_Lakebed_Staircase_with_Clawshot'"
|
||||
Lakebed Temple West Waterwheel Room Lower: Nothing
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room West Upper Near Central Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Circling Current Room West Upper Near West Waterwheel Room Upper: "'Can_Pull_West_Water_Supply_Lever'"
|
||||
Lakebed Temple Central Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Circling Current Room West Upper Near West Waterwheel Room Upper
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Circling Current Room West Upper Near Central Room: "'Can_Pull_West_Water_Supply_Lever'"
|
||||
Lakebed Temple Outside West Waterwheel Room Upper Near Circling Current Room: Nothing
|
||||
|
||||
# LAKEBED TEMPLE CENTRAL ROOM
|
||||
|
||||
# We're just going to assume that you need to be human for everything in this room
|
||||
# because I don't feel like splitting this room up into 5 different sections to account
|
||||
# for two edge cases as wolf link that aren't going to be relevant any time soon
|
||||
- Name: Lakebed Temple Central Room
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Turn Lakebed Staircase: Human_Link
|
||||
Can Turn Lakebed Staircase with Clawshot: Clawshot
|
||||
Can Open Lakebed Temple Boss Door: (Lakebed_Temple_Big_Key or Big_Keys == Keysy) and 'Can_Pull_West_Water_Supply_Lever' and 'Can_Pull_East_Water_Supply_Lever'
|
||||
Locations:
|
||||
Lakebed Temple Central Room Small Chest: Human_Link
|
||||
Lakebed Temple Central Room Chest: Human_Link
|
||||
Lakebed Temple Chandelier Chest: Clawshot
|
||||
Lakebed Temple Central Room Spire Chest: Iron_Boots and ('Can_Pull_West_Water_Supply_Lever' or 'Can_Pull_East_Water_Supply_Lever')
|
||||
Exits:
|
||||
Lakebed Temple Circling Current Room East Lower: "'Can_Turn_Lakebed_Staircase'"
|
||||
Lakebed Temple Circling Current Room East Upper: "'Can_Turn_Lakebed_Staircase' and (Lakebed_Temple_Small_Key or Small_Keys == Keysy)"
|
||||
Lakebed Temple Circling Current Room West Lower Near Central Room: "'Can_Turn_Lakebed_Staircase'"
|
||||
Lakebed Temple Circling Current Room West Upper Near Central Room: "'Can_Turn_Lakebed_Staircase'"
|
||||
Lakebed Temple Circling Current Room South: Can_Open_Doors and 'Can_Turn_Lakebed_Staircase'
|
||||
Lakebed Temple Central Room Past Boss Door: "'Can_Open_Lakebed_Temple_Boss_Door'"
|
||||
|
||||
- Name: Lakebed Temple Central Room Past Boss Door
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Boss Room: Nothing
|
||||
Lakebed Temple Central Room: "'Can_Open_Lakebed_Temple_Boss_Door'"
|
||||
|
||||
# LAKEBED TEMPLE EAST WATERWHEEL ROOM FIRST FLOOR
|
||||
|
||||
- Name: Lakebed Temple East Waterwheel Room First Floor Near Circling Current Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple East Waterwheel Room Waterwheel: "'Can_Pull_East_Water_Supply_Lever'"
|
||||
Lakebed Temple East Waterwheel Room First Floor Lowest: Nothing
|
||||
Lakebed Temple Circling Current Room East Lower: Nothing
|
||||
|
||||
- Name: Lakebed Temple East Waterwheel Room Waterwheel # Being on the turning waterwheel
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Circling Current Room: Nothing
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Water Jet Room Land Side: Nothing
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Water Jet Room Water Side: Nothing
|
||||
|
||||
- Name: Lakebed Temple East Waterwheel Room First Floor Near Water Jet Room Land Side
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Water Jet Room Land Side: Nothing
|
||||
Lakebed Temple East Waterwheel Room Waterwheel: "'Can_Pull_East_Water_Supply_Lever'"
|
||||
Lakebed Temple East Waterwheel Room First Floor Lowest: Nothing
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Circling Current Room: Nothing # Can jump down to the right
|
||||
|
||||
- Name: Lakebed Temple East Waterwheel Room First Floor Near Water Jet Room Water Side
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Water Jet Room Water Side Near East Waterwheel Room: Nothing
|
||||
Lakebed Temple East Waterwheel Room Waterwheel: "'Can_Pull_East_Water_Supply_Lever'"
|
||||
Lakebed Temple East Waterwheel Room First Floor Lowest: Nothing
|
||||
|
||||
- Name: Lakebed Temple East Waterwheel Room First Floor Lowest
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple East Lower Waterwheel Stalactite Chest: Can_Launch_Bombs and Can_Climb_Vines
|
||||
Lakebed Temple East Lower Waterwheel Bridge Chest: Clawshot and 'Can_Pull_West_Water_Supply_Lever' and 'Can_Turn_Lakebed_Staircase'
|
||||
Exits:
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Circling Current Room: Can_Climb_Vines or ('Can_Pull_West_Water_Supply_Lever' and 'Can_Turn_Lakebed_Staircase')
|
||||
|
||||
# LAKEBED TEMPLE OUTSIDE EAST WATERWHEEL ROOM SECOND FLOOR
|
||||
|
||||
- Name: Lakebed Temple Outside East Waterwheel Room Second Floor Near Circling Current Room
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Pull Outside East Waterwheel Room Second Floor Lever: Clawshot or (Can_Launch_Bombs and Can_Climb_Vines)
|
||||
Locations:
|
||||
Lakebed Temple East Second Floor Southwest Chest: Nothing
|
||||
Exits:
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor North: Clawshot or (Can_Launch_Bombs and Can_Climb_Vines)
|
||||
Lakebed Temple Circling Current Room East Upper: Nothing
|
||||
|
||||
- Name: Lakebed Temple Outside East Waterwheel Room Second Floor North
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor North Near East Water Supply Room: Can_Smash
|
||||
Lakebed Temple East Waterwheel Room Second Floor: Nothing
|
||||
|
||||
- Name: Lakebed Temple Outside East Waterwheel Room Second Floor North Near East Water Supply Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple East Water Supply Room: Nothing
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor North: Can_Smash
|
||||
|
||||
- Name: Lakebed Temple Outside East Waterwheel Room Second Floor South Near East Water Supply Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor South: Nothing
|
||||
Lakebed Temple East Water Supply Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Outside East Waterwheel Room Second Floor South
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple East Second Floor Southeast Chest: Nothing
|
||||
Exits:
|
||||
Lakebed Temple East Waterwheel Room Second Floor: Nothing
|
||||
|
||||
# LAKEBED TEMPLE EAST WATERWHEEL ROOM SECOND FLOOR
|
||||
|
||||
- Name: Lakebed Temple East Waterwheel Room Second Floor
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor North: Nothing
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor South: Nothing
|
||||
Lakebed Temple East Waterwheel Room First Floor Lowest: Nothing
|
||||
|
||||
# LAKEBED TEMPLE EAST WATER SUPPLY ROOM
|
||||
|
||||
- Name: Lakebed Temple East Water Supply Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple East Water Supply Room Past Locked Door: count(Lakebed_Temple_Small_Key, 3) or Small_Keys == Keysy or (Small_Keys == Vanilla and count(Lakebed_Temple_Small_Key, 2))
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor North Near East Water Supply Room: Nothing
|
||||
Lakebed Temple Outside East Waterwheel Room Second Floor South Near East Water Supply Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple East Water Supply Room Past Locked Door
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Pull East Water Supply Lever: Can_Climb_Vines and Can_Climb_Ladders and Can_Pull_Lakebed_Levers
|
||||
Locations:
|
||||
Lakebed Temple East Water Supply Small Chest: Can_Climb_Vines and Iron_Boots # Boots required incase someone activates the lever and falls down
|
||||
Lakebed Temple East Water Supply Clawshot Chest: Can_Climb_Vines and Clawshot and Iron_Boots
|
||||
|
||||
# LAKEBED TEMPLE WATER JET ROOM (the room before the miniboss)
|
||||
|
||||
- Name: Lakebed Temple Water Jet Room Water Side Near East Waterwheel Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Water Jet Room Water Side Underwater: count(Lakebed_Temple_Small_Key, 3) or Small_Keys == Keysy
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Water Jet Room Water Side: Nothing
|
||||
|
||||
- Name: Lakebed Temple Water Jet Room Water Side Underwater
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple Before Deku Toad Underwater Left Chest: Iron_Boots
|
||||
Lakebed Temple Before Deku Toad Underwater Right Chest: Iron_Boots
|
||||
Exits:
|
||||
Lakebed Temple Water Jet Room Water Side Near East Waterwheel Room: count(Lakebed_Temple_Small_Key, 3) or Small_Keys == Keysy
|
||||
Lakebed Temple Water Jet Room Water Side Near MiniBoss Room: Iron_Boots and Water_Bombs
|
||||
|
||||
- Name: Lakebed Temple Water Jet Room Water Side Near MiniBoss Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Deku Toad Miniboss Room Water Tunnel: Zora_Armor
|
||||
Lakebed Temple Water Jet Room Water Side Underwater: Zora_Armor and Iron_Boots and Water_Bombs
|
||||
|
||||
- Name: Lakebed Temple Water Jet Room Land Side
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple Before Deku Toad Alcove Chest: Nothing
|
||||
Exits:
|
||||
Deku Toad Miniboss Room Near Water Jet Room Land Side: Nothing
|
||||
Lakebed Temple East Waterwheel Room First Floor Near Water Jet Room Land Side: Nothing
|
||||
|
||||
# DEKU TOAD MINIBOSS ROOM
|
||||
|
||||
- Name: Deku Toad Miniboss Room Water Tunnel
|
||||
Exits:
|
||||
Deku Toad Miniboss Room Battle Arena: Zora_Armor
|
||||
Lakebed Temple Water Jet Room Water Side Near MiniBoss Room: Zora_Armor
|
||||
|
||||
- Name: Deku Toad Miniboss Room Battle Arena
|
||||
Events:
|
||||
Can Pull Deku Toad Miniboss Room Lever: Clawshot
|
||||
Locations:
|
||||
Lakebed Temple Deku Toad Chest: Can_Defeat_Deku_Toad
|
||||
Exits:
|
||||
Deku Toad Miniboss Room Near Water Jet Room Land Side: Clawshot
|
||||
|
||||
- Name: Deku Toad Miniboss Room Near Water Jet Room Land Side
|
||||
Exits:
|
||||
Deku Toad Miniboss Room Battle Arena: "'Can_Pull_Deku_Toad_Miniboss_Room_Lever'"
|
||||
Lakebed Temple Water Jet Room Land Side: Nothing
|
||||
|
||||
# LAKEBED TEMPLE WEST WATERWHEEL ROOM
|
||||
|
||||
- Name: Lakebed Temple West Waterwheel Room Lower
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple West Lower Small Chest: Clawshot
|
||||
Exits:
|
||||
Lakebed Temple West Waterwheel Room Upper North: Clawshot
|
||||
Lakebed Temple Circling Current Room West Lower Near West Waterwheel Room Lower: Nothing
|
||||
Lakebed Temple West Waterwheel Room Lower Near Underwater Maze Room: Clawshot and 'Can_Pull_West_Water_Supply_Lever'
|
||||
|
||||
- Name: Lakebed Temple West Waterwheel Room Upper North
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple West Second Floor Central Small Chest: Clawshot
|
||||
Exits:
|
||||
Lakebed Temple West Waterwheel Room Upper Near North Door: Clawshot
|
||||
Lakebed Temple West Waterwheel Room Lower: Clawshot
|
||||
|
||||
- Name: Lakebed Temple West Waterwheel Room Upper Near North Door
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room North: Nothing
|
||||
Lakebed Temple West Waterwheel Room Upper North: Clawshot
|
||||
|
||||
- Name: Lakebed Temple West Waterwheel Room On Waterwheels
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room Southeast: Nothing
|
||||
Lakebed Temple Outside West Waterwheel Room Southwest: Nothing
|
||||
Lakebed Temple West Waterwheel Room Upper Near North Door: Clawshot
|
||||
Lakebed Temple West Waterwheel Room Upper North: Clawshot
|
||||
Lakebed Temple West Waterwheel Room Lower: Nothing
|
||||
|
||||
- Name: Lakebed Temple West Waterwheel Room Lower Near Underwater Maze Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Underwater Maze Room Near Waterwheel Room: Nothing
|
||||
Lakebed Temple West Waterwheel Room Lower: Clawshot and 'Can_Pull_West_Water_Supply_Lever'
|
||||
|
||||
# LAKEBED TEMPLE OUTSIDE WEST WATERWHEEL ROOM
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Upper Near Circling Current Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room Southeast: "'Can_Pull_Outside_West_Waterwheel_Room_Southeast_Lever'"
|
||||
Lakebed Temple Circling Current Room West Upper Near West Waterwheel Room Upper: Nothing
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Southeast
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Pull Outside West Waterwheel Room Southeast Lever: Clawshot
|
||||
Locations:
|
||||
Lakebed Temple West Second Floor Southeast Chest: Nothing
|
||||
Exits:
|
||||
Lakebed Temple West Waterwheel Room On Waterwheels: Nothing
|
||||
Lakebed Temple Outside West Waterwheel Room Upper Near Circling Current Room: "'Can_Pull_Outside_West_Waterwheel_Room_Southeast_Lever'"
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Southwest
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple West Waterwheel Room On Waterwheels: Nothing
|
||||
Lakebed Temple Outside West Waterwheel Room Southwest Pond: "'Can_Pull_West_Water_Supply_Lever'"
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Southwest Pond
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple West Second Floor Southwest Underwater Chest: Iron_Boots
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room Southwest Near West Water Supply Room: Clawshot or 'Can_Pull_West_Water_Supply_Lever'
|
||||
Lakebed Temple Outside West Waterwheel Room Southwest: "'Can_Pull_West_Water_Supply_Lever'"
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Southwest Near West Water Supply Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple West Water Supply Room: Nothing
|
||||
Lakebed Temple Outside West Waterwheel Room Southwest Pond: Nothing
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Northwest Near West Water Supply Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room Tektite Area: Nothing
|
||||
Lakebed Temple West Water Supply Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room Tektite Area
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Pull Outside West Waterwheel Room Northeast Lever: Clawshot
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room North: "'Can_Pull_Outside_West_Waterwheel_Room_Northeast_Lever'"
|
||||
Lakebed Temple Outside West Waterwheel Room Northwest Near West Water Supply Room: Clawshot
|
||||
|
||||
- Name: Lakebed Temple Outside West Waterwheel Room North
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple West Second Floor Northeast Chest: "'Can_Pull_West_Water_Supply_Lever'"
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room Tektite Area: Can_Launch_Bombs
|
||||
Lakebed Temple West Waterwheel Room Upper Near North Door: Nothing
|
||||
|
||||
# LAKEBED TEMPLE WEST WATER SUPPLY ROOM
|
||||
|
||||
- Name: Lakebed Temple West Water Supply Room
|
||||
Region: Lakebed Temple
|
||||
Events:
|
||||
Can Pull West Water Supply Lever: Clawshot and Can_Climb_Ladders and Iron_Boots
|
||||
Locations:
|
||||
Lakebed Temple West Water Supply Small Chest: Clawshot and Iron_Boots
|
||||
Lakebed Temple West Water Supply Chest: Clawshot and Iron_Boots
|
||||
Exits:
|
||||
Lakebed Temple Outside West Waterwheel Room Southwest Near West Water Supply Room: Nothing
|
||||
Lakebed Temple Outside West Waterwheel Room Northwest Near West Water Supply Room: Nothing
|
||||
|
||||
# LAKEBED TEMPLE UNDERWATER MAZE ROOM
|
||||
|
||||
- Name: Lakebed Temple Underwater Maze Room Near Waterwheel Room
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Underwater Maze Room Near Big Key Room Lower: Zora_Armor and Iron_Boots and Water_Bombs
|
||||
Lakebed Temple West Waterwheel Room Lower Near Underwater Maze Room: Nothing
|
||||
|
||||
- Name: Lakebed Temple Underwater Maze Room Near Big Key Room Lower
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple Underwater Maze Small Chest: Zora_Armor
|
||||
Exits:
|
||||
Lakebed Temple Underwater Maze Room Near Waterwheel Room: Zora_Armor and Iron_Boots and Water_Bombs
|
||||
Lakebed Temple Underwater Maze Room Near Big Key Room Upper: Zora_Armor and Iron_Boots and Water_Bombs
|
||||
Lakebed Temple Big Key Room Lower: Zora_Armor and Iron_Boots
|
||||
|
||||
- Name: Lakebed Temple Underwater Maze Room Near Big Key Room Upper
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Big Key Room Upper: Nothing
|
||||
Lakebed Temple Underwater Maze Room Near Big Key Room Lower: Zora_Armor and Iron_Boots and Water_Bombs
|
||||
|
||||
# LAKEBED TEMPLE BIG KEY ROOM
|
||||
|
||||
- Name: Lakebed Temple Big Key Room Upper
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Big Key Room Middle: Clawshot
|
||||
Lakebed Temple Underwater Maze Room Near Big Key Room Upper: Nothing
|
||||
|
||||
- Name: Lakebed Temple Big Key Room Middle
|
||||
Region: Lakebed Temple
|
||||
Locations:
|
||||
Lakebed Temple Big Key Chest: Nothing
|
||||
Exits:
|
||||
Lakebed Temple Big Key Room Lower: Nothing
|
||||
|
||||
- Name: Lakebed Temple Big Key Room Lower
|
||||
Region: Lakebed Temple
|
||||
Exits:
|
||||
Lakebed Temple Underwater Maze Room Near Big Key Room Lower: Zora_Armor and Iron_Boots
|
||||
|
||||
# LAKEBED TEMPLE BOSS ROOM
|
||||
|
||||
- Name: Lakebed Temple Boss Room
|
||||
Events:
|
||||
Can Complete Lakebed Temple: Can_Defeat_Morpheel
|
||||
Locations:
|
||||
Lakebed Temple Morpheel Heart Container: Can_Defeat_Morpheel
|
||||
Lakebed Temple Dungeon Reward: Can_Defeat_Morpheel
|
||||
Exits:
|
||||
Lake Hylia Lanayru Spring: Can_Defeat_Morpheel
|
||||
@@ -0,0 +1,194 @@
|
||||
# PALACE OF TWILIGHT ENTRANCE
|
||||
|
||||
- Name: Palace of Twilight Entrance
|
||||
Region: Palace of Twilight
|
||||
Dungeon Start Area: True
|
||||
Events:
|
||||
Can Place East Sol at Palace of Twilight Entrance: "'Can_Bring_East_Sol_to_Palace_of_Twilight_Entrance'"
|
||||
Can Place West Sol at Palace of Twilight Entrance: "'Can_Bring_West_Sol_to_Palace_of_Twilight_Entrance'"
|
||||
Locations:
|
||||
Palace of Twilight Collect Both Sols: "'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance' and 'Can_Place_West_Sol_at_Palace_of_Twilight_Entrance'"
|
||||
Palace of Twilight Hint Sign: Nothing
|
||||
Exits:
|
||||
Palace of Twilight West Wing First Room Near Entrance: Nothing
|
||||
Palace of Twilight Entrance Near East Wing First Room: Nothing
|
||||
Palace of Twilight Entrance Near North Wing: Light_Sword
|
||||
Twilight Realm Portal: Nothing
|
||||
|
||||
- Name: Palace of Twilight Entrance Near East Wing First Room
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight East Wing First Room Near Entrance: Nothing
|
||||
Palace of Twilight Entrance: "'Can_Place_West_Sol_at_Palace_of_Twilight_Entrance'"
|
||||
|
||||
- Name: Palace of Twilight Entrance Near North Wing
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight North Wing First Room Bottom: Nothing
|
||||
Palace of Twilight Entrance: Light_Sword
|
||||
|
||||
# PALACE OF TWILIGHT WEST WING FIRST ROOM
|
||||
|
||||
- Name: Palace of Twilight West Wing First Room Near Entrance
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight West Wing First Room Central Chest: Can_Defeat_Zant_Head
|
||||
Palace of Twilight West Wing Chest Behind Wall of Darkness: Light_Sword and Clawshot
|
||||
Exits:
|
||||
Palace of Twilight West Wing First Room Near Second Room: Clawshot
|
||||
Palace of Twilight Entrance: Nothing
|
||||
|
||||
- Name: Palace of Twilight West Wing First Room Near Second Room
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight West Wing Second Room Near First Room: count(Palace_of_Twilight_Small_Key, 6) or (Small_Keys == Vanilla and count(Palace_of_Twilight_Small_Key, 3)) or Small_Keys == Keysy
|
||||
Palace of Twilight West Wing First Room Near Entrance: Nothing
|
||||
|
||||
# PALACE OF TWILIGHT WEST WING SECOND ROOM
|
||||
|
||||
- Name: Palace of Twilight West Wing Second Room Near First Room
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight West Wing Second Room Middle: Nothing
|
||||
Palace of Twilight West Wing First Room Near Second Room: Nothing
|
||||
|
||||
- Name: Palace of Twilight West Wing Second Room Middle
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight West Wing Second Room Central Chest: Can_Defeat_Zant_Head
|
||||
Palace of Twilight West Wing Second Room Lower South Chest: Can_Defeat_Zant_Head
|
||||
Palace of Twilight West Wing Second Room Southeast Chest: Double_Clawshots
|
||||
Exits:
|
||||
Palace of Twilight West Wing Second Room Near Phantom Zant Room: Clawshot
|
||||
Palace of Twilight West Wing Second Room Near First Room: "'Can_Bring_West_Sol_to_Palace_of_Twilight_Entrance'"
|
||||
|
||||
- Name: Palace of Twilight West Wing Second Room Near Phantom Zant Room
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight West Wing Phantom Zant Room: count(Palace_of_Twilight_Small_Key, 7) or Small_Keys == Keysy
|
||||
Palace of Twilight West Wing Second Room Middle: Nothing
|
||||
|
||||
# PALACE OF TWILIGHT WEST WING PHANTOM ZANT ROOM
|
||||
|
||||
- Name: Palace of Twilight West Wing Phantom Zant Room
|
||||
Region: Palace of Twilight
|
||||
Events:
|
||||
Can Bring West Sol to Palace of Twilight Entrance: Can_Defeat_Phantom_Zant and Human_Link # Only human can carry the sol
|
||||
Exits:
|
||||
Palace of Twilight West Wing Second Room Near Phantom Zant Room: "'Can_Bring_West_Sol_to_Palace_of_Twilight_Entrance'"
|
||||
|
||||
# PALACE OF TWILIGHT EAST WING FIRST ROOM
|
||||
|
||||
- Name: Palace of Twilight East Wing First Room Near Entrance
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight East Wing First Room Bottom: Nothing
|
||||
Palace of Twilight East Wing First Room Near Second Room: Clawshot
|
||||
|
||||
- Name: Palace of Twilight East Wing First Room Bottom
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight East Wing First Room East Alcove Chest: Light_Sword or 'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance'
|
||||
Palace of Twilight East Wing First Room West Alcove Chest: Light_Sword or 'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance'
|
||||
Exits:
|
||||
Palace of Twilight East Wing First Room Near Second Room: Double_Clawshots or Light_Sword or 'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance'
|
||||
|
||||
- Name: Palace of Twilight East Wing First Room Near Second Room
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight East Wing First Room North Small Chest: Nothing
|
||||
Palace of Twilight East Wing First Room Zant Head Chest: Can_Defeat_Zant_Head
|
||||
Exits:
|
||||
Palace of Twilight East Wing Second Room Near First Room: count(Palace_of_Twilight_Small_Key, 6) or (Small_Keys == Vanilla and count(Palace_of_Twilight_Small_Key, 3)) or Small_Keys == Keysy
|
||||
Palace of Twilight East Wing First Room Bottom: Nothing
|
||||
Palace of Twilight East Wing First Room Near Entrance: Light_Sword or 'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance'
|
||||
|
||||
# PALACE OF TWILIGHT EAST WING SECOND ROOM
|
||||
|
||||
- Name: Palace of Twilight East Wing Second Room Near First Room
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight East Wing Second Room Near Phantom Zant Room: Clawshot and Can_Defeat_Zant_Head and Can_Defeat_Shadow_Beast
|
||||
Palace of Twilight East Wing First Room Near Second Room: Nothing
|
||||
|
||||
- Name: Palace of Twilight East Wing Second Room Near Phantom Zant Room
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight East Wing Second Room Northeast Chest: Double_Clawshots
|
||||
Palace of Twilight East Wing Second Room Northwest Chest: Clawshot
|
||||
Palace of Twilight East Wing Second Room Southwest Chest: Double_Clawshots
|
||||
Palace of Twilight East Wing Second Room Southeast Chest: Double_Clawshots and Can_Defeat_Zant_Head and Can_Defeat_Shadow_Beast
|
||||
Exits:
|
||||
Palace of Twilight East Wing Phantom Zant Room: count(Palace_of_Twilight_Small_Key, 7) or Small_Keys == Keysy
|
||||
Palace of Twilight East Wing Second Room Near First Room: Double_Clawshots and 'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance'
|
||||
|
||||
# PALACE OF TWILIGHT EAST PHANTOM ZANT ROOM
|
||||
|
||||
- Name: Palace of Twilight East Wing Phantom Zant Room
|
||||
Region: Palace of Twilight
|
||||
Events:
|
||||
Can Bring East Sol to Palace of Twilight Entrance: Can_Defeat_Phantom_Zant and Human_Link
|
||||
Exits:
|
||||
Palace of Twilight East Wing Second Room Near Phantom Zant Room: "'Can_Place_East_Sol_at_Palace_of_Twilight_Entrance'"
|
||||
|
||||
# PALACE OF TWILIGHT NORTH WING FIRST ROOM
|
||||
|
||||
- Name: Palace of Twilight North Wing First Room Bottom
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight Central First Room Chest: Light_Sword and Can_Defeat_Zant_Head
|
||||
Exits:
|
||||
Palace of Twilight Entrance Near North Wing: Nothing
|
||||
Palace of Twilight North Wing First Room Top: Light_Sword
|
||||
|
||||
- Name: Palace of Twilight North Wing First Room Top
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight North Wing Outside Room: count(Palace_of_Twilight_Small_Key, 5) or Small_Keys == Keysy
|
||||
Palace of Twilight North Wing First Room Bottom: Nothing
|
||||
|
||||
# PALACE OF TWILIGHT NORTH WING OUTSIDE ROOM
|
||||
|
||||
- Name: Palace of Twilight North Wing Outside Room
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight Big Key Chest: Light_Sword and Double_Clawshots
|
||||
Palace of Twilight Central Outdoor Chest: Light_Sword and Can_Defeat_Zant_Head
|
||||
Exits:
|
||||
Palace of Twilight North Wing Tower Bottom: count(Palace_of_Twilight_Small_Key, 6) or Small_Keys == Keysy
|
||||
Palace of Twilight North Wing First Room Top: Nothing
|
||||
|
||||
# PALACE OF TWILIGHT NORTH WING TOWER
|
||||
|
||||
- Name: Palace of Twilight North Wing Tower Bottom
|
||||
Region: Palace of Twilight
|
||||
Locations:
|
||||
Palace of Twilight Central Tower Chest: Clawshot and Light_Sword and Can_Defeat_Zant_Head
|
||||
Exits:
|
||||
Palace of Twilight North Wing Tower Top: Clawshot and Light_Sword
|
||||
Palace of Twilight North Wing Outside Room: Nothing
|
||||
|
||||
- Name: Palace of Twilight North Wing Tower Top
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight Boss Door Room: count(Palace_of_Twilight_Small_Key, 7) or Small_Keys == Keysy
|
||||
Palace of Twilight North Wing Tower Bottom: Nothing
|
||||
|
||||
# PALACE OF TWILIGHT BOSS DOOR ROOM
|
||||
|
||||
- Name: Palace of Twilight Boss Door Room
|
||||
Region: Palace of Twilight
|
||||
Exits:
|
||||
Palace of Twilight Boss Room: Can_Defeat_Shadow_Beast and (Palace_of_Twilight_Big_Key or Big_Keys == Keysy)
|
||||
Palace of Twilight North Wing Tower Top: Nothing
|
||||
|
||||
# PALACE OF TWILIGHT BOSS ROOM
|
||||
|
||||
- Name: Palace of Twilight Boss Room
|
||||
Events:
|
||||
Can Complete Palace of Twilight: Can_Defeat_Zant
|
||||
Locations:
|
||||
Palace of Twilight Zant Heart Container: Can_Defeat_Zant
|
||||
Exits:
|
||||
Palace of Twilight Entrance: Can_Defeat_Zant
|
||||
|
||||
@@ -0,0 +1,346 @@
|
||||
# SNOWPEAK RUINS ENTRANCE
|
||||
|
||||
- Name: Snowpeak Ruins Entrance
|
||||
Region: Snowpeak Ruins
|
||||
Dungeon Start Area: True
|
||||
Locations:
|
||||
Snowpeak Ruins Lobby West Armor Chest: Can_Break_Armor
|
||||
Snowpeak Ruins Lobby East Armor Chest: Can_Break_Armor
|
||||
Snowpeak Ruins Lobby Armor Poe: Can_Break_Armor and Can_Use_Senses
|
||||
Snowpeak Ruins Lobby Poe: Can_Use_Senses
|
||||
Exits:
|
||||
Snowpeak Ruins Entrance Near Caged Freezard Room: Clawshot and 'Can_Break_Snowpeak_Entrance_Ice_Wall_Shortcut'
|
||||
Snowpeak Ruins Yetas Room: Can_Open_Doors
|
||||
Snowpeak Ruins Room Below Broken Floor Near Entrance: Can_Open_Doors
|
||||
Snowpeak Ruins East Door Interior: Can_Open_Doors
|
||||
Snowpeak Ruins West Door Interior: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Entrance Near Caged Freezard Room
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Break Snowpeak Entrance Ice Wall Shortcut: Can_Break_Ice
|
||||
Locations:
|
||||
Snowpeak Ruins Lobby Chandelier Chest: Ball_and_Chain
|
||||
Exits:
|
||||
Snowpeak Ruins Entrance Near Second Floor Mini Freezard Room: Ball_and_Chain
|
||||
Snowpeak Ruins Caged Freezard Room Second Floor: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 3) or Small_Keys == Keysy)
|
||||
Snowpeak Ruins Entrance: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins Entrance Near Second Floor Mini Freezard Room
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Second Floor Mini Freezard Room: Nothing
|
||||
Snowpeak Ruins Entrance Near Caged Freezard Room: Ball_and_Chain
|
||||
|
||||
# SNOWPEAK RUINS YETAS ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Yetas Room
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Mansion Map: Can_Talk_to_Humans
|
||||
Snowpeak Ruins Hint Sign: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins Kitchen: Can_Open_Doors
|
||||
Snowpeak Ruins West Courtyard: Ordon_Pumpkin or Small_Keys == Keysy
|
||||
Snowpeak Ruins Caged Freezard Room First Floor: Ordon_Cheese or Small_Keys == Keysy
|
||||
Snowpeak Ruins Entrance: Can_Open_Doors
|
||||
|
||||
# SNOWPEAK RUINS KITCHEN
|
||||
|
||||
- Name: Snowpeak Ruins Kitchen
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Block Puzzle Room Near Kitchen: Can_Open_Doors
|
||||
Snowpeak Ruins Yetas Room: Can_Open_Doors
|
||||
|
||||
# SNOWPEAK RUINS BLOCK PUZZLE ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Block Puzzle Room Near Kitchen
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Press Snowpeak Block Puzzle Ice Switch: Can_Break_Ice
|
||||
Exits:
|
||||
Snowpeak Ruins East Courtyard Near Block Puzzle Room First Floor: Can_Open_Doors
|
||||
Snowpeak Ruins Block Puzzle Room Near Northeast Chilfos Room First Floor: "'Can_Push_Snowpeak_Block_Puzzle_Highest_Block'"
|
||||
Snowpeak Ruins Kitchen: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Block Puzzle Room Near Northeast Chilfos Room First Floor
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Northeast Chilfos Room Near Block Puzzle Room First Floor: Can_Open_Doors
|
||||
Snowpeak Ruins Block Puzzle Room Near Kitchen: Nothing
|
||||
Snowpeak Ruins Block Puzzle Room Second Floor: "'Can_Push_Snowpeak_Block_Puzzle_Highest_Block'"
|
||||
|
||||
- Name: Snowpeak Ruins Block Puzzle Room Second Floor
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Push Snowpeak Block Puzzle Highest Block: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins Second Floor Mini Freezard Room: Can_Open_Doors
|
||||
Snowpeak Ruins East Courtyard Balcony Near Block Puzzle Room: Can_Open_Doors and 'Can_Press_Snowpeak_Block_Puzzle_Ice_Switch'
|
||||
Snowpeak Ruins Block Puzzle Room Near Kitchen: "'Can_Push_Snowpeak_Block_Puzzle_Highest_Block'"
|
||||
|
||||
- Name: Snowpeak Ruins Block Puzzle Room Near Northeast Chilfos Room Second Floor
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Northeast Chilfos Room Near Block Puzzle Room Second Floor: Nothing
|
||||
Snowpeak Ruins Block Puzzle Room Near Northeast Chilfos Room First Floor: Nothing
|
||||
|
||||
# SNOWPEAK RUINS EAST COURTYARD
|
||||
|
||||
- Name: Snowpeak Ruins East Courtyard Near Block Puzzle Room First Floor
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins East Courtyard: Can_Dig
|
||||
Snowpeak Ruins East Courtyard Hallway: Can_Break_Ice
|
||||
Snowpeak Ruins Block Puzzle Room Near Kitchen: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins East Courtyard
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins East Courtyard Buried Chest: Can_Dig
|
||||
Snowpeak Ruins East Courtyard Chest: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins East Courtyard Hallway: Can_Open_Doors
|
||||
Snowpeak Ruins West Courtyard: Can_Break_Ice
|
||||
|
||||
- Name: Snowpeak Ruins East Courtyard Hallway
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Triple Mini Freezard Room: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 4) or Small_Keys == Keysy)
|
||||
Snowpeak Ruins East Courtyard: Can_Open_Doors
|
||||
Snowpeak Ruins East Courtyard Near Block Puzzle Room First Floor: Can_Break_Ice
|
||||
|
||||
- Name: Snowpeak Ruins East Courtyard Balcony Near Block Puzzle Room
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins East Courtyard Balcony Near Northeast Chilfos Room: Can_Defeat_Chilfos and Clawshot
|
||||
Snowpeak Ruins East Courtyard Near Block Puzzle Room First Floor: Nothing
|
||||
Snowpeak Ruins East Courtyard: Nothing
|
||||
Snowpeak Ruins East Courtyard Hallway: Nothing
|
||||
Snowpeak Ruins Block Puzzle Room Second Floor: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins East Courtyard Balcony Near Northeast Chilfos Room
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Northeast Chilfos Room Near East Courtyard Balcony: Can_Open_Doors
|
||||
|
||||
# SNOWPEAK RUINS TRIPLE MINI FREEZARD ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Triple Mini Freezard Room
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Northeast Chilfos Room First Floor: Can_Defeat_Mini_Freezard
|
||||
Snowpeak Ruins East Courtyard Hallway: Can_Defeat_Mini_Freezard and (count(Snowpeak_Ruins_Small_Key, 4) or Small_Keys == Keysy)
|
||||
|
||||
# SNOWPEAK RUINS NORTHEAST CHILLFOS ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Northeast Chilfos Room First Floor
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Northeast Chilfos Room Near Block Puzzle Room First Floor: Can_Defeat_Chilfos and Can_Open_Doors
|
||||
Snowpeak Ruins Northeast Chilfos Room Near East Courtyard Balcony: Clawshot and 'Can_Break_Snowpeak_Northeast_Chilfos_Room_Ice_Wall_Shortcut'
|
||||
Snowpeak Ruins Triple Mini Freezard Room: Can_Defeat_Chilfos and Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Northeast Chilfos Room Near Block Puzzle Room First Floor
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Ordon Pumpkin Chest: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins Block Puzzle Room Near Northeast Chilfos Room First Floor: Can_Open_Doors
|
||||
Snowpeak Ruins Northeast Chilfos Room First Floor: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Northeast Chilfos Room Near East Courtyard Balcony
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Break Snowpeak Northeast Chilfos Room Ice Wall Shortcut: Can_Break_Ice
|
||||
Exits:
|
||||
Snowpeak Ruins Northeast Chilfos Room Near Block Puzzle Room Second Floor: Ball_and_Chain
|
||||
Snowpeak Ruins Northeast Chilfos Room First Floor: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins Northeast Chilfos Room Near Block Puzzle Room Second Floor
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Northeast Chandelier Chest: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins Block Puzzle Room Near Northeast Chilfos Room Second Floor: Can_Open_Doors
|
||||
Snowpeak Ruins Northeast Chilfos Room Near East Courtyard Balcony: Ball_and_Chain
|
||||
Snowpeak Ruins Northeast Chilfos Room First Floor: Nothing
|
||||
|
||||
# SNOWPEAK RUINS WEST COURTYARD
|
||||
|
||||
- Name: Snowpeak Ruins West Courtyard
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins West Courtyard Buried Chest: Can_Dig
|
||||
Snowpeak Ruins Courtyard Central Chest: Can_Break_Ice
|
||||
Exits:
|
||||
Snowpeak Ruins West Canon Room Near Courtyard: Can_Open_Doors
|
||||
Snowpeak Ruins East Courtyard: Can_Break_Ice
|
||||
Snowpeak Ruins West Courtyard Hallway Near Ladder: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 4) or Small_Keys == Keysy)
|
||||
Darkhammer Miniboss Room: Can_Open_Doors and (Ball_and_Chain or (Can_Launch_Canonball and 'Can_Load_Snowpeak_West_Courtyard_Hallway_Canonball_Holder'))
|
||||
|
||||
- Name: Snowpeak Ruins West Courtyard Hallway Near Ladder
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Load Snowpeak West Courtyard Hallway Canonball Holder: Human_Link
|
||||
Exits:
|
||||
Snowpeak Ruins West Courtyard North Balcony: Can_Climb_Ladders and 'Can_Kill_Snowpeak_Courtyard_Balcony_Freezard'
|
||||
Snowpeak Ruins West Hallway Near Caged Freezard Room: "'Can_Push_Snowpeak_West_Courtyard_Hallway_Block'"
|
||||
Snowpeak Ruins West Courtyard: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 4) or Small_Keys == Keysy)
|
||||
|
||||
- Name: Snowpeak Ruins West Hallway Near Caged Freezard Room
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Load Snowpeak Hallway to Caged Freezard Canonball Holder: Human_Link
|
||||
Can Push Snowpeak West Courtyard Hallway Block: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins Caged Freezard Room First Floor: Can_Open_Doors
|
||||
Snowpeak Ruins West Courtyard Hallway Near Ladder: "'Can_Push_Snowpeak_West_Courtyard_Hallway_Block'"
|
||||
|
||||
- Name: Snowpeak Ruins West Courtyard South Balcony
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Break Snowpeak Balcony Ice Wall Shortcut: Can_Break_Ice
|
||||
Can Kill Snowpeak Courtyard Balcony Freezard: Can_Launch_Canonball and 'Can_Load_Snowpeak_Double_Freezard_Room_Canonball_Holder'
|
||||
Exits:
|
||||
Snowpeak Ruins Double Freezard Room Behind Freezard: Can_Open_Doors
|
||||
Snowpeak Ruins West Courtyard: Nothing
|
||||
Snowpeak Ruins West Courtyard Hallway Near Ladder: Nothing
|
||||
Snowpeak Ruins East Courtyard: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins West Courtyard North Balcony
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Chapel: Can_Open_Doors
|
||||
Snowpeak Ruins Boss Room: Snowpeak_Ruins_Bedroom_Key or Big_Keys == Keysy
|
||||
|
||||
# SNOWPEAK RUINS WEST CANON ROOM
|
||||
|
||||
- Name: Snowpeak Ruins West Canon Room Near Courtyard
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Launch West Canon Room Canonballs: Can_Launch_Canonball
|
||||
Locations:
|
||||
Snowpeak Ruins West Cannon Room Central Chest: Can_Break_Ice
|
||||
Snowpeak Ruins West Cannon Room Corner Chest: Can_Break_Ice or 'Can_Launch_West_Canon_Room_Canonballs'
|
||||
Exits:
|
||||
Snowpeak Ruins West Canon Room Near Wooden Beam Room: Can_Break_Ice or 'Can_Launch_West_Canon_Room_Canonballs'
|
||||
Snowpeak Ruins West Courtyard: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins West Canon Room Near Wooden Beam Room
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Wooden Beam Room First Floor: Can_Open_Doors
|
||||
Snowpeak Ruins West Canon Room Near Courtyard: Can_Break_Ice or 'Can_Launch_West_Canon_Room_Canonballs'
|
||||
|
||||
# SNOWPEAK RUINS WOODEN BEAM ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Wooden Beam Room First Floor
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Wooden Beam Central Chest: Can_Defeat_Ice_Keese
|
||||
Snowpeak Ruins Wooden Beam Northwest Chest: Can_Defeat_Ice_Keese
|
||||
Exits:
|
||||
Snowpeak Ruins West Canon Room Near Wooden Beam Room: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Wooden Beam Room Second Floor
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Break Snowpeak Wooden Beam Room Ice Shortcut: Can_Break_Ice
|
||||
Locations:
|
||||
Snowpeak Ruins Wooden Beam Chandelier Chest: Ball_and_Chain
|
||||
Exits:
|
||||
Snowpeak Ruins Wooden Beam Room First Floor: Nothing
|
||||
Snowpeak Ruins Caged Freezard Room Second Floor: Can_Open_Doors
|
||||
|
||||
# DARKHAMMER MINIBOSS ROOM
|
||||
|
||||
- Name: Darkhammer Miniboss Room
|
||||
Locations:
|
||||
Snowpeak Ruins Ball and Chain: Can_Defeat_Darkhammer
|
||||
Snowpeak Ruins Chest After Darkhammer: Can_Break_Ice and Can_Defeat_Darkhammer
|
||||
Exits:
|
||||
Snowpeak Ruins West Courtyard: Can_Open_Doors
|
||||
|
||||
# SNOWPEAK RUINS CAGED FREEZARD ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Caged Freezard Room First Floor
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Caged Freezard Room Second Floor: Can_Break_Ice
|
||||
Snowpeak Ruins West Hallway Near Caged Freezard Room: Can_Open_Doors
|
||||
Snowpeak Ruins Yetas Room: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Caged Freezard Room Second Floor
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Launch Snowpeak Caged Freezard Room Canonballs: Can_Launch_Canonball and Ball_and_Chain and 'Can_Load_Snowpeak_Hallway_to_Caged_Freezard_Canonball_Holder'
|
||||
Exits:
|
||||
Snowpeak Ruins Wooden Beam Room Second Floor: Can_Open_Doors
|
||||
Snowpeak Ruins Room Below Broken Floor: Can_Smash
|
||||
Snowpeak Ruins Entrance Near Caged Freezard Room: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 3) or Small_Keys == Keysy)
|
||||
Snowpeak Ruins Double Freezard Room: "'Can_Push_Snowpeak_Double_Freezard_Room_Block'"
|
||||
|
||||
# SNOWPEAK RUINS ROOM BELOW BROKEN FLOOR
|
||||
|
||||
- Name: Snowpeak Ruins Room Below Broken Floor Near Entrance
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins Entrance: Can_Open_Doors
|
||||
|
||||
- Name: Snowpeak Ruins Room Below Broken Floor
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Broken Floor Chest: Nothing
|
||||
Exits:
|
||||
Snowpeak Ruins Caged Freezard Room Second Floor: Clawshot # There's no collision from the bottom
|
||||
|
||||
# SNOWPEAK RUINS SECOND FLOOR MINI FREEZARD ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Second Floor Mini Freezard Room
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Ice Room Poe: Can_Break_Ice and Can_Use_Senses
|
||||
Exits:
|
||||
Snowpeak Ruins Block Puzzle Room Second Floor: Can_Open_Doors
|
||||
Snowpeak Ruins Double Freezard Room: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 4) or Small_Keys == Keysy)
|
||||
Snowpeak Ruins Entrance Near Second Floor Mini Freezard Room: Can_Open_Doors
|
||||
|
||||
# SNOWPEAK RUINS DOUBLE FREEZARD ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Double Freezard Room
|
||||
Region: Snowpeak Ruins
|
||||
Events:
|
||||
Can Push Snowpeak Double Freezard Room Block: Can_Defeat_Freezard
|
||||
Can Load Snowpeak Double Freezard Room Canonball Holder: Can_Defeat_Freezard and 'Can_Launch_Snowpeak_Caged_Freezard_Room_Canonballs' and 'Can_Push_Snowpeak_Double_Freezard_Room_Block'
|
||||
Exits:
|
||||
Snowpeak Ruins Double Freezard Room Behind Freezard: Can_Defeat_Freezard
|
||||
Snowpeak Ruins Caged Freezard Room Second Floor: "'Can_Push_Snowpeak_Double_Freezard_Room_Block'"
|
||||
Snowpeak Ruins Second Floor Mini Freezard Room: Can_Open_Doors and (count(Snowpeak_Ruins_Small_Key, 4) or Small_Keys == Keysy)
|
||||
|
||||
- Name: Snowpeak Ruins Double Freezard Room Behind Freezard
|
||||
Region: Snowpeak Ruins
|
||||
Exits:
|
||||
Snowpeak Ruins West Courtyard North Balcony: Can_Open_Doors
|
||||
Snowpeak Ruins Double Freezard Room: Can_Defeat_Freezard
|
||||
|
||||
# SNOWPEAK RUINS CHAPEL
|
||||
|
||||
- Name: Snowpeak Ruins Chapel
|
||||
Region: Snowpeak Ruins
|
||||
Locations:
|
||||
Snowpeak Ruins Chapel Chest: Can_Defeat_Chilfos and Can_Open_Doors
|
||||
Exits:
|
||||
Snowpeak Ruins West Courtyard North Balcony: Can_Open_Doors
|
||||
|
||||
# SNOWPEAK RUINS BOSS ROOM
|
||||
|
||||
- Name: Snowpeak Ruins Boss Room
|
||||
Events:
|
||||
Can Complete Snowpeak Ruins: Can_Defeat_Blizzeta
|
||||
Locations:
|
||||
Snowpeak Ruins Blizzeta Heart Container: Can_Defeat_Blizzeta
|
||||
Snowpeak Ruins Dungeon Reward: Can_Defeat_Blizzeta
|
||||
Exits:
|
||||
Snowpeak Summit Lower: Can_Defeat_Blizzeta
|
||||
@@ -0,0 +1,205 @@
|
||||
# Bringing down the giant statue is handled via a chain of events for each
|
||||
# individual traversal between teleporters.
|
||||
|
||||
# TEMPLE OF TIME ENTRANCE
|
||||
|
||||
- Name: Temple of Time Entrance
|
||||
Region: Temple of Time
|
||||
Dungeon Start Area: True
|
||||
Events:
|
||||
Can Refill Lantern Oil: Nothing
|
||||
Can Open Door of Time: Dominion_Rod and 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Entrance'
|
||||
Locations:
|
||||
Temple of Time Lobby Lantern Chest: Lantern
|
||||
Temple of Time First Hint Sign: Nothing
|
||||
Exits:
|
||||
Temple of Time Yellow Gates Corridor Near Entrance: Temple_of_Time_Small_Key or Small_Keys == Keysy
|
||||
Temple of Time Entrance Near Crumbling Corridor: Open_Door_of_Time == On or 'Can_Open_Door_of_Time'
|
||||
Sacred Grove Past Behind Window: Nothing
|
||||
|
||||
- Name: Temple of Time Entrance Near Crumbling Corridor
|
||||
Region: Temple of Time
|
||||
Exits:
|
||||
Temple of Time Crumbling Corridor Near Entrance: Nothing
|
||||
Temple of Time Entrance: "'Can_Open_Door_of_Time'"
|
||||
|
||||
# TEMPLE OF TIME YELLOW GATES CORRIDOR
|
||||
|
||||
- Name: Temple of Time Yellow Gates Corridor Near Entrance
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time First Staircase Gohma Gate Chest: Nothing
|
||||
Exits:
|
||||
Temple of Time Yellow Gates Corridor Near Central Mechnical Platform Room: Clawshot or Gale_Boomerang or Bow or Ball_and_Chain
|
||||
Temple of Time Entrance: Nothing
|
||||
|
||||
- Name: Temple of Time Yellow Gates Corridor Near Central Mechnical Platform Room
|
||||
Region: Temple of Time
|
||||
Events:
|
||||
Can Teleport Giant Statue to Temple of Time Entrance: Dominion_Rod and 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Yellow_Gates_Corridor'
|
||||
Locations:
|
||||
Temple of Time First Staircase Window Chest: Nothing
|
||||
Temple of Time First Staircase Armos Chest: Can_Defeat_Armos
|
||||
Exits:
|
||||
Temple of Time Central Mechanical Platform Room Bottom: Human_Link # To pick up statues
|
||||
Temple of Time Yellow Gates Corridor Near Entrance: Clawshot or 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Entrance'
|
||||
|
||||
# TEMPLE OF TIME CENTRAL MECHANICAL PLATFORM ROOM
|
||||
|
||||
- Name: Temple of Time Central Mechanical Platform Room Bottom
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Poe Behind Gate: Dominion_Rod and Can_Use_Senses
|
||||
Exits:
|
||||
Temple of Time Central Mechanical Platform Room Top: Spinner
|
||||
Temple of Time Yellow Gates Corridor Near Central Mechnical Platform Room: Nothing
|
||||
|
||||
- Name: Temple of Time Central Mechanical Platform Room Top
|
||||
Region: Temple of Time
|
||||
Events:
|
||||
Can Teleport Giant Statue to Temple of Time Yellow Gates Corridor: Dominion_Rod and 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Central_Mechanical_Platform'
|
||||
Exits:
|
||||
Temple of Time Central Mechanical Platform Room Near Armos Antechamber: Human_Link # To pick up statues
|
||||
Temple of Time Moving Walls Corridor Near Central Platform Room: count(Temple_of_Time_Small_Key, 2) or Small_Keys == Keysy
|
||||
Temple of Time Central Mechanical Platform Room Bottom: Nothing
|
||||
|
||||
- Name: Temple of Time Central Mechanical Platform Room Near Armos Antechamber
|
||||
Region: Temple of Time
|
||||
Exits:
|
||||
Temple of Time Armos Antechamber: Nothing
|
||||
Temple of Time Central Mechanical Platform Room Top: Nothing
|
||||
|
||||
# TEMPLE OF TIME ARMOS ANTECHAMBER
|
||||
|
||||
- Name: Temple of Time Armos Antechamber
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Armos Antechamber East Chest: Can_Defeat_Armos
|
||||
Temple of Time Armos Antechamber North Chest: Nothing
|
||||
Temple of Time Armos Antechamber Statue Chest: Dominion_Rod
|
||||
Exits:
|
||||
Temple of Time Central Mechanical Platform Room Near Armos Antechamber: Nothing
|
||||
|
||||
# TEMPLE OF TIME MOVING WALLS CORRIDOR
|
||||
|
||||
- Name: Temple of Time Moving Walls Corridor Near Central Platform Room
|
||||
Region: Temple of Time
|
||||
Exits:
|
||||
Temple of Time Moving Walls Corridor Middle: Bow or Clawshot
|
||||
Temple of Time Central Mechanical Platform Room Top: Nothing
|
||||
|
||||
- Name: Temple of Time Moving Walls Corridor Middle # This area's logic assumes you already have Bow or Clawshot to get here
|
||||
Region: Temple of Time
|
||||
Events:
|
||||
Can Teleport Giant Statue to Temple of Time Central Mechanical Platform: Dominion_Rod and 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Moving_Walls_Corridor'
|
||||
Locations:
|
||||
Temple of Time Moving Wall Beamos Room Chest: Nothing
|
||||
Temple of Time Moving Wall Dinalfos Room Chest: Dominion_Rod
|
||||
Temple of Time Second Hint Sign: Nothing
|
||||
Exits:
|
||||
Temple of Time Moving Walls Corridor Near Scales Room: Bow or Clawshot
|
||||
Temple of Time Moving Walls Corridor Near Central Platform Room: Bow or Clawshot
|
||||
|
||||
- Name: Temple of Time Moving Walls Corridor Near Scales Room
|
||||
Region: Temple of Time
|
||||
Exits:
|
||||
Temple of Time Scale Room Bottom: Nothing
|
||||
Temple of Time Moving Walls Corridor Middle: Bow or Clawshot
|
||||
|
||||
# TEMPLE OF TIME SCALES ROOM
|
||||
|
||||
- Name: Temple of Time Scale Room Bottom
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Scales Gohma Chest: Can_Defeat_Young_Gohma and Can_Defeat_Baby_Gohma
|
||||
Exits:
|
||||
Temple of Time Scales Room Top: Clawshot and Spinner
|
||||
Temple of Time Scales Room Near Spike Trap Corridor: Human_Link # Need to throw a statue
|
||||
|
||||
- Name: Temple of Time Scales Room Top
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Scales Upper Chest: Nothing
|
||||
Temple of Time Poe Above Scales: Can_Use_Senses
|
||||
Exits:
|
||||
Temple of Time Floor Switch Puzzle Room: Nothing
|
||||
Temple of Time Scales Room Near Spike Trap Corridor: Nothing
|
||||
Temple of Time Scale Room Bottom: Nothing
|
||||
|
||||
- Name: Temple of Time Scales Room Near Spike Trap Corridor
|
||||
Region: Temple of Time
|
||||
Events:
|
||||
Can Teleport Giant Statue to Temple of Time Moving Walls Corridor: Dominion_Rod and 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Scales_Room'
|
||||
Exits:
|
||||
Temple of Time Spike Trap Corridor Near Scales Room: Nothing
|
||||
Temple of Time Scale Room Bottom: Nothing
|
||||
|
||||
# TEMPLE OF TIME FLOOR SWITCH PUZZLE ROOM
|
||||
|
||||
- Name: Temple of Time Floor Switch Puzzle Room
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Big Key Chest: Can_Defeat_Helmasaur and Clawshot
|
||||
Temple of Time Floor Switch Puzzle Room Upper Chest: Clawshot
|
||||
Exits:
|
||||
Temple of Time Scales Room Top: Nothing
|
||||
|
||||
# TEMPLE OF TIME SPIKE TRAP CORRIDOR
|
||||
|
||||
- Name: Temple of Time Spike Trap Corridor Near Scales Room
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Gilloutine Chest: Nothing
|
||||
Exits:
|
||||
Temple of Time Spike Trap Corridor Baby Gohma Area: Human_Link # to pickup pot/statue
|
||||
Temple of Time Scales Room Near Spike Trap Corridor: Nothing
|
||||
|
||||
- Name: Temple of Time Spike Trap Corridor Baby Gohma Area
|
||||
Region: Temple of Time
|
||||
Locations:
|
||||
Temple of Time Chest Before Darknut: Can_Defeat_Armos and Can_Defeat_Baby_Gohma and Can_Defeat_Young_Gohma
|
||||
Exits:
|
||||
Temple of Time Spike Trap Corridor Near Miniboss Room: Can_Defeat_Armos
|
||||
Temple of Time Spike Trap Corridor Near Scales Room: "'Can_Teleport_Giant_Statue_to_Temple_of_Time_Scales_Room'"
|
||||
|
||||
- Name: Temple of Time Spike Trap Corridor Near Miniboss Room
|
||||
Region: Temple of Time
|
||||
Events:
|
||||
Can Teleport Giant Statue to Temple of Time Scales Room: Dominion_Rod and 'Can_Teleport_Giant_Statue_to_Temple_of_Time_Spike_Trap_Corridor'
|
||||
Exits:
|
||||
Darknut Miniboss Room: count(Temple_of_Time_Small_Key, 3) or Small_Keys == Keysy
|
||||
Temple of Time Spike Trap Corridor Baby Gohma Area: "'Can_Teleport_Giant_Statue_to_Temple_of_Time_Scales_Room'"
|
||||
|
||||
# DARKNUT MINIBOSS ROOM
|
||||
|
||||
- Name: Darknut Miniboss Room
|
||||
Events:
|
||||
Can Teleport Giant Statue to Temple of Time Spike Trap Corridor: Dominion_Rod and Open_Door_of_Time == Off
|
||||
Locations:
|
||||
Temple of Time Darknut Chest: Can_Defeat_Darknut
|
||||
Exits:
|
||||
Temple of Time Spike Trap Corridor Near Miniboss Room: "'Can_Teleport_Giant_Statue_to_Temple_of_Time_Spike_Trap_Corridor'"
|
||||
|
||||
# TEMPLE OF TIME CRUMBLING CORRIDOR
|
||||
|
||||
- Name: Temple of Time Crumbling Corridor Near Entrance
|
||||
Region: Temple of Time
|
||||
Exits:
|
||||
Temple of Time Crumbling Corridor Near Boss Door: Dominion_Rod
|
||||
Temple of Time Entrance Near Crumbling Corridor: Nothing
|
||||
|
||||
- Name: Temple of Time Crumbling Corridor Near Boss Door
|
||||
Region: Temple of Time
|
||||
Exits:
|
||||
Temple of Time Boss Room: Temple_of_Time_Big_Key or Big_Keys == Keysy
|
||||
|
||||
# TEMPLE OF TIME BOSS ROOM
|
||||
|
||||
- Name: Temple of Time Boss Room
|
||||
Events:
|
||||
Can Complete Temple of Time: Can_Defeat_Armogohma
|
||||
Locations:
|
||||
Temple of Time Armogohma Heart Container: Can_Defeat_Armogohma
|
||||
Temple of Time Dungeon Reward: Can_Defeat_Armogohma
|
||||
Exits:
|
||||
Sacred Grove Past Behind Window: Can_Defeat_Armogohma
|
||||
@@ -0,0 +1,632 @@
|
||||
|
||||
# KAKARIKO GORGE
|
||||
|
||||
- Name: Kakariko Gorge
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Gorge
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Kakariko Gorge Warp Portal: Nothing
|
||||
Kakariko Gorge Owl Statue Chest: Restored_Dominion_Rod
|
||||
Kakariko Gorge Double Clawshot Chest: Double_Clawshots
|
||||
Kakariko Gorge Spire Heart Piece: Clawshot or Gale_Boomerang
|
||||
Kakariko Gorge Owl Statue Boulder Rupee: Can_Smash
|
||||
Kakariko Gorge Spire Boulder Rupee: Can_Smash
|
||||
Kakariko Gorge Owl Statue Sky Character: Restored_Dominion_Rod
|
||||
Kakariko Gorge Male Pill Bug: Nothing
|
||||
Kakariko Gorge Female Pill Bug: Nothing
|
||||
Kakariko Gorge Poe: Can_Use_Senses and Can_Complete_MDH and Can_Complete_All_Twilight and Night
|
||||
Kakariko Gorge Hint Sign: Nothing
|
||||
Exits:
|
||||
Kakariko Gorge Cave Entrance: Can_Smash
|
||||
Kakariko Gorge Keese Grotto: Can_Dig
|
||||
Kakariko Gorge Behind Gate: Nothing
|
||||
Eldin Field: Can_Smash
|
||||
Faron Field: Nothing
|
||||
|
||||
- Name: Kakariko Gorge Cave Entrance
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Gorge
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Kakariko Gorge: Can_Smash
|
||||
Eldin Lantern Cave: Nothing
|
||||
|
||||
- Name: Eldin Lantern Cave
|
||||
Locations:
|
||||
Eldin Lantern Cave First Chest: Can_Break_Webs
|
||||
Eldin Lantern Cave Lantern Chest: Lantern
|
||||
Eldin Lantern Cave Second Chest: Can_Break_Webs
|
||||
Eldin Lantern Cave Poe: Can_Break_Webs and Can_Use_Senses
|
||||
Exits:
|
||||
Kakariko Gorge Cave Entrance: Nothing
|
||||
|
||||
- Name: Kakariko Gorge Keese Grotto
|
||||
Exits:
|
||||
Kakariko Gorge: Nothing
|
||||
|
||||
- Name: Kakariko Gorge Behind Gate
|
||||
Region: Kakariko Gorge
|
||||
Twilight: Eldin
|
||||
Exits:
|
||||
Lower Kakariko Village: Nothing
|
||||
Kakariko Gorge: Wolf_Link or Gate_Keys or Small_Keys == Keysy or Twilight
|
||||
|
||||
# KAKARIKO VILLAGE & GRAVEYARD
|
||||
|
||||
- Name: Lower Kakariko Village
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Village
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Start Springwater Rush: Can_Talk_to_Springwater_Goron
|
||||
Locations:
|
||||
Kakariko Village Warp Portal: Nothing
|
||||
Eldin Spring Underwater Chest: Can_Smash and Iron_Boots
|
||||
Eldin Spring Underwater Boulder Rupee: Water_Bombs and (Iron_Boots or Zora_Armor) and Can_Complete_Eldin_Twilight
|
||||
Kakariko Village Bomb Rock Spire Heart Piece: Bombs and Gale_Boomerang
|
||||
Kakariko Village Bell Rupee: Shadow_Crystal and Can_Launch_Bombs and Can_Complete_Eldin_Twilight
|
||||
Kakariko Village Hot Spring Ledge Box Rupee: (Shadow_Crystal or Gale_Boomerang) and Can_Complete_Eldin_Twilight
|
||||
Kakariko Village Spring Shortcut Box Rupee 1: Can_Smash and Can_Complete_Eldin_Twilight
|
||||
Kakariko Village Spring Shortcut Box Rupee 2: Can_Smash and Can_Complete_Eldin_Twilight
|
||||
Kakariko Village Ant House Ledge Box Rupee: Gale_Boomerang and Can_Complete_Eldin_Twilight
|
||||
Kakariko Village Hint Sign: Nothing
|
||||
Exits:
|
||||
Renados Sanctuary Front West Door Exterior: Nothing
|
||||
Renados Sanctuary Front East Door Exterior: Nothing
|
||||
Renados Sanctuary Back West Door Exterior: Nothing
|
||||
Renados Sanctuary Back East Door Exterior: Nothing
|
||||
Kakariko Renados Sanctuary: Twilight
|
||||
Kakariko Graveyard: Nothing
|
||||
Kakariko Malo Mart: Twilight or (Can_Open_Doors and Day)
|
||||
Elde Inn North Door Exterior: Nothing
|
||||
Elde Inn South Door Exterior: Nothing
|
||||
Kakariko Elde Inn: Twilight
|
||||
Kakariko Bug House Door: Nothing
|
||||
Kakariko Bug House Ceiling Hole: Nothing
|
||||
Kakariko Barnes Bomb Shop Lower: Twilight or (Can_Open_Doors and Day)
|
||||
Upper Kakariko Village: Can_Smash or ('Can_Complete_Goron_Mines' and Day)
|
||||
Death Mountain Near Kakariko: Nothing
|
||||
Kakariko Village Behind Gate: Not_Twilight
|
||||
Kakariko Gorge Behind Gate: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Front East Door Exterior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Front East Door Interior: Can_Open_Doors
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Front West Door Exterior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Front West Door Interior: Can_Open_Doors
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Back East Door Exterior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Back East Door Interior: Can_Open_Doors
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Back West Door Exterior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Back West Door Interior: Can_Open_Doors
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Front East Door Interior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Front East Door Exterior: Can_Open_Doors
|
||||
Kakariko Renados Sanctuary: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Front West Door Interior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Front West Door Exterior: Can_Open_Doors
|
||||
Kakariko Renados Sanctuary: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Back East Door Interior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Back East Door Exterior: Can_Open_Doors
|
||||
Kakariko Renados Sanctuary: Nothing
|
||||
|
||||
- Name: Renados Sanctuary Back West Door Interior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Renados Sanctuary Back West Door Exterior: Can_Open_Doors
|
||||
Kakariko Renados Sanctuary: Nothing
|
||||
|
||||
- Name: Kakariko Renados Sanctuary
|
||||
Twilight: Eldin
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Can Show Ilia Wooden Statue: Wooden_Statue
|
||||
Can Show Ilia Ilias Charm: Ilias_Charm
|
||||
Locations:
|
||||
Renados Letter: "'Can_Complete_Temple_of_Time'"
|
||||
Ilia Memory Reward: "'Can_Show_Ilia_Ilias_Charm'"
|
||||
Exits:
|
||||
Kakariko Renados Sanctuary Basement: Nothing
|
||||
Renados Sanctuary Front East Door Interior: Nothing
|
||||
Renados Sanctuary Front West Door Interior: Nothing
|
||||
Renados Sanctuary Back East Door Interior: Nothing
|
||||
Renados Sanctuary Back West Door Interior: Nothing
|
||||
|
||||
- Name: Kakariko Renados Sanctuary Basement
|
||||
Twilight: Eldin
|
||||
Locations:
|
||||
Sanctuary Basement Twilit Insect 1: Can_Defeat_Eldin_Twilit_Insect
|
||||
Sanctuary Basement Twilit Insect 2: Can_Defeat_Eldin_Twilit_Insect
|
||||
Sanctuary Basement Twilit Insect 3: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Kakariko Renados Sanctuary: Human_Link
|
||||
|
||||
- Name: Kakariko Graveyard
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Graveyard
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Follow Rutella: Gate_Keys or Small_Keys == Keysy
|
||||
Locations:
|
||||
Kakariko Graveyard Lantern Chest: Lantern
|
||||
Kakariko Graveyard Male Ant: Nothing
|
||||
Kakariko Graveyard Grave Poe: Can_Use_Senses and Night
|
||||
Kakariko Graveyard Open Poe: Can_Use_Senses and Night
|
||||
Kakariko Graveyard Golden Wolf: Can_Complete_Eldin_Twilight and 'Howl_at_Snowpeak_Mountain_Howling_Stone'
|
||||
Kakariko Graveyard Twilit Insect: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Kakariko Graveyard Pond: "'Can_Follow_Rutella'"
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Kakariko Graveyard Pond
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Graveyard
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Kakariko Graveyard Underwater Boulder Rupee: (Iron_Boots or Zora_Armor) and Water_Bombs
|
||||
Rutelas Blessing: "'Can_Follow_Rutella'"
|
||||
Gift From Ralis: Asheis_Sketch and 'Can_Follow_Rutella'
|
||||
Kakariko Graveyard Hint Sign: Nothing
|
||||
Exits:
|
||||
Lake Hylia: Water_Bombs and (Iron_Boots or Zora_Armor)
|
||||
Kakariko Graveyard: "'Can_Follow_Rutella'"
|
||||
|
||||
- Name: Kakariko Malo Mart
|
||||
Twilight: Eldin
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Can Fund Malo Mart: Can_Talk_to_Humans and Not_Twilight and Can_Complete_Lanayru_Twilight and 'Can_Farm_Lots_of_Rupees'
|
||||
Locations:
|
||||
Kakariko Village Malo Mart Hylian Shield: Can_Talk_to_Humans and Not_Twilight and 'Can_Farm_Lots_of_Rupees'
|
||||
Kakariko Village Malo Mart Hawkeye: "'Can_Start_Talo_Sharpshooting' and 'Can_Farm_Lots_of_Rupees'"
|
||||
Kakariko Village Malo Mart Red Potion: Can_Talk_to_Humans and Not_Twilight and 'Can_Farm_Lots_of_Rupees'
|
||||
Kakariko Village Malo Mart Wooden Shield: Can_Talk_to_Humans and Not_Twilight and 'Can_Farm_Lots_of_Rupees'
|
||||
Kakariko Malo Mart Twilit Insect: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Elde Inn North Door Exterior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Elde Inn North Door Interior: Can_Open_Doors and Day
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Elde Inn South Door Exterior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Elde Inn South Door Interior: Can_Open_Doors and Day
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Elde Inn North Door Interior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Elde Inn North Door Exterior: Can_Open_Doors and Day
|
||||
Kakariko Elde Inn: Nothing
|
||||
|
||||
- Name: Elde Inn South Door Interior
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Elde Inn South Door Exterior: Can_Open_Doors and Day
|
||||
Kakariko Elde Inn: Nothing
|
||||
|
||||
- Name: Kakariko Elde Inn
|
||||
Twilight: Eldin
|
||||
Locations:
|
||||
Kakariko Inn Chest: Nothing
|
||||
Kakariko Inn Pipe Twilit Insect: Can_Defeat_Eldin_Twilit_Insect
|
||||
Kakariko Inn Bedroom Twilit Insect: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Elde Inn North Door Interior: Nothing
|
||||
Elde Inn South Door Interior: Nothing
|
||||
|
||||
- Name: Kakariko Bug House Door
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Kakariko Bug House: Can_Open_Doors
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Kakariko Bug House Ceiling Hole
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Kakariko Bug House: Nothing
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Kakariko Bug House
|
||||
Twilight: Eldin
|
||||
Locations:
|
||||
Kakariko Village Female Ant: Nothing
|
||||
Kakariko Bug House Twilit Insect: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Kakariko Bug House Door: Can_Open_Doors
|
||||
Kakariko Bug House Ceiling Hole: Can_Midna_Jump or Twilight
|
||||
|
||||
- Name: Kakariko Barnes Bomb Shop Lower
|
||||
Twilight: Eldin
|
||||
Events:
|
||||
Can Refill Regular Bombs: "'Can_Farm_Lots_of_Rupees'"
|
||||
Can Refill Water Bombs: "'Can_Farm_Lots_of_Rupees'"
|
||||
Locations:
|
||||
Barnes Bomb Bag: "'Can_Farm_Lots_of_Rupees'"
|
||||
Exits:
|
||||
Kakariko Barnes Bomb Shop Upper: Nothing
|
||||
Lower Kakariko Village: Can_Open_Doors
|
||||
|
||||
- Name: Kakariko Barnes Bomb Shop Upper
|
||||
Twilight: Eldin
|
||||
Locations:
|
||||
Barnes Bomb Shop Twilit Insect: Can_Defeat_Eldin_Twilit_Insect and Can_Survive_One_Bonk
|
||||
Exits:
|
||||
Kakariko Barnes Bomb Shop Lower: Nothing
|
||||
Upper Kakariko Village: Nothing
|
||||
|
||||
- Name: Upper Kakariko Village
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Village
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Kakariko Village Bomb Shop Poe: Can_Use_Senses and Night
|
||||
Kakariko Village Watchtower Poe: Can_Use_Senses and Night
|
||||
Kakariko Watchtower Alcove Chest: Can_Smash
|
||||
Kakariko Destroyed Building Twilit Insect 1: Can_Defeat_Eldin_Twilit_Insect
|
||||
Kakariko Destroyed Building Twilit Insect 2: Can_Defeat_Eldin_Twilit_Insect
|
||||
Kakariko Destroyed Building Twilit Insect 3: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Kakariko Watchtower Lower Door: Nothing
|
||||
Kakariko Watchtower Dig Spot: Nothing
|
||||
Kakariko Top of Watchtower: Day and 'Can_Complete_Goron_Mines'
|
||||
Kakariko Barnes Bomb Shop Upper: Nothing
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Kakariko Watchtower Lower Door
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Kakariko Watchtower Lower Interior: Can_Open_Doors
|
||||
Upper Kakariko Village: Nothing
|
||||
|
||||
- Name: Kakariko Watchtower Dig Spot
|
||||
Twilight: Eldin
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Kakariko Watchtower Lower Interior: Can_Dig or Twilight
|
||||
Upper Kakariko Village: Nothing
|
||||
|
||||
- Name: Kakariko Watchtower Lower Interior
|
||||
Twilight: Eldin
|
||||
Locations:
|
||||
Kakariko Watchtower Twilit Insect: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Kakariko Watchtower Upper Interior: Can_Climb_Ladders
|
||||
Kakariko Watchtower Lower Door: Can_Open_Doors
|
||||
Kakariko Watchtower Dig Spot: Can_Dig or Twilight
|
||||
|
||||
- Name: Kakariko Watchtower Upper Interior
|
||||
Twilight: Eldin
|
||||
Locations:
|
||||
Kakariko Watchtower Chest: Nothing
|
||||
Exits:
|
||||
Kakariko Watchtower Lower Interior: Nothing
|
||||
Kakariko Top of Watchtower: Can_Open_Doors
|
||||
|
||||
- Name: Kakariko Top of Watchtower
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Village
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Start Talo Sharpshooting: Day and Can_Climb_Ladders and Bow and 'Can_Complete_Goron_Mines'
|
||||
Locations:
|
||||
Talo Sharpshooting: "'Can_Start_Talo_Sharpshooting'"
|
||||
Exits:
|
||||
Kakariko Watchtower Upper Interior: Can_Open_Doors
|
||||
|
||||
- Name: Kakariko Village Behind Gate
|
||||
Map Sector: Eldin Province
|
||||
Region: Kakariko Village
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Eldin Field: Nothing
|
||||
Lower Kakariko Village: Gate_Keys or Small_Keys == Keysy
|
||||
|
||||
# DEATH MOUNTAIN
|
||||
|
||||
- Name: Death Mountain Near Kakariko
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Death Mountain Trail: Iron_Boots or 'Can_Complete_Goron_Mines' or Twilight
|
||||
Lower Kakariko Village: Nothing
|
||||
|
||||
- Name: Death Mountain Trail
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Events:
|
||||
Howl at Death Mountain Howling Stone: Can_Howl
|
||||
Locations:
|
||||
Death Mountain Trail Twilit Insect Near Howling Stone: Can_Defeat_Eldin_Twilit_Insect
|
||||
Death Mountain Alcove Chest: Clawshot or 'Can_Complete_Goron_Mines'
|
||||
Death Mountain Trail Poe: Can_Use_Senses and 'Can_Complete_Goron_Mines'
|
||||
Exits:
|
||||
Death Mountain Volcano: Nothing
|
||||
Death Mountain Near Kakariko: Nothing
|
||||
|
||||
- Name: Death Mountain Volcano
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Death Mountain Warp Portal: Nothing
|
||||
Death Mountain Volcano Pipe Ledge Rock Rupee: Can_Complete_Eldin_Twilight and (Can_Defeat_Goron or 'Can_Complete_Goron_Mines')
|
||||
Death Mountain Trail Twilit Insect on Wall: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Death Mountain Hot Spring: Twilight or (Can_Defeat_Goron or 'Can_Complete_Goron_Mines')
|
||||
Death Mountain Lower Elevator: Goron_Mines_Entrance == Open or 'Can_Access_Death_Mountain_Lower_Elevator'
|
||||
Death Mountain Outside Sumo Hall: Iron_Boots and (Can_Defeat_Goron or 'Can_Complete_Goron_Mines') and Can_Complete_Eldin_Twilight
|
||||
Death Mountain Trail: Nothing
|
||||
|
||||
- Name: Death Mountain Hot Spring
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Buy Wooden Shield: Can_Talk_to_Humans and 'Can_Farm_Rupees' and (Can_Defeat_Goron or 'Can_Complete_Goron_Mines')
|
||||
Locations:
|
||||
Death Mountain Trail Twilit Insect in Hot Spring: Can_Defeat_Eldin_Twilit_Insect
|
||||
Exits:
|
||||
Death Mountain Volcano: Nothing
|
||||
|
||||
- Name: Death Mountain Lower Elevator
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Death Mountain Sumo Hall Elevator: Iron_Boots
|
||||
Death Mountain Volcano: Nothing
|
||||
|
||||
- Name: Death Mountain Outside Sumo Hall
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Death Mountain Volcano Ledge Rupee 1: Can_Complete_Eldin_Twilight and (Can_Defeat_Goron or 'Can_Complete_Goron_Mines')
|
||||
Death Mountain Volcano Ledge Rupee 2: Can_Complete_Eldin_Twilight and (Can_Defeat_Goron or 'Can_Complete_Goron_Mines')
|
||||
Death Mountain Volcano Ledge Rupee 3: Can_Complete_Eldin_Twilight and (Can_Defeat_Goron or 'Can_Complete_Goron_Mines')
|
||||
Exits:
|
||||
Death Mountain Sumo Hall: Nothing
|
||||
Death Mountain Hot Spring: Nothing
|
||||
Death Mountain Volcano: Nothing
|
||||
|
||||
- Name: Death Mountain Sumo Hall Elevator
|
||||
Map Sector: Eldin Province
|
||||
Region: Death Mountain
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Death Mountain Sumo Hall: Goron_Mines_Entrance != Closed or 'Can_Wrestle_Goron_Elder'
|
||||
Death Mountain Lower Elevator: Iron_Boots
|
||||
|
||||
- Name: Death Mountain Sumo Hall
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Can Wrestle Goron Elder: Iron_Boots
|
||||
Exits:
|
||||
Death Mountain Sumo Hall Goron Mines Tunnel: Goron_Mines_Entrance != Closed or 'Can_Wrestle_Goron_Elder'
|
||||
Death Mountain Sumo Hall Elevator: Goron_Mines_Entrance != Closed or 'Can_Wrestle_Goron_Elder'
|
||||
Death Mountain Outside Sumo Hall: Nothing
|
||||
|
||||
- Name: Death Mountain Sumo Hall Goron Mines Tunnel
|
||||
Exits:
|
||||
Goron Mines Entrance: Nothing
|
||||
Death Mountain Sumo Hall: Goron_Mines_Entrance != Closed or 'Can_Wrestle_Goron_Elder'
|
||||
|
||||
# ELDIN FIELD
|
||||
|
||||
- Name: Eldin Field
|
||||
Map Sector: Eldin Province
|
||||
Region: Eldin Field
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Finish Goron Springwater Rush: "'Can_Start_Springwater_Rush' and (Skip_Bridge_Donation == On or 'Can_Fund_Malo_Mart')"
|
||||
Locations:
|
||||
Bridge of Eldin Warp Portal: Can_Defeat_Shadow_Beast
|
||||
Eldin Field Bomb Rock Chest: Can_Smash
|
||||
Bridge of Eldin Owl Statue Chest: Restored_Dominion_Rod
|
||||
Goron Springwater Rush: "'Can_Finish_Goron_Springwater_Rush'"
|
||||
Eldin Field Male Grasshopper: Nothing
|
||||
Eldin Field Female Grasshopper: Nothing
|
||||
Bridge of Eldin Male Phasmid: Clawshot or Gale_Boomerang
|
||||
Eldin Field Hint Sign: Nothing
|
||||
Exits:
|
||||
# Only allow logical access to the other side if we've already been there or the bridge donation is skipped
|
||||
Eldin Field Near Castle Town: (Skip_Bridge_Donation == On and Can_Complete_Eldin_Twilight and Can_Complete_Lanayru_Twilight) or 'Can_Access_Eldin_Field_Near_Castle_Town'
|
||||
Eldin Field Bomskit Grotto: Can_Dig
|
||||
Eldin Field Water Bomb Fish Grotto: Can_Dig
|
||||
Eldin Field North of Bridge: Nothing
|
||||
Kakariko Gorge: Can_Smash
|
||||
Kakariko Village Behind Gate: Nothing
|
||||
|
||||
- Name: Eldin Field Near Castle Town
|
||||
Map Sector: Eldin Province
|
||||
Region: Eldin Field
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Outside Castle Town East: Nothing
|
||||
Eldin Field: Skip_Bridge_Donation == On or 'Can_Fund_Malo_Mart'
|
||||
|
||||
- Name: Eldin Field Bomskit Grotto
|
||||
Locations:
|
||||
Eldin Field Bomskit Grotto Left Chest: Nothing
|
||||
Eldin Field Bomskit Grotto Lantern Chest: Lantern
|
||||
Exits:
|
||||
Eldin Field: Nothing
|
||||
|
||||
- Name: Eldin Field Water Bomb Fish Grotto
|
||||
Events:
|
||||
Can Refill Water Bombs: Fishing_Rod
|
||||
Locations:
|
||||
Eldin Field Water Bomb Fish Grotto Chest: Nothing
|
||||
Exits:
|
||||
Eldin Field: Nothing
|
||||
|
||||
- Name: Eldin Field North of Bridge
|
||||
Map Sector: Eldin Province
|
||||
Region: North Eldin
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Bridge of Eldin Boulder Rupee: Can_Smash
|
||||
Bridge of Eldin Owl Statue Sky Character: Restored_Dominion_Rod
|
||||
Bridge of Eldin Female Phasmid: Clawshot or Gale_Boomerang
|
||||
Exits:
|
||||
Eldin Field Lava Cave Upper Ledge: Clawshot
|
||||
North Eldin Field: Can_Smash
|
||||
Eldin Field: Nothing
|
||||
|
||||
- Name: Eldin Field Lava Cave Upper Ledge
|
||||
Map Sector: Eldin Province
|
||||
Region: North Eldin
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Eldin Field Lava Cave Upper: Nothing
|
||||
Eldin Field North of Bridge: Nothing
|
||||
|
||||
- Name: Eldin Field Lava Cave Upper
|
||||
Locations:
|
||||
Eldin Stockcave Upper Chest: Iron_Boots
|
||||
Exits:
|
||||
Eldin Field Lava Cave Lower: Iron_Boots
|
||||
Eldin Field Lava Cave Upper Ledge: Nothing
|
||||
|
||||
- Name: Eldin Field Lava Cave Lower
|
||||
Locations:
|
||||
Eldin Stockcave Lantern Chest: Lantern
|
||||
Eldin Stockcave Lowest Chest: Nothing
|
||||
Exits:
|
||||
Eldin Field Lava Cave Lower Ledge: Nothing
|
||||
|
||||
- Name: Eldin Field Lava Cave Lower Ledge
|
||||
Map Sector: Eldin Province
|
||||
Region: North Eldin
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Eldin Field North of Bridge: Clawshot
|
||||
Eldin Field Lava Cave Lower: Nothing
|
||||
|
||||
- Name: North Eldin Field
|
||||
Map Sector: Eldin Province
|
||||
Region: North Eldin
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Locations:
|
||||
North Eldin Field Hint Sign: Nothing
|
||||
Exits:
|
||||
Eldin Field Grotto Platform: Spinner
|
||||
Eldin Field Outside Hidden Village: Ilia_Memory_Quest >= Charm or 'Can_Show_Ilia_Wooden_Statue'
|
||||
Lanayru Field: Nothing
|
||||
Eldin Field North of Bridge: Nothing
|
||||
|
||||
- Name: Eldin Field Grotto Platform
|
||||
Map Sector: Eldin Province
|
||||
Region: North Eldin
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Eldin Field Stalfos Grotto: Can_Dig
|
||||
North Eldin Field: Spinner # TODO: Check Savewarp
|
||||
|
||||
- Name: Eldin Field Stalfos Grotto
|
||||
Locations:
|
||||
Eldin Field Stalfos Grotto Right Small Chest: Nothing
|
||||
Eldin Field Stalfos Grotto Left Small Chest: Nothing
|
||||
Eldin Field Stalfos Grotto Stalfos Chest: Can_Defeat_Stalfos
|
||||
Exits:
|
||||
Eldin Field Grotto Platform: Nothing
|
||||
|
||||
- Name: Eldin Field Outside Hidden Village
|
||||
Map Sector: Eldin Province
|
||||
Region: North Eldin
|
||||
Twilight: Eldin
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Hidden Village: Nothing
|
||||
North Eldin Field: "'Can_Show_Ilia_Wooden_Statue'"
|
||||
|
||||
# HIDDEN VILLAGE
|
||||
|
||||
- Name: Hidden Village
|
||||
Map Sector: Eldin Province
|
||||
Region: Hidden Village
|
||||
Can Warp: True
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Howl at Hidden Village Howling Stone: Can_Howl
|
||||
Locations:
|
||||
Cats Hide and Seek Minigame: Can_Talk_to_Animals and Bow and Clawshot and 'Can_Show_Ilia_Ilias_Charm'
|
||||
Ilia Charm: Bow
|
||||
Hidden Village Poe: Night and Can_Talk_to_Animals and Bow and Clawshot and 'Can_Show_Ilia_Ilias_Charm'
|
||||
Hidden Village Hint Sign: Nothing
|
||||
Exits:
|
||||
Hidden Village Impaz House: Bow and Dominion_Rod and Can_Open_Doors
|
||||
Eldin Field Outside Hidden Village: Nothing
|
||||
|
||||
- Name: Hidden Village Impaz House
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
Skybook From Impaz: Bow and Dominion_Rod and 'Can_Access_Hidden_Village'
|
||||
Exits:
|
||||
Hidden Village: Nothing
|
||||
@@ -0,0 +1,396 @@
|
||||
|
||||
# SOUTH FARON WOODS
|
||||
|
||||
- Name: South Faron Woods
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Can Refill Lantern Oil: "'Can_Farm_Rupees'"
|
||||
Locations:
|
||||
South Faron Warp Portal: Can_Complete_Prologue
|
||||
Faron Woods Coro Boulder Rupee 1: Can_Smash
|
||||
Faron Woods Coro Boulder Rupee 2: Can_Smash
|
||||
Faron Woods Coro Boulder Rupee 3: Can_Smash
|
||||
Faron Woods Coro Boulder Rupee 4: Can_Smash
|
||||
Coro Bottle: Can_Complete_Prologue
|
||||
South Faron Woods Twilit Insect in Tunnel 1: Can_Defeat_Faron_Twilit_Insect
|
||||
South Faron Woods Twilit Insect in Tunnel 2: Can_Defeat_Faron_Twilit_Insect
|
||||
South Faron Woods Coros House Exterior Twilit Insect: Can_Defeat_Faron_Twilit_Insect
|
||||
South Faron Woods Hint Sign: Nothing
|
||||
Exits:
|
||||
South Faron Woods Coros Ledge: Can_Midna_Jump or Twilight
|
||||
Faron Woods Coros House Lower: Can_Open_Doors
|
||||
South Faron Woods Behind Gate: Nothing # Coro Key is Vanilla if forest is closed
|
||||
South Faron Woods Owl Statue Area: Can_Smash
|
||||
Faron Field: Can_Clear_Forest
|
||||
Ordon Bridge: Nothing
|
||||
|
||||
- Name: South Faron Woods Coros Ledge
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Exits:
|
||||
South Faron Woods: Nothing
|
||||
Faron Woods Coros House Upper: Nothing
|
||||
|
||||
- Name: Faron Woods Coros House Upper
|
||||
Twilight: Faron
|
||||
Exits:
|
||||
Faron Woods Coros House Lower: Nothing
|
||||
South Faron Woods Coros Ledge: Nothing
|
||||
|
||||
- Name: Faron Woods Coros House Lower
|
||||
Twilight: Faron
|
||||
Locations:
|
||||
Faron Woods Coros House Interior Twilit Insect 1: Can_Defeat_Faron_Twilit_Insect
|
||||
Faron Woods Coros House Interior Twilit Insect 2: Can_Defeat_Faron_Twilit_Insect
|
||||
Exits:
|
||||
Faron Woods Coros House Upper: Wolf_Link # Only wolf link can climb the ledge
|
||||
South Faron Woods: Can_Open_Doors
|
||||
|
||||
- Name: South Faron Woods Owl Statue Area
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Can Move Faron Woods Owl Statue: Can_Clear_Forest and Restored_Dominion_Rod
|
||||
Locations:
|
||||
Faron Woods Owl Statue Sky Character: Can_Clear_Forest and Restored_Dominion_Rod
|
||||
Exits:
|
||||
South Faron Woods Above Owl Statue: Can_Midna_Jump and 'Can_Move_Faron_Woods_Owl_Statue'
|
||||
South Faron Woods: Can_Smash
|
||||
|
||||
- Name: South Faron Woods Above Owl Statue
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Exits:
|
||||
Mist Area Near Owl Statue Chest: Nothing
|
||||
South Faron Woods Owl Statue Area: Nothing
|
||||
|
||||
- Name: South Faron Woods Behind Gate
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
South Faron Woods Twilit Insect Behind Gate 1: Can_Defeat_Faron_Twilit_Insect
|
||||
South Faron Woods Twilit Insect Behind Gate 2: Can_Defeat_Faron_Twilit_Insect
|
||||
Exits:
|
||||
Faron Woods Cave South: Nothing
|
||||
South Faron Woods: Can_Dig or Can_Clear_Forest or 'Can_Access_South_Faron_Woods'
|
||||
|
||||
# FARON WOODS CAVE
|
||||
|
||||
- Name: Faron Woods Cave South
|
||||
Twilight: Faron
|
||||
Exits:
|
||||
Faron Woods Cave: Nothing
|
||||
South Faron Woods Behind Gate: Nothing
|
||||
|
||||
- Name: Faron Woods Cave
|
||||
Twilight: Faron
|
||||
Locations:
|
||||
South Faron Cave Chest: Nothing
|
||||
Exits:
|
||||
Faron Woods Cave North: Nothing
|
||||
Faron Woods Cave South: Nothing
|
||||
|
||||
- Name: Faron Woods Cave North
|
||||
Twilight: Faron
|
||||
Exits:
|
||||
Mist Area Near Faron Woods Cave: Nothing
|
||||
Faron Woods Cave: Nothing
|
||||
|
||||
# MIST AREA
|
||||
|
||||
- Name: Mist Area Near Faron Woods Cave
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Faron Mist Twilit Insect on Wall 1: Can_Defeat_Faron_Twilit_Insect
|
||||
Faron Mist Twilit Insect on Wall 2: Can_Defeat_Faron_Twilit_Insect
|
||||
Exits:
|
||||
Mist Area Inside Mist: Lantern
|
||||
Mist Area Under Owl Statue Chest: Can_Midna_Jump or Twilight
|
||||
Faron Woods Cave North: Nothing
|
||||
|
||||
- Name: Mist Area Inside Mist
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Faron Mist Stump Chest: Lantern and Can_Complete_Prologue
|
||||
Faron Mist North Chest: Lantern and Can_Complete_Prologue
|
||||
Faron Mist South Chest: Lantern and Can_Complete_Prologue
|
||||
Exits:
|
||||
Mist Area Near Faron Woods Cave: Lantern
|
||||
Mist Area Under Owl Statue Chest: Lantern
|
||||
Mist Area Outside Faron Mist Cave: Lantern
|
||||
Mist Area Near North Faron Woods: Lantern
|
||||
|
||||
- Name: Mist Area Under Owl Statue Chest
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Exits:
|
||||
Mist Area Inside Mist: Lantern
|
||||
Mist Area Center Stump: Can_Midna_Jump or Twilight
|
||||
|
||||
- Name: Mist Area Near Owl Statue Chest
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Faron Woods Owl Statue Chest: Nothing
|
||||
Exits:
|
||||
Mist Area Under Owl Statue Chest: Nothing
|
||||
South Faron Woods Above Owl Statue: Nothing
|
||||
|
||||
- Name: Mist Area Center Stump
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Faron Mist Poe: Can_Use_Senses and Can_Complete_Prologue
|
||||
Faron Mist Twilit Insect on Center Stump 1: Can_Defeat_Faron_Twilit_Insect
|
||||
Faron Mist Twilit Insect on Center Stump 2: Can_Defeat_Faron_Twilit_Insect
|
||||
Faron Mist Twilit Insect on Center Stump 3: Can_Defeat_Faron_Twilit_Insect
|
||||
Exits:
|
||||
Mist Area Inside Mist: Lantern
|
||||
Mist Area Near North Faron Woods: Can_Midna_Jump or Twilight
|
||||
|
||||
- Name: Mist Area Outside Faron Mist Cave
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Exits:
|
||||
Mist Area Faron Mist Cave: Nothing
|
||||
Mist Area Inside Mist: Lantern
|
||||
|
||||
- Name: Mist Area Near North Faron Woods
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Faron Mist Burrowing Twilit Insect 1: Can_Defeat_Faron_Twilit_Insect
|
||||
Faron Mist Burrowing Twilit Insect 2: Can_Defeat_Faron_Twilit_Insect
|
||||
Exits:
|
||||
North Faron Woods: North_Faron_Woods_Gate_Key or Skip_Prologue == On
|
||||
Mist Area Near Faron Woods Cave: Can_Midna_Jump or Twilight
|
||||
Mist Area Inside Mist: Lantern
|
||||
|
||||
- Name: Mist Area Faron Mist Cave
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Faron Mist Cave Open Chest: Nothing
|
||||
Faron Mist Cave Lantern Chest: Lantern
|
||||
Exits:
|
||||
Mist Area Outside Faron Mist Cave: Nothing
|
||||
|
||||
# NORTH FARON WOODS
|
||||
|
||||
- Name: North Faron Woods
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can_Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Can Refill Lantern Oil: "'Can_Farm_Rupees'"
|
||||
Can Refill Slingshot Seeds: Can_Defeat_Deku_Baba
|
||||
Locations:
|
||||
North Faron Warp Portal: Can_Complete_Prologue
|
||||
North Faron Woods Deku Baba Chest: Nothing
|
||||
Faron Woods Golden Wolf: Can_Complete_Faron_Twilight
|
||||
North Faron Woods Twilit Insect 1: Can_Defeat_Faron_Twilit_Insect
|
||||
North Faron Woods Twilit Insect 2: Can_Defeat_Faron_Twilit_Insect
|
||||
Exits:
|
||||
North Faron Lost Woods Ledge: Can_Midna_Jump
|
||||
Forest Temple Entrance: Nothing
|
||||
Mist Area Near North Faron Woods: Nothing
|
||||
|
||||
- Name: North Faron Lost Woods Ledge
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Woods
|
||||
Twilight: Faron
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Howl at North Faron Woods Howling Stone: Can_Howl
|
||||
Exits:
|
||||
Lost Woods: Nothing
|
||||
# In North Faron Woods, when you are near the Lost Woods entrance,
|
||||
# you can save-warp to the main part of North Faron Woods.
|
||||
North Faron Woods: Nothing
|
||||
|
||||
|
||||
# SACRED GROVE
|
||||
|
||||
- Name: Lost Woods
|
||||
Map Sector: Faron Province
|
||||
Region: Sacred Grove
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Can Refill Arrows: Nothing
|
||||
Lost Woods Skull Kid: Can_Defeat_Skull_Kid
|
||||
Locations:
|
||||
Lost Woods Lantern Chest: Lantern
|
||||
Lost Woods Waterfall Poe: Can_Use_Senses and Night
|
||||
Exits:
|
||||
Lost Woods Lower Battle Arena: Sacred_Grove_Does_Not_Require_Skull_Kid == On or ('Lost_Woods_Skull_Kid' and Wolf_Link)
|
||||
Lost Woods Upper Battle Arena: Sacred_Grove_Does_Not_Require_Skull_Kid == On or ('Lost_Woods_Skull_Kid' and Wolf_Link)
|
||||
North Faron Lost Woods Ledge: Nothing
|
||||
|
||||
- Name: Lost Woods Lower Battle Arena
|
||||
Map Sector: Faron Province
|
||||
Region: Sacred Grove
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Can Smash Lost Woods Rock: Can_Smash
|
||||
Locations:
|
||||
Sacred Grove Spinner Chest: Spinner
|
||||
Lost Woods Boulder Poe: Can_Use_Senses and 'Can_Smash_Lost_Woods_Rock' and (Can_Defeat_Skull_Kid or Sacred_Grove_Does_Not_Require_Skull_Kid == On)
|
||||
Exits:
|
||||
# Human Link can't dig into the grotto, so we need to hide away blowing up the rock behind an event.
|
||||
# By requiring only wolf in the direct logic statement, this tells the search algorithm that only wolf is
|
||||
# allowed to go through this exit.
|
||||
Lost Woods Baba Serpent Grotto: Can_Dig and 'Can_Smash_Lost_Woods_Rock'
|
||||
Sacred Grove Lower: Can_Defeat_Skull_Kid or Sacred_Grove_Does_Not_Require_Skull_Kid == On
|
||||
|
||||
- Name: Lost Woods Upper Battle Arena
|
||||
Map Sector: Faron Province
|
||||
Region: Sacred Grove
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Exits:
|
||||
Sacred Grove Before Block: Can_Defeat_Skull_Kid or Sacred_Grove_Does_Not_Require_Skull_Kid == On
|
||||
|
||||
- Name: Lost Woods Baba Serpent Grotto
|
||||
Locations:
|
||||
Sacred Grove Baba Serpent Grotto Chest: Can_Defeat_Baba_Serpent and Can_Knock_Down_Hanging_Baba
|
||||
Exits:
|
||||
Lost Woods Lower Battle Arena: Nothing
|
||||
|
||||
- Name: Sacred Grove Before Block
|
||||
Map Sector: Faron Province
|
||||
Region: Sacred Grove
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Sacred Grove Upper: Nothing
|
||||
Lost Woods Upper Battle Arena: Nothing
|
||||
|
||||
- Name: Sacred Grove Upper
|
||||
Map Sector: Faron Province
|
||||
Region: Sacred Grove
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Sacred Grove Hint Sign: Nothing
|
||||
Exits:
|
||||
Sacred Grove Lower: Nothing
|
||||
Sacred Grove Past: Has_Sword_For_Temple_of_Time and 'Can_Access_Sacred_Grove_Lower' and Can_Defeat_Shadow_Beast
|
||||
|
||||
- Name: Sacred Grove Lower
|
||||
Map Sector: Faron Province
|
||||
Region: Sacred Grove
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Sacred Grove Warp Portal: Can_Defeat_Shadow_Beast
|
||||
Sacred Grove Male Snail: Clawshot or Gale_Boomerang
|
||||
Sacred Grove Master Sword Poe: Can_Use_Senses and Night
|
||||
Sacred Grove Pedestal Master Sword: Nothing
|
||||
Sacred Grove Pedestal Shadow Crystal: Nothing
|
||||
Exits:
|
||||
Lost Woods Lower Battle Arena: Nothing
|
||||
Sacred Grove Upper: "'Can_Access_Sacred_Grove_Before_Block'"
|
||||
|
||||
- Name: Sacred Grove Past
|
||||
Locations:
|
||||
Sacred Grove Past Owl Statue Chest: Dominion_Rod
|
||||
Sacred Grove Female Snail: Clawshot or Gale_Boomerang
|
||||
Sacred Grove Temple of Time Owl Statue Poe: Dominion_Rod and Can_Use_Senses
|
||||
Exits:
|
||||
Sacred Grove Past Behind Window: Has_Sword_For_Temple_of_Time
|
||||
Sacred Grove Upper: Nothing
|
||||
|
||||
- Name: Sacred Grove Past Behind Window
|
||||
Exits:
|
||||
Sacred Grove Past: Nothing
|
||||
Temple of Time Entrance: Nothing
|
||||
|
||||
# FARON FIELD
|
||||
|
||||
- Name: Faron Field
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Field
|
||||
Can_Warp: True
|
||||
Events:
|
||||
Can Refill Arrows: Nothing
|
||||
Locations:
|
||||
Faron Field Bridge Chest: Clawshot
|
||||
Faron Field Tree Heart Piece: Clawshot or Gale_Boomerang # or Ball and Chain if trick
|
||||
Faron Field Male Beetle: Nothing
|
||||
Faron Field Female Beetle: Clawshot or Gale_Boomerang # or Ball and Chain if trick
|
||||
Faron Field Poe: Can_Use_Senses and Night
|
||||
Faron Field Hint Sign: Nothing
|
||||
Exits:
|
||||
Faron Field Behind Boulder: Can_Use_Hot_Spring_Water and 'Can_Access_Outside_Castle_Town_South'
|
||||
Kakariko Gorge: Nothing
|
||||
Lake Hylia Bridge: Gate_Keys or Small_Keys == Keysy
|
||||
Faron Field Corner Grotto: Can_Dig
|
||||
Faron Field Fishing Grotto: Can_Dig
|
||||
South Faron Woods: Nothing
|
||||
|
||||
- Name: Faron Field Behind Boulder
|
||||
Map Sector: Faron Province
|
||||
Region: Faron Field
|
||||
Can_Warp: True
|
||||
Exits:
|
||||
# If you enter Outside Castle Town from here while the boulder is still there,
|
||||
# you get stuck and are forced to save-warp or portal-warp.
|
||||
Outside Castle Town South Inside Boulder: Nothing
|
||||
Faron Field: Can_Use_Hot_Spring_Water and 'Can_Access_Outside_Castle_Town_South'
|
||||
|
||||
- Name: Faron Field Corner Grotto
|
||||
Locations:
|
||||
Faron Field Corner Grotto Right Chest: Nothing
|
||||
Faron Field Corner Grotto Left Chest: Nothing
|
||||
Faron Field Corner Grotto Rear Chest: Nothing
|
||||
# Faron Field Corner Grotto Main Chest: Nothing # HD Only
|
||||
Exits:
|
||||
Faron Field: Nothing
|
||||
|
||||
- Name: Faron Field Fishing Grotto
|
||||
Exits:
|
||||
Faron Field: Nothing
|
||||
@@ -0,0 +1,192 @@
|
||||
|
||||
# GERUDO DESERT
|
||||
|
||||
- Name: Gerudo Desert
|
||||
Map Sector: Desert Province
|
||||
Region: South Gerudo Desert
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Gerudo Desert Peahat Ledge Chest: Clawshot
|
||||
Gerudo Desert East Canyon Chest: Nothing
|
||||
Gerudo Desert Lone Small Chest: Nothing
|
||||
Gerudo Desert West Canyon Chest: Clawshot
|
||||
Gerudo Desert South Chest Behind Wooden Gates: Can_Defeat_Bulblin
|
||||
Gerudo Desert Owl Statue Chest: Restored_Dominion_Rod
|
||||
Gerudo Desert Owl Statue Sky Character: Restored_Dominion_Rod
|
||||
Gerudo Desert Male Dayfly: Nothing
|
||||
Gerudo Desert Female Dayfly: Nothing
|
||||
Gerudo Desert East Poe: Can_Use_Senses and Night
|
||||
Gerudo Desert Hint Sign: Nothing
|
||||
Exits:
|
||||
Gerudo Desert Skulltula Grotto: Can_Dig
|
||||
Gerudo Desert Cave of Ordeals Plateau: Clawshot and Can_Defeat_Shadow_Beast
|
||||
Gerudo Desert Basin: Nothing
|
||||
Lake Hylia: Nothing # Modified rando savewarp
|
||||
|
||||
- Name: Gerudo Desert Skulltula Grotto
|
||||
Locations:
|
||||
Gerudo Desert Skulltula Grotto Chest: Can_Defeat_Skulltula
|
||||
Exits:
|
||||
Gerudo Desert: Nothing
|
||||
|
||||
- Name: Gerudo Desert Cave of Ordeals Plateau
|
||||
Map Sector: Desert Province
|
||||
Region: South Gerudo Desert
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Gerudo Desert Warp Portal: Can_Defeat_Shadow_Beast
|
||||
Gerudo Desert Poe Above Cave of Ordeals: Can_Use_Senses and Night
|
||||
Exits:
|
||||
Cave of Ordeals: Nothing
|
||||
Gerudo Desert: Nothing
|
||||
|
||||
- Name: Gerudo Desert Basin
|
||||
Map Sector: Desert Province
|
||||
Region: North Gerudo Desert
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Gerudo Desert Northeast Chest Behind Gates: Can_Defeat_Bulblin and Can_Ride_Boars
|
||||
Gerudo Desert Campfire North Chest: Nothing
|
||||
Gerudo Desert Campfire East Chest: Can_Defeat_Bulblin and Can_Ride_Boars
|
||||
Gerudo Desert Campfire West Chest: Can_Defeat_Bulblin and Can_Ride_Boars
|
||||
Gerudo Desert Northwest Chest Behind Gates: Can_Defeat_Bulblin and Can_Ride_Boars
|
||||
Exits:
|
||||
Gerudo Desert North East Ledge: Clawshot
|
||||
Gerudo Desert Chu Grotto: Can_Dig
|
||||
Gerudo Desert Outside Bulblin Camp: Can_Defeat_Bulblin and Can_Ride_Boars
|
||||
Gerudo Desert: Can_Defeat_Bulblin and Can_Ride_Boars
|
||||
|
||||
- Name: Gerudo Desert North East Ledge
|
||||
Map Sector: Desert Province
|
||||
Region: North Gerudo Desert
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Gerudo Desert North Peahat Poe: Night and Can_Defeat_Poe
|
||||
Exits:
|
||||
Gerudo Desert Rock Grotto: Can_Dig
|
||||
Gerudo Desert Basin: Nothing
|
||||
|
||||
- Name: Gerudo Desert Rock Grotto
|
||||
Locations:
|
||||
Gerudo Desert Rock Grotto Lantern Chest: Can_Light_Torches
|
||||
Gerudo Desert Rock Grotto First Poe: Can_Defeat_Poe
|
||||
Gerudo Desert Rock Grotto Second Poe: Can_Defeat_Poe
|
||||
Exits:
|
||||
Gerudo Desert North East Ledge: Nothing
|
||||
|
||||
- Name: Gerudo Desert Chu Grotto
|
||||
Exits:
|
||||
Gerudo Desert Basin: Nothing
|
||||
|
||||
- Name: Gerudo Desert Outside Bulblin Camp
|
||||
Map Sector: Desert Province
|
||||
Region: North Gerudo Desert
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Gerudo Desert North Small Chest Before Bulblin Camp: Nothing
|
||||
Outside Bulblin Camp Poe: Night and Can_Defeat_Poe
|
||||
Gerudo Desert Golden Wolf: "'Howl_at_Lake_Hylia_Howling_Stone'"
|
||||
Exits:
|
||||
Bulblin Camp: Nothing
|
||||
Gerudo Desert Basin: Can_Defeat_Bulblin and 'Can_Access_Gerudo_Desert_Basin'
|
||||
|
||||
# BULBLIN CAMP
|
||||
|
||||
- Name: Bulblin Camp
|
||||
Map Sector: Desert Province
|
||||
Region: Bulblin Camp
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Bulblin Camp First Chest Under Tower At Entrance: Nothing
|
||||
Bulblin Camp Small Chest in Back of Camp: Nothing
|
||||
Bulblin Camp Roasted Boar: Has_Damaging_Item
|
||||
Bulblin Camp Poe: Night and Can_Defeat_Poe and (Gerudo_Desert_Bulblin_Camp_Key or Small_Keys == Keysy or Arbiters_Does_Not_Require_Bulblin_Camp == On)
|
||||
Bulblin Guard Key: Can_Defeat_Bulblin
|
||||
Bulblin Camp Hint Sign: Nothing
|
||||
Exits:
|
||||
Outside Arbiters Grounds: Arbiters_Does_Not_Require_Bulblin_Camp == On or (Can_Defeat_King_Bulblin_Desert and (Gerudo_Desert_Bulblin_Camp_Key or Small_Keys == Keysy))
|
||||
Gerudo Desert Outside Bulblin Camp: Nothing
|
||||
|
||||
- Name: Outside Arbiters Grounds
|
||||
Map Sector: Desert Province
|
||||
Region: Bulblin Camp
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Outside Arbiters Grounds Lantern Chest: Can_Light_Torches
|
||||
Outside Arbiters Grounds Poe: Night and Can_Defeat_Poe
|
||||
Exits:
|
||||
Arbiters Grounds Entrance: Nothing
|
||||
Bulblin Camp: Nothing
|
||||
|
||||
# MIRROR CHAMBER
|
||||
|
||||
- Name: Mirror Chamber Lower
|
||||
Map Sector: Desert Province
|
||||
Region: None
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Mirror Chamber Upper: Nothing
|
||||
Arbiters Grounds Boss Room: Mirror_Chamber_Access == Open or (Mirror_Chamber_Access == Barrier and 'Can_Complete_Arbiters_Grounds')
|
||||
|
||||
- Name: Mirror Chamber Upper
|
||||
Map Sector: Desert Province
|
||||
Region: Mirror Chamber
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Mirror Chamber Warp Portal: Can_Defeat_Shadow_Beast
|
||||
Exits:
|
||||
Twilight Realm Portal: Mirror_Chamber_Portal and
|
||||
(Palace_of_Twilight_Requirements == Open or
|
||||
(Palace_of_Twilight_Requirements == Fused_Shadows and count(Progressive_Fused_Shadow, 3)) or
|
||||
(Palace_of_Twilight_Requirements == Mirror_Shards and count(Progressive_Mirror_Shard, 4)) or
|
||||
(Palace_of_Twilight_Requirements == Vanilla and 'Can_Complete_City_in_the_Sky'))
|
||||
Mirror Chamber Lower: Can_Defeat_Shadow_Beast
|
||||
|
||||
- Name: Twilight Realm Portal
|
||||
Exits:
|
||||
Palace of Twilight Entrance: Nothing
|
||||
Mirror Chamber Upper: Can_Defeat_Shadow_Beast
|
||||
|
||||
# CAVE OF ORDEALS
|
||||
|
||||
- Name: Cave of Ordeals
|
||||
Events:
|
||||
Can Beat 10 CoO Floors: Can_Defeat_Bokoblin and Can_Defeat_Keese and Can_Defeat_Rat and Can_Defeat_Baba_Serpent and
|
||||
Can_Defeat_Skulltula and Can_Defeat_Bulblin and Can_Defeat_Torch_Slug and Can_Defeat_Fire_Keese and
|
||||
Can_Defeat_Dodongo and Can_Defeat_Tektite and Can_Defeat_Lizalfos
|
||||
Can Beat 20 CoO Floors: Spinner and 'Can_Beat_10_CoO_Floors' and Can_Defeat_Helmasaur and Can_Defeat_Rat and
|
||||
Can_Defeat_Chu and Can_Defeat_Chu_Worm and Can_Defeat_Bubble and Can_Defeat_Bulblin and
|
||||
Can_Defeat_Keese and Can_Defeat_Rat and Can_Defeat_Stalhound and Can_Defeat_Poe and Can_Defeat_Leever
|
||||
Can Beat 30 CoO Floors: Ball_and_Chain and 'Can_Beat_20_CoO_Floors' and Can_Defeat_Bokoblin and Can_Defeat_Ice_Keese and
|
||||
Can_Defeat_Keese and Can_Defeat_Rat and Can_Defeat_Ghoul_Rat and Can_Defeat_Stalchild and
|
||||
Can_Defeat_Redead_Knight and Can_Defeat_Bulblin and Can_Defeat_Stalfos and Can_Defeat_Skulltula and
|
||||
Can_Defeat_Bubble and Can_Defeat_Lizalfos and Can_Defeat_Fire_Bubble
|
||||
Can Beat 40 CoO Floors: Restored_Dominion_Rod and 'Can_Beat_30_CoO_Floors' and Can_Defeat_Beamos and Can_Defeat_Keese and
|
||||
Can_Defeat_Torch_Slug and Can_Defeat_Fire_Keese and Can_Defeat_Dodongo and Can_Defeat_Fire_Bubble and
|
||||
Can_Defeat_Redead_Knight and Can_Defeat_Poe and Can_Defeat_Ghoul_Rat and Can_Defeat_Chu and
|
||||
Can_Defeat_Ice_Keese and Can_Defeat_Freezard and Can_Defeat_Chilfos and Can_Defeat_Ice_Bubble and
|
||||
Can_Defeat_Leever and Can_Defeat_Darknut
|
||||
Can Beat 50 CoO Floors: Double_Clawshots and 'Can_Beat_40_CoO_Floors' and Can_Defeat_Armos and Can_Defeat_Bokoblin and
|
||||
Can_Defeat_Baba_Serpent and Can_Defeat_Lizalfos and Can_Defeat_Bulblin and Can_Defeat_Dinalfos and
|
||||
Can_Defeat_Poe and Can_Defeat_Redead_Knight and Can_Defeat_Chu and Can_Defeat_Freezard and
|
||||
Can_Defeat_Chilfos and Can_Defeat_Ghoul_Rat and Can_Defeat_Rat and Can_Defeat_Stalchild and
|
||||
Can_Defeat_Aerolfos and Can_Defeat_Darknut
|
||||
Locations:
|
||||
# Chest are HD Only
|
||||
# Cave of Ordeals Floor 10 Chest: "'Can_Beat_10_CoO_Floors'"
|
||||
# Cave of Ordeals Floor 20 Chest: "'Can_Beat_20_CoO_Floors'"
|
||||
# Cave of Ordeals Floor 30 Chest: "'Can_Beat_30_CoO_Floors'"
|
||||
# Cave of Ordeals Floor 40 Chest: "'Can_Beat_40_CoO_Floors'"
|
||||
# Cave of Ordeals Floor 50 Chest: "'Can_Beat_50_CoO_Floors'"
|
||||
Cave of Ordeals Hint Sign: Nothing
|
||||
Cave of Ordeals Great Fairy Reward: "'Can_Beat_50_CoO_Floors'"
|
||||
Cave of Ordeals Floor 17 Poe: Spinner and 'Can_Beat_10_CoO_Floors' and Can_Defeat_Helmasaur and Can_Defeat_Rat and Can_Defeat_Chu and
|
||||
Can_Defeat_Chu_Worm and Can_Defeat_Bubble and Can_Defeat_Bulblin and Can_Defeat_Keese and Can_Defeat_Poe
|
||||
Cave of Ordeals Floor 33 Poe: Restored_Dominion_Rod and 'Can_Beat_30_CoO_Floors' and Can_Defeat_Beamos and Can_Defeat_Keese and
|
||||
Can_Defeat_Torch_Slug and Can_Defeat_Fire_Keese and Can_Defeat_Dodongo and Can_Defeat_Fire_Bubble and
|
||||
Can_Defeat_Redead_Knight and Can_Defeat_Poe
|
||||
Cave of Ordeals Floor 44 Poe: Double_Clawshots and 'Can_Beat_40_CoO_Floors' and Can_Defeat_Armos and Can_Defeat_Bokoblin and
|
||||
Can_Defeat_Baba_Serpent and Can_Defeat_Lizalfos and Can_Defeat_Bulblin and Can_Defeat_Dinalfos and
|
||||
Can_Defeat_Poe
|
||||
Exits:
|
||||
Gerudo Desert Cave of Ordeals Plateau: Clawshot
|
||||
@@ -0,0 +1,772 @@
|
||||
|
||||
# LANAYRU FIELD
|
||||
|
||||
- Name: Lanayru Field
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lanayru Field
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Lanayru Field Behind Gate Underwater Chest: Iron_Boots
|
||||
Lanayru Field Tree Boulder Rupee: Can_Smash
|
||||
Lanayru Field North Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Lanayru Field South Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Lanayru Field Male Stag Beetle: Clawshot or Gale_Boomerang
|
||||
Lanayru Field Female Stag Beetle: Clawshot or Gale_Boomerang
|
||||
Lanayru Field Bridge Poe: Night and Can_Use_Senses and Can_Complete_MDH and Can_Complete_All_Twilight
|
||||
Lanayru Field Hint Sign: Nothing
|
||||
Exits:
|
||||
Lanayru Field Near Zoras Domain: Can_Smash
|
||||
Lanayru Field Cave Entrance: Can_Smash
|
||||
Lanayru Field Chu Grotto: Can_Dig
|
||||
Lanayru Field Skulltula Grotto: Can_Dig
|
||||
Lanayru Field Poe Grotto: Can_Dig
|
||||
Hyrule Field Near Spinner Rails: Can_Smash
|
||||
Outside Castle Town West: Nothing
|
||||
North Eldin Field: Nothing
|
||||
Upper Zoras River: Impossible # To satisfy entrance rando
|
||||
|
||||
- Name: Lanayru Field Near Zoras Domain
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lanayru Field
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Zoras Domain West Ledge: Nothing
|
||||
Lanayru Field: Can_Smash
|
||||
|
||||
- Name: Lanayru Field Cave Entrance
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lanayru Field
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Lanayru Ice Puzzle Cave: Nothing
|
||||
Lanayru Field: Can_Smash
|
||||
|
||||
- Name: Lanayru Ice Puzzle Cave
|
||||
Locations:
|
||||
Lanayru Ice Block Puzzle Cave Chest: Ball_and_Chain
|
||||
Exits:
|
||||
Lanayru Field Cave Entrance: Nothing
|
||||
|
||||
- Name: Lanayru Field Chu Grotto
|
||||
# Locations:
|
||||
# Lanayru Field Chu Grotto Chest: Nothing # HD Only
|
||||
Exits:
|
||||
Lanayru Field: Nothing
|
||||
|
||||
- Name: Lanayru Field Skulltula Grotto
|
||||
Locations:
|
||||
Lanayru Field Skulltula Grotto Chest: Lantern
|
||||
Exits:
|
||||
Lanayru Field: Nothing
|
||||
|
||||
- Name: Lanayru Field Poe Grotto
|
||||
Locations:
|
||||
Lanayru Field Poe Grotto Left Poe: Can_Use_Senses
|
||||
Lanayru Field Poe Grotto Right Poe: Can_Use_Senses
|
||||
Exits:
|
||||
Lanayru Field: Nothing
|
||||
|
||||
- Name: Hyrule Field Near Spinner Rails
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lanayru Field
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Lanayru Field Spinner Track Chest: Spinner
|
||||
Lanayru Field North Spinner Track Boulder Rupee: Can_Smash
|
||||
Lanayru Field South Spinner Track Boulder Rupee: Can_Smash
|
||||
Exits:
|
||||
Lake Hylia Bridge: Can_Smash
|
||||
Lanayru Field: Can_Smash
|
||||
|
||||
# OUTSIDE CASTLE TOWN WEST
|
||||
|
||||
- Name: Outside Castle Town West
|
||||
Map Sector: Lanayru Province
|
||||
Region: Beside Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Castle Town Warp Portal: Nothing
|
||||
Hyrule Field Amphitheater Owl Statue Chest: Restored_Dominion_Rod
|
||||
Hyrule Field Amphitheater Owl Statue Sky Character: Restored_Dominion_Rod
|
||||
West Hyrule Field Northern Boulder Rupee: Can_Smash
|
||||
West Hyrule Field Southern Boulder Rupee: Can_Smash
|
||||
West Hyrule Field Male Butterfly: Nothing
|
||||
West Hyrule Field Female Butterfly: Gale_Boomerang
|
||||
Hyrule Field Amphitheater Poe: Can_Use_Senses and Night
|
||||
West Hyrule Field Golden Wolf: Can_Climb_Vines and 'Howl_at_Upper_Zoras_River_Howling_Stone'
|
||||
Beside Castle Town Hint Sign: Can_Climb_Vines
|
||||
Exits:
|
||||
Outside Castle Town West Grotto Ledge: Clawshot
|
||||
Castle Town West: Nothing
|
||||
Lake Hylia Bridge: Nothing
|
||||
Lanayru Field: Nothing
|
||||
|
||||
- Name: Outside Castle Town West Grotto Ledge
|
||||
Map Sector: Lanayru Province
|
||||
Region: Beside Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
West Hyrule Field Female Butterfly: Nothing
|
||||
Exits:
|
||||
Outside Castle Town West Helmasaur Grotto: Can_Dig
|
||||
Outside Castle Town West: Nothing
|
||||
|
||||
- Name: Outside Castle Town West Helmasaur Grotto
|
||||
Locations:
|
||||
West Hyrule Field Helmasaur Grotto Chest: Can_Defeat_Helmasaur
|
||||
Exits:
|
||||
Outside Castle Town West Grotto Exit: Nothing
|
||||
|
||||
# If you exit the grotto as wolf, you jump over the ledge and fall
|
||||
# down to Outside Castle Town West
|
||||
- Name: Outside Castle Town West Grotto Exit
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Outside Castle Town West Grotto Ledge: Human_Link
|
||||
Outside Castle Town West: Wolf_Link
|
||||
|
||||
# CASTLE TOWN
|
||||
|
||||
- Name: Castle Town West
|
||||
Map Sector: Lanayru Province
|
||||
Region: Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
Charlo Donation Blessing: "'Can_Farm_Lots_of_Rupees'"
|
||||
Exits:
|
||||
Castle Town STAR Game: Nothing
|
||||
Castle Town Center: Nothing
|
||||
Castle Town South: Nothing
|
||||
Outside Castle Town West: Nothing
|
||||
|
||||
- Name: Castle Town STAR Game
|
||||
Twilight: Lanayru
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
STAR Prize 1: Clawshot
|
||||
STAR Prize 2: Double_Clawshots
|
||||
Exits:
|
||||
Castle Town West: Nothing
|
||||
|
||||
- Name: Castle Town Center
|
||||
Map Sector: Lanayru Province
|
||||
Region: Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
Castle Town Center Hint Sign: Nothing
|
||||
Exits:
|
||||
Castle Town Goron House West Door Exterior: Nothing
|
||||
Castle Town Goron House East Door Exterior: Nothing
|
||||
Castle Town Malo Mart: Can_Open_Doors and 'Can_Farm_Rupees'
|
||||
Castle Town North: Nothing
|
||||
Castle Town East: Nothing
|
||||
Castle Town South: Nothing
|
||||
Castle Town West: Nothing
|
||||
|
||||
- Name: Castle Town Goron House West Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Goron House West Door Interior: Can_Open_Doors
|
||||
Castle Town Center: Nothing
|
||||
|
||||
- Name: Castle Town Goron House East Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Goron House East Door Interior: Can_Open_Doors
|
||||
Castle Town Center: Nothing
|
||||
|
||||
- Name: Castle Town Goron House West Door Interior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Goron House West Door Exterior: Can_Open_Doors
|
||||
Castle Town Goron House: Nothing
|
||||
|
||||
- Name: Castle Town Goron House East Door Interior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Goron House East Door Exterior: Can_Open_Doors
|
||||
Castle Town Goron House: Nothing
|
||||
|
||||
- Name: Castle Town Goron House
|
||||
Can Transform: If Transform Anywhere
|
||||
Exits:
|
||||
Castle Town Goron House West Door Interior: Nothing
|
||||
Castle Town Goron House East Door Interior: Nothing
|
||||
Castle Town Goron House Ledge: Nothing
|
||||
|
||||
- Name: Castle Town Goron House Ledge
|
||||
Twilight: Lanayru
|
||||
Can Transform: If Transform Anywhere
|
||||
Exits:
|
||||
Castle Town Goron House: Nothing
|
||||
|
||||
- Name: Castle Town Malo Mart
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
# Castle Town Malo Mart Stamp: Can_Talk_to_Humans and 'Can_Farm_Lots_of_Rupees' and 'Can_Fund_Malo_Mart' # HD only
|
||||
Castle Town Malo Mart Magic Armor: Can_Talk_to_Humans and 'Can_Farm_Lots_of_Rupees' and 'Can_Fund_Malo_Mart' and Big_Wallet
|
||||
Exits:
|
||||
Castle Town Center: Can_Open_Doors
|
||||
|
||||
- Name: Castle Town North
|
||||
Map Sector: Lanayru Province
|
||||
Region: Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Castle Town North Behind First Door: Can_Complete_MDH
|
||||
Castle Town Center: Nothing
|
||||
|
||||
- Name: Castle Town North Behind First Door
|
||||
Twilight: Lanayru
|
||||
Locations:
|
||||
North Castle Town Golden Wolf: "'Howl_at_Hidden_Village_Howling_Stone'"
|
||||
Exits:
|
||||
Castle Town North Inside Barrier: Can_Break_Hyrule_Castle_Barrier
|
||||
Castle Town North: Can_Complete_MDH
|
||||
|
||||
- Name: Castle Town North Inside Barrier
|
||||
Twilight: Lanayru
|
||||
Exits:
|
||||
Hyrule Castle Entrance: Nothing
|
||||
Castle Town North Behind First Door: Can_Complete_MDH
|
||||
|
||||
- Name: Castle Town East
|
||||
Map Sector: Lanayru Province
|
||||
Region: Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Castle Town Doctors Office West Door Exterior: Nothing
|
||||
Castle Town Doctors Office East Door Exterior: Nothing
|
||||
Outside Castle Town East: Nothing
|
||||
Castle Town South: Nothing
|
||||
Castle Town Center: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office West Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Doctors Office West Door Interior: Can_Open_Doors
|
||||
Castle Town East: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office East Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Doctors Office East Door Interior: Can_Open_Doors
|
||||
Castle Town East: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office West Door Interior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Doctors Office West Door Exterior: Can_Open_Doors
|
||||
Castle Town Doctors Office Entrance: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office East Door Interior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Castle Town Doctors Office East Door Exterior: Can_Open_Doors
|
||||
Castle Town Doctors Office Entrance: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office Entrance
|
||||
Can Transform: If Transform Anywhere
|
||||
Exits:
|
||||
Castle Town Doctors Office Lower: Ilia_Memory_Quest >= Statue or (Invoice and Can_Talk_to_Humans)
|
||||
Castle Town Doctors Office West Door Interior: Nothing
|
||||
Castle Town Doctors Office East Door Interior: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office Lower
|
||||
Events:
|
||||
Medicine Scent: Can_Sniff
|
||||
Exits:
|
||||
Castle Town Doctors Office Upper: Wolf_Link
|
||||
Castle Town Doctors Office Entrance: Invoice and Can_Talk_to_Humans
|
||||
|
||||
- Name: Castle Town Doctors Office Upper
|
||||
Exits:
|
||||
Castle Town Doctors Office Lower: Nothing
|
||||
Castle Town Doctors Office Balcony: Nothing
|
||||
|
||||
- Name: Castle Town Doctors Office Balcony
|
||||
Twilight: Lanayru
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
Doctors Office Balcony Chest: Nothing
|
||||
Exits:
|
||||
Castle Town East: Nothing
|
||||
Castle Town Doctors Office Upper: Nothing
|
||||
|
||||
- Name: Outside Castle Town East
|
||||
Can Transform: If Transform Anywhere
|
||||
Map Sector: Lanayru Province
|
||||
Region: Castle Town
|
||||
Can Warp: True
|
||||
Locations:
|
||||
East Castle Town Bridge Poe: Night and Can_Use_Senses
|
||||
Exits:
|
||||
Eldin Field Near Castle Town: Nothing
|
||||
Castle Town East: Nothing
|
||||
|
||||
- Name: Castle Town South
|
||||
Map Sector: Lanayru Province
|
||||
Region: Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Buy Hot Spring Water: "'Can_Finish_Goron_Springwater_Rush'"
|
||||
Can Learn About Wooden Statue: "'Medicine_Scent'"
|
||||
Locations:
|
||||
Castle Town Twilit Insect: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Exits:
|
||||
Castle Town Agithas House: Can_Open_Doors
|
||||
Castle Town Seer House: Can_Open_Doors
|
||||
Castle Town Jovanis House: Can_Dig
|
||||
Castle Town Telmas Bar: Can_Open_Doors
|
||||
Outside Castle Town South: Nothing
|
||||
Castle Town West: Nothing
|
||||
Castle Town East: Nothing
|
||||
Castle Town Center: Nothing
|
||||
|
||||
- Name: Castle Town Agithas House
|
||||
Can Transform: If Transform Anywhere
|
||||
Locations:
|
||||
Agitha Female Ant Reward: Female_Ant and Can_Talk_to_Humans
|
||||
Agitha Female Beetle Reward: Female_Beetle and Can_Talk_to_Humans
|
||||
Agitha Female Butterfly Reward: Female_Butterfly and Can_Talk_to_Humans
|
||||
Agitha Female Dayfly Reward: Female_Dayfly and Can_Talk_to_Humans
|
||||
Agitha Female Dragonfly Reward: Female_Dragonfly and Can_Talk_to_Humans
|
||||
Agitha Female Grasshopper Reward: Female_Grasshopper and Can_Talk_to_Humans
|
||||
Agitha Female Ladybug Reward: Female_Ladybug and Can_Talk_to_Humans
|
||||
Agitha Female Mantis Reward: Female_Mantis and Can_Talk_to_Humans
|
||||
Agitha Female Phasmid Reward: Female_Phasmid and Can_Talk_to_Humans
|
||||
Agitha Female Pill Bug Reward: Female_Pill_Bug and Can_Talk_to_Humans
|
||||
Agitha Female Snail Reward: Female_Snail and Can_Talk_to_Humans
|
||||
Agitha Female Stag Beetle Reward: Female_Stag_Beetle and Can_Talk_to_Humans
|
||||
Agitha Male Ant Reward: Male_Ant and Can_Talk_to_Humans
|
||||
Agitha Male Beetle Reward: Male_Beetle and Can_Talk_to_Humans
|
||||
Agitha Male Butterfly Reward: Male_Butterfly and Can_Talk_to_Humans
|
||||
Agitha Male Dayfly Reward: Male_Dayfly and Can_Talk_to_Humans
|
||||
Agitha Male Dragonfly Reward: Male_Dragonfly and Can_Talk_to_Humans
|
||||
Agitha Male Grasshopper Reward: Male_Grasshopper and Can_Talk_to_Humans
|
||||
Agitha Male Ladybug Reward: Male_Ladybug and Can_Talk_to_Humans
|
||||
Agitha Male Mantis Reward: Male_Mantis and Can_Talk_to_Humans
|
||||
Agitha Male Phasmid Reward: Male_Phasmid and Can_Talk_to_Humans
|
||||
Agitha Male Pill Bug Reward: Male_Pill_Bug and Can_Talk_to_Humans
|
||||
Agitha Male Snail Reward: Male_Snail and Can_Talk_to_Humans
|
||||
Agitha Male Stag Beetle Reward: Male_Stag_Beetle and Can_Talk_to_Humans
|
||||
# Agitha 12 Golden Bugs Reward: golden_bugs(12) and Can_Talk_to_Humans # HD Only
|
||||
Exits:
|
||||
Castle Town South: Can_Open_Doors
|
||||
|
||||
- Name: Castle Town Seer House
|
||||
Can Transform: If Transform Anywhere
|
||||
Exits:
|
||||
Castle Town South: Can_Open_Doors
|
||||
|
||||
- Name: Castle Town Jovanis House
|
||||
Twilight: Lanayru
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Can Farm Lots of Rupees: Can_Talk_to_Animals and 'Can_Talk_to_Jovani_in_Telmas_Bar'
|
||||
Freed Jovani: count(Poe_Soul, 60)
|
||||
Locations:
|
||||
Jovani House Poe: Can_Use_Senses
|
||||
Jovani 20 Poe Soul Reward: count(Poe_Soul, 20)
|
||||
Jovani 60 Poe Soul Reward: "'Freed_Jovani'"
|
||||
# Gengle 60 Poe Soul Reward: Can_Talk_to_Animals and 'Can_Talk_to_Jovani_in_Telmas_Bar' # HD Only
|
||||
Exits:
|
||||
Castle Town South: Nothing
|
||||
|
||||
- Name: Castle Town Telmas Bar
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Can Talk to Jovani in Telmas Bar: Can_Talk_to_Humans and 'Freed_Jovani'
|
||||
Locations:
|
||||
Telma Invoice: Renados_Letter
|
||||
Exits:
|
||||
Castle Town South: Can_Open_Doors
|
||||
|
||||
# OUTSIDE CASTLE TOWN SOUTH
|
||||
|
||||
- Name: Outside Castle Town South
|
||||
Map Sector: Lanayru Province
|
||||
Region: South of Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Outside South Castle Town Tightrope Chest: Clawshot and Can_Use_Tightrope
|
||||
Outside South Castle Town Fountain Chest: Spinner and Clawshot
|
||||
Outside South Castle Town Double Clawshot Chasm Chest: Double_Clawshots
|
||||
Outside South Castle Town Boulder Rupee: Can_Smash
|
||||
Outside South Castle Town Male Ladybug: Nothing
|
||||
Outside South Castle Town Female Ladybug: Nothing
|
||||
Outside South Castle Town Poe: Night and Can_Use_Senses
|
||||
Outside South Castle Town Golden Wolf: "'Howl_at_North_Faron_Woods_Howling_Stone'"
|
||||
Wooden Statue: "'Can_Learn_About_Wooden_Statue'"
|
||||
Outside South Castle Town Hint Sign: Nothing
|
||||
Exits:
|
||||
Outside Castle Town South Tektite Grotto Platform: Can_Climb_Vines
|
||||
Faron Field Behind Boulder: Can_Use_Hot_Spring_Water
|
||||
Lake Hylia: Nothing
|
||||
Castle Town South: Nothing
|
||||
|
||||
- Name: Outside Castle Town South Tektite Grotto Platform
|
||||
Map Sector: Lanayru Province
|
||||
Region: South of Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Outside Castle Town South Tektite Grotto: Can_Dig
|
||||
Outside Castle Town South: Nothing
|
||||
|
||||
- Name: Outside Castle Town South Tektite Grotto
|
||||
Locations:
|
||||
Outside South Castle Town Tektite Grotto Chest: Can_Defeat_Tektite
|
||||
Exits:
|
||||
Outside Castle Town South Tektite Grotto Platform: Nothing
|
||||
|
||||
# If you enter Outside Castle Town South from there while the boulder is still there,
|
||||
# you get stuck and are forced to save-warp or portal-warp
|
||||
- Name: Outside Castle Town South Inside Boulder
|
||||
Map Sector: Lanayru Province
|
||||
Region: South of Castle Town
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Outside Castle Town South: Can_Use_Hot_Spring_Water and 'Can_Access_Outside_Castle_Town_South'
|
||||
|
||||
# LAKE HYLIA BRIDGE
|
||||
|
||||
- Name: Lake Hylia Bridge
|
||||
Map Sector: Lanayru Province
|
||||
Region: Great Bridge of Hylia
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Lake Hylia Bridge Vines Chest: Clawshot
|
||||
Lake Hylia Bridge Owl Statue Chest: Clawshot and Restored_Dominion_Rod
|
||||
Lake Hylia Bridge Faron Boulder Rupee: Can_Smash
|
||||
Lake Hylia Bridge Owl Statue Boulder Rupee: Can_Smash
|
||||
Lake Hylia Bridge Owl Statue Sky Character: Clawshot and Restored_Dominion_Rod
|
||||
Lake Hylia Bridge Male Mantis: Clawshot or Gale_Boomerang
|
||||
Lake Hylia Bridge Female Mantis: Clawshot or Gale_Boomerang
|
||||
Lake Hylia Bridge Hint Sign: Clawshot
|
||||
Exits:
|
||||
Lake Hylia Bridge Grotto Ledge: Can_Launch_Bombs and Clawshot
|
||||
Hyrule Field Near Spinner Rails: Can_Smash
|
||||
Flight by Fowl: Can_Open_Doors
|
||||
Faron Field: Gate_Keys or Small_Keys == Keysy
|
||||
Outside Castle Town West: Nothing
|
||||
Lake Hylia: Twilight
|
||||
|
||||
- Name: Lake Hylia Bridge Grotto Ledge
|
||||
Map Sector: Lanayru Province
|
||||
Region: Great Bridge of Hylia
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Lake Hylia Bridge Cliff Chest: Nothing
|
||||
Lake Hylia Bridge Cliff Poe: Can_Use_Senses and Can_Complete_MDH and Can_Complete_All_Twilight
|
||||
Exits:
|
||||
Lake Hylia Bridge Bubble Grotto: Can_Dig
|
||||
Lake Hylia Bridge: Nothing
|
||||
|
||||
- Name: Lake Hylia Bridge Bubble Grotto
|
||||
Locations:
|
||||
Lake Hylia Bridge Bubble Grotto Chest: Can_Defeat_Bubble and Can_Defeat_Fire_Bubble and Can_Defeat_Ice_Bubble
|
||||
Exits:
|
||||
Lake Hylia Bridge Grotto Ledge: Nothing
|
||||
|
||||
# LAKE HYLIA
|
||||
|
||||
- Name: Lake Hylia
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lake Hylia
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Events:
|
||||
Can Farm Lots of Rupees: Nothing
|
||||
Locations:
|
||||
Lake Hylia Warp Portal: Nothing
|
||||
Lake Hylia Underwater Chest: Iron_Boots
|
||||
Lake Hylia Left Underwater Boulder Rupee: Zora_Armor and Iron_Boots and Water_Bombs and Can_Complete_Lanayru_Twilight
|
||||
Lake Hylia Left Underwater Pillar Rupee: Zora_Armor and Can_Complete_Lanayru_Twilight
|
||||
Lake Hylia Right Underwater Boulder Rupee: Zora_Armor and Iron_Boots and Water_Bombs and Can_Complete_Lanayru_Twilight
|
||||
Lake Hylia Right Underwater Pillar Rupee: Zora_Armor and Can_Complete_Lanayru_Twilight
|
||||
Lake Hylia Alcove Poe: Night and Can_Use_Senses
|
||||
Lake Hylia Dock Poe: Night and Can_Use_Senses
|
||||
Plumm Fruit Balloon Minigame: Can_Howl
|
||||
Lake Hylia Twilit Insect Between Bridges: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Lake Hylia Burrowing Twilit Insect: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Lake Hylia Twilit Insect Behind Canon: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Lake Hylia Twilit Insect on Docks: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Lake Hylia Twilit Bloat: count(Lanayru_Twilight_Tear, 15) and Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras River Twilit Insect 1: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras River Twilit Insect 2: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras River Twilit Insect 3: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras River Twilit Insect 4: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Exits:
|
||||
Lake Hylia Upper Area: Can_Climb_Ladders
|
||||
Flight by Fowl: Can_Talk_to_Humans
|
||||
Lake Hylia Lakebed Temple Entrance: Zora_Armor and (Lakebed_Does_Not_Require_Water_Bombs == On or (Iron_Boots and Water_Bombs))
|
||||
Lake Hylia Lanayru Spring: Nothing
|
||||
City in the Sky Entrance: Clawshot and (City_Does_Not_Require_Filled_Skybook == On or count(Progressive_Sky_Book, 7))
|
||||
Gerudo Desert: Aurus_Memo
|
||||
Upper Zoras River: Can_Howl or Twilight
|
||||
Kakariko Graveyard Pond: Impossible # To satisfy entrance rando
|
||||
Outside Castle Town South: Impossible # To saitisfy entrance rando
|
||||
|
||||
# Area after the ladder
|
||||
- Name: Lake Hylia Upper Area
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lake Hylia
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Events:
|
||||
Howl at Lake Hylia Howling Stone: Can_Howl
|
||||
Locations:
|
||||
Auru Gift To Fyer: Can_Climb_Ladders
|
||||
Lake Hylia Tower Poe: Night and Can_Use_Senses
|
||||
Exits:
|
||||
Lake Hylia Cave Entrance: Can_Smash
|
||||
Lake Hylia Water Toadpoli Grotto: Can_Dig
|
||||
Lake Hylia: Nothing
|
||||
|
||||
- Name: Lake Hylia Cave Entrance
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lake Hylia
|
||||
Can Warp: True
|
||||
Exits:
|
||||
Lake Hylia Long Cave: Nothing
|
||||
Lake Hylia: Can_Smash
|
||||
|
||||
- Name: Lake Hylia Long Cave
|
||||
Locations:
|
||||
Lake Lantern Cave First Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Second Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Third Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Fourth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Fifth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Sixth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Seventh Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Eighth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Ninth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Tenth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Eleventh Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Twelfth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Thirteenth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave Fourteenth Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave End Lantern Chest: Can_Smash and Lantern
|
||||
Lake Lantern Cave First Poe: Can_Smash and Lantern and Can_Use_Senses
|
||||
Lake Lantern Cave Second Poe: Can_Smash and Lantern and Can_Use_Senses
|
||||
Lake Lantern Cave Final Poe: Can_Smash and Lantern and Can_Use_Senses
|
||||
Lake Lantern Cave Hint Sign: Can_Smash and Lantern
|
||||
Exits:
|
||||
Lake Hylia Cave Entrance: Nothing
|
||||
|
||||
- Name: Lake Hylia Water Toadpoli Grotto
|
||||
Locations:
|
||||
Lake Hylia Water Toadpoli Grotto Chest: Can_Defeat_Water_Toadpoli
|
||||
Exits:
|
||||
Lake Hylia Upper Area: Nothing
|
||||
|
||||
- Name: Flight by Fowl
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lake Hylia
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Outside Lanayru Spring Left Statue Chest: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Outside Lanayru Spring Right Statue Chest: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Flight By Fowl Top Platform Reward: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Flight By Fowl Second Platform Chest: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Flight By Fowl Third Platform Chest: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Flight By Fowl Fourth Platform Chest: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Flight By Fowl Fifth Platform Chest: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Isle of Riches Poe: Night and Can_Use_Senses and Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Lake Hylia Hint Sign: Nothing
|
||||
Exits:
|
||||
Lake Hylia Shell Blade Grotto Ledge: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Lake Hylia Bridge: Can_Open_Doors
|
||||
Lake Hylia: Can_Talk_to_Humans
|
||||
|
||||
- Name: Lake Hylia Shell Blade Grotto Ledge
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lake Hylia
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Flight By Fowl Ledge Poe: Night and Can_Use_Senses
|
||||
Exits:
|
||||
Lake Hylia Shell Blade Grotto: Can_Dig
|
||||
Lake Hylia: Nothing
|
||||
|
||||
- Name: Lake Hylia Shell Blade Grotto
|
||||
Locations:
|
||||
Lake Hylia Shell Blade Grotto Chest: Can_Defeat_Shell_Blade
|
||||
Exits:
|
||||
Lake Hylia Shell Blade Grotto Ledge: Nothing
|
||||
|
||||
- Name: Lake Hylia Lanayru Spring
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lanayru Spring
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Lanayru Spring Underwater Left Chest: Iron_Boots or (Can_Do_Niche_Stuff and Magic_Armor)
|
||||
Lanayru Spring Underwater Right Chest: Iron_Boots or (Can_Do_Niche_Stuff and Magic_Armor)
|
||||
Lanayru Spring Back Room Left Chest: Clawshot
|
||||
Lanayru Spring Back Room Right Chest: Clawshot
|
||||
Lanayru Spring Back Room Lantern Chest: Clawshot and Lantern
|
||||
Lanayru Spring East Double Clawshot Chest: Double_Clawshots
|
||||
Lanayru Spring West Double Clawshot Chest: Double_Clawshots
|
||||
Lanayru Spring Lower Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Lanayru Spring Upper Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Lanayru Spring Hint Sign: Iron_Boots or (Can_Do_Niche_Stuff and Magic_Armor)
|
||||
Exits:
|
||||
Lake Hylia: Nothing
|
||||
|
||||
- Name: Lake Hylia Lakebed Temple Entrance
|
||||
Map Sector: Lanayru Province
|
||||
Region: Lake Hylia
|
||||
Twilight: Lanayru
|
||||
Exits:
|
||||
Lakebed Temple Entrance: Nothing
|
||||
Lake Hylia: Zora_Armor and ((Lakebed_Does_Not_Require_Water_Bombs == On) or (Iron_Boots and Water_Bombs))
|
||||
|
||||
|
||||
# UPPER ZORAS RIVER
|
||||
|
||||
- Name: Upper Zoras River
|
||||
Map Sector: Lanayru Province
|
||||
Region: Upper Zoras River
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Events:
|
||||
Howl at Upper Zoras River Howling Stone: Can_Howl
|
||||
Locations:
|
||||
Upper Zoras River Warp Portal: Sword or (Can_Defeat_Shadow_Beast and Logic_Transform_Anywhere == On)
|
||||
Upper Zoras River Ledge Boulder Rupee: Can_Smash
|
||||
Upper Zoras River East Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Upper Zoras River West Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Upper Zoras River Central Underwater Boulder Rupee: Iron_Boots and Water_Bombs
|
||||
Upper Zoras River Female Dragonfly: Nothing
|
||||
Upper Zoras River Poe: Can_Use_Senses
|
||||
Upper Zoras River Twilit Insect: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Exits:
|
||||
Upper Zoras River Izas House: Can_Open_Doors and Upper_Zoras_River_Portal
|
||||
Fishing Hole: Can_Open_Doors
|
||||
Zoras Domain: Nothing
|
||||
Lanayru Field: Nothing
|
||||
|
||||
- Name: Upper Zoras River Izas House
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Iza Helping Hand: Bow and Upper_Zoras_River_Portal
|
||||
Iza Raging Rapids Minigame: Bow and Upper_Zoras_River_Portal
|
||||
Exits:
|
||||
Upper Zoras River: Can_Open_Doors
|
||||
|
||||
- Name: Fishing Hole
|
||||
Map Sector: Lanayru Province
|
||||
Region: Upper Zoras River
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Fishing Hole Heart Piece: Clawshot
|
||||
Fishing Hole Bottle: Fishing_Rod
|
||||
Fishing Hole Hint Sign: Nothing
|
||||
Exits:
|
||||
Fishing Hole House: Can_Open_Doors
|
||||
Upper Zoras River: Can_Open_Doors
|
||||
|
||||
- Name: Fishing Hole House
|
||||
Locations:
|
||||
Fishing Hole Heart Piece: "'Can_Farm_Rupees'"
|
||||
Exits:
|
||||
Fishing Hole: Can_Open_Doors
|
||||
|
||||
# ZORAS DOMAIN
|
||||
|
||||
- Name: Zoras Domain
|
||||
Map Sector: Lanayru Province
|
||||
Region: Zoras Domain
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Events:
|
||||
Reekfish Scent: Coral_Earring
|
||||
Locations:
|
||||
Zoras Domain Chest By Mother and Child Isles: Nothing
|
||||
Zoras Domain Chest Behind Waterfall: Can_Midna_Jump
|
||||
Zoras Domain Central Underwater Boulder Rupee: Can_Complete_Lanayru_Twilight and Iron_Boots and Water_Bombs
|
||||
Zoras Domain North Underwater Boulder Rupee: Can_Complete_Lanayru_Twilight and Iron_Boots and Water_Bombs
|
||||
Zoras Domain Male Dragonfly: Nothing
|
||||
Zoras Domain Mother and Child Isle Poe: Can_Use_Senses
|
||||
Zoras Domain Waterfall Poe: Can_Midna_Jump and Can_Use_Senses
|
||||
Zoras Domain Twilit Insect near Lilypads 1: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras Domain Twilit Insect near Lilypads 2: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras Domain Burrowing Twilit Insect: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Exits:
|
||||
Zoras Domain West Ledge: Clawshot or Can_Midna_Jump or Twilight
|
||||
Zoras Domain Top of Waterfall: Clawshot or Can_Midna_Jump or Twilight
|
||||
Snowpeak Climb Lower: Not_Twilight
|
||||
Upper Zoras River: Nothing
|
||||
|
||||
- Name: Zoras Domain West Ledge
|
||||
Map Sector: Lanayru Province
|
||||
Region: Zoras Domain
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Zoras Domain Twilit Insect on West Ledge: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Zoras Domain Hint Sign: Nothing
|
||||
Exits:
|
||||
Zoras Domain Top of Waterfall: Can_Smash
|
||||
Zoras Domain: Nothing
|
||||
Lanayru Field Near Zoras Domain: Nothing
|
||||
|
||||
- Name: Zoras Domain Top of Waterfall
|
||||
Map Sector: Lanayru Province
|
||||
Region: Zoras Domain
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Zoras Domain Behind Waterfall Rupee: Can_Complete_Lanayru_Twilight
|
||||
Zoras Domain Top Ledge Rupee: Can_Complete_Lanayru_Twilight
|
||||
Zoras Domain Vine Ledge Rupee: Can_Complete_Lanayru_Twilight
|
||||
Zoras Domain Waterfall Ledge Rupee: Can_Complete_Lanayru_Twilight
|
||||
Zoras Domain Shortcut Ledge Rupee: Can_Complete_Lanayru_Twilight
|
||||
Zoras Domain Shortcut Lower Boulder Rupee: Can_Smash
|
||||
Zoras Domain Shortcut Upper Boulder Rupee: Can_Smash
|
||||
Exits:
|
||||
Zoras Throne Room: Nothing
|
||||
Zoras Domain West Ledge: Can_Smash
|
||||
Zoras Domain: Nothing
|
||||
|
||||
- Name: Zoras Throne Room
|
||||
Map Sector: Lanayru Province
|
||||
Region: Zoras Domain
|
||||
Twilight: Lanayru
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Zoras Domain Warp Portal: Nothing
|
||||
Zoras Domain Light All Torches Chest: Can_Light_Torches and Iron_Boots
|
||||
Zoras Domain Extinguish All Torches Chest: Can_Extinguish_Torches and Iron_Boots
|
||||
Zoras Domain Throne East Gate Underwater Rupee: Can_Complete_Lanayru_Twilight and Iron_Boots
|
||||
Zoras Domain Throne East Underwater Rupee: Can_Complete_Lanayru_Twilight and (Iron_Boots or Zora_Armor)
|
||||
Zoras Domain Throne Northwest Underwater Rupee: Can_Complete_Lanayru_Twilight and (Iron_Boots or Zora_Armor)
|
||||
Zoras Domain Throne South Underwater Rupee: Can_Complete_Lanayru_Twilight and (Iron_Boots or Zora_Armor)
|
||||
Zoras Domain Throne West Gate Underwater Rupee: Can_Complete_Lanayru_Twilight and Iron_Boots
|
||||
Zoras Domain Throne West Underwater Rupee: Can_Complete_Lanayru_Twilight and (Iron_Boots or Zora_Armor)
|
||||
Zoras Domain Underwater Goron: Water_Bombs and Iron_Boots and Zora_Armor
|
||||
Zoras Domain Throne Room Twilit Insect: Can_Defeat_Lanayru_Twilit_Insect
|
||||
Exits:
|
||||
Zoras Domain Top of Waterfall: Nothing
|
||||
@@ -0,0 +1,173 @@
|
||||
|
||||
# OUTSIDE LINK'S HOUSE
|
||||
|
||||
- Name: Outside Links House
|
||||
Map Sector: Ordona Province
|
||||
Region: Ordon
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Ordon Hint Sign: Nothing
|
||||
Exits:
|
||||
Ordon Village: Nothing
|
||||
Ordon Spring: Nothing
|
||||
Ordon Links House: Can_Climb_Ladders and Can_Open_Doors
|
||||
|
||||
- Name: Ordon Links House
|
||||
Exits:
|
||||
Outside Links House: Can_Open_Doors
|
||||
Locations:
|
||||
Wooden Sword Chest: Nothing
|
||||
Links Basement Chest: Lantern
|
||||
|
||||
# ORDON SPRING
|
||||
|
||||
- Name: Ordon Spring
|
||||
Map Sector: Ordona Province
|
||||
Region: Ordon
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Locations:
|
||||
Ordon Spring Warp Portal: Nothing
|
||||
Ordon Spring Golden Wolf: "'Howl_at_Death_Mountain_Howling_Stone'"
|
||||
Exits:
|
||||
Outside Links House: Nothing
|
||||
Ordon Bridge: Skip_Prologue == On or ('Can_Access_Outside_Links_House' and Sword and Slingshot)
|
||||
|
||||
- Name: Ordon Bridge
|
||||
Map Sector: Ordona Province
|
||||
Region: Ordon
|
||||
Can Warp: True
|
||||
Exits:
|
||||
South Faron Woods: Can_Complete_Prologue
|
||||
Ordon Spring: Skip_Prologue == On or ('Can_Access_Outside_Links_House' and Sword and Slingshot)
|
||||
|
||||
# ORDON VILLAGE
|
||||
|
||||
- Name: Ordon Village
|
||||
Map Selector: Ordona Province
|
||||
Region: Ordon
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Events:
|
||||
Can Farm Rupees: Nothing # Can break pumpkins
|
||||
Can Refill Slingshot Seeds: Nothing # Can break pumpkins
|
||||
Fish for Ordon Cat: Day and Fishing_Rod
|
||||
Locations:
|
||||
Ordon Rupee Under Tall Tree 1: Nothing
|
||||
Ordon Rupee Under Tall Tree 2: Nothing
|
||||
Ordon Tree Long Branch Rupee: Can_Climb_Vines
|
||||
Ordon Tree Short Branch Rupee: Can_Climb_Vines
|
||||
Ordon Bo Cliff Rupee: Can_Climb_Ladders and Can_Summon_Hawk
|
||||
Ordon Bo Roof Rupee: Can_Climb_Ladders
|
||||
Ordon Bo Window Rupee 1: Can_Climb_Ladders
|
||||
Ordon Bo Window Rupee 2: Can_Climb_Ladders
|
||||
Ordon Rupee In Grass By Bo: Nothing
|
||||
Ordon Rusl House Roof Rupee 1: Human_Link
|
||||
Ordon Rusl House Roof Rupee 2: Human_Link
|
||||
Ordon Hidden Rusl House Rupee: Gale_Boomerang or Clawshot
|
||||
Ordon Rupee In River 1: Nothing
|
||||
Ordon Rupee In River 2: Nothing
|
||||
Ordon Rupee Under Bridge: Nothing
|
||||
Ordon Shield House Ledge Grass Rupee: Night and (Gale_Boomerang or Clawshot)
|
||||
Uli Cradle Delivery: Day and Human_Link
|
||||
Exits:
|
||||
Ordon Seras Shop: Day and Can_Open_Doors
|
||||
Ordon Sword House: Day and Can_Open_Doors
|
||||
Ordon Shield House: Day and Can_Open_Doors
|
||||
Ordon Shield House Upper Ledge: Impossible # To satisfy Entrance Rando
|
||||
Ordon Fados House: Day and Can_Open_Doors
|
||||
Ordon Bos House Left Door Exterior: Nothing
|
||||
Ordon Bos House Right Door Exterior: Nothing
|
||||
Ordon Ranch Village Pathway: Nothing
|
||||
Outside Links House: Nothing
|
||||
|
||||
- Name: Ordon Seras Shop
|
||||
Can Transform: If Transform Anywhere
|
||||
Events:
|
||||
Can Refill Lantern Oil: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Locations:
|
||||
Ordon Cat Rescue: "'Fish_for_Ordon_Cat'"
|
||||
Sera Shop Slingshot: Can_Talk_to_Humans and 'Can_Farm_Rupees'
|
||||
Exits:
|
||||
Ordon Village: Nothing
|
||||
|
||||
- Name: Ordon Sword House
|
||||
Locations:
|
||||
Ordon Sword: Can_Complete_Prologue or Faron_Twilight_Cleared == On
|
||||
Exits:
|
||||
Ordon Village: Can_Open_Doors
|
||||
|
||||
- Name: Ordon Shield House
|
||||
Exits:
|
||||
Ordon Shield House Upper Ledge: Wolf_Link
|
||||
Ordon Village: Can_Open_Doors
|
||||
|
||||
- Name: Ordon Shield House Upper Ledge
|
||||
Locations:
|
||||
Ordon Shield: (Can_Complete_Prologue or Faron_Twilight_Cleared == On) and Can_Survive_Two_Bonks
|
||||
Exits:
|
||||
Ordon Village: Wolf_Link
|
||||
|
||||
- Name: Ordon Fados House
|
||||
Exits:
|
||||
Ordon Village: Can_Open_Doors
|
||||
|
||||
- Name: Ordon Bos House Left Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Ordon Bos House Left Door Interior: Can_Open_Doors
|
||||
Ordon Village: Nothing
|
||||
|
||||
- Name: Ordon Bos House Right Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Ordon Bos House Right Door Interior: Can_Open_Doors
|
||||
Ordon Village: Nothing
|
||||
|
||||
- Name: Ordon Bos House Left Door Interior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Ordon Bos House Left Door Exterior: Can_Open_Doors
|
||||
Ordon Bos House: Nothing
|
||||
|
||||
- Name: Ordon Bos House Right Door Interior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Ordon Bos House Right Door Exterior: Can_Open_Doors
|
||||
Ordon Bos House: Nothing
|
||||
|
||||
- Name: Ordon Bos House
|
||||
Can Transform: Never
|
||||
Locations:
|
||||
Wrestling With Bo: Human_Link
|
||||
Exits:
|
||||
Ordon Bos House Right Door Interior: Nothing
|
||||
Ordon Bos House Right Door Interior: Nothing
|
||||
|
||||
# ORDON RANCH
|
||||
|
||||
- Name: Ordon Ranch Village Pathway
|
||||
Map Sector: Ordona Province
|
||||
Region: Ordon
|
||||
Can Warp: True
|
||||
Can Change Time: True
|
||||
Exits:
|
||||
Ordon Village: Nothing
|
||||
Ordon Ranch: Day
|
||||
|
||||
- Name: Ordon Ranch
|
||||
Map Sector: Ordona Province
|
||||
Region: Ordon
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Herding Goats Reward: Can_Complete_Prologue and Day
|
||||
Exits:
|
||||
Ordon Ranch Grotto: Wolf_Link
|
||||
Ordon Ranch Village Pathway: Day
|
||||
|
||||
- Name: Ordon Ranch Grotto
|
||||
Locations:
|
||||
Ordon Ranch Grotto Lantern Chest: Can_Light_Torches
|
||||
Exits:
|
||||
Ordon Ranch: Nothing
|
||||
@@ -0,0 +1,116 @@
|
||||
- Name: Snowpeak Climb Lower
|
||||
Map Sector: Snowpeak Province
|
||||
Region: Snowpeak Mountain
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Ashei Sketch: Can_Talk_to_Humans
|
||||
Snowpeak Hint Sign: Nothing
|
||||
Exits:
|
||||
Snowpeak Climb Upper: Snowpeak_Does_Not_Require_Reekfish_Scent == On or 'Reekfish_Scent'
|
||||
Zoras Domain: Nothing
|
||||
|
||||
- Name: Snowpeak Climb Upper
|
||||
Map Sector: Snowpeak Province
|
||||
Region: Snowpeak Mountain
|
||||
Can Warp: True
|
||||
Events:
|
||||
Howl at Snowpeak Mountain Howling Stone: Can_Howl
|
||||
Locations:
|
||||
Snowpeak Above Freezard Grotto Poe: Can_Use_Senses
|
||||
Snowpeak Blizzard Poe: Can_Use_Senses
|
||||
Snowpeak Poe Among Trees: Can_Use_Senses and Night
|
||||
Exits:
|
||||
Snowpeak Ice Keese Grotto: Can_Dig
|
||||
Snowpeak Freezard Grotto: Can_Dig
|
||||
Snowpeak Summit Cave: Can_Dig
|
||||
Snowpeak Climb Lower: Nothing
|
||||
|
||||
- Name: Snowpeak Ice Keese Grotto
|
||||
Exits:
|
||||
Snowpeak Climb Upper: Nothing
|
||||
|
||||
- Name: Snowpeak Freezard Grotto
|
||||
Locations:
|
||||
Snowpeak Freezard Grotto Chest: Can_Defeat_Freezard
|
||||
Exits:
|
||||
Snowpeak Climb Upper: Nothing
|
||||
|
||||
- Name: Snowpeak Summit Cave
|
||||
Map Sector: Snowpeak Province
|
||||
Region: Snowpeak Mountain
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Snowpeak Cave Ice Lantern Chest: Can_Light_Torches and Ball_and_Chain
|
||||
Snowpeak Cave Ice Poe: Ball_and_Chain and Can_Use_Senses
|
||||
Exits:
|
||||
Snowpeak Summit Upper: Can_Climb_Vines
|
||||
Snowpeak Climb Upper: Can_Dig
|
||||
|
||||
- Name: Snowpeak Summit Upper
|
||||
Map Sector: Snowpeak Province
|
||||
Region: Snowpeak Mountain
|
||||
Can Warp: True
|
||||
Events:
|
||||
Snowboarding Rupees: "(Snowpeak_Portal or Can_Defeat_Shadow_Beast)
|
||||
and ((Bonks_Do_Damage == Off or (Bonks_Do_Damage == On
|
||||
and (Logic_Damage_Multiplier != OHKO or Can_Use_Bottled_Fairy))) or 'Can_Complete_Snowpeak_Ruins')"
|
||||
Locations:
|
||||
Snowpeak Warp Portal: Can_Defeat_Shadow_Beast
|
||||
Snowboarding Bridge Ledge Bottom Rupee: "'Snowboarding_Rupees'"
|
||||
Snowboarding Bridge Ledge Middle Rupee: "'Snowboarding_Rupees'"
|
||||
Snowboarding Bridge Ledge Upper Rupee: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 1: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 2: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 3: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 4: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 5: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 6: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 7: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 8: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 9: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 10: "'Snowboarding_Rupees'"
|
||||
Snowboarding Shortcut Rupee 11: "'Snowboarding_Rupees'"
|
||||
Snowboarding Snowy Tree Top Rupee 1: "'Snowboarding_Rupees'"
|
||||
Snowboarding Snowy Tree Top Rupee 2: "'Snowboarding_Rupees'"
|
||||
Snowboarding Snowy Tree Top Rupee 3: "'Snowboarding_Rupees'"
|
||||
Snowboarding Top Left Rupee: "'Snowboarding_Rupees'"
|
||||
Snowboarding Top Right Rupee: "'Snowboarding_Rupees'"
|
||||
Snowboard Racing Prize: Can_Defeat_Shadow_Beast and 'Can_Complete_Snowpeak_Ruins'
|
||||
Exits:
|
||||
Snowpeak Summit Lower: Can_Defeat_Shadow_Beast and Can_Survive_One_Bonk
|
||||
|
||||
- Name: Snowpeak Summit Lower
|
||||
Map Sector: Snowpeak Province
|
||||
Region: Snowpeak Mountain
|
||||
Can Warp: True
|
||||
Locations:
|
||||
Snowpeak Icy Summit Poe: Can_Use_Senses
|
||||
Exits:
|
||||
Snowpeak Ruins East Door Exterior: Nothing
|
||||
Snowpeak Ruins West Door Exterior: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins East Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Snowpeak Ruins East Door Interior: Can_Open_Doors
|
||||
Snowpeak Summit Lower: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins West Door Exterior
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Snowpeak Ruins West Door Interior: Can_Open_Doors
|
||||
Snowpeak Summit Lower: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins East Door Interior
|
||||
Region: Snowpeak Ruins
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Snowpeak Ruins East Door Exterior: Can_Open_Doors
|
||||
Snowpeak Ruins Entrance: Nothing
|
||||
|
||||
- Name: Snowpeak Ruins West Door Interior
|
||||
Region: Snowpeak Ruins
|
||||
Can Transform: Never
|
||||
Exits:
|
||||
Snowpeak Ruins West Door Exterior: Can_Open_Doors
|
||||
Snowpeak Ruins Entrance: Nothing
|
||||
@@ -0,0 +1,267 @@
|
||||
#include "area.hpp"
|
||||
|
||||
#include "search.hpp"
|
||||
#include "world.hpp"
|
||||
#include "../randomizer.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <unordered_set>
|
||||
|
||||
namespace randomizer::logic::area
|
||||
{
|
||||
|
||||
LocationAccess::LocationAccess(location::Location* loc,
|
||||
const requirement::Requirement& req,
|
||||
Area* area):
|
||||
_loc(loc), _req(std::move(req)), _area(area)
|
||||
{
|
||||
this->_id = area->GetWorld()->GetRandomizer()->GetNewLocAccID();
|
||||
}
|
||||
|
||||
location::Location* LocationAccess::GetLocation() const
|
||||
{
|
||||
return this->_loc;
|
||||
}
|
||||
const requirement::Requirement& LocationAccess::GetRequirement()
|
||||
{
|
||||
return this->_req;
|
||||
}
|
||||
Area* LocationAccess::GetArea() const
|
||||
{
|
||||
return this->_area;
|
||||
}
|
||||
int LocationAccess::GetID() const
|
||||
{
|
||||
return this->_id;
|
||||
}
|
||||
|
||||
EventAccess::EventAccess(const requirement::Requirement& req, Area* area, const int& eventIndex):
|
||||
_req(std::move(req)), _area(area), _eventIndex(eventIndex)
|
||||
{
|
||||
}
|
||||
|
||||
const requirement::Requirement& EventAccess::GetRequirement()
|
||||
{
|
||||
return this->_req;
|
||||
}
|
||||
Area* EventAccess::GetArea() const
|
||||
{
|
||||
return this->_area;
|
||||
}
|
||||
int EventAccess::GetEventIndex() const
|
||||
{
|
||||
return this->_eventIndex;
|
||||
}
|
||||
|
||||
std::string EventAccess::GetName() const
|
||||
{
|
||||
return this->_area->GetWorld()->GetEventName(this->_eventIndex);
|
||||
}
|
||||
|
||||
Area::Area(const std::string& name, world::World* world): _name(name), _world(world)
|
||||
{
|
||||
this->_id = world->GetRandomizer()->GetNewAreaID();
|
||||
}
|
||||
|
||||
std::string Area::GetName() const
|
||||
{
|
||||
return this->_name;
|
||||
}
|
||||
void Area::SetHardAssignedRegion(const std::string& _hardAssignedRegion)
|
||||
{
|
||||
this->_hardAssignedRegion = _hardAssignedRegion;
|
||||
}
|
||||
std::string Area::GetHardAssignRegion() const
|
||||
{
|
||||
return this->_hardAssignedRegion;
|
||||
}
|
||||
void Area::SetEvents(std::list<std::unique_ptr<EventAccess>>& events)
|
||||
{
|
||||
this->_events = std::move(events);
|
||||
}
|
||||
|
||||
std::list<EventAccess*> Area::GetEvents() const
|
||||
{
|
||||
std::list<EventAccess*> events;
|
||||
for (const auto& event : this->_events)
|
||||
{
|
||||
events.emplace_back(event.get());
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
void Area::SetLocations(std::list<std::unique_ptr<LocationAccess>>& locations)
|
||||
{
|
||||
this->_locations = std::move(locations);
|
||||
}
|
||||
|
||||
std::list<LocationAccess*> Area::GetLocations() const
|
||||
{
|
||||
std::list<LocationAccess*> locations;
|
||||
for (const auto& loc : this->_locations)
|
||||
{
|
||||
locations.emplace_back(loc.get());
|
||||
}
|
||||
return locations;
|
||||
}
|
||||
|
||||
void Area::SetExits(std::list<std::unique_ptr<entrance::Entrance>>& exits)
|
||||
{
|
||||
this->_exits = std::move(exits);
|
||||
}
|
||||
|
||||
std::list<entrance::Entrance*> Area::GetExits() const
|
||||
{
|
||||
std::list<entrance::Entrance*> exits;
|
||||
for (const auto& exit : this->_exits)
|
||||
{
|
||||
exits.emplace_back(exit.get());
|
||||
}
|
||||
return exits;
|
||||
}
|
||||
|
||||
void Area::AddExit(std::unique_ptr<entrance::Entrance>& exit)
|
||||
{
|
||||
this->_exits.push_back(std::move(exit));
|
||||
}
|
||||
|
||||
void Area::RemoveExit(entrance::Entrance* exit)
|
||||
{
|
||||
std::erase_if(this->_exits, [&](const auto& e) { return e.get() == exit; });
|
||||
}
|
||||
|
||||
void Area::AddEntrance(entrance::Entrance* entrance)
|
||||
{
|
||||
this->_entrances.emplace_back(entrance);
|
||||
}
|
||||
|
||||
void Area::RemoveEntrance(entrance::Entrance* entrance)
|
||||
{
|
||||
std::erase(this->_entrances, entrance);
|
||||
}
|
||||
|
||||
std::list<entrance::Entrance*> Area::GetEntrances() const
|
||||
{
|
||||
return this->_entrances;
|
||||
}
|
||||
world::World* Area::GetWorld() const
|
||||
{
|
||||
return this->_world;
|
||||
}
|
||||
void Area::SetCanChangeTime(const bool& canChangeTime)
|
||||
{
|
||||
this->_canChangeTime = canChangeTime;
|
||||
}
|
||||
bool Area::CanChangeTime() const
|
||||
{
|
||||
return this->_canChangeTime;
|
||||
}
|
||||
void Area::SetCanTransform(const bool& canTransform)
|
||||
{
|
||||
this->_canTransform = canTransform;
|
||||
}
|
||||
bool Area::CanTransform() const
|
||||
{
|
||||
return this->_canTransform;
|
||||
}
|
||||
void Area::AddHintRegion(const std::string& region)
|
||||
{
|
||||
this->_hintRegions.emplace(region);
|
||||
}
|
||||
std::set<std::string> Area::GetHintRegions()
|
||||
{
|
||||
return this->_hintRegions;
|
||||
}
|
||||
void Area::SetTwilightCompletedMacroIndex(const int& macroIndex)
|
||||
{
|
||||
this->_twilightCompletedMacroIndex = macroIndex;
|
||||
}
|
||||
int Area::GetTwilightCompletedMacroIndex() const
|
||||
{
|
||||
return this->_twilightCompletedMacroIndex;
|
||||
}
|
||||
|
||||
bool Area::TwilightCleared(search::Search* search) const
|
||||
{
|
||||
return this->_twilightCompletedMacroIndex == -1 || requirement::EvaluateRequirementAtFormTime(
|
||||
this->GetWorld()->GetMacro(this->_twilightCompletedMacroIndex),
|
||||
search,
|
||||
requirement::FormTime::ALL,
|
||||
this->GetWorld());
|
||||
}
|
||||
|
||||
void Area::AssignHintRegionsAndDungeonLocations()
|
||||
{
|
||||
std::set<std::string> hintRegions = {};
|
||||
std::unordered_set<Area*> alreadyChecked = {};
|
||||
std::list<Area*> areaQueue = {this};
|
||||
|
||||
while (!areaQueue.empty())
|
||||
{
|
||||
auto area = areaQueue.back();
|
||||
areaQueue.pop_back();
|
||||
alreadyChecked.insert(area);
|
||||
|
||||
// If this area has a hard assigned region, then we won't assign it any other regions
|
||||
auto hardAssignedRegion = area->GetHardAssignRegion();
|
||||
if (hardAssignedRegion != "")
|
||||
{
|
||||
// If the region is None, then don't assign it. None is meant to be a blocker that prevents other regions
|
||||
// from assigning themselves through this area
|
||||
if (hardAssignedRegion != "None")
|
||||
{
|
||||
hintRegions.insert(hardAssignedRegion);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// If this area isn't assigned any hint regions, add its entrancs' parent areas to the queue as long as they
|
||||
// haven't been checked yet
|
||||
for (const auto& entrance : area->GetEntrances())
|
||||
{
|
||||
if (!alreadyChecked.contains(entrance->GetParentArea()))
|
||||
{
|
||||
areaQueue.push_back(entrance->GetParentArea());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// When determining which regions to assign the area to, overworld regions will take complete priority over dungeon
|
||||
// regions. Dungeon regions should only be assigned if dungeons are the only regions listed. So if we have any overworld
|
||||
// hint regions, filter out the dungeon ones.
|
||||
const auto& dungeons = this->GetWorld()->GetDungeonTable();
|
||||
std::set<std::string> dungeonRegions = {};
|
||||
std::ranges::copy_if(hintRegions,
|
||||
std::inserter(dungeonRegions, dungeonRegions.begin()),
|
||||
[&](const auto& hintRegion) { return dungeons.contains(hintRegion); });
|
||||
// If we have less dungeons than total hint regions, we have at least one overworld hint region
|
||||
// So erase all the dungeons in that case.
|
||||
if (dungeonRegions.size() < hintRegions.size())
|
||||
{
|
||||
for (const auto& dungeon : dungeonRegions)
|
||||
{
|
||||
hintRegions.erase(dungeon);
|
||||
}
|
||||
}
|
||||
|
||||
// Assign the found hint regions to the area
|
||||
for (const auto& region : hintRegions)
|
||||
{
|
||||
this->AddHintRegion(region);
|
||||
LOG_TO_DEBUG("Assigned \"" + region + "\" as hint region to \"" + this->GetName() + "\"");
|
||||
|
||||
// Also assign any locations in this area to the dungeon if there are any dungeon regions
|
||||
if (dungeons.contains(region))
|
||||
{
|
||||
auto locAccs = this->GetLocations();
|
||||
auto dungeon = this->GetWorld()->GetDungeon(region);
|
||||
for (const auto& locAcc : locAccs)
|
||||
{
|
||||
auto location = locAcc->GetLocation();
|
||||
dungeon->AddLocation(location);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace randomizer::logic::area
|
||||
@@ -0,0 +1,113 @@
|
||||
#pragma once
|
||||
|
||||
#include "entrance.hpp"
|
||||
#include "requirement.hpp"
|
||||
|
||||
#include <memory>
|
||||
#include <set>
|
||||
#include <list>
|
||||
|
||||
// Forward Declarations
|
||||
namespace randomizer::logic::location
|
||||
{
|
||||
class Location;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::search
|
||||
{
|
||||
class Search;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::world
|
||||
{
|
||||
class World;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::area
|
||||
{
|
||||
class Area;
|
||||
class LocationAccess
|
||||
{
|
||||
public:
|
||||
LocationAccess(location::Location* loc, const requirement::Requirement& req, Area* area);
|
||||
|
||||
location::Location* GetLocation() const;
|
||||
const requirement::Requirement& GetRequirement();
|
||||
Area* GetArea() const;
|
||||
int GetID() const;
|
||||
|
||||
private:
|
||||
int _id = -1;
|
||||
location::Location* _loc = nullptr;
|
||||
requirement::Requirement _req;
|
||||
Area* _area = nullptr;
|
||||
};
|
||||
|
||||
class EventAccess
|
||||
{
|
||||
public:
|
||||
EventAccess(const requirement::Requirement& req, Area* area, const int& eventIndex);
|
||||
|
||||
const requirement::Requirement& GetRequirement();
|
||||
Area* GetArea() const;
|
||||
int GetEventIndex() const;
|
||||
std::string GetName() const;
|
||||
|
||||
private:
|
||||
requirement::Requirement _req;
|
||||
Area* _area = nullptr;
|
||||
int _eventIndex = -1;
|
||||
};
|
||||
|
||||
class Area
|
||||
{
|
||||
public:
|
||||
Area(const std::string& name, world::World* world);
|
||||
|
||||
std::string GetName() const;
|
||||
void SetHardAssignedRegion(const std::string& _hardAssignedRegion);
|
||||
std::string GetHardAssignRegion() const;
|
||||
void SetEvents(std::list<std::unique_ptr<EventAccess>>& events);
|
||||
std::list<EventAccess*> GetEvents() const;
|
||||
void SetLocations(std::list<std::unique_ptr<LocationAccess>>& locations);
|
||||
std::list<LocationAccess*> GetLocations() const;
|
||||
void SetExits(std::list<std::unique_ptr<entrance::Entrance>>& exits);
|
||||
std::list<entrance::Entrance*> GetExits() const;
|
||||
void AddExit(std::unique_ptr<entrance::Entrance>& exit);
|
||||
void RemoveExit(entrance::Entrance* exit);
|
||||
void AddEntrance(entrance::Entrance* entrance);
|
||||
void RemoveEntrance(entrance::Entrance* entrance);
|
||||
std::list<entrance::Entrance*> GetEntrances() const;
|
||||
world::World* GetWorld() const;
|
||||
void SetCanChangeTime(const bool& canChangeTime);
|
||||
bool CanChangeTime() const;
|
||||
void SetCanTransform(const bool& canTransform);
|
||||
bool CanTransform() const;
|
||||
void AddHintRegion(const std::string& region);
|
||||
std::set<std::string> GetHintRegions();
|
||||
void SetTwilightCompletedMacroIndex(const int& macroIndex);
|
||||
int GetTwilightCompletedMacroIndex() const;
|
||||
bool TwilightCleared(search::Search* search) const;
|
||||
|
||||
/**
|
||||
* @brief Assigns this area's hint regions(s) as well as assigns any locations within the area to a dungeon if the
|
||||
* area's hint region is a dungeon
|
||||
*/
|
||||
void AssignHintRegionsAndDungeonLocations();
|
||||
|
||||
private:
|
||||
int _id = -1;
|
||||
std::string _name = "";
|
||||
std::string _hardAssignedRegion = "";
|
||||
std::set<std::string> _hintRegions = {};
|
||||
std::list<std::unique_ptr<EventAccess>> _events = {};
|
||||
std::list<std::unique_ptr<LocationAccess>> _locations = {};
|
||||
std::list<std::unique_ptr<entrance::Entrance>> _exits = {};
|
||||
std::list<entrance::Entrance*> _entrances = {};
|
||||
world::World* _world;
|
||||
bool _canChangeTime = false;
|
||||
bool _canTransform = false;
|
||||
int _twilightCompletedMacroIndex = -1;
|
||||
};
|
||||
|
||||
} // namespace randomizer::logic::area
|
||||
@@ -0,0 +1,137 @@
|
||||
#include "dungeon.hpp"
|
||||
|
||||
#include "area.hpp"
|
||||
#include "entrance.hpp"
|
||||
#include "item.hpp"
|
||||
#include "world.hpp"
|
||||
|
||||
#include "../utility/container.hpp"
|
||||
#include "../utility/log.hpp"
|
||||
|
||||
namespace randomizer::logic::dungeon
|
||||
{
|
||||
Dungeon::Dungeon(const std::string& name, world::World* world): _name(name), _world(world) {}
|
||||
|
||||
std::string Dungeon::GetName() const
|
||||
{
|
||||
return this->_name;
|
||||
}
|
||||
|
||||
void Dungeon::SetSmallKey(item::Item* item)
|
||||
{
|
||||
this->_smallKey = item;
|
||||
LOG_TO_DEBUG("Set \"" + item->GetName() + "\" as small key for dungeon " + this->_name);
|
||||
}
|
||||
|
||||
item::Item* Dungeon::GetSmallKey() const
|
||||
{
|
||||
return this->_smallKey;
|
||||
}
|
||||
|
||||
void Dungeon::SetBigKey(item::Item* item)
|
||||
{
|
||||
this->_bigKey = item;
|
||||
LOG_TO_DEBUG("Set \"" + item->GetName() + "\" as big key for dungeon " + this->_name);
|
||||
}
|
||||
|
||||
item::Item* Dungeon::GetBigKey() const
|
||||
{
|
||||
return this->_bigKey;
|
||||
}
|
||||
|
||||
void Dungeon::SetCompass(item::Item* item)
|
||||
{
|
||||
this->_compass = item;
|
||||
LOG_TO_DEBUG("Set \"" + item->GetName() + "\" as compass for dungeon " + this->_name);
|
||||
}
|
||||
|
||||
item::Item* Dungeon::GetCompass() const
|
||||
{
|
||||
return this->_compass;
|
||||
}
|
||||
|
||||
void Dungeon::SetDungeonMap(item::Item* item)
|
||||
{
|
||||
this->_dungeonMap = item;
|
||||
LOG_TO_DEBUG("Set \"" + item->GetName() + "\" as dungeon map for dungeon " + this->_name);
|
||||
}
|
||||
|
||||
item::Item* Dungeon::GetDungeonMap() const
|
||||
{
|
||||
return this->_dungeonMap;
|
||||
}
|
||||
|
||||
void Dungeon::SetStartingArea(area::Area* startingArea)
|
||||
{
|
||||
this->_startingArea = startingArea;
|
||||
LOG_TO_DEBUG("Set \"" + startingArea->GetName() + "\" as starting area for dungeon " + this->_name)
|
||||
}
|
||||
|
||||
area::Area* Dungeon::GetStartingAreas()
|
||||
{
|
||||
return this->_startingArea;
|
||||
}
|
||||
|
||||
void Dungeon::AddStartingEntrance(entrance::Entrance* startingEntrance)
|
||||
{
|
||||
this->_startingEntrances.insert(startingEntrance);
|
||||
LOG_TO_DEBUG("Added \"" + startingEntrance->GetOriginalName() + "\" as starting entrance for dungeon " + this->_name)
|
||||
}
|
||||
|
||||
std::unordered_set<entrance::Entrance*> Dungeon::GetStartingEntrances() const
|
||||
{
|
||||
return this->_startingEntrances;
|
||||
};
|
||||
|
||||
void Dungeon::AddLocation(location::Location* location)
|
||||
{
|
||||
if (!utility::container::ElementInContainer(this->_locations, location))
|
||||
{
|
||||
this->_locations.push_back(location);
|
||||
LOG_TO_DEBUG(location->GetName() + " has been assigned to dungeon " + this->_name);
|
||||
}
|
||||
}
|
||||
|
||||
location::LocationPool Dungeon::GetLocations()
|
||||
{
|
||||
return this->_locations;
|
||||
}
|
||||
|
||||
void Dungeon::SetGoalLocation(location::Location* goalLocation)
|
||||
{
|
||||
this->_goalLocation = goalLocation;
|
||||
LOG_TO_DEBUG(goalLocation->GetName() + " has been assigned as goal location to dungeon " + this->_name);
|
||||
}
|
||||
|
||||
location::Location* Dungeon::GetGoalLocation()
|
||||
{
|
||||
return this->_goalLocation;
|
||||
}
|
||||
|
||||
void Dungeon::SetRequired(const bool& required)
|
||||
{
|
||||
this->_required = required;
|
||||
LOG_TO_DEBUG(this->_name + " has been set as required.");
|
||||
}
|
||||
|
||||
bool Dungeon::IsRequired() const
|
||||
{
|
||||
return this->_required;
|
||||
}
|
||||
|
||||
void Dungeon::AddOutsideDependentLocation(location::Location* location) {
|
||||
this->_outsideDependentLocations.push_back(location);
|
||||
}
|
||||
|
||||
std::list<location::Location*> Dungeon::GetOutsideDependentLocations() {
|
||||
return this->_outsideDependentLocations;
|
||||
}
|
||||
|
||||
bool Dungeon::ShouldBeBarren() const
|
||||
{
|
||||
return !this->_required &&
|
||||
this->_world->Setting("Unrequired Dungeons Are Barren") == "On" &&
|
||||
this->_name != "Hyrule Castle";
|
||||
}
|
||||
|
||||
} // namespace randomizer::logic::dungeon
|
||||
@@ -0,0 +1,80 @@
|
||||
#pragma once
|
||||
|
||||
#include "location.hpp"
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
// Forward declarations
|
||||
namespace randomizer::logic::item
|
||||
{
|
||||
class Item;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::area
|
||||
{
|
||||
class Area;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::entrance
|
||||
{
|
||||
class Entrance;
|
||||
}
|
||||
namespace randomizer::logic::world
|
||||
{
|
||||
class World;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::dungeon
|
||||
{
|
||||
/**
|
||||
* @brief Holds dungeon specific data
|
||||
*/
|
||||
class Dungeon
|
||||
{
|
||||
public:
|
||||
Dungeon(const std::string& name, world::World* world);
|
||||
|
||||
std::string GetName() const;
|
||||
void SetSmallKey(item::Item* item);
|
||||
item::Item* GetSmallKey() const;
|
||||
void SetBigKey(item::Item* item);
|
||||
item::Item* GetBigKey() const;
|
||||
void SetCompass(item::Item* item);
|
||||
item::Item* GetCompass() const;
|
||||
void SetDungeonMap(item::Item* item);
|
||||
item::Item* GetDungeonMap() const;
|
||||
void SetStartingArea(area::Area* startingArea);
|
||||
area::Area* GetStartingAreas();
|
||||
void AddStartingEntrance(entrance::Entrance* startingEntrance);
|
||||
std::unordered_set<entrance::Entrance*> GetStartingEntrances() const;
|
||||
void AddLocation(location::Location* location);
|
||||
location::LocationPool GetLocations();
|
||||
void SetGoalLocation(location::Location* goalLocation);
|
||||
location::Location* GetGoalLocation();
|
||||
void SetRequired(const bool& required);
|
||||
bool IsRequired() const;
|
||||
void AddOutsideDependentLocation(location::Location* location);
|
||||
std::list<location::Location*> GetOutsideDependentLocations();
|
||||
|
||||
/**
|
||||
* @brief Returns whether or not the dungeon should be barren given the current settings and placement of dungeon
|
||||
* rewards and/or plandomized items
|
||||
*/
|
||||
bool ShouldBeBarren() const;
|
||||
|
||||
private:
|
||||
std::string _name = "";
|
||||
world::World* _world;
|
||||
item::Item* _smallKey;
|
||||
item::Item* _bigKey;
|
||||
item::Item* _compass;
|
||||
item::Item* _dungeonMap;
|
||||
area::Area* _startingArea;
|
||||
std::unordered_set<entrance::Entrance*> _startingEntrances;
|
||||
location::Location* _goalLocation;
|
||||
location::LocationPool _locations = {};
|
||||
// Locations which depend on beating this dungeon
|
||||
std::list<location::Location*> _outsideDependentLocations = {};
|
||||
bool _required = false;
|
||||
};
|
||||
} // namespace randomizer::logic::dungeon
|
||||
@@ -0,0 +1,359 @@
|
||||
#include "entrance.hpp"
|
||||
|
||||
#include "area.hpp"
|
||||
#include "world.hpp"
|
||||
#include "../utility/log.hpp"
|
||||
#include "../utility/string.hpp"
|
||||
|
||||
namespace randomizer::logic::entrance
|
||||
{
|
||||
|
||||
Type TypeFromStr(const std::string& str)
|
||||
{
|
||||
std::unordered_map<std::string, Type> types = {{"Spawn", Type::SPAWN},
|
||||
{"Warp Portal", Type::WARP_PORTAL},
|
||||
{"Dungeon", Type::DUNGEON},
|
||||
{"Boss", Type::BOSS},
|
||||
{"Grotto", Type::GROTTO},
|
||||
{"Mixed Pool 1", Type::MIXED_POOL_1},
|
||||
{"Mixed Pool 2", Type::MIXED_POOL_2},
|
||||
{"Mixed Pool 3", Type::MIXED_POOL_3},
|
||||
{"Mixed Pool 4", Type::MIXED_POOL_4},
|
||||
{"Mixed Pool 5", Type::MIXED_POOL_5},
|
||||
{"Cave", Type::CAVE},
|
||||
{"Interior", Type::INTERIOR},
|
||||
{"Overworld", Type::OVERWORLD}};
|
||||
|
||||
if (!types.contains(str))
|
||||
{
|
||||
return Type::INVALID;
|
||||
}
|
||||
|
||||
return types.at(str);
|
||||
}
|
||||
|
||||
std::string TypeToStr(const Type& type)
|
||||
{
|
||||
std::unordered_map<Type, std::string> types = {{Type::SPAWN, "Spawn"},
|
||||
{Type::WARP_PORTAL, "Warp Portal"},
|
||||
{Type::DUNGEON, "Dungeon"},
|
||||
{Type::DUNGEON_REVERSE, "Dungeon Reverse"},
|
||||
{Type::BOSS, "Boss"},
|
||||
{Type::BOSS_REVERSE, "Boss Reverse"},
|
||||
{Type::GROTTO, "Grotto"},
|
||||
{Type::GROTTO_REVERSE, "Grotto Reverse"},
|
||||
{Type::MIXED_POOL_1, "Mixed Pool 1"},
|
||||
{Type::MIXED_POOL_2, "Mixed Pool 2"},
|
||||
{Type::MIXED_POOL_3, "Mixed Pool 3"},
|
||||
{Type::MIXED_POOL_4, "Mixed Pool 4"},
|
||||
{Type::MIXED_POOL_5, "Mixed Pool 5"},
|
||||
{Type::CAVE, "Cave"},
|
||||
{Type::CAVE_REVERSE, "Cave Reverse"},
|
||||
{Type::INTERIOR, "Interior"},
|
||||
{Type::INTERIOR_REVERSE, "Interior Reverse"},
|
||||
{Type::OVERWORLD, "Overworld"}};
|
||||
|
||||
if (!types.contains(type))
|
||||
{
|
||||
return "INVALID";
|
||||
}
|
||||
|
||||
return types.at(type);
|
||||
}
|
||||
|
||||
Type TypeToReverse(const Type& type)
|
||||
{
|
||||
std::unordered_map<Type, Type> reverse = {{Type::DUNGEON, Type::DUNGEON_REVERSE},
|
||||
{Type::DUNGEON_REVERSE, Type::DUNGEON},
|
||||
{Type::BOSS, Type::BOSS_REVERSE},
|
||||
{Type::BOSS_REVERSE, Type::BOSS},
|
||||
{Type::GROTTO, Type::GROTTO_REVERSE},
|
||||
{Type::GROTTO_REVERSE, Type::GROTTO},
|
||||
{Type::CAVE, Type::CAVE_REVERSE},
|
||||
{Type::CAVE_REVERSE, Type::CAVE},
|
||||
{Type::INTERIOR, Type::INTERIOR_REVERSE},
|
||||
{Type::INTERIOR_REVERSE, Type::INTERIOR},
|
||||
// Yes, this is intentional for the overworld type
|
||||
{Type::OVERWORLD, Type::OVERWORLD}};
|
||||
|
||||
if (!reverse.contains(type))
|
||||
{
|
||||
return Type::INVALID;
|
||||
}
|
||||
|
||||
return reverse.at(type);
|
||||
}
|
||||
|
||||
Entrance::Entrance(area::Area* parentArea,
|
||||
area::Area* connectedArea,
|
||||
const requirement::Requirement& req,
|
||||
world::World* world):
|
||||
_parentArea(parentArea),
|
||||
_connectedArea(connectedArea),
|
||||
_originalConnectedArea(connectedArea),
|
||||
_req(std::move(req)),
|
||||
_world(world)
|
||||
{
|
||||
this->_originalName = this->GetCurrentName();
|
||||
this->_computedRequirement._type = requirement::Type::IMPOSSIBLE;
|
||||
}
|
||||
|
||||
void Entrance::SetID(const int& id)
|
||||
{
|
||||
this->_id = id;
|
||||
}
|
||||
|
||||
int Entrance::GetID() const
|
||||
{
|
||||
return this->_id;
|
||||
}
|
||||
|
||||
std::string Entrance::GetCurrentName() const
|
||||
{
|
||||
std::string parentName = this->_parentArea ? this->_parentArea->GetName() : "None";
|
||||
std::string connectedName = this->_connectedArea ? this->_connectedArea->GetName() : "None";
|
||||
return parentName + " -> " + connectedName;
|
||||
}
|
||||
|
||||
std::string Entrance::GetOriginalName() const
|
||||
{
|
||||
return this->_originalName;
|
||||
}
|
||||
|
||||
void Entrance::SetAlias(const std::string& alias)
|
||||
{
|
||||
this->_alias = alias;
|
||||
// If there's no alias, just use the original name
|
||||
if (this->_alias.empty())
|
||||
{
|
||||
this->_alias = this->_originalName;
|
||||
}
|
||||
}
|
||||
|
||||
std::string Entrance::GetAlias() const
|
||||
{
|
||||
return this->_alias;
|
||||
}
|
||||
|
||||
std::string Entrance::GetAliasFrom()
|
||||
{
|
||||
std::string parentAreaAlias = this->_alias.substr(0, this->_alias.find(" -> "));
|
||||
std::string connectedAreaAlias = this->_alias.substr(this->_alias.find(" -> ") + 4);
|
||||
return connectedAreaAlias + " from " + parentAreaAlias;
|
||||
}
|
||||
|
||||
void Entrance::GeneralizeName()
|
||||
{
|
||||
randomizer::utility::str::Erase(this->_originalName, " North", " South", " East", " West", " Right", " Left");
|
||||
randomizer::utility::str::Erase(this->_alias, " North", " South", " East", " West", " Right", " Left");
|
||||
}
|
||||
|
||||
area::Area* Entrance::GetParentArea() const
|
||||
{
|
||||
return this->_parentArea;
|
||||
}
|
||||
|
||||
area::Area* Entrance::GetConnectedArea() const
|
||||
{
|
||||
return this->_connectedArea;
|
||||
}
|
||||
|
||||
area::Area* Entrance::GetOriginalConnectedArea() const
|
||||
{
|
||||
return this->_originalConnectedArea;
|
||||
}
|
||||
|
||||
void Entrance::SetType(const Type& type)
|
||||
{
|
||||
this->_type = type;
|
||||
if (this->_originalType == Type::INVALID)
|
||||
{
|
||||
this->_originalType = type;
|
||||
}
|
||||
}
|
||||
|
||||
Type Entrance::GetType() const
|
||||
{
|
||||
return this->_type;
|
||||
}
|
||||
|
||||
Type Entrance::GetOriginalType() const
|
||||
{
|
||||
return this->_originalType;
|
||||
}
|
||||
|
||||
void Entrance::SetRequirement(const requirement::Requirement& req)
|
||||
{
|
||||
this->_req = req;
|
||||
}
|
||||
|
||||
const requirement::Requirement& Entrance::GetRequirement()
|
||||
{
|
||||
return this->_req;
|
||||
}
|
||||
|
||||
void Entrance::SetComputedRequirement(const requirement::Requirement& computedRequirement)
|
||||
{
|
||||
this->_computedRequirement = computedRequirement;
|
||||
}
|
||||
|
||||
requirement::Requirement Entrance::GetComputedRequirement()
|
||||
{
|
||||
return this->_computedRequirement;
|
||||
}
|
||||
|
||||
world::World* Entrance::GetWorld() const
|
||||
{
|
||||
return this->_world;
|
||||
}
|
||||
|
||||
bool Entrance::CanStartAt() const
|
||||
{
|
||||
return this->_canStartAt;
|
||||
}
|
||||
|
||||
void Entrance::SetShuffled(const bool& shuffled)
|
||||
{
|
||||
this->_shuffled = shuffled;
|
||||
}
|
||||
|
||||
bool Entrance::IsShuffled() const
|
||||
{
|
||||
return this->_shuffled;
|
||||
}
|
||||
|
||||
void Entrance::SetDecoupled(const bool& decoupled)
|
||||
{
|
||||
this->_decoupled = decoupled;
|
||||
}
|
||||
|
||||
bool Entrance::IsDecoupled() const
|
||||
{
|
||||
return this->_decoupled;
|
||||
}
|
||||
|
||||
void Entrance::SetDisbled(const bool& disabled)
|
||||
{
|
||||
this->_disabled = disabled;
|
||||
LOG_TO_DEBUG(this->GetOriginalName() + " disabled status set to " + (disabled ? "True" : "False"));
|
||||
}
|
||||
|
||||
bool Entrance::IsDisabled() const
|
||||
{
|
||||
return this->_disabled;
|
||||
}
|
||||
|
||||
void Entrance::SetPrimary(const bool& primary)
|
||||
{
|
||||
this->_primary = primary;
|
||||
LOG_TO_DEBUG(this->GetOriginalName() + " primary status set to " + (primary ? "True" : "False"));
|
||||
}
|
||||
|
||||
bool Entrance::IsPrimary() const
|
||||
{
|
||||
return this->_primary;
|
||||
}
|
||||
|
||||
void Entrance::SetTarget(const bool& target)
|
||||
{
|
||||
this->_target = target;
|
||||
}
|
||||
|
||||
bool Entrance::IsTarget() const
|
||||
{
|
||||
return this->_target;
|
||||
}
|
||||
|
||||
void Entrance::SetReplaces(Entrance* replaces)
|
||||
{
|
||||
this->_replaces = replaces;
|
||||
}
|
||||
|
||||
Entrance* Entrance::GetReplaces() const
|
||||
{
|
||||
return this->_replaces;
|
||||
}
|
||||
|
||||
void Entrance::SetReverse(Entrance* reverse)
|
||||
{
|
||||
this->_reverse = reverse;
|
||||
}
|
||||
|
||||
Entrance* Entrance::GetReverse() const
|
||||
{
|
||||
return this->_reverse;
|
||||
}
|
||||
|
||||
Entrance* Entrance::GetAssumed() const
|
||||
{
|
||||
return this->_assumed;
|
||||
}
|
||||
|
||||
void Entrance::Connect(area::Area* newConnectedArea)
|
||||
{
|
||||
this->_connectedArea = newConnectedArea;
|
||||
newConnectedArea->AddEntrance(this);
|
||||
}
|
||||
|
||||
area::Area* Entrance::Disconnect()
|
||||
{
|
||||
this->_connectedArea->RemoveEntrance(this);
|
||||
auto previouslyConnected = this->_connectedArea;
|
||||
this->_connectedArea = nullptr;
|
||||
return previouslyConnected;
|
||||
}
|
||||
|
||||
void Entrance::BindTwoWay(Entrance* returnEntrance)
|
||||
{
|
||||
this->SetReverse(returnEntrance);
|
||||
returnEntrance->SetReverse(this);
|
||||
}
|
||||
|
||||
Entrance* Entrance::GetNewTarget()
|
||||
{
|
||||
auto root = this->_world->GetRootArea();
|
||||
auto targetEntrance =
|
||||
std::make_unique<Entrance>(root, nullptr, requirement::NO_REQUIREMENT, this->_world);
|
||||
auto target = targetEntrance.get();
|
||||
root->AddExit(targetEntrance); // This moves the variable, so we have to use the pointer for the rest of the function
|
||||
target->Connect(this->_connectedArea);
|
||||
target->SetReplaces(this);
|
||||
target->SetTarget(true);
|
||||
return target;
|
||||
}
|
||||
|
||||
Entrance* Entrance::AssumeReachable()
|
||||
{
|
||||
if (this->_assumed == nullptr)
|
||||
{
|
||||
this->_assumed = this->GetNewTarget();
|
||||
this->Disconnect();
|
||||
}
|
||||
return this->_assumed;
|
||||
}
|
||||
|
||||
std::tuple<std::string, std::string> GetParentAndConnectedAreaNames(const std::string& originalName)
|
||||
{
|
||||
std::string parentAreaName;
|
||||
std::string connectedAreaName;
|
||||
if (randomizer::utility::str::Contains(originalName, " -> "))
|
||||
{
|
||||
auto separatorIndex = originalName.find(" -> ");
|
||||
parentAreaName = originalName.substr(0, separatorIndex);
|
||||
connectedAreaName = originalName.substr(separatorIndex + 4);
|
||||
}
|
||||
else if (randomizer::utility::str::Contains(originalName, " from "))
|
||||
{
|
||||
auto separatorIndex = originalName.find(" from ");
|
||||
connectedAreaName = originalName.substr(0, separatorIndex);
|
||||
parentAreaName = originalName.substr(separatorIndex + 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::runtime_error("Could not parse area names from entrance string \"" + originalName +
|
||||
"\". Please make sure your syntax is correct");
|
||||
}
|
||||
|
||||
return {parentAreaName, connectedAreaName};
|
||||
}
|
||||
} // namespace randomizer::logic::entrance
|
||||
@@ -0,0 +1,211 @@
|
||||
#pragma once
|
||||
|
||||
#include "requirement.hpp"
|
||||
|
||||
#include <unordered_set>
|
||||
#include <map>
|
||||
#include <string>
|
||||
|
||||
// Forward Declarations
|
||||
namespace randomizer::logic::area
|
||||
{
|
||||
class Area;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::world
|
||||
{
|
||||
class World;
|
||||
}
|
||||
|
||||
namespace randomizer::logic::entrance
|
||||
{
|
||||
enum Type
|
||||
{
|
||||
INVALID = 0,
|
||||
// The order of this enum is also the order in which the different types of entrances
|
||||
// will be shuffled. So this ordering is important. Generally we want to shuffle entrances
|
||||
// near the "outside" of the world graph first (dungeon entrances/grottos) and then follow that
|
||||
// up with entrance types that are closer to the "inside" of the world graph which have more
|
||||
// consequences to being shuffled. The mixed pools are thrown in the middle since this is the most stable
|
||||
// place for them to be to not interfere with the ordering too much.
|
||||
SPAWN,
|
||||
WARP_PORTAL,
|
||||
GROTTO,
|
||||
GROTTO_REVERSE,
|
||||
BOSS,
|
||||
BOSS_REVERSE,
|
||||
DUNGEON,
|
||||
DUNGEON_REVERSE,
|
||||
MIXED_POOL_1,
|
||||
MIXED_POOL_2,
|
||||
MIXED_POOL_3,
|
||||
MIXED_POOL_4,
|
||||
MIXED_POOL_5,
|
||||
CAVE,
|
||||
CAVE_REVERSE,
|
||||
INTERIOR,
|
||||
INTERIOR_REVERSE,
|
||||
OVERWORLD,
|
||||
ALL,
|
||||
};
|
||||
|
||||
static const std::unordered_set NON_ASSUMED_TYPES = {SPAWN, WARP_PORTAL};
|
||||
|
||||
/**
|
||||
* @brief Takes a string representation of a Type and returns the
|
||||
* associated enum value.
|
||||
*
|
||||
* @param str The string representation of a Type.
|
||||
* @return The associated enum value for the passed in type.
|
||||
*/
|
||||
Type TypeFromStr(const std::string& str);
|
||||
|
||||
std::string TypeToStr(const Type& type);
|
||||
|
||||
Type TypeToReverse(const Type& type);
|
||||
|
||||
class Entrance
|
||||
{
|
||||
public:
|
||||
Entrance(area::Area* parentArea,
|
||||
area::Area* connectedArea,
|
||||
const requirement::Requirement& req,
|
||||
world::World* world);
|
||||
|
||||
void SetID(const int& id);
|
||||
int GetID() const;
|
||||
std::string GetCurrentName() const;
|
||||
std::string GetOriginalName() const;
|
||||
void SetAlias(const std::string& alias);
|
||||
std::string GetAlias() const;
|
||||
/*
|
||||
* @brief Gets the alias in the "connected area from parent area" format
|
||||
*/
|
||||
std::string GetAliasFrom();
|
||||
/**
|
||||
* @brief Removes cardinal/direction specifiers from the entrance's name/alias (North, South, East, West, Left, Right)
|
||||
*/
|
||||
void GeneralizeName();
|
||||
area::Area* GetParentArea() const;
|
||||
area::Area* GetConnectedArea() const;
|
||||
area::Area* GetOriginalConnectedArea() const;
|
||||
void SetType(const Type& type);
|
||||
Type GetType() const;
|
||||
Type GetOriginalType() const;
|
||||
void SetRequirement(const requirement::Requirement& req);
|
||||
const requirement::Requirement& GetRequirement();
|
||||
void SetComputedRequirement(const requirement::Requirement& computedRequirement);
|
||||
requirement::Requirement GetComputedRequirement();
|
||||
world::World* GetWorld() const;
|
||||
bool CanStartAt() const;
|
||||
void SetShuffled(const bool& shuffled);
|
||||
bool IsShuffled() const;
|
||||
void SetDecoupled(const bool& decoupled);
|
||||
bool IsDecoupled() const;
|
||||
void SetDisbled(const bool& disabled);
|
||||
bool IsDisabled() const;
|
||||
void SetPrimary(const bool& primary);
|
||||
bool IsPrimary() const;
|
||||
void SetTarget(const bool& target);
|
||||
bool IsTarget() const;
|
||||
|
||||
void SetReplaces(Entrance* replaces);
|
||||
Entrance* GetReplaces() const;
|
||||
void SetReverse(Entrance* reverse);
|
||||
Entrance* GetReverse() const;
|
||||
Entrance* GetAssumed() const;
|
||||
|
||||
/**
|
||||
* @brief Connect this entrance to the passed in area, and add this entrance to the list of entrances for the passed in
|
||||
* area
|
||||
*
|
||||
* @param newConnectedArea The area to connect this entrance to
|
||||
*/
|
||||
void Connect(area::Area* newConnectedArea);
|
||||
|
||||
/**
|
||||
* @brief Disconnect this entrance from the area it leads to. Will also remove this entrance from it's connected area's
|
||||
* entrances.
|
||||
*
|
||||
* @return The area this entrance was previously connected to
|
||||
*/
|
||||
area::Area* Disconnect();
|
||||
|
||||
/**
|
||||
* @brief Links two entrances by setting them as each others' reverse entrance
|
||||
*/
|
||||
void BindTwoWay(Entrance* returnEntrance);
|
||||
|
||||
/**
|
||||
* @brief Creates a new target entrance that corresponds to where this one leads, and
|
||||
* attaches it to the root of the world graph.
|
||||
*/
|
||||
Entrance* GetNewTarget();
|
||||
|
||||
/**
|
||||
* @brief Create this entrance's target and disconnect it from the original entrance.
|
||||
* This assumes reachable access to the entrance for the entrance shuffling algorithm
|
||||
*/
|
||||
Entrance* AssumeReachable();
|
||||
|
||||
private:
|
||||
int _id = -1;
|
||||
area::Area* _parentArea = nullptr;
|
||||
area::Area* _connectedArea = nullptr;
|
||||
area::Area* _originalConnectedArea = nullptr;
|
||||
Type _type = Type::INVALID;
|
||||
Type _originalType = Type::INVALID;
|
||||
std::string _originalName = "";
|
||||
std::string _alias = "";
|
||||
world::World* _world = nullptr;
|
||||
|
||||
/**
|
||||
* @brief The local requirement for this entrance assuming we have access to its parent area.
|
||||
*/
|
||||
requirement::Requirement _req;
|
||||
|
||||
/**
|
||||
* @brief The flattened requirement which includes everything necessary to reach this entrance from the root of the
|
||||
* world graph.
|
||||
*/
|
||||
requirement::Requirement _computedRequirement;
|
||||
|
||||
// Variables used for entrance shuffling
|
||||
bool _canStartAt = false;
|
||||
bool _shuffled = false;
|
||||
bool _decoupled = false;
|
||||
bool _disabled = false;
|
||||
|
||||
// A target entrance is one created to mimic the effect of going
|
||||
// through a specific real entrance. The target is attatched to
|
||||
// the root of the world graph and is connected to it's correpsonding
|
||||
// entrance's connected area.
|
||||
bool _target = false;
|
||||
|
||||
// Primary entrances are those that we think of as
|
||||
// "going into" areas. Entering dungeons, entering grottos,
|
||||
// and entering doors are all primary entrances. The opposite
|
||||
// idea, "leaving" areas, are not primary entrances.
|
||||
bool _primary = false;
|
||||
|
||||
// The reverse is the entrance that sends the player in the
|
||||
// natural opposite direction of this entrance. The reverse entrance
|
||||
// of entering a grotto would be the entrance that leaves the grotto
|
||||
Entrance* _reverse = nullptr;
|
||||
|
||||
// If the entrance is shuffled, _replaces is the target entrance that replaces
|
||||
// this one. If this *is* a target entrance, then _replaces holds the
|
||||
// entrance that this target *corresponds* to.
|
||||
Entrance* _replaces = nullptr;
|
||||
|
||||
// If the entrance is shuffled, _assumed is the target entrance that *corresponds*
|
||||
// to this one. So if the entrance is North Faron Woods -> Forest Temple Entrance,
|
||||
// then _assumed is the target entrance Root -> Forest Temple Entrance
|
||||
Entrance* _assumed = nullptr;
|
||||
};
|
||||
|
||||
using EntrancePool = std::vector<Entrance*>;
|
||||
using EntrancePools = std::map<Type, EntrancePool>;
|
||||
|
||||
std::tuple<std::string, std::string> GetParentAndConnectedAreaNames(const std::string& originalName);
|
||||
} // namespace randomizer::logic::entrance
|
||||
@@ -0,0 +1,800 @@
|
||||
#include "entrance_shuffle.hpp"
|
||||
|
||||
#include "item_pool.hpp"
|
||||
#include "search.hpp"
|
||||
#include "../randomizer.hpp"
|
||||
#include "../utility/random.hpp"
|
||||
#include "../utility/yaml.hpp"
|
||||
|
||||
#include <ranges>
|
||||
|
||||
using namespace randomizer::logic::entrance;
|
||||
|
||||
namespace randomizer::logic::entrance_shuffle
|
||||
{
|
||||
void ShuffleWorldEntrances(world::World* world)
|
||||
{
|
||||
SetAllEntrancesData(world);
|
||||
|
||||
auto entrancePools = CreateEntrancePools(world);
|
||||
auto targetEntrancePools = CreateTargetPools(entrancePools);
|
||||
|
||||
// Set plando entrances first
|
||||
try {
|
||||
SetPlandomizedEntrances(world, entrancePools, targetEntrancePools);
|
||||
} catch (std::runtime_error& e) {
|
||||
throw std::runtime_error("Plandomizer Error: " + std::string(e.what()));
|
||||
}
|
||||
|
||||
// Then shuffle non-assumed types (currently this is just spawn)
|
||||
ShuffleNonAssumedEntrancesPools(world, entrancePools, targetEntrancePools);
|
||||
|
||||
// Shuffle the rest of the entrance pools
|
||||
for (auto& [entranceType, entrancePool] : entrancePools)
|
||||
{
|
||||
ShuffleEntrancePool(entrancePool, targetEntrancePools[entranceType]);
|
||||
}
|
||||
|
||||
// Validate the world one last time to ensure everything worked
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(world->GetRandomizer()->GetWorlds());
|
||||
ValidateWorld(world, nullptr, completeItemPool);
|
||||
}
|
||||
|
||||
void SetAllEntrancesData(world::World* world)
|
||||
{
|
||||
// Keep track of which double door entrances are together
|
||||
std::unordered_map<std::string, std::list<entrance::Entrance*>> coupledDoors = {};
|
||||
|
||||
auto entranceDataTree = LOAD_EMBED_YAML(RANDO_DATA_PATH "entrance_shuffle_data.yaml");
|
||||
for (const auto& entranceDataNode : entranceDataTree)
|
||||
{
|
||||
// Check to make sure all required fields are present
|
||||
YAMLVerifyFields(entranceDataNode, "Type", "Forward");
|
||||
|
||||
auto typeStr = entranceDataNode["Type"].as<std::string>();
|
||||
auto type = entrance::TypeFromStr(typeStr);
|
||||
if (type == entrance::Type::INVALID)
|
||||
{
|
||||
throw std::runtime_error("Unknown entrance type \"" + typeStr + "\" in entrance shuffle node:\n" +
|
||||
YAML::Dump(entranceDataNode));
|
||||
}
|
||||
|
||||
auto& forwardEntry = entranceDataNode["Forward"];
|
||||
// Check to make sure all required fields are present for the forward entry
|
||||
YAMLVerifyFields(forwardEntry, "Connection" /*, "Info" */);
|
||||
|
||||
auto forwardEntrance = world->GetEntrance(forwardEntry["Connection"].as<std::string>());
|
||||
forwardEntrance->SetType(type);
|
||||
// TODO: Set actual entrance data
|
||||
forwardEntrance->SetID(world->GetNewEntranceID());
|
||||
forwardEntrance->SetPrimary(true);
|
||||
forwardEntrance->SetAlias(
|
||||
forwardEntry["Alias"] ? forwardEntry["Alias"].as<std::string>() : "");
|
||||
|
||||
if (entranceDataNode["Return"])
|
||||
{
|
||||
auto& returnEntry = entranceDataNode["Return"];
|
||||
YAMLVerifyFields(returnEntry, "Connection" /*, "Info" */);
|
||||
|
||||
auto returnEntrance = world->GetEntrance(returnEntry["Connection"].as<std::string>());
|
||||
returnEntrance->SetType(type);
|
||||
// TODO: Set actual entrance data
|
||||
returnEntrance->SetID(world->GetNewEntranceID());
|
||||
returnEntrance->SetAlias(
|
||||
returnEntry["Alias"] ? returnEntry["Alias"].as<std::string>() : "");
|
||||
forwardEntrance->BindTwoWay(returnEntrance);
|
||||
|
||||
// Add double door entrances to their respective tag group
|
||||
if (entranceDataNode["Door Couple Tag"])
|
||||
{
|
||||
auto tag = entranceDataNode["Door Couple Tag"].as<std::string>();
|
||||
if (!coupledDoors.contains(tag))
|
||||
{
|
||||
coupledDoors[tag] = {};
|
||||
}
|
||||
coupledDoors.at(tag).push_back(forwardEntrance);
|
||||
coupledDoors.at(tag).push_back(returnEntrance);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If double doors are coupled, add the coupled door's info to the main door, remove the coupled door entrance, and
|
||||
// rename the main door to be more general
|
||||
if (world->Setting("Decouple Double Door Entrances") == "Off")
|
||||
{
|
||||
for (auto& [tag, doors] : coupledDoors)
|
||||
{
|
||||
while (!doors.empty())
|
||||
{
|
||||
auto mainDoor = doors.back();
|
||||
doors.pop_back();
|
||||
|
||||
auto coupledDoorItr =
|
||||
std::ranges::find_if(doors,
|
||||
[&](const auto& door) { return door->IsPrimary() == mainDoor->IsPrimary(); });
|
||||
auto coupledDoor = *coupledDoorItr;
|
||||
|
||||
// TODO: Add the coupled door's info to the main door
|
||||
|
||||
// Completely remove the coupled door from the world graph
|
||||
doors.erase(coupledDoorItr);
|
||||
coupledDoor->GetConnectedArea()->RemoveEntrance(coupledDoor);
|
||||
coupledDoor->GetParentArea()->RemoveExit(coupledDoor);
|
||||
|
||||
// Change the main door's name to be more general
|
||||
mainDoor->GeneralizeName();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EntrancePools CreateEntrancePools(world::World* world)
|
||||
{
|
||||
EntrancePools entrancePools = {};
|
||||
|
||||
// Spawn
|
||||
if (world->Setting("Randomize Starting Spawn") == "On")
|
||||
{
|
||||
entrancePools[Type::SPAWN] = world->GetShuffleableEntrances(Type::SPAWN);
|
||||
}
|
||||
|
||||
// Dungeon Entrances
|
||||
if (world->Setting("Randomize Dungeon Entrances") >= "On")
|
||||
{
|
||||
entrancePools[Type::DUNGEON] = world->GetShuffleableEntrances(Type::DUNGEON, /*onlyPrimary = */ true);
|
||||
|
||||
// Remove Hyrule Castle if it's not being shuffled
|
||||
if (world->Setting("Randomize Dungeon Entrances") != "On + Hyrule Castle")
|
||||
{
|
||||
std::erase_if(entrancePools[Type::DUNGEON], [](const auto& entrance) {
|
||||
return entrance->GetOriginalName() == "Castle Town North Inside Barrier -> Hyrule Castle Entrance";
|
||||
});
|
||||
}
|
||||
|
||||
if (world->Setting("Decouple Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::DUNGEON_REVERSE] = GetReverseEntrances(entrancePools[Type::DUNGEON]);
|
||||
}
|
||||
}
|
||||
|
||||
// Boss Entrances
|
||||
if (world->Setting("Randomize Boss Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::BOSS] = world->GetShuffleableEntrances(Type::BOSS, /*onlyPrimary = */ true);
|
||||
|
||||
if (world->Setting("Decouple Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::BOSS_REVERSE] = GetReverseEntrances(entrancePools[Type::BOSS]);
|
||||
}
|
||||
}
|
||||
|
||||
// Grotto Entrances
|
||||
if (world->Setting("Randomize Grotto Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::GROTTO] = world->GetShuffleableEntrances(Type::GROTTO, /*onlyPrimary = */ true);
|
||||
|
||||
if (world->Setting("Decouple Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::GROTTO_REVERSE] = GetReverseEntrances(entrancePools[Type::GROTTO]);
|
||||
}
|
||||
}
|
||||
|
||||
// Cave Entrances
|
||||
if (world->Setting("Randomize Cave Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::CAVE] = world->GetShuffleableEntrances(Type::CAVE, /*onlyPrimary = */ true);
|
||||
|
||||
if (world->Setting("Decouple Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::CAVE_REVERSE] = GetReverseEntrances(entrancePools[Type::CAVE]);
|
||||
}
|
||||
}
|
||||
|
||||
// Interior Entrances
|
||||
if (world->Setting("Randomize Interior Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::INTERIOR] = world->GetShuffleableEntrances(Type::INTERIOR, /*onlyPrimary = */ true);
|
||||
|
||||
if (world->Setting("Decouple Entrances") == "On")
|
||||
{
|
||||
entrancePools[Type::INTERIOR_REVERSE] = GetReverseEntrances(entrancePools[Type::INTERIOR]);
|
||||
}
|
||||
}
|
||||
|
||||
// Overworld Entrances
|
||||
if (world->Setting("Randomize Overworld Entrances") == "On")
|
||||
{
|
||||
// Normally we allow any overworld entrances to link together.
|
||||
// However, if overworld entrances are mixed with other entrance types
|
||||
// that expect to only match with exclusively primary or non-primary
|
||||
// entrances, we have to separate overworld entrances by their primary/
|
||||
// non-primary distinction to fit with the other entrances
|
||||
const auto& mixedPools = world->GetSettings().GetMixedEntrancePools();
|
||||
bool excludeOverworldReverse =
|
||||
world->Setting("Decouple Entrances") == "Off" &&
|
||||
std::ranges::any_of(mixedPools, [](const auto& pool) {
|
||||
return randomizer::utility::container::ElementInContainer(pool, "Overworld");
|
||||
}); /*Overworld in a mixed pool*/
|
||||
entrancePools[Type::OVERWORLD] =
|
||||
world->GetShuffleableEntrances(Type::OVERWORLD, /*onlyPrimary = */ excludeOverworldReverse);
|
||||
}
|
||||
|
||||
// Match pool types
|
||||
for (auto& [entranceType, entrancePool] : entrancePools)
|
||||
{
|
||||
for (auto& entrance : entrancePool)
|
||||
{
|
||||
entrance->SetType(entranceType);
|
||||
}
|
||||
}
|
||||
|
||||
SetShuffledEntrances(entrancePools);
|
||||
|
||||
// Set appropriate types as decoupled
|
||||
auto potentiallyDecoupledTypes = {
|
||||
Type::DUNGEON,
|
||||
Type::DUNGEON_REVERSE,
|
||||
Type::BOSS,
|
||||
Type::BOSS_REVERSE,
|
||||
Type::GROTTO,
|
||||
Type::GROTTO_REVERSE,
|
||||
Type::CAVE,
|
||||
Type::CAVE_REVERSE,
|
||||
Type::INTERIOR,
|
||||
Type::INTERIOR_REVERSE,
|
||||
Type::OVERWORLD,
|
||||
};
|
||||
if (world->Setting("Decouple Entrances") == "On")
|
||||
{
|
||||
for (const auto& type : potentiallyDecoupledTypes)
|
||||
{
|
||||
if (entrancePools.contains(type))
|
||||
{
|
||||
for (auto& entrance : entrancePools.at(type))
|
||||
{
|
||||
entrance->SetDecoupled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Combine the Mixed pools into their respective pools
|
||||
const auto& mixedPoolList = world->GetSettings().GetMixedEntrancePools();
|
||||
int counter = 1;
|
||||
for (const auto& mixedPool : mixedPoolList)
|
||||
{
|
||||
auto mixedType = TypeFromStr("Mixed Pool " + std::to_string(counter));
|
||||
for (const auto& typeStr : mixedPool)
|
||||
{
|
||||
auto type = TypeFromStr(typeStr);
|
||||
if (type == Type::INVALID)
|
||||
{
|
||||
throw std::runtime_error("Unknown entrance type \"" + typeStr + "\" in mixed pools");
|
||||
}
|
||||
// Only bother with entrance types that are being shuffled
|
||||
for (const auto& entranceType : {type, TypeToReverse(type)})
|
||||
{
|
||||
if (entrancePools.contains(entranceType))
|
||||
{
|
||||
// Create the Mixed Pool entry if it doesn't exist
|
||||
if (!entrancePools.contains(mixedType))
|
||||
{
|
||||
entrancePools[mixedType] = {};
|
||||
}
|
||||
for (const auto& entrance : entrancePools.at(entranceType))
|
||||
{
|
||||
entrancePools.at(mixedType).push_back(entrance);
|
||||
}
|
||||
// Delete the original pool once it's been added
|
||||
entrancePools.erase(entranceType);
|
||||
}
|
||||
}
|
||||
}
|
||||
counter += 1;
|
||||
}
|
||||
|
||||
return entrancePools;
|
||||
}
|
||||
|
||||
EntrancePools CreateTargetPools(EntrancePools& entrancePools)
|
||||
{
|
||||
EntrancePools targetEntrancePools = {};
|
||||
for (auto& [type, entrancePool] : entrancePools)
|
||||
{
|
||||
if (type == Type::SPAWN)
|
||||
{
|
||||
EntrancePool spawnPool = {};
|
||||
auto world = entrancePool[0]->GetWorld();
|
||||
// Get all the entrances of these types to use as spawn targets
|
||||
for (const auto& typeForSpawn : {Type::SPAWN, Type::INTERIOR, Type::CAVE, Type::OVERWORLD, Type::GROTTO})
|
||||
{
|
||||
for (const auto& entrance : world->GetShuffleableEntrances(typeForSpawn))
|
||||
{
|
||||
auto newTarget = entrance->GetNewTarget();
|
||||
spawnPool.push_back(newTarget);
|
||||
|
||||
// Don't assume we have access to random spawn targets. We're only connecting to one of them
|
||||
// so assuming we have access to all of them would be erroneous.
|
||||
newTarget->SetRequirement(requirement::IMPOSSIBLE_REQUIREMENT);
|
||||
}
|
||||
}
|
||||
targetEntrancePools[type] = spawnPool;
|
||||
for (auto& entrance : entrancePool)
|
||||
{
|
||||
entrance->Disconnect();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
targetEntrancePools[type] = AssumeEntrancePool(entrancePool);
|
||||
}
|
||||
}
|
||||
return targetEntrancePools;
|
||||
}
|
||||
|
||||
EntrancePool AssumeEntrancePool(EntrancePool& entrancePool)
|
||||
{
|
||||
EntrancePool assumedPool = {};
|
||||
for (auto& entrance : entrancePool)
|
||||
{
|
||||
auto assumedForward = entrance->AssumeReachable();
|
||||
if (entrance->GetReverse() && !entrance->IsDecoupled())
|
||||
{
|
||||
auto assumedReturn = entrance->GetReverse()->AssumeReachable();
|
||||
assumedForward->BindTwoWay(assumedReturn);
|
||||
}
|
||||
assumedPool.push_back(assumedForward);
|
||||
}
|
||||
return assumedPool;
|
||||
}
|
||||
|
||||
void SetPlandomizedEntrances(world::World* world,
|
||||
EntrancePools& entrancePools,
|
||||
EntrancePools& targetEntrancePools)
|
||||
{
|
||||
LOG_TO_DEBUG("Now placing plandomizer entrances");
|
||||
auto& worlds = world->GetRandomizer()->GetWorlds();
|
||||
auto itemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
|
||||
for (auto& [plandoEntrance, plandoTarget] : world->GetPlandomizerEntrances())
|
||||
{
|
||||
auto entranceToConnect = plandoEntrance;
|
||||
auto targetToConnect = plandoTarget;
|
||||
auto entranceType = plandoEntrance->GetType();
|
||||
|
||||
// Throw error if entrance/target types are not shuffleable
|
||||
if (entranceType == Type::INVALID)
|
||||
{
|
||||
throw std::runtime_error(entranceToConnect->GetOriginalName() +
|
||||
" is not an entrance that can be shuffled");
|
||||
}
|
||||
if (plandoTarget->GetType() == Type::INVALID)
|
||||
{
|
||||
throw std::runtime_error(plandoTarget->GetOriginalName() +
|
||||
" is not an entrance that can be shuffled");
|
||||
}
|
||||
|
||||
// Throw error if entrance type is shuffleable, but the type itself is not randomized currently
|
||||
if (!entrancePools.contains(entranceType))
|
||||
{
|
||||
throw std::runtime_error("Entrance type " + TypeToStr(entranceType) + " for " +
|
||||
entranceToConnect->GetOriginalName() + " is not being shuffled and thus can't be plandomized.");
|
||||
}
|
||||
|
||||
// Get the appropriate pools
|
||||
auto& entrancePool = entrancePools.at(entranceType);
|
||||
auto& targetPool = targetEntrancePools.at(entranceType);
|
||||
|
||||
// If entrances are coupled, but the user tries to plandomize a non-primary connection, get the primary connection
|
||||
// instead
|
||||
if (world->Setting("Decouple Entrances") == "Off" &&
|
||||
utility::container::ElementInContainer(entrancePool, entranceToConnect->GetReverse()))
|
||||
{
|
||||
entranceToConnect = entranceToConnect->GetReverse();
|
||||
targetToConnect = targetToConnect->GetReverse();
|
||||
}
|
||||
|
||||
if (utility::container::ElementInContainer(entrancePool, entranceToConnect))
|
||||
{
|
||||
bool validTargetFound = false;
|
||||
for (auto& target : targetPool)
|
||||
{
|
||||
// If we've found the proper target
|
||||
if (targetToConnect == target->GetReplaces())
|
||||
{
|
||||
try
|
||||
{
|
||||
CheckEntrancesCompatibility(entranceToConnect, target);
|
||||
ChangeConnections(entranceToConnect, target);
|
||||
// If the spawn entrance isn't placed, then we can't validate the world
|
||||
if (world->GetEntrance("Links Spawn -> Outside Links House")->GetConnectedArea() != nullptr)
|
||||
{
|
||||
ValidateWorld(world, entranceToConnect, itemPool);
|
||||
}
|
||||
validTargetFound = true;
|
||||
ConfirmReplacement(entranceToConnect, target);
|
||||
}
|
||||
catch(const EntranceShuffleError& e)
|
||||
{
|
||||
throw std::runtime_error("Could not connect entrance " +
|
||||
entranceToConnect->GetOriginalName() + " to " + target->GetOriginalName() +
|
||||
" Reason:\n" + e.what());
|
||||
}
|
||||
if (validTargetFound)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If we found our target, delete the entrance and it's now connected target from their respective pools
|
||||
if (validTargetFound)
|
||||
{
|
||||
utility::container::Erase(entrancePool, entranceToConnect);
|
||||
utility::container::Erase(targetPool, targetToConnect->GetAssumed());
|
||||
}
|
||||
// Otherwise, the target is invalid
|
||||
else
|
||||
{
|
||||
throw std::runtime_error("Entrance " + targetToConnect->GetOriginalName() + " is not a valid target for " +
|
||||
entranceToConnect->GetOriginalName());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw std::runtime_error("Plandomizer Error: " + entranceToConnect->GetOriginalName() +
|
||||
" could not be found.");
|
||||
}
|
||||
}
|
||||
|
||||
LOG_TO_DEBUG("All plandomized entrances have been placed.");
|
||||
}
|
||||
|
||||
void ShuffleNonAssumedEntrancesPools(world::World* world,
|
||||
EntrancePools& entrancePools,
|
||||
EntrancePools& targetEntrancePools)
|
||||
{
|
||||
// If we aren't shuffling any non-assumed types, return early
|
||||
if (std::ranges::none_of(entrancePools | std::ranges::views::keys, [](const auto& type) {
|
||||
return NON_ASSUMED_TYPES.contains(type);
|
||||
})) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto& worlds = world->GetRandomizer()->GetWorlds();
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
|
||||
// The idea here is we want to try shuffling all the non-assumed entrances
|
||||
// at the same time since we can't validate the world after each one individually.
|
||||
// (That would require assuming access to entrances which we can't guarantee access to.)
|
||||
// Realistically, this should never take more than 1 or 2 tries unless there's some wacky
|
||||
// plandomizer stuff going on. Currently, the only non-assumed entrance we're shuffling
|
||||
// is the randomized spawn, but if we ever shuffle warp portals, they'll go here too.
|
||||
|
||||
int retries = 20;
|
||||
while (retries > 0)
|
||||
{
|
||||
std::unordered_map<Entrance*, Entrance*> rollbacks = {};
|
||||
// Connect each non-assumed entrance to a random target in its pool
|
||||
for (auto& [entranceType, entrancePool] : entrancePools)
|
||||
{
|
||||
if (NON_ASSUMED_TYPES.contains(entranceType))
|
||||
{
|
||||
auto& targetEntrancePool = targetEntrancePools.at(entranceType);
|
||||
for (auto& entrance : entrancePool)
|
||||
{
|
||||
randomizer::utility::random::ShufflePool(targetEntrancePool);
|
||||
|
||||
// Loop through and find a valid target entrance to connect to
|
||||
for (auto& target : targetEntrancePool)
|
||||
{
|
||||
// If this target has already been used, skip over it
|
||||
if (target->GetConnectedArea() == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
LOG_TO_DEBUG("Attempting to connect " + entrance->GetOriginalName() + " to " +
|
||||
target->GetConnectedArea()->GetName() + " [W" +
|
||||
std::to_string(entrance->GetWorld()->GetID()) + "]");
|
||||
ChangeConnections(entrance, target);
|
||||
rollbacks[entrance] = target;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// After each entrance is connected, then try to validate the world
|
||||
bool successfulConnection = false;
|
||||
try
|
||||
{
|
||||
ValidateWorld(world, nullptr, completeItemPool);
|
||||
for (auto& [entrance, target] : rollbacks)
|
||||
{
|
||||
ConfirmReplacement(entrance, target);
|
||||
utility::container::Erase(targetEntrancePools[entrance->GetType()], target);
|
||||
}
|
||||
// Once we've made a valid world, delete all other targets that didn't get used
|
||||
for (auto& [entranceType, targetPool] : targetEntrancePools)
|
||||
{
|
||||
if (NON_ASSUMED_TYPES.contains(entranceType))
|
||||
{
|
||||
for (auto& target : targetPool)
|
||||
{
|
||||
DeleteTargetEntrance(target);
|
||||
}
|
||||
// Also delete the non-assumed entrance type from the pool
|
||||
entrancePools.erase(entranceType);
|
||||
}
|
||||
}
|
||||
successfulConnection = true;
|
||||
}
|
||||
catch(const EntranceShuffleError& e)
|
||||
{
|
||||
// If we're unsuccessful, revert all connections and try again
|
||||
LOG_TO_DEBUG(std::string("Failed to connect non-assumed entrances. Reason: ") + e.what());
|
||||
retries -= 1;
|
||||
for (auto& [entrance, target] : rollbacks)
|
||||
{
|
||||
RestoreConnections(entrance, target);
|
||||
}
|
||||
}
|
||||
if(successfulConnection)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (retries <= 0)
|
||||
{
|
||||
throw std::runtime_error("Ran out of retries when attempting to place non-assumed entrances");
|
||||
}
|
||||
}
|
||||
|
||||
void ShuffleEntrancePool(EntrancePool& entrancePool,
|
||||
EntrancePool& targetEntrancePool,
|
||||
int retries /* = 20*/)
|
||||
{
|
||||
while (retries > 0)
|
||||
{
|
||||
retries -= 1;
|
||||
std::unordered_map<Entrance*, Entrance*> rollbacks = {};
|
||||
try
|
||||
{
|
||||
ShuffleEntrances(entrancePool, targetEntrancePool, rollbacks);
|
||||
for (auto& [entrance, target] : rollbacks)
|
||||
{
|
||||
ConfirmReplacement(entrance, target);
|
||||
}
|
||||
return;
|
||||
}
|
||||
catch(const EntranceShuffleError& e)
|
||||
{
|
||||
for (auto& [entrance, target] : rollbacks)
|
||||
{
|
||||
RestoreConnections(entrance, target);
|
||||
}
|
||||
LOG_TO_DEBUG("Failed to place all entrances in a pool for World " + std::to_string(entrancePool[0]->GetWorld()->GetID()) +
|
||||
". Will retry " + std::to_string(retries) + " more times");
|
||||
LOG_TO_DEBUG(e.what());
|
||||
}
|
||||
}
|
||||
|
||||
throw std::runtime_error(
|
||||
"Ran out of retries when shuffling entrances. If you see this error, try using a few different seeds to see if any "
|
||||
"generate successfully.");
|
||||
}
|
||||
|
||||
void ShuffleEntrances(EntrancePool& entrancePool,
|
||||
EntrancePool& targetEntrancePool,
|
||||
std::unordered_map<Entrance*, Entrance*>& rollbacks)
|
||||
{
|
||||
// This shouldn't be empty, but just incase
|
||||
if (entrancePool.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto& worlds = entrancePool.front()->GetWorld()->GetRandomizer()->GetWorlds();
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
utility::random::ShufflePool(entrancePool);
|
||||
|
||||
for (auto& entrance : entrancePool)
|
||||
{
|
||||
// If this entrance is already connected, don't connect it to another area
|
||||
if (entrance->GetConnectedArea() != nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
utility::random::ShufflePool(targetEntrancePool);
|
||||
|
||||
// Loop through and find a valid target entrance to connect to
|
||||
for (auto& target : targetEntrancePool)
|
||||
{
|
||||
// If this target has already been used, skip over it
|
||||
if (target->GetConnectedArea() == nullptr)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
LOG_TO_DEBUG("Attempting to connect " + entrance->GetOriginalName() + " to " +
|
||||
target->GetConnectedArea()->GetName() + " from " +
|
||||
target->GetReplaces()->GetParentArea()->GetName() + " [W" +
|
||||
std::to_string(entrance->GetWorld()->GetID()) +
|
||||
"]");
|
||||
if (ReplaceEntrance(entrance, target, rollbacks, completeItemPool))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If this entrance was unable to connect to target, throw an error
|
||||
if (entrance->GetConnectedArea() == nullptr)
|
||||
{
|
||||
throw EntranceShuffleError("No more valid entrances to replace " + entrance->GetOriginalName() + " in world " +
|
||||
std::to_string(entrance->GetWorld()->GetID()));
|
||||
}
|
||||
}
|
||||
|
||||
// Check to make sure there are no dangling targets. If there are, something is very wrong
|
||||
for (auto& target : targetEntrancePool)
|
||||
{
|
||||
if (target->GetConnectedArea() != nullptr)
|
||||
{
|
||||
throw std::runtime_error("Dangling Target Entrance " + target->GetReplaces()->GetOriginalName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool ReplaceEntrance(Entrance* entrance,
|
||||
Entrance* target,
|
||||
std::unordered_map<Entrance*, Entrance*>& rollbacks,
|
||||
const item_pool::ItemPool& completeItemPool)
|
||||
{
|
||||
try
|
||||
{
|
||||
CheckEntrancesCompatibility(entrance, target);
|
||||
ChangeConnections(entrance, target);
|
||||
ValidateWorld(entrance->GetWorld(), entrance, completeItemPool);
|
||||
rollbacks[entrance] = target;
|
||||
return true;
|
||||
}
|
||||
catch(const EntranceShuffleError& e)
|
||||
{
|
||||
LOG_TO_DEBUG("Failed to connect " + entrance->GetOriginalName() + " to " +
|
||||
target->GetReplaces()->GetOriginalName() + " (Reason: " + e.what() + ") World " +
|
||||
std::to_string(entrance->GetWorld()->GetID()));
|
||||
if (entrance->GetConnectedArea() != nullptr)
|
||||
{
|
||||
RestoreConnections(entrance, target);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void CheckEntrancesCompatibility(const Entrance* entrance, const Entrance* target)
|
||||
{
|
||||
if (entrance->GetReverse() && entrance->GetReverse() == target->GetReplaces())
|
||||
{
|
||||
throw EntranceShuffleError("Attempted self-connection");
|
||||
}
|
||||
}
|
||||
|
||||
void ChangeConnections(Entrance* entrance, Entrance* target)
|
||||
{
|
||||
entrance->Connect(target->Disconnect());
|
||||
entrance->SetReplaces(target->GetReplaces());
|
||||
// If entrances are coupled, set the opposite connection as well
|
||||
if (entrance->GetReverse() != nullptr && !entrance->IsDecoupled())
|
||||
{
|
||||
target->GetReplaces()->GetReverse()->Connect(entrance->GetReverse()->GetAssumed()->Disconnect());
|
||||
target->GetReplaces()->GetReverse()->SetReplaces(entrance->GetReverse());
|
||||
}
|
||||
}
|
||||
|
||||
void RestoreConnections(Entrance* entrance, Entrance* target)
|
||||
{
|
||||
target->Connect(entrance->Disconnect());
|
||||
entrance->SetReplaces(nullptr);
|
||||
if (entrance->GetReverse() && !entrance->IsDecoupled())
|
||||
{
|
||||
entrance->GetReverse()->GetAssumed()->Connect(target->GetReplaces()->GetReverse()->Disconnect());
|
||||
target->GetReplaces()->GetReverse()->SetReplaces(nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
void ConfirmReplacement(Entrance* entrance, Entrance* target)
|
||||
{
|
||||
DeleteTargetEntrance(target);
|
||||
LOG_TO_DEBUG("Finalized Connection " + entrance->GetOriginalName() + " to " + entrance->GetConnectedArea()->GetName() +
|
||||
" [W" + std::to_string(entrance->GetWorld()->GetID()) + "]");
|
||||
if (entrance->GetReverse() != nullptr && !entrance->IsDecoupled())
|
||||
{
|
||||
auto replacedReverse = entrance->GetReplaces()->GetReverse();
|
||||
LOG_TO_DEBUG("Finalized Connection " + replacedReverse->GetOriginalName() + " to " +
|
||||
replacedReverse->GetConnectedArea()->GetName() + " [W" +
|
||||
std::to_string(entrance->GetWorld()->GetID()) + "]");
|
||||
DeleteTargetEntrance(entrance->GetReverse()->GetAssumed());
|
||||
}
|
||||
}
|
||||
|
||||
void DeleteTargetEntrance(Entrance* target)
|
||||
{
|
||||
if (target->GetConnectedArea() != nullptr)
|
||||
{
|
||||
target->Disconnect();
|
||||
}
|
||||
if (target->GetParentArea() != nullptr)
|
||||
{
|
||||
target->GetParentArea()->RemoveExit(target);
|
||||
}
|
||||
}
|
||||
|
||||
void ValidateWorld(world::World* world,
|
||||
Entrance* entrance,
|
||||
const item_pool::ItemPool& completeItemPool)
|
||||
{
|
||||
// Validate that all logic is still satisfied
|
||||
auto& worlds = world->GetRandomizer()->GetWorlds();
|
||||
auto verifyLogicError = search::VerifyLogic(&worlds, completeItemPool);
|
||||
if (verifyLogicError.has_value())
|
||||
{
|
||||
throw EntranceShuffleError("Not all logic is satisfied! Reason:\n" + verifyLogicError.value());
|
||||
}
|
||||
|
||||
// Check to make sure there's at least 1 sphere zero location available
|
||||
auto sphereZeroSearch = search::Search::SphereZero(&worlds);
|
||||
sphereZeroSearch.SearchWorlds();
|
||||
const auto& foundLocations = sphereZeroSearch._visitedLocations;
|
||||
const auto numSphereZeroLocations = std::ranges::count_if(foundLocations, [](const auto& location) {
|
||||
return location->IsProgression();
|
||||
});
|
||||
|
||||
// If there are no sphere zero locations available and we didn't find an accessible disconnected exit, then this world will not
|
||||
// be valid. Often times when many entrances are randomized we won't find any locations, but will find accessible disconnected
|
||||
// exits that haven't been shuffled yet. In this case we can usually wait until these exits are connected and more often
|
||||
// than not this will lead us to sphere zero locations.
|
||||
if (numSphereZeroLocations == 0 && !sphereZeroSearch.HasAccessibleDisconnectedExit())
|
||||
{
|
||||
throw EntranceShuffleError("No sphere 0 locations reachable at the start!");
|
||||
}
|
||||
}
|
||||
|
||||
void SetShuffledEntrances(EntrancePools& entrancePools)
|
||||
{
|
||||
for (auto& [entranceType, entrancePool] : entrancePools)
|
||||
{
|
||||
for (auto& entrance : entrancePool)
|
||||
{
|
||||
entrance->SetShuffled(true);
|
||||
if (entrance->GetReverse() != nullptr)
|
||||
{
|
||||
entrance->GetReverse()->SetShuffled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EntrancePool GetReverseEntrances(const EntrancePool& entrances)
|
||||
{
|
||||
EntrancePool reverseEntrances = {};
|
||||
for (const auto& entrance : entrances)
|
||||
{
|
||||
reverseEntrances.push_back(entrance->GetReverse());
|
||||
}
|
||||
return reverseEntrances;
|
||||
}
|
||||
|
||||
const std::set<std::string>& GetPossibleMixedPoolTypes() {
|
||||
static std::set<std::string> possibleMixedPoolTypes = {
|
||||
TypeToStr(DUNGEON),
|
||||
TypeToStr(BOSS),
|
||||
TypeToStr(GROTTO),
|
||||
TypeToStr(INTERIOR),
|
||||
TypeToStr(CAVE),
|
||||
TypeToStr(OVERWORLD),
|
||||
};
|
||||
|
||||
return possibleMixedPoolTypes;
|
||||
}
|
||||
} // namespace randomizer::logic::entrance_shuffle
|
||||
@@ -0,0 +1,49 @@
|
||||
#pragma once
|
||||
|
||||
#include "entrance.hpp"
|
||||
#include "world.hpp"
|
||||
|
||||
namespace randomizer::logic::entrance_shuffle
|
||||
{
|
||||
void ShuffleWorldEntrances(world::World* world);
|
||||
void SetAllEntrancesData(world::World* world);
|
||||
entrance::EntrancePools CreateEntrancePools(world::World* world);
|
||||
entrance::EntrancePools CreateTargetPools(entrance::EntrancePools& entrancePools);
|
||||
entrance::EntrancePool AssumeEntrancePool(entrance::EntrancePool& entrancePool);
|
||||
void SetPlandomizedEntrances(world::World* world,
|
||||
entrance::EntrancePools& entrancePools,
|
||||
entrance::EntrancePools& targetEntrancePools);
|
||||
void ShuffleNonAssumedEntrancesPools(world::World* world,
|
||||
entrance::EntrancePools& entrancePools,
|
||||
entrance::EntrancePools& targetEntrancePools);
|
||||
void ShuffleEntrancePool(entrance::EntrancePool& entrancePool,
|
||||
entrance::EntrancePool& targetEntrancePool,
|
||||
int retries = 20);
|
||||
void ShuffleEntrances(entrance::EntrancePool& entrancePool,
|
||||
entrance::EntrancePool& targetEntrancePool,
|
||||
std::unordered_map<entrance::Entrance*, entrance::Entrance*>& rollbacks);
|
||||
bool ReplaceEntrance(entrance::Entrance* entrance,
|
||||
entrance::Entrance* target,
|
||||
std::unordered_map<entrance::Entrance*, entrance::Entrance*>& rollbacks,
|
||||
const item_pool::ItemPool& completeItemPool);
|
||||
|
||||
void CheckEntrancesCompatibility(const entrance::Entrance* entrance,
|
||||
const entrance::Entrance* target);
|
||||
void ChangeConnections(entrance::Entrance* entrance, entrance::Entrance* target);
|
||||
void RestoreConnections(entrance::Entrance* entrance, entrance::Entrance* target);
|
||||
void ConfirmReplacement(entrance::Entrance* entrance, entrance::Entrance* target);
|
||||
void DeleteTargetEntrance(entrance::Entrance* target);
|
||||
void ValidateWorld(world::World* world,
|
||||
entrance::Entrance* entrance,
|
||||
const item_pool::ItemPool& completeItemPool);
|
||||
|
||||
void SetShuffledEntrances(entrance::EntrancePools& entrancePools);
|
||||
entrance::EntrancePool GetReverseEntrances(const entrance::EntrancePool& entrances);
|
||||
const std::set<std::string>& GetPossibleMixedPoolTypes();
|
||||
|
||||
class EntranceShuffleError: public std::runtime_error
|
||||
{
|
||||
public:
|
||||
explicit EntranceShuffleError(const std::string& message): std::runtime_error(message) {}
|
||||
};
|
||||
} // namespace randomizer::logic::entrance_shuffle
|
||||
@@ -0,0 +1,550 @@
|
||||
#include "fill.hpp"
|
||||
|
||||
#include "item_pool.hpp"
|
||||
#include "search.hpp"
|
||||
#include "../utility/random.hpp"
|
||||
#include "../utility/string.hpp"
|
||||
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
|
||||
namespace randomizer::logic::fill
|
||||
{
|
||||
void FillWorlds(world::WorldPool& worlds)
|
||||
{
|
||||
// Place each world's restricted items first
|
||||
for (auto& world : worlds)
|
||||
{
|
||||
PlaceRestrictedItems(world, worlds);
|
||||
}
|
||||
|
||||
item_pool::ItemPool itemPool = {};
|
||||
location::LocationPool locationPool = {};
|
||||
|
||||
// Combine all worlds' item pools and location pools
|
||||
for (const auto& world : worlds)
|
||||
{
|
||||
for (const auto& item : world->GetItemPool())
|
||||
{
|
||||
itemPool.emplace_back(item);
|
||||
}
|
||||
for (const auto& location : world->GetAllLocations())
|
||||
{
|
||||
locationPool.emplace_back(location);
|
||||
}
|
||||
}
|
||||
|
||||
// Place remaining major items in progress locations
|
||||
auto majorItems =
|
||||
utility::container::FilterAndEraseFromVector(itemPool, [](const auto& item) { return item->IsMajor(); });
|
||||
auto progressLocations =
|
||||
utility::container::FilterFromVector(locationPool,
|
||||
[](const auto& location) { return location->IsProgression(); });
|
||||
AssumedFill(worlds, majorItems, itemPool, progressLocations);
|
||||
|
||||
// Place Minor items in progression locations if possible
|
||||
auto minorItems =
|
||||
utility::container::FilterAndEraseFromVector(itemPool, [](const auto& item) { return item->IsMinor(); });
|
||||
FastFill(minorItems, progressLocations);
|
||||
|
||||
// If there are still minor items left, add them back to the main item pool
|
||||
for (const auto& minorItem : minorItems)
|
||||
{
|
||||
itemPool.push_back(minorItem);
|
||||
}
|
||||
|
||||
// Then place everything else anywhere
|
||||
FastFill(itemPool, locationPool);
|
||||
|
||||
// Verify that all logic is satisfied
|
||||
auto verifyLogicError = search::VerifyLogic(&worlds);
|
||||
if (verifyLogicError.has_value())
|
||||
{
|
||||
throw std::runtime_error("Not all logic satisfied! Reason:\n" + verifyLogicError.value());
|
||||
}
|
||||
}
|
||||
|
||||
void AssumedFill(world::WorldPool& worlds,
|
||||
item_pool::ItemPool& itemsToPlacePool,
|
||||
const item_pool::ItemPool& itemsNotYetPlaced,
|
||||
location::LocationPool allowedLocations,
|
||||
const int& worldToFill /* = -1 */)
|
||||
{
|
||||
// Assumed Fill may sometimes place items in such a way that accidentally locks out being able to place specific items
|
||||
// later on. Allow the algorithm to retry a reasonable amount of times before returning an error.
|
||||
int retries = 10;
|
||||
bool unsuccessfulPlacement = true;
|
||||
while (unsuccessfulPlacement)
|
||||
{
|
||||
if (retries <= 0)
|
||||
{
|
||||
std::string errorMsg = "Ran out of retries while attempting to place the following items:\n";
|
||||
const auto count = itemsToPlacePool.size() > 5 ? 5 : itemsToPlacePool.size();
|
||||
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
const auto& item = itemsToPlacePool[i];
|
||||
errorMsg += "- " + item->GetName() + "\n";
|
||||
}
|
||||
|
||||
if (count < itemsToPlacePool.size())
|
||||
{
|
||||
errorMsg += "- (" + std::to_string(itemsToPlacePool.size() - count) + " more)";
|
||||
}
|
||||
|
||||
throw std::runtime_error(errorMsg);
|
||||
}
|
||||
|
||||
retries -= 1;
|
||||
unsuccessfulPlacement = false;
|
||||
|
||||
utility::random::ShufflePool(itemsToPlacePool);
|
||||
auto itemsToPlace = itemsToPlacePool;
|
||||
location::LocationPool rollbacks = {};
|
||||
|
||||
while (!itemsToPlace.empty())
|
||||
{
|
||||
// Get a random item to place
|
||||
auto itemToPlace = itemsToPlace.back();
|
||||
itemsToPlace.pop_back();
|
||||
|
||||
utility::random::ShufflePool(allowedLocations);
|
||||
location::Location* spotToFill = nullptr;
|
||||
|
||||
// Assume we have all the items which haven't been played yet, except the one we're about to place
|
||||
auto assumedItems = itemsNotYetPlaced;
|
||||
assumedItems.insert(assumedItems.end(), itemsToPlace.begin(), itemsToPlace.end());
|
||||
auto search = search::Search::Accessible(&worlds, assumedItems, worldToFill);
|
||||
search.SearchWorlds();
|
||||
// search.DumpWorldGraph();
|
||||
// return 1;
|
||||
|
||||
// Loop through the shuffled locations until we find a valid one.
|
||||
// If a world is only checking for beatable logic, then we can ignore
|
||||
// any access checks and just choose a random location if the world is already beatable
|
||||
auto beatableOnlyLogic = itemToPlace->GetWorld()->Setting("Logic Rules") == "Beatable Only";
|
||||
auto noLogic = itemToPlace->GetWorld()->Setting("Logic Rules") == "No Logic";
|
||||
bool canChooseAnyLocation =
|
||||
noLogic || (search._ownedItems.contains(itemToPlace->GetWorld()->GetGameWinningItem()) && beatableOnlyLogic);
|
||||
|
||||
for (const auto& location : allowedLocations)
|
||||
{
|
||||
// Get all reachable LocationAccess spots for this location
|
||||
std::list<area::LocationAccess*> locAccList;
|
||||
for (const auto& locAcc : location->GetAccessList())
|
||||
{
|
||||
if (canChooseAnyLocation || search._visitedAreas.contains(locAcc->GetArea()))
|
||||
{
|
||||
locAccList.push_back(locAcc);
|
||||
}
|
||||
}
|
||||
|
||||
// If this location is not empty, or has no potentially reachable LocationAccess spot, or is forbidden from
|
||||
// having this item, then we can't place the item here
|
||||
if (!location->IsEmpty() || locAccList.empty() || location->GetForbiddenItems().contains(itemToPlace))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// If any of the LocationAccess spots evaluate to complete, then we can place an item here
|
||||
if (std::ranges::any_of(locAccList, [&](const auto& la) {
|
||||
return canChooseAnyLocation ||
|
||||
requirement::EvaluateLocationRequirement(&search, la) == requirement::EvalSuccess::COMPLETE;
|
||||
}))
|
||||
{
|
||||
spotToFill = location;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If we couldn't find a spot to place this item, undo all item placements within this fill attempt and try
|
||||
// again from the top.
|
||||
if (spotToFill == nullptr)
|
||||
{
|
||||
LOG_TO_DEBUG("No accessible locations to place " + itemToPlace->GetName() + ". Retrying " +
|
||||
std::to_string(retries) + " more times.");
|
||||
for (auto& location : rollbacks)
|
||||
{
|
||||
itemsToPlace.push_back(location->GetCurrentItem());
|
||||
location->RemoveCurrentItem();
|
||||
}
|
||||
|
||||
// Also add back the randomly selected item
|
||||
itemsToPlace.push_back(itemToPlace);
|
||||
rollbacks.clear();
|
||||
// Break out of the item placement loop and flag an unsuccessful placement attempt to try again
|
||||
unsuccessfulPlacement = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Place the item at the location
|
||||
spotToFill->SetCurrentItem(itemToPlace);
|
||||
rollbacks.push_back(spotToFill);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FastFill(item_pool::ItemPool& itemsToPlace, location::LocationPool allowedLocations)
|
||||
{
|
||||
auto emptyLocations =
|
||||
utility::container::FilterFromVector(allowedLocations,
|
||||
[](const auto& location) { return location->IsEmpty(); });
|
||||
|
||||
if (itemsToPlace.size() > emptyLocations.size())
|
||||
{
|
||||
std::cout << "WARNING: More items than locations when placing items with fast fill. Items: " << itemsToPlace.size()
|
||||
<< " Locations: " << emptyLocations.size() << std::endl;
|
||||
}
|
||||
|
||||
utility::random::ShufflePool(emptyLocations);
|
||||
for (auto& location : emptyLocations)
|
||||
{
|
||||
if (itemsToPlace.empty())
|
||||
{
|
||||
break;
|
||||
}
|
||||
location->SetCurrentItem(utility::random::PopRandomElement(itemsToPlace));
|
||||
}
|
||||
}
|
||||
|
||||
void PlaceRestrictedItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
PlaceGoalLocationItems(world, worlds);
|
||||
PlaceOwnDungeonItems(world, worlds);
|
||||
PlacePrologueItems(world, worlds);
|
||||
PlaceAnywhereDungeonRewards(world, worlds);
|
||||
PlaceAnyDungeonItems(world, worlds);
|
||||
PlaceOverworldItems(world, worlds);
|
||||
}
|
||||
|
||||
void PlacePrologueItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
if (world->Setting("Skip Prologue") == "On") {
|
||||
return;
|
||||
}
|
||||
|
||||
auto locations = world->GetAllLocations();
|
||||
// Filter out excluded locations
|
||||
utility::container::FilterAndEraseFromVector(locations, [](const auto& location) {
|
||||
return !location->IsProgression();
|
||||
});
|
||||
|
||||
// Filter out the slingshot and progressive swords to place first. The slingshot and first sword have a very limited
|
||||
// pool of locations and have to be found in the intro. We also include the lantern, shadow crystal, and progressive
|
||||
// fishing rod because those items can lock prologue locations also.
|
||||
auto& itemPool = world->GetItemPool();
|
||||
auto prologueItems = utility::container::FilterAndEraseFromVector(
|
||||
itemPool,
|
||||
[](const auto& item)
|
||||
{
|
||||
return item->GetName() == "Slingshot" || item->GetName() == "Progressive Sword" ||
|
||||
item->GetName() == "Lantern" || item->GetName() == "Progressive Fishing Rod" ||
|
||||
item->GetName() == "North Faron Woods Gate Key" ||
|
||||
item->IsShadowCrystal();
|
||||
});
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, prologueItems, completeItemPool, locations);
|
||||
}
|
||||
|
||||
void PlaceGoalLocationItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
// If dungeon rewards can be anywhere, then return early and place them later
|
||||
if (world->Setting("Dungeon Rewards Can Be Anywhere") == "On")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto allLocations = world->GetAllLocations();
|
||||
location::LocationPool goalLocations = {};
|
||||
|
||||
// Filter out goal locations
|
||||
goalLocations = utility::container::FilterFromVector(allLocations, [](const auto& location) {
|
||||
return location->IsGoalLocation() && location->IsEmpty() && location->IsProgression();
|
||||
});
|
||||
|
||||
// Filter out goal items
|
||||
std::set<std::string> goalItemNames = {"Progressive Mirror Shard", "Progressive Fused Shadow"};
|
||||
|
||||
auto goalItems = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item) { return goalItemNames.contains(item->GetName()); });
|
||||
|
||||
// Return an error if there aren't enough goal locations
|
||||
if (goalItems.size() > goalLocations.size())
|
||||
{
|
||||
throw std::runtime_error("Not enough available locations to place dungeon rewards at the end of dungeons.");
|
||||
}
|
||||
|
||||
// Place goal items at goal locations
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, goalItems, completeItemPool, goalLocations);
|
||||
|
||||
// Determine required dungeons now that we placed goal location items
|
||||
world->DetermineRequiredDungeons();
|
||||
}
|
||||
|
||||
void PlaceOwnDungeonItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
for (const auto& [dungeonName, dungeon] : world->GetDungeonTable())
|
||||
{
|
||||
// Filter hint signs out of dungeon locations
|
||||
auto dungeonLocations = dungeon->GetLocations();
|
||||
utility::container::FilterAndEraseFromVector(dungeonLocations, [](const auto& location) {
|
||||
return location->HasCategories("Non-Item Location");
|
||||
});
|
||||
|
||||
// Filter out excluded locations if this dungeon is required
|
||||
if (dungeon->IsRequired()) {
|
||||
utility::container::FilterAndEraseFromVector(dungeonLocations, [](const auto& location) {
|
||||
return !location->IsProgression();
|
||||
});
|
||||
}
|
||||
|
||||
// Clang doesn't like passing structured binding variables to lambda functions via reference, so we create these
|
||||
// temporary variables to serve the purpose
|
||||
auto& dungeon_ = dungeon;
|
||||
auto& dungeonName_ = dungeonName;
|
||||
|
||||
// Small Keys
|
||||
if (world->Setting("Small Keys") == "Own Dungeon")
|
||||
{
|
||||
auto smallKeys = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item)
|
||||
{
|
||||
return item == dungeon_->GetSmallKey() ||
|
||||
(dungeonName_ == "Snowpeak Ruins" &&
|
||||
(item->GetName() == "Ordon Pumpkin" || item->GetName() == "Ordon Cheese"));
|
||||
});
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, smallKeys, completeItemPool, dungeonLocations);
|
||||
}
|
||||
|
||||
// Big Keys
|
||||
if (world->Setting("Big Keys") == "Own Dungeon")
|
||||
{
|
||||
auto bigKeys = utility::container::FilterAndEraseFromVector(world->GetItemPool(),
|
||||
[&](const auto& item)
|
||||
{ return item == dungeon_->GetBigKey(); });
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, bigKeys, completeItemPool, dungeonLocations);
|
||||
}
|
||||
|
||||
// Place maps and compasses last with fast fill since they're junk items
|
||||
if (world->Setting("Maps and Compasses") == "Own Dungeon")
|
||||
{
|
||||
auto mapsCompasses = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item) { return item == dungeon_->GetCompass() || item == dungeon_->GetDungeonMap(); });
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
FastFill(mapsCompasses, dungeonLocations);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void PlaceAnywhereDungeonRewards(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
// If dungeon rewards can't be anywhere, then return early as we placed them earlier
|
||||
if (world->Setting("Dungeon Rewards Can Be Anywhere") == "Off")
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
auto allLocations = world->GetAllLocations();
|
||||
// Filter out any nonprogress locations
|
||||
utility::container::FilterAndEraseFromVector(allLocations, [](const auto& location) {
|
||||
return !location->IsProgression();
|
||||
});
|
||||
|
||||
// Filter out goal items
|
||||
std::set<std::string> goalItemNames = {"Progressive Mirror Shard", "Progressive Fused Shadow"};
|
||||
|
||||
auto goalItems = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item) { return goalItemNames.contains(item->GetName()); });
|
||||
|
||||
// Place the items
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, goalItems, completeItemPool, allLocations);
|
||||
|
||||
// Determine required dungeons now that we placed goal location items
|
||||
world->DetermineRequiredDungeons();
|
||||
}
|
||||
|
||||
void PlaceAnyDungeonItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
item_pool::ItemPool anyDungeonItems = {};
|
||||
location::LocationPool anyDungeonLocations = {};
|
||||
|
||||
// Split the placement of any dungeon items into two pools. Dungeon items from dungeons which should be barren
|
||||
// will only be distributed among barren dungeons, where as items from nonbarren dungeons will be distributed
|
||||
// among nonbarren dungeons
|
||||
std::list<dungeon::Dungeon*> nonBarrenDungeons = {};
|
||||
std::list<dungeon::Dungeon*> barrenDungeons = {};
|
||||
for (const auto& [dungeonName, dungeon] : world->GetDungeonTable())
|
||||
{
|
||||
if (dungeon->ShouldBeBarren())
|
||||
{
|
||||
barrenDungeons.push_back(dungeon.get());
|
||||
}
|
||||
else
|
||||
{
|
||||
nonBarrenDungeons.push_back(dungeon.get());
|
||||
}
|
||||
}
|
||||
|
||||
// Loop through each pool separately
|
||||
for (const auto& dungeons : {nonBarrenDungeons, barrenDungeons})
|
||||
{
|
||||
anyDungeonItems.clear();
|
||||
anyDungeonLocations.clear();
|
||||
// Gather all the appropriate items and locations for the dungeon in this pool
|
||||
for (const auto& dungeon : dungeons)
|
||||
{
|
||||
// Clang doesn't like passing structured binding variables to lambda functions via reference, so we create these
|
||||
// temporary variables to serve the purpose
|
||||
auto& dungeon_ = dungeon;
|
||||
// Add small keys to the pool if small keys are any dungeon
|
||||
if (world->Setting("Small Keys") == "Any Dungeon")
|
||||
{
|
||||
auto smallKeys = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item)
|
||||
{
|
||||
return item == dungeon_->GetSmallKey() ||
|
||||
(dungeon_->GetName() == "Snowpeak Ruins" &&
|
||||
(item->GetName() == "Ordon Pumpkin" || item->GetName() == "Ordon Cheese"));
|
||||
});
|
||||
std::ranges::copy(smallKeys, std::back_inserter(anyDungeonItems));
|
||||
}
|
||||
|
||||
// Add big keys to the pool if big keys are any dungeon
|
||||
if (world->Setting("Big Keys") == "Any Dungeon")
|
||||
{
|
||||
auto bigKeys = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item) { return item == dungeon_->GetBigKey(); });
|
||||
std::ranges::copy(bigKeys, std::back_inserter(anyDungeonItems));
|
||||
}
|
||||
|
||||
// Add maps and compasses to the pool if maps and compasses are any dungeon
|
||||
if (world->Setting("Maps and Compasses") == "Any Dungeon")
|
||||
{
|
||||
auto mapsCompasses = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item) { return item == dungeon_->GetCompass() || item == dungeon_->GetDungeonMap(); });
|
||||
std::ranges::copy(mapsCompasses, std::back_inserter(anyDungeonItems));
|
||||
}
|
||||
|
||||
// Add this dungeon's locations to the anyDungeonLocations pool. If this is a nonbarren dungeon, only include
|
||||
// locations which are still progression. If it's a barren dungeon, include all the locations
|
||||
auto dungeonLocations = dungeon->GetLocations();
|
||||
// Filter out non-item locations (i.e. hint signs)
|
||||
utility::container::FilterAndEraseFromVector(dungeonLocations, [](const auto& location) {
|
||||
return location->HasCategories("Non-Item Location");
|
||||
});
|
||||
|
||||
std::ranges::copy_if(dungeonLocations,
|
||||
std::back_inserter(anyDungeonLocations),
|
||||
[&](const auto& location) { return dungeon->ShouldBeBarren() || location->IsProgression(); });
|
||||
}
|
||||
|
||||
// Place the dungeon items in the appropriate dungeon locations
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, anyDungeonItems, completeItemPool, anyDungeonLocations);
|
||||
}
|
||||
}
|
||||
|
||||
void PlaceOverworldItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds)
|
||||
{
|
||||
item_pool::ItemPool overworldItems = {};
|
||||
location::LocationPool overworldLocations = world->GetAllLocations();
|
||||
// Filter out any nonprogress locations
|
||||
utility::container::FilterAndEraseFromVector(overworldLocations,
|
||||
[](const auto& location) { return !location->IsProgression(); });
|
||||
|
||||
for (const auto& [dungeonName, dungeon] : world->GetDungeonTable())
|
||||
{
|
||||
// Clang doesn't like passing structured binding variables to lambda functions via reference, so we create these
|
||||
// temporary variables to serve the purpose
|
||||
auto& dungeon_ = dungeon;
|
||||
auto& dungeonName_ = dungeonName;
|
||||
|
||||
// Add small keys to the pool if small keys are overworld
|
||||
if (world->Setting("Small Keys") == "Overworld")
|
||||
{
|
||||
auto smallKeys = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item)
|
||||
{
|
||||
return item == dungeon_->GetSmallKey() ||
|
||||
(dungeonName_ == "Snowpeak Ruins" &&
|
||||
(item->GetName() == "Ordon Pumpkin" || item->GetName() == "Ordon Cheese"));
|
||||
});
|
||||
std::ranges::copy(smallKeys, std::back_inserter(overworldItems));
|
||||
}
|
||||
|
||||
// Add big keys to the pool if big keys are overworld
|
||||
if (world->Setting("Big Keys") == "Overworld")
|
||||
{
|
||||
auto bigKeys = utility::container::FilterAndEraseFromVector(world->GetItemPool(),
|
||||
[&](const auto& item)
|
||||
{ return item == dungeon_->GetBigKey(); });
|
||||
std::ranges::copy(bigKeys, std::back_inserter(overworldItems));
|
||||
}
|
||||
|
||||
// Add maps and compasses to the pool if maps and compasses are overworld
|
||||
if (world->Setting("Maps and Compasses") == "Overworld")
|
||||
{
|
||||
auto mapsCompasses = utility::container::FilterAndEraseFromVector(
|
||||
world->GetItemPool(),
|
||||
[&](const auto& item) { return item == dungeon_->GetCompass() || item == dungeon_->GetDungeonMap(); });
|
||||
std::ranges::copy(mapsCompasses, std::back_inserter(overworldItems));
|
||||
}
|
||||
|
||||
// Remove this dungeon's locations from the overworldLocations pool
|
||||
overworldLocations = utility::container::FilterFromVector(
|
||||
overworldLocations,
|
||||
[&](const auto& location)
|
||||
{ return !utility::container::ElementInContainer(dungeon_->GetLocations(), location); });
|
||||
}
|
||||
|
||||
// Place the dungeon items in the overworld locations
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
AssumedFill(worlds, overworldItems, completeItemPool, overworldLocations);
|
||||
}
|
||||
|
||||
void CacheExitTimeForms(world::WorldPool& worlds)
|
||||
{
|
||||
auto completeItemPool = item_pool::GetCompleteItemPool(worlds);
|
||||
auto searchWithItems = search::Search::AllLocationsReachable(&worlds, completeItemPool);
|
||||
searchWithItems.SearchWorlds();
|
||||
|
||||
for (auto& world : worlds)
|
||||
{
|
||||
LOG_TO_DEBUG("Caching timeforms for world " + std::to_string(world->GetID()));
|
||||
auto& exitTimeFormCache = world->GetExitTimeFormCache();
|
||||
exitTimeFormCache.clear();
|
||||
for (const auto& [areaName, area] : world->GetAreaTable())
|
||||
{
|
||||
const auto& areaFormTimes = searchWithItems._areaFormTime[area.get()];
|
||||
for (const auto& exit : area->GetExits())
|
||||
{
|
||||
auto req = exit->GetRequirement();
|
||||
exitTimeFormCache[exit] = requirement::FormTime::NONE;
|
||||
for (const auto& formTime : requirement::FormTime::ALL_FORM_TIMES)
|
||||
{
|
||||
if (formTime & areaFormTimes &&
|
||||
requirement::EvaluateRequirementAtFormTime(req,
|
||||
&searchWithItems,
|
||||
formTime,
|
||||
world.get()))
|
||||
{
|
||||
exitTimeFormCache[exit] |= formTime;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace randomizer::logic::fill
|
||||
@@ -0,0 +1,68 @@
|
||||
#pragma once
|
||||
|
||||
#include "item.hpp"
|
||||
#include "world.hpp"
|
||||
|
||||
namespace randomizer::logic::fill
|
||||
{
|
||||
|
||||
void FillWorlds(world::WorldPool& worlds);
|
||||
|
||||
/**
|
||||
* @brief Assumed fill is an algorithm which statistically places items more
|
||||
* evenly across the world compared to forward fill. The idea is that
|
||||
* we first start with all the items, take an item out, search for
|
||||
* available locations (picking up any placed items along the way),
|
||||
* and choose a random location of the available ones to place the item.
|
||||
* Repeat for all items in the itemsToPlacePool.
|
||||
*
|
||||
* @param worlds The worlds to fill with items
|
||||
* @param itemsToPlacePool The pool of items which we want to place
|
||||
* @param itemsNotYetPlaced The pool of items which aren't placed yet, but will be later.
|
||||
* This is important for the assumed fill algorithm since we need to assume we have these items.
|
||||
* @param allowedLocations Locations where items in itemsToPlacePool are allowed to be filled.
|
||||
* @param worldToFill A specific world to fill. If -1 (default), then all worlds are considered
|
||||
*/
|
||||
void AssumedFill(world::WorldPool& worlds,
|
||||
item_pool::ItemPool& itemsToPlacePool,
|
||||
const item_pool::ItemPool& itemsNotYetPlaced,
|
||||
location::LocationPool allowedLocations,
|
||||
const int& worldToFill = -1);
|
||||
|
||||
/**
|
||||
* @brief Places items in locations completely randomly without any logic checks.
|
||||
*
|
||||
* @param itemsToPlace The pool of items to place
|
||||
* @param allowedLocations The locations where the items can be placed
|
||||
*/
|
||||
void FastFill(item_pool::ItemPool& itemsToPlace, location::LocationPool allowedLocations);
|
||||
|
||||
void PlaceRestrictedItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds);
|
||||
|
||||
/**
|
||||
* @brief If the prologue is not being skipped, place the sword and slingshot early on to prevent possible placement
|
||||
* failures later.
|
||||
*
|
||||
* @param world The world to place the prologue items in
|
||||
* @param worlds All the worlds being generated
|
||||
*/
|
||||
void PlacePrologueItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds);
|
||||
|
||||
void PlaceGoalLocationItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds);
|
||||
|
||||
void PlaceOwnDungeonItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds);
|
||||
|
||||
void PlaceAnywhereDungeonRewards(std::unique_ptr<world::World>& world,
|
||||
world::WorldPool& worlds);
|
||||
|
||||
void PlaceAnyDungeonItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds);
|
||||
|
||||
void PlaceOverworldItems(std::unique_ptr<world::World>& world, world::WorldPool& worlds);
|
||||
|
||||
/**
|
||||
* @brief Cache all the possible timeforms for each exit. This way, the search algorithm doesn't end up testing for
|
||||
* timeforms that we know ahead of time wouldn't be possible anyway
|
||||
* @param worlds The worlds to calculate and cache the possible timeforms for
|
||||
*/
|
||||
void CacheExitTimeForms(world::WorldPool& worlds);
|
||||
} // namespace randomizer::logic::fill
|
||||
@@ -0,0 +1,287 @@
|
||||
#include <algorithm>
|
||||
|
||||
#include "bits.hpp"
|
||||
#include "../item.hpp"
|
||||
|
||||
#include <iterator>
|
||||
|
||||
BitVector::BitVector(const std::list<int>& bits)
|
||||
{
|
||||
for (auto& i : bits)
|
||||
{
|
||||
this->set(i);
|
||||
}
|
||||
}
|
||||
|
||||
bool BitVector::isEmpty() const
|
||||
{
|
||||
return bitset.none();
|
||||
}
|
||||
|
||||
std::set<int> BitVector::ints() const
|
||||
{
|
||||
return intset;
|
||||
}
|
||||
|
||||
void BitVector::set(const int& i)
|
||||
{
|
||||
bitset.set(i, true);
|
||||
intset.insert(i);
|
||||
}
|
||||
|
||||
void BitVector::clear(const int& i)
|
||||
{
|
||||
if (intset.contains(i))
|
||||
{
|
||||
intset.erase(i);
|
||||
bitset.set(i, false);
|
||||
}
|
||||
}
|
||||
|
||||
bool BitVector::test(const int& i) const
|
||||
{
|
||||
return intset.contains(i);
|
||||
}
|
||||
|
||||
int BitVector::size() const
|
||||
{
|
||||
return intset.size();
|
||||
}
|
||||
|
||||
void BitVector::and_(const BitVector& other)
|
||||
{
|
||||
std::set<int> intersection = {};
|
||||
std::set_intersection(intset.begin(),
|
||||
intset.end(),
|
||||
other.intset.begin(),
|
||||
other.intset.end(),
|
||||
std::inserter(intersection, intersection.begin()));
|
||||
intset = intersection;
|
||||
bitset &= other.bitset;
|
||||
}
|
||||
|
||||
void BitVector::or_(const BitVector& other)
|
||||
{
|
||||
intset.insert(other.intset.begin(), other.intset.end());
|
||||
bitset |= other.bitset;
|
||||
}
|
||||
|
||||
bool BitVector::isSubsetOf(const BitVector& other) const
|
||||
{
|
||||
return (bitset | other.bitset) == other.bitset;
|
||||
}
|
||||
|
||||
bool BitVector::equals(const BitVector& other) const
|
||||
{
|
||||
return bitset == other.bitset;
|
||||
}
|
||||
|
||||
bool includedIn(const std::bitset<512>& a, const std::bitset<512>& b)
|
||||
{
|
||||
return (a | b) == b;
|
||||
}
|
||||
|
||||
DNF::DNF(std::vector<std::bitset<512>> terms_): terms(terms_) {}
|
||||
|
||||
bool DNF::isTriviallyFalse() const
|
||||
{
|
||||
return terms.size() == 0;
|
||||
}
|
||||
|
||||
bool DNF::isTriviallyTrue() const
|
||||
{
|
||||
return std::any_of(terms.begin(), terms.end(), [](const auto& i) { return i == 0; });
|
||||
}
|
||||
|
||||
DNF DNF::or_(const DNF& other)
|
||||
{
|
||||
auto new_terms = terms;
|
||||
new_terms.insert(new_terms.end(), other.terms.begin(), other.terms.end());
|
||||
return DNF(new_terms);
|
||||
}
|
||||
|
||||
// Removes all redundent terms
|
||||
DNF DNF::dedup()
|
||||
{
|
||||
std::vector<std::bitset<512>> filtered = {};
|
||||
for (const auto& candidate : terms)
|
||||
{
|
||||
std::vector<int> toPop = {};
|
||||
bool nextTerm = false;
|
||||
for (int existing_idx = 0; existing_idx < filtered.size(); existing_idx++)
|
||||
{
|
||||
const auto& existing = filtered[existing_idx];
|
||||
if (includedIn(existing, candidate))
|
||||
{
|
||||
// Existing requires fewer or equal things than candidate
|
||||
nextTerm = true;
|
||||
break;
|
||||
}
|
||||
else if (includedIn(candidate, existing))
|
||||
{
|
||||
// Candidate requires strictly fewer things than existing
|
||||
toPop.push_back(existing_idx);
|
||||
}
|
||||
}
|
||||
|
||||
if (!nextTerm)
|
||||
{
|
||||
// Did not break to next term
|
||||
for (auto c_iter = toPop.rbegin(); c_iter != toPop.rend(); c_iter++)
|
||||
{
|
||||
const auto& c = *c_iter;
|
||||
if (c == filtered.size() - 1)
|
||||
{
|
||||
filtered.pop_back();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Remove c without shifting elements by replacing
|
||||
// it with the last element
|
||||
filtered[c] = filtered.back();
|
||||
filtered.pop_back();
|
||||
}
|
||||
}
|
||||
filtered.push_back(candidate);
|
||||
}
|
||||
}
|
||||
|
||||
return DNF(filtered);
|
||||
}
|
||||
|
||||
// Returns useful, self.or_(other)
|
||||
// useful is True if other contained at least one term that
|
||||
// was not redundant.
|
||||
std::pair<bool, DNF> DNF::or_useful(const DNF& other)
|
||||
{
|
||||
auto filtered_this = terms;
|
||||
std::vector<std::bitset<512>> filtered_other = {};
|
||||
bool useful = false;
|
||||
|
||||
for (const auto& candidate : other.terms)
|
||||
{
|
||||
bool nextTerm = false;
|
||||
for (const auto& existing : filtered_this)
|
||||
{
|
||||
if (includedIn(existing, candidate))
|
||||
{
|
||||
nextTerm = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!nextTerm)
|
||||
{
|
||||
filtered_other.push_back(candidate);
|
||||
useful = true;
|
||||
}
|
||||
}
|
||||
|
||||
filtered_this.insert(filtered_this.end(), filtered_other.begin(), filtered_other.end());
|
||||
return {useful, DNF(filtered_this)};
|
||||
}
|
||||
|
||||
DNF DNF::and_(const DNF& other)
|
||||
{
|
||||
std::vector<std::bitset<512>> d = {};
|
||||
for (const auto& t1 : terms)
|
||||
{
|
||||
for (const auto& t2 : other.terms)
|
||||
{
|
||||
d.push_back(t1 | t2);
|
||||
}
|
||||
}
|
||||
|
||||
// Dedup incase things are getting too big
|
||||
DNF dnf = DNF(d);
|
||||
if (d.size() > 500)
|
||||
{
|
||||
dnf = dnf.dedup();
|
||||
}
|
||||
return dnf;
|
||||
}
|
||||
|
||||
int BitIndex::bump()
|
||||
{
|
||||
auto c = counter;
|
||||
counter++;
|
||||
return c;
|
||||
}
|
||||
|
||||
int BitIndex::reqBit(const randomizer::logic::requirement::Requirement& req)
|
||||
{
|
||||
uint32_t expectedCount;
|
||||
randomizer::logic::item::Item* item;
|
||||
std::string key;
|
||||
|
||||
switch (req._type)
|
||||
{
|
||||
case randomizer::logic::requirement::Type::ITEM:
|
||||
item = std::get<randomizer::logic::item::Item*>(req._args[0]);
|
||||
key = item->GetName() + "::1";
|
||||
if (itemBits.contains(key))
|
||||
{
|
||||
return itemBits[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
itemBits[key] = counter;
|
||||
reverseIndex.push_back(req);
|
||||
return bump();
|
||||
}
|
||||
case randomizer::logic::requirement::Type::COUNT:
|
||||
expectedCount = std::get<int>(req._args[0]);
|
||||
item = std::get<randomizer::logic::item::Item*>(req._args[1]);
|
||||
key = item->GetName() + "::" + std::to_string(expectedCount);
|
||||
if (itemBits.contains(key))
|
||||
{
|
||||
return itemBits[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
itemBits[key] = counter;
|
||||
reverseIndex.push_back(req);
|
||||
return bump();
|
||||
}
|
||||
case randomizer::logic::requirement::Type::GOLDEN_BUGS:
|
||||
key = std::to_string(std::get<int>(req._args[0]));
|
||||
if (goldenBugCount.contains(key))
|
||||
{
|
||||
return goldenBugCount[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
goldenBugCount[key] = counter;
|
||||
reverseIndex.push_back(req);
|
||||
return bump();
|
||||
}
|
||||
case randomizer::logic::requirement::Type::HEARTS:
|
||||
key = std::to_string(std::get<int>(req._args[0]));
|
||||
if (heartCount.contains(key))
|
||||
{
|
||||
return heartCount[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
heartCount[key] = counter;
|
||||
reverseIndex.push_back(req);
|
||||
return bump();
|
||||
}
|
||||
case randomizer::logic::requirement::Type::DUNGEONS_COMPLETED:
|
||||
key = std::to_string(std::get<int>(req._args[0]));
|
||||
if (dungeonCompletedCount.contains(key))
|
||||
{
|
||||
return dungeonCompletedCount[key];
|
||||
}
|
||||
else
|
||||
{
|
||||
dungeonCompletedCount[key] = counter;
|
||||
reverseIndex.push_back(req);
|
||||
return bump();
|
||||
}
|
||||
default:
|
||||
// Not a flattening requirement
|
||||
return -1;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
#pragma once
|
||||
|
||||
#include "../requirement.hpp"
|
||||
|
||||
#include <list>
|
||||
#include <vector>
|
||||
#include <bitset>
|
||||
#include <set>
|
||||
#include <unordered_map>
|
||||
|
||||
class BitVector
|
||||
{
|
||||
public:
|
||||
BitVector() = default;
|
||||
explicit BitVector(const std::list<int>& bits);
|
||||
|
||||
bool isEmpty() const;
|
||||
std::set<int> ints() const;
|
||||
void set(const int& i);
|
||||
void clear(const int& i);
|
||||
bool test(const int& i) const;
|
||||
int size() const;
|
||||
void and_(const BitVector& other);
|
||||
void or_(const BitVector& other);
|
||||
bool isSubsetOf(const BitVector& other) const;
|
||||
bool equals(const BitVector& other) const;
|
||||
|
||||
std::bitset<512> bitset;
|
||||
std::set<int> intset;
|
||||
};
|
||||
|
||||
bool includedIn(const std::bitset<512>& a, const std::bitset<512>& b);
|
||||
|
||||
// A logical expression in disjunctive normal form.
|
||||
// Disjuncts are bit-vectors, but we don't use the BitVector class here
|
||||
// because it doesn't seem necessary since our bitvectors are small
|
||||
// and we only need bit set access after the propagation code is done
|
||||
class DNF
|
||||
{
|
||||
public:
|
||||
DNF() = default;
|
||||
DNF(std::vector<std::bitset<512>> terms);
|
||||
|
||||
static DNF True() { return DNF({0}); }
|
||||
|
||||
static DNF False() { return DNF(std::vector<std::bitset<512>> {}); }
|
||||
|
||||
bool isTriviallyFalse() const;
|
||||
bool isTriviallyTrue() const;
|
||||
DNF or_(const DNF& other);
|
||||
DNF dedup();
|
||||
std::pair<bool, DNF> or_useful(const DNF& other);
|
||||
DNF and_(const DNF& other);
|
||||
|
||||
std::vector<std::bitset<512>> terms = {};
|
||||
};
|
||||
|
||||
class BitIndex
|
||||
{
|
||||
public:
|
||||
BitIndex() = default;
|
||||
|
||||
int bump();
|
||||
int reqBit(const randomizer::logic::requirement::Requirement& req);
|
||||
|
||||
std::unordered_map<std::string, int> itemBits = {};
|
||||
std::unordered_map<std::string, int> heartCount = {};
|
||||
std::unordered_map<std::string, int> goldenBugCount = {};
|
||||
std::unordered_map<std::string, int> dungeonCompletedCount = {};
|
||||
std::vector<randomizer::logic::requirement::Requirement> reverseIndex = {};
|
||||
int counter = 0;
|
||||
};
|
||||
@@ -0,0 +1,510 @@
|
||||
#include "flatten.hpp"
|
||||
|
||||
#include <ranges>
|
||||
|
||||
#include "../world.hpp"
|
||||
|
||||
FlattenSearch::FlattenSearch(randomizer::logic::world::World* world_)
|
||||
{
|
||||
world = world_;
|
||||
|
||||
for (const auto& area : world->GetAreaTable() | std::views::values)
|
||||
{
|
||||
for (const auto& exit : area->GetExits())
|
||||
{
|
||||
auto visit = visitor(exit, this);
|
||||
visitReq(exit->GetRequirement(), visit, world);
|
||||
}
|
||||
|
||||
for (const auto& event : area->GetEvents())
|
||||
{
|
||||
auto visit = visitor(event, this);
|
||||
visitReq(event->GetRequirement(), visit, world);
|
||||
}
|
||||
}
|
||||
|
||||
const auto root = world->GetRootArea();
|
||||
// Start with all formtimes at the root, false for everything else
|
||||
auto formTimes = randomizer::logic::requirement::FormTime::ALL_FORM_AND_DAY_TIMES;
|
||||
formTimes.push_back(randomizer::logic::requirement::FormTime::TWILIGHT);
|
||||
for (const auto& area : world->GetAreaTable() | std::views::values)
|
||||
{
|
||||
for (const auto& formTime : formTimes)
|
||||
{
|
||||
if (area.get() == root)
|
||||
{
|
||||
areaExprs[formTime][area.get()] = DNF::True();
|
||||
}
|
||||
else
|
||||
{
|
||||
areaExprs[formTime][area.get()] = DNF::False();
|
||||
}
|
||||
}
|
||||
}
|
||||
newlyUpdatedAreas.insert(root);
|
||||
newThingsFound = true;
|
||||
|
||||
for (auto& exit : root->GetExits())
|
||||
{
|
||||
if (exit->GetConnectedArea() != nullptr)
|
||||
{
|
||||
exitsToTry.insert(exit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FlattenSearch::doSearch()
|
||||
{
|
||||
// This algorithm works in three stages:
|
||||
// 1. Compute area and event requirements -> DNFs
|
||||
// 2. Compute location requirement -> DNF
|
||||
// 3. Simplify location requirement -> Requirement
|
||||
|
||||
// This is step 1. This computes everything that requirements
|
||||
// can depend on in a fixpoint algorithm - namely, area access and events.
|
||||
newThingsFound = true;
|
||||
while (newThingsFound)
|
||||
{
|
||||
recentlyUpdatedAreas = newlyUpdatedAreas;
|
||||
recentlyUpdatedEvents = newlyUpdatedEvents;
|
||||
newlyUpdatedAreas = {};
|
||||
newlyUpdatedEvents = {};
|
||||
newThingsFound = false;
|
||||
tryExits();
|
||||
tryEvents();
|
||||
tryTimeFormExpansion();
|
||||
}
|
||||
|
||||
std::unordered_map<std::string, std::list<randomizer::logic::area::LocationAccess*>> itemLocations = {};
|
||||
for (const auto& area : world->GetAreaTable() | std::views::values)
|
||||
{
|
||||
for (auto& locAccess : area->GetLocations())
|
||||
{
|
||||
auto locationName = locAccess->GetLocation()->GetName();
|
||||
if (!itemLocations.contains(locationName))
|
||||
{
|
||||
itemLocations[locationName] = {};
|
||||
}
|
||||
itemLocations[locationName].push_back(locAccess);
|
||||
}
|
||||
}
|
||||
// TODO this immediately combines the "local" requirements with the implicit
|
||||
// area requirement. It has been hypothesized that converting them
|
||||
// separately may produce better tooltips, but at that point you need the
|
||||
// TWWR-Tracker boolean-expression multi-level simplification code
|
||||
|
||||
// Step 2: for every location, OR all the ways to access it
|
||||
|
||||
auto formTimes = randomizer::logic::requirement::FormTime::ALL_FORM_AND_DAY_TIMES;
|
||||
formTimes.push_back(randomizer::logic::requirement::FormTime::TWILIGHT);
|
||||
for (auto& [locName, accessList] : itemLocations)
|
||||
{
|
||||
auto expr = DNF::False();
|
||||
for (const auto& locAcc : accessList)
|
||||
{
|
||||
for (const auto& formTime : formTimes)
|
||||
{
|
||||
expr = expr.or_(tryLocationAtFormTime(locAcc, formTime));
|
||||
}
|
||||
}
|
||||
|
||||
// Step 3: simplify
|
||||
auto location = world->GetLocation(locName);
|
||||
location->SetComputedRequirement(DNFToExpr(bitIndex, expr.dedup()));
|
||||
// world->locationTable[locName]->computedRequirement.simplifyParenthesis();
|
||||
// world->locationTable[locName]->computedRequirement.sortArgs();
|
||||
}
|
||||
|
||||
// Do the same for any shuffled entrances so that we can give them tooltips in the tracker
|
||||
for (auto& [name, area] : world->GetAreaTable())
|
||||
{
|
||||
for (auto& exit : area->GetExits())
|
||||
{
|
||||
if (exit->IsShuffled())
|
||||
{
|
||||
auto expr = DNF::False();
|
||||
auto& validFormTimes = exit->GetWorld()->GetExitTimeFormCache()[exit];
|
||||
for (const auto& formTime : randomizer::logic::requirement::FormTime::ALL_FORM_TIMES)
|
||||
{
|
||||
if (formTime & validFormTimes)
|
||||
{
|
||||
expr = expr.or_(tryExitAtFormTime(exit, formTime));
|
||||
}
|
||||
}
|
||||
exit->SetComputedRequirement(DNFToExpr(bitIndex, expr.dedup()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check for a thing in area whether its logical dependencies
|
||||
// have recently been updated.
|
||||
bool FlattenSearch::wasUpdated(randomizer::logic::area::Area* area, void* thing)
|
||||
{
|
||||
if (recentlyUpdatedAreas.contains(area))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
auto& remoteEventReqs = remoteEventRequirements[thing];
|
||||
for (auto& event : remoteEventReqs)
|
||||
{
|
||||
if (recentlyUpdatedEvents.contains(event))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// auto& remoteAreaReqs = remoteAreaRequirements[thing];
|
||||
// for (auto& areaStr : remoteAreaReqs)
|
||||
// {
|
||||
// randomizer::logic::area::Area* area2;
|
||||
// world->GetArea(areaStr, area2);
|
||||
// if (recentlyUpdatedAreas.contains(area2))
|
||||
// {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void FlattenSearch::tryExits()
|
||||
{
|
||||
using namespace randomizer::logic::requirement;
|
||||
auto exits = exitsToTry;
|
||||
for (auto& exit : exits)
|
||||
{
|
||||
if (!wasUpdated(exit->GetParentArea(), (void*)exit))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
auto& validFormTimes = exit->GetWorld()->GetExitTimeFormCache()[exit];
|
||||
auto connectedTwilight = exit->GetConnectedArea()->GetTwilightCompletedMacroIndex() != -1;
|
||||
if (connectedTwilight)
|
||||
{
|
||||
validFormTimes |= FormTime::TWILIGHT;
|
||||
}
|
||||
for (const auto& formTime : FormTime::ALL_FORM_TIMES_AND_TWILIGHT)
|
||||
{
|
||||
if (formTime & validFormTimes)
|
||||
{
|
||||
auto connectedArea = exit->GetConnectedArea();
|
||||
auto& oldExpr = areaExprs[formTime][connectedArea];
|
||||
auto newPartial = tryExitAtFormTime(exit, formTime);
|
||||
|
||||
// Add the twilight completed macro for access to this area if it's part of a twilight
|
||||
if (connectedTwilight && formTime != FormTime::TWILIGHT)
|
||||
{
|
||||
auto& oldExprTwilight = areaExprs[FormTime::TWILIGHT][connectedArea];
|
||||
auto [useful, newExpr] = oldExprTwilight.or_useful(newPartial);
|
||||
if (useful)
|
||||
{
|
||||
newlyUpdatedAreas.insert(connectedArea);
|
||||
newThingsFound = true;
|
||||
areaExprs[FormTime::TWILIGHT][connectedArea] = newExpr.dedup();
|
||||
for (auto& event : connectedArea->GetEvents())
|
||||
{
|
||||
eventsToTry.insert(event);
|
||||
}
|
||||
for (auto& areaExit : connectedArea->GetExits())
|
||||
{
|
||||
if (areaExit->GetConnectedArea() != nullptr)
|
||||
{
|
||||
exitsToTry.insert(areaExit);
|
||||
}
|
||||
}
|
||||
areasToTry.insert(connectedArea);
|
||||
}
|
||||
|
||||
newPartial = newPartial.and_(
|
||||
evaluatePartialRequirement(bitIndex,
|
||||
exit->GetWorld()->GetMacro(connectedArea->GetTwilightCompletedMacroIndex()),
|
||||
this,
|
||||
0));
|
||||
}
|
||||
|
||||
auto [useful, newExpr] = oldExpr.or_useful(newPartial);
|
||||
if (useful)
|
||||
{
|
||||
newlyUpdatedAreas.insert(connectedArea);
|
||||
newThingsFound = true;
|
||||
areaExprs[formTime][connectedArea] = newExpr.dedup();
|
||||
for (auto& event : connectedArea->GetEvents())
|
||||
{
|
||||
eventsToTry.insert(event);
|
||||
}
|
||||
for (auto& areaExit : connectedArea->GetExits())
|
||||
{
|
||||
if (areaExit->GetConnectedArea() != nullptr)
|
||||
{
|
||||
exitsToTry.insert(areaExit);
|
||||
}
|
||||
}
|
||||
areasToTry.insert(connectedArea);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FlattenSearch::tryEvents()
|
||||
{
|
||||
for (auto& event : eventsToTry)
|
||||
{
|
||||
if (!wasUpdated(event->GetArea(), (void*)event))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
auto& oldExpr = eventExprs[event->GetEventIndex()];
|
||||
auto newPartial = DNF::False();
|
||||
for (const auto& formTime : randomizer::logic::requirement::FormTime::ALL_FORM_AND_DAY_TIMES)
|
||||
{
|
||||
newPartial = newPartial.or_(tryEventAtFormTime(event, formTime));
|
||||
}
|
||||
auto [useful, newExpr] = oldExpr.or_useful(newPartial);
|
||||
if (useful)
|
||||
{
|
||||
newlyUpdatedEvents.insert(event->GetEventIndex());
|
||||
newThingsFound = true;
|
||||
eventExprs[event->GetEventIndex()] = newExpr.dedup();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FlattenSearch::tryTimeFormExpansion()
|
||||
{
|
||||
using namespace randomizer::logic::requirement;
|
||||
for (auto& area : areasToTry)
|
||||
{
|
||||
if (!recentlyUpdatedAreas.contains(area))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (area->CanTransform())
|
||||
{
|
||||
auto shadowCrystal = area->GetWorld()->GetShadowCrystal();
|
||||
auto shadowCrystalDNF = evaluatePartialRequirement(bitIndex, Requirement {Type::ITEM, {shadowCrystal}}, this, 0);
|
||||
for (const auto& formTime : FormTime::ALL_FORM_TIMES)
|
||||
{
|
||||
auto& oldExpr = areaExprs[formTime][area];
|
||||
int oppositeFormTime = FormTime::NONE;
|
||||
switch (formTime)
|
||||
{
|
||||
case FormTime::HUMAN_DAY:
|
||||
oppositeFormTime = FormTime::WOLF_DAY;
|
||||
break;
|
||||
case FormTime::HUMAN_NIGHT:
|
||||
oppositeFormTime = FormTime::WOLF_NIGHT;
|
||||
break;
|
||||
case FormTime::WOLF_DAY:
|
||||
oppositeFormTime = FormTime::HUMAN_DAY;
|
||||
break;
|
||||
case FormTime::WOLF_NIGHT:
|
||||
oppositeFormTime = FormTime::HUMAN_NIGHT;
|
||||
}
|
||||
auto newPartial = areaExprs[oppositeFormTime][area];
|
||||
if (!newPartial.isTriviallyFalse())
|
||||
{
|
||||
// Transforming requires shadow crystal
|
||||
newPartial = newPartial.and_(shadowCrystalDNF);
|
||||
auto [useful, newExpr] = oldExpr.or_useful(newPartial);
|
||||
if (useful)
|
||||
{
|
||||
newlyUpdatedAreas.insert(area);
|
||||
newThingsFound = true;
|
||||
areaExprs[formTime][area] = newExpr.dedup();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (area->CanChangeTime())
|
||||
{
|
||||
for (const auto& formTime : FormTime::ALL_FORM_TIMES)
|
||||
{
|
||||
auto& oldExpr = areaExprs[formTime][area];
|
||||
int oppositeFormTime = FormTime::NONE;
|
||||
switch (formTime)
|
||||
{
|
||||
case FormTime::HUMAN_DAY:
|
||||
oppositeFormTime = FormTime::HUMAN_NIGHT;
|
||||
break;
|
||||
case FormTime::HUMAN_NIGHT:
|
||||
oppositeFormTime = FormTime::HUMAN_DAY;
|
||||
break;
|
||||
case FormTime::WOLF_DAY:
|
||||
oppositeFormTime = FormTime::WOLF_NIGHT;
|
||||
break;
|
||||
case FormTime::WOLF_NIGHT:
|
||||
oppositeFormTime = FormTime::WOLF_DAY;
|
||||
}
|
||||
auto newPartial = areaExprs[oppositeFormTime][area];
|
||||
if (!newPartial.isTriviallyFalse())
|
||||
{
|
||||
auto [useful, newExpr] = oldExpr.or_useful(newPartial);
|
||||
if (useful)
|
||||
{
|
||||
newlyUpdatedAreas.insert(area);
|
||||
newThingsFound = true;
|
||||
areaExprs[formTime][area] = newExpr.dedup();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this->andAreaFormTimes(area);
|
||||
}
|
||||
}
|
||||
|
||||
void FlattenSearch::andAreaFormTimes(randomizer::logic::area::Area* area)
|
||||
{
|
||||
using namespace randomizer::logic::requirement;
|
||||
|
||||
auto& areaHumanDay = this->areaExprs[FormTime::HUMAN_DAY][area];
|
||||
auto& areaWolfDay = this->areaExprs[FormTime::WOLF_DAY][area];
|
||||
auto& areaHumanNight = this->areaExprs[FormTime::HUMAN_NIGHT][area];
|
||||
auto& areaWolfNight = this->areaExprs[FormTime::WOLF_NIGHT][area];
|
||||
|
||||
this->areaExprs[FormTime::DAY][area] = areaHumanDay.and_(areaWolfDay);
|
||||
this->areaExprs[FormTime::NIGHT][area] = areaHumanNight.and_(areaWolfNight);
|
||||
}
|
||||
|
||||
DNF FlattenSearch::tryEventAtFormTime(randomizer::logic::area::EventAccess* event, const int& formTime)
|
||||
{
|
||||
return areaExprs[formTime][event->GetArea()].and_(
|
||||
evaluatePartialRequirement(bitIndex, event->GetRequirement(), this, formTime));
|
||||
}
|
||||
|
||||
DNF FlattenSearch::tryLocationAtFormTime(randomizer::logic::area::LocationAccess* location, const int& formTime)
|
||||
{
|
||||
return areaExprs[formTime][location->GetArea()].and_(
|
||||
evaluatePartialRequirement(bitIndex, location->GetRequirement(), this, formTime));
|
||||
}
|
||||
|
||||
DNF FlattenSearch::tryExitAtFormTime(randomizer::logic::entrance::Entrance* exit, const int& formTime)
|
||||
{
|
||||
return areaExprs[formTime][exit->GetParentArea()].and_(
|
||||
evaluatePartialRequirement(bitIndex, exit->GetRequirement(), this, formTime));
|
||||
}
|
||||
|
||||
DNF evaluatePartialRequirement(BitIndex& bitIndex,
|
||||
const randomizer::logic::requirement::Requirement& req,
|
||||
FlattenSearch* search,
|
||||
const int& formTime)
|
||||
{
|
||||
uint32_t expectedCount = 0;
|
||||
uint32_t expectedHearts = 0;
|
||||
uint32_t totalHearts = 0;
|
||||
std::bitset<512> bits = 0;
|
||||
randomizer::logic::item::Item* item;
|
||||
int event;
|
||||
DNF d = DNF();
|
||||
randomizer::logic::area::Area* area;
|
||||
|
||||
switch (req._type)
|
||||
{
|
||||
case randomizer::logic::requirement::Type::NOTHING:
|
||||
return DNF::True();
|
||||
|
||||
case randomizer::logic::requirement::Type::IMPOSSIBLE:
|
||||
return DNF::False();
|
||||
|
||||
case randomizer::logic::requirement::Type::OR:
|
||||
d = DNF::False();
|
||||
for (auto& arg : req._args)
|
||||
{
|
||||
d = d.or_(evaluatePartialRequirement(bitIndex,
|
||||
std::get<randomizer::logic::requirement::Requirement>(arg),
|
||||
search,
|
||||
formTime));
|
||||
}
|
||||
return d;
|
||||
|
||||
case randomizer::logic::requirement::Type::AND:
|
||||
d = DNF::True();
|
||||
for (auto& arg : req._args)
|
||||
{
|
||||
d = d.and_(evaluatePartialRequirement(bitIndex,
|
||||
std::get<randomizer::logic::requirement::Requirement>(arg),
|
||||
search,
|
||||
formTime));
|
||||
}
|
||||
return d;
|
||||
|
||||
case randomizer::logic::requirement::Type::ITEM:
|
||||
[[fallthrough]];
|
||||
case randomizer::logic::requirement::Type::GOLDEN_BUGS:
|
||||
[[fallthrough]];
|
||||
case randomizer::logic::requirement::Type::HEARTS:
|
||||
[[fallthrough]];
|
||||
case randomizer::logic::requirement::Type::DUNGEONS_COMPLETED:
|
||||
bits[bitIndex.reqBit(req)] = 1;
|
||||
return DNF({bits});
|
||||
|
||||
case randomizer::logic::requirement::Type::EVENT:
|
||||
event = std::get<int>(req._args[0]);
|
||||
return search->eventExprs[event];
|
||||
|
||||
case randomizer::logic::requirement::Type::MACRO:
|
||||
return evaluatePartialRequirement(bitIndex, search->world->GetMacro(std::get<int>(req._args[0])), search, formTime);
|
||||
|
||||
// count requirements frequently have to unify with weaker terms,
|
||||
// so a count requirement always requires all lesser item counts too.
|
||||
// this ensures redundant terms can be eliminated
|
||||
case randomizer::logic::requirement::Type::COUNT:
|
||||
expectedCount = std::get<int>(req._args[0]);
|
||||
item = std::get<randomizer::logic::item::Item*>(req._args[1]);
|
||||
for (auto i = 1; i <= expectedCount; i++)
|
||||
{
|
||||
randomizer::logic::requirement::Requirement newReq;
|
||||
if (i == 1)
|
||||
{
|
||||
newReq = randomizer::logic::requirement::Requirement {randomizer::logic::requirement::Type::ITEM, {item}};
|
||||
}
|
||||
else
|
||||
{
|
||||
newReq = randomizer::logic::requirement::Requirement {randomizer::logic::requirement::Type::COUNT, {i, item}};
|
||||
}
|
||||
bits[bitIndex.reqBit(newReq)] = 1;
|
||||
}
|
||||
return DNF({bits});
|
||||
|
||||
case randomizer::logic::requirement::Type::DAY:
|
||||
return (formTime & randomizer::logic::requirement::FormTime::DAY) ? DNF::True() : DNF::False();
|
||||
|
||||
case randomizer::logic::requirement::Type::NIGHT:
|
||||
return (formTime & randomizer::logic::requirement::FormTime::NIGHT) ? DNF::True() : DNF::False();
|
||||
|
||||
case randomizer::logic::requirement::Type::HUMAN_LINK:
|
||||
return (formTime & randomizer::logic::requirement::FormTime::HUMAN) ? DNF::True() : DNF::False();
|
||||
|
||||
case randomizer::logic::requirement::Type::WOLF_LINK:
|
||||
return (formTime & randomizer::logic::requirement::FormTime::WOLF) ? DNF::True() : DNF::False();
|
||||
|
||||
case randomizer::logic::requirement::Type::TWILIGHT:
|
||||
return (formTime & randomizer::logic::requirement::FormTime::TWILIGHT) ? DNF::True() : DNF::False();
|
||||
|
||||
case randomizer::logic::requirement::Type::INVALID:
|
||||
default:
|
||||
// actually needs to be some error state?
|
||||
return DNF::False();
|
||||
}
|
||||
return DNF::False();
|
||||
}
|
||||
|
||||
void visitReq(const randomizer::logic::requirement::Requirement& req,
|
||||
std::function<void(const randomizer::logic::requirement::Requirement& req)> f,
|
||||
randomizer::logic::world::World* world)
|
||||
{
|
||||
f(req);
|
||||
if (req._type == randomizer::logic::requirement::Type::AND || req._type == randomizer::logic::requirement::Type::OR)
|
||||
{
|
||||
for (auto& arg : req._args)
|
||||
{
|
||||
visitReq(std::get<randomizer::logic::requirement::Requirement>(arg), f, world);
|
||||
}
|
||||
}
|
||||
else if (req._type == randomizer::logic::requirement::Type::MACRO)
|
||||
{
|
||||
visitReq(world->GetMacro(std::get<int>(req._args[0])), f, world);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
#pragma once
|
||||
|
||||
#include "../entrance.hpp"
|
||||
#include "simplify_algebraic.hpp"
|
||||
#include "../../utility/log.hpp"
|
||||
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
|
||||
namespace randomizer::logic::area
|
||||
{
|
||||
class EventAccess;
|
||||
class Area;
|
||||
} // namespace randomizer::logic::area
|
||||
|
||||
namespace randomizer::logic::world
|
||||
{
|
||||
class World;
|
||||
}
|
||||
|
||||
class FlattenSearch
|
||||
{
|
||||
public:
|
||||
FlattenSearch() = default;
|
||||
FlattenSearch(randomizer::logic::world::World* world_);
|
||||
|
||||
randomizer::logic::world::World* world = nullptr;
|
||||
BitIndex bitIndex = BitIndex();
|
||||
|
||||
// partially computed requirements for areas at a
|
||||
// given timeform and for events
|
||||
std::unordered_map<int, DNF> eventExprs = {};
|
||||
std::unordered_map<int, std::unordered_map<randomizer::logic::area::Area*, DNF>> areaExprs = {};
|
||||
|
||||
// nodes we haven't looked at we don't even need to bother with
|
||||
std::set<randomizer::logic::entrance::Entrance*> exitsToTry = {};
|
||||
std::set<randomizer::logic::area::EventAccess*> eventsToTry = {};
|
||||
std::set<randomizer::logic::area::Area*> areasToTry = {};
|
||||
|
||||
// we only re-check an exit or an event if its dependencies changed.
|
||||
// dependencies can be the implicit parent area (for events and exits),
|
||||
// formtime expansion in the area, and "remote" requirements arising
|
||||
// from the expression itself mentioning an event or an area via can_access
|
||||
std::set<randomizer::logic::area::Area*> recentlyUpdatedAreas = {};
|
||||
std::set<int> recentlyUpdatedEvents = {};
|
||||
|
||||
std::set<randomizer::logic::area::Area*> newlyUpdatedAreas = {};
|
||||
std::set<int> newlyUpdatedEvents = {};
|
||||
|
||||
std::unordered_map<void*, std::set<int>> remoteEventRequirements = {};
|
||||
std::unordered_map<void*, std::set<std::string>> remoteAreaRequirements = {};
|
||||
bool newThingsFound = false;
|
||||
|
||||
void doSearch();
|
||||
bool wasUpdated(randomizer::logic::area::Area* area, void* thing);
|
||||
void tryExits();
|
||||
void tryEvents();
|
||||
void tryTimeFormExpansion();
|
||||
void andAreaFormTimes(randomizer::logic::area::Area* area);
|
||||
|
||||
DNF tryEventAtFormTime(randomizer::logic::area::EventAccess* event, const int& formTime);
|
||||
DNF tryLocationAtFormTime(randomizer::logic::area::LocationAccess* location, const int& formTime);
|
||||
DNF tryExitAtFormTime(randomizer::logic::entrance::Entrance* exit, const int& formTime);
|
||||
};
|
||||
|
||||
template<typename T>
|
||||
std::function<void(const randomizer::logic::requirement::Requirement& req)> visitor(T* thing, FlattenSearch* search)
|
||||
{
|
||||
auto thingPtr = (void*)thing;
|
||||
std::function<void(const randomizer::logic::requirement::Requirement&)> handler =
|
||||
[=](const randomizer::logic::requirement::Requirement& req)
|
||||
{
|
||||
if (req._type == randomizer::logic::requirement::Type::EVENT)
|
||||
{
|
||||
if (!search->remoteEventRequirements.contains(thingPtr))
|
||||
{
|
||||
search->remoteEventRequirements[thingPtr] = {};
|
||||
}
|
||||
search->remoteEventRequirements[thingPtr].insert(std::get<int>(req._args[0]));
|
||||
}
|
||||
};
|
||||
|
||||
return handler;
|
||||
}
|
||||
|
||||
void visitReq(const randomizer::logic::requirement::Requirement& req,
|
||||
std::function<void(const randomizer::logic::requirement::Requirement& req)> f,
|
||||
randomizer::logic::world::World* world);
|
||||
|
||||
DNF evaluatePartialRequirement(BitIndex& bitIndex,
|
||||
const randomizer::logic::requirement::Requirement& req,
|
||||
FlattenSearch* search,
|
||||
const int& formTime);
|
||||
@@ -0,0 +1,424 @@
|
||||
#include "simplify_algebraic.hpp"
|
||||
#include "../../utility/container.hpp"
|
||||
|
||||
// Turns a bit-based DNF (a two-level sum-of-products) back into
|
||||
// a readable multi-level requirement.
|
||||
randomizer::logic::requirement::Requirement DNFToExpr(BitIndex& bitIndex, DNF dnf)
|
||||
{
|
||||
if (dnf.isTriviallyFalse())
|
||||
{
|
||||
return randomizer::logic::requirement::Requirement {randomizer::logic::requirement::Type::IMPOSSIBLE, {}};
|
||||
}
|
||||
|
||||
if (dnf.isTriviallyTrue())
|
||||
{
|
||||
return randomizer::logic::requirement::Requirement {randomizer::logic::requirement::Type::NOTHING, {}};
|
||||
}
|
||||
|
||||
// really make sure no dupes exist, not sure if needed
|
||||
dnf = dnf.dedup();
|
||||
|
||||
// Map to BitVectors. Since DNFs don't offer bit-level access,
|
||||
// we have to manually go through every bit to build BitVectors.
|
||||
// This is definitely not cheap but it probably saves more time
|
||||
// than keeping the intsets around during search
|
||||
std::vector<BitVector> expr = {};
|
||||
for (const auto& t : dnf.terms)
|
||||
{
|
||||
std::list<int> bits = {};
|
||||
for (int bit = 0; bit < bitIndex.counter; bit++)
|
||||
{
|
||||
if (t.test(bit))
|
||||
{
|
||||
bits.push_back(bit);
|
||||
}
|
||||
}
|
||||
expr.emplace_back(bits);
|
||||
}
|
||||
|
||||
// at this point we must remove weaker requirements. E.g.
|
||||
// imagine Beedle existed in this rando and an item required
|
||||
// (Wallet x1 and Wallet x2) or (Wallet x1 and ExtraWallet x1 and ExtraWallet x2)
|
||||
// then this code would pull out Wallet x1 first, resulting in
|
||||
// Wallet x1 and (Wallet x2 or ExtraWallet x1 and ExtraWallet x2) which is not
|
||||
// reasonable at all and at that point not even the TWWR-Tracker simplifications can save us
|
||||
for (auto& term : expr)
|
||||
{
|
||||
for (const auto& bit : term.ints())
|
||||
{
|
||||
auto& req = bitIndex.reverseIndex[bit];
|
||||
if (req._type == randomizer::logic::requirement::Type::COUNT)
|
||||
{
|
||||
auto count = std::get<int>(req._args[0]);
|
||||
auto item = std::get<randomizer::logic::item::Item*>(req._args[1]);
|
||||
for (int i = 1; i < count; i++)
|
||||
{
|
||||
auto lesserBit = bitIndex.reqBit(
|
||||
randomizer::logic::requirement::Requirement {randomizer::logic::requirement::Type::COUNT, {i, item}});
|
||||
term.clear(lesserBit);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
auto commonFactors = expr[0].ints();
|
||||
for (const auto& term : expr)
|
||||
{
|
||||
std::set<int> intersection = {};
|
||||
std::set_intersection(commonFactors.begin(),
|
||||
commonFactors.end(),
|
||||
term.intset.begin(),
|
||||
term.intset.end(),
|
||||
std::inserter(intersection, intersection.begin()));
|
||||
commonFactors = intersection;
|
||||
}
|
||||
|
||||
// build a list of variables that appear in our expression,
|
||||
// excluding common factors.
|
||||
std::set<int> varSet = {};
|
||||
for (auto& term : expr)
|
||||
{
|
||||
for (const auto& c : commonFactors)
|
||||
{
|
||||
term.clear(c);
|
||||
}
|
||||
for (const auto& b : term.ints())
|
||||
{
|
||||
varSet.insert(b);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<int> variables = std::vector<int>(varSet.begin(), varSet.end());
|
||||
|
||||
if (variables.empty())
|
||||
{
|
||||
return createAnd(lookupRequirements(bitIndex, commonFactors));
|
||||
}
|
||||
|
||||
std::vector<BitVector> seen = {};
|
||||
auto kernels = findKernels(expr, variables, BitVector(), seen);
|
||||
kernels = randomizer::utility::container::FilterFromVector(kernels, [](const auto& k) { return !k.coKernel.isEmpty(); });
|
||||
|
||||
// columns are unique cubes in all kernels
|
||||
std::vector<BitVector> columns = {};
|
||||
for (const auto& kernel : kernels)
|
||||
{
|
||||
for (const auto& kCube : kernel.kernel)
|
||||
{
|
||||
if (std::none_of(columns.begin(), columns.end(), [&](const auto& c) { return kCube.equals(c); }))
|
||||
{
|
||||
columns.push_back(kCube);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// rows are unique co-kernels
|
||||
auto& rows = kernels;
|
||||
if (!rows.empty() && !columns.empty())
|
||||
{
|
||||
std::vector<std::vector<int>> matrix = {};
|
||||
for (const auto& row : rows)
|
||||
{
|
||||
matrix.emplace_back(columns.size(), 0);
|
||||
}
|
||||
// create a matrix that is 1 where column cubes appear in row kernels.
|
||||
// since kernels are the result of a single division (by the co-kernel),
|
||||
// this essentially creates ones where division by another cube would be possible
|
||||
for (int col = 0; col < columns.size(); col++)
|
||||
{
|
||||
auto& kCube = columns[col];
|
||||
for (int row = 0; row < rows.size(); row++)
|
||||
{
|
||||
auto& coKernel = rows[row];
|
||||
if (std::any_of(coKernel.kernel.begin(), coKernel.kernel.end(), [&](const auto& k) { return kCube.equals(k); }))
|
||||
{
|
||||
matrix[row][col] = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Find the best rectangle. This optimizes for #literals saved
|
||||
// in the resulting expression, which is a good heuristic for
|
||||
// minimizing the length of the expression.
|
||||
auto rowWeight = [&](const int& row) { return rows[row].coKernel.size() + 1; };
|
||||
auto colWeight = [&](const int& col) { return columns[col].size(); };
|
||||
|
||||
auto value = [&](const int& col, const int& row)
|
||||
{
|
||||
auto cpy = rows[row].coKernel;
|
||||
cpy.or_(columns[col]);
|
||||
return cpy.size();
|
||||
};
|
||||
|
||||
auto literalsSaved = [&](const std::tuple<std::vector<int>, std::vector<int>>& rect)
|
||||
{
|
||||
auto [rectRows, rectCols] = rect;
|
||||
int weight = 0;
|
||||
for (const auto& row : rectRows)
|
||||
{
|
||||
for (const auto& col : rectCols)
|
||||
{
|
||||
if (matrix[row][col])
|
||||
{
|
||||
weight += value(col, row);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto& row : rectRows)
|
||||
{
|
||||
weight -= rowWeight(row);
|
||||
}
|
||||
for (const auto& col : rectCols)
|
||||
{
|
||||
weight -= colWeight(col);
|
||||
}
|
||||
|
||||
return weight;
|
||||
};
|
||||
|
||||
std::vector<std::tuple<std::vector<int>, std::vector<int>>> allRects = {};
|
||||
std::vector<int> rows_;
|
||||
std::vector<int> cols_;
|
||||
for (int i = 0; i < rows.size(); i++)
|
||||
{
|
||||
rows_.push_back(i);
|
||||
}
|
||||
for (int i = 0; i < columns.size(); i++)
|
||||
{
|
||||
cols_.push_back(i);
|
||||
}
|
||||
genRectangles(rows_,
|
||||
cols_,
|
||||
matrix,
|
||||
[&](const std::vector<int>& rows__, const std::vector<int>& cols__)
|
||||
{ allRects.push_back({rows__, cols__}); });
|
||||
|
||||
if (!allRects.empty())
|
||||
{
|
||||
auto& [bestRows, bestCols] = *std::max_element(allRects.begin(),
|
||||
allRects.end(),
|
||||
[&](const auto& rect1, const auto& rect2)
|
||||
{ return literalsSaved(rect1) < literalsSaved(rect2); });
|
||||
|
||||
// divisor is created by OR-ing column cubes
|
||||
std::vector<BitVector> divisor = {};
|
||||
for (const auto& c : bestCols)
|
||||
{
|
||||
divisor.push_back(columns[c]);
|
||||
}
|
||||
auto [quot, remainder] = algebraicDivision(expr, divisor);
|
||||
|
||||
// and re-assemble a Requirement that sort of looks like
|
||||
// common_factors * (quotient * divisor + remainder)
|
||||
auto product = randomizer::logic::requirement::Requirement();
|
||||
product._type = randomizer::logic::requirement::Type::AND;
|
||||
std::vector<std::bitset<512>> quotBits;
|
||||
std::vector<std::bitset<512>> divisorBits;
|
||||
for (const auto& c : quot)
|
||||
{
|
||||
quotBits.push_back(c.bitset);
|
||||
}
|
||||
for (const auto& c : divisor)
|
||||
{
|
||||
divisorBits.push_back(c.bitset);
|
||||
}
|
||||
product._args.push_back(DNFToExpr(bitIndex, DNF(quotBits)));
|
||||
product._args.push_back(DNFToExpr(bitIndex, DNF(divisorBits)));
|
||||
|
||||
auto sum = randomizer::logic::requirement::Requirement();
|
||||
if (!remainder.empty())
|
||||
{
|
||||
std::vector<std::bitset<512>> remainderBits;
|
||||
for (const auto& c : remainder)
|
||||
{
|
||||
remainderBits.push_back(c.bitset);
|
||||
}
|
||||
sum._type = randomizer::logic::requirement::Type::OR;
|
||||
sum._args.push_back(product);
|
||||
sum._args.push_back(DNFToExpr(bitIndex, DNF(remainderBits)));
|
||||
}
|
||||
else
|
||||
{
|
||||
sum = product;
|
||||
}
|
||||
auto terms = lookupRequirements(bitIndex, commonFactors);
|
||||
terms.push_back(sum);
|
||||
return createAnd(terms);
|
||||
}
|
||||
}
|
||||
|
||||
// here we didn't do our complicated rectangle extraction, so just extract
|
||||
// the common factors
|
||||
auto terms = randomizer::logic::requirement::Requirement();
|
||||
terms._type = randomizer::logic::requirement::Type::OR;
|
||||
for (const auto& c : expr)
|
||||
{
|
||||
terms._args.push_back(createAnd(lookupRequirements(bitIndex, c.ints())));
|
||||
}
|
||||
|
||||
// common_factor1 AND common_factor2 AND ... AND (terms without common factors ORed)
|
||||
auto finalTerms = lookupRequirements(bitIndex, commonFactors);
|
||||
finalTerms.push_back(terms);
|
||||
return createAnd(finalTerms);
|
||||
}
|
||||
|
||||
randomizer::logic::requirement::Requirement createAnd(std::vector<randomizer::logic::requirement::Requirement> terms)
|
||||
{
|
||||
if (terms.size() > 1)
|
||||
{
|
||||
randomizer::logic::requirement::Requirement req;
|
||||
req._type = randomizer::logic::requirement::Type::AND;
|
||||
for (auto& term : terms)
|
||||
{
|
||||
req._args.push_back(term);
|
||||
}
|
||||
return req;
|
||||
}
|
||||
return terms[0];
|
||||
}
|
||||
|
||||
// Recursively computes kernels and co-kernels of the expression `cubes`.
|
||||
// A co-kernel is a cube (product term) such that for `expr / co-kernel = kernel`,
|
||||
// `kernel` contains at least two terms but there's no factor to factor out.
|
||||
|
||||
// This effectively tries every combination of variables in this expression
|
||||
// as a co-kernel. seenCoKernels is a bit of book-keeping to not create
|
||||
// duplicate kernels, and min_idx ensures we don't try e.g. ab and ba separately
|
||||
std::vector<FoundKernel> findKernels(const std::vector<BitVector>& cubes,
|
||||
const std::vector<int>& variables,
|
||||
const BitVector& coKernelPath,
|
||||
std::vector<BitVector>& seenCoKernels,
|
||||
int minIdx /* = 0 */)
|
||||
{
|
||||
std::vector<FoundKernel> kernels = {};
|
||||
for (int idx = 0; idx < variables.size(); idx++)
|
||||
{
|
||||
auto& bit = variables[idx];
|
||||
// we won't find any useful kernels by trying these *again*
|
||||
if (idx < minIdx)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
std::vector<BitVector> s = {};
|
||||
for (auto& c : cubes)
|
||||
{
|
||||
if (c.test(bit))
|
||||
{
|
||||
s.push_back(c);
|
||||
}
|
||||
}
|
||||
|
||||
if (s.size() >= 2)
|
||||
{
|
||||
auto co = s[0];
|
||||
for (const auto& c : s)
|
||||
{
|
||||
co.and_(c);
|
||||
}
|
||||
auto subPath = coKernelPath;
|
||||
subPath.or_(co);
|
||||
auto [quot, remainder] = algebraicDivision(cubes, {co});
|
||||
auto subKernels = findKernels(quot, variables, subPath, seenCoKernels, idx + 1);
|
||||
|
||||
for (const auto& sub : subKernels)
|
||||
{
|
||||
if (std::none_of(seenCoKernels.begin(),
|
||||
seenCoKernels.end(),
|
||||
[=](const auto& seenCo) { return seenCo.equals(sub.coKernel); }))
|
||||
{
|
||||
seenCoKernels.push_back(sub.coKernel);
|
||||
kernels.push_back(sub);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cube-free expr is always its own kernel, with trivial co-kernel 1
|
||||
if (std::none_of(seenCoKernels.begin(),
|
||||
seenCoKernels.end(),
|
||||
[=](const auto& seenCo) { return seenCo.equals(coKernelPath); }))
|
||||
{
|
||||
kernels.push_back(FoundKernel {cubes, coKernelPath});
|
||||
}
|
||||
|
||||
return kernels;
|
||||
}
|
||||
|
||||
// Computes the algebraic division of expr / divisor, returning
|
||||
// the quotient and the remainder. These satisfy the formula
|
||||
|
||||
// expr = quotient * divisor + remainder
|
||||
std::pair<std::vector<BitVector>, std::vector<BitVector>> algebraicDivision(const std::vector<BitVector>& expr,
|
||||
const std::vector<BitVector>& divisor)
|
||||
{
|
||||
std::vector<BitVector> quot = {};
|
||||
// for every "cube"/product term in our divisor...
|
||||
for (const auto& divCube : divisor)
|
||||
{
|
||||
// get a list of all cubes that this can be divided by
|
||||
std::vector<BitVector> c = {};
|
||||
std::copy_if(expr.begin(), expr.end(), std::back_inserter(c), [=](const auto& e) { return divCube.isSubsetOf(e); });
|
||||
|
||||
if (c.empty())
|
||||
{
|
||||
// division not possible, remainder is the entire expression
|
||||
return {{}, expr};
|
||||
}
|
||||
|
||||
// "cross out" the bits of this divisor cube
|
||||
for (auto& ci : c)
|
||||
{
|
||||
for (const auto& bit : divCube.ints())
|
||||
{
|
||||
ci.clear(bit);
|
||||
}
|
||||
}
|
||||
|
||||
// compute the intersection of the divided expr with the divided expr in other cubes
|
||||
if (quot.empty())
|
||||
{
|
||||
quot = c;
|
||||
}
|
||||
else
|
||||
{
|
||||
// this is literally set intersection, NOT an OR or an AND
|
||||
std::vector<BitVector> newQuot = {};
|
||||
std::copy_if(quot.begin(),
|
||||
quot.end(),
|
||||
std::back_inserter(newQuot),
|
||||
[=](const auto& qc)
|
||||
{ return std::any_of(c.begin(), c.end(), [=](const auto& cc) { return cc.equals(qc); }); });
|
||||
quot = newQuot;
|
||||
}
|
||||
}
|
||||
|
||||
// finally, compute the remainder essentially by computing
|
||||
// remainder = expr - quotient * divisor
|
||||
// * is AND
|
||||
std::vector<std::bitset<512>> quotBits = {};
|
||||
for (auto& i : quot)
|
||||
{
|
||||
quotBits.push_back(i.bitset);
|
||||
}
|
||||
std::vector<std::bitset<512>> divisorBits = {};
|
||||
for (auto& i : divisor)
|
||||
{
|
||||
divisorBits.push_back(i.bitset);
|
||||
}
|
||||
DNF product = DNF(quotBits).and_(DNF(divisorBits)).dedup();
|
||||
|
||||
std::vector<BitVector> remainder = {};
|
||||
std::copy_if(expr.begin(),
|
||||
expr.end(),
|
||||
std::back_inserter(remainder),
|
||||
[=](const auto& e)
|
||||
{
|
||||
return std::none_of(product.terms.begin(),
|
||||
product.terms.end(),
|
||||
[=](const auto& productTerm) { return includedIn(productTerm, e.bitset); });
|
||||
});
|
||||
|
||||
return {quot, remainder};
|
||||
}
|
||||
@@ -0,0 +1,186 @@
|
||||
// Algebraic simplification techniques treat all requirements as unrelated variables
|
||||
// and allow us to turn our two-level DNF/sum-of-products form into a simpler
|
||||
// multi-level expression.
|
||||
|
||||
// The approach taken here is mostly used in hardware logic synthesis, and described in:
|
||||
|
||||
// * https://faculty.sist.shanghaitech.edu.cn/faculty/zhoupq/Teaching/Spr16/07-Multi-Level-Logic-Synthesis.pdf
|
||||
// * Some lecture slides about the topic. These make the concepts of kernels,
|
||||
// algebraic division, and rectangles very accessible, but e.g. how to actually find rectangles is left open.
|
||||
// * Rudell 1989, Logic Synthesis for VLSI Design
|
||||
// https://www2.eecs.berkeley.edu/Pubs/TechRpts/1989/ERL-89-49.pdf (pp. 41-70)
|
||||
// * Rudell's PhD thesis is where this stuff was originally researched.
|
||||
// The pseudocode for generating prime rectangles is found there and quite useful.
|
||||
|
||||
// This approach does not exploit boolean properties like x & !x = false or x | !x = true
|
||||
// but logic doesn't need this since we only have positive terms. The other thing
|
||||
// these techniques don't handle are "implies" relations like Beetle x 2 => Beetle x 1,
|
||||
// so we may use different techniques for those.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "bits.hpp"
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <functional>
|
||||
|
||||
struct FoundKernel
|
||||
{
|
||||
std::vector<BitVector> kernel;
|
||||
BitVector coKernel;
|
||||
};
|
||||
|
||||
randomizer::logic::requirement::Requirement DNFToExpr(BitIndex& bitIndex, DNF dnf);
|
||||
|
||||
randomizer::logic::requirement::Requirement createAnd(std::vector<randomizer::logic::requirement::Requirement> terms);
|
||||
|
||||
// Generates all prime rectangles in this matrix. A rectangle is a set of columns and rows
|
||||
// such that for every row and column, matrix[row][colum] is not zero. A prime rectangle
|
||||
// is a rectangle that is not included in any other rectangle.
|
||||
template<typename Func>
|
||||
void genRectangles(std::vector<int>& rows, std::vector<int>& cols, std::vector<std::vector<int>>& matrix, Func callback)
|
||||
{
|
||||
// generate trivial prime rectangles first
|
||||
// trivial rectangles are rectangles with only
|
||||
// one row or one column
|
||||
for (const auto& row : rows)
|
||||
{
|
||||
// Find the ones in this row
|
||||
std::vector<int> ones = {};
|
||||
std::copy_if(cols.begin(), cols.end(), std::back_inserter(ones), [=](const int& c) { return matrix[row][c]; });
|
||||
// if this row has ones and there's no other row that
|
||||
// has ones in the same positions, this row is part of
|
||||
// a trivial row prime rectangle
|
||||
if (!ones.empty() and
|
||||
std::none_of(
|
||||
rows.begin(),
|
||||
rows.end(),
|
||||
[=](const int& r)
|
||||
{ return r != row && std::all_of(ones.begin(), ones.end(), [=](const int& c) { return matrix[r][c]; }); }))
|
||||
{
|
||||
callback({row}, ones);
|
||||
}
|
||||
}
|
||||
|
||||
for (const auto& col : cols)
|
||||
{
|
||||
// Same as above
|
||||
std::vector<int> ones = {};
|
||||
std::copy_if(rows.begin(), rows.end(), std::back_inserter(ones), [=](const int& r) { return matrix[r][col]; });
|
||||
|
||||
if (!ones.empty() and
|
||||
std::none_of(
|
||||
rows.begin(),
|
||||
rows.end(),
|
||||
[=](const int& c)
|
||||
{ return c != col && std::all_of(ones.begin(), ones.end(), [=](const int& r) { return matrix[r][c]; }); }))
|
||||
{
|
||||
callback(ones, {col});
|
||||
}
|
||||
}
|
||||
|
||||
genRectanglesRecursive(rows, cols, matrix, 0, {}, {}, callback);
|
||||
}
|
||||
|
||||
// Recursively generates non-trivial prime rectangles based on the
|
||||
// existing prime rectangle given by matrix and rect_cols. Rectangles generated
|
||||
// by this function will have fewer rows but more columns than the passed rectangle.
|
||||
|
||||
// Args:
|
||||
// all_rows: A list of all row indices, for convenience.
|
||||
// all_cols: A list of all column indices, for convenience.
|
||||
// matrix: The matrix being searched for rectangles.
|
||||
// index: Grow the rectangle starting from this column
|
||||
// rect_rows: Rows of the prime rectangle.
|
||||
// rect_cols: Columns of the prime rectangle.
|
||||
// callback: Called for every prime rectangle.
|
||||
template<typename Func>
|
||||
void genRectanglesRecursive(std::vector<int>& allRows,
|
||||
std::vector<int>& allCols,
|
||||
std::vector<std::vector<int>>& matrix,
|
||||
const int& index,
|
||||
std::vector<int> rectRows,
|
||||
std::vector<int> rectCols,
|
||||
Func callback)
|
||||
{
|
||||
// do not consider columns before the starting index, and require
|
||||
// this column to have two or more ones (otherwise we'd generate a trivial rectangle)
|
||||
for (const auto& c : allCols)
|
||||
{
|
||||
if (c >= index && std::count_if(allRows.begin(), allRows.end(), [=](const int& row) { return matrix[row][c]; }) >= 2)
|
||||
{
|
||||
// create submatrix, only keeping rows where the column has a one
|
||||
// all other rows are zeroed
|
||||
std::vector<std::vector<int>> m1 = {};
|
||||
for (int rowIdx = 0; rowIdx < matrix.size(); rowIdx++)
|
||||
{
|
||||
auto& row = matrix[rowIdx];
|
||||
m1.push_back(matrix[rowIdx][c] ? row : std::vector(row.size(), 0));
|
||||
}
|
||||
|
||||
// create new rect rows based on this column. If we had an existing
|
||||
// rectangle in the recursive case, this shrinks the rectangle, otherwise
|
||||
// it creates the first rectangle
|
||||
std::vector<int> rect1Rows;
|
||||
std::copy_if(allRows.begin(),
|
||||
allRows.end(),
|
||||
std::back_inserter(rect1Rows),
|
||||
[=](const int& row) { return matrix[row][c]; });
|
||||
std::vector<int> rect1Cols = rectCols;
|
||||
|
||||
bool prune = false;
|
||||
// add column c and all columns with EXACTLY the same number of ones
|
||||
for (const auto& c1 : allCols)
|
||||
{
|
||||
if (std::count_if(allRows.begin(), allRows.end(), [=](const int& row) { return m1[row][c1]; }) ==
|
||||
std::count_if(allRows.begin(), allRows.end(), [=](const int& row) { return matrix[row][c]; }))
|
||||
{
|
||||
if (c1 < c)
|
||||
{
|
||||
// "if a column of 1's occurs for a column index less than
|
||||
// the starting index, then all rectangles in the current
|
||||
// submatrix have already been examined when that column
|
||||
// was processed" (Rudell)
|
||||
prune = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
// add the column to our rectangle
|
||||
rect1Cols.push_back(c1);
|
||||
for (const auto& row : allRows)
|
||||
{
|
||||
m1[row][c1] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!prune)
|
||||
{
|
||||
callback(rect1Rows, rect1Cols);
|
||||
genRectanglesRecursive(allRows, allCols, m1, c, rect1Rows, rect1Cols, callback);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<FoundKernel> findKernels(const std::vector<BitVector>& cubes,
|
||||
const std::vector<int>& variables,
|
||||
const BitVector& coKernelPath,
|
||||
std::vector<BitVector>& seenCoKernels,
|
||||
int minIdx = 0);
|
||||
|
||||
std::pair<std::vector<BitVector>, std::vector<BitVector>> algebraicDivision(const std::vector<BitVector>& expr,
|
||||
const std::vector<BitVector>& divisor);
|
||||
|
||||
template<typename Container>
|
||||
std::vector<randomizer::logic::requirement::Requirement> lookupRequirements(BitIndex& bitIndex, Container r)
|
||||
{
|
||||
std::vector<randomizer::logic::requirement::Requirement> reqs;
|
||||
for (auto& bit : r)
|
||||
{
|
||||
reqs.push_back(bitIndex.reverseIndex[bit]);
|
||||
}
|
||||
return reqs;
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user