Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
74 changes: 71 additions & 3 deletions src/defines.asm
Original file line number Diff line number Diff line change
Expand Up @@ -488,7 +488,7 @@
; SRAM
; -----

!SRAM_VERSION = #$0022
!SRAM_VERSION = #$0023

!SRAM_START = $702000
!SRAM_SIZE = #$1000
Expand Down Expand Up @@ -577,6 +577,8 @@
!sram_update_timers_options = !SRAM_START+$AE
!sram_sprite_features_blue_color = !SRAM_START+$B0
!sram_sprite_features_grapple_color = !SRAM_START+$B2
!sram_safeties_enabled_kpdr = !SRAM_START+$B4 ; 4 bytes
!sram_safeties_enabled_prkd = !SRAM_START+$B8

; ^ FREE SPACE ^ up to +$CE

Expand Down Expand Up @@ -1188,8 +1190,47 @@ endif
!eram_baby_initial_delay = !ENEMY_VAR_5+!ENEMY_1F_OFFSET

; Also during preset loading, the entire enemy ram region is available
!CATEGORY_PRESET_STACK_SIZE = #$0800
!eram_category_preset_stack = !ENEMY_ID
!eram_safeties_enabled = !ENEMY_ID ; 4 bytes
!eram_safeties_adjust_only = !ENEMY_ID+$4 ; 4 bytes
!eram_safeties_energy = !ENEMY_ID+$8 ; 64 bytes
!eram_safeties_reserves = !ENEMY_ID+$48 ; 64 bytes
!eram_safeties_missiles = !ENEMY_ID+$88 ; 64 bytes
!eram_safeties_supers = !ENEMY_ID+$C8 ; 64 bytes
!eram_safeties_pbs = !ENEMY_ID+$108 ; 64 bytes
!eram_safeties_unequip_items = !ENEMY_ID+$148 ; 64 bytes
!eram_safeties_unequip_beams = !ENEMY_ID+$188 ; 64 bytes
!eram_safeties_selected_item = !ENEMY_ID+$1C8 ; 64 bytes
!eram_safeties_stage_counter = !ENEMY_ID+$208 ; 64 bytes
!eram_safeties_refill = !ENEMY_ID+$248 ; 64 bytes
!eram_category_preset_stack = !ENEMY_ID+$288
!CATEGORY_PRESET_STACK_SIZE = #((!ENEMY_ID+$800)-(!eram_category_preset_stack))

; We can also use stack area for temporary variables while applying safeties and adjustments
!eram_apply_safeties_combo_flag = !ENEMY_ID+$2F8
!eram_apply_safeties_selected_item = !ENEMY_ID+$2FA
!eram_apply_safeties_stage_counter = !ENEMY_ID+$2FC
!eram_apply_safeties_refill = !ENEMY_ID+$2FE
!eram_apply_safeties_enable_flags = !ENEMY_ID+$300 ; 64 bytes
!eram_apply_safeties_adjust_only_flags = !ENEMY_ID+$340 ; 64 bytes

; Mirrors the sram category adjustment variables
!eram_apply_adjust_item_equip = !ENEMY_ID+$380
!eram_apply_adjust_item_unequip = !ENEMY_ID+$382
!eram_apply_adjust_item_remove = !ENEMY_ID+$384
!eram_apply_adjust_beam_equip = !ENEMY_ID+$386
!eram_apply_adjust_beam_unequip = !ENEMY_ID+$388
!eram_apply_adjust_beam_remove = !ENEMY_ID+$38A
!eram_apply_adjust_energy = !ENEMY_ID+$38C
!eram_apply_adjust_etanks = !ENEMY_ID+$38E
!eram_apply_adjust_reserves = !ENEMY_ID+$390
!eram_apply_adjust_rtanks = !ENEMY_ID+$392
!eram_apply_adjust_missiles = !ENEMY_ID+$394
!eram_apply_adjust_maxmissiles = !ENEMY_ID+$396
!eram_apply_adjust_supers = !ENEMY_ID+$398
!eram_apply_adjust_maxsupers = !ENEMY_ID+$39A
!eram_apply_adjust_pbs = !ENEMY_ID+$39C
!eram_apply_adjust_maxpbs = !ENEMY_ID+$39E
!CATEGORY_ADJUST_SIZE_MINUS_ONE = #((!ENEMY_ID+$39F)-(!eram_apply_adjust_item_equip))

