mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-04 11:19:58 -04:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d204de47bf | |||
| 23dc0cdbf0 | |||
| 24b468f2a2 |
+7
-17
@@ -5,19 +5,8 @@ if (NOT CMAKE_BUILD_TYPE)
|
|||||||
"Build type options: Debug Release RelWithDebInfo MinSizeRel" FORCE)
|
"Build type options: Debug Release RelWithDebInfo MinSizeRel" FORCE)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
set(DUSK_VERSION_OVERRIDE "" CACHE STRING "Override version string (skips git detection and format validation)")
|
# obtain revision info from git
|
||||||
|
find_package(Git)
|
||||||
if (DUSK_VERSION_OVERRIDE)
|
|
||||||
set(DUSK_WC_DESCRIBE "${DUSK_VERSION_OVERRIDE}")
|
|
||||||
set(DUSK_VERSION_STRING "0.0.0.0")
|
|
||||||
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
|
||||||
set(DUSK_WC_REVISION "")
|
|
||||||
set(DUSK_WC_BRANCH "")
|
|
||||||
set(DUSK_WC_DATE "")
|
|
||||||
message(STATUS "Dusklight version overridden to ${DUSK_WC_DESCRIBE}")
|
|
||||||
else ()
|
|
||||||
# obtain revision info from git
|
|
||||||
find_package(Git)
|
|
||||||
if (GIT_FOUND)
|
if (GIT_FOUND)
|
||||||
# make sure version information gets re-run when the current Git HEAD changes
|
# make sure version information gets re-run when the current Git HEAD changes
|
||||||
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD
|
execute_process(WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} COMMAND ${GIT_EXECUTABLE} rev-parse --git-path HEAD
|
||||||
@@ -74,8 +63,6 @@ else ()
|
|||||||
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
set(DUSK_SHORT_VERSION_STRING "0.0.0")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
# Add version information to CI environment variables
|
# Add version information to CI environment variables
|
||||||
if(DEFINED ENV{GITHUB_ENV})
|
if(DEFINED ENV{GITHUB_ENV})
|
||||||
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
|
file(APPEND "$ENV{GITHUB_ENV}" "DUSK_VERSION=${DUSK_WC_DESCRIBE}\n")
|
||||||
@@ -125,6 +112,11 @@ option(DUSK_BUILD_WARNINGS "Enable compiler warnings (off by default)")
|
|||||||
option(DUSK_SELECTED_OPT "If on, selected parts of the project will be compiled with optimizations on Debug, intending to make the game run at 30 FPS. Note for MSVC: you will need to remove '/RTC1' from your debug flags in CMake.")
|
option(DUSK_SELECTED_OPT "If on, selected parts of the project will be compiled with optimizations on Debug, intending to make the game run at 30 FPS. Note for MSVC: you will need to remove '/RTC1' from your debug flags in CMake.")
|
||||||
option(DUSK_MOVIE_SUPPORT "If on, compile against libjpeg-turbo to enable THP file decoding" ON)
|
option(DUSK_MOVIE_SUPPORT "If on, compile against libjpeg-turbo to enable THP file decoding" ON)
|
||||||
option(DUSK_ENABLE_UPDATE_CHECKER "Enable update checking support" ON)
|
option(DUSK_ENABLE_UPDATE_CHECKER "Enable update checking support" ON)
|
||||||
|
|
||||||
|
if(ANDROID)
|
||||||
|
set(DUSK_MOVIE_SUPPORT OFF)
|
||||||
|
endif ()
|
||||||
|
|
||||||
option(DUSK_ENABLE_SENTRY_NATIVE "Enable sentry-native crash reporting support" OFF)
|
option(DUSK_ENABLE_SENTRY_NATIVE "Enable sentry-native crash reporting support" OFF)
|
||||||
set(DUSK_SENTRY_DSN "" CACHE STRING "Sentry DSN")
|
set(DUSK_SENTRY_DSN "" CACHE STRING "Sentry DSN")
|
||||||
set(DUSK_SENTRY_ENVIRONMENT "development" CACHE STRING "Sentry environment")
|
set(DUSK_SENTRY_ENVIRONMENT "development" CACHE STRING "Sentry environment")
|
||||||
@@ -163,8 +155,6 @@ if (DUSK_MOVIE_SUPPORT)
|
|||||||
list(APPEND _jpeg_cmake_args -DCMAKE_TOOLCHAIN_FILE=${_jpeg_toolchain_file})
|
list(APPEND _jpeg_cmake_args -DCMAKE_TOOLCHAIN_FILE=${_jpeg_toolchain_file})
|
||||||
endif ()
|
endif ()
|
||||||
set(_jpeg_passthrough_vars
|
set(_jpeg_passthrough_vars
|
||||||
ANDROID_ABI
|
|
||||||
ANDROID_PLATFORM
|
|
||||||
CMAKE_BUILD_TYPE
|
CMAKE_BUILD_TYPE
|
||||||
CMAKE_C_COMPILER
|
CMAKE_C_COMPILER
|
||||||
CMAKE_C_COMPILER_LAUNCHER
|
CMAKE_C_COMPILER_LAUNCHER
|
||||||
|
|||||||
+25
-10
@@ -249,11 +249,22 @@
|
|||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": false
|
"value": false
|
||||||
},
|
},
|
||||||
"CMAKE_DISABLE_FIND_PACKAGE_PkgConfig": {
|
"CMAKE_DISABLE_FIND_PACKAGE_BZip2": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": true
|
"value": true
|
||||||
},
|
},
|
||||||
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew"
|
"CMAKE_DISABLE_FIND_PACKAGE_LibLZMA": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
"CMAKE_DISABLE_FIND_PACKAGE_zstd": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": true
|
||||||
|
},
|
||||||
|
"CMAKE_DISABLE_FIND_PACKAGE_Freetype": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"vendor": {
|
"vendor": {
|
||||||
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
"microsoft.com/VisualStudioSettings/CMake/1.0": {
|
||||||
@@ -318,11 +329,7 @@
|
|||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
|
"CMAKE_INSTALL_PREFIX": "${sourceDir}/build/install",
|
||||||
"CMAKE_TOOLCHAIN_FILE": "$env{ANDROID_HOME}/ndk/$env{ANDROID_NDK_VERSION}/build/cmake/android.toolchain.cmake",
|
"CMAKE_TOOLCHAIN_FILE": "$env{ANDROID_HOME}/ndk/$env{ANDROID_NDK_VERSION}/build/cmake/android.toolchain.cmake",
|
||||||
"ANDROID_PLATFORM": "android-28",
|
"ANDROID_PLATFORM": "android-28"
|
||||||
"BUILD_SHARED_LIBS": {
|
|
||||||
"type": "BOOL",
|
|
||||||
"value": false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -409,7 +416,7 @@
|
|||||||
},
|
},
|
||||||
"CMAKE_OSX_DEPLOYMENT_TARGET": "11.0",
|
"CMAKE_OSX_DEPLOYMENT_TARGET": "11.0",
|
||||||
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew",
|
"CMAKE_IGNORE_PREFIX_PATH": "/opt/homebrew",
|
||||||
"BUILD_SHARED_LIBS": {
|
"DUSK_MOVIE_SUPPORT": {
|
||||||
"type": "BOOL",
|
"type": "BOOL",
|
||||||
"value": false
|
"value": false
|
||||||
}
|
}
|
||||||
@@ -442,7 +449,11 @@
|
|||||||
],
|
],
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
||||||
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache"
|
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache",
|
||||||
|
"DUSK_MOVIE_SUPPORT": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -452,7 +463,11 @@
|
|||||||
],
|
],
|
||||||
"cacheVariables": {
|
"cacheVariables": {
|
||||||
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
"CMAKE_C_COMPILER_LAUNCHER": "sccache",
|
||||||
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache"
|
"CMAKE_CXX_COMPILER_LAUNCHER": "sccache",
|
||||||
|
"DUSK_MOVIE_SUPPORT": {
|
||||||
|
"type": "BOOL",
|
||||||
|
"value": false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|||||||
Vendored
+1
-1
Submodule extern/aurora updated: 3643a369ad...5703c68d46
+3
-2
@@ -1450,6 +1450,8 @@ set(DUSK_FILES
|
|||||||
src/dusk/imgui/ImGuiEngine.hpp
|
src/dusk/imgui/ImGuiEngine.hpp
|
||||||
src/dusk/imgui/ImGuiBloomWindow.cpp
|
src/dusk/imgui/ImGuiBloomWindow.cpp
|
||||||
src/dusk/imgui/ImGuiBloomWindow.hpp
|
src/dusk/imgui/ImGuiBloomWindow.hpp
|
||||||
|
src/dusk/imgui/ImGuiEnhancedLightingWindow.cpp
|
||||||
|
src/dusk/imgui/ImGuiEnhancedLightingWindow.hpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.cpp
|
src/dusk/imgui/ImGuiMenuTools.cpp
|
||||||
src/dusk/imgui/ImGuiMenuTools.hpp
|
src/dusk/imgui/ImGuiMenuTools.hpp
|
||||||
src/dusk/imgui/ImGuiActorSpawner.cpp
|
src/dusk/imgui/ImGuiActorSpawner.cpp
|
||||||
@@ -1458,6 +1460,7 @@ set(DUSK_FILES
|
|||||||
src/dusk/imgui/ImGuiHeapOverlay.cpp
|
src/dusk/imgui/ImGuiHeapOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiControllerOverlay.cpp
|
src/dusk/imgui/ImGuiControllerOverlay.cpp
|
||||||
src/dusk/imgui/ImGuiStubLog.cpp
|
src/dusk/imgui/ImGuiStubLog.cpp
|
||||||
|
src/dusk/imgui/ImGuiMapLoader.cpp
|
||||||
src/dusk/imgui/ImGuiSaveEditor.cpp
|
src/dusk/imgui/ImGuiSaveEditor.cpp
|
||||||
src/dusk/imgui/ImGuiStateShare.hpp
|
src/dusk/imgui/ImGuiStateShare.hpp
|
||||||
src/dusk/imgui/ImGuiStateShare.cpp
|
src/dusk/imgui/ImGuiStateShare.cpp
|
||||||
@@ -1508,8 +1511,6 @@ set(DUSK_FILES
|
|||||||
src/dusk/ui/tab_bar.hpp
|
src/dusk/ui/tab_bar.hpp
|
||||||
src/dusk/ui/ui.cpp
|
src/dusk/ui/ui.cpp
|
||||||
src/dusk/ui/ui.hpp
|
src/dusk/ui/ui.hpp
|
||||||
src/dusk/ui/warp.cpp
|
|
||||||
src/dusk/ui/warp.hpp
|
|
||||||
src/dusk/ui/window.cpp
|
src/dusk/ui/window.cpp
|
||||||
src/dusk/ui/window.hpp
|
src/dusk/ui/window.hpp
|
||||||
src/dusk/achievements.cpp
|
src/dusk/achievements.cpp
|
||||||
|
|||||||
@@ -50,11 +50,7 @@
|
|||||||
|
|
||||||
# Dusklight Actual (Linux x86_64 only — relies on prebuilt dawn/nod binaries)
|
# Dusklight Actual (Linux x86_64 only — relies on prebuilt dawn/nod binaries)
|
||||||
mkDusklight = pkgs:
|
mkDusklight = pkgs:
|
||||||
let srcs = buildSources pkgs;
|
let srcs = buildSources pkgs; in
|
||||||
versionSuffix = if self ? shortRev && self.shortRev != null
|
|
||||||
then "nix-${self.shortRev}"
|
|
||||||
else "nix-dirty";
|
|
||||||
in
|
|
||||||
pkgs.stdenv.mkDerivation {
|
pkgs.stdenv.mkDerivation {
|
||||||
name = "dusklight";
|
name = "dusklight";
|
||||||
src = ./.;
|
src = ./.;
|
||||||
@@ -66,7 +62,6 @@
|
|||||||
'';
|
'';
|
||||||
# Remove last line to re-enable tests
|
# Remove last line to re-enable tests
|
||||||
cmakeFlags = [
|
cmakeFlags = [
|
||||||
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
|
|
||||||
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_CXXOPTS=${pkgs.cxxopts.src}"
|
"-DFETCHCONTENT_SOURCE_DIR_CXXOPTS=${pkgs.cxxopts.src}"
|
||||||
"-DFETCHCONTENT_SOURCE_DIR_JSON=${pkgs.nlohmann_json.src}"
|
"-DFETCHCONTENT_SOURCE_DIR_JSON=${pkgs.nlohmann_json.src}"
|
||||||
@@ -88,14 +83,6 @@
|
|||||||
mkdir -p $out/bin
|
mkdir -p $out/bin
|
||||||
cp dusklight $out/bin/dusklight
|
cp dusklight $out/bin/dusklight
|
||||||
cp -r ./res $out/bin/res
|
cp -r ./res $out/bin/res
|
||||||
|
|
||||||
mkdir -p $out/share/applications
|
|
||||||
cp $src/platforms/freedesktop/dusklight.desktop $out/share/applications/dusklight.desktop
|
|
||||||
|
|
||||||
for size in 16 32 48 64 128 256 512 1024; do
|
|
||||||
install -Dm644 $src/platforms/freedesktop/''${size}x''${size}/apps/dusklight.png \
|
|
||||||
$out/share/icons/hicolor/''${size}x''${size}/apps/dusklight.png
|
|
||||||
done
|
|
||||||
'';
|
'';
|
||||||
nativeBuildInputs = [
|
nativeBuildInputs = [
|
||||||
pkgs.cmake
|
pkgs.cmake
|
||||||
@@ -225,4 +212,4 @@
|
|||||||
default = mkDevShell (pkgsFor system);
|
default = mkDevShell (pkgsFor system);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cmath>
|
|
||||||
#include <dolphin/types.h>
|
#include <dolphin/types.h>
|
||||||
|
|
||||||
namespace dusk::audio {
|
namespace dusk::audio {
|
||||||
|
|
||||||
// Converts a 0-1 volume to a linear amplitude multiplier.
|
|
||||||
// The curve is -4 dB per 10% step: 100% = 0 dB, 90% = -4 dB, ..., 0% = -inf dB
|
|
||||||
inline f32 MasterVolumeToLinear(f32 v) {
|
|
||||||
if (v <= 0.0f) {
|
|
||||||
return 0.0f;
|
|
||||||
}
|
|
||||||
return std::pow(10.0f, (v - 1.0f) * 2.0f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the audio system and start playing audio.
|
* Initialize the audio system and start playing audio.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -175,7 +175,6 @@ class ConfigVar : public ConfigVarBase {
|
|||||||
T defaultValue;
|
T defaultValue;
|
||||||
T value;
|
T value;
|
||||||
T overrideValue;
|
T overrideValue;
|
||||||
ConfigVarLayer priorLayer = ConfigVarLayer::Default;
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
@@ -266,7 +265,6 @@ public:
|
|||||||
void setSpeedrunValue(T newValue) {
|
void setSpeedrunValue(T newValue) {
|
||||||
checkRegistered();
|
checkRegistered();
|
||||||
if (layer != ConfigVarLayer::Override) {
|
if (layer != ConfigVarLayer::Override) {
|
||||||
priorLayer = layer;
|
|
||||||
overrideValue = std::move(newValue);
|
overrideValue = std::move(newValue);
|
||||||
layer = ConfigVarLayer::Speedrun;
|
layer = ConfigVarLayer::Speedrun;
|
||||||
}
|
}
|
||||||
@@ -284,20 +282,9 @@ public:
|
|||||||
checkRegistered();
|
checkRegistered();
|
||||||
if (layer == ConfigVarLayer::Speedrun) {
|
if (layer == ConfigVarLayer::Speedrun) {
|
||||||
overrideValue = {};
|
overrideValue = {};
|
||||||
layer = priorLayer;
|
layer = ConfigVarLayer::Value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Get the user-persisted value, ignoring any temporary overrides.
|
|
||||||
*
|
|
||||||
* Used by Save() to write the correct value even when a speedrun override is active.
|
|
||||||
*/
|
|
||||||
[[nodiscard]] constexpr const T& getValueForSave() const noexcept {
|
|
||||||
checkRegistered();
|
|
||||||
const ConfigVarLayer effectiveLayer = (layer == ConfigVarLayer::Speedrun) ? priorLayer : layer;
|
|
||||||
return effectiveLayer == ConfigVarLayer::Default ? defaultValue : value;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
using ActionBindConfigVar = ConfigVar<int>;
|
using ActionBindConfigVar = ConfigVar<int>;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ constexpr const char* SHOW_DEBUG_OVERLAY = "F3";
|
|||||||
constexpr const char* SHOW_HEAP_VIEWER = "F4";
|
constexpr const char* SHOW_HEAP_VIEWER = "F4";
|
||||||
constexpr const char* SHOW_PLAYER_INFO = "F5";
|
constexpr const char* SHOW_PLAYER_INFO = "F5";
|
||||||
constexpr const char* SHOW_SAVE_EDITOR = "F6";
|
constexpr const char* SHOW_SAVE_EDITOR = "F6";
|
||||||
|
constexpr const char* SHOW_MAP_LOADER = "F7";
|
||||||
constexpr const char* SHOW_STATE_SHARE = "F8";
|
constexpr const char* SHOW_STATE_SHARE = "F8";
|
||||||
constexpr const char* SHOW_DEBUG_CAMERA = "F9";
|
constexpr const char* SHOW_DEBUG_CAMERA = "F9";
|
||||||
constexpr const char* SHOW_AUDIO_DEBUG = "F10";
|
constexpr const char* SHOW_AUDIO_DEBUG = "F10";
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ extern bool IsShuttingDown;
|
|||||||
extern bool IsGameLaunched;
|
extern bool IsGameLaunched;
|
||||||
extern bool RestartRequested;
|
extern bool RestartRequested;
|
||||||
extern std::filesystem::path ConfigPath;
|
extern std::filesystem::path ConfigPath;
|
||||||
extern std::filesystem::path CachePath;
|
|
||||||
|
|
||||||
#if defined(__ANDROID__) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS) || \
|
#if defined(__ANDROID__) || (defined(TARGET_OS_IOS) && TARGET_OS_IOS) || \
|
||||||
(defined(TARGET_OS_TV) && TARGET_OS_TV)
|
(defined(TARGET_OS_TV) && TARGET_OS_TV)
|
||||||
|
|||||||
@@ -120,6 +120,13 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> enableDiscordPresence;
|
ConfigVar<bool> enableDiscordPresence;
|
||||||
|
|
||||||
// Graphics
|
// Graphics
|
||||||
|
ConfigVar<bool> enhancedLighting;
|
||||||
|
ConfigVar<bool> enableSpecularLighting;
|
||||||
|
ConfigVar<bool> enableRimLighting;
|
||||||
|
ConfigVar<float> specularIntensity;
|
||||||
|
ConfigVar<float> rimIntensity;
|
||||||
|
ConfigVar<float> ambientLightMultiplier;
|
||||||
|
ConfigVar<float> diffuseLightMultiplier;
|
||||||
ConfigVar<BloomMode> bloomMode;
|
ConfigVar<BloomMode> bloomMode;
|
||||||
ConfigVar<float> bloomMultiplier;
|
ConfigVar<float> bloomMultiplier;
|
||||||
ConfigVar<bool> disableWaterRefraction;
|
ConfigVar<bool> disableWaterRefraction;
|
||||||
@@ -158,7 +165,6 @@ struct UserSettings {
|
|||||||
// Cheats
|
// Cheats
|
||||||
ConfigVar<bool> infiniteHearts;
|
ConfigVar<bool> infiniteHearts;
|
||||||
ConfigVar<bool> infiniteArrows;
|
ConfigVar<bool> infiniteArrows;
|
||||||
ConfigVar<bool> infiniteSeeds;
|
|
||||||
ConfigVar<bool> infiniteBombs;
|
ConfigVar<bool> infiniteBombs;
|
||||||
ConfigVar<bool> infiniteOil;
|
ConfigVar<bool> infiniteOil;
|
||||||
ConfigVar<bool> infiniteOxygen;
|
ConfigVar<bool> infiniteOxygen;
|
||||||
@@ -172,7 +178,6 @@ struct UserSettings {
|
|||||||
ConfigVar<bool> fastRoll;
|
ConfigVar<bool> fastRoll;
|
||||||
ConfigVar<bool> fastSpinner;
|
ConfigVar<bool> fastSpinner;
|
||||||
ConfigVar<bool> freeMagicArmor;
|
ConfigVar<bool> freeMagicArmor;
|
||||||
ConfigVar<bool> invincibleEnemies;
|
|
||||||
|
|
||||||
// Technical
|
// Technical
|
||||||
ConfigVar<bool> restoreWiiGlitches;
|
ConfigVar<bool> restoreWiiGlitches;
|
||||||
|
|||||||
@@ -77,12 +77,7 @@ int daAlink_c::loadModelDVD() {
|
|||||||
mpWlMidnaHairModel = NULL;
|
mpWlMidnaHairModel = NULL;
|
||||||
|
|
||||||
if (!checkNoResetFlg2(FLG2_UNK_280000)) {
|
if (!checkNoResetFlg2(FLG2_UNK_280000)) {
|
||||||
if (!dComIfG_resDelete(&mPhaseReq, mArcName)) {
|
dComIfG_resDelete(&mPhaseReq, mArcName);
|
||||||
#if TARGET_PC
|
|
||||||
// resDelete no-ops if load was in-progress; force-unregister before freeAll
|
|
||||||
dComIfG_deleteObjectResMain(mArcName);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
cPhs_Reset(&mPhaseReq);
|
cPhs_Reset(&mPhaseReq);
|
||||||
mpArcHeap->freeAll();
|
mpArcHeap->freeAll();
|
||||||
|
|
||||||
|
|||||||
@@ -8723,12 +8723,6 @@ int daAlink_c::procWolfCargoCarry() {
|
|||||||
return checkNextActionWolf(0);
|
return checkNextActionWolf(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
if (field_0x280c.getActor() == NULL) {
|
|
||||||
return checkNextActionWolf(0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
mDoMtx_stack_c::copy(((e_yc_class*)field_0x280c.getActor())->getLegR3Mtx());
|
mDoMtx_stack_c::copy(((e_yc_class*)field_0x280c.getActor())->getLegR3Mtx());
|
||||||
mDoMtx_stack_c::transM(-9.0f, -7.0f, -30.0f);
|
mDoMtx_stack_c::transM(-9.0f, -7.0f, -30.0f);
|
||||||
mDoMtx_stack_c::multVecZero(¤t.pos);
|
mDoMtx_stack_c::multVecZero(¤t.pos);
|
||||||
|
|||||||
@@ -15,7 +15,6 @@
|
|||||||
#include "f_op/f_op_actor_mng.h"
|
#include "f_op/f_op_actor_mng.h"
|
||||||
#if TARGET_PC
|
#if TARGET_PC
|
||||||
#include "dusk/achievements.h"
|
#include "dusk/achievements.h"
|
||||||
#include "dusk/settings.h"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int plCutLRC[58] = {
|
static int plCutLRC[58] = {
|
||||||
@@ -430,13 +429,6 @@ fopAc_ac_c* cc_at_check(fopAc_ac_c* i_enemy, dCcU_AtInfo* i_AtInfo) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if TARGET_PC
|
|
||||||
if (dusk::getSettings().game.invincibleEnemies &&
|
|
||||||
fopAcM_GetGroup(i_enemy) == fopAc_ENEMY_e) {
|
|
||||||
i_AtInfo->mAttackPower = 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (i_AtInfo->mAttackPower != 0) {
|
if (i_AtInfo->mAttackPower != 0) {
|
||||||
i_enemy->health -= i_AtInfo->mAttackPower;
|
i_enemy->health -= i_AtInfo->mAttackPower;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3882,11 +3882,7 @@ bool dCamera_c::hintTalkEvCamera() {
|
|||||||
|
|
||||||
cSAngle acStack_1fc(20.0f);
|
cSAngle acStack_1fc(20.0f);
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
#if AVOID_UB
|
|
||||||
for (j = 0; j < 10; j++) {
|
|
||||||
#else
|
|
||||||
for (j = 0; j < 12; j++) {
|
for (j = 0; j < 12; j++) {
|
||||||
#endif
|
|
||||||
cSAngle acStack_200(local_b0[j] * fVar22);
|
cSAngle acStack_200(local_b0[j] * fVar22);
|
||||||
hintTalk->mDirection.U(acStack_1f8 + acStack_200);
|
hintTalk->mDirection.U(acStack_1f8 + acStack_200);
|
||||||
hintTalk->mDirection.V(((hintTalk->field_0x28.V() * acStack_200.Cos()) * 0.2f) + acStack_1fc);
|
hintTalk->mDirection.V(((hintTalk->field_0x28.V() * acStack_200.Cos()) * 0.2f) + acStack_1fc);
|
||||||
|
|||||||
+4
-10
@@ -26,12 +26,8 @@ void updateAutoSave() {
|
|||||||
(AutoSaveFuncsProc[mAutoSaveProc])();
|
(AutoSaveFuncsProc[mAutoSaveProc])();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool writeAutoSave() {
|
void writeAutoSave() {
|
||||||
stage_stag_info_class* stagInfo = dComIfGp_getStageStagInfo();
|
int stageNo = dStage_stagInfo_GetSaveTbl(dComIfGp_getStageStagInfo());
|
||||||
if (stagInfo == nullptr) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
int stageNo = dStage_stagInfo_GetSaveTbl(stagInfo);
|
|
||||||
|
|
||||||
dComIfGs_putSave(stageNo);
|
dComIfGs_putSave(stageNo);
|
||||||
dComIfGs_setMemoryToCard(mSaveBuffer, dComIfGs_getDataNum());
|
dComIfGs_setMemoryToCard(mSaveBuffer, dComIfGs_getDataNum());
|
||||||
@@ -44,7 +40,6 @@ bool writeAutoSave() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
g_mDoMemCd_control.save(mSaveBuffer, sizeof(mSaveBuffer), 0);
|
g_mDoMemCd_control.save(mSaveBuffer, sizeof(mSaveBuffer), 0);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void autoSaving() {
|
void autoSaving() {
|
||||||
@@ -53,9 +48,8 @@ void autoSaving() {
|
|||||||
if (cardState == 2) {
|
if (cardState == 2) {
|
||||||
mAutoSaveProc = 1;
|
mAutoSaveProc = 1;
|
||||||
} else if (cardState == 1) {
|
} else if (cardState == 1) {
|
||||||
if (writeAutoSave()) {
|
writeAutoSave();
|
||||||
mAutoSaveProc = 3;
|
mAutoSaveProc = 3;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -61,7 +61,7 @@ void ConfigImpl<T>::loadFromJson(ConfigVar<T>& cVar, const json& jsonValue) {
|
|||||||
|
|
||||||
template<ConfigValue T>
|
template<ConfigValue T>
|
||||||
nlohmann::json ConfigImpl<T>::dumpToJson(const ConfigVar<T>& cVar) {
|
nlohmann::json ConfigImpl<T>::dumpToJson(const ConfigVar<T>& cVar) {
|
||||||
return cVar.getValueForSave();
|
return cVar.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<ConfigValue T> requires std::is_integral_v<T> && std::is_signed_v<T>
|
template<ConfigValue T> requires std::is_integral_v<T> && std::is_signed_v<T>
|
||||||
@@ -249,8 +249,7 @@ void dusk::config::Save() {
|
|||||||
json j;
|
json j;
|
||||||
|
|
||||||
for (const auto& pair : RegisteredConfigVars) {
|
for (const auto& pair : RegisteredConfigVars) {
|
||||||
const auto layer = pair.second->getLayer();
|
if (pair.second->getLayer() == ConfigVarLayer::Value) {
|
||||||
if (layer == ConfigVarLayer::Value || layer == ConfigVarLayer::Speedrun) {
|
|
||||||
j[pair.first] = pair.second->getImpl()->dumpToJson(*pair.second);
|
j[pair.first] = pair.second->getImpl()->dumpToJson(*pair.second);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ std::string release_name() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path sentry_database_path() {
|
std::filesystem::path sentry_database_path() {
|
||||||
return dusk::CachePath / "sentry";
|
return dusk::ConfigPath / "sentry";
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path log_attachment_path() {
|
std::filesystem::path log_attachment_path() {
|
||||||
|
|||||||
+93
-222
@@ -6,7 +6,6 @@
|
|||||||
#include "dusk/main.h"
|
#include "dusk/main.h"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <chrono>
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
@@ -31,21 +30,6 @@ constexpr auto kLocationDescriptorName = "data_location.json";
|
|||||||
constexpr auto kPipelineCacheName = "pipeline_cache.db";
|
constexpr auto kPipelineCacheName = "pipeline_cache.db";
|
||||||
constexpr auto kInitialPipelineCacheName = "initial_pipeline_cache.db";
|
constexpr auto kInitialPipelineCacheName = "initial_pipeline_cache.db";
|
||||||
|
|
||||||
constexpr std::array<std::string_view, 4> kUserDataDirectories = {
|
|
||||||
"texture_replacements",
|
|
||||||
"USA",
|
|
||||||
"EUR",
|
|
||||||
"JAP",
|
|
||||||
};
|
|
||||||
constexpr std::array<std::string_view, 6> kUserDataFiles = {
|
|
||||||
"achievements.json",
|
|
||||||
"config.json",
|
|
||||||
"controller_ports.dat",
|
|
||||||
"imgui.ini",
|
|
||||||
"keyboard_bindings.dat",
|
|
||||||
"states.json",
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class LocationMode {
|
enum class LocationMode {
|
||||||
Default,
|
Default,
|
||||||
Portable,
|
Portable,
|
||||||
@@ -78,7 +62,6 @@ struct MigrationStats {
|
|||||||
|
|
||||||
std::optional<std::filesystem::path> sConfiguredDataPath;
|
std::optional<std::filesystem::path> sConfiguredDataPath;
|
||||||
std::optional<std::filesystem::path> sActiveDescriptorPath;
|
std::optional<std::filesystem::path> sActiveDescriptorPath;
|
||||||
std::optional<std::filesystem::path> sActivePrefPath;
|
|
||||||
|
|
||||||
std::filesystem::path path_from_utf8(std::string_view value) {
|
std::filesystem::path path_from_utf8(std::string_view value) {
|
||||||
return std::filesystem::path{
|
return std::filesystem::path{
|
||||||
@@ -87,22 +70,19 @@ std::filesystem::path path_from_utf8(std::string_view value) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path legacy_path_for_pref_path(const std::filesystem::path& prefPath) {
|
std::filesystem::path get_legacy_path() {
|
||||||
if (std::string_view{LegacyAppName}.empty() || prefPath.empty()) {
|
if (std::string_view{LegacyAppName}.empty()) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
auto normalizedPrefPath = prefPath;
|
char* prefPath = SDL_GetPrefPath(OrgName, LegacyAppName);
|
||||||
if (normalizedPrefPath.filename().empty()) {
|
if (!prefPath) {
|
||||||
normalizedPrefPath = normalizedPrefPath.parent_path();
|
Log.fatal("Unable to get PrefPath: {}", SDL_GetError());
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto parentPath = normalizedPrefPath.parent_path();
|
std::filesystem::path result{reinterpret_cast<const char8_t*>(prefPath)};
|
||||||
if (parentPath.empty()) {
|
SDL_free(prefPath);
|
||||||
return {};
|
return result;
|
||||||
}
|
|
||||||
|
|
||||||
return parentPath / LegacyAppName;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path get_pref_path() {
|
std::filesystem::path get_pref_path() {
|
||||||
@@ -116,13 +96,6 @@ std::filesystem::path get_pref_path() {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path active_pref_path() {
|
|
||||||
if (sActivePrefPath) {
|
|
||||||
return *sActivePrefPath;
|
|
||||||
}
|
|
||||||
return get_pref_path();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::filesystem::path base_path_relative(const std::filesystem::path& path) {
|
std::filesystem::path base_path_relative(const std::filesystem::path& path) {
|
||||||
const auto* basePath = SDL_GetBasePath();
|
const auto* basePath = SDL_GetBasePath();
|
||||||
if (!basePath) {
|
if (!basePath) {
|
||||||
@@ -276,69 +249,6 @@ std::filesystem::path absolute_path(const std::filesystem::path& path) {
|
|||||||
return absolute.lexically_normal();
|
return absolute.lexically_normal();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path rename_legacy_pref_path(
|
|
||||||
const std::filesystem::path& legacyPath, const std::filesystem::path& prefPath) {
|
|
||||||
if (legacyPath.empty() || prefPath.empty() ||
|
|
||||||
normalized_path(legacyPath) == normalized_path(prefPath))
|
|
||||||
{
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::error_code ec;
|
|
||||||
if (!std::filesystem::exists(legacyPath, ec)) {
|
|
||||||
if (ec) {
|
|
||||||
Log.warn("Failed to inspect legacy data directory '{}': {}",
|
|
||||||
io::fs_path_to_string(legacyPath), ec.message());
|
|
||||||
}
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
const bool prefExists = std::filesystem::exists(prefPath, ec);
|
|
||||||
if (ec) {
|
|
||||||
Log.warn("Failed to inspect data directory '{}': {}", io::fs_path_to_string(prefPath),
|
|
||||||
ec.message());
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
if (prefExists) {
|
|
||||||
if (!std::filesystem::is_directory(prefPath, ec) ||
|
|
||||||
!std::filesystem::is_empty(prefPath, ec))
|
|
||||||
{
|
|
||||||
if (ec) {
|
|
||||||
Log.warn("Failed to inspect data directory '{}': {}",
|
|
||||||
io::fs_path_to_string(prefPath), ec.message());
|
|
||||||
} else {
|
|
||||||
Log.info("Skipping legacy data directory rename because '{}' is not empty",
|
|
||||||
io::fs_path_to_string(prefPath));
|
|
||||||
}
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::filesystem::remove(prefPath, ec);
|
|
||||||
if (ec) {
|
|
||||||
Log.warn("Failed to remove empty data directory '{}' before legacy rename: {}",
|
|
||||||
io::fs_path_to_string(prefPath), ec.message());
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
std::filesystem::rename(legacyPath, prefPath, ec);
|
|
||||||
if (ec) {
|
|
||||||
Log.warn("Failed to rename legacy data directory '{}' to '{}': {}",
|
|
||||||
io::fs_path_to_string(legacyPath), io::fs_path_to_string(prefPath), ec.message());
|
|
||||||
ec.clear();
|
|
||||||
if (!std::filesystem::exists(prefPath, ec) && !ec) {
|
|
||||||
Log.info("Using legacy data directory '{}' because the new data directory is absent",
|
|
||||||
io::fs_path_to_string(legacyPath));
|
|
||||||
return legacyPath;
|
|
||||||
}
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.info("Renamed legacy data directory '{}' to '{}'", io::fs_path_to_string(legacyPath),
|
|
||||||
io::fs_path_to_string(prefPath));
|
|
||||||
return prefPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_same_or_inside(const std::filesystem::path& root, const std::filesystem::path& path) {
|
bool is_same_or_inside(const std::filesystem::path& root, const std::filesystem::path& path) {
|
||||||
const auto normalizedRoot = normalized_path(root);
|
const auto normalizedRoot = normalized_path(root);
|
||||||
const auto normalizedPath = normalized_path(path);
|
const auto normalizedPath = normalized_path(path);
|
||||||
@@ -373,46 +283,85 @@ bool should_skip_migration_path(const std::filesystem::path& path,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool matches_name(std::string_view name, const auto& names) {
|
bool has_location_descriptor(const std::filesystem::path& path) {
|
||||||
return std::ranges::find(names, name) != names.end();
|
std::error_code ec;
|
||||||
|
return std::filesystem::exists(path / kLocationDescriptorName, ec);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool should_migrate_user_data_path(
|
bool remove_empty_destination_for_rename(const std::filesystem::path& path) {
|
||||||
const std::filesystem::path& sourcePath, const std::filesystem::path& from) {
|
std::error_code ec;
|
||||||
const auto relativePath = sourcePath.lexically_relative(from);
|
const bool exists = std::filesystem::exists(path, ec);
|
||||||
if (relativePath.empty() || relativePath.is_absolute()) {
|
if (ec) {
|
||||||
|
Log.debug("Could not inspect migration destination '{}': {}", io::fs_path_to_string(path),
|
||||||
|
ec.message());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!exists) {
|
||||||
auto it = relativePath.begin();
|
|
||||||
if (it == relativePath.end() || *it == "..") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto first = io::fs_path_to_string(*it);
|
|
||||||
if (matches_name(first, kUserDataDirectories)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
++it;
|
const bool canRemove = std::filesystem::is_directory(path, ec) &&
|
||||||
if (it != relativePath.end()) {
|
std::filesystem::is_empty(path, ec) && !has_location_descriptor(path);
|
||||||
|
if (ec || !canRemove) {
|
||||||
|
if (ec) {
|
||||||
|
Log.debug("Could not inspect migration destination '{}': {}",
|
||||||
|
io::fs_path_to_string(path), ec.message());
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto filename = io::fs_path_to_string(relativePath.filename());
|
std::filesystem::remove(path, ec);
|
||||||
if (matches_name(filename, kUserDataFiles)) {
|
if (ec) {
|
||||||
return true;
|
Log.debug("Could not remove empty migration destination '{}': {}",
|
||||||
|
io::fs_path_to_string(path), ec.message());
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return relativePath.extension() == ".controller" || relativePath.extension() == ".gci" ||
|
return true;
|
||||||
(filename.starts_with("MemoryCard") && filename.ends_with(".raw"));
|
}
|
||||||
|
|
||||||
|
bool try_rename_directory_migration(
|
||||||
|
const std::filesystem::path& from, const std::filesystem::path& to) {
|
||||||
|
std::error_code ec;
|
||||||
|
if (!std::filesystem::is_directory(from, ec)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (ec) {
|
||||||
|
Log.debug("Could not inspect migration source '{}': {}", io::fs_path_to_string(from),
|
||||||
|
ec.message());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (has_location_descriptor(from)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!remove_empty_destination_for_rename(to)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::filesystem::create_directories(to.parent_path(), ec);
|
||||||
|
if (ec) {
|
||||||
|
Log.debug("Could not create migration destination parent '{}': {}",
|
||||||
|
io::fs_path_to_string(to.parent_path()), ec.message());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::filesystem::rename(from, to, ec);
|
||||||
|
if (ec) {
|
||||||
|
Log.debug("Could not rename data directory '{}' to '{}': {}", io::fs_path_to_string(from),
|
||||||
|
io::fs_path_to_string(to), ec.message());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Log.info("Renamed data directory '{}' to '{}'", io::fs_path_to_string(from),
|
||||||
|
io::fs_path_to_string(to));
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path current_data_path() {
|
std::filesystem::path current_data_path() {
|
||||||
if (!ConfigPath.empty()) {
|
if (!ConfigPath.empty()) {
|
||||||
return ConfigPath;
|
return ConfigPath;
|
||||||
}
|
}
|
||||||
const auto prefPath = active_pref_path();
|
const auto prefPath = get_pref_path();
|
||||||
const auto descriptor = read_location_descriptor(prefPath);
|
const auto descriptor = read_location_descriptor(prefPath);
|
||||||
if (descriptor) {
|
if (descriptor) {
|
||||||
sActiveDescriptorPath = descriptor->path;
|
sActiveDescriptorPath = descriptor->path;
|
||||||
@@ -478,7 +427,7 @@ bool write_location_descriptor(LocationMode mode, const std::filesystem::path& t
|
|||||||
json["previousPath"] = io::fs_path_to_string(descriptor.previousPath);
|
json["previousPath"] = io::fs_path_to_string(descriptor.previousPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto prefPath = active_pref_path();
|
const auto prefPath = get_pref_path();
|
||||||
for (const auto& path : descriptor_write_paths(prefPath)) {
|
for (const auto& path : descriptor_write_paths(prefPath)) {
|
||||||
if (write_descriptor_json(path, json)) {
|
if (write_descriptor_json(path, json)) {
|
||||||
sActiveDescriptorPath = path;
|
sActiveDescriptorPath = path;
|
||||||
@@ -490,61 +439,6 @@ bool write_location_descriptor(LocationMode mode, const std::filesystem::path& t
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_error(std::string* errorOut, std::string error) {
|
|
||||||
if (errorOut != nullptr) {
|
|
||||||
*errorOut = std::move(error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool validate_writable_data_path(const std::filesystem::path& path, std::string* errorOut) {
|
|
||||||
if (path.empty()) {
|
|
||||||
set_error(errorOut, "Choose a folder.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::error_code ec;
|
|
||||||
std::filesystem::create_directories(path, ec);
|
|
||||||
if (ec) {
|
|
||||||
set_error(errorOut, fmt::format("{} could not create the selected folder.", AppName));
|
|
||||||
Log.warn("Failed to create custom data folder '{}': {}", io::fs_path_to_string(path),
|
|
||||||
ec.message());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!std::filesystem::is_directory(path, ec)) {
|
|
||||||
set_error(errorOut, "The selected path is not a folder.");
|
|
||||||
if (ec) {
|
|
||||||
Log.warn("Failed to inspect custom data folder '{}': {}", io::fs_path_to_string(path),
|
|
||||||
ec.message());
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto probePath = path / fmt::format(".write-probe-{}.tmp",
|
|
||||||
std::chrono::steady_clock::now().time_since_epoch().count());
|
|
||||||
try {
|
|
||||||
io::FileStream::WriteAllText(probePath, "dusk");
|
|
||||||
} catch (const std::exception& e) {
|
|
||||||
set_error(errorOut, fmt::format("{} could not write to the selected folder.", AppName));
|
|
||||||
Log.warn("Failed write probe for custom data folder '{}': {}", io::fs_path_to_string(path),
|
|
||||||
e.what());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::filesystem::remove(probePath, ec);
|
|
||||||
if (ec) {
|
|
||||||
set_error(
|
|
||||||
errorOut, fmt::format("{} could write to the selected folder, but could not remove "
|
|
||||||
"the test file it created.",
|
|
||||||
AppName));
|
|
||||||
Log.warn("Failed to remove custom data folder write probe '{}': {}",
|
|
||||||
io::fs_path_to_string(probePath), ec.message());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::uintmax_t remove_empty_directories(const std::filesystem::path& root, bool includeRoot) {
|
std::uintmax_t remove_empty_directories(const std::filesystem::path& root, bool includeRoot) {
|
||||||
std::error_code ec;
|
std::error_code ec;
|
||||||
std::vector<std::filesystem::path> directories;
|
std::vector<std::filesystem::path> directories;
|
||||||
@@ -753,6 +647,14 @@ void migrate_directory(const std::filesystem::path& from, const std::filesystem:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (try_rename_directory_migration(from, to)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (try_rename_directory_migration(from, to)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::filesystem::create_directories(to, ec);
|
std::filesystem::create_directories(to, ec);
|
||||||
if (ec) {
|
if (ec) {
|
||||||
++stats.failures;
|
++stats.failures;
|
||||||
@@ -798,16 +700,6 @@ void migrate_directory(const std::filesystem::path& from, const std::filesystem:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!should_migrate_user_data_path(sourcePath, from)) {
|
|
||||||
++stats.skippedUnsupportedEntries;
|
|
||||||
if (std::filesystem::is_directory(status)) {
|
|
||||||
it.disable_recursion_pending();
|
|
||||||
}
|
|
||||||
ec.clear();
|
|
||||||
it.increment(ec);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto relativePath = sourcePath.lexically_relative(from);
|
const auto relativePath = sourcePath.lexically_relative(from);
|
||||||
if (relativePath.empty() || relativePath.is_absolute()) {
|
if (relativePath.empty() || relativePath.is_absolute()) {
|
||||||
++stats.failures;
|
++stats.failures;
|
||||||
@@ -869,6 +761,8 @@ void migrate_data(const std::filesystem::path& prefPath, const std::filesystem::
|
|||||||
const LocationDescriptor* descriptor) {
|
const LocationDescriptor* descriptor) {
|
||||||
if (descriptor && !descriptor->previousPath.empty()) {
|
if (descriptor && !descriptor->previousPath.empty()) {
|
||||||
migrate_directory(descriptor->previousPath, dataPath, prefPath);
|
migrate_directory(descriptor->previousPath, dataPath, prefPath);
|
||||||
|
} else if (const auto legacyPath = get_legacy_path(); !legacyPath.empty()) {
|
||||||
|
migrate_directory(legacyPath, dataPath, prefPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1005,25 +899,17 @@ bool open_data_path() {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_custom_data_path(const std::filesystem::path& path, std::string* errorOut) {
|
bool set_custom_data_path(const std::filesystem::path& path) {
|
||||||
if (!validate_writable_data_path(path, errorOut)) {
|
if (path.empty()) {
|
||||||
|
Log.warn("Ignoring empty custom data path");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!write_location_descriptor(LocationMode::Custom, path)) {
|
return write_location_descriptor(LocationMode::Custom, path);
|
||||||
set_error(errorOut, fmt::format("{} could not save the data folder setting.", AppName));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_custom_data_path(const char* path, std::string* errorOut) {
|
bool set_custom_data_path(const char* path) {
|
||||||
if (path == nullptr) {
|
return set_custom_data_path(path_from_utf8(path));
|
||||||
set_error(errorOut, "Choose a folder.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return set_custom_data_path(path_from_utf8(path), errorOut);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool set_portable_data_path() {
|
bool set_portable_data_path() {
|
||||||
@@ -1031,12 +917,12 @@ bool set_portable_data_path() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool reset_data_path() {
|
bool reset_data_path() {
|
||||||
const auto prefPath = active_pref_path();
|
const auto prefPath = get_pref_path();
|
||||||
return write_location_descriptor(LocationMode::Default, default_data_path(prefPath));
|
return write_location_descriptor(LocationMode::Default, default_data_path(prefPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_default_data_path() {
|
bool is_default_data_path() {
|
||||||
const auto prefPath = active_pref_path();
|
const auto prefPath = get_pref_path();
|
||||||
return normalized_path(configured_data_path()) == normalized_path(default_data_path(prefPath));
|
return normalized_path(configured_data_path()) == normalized_path(default_data_path(prefPath));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1045,7 +931,7 @@ std::filesystem::path configured_data_path() {
|
|||||||
return *sConfiguredDataPath;
|
return *sConfiguredDataPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto prefPath = active_pref_path();
|
const auto prefPath = get_pref_path();
|
||||||
const auto descriptor = read_location_descriptor(prefPath);
|
const auto descriptor = read_location_descriptor(prefPath);
|
||||||
if (descriptor) {
|
if (descriptor) {
|
||||||
sActiveDescriptorPath = descriptor->path;
|
sActiveDescriptorPath = descriptor->path;
|
||||||
@@ -1055,13 +941,6 @@ std::filesystem::path configured_data_path() {
|
|||||||
return *sConfiguredDataPath;
|
return *sConfiguredDataPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::filesystem::path cache_path() {
|
|
||||||
if (!CachePath.empty()) {
|
|
||||||
return CachePath;
|
|
||||||
}
|
|
||||||
return active_pref_path();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool is_data_path_restart_pending() {
|
bool is_data_path_restart_pending() {
|
||||||
if (ConfigPath.empty()) {
|
if (ConfigPath.empty()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1070,12 +949,8 @@ bool is_data_path_restart_pending() {
|
|||||||
return normalized_path(ConfigPath) != normalized_path(configured_data_path());
|
return normalized_path(ConfigPath) != normalized_path(configured_data_path());
|
||||||
}
|
}
|
||||||
|
|
||||||
Paths initialize_data() {
|
std::filesystem::path initialize_data() {
|
||||||
const auto preferredPrefPath = get_pref_path();
|
const auto prefPath = get_pref_path();
|
||||||
const auto prefPath =
|
|
||||||
rename_legacy_pref_path(legacy_path_for_pref_path(preferredPrefPath), preferredPrefPath);
|
|
||||||
sActivePrefPath = prefPath;
|
|
||||||
|
|
||||||
const auto descriptor = read_location_descriptor(prefPath);
|
const auto descriptor = read_location_descriptor(prefPath);
|
||||||
if (descriptor) {
|
if (descriptor) {
|
||||||
sActiveDescriptorPath = descriptor->path;
|
sActiveDescriptorPath = descriptor->path;
|
||||||
@@ -1088,13 +963,9 @@ Paths initialize_data() {
|
|||||||
|
|
||||||
migrate_data(prefPath, dataPath, descriptor ? &descriptor->descriptor : nullptr);
|
migrate_data(prefPath, dataPath, descriptor ? &descriptor->descriptor : nullptr);
|
||||||
ensure_data_directory(dataPath);
|
ensure_data_directory(dataPath);
|
||||||
ensure_data_directory(prefPath);
|
ensure_initial_pipeline_cache(dataPath);
|
||||||
ensure_initial_pipeline_cache(prefPath);
|
|
||||||
|
|
||||||
return Paths{
|
return dataPath;
|
||||||
.userPath = dataPath,
|
|
||||||
.cachePath = prefPath,
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace dusk::data
|
} // namespace dusk::data
|
||||||
|
|||||||
+4
-11
@@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <string>
|
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
#include <TargetConditionals.h>
|
#include <TargetConditionals.h>
|
||||||
@@ -15,7 +14,7 @@
|
|||||||
#define DUSK_CAN_OPEN_DATA_FOLDER 0
|
#define DUSK_CAN_OPEN_DATA_FOLDER 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(__APPLE__) && TARGET_OS_IOS && !TARGET_OS_MACCATALYST) || defined(__ANDROID__)
|
#if defined(__APPLE__) && TARGET_OS_IOS && !TARGET_OS_MACCATALYST
|
||||||
#define DUSK_CAN_CHANGE_DATA_FOLDER 0
|
#define DUSK_CAN_CHANGE_DATA_FOLDER 0
|
||||||
#else
|
#else
|
||||||
#define DUSK_CAN_CHANGE_DATA_FOLDER 1
|
#define DUSK_CAN_CHANGE_DATA_FOLDER 1
|
||||||
@@ -23,17 +22,11 @@
|
|||||||
|
|
||||||
namespace dusk::data {
|
namespace dusk::data {
|
||||||
|
|
||||||
struct Paths {
|
std::filesystem::path initialize_data();
|
||||||
std::filesystem::path userPath;
|
|
||||||
std::filesystem::path cachePath;
|
|
||||||
};
|
|
||||||
|
|
||||||
Paths initialize_data();
|
|
||||||
std::filesystem::path configured_data_path();
|
std::filesystem::path configured_data_path();
|
||||||
std::filesystem::path cache_path();
|
|
||||||
bool open_data_path();
|
bool open_data_path();
|
||||||
bool set_custom_data_path(const char* path, std::string* errorOut);
|
bool set_custom_data_path(const char* path);
|
||||||
bool set_custom_data_path(const std::filesystem::path& path, std::string* errorOut);
|
bool set_custom_data_path(const std::filesystem::path& path);
|
||||||
bool set_portable_data_path();
|
bool set_portable_data_path();
|
||||||
bool reset_data_path();
|
bool reset_data_path();
|
||||||
bool is_default_data_path();
|
bool is_default_data_path();
|
||||||
|
|||||||
@@ -368,7 +368,9 @@ namespace dusk {
|
|||||||
m_menuTools.ShowProcessManager();
|
m_menuTools.ShowProcessManager();
|
||||||
m_menuTools.ShowHeapOverlay();
|
m_menuTools.ShowHeapOverlay();
|
||||||
m_menuTools.ShowStubLog();
|
m_menuTools.ShowStubLog();
|
||||||
|
m_menuTools.ShowMapLoader();
|
||||||
m_menuTools.ShowBloomWindow();
|
m_menuTools.ShowBloomWindow();
|
||||||
|
m_menuTools.ShowEnhancedLightingWindow();
|
||||||
m_menuTools.ShowPlayerInfo();
|
m_menuTools.ShowPlayerInfo();
|
||||||
m_menuTools.ShowAudioDebug();
|
m_menuTools.ShowAudioDebug();
|
||||||
m_menuTools.ShowSaveEditor();
|
m_menuTools.ShowSaveEditor();
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
#include "imgui.h"
|
||||||
|
|
||||||
|
#include "ImGuiEnhancedLightingWindow.hpp"
|
||||||
|
#include "ImGuiMenuTools.hpp"
|
||||||
|
#include "dusk/config.hpp"
|
||||||
|
#include "dusk/settings.h"
|
||||||
|
|
||||||
|
#include <aurora/gfx.h>
|
||||||
|
|
||||||
|
namespace dusk {
|
||||||
|
|
||||||
|
static void ApplyFromSettings() {
|
||||||
|
const auto& g = getSettings().game;
|
||||||
|
aurora_set_enhanced_lighting_state({
|
||||||
|
g.enhancedLighting.getValue(),
|
||||||
|
g.enableSpecularLighting.getValue(),
|
||||||
|
g.enableRimLighting.getValue(),
|
||||||
|
g.specularIntensity.getValue(),
|
||||||
|
g.rimIntensity.getValue(),
|
||||||
|
g.ambientLightMultiplier.getValue(),
|
||||||
|
g.diffuseLightMultiplier.getValue(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void DrawEnhancedLightingWindow(bool& open) {
|
||||||
|
if (!open) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ImGui::Begin("Enhanced Lighting", &open)) {
|
||||||
|
ImGui::End();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto& g = getSettings().game;
|
||||||
|
bool changed = false;
|
||||||
|
|
||||||
|
bool enabled = g.enhancedLighting.getValue();
|
||||||
|
if (ImGui::Checkbox("Enhanced Lighting", &enabled)) {
|
||||||
|
g.enhancedLighting.setValue(enabled);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
if (ImGui::IsItemHovered()) {
|
||||||
|
ImGui::SetTooltip("Enables per-pixel lighting with Blinn-Phong shading.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enabled) {
|
||||||
|
ImGui::BeginDisabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool enableSpecular = g.enableSpecularLighting.getValue();
|
||||||
|
if (ImGui::Checkbox("Specular Highlights", &enableSpecular)) {
|
||||||
|
g.enableSpecularLighting.setValue(enableSpecular);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool enableRim = g.enableRimLighting.getValue();
|
||||||
|
if (ImGui::Checkbox("Rim Lighting", &enableRim)) {
|
||||||
|
g.enableRimLighting.setValue(enableRim);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
float specularIntensity = g.specularIntensity.getValue();
|
||||||
|
if (ImGui::SliderFloat("Specular Intensity", &specularIntensity, 0.0f, 1.0f, "%.2f")) {
|
||||||
|
g.specularIntensity.setValue(specularIntensity);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
float rimIntensity = g.rimIntensity.getValue();
|
||||||
|
if (ImGui::SliderFloat("Rim Intensity", &rimIntensity, 0.0f, 0.5f, "%.3f")) {
|
||||||
|
g.rimIntensity.setValue(rimIntensity);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
float ambientMultiplier = g.ambientLightMultiplier.getValue();
|
||||||
|
if (ImGui::SliderFloat("Ambient Multiplier", &ambientMultiplier, 0.0f, 3.0f, "%.2f")) {
|
||||||
|
g.ambientLightMultiplier.setValue(ambientMultiplier);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
float diffuseMultiplier = g.diffuseLightMultiplier.getValue();
|
||||||
|
if (ImGui::SliderFloat("Diffuse Multiplier", &diffuseMultiplier, 0.0f, 3.0f, "%.2f")) {
|
||||||
|
g.diffuseLightMultiplier.setValue(diffuseMultiplier);
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!enabled) {
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changed) {
|
||||||
|
ApplyFromSettings();
|
||||||
|
config::Save();
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ImGuiMenuTools::ShowEnhancedLightingWindow() {
|
||||||
|
DrawEnhancedLightingWindow(m_showEnhancedLightingWindow);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dusk
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace dusk {
|
||||||
|
void DrawEnhancedLightingWindow(bool& open);
|
||||||
|
} // namespace dusk
|
||||||
@@ -0,0 +1,149 @@
|
|||||||
|
#include "d/d_com_inf_game.h"
|
||||||
|
|
||||||
|
#include "imgui.h"
|
||||||
|
#include <imgui_internal.h>
|
||||||
|
#include "ImGuiConsole.hpp"
|
||||||
|
#include "ImGuiMenuTools.hpp"
|
||||||
|
#include "dusk/map_loader_definitions.h"
|
||||||
|
#include "fmt/format.h"
|
||||||
|
|
||||||
|
namespace dusk {
|
||||||
|
void ImGuiMenuTools::ShowMapLoader() {
|
||||||
|
if (!getSettings().backend.enableAdvancedSettings ||
|
||||||
|
!ImGuiConsole::CheckMenuViewToggle(ImGuiKey_F7, m_showMapLoader))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGuiWindowFlags windowFlags = ImGuiWindowFlags_AlwaysAutoResize |
|
||||||
|
ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav;
|
||||||
|
|
||||||
|
// ImGui::SetNextWindowBgAlpha(0.65f);
|
||||||
|
|
||||||
|
if (!ImGui::Begin("Map Loader", &m_showMapLoader, windowFlags)) {
|
||||||
|
ImGui::End();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImGui::Checkbox("Show Internal Names", &m_mapLoaderInfo.showInternalNames);
|
||||||
|
|
||||||
|
const char* previewRegion = "None";
|
||||||
|
if (m_mapLoaderInfo.regionIdx != -1) {
|
||||||
|
previewRegion = gameRegions[m_mapLoaderInfo.regionIdx].regionName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginCombo("Select Region", previewRegion)) {
|
||||||
|
int idx = 0;
|
||||||
|
for (const auto& region : gameRegions) {
|
||||||
|
if (ImGui::Selectable(region.regionName)) {
|
||||||
|
if (m_mapLoaderInfo.regionIdx != idx) {
|
||||||
|
m_mapLoaderInfo.mapIdx = 0;
|
||||||
|
m_mapLoaderInfo.roomNoIdx = 0;
|
||||||
|
m_mapLoaderInfo.pointNoIdx = 0;
|
||||||
|
}
|
||||||
|
m_mapLoaderInfo.regionIdx = idx;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
ImGui::EndCombo();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_mapLoaderInfo.regionIdx != -1) {
|
||||||
|
const auto& region = gameRegions[m_mapLoaderInfo.regionIdx];
|
||||||
|
|
||||||
|
std::string previewMap = "None";
|
||||||
|
if (m_mapLoaderInfo.mapIdx != -1) {
|
||||||
|
const auto& map = region.maps[m_mapLoaderInfo.mapIdx];
|
||||||
|
previewMap = m_mapLoaderInfo.showInternalNames ? fmt::format("{} ({})", map.mapName, map.mapFile) : map.mapName;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginCombo("Select Map", previewMap.data())) {
|
||||||
|
int prevMapIdx = m_mapLoaderInfo.mapIdx;
|
||||||
|
for (int i = 0; i < region.maps.size(); ++i) {
|
||||||
|
const auto& map = region.maps[i];
|
||||||
|
std::string label = m_mapLoaderInfo.showInternalNames ? fmt::format("{} ({})", map.mapName, map.mapFile) : map.mapName;
|
||||||
|
if (ImGui::Selectable(label.data())) {
|
||||||
|
m_mapLoaderInfo.mapIdx = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndCombo();
|
||||||
|
if (m_mapLoaderInfo.mapIdx != prevMapIdx) {
|
||||||
|
m_mapLoaderInfo.roomNoIdx = 0;
|
||||||
|
m_mapLoaderInfo.pointNoIdx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ImGui::Text("No region selected.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_mapLoaderInfo.regionIdx != -1 && m_mapLoaderInfo.mapIdx != -1) {
|
||||||
|
const auto& region = gameRegions[m_mapLoaderInfo.regionIdx];
|
||||||
|
const auto& map = region.maps[m_mapLoaderInfo.mapIdx];
|
||||||
|
const auto& room = map.mapRooms[m_mapLoaderInfo.roomNoIdx];
|
||||||
|
|
||||||
|
if (map.mapRooms.size() > 1) {
|
||||||
|
ImGui::Text("Selected Room: %2d", room.roomNo);
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("-###RoomNoIdxDec")) {
|
||||||
|
m_mapLoaderInfo.roomNoIdx--;
|
||||||
|
if (m_mapLoaderInfo.roomNoIdx < 0) {
|
||||||
|
m_mapLoaderInfo.roomNoIdx = map.mapRooms.size() - 1;
|
||||||
|
}
|
||||||
|
m_mapLoaderInfo.pointNoIdx = 0;
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("+###RoomNoIdxInc")) {
|
||||||
|
m_mapLoaderInfo.roomNoIdx++;
|
||||||
|
if (m_mapLoaderInfo.roomNoIdx >= map.mapRooms.size()) {
|
||||||
|
m_mapLoaderInfo.roomNoIdx = 0;
|
||||||
|
}
|
||||||
|
m_mapLoaderInfo.pointNoIdx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constexpr int MAX_LAYER = 14;
|
||||||
|
|
||||||
|
ImGui::Text("Selected Layer: %3d", m_mapLoaderInfo.layer);
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("-###layerDec")) {
|
||||||
|
m_mapLoaderInfo.layer--;
|
||||||
|
if (m_mapLoaderInfo.layer < -1) {
|
||||||
|
m_mapLoaderInfo.layer = MAX_LAYER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("+###layerInc")) {
|
||||||
|
m_mapLoaderInfo.layer++;
|
||||||
|
if (m_mapLoaderInfo.layer > MAX_LAYER) {
|
||||||
|
m_mapLoaderInfo.layer = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (room.roomPoints.size() > 1) {
|
||||||
|
ImGui::Text("Selected Point: %3d", room.roomPoints[m_mapLoaderInfo.pointNoIdx]);
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("-###PointNoIdxDec")) {
|
||||||
|
m_mapLoaderInfo.pointNoIdx--;
|
||||||
|
if (m_mapLoaderInfo.pointNoIdx < 0) {
|
||||||
|
m_mapLoaderInfo.pointNoIdx = room.roomPoints.size() - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if (ImGui::Button("+###PointNoIdxInc")) {
|
||||||
|
m_mapLoaderInfo.pointNoIdx++;
|
||||||
|
if (m_mapLoaderInfo.pointNoIdx >= room.roomPoints.size()) {
|
||||||
|
m_mapLoaderInfo.pointNoIdx = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ImGui::Button("Warp")) {
|
||||||
|
dComIfGp_setNextStage(map.mapFile, room.roomPoints[m_mapLoaderInfo.pointNoIdx], room.roomNo, m_mapLoaderInfo.layer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace dusk
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
#include "fmt/format.h"
|
#include "fmt/format.h"
|
||||||
#include "imgui.h"
|
#include "imgui.h"
|
||||||
#include "aurora/gfx.h"
|
#include <aurora/gfx.h>
|
||||||
|
|
||||||
#include "ImGuiConfig.hpp"
|
#include "ImGuiConfig.hpp"
|
||||||
#include "dusk/hotkeys.h"
|
#include "dusk/hotkeys.h"
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
|
#include "ImGuiBloomWindow.hpp"
|
||||||
#include "ImGuiConsole.hpp"
|
#include "ImGuiConsole.hpp"
|
||||||
|
#include "ImGuiEnhancedLightingWindow.hpp"
|
||||||
#include "ImGuiMenuTools.hpp"
|
#include "ImGuiMenuTools.hpp"
|
||||||
|
|
||||||
#include "ImGuiEngine.hpp"
|
#include "ImGuiEngine.hpp"
|
||||||
@@ -40,6 +42,7 @@ namespace dusk {
|
|||||||
ImGui::BeginDisabled(getSettings().game.speedrunMode);
|
ImGui::BeginDisabled(getSettings().game.speedrunMode);
|
||||||
|
|
||||||
ImGui::MenuItem("Save Editor", hotkeys::SHOW_SAVE_EDITOR, &m_showSaveEditor);
|
ImGui::MenuItem("Save Editor", hotkeys::SHOW_SAVE_EDITOR, &m_showSaveEditor);
|
||||||
|
ImGui::MenuItem("Map Loader", hotkeys::SHOW_MAP_LOADER, &m_showMapLoader);
|
||||||
ImGui::MenuItem("State Share", hotkeys::SHOW_STATE_SHARE, &m_showStateShare);
|
ImGui::MenuItem("State Share", hotkeys::SHOW_STATE_SHARE, &m_showStateShare);
|
||||||
|
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
@@ -103,6 +106,7 @@ namespace dusk {
|
|||||||
ImGui::MenuItem("Debug Camera", hotkeys::SHOW_DEBUG_CAMERA, &m_showCameraOverlay);
|
ImGui::MenuItem("Debug Camera", hotkeys::SHOW_DEBUG_CAMERA, &m_showCameraOverlay);
|
||||||
ImGui::MenuItem("Audio Debug", hotkeys::SHOW_AUDIO_DEBUG, &m_showAudioDebug);
|
ImGui::MenuItem("Audio Debug", hotkeys::SHOW_AUDIO_DEBUG, &m_showAudioDebug);
|
||||||
ImGui::MenuItem("Bloom", nullptr, &m_showBloomWindow);
|
ImGui::MenuItem("Bloom", nullptr, &m_showBloomWindow);
|
||||||
|
ImGui::MenuItem("Enhanced Lighting", nullptr, &m_showEnhancedLightingWindow);
|
||||||
ImGui::MenuItem("Stub Log", nullptr, &m_showStubLog);
|
ImGui::MenuItem("Stub Log", nullptr, &m_showStubLog);
|
||||||
ImGui::MenuItem("Actor Spawner", nullptr, &m_showActorSpawner);
|
ImGui::MenuItem("Actor Spawner", nullptr, &m_showActorSpawner);
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ namespace dusk {
|
|||||||
void ShowProcessManager();
|
void ShowProcessManager();
|
||||||
void ShowHeapOverlay();
|
void ShowHeapOverlay();
|
||||||
void ShowStubLog();
|
void ShowStubLog();
|
||||||
|
void ShowMapLoader();
|
||||||
void ShowBloomWindow();
|
void ShowBloomWindow();
|
||||||
|
void ShowEnhancedLightingWindow();
|
||||||
void ShowPlayerInfo();
|
void ShowPlayerInfo();
|
||||||
void ShowAudioDebug();
|
void ShowAudioDebug();
|
||||||
void ShowSaveEditor();
|
void ShowSaveEditor();
|
||||||
@@ -42,9 +44,23 @@ namespace dusk {
|
|||||||
|
|
||||||
bool m_showStubLog = false;
|
bool m_showStubLog = false;
|
||||||
|
|
||||||
|
bool m_showMapLoader = false;
|
||||||
|
|
||||||
bool m_showBloomWindow = false;
|
bool m_showBloomWindow = false;
|
||||||
|
bool m_showEnhancedLightingWindow = false;
|
||||||
|
|
||||||
bool m_showAudioDebug = false;
|
bool m_showAudioDebug = false;
|
||||||
|
struct {
|
||||||
|
int mapIdx = -1;
|
||||||
|
int regionIdx = -1;
|
||||||
|
int roomNoIdx = 0;
|
||||||
|
int pointNoIdx = 0;
|
||||||
|
int roomNo = -1;
|
||||||
|
int pointNo = -1;
|
||||||
|
int spawnId = 0;
|
||||||
|
int layer = -1;
|
||||||
|
bool showInternalNames = false;
|
||||||
|
} m_mapLoaderInfo;
|
||||||
|
|
||||||
bool m_showPlayerInfo = false;
|
bool m_showPlayerInfo = false;
|
||||||
int m_playerInfoOverlayCorner = 1; // top-right
|
int m_playerInfoOverlayCorner = 1; // top-right
|
||||||
|
|||||||
+19
-5
@@ -13,7 +13,7 @@ UserSettings g_userSettings = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
.audio = {
|
.audio = {
|
||||||
.masterVolume {"audio.masterVolume", 60},
|
.masterVolume {"audio.masterVolume", 80},
|
||||||
.mainMusicVolume {"audio.mainMusicVolume", 100},
|
.mainMusicVolume {"audio.mainMusicVolume", 100},
|
||||||
.subMusicVolume {"audio.subMusicVolume", 100},
|
.subMusicVolume {"audio.subMusicVolume", 100},
|
||||||
.soundEffectsVolume {"audio.soundEffectsVolume", 100},
|
.soundEffectsVolume {"audio.soundEffectsVolume", 100},
|
||||||
@@ -55,6 +55,13 @@ UserSettings g_userSettings = {
|
|||||||
.enableDiscordPresence {"game.enableDiscordPresence", true},
|
.enableDiscordPresence {"game.enableDiscordPresence", true},
|
||||||
|
|
||||||
// Graphics
|
// Graphics
|
||||||
|
.enhancedLighting {"game.enhancedLighting", false},
|
||||||
|
.enableSpecularLighting {"game.enableSpecularLighting", true},
|
||||||
|
.enableRimLighting {"game.enableRimLighting", true},
|
||||||
|
.specularIntensity {"game.specularIntensity", 0.2f},
|
||||||
|
.rimIntensity {"game.rimIntensity", 0.08f},
|
||||||
|
.ambientLightMultiplier {"game.ambientLightMultiplier", 1.0f},
|
||||||
|
.diffuseLightMultiplier {"game.diffuseLightMultiplier", 1.0f},
|
||||||
.bloomMode {"game.bloomMode", BloomMode::Dusk},
|
.bloomMode {"game.bloomMode", BloomMode::Dusk},
|
||||||
.bloomMultiplier {"game.bloomMultiplier", 1.0f},
|
.bloomMultiplier {"game.bloomMultiplier", 1.0f},
|
||||||
.disableWaterRefraction {"game.disableWaterRefraction", false},
|
.disableWaterRefraction {"game.disableWaterRefraction", false},
|
||||||
@@ -93,7 +100,6 @@ UserSettings g_userSettings = {
|
|||||||
// Cheats
|
// Cheats
|
||||||
.infiniteHearts {"game.infiniteHearts", false},
|
.infiniteHearts {"game.infiniteHearts", false},
|
||||||
.infiniteArrows {"game.infiniteArrows", false},
|
.infiniteArrows {"game.infiniteArrows", false},
|
||||||
.infiniteSeeds {"game.infiniteSeeds", false},
|
|
||||||
.infiniteBombs {"game.infiniteBombs", false},
|
.infiniteBombs {"game.infiniteBombs", false},
|
||||||
.infiniteOil {"game.infiniteOil", false},
|
.infiniteOil {"game.infiniteOil", false},
|
||||||
.infiniteOxygen {"game.infiniteOxygen", false},
|
.infiniteOxygen {"game.infiniteOxygen", false},
|
||||||
@@ -107,7 +113,6 @@ UserSettings g_userSettings = {
|
|||||||
.fastRoll {"game.fastRoll", false},
|
.fastRoll {"game.fastRoll", false},
|
||||||
.fastSpinner {"game.fastSpinner", false},
|
.fastSpinner {"game.fastSpinner", false},
|
||||||
.freeMagicArmor {"game.freeMagicArmor", false},
|
.freeMagicArmor {"game.freeMagicArmor", false},
|
||||||
.invincibleEnemies {"game.invincibleEnemies", false},
|
|
||||||
|
|
||||||
// Technical
|
// Technical
|
||||||
.restoreWiiGlitches {"game.restoreWiiGlitches", false},
|
.restoreWiiGlitches {"game.restoreWiiGlitches", false},
|
||||||
@@ -215,6 +220,17 @@ void registerSettings() {
|
|||||||
Register(g_userSettings.game.minimalHUD);
|
Register(g_userSettings.game.minimalHUD);
|
||||||
Register(g_userSettings.game.pauseOnFocusLost);
|
Register(g_userSettings.game.pauseOnFocusLost);
|
||||||
Register(g_userSettings.game.enableDiscordPresence);
|
Register(g_userSettings.game.enableDiscordPresence);
|
||||||
|
|
||||||
|
// Enhanced lighting
|
||||||
|
Register(g_userSettings.game.enhancedLighting);
|
||||||
|
Register(g_userSettings.game.enableSpecularLighting);
|
||||||
|
Register(g_userSettings.game.enableRimLighting);
|
||||||
|
Register(g_userSettings.game.specularIntensity);
|
||||||
|
Register(g_userSettings.game.rimIntensity);
|
||||||
|
Register(g_userSettings.game.ambientLightMultiplier);
|
||||||
|
Register(g_userSettings.game.diffuseLightMultiplier);
|
||||||
|
|
||||||
|
|
||||||
Register(g_userSettings.game.bloomMode);
|
Register(g_userSettings.game.bloomMode);
|
||||||
Register(g_userSettings.game.bloomMultiplier);
|
Register(g_userSettings.game.bloomMultiplier);
|
||||||
Register(g_userSettings.game.disableWaterRefraction);
|
Register(g_userSettings.game.disableWaterRefraction);
|
||||||
@@ -245,7 +261,6 @@ void registerSettings() {
|
|||||||
Register(g_userSettings.game.fastSpinner);
|
Register(g_userSettings.game.fastSpinner);
|
||||||
Register(g_userSettings.game.infiniteHearts);
|
Register(g_userSettings.game.infiniteHearts);
|
||||||
Register(g_userSettings.game.infiniteArrows);
|
Register(g_userSettings.game.infiniteArrows);
|
||||||
Register(g_userSettings.game.infiniteSeeds);
|
|
||||||
Register(g_userSettings.game.infiniteBombs);
|
Register(g_userSettings.game.infiniteBombs);
|
||||||
Register(g_userSettings.game.infiniteOil);
|
Register(g_userSettings.game.infiniteOil);
|
||||||
Register(g_userSettings.game.infiniteOxygen);
|
Register(g_userSettings.game.infiniteOxygen);
|
||||||
@@ -254,7 +269,6 @@ void registerSettings() {
|
|||||||
Register(g_userSettings.game.moonJump);
|
Register(g_userSettings.game.moonJump);
|
||||||
Register(g_userSettings.game.superClawshot);
|
Register(g_userSettings.game.superClawshot);
|
||||||
Register(g_userSettings.game.alwaysGreatspin);
|
Register(g_userSettings.game.alwaysGreatspin);
|
||||||
Register(g_userSettings.game.invincibleEnemies);
|
|
||||||
Register(g_userSettings.game.enableFrameInterpolation);
|
Register(g_userSettings.game.enableFrameInterpolation);
|
||||||
Register(g_userSettings.game.gyroMode);
|
Register(g_userSettings.game.gyroMode);
|
||||||
Register(g_userSettings.game.enableGyroAim);
|
Register(g_userSettings.game.enableGyroAim);
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ void resetForSpeedrunMode() {
|
|||||||
|
|
||||||
getSettings().game.infiniteHearts.setSpeedrunValue(false);
|
getSettings().game.infiniteHearts.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteArrows.setSpeedrunValue(false);
|
getSettings().game.infiniteArrows.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteSeeds.setSpeedrunValue(false);
|
|
||||||
getSettings().game.infiniteBombs.setSpeedrunValue(false);
|
getSettings().game.infiniteBombs.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteOil.setSpeedrunValue(false);
|
getSettings().game.infiniteOil.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteOxygen.setSpeedrunValue(false);
|
getSettings().game.infiniteOxygen.setSpeedrunValue(false);
|
||||||
|
|||||||
+38
-37
@@ -26,43 +26,6 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
namespace dusk::ui {
|
namespace dusk::ui {
|
||||||
|
|
||||||
Rml::String stage_option_label(const MapEntry& map, bool showInternalNames) {
|
|
||||||
return showInternalNames ? fmt::format("{} ({})", map.mapName, map.mapFile) : map.mapName;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rml::String stage_label_for_file(const Rml::String& stageFile, bool showInternalNames) {
|
|
||||||
for (const auto& region : gameRegions) {
|
|
||||||
for (const auto& map : region.maps) {
|
|
||||||
if (stageFile == map.mapFile) {
|
|
||||||
return stage_option_label(map, showInternalNames);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return stageFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
void populate_stage_picker(Pane& pane, std::function<Rml::String()> getStageFile,
|
|
||||||
std::function<void(const char*)> setStageFile, bool showInternalNames) {
|
|
||||||
pane.clear();
|
|
||||||
for (const auto& region : gameRegions) {
|
|
||||||
pane.add_section(region.regionName);
|
|
||||||
for (const auto& map : region.maps) {
|
|
||||||
pane.add_button({
|
|
||||||
.text = stage_option_label(map, showInternalNames),
|
|
||||||
.isSelected =
|
|
||||||
[getStageFile, stageFile = map.mapFile] {
|
|
||||||
return getStageFile() == stageFile;
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.on_pressed([setStageFile, stageFile = map.mapFile] {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
setStageFile(stageFile);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
bool has_save_data() {
|
bool has_save_data() {
|
||||||
@@ -192,6 +155,44 @@ bool parse_vec3(const Rml::String& value, float& x, float& y, float& z) {
|
|||||||
return *cursor == '\0';
|
return *cursor == '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Rml::String stage_option_label(const MapEntry& map) {
|
||||||
|
// TODO: option to show internal name?
|
||||||
|
// return fmt::format("{} ({})", map.mapName, map.mapFile);
|
||||||
|
return map.mapName;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rml::String stage_label_for_file(const Rml::String& stageFile) {
|
||||||
|
for (const auto& region : gameRegions) {
|
||||||
|
for (const auto& map : region.maps) {
|
||||||
|
if (stageFile == map.mapFile) {
|
||||||
|
return stage_option_label(map);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return stageFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
void populate_stage_picker(Pane& pane, std::function<Rml::String()> getStageFile,
|
||||||
|
std::function<void(const char*)> setStageFile) {
|
||||||
|
pane.clear();
|
||||||
|
for (const auto& region : gameRegions) {
|
||||||
|
pane.add_section(region.regionName);
|
||||||
|
for (const auto& map : region.maps) {
|
||||||
|
pane.add_button({
|
||||||
|
.text = stage_option_label(map),
|
||||||
|
.isSelected =
|
||||||
|
[getStageFile, stageFile = map.mapFile] {
|
||||||
|
return getStageFile() == stageFile;
|
||||||
|
},
|
||||||
|
})
|
||||||
|
.on_pressed([setStageFile, stageFile = map.mapFile] {
|
||||||
|
mDoAud_seStartMenu(kSoundItemChange);
|
||||||
|
setStageFile(stageFile);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Rml::String get_player_name() {
|
Rml::String get_player_name() {
|
||||||
if (!has_save_data()) {
|
if (!has_save_data()) {
|
||||||
return "";
|
return "";
|
||||||
|
|||||||
@@ -1,19 +1,8 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "window.hpp"
|
#include "window.hpp"
|
||||||
|
|
||||||
struct MapEntry;
|
|
||||||
|
|
||||||
namespace dusk::ui {
|
namespace dusk::ui {
|
||||||
|
|
||||||
class Pane;
|
|
||||||
|
|
||||||
Rml::String stage_option_label(const MapEntry& map, bool showInternalNames = false);
|
|
||||||
Rml::String stage_label_for_file(const Rml::String& stageFile, bool showInternalNames = false);
|
|
||||||
void populate_stage_picker(Pane& pane, std::function<Rml::String()> getStageFile,
|
|
||||||
std::function<void(const char*)> setStageFile,
|
|
||||||
bool showInternalNames = false);
|
|
||||||
|
|
||||||
class EditorWindow : public Window {
|
class EditorWindow : public Window {
|
||||||
public:
|
public:
|
||||||
EditorWindow();
|
EditorWindow();
|
||||||
|
|||||||
@@ -18,7 +18,6 @@
|
|||||||
#include "modal.hpp"
|
#include "modal.hpp"
|
||||||
#include "settings.hpp"
|
#include "settings.hpp"
|
||||||
#include "ui.hpp"
|
#include "ui.hpp"
|
||||||
#include "warp.hpp"
|
|
||||||
#include "window.hpp"
|
#include "window.hpp"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
@@ -52,9 +51,11 @@ MenuBar::MenuBar() : Document(kDocumentSource), mRoot(mDocument->GetElementById(
|
|||||||
.autoSelect = false,
|
.autoSelect = false,
|
||||||
});
|
});
|
||||||
mTabBar->add_tab("Settings", [this] { push(std::make_unique<SettingsWindow>()); });
|
mTabBar->add_tab("Settings", [this] { push(std::make_unique<SettingsWindow>()); });
|
||||||
|
// mTabBar->add_tab("Warp", [] {
|
||||||
|
// // TODO
|
||||||
|
// });
|
||||||
|
|
||||||
if (getSettings().backend.enableAdvancedSettings) {
|
if (getSettings().backend.enableAdvancedSettings) {
|
||||||
mTabBar->add_tab("Warp", [this] { push(std::make_unique<WarpWindow>()); });
|
|
||||||
mTabBar->add_tab("Editor", [this] { push(std::make_unique<EditorWindow>()); });
|
mTabBar->add_tab("Editor", [this] { push(std::make_unique<EditorWindow>()); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -354,9 +354,8 @@ void Overlay::update() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u32 count = 0;
|
|
||||||
const bool showControllerWarning = PADGetIndexForPort(PAD_CHAN0) < 0 &&
|
const bool showControllerWarning = PADGetIndexForPort(PAD_CHAN0) < 0 &&
|
||||||
PADGetKeyButtonBindings(PAD_CHAN0, &count) == nullptr &&
|
PADGetKeyButtonBindings(PAD_CHAN0, nullptr) == nullptr &&
|
||||||
dynamic_cast<Window*>(top_document()) == nullptr &&
|
dynamic_cast<Window*>(top_document()) == nullptr &&
|
||||||
dynamic_cast<WindowSmall*>(top_document()) == nullptr;
|
dynamic_cast<WindowSmall*>(top_document()) == nullptr;
|
||||||
if (showControllerWarning && mControllerWarning == nullptr) {
|
if (showControllerWarning && mControllerWarning == nullptr) {
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
#include "aurora/gfx.h"
|
#include "aurora/gfx.h"
|
||||||
#include "bool_button.hpp"
|
#include "bool_button.hpp"
|
||||||
#include "controller_config.hpp"
|
#include "controller_config.hpp"
|
||||||
#include "dusk/app_info.hpp"
|
|
||||||
#include "dusk/audio/DuskAudioSystem.h"
|
#include "dusk/audio/DuskAudioSystem.h"
|
||||||
#include "dusk/audio/DuskDsp.hpp"
|
#include "dusk/audio/DuskDsp.hpp"
|
||||||
#include "dusk/config.hpp"
|
#include "dusk/config.hpp"
|
||||||
@@ -18,7 +17,6 @@
|
|||||||
#include "graphics_tuner.hpp"
|
#include "graphics_tuner.hpp"
|
||||||
#include "m_Do/m_Do_main.h"
|
#include "m_Do/m_Do_main.h"
|
||||||
#include "menu_bar.hpp"
|
#include "menu_bar.hpp"
|
||||||
#include "modal.hpp"
|
|
||||||
#include "number_button.hpp"
|
#include "number_button.hpp"
|
||||||
#include "menu_bar.hpp"
|
#include "menu_bar.hpp"
|
||||||
#include "pane.hpp"
|
#include "pane.hpp"
|
||||||
@@ -27,7 +25,6 @@
|
|||||||
|
|
||||||
#include <aurora/lib/window.hpp>
|
#include <aurora/lib/window.hpp>
|
||||||
#include <SDL3/SDL_filesystem.h>
|
#include <SDL3/SDL_filesystem.h>
|
||||||
#include <fmt/format.h>
|
|
||||||
|
|
||||||
#if DUSK_ENABLE_SENTRY_NATIVE
|
#if DUSK_ENABLE_SENTRY_NATIVE
|
||||||
#include "dusk/crash_reporting.h"
|
#include "dusk/crash_reporting.h"
|
||||||
@@ -187,7 +184,6 @@ void reset_for_speedrun_mode() {
|
|||||||
|
|
||||||
getSettings().game.infiniteHearts.setSpeedrunValue(false);
|
getSettings().game.infiniteHearts.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteArrows.setSpeedrunValue(false);
|
getSettings().game.infiniteArrows.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteSeeds.setSpeedrunValue(false);
|
|
||||||
getSettings().game.infiniteBombs.setSpeedrunValue(false);
|
getSettings().game.infiniteBombs.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteOil.setSpeedrunValue(false);
|
getSettings().game.infiniteOil.setSpeedrunValue(false);
|
||||||
getSettings().game.infiniteOxygen.setSpeedrunValue(false);
|
getSettings().game.infiniteOxygen.setSpeedrunValue(false);
|
||||||
@@ -201,7 +197,6 @@ void reset_for_speedrun_mode() {
|
|||||||
getSettings().game.fastRoll.setSpeedrunValue(false);
|
getSettings().game.fastRoll.setSpeedrunValue(false);
|
||||||
getSettings().game.fastSpinner.setSpeedrunValue(false);
|
getSettings().game.fastSpinner.setSpeedrunValue(false);
|
||||||
getSettings().game.freeMagicArmor.setSpeedrunValue(false);
|
getSettings().game.freeMagicArmor.setSpeedrunValue(false);
|
||||||
getSettings().game.invincibleEnemies.setSpeedrunValue(false);
|
|
||||||
|
|
||||||
getSettings().game.pauseOnFocusLost.setSpeedrunValue(false);
|
getSettings().game.pauseOnFocusLost.setSpeedrunValue(false);
|
||||||
aurora_set_pause_on_focus_lost(false);
|
aurora_set_pause_on_focus_lost(false);
|
||||||
@@ -300,49 +295,13 @@ private:
|
|||||||
Rml::String mCurrentRml;
|
Rml::String mCurrentRml;
|
||||||
};
|
};
|
||||||
|
|
||||||
void show_data_folder_error_modal(std::string_view message) {
|
|
||||||
auto dismiss = [](Modal& modal) {
|
|
||||||
mDoAud_seStartMenu(kSoundWindowClose);
|
|
||||||
modal.pop();
|
|
||||||
};
|
|
||||||
push_document(std::make_unique<Modal>(Modal::Props{
|
|
||||||
.title = "Data Folder Not Changed",
|
|
||||||
.bodyRml = escape(message),
|
|
||||||
.actions =
|
|
||||||
{
|
|
||||||
ModalAction{
|
|
||||||
.label = "OK",
|
|
||||||
.onPressed = dismiss,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
.onDismiss = dismiss,
|
|
||||||
.icon = "warning",
|
|
||||||
}));
|
|
||||||
if (auto* doc = top_document()) {
|
|
||||||
doc->focus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void data_folder_dialog_callback(void*, const char* path, const char* error) {
|
void data_folder_dialog_callback(void*, const char* path, const char* error) {
|
||||||
if (error != nullptr) {
|
if (error != nullptr || path == nullptr) {
|
||||||
show_data_folder_error_modal(error);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (path == nullptr) {
|
if (data::set_custom_data_path(path)) {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string dataPathError;
|
|
||||||
if (data::set_custom_data_path(path, &dataPathError)) {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
mDoAud_seStartMenu(kSoundItemChange);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dataPathError.empty()) {
|
|
||||||
dataPathError =
|
|
||||||
fmt::format("{} could not use the selected folder as its data folder.", AppName);
|
|
||||||
}
|
|
||||||
show_data_folder_error_modal(dataPathError);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const Rml::String kInternalResolutionHelpText =
|
const Rml::String kInternalResolutionHelpText =
|
||||||
@@ -953,7 +912,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
[](int value) {
|
[](int value) {
|
||||||
getSettings().audio.masterVolume.setValue(value);
|
getSettings().audio.masterVolume.setValue(value);
|
||||||
config::Save();
|
config::Save();
|
||||||
audio::SetMasterVolume(audio::MasterVolumeToLinear(value / 100.0f));
|
audio::SetMasterVolume(value / 100.f);
|
||||||
},
|
},
|
||||||
.isModified =
|
.isModified =
|
||||||
[] {
|
[] {
|
||||||
@@ -1148,7 +1107,6 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
addCheat("Infinite Hearts", getSettings().game.infiniteHearts, "Keeps your health full.");
|
addCheat("Infinite Hearts", getSettings().game.infiniteHearts, "Keeps your health full.");
|
||||||
addCheat(
|
addCheat(
|
||||||
"Infinite Arrows", getSettings().game.infiniteArrows, "Keeps your arrow count full.");
|
"Infinite Arrows", getSettings().game.infiniteArrows, "Keeps your arrow count full.");
|
||||||
addCheat("Infinite Seeds", getSettings().game.infiniteSeeds, "Keeps your slingshot pellets (seeds) full.");
|
|
||||||
addCheat("Infinite Bombs", getSettings().game.infiniteBombs, "Keeps all bomb bags full.");
|
addCheat("Infinite Bombs", getSettings().game.infiniteBombs, "Keeps all bomb bags full.");
|
||||||
addCheat("Infinite Oil", getSettings().game.infiniteOil, "Keeps your lantern oil full.");
|
addCheat("Infinite Oil", getSettings().game.infiniteOil, "Keeps your lantern oil full.");
|
||||||
addCheat("Infinite Oxygen", getSettings().game.infiniteOxygen,
|
addCheat("Infinite Oxygen", getSettings().game.infiniteOxygen,
|
||||||
@@ -1175,8 +1133,6 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) {
|
|||||||
"Speeds up Spinner movement while holding R.");
|
"Speeds up Spinner movement while holding R.");
|
||||||
addCheat("Free Magic Armor", getSettings().game.freeMagicArmor,
|
addCheat("Free Magic Armor", getSettings().game.freeMagicArmor,
|
||||||
"Lets the magic armor work without consuming rupees.");
|
"Lets the magic armor work without consuming rupees.");
|
||||||
addCheat("Invincible Enemies", getSettings().game.invincibleEnemies,
|
|
||||||
"Prevents enemies from taking damage.");
|
|
||||||
});
|
});
|
||||||
|
|
||||||
add_tab("Interface", [this](Rml::Element* content) {
|
add_tab("Interface", [this](Rml::Element* content) {
|
||||||
|
|||||||
@@ -1,334 +0,0 @@
|
|||||||
#include "warp.hpp"
|
|
||||||
|
|
||||||
#include "editor.hpp"
|
|
||||||
#include "pane.hpp"
|
|
||||||
|
|
||||||
#include "dusk/map_loader_definitions.h"
|
|
||||||
#include "fmt/format.h"
|
|
||||||
|
|
||||||
namespace dusk::ui {
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
constexpr int kMinLayer = -1;
|
|
||||||
constexpr int kMaxLayer = 14;
|
|
||||||
|
|
||||||
struct WarpSelectionState {
|
|
||||||
int regionIdx = 0;
|
|
||||||
int mapIdx = 0;
|
|
||||||
int roomIdx = 0;
|
|
||||||
int pointIdx = 0;
|
|
||||||
int layer = -1;
|
|
||||||
bool showInternalNames = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
WarpSelectionState& selection_state() {
|
|
||||||
static WarpSelectionState state;
|
|
||||||
return state;
|
|
||||||
}
|
|
||||||
|
|
||||||
const RegionEntry* selected_region(const WarpSelectionState& state) {
|
|
||||||
if (state.regionIdx < 0 || state.regionIdx >= static_cast<int>(gameRegions.size())) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return &gameRegions[state.regionIdx];
|
|
||||||
}
|
|
||||||
|
|
||||||
const MapEntry* selected_map(const WarpSelectionState& state) {
|
|
||||||
const auto* region = selected_region(state);
|
|
||||||
if (region == nullptr || state.mapIdx < 0 || state.mapIdx >= static_cast<int>(region->maps.size())) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return ®ion->maps[state.mapIdx];
|
|
||||||
}
|
|
||||||
|
|
||||||
const RoomEntry* selected_room(const WarpSelectionState& state) {
|
|
||||||
const auto* map = selected_map(state);
|
|
||||||
if (map == nullptr || state.roomIdx < 0 || state.roomIdx >= static_cast<int>(map->mapRooms.size())) {
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return &map->mapRooms[state.roomIdx];
|
|
||||||
}
|
|
||||||
|
|
||||||
const s16* selected_point(const WarpSelectionState& state) {
|
|
||||||
const auto* room = selected_room(state);
|
|
||||||
if (room == nullptr || state.pointIdx < 0 ||
|
|
||||||
state.pointIdx >= static_cast<int>(room->roomPoints.size()))
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
return &room->roomPoints[state.pointIdx];
|
|
||||||
}
|
|
||||||
|
|
||||||
void clamp_indices(WarpSelectionState& state) {
|
|
||||||
if (gameRegions.empty()) {
|
|
||||||
state.regionIdx = -1;
|
|
||||||
state.mapIdx = -1;
|
|
||||||
state.roomIdx = -1;
|
|
||||||
state.pointIdx = -1;
|
|
||||||
state.layer = std::clamp(state.layer, kMinLayer, kMaxLayer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.regionIdx = std::clamp(state.regionIdx, 0, static_cast<int>(gameRegions.size()) - 1);
|
|
||||||
const auto& region = gameRegions[state.regionIdx];
|
|
||||||
if (region.maps.empty()) {
|
|
||||||
state.mapIdx = -1;
|
|
||||||
state.roomIdx = -1;
|
|
||||||
state.pointIdx = -1;
|
|
||||||
state.layer = std::clamp(state.layer, kMinLayer, kMaxLayer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.mapIdx = std::clamp(state.mapIdx, 0, static_cast<int>(region.maps.size()) - 1);
|
|
||||||
const auto& map = region.maps[state.mapIdx];
|
|
||||||
if (map.mapRooms.empty()) {
|
|
||||||
state.roomIdx = -1;
|
|
||||||
state.pointIdx = -1;
|
|
||||||
state.layer = std::clamp(state.layer, kMinLayer, kMaxLayer);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
state.roomIdx = std::clamp(state.roomIdx, 0, static_cast<int>(map.mapRooms.size()) - 1);
|
|
||||||
const auto& room = map.mapRooms[state.roomIdx];
|
|
||||||
if (room.roomPoints.empty()) {
|
|
||||||
state.pointIdx = -1;
|
|
||||||
} else {
|
|
||||||
state.pointIdx = std::clamp(state.pointIdx, 0, static_cast<int>(room.roomPoints.size()) - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
state.layer = std::clamp(state.layer, kMinLayer, kMaxLayer);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool can_warp(const WarpSelectionState& state) {
|
|
||||||
return selected_point(state) != nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void reset_selection(WarpSelectionState& state) {
|
|
||||||
state.roomIdx = 0;
|
|
||||||
state.pointIdx = 0;
|
|
||||||
state.layer = kMinLayer;
|
|
||||||
clamp_indices(state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void populate_map_picker(Pane& pane, WarpSelectionState& state) {
|
|
||||||
pane.clear();
|
|
||||||
clamp_indices(state);
|
|
||||||
if (state.regionIdx < 0 || state.regionIdx >= static_cast<int>(gameRegions.size())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pane.add_button({
|
|
||||||
.text = "Show Internal Names",
|
|
||||||
.isSelected = [&state] { return state.showInternalNames; },
|
|
||||||
})
|
|
||||||
.on_pressed([&pane, &state] {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
state.showInternalNames = !state.showInternalNames;
|
|
||||||
populate_map_picker(pane, state);
|
|
||||||
});
|
|
||||||
|
|
||||||
pane.add_section("Maps");
|
|
||||||
const auto& region = gameRegions[state.regionIdx];
|
|
||||||
for (int i = 0; i < static_cast<int>(region.maps.size()); ++i) {
|
|
||||||
pane.add_button({
|
|
||||||
.text = stage_option_label(region.maps[i], state.showInternalNames),
|
|
||||||
.isSelected = [i, &state] { return state.mapIdx == i; },
|
|
||||||
})
|
|
||||||
.on_pressed([i, &state] {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
if (state.mapIdx != i) {
|
|
||||||
state.mapIdx = i;
|
|
||||||
reset_selection(state);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
WarpWindow::WarpWindow() {
|
|
||||||
add_tab("Warp", [this](Rml::Element* content) {
|
|
||||||
auto& leftPane = add_child<Pane>(content, Pane::Type::Controlled);
|
|
||||||
auto& rightPane = add_child<Pane>(content, Pane::Type::Uncontrolled);
|
|
||||||
auto& state = selection_state();
|
|
||||||
clamp_indices(state);
|
|
||||||
|
|
||||||
leftPane.add_section("Destination");
|
|
||||||
leftPane.register_control(
|
|
||||||
leftPane.add_select_button({
|
|
||||||
.key = "Region",
|
|
||||||
.getValue =
|
|
||||||
[&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
const auto* region = selected_region(state);
|
|
||||||
return region == nullptr ? Rml::String{"None"} :
|
|
||||||
Rml::String{region->regionName};
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
rightPane, [&state](Pane& pane) {
|
|
||||||
pane.clear();
|
|
||||||
for (int i = 0; i < static_cast<int>(gameRegions.size()); ++i) {
|
|
||||||
pane.add_button({
|
|
||||||
.text = gameRegions[i].regionName,
|
|
||||||
.isSelected = [i, &state] { return state.regionIdx == i; },
|
|
||||||
})
|
|
||||||
.on_pressed([i, &state] {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
if (state.regionIdx != i) {
|
|
||||||
state.regionIdx = i;
|
|
||||||
state.mapIdx = 0;
|
|
||||||
reset_selection(state);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
leftPane.register_control(
|
|
||||||
leftPane.add_select_button({
|
|
||||||
.key = "Map",
|
|
||||||
.getValue =
|
|
||||||
[&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
const auto* map = selected_map(state);
|
|
||||||
return map == nullptr ? Rml::String{"None"} :
|
|
||||||
stage_option_label(*map, state.showInternalNames);
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
rightPane, [&state](Pane& pane) { populate_map_picker(pane, state); });
|
|
||||||
|
|
||||||
leftPane.register_control(
|
|
||||||
leftPane.add_select_button({
|
|
||||||
.key = "Room",
|
|
||||||
.getValue = [&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
const auto* room = selected_room(state);
|
|
||||||
return room == nullptr ? Rml::String{"None"} :
|
|
||||||
fmt::format("{}", room->roomNo);
|
|
||||||
},
|
|
||||||
.isDisabled = [&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
const auto* map = selected_map(state);
|
|
||||||
return map == nullptr || map->mapRooms.size() <= 1;
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
rightPane, [&state](Pane& pane) {
|
|
||||||
pane.clear();
|
|
||||||
clamp_indices(state);
|
|
||||||
if (state.regionIdx < 0 || state.regionIdx >= static_cast<int>(gameRegions.size())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto& region = gameRegions[state.regionIdx];
|
|
||||||
if (state.mapIdx < 0 || state.mapIdx >= static_cast<int>(region.maps.size())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto& map = region.maps[state.mapIdx];
|
|
||||||
for (int i = 0; i < static_cast<int>(map.mapRooms.size()); ++i) {
|
|
||||||
pane.add_button({
|
|
||||||
.text = fmt::format("{}", map.mapRooms[i].roomNo),
|
|
||||||
.isSelected = [i, &state] { return state.roomIdx == i; },
|
|
||||||
})
|
|
||||||
.on_pressed([i, &state] {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
if (state.roomIdx != i) {
|
|
||||||
state.roomIdx = i;
|
|
||||||
state.pointIdx = 0;
|
|
||||||
clamp_indices(state);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
leftPane.register_control(
|
|
||||||
leftPane.add_select_button({
|
|
||||||
.key = "Point",
|
|
||||||
.getValue = [&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
const auto* point = selected_point(state);
|
|
||||||
return point == nullptr ? Rml::String{"None"} : fmt::format("{}", *point);
|
|
||||||
},
|
|
||||||
.isDisabled = [&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
const auto* room = selected_room(state);
|
|
||||||
return room == nullptr || room->roomPoints.size() <= 1;
|
|
||||||
},
|
|
||||||
}),
|
|
||||||
rightPane, [&state](Pane& pane) {
|
|
||||||
pane.clear();
|
|
||||||
clamp_indices(state);
|
|
||||||
if (state.regionIdx < 0 || state.regionIdx >= static_cast<int>(gameRegions.size())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto& region = gameRegions[state.regionIdx];
|
|
||||||
if (state.mapIdx < 0 || state.mapIdx >= static_cast<int>(region.maps.size())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto& map = region.maps[state.mapIdx];
|
|
||||||
if (state.roomIdx < 0 || state.roomIdx >= static_cast<int>(map.mapRooms.size())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const auto& room = map.mapRooms[state.roomIdx];
|
|
||||||
for (int i = 0; i < static_cast<int>(room.roomPoints.size()); ++i) {
|
|
||||||
pane.add_button({
|
|
||||||
.text = fmt::format("{}", room.roomPoints[i]),
|
|
||||||
.isSelected = [i, &state] { return state.pointIdx == i; },
|
|
||||||
})
|
|
||||||
.on_pressed([i, &state] {
|
|
||||||
if (state.pointIdx != i) {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
state.pointIdx = i;
|
|
||||||
clamp_indices(state);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
leftPane.register_control(
|
|
||||||
leftPane.add_select_button({
|
|
||||||
.key = "Layer",
|
|
||||||
.getValue = [&state] { return fmt::format("{}", state.layer); },
|
|
||||||
}),
|
|
||||||
rightPane, [&state](Pane& pane) {
|
|
||||||
pane.clear();
|
|
||||||
for (int layer = kMinLayer; layer <= kMaxLayer; ++layer) {
|
|
||||||
pane.add_button({
|
|
||||||
.text = fmt::format("{}", layer),
|
|
||||||
.isSelected = [layer, &state] { return state.layer == layer; },
|
|
||||||
})
|
|
||||||
.on_pressed([layer, &state] {
|
|
||||||
if (state.layer != layer) {
|
|
||||||
mDoAud_seStartMenu(kSoundItemChange);
|
|
||||||
state.layer = layer;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
leftPane.add_section("Action");
|
|
||||||
leftPane.register_control(
|
|
||||||
leftPane.add_button({
|
|
||||||
.text = "Warp",
|
|
||||||
.isDisabled = [&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
return !can_warp(state);
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.on_pressed([&state] {
|
|
||||||
clamp_indices(state);
|
|
||||||
if (!can_warp(state)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
mDoAud_seStartMenu(kSoundClick);
|
|
||||||
const auto& region = gameRegions[state.regionIdx];
|
|
||||||
const auto& map = region.maps[state.mapIdx];
|
|
||||||
const auto& room = map.mapRooms[state.roomIdx];
|
|
||||||
dComIfGp_setNextStage( map.mapFile, room.roomPoints[state.pointIdx], room.roomNo, state.layer);
|
|
||||||
}),
|
|
||||||
rightPane, [](Pane& pane) {
|
|
||||||
pane.clear();
|
|
||||||
pane.add_text("Warp to the selected destination.");
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace dusk::ui
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include "window.hpp"
|
|
||||||
|
|
||||||
namespace dusk::ui {
|
|
||||||
|
|
||||||
class WarpWindow : public Window {
|
|
||||||
public:
|
|
||||||
WarpWindow();
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace dusk::ui
|
|
||||||
@@ -792,10 +792,6 @@ static void duskExecute() {
|
|||||||
dComIfGs_setArrowNum(dComIfGs_getArrowMax());
|
dComIfGs_setArrowNum(dComIfGs_getArrowMax());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dusk::getSettings().game.infiniteSeeds) {
|
|
||||||
dComIfGs_setPachinkoNum(dComIfGs_getPachinkoMax());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dusk::getSettings().game.infiniteBombs) {
|
if (dusk::getSettings().game.infiniteBombs) {
|
||||||
dComIfGs_setBombNum(0, 99);
|
dComIfGs_setBombNum(0, 99);
|
||||||
dComIfGs_setBombNum(1, 99);
|
dComIfGs_setBombNum(1, 99);
|
||||||
|
|||||||
+1
-10
@@ -136,17 +136,8 @@ base_process_class* fpcBs_Create(s16 i_profname, fpc_ProcID i_procID, void* i_ap
|
|||||||
u32 size;
|
u32 size;
|
||||||
|
|
||||||
pprofile = (process_profile_definition*)fpcPf_Get(i_profname);
|
pprofile = (process_profile_definition*)fpcPf_Get(i_profname);
|
||||||
if (pprofile == NULL) {
|
|
||||||
#if TARGET_PC
|
|
||||||
DuskLog.debug("fpcBs_Create: profile not found for profname={}", i_profname);
|
|
||||||
#endif
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#if TARGET_PC
|
|
||||||
const char* procName = getProcName(i_profname);
|
|
||||||
DuskLog.debug("fpcBs_Create: pid={} profname={} ({}) profile={} procSize={} unkSize={}",
|
DuskLog.debug("fpcBs_Create: pid={} profname={} ({}) profile={} procSize={} unkSize={}",
|
||||||
i_procID, procName ? procName : "(unknown)", i_profname, (void*)pprofile, pprofile->process_size, pprofile->unk_size);
|
i_procID, getProcName(i_profname), i_profname, (void*)pprofile, pprofile->process_size, pprofile->unk_size);
|
||||||
#endif
|
|
||||||
size = pprofile->process_size + pprofile->unk_size;
|
size = pprofile->process_size + pprofile->unk_size;
|
||||||
|
|
||||||
pprocess = (base_process_class*)cMl::memalignB(-4, size);
|
pprocess = (base_process_class*)cMl::memalignB(-4, size);
|
||||||
|
|||||||
+18
-14
@@ -67,6 +67,7 @@
|
|||||||
|
|
||||||
#include <aurora/aurora.h>
|
#include <aurora/aurora.h>
|
||||||
#include <aurora/event.h>
|
#include <aurora/event.h>
|
||||||
|
#include <aurora/gfx.h>
|
||||||
#include <aurora/main.h>
|
#include <aurora/main.h>
|
||||||
#include <aurora/dvd.h>
|
#include <aurora/dvd.h>
|
||||||
#include <dolphin/dvd.h>
|
#include <dolphin/dvd.h>
|
||||||
@@ -80,7 +81,6 @@
|
|||||||
#include "dusk/audio/DuskAudioSystem.h"
|
#include "dusk/audio/DuskAudioSystem.h"
|
||||||
#include "dusk/audio/DuskDsp.hpp"
|
#include "dusk/audio/DuskDsp.hpp"
|
||||||
#include "dusk/config.hpp"
|
#include "dusk/config.hpp"
|
||||||
#include "dusk/speedrun.h"
|
|
||||||
#include "dusk/settings.h"
|
#include "dusk/settings.h"
|
||||||
#include "dusk/io.hpp"
|
#include "dusk/io.hpp"
|
||||||
#include "dusk/version.hpp"
|
#include "dusk/version.hpp"
|
||||||
@@ -120,7 +120,6 @@ bool dusk::IsShuttingDown = false;
|
|||||||
bool dusk::IsGameLaunched = false;
|
bool dusk::IsGameLaunched = false;
|
||||||
bool dusk::RestartRequested = false;
|
bool dusk::RestartRequested = false;
|
||||||
std::filesystem::path dusk::ConfigPath;
|
std::filesystem::path dusk::ConfigPath;
|
||||||
std::filesystem::path dusk::CachePath;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void dusk::RequestRestart() noexcept {
|
void dusk::RequestRestart() noexcept {
|
||||||
@@ -515,17 +514,12 @@ int game_main(int argc, char* argv[]) {
|
|||||||
|
|
||||||
const auto startupLogLevel =
|
const auto startupLogLevel =
|
||||||
static_cast<AuroraLogLevel>(parsed_arg_options["log-level"].as<uint8_t>());
|
static_cast<AuroraLogLevel>(parsed_arg_options["log-level"].as<uint8_t>());
|
||||||
const auto dataPaths = dusk::data::initialize_data();
|
dusk::ConfigPath = dusk::data::initialize_data();
|
||||||
dusk::ConfigPath = dataPaths.userPath;
|
dusk::InitializeFileLogging(dusk::ConfigPath, startupLogLevel);
|
||||||
dusk::CachePath = dataPaths.cachePath;
|
|
||||||
dusk::InitializeFileLogging(dusk::CachePath, startupLogLevel);
|
|
||||||
|
|
||||||
log_build_info();
|
log_build_info();
|
||||||
|
|
||||||
dusk::config::LoadFromUserPreferences();
|
dusk::config::LoadFromUserPreferences();
|
||||||
if (dusk::getSettings().game.speedrunMode) {
|
|
||||||
dusk::resetForSpeedrunMode();
|
|
||||||
}
|
|
||||||
ApplyCVarOverrides(parsed_arg_options["cvar"]);
|
ApplyCVarOverrides(parsed_arg_options["cvar"]);
|
||||||
dusk::crash_reporting::initialize();
|
dusk::crash_reporting::initialize();
|
||||||
// TODO: How to handle this?
|
// TODO: How to handle this?
|
||||||
@@ -543,12 +537,10 @@ int game_main(int argc, char* argv[]) {
|
|||||||
SDL_SetAppMetadata("Dusklight", DUSK_VERSION_STRING, "dev.twilitrealm.dusk");
|
SDL_SetAppMetadata("Dusklight", DUSK_VERSION_STRING, "dev.twilitrealm.dusk");
|
||||||
|
|
||||||
{
|
{
|
||||||
const auto userPathString = dusk::ConfigPath.u8string();
|
const auto configPathString = dusk::ConfigPath.u8string();
|
||||||
const auto cachePathString = dusk::CachePath.u8string();
|
|
||||||
AuroraConfig config{};
|
AuroraConfig config{};
|
||||||
config.appName = dusk::AppName;
|
config.appName = dusk::AppName;
|
||||||
config.userPath = reinterpret_cast<const char*>(userPathString.c_str());
|
config.configPath = reinterpret_cast<const char*>(configPathString.c_str());
|
||||||
config.cachePath = reinterpret_cast<const char*>(cachePathString.c_str());
|
|
||||||
config.vsync = dusk::getSettings().video.enableVsync;
|
config.vsync = dusk::getSettings().video.enableVsync;
|
||||||
config.startFullscreen = dusk::getSettings().video.enableFullscreen;
|
config.startFullscreen = dusk::getSettings().video.enableFullscreen;
|
||||||
config.windowPosX = -1;
|
config.windowPosX = -1;
|
||||||
@@ -566,6 +558,18 @@ int game_main(int argc, char* argv[]) {
|
|||||||
config.allowTextureReplacements = true;
|
config.allowTextureReplacements = true;
|
||||||
config.allowTextureDumps = false;
|
config.allowTextureDumps = false;
|
||||||
auroraInfo = aurora_initialize(argc, argv, &config);
|
auroraInfo = aurora_initialize(argc, argv, &config);
|
||||||
|
{
|
||||||
|
const auto& g = dusk::getSettings().game;
|
||||||
|
aurora_set_enhanced_lighting_state({
|
||||||
|
g.enhancedLighting.getValue(),
|
||||||
|
g.enableSpecularLighting.getValue(),
|
||||||
|
g.enableRimLighting.getValue(),
|
||||||
|
g.specularIntensity.getValue(),
|
||||||
|
g.rimIntensity.getValue(),
|
||||||
|
g.ambientLightMultiplier.getValue(),
|
||||||
|
g.diffuseLightMultiplier.getValue(),
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DUSK_DISCORD
|
#ifdef DUSK_DISCORD
|
||||||
@@ -585,7 +589,7 @@ int game_main(int argc, char* argv[]) {
|
|||||||
}
|
}
|
||||||
VISetFrameBufferScale(dusk::getSettings().game.internalResolutionScale.getValue());
|
VISetFrameBufferScale(dusk::getSettings().game.internalResolutionScale.getValue());
|
||||||
|
|
||||||
dusk::audio::SetMasterVolume(dusk::audio::MasterVolumeToLinear(dusk::getSettings().audio.masterVolume / 100.0f));
|
dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f);
|
||||||
dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb);
|
dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb);
|
||||||
dusk::audio::EnableHrtf = dusk::getSettings().audio.enableHrtf;
|
dusk::audio::EnableHrtf = dusk::getSettings().audio.enableHrtf;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user