diff --git a/assets/config_menu/general.rml b/assets/config_menu/general.rml index 291bf8c..6fac11c 100644 --- a/assets/config_menu/general.rml +++ b/assets/config_menu/general.rml @@ -5,7 +5,7 @@
-
+
@@ -92,7 +92,7 @@ />
- +
@@ -171,7 +171,7 @@
- +
@@ -225,7 +225,7 @@
- +
@@ -255,7 +255,7 @@
- +
@@ -268,7 +268,7 @@ data-checked="analog_camera_invert_mode" value="InvertNone" id="analog_camera_inversion_none" - style="nav-up: #analog_cam_enabled;" + style="nav-up: #analog_cam_enabled; nav-down: #special_item_hud_enabled" /> @@ -280,7 +280,7 @@ data-checked="analog_camera_invert_mode" value="InvertX" id="analog_camera_inversion_x" - style="nav-up: #analog_cam_disabled;" + style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_enabled" /> @@ -292,7 +292,7 @@ data-checked="analog_camera_invert_mode" value="InvertY" id="analog_camera_inversion_y" - style="nav-up: #analog_cam_disabled;" + style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_disabled" /> @@ -304,16 +304,46 @@ data-checked="analog_camera_invert_mode" value="InvertBoth" id="analog_camera_inversion_both" - style="nav-up: #analog_cam_disabled;" + style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_disabled" />
+ + +
+ +
+ + + + + +
+

- Controls how targeting enemies and objects works. Switch will start or stop targeting each time the target button is pressed. Hold will start when the target button is pressed and stop when the button is released. + Controls how targeting enemies and objects works. Switch will start or stop targeting each time the target button is pressed. Hold will start when the target button is pressed and stop when the button is released.

Controls the strength of rumble when using a controller that supports it. Setting this to zero will disable rumble. @@ -362,6 +392,9 @@

Inverts the camera controls for the analog camera if it's enabled. None is the default.

+

+ Enables visibility of the special item HUD. Affects visibility only, functionality can be modified in the Controls setting tab. On is the default. +

