Merge branch 'rando-next' into bombchu-logic

This commit is contained in:
lilDavid 2022-08-25 11:23:30 -05:00 committed by GitHub
commit ad33aba9ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
166 changed files with 8755 additions and 7544 deletions

View File

@ -60,7 +60,7 @@ To build you'll need to follow the instructions from the building section.
_Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._ _Note: If you're using Visual Studio Code, the [cpack plugin](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cmake-tools) makes it very easy to just press run and debug._
_Experimental: You can also use another build system entirely rathen than MSVC like [Ninja](https://ninja-build.org/) for possibly better performance._ _Experimental: You can also use another build system entirely rather than MSVC like [Ninja](https://ninja-build.org/) for possibly better performance._
### Generating the distributable ### Generating the distributable

View File

@ -131,7 +131,7 @@ set_property(TARGET soh PROPERTY APPIMAGE_DESKTOP_FILE "${CMAKE_SOURCE_DIR}/scri
set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png") set_property(TARGET soh PROPERTY APPIMAGE_ICON_FILE "${CMAKE_BINARY_DIR}/sohIcon.png")
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
INSTALL(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage) install(PROGRAMS "${CMAKE_SOURCE_DIR}/scripts/linux/appimage/soh.sh" DESTINATION . COMPONENT appimage)
endif() endif()
find_package(Python3 COMPONENTS Interpreter) find_package(Python3 COMPONENTS Interpreter)
@ -177,10 +177,33 @@ add_custom_target(CreateOSXIcons
COMMENT "Creating OSX icons ..." COMMENT "Creating OSX icons ..."
) )
add_dependencies(soh CreateOSXIcons) add_dependencies(soh CreateOSXIcons)
add_custom_target(Assets ALL
COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/OTRGui/assets/extractor" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/extractor" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake"
COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/OTRExporter/assets" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/game" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake"
COMMAND ${CMAKE_COMMAND} -Dsrc_dir="${CMAKE_SOURCE_DIR}/soh/assets/xml" -Ddst_dir="${CMAKE_BINARY_DIR}/assets/extractor/xmls" -P "${CMAKE_SOURCE_DIR}/OTRGui/Overwrite.cmake"
)
add_dependencies(soh Assets)
install(TARGETS ZAPD DESTINATION ${CMAKE_BINARY_DIR}/assets/extractor)
set(PROGRAM_PERMISSIONS_EXECUTE OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ)
install(DIRECTORY ${CMAKE_BINARY_DIR}/assets
DESTINATION .
PATTERN ZAPD.out
PERMISSIONS ${PROGRAM_PERMISSIONS_EXECUTE}
)
install(CODE "
include(BundleUtilities)
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/soh-macos\" \"\" \"${dirs}\")
")
endif() endif()
if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS") if(CMAKE_SYSTEM_NAME MATCHES "Windows|NintendoSwitch|CafeOS")
INSTALL(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION . COMPONENT ship RENAME readme.txt ) install(FILES ${CMAKE_SOURCE_DIR}/README.md DESTINATION . COMPONENT ship RENAME readme.txt )
endif() endif()
if(CMAKE_SYSTEM_NAME MATCHES "Linux") if(CMAKE_SYSTEM_NAME MATCHES "Linux")

2
Jenkinsfile vendored
View File

@ -23,7 +23,7 @@ pipeline {
]) ])
sh ''' sh '''
cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64 cp ../../ZELOOTD.z64 OTRExporter/baserom_non_mq.z64
cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release cmake --no-warn-unused-cli -H. -Bbuild-cmake -GNinja -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64"
cmake --build build-cmake --target ExtractAssets --config Release cmake --build build-cmake --target ExtractAssets --config Release
''' '''
stash includes: 'soh/assets/**/*', name: 'assets' stash includes: 'soh/assets/**/*', name: 'assets'

View File

@ -31,10 +31,10 @@ Congratulations, you are now sailing with the Ship of Harkinian! Have fun!
The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`. The Ship of Harkinian uses a proprietary versioning system consisting of a sci-fi film character followed by a phonetic alphabet code word. The film character represents a major release version which increments with the addition of many new features and bug fixes. The code word represents a minor release version which increments with small updates mainly comprised of bug fixes. For example, `DECKARD ALFA`.
### The Extraction Tool ### Windows Rom Extraction
* Open a rom to initiate generating the `oot.otr` archive file. * Open OTRGui.exe, and select one of the supported roms listed above, to generate the `oot.otr` archive file.
* If a second button exists then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error. * If a second button already exits then `oot.otr` already exists. To prevent overwriting the old `oot.otr` use this button to choose a new game directory. The new directory must not already contain an `oot.otr` to prevent an error.
* When the process completes, place `oot.otr` beside `soh.exe` if it is not already. * When the process completes, place `oot.otr` beside `soh.exe` if it is not already.
This packaging process can take up to **5 minutes**. This packaging process can take up to **5 minutes**.
@ -42,6 +42,37 @@ This packaging process can take up to **5 minutes**.
Close the OTRGui when the `Done!` message appears. Close the OTRGui when the `Done!` message appears.
If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum. If you get another message, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum.
### Linux Rom Extraction
* Place one of the supported roms in the same folder as the appimage.
* When you run the soh appimage, it should begin generating the `oot.otr` archive file.
* When the process completes, place `oot.otr` in the same folder as the appimage, if it is not already, then run the appimage.
The packaging process can take up to **5 minutes**.
If you get any errors, then you might have selected the wrong rom. Make sure to use a rom consistent with the above checksum.
### MacOS Rom Extraction
* Run `soh.app`, and when prompted, select one of the supported roms listed above.
* You should see a notification saying `Processing OTR`, then, once the process is complete, you should get a notification saying `OTR Successfully Generated`, then the game should start.
The packing process can take up to **5 minutes**.
If you get an error saying `Incompatible ROM hash`, you have selected the wrong rom, make sure the checksum matches one of the ones listed above.
### Nintendo Switch Rom Extraction
* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform.
* Place the `.nro` and the `oot.otr` archive into a folder called `soh` in your Switch folder on your Switch
### Nintendo Wii U Rom Extraction
* Download the latest PC release of the Ship of Harkinian, and follow the instructions above for generating the `oot.otr` archive on that platform.
* Copy the `.rpx` and the `oot.otr` archive to `wiiu/apps/soh`
---
If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way. If you still cannot get the tool to work, join our [Discord Server](https://discord.com/invite/BtBmd55HVH) and ask for help in the `#support` text channel. Keep-in-mind that we do not condone piracy in any way.
### Running The Ship of Harkinian ### Running The Ship of Harkinian

View File

@ -1,7 +1,5 @@
#pragma once #pragma once
#include <cstdint>
struct Vec3f struct Vec3f
{ {
float x, y, z; float x, y, z;

View File

@ -10,7 +10,6 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "Resource.h" #include "Resource.h"
//#include "Lib/StrHash64.h"
#include "StormLib.h" #include "StormLib.h"

View File

@ -133,8 +133,6 @@ source_group("Source Files\\CustomImpl\\Utils" FILES ${Source_Files__CustomImpl_
set(Source_Files__Globals set(Source_Files__Globals
"Cvar.cpp" "Cvar.cpp"
"Cvar.h" "Cvar.h"
"GlobalCtx2.cpp"
"GlobalCtx2.h"
"LUSMacros.h" "LUSMacros.h"
"Window.cpp" "Window.cpp"
"Window.h" "Window.h"
@ -569,6 +567,10 @@ target_include_directories(${PROJECT_NAME} PRIVATE
if(MSVC) if(MSVC)
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_compile_options(${PROJECT_NAME} PRIVATE target_compile_options(${PROJECT_NAME} PRIVATE
$<$<CONFIG:Debug>:
/Od;
/Oi-
>
$<$<CONFIG:Release>: $<$<CONFIG:Release>:
/std:c++latest; /std:c++latest;
/Oi; /Oi;

View File

@ -1,12 +1,12 @@
#include "Console.h" #include "Console.h"
#include "Cvar.h" #include "Cvar.h"
#include "GlobalCtx2.h"
#include "ImGuiImpl.h" #include "ImGuiImpl.h"
#include "Lib/ImGui/imgui.h" #include "Lib/ImGui/imgui.h"
#include "Utils/StringHelper.h" #include "Utils/StringHelper.h"
#include "Lib/ImGui/imgui_internal.h" #include "Lib/ImGui/imgui_internal.h"
#include "Utils.h" #include "Utils.h"
#include <sstream>
namespace Ship { namespace Ship {
std::string BuildUsage(const CommandEntry& entry) { std::string BuildUsage(const CommandEntry& entry) {

View File

@ -6,8 +6,6 @@
#include <functional> #include <functional>
#include "Lib/ImGui/imgui.h" #include "Lib/ImGui/imgui.h"
#define NOGDI
#define WIN32_LEAN_AND_MEAN
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
namespace Ship { namespace Ship {

View File

@ -73,12 +73,7 @@ namespace Ship {
} }
void ControlDeck::WriteToPad(OSContPad* pad) const { void ControlDeck::WriteToPad(OSContPad* pad) const {
#ifdef __SWITCH__
bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0);
#else
bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0); bool shouldBlockGameInput = CVar_GetS32("gOpenMenuBar", 0) && CVar_GetS32("gControlNav", 0);
#endif
for (size_t i = 0; i < virtualDevices.size(); i++) { for (size_t i = 0; i < virtualDevices.size(); i++) {
const std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]]; const std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]];
@ -101,7 +96,7 @@ namespace Ship {
#define NESTED(key, ...) StringHelper::Sprintf("Controllers.%s.Slot_%d." key, device->GetGuid().c_str(), virtualSlot, __VA_ARGS__) #define NESTED(key, ...) StringHelper::Sprintf("Controllers.%s.Slot_%d." key, device->GetGuid().c_str(), virtualSlot, __VA_ARGS__)
void ControlDeck::LoadControllerSettings() { void ControlDeck::LoadControllerSettings() {
std::shared_ptr<Mercury> Config = GlobalCtx2::GetInstance()->GetConfig(); std::shared_ptr<Mercury> Config = Window::GetInstance()->GetConfig();
for (auto const& val : Config->rjson["Controllers"]["Deck"].items()) { for (auto const& val : Config->rjson["Controllers"]["Deck"].items()) {
int32_t slot = std::stoi(val.key().substr(5)); int32_t slot = std::stoi(val.key().substr(5));
@ -187,7 +182,7 @@ namespace Ship {
} }
void ControlDeck::SaveControllerSettings() { void ControlDeck::SaveControllerSettings() {
std::shared_ptr<Mercury> Config = GlobalCtx2::GetInstance()->GetConfig(); std::shared_ptr<Mercury> Config = Window::GetInstance()->GetConfig();
for (size_t i = 0; i < virtualDevices.size(); i++) { for (size_t i = 0; i < virtualDevices.size(); i++) {
std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]]; std::shared_ptr<Controller> backend = physicalDevices[virtualDevices[i]];

View File

@ -5,7 +5,7 @@
#include <memory> #include <memory>
#include <utility> #include <utility>
#include <Utils/File.h> #include <Utils/File.h>
#include "GlobalCtx2.h" #include "Window.h"
std::map<std::string, std::unique_ptr<CVar>, std::less<>> cvars; std::map<std::string, std::unique_ptr<CVar>, std::less<>> cvars;
@ -144,7 +144,7 @@ template <typename Numeric> bool is_number(const std::string& s) {
} }
void CVar_LoadLegacy() { void CVar_LoadLegacy() {
auto cvarsConfig = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("cvars.cfg"); auto cvarsConfig = Ship::Window::GetPathRelativeToAppDirectory("cvars.cfg");
if (File::Exists(cvarsConfig)) { if (File::Exists(cvarsConfig)) {
const auto lines = File::ReadAllLines(cvarsConfig); const auto lines = File::ReadAllLines(cvarsConfig);
@ -191,7 +191,7 @@ void CVar_LoadLegacy() {
extern "C" void CVar_Load() { extern "C" void CVar_Load() {
std::shared_ptr<Mercury> pConf = Ship::GlobalCtx2::GetInstance()->GetConfig(); std::shared_ptr<Mercury> pConf = Ship::Window::GetInstance()->GetConfig();
pConf->reload(); pConf->reload();
for (const auto& item : pConf->rjson["CVars"].items()) { for (const auto& item : pConf->rjson["CVars"].items()) {
@ -235,7 +235,7 @@ extern "C" void CVar_Load() {
extern "C" void CVar_Save() extern "C" void CVar_Save()
{ {
std::shared_ptr<Mercury> pConf = Ship::GlobalCtx2::GetInstance()->GetConfig(); std::shared_ptr<Mercury> pConf = Ship::Window::GetInstance()->GetConfig();
for (const auto& cvar : cvars) { for (const auto& cvar : cvars) {
const std::string key = StringHelper::Sprintf("CVars.%s", cvar.first.c_str()); const std::string key = StringHelper::Sprintf("CVars.%s", cvar.first.c_str());
@ -251,9 +251,9 @@ extern "C" void CVar_Save()
auto keyStr = key.c_str(); auto keyStr = key.c_str();
Color_RGBA8 clr = cvar.second->value.valueRGBA; Color_RGBA8 clr = cvar.second->value.valueRGBA;
pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r); pConf->setUInt(StringHelper::Sprintf("%s.R", keyStr), clr.r);
pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.r); pConf->setUInt(StringHelper::Sprintf("%s.G", keyStr), clr.g);
pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.r); pConf->setUInt(StringHelper::Sprintf("%s.B", keyStr), clr.b);
pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.r); pConf->setUInt(StringHelper::Sprintf("%s.A", keyStr), clr.a);
pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType); pConf->setString(StringHelper::Sprintf("%s.Type", keyStr), mercuryRGBAObjectType);
} }
} }

View File

@ -2,7 +2,8 @@
#include <string> #include <string>
#include <memory> #include <memory>
#include "GlobalCtx2.h" #include <mutex>
#include <condition_variable>
namespace Ship { namespace Ship {
class Archive; class Archive;

View File

@ -45,7 +45,7 @@ namespace Ship {
void GameOverlay::LoadFont(const std::string& name, const std::string& path, float fontSize) { void GameOverlay::LoadFont(const std::string& name, const std::string& path, float fontSize) {
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
std::shared_ptr<Archive> base = GlobalCtx2::GetInstance()->GetResourceManager()->GetArchive(); std::shared_ptr<Archive> base = Window::GetInstance()->GetResourceManager()->GetArchive();
std::shared_ptr<File> font = std::make_shared<File>(); std::shared_ptr<File> font = std::make_shared<File>();
base->LoadFile(path, false, font); base->LoadFile(path, false, font);
if (font->bIsLoaded) { if (font->bIsLoaded) {

View File

@ -1,149 +0,0 @@
#include "GlobalCtx2.h"
#include <iostream>
#include <vector>
#include "ResourceMgr.h"
#include "Window.h"
#include "spdlog/async.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/sohconsole_sink.h"
#ifdef __APPLE__
#include "OSXFolderManager.h"
#elif defined(__SWITCH__)
#include "SwitchImpl.h"
#elif defined(__WIIU__)
#include "WiiUImpl.h"
#endif
namespace Ship {
std::weak_ptr<GlobalCtx2> GlobalCtx2::Context;
std::shared_ptr<GlobalCtx2> GlobalCtx2::GetInstance() {
return Context.lock();
}
std::shared_ptr<GlobalCtx2> GlobalCtx2::CreateInstance(const std::string& Name) {
if (Context.expired()) {
auto Shared = std::make_shared<GlobalCtx2>(Name);
Context = Shared;
Shared->InitWindow();
return Shared;
} else {
SPDLOG_DEBUG("Trying to create a context when it already exists.");
}
return GetInstance();
}
std::string GlobalCtx2::GetAppDirectoryPath() {
#ifdef __APPLE__
FolderManager folderManager;
std::string fpath = std::string(folderManager.pathForDirectory(NSApplicationSupportDirectory, NSUserDomainMask));
fpath.append("/com.shipofharkinian.soh");
return fpath;
#endif
return ".";
}
std::string GlobalCtx2::GetPathRelativeToAppDirectory(const char* path) {
return GlobalCtx2::GetAppDirectoryPath() + "/" + path;
}
GlobalCtx2::GlobalCtx2(std::string Name) : Name(std::move(Name)) {
}
GlobalCtx2::~GlobalCtx2() {
SPDLOG_INFO("destruct GlobalCtx2");
}
void GlobalCtx2::InitWindow() {
InitLogging();
Config = std::make_shared<Mercury>(GetPathRelativeToAppDirectory("shipofharkinian.json"));
MainPath = Config->getString("Game.Main Archive", GetPathRelativeToAppDirectory("oot.otr"));
PatchesPath = Config->getString("Game.Patches Archive", GetAppDirectoryPath() + "/mods");
ResMan = std::make_shared<ResourceMgr>(GetInstance(), MainPath, PatchesPath);
Win = std::make_shared<Window>(GetInstance());
if (!ResMan->DidLoadSuccessfully())
{
#ifdef _WIN32
MessageBox(nullptr, L"Main OTR file not found!", L"Uh oh", MB_OK);
#elif defined(__SWITCH__)
printf("Main OTR file not found!\n");
#elif defined(__WIIU__)
Ship::WiiU::ThrowMissingOTR(MainPath.c_str());
#else
SPDLOG_ERROR("Main OTR file not found!");
#endif
exit(1);
}
#ifdef __SWITCH__
Ship::Switch::Init(PostInitPhase);
#endif
}
void GlobalCtx2::InitLogging() {
try {
// Setup Logging
spdlog::init_thread_pool(8192, 1);
std::vector<spdlog::sink_ptr> Sinks;
auto SohConsoleSink = std::make_shared<spdlog::sinks::soh_sink_mt>();
SohConsoleSink->set_level(spdlog::level::trace);
Sinks.push_back(SohConsoleSink);
#if (!defined(_WIN32) && !defined(__WIIU__)) || defined(_DEBUG)
auto ConsoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
ConsoleSink->set_level(spdlog::level::trace);
Sinks.push_back(ConsoleSink);
#endif
#ifndef __WIIU__
auto logPath = GetPathRelativeToAppDirectory(("logs/" + GetName() + ".log").c_str());
auto FileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logPath, 1024 * 1024 * 10, 10);
FileSink->set_level(spdlog::level::trace);
Sinks.push_back(FileSink);
#endif
Logger = std::make_shared<spdlog::async_logger>(GetName(), Sinks.begin(), Sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
GetLogger()->set_level(spdlog::level::trace);
#ifndef __WIIU__
GetLogger()->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%@] [%l] %v");
#else
GetLogger()->set_pattern("[%s:%#] [%l] %v");
#endif
spdlog::register_logger(GetLogger());
spdlog::set_default_logger(GetLogger());
}
catch (const spdlog::spdlog_ex& ex) {
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}
void GlobalCtx2::WriteSaveFile(const std::filesystem::path& savePath, const uintptr_t addr, void* dramAddr, const size_t size) {
std::ofstream saveFile = std::ofstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
saveFile.seekp(addr);
saveFile.write((char*)dramAddr, size);
saveFile.close();
}
void GlobalCtx2::ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size) {
std::ifstream saveFile = std::ifstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
// If the file doesn't exist, initialize DRAM
if (saveFile.good()) {
saveFile.seekg(addr);
saveFile.read((char*)dramAddr, size);
} else {
memset(dramAddr, 0, size);
}
saveFile.close();
}
}

View File

@ -1,54 +0,0 @@
#ifndef GLOBAL_CTX_2
#define GLOBAL_CTX_2
#pragma once
#ifdef __cplusplus
#include <filesystem>
#include <memory>
#include <fstream>
#include "spdlog/spdlog.h"
#include "Lib/Mercury/Mercury.h"
namespace Ship {
class ResourceMgr;
class Window;
class GlobalCtx2 {
public:
static std::shared_ptr<GlobalCtx2> GetInstance();
static std::shared_ptr<GlobalCtx2> CreateInstance(const std::string& Name);
std::string GetName() { return Name; }
std::shared_ptr<Window> GetWindow() { return Win; }
std::shared_ptr<ResourceMgr> GetResourceManager() { return ResMan; }
std::shared_ptr<spdlog::logger> GetLogger() { return Logger; }
std::shared_ptr<Mercury> GetConfig() { return Config; }
static std::string GetAppDirectoryPath();
static std::string GetPathRelativeToAppDirectory(const char* path);
void WriteSaveFile(const std::filesystem::path& savePath, uintptr_t addr, void* dramAddr, size_t size);
void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
GlobalCtx2(std::string Name);
~GlobalCtx2();
protected:
void InitWindow();
void InitLogging();
private:
static std::weak_ptr <GlobalCtx2> Context;
std::shared_ptr<spdlog::logger> Logger;
std::shared_ptr<Window> Win;
std::shared_ptr<Mercury> Config; // Config needs to be after the Window because we call the Window during it's destructor.
std::shared_ptr<ResourceMgr> ResMan;
std::string Name;
std::string MainPath;
std::string PatchesPath;
};
}
#endif
#endif

View File

@ -18,7 +18,6 @@
#include "Hooks.h" #include "Hooks.h"
#define IMGUI_DEFINE_MATH_OPERATORS #define IMGUI_DEFINE_MATH_OPERATORS
#include "Lib/ImGui/imgui_internal.h" #include "Lib/ImGui/imgui_internal.h"
#include "GlobalCtx2.h"
#include "ResourceMgr.h" #include "ResourceMgr.h"
#include "Window.h" #include "Window.h"
#include "Cvar.h" #include "Cvar.h"
@ -42,8 +41,10 @@
#if __APPLE__ #if __APPLE__
#include <SDL_hints.h> #include <SDL_hints.h>
#include <SDL_video.h>
#else #else
#include <SDL2/SDL_hints.h> #include <SDL2/SDL_hints.h>
#include <SDL2/SDL_video.h>
#endif #endif
#ifdef __SWITCH__ #ifdef __SWITCH__
@ -164,7 +165,13 @@ namespace SohImGui {
} else { } else {
console->Close(); console->Close();
} }
SohImGui::controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0);
if (CVar_GetS32("gControllerConfigurationEnabled", 0)) {
controller->Open();
} else {
controller->Close();
}
UpdateAudio(); UpdateAudio();
}); });
} }
@ -338,6 +345,8 @@ namespace SohImGui {
switch (impl.backend) { switch (impl.backend) {
case Backend::DX11: case Backend::DX11:
return true; return true;
case Backend::SDL:
return true;
default: default:
return false; return false;
} }
@ -345,27 +354,27 @@ namespace SohImGui {
void ShowCursor(bool hide, Dialogues d) { void ShowCursor(bool hide, Dialogues d) {
if (d == Dialogues::dLoadSettings) { if (d == Dialogues::dLoadSettings) {
GlobalCtx2::GetInstance()->GetWindow()->ShowCursor(hide); Window::GetInstance()->ShowCursor(hide);
return; return;
} }
if (d == Dialogues::dConsole && CVar_GetS32("gOpenMenuBar", 0)) { if (d == Dialogues::dConsole && CVar_GetS32("gOpenMenuBar", 0)) {
return; return;
} }
if (!GlobalCtx2::GetInstance()->GetWindow()->IsFullscreen()) { if (!Window::GetInstance()->IsFullscreen()) {
oldCursorState = false; oldCursorState = false;
return; return;
} }
if (oldCursorState != hide) { if (oldCursorState != hide) {
oldCursorState = hide; oldCursorState = hide;
GlobalCtx2::GetInstance()->GetWindow()->ShowCursor(hide); Window::GetInstance()->ShowCursor(hide);
} }
} }
void LoadTexture(const std::string& name, const std::string& path) { void LoadTexture(const std::string& name, const std::string& path) {
GfxRenderingAPI* api = gfx_get_current_rendering_api(); GfxRenderingAPI* api = gfx_get_current_rendering_api();
const auto res = GlobalCtx2::GetInstance()->GetResourceManager()->LoadFile(path); const auto res = Window::GetInstance()->GetResourceManager()->LoadFile(path);
const auto asset = new GameAsset{ api->new_texture() }; const auto asset = new GameAsset{ api->new_texture() };
uint8_t* img_data = stbi_load_from_memory(reinterpret_cast<const stbi_uc*>(res->buffer.get()), res->dwBufferSize, &asset->width, &asset->height, nullptr, 4); uint8_t* img_data = stbi_load_from_memory(reinterpret_cast<const stbi_uc*>(res->buffer.get()), res->dwBufferSize, &asset->width, &asset->height, nullptr, 4);
@ -401,7 +410,7 @@ namespace SohImGui {
void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint) { void LoadResource(const std::string& name, const std::string& path, const ImVec4& tint) {
GfxRenderingAPI* api = gfx_get_current_rendering_api(); GfxRenderingAPI* api = gfx_get_current_rendering_api();
const auto res = static_cast<Ship::Texture*>(GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(path).get()); const auto res = static_cast<Ship::Texture*>(Window::GetInstance()->GetResourceManager()->LoadResource(path).get());
std::vector<uint8_t> texBuffer; std::vector<uint8_t> texBuffer;
texBuffer.reserve(res->width * res->height * 4); texBuffer.reserve(res->width * res->height * 4);
@ -452,6 +461,8 @@ namespace SohImGui {
io->ConfigFlags |= ImGuiConfigFlags_DockingEnable; io->ConfigFlags |= ImGuiConfigFlags_DockingEnable;
io->Fonts->AddFontDefault(); io->Fonts->AddFontDefault();
statsWindowOpen = CVar_GetS32("gStatsEnabled", 0); statsWindowOpen = CVar_GetS32("gStatsEnabled", 0);
CVar_RegisterS32("gRandomizeRupeeNames", 1);
CVar_RegisterS32("gRandoRelevantNavi", 1);
#ifdef __SWITCH__ #ifdef __SWITCH__
Ship::Switch::SetupFont(io->Fonts); Ship::Switch::SetupFont(io->Fonts);
#endif #endif
@ -466,7 +477,7 @@ namespace SohImGui {
io->DisplaySize.y = window_impl.gx2.height; io->DisplaySize.y = window_impl.gx2.height;
#endif #endif
lastBackendID = GetBackendID(GlobalCtx2::GetInstance()->GetConfig()); lastBackendID = GetBackendID(Window::GetInstance()->GetConfig());
if (CVar_GetS32("gOpenMenuBar", 0) != 1) { if (CVar_GetS32("gOpenMenuBar", 0) != 1) {
#if defined(__SWITCH__) || defined(__WIIU__) #if defined(__SWITCH__) || defined(__WIIU__)
SohImGui::overlay->TextDrawNotification(30.0f, true, "Press - to access enhancements menu"); SohImGui::overlay->TextDrawNotification(30.0f, true, "Press - to access enhancements menu");
@ -475,8 +486,8 @@ namespace SohImGui {
#endif #endif
} }
auto imguiIniPath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("imgui.ini"); auto imguiIniPath = Ship::Window::GetPathRelativeToAppDirectory("imgui.ini");
auto imguiLogPath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("imgui_log.txt"); auto imguiLogPath = Ship::Window::GetPathRelativeToAppDirectory("imgui_log.txt");
io->IniFilename = strcpy(new char[imguiIniPath.length() + 1], imguiIniPath.c_str()); io->IniFilename = strcpy(new char[imguiIniPath.length() + 1], imguiIniPath.c_str());
io->LogFilename = strcpy(new char[imguiLogPath.length() + 1], imguiLogPath.c_str()); io->LogFilename = strcpy(new char[imguiLogPath.length() + 1], imguiLogPath.c_str());
@ -484,12 +495,7 @@ namespace SohImGui {
io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; io->ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;
} }
#ifdef __SWITCH__ if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) {
bool enableControllerNavigation = true;
#else
bool enableControllerNavigation = CVar_GetS32("gControlNav", 0);
#endif
if (enableControllerNavigation && CVar_GetS32("gOpenMenuBar", 0)) {
io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard;
} else { } else {
io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad;
@ -505,7 +511,7 @@ namespace SohImGui {
#endif #endif
Ship::RegisterHook<Ship::GfxInit>([] { Ship::RegisterHook<Ship::GfxInit>([] {
if (GlobalCtx2::GetInstance()->GetWindow()->IsFullscreen()) if (Window::GetInstance()->IsFullscreen())
ShowCursor(CVar_GetS32("gOpenMenuBar", 0), Dialogues::dLoadSettings); ShowCursor(CVar_GetS32("gOpenMenuBar", 0), Dialogues::dLoadSettings);
LoadTexture("Game_Icon", "assets/ship_of_harkinian/icons/gSohIcon.png"); LoadTexture("Game_Icon", "assets/ship_of_harkinian/icons/gSohIcon.png");
@ -605,13 +611,101 @@ namespace SohImGui {
ImGui::Text("%s", text); ImGui::Text("%s", text);
} }
void EnhancementCheckbox(const char* text, const char* cvarName) void RenderCross(ImDrawList* draw_list, ImVec2 pos, ImU32 col, float sz)
{ {
float thickness = ImMax(sz / 5.0f, 1.0f);
sz -= thickness * 0.5f;
pos += ImVec2(thickness * 0.25f, thickness * 0.25f);
draw_list->PathLineTo(ImVec2(pos.x, pos.y));
draw_list->PathLineTo(ImVec2(pos.x + sz, pos.y + sz));
draw_list->PathStroke(col, 0, thickness);
draw_list->PathLineTo(ImVec2(pos.x + sz, pos.y));
draw_list->PathLineTo(ImVec2(pos.x, pos.y + sz));
draw_list->PathStroke(col, 0, thickness);
}
bool CustomCheckbox(const char* label, bool* v, bool disabled, ImGuiCheckboxGraphics disabledGraphic) {
ImGuiWindow* window = ImGui::GetCurrentWindow();
if (window->SkipItems)
return false;
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true);
const float square_sz = ImGui::GetFrameHeight();
const ImVec2 pos = window->DC.CursorPos;
const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f));
ImGui::ItemSize(total_bb, style.FramePadding.y);
if (!ImGui::ItemAdd(total_bb, id))
{
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
return false;
}
bool hovered, held;
bool pressed = ImGui::ButtonBehavior(total_bb, id, &hovered, &held);
if (pressed)
{
*v = !(*v);
ImGui::MarkItemEdited(id);
}
const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz));
ImGui::RenderNavHighlight(total_bb, id);
ImGui::RenderFrame(check_bb.Min, check_bb.Max, ImGui::GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
ImU32 check_col = ImGui::GetColorU32(ImGuiCol_CheckMark);
ImU32 cross_col = ImGui::GetColorU32(ImVec4(0.50f, 0.50f, 0.50f, 1.00f));
bool mixed_value = (g.LastItemData.InFlags & ImGuiItemFlags_MixedValue) != 0;
if (mixed_value)
{
// Undocumented tristate/mixed/indeterminate checkbox (#2644)
// This may seem awkwardly designed because the aim is to make ImGuiItemFlags_MixedValue supported by all widgets (not just checkbox)
ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)));
window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding);
}
else if ((!disabled && *v) || (disabled && disabledGraphic == ImGuiCheckboxGraphics::Checkmark))
{
const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f));
ImGui::RenderCheckMark(window->DrawList, check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad * 2.0f);
}
else if (disabled && disabledGraphic == ImGuiCheckboxGraphics::Cross) {
const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f));
RenderCross(window->DrawList, check_bb.Min + ImVec2(pad, pad), cross_col, square_sz - pad * 2.0f);
}
ImVec2 label_pos = ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y);
if (g.LogEnabled)
ImGui::LogRenderedText(&label_pos, mixed_value ? "[~]" : *v ? "[x]" : "[ ]");
if (label_size.x > 0.0f)
ImGui::RenderText(label_pos, label);
IMGUI_TEST_ENGINE_ITEM_INFO(id, label, g.LastItemData.StatusFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
return pressed;
}
void EnhancementCheckbox(const char* text, const char* cvarName, bool disabled, const char* disabledTooltipText, ImGuiCheckboxGraphics disabledGraphic)
{
if (disabled) {
ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true);
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f);
}
bool val = (bool)CVar_GetS32(cvarName, 0); bool val = (bool)CVar_GetS32(cvarName, 0);
if (ImGui::Checkbox(text, &val)) { if (CustomCheckbox(text, &val, disabled, disabledGraphic)) {
CVar_SetS32(cvarName, val); CVar_SetS32(cvarName, val);
needs_save = true; needs_save = true;
} }
if (disabled) {
ImGui::PopStyleVar(1);
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled) && disabledTooltipText != "") {
ImGui::SetTooltip("%s", disabledTooltipText);
}
ImGui::PopItemFlag();
}
} }
void EnhancementButton(const char* text, const char* cvarName) void EnhancementButton(const char* text, const char* cvarName)
@ -758,12 +852,7 @@ namespace SohImGui {
} }
void RandomizeColor(const char* cvarName, ImVec4* colors) { void RandomizeColor(const char* cvarName, ImVec4* colors) {
std::string Cvar_Red = cvarName; Color_RGBA8 NewColors = {0,0,0,255};
Cvar_Red += "R";
std::string Cvar_Green = cvarName;
Cvar_Green += "G";
std::string Cvar_Blue = cvarName;
Cvar_Blue += "B";
std::string Cvar_RBM = cvarName; std::string Cvar_RBM = cvarName;
Cvar_RBM += "RBM"; Cvar_RBM += "RBM";
std::string MakeInvisible = "##"; std::string MakeInvisible = "##";
@ -778,9 +867,10 @@ namespace SohImGui {
colors->x = (float)RND_R / 255; colors->x = (float)RND_R / 255;
colors->y = (float)RND_G / 255; colors->y = (float)RND_G / 255;
colors->z = (float)RND_B / 255; colors->z = (float)RND_B / 255;
CVar_SetS32(Cvar_Red.c_str(), ClampFloatToInt(colors->x * 255, 0, 255)); NewColors.r = ClampFloatToInt(colors->x * 255, 0, 255);
CVar_SetS32(Cvar_Green.c_str(), ClampFloatToInt(colors->y * 255, 0, 255)); NewColors.g = ClampFloatToInt(colors->y * 255, 0, 255);
CVar_SetS32(Cvar_Blue.c_str(), ClampFloatToInt(colors->z * 255, 0, 255)); NewColors.b = ClampFloatToInt(colors->z * 255, 0, 255);
CVar_SetRGBA(cvarName, NewColors);
CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode. CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode.
needs_save = true; needs_save = true;
} }
@ -807,16 +897,16 @@ namespace SohImGui {
MakeInvisible += cvarName; MakeInvisible += cvarName;
MakeInvisible += "Reset"; MakeInvisible += "Reset";
if (ImGui::Button(MakeInvisible.c_str())) { if (ImGui::Button(MakeInvisible.c_str())) {
colors->x = defaultcolors.x / 255; colors->x = defaultcolors.x;
colors->y = defaultcolors.y / 255; colors->y = defaultcolors.y;
colors->z = defaultcolors.z / 255; colors->z = defaultcolors.z;
if (has_alpha) { colors->w = defaultcolors.w / 255; }; if (has_alpha) { colors->w = defaultcolors.w; };
Color_RGBA8 colorsRGBA; Color_RGBA8 colorsRGBA;
colorsRGBA.r = defaultcolors.x / 255; colorsRGBA.r = defaultcolors.x;
colorsRGBA.g = defaultcolors.y / 255; colorsRGBA.g = defaultcolors.y;
colorsRGBA.b = defaultcolors.z / 255; colorsRGBA.b = defaultcolors.z;
if (has_alpha) { colorsRGBA.a = defaultcolors.w / 255; }; if (has_alpha) { colorsRGBA.a = defaultcolors.w; };
CVar_SetRGBA(cvarName, colorsRGBA); CVar_SetRGBA(cvarName, colorsRGBA);
CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode. CVar_SetS32(Cvar_RBM.c_str(), 0); //On click disable rainbow mode.
@ -888,8 +978,8 @@ namespace SohImGui {
ImGuiWMNewFrame(); ImGuiWMNewFrame();
ImGui::NewFrame(); ImGui::NewFrame();
const std::shared_ptr<Window> wnd = GlobalCtx2::GetInstance()->GetWindow(); const std::shared_ptr<Window> wnd = Window::GetInstance();
const std::shared_ptr<Mercury> pConf = GlobalCtx2::GetInstance()->GetConfig(); const std::shared_ptr<Mercury> pConf = Window::GetInstance()->GetConfig();
ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBackground | ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking | ImGuiWindowFlags_NoBackground |
ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoMove |
@ -921,19 +1011,15 @@ namespace SohImGui {
ImGui::DockSpace(dockId, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None | ImGuiDockNodeFlags_NoDockingInCentralNode); ImGui::DockSpace(dockId, ImVec2(0.0f, 0.0f), ImGuiDockNodeFlags_None | ImGuiDockNodeFlags_NoDockingInCentralNode);
if (ImGui::IsKeyPressed(TOGGLE_BTN) || ImGui::IsKeyPressed(TOGGLE_PAD_BTN)) { if (ImGui::IsKeyPressed(TOGGLE_BTN) ||
(ImGui::IsKeyPressed(TOGGLE_PAD_BTN) && CVar_GetS32("gControlNav", 0))) {
bool menu_bar = CVar_GetS32("gOpenMenuBar", 0); bool menu_bar = CVar_GetS32("gOpenMenuBar", 0);
CVar_SetS32("gOpenMenuBar", !menu_bar); CVar_SetS32("gOpenMenuBar", !menu_bar);
needs_save = true; needs_save = true;
GlobalCtx2::GetInstance()->GetWindow()->SetMenuBar(menu_bar); Window::GetInstance()->SetMenuBar(menu_bar);
ShowCursor(menu_bar, Dialogues::dMenubar); ShowCursor(menu_bar, Dialogues::dMenubar);
GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->SaveControllerSettings(); Window::GetInstance()->GetControlDeck()->SaveControllerSettings();
#ifdef __SWITCH__ if (CVar_GetS32("gControlNav", 0) && CVar_GetS32("gOpenMenuBar", 0)) {
bool enableControllerNavigation = true;
#else
bool enableControllerNavigation = CVar_GetS32("gControlNav", 0);
#endif
if (enableControllerNavigation && CVar_GetS32("gOpenMenuBar", 0)) {
io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard; io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad | ImGuiConfigFlags_NavEnableKeyboard;
} else { } else {
io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad; io->ConfigFlags &= ~ImGuiConfigFlags_NavEnableGamepad;
@ -1018,7 +1104,11 @@ namespace SohImGui {
bool currentValue = CVar_GetS32("gControllerConfigurationEnabled", 0); bool currentValue = CVar_GetS32("gControllerConfigurationEnabled", 0);
CVar_SetS32("gControllerConfigurationEnabled", !currentValue); CVar_SetS32("gControllerConfigurationEnabled", !currentValue);
needs_save = true; needs_save = true;
controller->Opened = CVar_GetS32("gControllerConfigurationEnabled", 0); if (CVar_GetS32("gControllerConfigurationEnabled", 0)) {
controller->Open();
} else {
controller->Close();
}
} }
ImGui::PopStyleColor(1); ImGui::PopStyleColor(1);
ImGui::PopStyleVar(3); ImGui::PopStyleVar(3);
@ -1223,6 +1313,8 @@ namespace SohImGui {
Tooltip("The default response to Kaepora Gaebora is always that you understood what he said"); Tooltip("The default response to Kaepora Gaebora is always that you understood what he said");
PaddedEnhancementCheckbox("Fast Ocarina Playback", "gFastOcarinaPlayback", true, false); PaddedEnhancementCheckbox("Fast Ocarina Playback", "gFastOcarinaPlayback", true, false);
Tooltip("Skip the part where the Ocarina playback is called when you play a song"); Tooltip("Skip the part where the Ocarina playback is called when you play a song");
PaddedEnhancementCheckbox("Skip Scarecrow Song", "gSkipScarecrow", true, false);
Tooltip("Pierre appears when Ocarina is pulled out. Requires learning scarecrow song.");
PaddedEnhancementCheckbox("Instant Putaway", "gInstantPutaway", true, false); PaddedEnhancementCheckbox("Instant Putaway", "gInstantPutaway", true, false);
Tooltip("Allow Link to put items away without having to wait around"); Tooltip("Allow Link to put items away without having to wait around");
PaddedEnhancementCheckbox("Instant Boomerang Recall", "gFastBoomerang", true, false); PaddedEnhancementCheckbox("Instant Boomerang Recall", "gFastBoomerang", true, false);
@ -1277,6 +1369,8 @@ namespace SohImGui {
); );
PaddedEnhancementCheckbox("No Random Drops", "gNoRandomDrops", true, false); PaddedEnhancementCheckbox("No Random Drops", "gNoRandomDrops", true, false);
Tooltip("Disables random drops, except from the Goron Pot, Dampe, and bosses"); Tooltip("Disables random drops, except from the Goron Pot, Dampe, and bosses");
PaddedEnhancementCheckbox("Enable Bombchu Drops", "gBombchuDrops", true, false);
Tooltip("Bombchus will sometimes drop in place of bombs");
PaddedEnhancementCheckbox("No Heart Drops", "gNoHeartDrops", true, false); PaddedEnhancementCheckbox("No Heart Drops", "gNoHeartDrops", true, false);
Tooltip("Disables heart drops, but not heart placements, like from a Deku Scrub running off\nThis simulates Hero Mode from other games in the series"); Tooltip("Disables heart drops, but not heart placements, like from a Deku Scrub running off\nThis simulates Hero Mode from other games in the series");
PaddedEnhancementCheckbox("Always Win Goron Pot", "gGoronPot", true, false); PaddedEnhancementCheckbox("Always Win Goron Pot", "gGoronPot", true, false);
@ -1511,6 +1605,7 @@ namespace SohImGui {
Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64"); Tooltip("Restores N64 Weird Frames allowing weirdshots to behave the same as N64");
PaddedEnhancementCheckbox("Bombchus out of bounds", "gBombchusOOB", true, false); PaddedEnhancementCheckbox("Bombchus out of bounds", "gBombchusOOB", true, false);
Tooltip("Allows bombchus to explode out of bounds\nSimilar to GameCube and Wii VC"); Tooltip("Allows bombchus to explode out of bounds\nSimilar to GameCube and Wii VC");
PaddedEnhancementCheckbox("Restore old Gold Skulltula cutscene", "gGsCutscene", true, false);
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -1906,11 +2001,21 @@ namespace SohImGui {
if (ImGui::BeginMenu("Rando Enhancements")) if (ImGui::BeginMenu("Rando Enhancements"))
{ {
EnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares"); EnhancementCheckbox("Rando-Relevant Navi Hints", "gRandoRelevantNavi");
Tooltip( Tooltip(
"Play unique fanfares when obtaining quest items\n" "Replace Navi's overworld quest hints with rando-related gameplay hints."
"(medallions/stones/songs). Note that these fanfares\n" );
"are longer than usual." PaddedEnhancementCheckbox("Random Rupee Names", "gRandomizeRupeeNames", true, false);
Tooltip(
"When obtaining rupees, randomize what the rupee is called in the textbox."
);
PaddedEnhancementCheckbox("Key Colors Match Dungeon", "gRandoMatchKeyColors", true, false);
Tooltip(
"Matches the color of small keys and boss keys to the dungeon they belong to. This helps identify keys from afar and adds a little bit of flair.");
PaddedEnhancementCheckbox("Quest Item Fanfares", "gRandoQuestItemFanfares", true, false);
Tooltip(
"Play unique fanfares when obtaining quest items "
"(medallions/stones/songs). Note that these fanfares are longer than usual."
); );
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -2166,6 +2271,8 @@ namespace SohImGui {
CVar_SetS32("gNoRandomDrops", 0); CVar_SetS32("gNoRandomDrops", 0);
// No Heart Drops // No Heart Drops
CVar_SetS32("gNoHeartDrops", 0); CVar_SetS32("gNoHeartDrops", 0);
// Enable Bombchu Drops
CVar_SetS32("gBombchuDrops", 0);
// Always Win Goron Pot // Always Win Goron Pot
CVar_SetS32("gGoronPot", 0); CVar_SetS32("gGoronPot", 0);
@ -2297,6 +2404,7 @@ namespace SohImGui {
// Bombchus out of bounds // Bombchus out of bounds
CVar_SetS32("gBombchusOOB", 0); CVar_SetS32("gBombchusOOB", 0);
CVar_SetS32("gGsCutscene", 0);
// Autosave // Autosave
CVar_SetS32("gAutosave", 0); CVar_SetS32("gAutosave", 0);
} }
@ -2416,6 +2524,8 @@ namespace SohImGui {
CVar_SetS32("gVisualAgony", 1); CVar_SetS32("gVisualAgony", 1);
// Pull grave during the day // Pull grave during the day
CVar_SetS32("gDayGravePull", 1); CVar_SetS32("gDayGravePull", 1);
// Pull out Ocarina to Summon Scarecrow
CVar_SetS32("gSkipScarecrow", 0);
// Pause link animation (0 to 16) // Pause link animation (0 to 16)
CVar_SetS32("gPauseLiveLink", 16); CVar_SetS32("gPauseLiveLink", 16);
@ -2427,8 +2537,18 @@ namespace SohImGui {
ImGui::Render(); ImGui::Render();
ImGuiRenderDrawData(ImGui::GetDrawData()); ImGuiRenderDrawData(ImGui::GetDrawData());
if (UseViewports()) { if (UseViewports()) {
if (impl.backend == Backend::SDL) {
SDL_Window* backup_current_window = SDL_GL_GetCurrentWindow();
SDL_GLContext backup_current_context = SDL_GL_GetCurrentContext();
ImGui::UpdatePlatformWindows(); ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault(); ImGui::RenderPlatformWindowsDefault();
SDL_GL_MakeCurrent(backup_current_window, backup_current_context);
} else {
ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindowsDefault();
}
} }
} }
@ -2659,11 +2779,11 @@ namespace SohImGui {
} }
} }
void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop, bool padBottom) { void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop, bool padBottom, bool disabled, const char* disabledTooltipText, ImGuiCheckboxGraphics disabledGraphic) {
if (padTop) { if (padTop) {
ImGui::Dummy(ImVec2(0.0f, 0.0f)); ImGui::Dummy(ImVec2(0.0f, 0.0f));
} }
EnhancementCheckbox(text, cvarName); EnhancementCheckbox(text, cvarName, disabled, disabledTooltipText, disabledGraphic);
if (padBottom) { if (padBottom) {
ImGui::Dummy(ImVec2(0.0f, 0.0f)); ImGui::Dummy(ImVec2(0.0f, 0.0f));
} }

View File

@ -34,6 +34,14 @@ namespace SohImGui {
dLoadSettings, dLoadSettings,
}; };
// Enumeration for disabled checkbox graphics
enum class ImGuiCheckboxGraphics
{
Cross,
Checkmark,
None
};
typedef struct { typedef struct {
Backend backend; Backend backend;
union { union {
@ -86,7 +94,7 @@ namespace SohImGui {
void Tooltip(const char* text); void Tooltip(const char* text);
void EnhancementRadioButton(const char* text, const char* cvarName, int id); void EnhancementRadioButton(const char* text, const char* cvarName, int id);
void EnhancementCheckbox(const char* text, const char* cvarName); void EnhancementCheckbox(const char* text, const char* cvarName, bool disabled = false, const char* disabledTooltipText = "", ImGuiCheckboxGraphics disabledGraphic = ImGuiCheckboxGraphics::Cross);
void EnhancementButton(const char* text, const char* cvarName); void EnhancementButton(const char* text, const char* cvarName);
void EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = false); void EnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = false);
void EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton = false); void EnhancementSliderFloat(const char* text, const char* id, const char* cvarName, float min, float max, const char* format, float defaultValue, bool isPercentage, bool PlusMinusButton = false);
@ -123,7 +131,7 @@ namespace SohImGui {
void InsertPadding(float extraVerticalPadding = 0.0f); void InsertPadding(float extraVerticalPadding = 0.0f);
void PaddedSeparator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, float extraVerticalBottomPadding = 0.0f); void PaddedSeparator(bool padTop = true, bool padBottom = true, float extraVerticalTopPadding = 0.0f, float extraVerticalBottomPadding = 0.0f);
void PaddedEnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = false, bool padTop = true, bool padBottom = true); void PaddedEnhancementSliderInt(const char* text, const char* id, const char* cvarName, int min, int max, const char* format, int defaultValue = 0, bool PlusMinusButton = false, bool padTop = true, bool padBottom = true);
void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop = true, bool padBottom = true); void PaddedEnhancementCheckbox(const char* text, const char* cvarName, bool padTop = true, bool padBottom = true, bool disabled = false, const char* disabledTooltipText = "", ImGuiCheckboxGraphics disabledGraphic = ImGuiCheckboxGraphics::Cross);
void PaddedText(const char* text, bool padTop = true, bool padBottom = true); void PaddedText(const char* text, bool padTop = true, bool padBottom = true);
std::string GetWindowButtonText(const char* text, bool menuOpen); std::string GetWindowButtonText(const char* text, bool menuOpen);
} }

View File

@ -16,11 +16,11 @@ namespace Ship {
} }
std::shared_ptr<Controller> GetControllerPerSlot(int slot) { std::shared_ptr<Controller> GetControllerPerSlot(int slot) {
auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = Ship::Window::GetInstance()->GetControlDeck();
return controlDeck->GetPhysicalDeviceFromVirtualSlot(slot); return controlDeck->GetPhysicalDeviceFromVirtualSlot(slot);
} }
void InputEditor::DrawButton(const char* label, int n64Btn) { void InputEditor::DrawButton(const char* label, int32_t n64Btn) {
const std::shared_ptr<Controller> backend = GetControllerPerSlot(CurrentPort); const std::shared_ptr<Controller> backend = GetControllerPerSlot(CurrentPort);
float size = 40; float size = 40;
@ -85,7 +85,7 @@ namespace Ship {
} }
void InputEditor::DrawControllerSchema() { void InputEditor::DrawControllerSchema() {
auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = Ship::Window::GetInstance()->GetControlDeck();
auto Backend = controlDeck->GetPhysicalDeviceFromVirtualSlot(CurrentPort); auto Backend = controlDeck->GetPhysicalDeviceFromVirtualSlot(CurrentPort);
auto profile = Backend->getProfile(CurrentPort); auto profile = Backend->getProfile(CurrentPort);
bool IsKeyboard = Backend->GetGuid() == "Keyboard" || Backend->GetGuid() == "Auto" || !Backend->Connected(); bool IsKeyboard = Backend->GetGuid() == "Keyboard" || Backend->GetGuid() == "Auto" || !Backend->Connected();
@ -357,4 +357,16 @@ namespace Ship {
ImGui::End(); ImGui::End();
} }
bool InputEditor::IsOpened() {
return Opened;
}
void InputEditor::Open() {
Opened = true;
}
void InputEditor::Close() {
Opened = false;
}
} }

View File

@ -1,18 +1,22 @@
#pragma once #pragma once
#include "stdint.h"
#include "Lib/ImGui/imgui.h" #include "Lib/ImGui/imgui.h"
namespace Ship { namespace Ship {
class InputEditor { class InputEditor {
int CurrentPort = 0; int32_t CurrentPort = 0;
int BtnReading = -1; int32_t BtnReading = -1;
public:
bool Opened = false; bool Opened = false;
public:
void Init(); void Init();
void DrawButton(const char* label, int n64Btn); void DrawButton(const char* label, int32_t n64Btn);
void DrawVirtualStick(const char* label, ImVec2 stick); void DrawVirtualStick(const char* label, ImVec2 stick);
void DrawControllerSchema(); void DrawControllerSchema();
void DrawHud(); void DrawHud();
bool IsOpened();
void Open();
void Close();
}; };
} }

View File

@ -7,7 +7,7 @@
#endif #endif
#include "Hooks.h" #include "Hooks.h"
#include "GlobalCtx2.h"
#include "Window.h" #include "Window.h"
namespace Ship { namespace Ship {
@ -70,7 +70,7 @@ namespace Ship {
}); });
if (find == Mappings.end()) return "Unknown"; if (find == Mappings.end()) return "Unknown";
const char* name = GlobalCtx2::GetInstance()->GetWindow()->GetKeyName(find->first); const char* name = Window::GetInstance()->GetKeyName(find->first);
return strlen(name) == 0 ? "Unknown" : name; return strlen(name) == 0 ? "Unknown" : name;
} }

View File

@ -16,7 +16,6 @@
#include "gfx_cc.h" #include "gfx_cc.h"
#include "gfx_rendering_api.h" #include "gfx_rendering_api.h"
#include "../../GlobalCtx2.h"
#include "gfx_pc.h" #include "gfx_pc.h"
#include "gfx_wiiu.h" #include "gfx_wiiu.h"

View File

@ -44,7 +44,7 @@
#include "gfx_cc.h" #include "gfx_cc.h"
#include "gfx_rendering_api.h" #include "gfx_rendering_api.h"
#include "../../ImGuiImpl.h" #include "../../ImGuiImpl.h"
#include "../../GlobalCtx2.h" #include "../../Window.h"
#include "gfx_pc.h" #include "gfx_pc.h"
using namespace std; using namespace std;

View File

@ -15,6 +15,7 @@
#ifndef _LANGUAGE_C #ifndef _LANGUAGE_C
#define _LANGUAGE_C #define _LANGUAGE_C
#endif #endif
#include <PR/ultra64/types.h>
#include <PR/ultra64/gbi.h> #include <PR/ultra64/gbi.h>
#include <PR/ultra64/gs2dex.h> #include <PR/ultra64/gs2dex.h>
#include <string> #include <string>
@ -36,6 +37,7 @@
#include "../../ResourceMgr.h" #include "../../ResourceMgr.h"
#include "../../Utils.h" #include "../../Utils.h"
// OTRTODO: fix header files for these // OTRTODO: fix header files for these
extern "C" { extern "C" {
const char* ResourceMgr_GetNameByCRC(uint64_t crc); const char* ResourceMgr_GetNameByCRC(uint64_t crc);
@ -2171,7 +2173,7 @@ static void gfx_run_dl(Gfx* cmd) {
uintptr_t mtxAddr = cmd->words.w1; uintptr_t mtxAddr = cmd->words.w1;
// OTRTODO: Temp way of dealing with gMtxClear. Need something more elegant in the future... // OTRTODO: Temp way of dealing with gMtxClear. Need something more elegant in the future...
uint32_t gameVersion = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->GetGameVersion(); uint32_t gameVersion = Ship::Window::GetInstance()->GetResourceManager()->GetGameVersion();
if (gameVersion == OOT_PAL_GC) { if (gameVersion == OOT_PAL_GC) {
if (mtxAddr == SEG_ADDR(0, 0x0FBC20)) { if (mtxAddr == SEG_ADDR(0, 0x0FBC20)) {
mtxAddr = clearMtx; mtxAddr = clearMtx;

View File

@ -8,6 +8,7 @@
#include <list> #include <list>
#include <cstddef> #include <cstddef>
#include "U64/PR/ultra64/gbi.h"
#include "U64/PR/ultra64/types.h" #include "U64/PR/ultra64/types.h"
// TODO figure out why changing these to 640x480 makes the game only render in a quarter of the window // TODO figure out why changing these to 640x480 makes the game only render in a quarter of the window

View File

@ -189,6 +189,7 @@ static void gfx_sdl_init(const char *game_name, bool start_in_fullscreen, uint32
} }
#endif #endif
SDL_GL_MakeCurrent(wnd, ctx);
SDL_GL_SetSwapInterval(1); SDL_GL_SetSwapInterval(1);
SohImGui::WindowImpl window_impl; SohImGui::WindowImpl window_impl;

View File

@ -1,4 +1,5 @@
#include "Resource.h" #include "Resource.h"
#include "StrHash.h"
namespace Ship namespace Ship
{ {

View File

@ -3,15 +3,14 @@
#include <stdint.h> #include <stdint.h>
#include "Utils/BinaryReader.h" #include "Utils/BinaryReader.h"
#include "Utils/BinaryWriter.h" #include "Utils/BinaryWriter.h"
#include "GlobalCtx2.h"
#include "StrHash.h"
#include "File.h" #include "File.h"
#include "Lib/tinyxml2/tinyxml2.h" #include "Lib/tinyxml2/tinyxml2.h"
#include "spdlog/spdlog.h"
namespace Ship namespace Ship {
{ class ResourceMgr;
enum class ResourceType
{ enum class ResourceType {
Archive = 0x4F415243, // OARC (UNUSED) Archive = 0x4F415243, // OARC (UNUSED)
Model = 0x4F4D444C, // OMDL (WIP) Model = 0x4F4D444C, // OMDL (WIP)
Texture = 0x4F544558, // OTEX Texture = 0x4F544558, // OTEX
@ -36,8 +35,7 @@ namespace Ship
AudioSequence = 0x4F534551, // OSEQ AudioSequence = 0x4F534551, // OSEQ
}; };
enum class DataType enum class DataType {
{
U8 = 0, U8 = 0,
S8 = 1, S8 = 1,
U16 = 2, U16 = 2,
@ -51,8 +49,7 @@ namespace Ship
F64 = 10 F64 = 10
}; };
enum class Version enum class Version {
{
// BR // BR
Deckard = 0, Deckard = 0,
Roy = 1, Roy = 1,
@ -61,15 +58,13 @@ namespace Ship
// ... // ...
}; };
struct Patch struct Patch {
{
uint64_t crc; uint64_t crc;
uint32_t index; uint32_t index;
uintptr_t origData; uintptr_t origData;
}; };
class Resource class Resource {
{
public: public:
ResourceMgr* resMgr; ResourceMgr* resMgr;
uint64_t id; // Unique Resource ID uint64_t id; // Unique Resource ID
@ -81,8 +76,7 @@ namespace Ship
virtual ~Resource(); virtual ~Resource();
}; };
class ResourceFile class ResourceFile {
{
public: public:
Endianness endianness; // 0x00 - Endianness of the file Endianness endianness; // 0x00 - Endianness of the file
uint32_t resourceType; // 0x01 - 4 byte MAGIC uint32_t resourceType; // 0x01 - 4 byte MAGIC

View File

@ -9,14 +9,15 @@
namespace Ship { namespace Ship {
ResourceMgr::ResourceMgr(std::shared_ptr<GlobalCtx2> Context, const std::string& MainPath, const std::string& PatchesPath) : Context(Context), bIsRunning(false), FileLoadThread(nullptr) { ResourceMgr::ResourceMgr(std::shared_ptr<Window> Context, const std::string& MainPath, const std::string& PatchesPath) : Context(Context), bIsRunning(false), FileLoadThread(nullptr) {
OTR = std::make_shared<Archive>(MainPath, PatchesPath, false); OTR = std::make_shared<Archive>(MainPath, PatchesPath, false);
gameVersion = OOT_UNKNOWN; gameVersion = OOT_UNKNOWN;
if (OTR->IsMainMPQValid()) if (OTR->IsMainMPQValid()) {
Start(); Start();
} }
}
ResourceMgr::~ResourceMgr() { ResourceMgr::~ResourceMgr() {
SPDLOG_INFO("destruct ResourceMgr"); SPDLOG_INFO("destruct ResourceMgr");
@ -87,10 +88,11 @@ namespace Ship {
OTR->LoadFile(ToLoad->path, true, ToLoad); OTR->LoadFile(ToLoad->path, true, ToLoad);
if (!ToLoad->bHasLoadError) if (!ToLoad->bHasLoadError) {
FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr; FileCache[ToLoad->path] = ToLoad->bIsLoaded && !ToLoad->bHasLoadError ? ToLoad : nullptr;
}
SPDLOG_DEBUG("Loaded File {} on ResourceMgr thread", ToLoad->path); SPDLOG_TRACE("Loaded File {} on ResourceMgr thread", ToLoad->path);
ToLoad->FileLoadNotifier.notify_all(); ToLoad->FileLoadNotifier.notify_all();
} }
@ -123,12 +125,10 @@ namespace Ship {
} }
} }
if (!ToLoad->file->bHasLoadError) if (!ToLoad->file->bHasLoadError) {
{
auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->file); auto UnmanagedRes = ResourceLoader::LoadResource(ToLoad->file);
if (UnmanagedRes != nullptr) if (UnmanagedRes != nullptr) {
{
UnmanagedRes->resMgr = this; UnmanagedRes->resMgr = this;
auto Res = std::shared_ptr<Resource>(UnmanagedRes); auto Res = std::shared_ptr<Resource>(UnmanagedRes);
@ -142,17 +142,14 @@ namespace Ship {
SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->file->path); SPDLOG_DEBUG("Loaded Resource {} on ResourceMgr thread", ToLoad->file->path);
Res->file = nullptr; Res->file = nullptr;
} } else {
else {
ToLoad->bHasResourceLoaded = false; ToLoad->bHasResourceLoaded = false;
ToLoad->resource = nullptr; ToLoad->resource = nullptr;
SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->file->path); SPDLOG_ERROR("Resource load FAILED {} on ResourceMgr thread", ToLoad->file->path);
} }
} }
} } else {
else
{
ToLoad->bHasResourceLoaded = false; ToLoad->bHasResourceLoaded = false;
ToLoad->resource = nullptr; ToLoad->resource = nullptr;
} }
@ -163,13 +160,11 @@ namespace Ship {
SPDLOG_INFO("Resource Manager LoadResourceThread ended"); SPDLOG_INFO("Resource Manager LoadResourceThread ended");
} }
uint32_t ResourceMgr::GetGameVersion() uint32_t ResourceMgr::GetGameVersion() {
{
return gameVersion; return gameVersion;
} }
void ResourceMgr::SetGameVersion(uint32_t newGameVersion) void ResourceMgr::SetGameVersion(uint32_t newGameVersion) {
{
gameVersion = newGameVersion; gameVersion = newGameVersion;
} }
@ -206,24 +201,23 @@ namespace Ship {
auto resCacheFind = ResourceCache.find(FilePath); auto resCacheFind = ResourceCache.find(FilePath);
if (resCacheFind != ResourceCache.end() && if (resCacheFind != ResourceCache.end() &&
resCacheFind->second.use_count() > 0) resCacheFind->second.use_count() > 0) {
{
return resCacheFind->second; return resCacheFind->second;
} } else {
else
return nullptr; return nullptr;
} }
}
std::shared_ptr<Resource> ResourceMgr::LoadResource(const char* FilePath) { std::shared_ptr<Resource> ResourceMgr::LoadResource(const char* FilePath) {
auto Res = LoadResourceAsync(FilePath); auto Res = LoadResourceAsync(FilePath);
if (std::holds_alternative<std::shared_ptr<Resource>>(Res)) if (std::holds_alternative<std::shared_ptr<Resource>>(Res)) {
return std::get<std::shared_ptr<Resource>>(Res); return std::get<std::shared_ptr<Resource>>(Res);
}
auto& Promise = std::get<std::shared_ptr<ResourcePromise>>(Res); auto& Promise = std::get<std::shared_ptr<ResourcePromise>>(Res);
if (!Promise->bHasResourceLoaded) if (!Promise->bHasResourceLoaded) {
{
std::unique_lock<std::mutex> Lock(Promise->resourceLoadMutex); std::unique_lock<std::mutex> Lock(Promise->resourceLoadMutex);
while (!Promise->bHasResourceLoaded) { while (!Promise->bHasResourceLoaded) {
Promise->resourceLoadNotifier.wait(Lock); Promise->resourceLoadNotifier.wait(Lock);
@ -234,8 +228,9 @@ namespace Ship {
} }
std::variant<std::shared_ptr<Resource>, std::shared_ptr<ResourcePromise>> ResourceMgr::LoadResourceAsync(const char* FilePath) { std::variant<std::shared_ptr<Resource>, std::shared_ptr<ResourcePromise>> ResourceMgr::LoadResourceAsync(const char* FilePath) {
if (FilePath[0] == '_' && FilePath[1] == '_' && FilePath[2] == 'O' && FilePath[3] == 'T' && FilePath[4] == 'R' && FilePath[5] == '_' && FilePath[6] == '_') if (FilePath[0] == '_' && FilePath[1] == '_' && FilePath[2] == 'O' && FilePath[3] == 'T' && FilePath[4] == 'R' && FilePath[5] == '_' && FilePath[6] == '_') {
FilePath += 7; FilePath += 7;
}
const std::lock_guard<std::mutex> ResLock(ResourceLoadMutex); const std::lock_guard<std::mutex> ResLock(ResourceLoadMutex);
auto resCacheFind = ResourceCache.find(FilePath); auto resCacheFind = ResourceCache.find(FilePath);
@ -248,21 +243,16 @@ namespace Ship {
std::shared_ptr<File> FileData = LoadFile(FilePath); std::shared_ptr<File> FileData = LoadFile(FilePath);
Promise->file = FileData; Promise->file = FileData;
if (Promise->file->bHasLoadError) if (Promise->file->bHasLoadError) {
{
Promise->bHasResourceLoaded = true; Promise->bHasResourceLoaded = true;
} } else {
else
{
Promise->bHasResourceLoaded = false; Promise->bHasResourceLoaded = false;
ResourceLoadQueue.push(Promise); ResourceLoadQueue.push(Promise);
ResourceLoadNotifier.notify_all(); ResourceLoadNotifier.notify_all();
} }
return Promise; return Promise;
} } else {
else
{
return resCacheFind->second; return resCacheFind->second;
} }
} }
@ -273,8 +263,7 @@ namespace Ship {
for (DWORD i = 0; i < fileList.size(); i++) { for (DWORD i = 0; i < fileList.size(); i++) {
auto resource = LoadResourceAsync(fileList.operator[](i).cFileName); auto resource = LoadResourceAsync(fileList.operator[](i).cFileName);
if (std::holds_alternative<std::shared_ptr<Resource>>(resource)) if (std::holds_alternative<std::shared_ptr<Resource>>(resource)) {
{
auto promise = std::make_shared<ResourcePromise>(); auto promise = std::make_shared<ResourcePromise>();
promise->bHasResourceLoaded = true; promise->bHasResourceLoaded = true;
promise->resource = std::get<std::shared_ptr<Resource>>(resource); promise->resource = std::get<std::shared_ptr<Resource>>(resource);
@ -304,8 +293,7 @@ namespace Ship {
return LoadedList; return LoadedList;
} }
std::shared_ptr<std::vector<std::shared_ptr<Resource>>> ResourceMgr::DirtyDirectory(std::string SearchMask) std::shared_ptr<std::vector<std::shared_ptr<Resource>>> ResourceMgr::DirtyDirectory(const std::string& SearchMask) {
{
auto PromiseList = CacheDirectoryAsync(SearchMask); auto PromiseList = CacheDirectoryAsync(SearchMask);
auto LoadedList = std::make_shared<std::vector<std::shared_ptr<Resource>>>(); auto LoadedList = std::make_shared<std::vector<std::shared_ptr<Resource>>>();
@ -317,8 +305,9 @@ namespace Ship {
Promise->resourceLoadNotifier.wait(Lock); Promise->resourceLoadNotifier.wait(Lock);
} }
if (Promise->resource != nullptr) if (Promise->resource != nullptr) {
Promise->resource->isDirty = true; Promise->resource->isDirty = true;
}
LoadedList->push_back(Promise->resource); LoadedList->push_back(Promise->resource);
} }
@ -326,8 +315,7 @@ namespace Ship {
return LoadedList; return LoadedList;
} }
std::shared_ptr<std::vector<std::string>> ResourceMgr::ListFiles(std::string SearchMask) std::shared_ptr<std::vector<std::string>> ResourceMgr::ListFiles(std::string SearchMask) {
{
auto result = std::make_shared<std::vector<std::string>>(); auto result = std::make_shared<std::vector<std::string>>();
auto fileList = OTR->ListFiles(SearchMask); auto fileList = OTR->ListFiles(SearchMask);

View File

@ -5,26 +5,26 @@
#include <thread> #include <thread>
#include <queue> #include <queue>
#include <variant> #include <variant>
#include "Window.h"
#include "Resource.h" #include "Resource.h"
#include "GlobalCtx2.h" #include "Archive.h"
#include "File.h"
namespace Ship namespace Ship {
{ class Window;
class Archive;
class File;
// Resource manager caches any and all files it comes across into memory. This will be unoptimal in the future when modifications have gigabytes of assets. // Resource manager caches any and all files it comes across into memory. This will be unoptimal in the future when modifications have gigabytes of assets.
// It works with the original game's assets because the entire ROM is 64MB and fits into RAM of any semi-modern PC. // It works with the original game's assets because the entire ROM is 64MB and fits into RAM of any semi-modern PC.
class ResourceMgr { class ResourceMgr {
public: public:
ResourceMgr(std::shared_ptr<GlobalCtx2> Context, const std::string& MainPath, const std::string& PatchesPath); ResourceMgr(std::shared_ptr<Window> Context, const std::string& MainPath, const std::string& PatchesPath);
~ResourceMgr(); ~ResourceMgr();
bool IsRunning(); bool IsRunning();
bool DidLoadSuccessfully(); bool DidLoadSuccessfully();
std::shared_ptr<Archive> GetArchive() { return OTR; } std::shared_ptr<Archive> GetArchive() { return OTR; }
std::shared_ptr<GlobalCtx2> GetContext() { return Context.lock(); } std::shared_ptr<Window> GetContext() { return Context; }
const std::string* HashToString(uint64_t Hash) const; const std::string* HashToString(uint64_t Hash) const;
@ -34,13 +34,13 @@ namespace Ship
void SetGameVersion(uint32_t newGameVersion); void SetGameVersion(uint32_t newGameVersion);
std::shared_ptr<File> LoadFileAsync(const std::string& FilePath); std::shared_ptr<File> LoadFileAsync(const std::string& FilePath);
std::shared_ptr<File> LoadFile(const std::string& FilePath); std::shared_ptr<File> LoadFile(const std::string& FilePath);
std::shared_ptr<Ship::Resource> GetCachedFile(const char* FilePath) const; std::shared_ptr<Resource> GetCachedFile(const char* FilePath) const;
std::shared_ptr<Resource> LoadResource(const char* FilePath); std::shared_ptr<Resource> LoadResource(const char* FilePath);
std::shared_ptr<Resource> LoadResource(const std::string& FilePath) { return LoadResource(FilePath.c_str()); } std::shared_ptr<Resource> LoadResource(const std::string& FilePath) { return LoadResource(FilePath.c_str()); }
std::variant<std::shared_ptr<Resource>, std::shared_ptr<ResourcePromise>> LoadResourceAsync(const char* FilePath); std::variant<std::shared_ptr<Resource>, std::shared_ptr<ResourcePromise>> LoadResourceAsync(const char* FilePath);
std::shared_ptr<std::vector<std::shared_ptr<Resource>>> CacheDirectory(const std::string& SearchMask); std::shared_ptr<std::vector<std::shared_ptr<Resource>>> CacheDirectory(const std::string& SearchMask);
std::shared_ptr<std::vector<std::shared_ptr<ResourcePromise>>> CacheDirectoryAsync(const std::string& SearchMask); std::shared_ptr<std::vector<std::shared_ptr<ResourcePromise>>> CacheDirectoryAsync(const std::string& SearchMask);
std::shared_ptr<std::vector<std::shared_ptr<Resource>>> DirtyDirectory(std::string SearchMask); std::shared_ptr<std::vector<std::shared_ptr<Resource>>> DirtyDirectory(const std::string& SearchMask);
std::shared_ptr<std::vector<std::string>> ListFiles(std::string SearchMask); std::shared_ptr<std::vector<std::string>> ListFiles(std::string SearchMask);
protected: protected:
@ -50,7 +50,7 @@ namespace Ship
void LoadResourceThread(); void LoadResourceThread();
private: private:
std::weak_ptr<GlobalCtx2> Context; std::shared_ptr<Window> Context;
volatile bool bIsRunning; volatile bool bIsRunning;
std::unordered_map<std::string, std::shared_ptr<File>> FileCache; std::unordered_map<std::string, std::shared_ptr<File>> FileCache;
std::unordered_map<std::string, std::shared_ptr<Resource>> ResourceCache; std::unordered_map<std::string, std::shared_ptr<Resource>> ResourceCache;

View File

@ -1,5 +1,5 @@
#include "SDLController.h" #include "SDLController.h"
#include "GlobalCtx2.h"
#include "spdlog/spdlog.h" #include "spdlog/spdlog.h"
#include "Window.h" #include "Window.h"
#include <Utils/StringHelper.h> #include <Utils/StringHelper.h>

View File

@ -1,6 +1,5 @@
#ifdef __WIIU__ #ifdef __WIIU__
#include "WiiUController.h" #include "WiiUController.h"
#include "GlobalCtx2.h"
#include "Window.h" #include "Window.h"
#include "ImGuiImpl.h" #include "ImGuiImpl.h"
@ -406,6 +405,14 @@ namespace Ship {
x *= scale; x *= scale;
y *= scale; y *= scale;
} }
if (isRightStick) {
getRightStickX(virtualSlot) = x;
getRightStickY(virtualSlot) = y;
} else {
getLeftStickX(virtualSlot) = x;
getLeftStickY(virtualSlot) = y;
}
} }
void WiiUController::CreateDefaultBinding(int32_t virtualSlot) { void WiiUController::CreateDefaultBinding(int32_t virtualSlot) {

View File

@ -1,6 +1,5 @@
#ifdef __WIIU__ #ifdef __WIIU__
#include "WiiUGamepad.h" #include "WiiUGamepad.h"
#include "GlobalCtx2.h"
#include "ImGuiImpl.h" #include "ImGuiImpl.h"
#include "WiiUImpl.h" #include "WiiUImpl.h"
@ -279,6 +278,14 @@ namespace Ship {
x *= scale; x *= scale;
y *= scale; y *= scale;
} }
if (isRightStick) {
getRightStickX(virtualSlot) = x;
getRightStickY(virtualSlot) = y;
} else {
getLeftStickX(virtualSlot) = x;
getLeftStickY(virtualSlot) = y;
}
} }
void WiiUGamepad::CreateDefaultBinding(int32_t virtualSlot) { void WiiUGamepad::CreateDefaultBinding(int32_t virtualSlot) {

View File

@ -114,7 +114,7 @@ void Update() {
// rescan devices if connection state changed // rescan devices if connection state changed
if (rescan) { if (rescan) {
Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->ScanPhysicalDevices(); Window::GetInstance()->GetControlDeck()->ScanPhysicalDevices();
} }
} }

View File

@ -1,23 +1,18 @@
#include <string>
#include <chrono>
#include <fstream>
#include <iostream>
#include "Window.h" #include "Window.h"
#include "spdlog/spdlog.h"
#include "KeyboardController.h"
#include "GlobalCtx2.h"
#include "DisplayList.h"
#include "Vertex.h"
#include "Array.h"
#include "ResourceMgr.h" #include "ResourceMgr.h"
#include "KeyboardController.h"
#include "UltraController.h"
#include "DisplayList.h"
#include "Console.h"
#include "Array.h"
#include "Texture.h" #include "Texture.h"
#include "Blob.h" #include "Blob.h"
#include "Matrix.h" #include "Matrix.h"
#include "AudioPlayer.h"
#include "Hooks.h" #include "Hooks.h"
#include "UltraController.h"
#include <SDL2/SDL.h>
#include <string>
#include <chrono>
#include "Console.h"
#include "ImGuiImpl.h"
#include "PR/ultra64/gbi.h"
#include "Lib/Fast3D/gfx_pc.h" #include "Lib/Fast3D/gfx_pc.h"
#include "Lib/Fast3D/gfx_sdl.h" #include "Lib/Fast3D/gfx_sdl.h"
#include "Lib/Fast3D/gfx_dxgi.h" #include "Lib/Fast3D/gfx_dxgi.h"
@ -27,12 +22,25 @@
#include "Lib/Fast3D/gfx_direct3d12.h" #include "Lib/Fast3D/gfx_direct3d12.h"
#include "Lib/Fast3D/gfx_wiiu.h" #include "Lib/Fast3D/gfx_wiiu.h"
#include "Lib/Fast3D/gfx_gx2.h" #include "Lib/Fast3D/gfx_gx2.h"
#include "Lib/Fast3D/gfx_rendering_api.h"
#include "Lib/Fast3D/gfx_window_manager_api.h" #include "Lib/Fast3D/gfx_window_manager_api.h"
#include <string> #include <SDL2/SDL.h>
#include "ImGuiImpl.h"
#include "spdlog/async.h"
#include "spdlog/sinks/rotating_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/sohconsole_sink.h"
#include "PR/ultra64/gbi.h"
#ifdef __APPLE__
#include "OSXFolderManager.h"
#elif defined(__SWITCH__)
#include "SwitchImpl.h"
#elif defined(__WIIU__)
#include "WiiUImpl.h"
#endif
#include <iostream>
#define LOAD_TEX(texPath) static_cast<Ship::Texture*>(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(texPath).get()); #define LOAD_TEX(texPath) static_cast<Ship::Texture*>(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(texPath).get());
extern "C" { extern "C" {
struct OSMesgQueue; struct OSMesgQueue;
@ -59,7 +67,7 @@ extern "C" {
#endif #endif
#endif #endif
Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->Init(controllerBits); Ship::Window::GetInstance()->GetControlDeck()->Init(controllerBits);
return 0; return 0;
} }
@ -78,22 +86,22 @@ extern "C" {
pad->gyro_x = 0; pad->gyro_x = 0;
pad->gyro_y = 0; pad->gyro_y = 0;
if (SohImGui::controller->Opened) return; if (SohImGui::controller->IsOpened()) return;
Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck()->WriteToPad(pad); Ship::Window::GetInstance()->GetControlDeck()->WriteToPad(pad);
Ship::ExecuteHooks<Ship::ControllerRead>(pad); Ship::ExecuteHooks<Ship::ControllerRead>(pad);
} }
const char* ResourceMgr_GetNameByCRC(uint64_t crc) { const char* ResourceMgr_GetNameByCRC(uint64_t crc) {
const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc);
return hashStr != nullptr ? hashStr->c_str() : nullptr; return hashStr != nullptr ? hashStr->c_str() : nullptr;
} }
Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc) { Vtx* ResourceMgr_LoadVtxByCRC(uint64_t crc) {
const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc);
if (hashStr != nullptr) { if (hashStr != nullptr) {
auto res = std::static_pointer_cast<Ship::Array>(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); auto res = std::static_pointer_cast<Ship::Array>(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()));
return (Vtx*)res->vertices.data(); return (Vtx*)res->vertices.data();
} }
@ -101,10 +109,10 @@ extern "C" {
} }
int32_t* ResourceMgr_LoadMtxByCRC(uint64_t crc) { int32_t* ResourceMgr_LoadMtxByCRC(uint64_t crc) {
const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc);
if (hashStr != nullptr) { if (hashStr != nullptr) {
auto res = std::static_pointer_cast<Ship::Matrix>(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); auto res = std::static_pointer_cast<Ship::Matrix>(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()));
return (int32_t*)res->mtx.data(); return (int32_t*)res->mtx.data();
} }
@ -112,10 +120,10 @@ extern "C" {
} }
Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc) { Gfx* ResourceMgr_LoadGfxByCRC(uint64_t crc) {
const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc);
if (hashStr != nullptr) { if (hashStr != nullptr) {
auto res = std::static_pointer_cast<Ship::DisplayList>(Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str())); auto res = std::static_pointer_cast<Ship::DisplayList>(Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()));
return (Gfx*)&res->instructions[0]; return (Gfx*)&res->instructions[0];
} else { } else {
return nullptr; return nullptr;
@ -123,7 +131,7 @@ extern "C" {
} }
char* ResourceMgr_LoadTexByCRC(uint64_t crc) { char* ResourceMgr_LoadTexByCRC(uint64_t crc) {
const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(crc); const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(crc);
if (hashStr != nullptr) { if (hashStr != nullptr) {
const auto res = LOAD_TEX(hashStr->c_str()); const auto res = LOAD_TEX(hashStr->c_str());
@ -137,11 +145,11 @@ extern "C" {
void ResourceMgr_RegisterResourcePatch(uint64_t hash, uint32_t instrIndex, uintptr_t origData) void ResourceMgr_RegisterResourcePatch(uint64_t hash, uint32_t instrIndex, uintptr_t origData)
{ {
const std::string* hashStr = Ship::GlobalCtx2::GetInstance()->GetResourceManager()->HashToString(hash); const std::string* hashStr = Ship::Window::GetInstance()->GetResourceManager()->HashToString(hash);
if (hashStr != nullptr) if (hashStr != nullptr)
{ {
auto res = (Ship::Texture*)Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()).get(); auto res = (Ship::Texture*)Ship::Window::GetInstance()->GetResourceManager()->LoadResource(hashStr->c_str()).get();
Ship::Patch patch; Ship::Patch patch;
patch.crc = hash; patch.crc = hash;
@ -201,7 +209,7 @@ extern "C" {
} }
char* ResourceMgr_LoadBlobByName(char* blobPath) { char* ResourceMgr_LoadBlobByName(char* blobPath) {
auto res = (Ship::Blob*)Ship::GlobalCtx2::GetInstance()->GetResourceManager()->LoadResource(blobPath).get(); auto res = (Ship::Blob*)Ship::Window::GetInstance()->GetResourceManager()->LoadResource(blobPath).get();
return (char*)res->data.data(); return (char*)res->data.data();
} }
@ -217,7 +225,26 @@ extern "C" {
namespace Ship { namespace Ship {
Window::Window(std::shared_ptr<GlobalCtx2> Context) : Context(Context), APlayer(nullptr), ControllerApi(nullptr) { std::weak_ptr<Window> Window::Context;
std::shared_ptr<Window> Window::GetInstance() {
return Context.lock();
}
std::shared_ptr<Window> Window::CreateInstance(const std::string Name) {
if (Context.expired()) {
auto Shared = std::make_shared<Window>(Name);
Context = Shared;
Shared->Initialize();
return Shared;
}
SPDLOG_DEBUG("Trying to create a context when it already exists. Returning existing.");
return GetInstance();
}
Window::Window(std::string Name) : Name(std::move(Name)), APlayer(nullptr), ControllerApi(nullptr), ResMan(nullptr), Logger(nullptr), Config(nullptr) {
WmApi = nullptr; WmApi = nullptr;
RenderingApi = nullptr; RenderingApi = nullptr;
bIsFullscreen = false; bIsFullscreen = false;
@ -226,77 +253,91 @@ namespace Ship {
} }
Window::~Window() { Window::~Window() {
SPDLOG_INFO("destruct window"); SPDLOG_DEBUG("destruct window");
} }
void Window::CreateDefaults() { void Window::CreateDefaults() {
const std::shared_ptr<Mercury> pConf = GlobalCtx2::GetInstance()->GetConfig(); if (GetConfig()->isNewInstance) {
if (pConf->isNewInstance) { GetConfig()->setInt("Window.Width", 640);
pConf->setInt("Window.Width", 640); GetConfig()->setInt("Window.Height", 480);
pConf->setInt("Window.Height", 480); GetConfig()->setBool("Window.Options", false);
pConf->setBool("Window.Options", false); GetConfig()->setString("Window.GfxBackend", "");
pConf->setString("Window.GfxBackend", "");
pConf->setBool("Window.Fullscreen.Enabled", false); GetConfig()->setBool("Window.Fullscreen.Enabled", false);
pConf->setInt("Window.Fullscreen.Width", 1920); GetConfig()->setInt("Window.Fullscreen.Width", 1920);
pConf->setInt("Window.Fullscreen.Height", 1080); GetConfig()->setInt("Window.Fullscreen.Height", 1080);
pConf->setString("Game.SaveName", ""); GetConfig()->setString("Game.SaveName", "");
pConf->setString("Game.Main Archive", ""); GetConfig()->setString("Game.Main Archive", "");
pConf->setString("Game.Patches Archive", ""); GetConfig()->setString("Game.Patches Archive", "");
pConf->setInt("Shortcuts.Fullscreen", 0x044); GetConfig()->setInt("Shortcuts.Fullscreen", 0x044);
pConf->setInt("Shortcuts.Console", 0x029); GetConfig()->setInt("Shortcuts.Console", 0x029);
pConf->save(); GetConfig()->save();
} }
} }
void Window::Init() { void Window::Initialize() {
std::shared_ptr<Mercury> pConf = GlobalCtx2::GetInstance()->GetConfig(); InitializeLogging();
InitializeConfiguration();
InitializeResourceManager();
CreateDefaults(); CreateDefaults();
InitializeAudioPlayer(); InitializeAudioPlayer();
InitializeControlDeck(); InitializeControlDeck();
bIsFullscreen = pConf->getBool("Window.Fullscreen.Enabled", false); bIsFullscreen = GetConfig()->getBool("Window.Fullscreen.Enabled", false);
if (bIsFullscreen) { if (bIsFullscreen) {
dwWidth = pConf->getInt("Window.Fullscreen.Width", 1920); dwWidth = GetConfig()->getInt("Window.Fullscreen.Width", 1920);
dwHeight = pConf->getInt("Window.Fullscreen.Height", 1080); dwHeight = GetConfig()->getInt("Window.Fullscreen.Height", 1080);
} else { } else {
dwWidth = pConf->getInt("Window.Width", 640); dwWidth = GetConfig()->getInt("Window.Width", 640);
dwHeight = pConf->getInt("Window.Height", 480); dwHeight = GetConfig()->getInt("Window.Height", 480);
} }
dwMenubar = pConf->getBool("Window.Options", false); dwMenubar = GetConfig()->getBool("Window.Options", false);
gfxBackend = pConf->getString("Window.GfxBackend"); const std::string& gfx_backend = GetConfig()->getString("Window.GfxBackend");
InitializeWindowManager(); InitializeWindowManager();
gfx_init(WmApi, RenderingApi, GetContext()->GetName().c_str(), bIsFullscreen, dwWidth, dwHeight); gfx_init(WmApi, RenderingApi, GetName().c_str(), bIsFullscreen, dwWidth, dwHeight);
WmApi->set_fullscreen_changed_callback(OnFullscreenChanged); WmApi->set_fullscreen_changed_callback(OnFullscreenChanged);
WmApi->set_keyboard_callbacks(KeyDown, KeyUp, AllKeysUp); WmApi->set_keyboard_callbacks(KeyDown, KeyUp, AllKeysUp);
Ship::RegisterHook<Ship::ExitGame>([this]() { Ship::RegisterHook<ExitGame>([this]() {
ControllerApi->SaveControllerSettings(); ControllerApi->SaveControllerSettings();
}); });
} }
std::string Window::GetAppDirectoryPath() {
#ifdef __APPLE__
FolderManager folderManager;
std::string fpath = std::string(folderManager.pathForDirectory(NSApplicationSupportDirectory, NSUserDomainMask));
fpath.append("/com.shipofharkinian.soh");
return fpath;
#endif
#ifdef __linux__
char* fpath = std::getenv("SHIP_HOME");
if (fpath != NULL)
return std::string(fpath);
#endif
return ".";
}
std::string Window::GetPathRelativeToAppDirectory(const char* path) {
return GetAppDirectoryPath() + "/" + path;
}
void Window::StartFrame() { void Window::StartFrame() {
gfx_start_frame(); gfx_start_frame();
} }
void Window::RunCommands(Gfx* Commands, const std::vector<std::unordered_map<Mtx*, MtxF>>& mtx_replacements) { void Window::SetTargetFps(int32_t fps) {
for (const auto& m : mtx_replacements) {
gfx_run(Commands, m);
gfx_end_frame();
}
}
void Window::SetTargetFps(int fps) {
gfx_set_target_fps(fps); gfx_set_target_fps(fps);
} }
void Window::SetMaximumFrameLatency(int latency) { void Window::SetMaximumFrameLatency(int32_t latency) {
gfx_set_maximum_frame_latency(latency); gfx_set_maximum_frame_latency(latency);
} }
@ -329,17 +370,17 @@ namespace Ship {
void Window::MainLoop(void (*MainFunction)(void)) { void Window::MainLoop(void (*MainFunction)(void)) {
WmApi->main_loop(MainFunction); WmApi->main_loop(MainFunction);
} }
bool Window::KeyUp(int32_t dwScancode) {
std::shared_ptr<Mercury> pConf = GlobalCtx2::GetInstance()->GetConfig();
if (dwScancode == pConf->getInt("Shortcuts.Fullscreen", 0x044)) { bool Window::KeyUp(int32_t dwScancode) {
GlobalCtx2::GetInstance()->GetWindow()->ToggleFullscreen(); if (dwScancode == GetInstance()->GetConfig()->getInt("Shortcuts.Fullscreen", 0x044)) {
GetInstance()->ToggleFullscreen();
} }
GlobalCtx2::GetInstance()->GetWindow()->SetLastScancode(-1); GetInstance()->SetLastScancode(-1);
bool bIsProcessed = false; bool bIsProcessed = false;
auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = GetInstance()->GetControlDeck();
const auto pad = dynamic_cast<KeyboardController*>(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); const auto pad = dynamic_cast<KeyboardController*>(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get());
if (pad != nullptr) { if (pad != nullptr) {
if (pad->ReleaseButton(dwScancode)) { if (pad->ReleaseButton(dwScancode)) {
@ -352,7 +393,7 @@ namespace Ship {
bool Window::KeyDown(int32_t dwScancode) { bool Window::KeyDown(int32_t dwScancode) {
bool bIsProcessed = false; bool bIsProcessed = false;
auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = GetInstance()->GetControlDeck();
const auto pad = dynamic_cast<KeyboardController*>(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); const auto pad = dynamic_cast<KeyboardController*>(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get());
if (pad != nullptr) { if (pad != nullptr) {
if (pad->PressButton(dwScancode)) { if (pad->PressButton(dwScancode)) {
@ -360,14 +401,14 @@ namespace Ship {
} }
} }
GlobalCtx2::GetInstance()->GetWindow()->SetLastScancode(dwScancode); GetInstance()->SetLastScancode(dwScancode);
return bIsProcessed; return bIsProcessed;
} }
void Window::AllKeysUp(void) { void Window::AllKeysUp(void) {
auto controlDeck = GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = Window::GetInstance()->GetControlDeck();
const auto pad = dynamic_cast<KeyboardController*>(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get()); const auto pad = dynamic_cast<KeyboardController*>(controlDeck->GetPhysicalDevice(controlDeck->GetNumPhysicalDevices() - 2).get());
if (pad != nullptr) { if (pad != nullptr) {
pad->ReleaseAllButtons(); pad->ReleaseAllButtons();
@ -375,15 +416,13 @@ namespace Ship {
} }
void Window::OnFullscreenChanged(bool bIsFullscreen) { void Window::OnFullscreenChanged(bool bIsFullscreen) {
std::shared_ptr<Mercury> pConf = GlobalCtx2::GetInstance()->GetConfig(); std::shared_ptr<Mercury> pConf = Window::GetInstance()->GetConfig();
GlobalCtx2::GetInstance()->GetWindow()->bIsFullscreen = bIsFullscreen; Window::GetInstance()->bIsFullscreen = bIsFullscreen;
pConf->setBool("Window.Fullscreen.Enabled", bIsFullscreen); pConf->setBool("Window.Fullscreen.Enabled", bIsFullscreen);
GlobalCtx2::GetInstance()->GetWindow()->ShowCursor(!bIsFullscreen); Window::GetInstance()->ShowCursor(!bIsFullscreen);
} }
uint32_t Window::GetCurrentWidth() { uint32_t Window::GetCurrentWidth() {
WmApi->get_dimensions(&dwWidth, &dwHeight); WmApi->get_dimensions(&dwWidth, &dwHeight);
return dwWidth; return dwWidth;
@ -453,4 +492,93 @@ namespace Ship {
void Window::InitializeControlDeck() { void Window::InitializeControlDeck() {
ControllerApi = std::make_shared<ControlDeck>(); ControllerApi = std::make_shared<ControlDeck>();
} }
void Window::InitializeLogging() {
try {
// Setup Logging
spdlog::init_thread_pool(8192, 1);
std::vector<spdlog::sink_ptr> Sinks;
auto SohConsoleSink = std::make_shared<spdlog::sinks::soh_sink_mt>();
SohConsoleSink->set_level(spdlog::level::trace);
Sinks.push_back(SohConsoleSink);
#if (!defined(_WIN32) && !defined(__WIIU__)) || defined(_DEBUG)
auto ConsoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
ConsoleSink->set_level(spdlog::level::trace);
Sinks.push_back(ConsoleSink);
#endif
#ifndef __WIIU__
auto logPath = GetPathRelativeToAppDirectory(("logs/" + GetName() + ".log").c_str());
auto FileSink = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(logPath, 1024 * 1024 * 10, 10);
FileSink->set_level(spdlog::level::trace);
Sinks.push_back(FileSink);
#endif
Logger = std::make_shared<spdlog::async_logger>(GetName(), Sinks.begin(), Sinks.end(), spdlog::thread_pool(), spdlog::async_overflow_policy::block);
GetLogger()->set_level(spdlog::level::trace);
#ifndef __WIIU__
GetLogger()->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%@] [%l] %v");
#else
GetLogger()->set_pattern("[%s:%#] [%l] %v");
#endif
spdlog::register_logger(GetLogger());
spdlog::set_default_logger(GetLogger());
}
catch (const spdlog::spdlog_ex& ex) {
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
}
void Window::InitializeResourceManager() {
MainPath = Config->getString("Game.Main Archive", GetPathRelativeToAppDirectory("oot.otr"));
PatchesPath = Config->getString("Game.Patches Archive", GetAppDirectoryPath() + "/mods");
ResMan = std::make_shared<ResourceMgr>(GetInstance(), MainPath, PatchesPath);
if (!ResMan->DidLoadSuccessfully())
{
#ifdef _WIN32
MessageBox(nullptr, L"Main OTR file not found!", L"Uh oh", MB_OK);
#elif defined(__SWITCH__)
printf("Main OTR file not found!\n");
#elif defined(__WIIU__)
Ship::WiiU::ThrowMissingOTR(MainPath.c_str());
#else
SPDLOG_ERROR("Main OTR file not found!");
#endif
exit(1);
}
#ifdef __SWITCH__
Ship::Switch::Init(PostInitPhase);
#endif
}
void Window::InitializeConfiguration() {
Config = std::make_shared<Mercury>(GetPathRelativeToAppDirectory("shipofharkinian.json"));
}
void Window::WriteSaveFile(const std::filesystem::path& savePath, const uintptr_t addr, void* dramAddr, const size_t size) {
std::ofstream saveFile = std::ofstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
saveFile.seekp(addr);
saveFile.write((char*)dramAddr, size);
saveFile.close();
}
void Window::ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size) {
std::ifstream saveFile = std::ifstream(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
// If the file doesn't exist, initialize DRAM
if (saveFile.good()) {
saveFile.seekg(addr);
saveFile.read((char*)dramAddr, size);
}
else {
memset(dramAddr, 0, size);
}
saveFile.close();
}
} }

View File

@ -1,27 +1,36 @@
#pragma once #pragma once
#include <memory>
#include "PR/ultra64/gbi.h"
#include "Lib/Fast3D/gfx_pc.h"
#include "Controller.h"
#include "GlobalCtx2.h"
#include "ControlDeck.h"
#include <memory>
#include <filesystem>
#include "spdlog/spdlog.h"
#include "ControlDeck.h"
#include "AudioPlayer.h"
#include "Lib/Fast3D/gfx_window_manager_api.h" #include "Lib/Fast3D/gfx_window_manager_api.h"
#include "Lib/Mercury/Mercury.h"
struct GfxRenderingAPI;
struct GfxWindowManagerAPI;
namespace Ship { namespace Ship {
class AudioPlayer; class ResourceMgr;
class Window { class Window {
public: public:
Window(std::shared_ptr<GlobalCtx2> Context); static std::shared_ptr<Window> GetInstance();
static std::shared_ptr<Window> CreateInstance(const std::string Name);
static std::string GetAppDirectoryPath();
static std::string GetPathRelativeToAppDirectory(const char* path);
Window(std::string Name);
~Window(); ~Window();
void WriteSaveFile(const std::filesystem::path& savePath, uintptr_t addr, void* dramAddr, size_t size);
void ReadSaveFile(std::filesystem::path savePath, uintptr_t addr, void* dramAddr, size_t size);
void CreateDefaults(); void CreateDefaults();
void MainLoop(void (*MainFunction)(void)); void MainLoop(void (*MainFunction)(void));
void Init(); void Initialize();
void StartFrame(); void StartFrame();
void RunCommands(Gfx* Commands, const std::vector<std::unordered_map<Mtx*, MtxF>>& mtx_replacements); void SetTargetFps(int32_t fps);
void SetTargetFps(int fps); void SetMaximumFrameLatency(int32_t latency);
void SetMaximumFrameLatency(int latency);
void GetPixelDepthPrepare(float x, float y); void GetPixelDepthPrepare(float x, float y);
uint16_t GetPixelDepth(float x, float y); uint16_t GetPixelDepth(float x, float y);
void ToggleFullscreen(); void ToggleFullscreen();
@ -32,29 +41,39 @@ namespace Ship {
uint32_t GetCurrentHeight(); uint32_t GetCurrentHeight();
uint32_t GetMenuBar() { return dwMenubar; } uint32_t GetMenuBar() { return dwMenubar; }
void SetMenuBar(uint32_t dwMenuBar) { this->dwMenubar = dwMenuBar; } void SetMenuBar(uint32_t dwMenuBar) { this->dwMenubar = dwMenuBar; }
std::string GetName() { return Name; }
std::shared_ptr<ControlDeck> GetControlDeck() { return ControllerApi; }; std::shared_ptr<ControlDeck> GetControlDeck() { return ControllerApi; };
std::shared_ptr<GlobalCtx2> GetContext() { return Context.lock(); }
std::shared_ptr<AudioPlayer> GetAudioPlayer() { return APlayer; } std::shared_ptr<AudioPlayer> GetAudioPlayer() { return APlayer; }
const char* GetKeyName(int scancode) { return WmApi->get_key_name(scancode); } std::shared_ptr<ResourceMgr> GetResourceManager() { return ResMan; }
int32_t GetLastScancode() { return lastScancode; }; std::shared_ptr<Mercury> GetConfig() { return Config; }
void SetLastScancode(int32_t scanCode) { lastScancode = scanCode; }; std::shared_ptr<spdlog::logger> GetLogger() { return Logger; }
const char* GetKeyName(int32_t scancode) { return WmApi->get_key_name(scancode); }
int32_t GetLastScancode() { return lastScancode; }
void SetLastScancode(int32_t scanCode) { lastScancode = scanCode; }
protected: protected:
Window() = default;
private: private:
static bool KeyDown(int32_t dwScancode); static bool KeyDown(int32_t dwScancode);
static bool KeyUp(int32_t dwScancode); static bool KeyUp(int32_t dwScancode);
static void AllKeysUp(void); static void AllKeysUp(void);
static void OnFullscreenChanged(bool bIsNowFullscreen); static void OnFullscreenChanged(bool bIsNowFullscreen);
static std::weak_ptr<Window> Context;
void InitializeConfiguration();
void InitializeControlDeck(); void InitializeControlDeck();
void InitializeAudioPlayer(); void InitializeAudioPlayer();
void InitializeLogging();
void InitializeResourceManager();
void InitializeWindowManager(); void InitializeWindowManager();
std::weak_ptr<GlobalCtx2> Context; std::shared_ptr<spdlog::logger> Logger;
std::shared_ptr<Mercury> Config; // Config needs to be after the Window because we call the Window during it's destructor.
std::shared_ptr<ResourceMgr> ResMan;
std::shared_ptr<AudioPlayer> APlayer; std::shared_ptr<AudioPlayer> APlayer;
std::shared_ptr<ControlDeck> ControllerApi; std::shared_ptr<ControlDeck> ControllerApi;
std::string gfxBackend;
std::string gfxBackend;
GfxRenderingAPI* RenderingApi; GfxRenderingAPI* RenderingApi;
GfxWindowManagerAPI* WmApi; GfxWindowManagerAPI* WmApi;
bool bIsFullscreen; bool bIsFullscreen;
@ -62,5 +81,8 @@ namespace Ship {
uint32_t dwHeight; uint32_t dwHeight;
uint32_t dwMenubar; uint32_t dwMenubar;
int32_t lastScancode; int32_t lastScancode;
std::string Name;
std::string MainPath;
std::string PatchesPath;
}; };
} }

View File

@ -5,14 +5,18 @@ export PATH="$HERE"/bin:"$HERE"/usr/bin:"$PATH"
export LD_LIBRARY_PATH="$HERE"/usr/lib:"$LD_LIBRARY_PATH" export LD_LIBRARY_PATH="$HERE"/usr/lib:"$LD_LIBRARY_PATH"
export ZENITY=$(command -v zenity) export ZENITY=$(command -v zenity)
while [[ ! -e "$PWD"/oot.otr ]]; do if [ -z ${SHIP_HOME+x} ]; then
export SHIP_HOME=$PWD
fi
while [[ ! -e "$SHIP_HOME"/oot.otr ]]; do
export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)" export ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)"
ln -s "$HERE"/usr/bin/{assets,soh.elf,OTRGui} "$ASSETDIR" ln -s "$HERE"/usr/bin/{assets,soh.elf,OTRGui} "$ASSETDIR"
export OLDPWD="$PWD" export OLDPWD="$PWD"
mkdir -p "$ASSETDIR"/tmp mkdir -p "$ASSETDIR"/tmp
mkdir -p "$ASSETDIR"/Extract/assets mkdir -p "$ASSETDIR"/Extract/assets
if [ -e "$PWD"/*.*64 ]; then if [ -e "$SHIP_HOME"/*.*64 ]; then
ln -s "$OLDPWD"/*.*64 "$ASSETDIR"/tmp/rom.z64 ln -s "$SHIP_HOME"/*.*64 "$ASSETDIR"/tmp/rom.z64
cp -r "$ASSETDIR"/assets/game/ship_of_harkinian "$ASSETDIR"/Extract/assets/ cp -r "$ASSETDIR"/assets/game/ship_of_harkinian "$ASSETDIR"/Extract/assets/
cd "$ASSETDIR" cd "$ASSETDIR"
ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }') ROMHASH=$(sha1sum -b "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }')
@ -36,22 +40,19 @@ while [[ ! -e "$PWD"/oot.otr ]]; do
echo "Processing..." echo "Processing..."
fi fi
assets/extractor/ZAPD.out ed -eh -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR > /dev/null 2>&1 assets/extractor/ZAPD.out ed -eh -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR > /dev/null 2>&1
cp "$ASSETDIR"/oot.otr "$OLDPWD" cp "$ASSETDIR"/oot.otr "$SHIP_HOME"
echo "Restart $APPIMAGE to play!" echo "Restart $APPIMAGE to play!"
sleep 3 sleep 3
rm -r "$ASSETDIR" rm -r "$ASSETDIR"
break break
else else
if [ -n "$ZENITY" ]; then if [ -n "$ZENITY" ]; then
zenity --error --timeout=5 --text="Place ROM in $OWD" --title="Missing ROM file" --width=500 --width=200 zenity --error --timeout=5 --text="Place ROM in $SHIP_HOME" --title="Missing ROM file" --width=500 --width=200
else else
echo -e "\nPlace ROM in this folder\n" echo -e "\nPlace ROM in this folder\n"
fi fi
exit exit
fi fi
done done
cd "$OWD" (cd "$HERE/usr/bin"; ./soh.elf)
ln -s "$HERE"/usr/bin/gamecontrollerdb.txt "$PWD"
"$HERE"/usr/bin/soh.elf
unlink "$PWD"/gamecontrollerdb.txt
exit exit

View File

@ -110,6 +110,9 @@ set(Header_Files__include
"include/ichain.h" "include/ichain.h"
"include/macro.inc" "include/macro.inc"
"include/macros.h" "include/macros.h"
"include/message_data_fmt.h"
"include/message_data_static.h"
"include/message_data_textbox_types.h"
#"include/math_n64.h" #"include/math_n64.h"
"include/regs.h" "include/regs.h"
"include/segment_symbols.h" "include/segment_symbols.h"
@ -178,8 +181,11 @@ source_group("Header Files\\soh\\Enhancements\\debugger" FILES ${Header_Files__s
set(Header_Files__soh__Enhancements__randomizer set(Header_Files__soh__Enhancements__randomizer
"soh/Enhancements/randomizer/randomizer.h" "soh/Enhancements/randomizer/randomizer.h"
"soh/Enhancements/randomizer/randomizer_inf.h"
"soh/Enhancements/randomizer/randomizer_item_tracker.h" "soh/Enhancements/randomizer/randomizer_item_tracker.h"
"soh/Enhancements/randomizer/adult_trade_shuffle.h" "soh/Enhancements/randomizer/adult_trade_shuffle.h"
"soh/Enhancements/randomizer/randomizer_check_objects.h"
"soh/Enhancements/randomizer/draw.h"
) )
source_group("Header Files\\soh\\Enhancements\\randomizer" FILES ${Header_Files__soh__Enhancements__randomizer}) source_group("Header Files\\soh\\Enhancements\\randomizer" FILES ${Header_Files__soh__Enhancements__randomizer})
@ -219,6 +225,7 @@ set(Header_Files__soh__Enhancements__randomizer__3drando
"soh/Enhancements/randomizer/3drando/trial.hpp" "soh/Enhancements/randomizer/3drando/trial.hpp"
"soh/Enhancements/randomizer/3drando/utils.hpp" "soh/Enhancements/randomizer/3drando/utils.hpp"
) )
source_group("Header Files\\soh\\Enhancements\\randomizer\\3drando" FILES ${Header_Files__soh__Enhancements__randomizer__3drando}) source_group("Header Files\\soh\\Enhancements\\randomizer\\3drando" FILES ${Header_Files__soh__Enhancements__randomizer__3drando})
set(Header_Files__soh__Enhancements__custom_message set(Header_Files__soh__Enhancements__custom_message
@ -228,6 +235,13 @@ set(Header_Files__soh__Enhancements__custom_message
source_group("Header Files\\soh\\Enhancements\\custom-message" FILES ${Header_Files__soh__Enhancements__custom_message}) source_group("Header Files\\soh\\Enhancements\\custom-message" FILES ${Header_Files__soh__Enhancements__custom_message})
set(Header_Files__soh__Enhancements__item_tables
"soh/Enhancements/item-tables/ItemTableManager.h"
"soh/Enhancements/item-tables/ItemTableTypes.h"
)
source_group("Header Files\\soh\\Enhancements\\item-tables" FILES ${Header_Files__soh__Enhancements__item_tables})
set(Source_Files__soh set(Source_Files__soh
"soh/GbiWrap.cpp" "soh/GbiWrap.cpp"
"soh/OTRAudio.h" "soh/OTRAudio.h"
@ -278,6 +292,8 @@ set(Source_Files__soh__Enhancements__randomizer
"soh/Enhancements/randomizer/randomizer.cpp" "soh/Enhancements/randomizer/randomizer.cpp"
"soh/Enhancements/randomizer/randomizer_item_tracker.cpp" "soh/Enhancements/randomizer/randomizer_item_tracker.cpp"
"soh/Enhancements/randomizer/adult_trade_shuffle.c" "soh/Enhancements/randomizer/adult_trade_shuffle.c"
"soh/Enhancements/randomizer/randomizer_check_objects.cpp"
"soh/Enhancements/randomizer/draw.cpp"
) )
source_group("Source Files\\soh\\Enhancements\\randomizer" FILES ${Source_Files__soh__Enhancements__randomizer}) source_group("Source Files\\soh\\Enhancements\\randomizer" FILES ${Source_Files__soh__Enhancements__randomizer})
@ -351,6 +367,12 @@ set(Source_Files__soh__Enhancements__custom_message
source_group("Source Files\\soh\\Enhancements\\custom-message" FILES ${Source_Files__soh__Enhancements__custom_message}) source_group("Source Files\\soh\\Enhancements\\custom-message" FILES ${Source_Files__soh__Enhancements__custom_message})
set(Source_Files__soh__Enhancements__item_tables
"soh/Enhancements/item-tables/ItemTableManager.cpp"
)
source_group("Source Files\\soh\\Enhancements\\item-tables" FILES ${Source_Files__soh__Enhancements__item_tables})
set(Source_Files__src__boot set(Source_Files__src__boot
"src/boot/assert.c" "src/boot/assert.c"
"src/boot/boot_main.c" "src/boot/boot_main.c"
@ -1560,6 +1582,7 @@ set(ALL_FILES
${Header_Files__soh__Enhancements__debugger} ${Header_Files__soh__Enhancements__debugger}
${Header_Files__soh__Enhancements__randomizer} ${Header_Files__soh__Enhancements__randomizer}
${Header_Files__soh__Enhancements__randomizer__3drando} ${Header_Files__soh__Enhancements__randomizer__3drando}
${Header_Files__soh__Enhancements__item_tables}
${Header_Files__soh__Enhancements__custom_message} ${Header_Files__soh__Enhancements__custom_message}
${Source_Files__soh} ${Source_Files__soh}
${Source_Files__soh__Enhancements} ${Source_Files__soh__Enhancements}
@ -1570,6 +1593,7 @@ set(ALL_FILES
${Source_Files__soh__Enhancements__randomizer__3drando} ${Source_Files__soh__Enhancements__randomizer__3drando}
${Source_Files__soh__Enhancements__randomizer__3drando__hint_list} ${Source_Files__soh__Enhancements__randomizer__3drando__hint_list}
${Source_Files__soh__Enhancements__randomizer__3drando__location_access} ${Source_Files__soh__Enhancements__randomizer__3drando__location_access}
${Source_Files__soh__Enhancements__item_tables}
${Source_Files__soh__Enhancements__custom_message} ${Source_Files__soh__Enhancements__custom_message}
${Source_Files__src__boot} ${Source_Files__src__boot}
${Source_Files__src__buffers} ${Source_Files__src__buffers}
@ -1740,15 +1764,15 @@ if(MSVC)
if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64") if("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64")
target_compile_options(${PROJECT_NAME} PRIVATE target_compile_options(${PROJECT_NAME} PRIVATE
$<$<CONFIG:Debug>: $<$<CONFIG:Debug>:
/sdl-; /w;
/w /Od
> >
$<$<CONFIG:Release>: $<$<CONFIG:Release>:
/Oi; /Oi;
/sdl-;
/Gy; /Gy;
/W3 /W3
> >
/sdl-;
/permissive-; /permissive-;
/MP; /MP;
${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT}; ${DEFAULT_CXX_DEBUG_INFORMATION_FORMAT};
@ -1985,14 +2009,6 @@ elseif(NOT "${CMAKE_SYSTEM_NAME}" MATCHES "NintendoSwitch|CafeOS")
INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION . COMPONENT ship) INSTALL(FILES ${CMAKE_BINARY_DIR}/gamecontrollerdb.txt DESTINATION . COMPONENT ship)
endif() endif()
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin")
install(CODE "
include(InstallRequiredSystemLibraries)
include(BundleUtilities)
fixup_bundle(\"\${CMAKE_INSTALL_PREFIX}/soh-macos\" \"\" \"${dirs}\")
")
endif()
if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS") if(CMAKE_SYSTEM_NAME MATCHES "NintendoSwitch|CafeOS")
if (NOT TARGET pathconf) if (NOT TARGET pathconf)
add_library(pathconf OBJECT platform/pathconf.c) add_library(pathconf OBJECT platform/pathconf.c)

View File

@ -10,6 +10,8 @@ extern "C"
#endif #endif
#include "../../libultraship/libultraship/luslog.h" #include "../../libultraship/libultraship/luslog.h"
#include <soh/Enhancements/item-tables/ItemTableTypes.h>
#include <soh/Enhancements/randomizer/randomizer_inf.h>
#if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG) #if defined(INCLUDE_GAME_PRINTF) && !defined(NDEBUG)
#define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__) #define osSyncPrintf(fmt, ...) lusprintf(__FILE__, __LINE__, 0, fmt, __VA_ARGS__)
@ -453,7 +455,10 @@ u32 Actor_TextboxIsClosing(Actor* actor, GlobalContext* globalCtx);
s8 func_8002F368(GlobalContext* globalCtx); s8 func_8002F368(GlobalContext* globalCtx);
void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y); void Actor_GetScreenPos(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y);
u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx); u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx);
s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId); // TODO: Rename the follwing 3 functions using whatever scheme we use when we rename func_8002F434 and func_8002F554.
s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry);
s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange);
void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry);
s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange); s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange);
void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId); void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId);
void func_8002F580(Actor* actor, GlobalContext* globalCtx); void func_8002F580(Actor* actor, GlobalContext* globalCtx);
@ -554,6 +559,8 @@ s32 Flags_GetEventChkInf(s32 flag);
void Flags_SetEventChkInf(s32 flag); void Flags_SetEventChkInf(s32 flag);
s32 Flags_GetInfTable(s32 flag); s32 Flags_GetInfTable(s32 flag);
void Flags_SetInfTable(s32 flag); void Flags_SetInfTable(s32 flag);
s32 Flags_GetRandomizerInf(RandomizerInf flag);
void Flags_SetRandomizerInf(RandomizerInf flag);
u16 func_80037C30(GlobalContext* globalCtx, s16 arg1); u16 func_80037C30(GlobalContext* globalCtx, s16 arg1);
s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3); s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3);
s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4); s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4);
@ -855,6 +862,7 @@ void Cutscene_HandleEntranceTriggers(GlobalContext* globalCtx);
void Cutscene_HandleConditionalTriggers(GlobalContext* globalCtx); void Cutscene_HandleConditionalTriggers(GlobalContext* globalCtx);
void Cutscene_SetSegment(GlobalContext* globalCtx, void* segment); void Cutscene_SetSegment(GlobalContext* globalCtx, void* segment);
void GetItem_Draw(GlobalContext* globalCtx, s16 drawId); void GetItem_Draw(GlobalContext* globalCtx, s16 drawId);
void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry);
void SoundSource_InitAll(GlobalContext* globalCtx); void SoundSource_InitAll(GlobalContext* globalCtx);
void SoundSource_UpdateAll(GlobalContext* globalCtx); void SoundSource_UpdateAll(GlobalContext* globalCtx);
void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* pos, s32 duration, u16 sfxId); void SoundSource_PlaySfxAtFixedWorldPos(GlobalContext* globalCtx, Vec3f* pos, s32 duration, u16 sfxId);
@ -1050,6 +1058,7 @@ void Interface_LoadItemIcon1(GlobalContext* globalCtx, u16 button);
void Interface_LoadItemIcon2(GlobalContext* globalCtx, u16 button); void Interface_LoadItemIcon2(GlobalContext* globalCtx, u16 button);
void func_80084BF4(GlobalContext* globalCtx, u16 flag); void func_80084BF4(GlobalContext* globalCtx, u16 flag);
u8 Item_Give(GlobalContext* globalCtx, u8 item); u8 Item_Give(GlobalContext* globalCtx, u8 item);
u16 Randomizer_Item_Give(GlobalContext* globalCtx, GetItemEntry giEntry);
u8 Item_CheckObtainability(u8 item); u8 Item_CheckObtainability(u8 item);
void Inventory_DeleteItem(u16 item, u16 invSlot); void Inventory_DeleteItem(u16 item, u16 invSlot);
s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u16 oldItem, u16 newItem); s32 Inventory_ReplaceItem(GlobalContext* globalCtx, u16 oldItem, u16 newItem);

View File

@ -3,32 +3,12 @@
#include "global.h" #include "global.h"
#include "message_data_fmt.h" #include "message_data_fmt.h"
#include "message_data_textbox_types.h"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
typedef enum {
/* 0 */ TEXTBOX_TYPE_BLACK,
/* 1 */ TEXTBOX_TYPE_WOODEN,
/* 2 */ TEXTBOX_TYPE_BLUE,
/* 3 */ TEXTBOX_TYPE_OCARINA,
/* 4 */ TEXTBOX_TYPE_NONE_BOTTOM,
/* 5 */ TEXTBOX_TYPE_NONE_NO_SHADOW,
/* 11 */ TEXTBOX_TYPE_CREDITS = 11
} TextBoxType;
typedef enum {
/* 0 */ TEXTBOX_BG_CROSS
} TextBoxBackground;
typedef enum {
/* 0 */ TEXTBOX_POS_VARIABLE,
/* 1 */ TEXTBOX_POS_TOP,
/* 2 */ TEXTBOX_POS_MIDDLE,
/* 3 */ TEXTBOX_POS_BOTTOM
} TextBoxPosition;
typedef struct { typedef struct {
u16 textId; u16 textId;
u8 typePos; u8 typePos;

View File

@ -0,0 +1,25 @@
#ifndef MESSAGE_DATA_TEXTBOX_TYPES_H
#define MESSAGE_DATA_TEXTBOX_TYPES_H
typedef enum {
/* 0 */ TEXTBOX_TYPE_BLACK,
/* 1 */ TEXTBOX_TYPE_WOODEN,
/* 2 */ TEXTBOX_TYPE_BLUE,
/* 3 */ TEXTBOX_TYPE_OCARINA,
/* 4 */ TEXTBOX_TYPE_NONE_BOTTOM,
/* 5 */ TEXTBOX_TYPE_NONE_NO_SHADOW,
/* 11 */ TEXTBOX_TYPE_CREDITS = 11
} TextBoxType;
typedef enum {
/* 0 */ TEXTBOX_BG_CROSS
} TextBoxBackground;
typedef enum {
/* 0 */ TEXTBOX_POS_VARIABLE,
/* 1 */ TEXTBOX_POS_TOP,
/* 2 */ TEXTBOX_POS_MIDDLE,
/* 3 */ TEXTBOX_POS_BOTTOM
} TextBoxPosition;
#endif

View File

@ -271,7 +271,8 @@ typedef enum {
/* 0x16 */ ITEM00_SHIELD_HYLIAN, /* 0x16 */ ITEM00_SHIELD_HYLIAN,
/* 0x17 */ ITEM00_TUNIC_ZORA, /* 0x17 */ ITEM00_TUNIC_ZORA,
/* 0x18 */ ITEM00_TUNIC_GORON, /* 0x18 */ ITEM00_TUNIC_GORON,
/* 0x19 */ ITEM00_BOMBS_SPECIAL /* 0x19 */ ITEM00_BOMBS_SPECIAL,
/* 0x20 */ ITEM00_BOMBCHU,
} Item00Type; } Item00Type;
struct EnItem00; struct EnItem00;

View File

@ -244,50 +244,6 @@ typedef enum {
/* 0x99 */ ITEM_STICK_UPGRADE_30, /* 0x99 */ ITEM_STICK_UPGRADE_30,
/* 0x9A */ ITEM_NUT_UPGRADE_30, /* 0x9A */ ITEM_NUT_UPGRADE_30,
/* 0x9B */ ITEM_NUT_UPGRADE_40, /* 0x9B */ ITEM_NUT_UPGRADE_40,
/* 0x9C */ ITEM_BOTTLE_WITH_RED_POTION,
/* 0x9D */ ITEM_BOTTLE_WITH_GREEN_POTION,
/* 0x9E */ ITEM_BOTTLE_WITH_BLUE_POTION,
/* 0x9F */ ITEM_BOTTLE_WITH_FAIRY,
/* 0xA0 */ ITEM_BOTTLE_WITH_FISH,
/* 0xA1 */ ITEM_BOTTLE_WITH_BLUE_FIRE,
/* 0xA2 */ ITEM_BOTTLE_WITH_BUGS,
/* 0xA3 */ ITEM_BOTTLE_WITH_POE,
/* 0xA4 */ ITEM_BOTTLE_WITH_BIG_POE,
/* 0xA5 */ ITEM_GERUDO_FORTRESS_SMALL_KEY,
/* 0xA6 */ ITEM_FOREST_TEMPLE_SMALL_KEY,
/* 0xA7 */ ITEM_FIRE_TEMPLE_SMALL_KEY,
/* 0xA8 */ ITEM_WATER_TEMPLE_SMALL_KEY,
/* 0xA9 */ ITEM_SPIRIT_TEMPLE_SMALL_KEY,
/* 0xAA */ ITEM_SHADOW_TEMPLE_SMALL_KEY,
/* 0xAB */ ITEM_BOTTOM_OF_THE_WELL_SMALL_KEY,
/* 0xAC */ ITEM_GERUDO_TRAINING_GROUNDS_SMALL_KEY,
/* 0xAD */ ITEM_GANONS_CASTLE_SMALL_KEY,
/* 0xAE */ ITEM_FOREST_TEMPLE_BOSS_KEY,
/* 0xAF */ ITEM_FIRE_TEMPLE_BOSS_KEY,
/* 0xB0 */ ITEM_WATER_TEMPLE_BOSS_KEY,
/* 0xB1 */ ITEM_SPIRIT_TEMPLE_BOSS_KEY,
/* 0xB2 */ ITEM_SHADOW_TEMPLE_BOSS_KEY,
/* 0xB3 */ ITEM_GANONS_CASTLE_BOSS_KEY,
/* 0xB4 */ ITEM_DEKU_TREE_MAP,
/* 0xB5 */ ITEM_DODONGOS_CAVERN_MAP,
/* 0xB6 */ ITEM_JABU_JABUS_BELLY_MAP,
/* 0xB7 */ ITEM_FOREST_TEMPLE_MAP,
/* 0xB8 */ ITEM_FIRE_TEMPLE_MAP,
/* 0xB9 */ ITEM_WATER_TEMPLE_MAP,
/* 0xBA */ ITEM_SPIRIT_TEMPLE_MAP,
/* 0xBB */ ITEM_SHADOW_TEMPLE_MAP,
/* 0xBC */ ITEM_BOTTOM_OF_THE_WELL_MAP,
/* 0xBD */ ITEM_ICE_CAVERN_MAP,
/* 0xBE */ ITEM_DEKU_TREE_COMPASS,
/* 0xBF */ ITEM_DODONGOS_CAVERN_COMPASS,
/* 0xC0 */ ITEM_JABU_JABUS_BELLY_COMPASS,
/* 0xC1 */ ITEM_FOREST_TEMPLE_COMPASS,
/* 0xC2 */ ITEM_FIRE_TEMPLE_COMPASS,
/* 0xC3 */ ITEM_WATER_TEMPLE_COMPASS,
/* 0xC4 */ ITEM_SPIRIT_TEMPLE_COMPASS,
/* 0xC5 */ ITEM_SHADOW_TEMPLE_COMPASS,
/* 0xC6 */ ITEM_BOTTOM_OF_THE_WELL_COMPASS,
/* 0xC7 */ ITEM_ICE_CAVERN_COMPASS,
/* 0xFC */ ITEM_LAST_USED = 0xFC, /* 0xFC */ ITEM_LAST_USED = 0xFC,
/* 0xFE */ ITEM_NONE_FE = 0xFE, /* 0xFE */ ITEM_NONE_FE = 0xFE,
/* 0xFF */ ITEM_NONE = 0xFF /* 0xFF */ ITEM_NONE = 0xFF
@ -424,86 +380,7 @@ typedef enum {
/* 0x7B */ GI_BULLET_BAG_50, /* 0x7B */ GI_BULLET_BAG_50,
/* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest /* 0x7C */ GI_ICE_TRAP, // freezes link when opened from a chest
/* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg) /* 0x7D */ GI_TEXT_0, // no model appears over Link, shows text id 0 (pocket egg)
/* 0x84 */ GI_MAX
/* 0x7E */ GI_MEDALLION_LIGHT,
/* 0x7F */ GI_MEDALLION_FOREST,
/* 0x80 */ GI_MEDALLION_FIRE,
/* 0x81 */ GI_MEDALLION_WATER,
/* 0x82 */ GI_MEDALLION_SHADOW,
/* 0x83 */ GI_MEDALLION_SPIRIT,
/* 0x84 */ GI_STONE_KOKIRI,
/* 0x85 */ GI_STONE_GORON,
/* 0x86 */ GI_STONE_ZORA,
/* 0x87 */ GI_ZELDAS_LULLABY,
/* 0x88 */ GI_SUNS_SONG,
/* 0x89 */ GI_EPONAS_SONG,
/* 0x8A */ GI_SONG_OF_STORMS,
/* 0x8B */ GI_SONG_OF_TIME,
/* 0x8C */ GI_SARIAS_SONG,
/* 0x8D */ GI_MINUET_OF_FOREST,
/* 0x8E */ GI_BOLERO_OF_FIRE,
/* 0x8F */ GI_SERENADE_OF_WATER,
/* 0x90 */ GI_NOCTURNE_OF_SHADOW,
/* 0x91 */ GI_REQUIEM_OF_SPIRIT,
/* 0x92 */ GI_PRELUDE_OF_LIGHT,
/* 0x93 */ GI_SINGLE_MAGIC,
/* 0x94 */ GI_DOUBLE_MAGIC,
/* 0x95 */ GI_DOUBLE_DEFENSE,
/* 0x96 */ GI_BOTTLE_WITH_RED_POTION,
/* 0x97 */ GI_BOTTLE_WITH_GREEN_POTION,
/* 0x98 */ GI_BOTTLE_WITH_BLUE_POTION,
/* 0x99 */ GI_BOTTLE_WITH_FAIRY,
/* 0x9A */ GI_BOTTLE_WITH_FISH,
/* 0x9B */ GI_BOTTLE_WITH_BLUE_FIRE,
/* 0x9C */ GI_BOTTLE_WITH_BUGS,
/* 0x9D */ GI_BOTTLE_WITH_POE,
/* 0x9E */ GI_BOTTLE_WITH_BIG_POE,
/* 0x9F */ GI_GERUDO_FORTRESS_SMALL_KEY,
/* 0xA0 */ GI_FOREST_TEMPLE_SMALL_KEY,
/* 0xA1 */ GI_FIRE_TEMPLE_SMALL_KEY,
/* 0xA2 */ GI_WATER_TEMPLE_SMALL_KEY,
/* 0xA3 */ GI_SPIRIT_TEMPLE_SMALL_KEY,
/* 0xA4 */ GI_SHADOW_TEMPLE_SMALL_KEY,
/* 0xA5 */ GI_BOTTOM_OF_THE_WELL_SMALL_KEY,
/* 0xA6 */ GI_GERUDO_TRAINING_GROUNDS_SMALL_KEY,
/* 0xA7 */ GI_GANONS_CASTLE_SMALL_KEY,
/* 0xA8 */ GI_FOREST_TEMPLE_BOSS_KEY,
/* 0xA9 */ GI_FIRE_TEMPLE_BOSS_KEY,
/* 0xAA */ GI_WATER_TEMPLE_BOSS_KEY,
/* 0xAB */ GI_SPIRIT_TEMPLE_BOSS_KEY,
/* 0xAC */ GI_SHADOW_TEMPLE_BOSS_KEY,
/* 0xAD */ GI_GANONS_CASTLE_BOSS_KEY,
/* 0xAE */ GI_DEKU_TREE_MAP,
/* 0xAF */ GI_DODONGOS_CAVERN_MAP,
/* 0xB0 */ GI_JABU_JABUS_BELLY_MAP,
/* 0xB1 */ GI_FOREST_TEMPLE_MAP,
/* 0xB2 */ GI_FIRE_TEMPLE_MAP,
/* 0xB3 */ GI_WATER_TEMPLE_MAP,
/* 0xB4 */ GI_SPIRIT_TEMPLE_MAP,
/* 0xB5 */ GI_SHADOW_TEMPLE_MAP,
/* 0xB6 */ GI_BOTTOM_OF_THE_WELL_MAP,
/* 0xB7 */ GI_ICE_CAVERN_MAP,
/* 0xB8 */ GI_DEKU_TREE_COMPASS,
/* 0xB9 */ GI_DODONGOS_CAVERN_COMPASS,
/* 0xBA */ GI_JABU_JABUS_BELLY_COMPASS,
/* 0xBB */ GI_FOREST_TEMPLE_COMPASS,
/* 0xBC */ GI_FIRE_TEMPLE_COMPASS,
/* 0xBD */ GI_WATER_TEMPLE_COMPASS,
/* 0xBE */ GI_SPIRIT_TEMPLE_COMPASS,
/* 0xBF */ GI_SHADOW_TEMPLE_COMPASS,
/* 0xC0 */ GI_BOTTOM_OF_THE_WELL_COMPASS,
/* 0xC1 */ GI_ICE_CAVERN_COMPASS,
/* 0xAE */ GI_MAX
} GetItemID; } GetItemID;
typedef enum { typedef enum {

View File

@ -2,17 +2,10 @@
#define Z64PLAYER_H #define Z64PLAYER_H
#include "z64actor.h" #include "z64actor.h"
#include "soh/Enhancements/item-tables/ItemTableTypes.h"
struct Player; struct Player;
typedef struct {
/* 0x00 */ u8 itemId;
/* 0x01 */ u8 field; // various bit-packed data
/* 0x02 */ s8 gi; // defines the draw id and chest opening animation
/* 0x03 */ u8 textId;
/* 0x04 */ u16 objectId;
} GetItemEntry; // size = 0x06
extern GetItemEntry sGetItemTable[195]; extern GetItemEntry sGetItemTable[195];
typedef enum { typedef enum {
@ -366,7 +359,7 @@ typedef struct {
/* 0x00 */ s32 active; /* 0x00 */ s32 active;
/* 0x04 */ Vec3f tip; /* 0x04 */ Vec3f tip;
/* 0x10 */ Vec3f base; /* 0x10 */ Vec3f base;
} WeaponInfo; // size = 0x1C\ } WeaponInfo; // size = 0x1C
typedef enum { typedef enum {
FLAG_NONE, FLAG_NONE,
@ -374,7 +367,8 @@ typedef enum {
FLAG_SCENE_TREASURE, FLAG_SCENE_TREASURE,
FLAG_SCENE_CLEAR, FLAG_SCENE_CLEAR,
FLAG_SCENE_COLLECTIBLE, FLAG_SCENE_COLLECTIBLE,
FLAG_COW_MILKED FLAG_EVENT_CHECK_INF,
FLAG_RANDOMIZER_INF
} FlagType; } FlagType;
typedef struct { typedef struct {
@ -639,6 +633,7 @@ typedef struct Player {
/* 0x0A89 */ bool pendingIceTrap; /* 0x0A89 */ bool pendingIceTrap;
/* 0x0A95 */ PendingFlag pendingFlag; /* 0x0A95 */ PendingFlag pendingFlag;
/* 0x0AA1 */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still? /* 0x0AA1 */ u8 boomerangQuickRecall; // Has the player pressed the boomerang button while it's in the air still?
} Player; // size = 0xAA2 /* 0x0AA2 */ GetItemEntry getItemEntry;
} Player; // size = 0xAAA
#endif #endif

View File

@ -5,6 +5,7 @@
#include "z64math.h" #include "z64math.h"
#include "z64audio.h" #include "z64audio.h"
#include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/randomizerTypes.h"
#include "soh/Enhancements/randomizer/randomizer_inf.h"
typedef struct { typedef struct {
/* 0x00 */ u8 buttonItems[8]; /* 0x00 */ u8 buttonItems[8];
@ -182,9 +183,7 @@ typedef struct {
char ganonHintText[150]; char ganonHintText[150];
char ganonText[250]; char ganonText[250];
u8 seedIcons[5]; u8 seedIcons[5];
u8 dungeonsDone[8]; u16 randomizerInf[2];
u8 trialsDone[6];
u8 cowsMilked[10];
u8 temporaryWeapon; u8 temporaryWeapon;
u16 adultTradeItems; u16 adultTradeItems;
} SaveContext; // size = 0x1428 } SaveContext; // size = 0x1428

View File

@ -1,8 +1,69 @@
#!/bin/sh #!/bin/bash
BUNDLE="`echo "$0" | sed -e 's/\/Contents\/MacOS\/.*//'`"
RESOURCES="$BUNDLE/Contents/Resources"
export DYLD_FRAMEWORK_PATH=$RESOURCES/Frameworks SNAME="$(dirname $0)"
export DYLD_LIBRARY_PATH=$RESOURCES/bin export DATA_SHARE="$HOME/Library/Application Support/com.shipofharkinian.soh"
export SNAME
export RESPATH="${SNAME%/MacOS*}/Resources"
export LIBPATH="${SNAME%/MacOS*}/Frameworks"
export DYLD_FALLBACK_LIBRARY_PATH="$LIBPATH"
exec "$RESOURCES/soh-macos" while [ ! -e "$DATA_SHARE/oot.otr" ]; do
ASSETDIR="$(mktemp -d /tmp/assets-XXXXX)"
export ASSETDIR
cp -r "$RESPATH/assets" "$ASSETDIR"
mkdir -p "$ASSETDIR"/tmp
mkdir -p "$ASSETDIR"/Extract/assets
DROPROM="$(osascript -ss - "$ASSETDIR" <<-EOF
set romFile to choose file of type {"b64","n64","v64","z64"} with prompt "Please select your ROM:"
set destinationFolder to POSIX file "$ASSETDIR"
tell application "Finder"
duplicate romFile to destinationFolder
end tell
EOF
)"
"$DROPROM"
for rom in "$ASSETDIR"/*.*64
do
if [ ! -e "$rom" ]; then
echo "no ROM"
osascript -e 'display dialog "Select ROM to generate OTR" giving up after 5'
rm -r "$ASSETDIR"
exit
fi
done
cp "$ASSETDIR"/*.*64 "$ASSETDIR"/tmp/rom.z64
cp -r "$ASSETDIR"/assets/game/ship_of_harkinian "$ASSETDIR"/Extract/assets/
cd "$ASSETDIR" || return
ROMHASH="$(shasum "$ASSETDIR"/tmp/rom.z64 | awk '{ print $1 }')"
case "$ROMHASH" in
cee6bc3c2a634b41728f2af8da54d9bf8cc14099)
export ROM=GC_NMQ_D;;
0227d7c0074f2d0ac935631990da8ec5914597b4)
export ROM=GC_NMQ_PAL_F;;
*)
WRONGHASH="$(osascript -ss - "$ROMHASH" <<-EOF
display dialog "Incompatible ROM hash $ROMHASH" \
with title "Incompatible ROM hash" \
with icon caution \
giving up after 5
EOF
)"
"$WRONGHASH"
rm -r "$ASSETDIR"
exit;;
esac
echo "$ROM"
osascript -e 'display notification "Processing OTR..." with title "SOH: Generating OTR"'
assets/extractor/ZAPD.out ed -i assets/extractor/xmls/"${ROM}" -b tmp/rom.z64 -fl assets/extractor/filelists -o placeholder -osf placeholder -gsf 1 -rconf assets/extractor/Config_"${ROM}".xml -se OTR
if [ -e "$PWD"/oot.otr ]; then
osascript -e 'display notification "OTR Successfully Generated" with title "SOH: Generating OTR"'
if [ ! -e "$DATA_SHARE" ]; then mkdir "$DATA_SHARE"; fi
cp "$ASSETDIR"/oot.otr "$DATA_SHARE"
rm -r "$ASSETDIR"
fi
break
done
"$RESPATH"/soh-macos
exit

View File

@ -25,6 +25,10 @@ void BootCommands_Init()
CVar_RegisterS32("gDebugEnabled", 0); CVar_RegisterS32("gDebugEnabled", 0);
CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French CVar_RegisterS32("gLanguages", 0); //0 = English / 1 = German / 2 = French
CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom CVar_RegisterS32("gHudColors", 1); //0 = N64 / 1 = NGC / 2 = Custom
CVar_RegisterS32("gInvertYAxis", 1);
#if defined(__SWITCH__) || defined(__WIIU__)
CVar_RegisterS32("gControlNav", 1); // always enable controller nav on switch/wii u
#endif
} }
//void BootCommands_ParseBootArgs(char* str) //void BootCommands_ParseBootArgs(char* str)

View File

@ -216,6 +216,26 @@ namespace GameControlEditor {
ImGui::EndTable(); ImGui::EndTable();
} }
void DrawCameraControlPanel() {
if (!ImGui::CollapsingHeader("Camera Controls")) {
return;
}
ImVec2 cursor = ImGui::GetCursorPos();
ImGui::SetCursorPos(ImVec2(cursor.x + 5, cursor.y + 5));
SohImGui::PaddedEnhancementCheckbox("Invert Camera X Axis", "gInvertXAxis");
SohImGui::Tooltip("Inverts the Camera X Axis in:\n-Free camera\n-C-Up view\n-Weapon Aiming");
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
SohImGui::PaddedEnhancementCheckbox("Invert Camera Y Axis", "gInvertYAxis");
SohImGui::Tooltip("Inverts the Camera Y Axis in:\n-Free camera\n-C-Up view\n-Weapon Aiming");
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
SohImGui::PaddedEnhancementCheckbox("Right Stick Aiming", "gRightStickAiming");
SohImGui::Tooltip("Allows for aiming with the rights stick when:\n-Aiming in the C-Up view\n-Aiming with weapons");
ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 5);
SohImGui::PaddedEnhancementCheckbox("Auto-Center First Person View", "gAutoCenterView");
SohImGui::Tooltip("Prevents the C-Up view from auto-centering, allowing for Gyro Aiming");
}
void DrawUI(bool& open) { void DrawUI(bool& open) {
if (!open) { if (!open) {
CVar_SetS32("gGameControlEditorEnabled", false); CVar_SetS32("gGameControlEditorEnabled", false);
@ -225,6 +245,7 @@ namespace GameControlEditor {
ImGui::SetNextWindowSize(ImVec2(465, 430), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ImVec2(465, 430), ImGuiCond_FirstUseEver);
if (ImGui::Begin("Game Controls Configuration", &open)) { if (ImGui::Begin("Game Controls Configuration", &open)) {
DrawOcarinaControlPanel(); DrawOcarinaControlPanel();
DrawCameraControlPanel();
} }
ImGui::End(); ImGui::End();
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,407 @@
#pragma once #pragma once
#include "../libultraship/ImGuiImpl.h"
#define SECTION_SIZE(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
#define RANDOMIZE_32(Max) GetRandomValue(Max);
#define CATEGORY_NPC 0
#define CATEGORY_ITEMS 1
#define CATEGORY_MENU 2
#define CATEGORY_HUD 3
#define CATEGORY_MISC 4
typedef struct {
const std::string Name;
const std::string ToolTip;
const std::string CvarName;
ImVec4 ModifiedColor;
ImVec4 DefaultColor;
bool canRainbow;
bool hasAlpha;
bool sameLine;
} CosmeticsColorIndividual;
typedef struct {
CosmeticsColorIndividual* Element;
bool Nextcol;
bool NextLine;
} CosmeticsColorSection;
static float TablesCellsWidth = 300.0f;
static ImGuiTableColumnFlags FlagsTable = ImGuiTableFlags_BordersH | ImGuiTableFlags_BordersV;
static ImGuiTableColumnFlags FlagsCell = ImGuiTableColumnFlags_WidthStretch | ImGuiTableColumnFlags_IndentEnable | ImGuiTableColumnFlags_NoSort;
static ImVec4 hearts_colors; static ImVec4 hearts_dd_colors; static ImVec4 hearts_ddi_colors;
static ImVec4 a_btn_colors; static ImVec4 b_btn_colors; static ImVec4 c_btn_colors; static ImVec4 start_btn_colors;
static ImVec4 c_btn_u_colors; static ImVec4 c_btn_l_colors; static ImVec4 c_btn_d_colors; static ImVec4 c_btn_r_colors;
static ImVec4 magic_border_colors; static ImVec4 magic_remaining_colors; static ImVec4 magic_use_colors;
static ImVec4 minimap_colors; static ImVec4 dgn_minimap_colors;
static ImVec4 cp_minimap_colors; static ImVec4 le_minimap_colors;
static ImVec4 rupee_colors; static ImVec4 smolekey_colors; static ImVec4 magic_bordern_colors;
static ImVec4 fileselect_colors; static ImVec4 fileselect_text_colors;
static ImVec4 kokiri_col; static ImVec4 goron_col; static ImVec4 zora_col;
static ImVec4 navi_idle_i_col; static ImVec4 navi_idle_o_col;
static ImVec4 navi_npc_i_col; static ImVec4 navi_npc_o_col;
static ImVec4 navi_enemy_i_col; static ImVec4 navi_enemy_o_col;
static ImVec4 navi_prop_i_col; static ImVec4 navi_prop_o_col;
static ImVec4 trailscol;
static ImVec4 crtfilter;
static ImVec4 firearrow_col; static ImVec4 icearrow_col; static ImVec4 lightarrow_col;
static ImVec4 firearrow_colenv; static ImVec4 icearrow_colenv; static ImVec4 lightarrow_colenv;
static ImVec4 charged1_col; static ImVec4 charged2_col;
static ImVec4 charged1_colenv; static ImVec4 charged2_colenv;
static ImVec4 Keese1_primcol; static ImVec4 Keese2_primcol;
static ImVec4 Keese1_envcol; static ImVec4 Keese2_envcol;
static ImVec4 doggo1col; static ImVec4 doggo2col;
static ImVec4 df_col; static ImVec4 df_colenv;
static ImVec4 nl_diam_col; static ImVec4 nl_diam_colenv;
static ImVec4 nl_orb_col; static ImVec4 nl_orb_colenv;
static ImVec4 tc_ou_colors; static ImVec4 tc_bu_colors;
static ImVec4 dpad_colors;
static ImVec4 visualagony_colors;
static ImVec4 tc_fire_colors; static ImVec4 tc_fire_colors_env;
/*ImVec4 menu_equips_colors;
ImVec4 menu_items_colors;
ImVec4 menu_map_colors;
ImVec4 menu_quest_colors;
ImVec4 menu_save_colors;
ImVec4 menu_gameover_colors;*/
//Navi
static CosmeticsColorIndividual Navi_Idle_Inner = { "Navi Idle (Primary)", "Inner color for Navi (idle flying around)", "gNavi_Idle_Inner_", navi_idle_i_col, ImVec4(255, 255, 255, 255), false, false, false };
static CosmeticsColorIndividual Navi_Idle_Outer = { "Navi Idle (Secondary)", "Outer color for Navi (idle flying around)", "gNavi_Idle_Outer_", navi_idle_o_col, ImVec4(0, 0, 255, 255), false, false, false };
static CosmeticsColorIndividual Navi_Npc_Inner = { "Navi NPC (Primary)", "Inner color for Navi (when Navi fly around NPCs)", "gNavi_NPC_Inner_", navi_npc_i_col, ImVec4(150, 150, 255, 255), false, false, false };
static CosmeticsColorIndividual Navi_Npc_Outer = { "Navi NPC (Secondary)", "Outer color for Navi (when Navi fly around NPCs)", "gNavi_NPC_Outer_", navi_npc_o_col, ImVec4(150, 150, 255, 255), false, false, false };
static CosmeticsColorIndividual Navi_Enemy_Inner = { "Navi Enemy (Primary)", "Inner color for Navi (when Navi fly around Enemies or Bosses)", "gNavi_Enemy_Inner_", navi_enemy_i_col, ImVec4(255, 255, 0, 255), false, false, false };
static CosmeticsColorIndividual Navi_Enemy_Outer = { "Navi Enemy (Secondary)", "Outer color for Navi (when Navi fly around Enemies or Bosses)", "gNavi_Enemy_Outer_", navi_enemy_o_col, ImVec4(220, 155, 0, 255), false, false, false };
static CosmeticsColorIndividual Navi_Prop_Inner = { "Navi Enemy (Primary)", "Inner color for Navi (when Navi fly around props (signs etc))", "gNavi_Prop_Inner_", navi_prop_i_col, ImVec4(0, 255, 0, 255), false, false, false };
static CosmeticsColorIndividual Navi_Prop_Outer = { "Navi Enemy (Secondary)", "Outer color for Navi (when Navi fly around props (signs etc))", "gNavi_Prop_Outer_", navi_prop_o_col, ImVec4(0, 255, 0, 255), false, false, false };
//Keese
static CosmeticsColorIndividual Keese1_prim = { "Fire Primary color", "Affects the primary color of the Fire itself of the Keese", "gKeese1_Ef_Prim", Keese1_primcol, ImVec4(255, 255, 100, 255), true, false, false };
static CosmeticsColorIndividual Keese2_prim = { "Ice Primary color", "Affects the primary color of the Ice itself of the Keese", "gKeese2_Ef_Prim", Keese2_primcol, ImVec4(100, 200, 255, 255), true, false, false };
static CosmeticsColorIndividual Keese1_env = { "Fire Secondary color", "Affects the secondary color of the Fire itself of the Keese", "gKeese1_Ef_Env", Keese1_envcol, ImVec4(255, 50, 0, 255), true, false, false };
static CosmeticsColorIndividual Keese2_env = { "Ice Secondary color", "Affects the secondary color of the Ice itself of the Keese", "gKeese2_Ef_Env", Keese2_envcol, ImVec4(0, 0, 255, 255), true, false, false };
//Good old Dogs, we all love them
static CosmeticsColorIndividual DogN1 = { "Dog white", "Affects the colors of the white dog", "gDog1Col", doggo1col, ImVec4(255,255,200,255), true, false, true };
static CosmeticsColorIndividual DogN2 = { "Dog brown", "Affects the colors of the brown dog", "gDog2Col", doggo2col, ImVec4(150,100,50,255), true, false, true };
//Tunics colors
static CosmeticsColorIndividual KokiriTunic = { "Kokiri Tunic", "Affects Kokiri Tunic color", "gTunic_Kokiri", kokiri_col, ImVec4(30, 105, 27, 255), true, false, true };
static CosmeticsColorIndividual GoronTunic = { "Goron Tunic", "Affects Goron Tunic color", "gTunic_Goron", goron_col, ImVec4(100, 20, 0, 255), true, false, true };
static CosmeticsColorIndividual ZoraTunic = { "Zora Tunic", "Affects Zora Tunic color", "gTunic_Zora", zora_col, ImVec4(0, 60, 100, 255), true, false, true };
//Arrows (Fire -> Ice -> Light)
static CosmeticsColorIndividual Fire_Arrow_Prim = { "Fire Arrows (primary)", "Affects Primary color", "gFireArrowCol", firearrow_col, ImVec4(255,200,0,255), true, false, false };
static CosmeticsColorIndividual Fire_Arrow_Env = { "Fire Arrows (Secondary)", "Affects Secondary color", "gFireArrowColEnv", firearrow_colenv, ImVec4(255,0,0,255), true, false, false };
static CosmeticsColorIndividual Ice_Arrow_Prim = { "Ice Arrows (Primary)", "Affects Primary color", "gIceArrowCol", icearrow_col, ImVec4(170,255,255,255), true, false, false };
static CosmeticsColorIndividual Ice_Arrow_Env = { "Ice Arrows (Secondary)", "Affects Secondary color", "gIceArrowColEnv", icearrow_colenv, ImVec4(0,0,255,255), true, false, false };
static CosmeticsColorIndividual Light_Arrow_Prim = { "Light Arrows (Primary)", "Affects Primary color", "gLightArrowCol", lightarrow_col, ImVec4(255,255,170,255), true, false, false };
static CosmeticsColorIndividual Light_Arrow_Env = { "Light Arrows (Secondary)", "Affects Secondary color", "gLightArrowColEnv", lightarrow_colenv, ImVec4(255,255,0,255), true, false, false };
//Spells
static CosmeticsColorIndividual Din_Fire_Prim = { "Din's Fire (primary)", "Affects Primary color", "gDF_Col", df_col, ImVec4(255,200,0,255), true, false, false };
static CosmeticsColorIndividual Din_Fire_Env = { "Din's Fire (Secondary)", "Affects Secondary color", "gDF_Env", df_colenv, ImVec4(255,0,0,255), true, false, false };
static CosmeticsColorIndividual Nayru_Diamond_Prim = { "Nayru's Love Diamond (primary)", "Affects Primary color", "gNL_Diamond_Col", nl_diam_col, ImVec4(170,255,255,255), true, false, false };
static CosmeticsColorIndividual Nayru_Diamond_Env = { "Nayru's Love Diamond (Secondary)", "Affects Secondary color", "gNL_Diamond_Env", nl_diam_colenv, ImVec4(100,255,128,255), true, false, false };
static CosmeticsColorIndividual Nayru_Orb_Prim = { "Nayru's Love Orb (primary)", "Affects Primary color", "gNL_Orb_Col", nl_orb_col, ImVec4(170,255,255,255), true, false, false };
static CosmeticsColorIndividual Nayru_Orb_Env = { "Nayru's Love Orb (Secondary)", "Affects Secondary color", "gNL_Orb_Env", nl_orb_colenv, ImVec4(150,255,255,255), true, false, false };
//Spin attacks colors
static CosmeticsColorIndividual Spin_Lv1_Prim = { "Level 1 (primary)", "Affects Primary color", "gCharged1Col", charged1_col, ImVec4(170,255,255,255), true, false, false };
static CosmeticsColorIndividual Spin_Lv1_Env = { "Level 1 (Secondary)", "Affects Secondary color", "gCharged1ColEnv", charged1_colenv, ImVec4(0,100,255,255), true, false, false };
static CosmeticsColorIndividual Spin_Lv2_Prim = { "Level 2 (primary)", "Affects Primary color", "gCharged2Col", charged2_col, ImVec4(255,255,170,255), true, false, false };
static CosmeticsColorIndividual Spin_Lv2_Env = { "Level 2 (Secondary)", "Affects Secondary color", "gCharged2ColEnv", charged2_colenv, ImVec4(255,100,0,255), true, false, false };
//Trails
static CosmeticsColorIndividual Trails_col = { "Trails color", "Affects Swords slash, boomerang and Bombchu trails color", "gTrailCol", trailscol, ImVec4(255,255,255,255), true, false, false };
//Menus - File Choose
static CosmeticsColorIndividual FileChoose_Background = { "Main menu color", "Affects the File Select menu background.", "gCCFileChoosePrim", fileselect_colors, ImVec4(100, 150, 255, 255), true, false, false };
static CosmeticsColorIndividual FileChoose_BottomText = { "Bottom texts color", "Affects the File Select texts.", "gCCFileChooseTextPrim", fileselect_text_colors, ImVec4(100, 255, 255, 255), true, false, false };
//Hud Stuff (Dpad, Buttons etc)
static CosmeticsColorIndividual A_Btn = { "A Button", "Affects the A button colors (and various cursors that use the same theme)", "gCCABtnPrim", a_btn_colors, ImVec4(0, 200, 50, 255), true, false, false };
static CosmeticsColorIndividual B_Btn = { "B Button", "Affects the B button color", "gCCBBtnPrim", b_btn_colors, ImVec4(255, 30, 30, 255), true, false, false };
static CosmeticsColorIndividual C_Btn = { "C-Buttons", "Affects the C Buttons' color (if not using separate colors)\nAnd various cursor that use C-Buttons colors", "gCCCBtnPrim", c_btn_colors, ImVec4(255, 160, 0, 255), true, false, false };
static CosmeticsColorIndividual C_Btn_U = { "C-Buttons Up", "Affects C-Buttons Up colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCUBtnPrim", c_btn_u_colors, ImVec4(255,160,0,255), true, false, false };
static CosmeticsColorIndividual C_Btn_D = { "C-Buttons Down", "Affects C-Buttons Down colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCDBtnPrim", c_btn_d_colors, ImVec4(255,160,0,255), true, false, false };
static CosmeticsColorIndividual C_Btn_L = { "C-Buttons Left", "Affects C-Buttons Left colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCLBtnPrim", c_btn_l_colors, ImVec4(255,160,0,255), true, false, false };
static CosmeticsColorIndividual C_Btn_R = { "C-Buttons Right", "Affects C-Buttons Right colors, but not C cursor colors\nTo edit C Cursor check C-Buttons color on top", "gCCCRBtnPrim", c_btn_r_colors, ImVec4(255,160,0,255), true, false, false };
static CosmeticsColorIndividual Start_btn = { "Start Button", "Affects the Start button color", "gCCStartBtnPrim", start_btn_colors, ImVec4(200, 0, 0, 255), true, false, false };
static CosmeticsColorIndividual DPad_Items = { "DPad background", "DPad background color, White is the default value", "gCCDpadPrim", dpad_colors, ImVec4(255, 255, 255, 255), true, false, false };
//Hearts colors
static CosmeticsColorIndividual Hearts_NInner = { "Inner (Normal)", "Affects the inner color", "gCCHeartsPrim", hearts_colors, ImVec4(255,70,50,255), true, false, false };
static CosmeticsColorIndividual Hearts_DDInner = { "Inner (Double defense)", "Affects the inner color", "gCCDDHeartsPrim", hearts_ddi_colors, ImVec4(255,70,50,255), true, false, false };
static CosmeticsColorIndividual Hearts_DDOutline = { "Outline (Double defense)", "Affects the outline color of hearts when you have Double Defense\nWhite is the default value", "gDDCCHeartsPrim", hearts_dd_colors, ImVec4(255,255,255,255), true, false, false };
//Magic Meter colors
static CosmeticsColorIndividual Magic_Borders = { "Borders", "Affects the border of the magic meter\nWhite is the default value, color change only when used one time", "gCCMagicBorderNormPrim", magic_bordern_colors, ImVec4(255,255,255,255), false, false, false };
static CosmeticsColorIndividual Magic_InUse_Borders = { "Borders in use", "Affects the border of the magic meter when being used\nWhite is the default value", "gCCMagicBorderPrim", magic_border_colors, ImVec4(255,255,255,255), false, false, false };
static CosmeticsColorIndividual Magic_Meter = { "Main color", "Affects the magic meter color\nGreen is the default value", "gCCMagicPrim", magic_remaining_colors, ImVec4(0,200,0,255), true, false, false };
static CosmeticsColorIndividual Magic_InUse_Meter = { "Main color in use", "Affects the magic meter when being used\nYellow is the default value", "gCCMagicUsePrim", magic_use_colors, ImVec4(250,250,0,255), true, false, false };
//Minimap and it's arrow colors
static CosmeticsColorIndividual Minimap_OW = { "Overworlds", "Affects the Overworld minimaps", "gCCMinimapPrim", minimap_colors, ImVec4(0, 255, 255, 255), true, false, false };
static CosmeticsColorIndividual Minimap_DG = { "Dungeons", "Affects the Dungeon minimaps", "gCCMinimapDGNPrim", dgn_minimap_colors, ImVec4(100, 255, 255, 255), true, false, false };
static CosmeticsColorIndividual Minimap_CP = { "Current position arrow", "Affects the current position arrow on the minimap\nYellow is the default value", "gCCMinimapCPPrim", cp_minimap_colors, ImVec4(200, 255, 0, 255), true, false, false };
static CosmeticsColorIndividual Minimap_LE = { "Last entrance arrow", "Affects the last entrance position arrow on the minimap\nRed is the default value", "gCCMinimapLEPrim", le_minimap_colors, ImVec4(200, 0, 0, 255), true, false, false };
//Title Cards colors
static CosmeticsColorIndividual TitleCards_OW = { "Main color (Overworld)", "Affects all the overworld title cards color, white is the default value", "gCCTC_OW_U_Prim", tc_ou_colors, ImVec4(255, 255, 255, 255), false, false, false };
static CosmeticsColorIndividual TitleCards_DG = { "Main color (Dungeon)", "Affects all the bosses title cards color, white is the default value", "gCCTC_B_U_Prim", tc_bu_colors, ImVec4(255, 255, 255, 255), false, false, false };
//Misc. colors, the one I have no clue where to put nor that aren't that important
#ifdef MASTER_QUEST
static CosmeticsColorIndividual TitleScreen_fire_Prim = { "Opening logo fire (Primary)", "Affects the fire behind the title screen logo", "gCCTCFirePrim", tc_fire_colors, ImVec4(170, 255, 255, 255), false, false, false };
static CosmeticsColorIndividual TitleScreen_fire_Env = { "Opening logo fire (Secondary)", "Affects the fire behind the title screen logo", "gCCTCFireEnv", tc_fire_colors_env, ImVec4(200, 255, 0, 255), false, false, false };
#else
static CosmeticsColorIndividual TitleScreen_fire_Prim = { "Opening logo fire (Primary)", "Affects the fire behind the title screen logo", "gCCTCFirePrim", tc_fire_colors, ImVec4(255, 255, 170, 255), false, false, false };
static CosmeticsColorIndividual TitleScreen_fire_Env = { "Opening logo fire (Secondary)", "Affects the fire behind the title screen logo", "gCCTCFireEnv", tc_fire_colors_env, ImVec4(255, 100, 0, 255), false, false, false };
#endif
static CosmeticsColorIndividual Rupee_Icon = { "Rupee icon", "Affects the Rupee icon on interface\nGreen is the default value", "gCCRupeePrim", rupee_colors, ImVec4(200, 255, 100, 255), true, false, false };
static CosmeticsColorIndividual SmallKeys_Icon = { "Small Keys icon", "Affects the Small keys icon on interface\nGray is the default value", "gCCKeysPrim", smolekey_colors, ImVec4(200, 230, 255, 255), true, false, false };
static CosmeticsColorIndividual VSOA_Icon = { "Visual Stone of agony icon", "Affects the Stone of Agony icon on interface\nWhite is the default value\nRequire room reload or activation", "gCCVSOAPrim", visualagony_colors, ImVec4(255, 255, 255, 255), true, false, false };
//Sections creation, here I regroup them in some sort of a Theme, all navi stuff together etc. It will be used to create the menu.
static CosmeticsColorSection Navi_Section[] = {
{ &Navi_Idle_Inner, false, false },
{ &Navi_Idle_Outer, true, false },
{ &Navi_Npc_Inner, false, true },
{ &Navi_Npc_Outer, true, false },
{ &Navi_Enemy_Inner, false, true },
{ &Navi_Enemy_Outer, true, false },
{ &Navi_Prop_Inner, false, true },
{ &Navi_Prop_Outer, true, false }
};
static CosmeticsColorSection Keese_Section[] = {
{ &Keese1_prim, false, false },
{ &Keese2_prim, true, false },
{ &Keese1_env, false, true },
{ &Keese2_env, true, false }
};
static CosmeticsColorSection Dogs_Section[] = {
{ &DogN1, false, false },
{ &DogN2, true, false }
};
static CosmeticsColorSection Tunics_Section[] = {
{ &KokiriTunic, false, false },
{ &GoronTunic, true, false },
{ &ZoraTunic, true, false }
};
static CosmeticsColorSection Arrows_section[] = {
{ &Fire_Arrow_Prim, false, false },
{ &Fire_Arrow_Env, true, false },
{ &Ice_Arrow_Prim, false, true },
{ &Ice_Arrow_Env, true, false },
{ &Light_Arrow_Prim, false, true },
{ &Light_Arrow_Env, true, false }
};
static CosmeticsColorSection Spells_section[] = {
{ &Din_Fire_Prim, false, false },
{ &Din_Fire_Env, true, false },
{ &Nayru_Diamond_Prim, false, true },
{ &Nayru_Diamond_Env, true, false },
{ &Nayru_Orb_Prim, false, true },
{ &Nayru_Orb_Env, true, false }
};
static CosmeticsColorSection SpinAtk_section[] = {
{ &Spin_Lv1_Prim, false, false },
{ &Spin_Lv1_Env, true, false },
{ &Spin_Lv2_Prim, false, true },
{ &Spin_Lv2_Env, true, false }
};
static CosmeticsColorSection Trails_section[] = {
{ &Trails_col, false, false }
};
static CosmeticsColorSection FileChoose_section[] = {
{ &FileChoose_Background, false, false },
{ &FileChoose_BottomText, true, false }
};
static CosmeticsColorSection A_Btn_section[] = {
{ &A_Btn, false, false }
};
static CosmeticsColorSection B_Btn_section[] = {
{ &B_Btn, false, false }
};
static CosmeticsColorSection C_Btn_Unified_section[] = {
{ &C_Btn, false, false }
};
static CosmeticsColorSection C_Btn_Separated_section[] = {
{ &C_Btn_U, false, false },
{ &C_Btn_D, false, true },
{ &C_Btn_L, false, true },
{ &C_Btn_R, false, true }
};
static CosmeticsColorSection Start_Btn_section[] = {
{ &Start_btn, false, false }
};
static CosmeticsColorSection DPad_section[] = {
{ &DPad_Items, false, false }
};
static CosmeticsColorSection Hearts_section[] = {
{ &Hearts_NInner, false, false },
{ &Hearts_DDInner, true, false },
{ &Hearts_DDOutline, true, false }
};
static CosmeticsColorSection Magic_Meter_section[] = {
{ &Magic_Borders, false, false },
{ &Magic_InUse_Borders, true, false },
{ &Magic_Meter, false, true },
{ &Magic_InUse_Meter, true, false }
};
static CosmeticsColorSection Minimap_section[] = {
{ &Minimap_OW, false, false },
{ &Minimap_DG, false, true },
{ &Minimap_CP, false, true },
{ &Minimap_LE, false, true }
};
static CosmeticsColorSection TitleCards_section[] = {
{ &TitleCards_OW, false, false },
{ &TitleCards_DG, true, false }
};
static CosmeticsColorSection Misc_section[] = {
{ &Rupee_Icon, false, false },
{ &SmallKeys_Icon, false, true },
{ &VSOA_Icon, false, true },
{ &TitleScreen_fire_Prim, false, true },
{ &TitleScreen_fire_Env, false, true }
};
//Randomizer specific stuff (by randomizer I mean within cosmetics, these section are there just for the purpose of randomizing their colors)
static CosmeticsColorSection Everything_Section[] = {
{ &TitleScreen_fire_Prim, false, true },
{ &TitleScreen_fire_Env, false, true },
{ &Navi_Idle_Inner, false, false },
{ &Navi_Idle_Outer, true, false },
{ &Navi_Npc_Inner, false, true },
{ &Navi_Npc_Outer, true, false },
{ &Navi_Enemy_Inner, false, true },
{ &Navi_Enemy_Outer, true, false },
{ &Navi_Prop_Inner, false, true },
{ &Navi_Prop_Outer, true, false },
{ &Keese1_prim, false, false },
{ &Keese2_prim, true, false },
{ &Keese1_env, false, true },
{ &Keese2_env, true, false },
{ &DogN1, false, false },
{ &DogN2, true, false },
{ &KokiriTunic, false, false },
{ &GoronTunic, true, false },
{ &ZoraTunic, true, false },
{ &Fire_Arrow_Prim, false, false },
{ &Fire_Arrow_Env, true, false },
{ &Ice_Arrow_Prim, false, true },
{ &Ice_Arrow_Env, true, false },
{ &Light_Arrow_Prim, false, true },
{ &Light_Arrow_Env, true, false },
{ &Din_Fire_Prim, false, false },
{ &Din_Fire_Env, true, false },
{ &Nayru_Diamond_Prim, false, true },
{ &Nayru_Diamond_Env, true, false },
{ &Nayru_Orb_Prim, false, true },
{ &Nayru_Orb_Env, true, false },
{ &Spin_Lv1_Prim, false, false },
{ &Spin_Lv1_Env, true, false },
{ &Spin_Lv2_Prim, false, true },
{ &Spin_Lv2_Env, true, false },
{ &Trails_col, false, false },
{ &FileChoose_Background, false, false },
{ &FileChoose_BottomText, true, false },
{ &A_Btn, false, false },
{ &B_Btn, false, false },
{ &C_Btn, false, false },
{ &C_Btn_U, false, false },
{ &C_Btn_D, false, true },
{ &C_Btn_L, false, true },
{ &C_Btn_R, false, true },
{ &Start_btn, false, false },
{ &DPad_Items, false, false },
{ &Hearts_NInner, false, false },
{ &Hearts_DDInner, true, false },
{ &Hearts_DDOutline, true, false },
{ &Magic_Borders, false, false },
{ &Magic_InUse_Borders, true, false },
{ &Magic_Meter, false, true },
{ &Magic_InUse_Meter, true, false },
{ &Minimap_OW, false, false },
{ &Minimap_DG, false, true },
{ &Minimap_CP, false, true },
{ &Minimap_LE, false, true },
{ &TitleCards_OW, false, false },
{ &TitleCards_DG, true, false },
{ &Rupee_Icon, false, false },
{ &SmallKeys_Icon, false, true },
{ &VSOA_Icon, false, true }
};
static CosmeticsColorSection Buttons_section[]{
{ &DPad_Items, false, false },
{ &C_Btn_U, false, false },
{ &C_Btn_D, false, true },
{ &C_Btn_L, false, true },
{ &C_Btn_R, false, true },
{ &C_Btn, false, false },
{ &B_Btn, false, false },
{ &A_Btn, false, false },
{ &Start_btn, false, false }
};
static CosmeticsColorSection Misc_Interface_section[]{
{ &Hearts_NInner, false, false },
{ &Hearts_DDInner, true, false },
{ &Hearts_DDOutline, true, false },
{ &Magic_Borders, false, false },
{ &Magic_InUse_Borders, true, false },
{ &Magic_Meter, false, true },
{ &Magic_InUse_Meter, true, false },
{ &Minimap_OW, false, false },
{ &Minimap_DG, false, true },
{ &Minimap_CP, false, true },
{ &Minimap_LE, false, true },
{ &TitleCards_OW, false, false },
{ &TitleCards_DG, true, false },
{ &Rupee_Icon, false, false },
{ &SmallKeys_Icon, false, true },
{ &VSOA_Icon, false, true },
{ &TitleScreen_fire_Prim, false, true },
{ &TitleScreen_fire_Env, false, true }
};
static CosmeticsColorSection NPCs_section[]{
{ &Navi_Idle_Inner, false, false },
{ &Navi_Idle_Outer, true, false },
{ &Navi_Npc_Inner, false, true },
{ &Navi_Npc_Outer, true, false },
{ &Navi_Enemy_Inner, false, true },
{ &Navi_Enemy_Outer, true, false },
{ &Navi_Prop_Inner, false, true },
{ &Navi_Prop_Outer, true, false },
{ &Keese1_prim, false, false },
{ &Keese2_prim, true, false },
{ &Keese1_env, false, true },
{ &Keese2_env, true, false },
{ &DogN1, false, false },
{ &DogN2, true, false }
};
static CosmeticsColorSection AllItemsSkills_section[]{
{ &KokiriTunic, false, false },
{ &GoronTunic, true, false },
{ &ZoraTunic, true, false },
{ &Fire_Arrow_Prim, false, false },
{ &Fire_Arrow_Env, true, false },
{ &Ice_Arrow_Prim, false, true },
{ &Ice_Arrow_Env, true, false },
{ &Light_Arrow_Prim, false, true },
{ &Light_Arrow_Env, true, false },
{ &Din_Fire_Prim, false, false },
{ &Din_Fire_Env, true, false },
{ &Nayru_Diamond_Prim, false, true },
{ &Nayru_Diamond_Env, true, false },
{ &Nayru_Orb_Prim, false, true },
{ &Nayru_Orb_Env, true, false },
{ &Spin_Lv1_Prim, false, false },
{ &Spin_Lv1_Env, true, false },
{ &Spin_Lv2_Prim, false, true },
{ &Spin_Lv2_Env, true, false },
{ &Trails_col, false, false }
};
void InitCosmeticsEditor();//Init the menu itself void InitCosmeticsEditor();//Init the menu itself
void LoadRainbowColor(); void LoadRainbowColor();

View File

@ -1,5 +1,6 @@
#include "CustomMessageManager.h" #include "CustomMessageManager.h"
#include <algorithm> #include <algorithm>
#include <stdint.h>
using namespace std::literals::string_literals; using namespace std::literals::string_literals;
@ -80,9 +81,8 @@ bool CustomMessageManager::InsertCustomMessage(std::string tableID, uint16_t tex
return messageInsertResult.second; return messageInsertResult.second;
} }
bool CustomMessageManager::CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid,
CustomMessageEntry messageEntry) {
bool CustomMessageManager::CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messageEntry) {
FormatCustomMessage(messageEntry.english, iid); FormatCustomMessage(messageEntry.english, iid);
FormatCustomMessage(messageEntry.german, iid); FormatCustomMessage(messageEntry.german, iid);
FormatCustomMessage(messageEntry.french, iid); FormatCustomMessage(messageEntry.french, iid);

View File

@ -2,6 +2,7 @@
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include "../../../include/z64item.h" #include "../../../include/z64item.h"
#include "../../../include/message_data_textbox_types.h"
#undef MESSAGE_END #undef MESSAGE_END
@ -14,31 +15,6 @@
#define QM_YELLOW 0x46 #define QM_YELLOW 0x46
#define QM_BLACK 0x47 #define QM_BLACK 0x47
#ifndef MESSAGE_DATA_STATIC_H
typedef enum {
/* 0 */ TEXTBOX_TYPE_BLACK,
/* 1 */ TEXTBOX_TYPE_WOODEN,
/* 2 */ TEXTBOX_TYPE_BLUE,
/* 3 */ TEXTBOX_TYPE_OCARINA,
/* 4 */ TEXTBOX_TYPE_NONE_BOTTOM,
/* 5 */ TEXTBOX_TYPE_NONE_NO_SHADOW,
/* 11 */ TEXTBOX_TYPE_CREDITS = 11
} TextBoxType;
typedef enum {
/* 0 */ TEXTBOX_BG_CROSS
} TextBoxBackground;
typedef enum {
/* 0 */ TEXTBOX_POS_VARIABLE,
/* 1 */ TEXTBOX_POS_TOP,
/* 2 */ TEXTBOX_POS_MIDDLE,
/* 3 */ TEXTBOX_POS_BOTTOM
} TextBoxPosition;
#endif
typedef struct { typedef struct {
TextBoxType textBoxType; TextBoxType textBoxType;
TextBoxPosition textBoxPos; TextBoxPosition textBoxPos;
@ -89,7 +65,7 @@ class CustomMessageManager {
with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to with the provided giid (getItemID) as its key. This function also inserts the icon corresponding to
the provided iid (itemID) at the beginning of each page of the textbox. the provided iid (itemID) at the beginning of each page of the textbox.
*/ */
bool CreateGetItemMessage(std::string tableID, GetItemID giid, ItemID iid, CustomMessageEntry messages); bool CreateGetItemMessage(std::string tableID, uint16_t giid, ItemID iid, CustomMessageEntry messages);
/* /*
Formats the provided Custom Message Entry and inserts it into the table with the provided tableID, Formats the provided Custom Message Entry and inserts it into the table with the provided tableID,

View File

@ -13,13 +13,17 @@ typedef enum {
TEXT_ALTAR_CHILD = 0x7040, TEXT_ALTAR_CHILD = 0x7040,
TEXT_ALTAR_ADULT = 0x7088, TEXT_ALTAR_ADULT = 0x7088,
TEXT_GANONDORF = 0x70CC, TEXT_GANONDORF = 0x70CC,
TEXT_GANONDORF_NOHINT = 0x70CD TEXT_GANONDORF_NOHINT = 0x70CD,
TEXT_BLUE_RUPEE = 0xCC,
TEXT_RED_RUPEE = 0xF0,
TEXT_PURPLE_RUPEE = 0xF1,
TEXT_HUGE_RUPEE = 0xF2
} TextIDs; } TextIDs;
#ifdef __cplusplus #ifdef __cplusplus
typedef struct { typedef struct {
GetItemID giid; u16 giid;
ItemID iid; ItemID iid;
std::string english; std::string english;
std::string german; std::string german;

View File

@ -1,7 +1,3 @@
#ifdef _MSC_VER
#define NOGDI
#endif
#include "debugconsole.h" #include "debugconsole.h"
#include "../libultraship/ImGuiImpl.h" #include "../libultraship/ImGuiImpl.h"
#include "savestates.h" #include "savestates.h"
@ -313,6 +309,69 @@ static bool EntranceHandler(std::shared_ptr<Ship::Console> Console, const std::v
gSaveContext.nextTransition = 11; gSaveContext.nextTransition = 11;
} }
static bool VoidHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (gGlobalCtx != nullptr) {
gSaveContext.respawn[RESPAWN_MODE_DOWN].tempSwchFlags = gGlobalCtx->actorCtx.flags.tempSwch;
gSaveContext.respawn[RESPAWN_MODE_DOWN].tempCollectFlags = gGlobalCtx->actorCtx.flags.tempCollect;
gSaveContext.respawnFlag = 1;
gGlobalCtx->sceneLoadFlag = 0x14;
gGlobalCtx->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_DOWN].entranceIndex;
gGlobalCtx->fadeTransition = 2;
gSaveContext.nextTransition = 2;
} else {
SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr");
return CMD_FAILED;
}
return CMD_SUCCESS;
}
static bool ReloadHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (gGlobalCtx != nullptr) {
gGlobalCtx->nextEntranceIndex = gSaveContext.entranceIndex;
gGlobalCtx->sceneLoadFlag = 0x14;
gGlobalCtx->fadeTransition = 11;
gSaveContext.nextTransition = 11;
} else {
SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr");
return CMD_FAILED;
}
return CMD_SUCCESS;
}
static bool FWHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (gGlobalCtx != nullptr) {
if (gSaveContext.respawn[RESPAWN_MODE_TOP].data > 0) {
gGlobalCtx->sceneLoadFlag = 0x14;
gGlobalCtx->nextEntranceIndex = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex;
gGlobalCtx->fadeTransition = 5;
} else {
SohImGui::console->SendErrorMessage("Farore's wind not set!");
}
}
else {
SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr");
return CMD_FAILED;
}
return CMD_SUCCESS;
}
static bool FileSelectHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
if (gGlobalCtx != nullptr) {
SET_NEXT_GAMESTATE(&gGlobalCtx->state, FileChoose_Init, FileChooseContext);
gGlobalCtx->state.running = 0;
} else {
SohImGui::console->SendErrorMessage("gGlobalCtx == nullptr");
return CMD_FAILED;
}
return CMD_SUCCESS;
}
static bool QuitHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
gGlobalCtx->state.running = 0;
return CMD_SUCCESS;
}
static bool SaveStateHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) { static bool SaveStateHandler(std::shared_ptr<Ship::Console> Console, const std::vector<std::string>& args) {
unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot(); unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot();
const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE }); const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE });
@ -500,6 +559,11 @@ void DebugConsole_Init(void) {
CMD_REGISTER("entrance", { EntranceHandler, CMD_REGISTER("entrance", { EntranceHandler,
"Sends player to the entered entrance (hex)", "Sends player to the entered entrance (hex)",
{ { "entrance", Ship::ArgumentType::NUMBER } } }); { { "entrance", Ship::ArgumentType::NUMBER } } });
CMD_REGISTER("void", {VoidHandler, "Voids out of the current map.",});
CMD_REGISTER("reload", {ReloadHandler, "Reloads the current map.",});
CMD_REGISTER("file_select", {FileSelectHandler, "Returns to the file select.",});
CMD_REGISTER("fw", {FWHandler,"Spawns the player where Farore's Wind is set.", });
CMD_REGISTER("quit", {QuitHandler, "Quits the game.",});
CMD_REGISTER("save_state", { SaveStateHandler, "Save a state." }); CMD_REGISTER("save_state", { SaveStateHandler, "Save a state." });
CMD_REGISTER("load_state", { LoadStateHandler, "Load a state." }); CMD_REGISTER("load_state", { LoadStateHandler, "Load a state." });

View File

@ -911,9 +911,12 @@ void DrawFlagsTab() {
setMask <<= 1; setMask <<= 1;
} }
// If playing a Randomizer Save with Shuffle Skull Tokens on anything other than "Off" we don't want to keep
// GS Token Count updated, since Gold Skulltulas killed will not correlate to GS Tokens Collected.
if (!(gSaveContext.n64ddFlag && OTRGlobals::Instance->gRandomizer->GetRandoSettingValue(RSK_SHUFFLE_TOKENS))) {
static bool keepGsCountUpdated = true; static bool keepGsCountUpdated = true;
ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated); ImGui::Checkbox("Keep GS Count Updated", &keepGsCountUpdated);
InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags"); InsertHelpHoverText("Automatically adjust the number of gold skulltula tokens acquired based on set flags.");
int32_t gsCount = 0; int32_t gsCount = 0;
if (keepGsCountUpdated) { if (keepGsCountUpdated) {
for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) { for (int32_t gsFlagIndex = 0; gsFlagIndex < 6; gsFlagIndex++) {
@ -921,6 +924,7 @@ void DrawFlagsTab() {
} }
gSaveContext.inventory.gsTokens = gsCount; gSaveContext.inventory.gsTokens = gsCount;
} }
}
}); });
if (ImGui::TreeNode("Event Check Inf Flags")) { if (ImGui::TreeNode("Event Check Inf Flags")) {

View File

@ -0,0 +1,42 @@
#include "ItemTableManager.h"
#include <stdexcept>
ItemTableManager::ItemTableManager() {
}
ItemTableManager::~ItemTableManager() {
this->itemTables.clear();
}
bool ItemTableManager::AddItemTable(uint16_t tableID) {
ItemTable newItemTable;
return itemTables.emplace(tableID, newItemTable).second;
}
bool ItemTableManager::AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry) {
try {
ItemTable* itemTable = RetrieveItemTable(tableID);
return itemTable->emplace(getItemID, getItemEntry).second;
} catch (const std::out_of_range& oor) { return false; }
}
GetItemEntry ItemTableManager::RetrieveItemEntry(uint16_t tableID, uint16_t itemID) {
try {
ItemTable* itemTable = RetrieveItemTable(tableID);
return itemTable->at(itemID);
} catch (std::out_of_range& oor) { return GET_ITEM_NONE; }
}
bool ItemTableManager::ClearItemTable(uint16_t tableID) {
try {
ItemTable* itemTable = RetrieveItemTable(tableID);
itemTable->clear();
return true;
} catch (const std::out_of_range& oor) { return false; }
}
ItemTable* ItemTableManager::RetrieveItemTable(uint16_t tableID) {
try {
return &itemTables.at(tableID);
} catch (const std::out_of_range& oor) { throw(oor); }
}

View File

@ -0,0 +1,23 @@
#pragma once
#include "ItemTableTypes.h"
#include "z64item.h"
#include <unordered_map>
typedef std::unordered_map<uint16_t, GetItemEntry> ItemTable;
class ItemTableManager {
public:
static ItemTableManager* Instance;
ItemTableManager();
~ItemTableManager();
bool AddItemTable(uint16_t tableID);
bool AddItemEntry(uint16_t tableID, uint16_t getItemID, GetItemEntry getItemEntry);
GetItemEntry RetrieveItemEntry(uint16_t tableID, uint16_t itemID);
bool ClearItemTable(uint16_t tableID);
private:
std::unordered_map<uint16_t, ItemTable> itemTables;
ItemTable* RetrieveItemTable(uint16_t tableID);
};

View File

@ -0,0 +1,34 @@
#pragma once
#ifdef __cplusplus
#include <stdint.h>
#endif
#define CHEST_ANIM_SHORT 0
#define CHEST_ANIM_LONG 1
#define GET_ITEM(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId) \
{ itemId, field, (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, NULL }
#define GET_ITEM_NONE \
{ ITEM_NONE, 0, 0, 0, 0, 0, 0, 0, false, NULL }
#define GET_ITEM_CUSTOM_DRAW(itemId, objectId, drawId, textId, field, chestAnim, modIndex, getItemId, drawFunc) \
{ itemId, field (chestAnim != CHEST_ANIM_SHORT ? 1 : -1) * (drawId + 1), textId, objectId, modIndex, getItemId, drawId, true, drawFunc }
typedef struct GlobalContext GlobalContext;
typedef struct GetItemEntry GetItemEntry;
typedef void (*CustomDrawFunc)(GlobalContext* globalCtx, GetItemEntry* getItemEntry);
typedef struct GetItemEntry {
/* 0x00 */ uint16_t itemId;
/* 0x01 */ uint16_t field; // various bit-packed data
/* 0x02 */ int16_t gi; // defines the draw id and chest opening animation
/* 0x03 */ uint16_t textId;
/* 0x04 */ uint16_t objectId;
/* 0x06 */ uint16_t modIndex; // 0 = Vanilla, 1 = Randomizer, future mods will increment up?
/* 0x08 */ int16_t getItemId;
/* 0x0A */ uint16_t gid; // Stores the GID value unmodified for future reference.
/* 0x0C */ uint16_t collectable; // determines whether the item can be collected on the overworld. Will be true in most cases.
CustomDrawFunc drawFunc;
}; // size = 0x0F

View File

@ -293,6 +293,80 @@ void HintTable_Init_Exclude_Overworld() {
//obscure text //obscure text
Text{"#frogs in a storm# gift", /*french*/"#des grenouilles mouillées# donnent", /*spanish*/"las #ancas bajo la tormenta# otorgan"}, Text{"#frogs in a storm# gift", /*french*/"#des grenouilles mouillées# donnent", /*spanish*/"las #ancas bajo la tormenta# otorgan"},
}); });
hintTable[ZR_FROGS_ZELDAS_LULLABY] = HintText::Exclude(
{
// obscure text
Text{ "#sleepy frogs# gift", /*french*/ "#les grenouilles somnolentes# donnent",
/*spanish*/ "las #ranas somnolientas# regalan" },
Text{ "#the Froggish Tenor in the back-left# gifts",
/*french*/ "#le ténor grenouillesque au fond à gauche# donne",
/*spanish*/ "el #Sapo Tenore al fondo, a la izquierda#, regala" },
},
{},
// clear text
Text{ "after hearing #Zelda's Lullaby, the frogs# gift",
/*french*/ "à l'écoute de #la berceuse de Zelda, les grenouilles# donnent",
/*spanish*/ "después de escuchar #la Nana de Zelda, las ranas# regalan" });
hintTable[ZR_FROGS_EPONAS_SONG] = HintText::Exclude(
{
// obscure text
Text{ "#equine frogs# gift", /*french*/ "#les grenouilles équestres# donnent",
/*spanish*/ "las #ranas equinas# regalan" },
Text{ "#the Froggish Tenor in the back-right# gifts",
/*french*/ "#le ténor grenouillesque au fond à droite# donne",
/*spanish*/ "el #Sapo Tenore al fondo, a la derecha#, regala" },
},
{},
// clear text
Text{ "after hearing #Epona's Song, the frogs# gift",
/*french*/ "à l'écoute du #chant d'Epona, les grenouilles# donnent",
/*spanish*/ "después de escuchar #la Canción de Epona, las ranas# regalan" });
hintTable[ZR_FROGS_SARIAS_SONG] = HintText::Exclude(
{
// obscure text
Text{ "#sylvan frogs# gift", /*french*/ "#les grenouilles sylvestres# donnent",
/*spanish*/ "las #ranas silvestres# regalan" },
Text{ "#the Froggish Tenor in the center# gifts",
/*french*/ "#le ténor grenouillesque dans le centre# donne",
/*spanish*/ "el #Sapo Tenore en el centro# regala" },
},
{},
// clear text
Text{ "after hearing #Saria's Song, the frogs# gift",
/*french*/ "à l'écoute du #chant de Saria, les grenouilles# donnent",
/*spanish*/ "después de escuchar #la Canción de Saria, las ranas# regalan" });
hintTable[ZR_FROGS_SUNS_SONG] = HintText::Exclude(
{
// obscure text
Text{ "#enlightened frogs# gift", /*french*/ "#les grenouilles éclairées# donnent",
/*spanish*/ "las #ranas alumbradas# regalan" },
Text{ "#the Froggish Tenor in the front-left# gifts",
/*french*/ "#le ténor grenouillesque à l'avant gauche# donne",
/*spanish*/ "el #Sapo Tenore al frente, a la izquierda#, regala" },
},
{},
// clear text
Text{ "after hearing #the Sun's Song, the frogs# gift",
/*french*/ "à l'écoute du #chant du soleil, les grenouilles# donnent",
/*spanish*/ "después de escuchar #la Canción del Sol, las ranas# regalan" });
hintTable[ZR_FROGS_SONG_OF_TIME] = HintText::Exclude(
{
// obscure text
Text{ "#time-traveling frogs# gift", /*french*/ "#les grenouilles voyageuses dans le temps# donnent",
/*spanish*/ "las #ranas viajeras del tiempo# regalan" },
Text{ "#the Froggish Tenor in the front-right# gifts",
/*french*/ "#le ténor grenouillesque à l'avant droite# donne",
/*spanish*/ "el #Sapo Tenore al frente, a la derecha#, regala" },
},
{},
// clear text
Text{ "after hearing #the Song of Time, the frogs# gift",
/*french*/ "à l'écoute du #chant du temps, les grenouilles# donnent",
/*spanish*/ "después de escuchar #la Canción del tiempo, las ranas# regalan" });
hintTable[GF_HBA_1000_POINTS] = HintText::Exclude({ hintTable[GF_HBA_1000_POINTS] = HintText::Exclude({
//obscure text //obscure text

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,7 @@
#include <vector> #include <vector>
#include "spoiler_log.hpp" #include "spoiler_log.hpp"
#include "item_list.hpp" #include "item_list.hpp"
#include "../randomizerTypes.h"
enum ItemOverride_Type { enum ItemOverride_Type {
OVR_BASE_ITEM = 0, OVR_BASE_ITEM = 0,
@ -154,8 +155,8 @@ public:
class ItemLocation { class ItemLocation {
public: public:
ItemLocation() = default; ItemLocation() = default;
ItemLocation(uint8_t scene_, ItemLocationType type_, uint8_t flag_, std::string name_, uint32_t hintKey_, uint32_t vanillaItem_, std::vector<Category> categories_, uint16_t price_ = 0, SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup_ = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) ItemLocation(RandomizerCheck rc_, uint8_t scene_, ItemLocationType type_, uint8_t flag_, std::string name_, uint32_t hintKey_, uint32_t vanillaItem_, std::vector<Category> categories_, uint16_t price_ = 0, SpoilerCollectionCheck collectionCheck_ = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup_ = SpoilerCollectionCheckGroup::GROUP_NO_GROUP)
: scene(scene_), type(type_), flag(flag_), name(std::move(name_)), hintKey(hintKey_), vanillaItem(vanillaItem_), categories(std::move(categories_)), price(price_), collectionCheck(collectionCheck_), collectionCheckGroup(collectionCheckGroup_) {} : rc(rc_), scene(scene_), type(type_), flag(flag_), name(std::move(name_)), hintKey(hintKey_), vanillaItem(vanillaItem_), categories(std::move(categories_)), price(price_), collectionCheck(collectionCheck_), collectionCheckGroup(collectionCheckGroup_) {}
ItemOverride_Key Key() const { ItemOverride_Key Key() const {
ItemOverride_Key key; ItemOverride_Key key;
@ -167,6 +168,10 @@ public:
return key; return key;
} }
RandomizerCheck GetRandomizerCheck() const {
return rc;
}
SpoilerCollectionCheck GetCollectionCheck() const { SpoilerCollectionCheck GetCollectionCheck() const {
return collectionCheck; return collectionCheck;
} }
@ -368,48 +373,48 @@ public:
} }
} }
static auto Base(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Base(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::Base, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::Base, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup};
} }
static auto Chest(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Chest(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag), collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_CHEST, scene, flag), collectionCheckGroup};
} }
static auto Chest(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Chest(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::Chest, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup};
} }
static auto Collectable(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Collectable(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag), collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_COLLECTABLE, scene, flag), collectionCheckGroup};
} }
static auto Collectable(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Collectable(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::Collectable, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup};
} }
static auto GSToken(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, std::vector<Category>&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto GSToken(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, std::vector<Category>&& categories, SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::GSToken, flag, std::move(name), hintKey, GOLD_SKULLTULA_TOKEN, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, scene, flag), collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::GSToken, flag, std::move(name), hintKey, GOLD_SKULLTULA_TOKEN, std::move(categories), 0, SpoilerCollectionCheck(SpoilerCollectionCheckType::SPOILER_CHK_GOLD_SKULLTULA, scene, flag), collectionCheckGroup};
} }
static auto GrottoScrub(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto GrottoScrub(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::GrottoScrub, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::GrottoScrub, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup};
} }
static auto Delayed(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Delayed(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::Delayed, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::Delayed, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup};
} }
static auto Reward(uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) { static auto Reward(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, const uint32_t hintKey, const uint32_t vanillaItem, std::vector<Category>&& categories, SpoilerCollectionCheck collectionCheck = SpoilerCollectionCheck(), SpoilerCollectionCheckGroup collectionCheckGroup = SpoilerCollectionCheckGroup::GROUP_NO_GROUP) {
return ItemLocation{scene, ItemLocationType::TempleReward, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup}; return ItemLocation{rc, scene, ItemLocationType::TempleReward, flag, std::move(name), hintKey, vanillaItem, std::move(categories), 0, collectionCheck, collectionCheckGroup};
} }
static auto OtherHint(uint8_t scene, uint8_t flag, std::string&& name, std::vector<Category>&& categories) { static auto OtherHint(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, std::vector<Category>&& categories) {
return ItemLocation{scene, ItemLocationType::OtherHint, flag, std::move(name), NONE, NONE, std::move(categories)}; return ItemLocation{rc, scene, ItemLocationType::OtherHint, flag, std::move(name), NONE, NONE, std::move(categories)};
} }
static auto HintStone(uint8_t scene, uint8_t flag, std::string&& name, std::vector<Category>&& categories) { static auto HintStone(RandomizerCheck rc, uint8_t scene, uint8_t flag, std::string&& name, std::vector<Category>&& categories) {
return ItemLocation{scene, ItemLocationType::HintStone, flag, std::move(name), NONE, NONE, std::move(categories)}; return ItemLocation{rc, scene, ItemLocationType::HintStone, flag, std::move(name), NONE, NONE, std::move(categories)};
} }
void ResetVariables() { void ResetVariables() {
@ -425,6 +430,7 @@ public:
} }
private: private:
RandomizerCheck rc;
uint8_t scene; uint8_t scene;
ItemLocationType type; ItemLocationType type;
uint8_t flag; uint8_t flag;

View File

@ -516,12 +516,12 @@ void PrintOptionDescription() {
printf("\x1b[22;0H%s", description.data()); printf("\x1b[22;0H%s", description.data());
} }
std::string GenerateRandomizer(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings) { std::string GenerateRandomizer(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations) {
// if a blank seed was entered, make a random one // if a blank seed was entered, make a random one
srand(time(NULL)); srand(time(NULL));
Settings::seed = std::to_string(rand()); Settings::seed = std::to_string(rand());
int ret = Playthrough::Playthrough_Init(std::hash<std::string>{}(Settings::seed), cvarSettings); int ret = Playthrough::Playthrough_Init(std::hash<std::string>{}(Settings::seed), cvarSettings, excludedLocations);
if (ret < 0) { if (ret < 0) {
if (ret == -1) { // Failed to generate after 5 tries if (ret == -1) { // Failed to generate after 5 tries
printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be " printf("\n\nFailed to generate after 5 tries.\nPress B to go back to the menu.\nA different seed might be "

View File

@ -2,6 +2,7 @@
#include <string> #include <string>
#include <unordered_map> #include <unordered_map>
#include <set>
#include "soh/Enhancements/randomizer/randomizerTypes.h" #include "soh/Enhancements/randomizer/randomizerTypes.h"
#define MAIN_MENU 0 #define MAIN_MENU 0
@ -45,7 +46,7 @@ void PrintResetToDefaultsMenu();
void PrintGenerateMenu(); void PrintGenerateMenu();
void ClearDescription(); void ClearDescription();
void PrintOptionDescription(); void PrintOptionDescription();
std::string GenerateRandomizer(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings); std::string GenerateRandomizer(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSetting, std::set<RandomizerCheck> excludedLocations);
std::string GetInput(const char* hintText); std::string GetInput(const char* hintText);
extern void MenuInit(); extern void MenuInit();

View File

@ -10,7 +10,7 @@
namespace Playthrough { namespace Playthrough {
int Playthrough_Init(uint32_t seed, std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings) { int Playthrough_Init(uint32_t seed, std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations) {
// initialize the RNG with just the seed incase any settings need to be // initialize the RNG with just the seed incase any settings need to be
// resolved to something random // resolved to something random
Random_Init(seed); Random_Init(seed);
@ -21,7 +21,7 @@ int Playthrough_Init(uint32_t seed, std::unordered_map<RandomizerSettingKey, uin
HintReset(); HintReset();
Areas::AccessReset(); Areas::AccessReset();
Settings::UpdateSettings(cvarSettings); Settings::UpdateSettings(cvarSettings, excludedLocations);
// once the settings have been finalized turn them into a string for hashing // once the settings have been finalized turn them into a string for hashing
std::string settingsStr; std::string settingsStr;
for (Menu* menu : Settings::GetAllOptionMenus()) { for (Menu* menu : Settings::GetAllOptionMenus()) {

View File

@ -4,6 +4,6 @@
#include "item_location.hpp" #include "item_location.hpp"
namespace Playthrough { namespace Playthrough {
int Playthrough_Init(uint32_t seed, std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings); int Playthrough_Init(uint32_t seed, std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations);
int Playthrough_Repeat(int count = 1); int Playthrough_Repeat(int count = 1);
} }

View File

@ -6,14 +6,12 @@
#include "rando_main.hpp" #include "rando_main.hpp"
// #include <soh/Enhancements/randomizer.h> // #include <soh/Enhancements/randomizer.h>
#include <Cvar.h> #include <Cvar.h>
#define NOGDI #include <Window.h>
#define WIN32_LEAN_AND_MEAN
#include <GlobalCtx2.h>
#include <PR/ultra64/types.h> #include <PR/ultra64/types.h>
#define TICKS_PER_SEC 268123480.0 #define TICKS_PER_SEC 268123480.0
void RandoMain::GenerateRando(std::unordered_map<RandomizerSettingKey, u8> cvarSettings) { void RandoMain::GenerateRando(std::unordered_map<RandomizerSettingKey, u8> cvarSettings, std::set<RandomizerCheck> excludedLocations) {
HintTable_Init(); HintTable_Init();
ItemTable_Init(); ItemTable_Init();
LocationTable_Init(); LocationTable_Init();
@ -21,7 +19,7 @@ void RandoMain::GenerateRando(std::unordered_map<RandomizerSettingKey, u8> cvarS
// std::string settingsFileName = "./randomizer/latest_settings.json"; // std::string settingsFileName = "./randomizer/latest_settings.json";
// CVar_SetString("gLoadedPreset", settingsFileName.c_str()); // CVar_SetString("gLoadedPreset", settingsFileName.c_str());
std::string fileName = Ship::GlobalCtx2::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings).c_str()); std::string fileName = Ship::Window::GetPathRelativeToAppDirectory(GenerateRandomizer(cvarSettings, excludedLocations).c_str());
CVar_SetString("gSpoilerLog", fileName.c_str()); CVar_SetString("gSpoilerLog", fileName.c_str());
CVar_Save(); CVar_Save();

View File

@ -1,5 +1,5 @@
#pragma once #pragma once
namespace RandoMain { namespace RandoMain {
void GenerateRando(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings); void GenerateRando(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations);
} }

View File

@ -2483,7 +2483,7 @@ namespace Settings {
} }
//Function to set flags depending on settings //Function to set flags depending on settings
void UpdateSettings(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings) { void UpdateSettings(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations) {
// RANDTODO: Switch this back once all logic options are implemented // RANDTODO: Switch this back once all logic options are implemented
// Logic.SetSelectedIndex(cvarSettings[RSK_LOGIC_RULES]); // Logic.SetSelectedIndex(cvarSettings[RSK_LOGIC_RULES]);
@ -2496,6 +2496,16 @@ namespace Settings {
break; break;
} }
AddExcludedOptions();
for (auto locationKey : everyPossibleLocation) {
auto location = Location(locationKey);
if (excludedLocations.count(location->GetRandomizerCheck())) {
location->GetExcludedOption()->SetSelectedIndex(1);
} else {
location->GetExcludedOption()->SetSelectedIndex(0);
}
}
OpenForest.SetSelectedIndex(cvarSettings[RSK_FOREST]); OpenForest.SetSelectedIndex(cvarSettings[RSK_FOREST]);
OpenKakariko.SetSelectedIndex(cvarSettings[RSK_KAK_GATE]); OpenKakariko.SetSelectedIndex(cvarSettings[RSK_KAK_GATE]);
ZorasFountain.SetSelectedIndex(cvarSettings[RSK_ZORAS_FOUNTAIN]); ZorasFountain.SetSelectedIndex(cvarSettings[RSK_ZORAS_FOUNTAIN]);
@ -2585,31 +2595,6 @@ namespace Settings {
// RANDOTODO implement chest shuffle with keysanity // RANDOTODO implement chest shuffle with keysanity
// ShuffleChestMinigame.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]); // ShuffleChestMinigame.SetSelectedIndex(cvarSettings[RSK_SHUFFLE_CHEST_MINIGAME]);
AddExcludedOptions();
for (size_t i = 1; i < Settings::excludeLocationsOptionsVector.size(); i++) {
for (const auto& location : Settings::excludeLocationsOptionsVector[i]) {
// RANDOTODO implement the ability to exclude any location
if (location->GetName() == "Deku Theater Mask of\n Truth") {
location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_DEKU_THEATER_MASK_OF_TRUTH]);
}
if (location->GetName() == "Kak 10 Gold Skulltula\n Reward") {
location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_10_GOLD_SKULLTULA_REWARD]);
}
if (location->GetName() == "Kak 20 Gold Skulltula\n Reward") {
location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_20_GOLD_SKULLTULA_REWARD]);
}
if (location->GetName() == "Kak 30 Gold Skulltula\n Reward") {
location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_30_GOLD_SKULLTULA_REWARD]);
}
if (location->GetName() == "Kak 40 Gold Skulltula\n Reward") {
location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_40_GOLD_SKULLTULA_REWARD]);
}
if (location->GetName() == "Kak 50 Gold Skulltula\n Reward") {
location->SetSelectedIndex(cvarSettings[RSK_EXCLUDE_KAK_50_GOLD_SKULLTULA_REWARD]);
}
}
}
RandomizeAllSettings(true); //now select any random options instead of just hiding them RandomizeAllSettings(true); //now select any random options instead of just hiding them
//shuffle the dungeons and then set MQ for as many as necessary //shuffle the dungeons and then set MQ for as many as necessary

View File

@ -850,7 +850,7 @@ class Menu {
}; };
namespace Settings { namespace Settings {
void UpdateSettings(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings); void UpdateSettings(std::unordered_map<RandomizerSettingKey, uint8_t> cvarSettings, std::set<RandomizerCheck> excludedLocations);
SettingsContext FillContext(); SettingsContext FillContext();
void InitSettings(); void InitSettings();
void SetDefaultSettings(); void SetDefaultSettings();

View File

@ -26,9 +26,7 @@
#include <filesystem> #include <filesystem>
#include <variables.h> #include <variables.h>
#define NOGDI #include "Window.h"
#define WIN32_LEAN_AND_MEAN
#include "GlobalCtx2.h"
using json = nlohmann::json; using json = nlohmann::json;
@ -728,12 +726,12 @@ const char* SpoilerLog_Write(int language) {
//WriteShuffledEntrances(spoilerLog); //WriteShuffledEntrances(spoilerLog);
WriteAllLocations(language); WriteAllLocations(language);
if (!std::filesystem::exists(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Randomizer"))) { if (!std::filesystem::exists(Ship::Window::GetPathRelativeToAppDirectory("Randomizer"))) {
std::filesystem::create_directory(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Randomizer")); std::filesystem::create_directory(Ship::Window::GetPathRelativeToAppDirectory("Randomizer"));
} }
std::string jsonString = jsonData.dump(4); std::string jsonString = jsonData.dump(4);
std::ofstream jsonFile(Ship::GlobalCtx2::GetPathRelativeToAppDirectory( std::ofstream jsonFile(Ship::Window::GetPathRelativeToAppDirectory(
(std::string("Randomizer/") + std::string(Settings::seed) + std::string(".json")).c_str())); (std::string("Randomizer/") + std::string(Settings::seed) + std::string(".json")).c_str()));
jsonFile << std::setw(4) << jsonString << std::endl; jsonFile << std::setw(4) << jsonString << std::endl;
jsonFile.close(); jsonFile.close();

View File

@ -0,0 +1,109 @@
#include "draw.h"
#include "z64.h"
#include "macros.h"
#include "functions.h"
#include "randomizerTypes.h"
#include <array>
#include "objects/object_gi_key/object_gi_key.h"
#include "objects/object_gi_bosskey/object_gi_bosskey.h"
#include "objects/object_gi_hearts/object_gi_hearts.h"
extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) {
s32 pad;
s16 color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_SMALL_KEY;
s16 colors[9][3] = {
{ 4, 195, 46 }, // Forest Temple
{ 237, 95, 95 }, // Fire Temple
{ 85, 180, 223 }, // Water Temple
{ 222, 158, 47 }, // Spirit Temple
{ 126, 16, 177 }, // Shadow Temple
{ 227, 110, 255 }, // Bottom of the Well
{ 221, 212, 60 }, // Gerudo Training Grounds
{ 255, 255, 255 }, // Theive's Hideout (unused)
{ 80, 80, 80 } // Ganon's Castle
};
OPEN_DISPS(globalCtx->state.gfxCtx);
func_80093D18(globalCtx->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__),
G_MTX_MODELVIEW | G_MTX_LOAD);
gsDPSetGrayscaleColor(POLY_OPA_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2], 255);
gsSPGrayscale(POLY_OPA_DISP++, true);
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiSmallKeyDL);
gsSPGrayscale(POLY_OPA_DISP++, false);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry) {
s32 pad;
s16 color_slot;
color_slot = getItemEntry->getItemId - RG_FOREST_TEMPLE_BOSS_KEY;
s16 colors[6][3] = {
{ 4, 195, 46 }, // Forest Temple
{ 237, 95, 95 }, // Fire Temple
{ 85, 180, 223 }, // Water Temple
{ 222, 158, 47 }, // Spirit Temple
{ 126, 16, 177 }, // Shadow Temple
{ 210, 0, 0 } // Ganon's Castle
};
OPEN_DISPS(globalCtx->state.gfxCtx);
func_80093D18(globalCtx->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__),
G_MTX_MODELVIEW | G_MTX_LOAD);
if (color_slot == 5) { // Ganon's Boss Key
gsDPSetGrayscaleColor(POLY_OPA_DISP++, 80, 80, 80, 255);
gsSPGrayscale(POLY_OPA_DISP++, true);
}
gSPDisplayList(POLY_OPA_DISP++, (Gfx*)gGiBossKeyDL);
if (color_slot == 5) { // Ganon's Boss Key
gsSPGrayscale(POLY_OPA_DISP++, false);
}
func_80093D84(globalCtx->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__),
G_MTX_MODELVIEW | G_MTX_LOAD);
gsDPSetGrayscaleColor(POLY_XLU_DISP++, colors[color_slot][0], colors[color_slot][1], colors[color_slot][2],
255);
gsSPGrayscale(POLY_XLU_DISP++, true);
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiBossKeyGemDL);
gsSPGrayscale(POLY_XLU_DISP++, false);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry) {
s32 pad;
OPEN_DISPS(globalCtx->state.gfxCtx);
func_80093D84(globalCtx->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, (char*)__FILE__, __LINE__), G_MTX_MODELVIEW | G_MTX_LOAD);
gsDPSetGrayscaleColor(POLY_XLU_DISP++, 255, 255, 255, 255);
gsSPGrayscale(POLY_XLU_DISP++, true);
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartBorderDL);
gsSPGrayscale(POLY_XLU_DISP++, false);
gSPDisplayList(POLY_XLU_DISP++, (Gfx*)gGiHeartContainerDL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -0,0 +1,13 @@
#ifndef RANDODRAW_H
#define RANDODRAW_H
#pragma once
#include "../item-tables/ItemTableTypes.h"
typedef struct GlobalContext GlobalContext;
extern "C" void Randomizer_DrawSmallKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry);
extern "C" void Randomizer_DrawBossKey(GlobalContext* globalCtx, GetItemEntry* getItemEntry);
extern "C" void Randomizer_DrawDoubleDefense(GlobalContext* globalCtx, GetItemEntry getItemEntry);
#endif

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,9 @@
#include "../../../include/z64item.h" #include "../../../include/z64item.h"
#include <memory> #include <memory>
#include <soh/Enhancements/randomizer/randomizerTypes.h> #include <soh/Enhancements/randomizer/randomizerTypes.h>
#include <soh/Enhancements/custom-message/CustomMessageManager.h>
#define NUM_NAVI_MESSAGES 15
class Randomizer { class Randomizer {
private: private:
@ -16,11 +19,13 @@ class Randomizer {
std::string ganonHintText; std::string ganonHintText;
std::string ganonText; std::string ganonText;
std::unordered_map<RandomizerSettingKey, u8> randoSettings; std::unordered_map<RandomizerSettingKey, u8> randoSettings;
GetItemID GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId); s16 GetItemFromGet(RandomizerGet randoGet, GetItemID ogItemId);
GetItemID GetItemFromActor(s16 actorId, s16 actorParams, s16 sceneNum, GetItemID ogItemId); s16 GetItemFromActor(s16 actorId, s16 actorParams, s16 sceneNum, GetItemID ogItemId);
void ParseRandomizerSettingsFile(const char* spoilerFileName); void ParseRandomizerSettingsFile(const char* spoilerFileName);
void ParseHintLocationsFile(const char* spoilerFileName); void ParseHintLocationsFile(const char* spoilerFileName);
void ParseItemLocationsFile(const char* spoilerFileName, bool silent); void ParseItemLocationsFile(const char* spoilerFileName, bool silent);
bool IsItemVanilla(RandomizerGet randoGet);
public: public:
Randomizer(); Randomizer();
@ -29,6 +34,8 @@ class Randomizer {
static const std::string getItemMessageTableID; static const std::string getItemMessageTableID;
static const std::string hintMessageTableID; static const std::string hintMessageTableID;
static const std::string scrubMessageTableID; static const std::string scrubMessageTableID;
static const std::string rupeeMessageTableID;
static const std::string NaviRandoMessageTableID;
static Sprite* GetSeedTexture(uint8_t index); static Sprite* GetSeedTexture(uint8_t index);
s16 GetItemModelFromId(s16 itemId); s16 GetItemModelFromId(s16 itemId);
@ -38,14 +45,17 @@ class Randomizer {
void LoadHintLocations(const char* spoilerFileName); void LoadHintLocations(const char* spoilerFileName);
void LoadItemLocations(const char* spoilerFileName, bool silent); void LoadItemLocations(const char* spoilerFileName, bool silent);
u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey); u8 GetRandoSettingValue(RandomizerSettingKey randoSettingKey);
RandomizerCheck GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); RandomizerCheck GetCheckFromActor(s16 sceneNum, s16 actorId, s16 actorParams);
std::string GetChildAltarText() const; std::string GetChildAltarText() const;
std::string GetAdultAltarText() const; std::string GetAdultAltarText() const;
std::string GetGanonText() const; std::string GetGanonText() const;
std::string GetGanonHintText() const; std::string GetGanonHintText() const;
GetItemID GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId); s16 GetRandomizedItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
GetItemID GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum); s16 GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
static void CreateCustomMessages(); static void CreateCustomMessages();
static std::string RandomizeRupeeName(std::string message, int language);
static CustomMessageEntry GetRupeeMessage(u16 rupeeTextId);
bool CheckContainsVanillaItem(RandomizerCheck randoCheck);
}; };
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -1,5 +1,12 @@
#pragma once #pragma once
#include <stdint.h>
// This should probably go in a less rando-specific location
// but the best location will probably be in the modding engine
// which doesn't exist yet.
typedef enum { MOD_NONE, MOD_RANDOMIZER } ModIndex;
typedef struct { typedef struct {
char tex[512]; char tex[512];
uint16_t width; uint16_t width;
@ -753,6 +760,7 @@ typedef enum {
RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RC_ZR_NEAR_DOMAIN_GOSSIP_STONE,
RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RC_ZR_NEAR_GROTTOS_GOSSIP_STONE,
RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RC_ZR_OPEN_GROTTO_GOSSIP_STONE,
RC_GANONDORF_HINT,
RC_MAX RC_MAX
} RandomizerCheck; } RandomizerCheck;
@ -807,6 +815,8 @@ typedef enum {
RG_PROGRESSIVE_STICK_UPGRADE, RG_PROGRESSIVE_STICK_UPGRADE,
RG_PROGRESSIVE_BOMBCHUS, RG_PROGRESSIVE_BOMBCHUS,
RG_PROGRESSIVE_MAGIC_METER, RG_PROGRESSIVE_MAGIC_METER,
RG_MAGIC_SINGLE, // Added for refactor of GetItemEntries
RG_MAGIC_DOUBLE, // Added for refactor of GetItemEntries
RG_PROGRESSIVE_OCARINA, RG_PROGRESSIVE_OCARINA,
RG_PROGRESSIVE_GORONSWORD, RG_PROGRESSIVE_GORONSWORD,
RG_EMPTY_BOTTLE, RG_EMPTY_BOTTLE,
@ -948,7 +958,8 @@ typedef enum {
RG_BUY_RED_POTION_40, RG_BUY_RED_POTION_40,
RG_BUY_RED_POTION_50, RG_BUY_RED_POTION_50,
RG_TRIFORCE, RG_TRIFORCE,
RG_HINT RG_HINT,
RG_MAX
} RandomizerGet; } RandomizerGet;
typedef enum { typedef enum {
@ -993,13 +1004,7 @@ typedef enum {
RSK_SKIP_CHILD_ZELDA, RSK_SKIP_CHILD_ZELDA,
RSK_STARTING_CONSUMABLES, RSK_STARTING_CONSUMABLES,
RSK_FULL_WALLETS, RSK_FULL_WALLETS,
RSK_EXCLUDE_DEKU_THEATER_MASK_OF_TRUTH,
RSK_LANGUAGE, RSK_LANGUAGE,
RSK_EXCLUDE_KAK_10_GOLD_SKULLTULA_REWARD,
RSK_EXCLUDE_KAK_20_GOLD_SKULLTULA_REWARD,
RSK_EXCLUDE_KAK_30_GOLD_SKULLTULA_REWARD,
RSK_EXCLUDE_KAK_40_GOLD_SKULLTULA_REWARD,
RSK_EXCLUDE_KAK_50_GOLD_SKULLTULA_REWARD,
RSK_SHUFFLE_CHEST_MINIGAME, RSK_SHUFFLE_CHEST_MINIGAME,
RSK_CUCCO_COUNT, RSK_CUCCO_COUNT,
RSK_BIG_POE_COUNT, RSK_BIG_POE_COUNT,

View File

@ -0,0 +1,972 @@
#include "randomizer_check_objects.h"
#include <map>
#include <string>
#include <vector>
#include <Cvar.h>
/*
typedef struct {
RandomizerCheck rc;
RandomizerCheckVanillaOrMQ vOrMQ;
RandomizerCheckType rcType;
RandomizerCheckArea rcArea;
bool visibleInImgui;
std::string rcShortName;
std::string rcSpoilerName;
} RandomizerCheckObject;
*/
#define RC_OBJECT(rc, rc_v_or_mq, rc_type, rc_area, rc_shortname, rc_spoilername) \
{rc, rc_v_or_mq, rc_type, rc_area, false, rc_shortname, rc_spoilername}
std::vector<RandomizerCheckObject> rcObjectsKF = {
RC_OBJECT(RC_KF_KOKIRI_SWORD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Kokiri Sword Chest", "KF Kokiri Sword Chest"),
RC_OBJECT(RC_KF_MIDOS_TOP_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Left Chest", "KF Mido Top Left Chest"),
RC_OBJECT(RC_KF_MIDOS_TOP_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Top Right Chest", "KF Mido Top Right Chest"),
RC_OBJECT(RC_KF_MIDOS_BOTTOM_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Left Chest", "KF Mido Bottom Left Chest"),
RC_OBJECT(RC_KF_MIDOS_BOTTOM_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Mido Bottom Right Chest", "KF Mido Bottom Right Chest"),
RC_OBJECT(RC_KF_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KOKIRI_FOREST, "Storms Grotto Chest", "KF Storms Grotto Chest"),
RC_OBJECT(RC_KF_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Bean Patch", "KF GS Bean Patch"),
RC_OBJECT(RC_KF_GS_KNOW_IT_ALL_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS Know It All House", "KF GS Know It All House"),
RC_OBJECT(RC_KF_GS_HOUSE_OF_TWINS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KOKIRI_FOREST, "GS House of Twins", "KF GS House of Twins"),
RC_OBJECT(RC_KF_LINKS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KOKIRI_FOREST, "Links House Cow", "KF Links House Cow"),
RC_OBJECT(RC_KF_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 1", "KF Shop Item 1"),
RC_OBJECT(RC_KF_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 2", "KF Shop Item 2"),
RC_OBJECT(RC_KF_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 3", "KF Shop Item 3"),
RC_OBJECT(RC_KF_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 4", "KF Shop Item 4"),
RC_OBJECT(RC_KF_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 5", "KF Shop Item 5"),
RC_OBJECT(RC_KF_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 6", "KF Shop Item 6"),
RC_OBJECT(RC_KF_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 7", "KF Shop Item 7"),
RC_OBJECT(RC_KF_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KOKIRI_FOREST, "Shop Item 8", "KF Shop Item 8"),
RC_OBJECT(RC_KF_DEKU_TREE_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Left Gossip Stone", "KF Deku Tree Left Gossip Stone"),
RC_OBJECT(RC_KF_DEKU_TREE_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Deku Tree Right Gossip Stone", "KF Deku Tree Right Gossip Stone"),
RC_OBJECT(RC_KF_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Gossip Stone", "KF Gossip Stone"),
RC_OBJECT(RC_KF_STORMS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KOKIRI_FOREST, "Storms Gossip Stone", "KF Storms Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsLW = {
RC_OBJECT(RC_LW_NEAR_SHORTCUTS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Near Shortcuts Grotto Chest", "LW Near Shortcuts Grotto Chest"),
RC_OBJECT(RC_LW_SKULL_KID, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Skull Kid", "LW Skull Kid"),
RC_OBJECT(RC_LW_TRADE_COJIRO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Cojiro", "LW Trade Cojiro"),
RC_OBJECT(RC_LW_TRADE_ODD_POTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Trade Odd Potion", "LW Trade Odd Potion"),
RC_OBJECT(RC_LW_OCARINA_MEMORY_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Ocarina Memory Game", "LW Ocarina Memory Game"),
RC_OBJECT(RC_LW_TARGET_IN_WOODS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Target in Woods", "LW Target in Woods"),
RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Right", "LW Deku Scrub Near Deku Theater Right"),
RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_DEKU_THEATER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Deku Theater Left", "LW Deku Scrub Near Deku Theater Left"),
RC_OBJECT(RC_LW_DEKU_SCRUB_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Near Bridge", "LW Deku Scrub Near Bridge"),
RC_OBJECT(RC_LW_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Rear", "LW Deku Scrub Grotto Rear"),
RC_OBJECT(RC_LW_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Scrub Grotto Front", "LW Deku Scrub Grotto Front"),
RC_OBJECT(RC_DEKU_THEATER_SKULL_MASK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Skull Mask", "Deku Theater Skull Mask"),
RC_OBJECT(RC_DEKU_THEATER_MASK_OF_TRUTH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Deku Theater Mask of Truth", "Deku Theater Mask of Truth"),
RC_OBJECT(RC_LW_GS_BEAN_PATCH_NEAR_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Bridge", "LW GS Bean Patch Near Bridge"),
RC_OBJECT(RC_LW_GS_BEAN_PATCH_NEAR_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Bean Patch Near Theater", "LW GS Bean Patch Near Theater"),
RC_OBJECT(RC_LW_GS_ABOVE_THEATER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LOST_WOODS, "GS Above Theater", "LW GS Above Theater"),
RC_OBJECT(RC_LW_GIFT_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LOST_WOODS, "Gift From Saria", "LW Gift From Saria"),
RC_OBJECT(RC_LW_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Gossip Stone", "LW Gossip Stone"),
RC_OBJECT(RC_LW_NEAR_SHORTCUTS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LOST_WOODS, "Near Shortcuts Gossip Stone", "LW Near Shortcuts Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsSFM = {
RC_OBJECT(RC_SFM_WOLFOS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Wolfos Grotto Chest", "SFM Wolfos Grotto Chest"),
RC_OBJECT(RC_SFM_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Rear", "SFM Deku Scrub Grotto Rear"),
RC_OBJECT(RC_SFM_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Deku Scrub Grotto Front", "SFM Deku Scrub Grotto Front"),
RC_OBJECT(RC_SFM_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SACRED_FOREST_MEADOW, "GS", "SFM GS"),
RC_OBJECT(RC_SHEIK_IN_FOREST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Sheik in Forest", "Sheik in Forest"),
RC_OBJECT(RC_SONG_FROM_SARIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SACRED_FOREST_MEADOW, "Song from Saria", "Song from Saria"),
RC_OBJECT(RC_SFM_MAZE_LOWER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Lower Gossip Stone", "SFM Maze Lower Gossip Stone"),
RC_OBJECT(RC_SFM_MAZE_UPPER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Maze Upper Gossip Stone", "SFM Maze Upper Gossip Stone"),
RC_OBJECT(RC_SFM_SARIA_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_SACRED_FOREST_MEADOW, "Saria Gossip Stone", "SFM Saria Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsHF = {
RC_OBJECT(RC_HF_SOUTHEAST_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Southeast Grotto Chest", "HF Southeast Grotto Chest"),
RC_OBJECT(RC_HF_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Open Grotto Chest", "HF Open Grotto Chest"),
RC_OBJECT(RC_HF_NEAR_MARKET_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Near Market Grotto Chest", "HF Near Market Grotto Chest"),
RC_OBJECT(RC_HF_OCARINA_OF_TIME_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Ocarina of Time Item", "HF Ocarina of Time Item"),
RC_OBJECT(RC_HF_TEKTITE_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Tektite Grotto Freestanding PoH", "HF Tektite Grotto Freestanding PoH"),
RC_OBJECT(RC_HF_DEKU_SCRUB_GROTTO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Deku Scrub Grotto", "HF Deku Scrub Grotto"),
RC_OBJECT(RC_HF_GS_COW_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Cow Grotto", "HF GS Cow Grotto"),
RC_OBJECT(RC_HF_GS_NEAR_KAK_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_FIELD, "GS Near Kak Grotto", "HF GS Near Kak Grotto"),
RC_OBJECT(RC_SONG_FROM_OCARINA_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_FIELD, "Song from Ocarina of Time", "Song from Ocarina of Time"),
RC_OBJECT(RC_HF_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_HYRULE_FIELD, "Cow Grotto Cow", "HF Cow Grotto Cow"),
RC_OBJECT(RC_HF_COW_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Cow Grotto Gossip Stone", "HF Cow Grotto Gossip Stone"),
RC_OBJECT(RC_HF_NEAR_MARKET_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Near Market Gossip Stone", "HF Near Market Gossip Stone"),
RC_OBJECT(RC_HF_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Open Grotto Gossip Stone", "HF Open Grotto Gossip Stone"),
RC_OBJECT(RC_HF_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_FIELD, "Southeast Gossip Stone", "HF Southeast Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsLH = {
RC_OBJECT(RC_LH_CHILD_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Child Fishing", "LH Child Fishing"),
RC_OBJECT(RC_LH_ADULT_FISHING, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Adult Fishing", "LH Adult Fishing"),
RC_OBJECT(RC_LH_LAB_DIVE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Dive", "LH Lab Dive"),
RC_OBJECT(RC_LH_TRADE_FROG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Lab Trade Eyeball Frog", "LH Lab Trade Eyeball Frog"),
RC_OBJECT(RC_LH_UNDERWATER_ITEM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Underwater Item", "LH Underwater Item"),
RC_OBJECT(RC_LH_SUN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Sun", "LH Sun"),
RC_OBJECT(RC_LH_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Freestanding PoH", "LH Freestanding PoH"),
RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Left", "LH Deku Scrub Grotto Left"),
RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Right", "LH Deku Scrub Grotto Right"),
RC_OBJECT(RC_LH_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LAKE_HYLIA, "Deku Scrub Grotto Center", "LH Deku Scrub Grotto Center"),
RC_OBJECT(RC_LH_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Bean Patch", "LH GS Bean Patch"),
RC_OBJECT(RC_LH_GS_SMALL_ISLAND, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Small Island", "LH GS Small Island"),
RC_OBJECT(RC_LH_GS_LAB_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Wall", "LH GS Lab Wall"),
RC_OBJECT(RC_LH_GS_LAB_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Lab Crate", "LH GS Lab Crate"),
RC_OBJECT(RC_LH_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LAKE_HYLIA, "GS Tree", "LH GS Tree"),
RC_OBJECT(RC_LH_LAB_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Lab Gossip Stone", "LH Lab Gossip Stone"),
RC_OBJECT(RC_LH_SOUTHEAST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southeast Gossip Stone", "LH Southeast Gossip Stone"),
RC_OBJECT(RC_LH_SOUTHWEST_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_LAKE_HYLIA, "Southwest Gossip Stone", "LH Southwest Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsGV = {
RC_OBJECT(RC_GV_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Chest", "GV Chest"),
RC_OBJECT(RC_GV_TRADE_SAW, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Trade Saw", "GV Trade Saw"),
RC_OBJECT(RC_GV_WATERFALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Waterfall Freestanding PoH", "GV Waterfall Freestanding PoH"),
RC_OBJECT(RC_GV_CRATE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Crate Freestanding PoH", "GV Crate Freestanding PoH"),
RC_OBJECT(RC_GV_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Rear", "GV Deku Scrub Grotto Rear"),
RC_OBJECT(RC_GV_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_VALLEY, "Deku Scrub Grotto Front", "GV Deku Scrub Grotto Front"),
RC_OBJECT(RC_GV_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Bean Patch", "GV GS Bean Patch"),
RC_OBJECT(RC_GV_GS_SMALL_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Small Bridge", "GV GS Small Bridge"),
RC_OBJECT(RC_GV_GS_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Pillar", "GV GS Pillar"),
RC_OBJECT(RC_GV_GS_BEHIND_TENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_VALLEY, "GS Behind Tent", "GV GS Behind Tent"),
RC_OBJECT(RC_GV_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_GERUDO_VALLEY, "Cow", "GV Cow"),
RC_OBJECT(RC_GV_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GERUDO_VALLEY, "Gossip Stone", "GV Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsGF = {
RC_OBJECT(RC_GF_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "Chest", "GF Chest"),
RC_OBJECT(RC_GF_HBA_1000_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1000 Points", "GF HBA 1000 Points"),
RC_OBJECT(RC_GF_HBA_1500_POINTS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF HBA 1500 Points", "GF HBA 1500 Points"),
RC_OBJECT(RC_GF_GERUDO_MEMBERSHIP_CARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF Gerudo Membership Card", "GF Gerudo Membership Card"),
RC_OBJECT(RC_GF_NORTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F1 Carpenter", "GF North F1 Carpenter"),
RC_OBJECT(RC_GF_NORTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF North F2 Carpenter", "GF North F2 Carpenter"),
RC_OBJECT(RC_GF_SOUTH_F1_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F1 Carpenter", "GF South F1 Carpenter"),
RC_OBJECT(RC_GF_SOUTH_F2_CARPENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_FORTRESS, "GF South F2 Carpenter", "GF South F2 Carpenter"),
RC_OBJECT(RC_GF_GS_ARCHERY_RANGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Archery Range", "GF GS Archery Range"),
RC_OBJECT(RC_GF_GS_TOP_FLOOR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GERUDO_FORTRESS, "GS Top Floor", "GF GS Top Floor"),
};
std::vector<RandomizerCheckObject> rcObjectsWL = {
RC_OBJECT(RC_WASTELAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Chest", "Wasteland Chest"),
RC_OBJECT(RC_WASTELAND_BOMBCHU_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WASTELAND, "Carpet Salesman", "Wasteland Carpet Salesman"),
RC_OBJECT(RC_WASTELAND_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WASTELAND, "GS", "Wasteland GS"),
};
std::vector<RandomizerCheckObject> rcObjectsCL = {
RC_OBJECT(RC_COLOSSUS_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Freestanding PoH", "Colossus Freestanding PoH"),
RC_OBJECT(RC_COLOSSUS_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Rear", "Colossus Deku Scrub Grotto Rear"),
RC_OBJECT(RC_COLOSSUS_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Deku Scrub Grotto Front", "Colossus Deku Scrub Grotto Front"),
RC_OBJECT(RC_COLOSSUS_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Bean Patch", "Colossus GS Bean Patch"),
RC_OBJECT(RC_COLOSSUS_GS_HILL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Hill", "Colossus GS Hill"),
RC_OBJECT(RC_COLOSSUS_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DESERT_COLOSSUS, "GS Tree", "Colossus GS Tree"),
RC_OBJECT(RC_COLOSSUS_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Great Fairy Reward", "Colossus Great Fairy Reward"),
RC_OBJECT(RC_SHEIK_AT_COLOSSUS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DESERT_COLOSSUS, "Sheik at Colossus", "Sheik at Colossus"),
RC_OBJECT(RC_COLOSSUS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DESERT_COLOSSUS, "Gossip Stone", "Colossus Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsMK = {
RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Treasure Chest Game Reward", "MK Treasure Chest Game Reward"),
RC_OBJECT(RC_MARKET_BOMBCHU_BOWLING_FIRST_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling First Prize", "MK Bombchu Bowling First Prize"),
RC_OBJECT(RC_MARKET_BOMBCHU_BOWLING_SECOND_PRIZE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Bombchu Bowling Second Prize", "MK Bombchu Bowling Second Prize"),
RC_OBJECT(RC_MARKET_LOST_DOG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Lost Dog", "MK Lost Dog"),
RC_OBJECT(RC_MARKET_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Shooting Gallery", "MK Shooting Gallery"),
RC_OBJECT(RC_MARKET_10_BIG_POES, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "10 Big Poes", "MK 10 Big Poes"),
RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game First Room Chest", "MK Chest Game First Room Chest"),
RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Second Room Chest", "MK Chest Game Second Room Chest"),
RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Third Room Chest", "MK Chest Game Third Room Chest"),
RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fourth Room Chest", "MK Chest Game Fourth Room Chest"),
RC_OBJECT(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, RCVORMQ_VANILLA, RCTYPE_CHEST_GAME, RCAREA_MARKET, "Chest Game Fifth Room Chest", "MK Chest Game Fifth Room Chest"),
RC_OBJECT(RC_MARKET_GS_GUARD_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_MARKET, "Market GS Guard House", "Market GS Guard House"),
RC_OBJECT(RC_TOT_LIGHT_ARROWS_CUTSCENE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "ToT Light Arrow Cutscene", "ToT Light Arrow Cutscene"),
RC_OBJECT(RC_SHEIK_AT_TEMPLE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_MARKET, "Sheik at Temple", "Sheik at Temple"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 1", "MK Bombchu Shop Item 1"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 2", "MK Bombchu Shop Item 2"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 3", "MK Bombchu Shop Item 3"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 4", "MK Bombchu Shop Item 4"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 5", "MK Bombchu Shop Item 5"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 6", "MK Bombchu Shop Item 6"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 7", "MK Bombchu Shop Item 7"),
RC_OBJECT(RC_MARKET_BOMBCHU_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bombchu Shop Item 8", "MK Bombchu Shop Item 8"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 1", "MK Potion Shop Item 1"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 2", "MK Potion Shop Item 2"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 3", "MK Potion Shop Item 3"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 4", "MK Potion Shop Item 4"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 5", "MK Potion Shop Item 5"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 6", "MK Potion Shop Item 6"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 7", "MK Potion Shop Item 7"),
RC_OBJECT(RC_MARKET_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Potion Shop Item 8", "MK Potion Shop Item 8"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 1", "MK Bazaar Item 1"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 2", "MK Bazaar Item 2"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 3", "MK Bazaar Item 3"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 4", "MK Bazaar Item 4"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 5", "MK Bazaar Item 5"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 6", "MK Bazaar Item 6"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 7", "MK Bazaar Item 7"),
RC_OBJECT(RC_MARKET_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_MARKET, "Bazaar Item 8", "MK Bazaar Item 8"),
RC_OBJECT(RC_TOT_LEFT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Center Gossip Stone", "ToT Left Center Gossip Stone"),
RC_OBJECT(RC_TOT_LEFT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Left Gossip Stone", "ToT Left Gossip Stone"),
RC_OBJECT(RC_TOT_RIGHT_CENTER_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Center Gossip Stone", "ToT Right Center Gossip Stone"),
RC_OBJECT(RC_TOT_RIGHT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_MARKET, "ToT Right Gossip Stone", "ToT Right Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsHC = {
RC_OBJECT(RC_HC_MALON_EGG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Malon Egg", "HC Malon Egg"),
RC_OBJECT(RC_HC_ZELDAS_LETTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Zeldas Letter", "HC Zeldas Letter"),
RC_OBJECT(RC_OGC_GS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "OGC GS", "OGC GS"),
RC_OBJECT(RC_HC_GS_STORMS_GROTTO, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Storms Grotto", "HC GS Storms Grotto"),
RC_OBJECT(RC_HC_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_HYRULE_CASTLE, "GS Tree", "HC GS Tree"),
RC_OBJECT(RC_HC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Great Fairy Reward", "HC Great Fairy Reward"),
RC_OBJECT(RC_OGC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "OGC Great Fairy Reward", "OGC Great Fairy Reward"),
RC_OBJECT(RC_SONG_FROM_IMPA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_HYRULE_CASTLE, "Song from Impa", "Song from Impa"),
RC_OBJECT(RC_HC_MALON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Malon Gossip Stone", "HC Malon Gossip Stone"),
RC_OBJECT(RC_HC_ROCK_WALL_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Rock Wall Gossip Stone", "HC Rock Wall Gossip Stone"),
RC_OBJECT(RC_HC_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_HYRULE_CASTLE, "Storms Grotto Gossip Stone", "HC Storms Grotto Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsKV = {
RC_OBJECT(RC_KAK_REDEAD_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Redead Grotto Chest", "Kak Redead Grotto Chest"),
RC_OBJECT(RC_KAK_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Chest", "Kak Open Grotto Chest"),
RC_OBJECT(RC_KAK_10_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "10 Gold Skulltula Reward", "Kak 10 Gold Skulltula Reward"),
RC_OBJECT(RC_KAK_20_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "20 Gold Skulltula Reward", "Kak 20 Gold Skulltula Reward"),
RC_OBJECT(RC_KAK_30_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "30 Gold Skulltula Reward", "Kak 30 Gold Skulltula Reward"),
RC_OBJECT(RC_KAK_40_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "40 Gold Skulltula Reward", "Kak 40 Gold Skulltula Reward"),
RC_OBJECT(RC_KAK_50_GOLD_SKULLTULA_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "50 Gold Skulltula Reward", "Kak 50 Gold Skulltula Reward"),
RC_OBJECT(RC_KAK_MAN_ON_ROOF, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Man on Roof", "Kak Man on Roof"),
RC_OBJECT(RC_KAK_SHOOTING_GALLERY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Shooting Gallery Reward", "Kak Shooting Gallery Reward"),
RC_OBJECT(RC_KAK_TRADE_ODD_MUSHROOM, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Odd Mushroom", "Kak Trade Odd Mushroom"),
RC_OBJECT(RC_KAK_ANJU_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Adult", "Kak Anju as Adult"),
RC_OBJECT(RC_KAK_ANJU_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Anju as Child", "Kak Anju as Child"),
RC_OBJECT(RC_KAK_TRADE_POCKET_CUCCO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Trade Pocket Cucco", "Kak Trade Pocket Cucco"),
RC_OBJECT(RC_KAK_IMPAS_HOUSE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Impas House Freestanding PoH", "Kak Impas House Freestanding PoH"),
RC_OBJECT(RC_KAK_WINDMILL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Windmill Freestanding PoH", "Kak Windmill Freestanding PoH"),
RC_OBJECT(RC_KAK_GS_HOUSE_UNDER_CONSTRUCTION, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS House Under Construction", "Kak GS House Under Construction"),
RC_OBJECT(RC_KAK_GS_SKULLTULA_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Skulltula House", "Kak GS Skulltula House"),
RC_OBJECT(RC_KAK_GS_GUARDS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Guards House", "Kak GS Guards House"),
RC_OBJECT(RC_KAK_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Tree", "Kak GS Tree"),
RC_OBJECT(RC_KAK_GS_WATCHTOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Watchtower", "Kak GS Watchtower"),
RC_OBJECT(RC_KAK_GS_ABOVE_IMPAS_HOUSE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_KAKARIKO_VILLAGE, "GS Above Impas House", "Kak GS Above Impas House"),
RC_OBJECT(RC_SHEIK_IN_KAKARIKO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Sheik in Kakariko", "Sheik in Kakariko"),
RC_OBJECT(RC_SONG_FROM_WINDMILL, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_KAKARIKO_VILLAGE, "Song from Windmill", "Song from Windmill"),
RC_OBJECT(RC_KAK_IMPAS_HOUSE_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_KAKARIKO_VILLAGE, "Impas House Cow", "Kak Impas House Cow"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 1", "Kak Potion Shop Item 1"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 2", "Kak Potion Shop Item 2"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 3", "Kak Potion Shop Item 3"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 4", "Kak Potion Shop Item 4"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 5", "Kak Potion Shop Item 5"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 6", "Kak Potion Shop Item 6"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 7", "Kak Potion Shop Item 7"),
RC_OBJECT(RC_KAK_POTION_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Potion Shop Item 8", "Kak Potion Shop Item 8"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 1", "Kak Bazaar Item 1"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 2", "Kak Bazaar Item 2"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 3", "Kak Bazaar Item 3"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 4", "Kak Bazaar Item 4"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 5", "Kak Bazaar Item 5"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 6", "Kak Bazaar Item 6"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 7", "Kak Bazaar Item 7"),
RC_OBJECT(RC_KAK_BAZAAR_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_KAKARIKO_VILLAGE, "Bazaar Item 8", "Kak Bazaar Item 8"),
RC_OBJECT(RC_KAK_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_KAKARIKO_VILLAGE, "Open Grotto Gossip Stone", "Kak Open Grotto Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsGY = {
RC_OBJECT(RC_GRAVEYARD_SHIELD_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Shield Grave Chest", "GY Shield Grave Chest"),
RC_OBJECT(RC_GRAVEYARD_HEART_PIECE_GRAVE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Heart Piece Grave Chest", "GY Heart Piece Grave Chest"),
RC_OBJECT(RC_GRAVEYARD_ROYAL_FAMILYS_TOMB_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Composers Grave Chest", "GY Composers Grave Chest"),
RC_OBJECT(RC_GRAVEYARD_HOOKSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Hookshot Chest", "GY Hookshot Chest"),
RC_OBJECT(RC_GRAVEYARD_DAMPE_RACE_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Race Freestanding PoH", "GY Dampe Race Freestanding PoH"),
RC_OBJECT(RC_GRAVEYARD_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Freestanding PoH", "GY Freestanding PoH"),
RC_OBJECT(RC_GRAVEYARD_DAMPE_GRAVEDIGGING_TOUR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Dampe Gravedigging Tour", "GY Dampe Gravedigging Tour"),
RC_OBJECT(RC_GRAVEYARD_GS_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Wall", "Graveyard GS Wall"),
RC_OBJECT(RC_GRAVEYARD_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GRAVEYARD, "GS Bean Patch", "Graveyard GS Bean Patch"),
RC_OBJECT(RC_SONG_FROM_ROYAL_FAMILYS_TOMB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GRAVEYARD, "Song from Composers Grave", "Song from Composers Grave"),
RC_OBJECT(RC_GY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GRAVEYARD, "Gossip Stone", "GY Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsDMT = {
RC_OBJECT(RC_DMT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Chest", "DMT Chest"),
RC_OBJECT(RC_DMT_STORMS_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Chest", "DMT Storms Grotto Chest"),
RC_OBJECT(RC_DMT_TRADE_BROKEN_SWORD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Broken Sword", "DMT Trade Broken Sword"),
RC_OBJECT(RC_DMT_TRADE_EYEDROPS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Eyedrops", "DMT Trade Eyedrops"),
RC_OBJECT(RC_DMT_TRADE_CLAIM_CHECK, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Trade Claim Check", "DMT Trade Claim Check"),
RC_OBJECT(RC_DMT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Freestanding PoH", "DMT Freestanding PoH"),
RC_OBJECT(RC_DMT_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Bean Patch", "DMT GS Bean Patch"),
RC_OBJECT(RC_DMT_GS_NEAR_KAK, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Near Kak", "DMT GS Near Kak"),
RC_OBJECT(RC_DMT_GS_ABOVE_DODONGOS_CAVERN, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Above Dodongos Cavern", "DMT GS Above Dodongos Cavern"),
RC_OBJECT(RC_DMT_GS_FALLING_ROCKS_PATH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_TRAIL, "GS Falling Rocks Path", "DMT GS Falling Rocks Path"),
RC_OBJECT(RC_DMT_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_TRAIL, "Great Fairy Reward", "DMT Great Fairy Reward"),
RC_OBJECT(RC_DMT_COW_GROTTO_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_DEATH_MOUNTAIN_TRAIL, "Cow Grotto Cow", "DMT Cow Grotto Cow"),
RC_OBJECT(RC_DMT_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Gossip Stone", "DMT Gossip Stone"),
RC_OBJECT(RC_DMT_STORMS_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_TRAIL, "Storms Grotto Gossip Stone", "DMT Storms Grotto Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsGC = {
RC_OBJECT(RC_GC_MAZE_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Left Chest", "GC Maze Left Chest"),
RC_OBJECT(RC_GC_MAZE_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Right Chest", "GC Maze Right Chest"),
RC_OBJECT(RC_GC_MAZE_CENTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Maze Center Chest", "GC Maze Center Chest"),
RC_OBJECT(RC_GC_ROLLING_GORON_AS_CHILD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Child", "GC Rolling Goron as Child"),
RC_OBJECT(RC_GC_ROLLING_GORON_AS_ADULT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Rolling Goron as Adult", "GC Rolling Goron as Adult"),
RC_OBJECT(RC_GC_DARUNIAS_JOY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Darunias Joy", "GC Darunias Joy"),
RC_OBJECT(RC_GC_POT_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Pot Freestanding PoH", "GC Pot Freestanding PoH"),
RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Left", "GC Deku Scrub Grotto Left"),
RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Right", "GC Deku Scrub Grotto Right"),
RC_OBJECT(RC_GC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Deku Scrub Grotto Center", "GC Deku Scrub Grotto Center"),
RC_OBJECT(RC_GC_MEDIGORON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GORON_CITY, "Medigoron", "GC Medigoron"),
RC_OBJECT(RC_GC_GS_CENTER_PLATFORM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Center Platform", "GC GS Center Platform"),
RC_OBJECT(RC_GC_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_GORON_CITY, "GS Boulder Maze", "GC GS Boulder Maze"),
RC_OBJECT(RC_GC_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 1", "GC Shop Item 1"),
RC_OBJECT(RC_GC_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 2", "GC Shop Item 2"),
RC_OBJECT(RC_GC_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 3", "GC Shop Item 3"),
RC_OBJECT(RC_GC_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 4", "GC Shop Item 4"),
RC_OBJECT(RC_GC_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 5", "GC Shop Item 5"),
RC_OBJECT(RC_GC_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 6", "GC Shop Item 6"),
RC_OBJECT(RC_GC_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 7", "GC Shop Item 7"),
RC_OBJECT(RC_GC_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_GORON_CITY, "Shop Item 8", "GC Shop Item 8"),
RC_OBJECT(RC_GC_MAZE_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Maze Gossip Stone", "GC Maze Gossip Stone"),
RC_OBJECT(RC_GC_MEDIGORON_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_GORON_CITY, "Medigoron Gossip Stone", "GC Medigoron Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsDMC = {
RC_OBJECT(RC_DMC_UPPER_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Chest", "DMC Upper Grotto Chest"),
RC_OBJECT(RC_DMC_WALL_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Wall Freestanding PoH", "DMC Wall Freestanding PoH"),
RC_OBJECT(RC_DMC_VOLCANO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Volcano Freestanding PoH", "DMC Volcano Freestanding PoH"),
RC_OBJECT(RC_DMC_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub", "DMC Deku Scrub"),
RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Left", "DMC Deku Scrub Grotto Left"),
RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Right", "DMC Deku Scrub Grotto Right"),
RC_OBJECT(RC_DMC_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Deku Scrub Grotto Center", "DMC Deku Scrub Grotto Center"),
RC_OBJECT(RC_DMC_GS_BEAN_PATCH, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Bean Patch", "DMC GS Bean Patch"),
RC_OBJECT(RC_DMC_GS_CRATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEATH_MOUNTAIN_CRATER, "GS Crate", "DMC GS Crate"),
RC_OBJECT(RC_DMC_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Great Fairy Reward", "DMC Great Fairy Reward"),
RC_OBJECT(RC_SHEIK_IN_CRATER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEATH_MOUNTAIN_CRATER, "Sheik in Crater", "Sheik in Crater"),
RC_OBJECT(RC_DMC_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Gossip Stone", "DMC Gossip Stone"),
RC_OBJECT(RC_DMC_UPPER_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DEATH_MOUNTAIN_CRATER, "Upper Grotto Gossip Stone", "DMC Upper Grotto Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsZR = {
RC_OBJECT(RC_ZR_OPEN_GROTTO_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Open Grotto Chest", "ZR Open Grotto Chest"),
RC_OBJECT(RC_ZR_MAGIC_BEAN_SALESMAN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Magic Bean Salesman", "ZR Magic Bean Salesman"),
RC_OBJECT(RC_ZR_FROGS_ZELDAS_LULLABY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Zelda's Lullaby", "ZR Frogs Zelda's Lullaby"),
RC_OBJECT(RC_ZR_FROGS_EPONAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Epona's Song", "ZR Frogs Epona's Song"),
RC_OBJECT(RC_ZR_FROGS_SARIAS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Saria's Song", "ZR Frogs Saria's Song"),
RC_OBJECT(RC_ZR_FROGS_SUNS_SONG, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Sun's Song", "ZR Frogs Sun's Song"),
RC_OBJECT(RC_ZR_FROGS_SONG_OF_TIME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Song of Time", "ZR Frogs Song of Time"),
RC_OBJECT(RC_ZR_FROGS_IN_THE_RAIN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs in the Rain", "ZR Frogs in the Rain"),
RC_OBJECT(RC_ZR_FROGS_OCARINA_GAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Frogs Ocarina Game", "ZR Frogs Ocarina Game"),
RC_OBJECT(RC_ZR_NEAR_OPEN_GROTTO_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Open Grotto Freestanding PoH", "ZR Near Open Grotto Freestanding PoH"),
RC_OBJECT(RC_ZR_NEAR_DOMAIN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Near Domain Freestanding PoH", "ZR Near Domain Freestanding PoH"),
RC_OBJECT(RC_ZR_DEKU_SCRUB_GROTTO_REAR, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Rear", "ZR Deku Scrub Grotto Rear"),
RC_OBJECT(RC_ZR_DEKU_SCRUB_GROTTO_FRONT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_RIVER, "Deku Scrub Grotto Front", "ZR Deku Scrub Grotto Front"),
RC_OBJECT(RC_ZR_GS_LADDER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Ladder", "ZR GS Ladder"),
RC_OBJECT(RC_ZR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Tree", "ZR GS Tree"),
RC_OBJECT(RC_ZR_GS_ABOVE_BRIDGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Above Bridge", "ZR GS Above Bridge"),
RC_OBJECT(RC_ZR_GS_NEAR_RAISED_GROTTOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_RIVER, "GS Near Raised Grottos", "ZR GS Near Raised Grottos"),
RC_OBJECT(RC_ZR_NEAR_DOMAIN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Domain Gossip Stone", "ZR Near Domain Gossip Stone"),
RC_OBJECT(RC_ZR_NEAR_GROTTOS_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Near Grottos Gossip Stone", "ZR Near Grottos Gossip Stone"),
RC_OBJECT(RC_ZR_OPEN_GROTTO_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_RIVER, "Open Grotto Gossip Stone", "ZR Open Grotto Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsZD = {
RC_OBJECT(RC_ZD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Chest", "ZD Chest"),
RC_OBJECT(RC_ZD_DIVING_MINIGAME, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Diving Minigame", "ZD Diving Minigame"),
RC_OBJECT(RC_ZD_KING_ZORA_THAWED, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "King Zora Thawed", "ZD King Zora Thawed"),
RC_OBJECT(RC_ZD_TRADE_PRESCRIPTION, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_DOMAIN, "Trade Prescription", "ZD Trade Prescription"),
RC_OBJECT(RC_ZD_GS_FROZEN_WATERFALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_DOMAIN, "GS Frozen Waterfall", "ZD GS Frozen Waterfall"),
RC_OBJECT(RC_ZD_SHOP_ITEM_1, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 1", "ZD Shop Item 1"),
RC_OBJECT(RC_ZD_SHOP_ITEM_2, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 2", "ZD Shop Item 2"),
RC_OBJECT(RC_ZD_SHOP_ITEM_3, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 3", "ZD Shop Item 3"),
RC_OBJECT(RC_ZD_SHOP_ITEM_4, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 4", "ZD Shop Item 4"),
RC_OBJECT(RC_ZD_SHOP_ITEM_5, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 5", "ZD Shop Item 5"),
RC_OBJECT(RC_ZD_SHOP_ITEM_6, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 6", "ZD Shop Item 6"),
RC_OBJECT(RC_ZD_SHOP_ITEM_7, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 7", "ZD Shop Item 7"),
RC_OBJECT(RC_ZD_SHOP_ITEM_8, RCVORMQ_VANILLA, RCTYPE_SHOP, RCAREA_ZORAS_DOMAIN, "Shop Item 8", "ZD Shop Item 8"),
RC_OBJECT(RC_ZD_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_DOMAIN, "Gossip Stone", "ZD Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsZF = {
RC_OBJECT(RC_ZF_ICEBERC_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Iceberg Freestanding PoH", "ZF Iceberg Freestanding PoH"),
RC_OBJECT(RC_ZF_BOTTOM_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Bottom Freestanding PoH", "ZF Bottom Freestanding PoH"),
RC_OBJECT(RC_ZF_GS_ABOVE_THE_LOG, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Above The Log", "ZF GS Above The Log"),
RC_OBJECT(RC_ZF_GS_HIDDEN_CAVE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Hidden Cave", "ZF GS Hidden Cave"),
RC_OBJECT(RC_ZF_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ZORAS_FOUNTAIN, "GS Tree", "ZF GS Tree"),
RC_OBJECT(RC_ZF_GREAT_FAIRY_REWARD, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ZORAS_FOUNTAIN, "Great Fairy Reward", "ZF Great Fairy Reward"),
RC_OBJECT(RC_FAIRY_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Fairy Gossip Stone", "Fairy Gossip Stone"),
RC_OBJECT(RC_JABU_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_ZORAS_FOUNTAIN, "Jabu Gossip Stone", "Jabu Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsLLR = {
RC_OBJECT(RC_LLR_TALONS_CHICKENS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Talons Chickens", "LLR Talons Chickens"),
RC_OBJECT(RC_LLR_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Freestanding PoH", "LLR Freestanding PoH"),
RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Left", "LLR Deku Scrub Grotto Left"),
RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Right", "LLR Deku Scrub Grotto Right"),
RC_OBJECT(RC_LLR_DEKU_SCRUB_GROTTO_CENTER, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Deku Scrub Grotto Center", "LLR Deku Scrub Grotto Center"),
RC_OBJECT(RC_LLR_GS_BACK_WALL, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Back Wall", "LLR GS Back Wall"),
RC_OBJECT(RC_LLR_GS_RAIN_SHED, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Rain Shed", "LLR GS Rain Shed"),
RC_OBJECT(RC_LLR_GS_HOUSE_WINDOW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS House Window", "LLR GS House Window"),
RC_OBJECT(RC_LLR_GS_TREE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_LON_LON_RANCH, "GS Tree", "LLR GS Tree"),
RC_OBJECT(RC_SONG_FROM_MALON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_LON_LON_RANCH, "Song from Malon", "Song from Malon"),
RC_OBJECT(RC_LLR_STABLES_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Left Cow", "LLR Stables Left Cow"),
RC_OBJECT(RC_LLR_STABLES_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Stables Right Cow", "LLR Stables Right Cow"),
RC_OBJECT(RC_LLR_TOWER_LEFT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Left Cow", "LLR Tower Left Cow"),
RC_OBJECT(RC_LLR_TOWER_RIGHT_COW, RCVORMQ_VANILLA, RCTYPE_COW, RCAREA_LON_LON_RANCH, "Tower Right Cow", "LLR Tower Right Cow"),
};
std::vector<RandomizerCheckObject> rcObjectsDT = {
RC_OBJECT(RC_DEKU_TREE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Map Chest", "Deku Tree Map Chest"),
RC_OBJECT(RC_DEKU_TREE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "Compass Chest", "Deku Tree Compass Chest"),
RC_OBJECT(RC_DEKU_TREE_COMPASS_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Compass Room Side Chest", "Deku Tree Compass Room Side Chest"),
RC_OBJECT(RC_DEKU_TREE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Basement Chest", "Deku Tree Basement Chest"),
RC_OBJECT(RC_DEKU_TREE_SLINGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Chest", "Deku Tree Slingshot Chest"),
RC_OBJECT(RC_DEKU_TREE_SLINGSHOT_ROOM_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Slingshot Room Side Chest", "Deku Tree Slingshot Room Side Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Map Chest", "Deku Tree MQ Map Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DEKU_TREE, "MQ Compass Chest", "Deku Tree MQ Compass Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_SLINGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Chest", "Deku Tree MQ Slingshot Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_SLINGSHOT_ROOM_BACK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Slingshot Room Back Chest", "Deku Tree MQ Slingshot Room Back Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Basement Chest", "Deku Tree MQ Basement Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_BEFORE_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Before Spinning Log Chest", "Deku Tree MQ Before Spinning Log Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_AFTER_SPINNING_LOG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ After Spinning Log Chest", "Deku Tree MQ After Spinning Log Chest"),
RC_OBJECT(RC_DEKU_TREE_MQ_DEKU_SCRUB, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "MQ Deku Scrub", "Deku Tree MQ Deku Scrub"),
RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Back Room", "Deku Tree GS Basement Back Room"),
RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Gate", "Deku Tree GS Basement Gate"),
RC_OBJECT(RC_DEKU_TREE_GS_BASEMENT_VINES, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Basement Vines", "Deku Tree GS Basement Vines"),
RC_OBJECT(RC_DEKU_TREE_GS_COMPASS_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "GS Compass Room", "Deku Tree GS Compass Room"),
RC_OBJECT(RC_DEKU_TREE_MQ_GS_LOBBY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Lobby", "Deku Tree MQ GS Lobby"),
RC_OBJECT(RC_DEKU_TREE_MQ_GS_COMPASS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Compass Room", "Deku Tree MQ GS Compass Room"),
RC_OBJECT(RC_DEKU_TREE_MQ_GS_BASEMENT_GRAVES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Graves Room", "Deku Tree MQ GS Basement Graves Room"),
RC_OBJECT(RC_DEKU_TREE_MQ_GS_BASEMENT_BACK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DEKU_TREE, "MQ GS Basement Back Room", "Deku Tree MQ GS Basement Back Room"),
RC_OBJECT(RC_QUEEN_GOHMA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma", "Queen Gohma"),
RC_OBJECT(RC_DEKU_TREE_QUEEN_GOHMA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DEKU_TREE, "Queen Gohma Heart Container", "Deku Tree Queen Gohma Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsDC = {
RC_OBJECT(RC_DODONGOS_CAVERN_BOSS_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Boss Room Chest", "Dodongos Cavern Boss Room Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Map Chest", "Dodongos Cavern Map Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "Compass Chest", "Dodongos Cavern Compass Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_BOMB_FLOWER_PLATFORM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Flower Platform Chest", "Dodongos Cavern Bomb Flower Platform Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_BOMB_BAG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Bomb Bag Chest", "Dodongos Cavern Bomb Bag Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_END_OF_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "End Of Bridge Chest", "Dodongos Cavern End Of Bridge Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Left", "Dodongos Cavern Deku Scrub Near Bomb Bag Left"),
RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_SIDE_ROOM_NEAR_DODONGOS, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Dodongos", "Dodongos Cavern Deku Scrub Side Room Near Dodongos"),
RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_NEAR_BOMB_BAG_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Near Bomb Bag Right", "Dodongos Cavern Deku Scrub Near Bomb Bag Right"),
RC_OBJECT(RC_DODONGOS_CAVERN_DEKU_SCRUB_LOBBY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby", "Dodongos Cavern Deku Scrub Lobby"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Map Chest", "Dodongos Cavern MQ Map Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_BOMB_BAG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Bomb Bag Chest", "Dodongos Cavern MQ Bomb Bag Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_DODONGOS_CAVERN, "MQ Compass Chest", "Dodongos Cavern MQ Compass Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_LARVAE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Larvae Room Chest", "Dodongos Cavern MQ Larvae Room Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_TORCH_PUZZLE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Torch Puzzle Room Chest", "Dodongos Cavern MQ Torch Puzzle Room Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_UNDER_GRAVE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "MQ Under Grave Chest", "Dodongos Cavern MQ Under Grave Chest"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_REAR, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Rear", "Dodongos Cavern Deku Scrub Lobby Rear"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_LOBBY_FRONT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Lobby Front", "Dodongos Cavern Deku Scrub Lobby Front"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_STAIRCASE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Staircase", "Dodongos Cavern Deku Scrub Staircase"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_DEKU_SCRUB_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "Deku Scrub Side Room Near Lower Lizalfos", "Dodongos Cavern Deku Scrub Side Room Near Lower Lizalfos"),
RC_OBJECT(RC_DODONGOS_CAVERN_GS_VINES_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Vines Above Stairs", "Dodongos Cavern GS Vines Above Stairs"),
RC_OBJECT(RC_DODONGOS_CAVERN_GS_SCARECROW, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Scarecrow", "Dodongos Cavern GS Scarecrow"),
RC_OBJECT(RC_DODONGOS_CAVERN_GS_ALCOVE_ABOVE_STAIRS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Alcove Above Stairs", "Dodongos Cavern GS Alcove Above Stairs"),
RC_OBJECT(RC_DODONGOS_CAVERN_GS_BACK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Back Room", "Dodongos Cavern GS Back Room"),
RC_OBJECT(RC_DODONGOS_CAVERN_GS_SIDE_ROOM_NEAR_LOWER_LIZALFOS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "GS Side Room Near Lower Lizalfos", "Dodongos Cavern GS Side Room Near Lower Lizalfos"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_SCRUB_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Scrub Room", "Dodongos Cavern MQ GS Scrub Room"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_SONG_OF_TIME_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Song of Time Block Room", "Dodongos Cavern MQ GS Song of Time Block Room"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_LIZALFOS_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Lizalfos Room", "Dodongos Cavern MQ GS Lizalfos Room"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_LARVAE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Larvae Room", "Dodongos Cavern MQ GS Larvae Room"),
RC_OBJECT(RC_DODONGOS_CAVERN_MQ_GS_BACK_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_DODONGOS_CAVERN, "MQ GS Back Room", "Dodongos Cavern MQ GS Back Room"),
RC_OBJECT(RC_KING_DODONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo", "King Dodongo"),
RC_OBJECT(RC_DODONGOS_CAVERN_KING_DODONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_DODONGOS_CAVERN, "King Dodongo Heart Container", "Dodongos Cavern King Dodongo Heart Container"),
RC_OBJECT(RC_DODONGOS_CAVERN_GOSSIP_STONE, RCVORMQ_VANILLA, RCTYPE_GOSSIP_STONE, RCAREA_DODONGOS_CAVERN, "Gossip Stone", "Dodongo's Cavern Gossip Stone"),
};
std::vector<RandomizerCheckObject> rcObjectsJB = {
RC_OBJECT(RC_JABU_JABUS_BELLY_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Map Chest", "Jabu Jabus Belly Map Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "Compass Chest", "Jabu Jabus Belly Compass Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_BOOMERANG_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Boomerang Chest", "Jabu Jabus Belly Boomerang Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_DEKU_SCRUB, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Deku Scrub", "Jabu Jabus Belly Deku Scrub"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_FIRST_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ First Room Side Chest", "Jabu Jabus Belly MQ First Room Side Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Map Chest", "Jabu Jabus Belly MQ Map Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Lower Chest", "Jabu Jabus Belly MQ Second Room Lower Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_JABU_JABUS_BELLY, "MQ Compass Chest", "Jabu Jabus Belly MQ Compass Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_SECOND_ROOM_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Second Room Upper Chest", "Jabu Jabus Belly MQ Second Room Upper Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_SWITCHES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Switches Chest", "Jabu Jabus Belly MQ Basement Near Switches Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BASEMENT_NEAR_VINES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Basement Near Vines Chest", "Jabu Jabus Belly MQ Basement Near Vines Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Near Boss Chest", "Jabu Jabus Belly MQ Near Boss Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_FALLING_LIKE_LIKE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Falling Like Like Room Chest", "Jabu Jabus Belly MQ Falling Like Like Room Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_ROOM_SMALL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Room Small Chest", "Jabu Jabus Belly MQ Boomerang Room Small Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_BOOMERANG_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "MQ Boomerang Chest", "Jabu Jabus Belly MQ Boomerang Chest"),
RC_OBJECT(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_LOWER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Lower", "Jabu Jabus Belly GS Lobby Basement Lower"),
RC_OBJECT(RC_JABU_JABUS_BELLY_GS_LOBBY_BASEMENT_UPPER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Lobby Basement Upper", "Jabu Jabus Belly GS Lobby Basement Upper"),
RC_OBJECT(RC_JABU_JABUS_BELLY_GS_NEAR_BOSS, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Near Boss", "Jabu Jabus Belly GS Near Boss"),
RC_OBJECT(RC_JABU_JABUS_BELLY_GS_WATER_SWITCH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "GS Water Switch Room", "Jabu Jabus Belly GS Water Switch Room"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_TAILPASARAN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Tail Parasan Room", "Jabu Jabus Belly MQ GS Tail Parasan Room"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_INVISIBLE_ENEMIES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Invisible Enemies Room", "Jabu Jabus Belly MQ GS Invisible Enemies Room"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_BOOMERANG_CHEST_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Boomerang Chest Room", "Jabu Jabus Belly MQ GS Boomerang Chest Room"),
RC_OBJECT(RC_JABU_JABUS_BELLY_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_JABU_JABUS_BELLY, "MQ GS Near Boss", "Jabu Jabus Belly MQ GS Near Boss"),
RC_OBJECT(RC_BARINADE, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade", "Barinade"),
RC_OBJECT(RC_JABU_JABUS_BELLY_BARINADE_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_JABU_JABUS_BELLY, "Barinade Heart Container", "Jabu Jabus Belly Barinade Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsFST = {
RC_OBJECT(RC_FOREST_TEMPLE_FIRST_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Room Chest", "Forest Temple First Room Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_FIRST_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "First Stalfos Chest", "Forest Temple First Stalfos Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_RAISED_ISLAND_COURTYARD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Raised Island Courtyard Chest", "Forest Temple Raised Island Courtyard Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "Map Chest", "Forest Temple Map Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_WELL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Well Chest", "Forest Temple Well Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_FALLING_CEILING_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Falling Ceiling Room Chest", "Forest Temple Falling Ceiling Room Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_EYE_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Eye Switch Chest", "Forest Temple Eye Switch Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Boss Key Chest", "Forest Temple Boss Key Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Floormaster Chest", "Forest Temple Floormaster Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_BOW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Bow Chest", "Forest Temple Bow Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_RED_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Red Poe Chest", "Forest Temple Red Poe Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_BLUE_POE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Blue Poe Chest", "Forest Temple Blue Poe Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_BASEMENT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Basement Chest", "Forest Temple Basement Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_FIRST_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ First Room Chest", "Forest Temple MQ First Room Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_WOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Wolfos Chest", "Forest Temple MQ Wolfos Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_BOW_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Bow Chest", "Forest Temple MQ Bow Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Lower Chest", "Forest Temple MQ Raised Island Courtyard Lower Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_RAISED_ISLAND_COURTYARD_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Raised Island Courtyard Upper Chest", "Forest Temple MQ Raised Island Courtyard Upper Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_WELL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Well Chest", "Forest Temple MQ Well Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Map Chest", "Forest Temple MQ Map Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FOREST_TEMPLE, "MQ Compass Chest", "Forest Temple MQ Compass Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_FALLING_CEILING_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Falling Ceiling Room Chest", "Forest Temple MQ Falling Ceiling Room Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_BASEMENT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Basement Chest", "Forest Temple MQ Basement Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_REDEAD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Redead Chest", "Forest Temple MQ Redead Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "MQ Boss Key Chest", "Forest Temple MQ Boss Key Chest"),
RC_OBJECT(RC_FOREST_TEMPLE_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Raised Island Courtyard", "Forest Temple GS Raised Island Courtyard"),
RC_OBJECT(RC_FOREST_TEMPLE_GS_FIRST_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS First Room", "Forest Temple GS First Room"),
RC_OBJECT(RC_FOREST_TEMPLE_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Level Island Courtyard", "Forest Temple GS Level Island Courtyard"),
RC_OBJECT(RC_FOREST_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Lobby", "Forest Temple GS Lobby"),
RC_OBJECT(RC_FOREST_TEMPLE_GS_BASEMENT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "GS Basement", "Forest Temple GS Basement"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_FIRST_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS First Hallway", "Forest Temple MQ GS First Hallway"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_BLOCK_PUSH_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Block Push Room", "Forest Temple MQ GS Block Push Room"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_RAISED_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Raised Island Courtyard", "Forest Temple MQ GS Raised Island Courtyard"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_LEVEL_ISLAND_COURTYARD, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Level Island Courtyard", "Forest Temple MQ GS Level Island Courtyard"),
RC_OBJECT(RC_FOREST_TEMPLE_MQ_GS_WELL, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FOREST_TEMPLE, "MQ GS Well", "Forest Temple MQ GS Well"),
RC_OBJECT(RC_PHANTOM_GANON, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon", "Phantom Ganon"),
RC_OBJECT(RC_FOREST_TEMPLE_PHANTOM_GANON_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FOREST_TEMPLE, "Phantom Ganon Heart Container", "Forest Temple Phantom Ganon Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsFRT = {
RC_OBJECT(RC_FIRE_TEMPLE_NEAR_BOSS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Near Boss Chest", "Fire Temple Near Boss Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_FLARE_DANCER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Flare Dancer Chest", "Fire Temple Flare Dancer Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boss Key Chest", "Fire Temple Boss Key Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Blocked Door Chest", "Fire Temple Big Lava Room Blocked Door Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BIG_LAVA_ROOM_LOWER_OPEN_DOOR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Big Lava Room Lower Open Door Chest", "Fire Temple Big Lava Room Lower Open Door Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Lower Chest", "Fire Temple Boulder Maze Lower Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Upper Chest", "Fire Temple Boulder Maze Upper Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_SIDE_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Side Room Chest", "Fire Temple Boulder Maze Side Room Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_BOULDER_MAZE_SHORTCUT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Boulder Maze Shortcut Chest", "Fire Temple Boulder Maze Shortcut Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Scarecrow Chest", "Fire Temple Scarecrow Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Map Chest", "Fire Temple Map Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "Compass Chest", "Fire Temple Compass Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_HIGHEST_GORON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Highest Goron Chest", "Fire Temple Highest Goron Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MEGATON_HAMMER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Megaton Hammer Chest", "Fire Temple Megaton Hammer Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_NEAR_BOSS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Near Boss Chest", "Fire Temple MQ Near Boss Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_MEGATON_HAMMER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Megaton Hammer Chest", "Fire Temple MQ Megaton Hammer Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Compass Chest", "Fire Temple MQ Compass Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Lower Chest", "Fire Temple MQ Lizalfos Maze Lower Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Upper Chest", "Fire Temple MQ Lizalfos Maze Upper Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_CHEST_ON_FIRE, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Chest on Fire", "Fire Temple MQ Chest on Fire"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_MAP_ROOM_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Map Room Side Chest", "Fire Temple MQ Map Room Side Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_FIRE_TEMPLE, "MQ Map Chest", "Fire Temple MQ Map Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Boss Key Chest", "Fire Temple MQ Boss Key Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_BIG_LAVA_ROOM_BLOCKED_DOOR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Big Lava Room Blocked Door Chest", "Fire Temple MQ Big Lava Room Blocked Door Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_LIZALFOS_MAZE_SIDE_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Lizalfos Maze Side Room Chest", "Fire Temple MQ Lizalfos Maze Side Room Chest"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "MQ Freestanding Key", "Fire Temple MQ Freestanding Key"),
RC_OBJECT(RC_FIRE_TEMPLE_GS_SONG_OF_TIME_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Song of Time Room", "Fire Temple GS Song of Time Room"),
RC_OBJECT(RC_FIRE_TEMPLE_GS_BOSS_KEY_LOOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boss Key Loop", "Fire Temple GS Boss Key Loop"),
RC_OBJECT(RC_FIRE_TEMPLE_GS_BOULDER_MAZE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Boulder Maze", "Fire Temple GS Boulder Maze"),
RC_OBJECT(RC_FIRE_TEMPLE_GS_SCARECROW_TOP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Top", "Fire Temple GS Scarecrow Top"),
RC_OBJECT(RC_FIRE_TEMPLE_GS_SCARECROW_CLIMB, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "GS Scarecrow Climb", "Fire Temple GS Scarecrow Climb"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_ABOVE_FIRE_WALL_MAZE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Above Fire Wall Maze", "Fire Temple MQ GS Above Fire Wall Maze"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_CENTER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Center", "Fire Temple MQ GS Fire Wall Maze Center"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_BIG_LAVA_ROOM_OPEN_DOOR, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Big Lava Room Open Door", "Fire Temple MQ GS Big Lava Room Open Door"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_FIRE_WALL_MAZE_SIDE_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Fire Wall Maze Side Room", "Fire Temple MQ GS Fire Wall Maze Side Room"),
RC_OBJECT(RC_FIRE_TEMPLE_MQ_GS_SKULL_ON_FIRE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_FIRE_TEMPLE, "MQ GS Skull on Fire", "Fire Temple MQ GS Skull on Fire"),
RC_OBJECT(RC_VOLVAGIA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia", "Volvagia"),
RC_OBJECT(RC_FIRE_TEMPLE_VOLVAGIA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_FIRE_TEMPLE, "Volvagia Heart Container", "Fire Temple Volvagia Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsWT = {
RC_OBJECT(RC_WATER_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Map Chest", "Water Temple Map Chest"),
RC_OBJECT(RC_WATER_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "Compass Chest", "Water Temple Compass Chest"),
RC_OBJECT(RC_WATER_TEMPLE_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Torches Chest", "Water Temple Torches Chest"),
RC_OBJECT(RC_WATER_TEMPLE_DRAGON_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Dragon Chest", "Water Temple Dragon Chest"),
RC_OBJECT(RC_WATER_TEMPLE_CENTRAL_BOW_TARGET_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Bow Target Chest", "Water Temple Central Bow Target Chest"),
RC_OBJECT(RC_WATER_TEMPLE_CENTRAL_PILLAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Central Pillar Chest", "Water Temple Central Pillar Chest"),
RC_OBJECT(RC_WATER_TEMPLE_CRACKED_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Cracked Wall Chest", "Water Temple Cracked Wall Chest"),
RC_OBJECT(RC_WATER_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Boss Key Chest", "Water Temple Boss Key Chest"),
RC_OBJECT(RC_WATER_TEMPLE_LONGSHOT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Longshot Chest", "Water Temple Longshot Chest"),
RC_OBJECT(RC_WATER_TEMPLE_RIVER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "River Chest", "Water Temple River Chest"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_CENTRAL_PILLAR_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Central Pillar Chest", "Water Temple MQ Central Pillar Chest"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Boss Key Chest", "Water Temple MQ Boss Key Chest"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_LONGSHOT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Longshot Chest", "Water Temple MQ Longshot Chest"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Compass Chest", "Water Temple MQ Compass Chest"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_WATER_TEMPLE, "MQ Map Chest", "Water Temple MQ Map Chest"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "MQ Freestanding Key", "Water Temple MQ Freestanding Key"),
RC_OBJECT(RC_WATER_TEMPLE_GS_BEHIND_GATE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Behind Gate", "Water Temple GS Behind Gate"),
RC_OBJECT(RC_WATER_TEMPLE_GS_FALLING_PLATFORM_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Falling Platform Room", "Water Temple GS Falling Platform Room"),
RC_OBJECT(RC_WATER_TEMPLE_GS_CENTRAL_PILLAR, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Central Pillar", "Water Temple GS Central Pillar"),
RC_OBJECT(RC_WATER_TEMPLE_GS_NEAR_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS Near Boss Key Chest", "Water Temple GS Near Boss Key Chest"),
RC_OBJECT(RC_WATER_TEMPLE_GS_RIVER, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "GS River", "Water Temple GS River"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_BEFORE_UPPER_WATER_SWITCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Before Upper Water Switch", "Water Temple MQ GS Before Upper Water Switch"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_FREESTANDING_KEY_AREA, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Freestanding Key Area", "Water Temple MQ GS Freestanding Key Area"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_LIZALFOS_HALLWAY, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Lizalfos Hallway", "Water Temple MQ GS Lizalfos Hallway"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_RIVER, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS River", "Water Temple MQ GS River"),
RC_OBJECT(RC_WATER_TEMPLE_MQ_GS_TRIPLE_WALL_TORCH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_WATER_TEMPLE, "MQ GS Triple Wall Torch", "Water Temple MQ GS Triple Wall Torch"),
RC_OBJECT(RC_MORPHA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha", "Morpha"),
RC_OBJECT(RC_WATER_TEMPLE_MORPHA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_WATER_TEMPLE, "Morpha Heart Container", "Water Temple Morpha Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsSPT = {
RC_OBJECT(RC_SPIRIT_TEMPLE_SILVER_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Silver Gauntlets Chest", "Spirit Temple Silver Gauntlets Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MIRROR_SHIELD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Mirror Shield Chest", "Spirit Temple Mirror Shield Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_BRIDGE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Bridge Chest", "Spirit Temple Child Bridge Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_EARLY_TORCHES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Early Torches Chest", "Spirit Temple Child Early Torches Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Compass Chest", "Spirit Temple Compass Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_EARLY_ADULT_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Early Adult Right Chest", "Spirit Temple Early Adult Right Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_FIRST_MIRROR_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Left Chest", "Spirit Temple First Mirror Left Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_FIRST_MIRROR_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "First Mirror Right Chest", "Spirit Temple First Mirror Right Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "Map Chest", "Spirit Temple Map Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb North Chest", "Spirit Temple Child Climb North Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_CHILD_CLIMB_EAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Child Climb East Chest", "Spirit Temple Child Climb East Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_SUN_BLOCK_ROOM_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Sun Block Room Chest", "Spirit Temple Sun Block Room Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_STATUE_ROOM_HAND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Hand Chest", "Spirit Temple Statue Room Hand Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_STATUE_ROOM_NORTHEAST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Statue Room Northeast Chest", "Spirit Temple Statue Room Northeast Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_NEAR_FOUR_ARMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Near Four Armos Chest", "Spirit Temple Near Four Armos Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_HALLWAY_RIGHT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Right Invisible Chest", "Spirit Temple Hallway Right Invisible Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_HALLWAY_LEFT_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Hallway Left Invisible Chest", "Spirit Temple Hallway Left Invisible Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Boss Key Chest", "Spirit Temple Boss Key Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_TOPMOST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Topmost Chest", "Spirit Temple Topmost Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Left Chest", "Spirit Temple MQ Entrance Front Left Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Right Chest", "Spirit Temple MQ Entrance Back Right Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_FRONT_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Front Right Chest", "Spirit Temple MQ Entrance Front Right Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_ENTRANCE_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Entrance Back Left Chest", "Spirit Temple MQ Entrance Back Left Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_HAMMER_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Hammer Switch Chest", "Spirit Temple MQ Child Hammer Switch Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Map Chest", "Spirit Temple MQ Map Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MAP_ROOM_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Map Room Enemy Chest", "Spirit Temple MQ Map Room Enemy Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_NORTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb North Chest", "Spirit Temple MQ Child Climb North Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHILD_CLIMB_SOUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Child Climb South Chest", "Spirit Temple MQ Child Climb South Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SPIRIT_TEMPLE, "MQ Compass Chest", "Spirit Temple MQ Compass Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Lullaby Chest", "Spirit Temple MQ Statue Room Lullaby Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_STATUE_ROOM_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Statue Room Invisible Chest", "Spirit Temple MQ Statue Room Invisible Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SILVER_BLOCK_HALLWAY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Silver Block Hallway Chest", "Spirit Temple MQ Silver Block Hallway Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SUN_BLOCK_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Sun Block Room Chest", "Spirit Temple MQ Sun Block Room Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_SYMPHONY_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Symphony Room Chest", "Spirit Temple MQ Symphony Room Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_LEEVER_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Leever Room Chest", "Spirit Temple MQ Leever Room Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_BEAMOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Beamos Room Chest", "Spirit Temple MQ Beamos Room Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_CHEST_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Chest Switch Chest", "Spirit Temple MQ Chest Switch Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Boss Key Chest", "Spirit Temple MQ Boss Key Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_MIRROR_PUZZLE_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "MQ Mirror Puzzle Invisible Chest", "Spirit Temple MQ Mirror Puzzle Invisible Chest"),
RC_OBJECT(RC_SPIRIT_TEMPLE_GS_HALL_AFTER_SUN_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Hall After Sun Block Room", "Spirit Temple GS Hall After Sun Block Room"),
RC_OBJECT(RC_SPIRIT_TEMPLE_GS_BOULDER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Boulder Room", "Spirit Temple GS Boulder Room"),
RC_OBJECT(RC_SPIRIT_TEMPLE_GS_LOBBY, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Lobby", "Spirit Temple GS Lobby"),
RC_OBJECT(RC_SPIRIT_TEMPLE_GS_SUN_ON_FLOOR_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Sun on Floor Room", "Spirit Temple GS Sun on Floor Room"),
RC_OBJECT(RC_SPIRIT_TEMPLE_GS_METAL_FENCE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "GS Metal Fence", "Spirit Temple GS Metal Fence"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_SYMPHONY_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Symphony Room", "Spirit Temple MQ GS Symphony Room"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_LEEVER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Leever Room", "Spirit Temple MQ GS Leever Room"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_WEST, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room West", "Spirit Temple MQ GS Nine Thrones Room West"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_NINE_THRONES_ROOM_NORTH, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Nine Thrones Room North", "Spirit Temple MQ GS Nine Thrones Room North"),
RC_OBJECT(RC_SPIRIT_TEMPLE_MQ_GS_SUN_BLOCK_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SPIRIT_TEMPLE, "MQ GS Sun Block Room", "Spirit Temple MQ GS Sun Block Room"),
RC_OBJECT(RC_TWINROVA, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova", "Twinrova"),
RC_OBJECT(RC_SPIRIT_TEMPLE_TWINROVA_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SPIRIT_TEMPLE, "Twinrova Heart Container", "Spirit Temple Twinrova Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsSDT = {
RC_OBJECT(RC_SHADOW_TEMPLE_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Map Chest", "Shadow Temple Map Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_HOVER_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Hover Boots Chest", "Shadow Temple Hover Boots Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "Compass Chest", "Shadow Temple Compass Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_EARLY_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Early Silver Rupee Chest", "Shadow Temple Early Silver Rupee Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Visible Chest", "Shadow Temple Invisible Blades Visible Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Blades Invisible Chest", "Shadow Temple Invisible Blades Invisible Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Lower Chest", "Shadow Temple Falling Spikes Lower Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Upper Chest", "Shadow Temple Falling Spikes Upper Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Falling Spikes Switch Chest", "Shadow Temple Falling Spikes Switch Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_SPIKES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Spikes Chest", "Shadow Temple Invisible Spikes Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_WIND_HINT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Wind Hint Chest", "Shadow Temple Wind Hint Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_AFTER_WIND_ENEMY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Enemy Chest", "Shadow Temple After Wind Enemy Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "After Wind Hidden Chest", "Shadow Temple After Wind Hidden Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Spike Walls Left Chest", "Shadow Temple Spike Walls Left Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Boss Key Chest", "Shadow Temple Boss Key Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_INVISIBLE_FLOORMASTER_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Invisible Floormaster Chest", "Shadow Temple Invisible Floormaster Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Freestanding Key", "Shadow Temple Freestanding Key"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Compass Chest", "Shadow Temple MQ Compass Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_HOVER_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Hover Boots Chest", "Shadow Temple MQ Hover Boots Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_EARLY_GIBDOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Early Gibdos Chest", "Shadow Temple MQ Early Gibdos Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_SHADOW_TEMPLE, "MQ Map Chest", "Shadow Temple MQ Map Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BEAMOS_SILVER_RUPEES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Beamos Silver Rupees Chest", "Shadow Temple MQ Beamos Silver Rupees Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Switch Chest", "Shadow Temple MQ Falling Spikes Switch Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_LOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Lower Chest", "Shadow Temple MQ Falling Spikes Lower Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FALLING_SPIKES_UPPER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Falling Spikes Upper Chest", "Shadow Temple MQ Falling Spikes Upper Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_SPIKES_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Spikes Chest", "Shadow Temple MQ Invisible Spikes Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BOSS_KEY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Boss Key Chest", "Shadow Temple MQ Boss Key Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_SPIKE_WALLS_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Spike Walls Left Chest", "Shadow Temple MQ Spike Walls Left Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_STALFOS_ROOM_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Stalfos Room Chest", "Shadow Temple MQ Stalfos Room Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Invisible Chest", "Shadow Temple MQ Invisible Blades Invisible Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_INVISIBLE_BLADES_VISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Invisible Blades Visible Chest", "Shadow Temple MQ Invisible Blades Visible Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Bomb Flower Chest", "Shadow Temple MQ Bomb Flower Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_WIND_HINT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Wind Hint Chest", "Shadow Temple MQ Wind Hint Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_HIDDEN_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Hidden Chest", "Shadow Temple MQ After Wind Hidden Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_AFTER_WIND_ENEMY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ After Wind Enemy Chest", "Shadow Temple MQ After Wind Enemy Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_NEAR_SHIP_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Near Ship Invisible Chest", "Shadow Temple MQ Near Ship Invisible Chest"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "MQ Freestanding Key", "Shadow Temple MQ Freestanding Key"),
RC_OBJECT(RC_SHADOW_TEMPLE_GS_SINGLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Single Giant Pot", "Shadow Temple GS Single Giant Pot"),
RC_OBJECT(RC_SHADOW_TEMPLE_GS_FALLING_SPIKES_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Falling Spikes Room", "Shadow Temple GS Falling Spikes Room"),
RC_OBJECT(RC_SHADOW_TEMPLE_GS_TRIPLE_GIANT_POT, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Triple Giant Pot", "Shadow Temple GS Triple Giant Pot"),
RC_OBJECT(RC_SHADOW_TEMPLE_GS_LIKE_LIKE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Like Like Room", "Shadow Temple GS Like Like Room"),
RC_OBJECT(RC_SHADOW_TEMPLE_GS_NEAR_SHIP, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "GS Near Ship", "Shadow Temple GS Near Ship"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_FALLING_SPIKES_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Falling Spikes Room", "Shadow Temple MQ GS Falling Spikes Room"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_WIND_HINT_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Wind Hint Room", "Shadow Temple MQ GS Wind Hint Room"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_AFTER_WIND, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Wind", "Shadow Temple MQ GS After Wind"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_AFTER_SHIP, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS After Ship", "Shadow Temple MQ GS After Ship"),
RC_OBJECT(RC_SHADOW_TEMPLE_MQ_GS_NEAR_BOSS, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_SHADOW_TEMPLE, "MQ GS Near Boss", "Shadow Temple MQ GS Near Boss"),
RC_OBJECT(RC_BONGO_BONGO, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo", "Bongo Bongo"),
RC_OBJECT(RC_SHADOW_TEMPLE_BONGO_BONGO_HEART, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_SHADOW_TEMPLE, "Bongo Bongo Heart Container", "Shadow Temple Bongo Bongo Heart Container"),
};
std::vector<RandomizerCheckObject> rcObjectsBW = {
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FRONT_LEFT_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Left Fake Wall Chest", "Bottom of the Well Front Left Fake Wall Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FRONT_CENTER_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Front Center Bombable Chest", "Bottom of the Well Front Center Bombable Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_RIGHT_BOTTOM_FAKE_WALL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Right Bottom Fake Wall Chest", "Bottom of the Well Right Bottom Fake Wall Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Compass Chest", "Bottom of the Well Compass Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_CENTER_SKULLTULA_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Center Skulltula Chest", "Bottom of the Well Center Skulltula Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_BACK_LEFT_BOMBABLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Back Left Bombable Chest", "Bottom of the Well Back Left Bombable Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_LENS_OF_TRUTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Lens of Truth Chest", "Bottom of the Well Lens of Truth Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Invisible Chest", "Bottom of the Well Invisible Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_UNDERWATER_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Front Chest", "Bottom of the Well Underwater Front Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_UNDERWATER_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Underwater Left Chest", "Bottom of the Well Underwater Left Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "Map Chest", "Bottom of the Well Map Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FIRE_KEESE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Fire Keese Chest", "Bottom of the Well Fire Keese Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_LIKE_LIKE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Like Like Chest", "Bottom of the Well Like Like Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "Freestanding Key", "Bottom of the Well Freestanding Key"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Map Chest", "Bottom of the Well MQ Map Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_LENS_OF_TRUTH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Lens of Truth Chest", "Bottom of the Well MQ Lens of Truth Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_BOTTOM_OF_THE_WELL, "MQ Compass Chest", "Bottom of the Well MQ Compass Chest"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_DEAD_HAND_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ Dead Hand Freestanding Key", "Bottom of the Well MQ Dead Hand Freestanding Key"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_EAST_INNER_ROOM_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_BOTTOM_OF_THE_WELL, "MQ East Inner Room Freestanding Key", "Bottom of the Well MQ East Inner Room Freestanding Key"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_LIKE_LIKE_CAGE, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS Like Like Cage", "Bottom of the Well GS Like Like Cage"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_EAST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS East Inner Room", "Bottom of the Well GS East Inner Room"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_GS_WEST_INNER_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "GS West Inner Room", "Bottom of the Well GS West Inner Room"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_BASEMENT, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Basement", "Bottom of the Well MQ GS Basement"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_COFFIN_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS Coffin Room", "Bottom of the Well MQ GS Coffin Room"),
RC_OBJECT(RC_BOTTOM_OF_THE_WELL_MQ_GS_WEST_INNER_ROOM, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_BOTTOM_OF_THE_WELL, "MQ GS West Inner Room", "Bottom of the Well MQ GS West Inner Room"),
};
std::vector<RandomizerCheckObject> rcObjectsIC = {
RC_OBJECT(RC_ICE_CAVERN_MAP_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Map Chest", "Ice Cavern Map Chest"),
RC_OBJECT(RC_ICE_CAVERN_COMPASS_CHEST, RCVORMQ_VANILLA, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "Compass Chest", "Ice Cavern Compass Chest"),
RC_OBJECT(RC_ICE_CAVERN_IRON_BOOTS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Iron Boots Chest", "Ice Cavern Iron Boots Chest"),
RC_OBJECT(RC_ICE_CAVERN_FREESTANDING_POH, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Freestanding PoH", "Ice Cavern Freestanding PoH"),
RC_OBJECT(RC_ICE_CAVERN_MQ_IRON_BOOTS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Iron Boots Chest", "Ice Cavern MQ Iron Boots Chest"),
RC_OBJECT(RC_ICE_CAVERN_MQ_COMPASS_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Compass Chest", "Ice Cavern MQ Compass Chest"),
RC_OBJECT(RC_ICE_CAVERN_MQ_MAP_CHEST, RCVORMQ_MQ, RCTYPE_MAP_COMPASS, RCAREA_ICE_CAVERN, "MQ Map Chest", "Ice Cavern MQ Map Chest"),
RC_OBJECT(RC_ICE_CAVERN_MQ_FREESTANDING_POH, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "MQ Freestanding PoH", "Ice Cavern MQ Freestanding PoH"),
RC_OBJECT(RC_ICE_CAVERN_GS_PUSH_BLOCK_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Push Block Room", "Ice Cavern GS Push Block Room"),
RC_OBJECT(RC_ICE_CAVERN_GS_SPINNING_SCYTHE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Spinning Scythe Room", "Ice Cavern GS Spinning Scythe Room"),
RC_OBJECT(RC_ICE_CAVERN_GS_HEART_PIECE_ROOM, RCVORMQ_VANILLA, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "GS Heart Piece Room", "Ice Cavern GS Heart Piece Room"),
RC_OBJECT(RC_ICE_CAVERN_MQ_GS_SCARECROW, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Scarecrow", "Ice Cavern MQ GS Scarecrow"),
RC_OBJECT(RC_ICE_CAVERN_MQ_GS_ICE_BLOCK, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Ice Block", "Ice Cavern MQ GS Ice Block"),
RC_OBJECT(RC_ICE_CAVERN_MQ_GS_RED_ICE, RCVORMQ_MQ, RCTYPE_SKULL_TOKEN, RCAREA_ICE_CAVERN, "MQ GS Red Ice", "Ice Cavern MQ GS Red Ice"),
RC_OBJECT(RC_SHEIK_IN_ICE_CAVERN, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_ICE_CAVERN, "Sheik in Ice Cavern", "Sheik in Ice Cavern"),
};
std::vector<RandomizerCheckObject> rcObjectsGTG = {
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_LOBBY_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Left Chest", "Gerudo Training Grounds Lobby Left Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_LOBBY_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Lobby Right Chest", "Gerudo Training Grounds Lobby Right Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_STALFOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Stalfos Chest", "Gerudo Training Grounds Stalfos Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_BEAMOS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Beamos Chest", "Gerudo Training Grounds Beamos Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HIDDEN_CEILING_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hidden Ceiling Chest", "Gerudo Training Grounds Hidden Ceiling Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path First Chest", "Gerudo Training Grounds Maze Path First Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Second Chest", "Gerudo Training Grounds Maze Path Second Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Third Chest", "Gerudo Training Grounds Maze Path Third Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_PATH_FINAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Path Final Chest", "Gerudo Training Grounds Maze Path Final Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Central Chest", "Gerudo Training Grounds Maze Right Central Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Maze Right Side Chest", "Gerudo Training Grounds Maze Right Side Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Underwater Silver Rupee Chest", "Gerudo Training Grounds Underwater Silver Rupee Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_CLEAR_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Clear Chest", "Gerudo Training Grounds Hammer Room Clear Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HAMMER_ROOM_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Hammer Room Switch Chest", "Gerudo Training Grounds Hammer Room Switch Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_EYE_STATUE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Eye Statue Chest", "Gerudo Training Grounds Eye Statue Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_NEAR_SCARECROW_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Near Scarecrow Chest", "Gerudo Training Grounds Near Scarecrow Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Before Heavy Block Chest", "Gerudo Training Grounds Before Heavy Block Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FIRST_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block First Chest", "Gerudo Training Grounds Heavy Block First Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_SECOND_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Second Chest", "Gerudo Training Grounds Heavy Block Second Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_THIRD_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Third Chest", "Gerudo Training Grounds Heavy Block Third Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_HEAVY_BLOCK_FOURTH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Heavy Block Fourth Chest", "Gerudo Training Grounds Heavy Block Fourth Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_FREESTANDING_KEY, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "Freestanding Key", "Gerudo Training Grounds Freestanding Key"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Right Chest", "Gerudo Training Grounds MQ Lobby Right Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_LOBBY_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Lobby Left Chest", "Gerudo Training Grounds MQ Lobby Left Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_FIRST_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ First Iron Knuckle Chest", "Gerudo Training Grounds MQ First Iron Knuckle Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_BEFORE_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Before Heavy Block Chest", "Gerudo Training Grounds MQ Before Heavy Block Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_EYE_STATUE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Eye Statue Chest", "Gerudo Training Grounds MQ Eye Statue Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_FLAME_CIRCLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Flame Circle Chest", "Gerudo Training Grounds MQ Flame Circle Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_SECOND_IRON_KNUCKLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Second Iron Knuckle Chest", "Gerudo Training Grounds MQ Second Iron Knuckle Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_DINOLFOS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Dinolfos Chest", "Gerudo Training Grounds MQ Dinolfos Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_ICE_ARROWS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Ice Arrows Chest", "Gerudo Training Grounds MQ Ice Arrows Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_CENTRAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Central Chest", "Gerudo Training Grounds MQ Maze Right Central Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path First Chest", "Gerudo Training Grounds MQ Maze Path First Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_RIGHT_SIDE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Right Side Chest", "Gerudo Training Grounds MQ Maze Right Side Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_THIRD_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Third Chest", "Gerudo Training Grounds MQ Maze Path Third Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_MAZE_PATH_SECOND_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Maze Path Second Chest", "Gerudo Training Grounds MQ Maze Path Second Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_HIDDEN_CEILING_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Hidden Ceiling Chest", "Gerudo Training Grounds MQ Hidden Ceiling Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_UNDERWATER_SILVER_RUPEE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Underwater Silver Rupee Chest", "Gerudo Training Grounds MQ Underwater Silver Rupee Chest"),
RC_OBJECT(RC_GERUDO_TRAINING_GROUND_MQ_HEAVY_BLOCK_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GERUDO_TRAINING_GROUND, "MQ Heavy Block Chest", "Gerudo Training Grounds MQ Heavy Block Chest"),
};
std::vector<RandomizerCheckObject> rcObjectsGNC = {
RC_OBJECT(RC_GANONS_TOWER_BOSS_KEY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Boss Key Chest", "Ganon's Tower Boss Key Chest"),
RC_OBJECT(RC_GANONS_CASTLE_FOREST_TRIAL_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Forest Trial Chest", "Ganon's Castle Forest Trial Chest"),
RC_OBJECT(RC_GANONS_CASTLE_WATER_TRIAL_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Left Chest", "Ganon's Castle Water Trial Left Chest"),
RC_OBJECT(RC_GANONS_CASTLE_WATER_TRIAL_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Water Trial Right Chest", "Ganon's Castle Water Trial Right Chest"),
RC_OBJECT(RC_GANONS_CASTLE_SHADOW_TRIAL_FRONT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Front Chest", "Ganon's Castle Shadow Trial Front Chest"),
RC_OBJECT(RC_GANONS_CASTLE_SHADOW_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Shadow Trial Golden Gauntlets Chest", "Ganon's Castle Shadow Trial Golden Gauntlets Chest"),
RC_OBJECT(RC_GANONS_CASTLE_SPIRIT_TRIAL_CRYSTAL_SWITCH_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Crystal Switch Chest", "Ganon's Castle Spirit Trial Crystal Switch Chest"),
RC_OBJECT(RC_GANONS_CASTLE_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Spirit Trial Invisible Chest", "Ganon's Castle Spirit Trial Invisible Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Left Chest", "Ganon's Castle Light Trial First Left Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Left Chest", "Ganon's Castle Light Trial Second Left Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_LEFT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Left Chest", "Ganon's Castle Light Trial Third Left Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_FIRST_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial First Right Chest", "Ganon's Castle Light Trial First Right Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_SECOND_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Second Right Chest", "Ganon's Castle Light Trial Second Right Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_THIRD_RIGHT_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Third Right Chest", "Ganon's Castle Light Trial Third Right Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_INVISIBLE_ENEMIES_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Invisible Enemies Chest", "Ganon's Castle Light Trial Invisible Enemies Chest"),
RC_OBJECT(RC_GANONS_CASTLE_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Light Trial Lullaby Chest", "Ganon's Castle Light Trial Lullaby Chest"),
RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Left", "Ganon's Castle Deku Scrub Center-Left"),
RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Center-Right", "Ganon's Castle Deku Scrub Center-Right"),
RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_RIGHT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Right", "Ganon's Castle Deku Scrub Right"),
RC_OBJECT(RC_GANONS_CASTLE_DEKU_SCRUB_LEFT, RCVORMQ_VANILLA, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "Deku Scrub Left", "Ganon's Castle Deku Scrub Left"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_WATER_TRIAL_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Water Trial Chest", "Ganon's Castle MQ Water Trial Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Eye Switch Chest", "Ganon's Castle MQ Forest Trial Eye Switch Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FROZEN_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Frozen Eye Switch Chest", "Ganon's Castle MQ Forest Trial Frozen Eye Switch Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_LIGHT_TRIAL_LULLABY_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Light Trial Lullaby Chest", "Ganon's Castle MQ Light Trial Lullaby Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_BOMB_FLOWER_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Bomb Flower Chest", "Ganon's Castle MQ Shadow Trial Bomb Flower Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SHADOW_TRIAL_EYE_SWITCH_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Shadow Trial Eye Switch Chest", "Ganon's Castle MQ Shadow Trial Eye Switch Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_GOLDEN_GAUNTLETS_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Golden Gauntlets Chest", "Ganon's Castle MQ Spirit Trial Golden Gauntlets Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_RIGHT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Right Chest", "Ganon's Castle MQ Spirit Trial Sun Back Right Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_BACK_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Back Left Chest", "Ganon's Castle MQ Spirit Trial Sun Back Left Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_SUN_FRONT_LEFT_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Sun Front Left Chest", "Ganon's Castle MQ Spirit Trial Sun Front Left Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_FIRST_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial First Chest", "Ganon's Castle MQ Spirit Trial First Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_SPIRIT_TRIAL_INVISIBLE_CHEST, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Spirit Trial Invisible Chest", "Ganon's Castle MQ Spirit Trial Invisible Chest"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_FOREST_TRIAL_FREESTANDING_KEY, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Forest Trial Freestanding Key", "Ganon's Castle MQ Forest Trial Freestanding Key"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Right", "Ganon's Castle MQ Deku Scrub Right"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Left", "Ganon's Castle MQ Deku Scrub Center-Left"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center", "Ganon's Castle MQ Deku Scrub Center"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_CENTER_RIGHT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Center-Right", "Ganon's Castle MQ Deku Scrub Center-Right"),
RC_OBJECT(RC_GANONS_CASTLE_MQ_DEKU_SCRUB_LEFT, RCVORMQ_MQ, RCTYPE_STANDARD, RCAREA_GANONS_CASTLE, "MQ Deku Scrub Left", "Ganon's Castle MQ Deku Scrub Left"),
};
std::map<RandomizerCheckArea, std::string> rcAreaNames = {
{ RCAREA_KOKIRI_FOREST, "Kokiri Forest"},
{ RCAREA_LOST_WOODS, "Lost Woods"},
{ RCAREA_SACRED_FOREST_MEADOW, "Sacred Forest Meadow"},
{ RCAREA_HYRULE_FIELD, "Hyrule Field"},
{ RCAREA_LAKE_HYLIA, "Lake Hylia"},
{ RCAREA_GERUDO_VALLEY, "Gerudo Valley"},
{ RCAREA_GERUDO_FORTRESS, "Gerudo Fortress"},
{ RCAREA_WASTELAND, "Desert Wasteland"},
{ RCAREA_DESERT_COLOSSUS, "Desert Colossus"},
{ RCAREA_MARKET, "Hyrule Market"},
{ RCAREA_HYRULE_CASTLE, "Hyrule Castle"},
{ RCAREA_KAKARIKO_VILLAGE, "Kakariko Village"},
{ RCAREA_GRAVEYARD, "Graveyard"},
{ RCAREA_DEATH_MOUNTAIN_TRAIL, "Death Mountain Trail"},
{ RCAREA_GORON_CITY, "Goron City"},
{ RCAREA_DEATH_MOUNTAIN_CRATER, "Death Mountain Crater"},
{ RCAREA_ZORAS_RIVER, "Zora's River"},
{ RCAREA_ZORAS_DOMAIN, "Zora's Domain"},
{ RCAREA_ZORAS_FOUNTAIN, "Zora's Fountain"},
{ RCAREA_LON_LON_RANCH, "Lon Lon Ranch"},
{ RCAREA_DEKU_TREE, "Deku Tree"},
{ RCAREA_DODONGOS_CAVERN, "Dodongo's Cavern"},
{ RCAREA_JABU_JABUS_BELLY, "Jabu Jabu's Belly"},
{ RCAREA_FOREST_TEMPLE, "Forest Temple"},
{ RCAREA_FIRE_TEMPLE, "Fire Temple"},
{ RCAREA_WATER_TEMPLE, "Water Temple"},
{ RCAREA_SPIRIT_TEMPLE, "Spirit Temple"},
{ RCAREA_SHADOW_TEMPLE, "Shadow Temple"},
{ RCAREA_BOTTOM_OF_THE_WELL, "Bottom of the Well"},
{ RCAREA_ICE_CAVERN, "Ice Cavern"},
{ RCAREA_GERUDO_TRAINING_GROUND, "Gerudo Training Grounds"},
{ RCAREA_GANONS_CASTLE, "Ganon's Castle"},
};
std::map<RandomizerCheckArea, std::vector<RandomizerCheckObject>> rcObjects = {
{ RCAREA_KOKIRI_FOREST, rcObjectsKF },
{ RCAREA_LOST_WOODS, rcObjectsLW },
{ RCAREA_SACRED_FOREST_MEADOW, rcObjectsSFM },
{ RCAREA_HYRULE_FIELD, rcObjectsHF },
{ RCAREA_LAKE_HYLIA, rcObjectsLH },
{ RCAREA_GERUDO_VALLEY, rcObjectsGV },
{ RCAREA_GERUDO_FORTRESS, rcObjectsGF },
{ RCAREA_WASTELAND, rcObjectsWL },
{ RCAREA_DESERT_COLOSSUS, rcObjectsCL },
{ RCAREA_MARKET, rcObjectsMK },
{ RCAREA_HYRULE_CASTLE, rcObjectsHC },
{ RCAREA_KAKARIKO_VILLAGE, rcObjectsKV },
{ RCAREA_GRAVEYARD, rcObjectsGY },
{ RCAREA_DEATH_MOUNTAIN_TRAIL, rcObjectsDMT },
{ RCAREA_GORON_CITY, rcObjectsGC },
{ RCAREA_DEATH_MOUNTAIN_CRATER, rcObjectsDMC },
{ RCAREA_ZORAS_RIVER, rcObjectsZR },
{ RCAREA_ZORAS_DOMAIN, rcObjectsZD },
{ RCAREA_ZORAS_FOUNTAIN, rcObjectsZF },
{ RCAREA_LON_LON_RANCH, rcObjectsLLR },
{ RCAREA_DEKU_TREE, rcObjectsDT },
{ RCAREA_DODONGOS_CAVERN, rcObjectsDC },
{ RCAREA_JABU_JABUS_BELLY, rcObjectsJB },
{ RCAREA_FOREST_TEMPLE, rcObjectsFST },
{ RCAREA_FIRE_TEMPLE, rcObjectsFRT },
{ RCAREA_WATER_TEMPLE, rcObjectsWT },
{ RCAREA_SPIRIT_TEMPLE, rcObjectsSPT },
{ RCAREA_SHADOW_TEMPLE, rcObjectsSDT },
{ RCAREA_BOTTOM_OF_THE_WELL, rcObjectsBW },
{ RCAREA_ICE_CAVERN, rcObjectsIC },
{ RCAREA_GERUDO_TRAINING_GROUND, rcObjectsGTG },
{ RCAREA_GANONS_CASTLE, rcObjectsGNC },
};
bool RandomizerCheckObjects::AreaIsDungeon(RandomizerCheckArea area) {
return area == RCAREA_GANONS_CASTLE ||
area == RCAREA_GERUDO_TRAINING_GROUND ||
area == RCAREA_ICE_CAVERN ||
area == RCAREA_BOTTOM_OF_THE_WELL ||
area == RCAREA_SHADOW_TEMPLE ||
area == RCAREA_SPIRIT_TEMPLE ||
area == RCAREA_WATER_TEMPLE ||
area == RCAREA_FIRE_TEMPLE ||
area == RCAREA_FOREST_TEMPLE ||
area == RCAREA_JABU_JABUS_BELLY ||
area == RCAREA_DODONGOS_CAVERN ||
area == RCAREA_DEKU_TREE;
}
bool RandomizerCheckObjects::AreaIsOverworld(RandomizerCheckArea area) {
return !AreaIsDungeon(area);
}
std::string RandomizerCheckObjects::GetRCAreaName(RandomizerCheckArea area) {
return rcAreaNames[area];
}
std::map<RandomizerCheckArea, std::vector<RandomizerCheckObject>> RandomizerCheckObjects::GetAllRCObjects() {
return rcObjects;
}
void RandomizerCheckObjects::UpdateImGuiVisibility() {
for (auto& areaIt : rcObjects) {
for (auto& locationIt : areaIt.second) {
locationIt.visibleInImgui = (
(locationIt.vOrMQ != RCVORMQ_MQ) && // don't show MQ checks until we support MQ
(locationIt.rcType != RCTYPE_SHOP) && // don't show shop items until we have shopsanity
(locationIt.rcType != RCTYPE_GOSSIP_STONE) && // don't show gossip stones (maybe gossipsanity will be a thing eventually?)
(locationIt.rcType != RCTYPE_LINKS_POCKET) &&
(locationIt.rcType != RCTYPE_CHEST_GAME) && // don't show non final reward chest game checks until we support shuffling them
((locationIt.rcType != RCTYPE_SKULL_TOKEN) ||
(CVar_GetS32("gRandomizeShuffleTokens", 0) == 3) || // all tokens
((CVar_GetS32("gRandomizeShuffleTokens", 0) == 2) && RandomizerCheckObjects::AreaIsOverworld(locationIt.rcArea)) || // overworld tokens
((CVar_GetS32("gRandomizeShuffleTokens", 0) == 1) && RandomizerCheckObjects::AreaIsDungeon(locationIt.rcArea)) // dungeon tokens
) &&
((locationIt.rcType != RCTYPE_COW) || CVar_GetS32("gRandomizeShuffleCows", 0)) &&
((locationIt.rcType != RCTYPE_ADULT_TRADE) || CVar_GetS32("gRandomizeShuffleAdultTrade", 0)) &&
((locationIt.rc != RC_KF_KOKIRI_SWORD_CHEST) || CVar_GetS32("gRandomizeShuffleKokiriSword", 0)) &&
((locationIt.rc != RC_HC_MALON_EGG) || CVar_GetS32("gRandomizeShuffleWeirdEgg", 0)) &&
((locationIt.rc != RC_GF_GERUDO_MEMBERSHIP_CARD) || CVar_GetS32("gRandomizeShuffleGerudoToken", 0)) &&
((locationIt.rcType != RCTYPE_FROG_SONG) || CVar_GetS32("gRandomizeShuffleFrogSongRupees", 0)) &&
((locationIt.rcType != RCTYPE_MAP_COMPASS) || CVar_GetS32("gRandomizeStartingMapsCompasses", 0) != 1) && // 1 is the value for "vanilla" maps/compasses
((locationIt.rcType != RCTYPE_SMALL_KEY) || CVar_GetS32("gRandomizeKeysanity", 0) != 1) && // 1 is the value for "vanilla" small keys
((locationIt.rcType != RCTYPE_GF_KEY) || CVar_GetS32("randoShuffleGerudoFortressKeys", 0) != 0) && // 0 is the value for "vanilla" gf keys
((locationIt.rcType != RCTYPE_BOSS_KEY) || CVar_GetS32("gRandomizeBossKeysanity", 0) != 1) && // 1 is the value for "vanilla" boss keys
((locationIt.rcType != RCTYPE_GANON_BOSS_KEY) || CVar_GetS32("gRandomizeShuffleGanonBossKey", 0) != 0) // 0 is the value for "vanilla" ganon's boss key
);
}
}
}

View File

@ -0,0 +1,83 @@
#pragma once
#include "randomizerTypes.h"
#include <string>
#include <vector>
#include <map>
// Check types based on main settings
typedef enum {
RCTYPE_STANDARD, // Base set of rando checks
RCTYPE_SKULL_TOKEN, // Gold Skulltulas
RCTYPE_COW, // Cows
RCTYPE_ADULT_TRADE, // Adult trade quest checks
RCTYPE_FROG_SONG, // Frog song purple rupee checks
RCTYPE_MAP_COMPASS, // Maps/Compasses
RCTYPE_SMALL_KEY, // Small Keys
RCTYPE_GF_KEY, // Gerudo Fortress Keys
RCTYPE_BOSS_KEY, // Boss Keys
RCTYPE_GANON_BOSS_KEY, // Ganon's boss key
RCTYPE_SHOP, // shops/scrubs
RCTYPE_CHEST_GAME, //todo replace this once we implement it, just using it to exclude for now
RCTYPE_LINKS_POCKET, //todo this feels hacky
RCTYPE_GOSSIP_STONE,
} RandomizerCheckType;
typedef enum {
RCVORMQ_VANILLA,
RCVORMQ_MQ,
RCVORMQ_BOTH
} RandomizerCheckVanillaOrMQ;
typedef enum {
RCAREA_KOKIRI_FOREST,
RCAREA_LOST_WOODS,
RCAREA_SACRED_FOREST_MEADOW,
RCAREA_HYRULE_FIELD,
RCAREA_LAKE_HYLIA,
RCAREA_GERUDO_VALLEY,
RCAREA_GERUDO_FORTRESS,
RCAREA_WASTELAND,
RCAREA_DESERT_COLOSSUS,
RCAREA_MARKET,
RCAREA_HYRULE_CASTLE,
RCAREA_KAKARIKO_VILLAGE,
RCAREA_GRAVEYARD,
RCAREA_DEATH_MOUNTAIN_TRAIL,
RCAREA_GORON_CITY,
RCAREA_DEATH_MOUNTAIN_CRATER,
RCAREA_ZORAS_RIVER,
RCAREA_ZORAS_DOMAIN,
RCAREA_ZORAS_FOUNTAIN,
RCAREA_LON_LON_RANCH,
RCAREA_DEKU_TREE,
RCAREA_DODONGOS_CAVERN,
RCAREA_JABU_JABUS_BELLY,
RCAREA_FOREST_TEMPLE,
RCAREA_FIRE_TEMPLE,
RCAREA_WATER_TEMPLE,
RCAREA_SPIRIT_TEMPLE,
RCAREA_SHADOW_TEMPLE,
RCAREA_BOTTOM_OF_THE_WELL,
RCAREA_ICE_CAVERN,
RCAREA_GERUDO_TRAINING_GROUND,
RCAREA_GANONS_CASTLE,
RCAREA_INVALID
} RandomizerCheckArea;
typedef struct {
RandomizerCheck rc;
RandomizerCheckVanillaOrMQ vOrMQ;
RandomizerCheckType rcType;
RandomizerCheckArea rcArea;
bool visibleInImgui;
std::string rcShortName;
std::string rcSpoilerName;
} RandomizerCheckObject;
namespace RandomizerCheckObjects {
bool AreaIsDungeon(RandomizerCheckArea area);
bool AreaIsOverworld(RandomizerCheckArea area);
std::string GetRCAreaName(RandomizerCheckArea area);
std::map<RandomizerCheckArea, std::vector<RandomizerCheckObject>> GetAllRCObjects();
void UpdateImGuiVisibility();
}

View File

@ -0,0 +1,35 @@
#pragma once
typedef enum {
RAND_INF_DUNGEONS_DONE_DEKU_TREE,
RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN,
RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY,
RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE,
RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE,
RAND_INF_DUNGEONS_DONE_WATER_TEMPLE,
RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE,
RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE,
RAND_INF_TRIALS_DONE_LIGHT_TRIAL,
RAND_INF_TRIALS_DONE_FOREST_TRIAL,
RAND_INF_TRIALS_DONE_FIRE_TRIAL,
RAND_INF_TRIALS_DONE_WATER_TRIAL,
RAND_INF_TRIALS_DONE_SPIRIT_TRIAL,
RAND_INF_TRIALS_DONE_SHADOW_TRIAL,
RAND_INF_COWS_MILKED_LINKS_HOUSE_COW,
RAND_INF_COWS_MILKED_HF_COW_GROTTO_COW,
RAND_INF_COWS_MILKED_LLR_STABLES_LEFT_COW,
RAND_INF_COWS_MILKED_LLR_STABLES_RIGHT_COW,
RAND_INF_COWS_MILKED_LLR_TOWER_LEFT_COW,
RAND_INF_COWS_MILKED_LLR_TOWER_RIGHT_COW,
RAND_INF_COWS_MILKED_KAK_IMPAS_HOUSE_COW,
RAND_INF_COWS_MILKED_DMT_COW_GROTTO_COW,
RAND_INF_COWS_MILKED_GV_COW,
RAND_INF_COWS_MILKED_JABU_JABUS_BELLY_MQ_COW,
RAND_INF_COWS_MILKED_HF_COW_GROTTO_GOSSIP_STONE,
// If you add anything to this list, you need to update the size of randomizerInf in z64save.h to be ceil(RAND_INF_MAX / 16)
RAND_INF_MAX,
} RandomizerInf;

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,26 @@
#pragma once #pragma once
#include <string>
#include <vector>
void InitItemTracker(); void InitItemTracker();
void DrawItemTracker(bool& open); void DrawItemTracker(bool& open);
void DrawItemAmmo(int itemId); void DrawItemAmmo(int itemId);
typedef struct ItemTrackerItem {
uint32_t id;
std::string name;
std::string nameFaded;
uint32_t data;
void (*drawFunc)(ItemTrackerItem);
} ItemTrackerItem;
#define ITEM_TRACKER_ITEM(id, data, drawFunc) \
{ \
id, #id, #id "_Faded", data, drawFunc \
}
typedef struct ItemTrackerDungeon {
uint32_t id;
std::vector<uint32_t> items;
} ItemTrackerDungeon;

View File

@ -3,8 +3,8 @@
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
#include <filesystem> #include <filesystem>
#include <locale> #include <fstream>
#include "GlobalCtx2.h"
#include "ResourceMgr.h" #include "ResourceMgr.h"
#include "DisplayList.h" #include "DisplayList.h"
#include "PlayerAnimation.h" #include "PlayerAnimation.h"
@ -33,6 +33,7 @@
#include "Enhancements/cosmetics/CosmeticsEditor.h" #include "Enhancements/cosmetics/CosmeticsEditor.h"
#include "Enhancements/debugconsole.h" #include "Enhancements/debugconsole.h"
#include "Enhancements/debugger/debugger.h" #include "Enhancements/debugger/debugger.h"
#include <soh/Enhancements/randomizer/randomizer.h>
#include <soh/Enhancements/randomizer/randomizer_item_tracker.h> #include <soh/Enhancements/randomizer/randomizer_item_tracker.h>
#include "Enhancements/n64_weird_frame_data.inc" #include "Enhancements/n64_weird_frame_data.inc"
#include "soh/frame_interpolation.h" #include "soh/frame_interpolation.h"
@ -42,6 +43,9 @@
#include "Hooks.h" #include "Hooks.h"
#include <soh/Enhancements/custom-message/CustomMessageManager.h> #include <soh/Enhancements/custom-message/CustomMessageManager.h>
#include "Lib/Fast3D/gfx_pc.h"
#include "Lib/Fast3D/gfx_rendering_api.h"
#ifdef __APPLE__ #ifdef __APPLE__
#include <SDL_scancode.h> #include <SDL_scancode.h>
#else #else
@ -57,16 +61,17 @@
#include <Audio.h> #include <Audio.h>
#include <soh/Enhancements/custom-message/CustomMessageTypes.h> #include <soh/Enhancements/custom-message/CustomMessageTypes.h>
#include <functions.h> #include <functions.h>
#include <soh/Enhancements/item-tables/ItemTableManager.h>
OTRGlobals* OTRGlobals::Instance; OTRGlobals* OTRGlobals::Instance;
SaveManager* SaveManager::Instance; SaveManager* SaveManager::Instance;
CustomMessageManager* CustomMessageManager::Instance; CustomMessageManager* CustomMessageManager::Instance;
ItemTableManager* ItemTableManager::Instance;
OTRGlobals::OTRGlobals() { OTRGlobals::OTRGlobals() {
context = Ship::GlobalCtx2::CreateInstance("Ship of Harkinian"); context = Ship::Window::CreateInstance("Ship of Harkinian");
gSaveStateMgr = std::make_shared<SaveStateMgr>(); gSaveStateMgr = std::make_shared<SaveStateMgr>();
gRandomizer = std::make_shared<Randomizer>(); gRandomizer = std::make_shared<Randomizer>();
context->GetWindow()->Init();
} }
OTRGlobals::~OTRGlobals() { OTRGlobals::~OTRGlobals() {
@ -158,6 +163,145 @@ extern "C" void OTRAudio_Exit() {
audio.thread.join(); audio.thread.join();
} }
extern "C" void VanillaItemTable_Init() {
GetItemEntry getItemTable[] = {
GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_5),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5),
GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_10),
GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOW),
GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SLINGSHOT),
GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOMERANG),
GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_1),
GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HOOKSHOT),
GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LONGSHOT),
GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LENS),
GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_ZELDA),
GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_OOT),
GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HAMMER),
GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COJIRO),
GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOTTLE),
GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_RED),
GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_GREEN),
GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POTION_BLUE),
GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FAIRY),
GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK_BOTTLE),
GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_LETTER_RUTO),
GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BEAN),
GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SKULL),
GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_SPOOKY),
GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CHICKEN),
GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_KEATON),
GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_BUNNY),
GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_TRUTH),
GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_EGG),
GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POCKET_CUCCO),
GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_MUSHROOM),
GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ODD_POTION),
GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SAW),
GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BROKEN),
GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_PRESCRIPTION),
GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FROG),
GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_EYEDROPS),
GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_CLAIM_CHECK),
GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KOKIRI),
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_KNIFE),
GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_DEKU),
GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT, MOD_NONE, GI_SHIELD_HYLIAN),
GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SHIELD_MIRROR),
GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_GORON),
GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG, MOD_NONE, GI_TUNIC_ZORA),
GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_IRON),
GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOOTS_HOVER),
GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_40),
GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_QUIVER_50),
GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_20),
GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_30),
GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BOMB_BAG_40),
GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_SILVER),
GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GAUNTLETS_GOLD),
GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_SILVER),
GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SCALE_GOLD),
GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_STONE_OF_AGONY),
GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_GERUDO_CARD),
GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x4A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_OCARINA_FAIRY),
GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_5),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE),
GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_KEY_BOSS),
GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_COMPASS),
GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MAP),
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_KEY_SMALL),
GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_SMALL),
GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT, MOD_NONE, GI_MAGIC_LARGE),
GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_ADULT),
GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WALLET_GIANT),
GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_WEIRD_EGG),
GET_ITEM(ITEM_HEART, OBJECT_GI_HEART, GID_HEART, 0x55, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART),
GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_SMALL),
GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_MEDIUM),
GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT, MOD_NONE, GI_ARROWS_LARGE),
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED),
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_CONTAINER_2),
GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MILK),
GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GORON),
GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_ZORA),
GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_MASK_GERUDO),
GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BRACELET),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE),
GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GOLD),
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_SWORD_BGS),
GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_FIRE),
GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_ICE),
GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_ARROW_LIGHT),
GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_SKULL_TOKEN),
GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_DINS_FIRE),
GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FARORES_WIND),
GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_NAYRUS_LOVE),
GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_30),
GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_40),
GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_5),
GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT, MOD_NONE, GI_STICKS_10),
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_5_2),
GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT, MOD_NONE, GI_NUTS_10),
GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_1),
GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_10),
GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_20),
GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBS_30),
GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT, MOD_NONE, GI_SEEDS_30),
GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_5),
GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_BOMBCHUS_20),
GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_FISH),
GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BUGS),
GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BLUE_FIRE),
GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_POE),
GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BIG_POE),
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_DOOR_KEY),
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_GREEN_LOSE),
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_BLUE_LOSE),
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_RED_LOSE),
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT, MOD_NONE, GI_RUPEE_PURPLE_LOSE),
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_HEART_PIECE_WIN),
GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_20),
GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_STICK_UPGRADE_30),
GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_30),
GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT, MOD_NONE, GI_NUT_UPGRADE_40),
GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG, MOD_NONE, GI_BULLET_BAG_50),
GET_ITEM_NONE,
GET_ITEM_NONE,
};
ItemTableManager::Instance->AddItemTable(MOD_NONE);
for (uint8_t i = 0; i < ARRAY_COUNT(getItemTable); i++) {
// The vanilla item table array started with ITEM_BOMBS_5,
// but the GetItemID enum started with GI_NONE. Then everywhere
// that table was accessed used `GetItemID - 1`. This allows the
// "first" item of the new map to start at 1, syncing it up with
// the GetItemID values and removing the need for the `- 1`
ItemTableManager::Instance->AddItemEntry(MOD_NONE, i+1, getItemTable[i]);
}
}
extern "C" void OTRExtScanner() { extern "C" void OTRExtScanner() {
auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get(); auto lst = *OTRGlobals::Instance->context->GetResourceManager()->ListFiles("*.*").get();
@ -180,6 +324,7 @@ extern "C" void InitOTR() {
OTRGlobals::Instance = new OTRGlobals(); OTRGlobals::Instance = new OTRGlobals();
SaveManager::Instance = new SaveManager(); SaveManager::Instance = new SaveManager();
CustomMessageManager::Instance = new CustomMessageManager(); CustomMessageManager::Instance = new CustomMessageManager();
ItemTableManager::Instance = new ItemTableManager();
auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version"); auto t = OTRGlobals::Instance->context->GetResourceManager()->LoadFile("version");
if (!t->bHasLoadError) if (!t->bHasLoadError)
@ -198,6 +343,7 @@ extern "C" void InitOTR() {
Rando_Init(); Rando_Init();
InitItemTracker(); InitItemTracker();
OTRExtScanner(); OTRExtScanner();
VanillaItemTable_Init();
} }
extern "C" void DeinitOTR() { extern "C" void DeinitOTR() {
@ -237,14 +383,14 @@ extern "C" uint64_t GetPerfCounter() {
// C->C++ Bridge // C->C++ Bridge
extern "C" void Graph_ProcessFrame(void (*run_one_game_iter)(void)) { extern "C" void Graph_ProcessFrame(void (*run_one_game_iter)(void)) {
OTRGlobals::Instance->context->GetWindow()->MainLoop(run_one_game_iter); OTRGlobals::Instance->context->MainLoop(run_one_game_iter);
} }
extern "C" void Graph_StartFrame() { extern "C" void Graph_StartFrame() {
#ifndef __WIIU__ #ifndef __WIIU__
// Why -1? // Why -1?
int32_t dwScancode = OTRGlobals::Instance->context->GetWindow()->GetLastScancode(); int32_t dwScancode = OTRGlobals::Instance->context->GetLastScancode();
OTRGlobals::Instance->context->GetWindow()->SetLastScancode(-1); OTRGlobals::Instance->context->SetLastScancode(-1);
switch (dwScancode - 1) { switch (dwScancode - 1) {
case SDL_SCANCODE_F5: { case SDL_SCANCODE_F5: {
@ -300,7 +446,14 @@ extern "C" void Graph_StartFrame() {
} }
} }
#endif #endif
OTRGlobals::Instance->context->GetWindow()->StartFrame(); OTRGlobals::Instance->context->StartFrame();
}
void RunCommands(Gfx* Commands, const std::vector<std::unordered_map<Mtx*, MtxF>>& mtx_replacements) {
for (const auto& m : mtx_replacements) {
gfx_run(Commands, m);
gfx_end_frame();
}
} }
// C->C++ Bridge // C->C++ Bridge
@ -341,12 +494,12 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) {
time -= fps; time -= fps;
OTRGlobals::Instance->context->GetWindow()->SetTargetFps(fps); OTRGlobals::Instance->context->SetTargetFps(fps);
int threshold = CVar_GetS32("gExtraLatencyThreshold", 80); int threshold = CVar_GetS32("gExtraLatencyThreshold", 80);
OTRGlobals::Instance->context->GetWindow()->SetMaximumFrameLatency(threshold > 0 && target_fps >= threshold ? 2 : 1); OTRGlobals::Instance->context->SetMaximumFrameLatency(threshold > 0 && target_fps >= threshold ? 2 : 1);
OTRGlobals::Instance->context->GetWindow()->RunCommands(commands, mtx_replacements); RunCommands(commands, mtx_replacements);
last_fps = fps; last_fps = fps;
last_update_rate = R_UPDATE_RATE; last_update_rate = R_UPDATE_RATE;
@ -359,19 +512,19 @@ extern "C" void Graph_ProcessGfxCommands(Gfx* commands) {
} }
// OTRTODO: FIGURE OUT END FRAME POINT // OTRTODO: FIGURE OUT END FRAME POINT
/* if (OTRGlobals::Instance->context->GetWindow()->lastScancode != -1) /* if (OTRGlobals::Instance->context->lastScancode != -1)
OTRGlobals::Instance->context->GetWindow()->lastScancode = -1;*/ OTRGlobals::Instance->context->lastScancode = -1;*/
} }
float divisor_num = 0.0f; float divisor_num = 0.0f;
extern "C" void OTRGetPixelDepthPrepare(float x, float y) { extern "C" void OTRGetPixelDepthPrepare(float x, float y) {
OTRGlobals::Instance->context->GetWindow()->GetPixelDepthPrepare(x, y); OTRGlobals::Instance->context->GetPixelDepthPrepare(x, y);
} }
extern "C" uint16_t OTRGetPixelDepth(float x, float y) { extern "C" uint16_t OTRGetPixelDepth(float x, float y) {
return OTRGlobals::Instance->context->GetWindow()->GetPixelDepth(x, y); return OTRGlobals::Instance->context->GetPixelDepth(x, y);
} }
extern "C" uint32_t ResourceMgr_GetGameVersion() extern "C" uint32_t ResourceMgr_GetGameVersion()
@ -1183,7 +1336,7 @@ extern "C" s32* ResourceMgr_LoadCSByName(const char* path)
} }
std::filesystem::path GetSaveFile(std::shared_ptr<Mercury> Conf) { std::filesystem::path GetSaveFile(std::shared_ptr<Mercury> Conf) {
const std::string fileName = Conf->getString("Game.SaveName", Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav")); const std::string fileName = Conf->getString("Game.SaveName", Ship::Window::GetPathRelativeToAppDirectory("oot_save.sav"));
std::filesystem::path saveFile = std::filesystem::absolute(fileName); std::filesystem::path saveFile = std::filesystem::absolute(fileName);
if (!exists(saveFile.parent_path())) { if (!exists(saveFile.parent_path())) {
@ -1314,15 +1467,15 @@ extern "C" void OTRGfxPrint(const char* str, void* printer, void (*printImpl)(vo
} }
extern "C" uint32_t OTRGetCurrentWidth() { extern "C" uint32_t OTRGetCurrentWidth() {
return OTRGlobals::Instance->context->GetWindow()->GetCurrentWidth(); return OTRGlobals::Instance->context->GetCurrentWidth();
} }
extern "C" uint32_t OTRGetCurrentHeight() { extern "C" uint32_t OTRGetCurrentHeight() {
return OTRGlobals::Instance->context->GetWindow()->GetCurrentHeight(); return OTRGlobals::Instance->context->GetCurrentHeight();
} }
extern "C" void OTRControllerCallback(ControllerCallback* controller) { extern "C" void OTRControllerCallback(ControllerCallback* controller) {
auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = Ship::Window::GetInstance()->GetControlDeck();
for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) {
auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i); auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i);
@ -1354,33 +1507,33 @@ extern "C" int16_t OTRGetRectDimensionFromRightEdge(float v) {
} }
extern "C" bool AudioPlayer_Init(void) { extern "C" bool AudioPlayer_Init(void) {
if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) {
return OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Init(); return OTRGlobals::Instance->context->GetAudioPlayer()->Init();
} }
return false; return false;
} }
extern "C" int AudioPlayer_Buffered(void) { extern "C" int AudioPlayer_Buffered(void) {
if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) {
return OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Buffered(); return OTRGlobals::Instance->context->GetAudioPlayer()->Buffered();
} }
} }
extern "C" int AudioPlayer_GetDesiredBuffered(void) { extern "C" int AudioPlayer_GetDesiredBuffered(void) {
if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) {
return OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->GetDesiredBuffered(); return OTRGlobals::Instance->context->GetAudioPlayer()->GetDesiredBuffered();
} }
} }
extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) { extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) {
if (OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer() != nullptr) { if (OTRGlobals::Instance->context->GetAudioPlayer() != nullptr) {
OTRGlobals::Instance->context->GetWindow()->GetAudioPlayer()->Play(buf, len); OTRGlobals::Instance->context->GetAudioPlayer()->Play(buf, len);
} }
} }
extern "C" int Controller_ShouldRumble(size_t i) { extern "C" int Controller_ShouldRumble(size_t i) {
auto controlDeck = Ship::GlobalCtx2::GetInstance()->GetWindow()->GetControlDeck(); auto controlDeck = Ship::Window::GetInstance()->GetControlDeck();
for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) { for (int i = 0; i < controlDeck->GetNumVirtualDevices(); ++i) {
auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i); auto physicalDevice = controlDeck->GetPhysicalDeviceFromVirtualSlot(i);
@ -1401,14 +1554,6 @@ extern "C" void* getN64WeirdFrame(s32 i) {
return &weirdFrameBytes[i + sizeof(n64WeirdFrames)]; return &weirdFrameBytes[i + sizeof(n64WeirdFrames)];
} }
extern "C" s16 Randomizer_GetItemModelFromId(s16 itemId) {
return OTRGlobals::Instance->gRandomizer->GetItemModelFromId(itemId);
}
extern "C" s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId) {
return OTRGlobals::Instance->gRandomizer->GetItemIDFromGetItemID(getItemId);
}
extern "C" void Randomizer_LoadSettings(const char* spoilerFileName) { extern "C" void Randomizer_LoadSettings(const char* spoilerFileName) {
OTRGlobals::Instance->gRandomizer->LoadRandomizerSettings(spoilerFileName); OTRGlobals::Instance->gRandomizer->LoadRandomizerSettings(spoilerFileName);
} }
@ -1447,6 +1592,11 @@ extern "C" CustomMessageEntry Randomizer_GetScrubMessage(u16 scrubTextId) {
return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price); return CustomMessageManager::Instance->RetrieveMessage(Randomizer::scrubMessageTableID, price);
} }
extern "C" CustomMessageEntry Randomizer_GetNaviMessage() {
u16 naviTextId = rand() % NUM_NAVI_MESSAGES;
return CustomMessageManager::Instance->RetrieveMessage(Randomizer::NaviRandoMessageTableID, naviTextId);
}
extern "C" CustomMessageEntry Randomizer_GetAltarMessage() { extern "C" CustomMessageEntry Randomizer_GetAltarMessage() {
return (LINK_IS_ADULT) return (LINK_IS_ADULT)
? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT) ? CustomMessageManager::Instance->RetrieveMessage(Randomizer::hintMessageTableID, TEXT_ALTAR_ADULT)
@ -1468,24 +1618,54 @@ extern "C" CustomMessageEntry Randomizer_GetHintFromCheck(RandomizerCheck check)
return hintText; return hintText;
} }
extern "C" s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) { extern "C" GetItemEntry ItemTable_Retrieve(int16_t getItemID) {
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum); GetItemEntry giEntry = ItemTableManager::Instance->RetrieveItemEntry(OTRGlobals::Instance->getItemModIndex, getItemID);
return giEntry;
} }
extern "C" s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) { extern "C" GetItemEntry ItemTable_RetrieveEntry(s16 tableID, s16 getItemID) {
return OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId); return ItemTableManager::Instance->RetrieveItemEntry(tableID, getItemID);
}
extern "C" GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum) {
s16 getItemModIndex;
if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(
OTRGlobals::Instance->gRandomizer->GetCheckFromActor(sceneNum, actorId, actorParams))) {
getItemModIndex = MOD_NONE;
} else {
getItemModIndex = MOD_RANDOMIZER;
}
s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemId(ogId, actorId, actorParams, sceneNum);
return ItemTable_RetrieveEntry(getItemModIndex, itemID);
}
extern "C" GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId) {
s16 getItemModIndex;
if (OTRGlobals::Instance->gRandomizer->CheckContainsVanillaItem(randomizerCheck)) {
getItemModIndex = MOD_NONE;
} else {
getItemModIndex = MOD_RANDOMIZER;
}
s16 itemID = OTRGlobals::Instance->gRandomizer->GetRandomizedItemIdFromKnownCheck(randomizerCheck, ogId);
return ItemTable_RetrieveEntry(getItemModIndex, itemID);
} }
extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) { extern "C" bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor) {
return gSaveContext.n64ddFlag && (actor->parent != NULL) && return gSaveContext.n64ddFlag && (actor->parent != NULL) &&
Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP;
} }
extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) { extern "C" bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId) {
return gSaveContext.n64ddFlag && Randomizer_GetItemIdFromKnownCheck(randomizerCheck, ogId) == GI_ICE_TRAP; return gSaveContext.n64ddFlag && Randomizer_GetItemFromKnownCheck(randomizerCheck, ogId).getItemId == RG_ICE_TRAP;
} }
extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(GetItemID giid, char* buffer, const int maxBufferSize) { extern "C" CustomMessageEntry Randomizer_GetCustomGetItemMessage(Player* player) {
s16 giid;
if (player->getItemEntry.objectId != OBJECT_INVALID) {
giid = player->getItemEntry.getItemId;
} else {
giid = player->getItemId;
}
const CustomMessageEntry getItemText = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, giid); const CustomMessageEntry getItemText = CustomMessageManager::Instance->RetrieveMessage(Randomizer::getItemMessageTableID, giid);
return getItemText; return getItemText;
} }
@ -1500,7 +1680,7 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) { if (textId == TEXT_RANDOMIZER_CUSTOM_ITEM) {
messageEntry = messageEntry =
Randomizer_GetCustomGetItemMessage((GetItemID)GET_PLAYER(globalCtx)->getItemId, buffer, maxBufferSize); Randomizer_GetCustomGetItemMessage(GET_PLAYER(globalCtx));
} else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 && } else if (textId == TEXT_RANDOMIZER_GOSSIP_STONE_HINTS && Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) != 0 &&
(Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 || (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 1 ||
(Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 && (Randomizer_GetSettingValue(RSK_GOSSIP_STONE_HINTS) == 2 &&
@ -1540,6 +1720,13 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) {
} }
} else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) { } else if (textId == TEXT_SCRUB_POH || textId == TEXT_SCRUB_STICK_UPGRADE || textId == TEXT_SCRUB_NUT_UPGRADE) {
messageEntry = Randomizer_GetScrubMessage(textId); messageEntry = Randomizer_GetScrubMessage(textId);
} else if (CVar_GetS32("gRandomizeRupeeNames", 0) &&
(textId == TEXT_BLUE_RUPEE || textId == TEXT_RED_RUPEE || textId == TEXT_PURPLE_RUPEE ||
textId == TEXT_HUGE_RUPEE)) {
messageEntry = Randomizer::GetRupeeMessage(textId);
// In rando, replace Navi's general overworld hints with rando-related gameplay tips
} else if (CVar_GetS32("gRandoRelevantNavi", 1) && textId >= 0x0140 && textId <= 0x015F) {
messageEntry = Randomizer_GetNaviMessage();
} else if (Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) && } else if (Randomizer_GetSettingValue(RSK_BOMBCHUS_IN_LOGIC) &&
(textId == TEXT_BUY_BOMBCHU_10_DESC || textId == TEXT_BUY_BOMBCHU_10_PROMPT)) { (textId == TEXT_BUY_BOMBCHU_10_DESC || textId == TEXT_BUY_BOMBCHU_10_PROMPT)) {
messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId); messageEntry = CustomMessageManager::Instance->RetrieveMessage(customMessageTableID, textId);
@ -1572,7 +1759,6 @@ extern "C" int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx) {
case LANGUAGE_GER: case LANGUAGE_GER:
return msgCtx->msgLength = font->msgLength = return msgCtx->msgLength = font->msgLength =
CopyStringToCharBuffer(messageEntry.german, buffer, maxBufferSize); CopyStringToCharBuffer(messageEntry.german, buffer, maxBufferSize);
case LANGUAGE_ENG: case LANGUAGE_ENG:
default: default:
return msgCtx->msgLength = font->msgLength = return msgCtx->msgLength = font->msgLength =

View File

@ -3,10 +3,11 @@
#pragma once #pragma once
#include "GlobalCtx2.h"
#include "SaveManager.h" #include "SaveManager.h"
#include <soh/Enhancements/item-tables/ItemTableTypes.h>
#ifdef __cplusplus #ifdef __cplusplus
#include "Window.h"
#include "Enhancements/savestates.h" #include "Enhancements/savestates.h"
#include "Enhancements/randomizer/randomizer.h" #include "Enhancements/randomizer/randomizer.h"
@ -17,9 +18,10 @@ class OTRGlobals
public: public:
static OTRGlobals* Instance; static OTRGlobals* Instance;
std::shared_ptr<Ship::GlobalCtx2> context; std::shared_ptr<Ship::Window> context;
std::shared_ptr<SaveStateMgr> gSaveStateMgr; std::shared_ptr<SaveStateMgr> gSaveStateMgr;
std::shared_ptr<Randomizer> gRandomizer; std::shared_ptr<Randomizer> gRandomizer;
uint16_t getItemModIndex;
OTRGlobals(); OTRGlobals();
~OTRGlobals(); ~OTRGlobals();
@ -30,6 +32,7 @@ private:
#endif #endif
#ifndef __cplusplus #ifndef __cplusplus
void VanillaItemTable_Init();
void OTRAudio_Init(); void OTRAudio_Init();
void InitAudio(); void InitAudio();
void Graph_StartFrame(); void Graph_StartFrame();
@ -95,13 +98,13 @@ u8 Randomizer_GetSettingValue(RandomizerSettingKey randoSettingKey);
RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum); RandomizerCheck Randomizer_GetCheckFromActor(s16 actorId, s16 actorParams, s16 sceneNum);
void Randomizer_LoadHintLocations(const char* spoilerFileName); void Randomizer_LoadHintLocations(const char* spoilerFileName);
void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent); void Randomizer_LoadItemLocations(const char* spoilerFileName, bool silent);
s16 Randomizer_GetItemModelFromId(s16 itemId); GetItemEntry Randomizer_GetRandomizedItem(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
s32 Randomizer_GetItemIDFromGetItemID(s32 getItemId); GetItemEntry Randomizer_GetItemFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
s32 Randomizer_GetRandomizedItemId(GetItemID ogId, s16 actorId, s16 actorParams, s16 sceneNum);
s32 Randomizer_GetItemIdFromKnownCheck(RandomizerCheck randomizerCheck, GetItemID ogId);
bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor); bool Randomizer_ObtainedFreestandingIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId, Actor* actor);
bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId); bool Randomizer_ItemIsIceTrap(RandomizerCheck randomizerCheck, GetItemID ogId);
int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx); int CustomMessage_RetrieveIfExists(GlobalContext* globalCtx);
GetItemEntry ItemTable_Retrieve(int16_t getItemID);
GetItemEntry ItemTable_RetrieveEntry(s16 modIndex, s16 getItemID);
#endif #endif
#endif #endif

View File

@ -16,7 +16,7 @@
extern "C" SaveContext gSaveContext; extern "C" SaveContext gSaveContext;
std::filesystem::path SaveManager::GetFileName(int fileNum) { std::filesystem::path SaveManager::GetFileName(int fileNum) {
const std::filesystem::path sSavePath(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Save")); const std::filesystem::path sSavePath(Ship::Window::GetPathRelativeToAppDirectory("Save"));
return sSavePath / ("file" + std::to_string(fileNum + 1) + ".sav"); return sSavePath / ("file" + std::to_string(fileNum + 1) + ".sav");
} }
@ -137,10 +137,10 @@ void SaveManager::SaveRandomizer() {
} }
void SaveManager::Init() { void SaveManager::Init() {
const std::filesystem::path sSavePath(Ship::GlobalCtx2::GetPathRelativeToAppDirectory("Save")); const std::filesystem::path sSavePath(Ship::Window::GetPathRelativeToAppDirectory("Save"));
const std::filesystem::path sGlobalPath = sSavePath / std::string("global.sav"); const std::filesystem::path sGlobalPath = sSavePath / std::string("global.sav");
auto sOldSavePath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav"); auto sOldSavePath = Ship::Window::GetPathRelativeToAppDirectory("oot_save.sav");
auto sOldBackupSavePath = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.bak"); auto sOldBackupSavePath = Ship::Window::GetPathRelativeToAppDirectory("oot_save.bak");
// If the save directory does not exist, create it // If the save directory does not exist, create it
if (!std::filesystem::exists(sSavePath)) { if (!std::filesystem::exists(sSavePath)) {
@ -758,15 +758,8 @@ void SaveManager::LoadBaseVersion1() {
SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle);
}); });
SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) {
SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]);
});
SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone),
[](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); });
SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) {
SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]);
}); });
} }
@ -922,15 +915,8 @@ void SaveManager::LoadBaseVersion2() {
SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle); SaveManager::Instance->LoadData("angle", gSaveContext.horseData.angle);
}); });
SaveManager::Instance->LoadArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { SaveManager::Instance->LoadArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) {
SaveManager::Instance->LoadData("", gSaveContext.dungeonsDone[i]); SaveManager::Instance->LoadData("", gSaveContext.randomizerInf[i]);
});
SaveManager::Instance->LoadArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone),
[](size_t i) { SaveManager::Instance->LoadData("", gSaveContext.trialsDone[i]); });
SaveManager::Instance->LoadArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) {
SaveManager::Instance->LoadData("", gSaveContext.cowsMilked[i]);
}); });
} }
@ -1082,15 +1068,8 @@ void SaveManager::SaveBase() {
SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle); SaveManager::Instance->SaveData("angle", gSaveContext.horseData.angle);
}); });
SaveManager::Instance->SaveArray("dungeonsDone", ARRAY_COUNT(gSaveContext.dungeonsDone), [](size_t i) { SaveManager::Instance->SaveArray("randomizerInf", ARRAY_COUNT(gSaveContext.randomizerInf), [](size_t i) {
SaveManager::Instance->SaveData("", gSaveContext.dungeonsDone[i]); SaveManager::Instance->SaveData("", gSaveContext.randomizerInf[i]);
});
SaveManager::Instance->SaveArray("trialsDone", ARRAY_COUNT(gSaveContext.trialsDone),
[](size_t i) { SaveManager::Instance->SaveData("", gSaveContext.trialsDone[i]); });
SaveManager::Instance->SaveArray("cowsMilked", ARRAY_COUNT(gSaveContext.cowsMilked), [](size_t i) {
SaveManager::Instance->SaveData("", gSaveContext.cowsMilked[i]);
}); });
} }

View File

@ -60,6 +60,7 @@ void OTRGameplay_InitScene(GlobalContext* globalCtx, s32 spawn) {
globalCtx->cUpElfMsgs = nullptr; globalCtx->cUpElfMsgs = nullptr;
globalCtx->setupPathList = nullptr; globalCtx->setupPathList = nullptr;
globalCtx->numSetupActors = 0; globalCtx->numSetupActors = 0;
OTRGlobals::Instance->getItemModIndex = MOD_NONE;
Object_InitBank(globalCtx, &globalCtx->objectCtx); Object_InitBank(globalCtx, &globalCtx->objectCtx);
LightContext_Init(globalCtx, &globalCtx->lightCtx); LightContext_Init(globalCtx, &globalCtx->lightCtx);
TransitionActor_InitContext(&globalCtx->state, &globalCtx->transiActorCtx); TransitionActor_InitContext(&globalCtx->state, &globalCtx->transiActorCtx);
@ -68,7 +69,7 @@ void OTRGameplay_InitScene(GlobalContext* globalCtx, s32 spawn) {
gSaveContext.worldMapArea = 0; gSaveContext.worldMapArea = 0;
OTRScene_ExecuteCommands(globalCtx, globalCtx->sceneSegment); OTRScene_ExecuteCommands(globalCtx, globalCtx->sceneSegment);
Gameplay_InitEnvironment(globalCtx, globalCtx->skyboxId); Gameplay_InitEnvironment(globalCtx, globalCtx->skyboxId);
/* auto data = static_cast<Ship::Vertex*>(Ship::GlobalCtx2::GetInstance() /* auto data = static_cast<Ship::Vertex*>(Ship::Window::GetInstance()
->GetResourceManager() ->GetResourceManager()
->LoadResource("object_link_child\\object_link_childVtx_01FE08") ->LoadResource("object_link_child\\object_link_childVtx_01FE08")
.get()); .get());

View File

@ -1246,7 +1246,7 @@ void Audio_StepFreqLerp(FreqLerp* lerp);
void func_800F56A8(void); void func_800F56A8(void);
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId); void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
s32 Audio_SetGanonDistVol(u8 targetVol); s32 Audio_SetGanonDistVol(u8 targetVol);
void Audio_PlayFanfare_Rando(ItemID getItemId); void Audio_PlayFanfare_Rando(GetItemEntry getItem);
// Right stick as virtual C buttons // Right stick as virtual C buttons
#define RSTICK_UP 0x100000 #define RSTICK_UP 0x100000
@ -3957,45 +3957,54 @@ void Audio_ResetSfxChannelState(void) {
// Function to play "get-item" fanfares according to the type of item obtained (used in rando) // Function to play "get-item" fanfares according to the type of item obtained (used in rando)
// Longer fanfares for medallions/stones/songs are behind the Cvar // Longer fanfares for medallions/stones/songs are behind the Cvar
void Audio_PlayFanfare_Rando(ItemID getItemId) { void Audio_PlayFanfare_Rando(GetItemEntry getItem) {
s32 temp1; s32 temp1;
s16 getItemId = getItem.getItemId;
s16 itemId = getItem.itemId;
if (((getItemId >= GI_RUPEE_GREEN) && (getItemId <= GI_RUPEE_RED)) || if (getItem.modIndex == MOD_NONE) {
((getItemId >= GI_RUPEE_PURPLE) && (getItemId <= GI_RUPEE_GOLD)) || if (((itemId >= ITEM_RUPEE_GREEN) && (itemId <= ITEM_RUPEE_GOLD)) || (itemId == ITEM_HEART)) {
((getItemId >= GI_RUPEE_GREEN_LOSE) && (getItemId <= GI_RUPEE_PURPLE_LOSE)) || (getItemId == GI_HEART)) {
Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8); Audio_PlaySoundGeneral(NA_SE_SY_GET_BOXITEM, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
} else { } else {
if ((getItemId == GI_HEART_CONTAINER_2) || (getItemId == GI_HEART_CONTAINER) || if (itemId == ITEM_HEART_CONTAINER ||
((getItemId == GI_HEART_PIECE) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) { ((itemId == ITEM_HEART_PIECE_2) && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000))) {
temp1 = NA_BGM_HEART_GET | 0x900; temp1 = NA_BGM_HEART_GET | 0x900;
} else { } else {
temp1 = (getItemId == GI_HEART_PIECE) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900; temp1 = (itemId == ITEM_HEART_PIECE_2) ? NA_BGM_SMALL_ITEM_GET : NA_BGM_ITEM_GET | 0x900;
} }
// If we get a skulltula token or the "WINNER" heart, play "get small item" // If we get a skulltula token or the "WINNER" heart, play "get small item"
if (getItemId == GI_SKULL_TOKEN || getItemId == GI_HEART_PIECE_WIN) { // Also make sure "WINNER" heart is not the 4th heart piece.
if (itemId == ITEM_SKULL_TOKEN || (getItemId == GI_HEART_PIECE_WIN && itemId == ITEM_HEART_PIECE_2 &&
(gSaveContext.inventory.questItems & 0xF0000000) != 0x40000000)) {
temp1 = NA_BGM_SMALL_ITEM_GET | 0x900; temp1 = NA_BGM_SMALL_ITEM_GET | 0x900;
} }
// But if the "WINNER" heart is the 4th heart piece collected, play "get heart container"
if (getItemId == GI_HEART_PIECE_WIN && ((gSaveContext.inventory.questItems & 0xF0000000) == 0x40000000)) {
temp1 = NA_BGM_HEART_GET | 0x900;
}
// If the setting is toggled on and we get special quest items (longer fanfares): // If the setting is toggled on and we get special quest items (longer fanfares):
if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) { if (CVar_GetS32("gRandoQuestItemFanfares", 0) != 0) {
// If we get a medallion, play the "get a medallion" fanfare // If we get a medallion, play the "get a medallion" fanfare
if ((getItemId >= GI_MEDALLION_LIGHT) && (getItemId <= GI_MEDALLION_SPIRIT)) { if ((itemId >= ITEM_MEDALLION_FOREST) && (itemId <= ITEM_MEDALLION_LIGHT)) {
temp1 = NA_BGM_MEDALLION_GET | 0x900; temp1 = NA_BGM_MEDALLION_GET | 0x900;
} }
// If it's a Spiritual Stone, play the "get a spiritual stone" fanfare // If it's a Spiritual Stone, play the "get a spiritual stone" fanfare
if ((getItemId >= GI_STONE_KOKIRI) && (getItemId <= GI_STONE_ZORA)) { if ((itemId >= ITEM_KOKIRI_EMERALD) && (itemId <= ITEM_ZORA_SAPPHIRE)) {
temp1 = NA_BGM_SPIRITUAL_STONE | 0x900; temp1 = NA_BGM_SPIRITUAL_STONE | 0x900;
} }
// If the item we're getting is a song, play the "learned a song" fanfare // If the item we're getting is a song, play the "learned a song" fanfare
if ((getItemId >= GI_ZELDAS_LULLABY) && (getItemId <= GI_PRELUDE_OF_LIGHT)) { if ((itemId >= ITEM_SONG_MINUET) && (itemId <= ITEM_SONG_STORMS)) {
temp1 = NA_BGM_OCA_FAIRY_GET | 0x900; temp1 = NA_BGM_OCA_FAIRY_GET | 0x900;
} }
} }
Audio_PlayFanfare(temp1); Audio_PlayFanfare(temp1);
} }
} else if (getItem.modIndex == MOD_RANDOMIZER) {
if ((itemId >= RG_BOTTLE_WITH_RED_POTION && itemId <= RG_BOTTLE_WITH_BIG_POE) ||
(itemId >= RG_DEKU_TREE_MAP && itemId <= RG_GANONS_CASTLE_SMALL_KEY)) {
temp1 = NA_BGM_ITEM_GET | 0x900;
} else {
// Just in case nothing else matches.
temp1 = NA_BGM_ITEM_GET | 0x900;
}
Audio_PlayFanfare(temp1);
}
} }
void func_800F3F3C(u8 arg0) { void func_800F3F3C(u8 arg0) {

View File

@ -1009,19 +1009,14 @@ void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCt
} }
void TitleCard_Update(GlobalContext* globalCtx, TitleCardContext* titleCtx) { void TitleCard_Update(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
s16* TitleCard_Colors[3] = {255,255,255}; const Color_RGB8 TitleCard_Colors_ori = {255,255,255};
Color_RGB8 TitleCard_Colors = {255,255,255};
if (titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) {//Bosses cards. if (titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) {//Bosses cards.
TitleCard_Colors[0] = CVar_GetS32("gCCTC_B_U_PrimR", 255); TitleCard_Colors = CVar_GetRGB("gCCTC_B_U_Prim", TitleCard_Colors_ori);
TitleCard_Colors[1] = CVar_GetS32("gCCTC_B_U_PrimG", 255);
TitleCard_Colors[2] = CVar_GetS32("gCCTC_B_U_PrimB", 255);
} else if (!titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) { } else if (!titleCtx->isBossCard && CVar_GetS32("gHudColors", 1) == 2) {
TitleCard_Colors[0] = CVar_GetS32("gCCTC_OW_U_PrimR", 255); TitleCard_Colors = CVar_GetRGB("gCCTC_OW_U_Prim", TitleCard_Colors_ori);
TitleCard_Colors[1] = CVar_GetS32("gCCTC_OW_U_PrimG", 255);
TitleCard_Colors[2] = CVar_GetS32("gCCTC_OW_U_PrimB", 255);
} else { } else {
TitleCard_Colors[0] = 255; TitleCard_Colors = TitleCard_Colors_ori;
TitleCard_Colors[1] = 255;
TitleCard_Colors[2] = 255;
} }
if (DECR(titleCtx->delayTimer) == 0) { if (DECR(titleCtx->delayTimer) == 0) {
@ -1032,9 +1027,9 @@ void TitleCard_Update(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
Math_StepToS(&titleCtx->intensityB, 0, 70); Math_StepToS(&titleCtx->intensityB, 0, 70);
} else { } else {
Math_StepToS(&titleCtx->alpha, 255, 10); Math_StepToS(&titleCtx->alpha, 255, 10);
Math_StepToS(&titleCtx->intensityR, TitleCard_Colors[0], 20); Math_StepToS(&titleCtx->intensityR, TitleCard_Colors.r, 20);
Math_StepToS(&titleCtx->intensityG, TitleCard_Colors[1], 20); Math_StepToS(&titleCtx->intensityG, TitleCard_Colors.g, 20);
Math_StepToS(&titleCtx->intensityB, TitleCard_Colors[2], 20); Math_StepToS(&titleCtx->intensityB, TitleCard_Colors.b, 20);
} }
} }
} }
@ -1195,7 +1190,8 @@ void Actor_Init(Actor* actor, GlobalContext* globalCtx) {
actor->uncullZoneDownward = 700.0f; actor->uncullZoneDownward = 700.0f;
if (CVar_GetS32("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room if (CVar_GetS32("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room
&& actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence
&& actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA) { // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning
&& (globalCtx->sceneNum != SCENE_DDAN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room
actor->uncullZoneForward = 32767.0f; actor->uncullZoneForward = 32767.0f;
actor->uncullZoneScale = 32767.0f; actor->uncullZoneScale = 32767.0f;
actor->uncullZoneDownward = 32767.0f; actor->uncullZoneDownward = 32767.0f;
@ -1955,14 +1951,25 @@ u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) {
} }
} }
s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) { /**
* Uses the given `GetItemEntry` to prepare the player to receive an item via the animation
* where Link holds an item over his head. This function does not require an actor for giving
* the player an item, instead setting the player as their own interactRangeActor and getItemDirection.
*
* \param globalCtx the Global Context
* \param getItemEntry the GetItemEntry for the item you want the player to receive.
* \return true if the player can receive an item, false if not.
*/
s32 GiveItemEntryWithoutActor(GlobalContext* globalCtx, GetItemEntry getItemEntry) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if (((player->heldActor != NULL) && (getItemId > GI_NONE) && (getItemId < GI_MAX)) || if (((player->heldActor != NULL) && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX)) ||
(gSaveContext.n64ddFlag && (getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))) ||
(!(player->stateFlags1 & 0x20000800))) { (!(player->stateFlags1 & 0x20000800))) {
if ((getItemId != GI_NONE)) { if ((getItemEntry.getItemId != GI_NONE)) {
player->getItemId = getItemId; player->getItemEntry = getItemEntry;
player->getItemId = getItemEntry.getItemId;
player->interactRangeActor = &player->actor; player->interactRangeActor = &player->actor;
player->getItemDirection = player->actor.shape.rot.y; player->getItemDirection = player->actor.shape.rot.y;
// Player state 26 = Player is frozen // Player state 26 = Player is frozen
@ -1977,12 +1984,69 @@ s32 GiveItemWithoutActor(GlobalContext* globalCtx, s32 getItemId) {
return false; return false;
} }
/**
* Uses the given `GetItemEntry` to prepare the player to receive an item via the animation
* where Link holds an item over his head. This uses data from the actor link is receiving
* the item from to set the player's interactRangeActor and getItemDirection. It also checks
* a range from which Link must be from said actor in order to receive the item.
*
* \param actor the actor link is receiving an item from. Will usually be a chest but can also
* be an npc.
* \param globalCtx the Global Context
* \param getItemEntry the GetItemEntry for the item you want the player to receive.
* \param xzRange the distance on the x and z axes that the player can be from the target
* actor to receive the item.
* \param yRange the distance on the y axis that the player can be from the target actor
* to receive the item.
* \return true if the player can receive an item, false if not.
*/
s32 GiveItemEntryFromActor(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry, f32 xzRange, f32 yRange) {
Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->targetActor)) &&
((!gSaveContext.n64ddFlag && ((getItemEntry.getItemId > GI_NONE) && (getItemEntry.getItemId < GI_MAX))) ||
(gSaveContext.n64ddFlag && ((getItemEntry.getItemId > RG_NONE) && (getItemEntry.getItemId < RG_MAX))))) ||
(!(player->stateFlags1 & 0x20000800))) {
if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
s32 absYawDiff = ABS(yawDiff);
if ((getItemEntry.getItemId != GI_NONE) || (player->getItemDirection < absYawDiff)) {
player->getItemEntry = getItemEntry;
player->getItemId = getItemEntry.getItemId;
player->interactRangeActor = actor;
player->getItemDirection = absYawDiff;
return true;
}
}
}
}
return false;
}
/**
* Uses the given `GetItemEntry` to prepare the player to receive an item via the animation
* where Link holds an item over his head. This is a wrapper function around `GiveItemEntryFromActor`
* that supplies a fixed xzRange of 50.0f and a fixed yRange of 10.0f.
*
* \param actor the target actor that link is receiving an item from.
* \param globalCtx the Global Context
* \param getItemEntry the GetItemEntry for the item you want the player to receive.
*/
void GiveItemEntryFromActorWithFixedRange(Actor* actor, GlobalContext* globalCtx, GetItemEntry getItemEntry) {
GiveItemEntryFromActor(actor, globalCtx, getItemEntry, 50.0f, 10.0f);
}
// TODO: Rename to GiveItemIdFromActor or similar
// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActor
s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) { s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) { if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->targetActor)) && (getItemId > GI_NONE) && if ((((player->heldActor != NULL) || (actor == player->targetActor)) &&
(getItemId < GI_MAX)) || ((!gSaveContext.n64ddFlag && ((getItemId > GI_NONE) && (getItemId < GI_MAX))) || (gSaveContext.n64ddFlag && ((getItemId > RG_NONE) && (getItemId < RG_MAX))))) ||
(!(player->stateFlags1 & 0x20000800))) { (!(player->stateFlags1 & 0x20000800))) {
if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) { if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y; s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
@ -2001,6 +2065,8 @@ s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzR
return false; return false;
} }
// TODO: Rename to GiveItemIdFromActorWithFixedRange or similar
// If you're doing something for randomizer, you're probably looking for GiveItemEntryFromActorWithFixedRange
void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) { void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) {
func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f); func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f);
} }
@ -2770,7 +2836,8 @@ s32 func_800314D4(GlobalContext* globalCtx, Actor* actor, Vec3f* arg2, f32 arg3)
if (CVar_GetS32("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room if (CVar_GetS32("gDisableDrawDistance", 0) != 0 && actor->id != ACTOR_EN_TORCH2 && actor->id != ACTOR_EN_BLKOBJ // Extra check for Dark Link and his room
&& actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence && actor->id != ACTOR_EN_HORSE // Check for Epona, else if we call her she will spawn at the other side of the map + we can hear her during the title screen sequence
&& actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA) { // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning && actor->id != ACTOR_EN_HORSE_GANON && actor->id != ACTOR_EN_HORSE_ZELDA // check for Zelda's and Ganondorf's horses that will always be scene during cinematic whith camera paning
&& (globalCtx->sceneNum != SCENE_DDAN && actor->id != ACTOR_EN_ZF)) { // Check for DC and Lizalfos for the case where the miniboss music would still play under certains conditions and changing room
return true; return true;
} }
@ -4638,6 +4705,20 @@ void Flags_SetInfTable(s32 flag) {
gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF)); gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF));
} }
/**
* Tests if "randomizerInf" flag is set.
*/
s32 Flags_GetRandomizerInf(RandomizerInf flag) {
return gSaveContext.randomizerInf[flag >> 4] & (1 << (flag & 0xF));
}
/**
* Sets "randomizerInf" flag.
*/
void Flags_SetRandomizerInf(RandomizerInf flag) {
gSaveContext.randomizerInf[flag >> 4] |= (1 << (flag & 0xF));
}
u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) { u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) {
u16 retTextId = 0; u16 retTextId = 0;
@ -5997,7 +6078,7 @@ s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* ar
return true; return true;
} }
s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { GetItemEntry GetChestGameRandoGetItem(s8 room, s16 ogDrawId, GlobalContext* globalCtx) {
if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) { if (Randomizer_GetSettingValue(RSK_SHUFFLE_CHEST_MINIGAME)) {
// RANDOTODO update this logic when we implement keysanity // RANDOTODO update this logic when we implement keysanity
// because 3drando replaces the keys not the rupees // because 3drando replaces the keys not the rupees
@ -6008,27 +6089,27 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx)
switch(room) { switch(room) {
case 1: case 1:
if(!Flags_GetCollectible(globalCtx, 0x1B)) { if(!Flags_GetCollectible(globalCtx, 0x1B)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_1, GI_RUPEE_GREEN);
} }
break; break;
case 2: case 2:
if(!Flags_GetCollectible(globalCtx, 0x1C)) { if(!Flags_GetCollectible(globalCtx, 0x1C)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_2, GI_RUPEE_GREEN);
} }
break; break;
case 3: case 3:
if(!Flags_GetCollectible(globalCtx, 0x1D)) { if(!Flags_GetCollectible(globalCtx, 0x1D)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_3, GI_RUPEE_BLUE);
} }
break; break;
case 4: case 4:
if(!Flags_GetCollectible(globalCtx, 0x1E)) { if(!Flags_GetCollectible(globalCtx, 0x1E)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_4, GI_RUPEE_BLUE);
} }
break; break;
case 5: case 5:
if(!Flags_GetCollectible(globalCtx, 0x1F)) { if(!Flags_GetCollectible(globalCtx, 0x1F)) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_ITEM_5, GI_RUPEE_RED);
} }
break; break;
} }
@ -6036,17 +6117,17 @@ s32 GetChestGameRandoGetItemId(s8 room, s16 ogDrawId, GlobalContext* globalCtx)
} }
if(ogDrawId == GID_HEART_PIECE) { if(ogDrawId == GID_HEART_PIECE) {
return Randomizer_GetItemIdFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE); return Randomizer_GetItemFromKnownCheck(RC_MARKET_TREASURE_CHEST_GAME_REWARD, GI_HEART_PIECE);
} }
return GI_NONE; return (GetItemEntry)GET_ITEM_NONE;
} }
s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) { s16 GetChestGameRandoGiDrawId(s8 room, s16 ogDrawId, GlobalContext* globalCtx) {
s32 randoGetItemId = GetChestGameRandoGetItemId(room, ogDrawId, globalCtx); GetItemEntry randoGetItem = GetChestGameRandoGetItem(room, ogDrawId, globalCtx);
if(randoGetItemId != GI_NONE) { if (randoGetItem.itemId != RG_NONE) {
return Randomizer_GetItemModelFromId(randoGetItemId); return randoGetItem.gid;
} }
return ogDrawId; return ogDrawId;

View File

@ -1488,8 +1488,8 @@ s32 Camera_Free(Camera* camera) {
f32 newCamX = -D_8015BD7C->state.input[0].cur.right_stick_x * 10.0f; f32 newCamX = -D_8015BD7C->state.input[0].cur.right_stick_x * 10.0f;
f32 newCamY = D_8015BD7C->state.input[0].cur.right_stick_y * 10.0f; f32 newCamY = D_8015BD7C->state.input[0].cur.right_stick_y * 10.0f;
camera->globalCtx->camX += newCamX; camera->globalCtx->camX += newCamX * (CVar_GetS32("gInvertXAxis", 0) ? -1 : 1);
camera->globalCtx->camY += newCamY; camera->globalCtx->camY += newCamY * (CVar_GetS32("gInvertYAxis", 0) ? 1 : -1);
if (camera->globalCtx->camY > 0x32A4) { if (camera->globalCtx->camY > 0x32A4) {
camera->globalCtx->camY = 0x32A4; camera->globalCtx->camY = 0x32A4;

View File

@ -395,6 +395,20 @@ void GetItem_Draw(GlobalContext* globalCtx, s16 drawId) {
sDrawItemTable[drawId].drawFunc(globalCtx, drawId); sDrawItemTable[drawId].drawFunc(globalCtx, drawId);
} }
/**
* Draw "Get Item" Model from a `GetItemEntry`
* Uses the Custom Draw Function if it exists, or just calls `GetItem_Draw`
*/
void GetItemEntry_Draw(GlobalContext* globalCtx, GetItemEntry getItemEntry) {
// RANDOTODO: Make this more flexible for easier toggling of individual item recolors in the future.
if (getItemEntry.drawFunc != NULL &&
(CVar_GetS32("gRandoMatchKeyColors", 0) || getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) {
getItemEntry.drawFunc(globalCtx, &getItemEntry);
} else {
GetItem_Draw(globalCtx, getItemEntry.gid);
}
}
// All remaining functions in this file are draw functions referenced in the table and called by the function above // All remaining functions in this file are draw functions referenced in the table and called by the function above
/* 0x0178 */ u8 primXluColor[3]; /* 0x0178 */ u8 primXluColor[3];

View File

@ -3,6 +3,8 @@
#include "soh/frame_interpolation.h" #include "soh/frame_interpolation.h"
const Color_RGB8 Trails_Color_ori = {255,255,255};
void EffectBlure_AddVertex(EffectBlure* this, Vec3f* p1, Vec3f* p2) { void EffectBlure_AddVertex(EffectBlure* this, Vec3f* p1, Vec3f* p2) {
EffectBlureElement* elem; EffectBlureElement* elem;
s32 numElements; s32 numElements;
@ -198,6 +200,7 @@ s32 EffectBlure_Update(void* thisx) {
s16 GreenColor; s16 GreenColor;
s16 BlueColor; s16 BlueColor;
s16 TrailDuration; s16 TrailDuration;
Color_RGB8 Trails_col = CVar_GetRGB("gTrailCol", Trails_Color_ori);
if (this == NULL) { if (this == NULL) {
return 0; return 0;
@ -208,16 +211,17 @@ s32 EffectBlure_Update(void* thisx) {
} }
if (CVar_GetS32("gUseTrailsCol", 0) !=0) { if (CVar_GetS32("gUseTrailsCol", 0) !=0) {
RedColor = CVar_GetS32("gTrailColR",255); RedColor = Trails_col.r;
GreenColor = CVar_GetS32("gTrailColG",255); GreenColor = Trails_col.g;
BlueColor = CVar_GetS32("gTrailColB",255); BlueColor = Trails_col.b;
TrailDuration = 4.0f*CVar_GetS32("gTrailDurantion",1); TrailDuration = 4.0f * CVar_GetS32("gTrailDurantion",1);
} else { } else {
RedColor = 255; RedColor = Trails_Color_ori.r;
GreenColor = 255; GreenColor = Trails_Color_ori.g;
BlueColor = 255; BlueColor = Trails_Color_ori.b;
TrailDuration=4.0f; TrailDuration=4.0f;
} }
this->p1StartColor.r = RedColor; this->p1StartColor.r = RedColor;
this->p2StartColor.r = RedColor; this->p2StartColor.r = RedColor;
this->p1EndColor.r = RedColor; this->p1EndColor.r = RedColor;

View File

@ -70,6 +70,7 @@ static void* sItemDropTex[] = {
gDropRecoveryHeartTex, gDropBombTex, gDropArrows1Tex, gDropArrows2Tex, gDropRecoveryHeartTex, gDropBombTex, gDropArrows1Tex, gDropArrows2Tex,
gDropArrows3Tex, gDropBombTex, gDropDekuNutTex, gDropDekuStickTex, gDropArrows3Tex, gDropBombTex, gDropDekuNutTex, gDropDekuStickTex,
gDropMagicLargeTex, gDropMagicSmallTex, gDropDekuSeedsTex, gDropKeySmallTex, gDropMagicLargeTex, gDropMagicSmallTex, gDropDekuSeedsTex, gDropKeySmallTex,
// OTRTODO: use 2D bombchu texture
}; };
static u8 sItemDropIds[] = { static u8 sItemDropIds[] = {
@ -335,6 +336,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
f32 yOffset = 980.0f; f32 yOffset = 980.0f;
f32 shadowScale = 6.0f; f32 shadowScale = 6.0f;
s32 getItemId = GI_NONE; s32 getItemId = GI_NONE;
GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE;
s16 spawnParam8000 = this->actor.params & 0x8000; s16 spawnParam8000 = this->actor.params & 0x8000;
s32 pad1; s32 pad1;
@ -389,6 +391,7 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
case ITEM00_RUPEE_ORANGE: case ITEM00_RUPEE_ORANGE:
case ITEM00_RUPEE_PURPLE: case ITEM00_RUPEE_PURPLE:
case ITEM00_FLEXIBLE: case ITEM00_FLEXIBLE:
case ITEM00_BOMBCHU:
yOffset = 500.0f; yOffset = 500.0f;
Actor_SetScale(&this->actor, 0.01f); Actor_SetScale(&this->actor, 0.01f);
this->scale = 0.01f; this->scale = 0.01f;
@ -506,12 +509,21 @@ void EnItem00_Init(Actor* thisx, GlobalContext* globalCtx) {
case ITEM00_TUNIC_GORON: case ITEM00_TUNIC_GORON:
case ITEM00_BOMBS_SPECIAL: case ITEM00_BOMBS_SPECIAL:
break; break;
case ITEM00_BOMBCHU:
Item_Give(globalCtx, ITEM_BOMBCHUS_5);
break;
} }
if ((gSaveContext.n64ddFlag || getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if (!Actor_HasParent(&this->actor, globalCtx)) {
getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); if (!gSaveContext.n64ddFlag) {
if (getItemId != GI_NONE) {
func_8002F554(&this->actor, globalCtx, getItemId); func_8002F554(&this->actor, globalCtx, getItemId);
} }
} else {
getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem);
}
}
EnItem00_SetupAction(this, func_8001E5C8); EnItem00_SetupAction(this, func_8001E5C8);
this->actionFunc(this, globalCtx); this->actionFunc(this, globalCtx);
@ -530,7 +542,8 @@ void func_8001DFC8(EnItem00* this, GlobalContext* globalCtx) {
(this->actor.params == ITEM00_HEART_PIECE)) { (this->actor.params == ITEM00_HEART_PIECE)) {
this->actor.shape.rot.y += 960; this->actor.shape.rot.y += 960;
} else { } else {
if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL)) { if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL) &&
(this->actor.params != ITEM00_BOMBCHU)) {
if (this->unk_15A == -1) { if (this->unk_15A == -1) {
if (Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x - 0x4000, 2, 3000, 1500) == if (Math_SmoothStepToS(&this->actor.shape.rot.x, this->actor.world.rot.x - 0x4000, 2, 3000, 1500) ==
0) { 0) {
@ -633,7 +646,8 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) {
if (this->actor.params <= ITEM00_RUPEE_RED) { if (this->actor.params <= ITEM00_RUPEE_RED) {
this->actor.shape.rot.y += 960; this->actor.shape.rot.y += 960;
} else if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL)) { } else if ((this->actor.params >= ITEM00_SHIELD_DEKU) && (this->actor.params != ITEM00_BOMBS_SPECIAL) &&
(this->actor.params != ITEM00_BOMBCHU)) {
this->actor.world.rot.x -= 700; this->actor.world.rot.x -= 700;
this->actor.shape.rot.y += 400; this->actor.shape.rot.y += 400;
this->actor.shape.rot.x = this->actor.world.rot.x - 0x4000; this->actor.shape.rot.x = this->actor.world.rot.x - 0x4000;
@ -666,10 +680,15 @@ void func_8001E304(EnItem00* this, GlobalContext* globalCtx) {
void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) { void func_8001E5C8(EnItem00* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (this->getItemId != GI_NONE) { if (this->getItemId != GI_NONE) {
if (!Actor_HasParent(&this->actor, globalCtx)) { if (!Actor_HasParent(&this->actor, globalCtx)) {
if (!gSaveContext.n64ddFlag) {
func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f); func_8002F434(&this->actor, globalCtx, this->getItemId, 50.0f, 80.0f);
} else {
GetItemEntry getItemEntry =
Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 50.0f, 80.0f);
}
this->unk_15A++; this->unk_15A++;
} else { } else {
this->getItemId = GI_NONE; this->getItemId = GI_NONE;
@ -703,13 +722,15 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
s16* params; s16* params;
Actor* dynaActor; Actor* dynaActor;
s32 getItemId = GI_NONE; s32 getItemId = GI_NONE;
GetItemEntry getItem = (GetItemEntry)GET_ITEM_NONE;
s16 sp3A = 0; s16 sp3A = 0;
s16 i; s16 i;
u32* temp; u32* temp;
EnItem00* this = (EnItem00*)thisx; EnItem00* this = (EnItem00*)thisx;
s32 pad; s32 pad;
if (CVar_GetS32("gNewDrops", 0)) { //set the rotation system on selected model only :) // OTRTODO: remove special case for bombchu when its 2D drop is implemented
if (CVar_GetS32("gNewDrops", 0) || this->actor.params == ITEM00_BOMBCHU) { //set the rotation system on selected model only :)
if ((this->actor.params == ITEM00_RUPEE_GREEN) || (this->actor.params == ITEM00_RUPEE_BLUE) || if ((this->actor.params == ITEM00_RUPEE_GREEN) || (this->actor.params == ITEM00_RUPEE_BLUE) ||
(this->actor.params == ITEM00_RUPEE_RED) || (this->actor.params == ITEM00_ARROWS_SINGLE) || (this->actor.params == ITEM00_RUPEE_RED) || (this->actor.params == ITEM00_ARROWS_SINGLE) ||
(this->actor.params == ITEM00_ARROWS_SMALL) || (this->actor.params == ITEM00_ARROWS_MEDIUM) || (this->actor.params == ITEM00_ARROWS_SMALL) || (this->actor.params == ITEM00_ARROWS_MEDIUM) ||
@ -717,7 +738,8 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
(this->actor.params == ITEM00_BOMBS_B) || (this->actor.params == ITEM00_NUTS) || (this->actor.params == ITEM00_BOMBS_B) || (this->actor.params == ITEM00_NUTS) ||
(this->actor.params == ITEM00_MAGIC_SMALL) || (this->actor.params == ITEM00_SEEDS) || (this->actor.params == ITEM00_MAGIC_SMALL) || (this->actor.params == ITEM00_SEEDS) ||
(this->actor.params == ITEM00_MAGIC_LARGE) || (this->actor.params == ITEM00_HEART) || (this->actor.params == ITEM00_MAGIC_LARGE) || (this->actor.params == ITEM00_HEART) ||
(this->actor.params == ITEM00_BOMBS_SPECIAL) || this->actor.params == ITEM00_HEART_PIECE) { (this->actor.params == ITEM00_BOMBS_SPECIAL) || this->actor.params == ITEM00_HEART_PIECE ||
(this->actor.params == ITEM00_BOMBCHU)) {
this->actor.shape.rot.y += 960; this->actor.shape.rot.y += 960;
} }
if (this->actor.params == ITEM00_SMALL_KEY && !gSaveContext.n64ddFlag) { if (this->actor.params == ITEM00_SMALL_KEY && !gSaveContext.n64ddFlag) {
@ -878,15 +900,21 @@ void EnItem00_Update(Actor* thisx, GlobalContext* globalCtx) {
break; break;
case ITEM00_BOMBS_SPECIAL: case ITEM00_BOMBS_SPECIAL:
break; break;
case ITEM00_BOMBCHU:
Item_Give(globalCtx, ITEM_BOMBCHUS_5);
break;
} }
params = &this->actor.params; params = &this->actor.params;
if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) { if ((getItemId != GI_NONE) && !Actor_HasParent(&this->actor, globalCtx)) {
if (gSaveContext.n64ddFlag) { if (!gSaveContext.n64ddFlag) {
getItemId = Randomizer_GetRandomizedItemId(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
}
func_8002F554(&this->actor, globalCtx, getItemId); func_8002F554(&this->actor, globalCtx, getItemId);
} else {
getItem = Randomizer_GetRandomizedItem(getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
getItemId = getItem.getItemId;
GiveItemEntryFromActorWithFixedRange(&this->actor, globalCtx, getItem);
}
} }
switch (*params) { switch (*params) {
@ -1196,6 +1224,15 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnItem00_DrawCollectible(this, globalCtx); EnItem00_DrawCollectible(this, globalCtx);
break; break;
} }
case ITEM00_BOMBCHU:
// OTRTODO: Stop forcing chu drops to be 3D when the texture is added
Actor_SetScale(&this->actor, 0.2f);
this->scale = 0.2f;
this->actor.shape.yOffset = 50.0f;
this->actor.world.rot.x = 0x4000;
this->actor.shape.shadowScale = 0.3f;
GetItem_Draw(globalCtx, GID_BOMBCHU);
break;
case ITEM00_SHIELD_DEKU: case ITEM00_SHIELD_DEKU:
GetItem_Draw(globalCtx, GID_SHIELD_DEKU); GetItem_Draw(globalCtx, GID_SHIELD_DEKU);
break; break;
@ -1214,50 +1251,68 @@ void EnItem00_Draw(Actor* thisx, GlobalContext* globalCtx) {
} }
} }
void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, s16 getItemId) { void EnItem00_CustomItemsParticles(Actor* Parent, GlobalContext* globalCtx, GetItemEntry giEntry) {
s16 color_slot; s16 color_slot;
switch (getItemId) { switch (giEntry.modIndex) {
case GI_MINUET_OF_FOREST: case MOD_NONE:
case GI_SINGLE_MAGIC: switch (giEntry.itemId) {
case GI_DOUBLE_MAGIC: case ITEM_SONG_MINUET:
color_slot = 0; color_slot = 0;
break; break;
case GI_BOLERO_OF_FIRE: case ITEM_SONG_BOLERO:
case GI_DOUBLE_DEFENSE:
color_slot = 1; color_slot = 1;
break; break;
case GI_SERENADE_OF_WATER: case ITEM_SONG_SERENADE:
color_slot = 2; color_slot = 2;
break; break;
case GI_REQUIEM_OF_SPIRIT: case ITEM_SONG_REQUIEM:
color_slot = 3; color_slot = 3;
break; break;
case GI_NOCTURNE_OF_SHADOW: case ITEM_SONG_NOCTURNE:
color_slot = 4; color_slot = 4;
break; break;
case GI_PRELUDE_OF_LIGHT: case ITEM_SONG_PRELUDE:
color_slot = 5; color_slot = 5;
break; break;
case GI_STICK_UPGRADE_20: case ITEM_STICK_UPGRADE_20:
case GI_STICK_UPGRADE_30: case ITEM_STICK_UPGRADE_30:
color_slot = 6; color_slot = 6;
break; break;
case GI_NUT_UPGRADE_30: case ITEM_NUT_UPGRADE_30:
case GI_NUT_UPGRADE_40: case ITEM_NUT_UPGRADE_40:
color_slot = 7; color_slot = 7;
break; break;
default:
return;
}
break;
case MOD_RANDOMIZER:
switch (giEntry.itemId) {
case RG_MAGIC_SINGLE:
case RG_MAGIC_DOUBLE:
color_slot = 0;
break;
case RG_DOUBLE_DEFENSE:
color_slot = 8;
break;
default:
return;
}
break;
default:
return;
} }
s16* colors[9][3] = { s16* colors[9][3] = {
{ 34, 255, 76 }, // Minuet and Magic Upgrades Colors { 34, 255, 76 }, // Minuet and Magic Upgrades Colors
{ 177, 35, 35 }, // Bolero and Double Defense Colors { 177, 35, 35 }, // Bolero Colors
{ 115, 251, 253 }, // Serenade Color { 115, 251, 253 }, // Serenade Color
{ 177, 122, 35 }, // Requiem Color { 177, 122, 35 }, // Requiem Color
{ 177, 28, 212 }, // Nocturne Color { 177, 28, 212 }, // Nocturne Color
{ 255, 255, 92 }, // Prelude Color { 255, 255, 92 }, // Prelude Color
{ 31, 152, 49 }, // Stick Upgrade Color { 31, 152, 49 }, // Stick Upgrade Color
{ 222, 182, 20 }, // Nut Upgrade Color { 222, 182, 20 }, // Nut Upgrade Color
{ 255, 255, 255 } // White Color placeholder { 255, 255, 255 } // Double Defense Color
}; };
s16* colorsEnv[9][3] = { s16* colorsEnv[9][3] = {
@ -1323,12 +1378,10 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag && (this->getItemId != GI_NONE || this->actor.params == ITEM00_SMALL_KEY)) { if (gSaveContext.n64ddFlag && (this->getItemId != GI_NONE || this->actor.params == ITEM00_SMALL_KEY)) {
f32 mtxScale = 16.0f; f32 mtxScale = 16.0f;
Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
s32 randoGetItemId = Randomizer_GetRandomizedItemId(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry =
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || Randomizer_GetRandomizedItem(this->getItemId, this->actor.id, this->ogParams, globalCtx->sceneNum);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); GetItemEntry_Draw(globalCtx, randoGetItemEntry);
}
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
} else { } else {
s32 texIndex = this->actor.params - 3; s32 texIndex = this->actor.params - 3;
@ -1338,6 +1391,9 @@ void EnItem00_DrawCollectible(EnItem00* this, GlobalContext* globalCtx) {
if (this->actor.params == ITEM00_BOMBS_SPECIAL) { if (this->actor.params == ITEM00_BOMBS_SPECIAL) {
texIndex = 1; texIndex = 1;
// OTRTODO: 2D bombchu drops
//} else if (this->actor.params == ITEM00_BOMBCHU) {
// texIndex = 12;
} else if (this->actor.params >= ITEM00_ARROWS_SMALL) { } else if (this->actor.params >= ITEM00_ARROWS_SMALL) {
texIndex -= 3; texIndex -= 3;
} }
@ -1384,12 +1440,10 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) {
if (gSaveContext.n64ddFlag) { if (gSaveContext.n64ddFlag) {
f32 mtxScale = 16.0f; f32 mtxScale = 16.0f;
Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY); Matrix_Scale(mtxScale, mtxScale, mtxScale, MTXMODE_APPLY);
s32 randoGetItemId = Randomizer_GetRandomizedItemId(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum); GetItemEntry randoGetItemEntry =
if ((randoGetItemId >= GI_MINUET_OF_FOREST && randoGetItemId <= GI_DOUBLE_DEFENSE) || Randomizer_GetRandomizedItem(GI_HEART_PIECE, this->actor.id, this->ogParams, globalCtx->sceneNum);
(randoGetItemId >= GI_STICK_UPGRADE_20 && randoGetItemId <= GI_NUT_UPGRADE_40)) { EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemEntry);
EnItem00_CustomItemsParticles(&this->actor, globalCtx, randoGetItemId); GetItemEntry_Draw(globalCtx, randoGetItemEntry);
}
GetItem_Draw(globalCtx, Randomizer_GetItemModelFromId(randoGetItemId));
} else { } else {
s32 pad; s32 pad;
@ -1405,6 +1459,36 @@ void EnItem00_DrawHeartPiece(EnItem00* this, GlobalContext* globalCtx) {
} }
} }
/**
* Sometimes convert the given drop ID into a bombchu.
* Returns the new drop type ID.
*/
s16 EnItem00_ConvertBombDropToBombchu(s16 dropId) {
if (INV_CONTENT(ITEM_BOMBCHU) == ITEM_NONE) {
return dropId;
}
if (INV_CONTENT(ITEM_BOMB) == ITEM_NONE) {
return ITEM00_BOMBCHU;
}
if (AMMO(ITEM_BOMB) <= 15) {
// Player needs bombs and might need chus, so drop whichever has less
if (AMMO(ITEM_BOMB) <= AMMO(ITEM_BOMBCHU)) {
return dropId;
} else {
return ITEM00_BOMBCHU;
}
} else {
// Player has enough bombs, so drop chus if they need some, else it's 50/50
if (AMMO(ITEM_BOMBCHU) <= 15) {
return ITEM00_BOMBCHU;
} else {
return Rand_Next() % 2 ? dropId : ITEM00_BOMBCHU;
}
}
}
/** /**
* Converts a given drop type ID based on link's current age, health and owned items. * Converts a given drop type ID based on link's current age, health and owned items.
* Returns a new drop type ID or -1 to cancel the drop. * Returns a new drop type ID or -1 to cancel the drop.
@ -1422,6 +1506,11 @@ s16 func_8001F404(s16 dropId) {
} }
} }
if (CVar_GetS32("gBombchuDrops", 0) &&
(dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_B || dropId == ITEM00_BOMBS_SPECIAL)) {
dropId = EnItem00_ConvertBombDropToBombchu(dropId);
}
// This is convoluted but it seems like it must be a single condition to match // This is convoluted but it seems like it must be a single condition to match
// clang-format off // clang-format off
if (((dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_SPECIAL || dropId == ITEM00_BOMBS_B) && INV_CONTENT(ITEM_BOMB) == ITEM_NONE) || if (((dropId == ITEM00_BOMBS_A || dropId == ITEM00_BOMBS_SPECIAL || dropId == ITEM00_BOMBS_B) && INV_CONTENT(ITEM_BOMB) == ITEM_NONE) ||

View File

@ -112,9 +112,12 @@ static s16 sHeartsDDEnvFactors[3][3] = {
}; };
// Current colors for the double defense hearts // Current colors for the double defense hearts
s16 HeartInner[3] = {HEARTS_PRIM_R,HEARTS_PRIM_G,HEARTS_PRIM_B}; Color_RGB8 HeartInner_ori = {HEARTS_PRIM_R,HEARTS_PRIM_G,HEARTS_PRIM_B};
s16 HeartDDOutline[3] = {HEARTS_DD_PRIM_R,HEARTS_DD_PRIM_G,HEARTS_DD_PRIM_B}; Color_RGB8 HeartDDOutline_ori = {HEARTS_DD_PRIM_R,HEARTS_DD_PRIM_G,HEARTS_DD_PRIM_B};
s16 HeartDDInner[3] = {HEARTS_DD_ENV_R,HEARTS_DD_ENV_G,HEARTS_DD_ENV_B}; Color_RGB8 HeartDDInner_ori = {HEARTS_DD_ENV_R,HEARTS_DD_ENV_G,HEARTS_DD_ENV_B};
Color_RGB8 HeartInner;
Color_RGB8 HeartDDOutline;
Color_RGB8 HeartDDInner;
s16 sBeatingHeartsDDPrim[3]; s16 sBeatingHeartsDDPrim[3];
s16 sBeatingHeartsDDEnv[3]; s16 sBeatingHeartsDDEnv[3];
s16 sHeartsDDPrim[2][3]; s16 sHeartsDDPrim[2][3];
@ -123,19 +126,13 @@ s16 sHeartsDDEnv[2][3];
void HealthMeter_Init(GlobalContext* globalCtx) { void HealthMeter_Init(GlobalContext* globalCtx) {
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
if (CVar_GetS32("gHudColors", 1) == 2) { if (CVar_GetS32("gHudColors", 1) == 2) {
HeartInner[0] = CVar_GetS32("gCCHeartsPrimR", 90); HeartInner = CVar_GetRGB("gCCHeartsPrim", HeartInner_ori);
HeartInner[1] = CVar_GetS32("gCCHeartsPrimG", 90); HeartDDInner = CVar_GetRGB("gCCDDHeartsPrim", HeartDDInner_ori);
HeartInner[2] = CVar_GetS32("gCCHeartsPrimB", 90); HeartDDOutline = CVar_GetRGB("gDDCCHeartsPrim", HeartDDOutline_ori);
HeartDDOutline[0] = CVar_GetS32("gDDCCHeartsPrimR", 90);
HeartDDOutline[1] = CVar_GetS32("gDDCCHeartsPrimG", 90);
HeartDDOutline[2] = CVar_GetS32("gDDCCHeartsPrimB", 90);
} else { } else {
HeartInner[0] = HEARTS_PRIM_R; HeartInner = HeartInner_ori;
HeartInner[1] = HEARTS_PRIM_G; HeartDDInner = HeartDDInner_ori;
HeartInner[2] = HEARTS_PRIM_B; HeartDDOutline = HeartDDOutline_ori;
HeartDDOutline[0] = HEARTS_DD_PRIM_R;
HeartDDOutline[1] = HEARTS_DD_PRIM_G;
HeartDDOutline[2] = HEARTS_DD_PRIM_B;
} }
interfaceCtx->unk_228 = 0x140; interfaceCtx->unk_228 = 0x140;
@ -143,33 +140,33 @@ void HealthMeter_Init(GlobalContext* globalCtx) {
interfaceCtx->unk_22A = interfaceCtx->unk_1FE = 0; interfaceCtx->unk_22A = interfaceCtx->unk_1FE = 0;
interfaceCtx->unk_22C = interfaceCtx->unk_200 = 0; interfaceCtx->unk_22C = interfaceCtx->unk_200 = 0;
interfaceCtx->heartsPrimR[0] = HeartInner[0]; interfaceCtx->heartsPrimR[0] = HeartInner.r;
interfaceCtx->heartsPrimG[0] = HeartInner[1]; interfaceCtx->heartsPrimG[0] = HeartInner.g;
interfaceCtx->heartsPrimB[0] = HeartInner[2]; interfaceCtx->heartsPrimB[0] = HeartInner.b;
interfaceCtx->heartsEnvR[0] = HEARTS_ENV_R; interfaceCtx->heartsEnvR[0] = HEARTS_ENV_R;
interfaceCtx->heartsEnvG[0] = HEARTS_ENV_G; interfaceCtx->heartsEnvG[0] = HEARTS_ENV_G;
interfaceCtx->heartsEnvB[0] = HEARTS_ENV_B; interfaceCtx->heartsEnvB[0] = HEARTS_ENV_B;
interfaceCtx->heartsPrimR[1] = HeartInner[0]; interfaceCtx->heartsPrimR[1] = HeartInner.r;
interfaceCtx->heartsPrimG[1] = HeartInner[1]; interfaceCtx->heartsPrimG[1] = HeartInner.g;
interfaceCtx->heartsPrimB[1] = HeartInner[2]; interfaceCtx->heartsPrimB[1] = HeartInner.b;
interfaceCtx->heartsEnvR[1] = HEARTS_ENV_R; interfaceCtx->heartsEnvR[1] = HEARTS_ENV_R;
interfaceCtx->heartsEnvG[1] = HEARTS_ENV_G; interfaceCtx->heartsEnvG[1] = HEARTS_ENV_G;
interfaceCtx->heartsEnvB[1] = HEARTS_ENV_B; interfaceCtx->heartsEnvB[1] = HEARTS_ENV_B;
sHeartsDDPrim[0][0] = sHeartsDDPrim[1][0] = HeartDDOutline[0]; sHeartsDDPrim[0][0] = sHeartsDDPrim[1][0] = HeartDDOutline.r;
sHeartsDDPrim[0][1] = sHeartsDDPrim[1][1] = HeartDDOutline[1]; sHeartsDDPrim[0][1] = sHeartsDDPrim[1][1] = HeartDDOutline.b;
sHeartsDDPrim[0][2] = sHeartsDDPrim[1][2] = HeartDDOutline[2]; sHeartsDDPrim[0][2] = sHeartsDDPrim[1][2] = HeartDDOutline.b;
// sHeartsDDPrim[2][0] = HeartInner[0]; // sHeartsDDPrim[2][0] = HeartInner[0];
// sHeartsDDPrim[2][1] = HeartInner[1]; // sHeartsDDPrim[2][1] = HeartInner[1];
// sHeartsDDPrim[2][2] = HeartInner[2]; // sHeartsDDPrim[2][2] = HeartInner[2];
sHeartsDDEnv[0][0] = sHeartsDDEnv[1][0] = HeartDDInner[0]; sHeartsDDEnv[0][0] = sHeartsDDEnv[1][0] = HeartDDInner.r;
sHeartsDDEnv[0][1] = sHeartsDDEnv[1][1] = HeartDDInner[1]; sHeartsDDEnv[0][1] = sHeartsDDEnv[1][1] = HeartDDInner.g;
sHeartsDDEnv[0][2] = sHeartsDDEnv[1][2] = HeartDDInner[2]; sHeartsDDEnv[0][2] = sHeartsDDEnv[1][2] = HeartDDInner.b;
} }
void HealthMeter_Update(GlobalContext* globalCtx) { void HealthMeter_Update(GlobalContext* globalCtx) {
@ -188,19 +185,13 @@ void HealthMeter_Update(GlobalContext* globalCtx) {
Bottom_LM_Margin = CVar_GetS32("gHUDMargin_B", 0); Bottom_LM_Margin = CVar_GetS32("gHUDMargin_B", 0);
if (CVar_GetS32("gHudColors", 1) == 2) { if (CVar_GetS32("gHudColors", 1) == 2) {
HeartInner[0] = CVar_GetS32("gCCHeartsPrimR", sHeartsPrimColors[0][0]); HeartInner = CVar_GetRGB("gCCHeartsPrim", HeartInner_ori);
HeartInner[1] = CVar_GetS32("gCCHeartsPrimG", sHeartsPrimColors[0][1]); HeartDDInner = CVar_GetRGB("gCCDDHeartsPrim", HeartDDInner_ori);
HeartInner[2] = CVar_GetS32("gCCHeartsPrimB", sHeartsPrimColors[0][2]); HeartDDOutline = CVar_GetRGB("gDDCCHeartsPrim", HeartDDOutline_ori);
HeartDDOutline[0] = CVar_GetS32("gDDCCHeartsPrimR", sHeartsDDPrim[0][0]);
HeartDDOutline[1] = CVar_GetS32("gDDCCHeartsPrimG", sHeartsDDPrim[0][1]);
HeartDDOutline[2] = CVar_GetS32("gDDCCHeartsPrimB", sHeartsDDPrim[0][2]);
} else { } else {
HeartInner[0] = HEARTS_PRIM_R; HeartInner = HeartInner_ori;
HeartInner[1] = HEARTS_PRIM_G; HeartDDInner = HeartDDInner_ori;
HeartInner[2] = HEARTS_PRIM_B; HeartDDOutline = HeartDDOutline_ori;
HeartDDOutline[0] = HEARTS_DD_PRIM_R;
HeartDDOutline[1] = HEARTS_DD_PRIM_G;
HeartDDOutline[2] = HEARTS_DD_PRIM_B;
} }
if (interfaceCtx->unk_200 != 0) { if (interfaceCtx->unk_200 != 0) {
@ -219,18 +210,18 @@ void HealthMeter_Update(GlobalContext* globalCtx) {
ddFactor = factor; ddFactor = factor;
interfaceCtx->heartsPrimR[0] = HeartInner[0]; interfaceCtx->heartsPrimR[0] = HeartInner.r;
interfaceCtx->heartsPrimG[0] = HeartInner[1]; interfaceCtx->heartsPrimG[0] = HeartInner.g;
interfaceCtx->heartsPrimB[0] = HeartInner[2]; interfaceCtx->heartsPrimB[0] = HeartInner.b;
interfaceCtx->heartsEnvR[0] = HEARTS_ENV_R; interfaceCtx->heartsEnvR[0] = HEARTS_ENV_R;
interfaceCtx->heartsEnvG[0] = HEARTS_ENV_G; interfaceCtx->heartsEnvG[0] = HEARTS_ENV_G;
interfaceCtx->heartsEnvB[0] = HEARTS_ENV_B; interfaceCtx->heartsEnvB[0] = HEARTS_ENV_B;
if (CVar_GetS32("gHudColors", 1) == 2) { if (CVar_GetS32("gHudColors", 1) == 2) {
interfaceCtx->heartsPrimR[1] = HeartInner[0]; interfaceCtx->heartsPrimR[1] = HeartInner.r;
interfaceCtx->heartsPrimG[1] = HeartInner[1]; interfaceCtx->heartsPrimG[1] = HeartInner.g;
interfaceCtx->heartsPrimB[1] = HeartInner[2]; interfaceCtx->heartsPrimB[1] = HeartInner.b;
} else { } else {
interfaceCtx->heartsPrimR[1] = sHeartsPrimColors[type][0]; interfaceCtx->heartsPrimR[1] = sHeartsPrimColors[type][0];
interfaceCtx->heartsPrimG[1] = sHeartsPrimColors[type][1]; interfaceCtx->heartsPrimG[1] = sHeartsPrimColors[type][1];
@ -245,9 +236,9 @@ void HealthMeter_Update(GlobalContext* globalCtx) {
gFactor = sHeartsPrimFactors[0][1] * factor; gFactor = sHeartsPrimFactors[0][1] * factor;
bFactor = sHeartsPrimFactors[0][2] * factor; bFactor = sHeartsPrimFactors[0][2] * factor;
interfaceCtx->beatingHeartPrim[0] = (u8)(rFactor + HeartInner[0]) & 0xFF; interfaceCtx->beatingHeartPrim[0] = (u8)(rFactor + HeartInner.r) & 0xFF;
interfaceCtx->beatingHeartPrim[1] = (u8)(gFactor + HeartInner[1]) & 0xFF; interfaceCtx->beatingHeartPrim[1] = (u8)(gFactor + HeartInner.g) & 0xFF;
interfaceCtx->beatingHeartPrim[2] = (u8)(bFactor + HeartInner[2]) & 0xFF; interfaceCtx->beatingHeartPrim[2] = (u8)(bFactor + HeartInner.b) & 0xFF;
rFactor = sHeartsEnvFactors[0][0] * factor; rFactor = sHeartsEnvFactors[0][0] * factor;
gFactor = sHeartsEnvFactors[0][1] * factor; gFactor = sHeartsEnvFactors[0][1] * factor;
@ -259,50 +250,48 @@ void HealthMeter_Update(GlobalContext* globalCtx) {
ddType = type; ddType = type;
sHeartsDDPrim[0][0] = HeartDDOutline[0]; sHeartsDDPrim[0][0] = HeartDDOutline.r;
sHeartsDDPrim[0][1] = HeartDDOutline[1]; sHeartsDDPrim[0][1] = HeartDDOutline.g;
sHeartsDDPrim[0][2] = HeartDDOutline[2]; sHeartsDDPrim[0][2] = HeartDDOutline.b;
sHeartsDDEnv[0][0] = HeartDDInner[0]; sHeartsDDEnv[0][0] = HeartDDInner.r;
sHeartsDDEnv[0][1] = HeartDDInner[1]; sHeartsDDEnv[0][1] = HeartDDInner.g;
sHeartsDDEnv[0][2] = HeartDDInner[2]; sHeartsDDEnv[0][2] = HeartDDInner.b;
if (CVar_GetS32("gHudColors", 1) == 2) { if (CVar_GetS32("gHudColors", 1) == 2) {
sHeartsDDPrim[2][0] = CVar_GetS32("gCCDDHeartsPrimR", 255); sHeartsDDPrim[2][0] = HeartDDInner.r;
sHeartsDDPrim[2][1] = CVar_GetS32("gCCDDHeartsPrimG", 70); sHeartsDDPrim[2][1] = HeartDDInner.g;
sHeartsDDPrim[2][2] = CVar_GetS32("gCCDDHeartsPrimB", 50); sHeartsDDPrim[2][2] = HeartDDInner.b;
sHeartsDDPrim[1][0] = HeartDDOutline[0]; sHeartsDDPrim[1][0] = HeartDDOutline.r;
sHeartsDDPrim[1][1] = HeartDDOutline[1]; sHeartsDDPrim[1][1] = HeartDDOutline.g;
sHeartsDDPrim[1][2] = HeartDDOutline[2]; sHeartsDDPrim[1][2] = HeartDDOutline.b;
sHeartsDDEnv[1][0] = CVar_GetS32("gCCDDHeartsPrimR", 255); sHeartsDDEnv[1][0] = HeartDDInner.r;
sHeartsDDEnv[1][1] = CVar_GetS32("gCCDDHeartsPrimG", 70); sHeartsDDEnv[1][1] = HeartDDInner.g;
sHeartsDDEnv[1][2] = CVar_GetS32("gCCDDHeartsPrimB", 50); sHeartsDDEnv[1][2] = HeartDDInner.b;
HeartDDInner[0] = CVar_GetS32("gCCDDHeartsPrimR", 255); HeartDDInner = CVar_GetRGB("gCCDDHeartsPrim", HeartDDInner_ori);
HeartDDInner[1] = CVar_GetS32("gCCDDHeartsPrimG", 70);
HeartDDInner[2] = CVar_GetS32("gCCDDHeartsPrimB", 50);
sHeartsDDEnv[0][0] = CVar_GetS32("gCCDDHeartsPrimR", 255); sHeartsDDEnv[0][0] = HeartDDInner.r;
sHeartsDDEnv[0][1] = CVar_GetS32("gCCDDHeartsPrimG", 70); sHeartsDDEnv[0][1] = HeartDDInner.g;
sHeartsDDEnv[0][2] = CVar_GetS32("gCCDDHeartsPrimB", 0); sHeartsDDEnv[0][2] = HeartDDInner.b;
rFactor = sHeartsDDPrimFactors[ddType][0] * ddFactor; rFactor = sHeartsDDPrimFactors[ddType][0] * ddFactor;
gFactor = sHeartsDDPrimFactors[ddType][1] * ddFactor; gFactor = sHeartsDDPrimFactors[ddType][1] * ddFactor;
bFactor = sHeartsDDPrimFactors[ddType][2] * ddFactor; bFactor = sHeartsDDPrimFactors[ddType][2] * ddFactor;
sBeatingHeartsDDPrim[0] = (u8)(rFactor + HeartDDOutline[0]) & 0xFF; sBeatingHeartsDDPrim[0] = (u8)(rFactor + HeartDDOutline.r) & 0xFF;
sBeatingHeartsDDPrim[1] = (u8)(gFactor + HeartDDOutline[1]) & 0xFF; sBeatingHeartsDDPrim[1] = (u8)(gFactor + HeartDDOutline.g) & 0xFF;
sBeatingHeartsDDPrim[2] = (u8)(bFactor + HeartDDOutline[2]) & 0xFF; sBeatingHeartsDDPrim[2] = (u8)(bFactor + HeartDDOutline.b) & 0xFF;
rFactor = sHeartsDDEnvFactors[ddType][0] * ddFactor; rFactor = sHeartsDDEnvFactors[ddType][0] * ddFactor;
gFactor = sHeartsDDEnvFactors[ddType][1] * ddFactor; gFactor = sHeartsDDEnvFactors[ddType][1] * ddFactor;
bFactor = sHeartsDDEnvFactors[ddType][2] * ddFactor; bFactor = sHeartsDDEnvFactors[ddType][2] * ddFactor;
sBeatingHeartsDDEnv[0] = (u8)(rFactor + HeartDDInner[0]) & 0xFF; sBeatingHeartsDDEnv[0] = (u8)(rFactor + HeartDDInner.r) & 0xFF;
sBeatingHeartsDDEnv[1] = (u8)(gFactor + HeartDDInner[1]) & 0xFF; sBeatingHeartsDDEnv[1] = (u8)(gFactor + HeartDDInner.g) & 0xFF;
sBeatingHeartsDDEnv[2] = (u8)(bFactor + HeartDDInner[2]) & 0xFF; sBeatingHeartsDDEnv[2] = (u8)(bFactor + HeartDDInner.b) & 0xFF;
} else { } else {
sHeartsDDPrim[0][0] = HEARTS_DD_PRIM_R; sHeartsDDPrim[0][0] = HEARTS_DD_PRIM_R;
sHeartsDDPrim[0][1] = HEARTS_DD_PRIM_G; sHeartsDDPrim[0][1] = HEARTS_DD_PRIM_G;
@ -413,6 +402,12 @@ void HealthMeter_Draw(GlobalContext* globalCtx) {
s32 curCombineModeSet = 0; s32 curCombineModeSet = 0;
u8* curBgImgLoaded = NULL; u8* curBgImgLoaded = NULL;
s32 ddHeartCountMinusOne = gSaveContext.inventory.defenseHearts - 1; s32 ddHeartCountMinusOne = gSaveContext.inventory.defenseHearts - 1;
float HeartsScale = 0.7f;
if (CVar_GetS32("gHeartsCountPosType", 0) != 0) {
HeartsScale = CVar_GetFloat("gHeartsCountScale", 0.7f);
}
static u32 epoch = 0;
epoch++;
OPEN_DISPS(gfxCtx); OPEN_DISPS(gfxCtx);
@ -433,14 +428,14 @@ void HealthMeter_Draw(GlobalContext* globalCtx) {
s16 PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins; s16 PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins;
s16 PosY_original = 0.0f+Y_Margins; s16 PosY_original = 0.0f+Y_Margins;
if (CVar_GetS32("gHeartsCountPosType", 0) != 0) { if (CVar_GetS32("gHeartsCountPosType", 0) != 0) {
offsetY = CVar_GetS32("gHeartsPosY", 0)+Y_Margins; offsetY = CVar_GetS32("gHeartsCountPosY", 0)+Y_Margins+(HeartsScale*15);
if (CVar_GetS32("gHeartsCountPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gHeartsCountPosType", 0) == 1) {//Anchor Left
offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f);
} else if (CVar_GetS32("gHeartsCountPosType", 0) == 2) {//Anchor Right } else if (CVar_GetS32("gHeartsCountPosType", 0) == 2) {//Anchor Right
X_Margins = Right_LM_Margin; X_Margins = Right_LM_Margin;
offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f);
} else if (CVar_GetS32("gHeartsCountPosType", 0) == 3) {//Anchor None } else if (CVar_GetS32("gHeartsCountPosType", 0) == 3) {//Anchor None
offsetX = CVar_GetS32("gHeartsPosX", 0); offsetX = CVar_GetS32("gHeartsCountPosX", 0)+70.0f;
} else if (CVar_GetS32("gHeartsCountPosType", 0) == 4) {//Hidden } else if (CVar_GetS32("gHeartsCountPosType", 0) == 4) {//Hidden
offsetX = -9999; offsetX = -9999;
} }
@ -568,16 +563,27 @@ void HealthMeter_Draw(GlobalContext* globalCtx) {
} }
} }
temp3 = 26.0f + offsetY; temp3 = offsetY;
temp2 = 30.0f + offsetX; temp2 = offsetX;
temp4 = 1.0f; temp4 = 1.0f;//Heart texture size
temp4 /= 0.68f; temp4 /= 0.68f; //Hearts Scaled size
temp4 *= 1 << 10; temp4 *= 1 << 10;
temp1 = 8.0f; temp1 = 8.0f;
temp1 *= 0.68f; temp1 *= 0.68f;
gSPWideTextureRectangle(OVERLAY_DISP++, (s32)((temp2 - temp1) * 4), (s32)((temp3 - temp1) * 4), /*gSPWideTextureRectangle(OVERLAY_DISP++, (s32)((temp2 - temp1) * 4), (s32)((temp3 - temp1) * 4),
(s32)((temp2 + temp1) * 4), (s32)((temp3 + temp1) * 4), G_TX_RENDERTILE, 0, 0, (s32)((temp2 + temp1) * 4), (s32)((temp3 + temp1) * 4), G_TX_RENDERTILE, 0, 0,
(s32)temp4, (s32)temp4); (s32)temp4, (s32)temp4);*/
Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx));
Matrix_SetTranslateScaleMtx2(matrix,
HeartsScale, //Scale X
HeartsScale, //Scale Y
HeartsScale, //Scale Z
-130+offsetX, //Pos X
(-94+offsetY) *-1, //Pos Y
0.0f); //Pos Z
gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPVertex(OVERLAY_DISP++, sp154, 4, 0);
gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
} else { } else {
if ((ddHeartCountMinusOne < 0) || (i > ddHeartCountMinusOne)) { if ((ddHeartCountMinusOne < 0) || (i > ddHeartCountMinusOne)) {
if (curCombineModeSet != 2) { if (curCombineModeSet != 2) {
@ -597,28 +603,33 @@ void HealthMeter_Draw(GlobalContext* globalCtx) {
{ {
Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx)); Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx));
Matrix_SetTranslateScaleMtx2(matrix, 1.0f - (0.32f * sp144), 1.0f - (0.32f * sp144), Matrix_SetTranslateScaleMtx2(matrix,
1.0f - (0.32f * sp144), -130.0f + offsetX, HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144),
94.5f - offsetY, 0.0f); HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144),
HeartsScale+(HeartsScale/3) - ((HeartsScale/3) * sp144),
-130+offsetX, //Pos X
(-94+offsetY) *-1, //Pos Y
0.0f);
gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD); gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPVertex(OVERLAY_DISP++, sp154, 4, 0); gSPVertex(OVERLAY_DISP++, sp154, 4, 0);
gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0); gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);
} }
} }
offsetX += 10.0f; //offsetX += 10.0f;
offsetX += (HeartsScale*14.5f);
if (i == 9) { if (i == 9) {
PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins; PosX_original = OTRGetDimensionFromLeftEdge(0.0f)+X_Margins;
PosY_original = 10.0f+Y_Margins; PosY_original = (HeartsScale*15)+Y_Margins;
if (CVar_GetS32("gHeartsCountPosType", 0) != 0) { if (CVar_GetS32("gHeartsCountPosType", 0) != 0) {
offsetY = CVar_GetS32("gHeartsPosY", 0)+Y_Margins+10.0f; offsetY = CVar_GetS32("gHeartsCountPosY", 0)+((HeartsScale*15)*2)+Y_Margins;
if (CVar_GetS32("gHeartsCountPosType", 0) == 1) {//Anchor Left if (CVar_GetS32("gHeartsCountPosType", 0) == 1) {//Anchor Left
offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); offsetX = OTRGetDimensionFromLeftEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f);
} else if (CVar_GetS32("gHeartsCountPosType", 0) == 2) {//Anchor Right } else if (CVar_GetS32("gHeartsCountPosType", 0) == 2) {//Anchor Right
X_Margins = Right_LM_Margin; X_Margins = Right_LM_Margin;
offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsPosX", 0)+X_Margins); offsetX = OTRGetDimensionFromRightEdge(CVar_GetS32("gHeartsCountPosX", 0)+X_Margins+70.0f);
} else if (CVar_GetS32("gHeartsCountPosType", 0) == 3) {//Anchor None } else if (CVar_GetS32("gHeartsCountPosType", 0) == 3) {//Anchor None
offsetX = CVar_GetS32("gHeartsPosX", 0); offsetX = CVar_GetS32("gHeartsCountPosX", 0)+70.0f;
} else if (CVar_GetS32("gHeartsCountPosType", 0) == 4) {//Hidden } else if (CVar_GetS32("gHeartsCountPosType", 0) == 4) {//Hidden
offsetX = -9999; offsetX = -9999;
} }

View File

@ -601,6 +601,8 @@ void Minimap_DrawCompassIcons(GlobalContext* globalCtx) {
s32 pad; s32 pad;
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
s16 tempX, tempZ; s16 tempX, tempZ;
const Color_RGB8 LastEntrance_arrow = { 200, 0, 0 };
const Color_RGB8 CurrentPosition_arrow = { 200, 255, 0 };
s16 X_Margins_Minimap; s16 X_Margins_Minimap;
s16 Y_Margins_Minimap; s16 Y_Margins_Minimap;
if (CVar_GetS32("gMinimapUseMargins", 0) != 0) { if (CVar_GetS32("gMinimapUseMargins", 0) != 0) {
@ -658,9 +660,9 @@ void Minimap_DrawCompassIcons(GlobalContext* globalCtx) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (CVar_GetS32("gHudColors", 1) == 2) { if (CVar_GetS32("gHudColors", 1) == 2) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetS32("gCCMinimapCPPrimR", 200), CVar_GetS32("gCCMinimapCPPrimG", 255), CVar_GetS32("gCCMinimapCPPrimB", 0), 255); gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetRGB("gCCMinimapCPPrim", CurrentPosition_arrow).r, CVar_GetRGB("gCCMinimapCPPrim", CurrentPosition_arrow).g, CVar_GetRGB("gCCMinimapCPPrim", CurrentPosition_arrow).b, 255);
} else { } else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, 200, 255, 0, 255); gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CurrentPosition_arrow.r, CurrentPosition_arrow.g, CurrentPosition_arrow.b, 255);
} }
gSPDisplayList(OVERLAY_DISP++, gCompassArrowDL); gSPDisplayList(OVERLAY_DISP++, gCompassArrowDL);
@ -699,9 +701,9 @@ void Minimap_DrawCompassIcons(GlobalContext* globalCtx) {
G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
if (CVar_GetS32("gHudColors", 1) == 2) { if (CVar_GetS32("gHudColors", 1) == 2) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetS32("gCCMinimapLEPrimR", 200), CVar_GetS32("gCCMinimapLEPrimG", 0), CVar_GetS32("gCCMinimapLEPrimB", 0), 255); gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, CVar_GetRGB("gCCMinimapLEPrim", LastEntrance_arrow).r,CVar_GetRGB("gCCMinimapLEPrim", LastEntrance_arrow).g,CVar_GetRGB("gCCMinimapLEPrim", LastEntrance_arrow).b, 255);
} else { } else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, 200, 0, 0, 255); gDPSetPrimColor(OVERLAY_DISP++, 0, 0xFF, LastEntrance_arrow.r, LastEntrance_arrow.g, LastEntrance_arrow.b, 255);
} }
gSPDisplayList(OVERLAY_DISP++, gCompassArrowDL); gSPDisplayList(OVERLAY_DISP++, gCompassArrowDL);
} }
@ -713,6 +715,8 @@ void Minimap_Draw(GlobalContext* globalCtx) {
s32 pad[2]; s32 pad[2];
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx; InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
s32 mapIndex = gSaveContext.mapIndex; s32 mapIndex = gSaveContext.mapIndex;
const Color_RGB8 Dungeon_minimap = {100, 255, 255};
const Color_RGB8 Overworld_minimap = {R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), R_MINIMAP_COLOR(2)};
OPEN_DISPS(globalCtx->state.gfxCtx); OPEN_DISPS(globalCtx->state.gfxCtx);
@ -751,9 +755,9 @@ void Minimap_Draw(GlobalContext* globalCtx) {
if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) { if (CHECK_DUNGEON_ITEM(DUNGEON_MAP, mapIndex)) {
if (CVar_GetS32("gHudColors", 1) == 2) { //Dungeon minimap if (CVar_GetS32("gHudColors", 1) == 2) { //Dungeon minimap
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMinimapDGNPrimR", R_MINIMAP_COLOR(0)), CVar_GetS32("gCCMinimapDGNPrimG", R_MINIMAP_COLOR(1)), CVar_GetS32("gCCMinimapDGNPrimB", R_MINIMAP_COLOR(2)), interfaceCtx->minimapAlpha); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMinimapDGNPrim", Dungeon_minimap).r,CVar_GetRGB("gCCMinimapDGNPrim", Dungeon_minimap).g,CVar_GetRGB("gCCMinimapDGNPrim", Dungeon_minimap).b, interfaceCtx->minimapAlpha);
} else { } else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, 100, 255, 255, interfaceCtx->minimapAlpha); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Dungeon_minimap.r, Dungeon_minimap.g, Dungeon_minimap.b, interfaceCtx->minimapAlpha);
} }
gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment); gSPInvalidateTexCache(OVERLAY_DISP++, interfaceCtx->mapSegment);
@ -826,9 +830,9 @@ void Minimap_Draw(GlobalContext* globalCtx) {
gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM); gDPSetCombineMode(OVERLAY_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
if (CVar_GetS32("gHudColors", 1) == 2) {//Overworld minimap if (CVar_GetS32("gHudColors", 1) == 2) {//Overworld minimap
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetS32("gCCMinimapPrimR", R_MINIMAP_COLOR(0)), CVar_GetS32("gCCMinimapPrimG", R_MINIMAP_COLOR(1)), CVar_GetS32("gCCMinimapPrimB", R_MINIMAP_COLOR(2)), interfaceCtx->minimapAlpha); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, CVar_GetRGB("gCCMinimapPrim", Overworld_minimap).r,CVar_GetRGB("gCCMinimapPrim", Overworld_minimap).g,CVar_GetRGB("gCCMinimapPrim", Overworld_minimap).b, interfaceCtx->minimapAlpha);
} else { } else {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), R_MINIMAP_COLOR(2), interfaceCtx->minimapAlpha); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Overworld_minimap.r, Overworld_minimap.g, Overworld_minimap.b, interfaceCtx->minimapAlpha);
} }
gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_IA, gDPLoadTextureBlock_4b(OVERLAY_DISP++, interfaceCtx->mapSegment, G_IM_FMT_IA,
@ -858,7 +862,7 @@ void Minimap_Draw(GlobalContext* globalCtx) {
0, 1 << 10, 1 << 10); 0, 1 << 10, 1 << 10);
if (CVar_GetS32("gHudColors", 1) != 2) {//This need to be added else it will color dungeon entrance icon too. (it re-init prim color to default color) if (CVar_GetS32("gHudColors", 1) != 2) {//This need to be added else it will color dungeon entrance icon too. (it re-init prim color to default color)
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, R_MINIMAP_COLOR(0), R_MINIMAP_COLOR(1), R_MINIMAP_COLOR(2), interfaceCtx->minimapAlpha); gDPSetPrimColor(OVERLAY_DISP++, 0, 0, Overworld_minimap.r, Overworld_minimap.g, Overworld_minimap.b, interfaceCtx->minimapAlpha);
} }
if (((globalCtx->sceneNum != SCENE_SPOT01) && (globalCtx->sceneNum != SCENE_SPOT04) && if (((globalCtx->sceneNum != SCENE_SPOT01) && (globalCtx->sceneNum != SCENE_SPOT04) &&

File diff suppressed because it is too large Load Diff

View File

@ -201,8 +201,8 @@ void GivePlayerRandoRewardSongOfTime(GlobalContext* globalCtx, RandomizerCheck c
if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && if (gSaveContext.entranceIndex == 0x050F && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
!Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) { !Flags_GetTreasure(globalCtx, 0x1F) && gSaveContext.nextTransition == 0xFF) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME);
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
player->pendingFlag.flagID = 0x1F; player->pendingFlag.flagID = 0x1F;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE; player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
} }
@ -216,8 +216,8 @@ void GivePlayerRandoRewardNocturne(GlobalContext* globalCtx, RandomizerCheck che
gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) && gSaveContext.entranceIndex == 0x0195) && LINK_IS_ADULT && CHECK_QUEST_ITEM(QUEST_MEDALLION_FOREST) &&
CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL && CHECK_QUEST_ITEM(QUEST_MEDALLION_FIRE) && CHECK_QUEST_ITEM(QUEST_MEDALLION_WATER) && player != NULL &&
!Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) { !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetEventChkInf(0xAA)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_NOCTURNE_OF_SHADOW); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_NOCTURNE_OF_SHADOW);
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetEventChkInf(0xAA); Flags_SetEventChkInf(0xAA);
} }
} }
@ -228,8 +228,8 @@ void GivePlayerRandoRewardRequiem(GlobalContext* globalCtx, RandomizerCheck chec
if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) { if ((gSaveContext.gameMode == 0) && (gSaveContext.respawnFlag <= 0) && (gSaveContext.cutsceneIndex < 0xFFF0)) {
if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL && if ((gSaveContext.entranceIndex == 0x01E1) && !Flags_GetEventChkInf(0xAC) && player != NULL &&
!Player_InBlockingCsMode(globalCtx, player)) { !Player_InBlockingCsMode(globalCtx, player)) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_SONG_OF_TIME); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_SONG_OF_TIME);
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetEventChkInf(0xAC); Flags_SetEventChkInf(0xAC);
} }
} }
@ -242,21 +242,22 @@ void GivePlayerRandoRewardZeldaLightArrowsGift(GlobalContext* globalCtx, Randomi
(gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) && (gEntranceTable[((void)0, gSaveContext.entranceIndex)].scene == SCENE_TOKINOMA) &&
!Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) && !Flags_GetTreasure(globalCtx, 0x1E) && player != NULL && !Player_InBlockingCsMode(globalCtx, player) &&
globalCtx->sceneLoadFlag == 0) { globalCtx->sceneLoadFlag == 0) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ARROW_LIGHT); GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(check, GI_ARROW_LIGHT);
GiveItemWithoutActor(globalCtx, getItemId); if (player->pendingFlag.flagType == FLAG_NONE && GiveItemEntryWithoutActor(globalCtx, getItem)) {
player->pendingFlag.flagID = 0x1E; player->pendingFlag.flagID = 0x1E;
player->pendingFlag.flagType = FLAG_SCENE_TREASURE; player->pendingFlag.flagType = FLAG_SCENE_TREASURE;
} }
}
} }
void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) { void GivePlayerRandoRewardSariaGift(GlobalContext* globalCtx, RandomizerCheck check) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
if (gSaveContext.entranceIndex == 0x05E0) { if (gSaveContext.entranceIndex == 0x05E0) {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(check, GI_ZELDAS_LULLABY); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(check, RG_ZELDAS_LULLABY);
if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemId && getItemId != GI_ICE_TRAP)) && if ((!Flags_GetEventChkInf(0xC1) || (player->getItemId == getItemEntry.getItemId && getItemEntry.getItemId != GI_ICE_TRAP)) &&
player != NULL && !Player_InBlockingCsMode(globalCtx, player)) { player != NULL && !Player_InBlockingCsMode(globalCtx, player)) {
GiveItemWithoutActor(globalCtx, getItemId); GiveItemEntryWithoutActor(globalCtx, getItemEntry);
Flags_SetEventChkInf(0xC1); Flags_SetEventChkInf(0xC1);
} }
} }
@ -414,6 +415,13 @@ void Gameplay_Init(GameState* thisx) {
PreRender_SetValues(&globalCtx->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0); PreRender_SetValues(&globalCtx->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0);
gTrnsnUnkState = 0; gTrnsnUnkState = 0;
globalCtx->transitionMode = 0; globalCtx->transitionMode = 0;
if (CVar_GetS32("gSceneTransitions", 255)!= 255){
globalCtx->transitionMode = CVar_GetS32("gSceneTransitions", 0);
gSaveContext.nextTransition = CVar_GetS32("gSceneTransitions", 0);
globalCtx->fadeTransition = CVar_GetS32("gSceneTransitions", 0);
}
FrameAdvance_Init(&globalCtx->frameAdvCtx); FrameAdvance_Init(&globalCtx->frameAdvCtx);
Rand_Seed((u32)osGetTime()); Rand_Seed((u32)osGetTime());
Matrix_Init(&globalCtx->state); Matrix_Init(&globalCtx->state);

View File

@ -1170,7 +1170,13 @@ void Player_DrawGetItemImpl(GlobalContext* globalCtx, Player* this, Vec3f* refPo
Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY); Matrix_RotateZYX(0, globalCtx->gameplayFrames * 1000, 0, MTXMODE_APPLY);
Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY); Matrix_Scale(0.2f, 0.2f, 0.2f, MTXMODE_APPLY);
// RANDOTODO: Make this more flexible for easier toggling of individual item recolors in the future.
if (this->getItemEntry.drawFunc != NULL &&
(CVar_GetS32("gRandoMatchKeyColors", 0) || this->getItemEntry.getItemId == RG_DOUBLE_DEFENSE)) {
this->getItemEntry.drawFunc(globalCtx, &this->getItemEntry);
} else {
GetItem_Draw(globalCtx, drawIdPlusOne - 1); GetItem_Draw(globalCtx, drawIdPlusOne - 1);
}
CLOSE_DISPS(globalCtx->state.gfxCtx); CLOSE_DISPS(globalCtx->state.gfxCtx);
} }

View File

@ -2,6 +2,8 @@
#include "vt.h" #include "vt.h"
#include <string.h> #include <string.h>
#include <soh/Enhancements/randomizer/randomizerTypes.h>
#include <soh/Enhancements/randomizer/randomizer_inf.h>
#define NUM_DUNGEONS 8 #define NUM_DUNGEONS 8
#define NUM_TRIALS 6 #define NUM_TRIALS 6
@ -307,11 +309,11 @@ void GiveLinkDekuNutUpgrade(GetItemID giid) {
} }
void GiveLinkMagic(GetItemID giid) { void GiveLinkMagic(GetItemID giid) {
if (giid == GI_SINGLE_MAGIC) { if (giid == RG_MAGIC_SINGLE) {
gSaveContext.magicLevel = 1; gSaveContext.magicLevel = 1;
gSaveContext.magicAcquired = true; gSaveContext.magicAcquired = true;
gSaveContext.doubleMagic = false; gSaveContext.doubleMagic = false;
} else if (giid == GI_DOUBLE_MAGIC) { } else if (giid == RG_MAGIC_DOUBLE) {
gSaveContext.magicLevel = 2; gSaveContext.magicLevel = 2;
gSaveContext.magicAcquired = true; gSaveContext.magicAcquired = true;
gSaveContext.doubleMagic = true; gSaveContext.doubleMagic = true;
@ -327,40 +329,40 @@ void GiveLinkSong(GetItemID getItemId) {
uint32_t bitMask; uint32_t bitMask;
switch (getItemId) { switch (getItemId) {
case GI_ZELDAS_LULLABY: case RG_ZELDAS_LULLABY:
bitMask = 1 << QUEST_SONG_LULLABY; bitMask = 1 << QUEST_SONG_LULLABY;
break; break;
case GI_SUNS_SONG: case RG_SUNS_SONG:
bitMask = 1 << QUEST_SONG_SUN; bitMask = 1 << QUEST_SONG_SUN;
break; break;
case GI_EPONAS_SONG: case RG_EPONAS_SONG:
bitMask = 1 << QUEST_SONG_EPONA; bitMask = 1 << QUEST_SONG_EPONA;
break; break;
case GI_SONG_OF_STORMS: case RG_SONG_OF_STORMS:
bitMask = 1 << QUEST_SONG_STORMS; bitMask = 1 << QUEST_SONG_STORMS;
break; break;
case GI_SONG_OF_TIME: case RG_SONG_OF_TIME:
bitMask = 1 << QUEST_SONG_TIME; bitMask = 1 << QUEST_SONG_TIME;
break; break;
case GI_SARIAS_SONG: case RG_SARIAS_SONG:
bitMask = 1 << QUEST_SONG_SARIA; bitMask = 1 << QUEST_SONG_SARIA;
break; break;
case GI_MINUET_OF_FOREST: case RG_MINUET_OF_FOREST:
bitMask = 1 << QUEST_SONG_MINUET; bitMask = 1 << QUEST_SONG_MINUET;
break; break;
case GI_BOLERO_OF_FIRE: case RG_BOLERO_OF_FIRE:
bitMask = 1 << QUEST_SONG_BOLERO; bitMask = 1 << QUEST_SONG_BOLERO;
break; break;
case GI_SERENADE_OF_WATER: case RG_SERENADE_OF_WATER:
bitMask = 1 << QUEST_SONG_SERENADE; bitMask = 1 << QUEST_SONG_SERENADE;
break; break;
case GI_NOCTURNE_OF_SHADOW: case RG_NOCTURNE_OF_SHADOW:
bitMask = 1 << QUEST_SONG_NOCTURNE; bitMask = 1 << QUEST_SONG_NOCTURNE;
break; break;
case GI_REQUIEM_OF_SPIRIT: case RG_REQUIEM_OF_SPIRIT:
bitMask = 1 << QUEST_SONG_REQUIEM; bitMask = 1 << QUEST_SONG_REQUIEM;
break; break;
case GI_PRELUDE_OF_LIGHT: case RG_PRELUDE_OF_LIGHT:
bitMask = 1 << QUEST_SONG_PRELUDE; bitMask = 1 << QUEST_SONG_PRELUDE;
break; break;
} }
@ -368,43 +370,43 @@ void GiveLinkSong(GetItemID getItemId) {
gSaveContext.inventory.questItems |= bitMask; gSaveContext.inventory.questItems |= bitMask;
} }
void GiveLinkDungeonReward(GetItemID getItemId) { void GiveLinkDungeonReward(uint16_t getItemId) {
s16 item; s16 item;
u8 medallion = 0; u8 medallion = 0;
switch (getItemId) { switch (getItemId) {
case GI_MEDALLION_FOREST: case RG_FOREST_MEDALLION:
item = ITEM_MEDALLION_FOREST; item = ITEM_MEDALLION_FOREST;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_FIRE: case RG_FIRE_MEDALLION:
item = ITEM_MEDALLION_FIRE; item = ITEM_MEDALLION_FIRE;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_WATER: case RG_WATER_MEDALLION:
item = ITEM_MEDALLION_WATER; item = ITEM_MEDALLION_WATER;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_SHADOW: case RG_SHADOW_MEDALLION:
item = ITEM_MEDALLION_SHADOW; item = ITEM_MEDALLION_SHADOW;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_SPIRIT: case RG_SPIRIT_MEDALLION:
item = ITEM_MEDALLION_SPIRIT; item = ITEM_MEDALLION_SPIRIT;
medallion = 1; medallion = 1;
break; break;
case GI_MEDALLION_LIGHT: case RG_LIGHT_MEDALLION:
item = ITEM_MEDALLION_LIGHT; item = ITEM_MEDALLION_LIGHT;
medallion = 1; medallion = 1;
break; break;
case GI_STONE_KOKIRI: case RG_KOKIRI_EMERALD:
item = ITEM_KOKIRI_EMERALD; item = ITEM_KOKIRI_EMERALD;
break; break;
case GI_STONE_GORON: case RG_GORON_RUBY:
item = ITEM_GORON_RUBY; item = ITEM_GORON_RUBY;
break; break;
case GI_STONE_ZORA: case RG_ZORA_SAPPHIRE:
item = ITEM_ZORA_SAPPHIRE; item = ITEM_ZORA_SAPPHIRE;
break; break;
} }
@ -420,72 +422,72 @@ void GiveLinkDungeonItem(GetItemID getItemId) {
int mapIndex; int mapIndex;
switch (getItemId) { switch (getItemId) {
case GI_DEKU_TREE_MAP: case RG_DEKU_TREE_MAP:
case GI_DEKU_TREE_COMPASS: case RG_DEKU_TREE_COMPASS:
mapIndex = SCENE_YDAN; mapIndex = SCENE_YDAN;
break; break;
case GI_DODONGOS_CAVERN_MAP: case RG_DODONGOS_CAVERN_MAP:
case GI_DODONGOS_CAVERN_COMPASS: case RG_DODONGOS_CAVERN_COMPASS:
mapIndex = SCENE_DDAN; mapIndex = SCENE_DDAN;
break; break;
case GI_JABU_JABUS_BELLY_MAP: case RG_JABU_JABUS_BELLY_MAP:
case GI_JABU_JABUS_BELLY_COMPASS: case RG_JABU_JABUS_BELLY_COMPASS:
mapIndex = SCENE_BDAN; mapIndex = SCENE_BDAN;
break; break;
case GI_FOREST_TEMPLE_MAP: case RG_FOREST_TEMPLE_MAP:
case GI_FOREST_TEMPLE_COMPASS: case RG_FOREST_TEMPLE_COMPASS:
case GI_FOREST_TEMPLE_SMALL_KEY: case RG_FOREST_TEMPLE_SMALL_KEY:
case GI_FOREST_TEMPLE_BOSS_KEY: case RG_FOREST_TEMPLE_BOSS_KEY:
mapIndex = SCENE_BMORI1; mapIndex = SCENE_BMORI1;
break; break;
case GI_FIRE_TEMPLE_MAP: case RG_FIRE_TEMPLE_MAP:
case GI_FIRE_TEMPLE_COMPASS: case RG_FIRE_TEMPLE_COMPASS:
case GI_FIRE_TEMPLE_SMALL_KEY: case RG_FIRE_TEMPLE_SMALL_KEY:
case GI_FIRE_TEMPLE_BOSS_KEY: case RG_FIRE_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HIDAN; mapIndex = SCENE_HIDAN;
break; break;
case GI_WATER_TEMPLE_MAP: case RG_WATER_TEMPLE_MAP:
case GI_WATER_TEMPLE_COMPASS: case RG_WATER_TEMPLE_COMPASS:
case GI_WATER_TEMPLE_SMALL_KEY: case RG_WATER_TEMPLE_SMALL_KEY:
case GI_WATER_TEMPLE_BOSS_KEY: case RG_WATER_TEMPLE_BOSS_KEY:
mapIndex = SCENE_MIZUSIN; mapIndex = SCENE_MIZUSIN;
break; break;
case GI_SPIRIT_TEMPLE_MAP: case RG_SPIRIT_TEMPLE_MAP:
case GI_SPIRIT_TEMPLE_COMPASS: case RG_SPIRIT_TEMPLE_COMPASS:
case GI_SPIRIT_TEMPLE_SMALL_KEY: case RG_SPIRIT_TEMPLE_SMALL_KEY:
case GI_SPIRIT_TEMPLE_BOSS_KEY: case RG_SPIRIT_TEMPLE_BOSS_KEY:
mapIndex = SCENE_JYASINZOU; mapIndex = SCENE_JYASINZOU;
break; break;
case GI_SHADOW_TEMPLE_MAP: case RG_SHADOW_TEMPLE_MAP:
case GI_SHADOW_TEMPLE_COMPASS: case RG_SHADOW_TEMPLE_COMPASS:
case GI_SHADOW_TEMPLE_SMALL_KEY: case RG_SHADOW_TEMPLE_SMALL_KEY:
case GI_SHADOW_TEMPLE_BOSS_KEY: case RG_SHADOW_TEMPLE_BOSS_KEY:
mapIndex = SCENE_HAKADAN; mapIndex = SCENE_HAKADAN;
break; break;
case GI_BOTTOM_OF_THE_WELL_MAP: case RG_BOTTOM_OF_THE_WELL_MAP:
case GI_BOTTOM_OF_THE_WELL_COMPASS: case RG_BOTTOM_OF_THE_WELL_COMPASS:
case GI_BOTTOM_OF_THE_WELL_SMALL_KEY: case RG_BOTTOM_OF_THE_WELL_SMALL_KEY:
mapIndex = SCENE_HAKADANCH; mapIndex = SCENE_HAKADANCH;
break; break;
case GI_ICE_CAVERN_MAP: case RG_ICE_CAVERN_MAP:
case GI_ICE_CAVERN_COMPASS: case RG_ICE_CAVERN_COMPASS:
mapIndex = SCENE_ICE_DOUKUTO; mapIndex = SCENE_ICE_DOUKUTO;
break; break;
case GI_GANONS_CASTLE_BOSS_KEY: case RG_GANONS_CASTLE_BOSS_KEY:
mapIndex = SCENE_GANON; mapIndex = SCENE_GANON;
break; break;
case GI_GERUDO_TRAINING_GROUNDS_SMALL_KEY: case RG_GERUDO_TRAINING_GROUNDS_SMALL_KEY:
mapIndex = SCENE_MEN; mapIndex = SCENE_MEN;
break; break;
case GI_GERUDO_FORTRESS_SMALL_KEY: case RG_GERUDO_FORTRESS_SMALL_KEY:
mapIndex = SCENE_GERUDOWAY; mapIndex = SCENE_GERUDOWAY;
break; break;
case GI_GANONS_CASTLE_SMALL_KEY: case RG_GANONS_CASTLE_SMALL_KEY:
mapIndex = SCENE_GANONTIKA; mapIndex = SCENE_GANONTIKA;
break; break;
} }
if ((getItemId >= GI_GERUDO_FORTRESS_SMALL_KEY) && (getItemId <= GI_GANONS_CASTLE_SMALL_KEY)) { if ((getItemId >= RG_GERUDO_FORTRESS_SMALL_KEY) && (getItemId <= RG_GANONS_CASTLE_SMALL_KEY)) {
if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) { if (gSaveContext.inventory.dungeonKeys[mapIndex] < 0) {
gSaveContext.inventory.dungeonKeys[mapIndex] = 1; gSaveContext.inventory.dungeonKeys[mapIndex] = 1;
} else { } else {
@ -493,9 +495,9 @@ void GiveLinkDungeonItem(GetItemID getItemId) {
} }
} else { } else {
int bitmask; int bitmask;
if ((getItemId >= GI_DEKU_TREE_MAP) && (getItemId <= GI_ICE_CAVERN_MAP)) { if ((getItemId >= RG_DEKU_TREE_MAP) && (getItemId <= RG_ICE_CAVERN_MAP)) {
bitmask = gBitFlags[2]; bitmask = gBitFlags[2];
} else if ((getItemId >= GI_DEKU_TREE_COMPASS) && (getItemId <= GI_ICE_CAVERN_COMPASS)) { } else if ((getItemId >= RG_DEKU_TREE_COMPASS) && (getItemId <= RG_ICE_CAVERN_COMPASS)) {
bitmask = gBitFlags[1]; bitmask = gBitFlags[1];
} else { } else {
bitmask = gBitFlags[0]; bitmask = gBitFlags[0];
@ -506,9 +508,9 @@ void GiveLinkDungeonItem(GetItemID getItemId) {
} }
void GiveLinksPocketMedallion() { void GiveLinksPocketMedallion() {
GetItemID getItemId = Randomizer_GetItemIdFromKnownCheck(RC_LINKS_POCKET, RG_NONE); GetItemEntry getItemEntry = Randomizer_GetItemFromKnownCheck(RC_LINKS_POCKET, RG_NONE);
GiveLinkDungeonReward(getItemId); GiveLinkDungeonReward(getItemEntry.getItemId);
} }
/** /**
@ -701,19 +703,9 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
fileChooseCtx->n64ddFlag = 1; fileChooseCtx->n64ddFlag = 1;
gSaveContext.n64ddFlag = 1; gSaveContext.n64ddFlag = 1;
// Sets all the dungeons to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/82 // Sets all rando flags to false
for (u8 i = 0; i < NUM_DUNGEONS; i++) { for (s32 i = 0; i < ARRAY_COUNT(gSaveContext.randomizerInf); i++) {
gSaveContext.dungeonsDone[i] = 0; gSaveContext.randomizerInf[i] = 0;
}
// Sets all Ganon's Trials to incomplete when generating a rando save. Fixes https://github.com/briaguya-ai/rando-issue-tracker/issues/131
for (u8 i = 0; i < NUM_TRIALS; i++) {
gSaveContext.trialsDone[i] = 0;
}
// Sets all cows to unmilked when generating a rando save.
for (u8 i = 0; i < NUM_COWS; i++) {
gSaveContext.cowsMilked[i] = 0;
} }
// Set Cutscene flags to skip them // Set Cutscene flags to skip them
@ -795,31 +787,23 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
} }
if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) { if(Randomizer_GetSettingValue(RSK_SKIP_CHILD_ZELDA)) {
s32 giid = Randomizer_GetItemIdFromKnownCheck(RC_SONG_FROM_IMPA, GI_ZELDAS_LULLABY); GetItemEntry getItem = Randomizer_GetItemFromKnownCheck(RC_SONG_FROM_IMPA, RG_ZELDAS_LULLABY);
s32 giid = getItem.getItemId;
if(giid >= GI_ZELDAS_LULLABY && giid <= GI_PRELUDE_OF_LIGHT) { if (getItem.modIndex == MOD_NONE) {
GiveLinkSong(giid); if(getItem.itemId >= ITEM_KOKIRI_EMERALD && getItem.itemId <= ITEM_MEDALLION_LIGHT) {
} else if (giid == GI_RUPEE_GREEN || GiveLinkDungeonReward(getItem.getItemId);
giid == GI_RUPEE_BLUE || } else if (giid == GI_RUPEE_GREEN || giid == GI_RUPEE_BLUE || giid == GI_RUPEE_RED ||
giid == GI_RUPEE_RED || giid == GI_RUPEE_PURPLE || giid == GI_RUPEE_GOLD) {
giid == GI_RUPEE_PURPLE ||
giid == GI_RUPEE_GOLD) {
GiveLinkRupeesByGetItemId(giid); GiveLinkRupeesByGetItemId(giid);
} else if (giid == GI_BOMBCHUS_10 || } else if (giid == GI_BOMBCHUS_10 || giid == GI_BOMBCHUS_5 || giid == GI_BOMBCHUS_20) {
giid == GI_BOMBCHUS_5 ||
giid == GI_BOMBCHUS_20) {
GiveLinkBombchus(giid); GiveLinkBombchus(giid);
} else if (giid == GI_STICKS_1 || } else if (giid == GI_STICKS_1 || giid == GI_STICKS_5 || giid == GI_STICKS_10) {
giid == GI_STICKS_5 ||
giid == GI_STICKS_10) {
GiveLinkDekuSticksByGetItemId(giid); GiveLinkDekuSticksByGetItemId(giid);
} else if (giid == GI_NUTS_5 || } else if (giid == GI_NUTS_5 || giid == GI_NUTS_10) {
giid == GI_NUTS_10) {
GiveLinkDekuNutsByGetItemId(giid); GiveLinkDekuNutsByGetItemId(giid);
} else if (giid == GI_BEAN) { } else if (giid == GI_BEAN) {
GiveLinkBeans(); GiveLinkBeans();
} else if (giid >= GI_MEDALLION_LIGHT && giid <= GI_STONE_ZORA) {
GiveLinkDungeonReward(giid);
} else if (giid == GI_SWORD_KOKIRI) { } else if (giid == GI_SWORD_KOKIRI) {
GiveLinkKokiriSword(); GiveLinkKokiriSword();
} else if (giid == GI_SWORD_BGS) { } else if (giid == GI_SWORD_BGS) {
@ -840,27 +824,17 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
GiveLinkIronBoots(); GiveLinkIronBoots();
} else if (giid == GI_BOOTS_HOVER) { } else if (giid == GI_BOOTS_HOVER) {
GiveLinkHoverBoots(); GiveLinkHoverBoots();
} else if (giid == GI_SLINGSHOT || } else if (giid == GI_SLINGSHOT || giid == GI_BULLET_BAG_40 || giid == GI_BULLET_BAG_50) {
giid == GI_BULLET_BAG_40 ||
giid == GI_BULLET_BAG_50) {
GiveLinkBulletBagUpgrade(giid); GiveLinkBulletBagUpgrade(giid);
} else if (giid == GI_BOW || } else if (giid == GI_BOW || giid == GI_QUIVER_40 || giid == GI_QUIVER_50) {
giid == GI_QUIVER_40 ||
giid == GI_QUIVER_50) {
GiveLinkQuiverUpgrade(giid); GiveLinkQuiverUpgrade(giid);
} else if (giid == GI_BOMB_BAG_20 || } else if (giid == GI_BOMB_BAG_20 || giid == GI_BOMB_BAG_30 || giid == GI_BOMB_BAG_40) {
giid == GI_BOMB_BAG_30 ||
giid == GI_BOMB_BAG_40) {
GiveLinkBombBagUpgrade(giid); GiveLinkBombBagUpgrade(giid);
} else if (giid == GI_BRACELET || } else if (giid == GI_BRACELET || giid == GI_GAUNTLETS_SILVER || giid == GI_GAUNTLETS_GOLD) {
giid == GI_GAUNTLETS_SILVER ||
giid == GI_GAUNTLETS_GOLD) {
GiveLinkStrengthUpgrade(giid); GiveLinkStrengthUpgrade(giid);
} else if (giid == GI_SCALE_SILVER || } else if (giid == GI_SCALE_SILVER || giid == GI_SCALE_GOLD) {
giid == GI_SCALE_GOLD) {
GiveLinkScaleUpgrade(giid); GiveLinkScaleUpgrade(giid);
} else if (giid == GI_WALLET_ADULT || } else if (giid == GI_WALLET_ADULT || giid == GI_WALLET_GIANT) {
giid == GI_WALLET_GIANT) {
GiveLinkWalletUpgrade(giid); GiveLinkWalletUpgrade(giid);
} else if (giid == GI_STONE_OF_AGONY) { } else if (giid == GI_STONE_OF_AGONY) {
GiveLinkStoneOfAgony(); GiveLinkStoneOfAgony();
@ -870,28 +844,17 @@ void Sram_InitSave(FileChooseContext* fileChooseCtx) {
GiveLinkPieceOfHeart(); GiveLinkPieceOfHeart();
} else if (giid == GI_HEART_CONTAINER) { } else if (giid == GI_HEART_CONTAINER) {
GiveLinkHeartContainer(); GiveLinkHeartContainer();
} else if (giid == GI_STICK_UPGRADE_20 || } else if (giid == GI_STICK_UPGRADE_20 || giid == GI_STICK_UPGRADE_30) {
giid == GI_STICK_UPGRADE_30) {
GiveLinkDekuStickUpgrade(giid); GiveLinkDekuStickUpgrade(giid);
} else if (giid == GI_NUT_UPGRADE_30 || } else if (giid == GI_NUT_UPGRADE_30 || giid == GI_NUT_UPGRADE_40) {
giid == GI_NUT_UPGRADE_40) {
GiveLinkDekuNutUpgrade(giid); GiveLinkDekuNutUpgrade(giid);
} else if (giid == GI_SINGLE_MAGIC ||
giid == GI_DOUBLE_MAGIC) {
GiveLinkMagic(giid);
} else if (giid == GI_DOUBLE_DEFENSE) {
GiveLinkDoubleDefense();
} else if (
(giid >= GI_GERUDO_FORTRESS_SMALL_KEY && giid <= GI_GANONS_CASTLE_SMALL_KEY) ||
(giid >= GI_FOREST_TEMPLE_BOSS_KEY && giid <= GI_GANONS_CASTLE_BOSS_KEY) ||
(giid >= GI_DEKU_TREE_MAP && giid <= GI_ICE_CAVERN_MAP) ||
(giid >= GI_DEKU_TREE_COMPASS && giid <= GI_ICE_CAVERN_COMPASS)
) {
GiveLinkDungeonItem(giid);
} else { } else {
s32 iid = Randomizer_GetItemIDFromGetItemID(giid); s32 iid = getItem.itemId;
if (iid != -1) INV_CONTENT(iid) = iid; if (iid != -1) INV_CONTENT(iid) = iid;
} }
} else if (getItem.modIndex == MOD_RANDOMIZER) {
Randomizer_Item_Give(NULL, getItem);
}
// malon/talon back at ranch // malon/talon back at ranch
gSaveContext.eventChkInf[1] |= (1 << 0); gSaveContext.eventChkInf[1] |= (1 << 0);

View File

@ -194,6 +194,10 @@ void ArrowFire_Draw(Actor* thisx, GlobalContext* globalCtx2) {
u32 stateFrames; u32 stateFrames;
EnArrow* arrow; EnArrow* arrow;
Actor* tranform; Actor* tranform;
Color_RGB8 Arrow_env_ori = {255,0,0};
Color_RGB8 Arrow_col_ori = {255,200,0};
Color_RGB8 Arrow_env = CVar_GetRGB("gFireArrowColEnv", Arrow_env_ori);
Color_RGB8 Arrow_col = CVar_GetRGB("gFireArrowCol", Arrow_col_ori);
stateFrames = globalCtx->state.frames; stateFrames = globalCtx->state.frames;
arrow = (EnArrow*)this->actor.parent; arrow = (EnArrow*)this->actor.parent;
@ -214,9 +218,9 @@ void ArrowFire_Draw(Actor* thisx, GlobalContext* globalCtx2) {
POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP);
if (CVar_GetS32("gUseArrowsCol", 0)) { if (CVar_GetS32("gUseArrowsCol", 0)) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, gDPSetPrimColor(POLY_XLU_DISP++, 0, 0,
(s32)(CVar_GetS32("gFireArrowColEnvR", 40) * this->unk_15C) & 0xFF, (s32)(Arrow_env.r * this->unk_15C) & 0xFF,
(s32)(CVar_GetS32("gFireArrowColEnvG", 0) * this->unk_15C) & 0xFF, (s32)(Arrow_env.g * this->unk_15C) & 0xFF,
(s32)(CVar_GetS32("gFireArrowColEnvB", 0) * this->unk_15C) & 0xFF, (s32)(Arrow_env.b * this->unk_15C) & 0xFF,
(s32)(30.0f * this->unk_15C) & 0xFF); //Intentionnally made Alpha lower. (s32)(30.0f * this->unk_15C) & 0xFF); //Intentionnally made Alpha lower.
} else { } else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(40.0f * this->unk_15C) & 0xFF, 0, 0, gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(40.0f * this->unk_15C) & 0xFF, 0, 0,
@ -230,11 +234,11 @@ void ArrowFire_Draw(Actor* thisx, GlobalContext* globalCtx2) {
// Draw fire on the arrow // Draw fire on the arrow
func_80093D84(globalCtx->state.gfxCtx); func_80093D84(globalCtx->state.gfxCtx);
if (CVar_GetS32("gUseArrowsCol", 0)) { if (CVar_GetS32("gUseArrowsCol", 0)) {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, CVar_GetS32("gFireArrowColR", 255), CVar_GetS32("gFireArrowColG", 200), CVar_GetS32("gFireArrowColB", 0), this->alpha); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col.r, Arrow_col.g, Arrow_col.b, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gFireArrowColEnvR", 255), CVar_GetS32("gFireArrowColEnvG", 0), CVar_GetS32("gFireArrowColEnvB", 0), 128); gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env.r, Arrow_env.g, Arrow_env.b, 128);
} else { } else {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 200, 0, this->alpha); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col_ori.r, Arrow_col_ori.g, Arrow_col_ori.b, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 128); gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env_ori.r, Arrow_env_ori.g, Arrow_env_ori.b, 128);
} }
Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY); Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY);
if (this->timer != 0) { if (this->timer != 0) {

View File

@ -195,6 +195,10 @@ void ArrowIce_Draw(Actor* thisx, GlobalContext* globalCtx) {
Actor* tranform; Actor* tranform;
u32 stateFrames = globalCtx->state.frames; u32 stateFrames = globalCtx->state.frames;
EnArrow* arrow = (EnArrow*)this->actor.parent; EnArrow* arrow = (EnArrow*)this->actor.parent;
Color_RGB8 Arrow_env_ori = {0,0,255};
Color_RGB8 Arrow_col_ori = {170, 255, 255};
Color_RGB8 Arrow_env = CVar_GetRGB("gIceArrowColEnv", Arrow_env_ori);
Color_RGB8 Arrow_col = CVar_GetRGB("gIceArrowCol", Arrow_col_ori);
if ((arrow != NULL) && (arrow->actor.update != NULL) && (this->timer < 255)) { if ((arrow != NULL) && (arrow->actor.update != NULL) && (this->timer < 255)) {
tranform = (arrow->hitFlags & 2) ? &this->actor : &arrow->actor; tranform = (arrow->hitFlags & 2) ? &this->actor : &arrow->actor;
@ -212,9 +216,9 @@ void ArrowIce_Draw(Actor* thisx, GlobalContext* globalCtx) {
POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP);
if (CVar_GetS32("gUseArrowsCol", 0)) { if (CVar_GetS32("gUseArrowsCol", 0)) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, gDPSetPrimColor(POLY_XLU_DISP++, 0, 0,
(s32)(CVar_GetS32("gIceArrowColEnvR", 0) * this->unk_164) & 0xFF, (s32)(Arrow_env.r * this->unk_164) & 0xFF,
(s32)(CVar_GetS32("gIceArrowColEnvG", 10) * this->unk_164) & 0xFF, (s32)(Arrow_env.g * this->unk_164) & 0xFF,
(s32)(CVar_GetS32("gIceArrowColEnvB", 50) * this->unk_164) & 0xFF, (s32)(Arrow_env.b * this->unk_164) & 0xFF,
(s32)(30.0f * this->unk_164) & 0xFF); //Intentionnally made Alpha lower. (s32)(30.0f * this->unk_164) & 0xFF); //Intentionnally made Alpha lower.
} else { } else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(10.0f * this->unk_164) & 0xFF, gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(10.0f * this->unk_164) & 0xFF,
@ -228,11 +232,11 @@ void ArrowIce_Draw(Actor* thisx, GlobalContext* globalCtx) {
// Draw ice on the arrow // Draw ice on the arrow
func_80093D84(globalCtx->state.gfxCtx); func_80093D84(globalCtx->state.gfxCtx);
if (CVar_GetS32("gUseArrowsCol", 0)) { if (CVar_GetS32("gUseArrowsCol", 0)) {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, CVar_GetS32("gIceArrowColR", 170), CVar_GetS32("gIceArrowColG", 255), CVar_GetS32("gIceArrowColB", 255), this->alpha); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col.r, Arrow_col.g, Arrow_col.b, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gIceArrowColEnvR", 0), CVar_GetS32("gIceArrowColEnvG", 0), CVar_GetS32("gIceArrowColEnvB", 255), 128); gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env.r, Arrow_env.g, Arrow_env.b, 128);
} else { } else {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 170, 255, 255, this->alpha); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col_ori.r, Arrow_col_ori.g, Arrow_col_ori.b, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 255, 128); gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env_ori.r, Arrow_env_ori.g, Arrow_env_ori.b, 128);
} }
Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY); Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY);
if (this->timer != 0) { if (this->timer != 0) {

View File

@ -193,6 +193,10 @@ void ArrowLight_Draw(Actor* thisx, GlobalContext* globalCtx) {
u32 stateFrames = globalCtx->state.frames; u32 stateFrames = globalCtx->state.frames;
EnArrow* arrow = (EnArrow*)this->actor.parent; EnArrow* arrow = (EnArrow*)this->actor.parent;
Actor* tranform; Actor* tranform;
Color_RGB8 Arrow_env_ori = {255, 255, 0};
Color_RGB8 Arrow_col_ori = {255, 255, 170};
Color_RGB8 Arrow_env = CVar_GetRGB("gLightArrowColEnv", Arrow_env_ori);
Color_RGB8 Arrow_col = CVar_GetRGB("gLightArrowCol", Arrow_col_ori);
if ((arrow != NULL) && (arrow->actor.update != NULL) && (this->timer < 255)) { if ((arrow != NULL) && (arrow->actor.update != NULL) && (this->timer < 255)) {
tranform = (arrow->hitFlags & 2) ? &this->actor : &arrow->actor; tranform = (arrow->hitFlags & 2) ? &this->actor : &arrow->actor;
@ -210,9 +214,9 @@ void ArrowLight_Draw(Actor* thisx, GlobalContext* globalCtx) {
POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP); POLY_XLU_DISP = func_800937C0(POLY_XLU_DISP);
if (CVar_GetS32("gUseArrowsCol", 0)) { if (CVar_GetS32("gUseArrowsCol", 0)) {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, gDPSetPrimColor(POLY_XLU_DISP++, 0, 0,
(s32)(CVar_GetS32("gLightArrowColEnvR", 30) * this->unk_164) & 0xFF, (s32)(Arrow_env.r * this->unk_164) & 0xFF,
(s32)(CVar_GetS32("gLightArrowColEnvG", 40) * this->unk_164) & 0xFF, (s32)(Arrow_env.g * this->unk_164) & 0xFF,
(s32)(CVar_GetS32("gLightArrowColEnvB", 0) * this->unk_164) & 0xFF, (s32)(Arrow_env.b * this->unk_164) & 0xFF,
(s32)(30.0f * this->unk_164) & 0xFF); //Intentionnally made Alpha lower. (s32)(30.0f * this->unk_164) & 0xFF); //Intentionnally made Alpha lower.
} else { } else {
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(30.0f * this->unk_164) & 0xFF, gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, (s32)(30.0f * this->unk_164) & 0xFF,
@ -226,11 +230,11 @@ void ArrowLight_Draw(Actor* thisx, GlobalContext* globalCtx) {
// Draw light on the arrow // Draw light on the arrow
func_80093D84(globalCtx->state.gfxCtx); func_80093D84(globalCtx->state.gfxCtx);
if (CVar_GetS32("gUseArrowsCol", 0)) { if (CVar_GetS32("gUseArrowsCol", 0)) {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, CVar_GetS32("gLightArrowColR", 255), CVar_GetS32("gLightArrowColG", 255), CVar_GetS32("gLightArrowColB", 170), this->alpha); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col.r, Arrow_col.g, Arrow_col.b, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, CVar_GetS32("gLightArrowColEnvR", 255), CVar_GetS32("gLightArrowColEnvG", 255), CVar_GetS32("gLightArrowColEnvB", 0), 128); gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env.r, Arrow_env.g, Arrow_env.b, 128);
} else { } else {
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 170, this->alpha); gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, Arrow_col_ori.r, Arrow_col_ori.g, Arrow_col_ori.b, this->alpha);
gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 128); gDPSetEnvColor(POLY_XLU_DISP++, Arrow_env_ori.r, Arrow_env_ori.g, Arrow_env_ori.b, 128);
} }
Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY); Matrix_RotateZYX(0x4000, 0x0, 0x0, MTXMODE_APPLY);
if (this->timer != 0) { if (this->timer != 0) {

View File

@ -70,14 +70,14 @@ const ActorInit Bg_Dy_Yoseizo_InitVars = {
void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) { void GivePlayerRandoRewardGreatFairy(BgDyYoseizo* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx); Player* player = GET_PLAYER(globalCtx);
GetItemID getItemId = Randomizer_GetRandomizedItemId(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum); GetItemEntry getItemEntry = Randomizer_GetRandomizedItem(GI_NONE, this->actor.id, this->fountainType + 1, globalCtx->sceneNum);
if (this->actor.parent == GET_PLAYER(globalCtx) && !Flags_GetTreasure(globalCtx, this->fountainType + 1) && if (this->actor.parent == GET_PLAYER(globalCtx) && !Flags_GetTreasure(globalCtx, this->fountainType + 1) &&
!Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) { !Player_InBlockingCsMode(globalCtx, GET_PLAYER(globalCtx))) {
Flags_SetTreasure(globalCtx, this->fountainType + 1); Flags_SetTreasure(globalCtx, this->fountainType + 1);
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
} else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) { } else if (!Flags_GetTreasure(globalCtx, this->fountainType + 1)) {
func_8002F434(&this->actor, globalCtx, getItemId, 10000.0f, 100.0f); GiveItemEntryFromActor(&this->actor, globalCtx, getItemEntry, 10000.0f, 100.0f);
} }
} }

View File

@ -132,35 +132,35 @@ u8 CheckMedallionCount() {
u8 CheckDungeonCount() { u8 CheckDungeonCount() {
u8 dungeonCount = 0; u8 dungeonCount = 0;
if (gSaveContext.dungeonsDone[0] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DEKU_TREE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[1] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_DODONGOS_CAVERN)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[2] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_JABU_JABUS_BELLY)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[3] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FOREST_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[4] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_FIRE_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[5] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_WATER_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[6] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SPIRIT_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }
if (gSaveContext.dungeonsDone[7] == 1) { if (Flags_GetRandomizerInf(RAND_INF_DUNGEONS_DONE_SHADOW_TEMPLE)) {
dungeonCount++; dungeonCount++;
} }

Some files were not shown because too many files have changed in this diff Show More