Implement special item hud toggle.

This commit is contained in:
hatcyl 2024-07-22 21:34:35 -07:00
parent e35bb0700f
commit 3e6773970d
8 changed files with 414 additions and 343 deletions

View File

@ -5,7 +5,7 @@
<form class="config__form" id="conf-general__form"> <form class="config__form" id="conf-general__form">
<div class="config__hz-wrapper" id="conf-general__hz-wrapper"> <div class="config__hz-wrapper" id="conf-general__hz-wrapper">
<!-- Options --> <!-- Options -->
<div class="config__wrapper" data-event-mouseout="set_cur_config_index(-1)" id="conf-general__wrapper"> <div class="config__wrapper" data-event-mouseout="set_cur_config_index(-1)" id="conf-general__wrapper" style="overflow:auto;max-height:100%">
<!-- targeting mode --> <!-- targeting mode -->
<div class="config-option" data-event-mouseover="set_cur_config_index(0)" id="conf-general__Targeting-Mode"> <div class="config-option" data-event-mouseover="set_cur_config_index(0)" id="conf-general__Targeting-Mode">
<label class="config-option__title">Targeting Mode</label> <label class="config-option__title">Targeting Mode</label>
@ -268,7 +268,7 @@
data-checked="analog_camera_invert_mode" data-checked="analog_camera_invert_mode"
value="InvertNone" value="InvertNone"
id="analog_camera_inversion_none" id="analog_camera_inversion_none"
style="nav-up: #analog_cam_enabled;" style="nav-up: #analog_cam_enabled; nav-down: #special_item_hud_enabled"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_none">None</label> <label class="config-option__tab-label" for="analog_camera_inversion_none">None</label>
@ -280,7 +280,7 @@
data-checked="analog_camera_invert_mode" data-checked="analog_camera_invert_mode"
value="InvertX" value="InvertX"
id="analog_camera_inversion_x" id="analog_camera_inversion_x"
style="nav-up: #analog_cam_disabled;" style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_enabled"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_x">Invert X</label> <label class="config-option__tab-label" for="analog_camera_inversion_x">Invert X</label>
@ -292,7 +292,7 @@
data-checked="analog_camera_invert_mode" data-checked="analog_camera_invert_mode"
value="InvertY" value="InvertY"
id="analog_camera_inversion_y" id="analog_camera_inversion_y"
style="nav-up: #analog_cam_disabled;" style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_disabled"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_y">Invert Y</label> <label class="config-option__tab-label" for="analog_camera_inversion_y">Invert Y</label>
@ -304,11 +304,41 @@
data-checked="analog_camera_invert_mode" data-checked="analog_camera_invert_mode"
value="InvertBoth" value="InvertBoth"
id="analog_camera_inversion_both" id="analog_camera_inversion_both"
style="nav-up: #analog_cam_disabled;" style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_disabled"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_both">Invert Both</label> <label class="config-option__tab-label" for="analog_camera_inversion_both">Invert Both</label>
</div> </div>
</div> </div>
<!-- special item hud -->
<div class="config-option" data-event-mouseover="set_cur_config_index(10)">
<label class="config-option__title">Special Item HUD</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(10)"
name="special_item_hud_mode"
data-checked="special_item_hud_mode"
value="On"
id="special_item_hud_enabled"
style="nav-up: #analog_camera_inversion_none;"
/>
<label class="config-option__tab-label" for="special_item_hud_enabled">On</label>
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(10)"
name="special_item_hud_mode"
data-checked="special_item_hud_mode"
value="Off"
id="special_item_hud_disabled"
style="nav-up: #analog_camera_inversion_x;"
/>
<label class="config-option__tab-label" for="special_item_hud_disabled">Off</label>
</div>
</div>
</div> </div>
<!-- Descriptions --> <!-- Descriptions -->
<div class="config__wrapper"> <div class="config__wrapper">
@ -362,6 +392,9 @@
<p data-if="cur_config_index == 9"> <p data-if="cur_config_index == 9">
Inverts the camera controls for the analog camera if it's enabled. <b>None</b> is the default. Inverts the camera controls for the analog camera if it's enabled. <b>None</b> is the default.
</p> </p>
<p data-if="cur_config_index == 10">
Enables visibility of the special item HUD. Affects visibility only, functionality can be modified in the <b>Controls</b> setting tab. <b>On</b> is the default.
</p>
</div> </div>
</div> </div>
</form> </form>

View File

@ -35,6 +35,9 @@ namespace zelda64 {
{zelda64::AutosaveMode::Off, "Off"} {zelda64::AutosaveMode::Off, "Off"}
}); });
AutosaveMode get_autosave_mode();
void set_autosave_mode(AutosaveMode mode);
enum class TargetingMode { enum class TargetingMode {
Switch, Switch,
Hold, Hold,
@ -81,12 +84,23 @@ namespace zelda64 {
{zelda64::AnalogCamMode::Off, "Off"} {zelda64::AnalogCamMode::Off, "Off"}
}); });
AutosaveMode get_autosave_mode();
void set_autosave_mode(AutosaveMode mode);
AnalogCamMode get_analog_cam_mode(); AnalogCamMode get_analog_cam_mode();
void set_analog_cam_mode(AnalogCamMode 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(); void open_quit_game_prompt();
}; };

View File

