Skip to content
Closed
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
64 changes: 62 additions & 2 deletions src/defines.asm
Original file line number Diff line number Diff line change
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_kpdr20 = !SRAM_START+$B4
!sram_safeties_kpdr25 = !SRAM_START+$B6

; ^ FREE SPACE ^ up to +$CE

Expand Down Expand Up @@ -1186,8 +1188,39 @@
!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_energy = !ENEMY_ID
!eram_safeties_reserves = !ENEMY_ID+$20
!eram_safeties_missiles = !ENEMY_ID+$40
!eram_safeties_supers = !ENEMY_ID+$60
!eram_safeties_pbs = !ENEMY_ID+$80
!eram_safeties_unequip_items = !ENEMY_ID+$A0
!eram_safeties_unequip_beams = !ENEMY_ID+$C0
!eram_safeties_enabled = !ENEMY_ID+$E0
!eram_category_preset_stack = !ENEMY_ID+$E2
!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_enable_flags = !ENEMY_ID+$200
!eram_apply_safeties_combo_flag = !ENEMY_ID+$220

; Mirrors the sram category adjustment variables
!eram_apply_adjust_item_equip = !ENEMY_ID+$300
!eram_apply_adjust_item_unequip = !ENEMY_ID+$302
!eram_apply_adjust_item_remove = !ENEMY_ID+$304
!eram_apply_adjust_beam_equip = !ENEMY_ID+$306
!eram_apply_adjust_beam_unequip = !ENEMY_ID+$308
!eram_apply_adjust_beam_remove = !ENEMY_ID+$30A
!eram_apply_adjust_energy = !ENEMY_ID+$30C
!eram_apply_adjust_etanks = !ENEMY_ID+$30E
!eram_apply_adjust_reserves = !ENEMY_ID+$310
!eram_apply_adjust_rtanks = !ENEMY_ID+$312
!eram_apply_adjust_missiles = !ENEMY_ID+$314
!eram_apply_adjust_maxmissiles = !ENEMY_ID+$316
!eram_apply_adjust_supers = !ENEMY_ID+$318
!eram_apply_adjust_maxsupers = !ENEMY_ID+$31A
!eram_apply_adjust_pbs = !ENEMY_ID+$31C
!eram_apply_adjust_maxpbs = !ENEMY_ID+$31E
!CATEGORY_ADJUST_SIZE_MINUS_ONE = #((!ENEMY_ID+$31F)-(!eram_apply_adjust_item_equip))

!BG3_HDMA_CHANNELS_BACKUP = $7E33EA
!HUD_TILEMAP = $7EC600
Expand All @@ -1203,6 +1236,7 @@
!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 @@ -1358,6 +1392,7 @@ endif
!ACTION_CATEGORY_PRESET = #$002C
!ACTION_ADJUST_ITEM = #$002E
!ACTION_COLOR_BAR = #$0030
!ACTION_CATEGORY_SAFETY = #$0032

!SAFEWORD = #$5AFE

Expand Down Expand Up @@ -1752,3 +1787,28 @@ 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_DONE = $0D ; 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

6 changes: 6 additions & 0 deletions src/init.asm
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,12 @@ endif
TDC : STA !sram_read_only_locks : STA !sram_read_only_locks+2
STA !sram_read_only_locks+4

; KPDR late ice defaults to 4-Tank 25/10 safeties
LDA #$0086 : STA !sram_safeties_kpdr20

; KPDR early ice defaults to Spazer 5-Tank 25/10 safeties
LDA #$2087 : STA !sram_safeties_kpdr25

LDA !SRAM_VERSION : STA !sram_initialized
RTS

Expand Down
12 changes: 12 additions & 0 deletions src/macros.asm
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,18 @@ macro cm_preset(title, textAddr, target)
dw <textAddr>
endmacro

macro cm_safety(value, title, textAddr, sramAddr)
; Displays safety name, value, and safety sram location
.dm_actionIndex
dw !ACTION_CATEGORY_SAFETY
.dm_arg
dw <value>
.dm_sram
dl <sramAddr>
.dm_textAddr
dw <textAddr>
endmacro

macro cm_custompreset(slot)
; Displays custom preset data and allows selecting active slot
custompreset_<slot>:
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 = 9
!VERSION_REV = 1
!VERSION_REV = 18

table ../resources/normal.tbl
print ""
Expand Down
52 changes: 51 additions & 1 deletion src/menu.asm
Original file line number Diff line number Diff line change
Expand Up @@ -817,6 +817,7 @@ cm_draw_action_table:
dw draw_category_preset
dw draw_adjust_item
dw draw_color_bar
dw draw_category_safety

draw_toggle:
{
Expand Down Expand Up @@ -869,6 +870,41 @@ draw_toggle_bit:
RTS
}

draw_category_safety:
{
; grab bitmask
LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_ToggleValue

; 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

; get address to text label
%item_index_to_vram_index()
PHX : LDA [!DP_CurrentMenu] : TAY

; prepare to draw text
%a8()
; ORA with palette info
LDA #$28 : ORA !DP_Palette : STA !DP_Palette
; set bank to preset names bank
PHB : LDA.b #preset_names>>16 : PHA : PLB

.loop
LDA $0000,Y : CMP #$FF : BEQ .end ; terminator
STA !ram_tilemap_buffer,X : INX ; tile
LDA !DP_Palette : STA !ram_tilemap_buffer,X : INX ; palette
INY : BRA .loop

.end
PLB : PLX
%a16()

; grab the value at that memory address
LDA [!DP_Address] : AND !DP_ToggleValue : BEQ draw_toggle_bit_off
BRA draw_toggle_inverted_on
}

draw_toggle_inverted:
{
; grab the memory address (long)
Expand Down Expand Up @@ -1290,7 +1326,6 @@ draw_ctrl_shortcut:

.end
RTS

}

draw_controller_input:
Expand Down Expand Up @@ -3033,6 +3068,7 @@ cm_execute_action_table:
dw execute_category_preset
dw execute_adjust_item
dw execute_nop ; color bar
dw execute_category_safety

execute_nop:
RTS
Expand Down Expand Up @@ -4097,6 +4133,20 @@ execute_adjust_item:
RTS
}

execute_category_safety:
{
; Load which bit(s) to toggle
LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_ToggleValue

; Load the address
LDA [!DP_CurrentMenu] : INC !DP_CurrentMenu : INC !DP_CurrentMenu : STA !DP_Address
LDA [!DP_CurrentMenu] : STA !DP_Address+2

; Toggle the bit
LDA [!DP_Address] : EOR !DP_ToggleValue : STA [!DP_Address]
RTS
}

cm_hex2dec:
{
; store 16-bit dividend
Expand Down
Loading
Loading