diff --git a/src/BRBmenu.asm b/src/BRBmenu.asm
index 69d740c1..478d47b1 100644
--- a/src/BRBmenu.asm
+++ b/src/BRBmenu.asm
@@ -70,7 +70,7 @@ brb_menu_timer_clear:
brb_menu_cycle_timer:
%cm_numfield_word("Cycle Timer (seconds)", !ram_cm_brb_set_cycle, 1, 512, 1, 10, .routine)
.routine
- LDA !ram_cm_brb_set_cycle : BNE .setTime
+ TAX : BNE .setTime
LDA #$0009 ; default to ~10s
.setTime
ASL #6 : STA !ram_cm_brb_cycle_time
diff --git a/src/defines.asm b/src/defines.asm
index 9127b865..dcdc212f 100644
--- a/src/defines.asm
+++ b/src/defines.asm
@@ -384,6 +384,8 @@
!ram_cm_brb_set_cycle = !WRAM_MENU_START+$AC
!ram_cm_brb_cycle_time = !WRAM_MENU_START+$AE
+!ram_cm_grapple = !WRAM_MENU_START+$90
+!ram_cm_xray = !WRAM_MENU_START+$92
!ram_cm_manage_slots = !WRAM_MENU_START+$90
!ram_cm_selected_slot = !WRAM_MENU_START+$92
!ram_cm_preset_elevator = !WRAM_MENU_START+$94
@@ -472,7 +474,7 @@
; SRAM
; -----
-!SRAM_VERSION = #$001A
+!SRAM_VERSION = #$001B
!SRAM_START = $702000
!SRAM_SIZE = #$1000
@@ -573,6 +575,22 @@
!sram_loadstate_rando_supers = !SRAM_START+$116
!sram_loadstate_rando_powerbombs = !SRAM_START+$118
!sram_loadstate_rando_enable = !SRAM_START+$11A
+!sram_categoryadjust_item_equip = !SRAM_START+$11C
+!sram_categoryadjust_item_unequip = !SRAM_START+$11E
+!sram_categoryadjust_item_remove = !SRAM_START+$120
+!sram_categoryadjust_beam_equip = !SRAM_START+$122
+!sram_categoryadjust_beam_unequip = !SRAM_START+$124
+!sram_categoryadjust_beam_remove = !SRAM_START+$126
+!sram_categoryadjust_energy = !SRAM_START+$128
+!sram_categoryadjust_etanks = !SRAM_START+$12A
+!sram_categoryadjust_reserves = !SRAM_START+$12C
+!sram_categoryadjust_rtanks = !SRAM_START+$12E
+!sram_categoryadjust_missiles = !SRAM_START+$130
+!sram_categoryadjust_maxmissiles = !SRAM_START+$132
+!sram_categoryadjust_supers = !SRAM_START+$134
+!sram_categoryadjust_maxsupers = !SRAM_START+$136
+!sram_categoryadjust_pbs = !SRAM_START+$138
+!sram_categoryadjust_maxpbs = !SRAM_START+$13A
; ^ FREE SPACE ^ up to +$13E
@@ -1203,20 +1221,22 @@ endif
!ACTION_NUMFIELD_HEX = #$000A
!ACTION_NUMFIELD_WORD = #$000C
!ACTION_NUMFIELD_HEX_WORD = #$000E
-!ACTION_NUMFIELD_READONLY = #$0010
-!ACTION_NUMFIELD_COLOR = #$0012
-!ACTION_NUMFIELD_SOUND = #$0014
-!ACTION_CHOICE = #$0016
-!ACTION_CHOICE_JSL_TEXT = #$0018
-!ACTION_CTRL_SHORTCUT = #$001A
-!ACTION_CTRL_INPUT = #$001C
-!ACTION_JSL = #$001E
-!ACTION_JSL_SUBMENU = #$0020
-!ACTION_CUSTOM_PRESET = #$0022
-!ACTION_RAM_WATCH = #$0024
-!ACTION_DYNAMIC = #$0026
-!ACTION_MANAGE_PRESETS = #$0028
-!ACTION_CATEGORY_PRESET = #$002A
+!ACTION_NUMFIELD_SIGNED = #$0010
+!ACTION_NUMFIELD_READONLY = #$0012
+!ACTION_NUMFIELD_COLOR = #$0014
+!ACTION_NUMFIELD_SOUND = #$0016
+!ACTION_CHOICE = #$0018
+!ACTION_CHOICE_JSL_TEXT = #$001A
+!ACTION_CTRL_SHORTCUT = #$001C
+!ACTION_CTRL_INPUT = #$001E
+!ACTION_JSL = #$0020
+!ACTION_JSL_SUBMENU = #$0022
+!ACTION_CUSTOM_PRESET = #$0024
+!ACTION_RAM_WATCH = #$0026
+!ACTION_DYNAMIC = #$0028
+!ACTION_MANAGE_PRESETS = #$002A
+!ACTION_CATEGORY_PRESET = #$002C
+!ACTION_ADJUST_ITEM = #$002E
!SAFEWORD = #$5AFE
@@ -1243,6 +1263,9 @@ endif
!SUIT_PROPERTIES_MASK = #$0007
!SUIT_PROPRETIES_PAL_DEBUG_FLAG = #$0008
+!FRAME_COUNTER_USE_IGT = #$0001
+!FRAME_COUNTER_ADJUST_REALTIME = #$0002
+
!ROOM_LAYOUT_NO_MAGNET_STAIRS = #$0001
!ROOM_LAYOUT_AREA_RANDO = #$0002
!ROOM_LAYOUT_ANTISOFTLOCK = #$0004
@@ -1286,6 +1309,7 @@ endif
!PRESETS_COMPRESSED_GRAPHICS = #$0001
!PRESETS_COMPRESSED_PALETTES = #$0002
!PRESETS_COMPRESSED_TABLES = #$0004
+!PRESETS_COMPRESSED = #$0007
!PRESETS_CLOSE_BLUE_DOORS = #$0008
!PRESETS_PRESERVE_ENEMIES = #$0010
!PRESETS_CLEAR_MAP_TILES = #$0020
diff --git a/src/flagmenu.asm b/src/flagmenu.asm
index 52327de9..5582e7c4 100644
--- a/src/flagmenu.asm
+++ b/src/flagmenu.asm
@@ -120,7 +120,7 @@ eq_currentmissiles:
eq_setmissiles:
%cm_numfield_word("Missiles", !SAMUS_MISSILES_MAX, 0, 325, 5, 20, .routine)
.routine
- LDA !SAMUS_MISSILES_MAX : STA !SAMUS_MISSILES
+ STA !SAMUS_MISSILES
RTL
eq_currentsupers:
@@ -129,7 +129,7 @@ eq_currentsupers:
eq_setsupers:
%cm_numfield_word("Super Missiles", !SAMUS_SUPERS_MAX, 0, 65, 5, 5, .routine)
.routine
- LDA !SAMUS_SUPERS_MAX : STA !SAMUS_SUPERS
+ STA !SAMUS_SUPERS
RTL
eq_currentpbs:
@@ -138,7 +138,7 @@ eq_currentpbs:
eq_setpbs:
%cm_numfield_word("Power Bombs", !SAMUS_PBS_MAX, 0, 70, 5, 5, .routine)
.routine
- LDA !SAMUS_PBS_MAX : STA !SAMUS_PBS
+ STA !SAMUS_PBS
RTL
diff --git a/src/gamemenu.asm b/src/gamemenu.asm
index e9a7a2ab..2b5421ef 100644
--- a/src/gamemenu.asm
+++ b/src/gamemenu.asm
@@ -55,7 +55,7 @@ game_demo_wait_timer:
game_ceres_escape_timer:
%cm_numfield_word("Ceres Timer (seconds)", !ram_cm_ceres_seconds, 1, 5999, 1, 20, .routine)
.routine
- LDA !ram_cm_ceres_seconds : STA $4204
+ STA $4204
%a8()
LDA.b #$0A : STA $4206
%a16()
@@ -86,7 +86,7 @@ game_ceres_escape_timer:
game_zebes_escape_timer:
%cm_numfield_word("Zebes Timer (seconds)", !ram_cm_zebes_seconds, 1, 5999, 1, 20, .routine)
.routine
- LDA !ram_cm_zebes_seconds : STA $4204
+ STA $4204
%a8()
LDA.b #$0A : STA $4206
%a16()
diff --git a/src/gamemode.asm b/src/gamemode.asm
index 73819786..2ca4c808 100644
--- a/src/gamemode.asm
+++ b/src/gamemode.asm
@@ -252,6 +252,13 @@ endif
if !FEATURE_VANILLAHUD
else
+gamemode_toggle_igt_rta:
+{
+ LDA !sram_frame_counter_mode : EOR !FRAME_COUNTER_USE_IGT
+ STA !sram_frame_counter_mode
+ ; Fallthrough
+}
+
gamemode_update_timers:
{
JML ih_update_hud_early
@@ -347,11 +354,11 @@ endif
gamemode_reset_segment_timer:
{
- LDA !sram_frame_counter_mode : BEQ .rta
+ LDA !sram_frame_counter_mode : AND !FRAME_COUNTER_USE_IGT : BEQ .rta
STZ !IGT_FRAMES : STZ !IGT_SECONDS
- STZ !IGT_MINUTES : STZ !IGT_HOURS
+ STZ !IGT_MINUTES : STZ !IGT_HOURS : TDC
.rta
- TDC : STA !ram_seg_rt_frames
+ STA !ram_seg_rt_frames
STA !ram_seg_rt_seconds : STA !ram_seg_rt_minutes
%sfxconfirm()
if !FEATURE_VANILLAHUD
@@ -419,18 +426,15 @@ gamemode_reveal_damage:
; revert to prior mode
LDA !ram_display_backup : STA !sram_display_mode
%sfxreset()
- JML init_print_segment_timer
+ BRA gamemode_reveal_hp_updateHUD
.revealRoomStrat
LDA !sram_display_mode
.reveal
STA !ram_display_backup
LDA !IH_MODE_COUNTDAMAGE_INDEX : STA !sram_display_mode
- ; set ram_HUD_check to some value that cannot match the damage counter
- ; conveniently the current value of A will work
- STA !ram_HUD_check
%sfxconfirm()
- JML init_print_segment_timer
+ BRA gamemode_reveal_hp_updateHUD
.checkRoomStrat
LDA !sram_room_strat : BNE .revealRoomStrat
@@ -439,16 +443,54 @@ gamemode_reveal_damage:
; revert to prior Super HUD mode
LDA !ram_display_backup : STA !sram_superhud_bottom
%sfxreset()
- JML init_print_segment_timer
+ BRA gamemode_reveal_hp_updateHUD
.revealSuperHUD
STA !ram_display_backup
LDA !IH_SUPERHUD_COUNTDAMAGE_BOTTOM_INDEX : STA !sram_superhud_bottom
+ %sfxconfirm()
+ BRA gamemode_reveal_hp_updateHUD
+}
+
+gamemode_reveal_hp:
+{
+ LDA !sram_display_mode : CMP !IH_MODE_ROOMSTRAT_INDEX : BEQ .checkRoomStrat
+ CMP !IH_MODE_COUNTHP_INDEX : BNE .reveal
+ ; revert to prior mode
+ LDA !ram_display_backup : STA !sram_display_mode
+ %sfxreset()
+ .updateHUD
+ LDA #$FFFF : STA !ram_enemy_hp : STA !ram_HUD_check
+ STA !ram_xpos : STA !ram_ypos : STA !ram_subpixel_pos
+ STA !ram_HUD_top : STA !ram_HUD_middle
+ STA !ram_HUD_top_counter : STA !ram_HUD_middle_counter
+ JML init_print_segment_timer
+
+ .revealRoomStrat
+ LDA !sram_display_mode
+ .reveal
+ STA !ram_display_backup
+ LDA !IH_MODE_COUNTHP_INDEX : STA !sram_display_mode
+ %sfxconfirm()
+ BRA .updateHUD
+
+ .checkRoomStrat
+ LDA !sram_room_strat : BNE .revealRoomStrat
+ ; handle Super HUD case
+ LDA !sram_superhud_bottom : CMP !IH_SUPERHUD_COUNTHP_BOTTOM_INDEX : BNE .revealSuperHUD
+ ; revert to prior Super HUD mode
+ LDA !ram_display_backup : STA !sram_superhud_bottom
+ %sfxreset()
+ BRA .updateHUD
+
+ .revealSuperHUD
+ STA !ram_display_backup
+ LDA !IH_SUPERHUD_COUNTHP_BOTTOM_INDEX : STA !sram_superhud_bottom
; set ram_HUD_check to some value that cannot match the damage counter
; conveniently the current value of A will work
STA !ram_HUD_check
%sfxconfirm()
- JML init_print_segment_timer
+ BRA .updateHUD
}
endif
@@ -593,7 +635,7 @@ gamemode_dev_shortcut:
endif
; Write a customized routine based on ctrl shortcut selections
-!GAMEMODE_CTRL_SHORTCUT_COUNT = #$0021
+!GAMEMODE_CTRL_SHORTCUT_COUNT = #$0023
cm_write_ctrl_routine:
{
; No bounds check on X is done as we shouldn't exceed our buffer.
@@ -1731,6 +1773,7 @@ endif
if !FEATURE_VANILLAHUD
else
dw #ctrl_add_update_timers
+ dw #ctrl_add_toggle_igt_rta
endif
dw #ctrl_add_reload_preset
dw #ctrl_add_random_preset
@@ -1754,6 +1797,7 @@ CtrlSelectShortcutTypeMenu2:
if !FEATURE_VANILLAHUD
else
dw #ctrl_add_reveal_damage
+ dw #ctrl_add_reveal_hp
endif
dw #ctrl_add_force_stand
dw #ctrl_add_toggle_spin_lock
@@ -1876,6 +1920,13 @@ if !FEATURE_DEV
else
dw #ctrl_add_empty_dm_text
endif
+if !FEATURE_VANILLAHUD
+ dw #ctrl_add_empty_dm_text
+ dw #ctrl_add_empty_dm_text
+else
+ dw #ctrl_add_reveal_hp_dm_text
+ dw #ctrl_add_toggle_igt_rta_dm_text
+endif
ctrl_shortcut_cancel_gameplay_table:
db $00 ; Empty
@@ -1911,6 +1962,8 @@ ctrl_shortcut_cancel_gameplay_table:
db $00 ; Decrement Super HUD
db $01 ; Soft Reset
db $01 ; DEV Shortcut
+ db $00 ; Reveal HP
+ db $00 ; Toggle IGT/RTA
ctrl_shortcut_jsl_word_lsb_table:
db #gamemode_placeholder
@@ -1973,6 +2026,13 @@ if !FEATURE_DEV
else
db #gamemode_placeholder
endif
+if !FEATURE_VANILLAHUD
+ db #gamemode_placeholder
+ db #gamemode_placeholder
+else
+ db #gamemode_reveal_hp
+ db #gamemode_toggle_igt_rta
+endif
ctrl_shortcut_jsl_word_msb_table:
db #gamemode_placeholder>>8
@@ -2035,6 +2095,13 @@ if !FEATURE_DEV
else
db #gamemode_placeholder>>8
endif
+if !FEATURE_VANILLAHUD
+ db #gamemode_placeholder>>8
+ db #gamemode_placeholder>>8
+else
+ db #gamemode_reveal_hp>>8
+ db #gamemode_toggle_igt_rta>>8
+endif
ctrl_add_empty:
%cm_jsl("", #ctrl_add_shortcut_select, #$0000)
@@ -2146,6 +2213,15 @@ ctrl_add_soft_reset:
ctrl_add_dev_shortcut:
%cm_jsl("DEV Shortcut", #ctrl_add_shortcut_select, #$0020)
+if !FEATURE_VANILLAHUD
+else
+ctrl_add_reveal_hp:
+ %cm_jsl("Toggle Boss HP", #ctrl_add_shortcut_select, #$0021)
+
+ctrl_add_toggle_igt_rta:
+ %cm_jsl("Toggle IGT/RTA", #ctrl_add_shortcut_select, #$0022)
+endif
+
ctrl_add_shortcut_select:
{
LDA !ram_cm_ctrl_add_shortcut_slot
diff --git a/src/infohud.asm b/src/infohud.asm
index 2f8111f9..b7809508 100644
--- a/src/infohud.asm
+++ b/src/infohud.asm
@@ -245,12 +245,12 @@ ih_get_item_code:
; check if segment timer should be reset
LDA !ram_reset_segment_later : BPL .fanfare_timing
- LDA !sram_frame_counter_mode : BEQ .reset_RTA
+ LDA !sram_frame_counter_mode : AND !FRAME_COUNTER_USE_IGT : BEQ .reset_RTA
STZ !IGT_FRAMES : STZ !IGT_SECONDS
- STZ !IGT_MINUTES : STZ !IGT_HOURS
+ STZ !IGT_MINUTES : STZ !IGT_HOURS : TDC
.reset_RTA
- TDC : STA !ram_reset_segment_later : STA !ram_lag_counter
+ STA !ram_reset_segment_later : STA !ram_lag_counter
STA !ram_seg_rt_frames : STA !ram_seg_rt_seconds : STA !ram_seg_rt_minutes
.fanfare_timing
@@ -824,7 +824,7 @@ ih_update_hud_code:
.mmRoomTimer
STZ $4205
- LDA !sram_frame_counter_mode : BIT #$0001 : BNE .mmInGameTimer
+ LDA !sram_frame_counter_mode : BIT !FRAME_COUNTER_USE_IGT : BNE .mmInGameTimer
LDA !IH_DECIMAL : STA !HUD_TILEMAP+$B4
LDA !ram_last_realtime_room
BRA .mmCalculateTimer
@@ -848,6 +848,7 @@ ih_update_hud_code:
.startUpdate
LDA #$FFFF : STA !ram_last_hp : STA !ram_enemy_hp
+ LDA !ram_watch_right_hud : EOR #$FFFF : STA !ram_watch_right_hud
; Determine starting point of time display
LDX #$003C
@@ -856,7 +857,7 @@ ih_update_hud_code:
.pickRoomTimer
STZ $4205
- LDA !sram_frame_counter_mode : BIT #$0001 : BNE .inGameRoomTimer
+ LDA !sram_frame_counter_mode : BIT !FRAME_COUNTER_USE_IGT : BNE .inGameRoomTimer
LDA !IH_DECIMAL : STA !HUD_TILEMAP+6,X
LDA !ram_last_realtime_room
BRA .calculateRoomTimer
@@ -950,7 +951,7 @@ ih_update_hud_code:
LDA !ram_print_segment_timer : BPL .end
.pickSegmentTimer
- LDA !sram_frame_counter_mode : BIT #$0001 : BNE .inGameSegmentTimer
+ LDA !sram_frame_counter_mode : BIT !FRAME_COUNTER_USE_IGT : BNE .inGameSegmentTimer
LDA.w #!ram_seg_rt_frames : STA $C1
LDA.w #!WRAM_BANK : STA $C3
BRA .drawSegmentTimer
@@ -974,7 +975,7 @@ ih_update_hud_code:
LDA [$C1] : LDX #$00AE : JSR Draw3
; Draw decimal/hyphen seperators
- LDA !sram_frame_counter_mode : BIT #$0001 : BNE .ingameSeparators
+ LDA !sram_frame_counter_mode : BIT !FRAME_COUNTER_USE_IGT : BNE .ingameSeparators
LDA !IH_DECIMAL : STA !HUD_TILEMAP+$B4 : STA !HUD_TILEMAP+$BA
BRA .blankEnd
@@ -1702,13 +1703,12 @@ ih_update_status:
{
TDC
STA !ram_momentum_sum : STA !ram_momentum_count
- STA !ram_HUD_check : STA !ram_shot_timer
STA !ram_quickdrop_counter : STA !ram_walljump_counter
STA !ram_roomstrat_counter : STA !ram_roomstrat_state
- STA !ram_armed_shine_duration
+ STA !ram_shot_timer : STA !ram_armed_shine_duration
STA !ram_fail_count : STA !ram_fail_sum
INC
- STA !ram_enemy_hp
+ STA !ram_enemy_hp : STA !ram_HUD_check
STA !ram_dash_counter : STA !ram_shine_counter
STA !ram_xpos : STA !ram_ypos : STA !ram_subpixel_pos
LDA !ram_seed_X : LSR
@@ -1875,7 +1875,7 @@ ih_adjust_realtime:
{
; If the frame counter is set to "SPEEDRUN" mode, adds the number of frames in Y to the room and segment timers.
; X must be preserved if used
- LDA !sram_frame_counter_mode : BIT !FRAME_COUNTER_ADJUST_REALTIME : BEQ .done
+ LDA !sram_frame_counter_mode : CMP !FRAME_COUNTER_ADJUST_REALTIME : BNE .done
LDA !sram_fanfare : BNE .done
TYA
diff --git a/src/infohudmodes.asm b/src/infohudmodes.asm
index 5802d58e..f51081a7 100644
--- a/src/infohudmodes.asm
+++ b/src/infohudmodes.asm
@@ -23,6 +23,7 @@
dw status_quickdrop
dw status_walljump
dw status_countdamage
+ dw status_enemyhp
dw status_armpump
dw status_pumpcounter
dw status_xpos
@@ -1691,6 +1692,7 @@ superhud_bottom_table:
dw status_quickdrop
dw status_walljump
dw status_countdamage
+ dw status_enemyhp
dw status_armpump
dw status_pumpcounter
dw status_xpos
diff --git a/src/init.asm b/src/init.asm
index 4368c416..479d26d1 100644
--- a/src/init.asm
+++ b/src/init.asm
@@ -107,6 +107,7 @@ init_sram_routine_table:
dw init_sram_upgrade_17to18
dw init_sram_upgrade_18to19
dw init_sram_upgrade_19to1A
+ dw init_sram_upgrade_1Ato1B
init_sram:
{
@@ -220,6 +221,24 @@ endif
STA !sram_loadstate_rando_enable
JSL init_sram_controller_shortcuts
+ .upgrade_1Ato1B
+ TDC : STA !sram_categoryadjust_item_equip
+ STA !sram_categoryadjust_item_unequip
+ STA !sram_categoryadjust_beam_equip
+ STA !sram_categoryadjust_beam_unequip
+ STA !sram_categoryadjust_energy
+ STA !sram_categoryadjust_etanks
+ STA !sram_categoryadjust_reserves
+ STA !sram_categoryadjust_rtanks
+ STA !sram_categoryadjust_missiles
+ STA !sram_categoryadjust_maxmissiles
+ STA !sram_categoryadjust_supers
+ STA !sram_categoryadjust_maxsupers
+ STA !sram_categoryadjust_pbs
+ STA !sram_categoryadjust_maxpbs
+ DEC : STA !sram_categoryadjust_item_remove
+ STA !sram_categoryadjust_beam_remove
+
LDA !SRAM_VERSION : STA !sram_initialized
RTS
}
diff --git a/src/layout.asm b/src/layout.asm
index 46bb94e7..a1b020e3 100644
--- a/src/layout.asm
+++ b/src/layout.asm
@@ -157,6 +157,9 @@ endif
hijack_loading_room_CRE:
{
+ ; Overwrite HUD bonk indicators
+ LDA !IH_BLANK : STA $7EC622 : STA $7EC628
+
LDA !ram_door_portal_flags : BEQ .noChange
PHX : BIT !DOOR_PORTAL_JUMP_BIT : BNE .jump
AND !DOOR_PORTAL_MODE_MASK : CMP #$0002 : BEQ .leftRight : BPL .upDown
diff --git a/src/macros.asm b/src/macros.asm
index eb8fb35c..f140dd0b 100644
--- a/src/macros.asm
+++ b/src/macros.asm
@@ -151,6 +151,26 @@ table ../resources/normal.tbl
db #$28, "
", #$FF
endmacro
+macro cm_numfield_signed(title, addr, start, end, increment, heldincrement, jsltarget)
+; Allows editing a 16-bit signed value at the specified address
+; Start must be in range -1 to -999 and end must be in range 1 to 999
+ .dm_actionIndex
+ dw !ACTION_NUMFIELD_SIGNED
+ .dm_addr
+ dl ; 24bit RAM address to display/manipulate
+ .dm_minMax
+ dw , ; minimum and maximum values allowed
+ .dm_inc
+ dw ; inc/dec amount when pressed
+ .dm_heldinc
+ dw ; inc/dec amount when direction is held (scroll faster)
+ .dm_jsl
+ dw ; 16bit address to code in the same bank as current menu/submenu
+ .dm_text
+table ../resources/normal.tbl
+ db #$28, "", #$FF
+endmacro
+
macro cm_numfield_hex(title, addr, start, end, increment, heldincrement, jsltarget)
; Allows editing an 8-bit value displayed in hexadecimal
.dm_actionIndex
@@ -498,6 +518,18 @@ macro cm_equipment_beam(name, addr, bitmask, inverse, and)
JMP equipment_toggle_beams
endmacro
+macro cm_preset_adjust_item(name, addr, bitmask)
+; Allows four-way toggling of items: NO CHANGE/EQUIP/UNEQUIP/REMOVE
+ .dm_actionIndex
+ dw !ACTION_ADJUST_ITEM
+ .dm_addr
+ dl
+ .dm_bitmask
+ dw
+ .dm_text
+ db #$28, "", #$FF
+endmacro
+
macro SDE_add(label, value, mask, inverse)
cm_SDE_add_