mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2025-08-14 10:37:17 -07:00
Controller Configuration UI and JSON Config (#760)
* Initial controller hud ui * Reverted fbdemo changes * Moved config to json and implemented controller config * fix build on linux, gitignore new config file * fix build * Fix compilation and file directory paths * Call save on cvar save * Fixed cvar loading and added deck slots to the config * Changed control deck port 0 to use a physical device by default * Added gyro and rumble & fixed loading errors * Save config on toggle menubar * fix linux build * Fixed drift calculation * Controller config now saves when pressing F1 * Removed ExitGame hook from ImGuiImpl * Moved mappings to a map * Added GetKeyName * untranslate scancodes * Fixed hud layout on keyboard device * Fixed keyboard read on hud * Fixed crash when reloading controllers * Removed ConfigFile and changed file extension * Changed Dummy to Disconnected and fixed filters * Removed function leftover * Changed ControllerHud to InputEditor Co-authored-by: briaguya <briaguya@alice> Co-authored-by: David Chavez <david@dcvz.io>
This commit is contained in:
parent
cb6876792e
commit
219804cbe4
49 changed files with 1841 additions and 896 deletions
|
@ -559,6 +559,7 @@ void ActorOverlayTable_Cleanup(void);
|
|||
u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList*);
|
||||
void func_80038A28(CollisionPoly* poly, f32 tx, f32 ty, f32 tz, MtxF* dest);
|
||||
f32 CollisionPoly_GetPointDistanceFromPlane(CollisionPoly* poly, Vec3f* point);
|
||||
CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId);
|
||||
void CollisionPoly_GetVerticesByBgId(CollisionPoly* poly, s32 bgId, CollisionContext* colCtx, Vec3f* dest);
|
||||
s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionContext* colCtx, f32* outY, Vec3f* pos,
|
||||
f32 checkHeight, CollisionPoly** outPoly);
|
||||
|
|
|
@ -143,7 +143,7 @@
|
|||
<ClCompile>
|
||||
<WarningLevel>TurnOffAllWarnings</WarningLevel>
|
||||
<SDLCheck>false</SDLCheck>
|
||||
<PreprocessorDefinitions>INCLUDE_GAME_PRINTF;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;ENABLE_DX11;%(PreprocessorDefinitions)GLEW_STATIC </PreprocessorDefinitions>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;ENABLE_DX11;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<ConformanceMode>true</ConformanceMode>
|
||||
<LanguageStandard>stdcpp20</LanguageStandard>
|
||||
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
|
||||
|
@ -1038,7 +1038,6 @@
|
|||
<ClInclude Include="soh\Enhancements\debugger\debugSaveEditor.h" />
|
||||
<ClInclude Include="soh\Enhancements\debugger\ImGuiHelpers.h" />
|
||||
<ClInclude Include="soh\gameconsole.h" />
|
||||
<ClInclude Include="soh\Lib\nlohmann\json.hpp" />
|
||||
<ClInclude Include="soh\OTRAudio.h" />
|
||||
<ClInclude Include="soh\OTRGlobals.h" />
|
||||
<ClInclude Include="soh\SaveManager.h" />
|
||||
|
|
|
@ -82,12 +82,6 @@
|
|||
<Filter Include="Source Files\soh\Enhancements\debugger">
|
||||
<UniqueIdentifier>{04fc1c52-49ff-48e2-ae23-2c00867374f8}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Lib">
|
||||
<UniqueIdentifier>{dbcf07c4-80b1-4c88-ac54-2bbdd8f53ee4}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\soh\Lib\nlohmann">
|
||||
<UniqueIdentifier>{9c880c8e-492b-48f6-b230-1fd269ea74b1}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\boot\assert.c">
|
||||
|
@ -3947,9 +3941,6 @@
|
|||
<ClInclude Include="soh\OTRAudio.h">
|
||||
<Filter>Source Files\soh</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\Lib\nlohmann\json.hpp">
|
||||
<Filter>Source Files\soh\Lib\nlohmann</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="soh\SaveManager.h">
|
||||
<Filter>Source Files\soh</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
@ -20,7 +20,7 @@ extern BootCommandFunc BootCommands_Command_LoadFileSelect(char** argv, s32 argc
|
|||
static BootCommand sCommands[] = { { "--skiplogo", BootCommands_Command_SkipLogo },
|
||||
{ "--loadfileselect", BootCommands_Command_LoadFileSelect } };
|
||||
|
||||
void BootCommands_Init()
|
||||
void BootCommands_Init()
|
||||
{
|
||||
CVar_RegisterS32("gDisableLOD", 0);
|
||||
CVar_RegisterS32("gDebugEnabled", 0);
|
||||
|
@ -30,7 +30,6 @@ void BootCommands_Init()
|
|||
CVar_RegisterS32("gHoverFishing", 0);
|
||||
CVar_RegisterS32("gN64WeirdFrames", 0);
|
||||
CVar_RegisterS32("gBombchusOOB", 0);
|
||||
CVar_RegisterS32("gRumbleEnabled", 0);
|
||||
CVar_RegisterS32("gUniformLR", 0);
|
||||
CVar_RegisterS32("gTwoHandedIdle", 0);
|
||||
CVar_RegisterS32("gDekuNutUpgradeFix", 0);
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
#include <Utils/StringHelper.h>
|
||||
#include <Utils/File.h>
|
||||
|
||||
#include "Window.h"
|
||||
#include "Lib/ImGui/imgui_internal.h"
|
||||
#undef PATH_HACK
|
||||
#undef Path
|
||||
|
@ -315,7 +316,7 @@ static bool SaveStateHandler(const std::vector<std::string>& args) {
|
|||
unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot();
|
||||
const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::SAVE });
|
||||
|
||||
switch (rtn) {
|
||||
switch (rtn) {
|
||||
case SaveStateReturn::SUCCESS:
|
||||
INFO("[SOH] Saved state to slot %u", slot);
|
||||
return CMD_SUCCESS;
|
||||
|
@ -329,7 +330,7 @@ static bool SaveStateHandler(const std::vector<std::string>& args) {
|
|||
static bool LoadStateHandler(const std::vector<std::string>& args) {
|
||||
unsigned int slot = OTRGlobals::Instance->gSaveStateMgr->GetCurrentSlot();
|
||||
const SaveStateReturn rtn = OTRGlobals::Instance->gSaveStateMgr->AddRequest({ slot, RequestType::LOAD });
|
||||
|
||||
|
||||
switch (rtn) {
|
||||
case SaveStateReturn::SUCCESS:
|
||||
INFO("[SOH] Loaded state from slot %u", slot);
|
||||
|
@ -342,7 +343,7 @@ static bool LoadStateHandler(const std::vector<std::string>& args) {
|
|||
return CMD_FAILED;
|
||||
case SaveStateReturn::FAIL_WRONG_GAMESTATE:
|
||||
ERROR("[SOH] Can not load a state outside of \"GamePlay\"");
|
||||
return CMD_FAILED;
|
||||
return CMD_FAILED;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -360,7 +361,7 @@ static bool StateSlotSelectHandler(const std::vector<std::string>& args) {
|
|||
ERROR("[SOH] SaveState slot value must be a number.");
|
||||
return CMD_FAILED;
|
||||
}
|
||||
|
||||
|
||||
if (slot < 0) {
|
||||
ERROR("[SOH] Invalid slot passed. Slot must be between 0 and 2");
|
||||
return CMD_FAILED;
|
||||
|
@ -498,8 +499,7 @@ template <typename Numeric> bool is_number(const std::string& s) {
|
|||
return ((std::istringstream(s) >> n >> std::ws).eof());
|
||||
}
|
||||
|
||||
void DebugConsole_LoadCVars()
|
||||
{
|
||||
void DebugConsole_LoadLegacyCVars() {
|
||||
auto cvarsConfig = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("cvars.cfg");
|
||||
if (File::Exists(cvarsConfig)) {
|
||||
const auto lines = File::ReadAllLines(cvarsConfig);
|
||||
|
@ -520,23 +520,58 @@ void DebugConsole_LoadCVars()
|
|||
CVar_SetS32(cfg[0].c_str(), std::stoi(cfg[1]));
|
||||
}
|
||||
}
|
||||
|
||||
fs::remove("cvars.cfg");
|
||||
}
|
||||
}
|
||||
|
||||
void DebugConsole_LoadCVars() {
|
||||
|
||||
std::shared_ptr<Mercury> pConf = Ship::GlobalCtx2::GetInstance()->GetConfig();
|
||||
pConf->reload();
|
||||
|
||||
for (const auto& item : pConf->rjson["CVars"].items()) {
|
||||
auto value = item.value();
|
||||
switch (value.type()) {
|
||||
case nlohmann::detail::value_t::array:
|
||||
break;
|
||||
case nlohmann::detail::value_t::string:
|
||||
CVar_SetString(item.key().c_str(), value.get<std::string>().c_str());
|
||||
break;
|
||||
case nlohmann::detail::value_t::boolean:
|
||||
CVar_SetS32(item.key().c_str(), value.get<bool>());
|
||||
break;
|
||||
case nlohmann::detail::value_t::number_unsigned:
|
||||
case nlohmann::detail::value_t::number_integer:
|
||||
CVar_SetS32(item.key().c_str(), value.get<int>());
|
||||
break;
|
||||
case nlohmann::detail::value_t::number_float:
|
||||
CVar_SetFloat(item.key().c_str(), value.get<float>());
|
||||
break;
|
||||
default: ;
|
||||
}
|
||||
if (item.key() == "gOpenMenuBar") {
|
||||
int bp = 0;
|
||||
}
|
||||
}
|
||||
|
||||
DebugConsole_LoadLegacyCVars();
|
||||
}
|
||||
|
||||
void DebugConsole_SaveCVars()
|
||||
{
|
||||
std::string output;
|
||||
std::shared_ptr<Mercury> pConf = Ship::GlobalCtx2::GetInstance()->GetConfig();
|
||||
|
||||
for (const auto &cvar : cvars) {
|
||||
if (cvar.second->type == CVAR_TYPE_STRING)
|
||||
output += StringHelper::Sprintf("%s = \"%s\"\n", cvar.first.c_str(), cvar.second->value.valueStr);
|
||||
const std::string key = StringHelper::Sprintf("CVars.%s", cvar.first.c_str());
|
||||
|
||||
if (cvar.second->type == CVAR_TYPE_STRING && cvar.second->value.valueStr != nullptr)
|
||||
pConf->setString(key, std::string(cvar.second->value.valueStr));
|
||||
else if (cvar.second->type == CVAR_TYPE_S32)
|
||||
output += StringHelper::Sprintf("%s = %i\n", cvar.first.c_str(), cvar.second->value.valueS32);
|
||||
pConf->setInt(key, cvar.second->value.valueS32);
|
||||
else if (cvar.second->type == CVAR_TYPE_FLOAT)
|
||||
output += StringHelper::Sprintf("%s = %f\n", cvar.first.c_str(), cvar.second->value.valueFloat);
|
||||
pConf->setFloat(key, cvar.second->value.valueFloat);
|
||||
}
|
||||
|
||||
|
||||
auto cvarsConfig = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("cvars.cfg");
|
||||
File::WriteAllText(cvarsConfig, output);
|
||||
pConf->save();
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include "utils.hpp"
|
||||
#include "shops.hpp"
|
||||
#include "hints.hpp"
|
||||
#include "soh/Lib/nlohmann/json.hpp"
|
||||
#include "Lib/nlohmann/json.hpp"
|
||||
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#include "randomizer.h"
|
||||
#include "soh/Lib/nlohmann/json.hpp"
|
||||
#include "Lib/nlohmann/json.hpp"
|
||||
#include <fstream>
|
||||
#include <variables.h>
|
||||
#include <macros.h>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#ifndef RANDOMIZER_H
|
||||
#define RANDOMIZER_H
|
||||
#pragma once
|
||||
|
||||
#include <unordered_map>
|
||||
#include <string>
|
||||
|
@ -54,5 +53,3 @@ void Rando_Init(void);
|
|||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2013-2022 Niels Lohmann
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
File diff suppressed because it is too large
Load diff
|
@ -1153,34 +1153,27 @@ extern "C" s32* ResourceMgr_LoadCSByName(const char* path)
|
|||
return (s32*)res->commands.data();
|
||||
}
|
||||
|
||||
std::filesystem::path GetSaveFile(Ship::ConfigFile& Conf) {
|
||||
std::string fileName = Conf.get("SAVE").get("Save Filename");
|
||||
|
||||
if (fileName.empty()) {
|
||||
Conf["SAVE"]["Save Filename"] = Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav");
|
||||
Conf.Save();
|
||||
}
|
||||
std::filesystem::path GetSaveFile(std::shared_ptr<Mercury> Conf) {
|
||||
const std::string fileName = Conf->getString("Game.SaveName", Ship::GlobalCtx2::GetPathRelativeToAppDirectory("oot_save.sav"));
|
||||
std::filesystem::path saveFile = std::filesystem::absolute(fileName);
|
||||
|
||||
if (!std::filesystem::exists(saveFile.parent_path())) {
|
||||
std::filesystem::create_directories(saveFile.parent_path());
|
||||
if (!exists(saveFile.parent_path())) {
|
||||
create_directories(saveFile.parent_path());
|
||||
}
|
||||
|
||||
return saveFile;
|
||||
}
|
||||
|
||||
std::filesystem::path GetSaveFile() {
|
||||
std::shared_ptr<Ship::ConfigFile> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||
Ship::ConfigFile& Conf = *pConf.get();
|
||||
const std::shared_ptr<Mercury> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||
|
||||
return GetSaveFile(Conf);
|
||||
return GetSaveFile(pConf);
|
||||
}
|
||||
|
||||
void OTRGlobals::CheckSaveFile(size_t sramSize) {
|
||||
std::shared_ptr<Ship::ConfigFile> pConf = context->GetConfig();
|
||||
Ship::ConfigFile& Conf = *pConf.get();
|
||||
void OTRGlobals::CheckSaveFile(size_t sramSize) const {
|
||||
const std::shared_ptr<Mercury> pConf = Instance->context->GetConfig();
|
||||
|
||||
std::filesystem::path savePath = GetSaveFile(Conf);
|
||||
std::filesystem::path savePath = GetSaveFile(pConf);
|
||||
std::fstream saveFile(savePath, std::fstream::in | std::fstream::out | std::fstream::binary);
|
||||
if (saveFile.fail()) {
|
||||
saveFile.open(savePath, std::fstream::in | std::fstream::out | std::fstream::binary | std::fstream::app);
|
||||
|
@ -1199,25 +1192,6 @@ extern "C" void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size) {
|
|||
OTRGlobals::Instance->context->WriteSaveFile(GetSaveFile(), addr, dramAddr, size);
|
||||
}
|
||||
|
||||
/* Remember to free after use of value */
|
||||
extern "C" char* Config_getValue(char* category, char* key) {
|
||||
std::shared_ptr<Ship::ConfigFile> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||
Ship::ConfigFile& Conf = *pConf.get();
|
||||
|
||||
std::string data = Conf.get(std::string(category)).get(std::string(key));
|
||||
char* retval = (char*)malloc(data.length()+1);
|
||||
strcpy(retval, data.c_str());
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
extern "C" bool Config_setValue(char* category, char* key, char* value) {
|
||||
std::shared_ptr<Ship::ConfigFile> pConf = OTRGlobals::Instance->context->GetConfig();
|
||||
Ship::ConfigFile& Conf = *pConf.get();
|
||||
Conf[std::string(category)][std::string(key)] = std::string(value);
|
||||
return Conf.Save();
|
||||
}
|
||||
|
||||
std::wstring StringToU16(const std::string& s) {
|
||||
std::vector<unsigned long> result;
|
||||
size_t i = 0;
|
||||
|
@ -1319,11 +1293,10 @@ extern "C" uint32_t OTRGetCurrentHeight() {
|
|||
}
|
||||
|
||||
extern "C" void OTRControllerCallback(ControllerCallback* controller) {
|
||||
auto controllers = OTRGlobals::Instance->context->GetWindow()->Controllers;
|
||||
for (size_t i = 0; i < controllers.size(); i++) {
|
||||
for (int j = 0; j < controllers[i].size(); j++) {
|
||||
OTRGlobals::Instance->context->GetWindow()->Controllers[i][j]->WriteToSource(controller);
|
||||
}
|
||||
const auto controllers = Ship::Window::ControllerApi->virtualDevices;
|
||||
|
||||
for (int i = 0; i < controllers.size(); ++i) {
|
||||
Ship::Window::ControllerApi->physicalDevices[controllers[i]]->WriteToSource(i, controller);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1377,11 +1350,11 @@ extern "C" void AudioPlayer_Play(const uint8_t* buf, uint32_t len) {
|
|||
}
|
||||
|
||||
extern "C" int Controller_ShouldRumble(size_t i) {
|
||||
for (const auto& controller : Ship::Window::Controllers.at(i))
|
||||
{
|
||||
float rumble_strength = CVar_GetFloat(StringHelper::Sprintf("gCont%i_RumbleStrength", i).c_str(), 1.0f);
|
||||
|
||||
if (controller->CanRumble() && rumble_strength > 0.001f) {
|
||||
const auto controllers = Ship::Window::ControllerApi->virtualDevices;
|
||||
|
||||
for (const auto virtual_entry : controllers) {
|
||||
if (Ship::Window::ControllerApi->physicalDevices[virtual_entry]->CanRumble()) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -23,7 +23,7 @@ public:
|
|||
~OTRGlobals();
|
||||
|
||||
private:
|
||||
void CheckSaveFile(size_t sramSize);
|
||||
void CheckSaveFile(size_t sramSize) const;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
@ -61,8 +61,6 @@ SoundFontSample* ResourceMgr_LoadAudioSample(const char* path);
|
|||
CollisionHeader* ResourceMgr_LoadColByName(const char* path);
|
||||
void Ctx_ReadSaveFile(uintptr_t addr, void* dramAddr, size_t size);
|
||||
void Ctx_WriteSaveFile(uintptr_t addr, void* dramAddr, size_t size);
|
||||
char* Config_getValue(char* category, char* key);
|
||||
bool Config_setValue(char* category, char* key, char* value);
|
||||
|
||||
uint64_t GetPerfCounter();
|
||||
struct SkeletonHeader* ResourceMgr_LoadSkeletonByName(const char* path);
|
||||
|
|
|
@ -269,7 +269,7 @@ void PadMgr_ProcessInputs(PadMgr* padMgr) {
|
|||
input->press.stick_y += (s8)(input->cur.stick_y - input->prev.stick_y);
|
||||
}
|
||||
|
||||
controllerCallback.rumble = CVar_GetS32("gRumbleEnabled", 0) && (padMgr->rumbleEnable[0] > 0);
|
||||
controllerCallback.rumble = (padMgr->rumbleEnable[0] > 0);
|
||||
|
||||
if (HealthMeter_IsCritical()) {
|
||||
controllerCallback.ledColor = 0;
|
||||
|
|
|
@ -1481,7 +1481,7 @@ s32 Camera_Free(Camera* camera) {
|
|||
|
||||
camBgChk.pos = camera->eye;
|
||||
|
||||
float maxRadius = 160.0f;
|
||||
float maxRadius = 150.0f;
|
||||
if (Camera_BGCheckInfo(camera, &at, &camBgChk)) {
|
||||
VecSph collSphere;
|
||||
OLib_Vec3fDiffToVecSphGeo(&collSphere, &at, &camBgChk.pos);
|
||||
|
|
|
@ -89,6 +89,7 @@ void TransitionWipe_Draw(void* thisx, Gfx** gfxP) {
|
|||
TransitionWipe* this = (TransitionWipe*)thisx;
|
||||
s32 pad[4];
|
||||
Gfx* tex;
|
||||
Gfx* wipeDl = sWipeDList;
|
||||
|
||||
modelView = this->modelView[this->frame];
|
||||
|
||||
|
|
|
@ -419,7 +419,7 @@ void FileChoose_UpdateMainMenu(GameState* thisx) {
|
|||
(!fileSelectSpoilerFileLoaded &&
|
||||
SpoilerFileExists(CVar_GetString("gSpoilerLog", "")))) {
|
||||
if (CVar_GetS32("gNewFileDropped", 0) != 0) {
|
||||
CVar_SetString("gSpoilerLog", CVar_GetString("gDroppedFile", ""));
|
||||
CVar_SetString("gSpoilerLog", CVar_GetString("gDroppedFile", "None"));
|
||||
}
|
||||
bool silent = true;
|
||||
if ((CVar_GetS32("gNewFileDropped", 0) != 0) ||
|
||||
|
@ -1894,7 +1894,7 @@ void FileChoose_Main(GameState* thisx) {
|
|||
};
|
||||
FileChooseContext* this = (FileChooseContext*)thisx;
|
||||
Input* input = &this->state.input[0];
|
||||
|
||||
|
||||
if (CVar_GetS32("gTimeFlowFileSelect", 0) != 0) {
|
||||
gSaveContext.skyboxTime += 0x10;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue