mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-11-16 14:35:06 -05:00
Merge branch 'rando-next' into bombchu-logic
This commit is contained in:
commit
ad33aba9ba
@ -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
|
||||||
|
@ -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
2
Jenkinsfile
vendored
@ -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'
|
||||||
|
37
README.md
37
README.md
@ -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
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
|
||||||
|
|
||||||
struct Vec3f
|
struct Vec3f
|
||||||
{
|
{
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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 {
|
||||||
|
@ -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]];
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
@ -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
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
|
#include "StrHash.h"
|
||||||
|
|
||||||
namespace Ship
|
namespace Ship
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
25
soh/include/message_data_textbox_types.h
Normal file
25
soh/include/message_data_textbox_types.h
Normal 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
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
|
@ -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." });
|
||||||
|
@ -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")) {
|
||||||
|
42
soh/soh/Enhancements/item-tables/ItemTableManager.cpp
Normal file
42
soh/soh/Enhancements/item-tables/ItemTableManager.cpp
Normal 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); }
|
||||||
|
}
|
23
soh/soh/Enhancements/item-tables/ItemTableManager.h
Normal file
23
soh/soh/Enhancements/item-tables/ItemTableManager.h
Normal 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);
|
||||||
|
};
|
34
soh/soh/Enhancements/item-tables/ItemTableTypes.h
Normal file
34
soh/soh/Enhancements/item-tables/ItemTableTypes.h
Normal 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
|
@ -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
@ -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;
|
||||||
|
@ -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 "
|
||||||
|
@ -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();
|
||||||
|
@ -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()) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
109
soh/soh/Enhancements/randomizer/draw.cpp
Normal file
109
soh/soh/Enhancements/randomizer/draw.cpp
Normal 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);
|
||||||
|
}
|
13
soh/soh/Enhancements/randomizer/draw.h
Normal file
13
soh/soh/Enhancements/randomizer/draw.h
Normal 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
@ -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
|
||||||
|
@ -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,
|
||||||
|
972
soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
Normal file
972
soh/soh/Enhancements/randomizer/randomizer_check_objects.cpp
Normal 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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
83
soh/soh/Enhancements/randomizer/randomizer_check_objects.h
Normal file
83
soh/soh/Enhancements/randomizer/randomizer_check_objects.h
Normal 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();
|
||||||
|
}
|
35
soh/soh/Enhancements/randomizer/randomizer_inf.h
Normal file
35
soh/soh/Enhancements/randomizer/randomizer_inf.h
Normal 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
@ -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;
|
||||||
|
@ -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 =
|
||||||
|
@ -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
|
||||||
|
@ -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]);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
@ -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) {
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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];
|
||||||
|
@ -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;
|
||||||
|
@ -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) ||
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
Loading…
Reference in New Issue
Block a user