@ -23,6 +23,7 @@
#define gRandFloat sRandFloat #define gRandFloat sRandFloat
#include "global.h" #include "global.h"
#include "rt64_extended_gbi.h" #include "rt64_extended_gbi.h"
#include "patch_helpers.h"
#ifndef gEXFillRectangle #ifndef gEXFillRectangle
#define gEXFillRectangle(cmd, lorigin, rorigin, ulx, uly, lrx, lry) \ #define gEXFillRectangle(cmd, lorigin, rorigin, ulx, uly, lrx, lry) \
@ -97,4 +98,6 @@ void draw_autosave_icon(PlayState* play);
void recomp_crash(const char* err); void recomp_crash(const char* err);
DECLARE_FUNC(s32, recomp_special_item_hud_enabled);
#endif #endif

View File

@ -44,3 +44,4 @@ recomp_get_inverted_axes = 0x8F0000A4;
recomp_high_precision_fb_enabled = 0x8F0000A8; recomp_high_precision_fb_enabled = 0x8F0000A8;
recomp_get_resolution_scale = 0x8F0000AC; recomp_get_resolution_scale = 0x8F0000AC;
recomp_get_analog_inverted_axes = 0x8F0000B0; recomp_get_analog_inverted_axes = 0x8F0000B0;
recomp_special_item_hud_enabled = 0x8F0000B4;

View File

@ -488,8 +488,10 @@ 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. // @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) { if (pauseCtx->state != PAUSE_STATE_MAIN) {
if (recomp_special_item_hud_enabled()) {
draw_dpad(play); draw_dpad(play);
draw_dpad_icons(play); draw_dpad_icons(play);
}
draw_autosave_icon(play); draw_autosave_icon(play);
} }

View File

@ -218,7 +218,8 @@ bool save_general_config(const std::filesystem::path& path) {
config_json["joystick_deadzone"] = recomp::get_joystick_deadzone(); config_json["joystick_deadzone"] = recomp::get_joystick_deadzone();
config_json["autosave_mode"] = zelda64::get_autosave_mode(); config_json["autosave_mode"] = zelda64::get_autosave_mode();
config_json["camera_invert_mode"] = zelda64::get_camera_invert_mode(); config_json["camera_invert_mode"] = zelda64::get_camera_invert_mode();
config_json["analog_cam_mode"] = zelda64::get_analog_cam_mode(); config_json["analog_cam_mode"] = zelda64::get_special_item_hud_mode();
config_json["special_item_hud_mode"] = zelda64::get_analog_cam_mode();
config_json["analog_camera_invert_mode"] = zelda64::get_analog_camera_invert_mode(); config_json["analog_camera_invert_mode"] = zelda64::get_analog_camera_invert_mode();
config_json["debug_mode"] = zelda64::get_debug_mode_enabled(); config_json["debug_mode"] = zelda64::get_debug_mode_enabled();
@ -234,7 +235,7 @@ void set_general_settings_from_json(const nlohmann::json& config_json) {
recomp::set_joystick_deadzone(from_or_default(config_json, "joystick_deadzone", 5)); recomp::set_joystick_deadzone(from_or_default(config_json, "joystick_deadzone", 5));
zelda64::set_autosave_mode(from_or_default(config_json, "autosave_mode", zelda64::AutosaveMode::On)); 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_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_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)); zelda64::set_debug_mode_enabled(from_or_default(config_json, "debug_mode", false));
} }

View File

@ -135,6 +135,10 @@ extern "C" void recomp_analog_cam_enabled(uint8_t* rdram, recomp_context* ctx) {
_return<s32>(ctx, zelda64::get_analog_cam_mode() == zelda64::AnalogCamMode::On); _return<s32>(ctx, zelda64::get_analog_cam_mode() == zelda64::AnalogCamMode::On);
} }
extern "C" void recomp_special_item_hud_enabled(uint8_t * rdram, recomp_context * ctx) {
_return<s32>(ctx, zelda64::get_special_item_hud_mode() == zelda64::SpecialItemHudMode::On);
}
extern "C" void recomp_get_camera_inputs(uint8_t* rdram, recomp_context* ctx) { extern "C" void recomp_get_camera_inputs(uint8_t* rdram, recomp_context* ctx) {
float* x_out = _arg<0, float*>(rdram, ctx); float* x_out = _arg<0, float*>(rdram, ctx);
float* y_out = _arg<1, float*>(rdram, ctx); float* y_out = _arg<1, float*>(rdram, ctx);

View File

@ -290,6 +290,7 @@ struct ControlOptionsContext {
zelda64::AutosaveMode autosave_mode; zelda64::AutosaveMode autosave_mode;
zelda64::CameraInvertMode camera_invert_mode; zelda64::CameraInvertMode camera_invert_mode;
zelda64::AnalogCamMode analog_cam_mode; zelda64::AnalogCamMode analog_cam_mode;
zelda64::SpecialItemHudMode special_item_hud_mode;
zelda64::CameraInvertMode analog_camera_invert_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() { zelda64::CameraInvertMode zelda64::get_analog_camera_invert_mode() {
return control_options_context.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, "autosave_mode", &control_options_context.autosave_mode);
bind_option(constructor, "camera_invert_mode", &control_options_context.camera_invert_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, "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); bind_option(constructor, "analog_camera_invert_mode", &control_options_context.analog_camera_invert_mode);
general_model_handle = constructor.GetModelHandle(); general_model_handle = constructor.GetModelHandle();