From 0977c49ba2b4e6f8592e7cfd0dd5a350e91cf415 Mon Sep 17 00:00:00 2001 From: idle Date: Sat, 24 Jan 2026 21:41:37 -0600 Subject: [PATCH 01/10] Fix no drops category preset order --- src/presets/nodropskpdr_menu.asm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/presets/nodropskpdr_menu.asm b/src/presets/nodropskpdr_menu.asm index b4b52498..33e57507 100644 --- a/src/presets/nodropskpdr_menu.asm +++ b/src/presets/nodropskpdr_menu.asm @@ -199,8 +199,8 @@ presets_submenu_nodropskpdr_wrecked_ship: presets_submenu_nodropskpdr_red_brinstar_revisit: dw #presets_nodropskpdr_red_brinstar_revisit_red_brinstar_elevator - dw #presets_nodropskpdr_red_brinstar_revisit_leaving_beta_power_bombs dw #presets_nodropskpdr_red_brinstar_revisit_caterpillars_revisit + dw #presets_nodropskpdr_red_brinstar_revisit_leaving_beta_power_bombs dw #presets_nodropskpdr_red_brinstar_revisit_hellway_revisit dw #presets_nodropskpdr_red_brinstar_revisit_red_tower_down dw #presets_nodropskpdr_red_brinstar_revisit_skree_boost_final @@ -666,12 +666,12 @@ presets_nodropskpdr_wrecked_ship_crateria_refill_return: presets_nodropskpdr_red_brinstar_revisit_red_brinstar_elevator: %cm_preset("Red Brinstar Elevator", #preset_names_red_brinstar_elevator, #preset_nodropskpdr_red_brinstar_revisit_red_brinstar_elevator) -presets_nodropskpdr_red_brinstar_revisit_leaving_beta_power_bombs: - %cm_preset("Leaving Beta Power Bombs", #preset_names_leaving_beta_power_bombs, #preset_nodropskpdr_red_brinstar_revisit_leaving_beta_power_bombs) - presets_nodropskpdr_red_brinstar_revisit_caterpillars_revisit: %cm_preset("Caterpillars Revisit", #preset_names_caterpillars_revisit, #preset_nodropskpdr_red_brinstar_revisit_caterpillars_revisit) +presets_nodropskpdr_red_brinstar_revisit_leaving_beta_power_bombs: + %cm_preset("Leaving Beta Power Bombs", #preset_names_leaving_beta_power_bombs, #preset_nodropskpdr_red_brinstar_revisit_leaving_beta_power_bombs) + presets_nodropskpdr_red_brinstar_revisit_hellway_revisit: %cm_preset("Hellway Revisit", #preset_names_hellway_revisit, #preset_nodropskpdr_red_brinstar_revisit_hellway_revisit) From e95da9fecaaa4647cadae998a2e64fafad171702 Mon Sep 17 00:00:00 2001 From: idle Date: Sat, 24 Jan 2026 23:13:46 -0600 Subject: [PATCH 02/10] Fix execute_numfield_word LDA before JSL --- src/BRBmenu.asm | 2 +- src/flagmenu.asm | 6 +++--- src/gamemenu.asm | 4 ++-- src/menu.asm | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) 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/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/menu.asm b/src/menu.asm index 7cd56aec..6abfdd0c 100644 --- a/src/menu.asm +++ b/src/menu.asm @@ -3213,7 +3213,7 @@ execute_numfield_word: PHK : PEA .end-1 ; addr in A - LDA [!DP_Address] : LDX #$0000 + LDA [!DP_DigitAddress] : LDX #$0000 JML.w [!DP_JSLTarget] .singleDigitEditing From df9c5cf901e6ddf2baa9cf0188fb9d1da7bc023a Mon Sep 17 00:00:00 2001 From: idle Date: Sun, 25 Jan 2026 06:43:54 -0600 Subject: [PATCH 03/10] Update controller shortcuts after loadstate --- src/save.asm | 1 + src/tinystates.asm | 1 + 2 files changed, 2 insertions(+) diff --git a/src/save.asm b/src/save.asm index 4e9e897f..945b2b07 100644 --- a/src/save.asm +++ b/src/save.asm @@ -110,6 +110,7 @@ post_load_state: .done JSL init_wram_based_on_sram + JSL cm_write_ctrl_routine ; Freeze inputs if necessary LDA !ram_freeze_on_load : BEQ .return diff --git a/src/tinystates.asm b/src/tinystates.asm index 4f8dd4d5..de8e2462 100644 --- a/src/tinystates.asm +++ b/src/tinystates.asm @@ -149,6 +149,7 @@ post_load_state: .done JSL init_wram_based_on_sram + JSL cm_write_ctrl_routine ; Freeze inputs if necessary LDA !ram_freeze_on_load : BEQ .return From dff88e1f3589c76152280d1e5fb7660e569e6171 Mon Sep 17 00:00:00 2001 From: idle Date: Sun, 25 Jan 2026 07:48:50 -0600 Subject: [PATCH 04/10] Category preset adjustments --- src/defines.asm | 51 ++++++--- src/init.asm | 19 ++++ src/macros.asm | 32 ++++++ src/main.asm | 2 +- src/mainmenu.asm | 259 +++++++++++++++++++++++++++++++++++++++++-- src/menu.asm | 278 +++++++++++++++++++++++++++++++++++++++++++++++ src/presets.asm | 167 +++++++++++++++++++++++++++- src/symbols.asm | 18 +++ 8 files changed, 796 insertions(+), 30 deletions(-) diff --git a/src/defines.asm b/src/defines.asm index 9127b865..f5fa8e34 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 @@ -1286,6 +1306,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/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/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 <addr> ; 24bit RAM address to display/manipulate + .dm_minMax + dw <start>, <end> ; minimum and maximum values allowed + .dm_inc + dw <increment> ; inc/dec amount when pressed + .dm_heldinc + dw <heldincrement> ; inc/dec amount when direction is held (scroll faster) + .dm_jsl + dw <jsltarget> ; 16bit address to code in the same bank as current menu/submenu + .dm_text +table ../resources/normal.tbl + db #$28, "<title>", #$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 <addr> + .dm_bitmask + dw <bitmask> + .dm_text + db #$28, "<name>", #$FF +endmacro + macro SDE_add(label, value, mask, inverse) cm_SDE_add_<label>: ; subroutine to add to a specific hex digit, used in cm_edit_digits diff --git a/src/main.asm b/src/main.asm index 1f51be64..d4de22b0 100644 --- a/src/main.asm +++ b/src/main.asm @@ -17,7 +17,7 @@ lorom !VERSION_MAJOR = 2 !VERSION_MINOR = 7 !VERSION_BUILD = 2 -!VERSION_REV = 3 +!VERSION_REV = 10 table ../resources/normal.tbl print "" diff --git a/src/mainmenu.asm b/src/mainmenu.asm index 8f774996..d17c0531 100644 --- a/src/mainmenu.asm +++ b/src/mainmenu.asm @@ -468,6 +468,8 @@ PresetOptionsMenu: dw #presets_select_preset_category dw #presets_current dw #$FFFF + dw #presets_category_adjustments + dw #$FFFF dw #presets_custom_preset_slot dw #presets_save_custom_preset dw #presets_load_custom_preset @@ -486,9 +488,7 @@ endif dw #presets_auto_segment_reset if !RAW_TILE_GRAPHICS dw #$FFFF - dw #presets_compressed_graphics - dw #presets_compressed_palettes - dw #presets_compressed_tables + dw #presets_compressed_data endif dw #$0000 %cm_header("PRESET OPTIONS MENU") @@ -499,6 +499,9 @@ endif presets_select_preset_category: %cm_submenu("Select Preset Category", #SelectPresetCategoryMenu) +presets_category_adjustments: + %cm_submenu("Category Adjustments", #PresetCategoryAdjustmentMenu) + presets_custom_preset_slot: %cm_numfield("Custom Preset Slot", !sram_custom_preset_slot, 0, !TOTAL_PRESET_SLOTS, 1, 2, #.routine) .routine @@ -623,15 +626,251 @@ presets_auto_segment_reset: %cm_toggle_bit_inverted("Auto Reset Segment", !sram_preset_options, !PRESETS_AUTO_SEGMENT_OFF, #0) if !RAW_TILE_GRAPHICS -presets_compressed_graphics: - %cm_toggle_bit("Compressed Graphics", !sram_preset_options, !PRESETS_COMPRESSED_GRAPHICS, #0) +presets_compressed_data: + %cm_toggle_bit("Compressed Data", !sram_preset_options, !PRESETS_COMPRESSED, #0) +endif + +PresetCategoryAdjustmentMenu: + dw #preset_adjust_items + dw #$FFFF + dw #preset_adjust_currentenergy + dw #preset_adjust_setetanks + dw #$FFFF + dw #preset_adjust_currentreserves + dw #preset_adjust_setreserves + dw #$FFFF + dw #preset_adjust_currentmissiles + dw #preset_adjust_setmissiles + dw #$FFFF + dw #preset_adjust_currentsupers + dw #preset_adjust_setsupers + dw #$FFFF + dw #preset_adjust_currentpbs + dw #preset_adjust_setpbs + dw #$0000 + %cm_header("CATEGORY ADJUSTMENTS") -presets_compressed_palettes: - %cm_toggle_bit("Compressed Palettes", !sram_preset_options, !PRESETS_COMPRESSED_PALETTES, #0) +preset_adjust_items: + %cm_jsl("Adjust Items and Beams", #preset_prepare_adjust_items_menu, #PresetAdjustItemsBeamsMenu) -presets_compressed_tables: - %cm_toggle_bit("Compressed Tables", !sram_preset_options, !PRESETS_COMPRESSED_TABLES, #0) -endif +preset_adjust_currentenergy: + %cm_numfield_signed("Current Energy", !sram_categoryadjust_energy, #$FC19, #$03E7, 1, 20, #0) + +preset_adjust_setetanks: + %cm_numfield_signed("Energy Tanks", !sram_categoryadjust_etanks, #$FFF2, #$000E, 1, 1, .routine) + .routine + TAX : BPL .positive + LDA #$FF9C + .negloop + ; subtract 100 per reserve + INX : BPL .endloop + SEC : SBC #$0064 + CMP #$FC19 : BPL .negloop + LDA #$FC19 : BRA .endloop + .positive + TDC + .posloop + ; add 100 per reserve + DEX : BMI .endloop + CLC : ADC #$0064 + CMP #$03E7 : BMI .posloop + LDA #$03E7 + .endloop + STA !sram_categoryadjust_energy + RTL + +preset_adjust_currentreserves: + %cm_numfield_signed("Current Reserves", !sram_categoryadjust_reserves, #$FE70, #$0190, 1, 20, #0) + +preset_adjust_setreserves: + %cm_numfield_signed("Reserve Tanks", !sram_categoryadjust_rtanks, #$FFFC, #$0004, 1, 1, .routine) + .routine + TAX : BPL .positive + LDA #$FF9C + .negloop + ; subtract 100 per reserve + INX : BPL .endloop + SEC : SBC #$0064 + BRA .negloop + .positive + TDC + .posloop + ; add 100 per reserve + DEX : BMI .endloop + CLC : ADC #$0064 + BRA .posloop + .endloop + STA !sram_categoryadjust_reserves + RTL + +preset_adjust_currentmissiles: + %cm_numfield_signed("Current Missiles", !sram_categoryadjust_missiles, #$FF1A, #$00E6, 1, 20, #0) + +preset_adjust_setmissiles: + %cm_numfield_signed("Missiles", !sram_categoryadjust_maxmissiles, #$FF1A, #$00E6, 5, 20, .routine) + .routine + STA !sram_categoryadjust_missiles + RTL + +preset_adjust_currentsupers: + %cm_numfield_signed("Current Super Missile", !sram_categoryadjust_supers, #$FFCE, #$0032, 1, 5, #0) + +preset_adjust_setsupers: + %cm_numfield_signed("Super Missiles", !sram_categoryadjust_maxsupers, #$FFCE, #$0032, 5, 5, .routine) + .routine + STA !sram_categoryadjust_supers + RTL + +preset_adjust_currentpbs: + %cm_numfield_signed("Current Power Bombs", !sram_categoryadjust_pbs, #$FFCE, #$0032, 1, 5, #0) + +preset_adjust_setpbs: + %cm_numfield_signed("Power Bombs", !sram_categoryadjust_maxpbs, #$FFCE, #$0032, 5, 5, .routine) + .routine + STA !sram_categoryadjust_pbs + RTL + +preset_prepare_adjust_items_menu: +{ + LDA !sram_categoryadjust_item_equip : BIT #$4000 : BNE .equip_grapple + LDA !sram_categoryadjust_item_remove : BIT #$4000 : BEQ .remove_grapple + ; no change + TDC : STA !ram_cm_grapple : BRA .done_grapple + .equip_grapple + LDA #$0001 : STA !ram_cm_grapple : BRA .done_grapple + .remove_grapple + LDA #$0002 : STA !ram_cm_grapple + .done_grapple + + LDA !sram_categoryadjust_item_equip : BIT #$8000 : BNE .equip_xray + LDA !sram_categoryadjust_item_remove : BIT #$8000 : BEQ .remove_xray + ; no change + TDC : STA !ram_cm_xray : BRA .done_xray + .equip_xray + LDA #$0001 : STA !ram_cm_xray : BRA .done_xray + .remove_xray + LDA #$0002 : STA !ram_cm_xray + .done_xray + + %setmenubank() + JML action_submenu +} + +PresetAdjustItemsBeamsMenu: + dw #preset_adjust_variasuit + dw #preset_adjust_gravitysuit + dw #$FFFF + dw #preset_adjust_morphball + dw #preset_adjust_bomb + dw #preset_adjust_springball + dw #preset_adjust_screwattack + dw #$FFFF + dw #preset_adjust_hijumpboots + dw #preset_adjust_spacejump + dw #preset_adjust_speedbooster + dw #$FFFF + dw #preset_adjust_grapple + dw #preset_adjust_xray + dw #$FFFF + dw #preset_adjust_chargebeam + dw #preset_adjust_icebeam + dw #preset_adjust_wavebeam + dw #preset_adjust_spazerbeam + dw #preset_adjust_plasmabeam + dw #$0000 + %cm_header("CATEGORY ADJUSTMENTS") + +preset_adjust_variasuit: + %cm_preset_adjust_item("Varia Suit", !sram_categoryadjust_item_equip, #$0001) + +preset_adjust_gravitysuit: + %cm_preset_adjust_item("Gravity Suit", !sram_categoryadjust_item_equip, #$0020) + +preset_adjust_morphball: + %cm_preset_adjust_item("Morph Ball", !sram_categoryadjust_item_equip, #$0004) + +preset_adjust_bomb: + %cm_preset_adjust_item("Bombs", !sram_categoryadjust_item_equip, #$1000) + +preset_adjust_springball: + %cm_preset_adjust_item("Spring Ball", !sram_categoryadjust_item_equip, #$0002) + +preset_adjust_screwattack: + %cm_preset_adjust_item("Screw Attack", !sram_categoryadjust_item_equip, #$0008) + +preset_adjust_hijumpboots: + %cm_preset_adjust_item("Hi Jump Boots", !sram_categoryadjust_item_equip, #$0100) + +preset_adjust_spacejump: + %cm_preset_adjust_item("Space Jump", !sram_categoryadjust_item_equip, #$0200) + +preset_adjust_speedbooster: + %cm_preset_adjust_item("Speed Booster", !sram_categoryadjust_item_equip, #$2000) + +preset_adjust_grapple: + dw !ACTION_CHOICE + dl #!ram_cm_grapple + dw #.routine + db #$28, "Grapple", #$FF + db #$28, " NO CHANGE", #$FF + db #$28, " EQUIP", #$FF + db #$28, " REMOVE", #$FF + db #$FF + .routine + LDA !ram_cm_grapple : BEQ .no_change + DEC : BEQ .equip + ; remove + LDA !sram_categoryadjust_item_equip : AND #$BFFF : STA !sram_categoryadjust_item_equip + LDA !sram_categoryadjust_item_remove : AND #$BFFF : STA !sram_categoryadjust_item_remove + RTL + .no_change + LDA !sram_categoryadjust_item_equip : AND #$BFFF : STA !sram_categoryadjust_item_equip + LDA !sram_categoryadjust_item_remove : ORA #$4000 : STA !sram_categoryadjust_item_remove + RTL + .equip + LDA !sram_categoryadjust_item_equip : ORA #$4000 : STA !sram_categoryadjust_item_equip + LDA !sram_categoryadjust_item_remove : ORA #$4000 : STA !sram_categoryadjust_item_remove + RTL + +preset_adjust_xray: + dw !ACTION_CHOICE + dl #!ram_cm_xray + dw #.routine + db #$28, "X-Ray", #$FF + db #$28, " NO CHANGE", #$FF + db #$28, " EQUIP", #$FF + db #$28, " REMOVE", #$FF + db #$FF + .routine + LDA !ram_cm_xray : BEQ .no_change + DEC : BEQ .equip + ; remove + LDA !sram_categoryadjust_item_equip : AND #$7FFF : STA !sram_categoryadjust_item_equip + LDA !sram_categoryadjust_item_remove : AND #$7FFF : STA !sram_categoryadjust_item_remove + RTL + .no_change + LDA !sram_categoryadjust_item_equip : AND #$7FFF : STA !sram_categoryadjust_item_equip + LDA !sram_categoryadjust_item_remove : ORA #$8000 : STA !sram_categoryadjust_item_remove + RTL + .equip + LDA !sram_categoryadjust_item_equip : ORA #$8000 : STA !sram_categoryadjust_item_equip + LDA !sram_categoryadjust_item_remove : ORA #$8000 : STA !sram_categoryadjust_item_remove + RTL + +preset_adjust_chargebeam: + %cm_preset_adjust_item("Charge", !sram_categoryadjust_beam_equip, #$1000) + +preset_adjust_icebeam: + %cm_preset_adjust_item("Ice", !sram_categoryadjust_beam_equip, #$0002) + +preset_adjust_wavebeam: + %cm_preset_adjust_item("Wave", !sram_categoryadjust_beam_equip, #$0001) + +preset_adjust_spazerbeam: + %cm_preset_adjust_item("Spazer", !sram_categoryadjust_beam_equip, #$0004) + +preset_adjust_plasmabeam: + %cm_preset_adjust_item("Plasma", !sram_categoryadjust_beam_equip, #$0008) SelectPresetCategoryMenu: dw #presets_current diff --git a/src/menu.asm b/src/menu.asm index 6abfdd0c..d265cb14 100644 --- a/src/menu.asm +++ b/src/menu.asm @@ -776,6 +776,7 @@ cm_draw_action_table: dw draw_numfield_hex dw draw_numfield_word dw draw_numfield_hex_word + dw draw_numfield_signed dw draw_numfield_word dw draw_numfield_color dw draw_numfield_sound @@ -790,6 +791,7 @@ cm_draw_action_table: dw draw_dynamic dw draw_manage_presets dw draw_category_preset + dw draw_adjust_item draw_toggle: { @@ -1124,6 +1126,67 @@ draw_numfield_hex_word: RTS } +draw_numfield_signed: +{ + ; grab the memory address (long) + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_Address + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : STA !DP_Address+2 + + ; skip min/max and increment values + INC !DP_CurrentMenu : INC !DP_CurrentMenu : INC !DP_CurrentMenu : INC !DP_CurrentMenu + INC !DP_CurrentMenu : INC !DP_CurrentMenu : INC !DP_CurrentMenu : INC !DP_CurrentMenu + + ; increment past JSL + INC !DP_CurrentMenu : INC !DP_CurrentMenu + + ; Draw the text + %item_index_to_vram_index() + PHX : JSR cm_draw_text : PLX + + ; set position for the number + TXA : CLC : ADC #$002C : TAX + + ; Clear out the area + LDA !MENU_BLANK : STA !ram_tilemap_buffer,X + STA !ram_tilemap_buffer+2,X + STA !ram_tilemap_buffer+4,X + STA !ram_tilemap_buffer+6,X + + ; Draw sign + LDA [!DP_Address] : BEQ .convert_value : BPL .plus + LDA.w #$1C00 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer,X + LDA [!DP_Address] : EOR #$FFFF : INC + BRA .convert_value + + .plus + LDA.w #$4F00 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer,X + LDA [!DP_Address] + + .convert_value + ; Convert value to decimal + JSR cm_hex2dec + + ; Set palette + %a8() + LDA #$24 : ORA !DP_Palette : STA !DP_Palette+1 + LDA #$70 : STA !DP_Palette ; number tiles are 70-79 + + ; Draw numbers + %a16() + ; ones + LDA !DP_ThirdDigit : CLC : ADC !DP_Palette : STA !ram_tilemap_buffer+6,X + ; tens + LDA !DP_SecondDigit : ORA !DP_FirstDigit + ORA !DP_Temp : BEQ .done + LDA !DP_SecondDigit : CLC : ADC !DP_Palette : STA !ram_tilemap_buffer+4,X + ; hundreds + LDA !DP_FirstDigit : ORA !DP_Temp : BEQ .done + LDA !DP_FirstDigit : CLC : ADC !DP_Palette : STA !ram_tilemap_buffer+2,X + + .done + RTS +} + draw_numfield_color: ; Color values are increments of 8 { @@ -1702,6 +1765,70 @@ draw_category_preset: RTS } +draw_adjust_item: +{ + ; grab the memory address (long) + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_Address + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : STA !DP_Address+2 + + ; grab the bitmask + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_ToggleValue + + ; draw the text first + %item_index_to_vram_index() + PHX : JSR cm_draw_text : PLX + + ; check if item equipped + LDA [!DP_Address] : BIT !DP_ToggleValue : BEQ .check_unequip + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$22,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$24,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$26,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$28,X + BRA .draw_equip + + .check_unequip + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : BIT !DP_ToggleValue : BEQ .check_remove + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$22,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$24,X + LDA.w #'U'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$26,X + LDA.w #'N'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$28,X + + .draw_equip + LDA.w #'E'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2A,X + LDA.w #'Q'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2C,X + LDA.w #'U'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2E,X + LDA.w #'I'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$30,X + LDA.w #'P'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$32,X + RTS + + .check_remove + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : BIT !DP_ToggleValue : BNE .no_change + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$22,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$24,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$26,X + LDA.w #'R'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$28,X + LDA.w #'E'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2A,X + LDA.w #'M'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2C,X + LDA.w #'O'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2E,X + LDA.w #'V'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$30,X + LDA.w #'E'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$32,X + RTS + + .no_change + LDA.w #'N'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$22,X + LDA.w #'O'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$24,X + LDA.w #' '<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$26,X + LDA.w #'C'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$28,X + LDA.w #'H'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2A,X + LDA.w #'A'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2C,X + LDA.w #'N'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$2E,X + LDA.w #'G'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$30,X + LDA.w #'E'<<8 : ORA !DP_Palette : XBA : STA !ram_tilemap_buffer+$32,X + RTS +} + cm_hex2dec_draw5: ; Converts a hex number into a five digit decimal number ; expects value to be drawn in !DP_DrawValue @@ -2959,6 +3086,7 @@ cm_execute_action_table: dw execute_numfield_hex dw execute_numfield_word dw execute_numfield_hex_word + dw execute_numfield_signed dw execute_nop dw execute_numfield_color dw execute_numfield_sound @@ -2973,6 +3101,7 @@ cm_execute_action_table: dw execute_dynamic dw execute_manage_presets dw execute_category_preset + dw execute_adjust_item execute_nop: RTS @@ -3257,6 +3386,84 @@ execute_numfield_hex_word: RTS } +execute_numfield_signed: +{ + ; grab the memory address (long) + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_Address + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : STA !DP_Address+2 + + ; grab minimum (!DP_DigitMinimum) and maximum (!DP_DigitMaximum) values + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_DigitMinimum + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : INC : STA !DP_DigitMaximum ; INC for convenience + + ; check if fast scroll button pressed to skip inc/dec + LDA !ram_cm_controller : AND !sram_cm_fast_scroll_button : BNE .skip_inc + + ; check if fast scroll button is held + LDA !IH_CONTROLLER_PRI : ORA !IH_CONTROLLER_SEC + AND !sram_cm_fast_scroll_button : BEQ .check_held + ; grab normal increment multiplied by four and skip past both + LDA [!DP_CurrentMenu] : ASL #2 : INC !DP_CurrentMenu : INC !DP_CurrentMenu + INC !DP_CurrentMenu : INC !DP_CurrentMenu + BRA .store_increment + + .check_held + ; check for held inputs + LDA !ram_cm_controller : BIT !IH_INPUT_HELD : BNE .input_held + ; grab normal increment and skip past both + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu + INC !DP_CurrentMenu : INC !DP_CurrentMenu + BRA .store_increment + + .skip_inc + ; skipping inc/dec and just playing sfx + INC !DP_CurrentMenu : INC !DP_CurrentMenu + INC !DP_CurrentMenu : INC !DP_CurrentMenu + BRA .jsl + + .input_held + ; grab faster increment and skip past both + INC !DP_CurrentMenu : INC !DP_CurrentMenu + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu + + .store_increment + STA !DP_Increment + + ; check direction held + LDA !ram_cm_controller : BIT !IH_INPUT_LEFT : BNE .pressed_left + ; pressed right, inc + LDA [!DP_Address] : CLC : ADC !DP_Increment + BMI .set_value : CMP !DP_DigitMaximum : BCC .set_value + LDA !DP_DigitMinimum + STA [!DP_Address] : BRA .jsl + + .pressed_left ; dec + LDA [!DP_Address] : SEC : SBC !DP_Increment + BPL .set_value : CMP !DP_DigitMinimum : BPL .set_value + LDA !DP_DigitMaximum : DEC + + .set_value + STA [!DP_Address] + + .jsl + ; grab JSL pointer and skip if zero + LDA [!DP_CurrentMenu] : BEQ .end + STA !DP_JSLTarget + + ; Set return address for indirect JSL + LDA !ram_cm_menu_bank : STA !DP_JSLTarget+2 + PHK : PEA .end-1 + + ; addr in A + LDA [!DP_Address] : LDX #$0000 + JML.w [!DP_JSLTarget] + + .end + %ai16() + %sfxnumber() + RTS +} + execute_numfield_color: { ; grab the memory address (long) @@ -3842,6 +4049,77 @@ execute_category_preset: RTS } +execute_adjust_item: +{ + ; grab the memory address (long) + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_Address + LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : STA !DP_Address+2 + + ; grab the bitmask + LDA [!DP_CurrentMenu] : STA !DP_ToggleValue : EOR #$FFFF : STA !DP_Increment + + ; we either increment or decrement + LDA !ram_cm_controller : BIT !IH_INPUT_LEFT : BNE .pressed_left + + LDA [!DP_Address] : BIT !DP_ToggleValue : BNE .equip_to_unequip + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : BIT !DP_ToggleValue : BNE .unequip_to_remove + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : BIT !DP_ToggleValue : BEQ .remove_to_no_change + + ; no change to equip + DEC !DP_Address : DEC !DP_Address : DEC !DP_Address : DEC !DP_Address + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + RTS + + .equip_to_unequip + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + RTS + + .unequip_to_remove + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + RTS + + .remove_to_no_change + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + RTS + + .pressed_left + LDA [!DP_Address] : BIT !DP_ToggleValue : BNE .equip_to_no_change + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : BIT !DP_ToggleValue : BNE .unequip_to_equip + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : BIT !DP_ToggleValue : BEQ .remove_to_unequip + + ; no change to remove + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + RTS + + .equip_to_no_change + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + INC !DP_Address : INC !DP_Address + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + RTS + + .unequip_to_equip + LDA [!DP_Address] : AND !DP_Increment : STA [!DP_Address] + DEC !DP_Address : DEC !DP_Address + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + RTS + + .remove_to_unequip + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + DEC !DP_Address : DEC !DP_Address + LDA [!DP_Address] : ORA !DP_ToggleValue : STA [!DP_Address] + RTS +} + cm_hex2dec: { ; store 16-bit dividend diff --git a/src/presets.asm b/src/presets.asm index 7d560113..145f5137 100644 --- a/src/presets.asm +++ b/src/presets.asm @@ -297,13 +297,172 @@ preset_load_preset: .custom_preset JSL custom_preset_load LDA !SAFEWORD : STA !sram_last_preset_low_word - BRA .done + PLB + RTL .category_preset JSR category_preset_load - - .done PLB + + ; apply category adjustments + LDA !SAMUS_ITEMS_EQUIPPED : EOR #$FFFF + ORA !sram_categoryadjust_item_unequip : EOR #$FFFF + AND !sram_categoryadjust_item_remove + ORA !sram_categoryadjust_item_equip : STA !SAMUS_ITEMS_EQUIPPED + LDA !SAMUS_ITEMS_COLLECTED : AND !sram_categoryadjust_item_remove + ORA !sram_categoryadjust_item_equip + ORA !sram_categoryadjust_item_unequip : STA !SAMUS_ITEMS_COLLECTED + + LDA !SAMUS_BEAMS_EQUIPPED : EOR #$FFFF + ORA !sram_categoryadjust_beam_unequip : EOR #$FFFF + AND !sram_categoryadjust_beam_remove + ORA !sram_categoryadjust_beam_equip : STA !SAMUS_BEAMS_EQUIPPED + LDA !SAMUS_BEAMS_COLLECTED : AND !sram_categoryadjust_beam_remove + ORA !sram_categoryadjust_beam_equip + ORA !sram_categoryadjust_beam_unequip : STA !SAMUS_BEAMS_COLLECTED + + ; don't allow adjustments to equip spazer+plasma + LDA !SAMUS_HYPER_BEAM : BNE .beams_hyper + LDA !sram_categoryadjust_beam_equip : AND #$000C : BEQ .beams_done + LDA !SAMUS_BEAMS_EQUIPPED : AND #$000C : CMP #$000C : BNE .beams_done + LDA !SAMUS_BEAMS_EQUIPPED : AND #$FFFB : STA !SAMUS_BEAMS_EQUIPPED + BRA .beams_done + .beams_hyper + LDA #$1009 : STA !SAMUS_BEAMS_EQUIPPED + .beams_done + + LDA !sram_categoryadjust_etanks : BEQ .etanks_done + TAX : BPL .etanks_positive + LDA !SAMUS_HP_MAX + .etanks_negloop + SEC : SBC #$0064 + INX : BMI .etanks_negloop + CMP #$0063 : BPL .etanks_set + LDA #$0063 : BRA .etanks_set + .etanks_positive + LDA !SAMUS_HP_MAX + .etanks_posloop + DEX : BMI .etanks_set + CLC : ADC #$0064 + BRA .etanks_posloop + .etanks_set + STA !SAMUS_HP_MAX + LDA !sram_categoryadjust_energy : BNE .energy_adjust + LDA !SAMUS_HP : BRA .energy_cap + .etanks_done + + LDA !sram_categoryadjust_energy : BEQ .energy_done + .energy_adjust + CLC : ADC !SAMUS_HP : BMI .energy_zero : BEQ .energy_zero + .energy_cap + CMP !SAMUS_HP_MAX : BMI .energy_set : BEQ .energy_set + LDA !SAMUS_HP_MAX : BRA .energy_set + .energy_zero + LDA #$0001 + .energy_set + STA !SAMUS_HP + .energy_done + + LDA !sram_categoryadjust_rtanks : BEQ .rtanks_done + TAX : BPL .rtanks_positive + LDA !SAMUS_RESERVE_MAX + .rtanks_negloop + SEC : SBC #$0064 + INX : BMI .rtanks_negloop + CMP #$0000 : BPL .rtanks_set + TDC : BRA .rtanks_set + .rtanks_positive + LDA !SAMUS_RESERVE_MAX + .rtanks_posloop + DEX : BMI .rtanks_set + CLC : ADC #$0064 + BRA .rtanks_posloop + .rtanks_set + STA !SAMUS_RESERVE_MAX : BEQ .rtanks_zero + LDA !SAMUS_RESERVE_MODE : BNE .rtanks_cap + INC + .rtanks_zero + STA !SAMUS_RESERVE_MODE + .rtanks_cap + LDA !sram_categoryadjust_reserves : BNE .reserves_adjust + LDA !SAMUS_RESERVE_ENERGY : BRA .reserves_cap + .rtanks_done + + LDA !sram_categoryadjust_reserves : BEQ .reserves_done + .reserves_adjust + CLC : ADC !SAMUS_RESERVE_ENERGY : BMI .reserves_zero + .reserves_cap + CMP !SAMUS_RESERVE_MAX : BMI .reserves_set : BEQ .reserves_set + LDA !SAMUS_RESERVE_MAX : BRA .reserves_set + .reserves_zero + TDC + .reserves_set + STA !SAMUS_RESERVE_ENERGY + .reserves_done + + LDA !sram_categoryadjust_maxmissiles : BEQ .maxmissiles_done + CLC : ADC !SAMUS_MISSILES_MAX : BPL .maxmissiles_set : BEQ .maxmissiles_set + TDC + .maxmissiles_set + STA !SAMUS_MISSILES_MAX + LDA !sram_categoryadjust_missiles : BNE .missiles_adjust + LDA !SAMUS_MISSILES : BRA .missiles_cap + .maxmissiles_done + + LDA !sram_categoryadjust_missiles : BEQ .missiles_done + .missiles_adjust + CLC : ADC !SAMUS_MISSILES : BMI .missiles_zero + .missiles_cap + CMP !SAMUS_MISSILES_MAX : BMI .missiles_set : BEQ .missiles_set + LDA !SAMUS_MISSILES_MAX : BRA .missiles_set + .missiles_zero + TDC + .missiles_set + STA !SAMUS_MISSILES + .missiles_done + + LDA !sram_categoryadjust_maxsupers : BEQ .maxsupers_done + CLC : ADC !SAMUS_SUPERS_MAX : BPL .maxsupers_set : BEQ .maxsupers_set + TDC + .maxsupers_set + STA !SAMUS_SUPERS_MAX + LDA !sram_categoryadjust_supers : BNE .supers_adjust + LDA !SAMUS_SUPERS : BRA .supers_cap + .maxsupers_done + + LDA !sram_categoryadjust_supers : BEQ .supers_done + .supers_adjust + CLC : ADC !SAMUS_SUPERS : BMI .supers_zero + .supers_cap + CMP !SAMUS_SUPERS_MAX : BMI .supers_set : BEQ .supers_set + LDA !SAMUS_SUPERS_MAX : BRA .supers_set + .supers_zero + TDC + .supers_set + STA !SAMUS_SUPERS + .supers_done + + LDA !sram_categoryadjust_maxpbs : BEQ .maxpbs_done + CLC : ADC !SAMUS_PBS_MAX : BPL .maxpbs_set : BEQ .maxpbs_set + TDC + .maxpbs_set + STA !SAMUS_PBS_MAX + LDA !sram_categoryadjust_pbs : BNE .pbs_adjust + LDA !SAMUS_PBS : BRA .pbs_cap + .maxpbs_done + + LDA !sram_categoryadjust_pbs : BEQ .pbs_done + .pbs_adjust + CLC : ADC !SAMUS_PBS : BMI .pbs_zero + .pbs_cap + CMP !SAMUS_PBS_MAX : BMI .pbs_set : BEQ .pbs_set + LDA !SAMUS_PBS_MAX : BRA .pbs_set + .pbs_zero + TDC + .pbs_set + STA !SAMUS_PBS + .pbs_done + RTL } @@ -394,7 +553,7 @@ preset_start_gameplay: %ai16() SEI ; Disable IRQ STZ $420B ; Disable all (H)DMA - STZ $07E9 ; Scrolling finished hook = 0 + STZ !SCROLLING_FINISHED_HOOK STZ !TIMER_STATUS JSL $828A9A ; Reset sound queues diff --git a/src/symbols.asm b/src/symbols.asm index ff0b818e..f8e445c6 100644 --- a/src/symbols.asm +++ b/src/symbols.asm @@ -367,6 +367,8 @@ ram_cm_brb_palette = !ram_cm_brb_palette ; !WRAM_MENU_START+$AA ram_cm_brb_set_cycle = !ram_cm_brb_set_cycle ; !WRAM_MENU_START+$AC ram_cm_brb_cycle_time = !ram_cm_brb_cycle_time ; !WRAM_MENU_START+$AE +ram_cm_grapple = !ram_cm_grapple ; !WRAM_MENU_START+$90 +ram_cm_xray = !ram_cm_xray ; !WRAM_MENU_START+$92 ram_cm_manage_slots = !ram_cm_manage_slots ; !WRAM_MENU_START+$90 ram_cm_selected_slot = !ram_cm_selected_slot ; !WRAM_MENU_START+$92 ram_cm_preset_elevator = !ram_cm_preset_elevator ; !WRAM_MENU_START+$94 @@ -540,6 +542,22 @@ sram_loadstate_rando_missiles = !sram_loadstate_rando_missiles ; !SRAM_START+$11 sram_loadstate_rando_supers = !sram_loadstate_rando_supers ; !SRAM_START+$116 sram_loadstate_rando_powerbombs = !sram_loadstate_rando_powerbombs ; !SRAM_START+$118 sram_loadstate_rando_enable = !sram_loadstate_rando_enable ; !SRAM_START+$11A +sram_categoryadjust_item_equip = !sram_categoryadjust_item_equip ; !SRAM_START+$11C +sram_categoryadjust_item_unequip = !sram_categoryadjust_item_unequip ; !SRAM_START+$11E +sram_categoryadjust_item_remove = !sram_categoryadjust_item_remove ; !SRAM_START+$120 +sram_categoryadjust_beam_equip = !sram_categoryadjust_beam_equip ; !SRAM_START+$122 +sram_categoryadjust_beam_unequip = !sram_categoryadjust_beam_unequip ; !SRAM_START+$124 +sram_categoryadjust_beam_remove = !sram_categoryadjust_beam_remove ; !SRAM_START+$126 +sram_categoryadjust_energy = !sram_categoryadjust_energy ; !SRAM_START+$128 +sram_categoryadjust_etanks = !sram_categoryadjust_etanks ; !SRAM_START+$12A +sram_categoryadjust_reserves = !sram_categoryadjust_reserves ; !SRAM_START+$12C +sram_categoryadjust_rtanks = !sram_categoryadjust_rtanks ; !SRAM_START+$12E +sram_categoryadjust_missiles = !sram_categoryadjust_missiles ; !SRAM_START+$130 +sram_categoryadjust_maxmissiles = !sram_categoryadjust_maxmissiles ; !SRAM_START+$132 +sram_categoryadjust_supers = !sram_categoryadjust_supers ; !SRAM_START+$134 +sram_categoryadjust_maxsupers = !sram_categoryadjust_maxsupers ; !SRAM_START+$136 +sram_categoryadjust_pbs = !sram_categoryadjust_pbs ; !SRAM_START+$138 +sram_categoryadjust_maxpbs = !sram_categoryadjust_maxpbs ; !SRAM_START+$13A ; ^ FREE SPACE ^ up to +$13E From 439d2a4ef0c64342531f7edb68e4d6bf2a09596e Mon Sep 17 00:00:00 2001 From: idle <idlechild123@gmail.com> Date: Mon, 9 Feb 2026 00:30:50 -0600 Subject: [PATCH 05/10] Workaround for scroll issue in max suitless preset --- src/presets/combined_preset_data.asm | 2 +- src/presets/suitless_data.asm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/presets/combined_preset_data.asm b/src/presets/combined_preset_data.asm index 31a2701c..2960539f 100644 --- a/src/presets/combined_preset_data.asm +++ b/src/presets/combined_preset_data.asm @@ -19923,7 +19923,7 @@ preset_ngplasma_tourian_metroids_3: preset_suitless_upper_norfair_1_hijump_boots: dw #preset_suitless_upper_norfair_1_hijump_etank - dw $078D, $92D6 ; DDB + dw $078D, $93F6 ; DDB dw $079B, $AA41 ; MDB dw $090F, $E000 ; Screen subpixel X position dw $0913, $C800 ; Screen subpixel Y position diff --git a/src/presets/suitless_data.asm b/src/presets/suitless_data.asm index 87aaab12..8a7e277d 100644 --- a/src/presets/suitless_data.asm +++ b/src/presets/suitless_data.asm @@ -1242,7 +1242,7 @@ preset_suitless_upper_norfair_1_hijump_etank: preset_suitless_upper_norfair_1_hijump_boots: dw #preset_suitless_upper_norfair_1_hijump_etank ; Upper Norfair 1: Hi-Jump E-Tank - dw $078D, $92D6 ; DDB + dw $078D, $93F6 ; DDB dw $079B, $AA41 ; MDB dw $090F, $E000 ; Screen subpixel X position dw $0913, $C800 ; Screen subpixel Y position From 4440a57b82ce6d333e00f3802cb1e0c61c2000f7 Mon Sep 17 00:00:00 2001 From: idle <idlechild123@gmail.com> Date: Mon, 9 Feb 2026 00:33:19 -0600 Subject: [PATCH 06/10] Better workaround for redrawing RAM watch after unpause --- src/infohud.asm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/infohud.asm b/src/infohud.asm index 2f8111f9..cf83c4f6 100644 --- a/src/infohud.asm +++ b/src/infohud.asm @@ -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 @@ -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 From 1425ffc4d2dbc6968e31217efdc1fa0d41a37ad9 Mon Sep 17 00:00:00 2001 From: idle <idlechild123@gmail.com> Date: Mon, 9 Feb 2026 00:34:31 -0600 Subject: [PATCH 07/10] Add Toggle Boss HP and Toggle IGT/RTA controller shortcuts --- src/defines.asm | 3 ++ src/gamemode.asm | 98 ++++++++++++++++++++++++++++++++++++++----- src/infohud.asm | 16 +++---- src/infohudmodes.asm | 2 + src/main.asm | 2 +- src/mainmenu.asm | 99 ++++++++++++++++++++++++-------------------- 6 files changed, 156 insertions(+), 64 deletions(-) diff --git a/src/defines.asm b/src/defines.asm index f5fa8e34..dcdc212f 100644 --- a/src/defines.asm +++ b/src/defines.asm @@ -1263,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 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 cf83c4f6..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 @@ -857,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 @@ -951,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 @@ -975,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 @@ -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/main.asm b/src/main.asm index d4de22b0..f4178344 100644 --- a/src/main.asm +++ b/src/main.asm @@ -17,7 +17,7 @@ lorom !VERSION_MAJOR = 2 !VERSION_MINOR = 7 !VERSION_BUILD = 2 -!VERSION_REV = 10 +!VERSION_REV = 11 table ../resources/normal.tbl print "" diff --git a/src/mainmenu.asm b/src/mainmenu.asm index d17c0531..b627630d 100644 --- a/src/mainmenu.asm +++ b/src/mainmenu.asm @@ -1965,28 +1965,32 @@ ihmode_countdamage: !IH_MODE_COUNTDAMAGE_INDEX = #$0011 %cm_jsl("Boss Damage Counter", #action_select_infohud_mode, #$0011) +ihmode_counthp: +!IH_MODE_COUNTHP_INDEX = #$0012 + %cm_jsl("Boss HP Counter", #action_select_infohud_mode, #$0012) + ihmode_armpump: -!IH_MODE_ARMPUMP_INDEX = #$0012 - %cm_jsl("Arm Pump Trainer", #action_select_infohud_mode, #$0012) +!IH_MODE_ARMPUMP_INDEX = #$0013 + %cm_jsl("Arm Pump Trainer", #action_select_infohud_mode, #$0013) ihmode_pumpcounter: - %cm_jsl("Arm Pump Counter", #action_select_infohud_mode, #$0013) + %cm_jsl("Arm Pump Counter", #action_select_infohud_mode, #$0014) ihmode_xpos: - %cm_jsl("X Position", #action_select_infohud_mode, #$0014) + %cm_jsl("X Position", #action_select_infohud_mode, #$0015) ihmode_ypos: - %cm_jsl("Y Position", #action_select_infohud_mode, #$0015) + %cm_jsl("Y Position", #action_select_infohud_mode, #$0016) ihmode_shottimer: -!IH_MODE_SHOTTIMER_INDEX = #$0016 - %cm_jsl("Shot Timer", #action_select_infohud_mode, #$0016) +!IH_MODE_SHOTTIMER_INDEX = #$0017 + %cm_jsl("Shot Timer", #action_select_infohud_mode, #$0017) ihmode_ramwatch: -!IH_MODE_RAMWATCH_INDEX = #$0017 - %cm_jsl("Custom RAM Watch", #action_select_infohud_mode, #$0017) +!IH_MODE_RAMWATCH_INDEX = #$0018 + %cm_jsl("Custom RAM Watch", #action_select_infohud_mode, #$0018) -!IH_MODE_COUNT = #$0018 +!IH_MODE_COUNT = #$0019 action_select_infohud_mode: { TYA : STA !sram_display_mode @@ -2023,6 +2027,7 @@ ih_display_mode: db #$28, " QUICK DROP", #$FF db #$28, " WALL JUMP", #$FF db #$28, "DMG COUNTER", #$FF + db #$28, " HP COUNTER", #$FF db #$28, " ARM PUMP", #$FF db #$28, " PUMP COUNT", #$FF db #$28, " X POSITION", #$FF @@ -2235,6 +2240,7 @@ ih_superhud_bottom_selector: db #$28, " QUICK DROP", #$FF db #$28, " WALL JUMP", #$FF db #$28, "DMG COUNTER", #$FF + db #$28, " HP COUNTER", #$FF db #$28, " ARM PUMP", #$FF db #$28, " PUMP COUNT", #$FF db #$28, " X POSITION", #$FF @@ -2286,6 +2292,7 @@ SuperHUDBottomMenu: dw ih_superhud_quickdrop dw ih_superhud_walljump dw ih_superhud_countdamage + dw ih_superhud_counthp dw #$FFFF dw ih_superhud_goto_page2 dw ih_superhud_goto_page3 @@ -2389,95 +2396,99 @@ ih_superhud_countdamage: !IH_SUPERHUD_COUNTDAMAGE_BOTTOM_INDEX = #$0010 %cm_jsl("Boss Damage Counter", #action_select_superhud_bottom, #$0010) +ih_superhud_counthp: +!IH_SUPERHUD_COUNTHP_BOTTOM_INDEX = #$0011 + %cm_jsl("Boss HP Counter", #action_select_superhud_bottom, #$0011) + ih_superhud_armpump: -!IH_SUPERHUD_ARMPUMP_BOTTOM_INDEX = #$0011 - %cm_jsl("Arm Pump Trainer", #action_select_superhud_bottom, #$0011) +!IH_SUPERHUD_ARMPUMP_BOTTOM_INDEX = #$0012 + %cm_jsl("Arm Pump Trainer", #action_select_superhud_bottom, #$0012) ih_superhud_pumpcounter: - %cm_jsl("Arm Pump Counter", #action_select_superhud_bottom, #$0012) + %cm_jsl("Arm Pump Counter", #action_select_superhud_bottom, #$0013) ih_superhud_xpos: - %cm_jsl("X Position", #action_select_superhud_bottom, #$0013) + %cm_jsl("X Position", #action_select_superhud_bottom, #$0014) ih_superhud_ypos: - %cm_jsl("Y Position", #action_select_superhud_bottom, #$0014) + %cm_jsl("Y Position", #action_select_superhud_bottom, #$0015) ih_superhud_shottimer: -!IH_SUPERHUD_SHOTTIMER_BOTTOM_INDEX = #$0015 - %cm_jsl("Shot Timer", #action_select_superhud_bottom, #$0015) +!IH_SUPERHUD_SHOTTIMER_BOTTOM_INDEX = #$0016 + %cm_jsl("Shot Timer", #action_select_superhud_bottom, #$0016) ih_superhud_ramwatch: -!IH_SUPERHUD_RAMWATCH_BOTTOM_INDEX = #$0016 - %cm_jsl("Custom RAM Watch", #action_select_superhud_bottom, #$0016) +!IH_SUPERHUD_RAMWATCH_BOTTOM_INDEX = #$0017 + %cm_jsl("Custom RAM Watch", #action_select_superhud_bottom, #$0017) ih_superhud_ceresridley: - %cm_jsl("Ceres Ridley Hits", #action_select_superhud_bottom, #$0017) + %cm_jsl("Ceres Ridley Hits", #action_select_superhud_bottom, #$0018) ih_superhud_doorskip: - %cm_jsl("Parlor-Climb Door Skip", #action_select_superhud_bottom, #$0018) + %cm_jsl("Parlor-Climb Door Skip", #action_select_superhud_bottom, #$0019) ih_superhud_tacotank: - %cm_jsl("Taco Tank", #action_select_superhud_bottom, #$0019) + %cm_jsl("Taco Tank", #action_select_superhud_bottom, #$001A) ih_superhud_pitdoor: - %cm_jsl("Pit Room Right Door", #action_select_superhud_bottom, #$001A) + %cm_jsl("Pit Room Right Door", #action_select_superhud_bottom, #$001B) ih_superhud_moondance: - %cm_jsl("Moondance", #action_select_superhud_bottom, #$001B) + %cm_jsl("Moondance", #action_select_superhud_bottom, #$001C) ih_superhud_kraidradar: - %cm_jsl("Kraid Nail Radar", #action_select_superhud_bottom, #$001C) + %cm_jsl("Kraid Nail Radar", #action_select_superhud_bottom, #$001D) ih_superhud_bootlessup: - %cm_jsl("Bootless Up In Two", #action_select_superhud_bottom, #$001D) + %cm_jsl("Bootless Up In Two", #action_select_superhud_bottom, #$001E) ih_superhud_gateglitch: - %cm_jsl("Gate Glitch", #action_select_superhud_bottom, #$001E) + %cm_jsl("Gate Glitch", #action_select_superhud_bottom, #$001F) ih_superhud_moatcwj: - %cm_jsl("Moat CWJ", #action_select_superhud_bottom, #$001F) + %cm_jsl("Moat CWJ", #action_select_superhud_bottom, #$0020) ih_superhud_robotflush: - %cm_jsl("Robot Flush", #action_select_superhud_bottom, #$0020) + %cm_jsl("Robot Flush", #action_select_superhud_bottom, #$0021) ih_superhud_shinetopb: - %cm_jsl("Shine to PB", #action_select_superhud_bottom, #$0021) + %cm_jsl("Shine to PB", #action_select_superhud_bottom, #$0022) ih_superhud_elevatorcf: - %cm_jsl("Elevator Crystal Flash", #action_select_superhud_bottom, #$0022) + %cm_jsl("Elevator Crystal Flash", #action_select_superhud_bottom, #$0023) ih_superhud_botwooncf: - %cm_jsl("Botwoon Crystal Flash", #action_select_superhud_bottom, #$0023) + %cm_jsl("Botwoon Crystal Flash", #action_select_superhud_bottom, #$0024) ih_superhud_draygonai: - %cm_jsl("Draygon AI", #action_select_superhud_bottom, #$0024) + %cm_jsl("Draygon AI", #action_select_superhud_bottom, #$0025) ih_superhud_snailclip: - %cm_jsl("Aqueduct Snail Clip", #action_select_superhud_bottom, #$0025) + %cm_jsl("Aqueduct Snail Clip", #action_select_superhud_bottom, #$0026) ih_superhud_wasteland: - %cm_jsl("Wasteland Entry", #action_select_superhud_bottom, #$0026) + %cm_jsl("Wasteland Entry", #action_select_superhud_bottom, #$0027) ih_superhud_ridleyai: - %cm_jsl("Ridley AI", #action_select_superhud_bottom, #$0027) + %cm_jsl("Ridley AI", #action_select_superhud_bottom, #$0028) ih_superhud_kihuntermanip: - %cm_jsl("Kihunter Manipulation", #action_select_superhud_bottom, #$0028) + %cm_jsl("Kihunter Manipulation", #action_select_superhud_bottom, #$0029) ih_superhud_downbackzeb: - %cm_jsl("Downback Zeb Skip", #action_select_superhud_bottom, #$0029) + %cm_jsl("Downback Zeb Skip", #action_select_superhud_bottom, #$002A) ih_superhud_zebskip: - %cm_jsl("Zeb Skip Indicator", #action_select_superhud_bottom, #$002A) + %cm_jsl("Zeb Skip Indicator", #action_select_superhud_bottom, #$002B) ih_superhud_mbhp: -!IH_SUPERHUD_MBHP_BOTTOM_INDEX = #$002B - %cm_jsl("Mother Brain HP", #action_select_superhud_bottom, #$002B) +!IH_SUPERHUD_MBHP_BOTTOM_INDEX = #$002C + %cm_jsl("Mother Brain HP", #action_select_superhud_bottom, #$002C) ih_superhud_twocries: - %cm_jsl("Two Cries Standup", #action_select_superhud_bottom, #$002C) + %cm_jsl("Two Cries Standup", #action_select_superhud_bottom, #$002D) -!IH_SUPERHUD_BOTTOM_COUNT = #$002D +!IH_SUPERHUD_BOTTOM_COUNT = #$002E action_select_superhud_bottom: { TYA : STA !sram_superhud_bottom @@ -2735,7 +2746,6 @@ TimerSettingsMenu: %cm_header("TIMER SETTINGS") ih_room_counter: -!FRAME_COUNTER_ADJUST_REALTIME = #$0002 dw !ACTION_CHOICE dl #!sram_frame_counter_mode dw #$0000 @@ -2743,6 +2753,7 @@ ih_room_counter: db #$28, " REALTIME", #$FF db #$28, " INGAME", #$FF db #$28, " SPEEDRUN", #$FF + db #$28, " INGAME", #$FF db #$FF ih_lag_counter: From 7b6ed4d174ff37a3a6a66b215e7111218c3a74f7 Mon Sep 17 00:00:00 2001 From: idle <idlechild123@gmail.com> Date: Tue, 10 Feb 2026 21:46:06 -0600 Subject: [PATCH 08/10] Add two bonk indicators --- src/layout.asm | 3 +++ src/misc.asm | 22 ++++++++++++++++++++++ 2 files changed, 25 insertions(+) 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/misc.asm b/src/misc.asm index c7bcd179..51d19993 100644 --- a/src/misc.asm +++ b/src/misc.asm @@ -167,6 +167,26 @@ org $90D000 ; hijack, runs when a shinespark is activated JMP misc_shinespark_activation +org $91DD32 +misc_check_bonk: +{ + LDA !SAMUS_POTENTIAL_POSE_VALUES : BMI .return + LDA $7EC622 : CMP !IH_BLANK : BNE .second + LDA !IH_LETTER_B : STA $7EC622 + .return + LDA !SAMUS_POSE + JMP hijack_bonk_return + .second + LDA !IH_LETTER_B : STA $7EC628 + BRA .return +} +warnpc $91DD5B + +org $91EB53 + JMP misc_check_bonk +hijack_bonk_return: + + ; Continue drawing escape timer after reaching ship if !FEATURE_PAL org $90E905 @@ -175,6 +195,7 @@ org $90E908 endif JSR preserve_escape_timer + ; Stop drawing timer when its VRAM is overwritten if !FEATURE_PAL org $A2AC15 @@ -183,6 +204,7 @@ org $A2ABFD endif JML clear_escape_timer + ; Fast bowling chozo cutscene if !FEATURE_PAL org $84D671 From a2699b9c5ad7ee31165481a87e5307a5378f7d56 Mon Sep 17 00:00:00 2001 From: idle <idlechild123@gmail.com> Date: Sun, 15 Feb 2026 20:03:20 -0600 Subject: [PATCH 09/10] Make bonk indicators work on PAL --- src/misc.asm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/misc.asm b/src/misc.asm index 51d19993..dc2a8772 100644 --- a/src/misc.asm +++ b/src/misc.asm @@ -167,7 +167,11 @@ org $90D000 ; hijack, runs when a shinespark is activated JMP misc_shinespark_activation +if !FEATURE_PAL +org $91DC97 +else org $91DD32 +endif misc_check_bonk: { LDA !SAMUS_POTENTIAL_POSE_VALUES : BMI .return @@ -180,9 +184,13 @@ misc_check_bonk: LDA !IH_LETTER_B : STA $7EC628 BRA .return } -warnpc $91DD5B +%warnpc($91DD5B, $91DCC0) +if !FEATURE_PAL +org $91EAB8 +else org $91EB53 +endif JMP misc_check_bonk hijack_bonk_return: From e49d4a8746bb9a4c0b87c7e16aaf045780d8495e Mon Sep 17 00:00:00 2001 From: idle <idlechild123@gmail.com> Date: Sun, 15 Feb 2026 20:28:13 -0600 Subject: [PATCH 10/10] Release 2.7.3 --- src/main.asm | 4 ++-- web/data/changelog.mdx | 2 ++ web/data/config.json | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main.asm b/src/main.asm index f4178344..21922273 100644 --- a/src/main.asm +++ b/src/main.asm @@ -16,8 +16,8 @@ lorom !VERSION_MAJOR = 2 !VERSION_MINOR = 7 -!VERSION_BUILD = 2 -!VERSION_REV = 11 +!VERSION_BUILD = 3 +!VERSION_REV = 0 table ../resources/normal.tbl print "" diff --git a/web/data/changelog.mdx b/web/data/changelog.mdx index 6b6e67cd..52a12b3b 100644 --- a/web/data/changelog.mdx +++ b/web/data/changelog.mdx @@ -23,6 +23,8 @@ - Fix typos in SuperHUD menu that prevented some selections from working (2.7.2.1) - Allow door event flags for grey doors to work (2.7.2.2) - Fix page navigation in SuperHUD menu (2.7.2.3) +- Add category adjustment options, and also a few small category preset fixes (2.7.3) +- Add toggle IGT/RTA and Boss HP controller shortcuts, and a couple bonk indicators (2.7.3) # Version 2.6.x - Optimize kraid rock projectiles to reduce lag when Kraid rises (2.6.0) diff --git a/web/data/config.json b/web/data/config.json index 51b46061..7e92c834 100644 --- a/web/data/config.json +++ b/web/data/config.json @@ -1,6 +1,6 @@ { "name": "Super Metroid Practice Hack", - "version": "2.7.2.3", + "version": "2.7.3", "variants": ["NTSC", "PAL"], "base": { "NTSC": {