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

@ -1,369 +1,402 @@
<template name="config-menu__general"> <template name="config-menu__general">
<head> <head>
</head> </head>
<body> <body>
<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>
<div class="config-option__list"> <div class="config-option__list">
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(0)" data-event-focus="set_cur_config_index(0)"
name="targeting_mode" name="targeting_mode"
data-checked="targeting_mode" data-checked="targeting_mode"
value="Switch" value="Switch"
id="tm_switch" id="tm_switch"
style="nav-up: #tab_general; nav-down: #rumble_strength_input" style="nav-up: #tab_general; nav-down: #rumble_strength_input"
/> />
<label class="config-option__tab-label" for="tm_switch">Switch</label> <label class="config-option__tab-label" for="tm_switch">Switch</label>
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(0)" data-event-focus="set_cur_config_index(0)"
name="targeting_mode" name="targeting_mode"
data-checked="targeting_mode" data-checked="targeting_mode"
value="Hold" value="Hold"
id="tm_hold" id="tm_hold"
style="nav-up: #tab_general; nav-down: #rumble_strength_input" style="nav-up: #tab_general; nav-down: #rumble_strength_input"
/> />
<label class="config-option__tab-label" for="tm_hold">Hold</label> <label class="config-option__tab-label" for="tm_hold">Hold</label>
</div> </div>
</div> </div>
<!-- rumble strength --> <!-- rumble strength -->
<div class="config-option" data-event-mouseover="set_cur_config_index(1)"> <div class="config-option" data-event-mouseover="set_cur_config_index(1)">
<label class="config-option__title">Rumble Strength</label> <label class="config-option__title">Rumble Strength</label>
<div class="config-option__range-wrapper config-option__list"> <div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{rumble_strength}}%</label> <label class="config-option__range-label">{{rumble_strength}}%</label>
<input <input
class="nav-vert" class="nav-vert"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(1)" data-event-focus="set_cur_config_index(1)"
id="rumble_strength_input" id="rumble_strength_input"
type="range" type="range"
min="0" min="0"
max="100" max="100"
style="flex: 1; margin: 0dp;" style="flex: 1; margin: 0dp;"
data-value="rumble_strength" data-value="rumble_strength"
/> />
</div> </div>
</div> </div>
<!-- gyro sensitivity --> <!-- gyro sensitivity -->
<div class="config-option" data-event-mouseover="set_cur_config_index(2)"> <div class="config-option" data-event-mouseover="set_cur_config_index(2)">
<label class="config-option__title">Gyro Sensitivity</label> <label class="config-option__title">Gyro Sensitivity</label>
<div class="config-option__range-wrapper config-option__list"> <div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{gyro_sensitivity}}%</label> <label class="config-option__range-label">{{gyro_sensitivity}}%</label>
<input <input
class="nav-vert" class="nav-vert"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(2)" data-event-focus="set_cur_config_index(2)"
id="gyro_sensitivity_input" id="gyro_sensitivity_input"
type="range" type="range"
min="0" min="0"
max="100" max="100"
style="flex: 1; margin: 0dp;" style="flex: 1; margin: 0dp;"
data-value="gyro_sensitivity" data-value="gyro_sensitivity"
/> />
</div> </div>
</div> </div>
<!-- mouse sensitivity --> <!-- mouse sensitivity -->
<div class="config-option" data-event-mouseover="set_cur_config_index(3)"> <div class="config-option" data-event-mouseover="set_cur_config_index(3)">
<label class="config-option__title">Mouse Sensitivity</label> <label class="config-option__title">Mouse Sensitivity</label>
<div class="config-option__range-wrapper config-option__list"> <div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{mouse_sensitivity}}%</label> <label class="config-option__range-label">{{mouse_sensitivity}}%</label>
<input <input
class="nav-vert" class="nav-vert"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(3)" data-event-focus="set_cur_config_index(3)"
id="mouse_sensitivity_input" id="mouse_sensitivity_input"
type="range" type="range"
min="0" min="0"
max="100" max="100"
style="flex: 1; margin: 0dp;" style="flex: 1; margin: 0dp;"
data-value="mouse_sensitivity" data-value="mouse_sensitivity"
/> />
</div> </div>
</div> </div>
<!-- joystick deadzone -->
<div class="config-option" data-event-mouseover="set_cur_config_index(4)">
<label class="config-option__title">Joystick Deadzone</label>
<div class="config-option__range-wrapper config-option__list">
<label class="config-option__range-label">{{joystick_deadzone}}%</label>
<input
class="nav-vert"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(4)"
id="joystick_deadzone_input"
type="range"
min="0"
max="100"
style="flex: 1; margin: 0dp; nav-down: #bg_input_enabled"
data-value="joystick_deadzone"
/>
</div>
</div>
<!-- background input --> <!-- joystick deadzone -->
<div class="config-option" data-event-mouseover="set_cur_config_index(5)" id="conf-general__Background-Input"> <div class="config-option" data-event-mouseover="set_cur_config_index(4)">
<label class="config-option__title">Background Input</label> <label class="config-option__title">Joystick Deadzone</label>
<div class="config-option__list"> <div class="config-option__range-wrapper config-option__list">
<input <label class="config-option__range-label">{{joystick_deadzone}}%</label>
type="radio" <input
data-event-blur="set_cur_config_index(-1)" class="nav-vert"
data-event-focus="set_cur_config_index(5)" data-event-blur="set_cur_config_index(-1)"
name="background_input_mode" data-event-focus="set_cur_config_index(4)"
data-checked="background_input_mode" id="joystick_deadzone_input"
value="On" type="range"
id="bg_input_enabled" min="0"
style="nav-up: #joystick_deadzone_input; nav-down: #autosave_enabled" max="100"
style="flex: 1; margin: 0dp; nav-down: #bg_input_enabled"
data-value="joystick_deadzone"
/> />
<label class="config-option__tab-label" for="bg_input_enabled">On</label> </div>
</div>
<input <!-- background input -->
type="radio" <div class="config-option" data-event-mouseover="set_cur_config_index(5)" id="conf-general__Background-Input">
data-event-blur="set_cur_config_index(-1)" <label class="config-option__title">Background Input</label>
data-event-focus="set_cur_config_index(5)" <div class="config-option__list">
name="background_input_mode" <input
data-checked="background_input_mode" type="radio"
value="Off" data-event-blur="set_cur_config_index(-1)"
id="bg_input_disabled" data-event-focus="set_cur_config_index(5)"
style="nav-up: #joystick_deadzone_input; nav-down: #autosave_disabled" name="background_input_mode"
data-checked="background_input_mode"
value="On"
id="bg_input_enabled"
style="nav-up: #joystick_deadzone_input; nav-down: #autosave_enabled"
/> />
<label class="config-option__tab-label" for="bg_input_disabled">Off</label> <label class="config-option__tab-label" for="bg_input_enabled">On</label>
</div>
</div>
<!-- autosave --> <input
<div class="config-option" data-event-mouseover="set_cur_config_index(6)"> type="radio"
<label class="config-option__title">Autosaving</label> data-event-blur="set_cur_config_index(-1)"
<div class="config-option__list"> data-event-focus="set_cur_config_index(5)"
<input name="background_input_mode"
type="radio" data-checked="background_input_mode"
data-event-blur="set_cur_config_index(-1)" value="Off"
data-event-focus="set_cur_config_index(6)" id="bg_input_disabled"
name="autosave_mode" style="nav-up: #joystick_deadzone_input; nav-down: #autosave_disabled"
data-checked="autosave_mode"
value="On"
id="autosave_enabled"
style="nav-up: #bg_input_enabled; nav-down: #camera_inversion_none"
/> />
<label class="config-option__tab-label" for="autosave_enabled">On</label> <label class="config-option__tab-label" for="bg_input_disabled">Off</label>
</div>
</div>
<input <!-- autosave -->
type="radio" <div class="config-option" data-event-mouseover="set_cur_config_index(6)">
data-event-blur="set_cur_config_index(-1)" <label class="config-option__title">Autosaving</label>
data-event-focus="set_cur_config_index(6)" <div class="config-option__list">
name="autosave_mode" <input
data-checked="autosave_mode" type="radio"
value="Off" data-event-blur="set_cur_config_index(-1)"
id="autosave_disabled" data-event-focus="set_cur_config_index(6)"
style="nav-up: #bg_input_disabled; nav-down: #camera_inversion_x" name="autosave_mode"
data-checked="autosave_mode"
value="On"
id="autosave_enabled"
style="nav-up: #bg_input_enabled; nav-down: #camera_inversion_none"
/> />
<label class="config-option__tab-label" for="autosave_disabled">Off</label> <label class="config-option__tab-label" for="autosave_enabled">On</label>
</div>
</div>
<!-- camera inversion -->
<div class="config-option" data-event-mouseover="set_cur_config_index(7)">
<label class="config-option__title">Aiming Camera Mode</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)"
name="camera_invert_mode"
data-checked="camera_invert_mode"
value="InvertNone"
id="camera_inversion_none"
style="nav-up: #autosave_enabled; nav-down: #analog_cam_enabled"
/>
<label class="config-option__tab-label" for="camera_inversion_none">None</label>
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)" data-event-focus="set_cur_config_index(6)"
name="camera_invert_mode" name="autosave_mode"
data-checked="camera_invert_mode" data-checked="autosave_mode"
value="InvertX" value="Off"
id="camera_inversion_x" id="autosave_disabled"
style="nav-up: #autosave_disabled; nav-down: #analog_cam_disabled" style="nav-up: #bg_input_disabled; nav-down: #camera_inversion_x"
/> />
<label class="config-option__tab-label" for="camera_inversion_x">Invert X</label> <label class="config-option__tab-label" for="autosave_disabled">Off</label>
</div>
</div>
<input <!-- camera inversion -->
type="radio" <div class="config-option" data-event-mouseover="set_cur_config_index(7)">
data-event-blur="set_cur_config_index(-1)" <label class="config-option__title">Aiming Camera Mode</label>
data-event-focus="set_cur_config_index(7)" <div class="config-option__list">
name="camera_invert_mode" <input
data-checked="camera_invert_mode" type="radio"
value="InvertY" data-event-blur="set_cur_config_index(-1)"
id="camera_inversion_y" data-event-focus="set_cur_config_index(7)"
style="nav-up: #autosave_disabled; nav-down: #analog_cam_disabled" name="camera_invert_mode"
data-checked="camera_invert_mode"
value="InvertNone"
id="camera_inversion_none"
style="nav-up: #autosave_enabled; nav-down: #analog_cam_enabled"
/> />
<label class="config-option__tab-label" for="camera_inversion_y">Invert Y</label> <label class="config-option__tab-label" for="camera_inversion_none">None</label>
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(7)" data-event-focus="set_cur_config_index(7)"
name="camera_invert_mode" name="camera_invert_mode"
data-checked="camera_invert_mode" data-checked="camera_invert_mode"
value="InvertBoth" value="InvertX"
id="camera_inversion_both" id="camera_inversion_x"
style="nav-up: #autosave_disabled; nav-down: #analog_cam_disabled" style="nav-up: #autosave_disabled; nav-down: #analog_cam_disabled"
/> />
<label class="config-option__tab-label" for="camera_inversion_both">Invert Both</label> <label class="config-option__tab-label" for="camera_inversion_x">Invert X</label>
</div>
</div>
<!-- analog camera -->
<div class="config-option" data-event-mouseover="set_cur_config_index(8)">
<label class="config-option__title">Analog Camera</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(8)"
name="analog_cam_mode"
data-checked="analog_cam_mode"
value="On"
id="analog_cam_enabled"
style="nav-up: #camera_inversion_none; nav-down: #analog_camera_inversion_none"
/>
<label class="config-option__tab-label" for="analog_cam_enabled">On</label>
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(8)" data-event-focus="set_cur_config_index(7)"
name="analog_cam_mode" name="camera_invert_mode"
data-checked="analog_cam_mode" data-checked="camera_invert_mode"
value="Off" value="InvertY"
id="analog_cam_disabled" id="camera_inversion_y"
style="nav-up: #camera_inversion_x; nav-down: #analog_camera_inversion_x" style="nav-up: #autosave_disabled; nav-down: #analog_cam_disabled"
/> />
<label class="config-option__tab-label" for="analog_cam_disabled">Off</label> <label class="config-option__tab-label" for="camera_inversion_y">Invert Y</label>
</div>
</div>
<!-- analog camera inversion -->
<div class="config-option" data-event-mouseover="set_cur_config_index(9)">
<label class="config-option__title">Analog Camera Mode</label>
<div class="config-option__list">
<input
type="radio"
data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)"
name="analog_camera_invert_mode"
data-checked="analog_camera_invert_mode"
value="InvertNone"
id="analog_camera_inversion_none"
style="nav-up: #analog_cam_enabled;"
/>
<label class="config-option__tab-label" for="analog_camera_inversion_none">None</label>
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)" data-event-focus="set_cur_config_index(7)"
name="analog_camera_invert_mode" name="camera_invert_mode"
data-checked="analog_camera_invert_mode" data-checked="camera_invert_mode"
value="InvertX" value="InvertBoth"
id="analog_camera_inversion_x" id="camera_inversion_both"
style="nav-up: #analog_cam_disabled;" style="nav-up: #autosave_disabled; nav-down: #analog_cam_disabled"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_x">Invert X</label> <label class="config-option__tab-label" for="camera_inversion_both">Invert Both</label>
</div>
</div>
<input <!-- analog camera -->
type="radio" <div class="config-option" data-event-mouseover="set_cur_config_index(8)">
data-event-blur="set_cur_config_index(-1)" <label class="config-option__title">Analog Camera</label>
data-event-focus="set_cur_config_index(9)" <div class="config-option__list">
name="analog_camera_invert_mode" <input
data-checked="analog_camera_invert_mode" type="radio"
value="InvertY" data-event-blur="set_cur_config_index(-1)"
id="analog_camera_inversion_y" data-event-focus="set_cur_config_index(8)"
style="nav-up: #analog_cam_disabled;" name="analog_cam_mode"
data-checked="analog_cam_mode"
value="On"
id="analog_cam_enabled"
style="nav-up: #camera_inversion_none; nav-down: #analog_camera_inversion_none"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_y">Invert Y</label> <label class="config-option__tab-label" for="analog_cam_enabled">On</label>
<input <input
type="radio" type="radio"
data-event-blur="set_cur_config_index(-1)" data-event-blur="set_cur_config_index(-1)"
data-event-focus="set_cur_config_index(9)" data-event-focus="set_cur_config_index(8)"
name="analog_camera_invert_mode" name="analog_cam_mode"
data-checked="analog_camera_invert_mode" data-checked="analog_cam_mode"
value="InvertBoth" value="Off"
id="analog_camera_inversion_both" id="analog_cam_disabled"
style="nav-up: #analog_cam_disabled;" style="nav-up: #camera_inversion_x; nav-down: #analog_camera_inversion_x"
/> />
<label class="config-option__tab-label" for="analog_camera_inversion_both">Invert Both</label> <label class="config-option__tab-label" for="analog_cam_disabled">Off</label>
</div> </div>
</div> </div>
</div>
<!-- Descriptions --> <!-- analog camera inversion -->
<div class="config__wrapper"> <div class="config-option" data-event-mouseover="set_cur_config_index(9)">
<p data-if="cur_config_index == 0"> <label class="config-option__title">Analog Camera Mode</label>
Controls how targeting enemies and objects works. <b>Switch</b> will start or stop targeting each time the target button is pressed. <b>Hold</b> will start when the target button is pressed and stop when the button is released. <div class="config-option__list">
</p> <input
<p data-if="cur_config_index == 1"> type="radio"
Controls the strength of rumble when using a controller that supports it. <b>Setting this to zero will disable rumble.</b> data-event-blur="set_cur_config_index(-1)"
</p> data-event-focus="set_cur_config_index(9)"
<p data-if="cur_config_index == 2"> name="analog_camera_invert_mode"
Controls the sensitivity of gyro aiming when using items in first person for controllers that support it. <b>Setting this to zero will disable gyro.</b> data-checked="analog_camera_invert_mode"
<br /> value="InvertNone"
<br /> id="analog_camera_inversion_none"
<b>Note: To recalibrate controller gyro, set the controller down on a still, flat surface for 5 seconds.</b> style="nav-up: #analog_cam_enabled; nav-down: #special_item_hud_enabled"
</p> />
<p data-if="cur_config_index == 3"> <label class="config-option__tab-label" for="analog_camera_inversion_none">None</label>
Controls the sensitivity of mouse aiming when using items in first person. <b>Setting this to zero will disable mouse aiming.</b>
<br /> <input
<br /> type="radio"
<b>Note: This option does not allow mouse buttons to activate items. Mouse aiming is intended to be used with inputs that are mapped to mouse movement, such as gyro on Steam Deck.</b> data-event-blur="set_cur_config_index(-1)"
</p> data-event-focus="set_cur_config_index(9)"
<p data-if="cur_config_index == 4"> name="analog_camera_invert_mode"
Applies a deadzone to joystick inputs. data-checked="analog_camera_invert_mode"
</p> value="InvertX"
<p data-if="cur_config_index == 5"> id="analog_camera_inversion_x"
Allows the game to read controller input when out of focus. style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_enabled"
<br/> />
<b>This setting does not affect keyboard input.</b> <label class="config-option__tab-label" for="analog_camera_inversion_x">Invert X</label>
</p>
<p data-if="cur_config_index == 6"> <input
Turns on autosaving and prevents owl saves from being deleted on load. Autosaves act as owl saves and take up the same slot as they do. type="radio"
<br/> data-event-blur="set_cur_config_index(-1)"
<br/> data-event-focus="set_cur_config_index(9)"
Loading an autosave will place you in Clock Town or at the entrance of the current dungeon if you were in one. name="analog_camera_invert_mode"
<br/> data-checked="analog_camera_invert_mode"
<br/> value="InvertY"
<b>If autosaving is disabled, existing autosaves will be deleted when loaded.</b> id="analog_camera_inversion_y"
</p> style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_disabled"
<p data-if="cur_config_index == 7"> />
Inverts the camera controls for first-person aiming. <b>Invert Y</b> is the default and matches the original game. <label class="config-option__tab-label" for="analog_camera_inversion_y">Invert Y</label>
</p>
<p data-if="cur_config_index == 8"> <input
Enables an analog "free" camera similar to later entries in the series that's mapped to the right analog stick on the controller. type="radio"
<br/> data-event-blur="set_cur_config_index(-1)"
<br/> data-event-focus="set_cur_config_index(9)"
When you move the right stick, the camera will enter free mode and stop centering behind Link. Press the <b>Target</b> button at any time to go back into the normal camera mode. The camera will also return to normal mode after a cutscene plays or when you move between areas. name="analog_camera_invert_mode"
<br/> data-checked="analog_camera_invert_mode"
<br/> value="InvertBoth"
This option also enables right stick control while looking and aiming. id="analog_camera_inversion_both"
</p> style="nav-up: #analog_cam_disabled; nav-down: #special_item_hud_disabled"
<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. <label class="config-option__tab-label" for="analog_camera_inversion_both">Invert Both</label>
</p> </div>
</div> </div>
</div>
</form> <!-- special item hud -->
</body> <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>
<!-- Descriptions -->
<div class="config__wrapper">
<p data-if="cur_config_index == 0">
Controls how targeting enemies and objects works. <b>Switch</b> will start or stop targeting each time the target button is pressed. <b>Hold</b> will start when the target button is pressed and stop when the button is released.
</p>
<p data-if="cur_config_index == 1">
Controls the strength of rumble when using a controller that supports it. <b>Setting this to zero will disable rumble.</b>
</p>
<p data-if="cur_config_index == 2">
Controls the sensitivity of gyro aiming when using items in first person for controllers that support it. <b>Setting this to zero will disable gyro.</b>
<br />
<br />
<b>Note: To recalibrate controller gyro, set the controller down on a still, flat surface for 5 seconds.</b>
</p>
<p data-if="cur_config_index == 3">
Controls the sensitivity of mouse aiming when using items in first person. <b>Setting this to zero will disable mouse aiming.</b>
<br />
<br />
<b>Note: This option does not allow mouse buttons to activate items. Mouse aiming is intended to be used with inputs that are mapped to mouse movement, such as gyro on Steam Deck.</b>
</p>
<p data-if="cur_config_index == 4">
Applies a deadzone to joystick inputs.
</p>
<p data-if="cur_config_index == 5">
Allows the game to read controller input when out of focus.
<br/>
<b>This setting does not affect keyboard input.</b>
</p>
<p data-if="cur_config_index == 6">
Turns on autosaving and prevents owl saves from being deleted on load. Autosaves act as owl saves and take up the same slot as they do.
<br/>
<br/>
Loading an autosave will place you in Clock Town or at the entrance of the current dungeon if you were in one.
<br/>
<br/>
<b>If autosaving is disabled, existing autosaves will be deleted when loaded.</b>
</p>
<p data-if="cur_config_index == 7">
Inverts the camera controls for first-person aiming. <b>Invert Y</b> is the default and matches the original game.
</p>
<p data-if="cur_config_index == 8">
Enables an analog "free" camera similar to later entries in the series that's mapped to the right analog stick on the controller.
<br/>
<br/>
When you move the right stick, the camera will enter free mode and stop centering behind Link. Press the <b>Target</b> button at any time to go back into the normal camera mode. The camera will also return to normal mode after a cutscene plays or when you move between areas.
<br/>
<br/>
This option also enables right stick control while looking and aiming.
</p>
<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.
</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>
</form>
</body>
</template> </template>

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) {
draw_dpad(play); if (recomp_special_item_hud_enabled()) {
draw_dpad_icons(play); draw_dpad(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();