!BG3_HDMA_CHANNELS_BACKUP = $7E33EA
!HUD_TILEMAP = $7EC600
Expand All @@ -1205,6 +1246,7 @@ endif
!MAP_TILES_EXPLORED_DEBUG = $7ED452
!WRAM_SAVED_TO_SRAM = $7ED7C0
!EVENT_BIT_ARRAY = $7ED820
!ITEM_COLLECTED_BIT_ARRAY = $7ED870
!OPENED_DOOR_BIT_ARRAY = $7ED8B0
!MAP_STATION_FLAGS = $7ED908
!LOADING_GAME_STATE = $7ED914
Expand Down Expand Up @@ -1753,3 +1795,29 @@ endif
!PROFILE_D9Killdozer = #$001D
!PROFILE_COUNT = #$001E


; ---------------
; Preset Safeties
; ---------------

; Safeties are defined one byte at a time, starting with the command byte
; Additional bytes are needed to complete the definition depending on the command

!SAFETIES_CMD_NOP = $00 ; Safety not implemented (0 bytes)
!SAFETIES_CMD_ADJUST = $01 ; Adjustments only (0 bytes)
!SAFETIES_CMD_ITEM_HI = $02 ; Collect item (1 byte MSB equipment bit, 2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_ITEM_LO = $03 ; Collect item (1 byte LSB equipment bit, 2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_CHARGE = $04 ; Collect charge beam (0 bytes)
!SAFETIES_CMD_BEAM = $05 ; Collect beam (1 byte LSB beam bit, 2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_ETANK = $06 ; Collect energy tank (2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_RTANK = $07 ; Collect reserve tank (2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_MISSILE = $08 ; Collect missile pack (2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_SUPER = $09 ; Collect super pack (2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_PB = $0A ; Collect power bomb pack (2 bytes item collected $D870 offset and bit)
!SAFETIES_CMD_EVENT = $0B ; Set event flag (2 bytes event $D820 offset and bit)
!SAFETIES_CMD_DOOR = $0C ; Set door flag (2 bytes event $D8B0 offset and bit)
!SAFETIES_CMD_STAGED = $0D ; Multi-part definition applied in stages (2 bytes pointer to multi-part definition)
!SAFETIES_CMD_DONE = $0E ; End of safeties (0 bytes, can be omitted if all 16 safeties defined)
!SAFETIES_CMD_MASK = $7F ; Command mask excluding flags
!SAFETIES_COMBO_FLAG = $80 ; Flag indicating the next safeties command also applies

2 changes: 1 addition & 1 deletion src/flagmenu.asm
Original file line number Diff line number Diff line change
Expand Up @@ -876,7 +876,7 @@ events_shaktool:
%cm_toggle_bit("Shaktool Done Digging", $7ED820, #$2000, #0)

events_chozoacid:
%cm_toggle_bit("Chozo Lowered Acid", $7ED821, #$0010, #0)
%cm_toggle_bit("Chozo Lowered Acid", $7ED820, #$1000, #0)

events_metroids:
%cm_numfield("Metroid Rooms Cleared", !ram_cm_metmask, 0, 4, 1, 1, #.routine)
Expand Down
11 changes: 8 additions & 3 deletions src/init.asm
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,7 @@ init_sram_routine_table:
dw init_sram_upgrade_1Fto20
dw init_sram_upgrade_20to22
dw init_sram_upgrade_20to22
dw init_sram_upgrade_22to23
dw init_sram_fail

init_sram:
Expand All @@ -185,7 +186,6 @@ init_sram:
INC : STA !sram_rerandomize
STA !sram_music_toggle
INC : STA !sram_metronome_sfx
STA !sram_preset_category
LDA #$000A : STA !sram_metronome_tickrate

.upgrade_9toA
Expand Down Expand Up @@ -323,8 +323,13 @@ endif
LDA !VANILLA_SPRITE_PALETTE_5_GRAPPLE_COLOR : STA !sram_sprite_features_grapple_color

.upgrade_20to22
TDC : STA !sram_read_only_locks : STA !sram_read_only_locks+2
STA !sram_read_only_locks+4
TDC : STA !sram_read_only_locks : STA !sram_read_only_locks+$2
STA !sram_read_only_locks+$4

.upgrade_22to23
TDC : STA !sram_preset_category : STA !sram_safeties_enabled_prkd
LDA #$0118 : STA !sram_safeties_enabled_kpdr
LDA #$0010 : STA !sram_safeties_enabled_kpdr+$2

LDA !SRAM_VERSION : STA !sram_initialized
RTS
Expand Down
2 changes: 1 addition & 1 deletion src/main.asm
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ lorom
!VERSION_MAJOR = 2
!VERSION_MINOR = 7
!VERSION_BUILD = 11
!VERSION_REV = 0
!VERSION_REV = 21

table ../resources/normal.tbl
print ""
Expand Down
64 changes: 36 additions & 28 deletions src/mainmenu.asm
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,7 @@ action_submenu_jump:

preset_category_submenus:
{
dw #PresetsMenuKpdr
dw #PresetsMenuKpdr20
dw #PresetsMenuKpdr21
dw #PresetsMenuKpdr22
Expand Down Expand Up @@ -332,6 +333,7 @@ preset_category_submenus:

preset_category_banks:
{
dw #PresetsMenuKpdr>>16
dw #PresetsMenuKpdr20>>16
dw #PresetsMenuKpdr21>>16
dw #PresetsMenuKpdr22>>16
Expand Down Expand Up @@ -921,6 +923,7 @@ preset_adjust_plasmabeam:
SelectPresetCategoryMenu:
dw #presets_current
dw #$FFFF
dw #precat_kpdr_safeties
dw #precat_kpdr
dw #precat_prkd19
dw #precat_prkd20
Expand Down Expand Up @@ -948,6 +951,7 @@ presets_current:
dl #!sram_preset_category
dw #.routine
db #$28, "CURRENT PRESET", #$FF
db #$28, " KPDR", #$FF
db #$28, " KPDR 20%", #$FF
db #$28, " KPDR 21%", #$FF
db #$28, " KPDR 22%", #$FF
Expand Down Expand Up @@ -983,6 +987,7 @@ precat_kpdr:
%cm_submenu("KPDR", #SelectKpdrPresetCategoryMenu)

SelectKpdrPresetCategoryMenu:
dw #precat_kpdr_safeties
dw #precat_kpdr20
dw #precat_kpdr21
dw #precat_kpdr22
Expand All @@ -993,70 +998,73 @@ SelectKpdrPresetCategoryMenu:
dw #$0000
%cm_header("SELECT KPDR CATEGORY")

precat_kpdr_safeties:
%cm_jsl("KPDR (Safeties)", #action_select_preset_category, #$0000)

precat_kpdr20:
%cm_jsl("20% KPDR 15 Missiles", #action_select_preset_category, #$0000)
%cm_jsl("20% KPDR 15 Missiles", #action_select_preset_category, #$0001)

precat_kpdr21:
%cm_jsl("21% KPDR 3 E-Tanks", #action_select_preset_category, #$0001)
%cm_jsl("21% KPDR 3 E-Tanks", #action_select_preset_category, #$0002)

precat_kpdr22:
%cm_jsl("22% KPDR 4 E-Tanks", #action_select_preset_category, #$0002)
%cm_jsl("22% KPDR 4 E-Tanks", #action_select_preset_category, #$0003)

precat_kpdr23:
%cm_jsl("23% KPDR with Spazer", #action_select_preset_category, #$0003)
%cm_jsl("23% KPDR with Spazer", #action_select_preset_category, #$0004)

precat_kpdr25:
%cm_jsl("25% KPDR Early Ice", #action_select_preset_category, #$0004)
%cm_jsl("25% KPDR Early Ice", #action_select_preset_category, #$0005)

precat_prkd19:
%cm_jsl("19% PRKD 15 Missiles", #action_select_preset_category, #$0005)
%cm_jsl("19% PRKD 15 Missiles", #action_select_preset_category, #$0006)

precat_prkd20:
%cm_jsl("20% PRKD 20 Missiles", #action_select_preset_category, #$0006)
%cm_jsl("20% PRKD 20 Missiles", #action_select_preset_category, #$0007)

precat_pkrd:
%cm_jsl("Any% PKRD", #action_select_preset_category, #$0007)
%cm_jsl("Any% PKRD", #action_select_preset_category, #$0008)

precat_gtclassic:
%cm_jsl("GT Classic", #action_select_preset_category, #$0008)
%cm_jsl("GT Classic", #action_select_preset_category, #$0009)

precat_gtmax:
%cm_jsl("GT Max%", #action_select_preset_category, #$0009)
%cm_jsl("GT Max%", #action_select_preset_category, #$000A)

precat_100early:
%cm_jsl("100% Early Crocomire", #action_select_preset_category, #$000A)
%cm_jsl("100% Early Crocomire", #action_select_preset_category, #$000B)

precat_hundo:
%cm_jsl("100% Late Crocomire", #action_select_preset_category, #$000B)
%cm_jsl("100% Late Crocomire", #action_select_preset_category, #$000C)

precat_100map:
!PRESET_CATEGORY_100MAP_INDEX = #$000C
%cm_jsl("100% Map Completion", #action_select_preset_category, #$000C)
!PRESET_CATEGORY_100MAP_INDEX = #$000D
%cm_jsl("100% Map Completion", #action_select_preset_category, #$000D)

precat_spazermap:
!PRESET_CATEGORY_SPAZERMAP_INDEX = #$000D
%cm_jsl("100% Map with Spazer", #action_select_preset_category, #$000D)
!PRESET_CATEGORY_SPAZERMAP_INDEX = #$000E
%cm_jsl("100% Map with Spazer", #action_select_preset_category, #$000E)

precat_14ice:
%cm_jsl("14% Ice", #action_select_preset_category, #$000E)
%cm_jsl("14% Ice", #action_select_preset_category, #$000F)

precat_14speed:
%cm_jsl("14% Speed", #action_select_preset_category, #$000F)
%cm_jsl("14% Speed", #action_select_preset_category, #$0010)

precat_rbo:
%cm_jsl("Reverse Boss Order", #action_select_preset_category, #$0010)
%cm_jsl("Reverse Boss Order", #action_select_preset_category, #$0011)

precat_suitless:
%cm_jsl("Max% Suitless", #action_select_preset_category, #$0011)
%cm_jsl("Max% Suitless", #action_select_preset_category, #$0012)

precat_ngplasma:
%cm_jsl("NewGame+ Plasma", #action_select_preset_category, #$0012)
%cm_jsl("NewGame+ Plasma", #action_select_preset_category, #$0013)

precat_nghyper:
%cm_jsl("NewGame+ Hyper", #action_select_preset_category, #$0013)
%cm_jsl("NewGame+ Hyper", #action_select_preset_category, #$0014)

precat_nintendopower:
%cm_jsl("Nintendo Power%", #action_select_preset_category, #$0014)
%cm_jsl("Nintendo Power%", #action_select_preset_category, #$0015)

precat_allboss:
%cm_submenu("All Bosses", #SelectAllBossesPresetCategoryMenu)
Expand All @@ -1069,19 +1077,19 @@ SelectAllBossesPresetCategoryMenu:
%cm_header("SELECT ALL BOSSES CATEGORY")

precat_allbosskpdr:
%cm_jsl("All Bosses KPDR", #action_select_preset_category, #$0015)
%cm_jsl("All Bosses KPDR", #action_select_preset_category, #$0016)

precat_allbosspkdr:
%cm_jsl("All Bosses PKDR", #action_select_preset_category, #$0016)
%cm_jsl("All Bosses PKDR", #action_select_preset_category, #$0017)

precat_allbossprkd:
%cm_jsl("All Bosses PRKD", #action_select_preset_category, #$0017)
%cm_jsl("All Bosses PRKD", #action_select_preset_category, #$0018)

precat_nodropskpdr:
%cm_jsl("No Drops KPDR", #action_select_preset_category, #$0018)
%cm_jsl("No Drops KPDR", #action_select_preset_category, #$0019)

precat_rando:
%cm_jsl("Randomizer", #action_select_preset_category, #$0019)
%cm_jsl("Randomizer", #action_select_preset_category, #$001A)

action_select_preset_category:
{
Expand Down
Loading
Loading