diff --git a/include/zelda_config.h b/include/zelda_config.h index 59b41f0..98b3ab7 100644 --- a/include/zelda_config.h +++ b/include/zelda_config.h @@ -35,6 +35,9 @@ namespace zelda64 { {zelda64::AutosaveMode::Off, "Off"} }); + AutosaveMode get_autosave_mode(); + void set_autosave_mode(AutosaveMode mode); + enum class TargetingMode { Switch, Hold, @@ -81,12 +84,23 @@ namespace zelda64 { {zelda64::AnalogCamMode::Off, "Off"} }); - AutosaveMode get_autosave_mode(); - void set_autosave_mode(AutosaveMode mode); - AnalogCamMode get_analog_cam_mode(); void set_analog_cam_mode(AnalogCamMode mode); + enum class SpecialItemHudMode { + On, + Off, + OptionCount + }; + + NLOHMANN_JSON_SERIALIZE_ENUM(zelda64::SpecialItemHudMode, { + {zelda64::SpecialItemHudMode::On, "On"}, + {zelda64::SpecialItemHudMode::Off, "Off"} + }); + + SpecialItemHudMode get_special_item_hud_mode(); + void set_special_item_hud_mode(SpecialItemHudMode mode); + void open_quit_game_prompt(); }; diff --git a/patches/patches.h b/patches/patches.h index f0f2b5e..701c848 100644 --- a/patches/patches.h +++ b/patches/patches.h @@ -27,6 +27,7 @@ #define gRandFloat sRandFloat #include "global.h" #include "rt64_extended_gbi.h" +#include "patch_helpers.h" #ifndef gEXFillRectangle #define gEXFillRectangle(cmd, lorigin, rorigin, ulx, uly, lrx, lry) \ @@ -101,4 +102,6 @@ void draw_autosave_icon(PlayState* play); void recomp_crash(const char* err); +DECLARE_FUNC(s32, recomp_special_item_hud_enabled); + #endif diff --git a/patches/syms.ld b/patches/syms.ld index a0e5d7d..70325e8 100644 --- a/patches/syms.ld +++ b/patches/syms.ld @@ -44,3 +44,4 @@ recomp_get_inverted_axes = 0x8F0000A4; recomp_high_precision_fb_enabled = 0x8F0000A8; recomp_get_resolution_scale = 0x8F0000AC; recomp_get_analog_inverted_axes = 0x8F0000B0; +recomp_special_item_hud_enabled = 0x8F0000B4; diff --git a/patches/ui_patches.c b/patches/ui_patches.c index a057655..fdc83b7 100644 --- a/patches/ui_patches.c +++ b/patches/ui_patches.c @@ -488,8 +488,10 @@ RECOMP_PATCH void Interface_Draw(PlayState* play) { // @recomp Draw the D-Pad and its item icons as well as the autosave icon if the game is unpaused. if (pauseCtx->state != PAUSE_STATE_MAIN) { - draw_dpad(play); - draw_dpad_icons(play); + if (recomp_special_item_hud_enabled()) { + draw_dpad(play); + draw_dpad_icons(play); + } draw_autosave_icon(play); } diff --git a/src/game/config.cpp b/src/game/config.cpp index ac8ebff..930d2a4 100644 --- a/src/game/config.cpp +++ b/src/game/config.cpp @@ -219,6 +219,7 @@ bool save_general_config(const std::filesystem::path& path) { config_json["autosave_mode"] = zelda64::get_autosave_mode(); config_json["camera_invert_mode"] = zelda64::get_camera_invert_mode(); config_json["analog_cam_mode"] = zelda64::get_analog_cam_mode(); + config_json["special_item_hud_mode"] = zelda64::get_special_item_hud_mode(); config_json["analog_camera_invert_mode"] = zelda64::get_analog_camera_invert_mode(); config_json["debug_mode"] = zelda64::get_debug_mode_enabled(); @@ -235,6 +236,7 @@ void set_general_settings_from_json(const nlohmann::json& config_json) { zelda64::set_autosave_mode(from_or_default(config_json, "autosave_mode", zelda64::AutosaveMode::On)); zelda64::set_camera_invert_mode(from_or_default(config_json, "camera_invert_mode", zelda64::CameraInvertMode::InvertY)); zelda64::set_analog_cam_mode(from_or_default(config_json, "analog_cam_mode", zelda64::AnalogCamMode::Off)); + zelda64::set_special_item_hud_mode(from_or_default(config_json, "special_item_hud_mode", zelda64::SpecialItemHudMode::On)); zelda64::set_analog_camera_invert_mode(from_or_default(config_json, "analog_camera_invert_mode", zelda64::CameraInvertMode::InvertNone)); zelda64::set_debug_mode_enabled(from_or_default(config_json, "debug_mode", false)); } diff --git a/src/game/recomp_api.cpp b/src/game/recomp_api.cpp index 28b4779..582321e 100644 --- a/src/game/recomp_api.cpp +++ b/src/game/recomp_api.cpp @@ -135,6 +135,10 @@ extern "C" void recomp_analog_cam_enabled(uint8_t* rdram, recomp_context* ctx) { _return(ctx, zelda64::get_analog_cam_mode() == zelda64::AnalogCamMode::On); } +extern "C" void recomp_special_item_hud_enabled(uint8_t * rdram, recomp_context * ctx) { + _return(ctx, zelda64::get_special_item_hud_mode() == zelda64::SpecialItemHudMode::On); +} + extern "C" void recomp_get_camera_inputs(uint8_t* rdram, recomp_context* ctx) { float* x_out = _arg<0, float*>(rdram, ctx); float* y_out = _arg<1, float*>(rdram, ctx); diff --git a/src/ui/ui_config.cpp b/src/ui/ui_config.cpp index 12bb20e..22aa053 100644 --- a/src/ui/ui_config.cpp +++ b/src/ui/ui_config.cpp @@ -290,6 +290,7 @@ struct ControlOptionsContext { zelda64::AutosaveMode autosave_mode; zelda64::CameraInvertMode camera_invert_mode; zelda64::AnalogCamMode analog_cam_mode; + zelda64::SpecialItemHudMode special_item_hud_mode; zelda64::CameraInvertMode analog_camera_invert_mode; }; @@ -400,6 +401,17 @@ void zelda64::set_analog_cam_mode(zelda64::AnalogCamMode mode) { } } +zelda64::SpecialItemHudMode zelda64::get_special_item_hud_mode() { + return control_options_context.special_item_hud_mode; +} + +void zelda64::set_special_item_hud_mode(zelda64::SpecialItemHudMode mode) { + control_options_context.special_item_hud_mode = mode; + if (general_model_handle) { + general_model_handle.DirtyVariable("special_item_hud_mode"); + } +} + zelda64::CameraInvertMode zelda64::get_analog_camera_invert_mode() { return control_options_context.analog_camera_invert_mode; } @@ -937,6 +949,7 @@ public: bind_option(constructor, "autosave_mode", &control_options_context.autosave_mode); bind_option(constructor, "camera_invert_mode", &control_options_context.camera_invert_mode); bind_option(constructor, "analog_cam_mode", &control_options_context.analog_cam_mode); + bind_option(constructor, "special_item_hud_mode", &control_options_context.special_item_hud_mode); bind_option(constructor, "analog_camera_invert_mode", &control_options_context.analog_camera_invert_mode); general_model_handle = constructor.GetModelHandle();