Add Sprite_CountActiveById, limit keese in twinrova fight

This commit is contained in:
scawful
2025-01-19 13:16:52 -05:00
parent c7db1c1776
commit f8a264d1df
2 changed files with 92 additions and 102 deletions

View File

@@ -317,7 +317,23 @@ Sprite_CheckForPresence:
.done
PLX
RTL
}
; $00 - ID of the sprite to check
; $02 - Number of sprites found
Sprite_CountActiveById:
{
STZ $02
LDX.b #$10
.x_loop
DEX
LDA $0E20, X : CMP.b $00 : BEQ .increment
BRA .continue
.increment
INC $02
.continue
CPX.b #$00 : BNE .x_loop
RTL
}
; =========================================================

View File

@@ -159,7 +159,7 @@ Sprite_Twinrova_Main:
PLX
LDA.w SprAction, X
JSL UseImplicitRegIndexedLocalJumpTable
JSL JumpTableLocal
dw Twinrova_Init ; 0x00
dw Twinrova_MoveState ; 0x01
@@ -200,14 +200,17 @@ Sprite_Twinrova_Main:
.phase_1
%ProbCheck($3F, +)
%ProbCheck($0F, ++)
JSL Sprite_SpawnFireKeese
LDA.b #$11 : STA.b $00
JSL Sprite_CountActiveById
LDA.b $02 : CMP.b #$03 : BCS +
%ProbCheck($3F, +)
%ProbCheck($0F, ++)
JSL Sprite_SpawnFireKeese
LDA.b #$01 : STA.w SprMiscB, Y
JMP +
++
JSL Sprite_SpawnIceKeese
LDA.b #$01 : STA.w SprMiscB, Y
JMP +
++
JSL Sprite_SpawnIceKeese
LDA.b #$01 : STA.w SprMiscB, Y
+
LDA.w SprFlash, X : BEQ .not_flashing
@@ -528,31 +531,30 @@ DoRandomStrafe:
; Velocity offsets table
VelocityOffsets:
db $08, $F8, $08, $F8 ; X speeds (right, left, down, up)
db $04, $FC, $04, $FC ; Y speeds (down, up, right, left)
db $08, $F8, $08, $F8 ; X speeds (right, left, down, up)
db $04, $FC, $04, $FC ; Y speeds (down, up, right, left)
; Target positions table (relative to the player)
TargetPositions:
dw $0040, $FFC0 ; Right, Left
dw $0040, $FFC0 ; Down, Up
dw $0040, $FFC0 ; Right, Left
dw $0040, $FFC0 ; Down, Up
; =========================================================
Twinrova_RestoreFloorTile:
{
LDA.w SprY, X : AND #$F8 : STA.b $00 : LDA.w SprYH, X : STA.b $01
LDA.w SprX, X : AND #$F8 : STA.b $02 : LDA.w SprXH, X : STA.b $03
LDA.w SprY, X : STA.b $00 : LDA.w SprYH, X : STA.b $01
LDA.w SprX, X : STA.b $02 : LDA.w SprXH, X : STA.b $03
LDA.b #$00
JSL Sprite_GetTileAttr
LDA.w $0FA5 : CMP.b #$0E : BNE +
LDA.w SprX,Y : STA.l $7FF83C,X
LDA.w SprXH,Y : STA.l $7FF878,X
LDA.w SprY,Y : CLC : ADC.b #$10 : STA.l $7FF81E,X
LDA.w SprYH,Y : ADC.b #$00 : STA.l $7FF85A,X
LDA.w SprX, Y : STA.l $7FF83C, X
LDA.w SprXH, Y : STA.l $7FF878, X
LDA.w SprY, Y : CLC : ADC.b #$10 : STA.l $7FF81E, X
LDA.w SprYH, Y : ADC.b #$00 : STA.l $7FF85A, X
JSR RestoreFloorTile
+
RTS
}
@@ -586,71 +588,44 @@ AddPitHazard:
Ganon_SpawnFallingTilesOverlord:
{
#_1D90D0: LDY.b #$07
LDY.b #$07
.next_slot
#_1D90D2: LDA.w $0B00,Y
#_1D90D5: BEQ .free_slot
#_1D90D7: DEY
#_1D90D8: BPL .next_slot
#_1D90DA: RTS
;----------------------------------------------------------
LDA.w $0B00, Y : BEQ .free_slot
DEY : BPL .next_slot
RTS
.free_slot
#_1D90DB: LDA.w SprMiscF,X
#_1D90DE: CMP.b #$04
#_1D90E0: BCS .dont_spawn
#_1D90E2: INC.w SprMiscF,X
#_1D90E5: PHX
#_1D90E6: TAX
#_1D90E7: LDA.w .overlord_type,X
#_1D90EA: STA.w $0B00,Y
#_1D90ED: LDA.w .position_x,X
#_1D90F0: STA.w $0B08,Y
#_1D90F3: LDA.b $23
#_1D90F5: STA.w $0B10,Y
#_1D90F8: LDA.w .position_y,X
#_1D90FB: STA.w $0B18,Y
#_1D90FE: LDA.b $21
#_1D9100: STA.w $0B20,Y
#_1D9103: LDA.b #$00
#_1D9105: STA.w $0B28,Y
#_1D9108: STA.w $0B30,Y
#_1D910B: PLX
LDA.w SprMiscF, X : CMP.b #$04 : BCS .dont_spawn
INC.w SprMiscF, X
PHX
TAX
LDA.w .overlord_type, X : STA.w $0B00, Y
LDA.w .position_x, X : STA.w $0B08, Y
LDA.b $23 : STA.w $0B10, Y
LDA.w .position_y, X : STA.w $0B18, Y
LDA.b $21 : STA.w $0B20, Y
LDA.b #$00 : STA.w $0B28, Y : STA.w $0B30, Y
PLX
.dont_spawn
#_1D910C: RTS
RTS
.overlord_type
#_1D90C4: db $0C ; OVERLORD 0C
#_1D90C5: db $0D ; OVERLORD 0D
#_1D90C6: db $0E ; OVERLORD 0E
#_1D90C7: db $0F ; OVERLORD 0F
db $0C ; OVERLORD 0C
db $0D ; OVERLORD 0D
db $0E ; OVERLORD 0E
db $0F ; OVERLORD 0F
.position_x
#_1D90C8: db $18
#_1D90C9: db $D8
#_1D90CA: db $D8
#_1D90CB: db $18
db $18
db $D8
db $D8
db $18
.position_y
#_1D90CC: db $20
#_1D90CD: db $20
#_1D90CE: db $D0
#_1D90CF: db $D0
db $20
db $20
db $D0
db $D0
}
; =========================================================
@@ -833,16 +808,15 @@ ReleaseFireballs:
LDA.w .speed_x, Y : STA.w SprXSpeed, X
LDA.w .speed_y, Y : STA.w SprYSpeed, X
LDA.w SprX, X : CLC : ADC.w .offset_x_low,Y : STA.w SprX,X
LDA.w SprX, X : CLC : ADC.w .offset_x_low, Y : STA.w SprX, X
LDA.w SprXH, X : ADC.w .offset_x_high, Y : STA.w SprXH, X
LDA.w SprY,X : CLC : ADC.w .offset_y_low,Y : STA.w SprY,X
LDA.w SprYH,X : ADC.w .offset_y_high,Y : STA.w SprYH,X
LDA.w SprY, X : CLC : ADC.w .offset_y_low, Y : STA.w SprY, X
LDA.w SprYH, X : ADC.w .offset_y_high, Y : STA.w SprYH, X
PLX
.exit_a
RTS
.offset_x_low
db 12, -12, 0, 0
@@ -966,28 +940,28 @@ Blind_SpawnFromMaiden:
LDX.b #$00 ; Load the boss into sprite index 0
; Set the sprite to alive and active
LDA.b #$09 : STA.w SprState,X
LDA.b #$09 : STA.w SprState, X
; SPRITE CE
LDA.b #$CE : STA.w $0E20,X
LDA.b #$CE : STA.w $0E20, X
; Load the position cache from the maiden follower
LDA.b $00 : STA.w SprX,X
LDA.b $01 : STA.w SprXH,X
LDA.b $02 : SEC : SBC.b #$10 : STA.w SprY,X
LDA.b $03 : STA.w SprYH,X
LDA.b $00 : STA.w SprX, X
LDA.b $01 : STA.w SprXH, X
LDA.b $02 : SEC : SBC.b #$10 : STA.w SprY, X
LDA.b $03 : STA.w SprYH, X
; Removed because it was causing the sprite to disappear
; JSL SpritePrep_LoadProperties
; Set SprTimerC
LDA.b #$C0 : STA.w SprTimerC,X
LDA.b #$C0 : STA.w SprTimerC, X
; Set SprGfx
LDA.b #$00 : STA.w $0DC0,X
LDA.b #$00 : STA.w $0DC0, X
; Set SprMiscC and bulletproof properties
LDA.b #$02 : STA.w SprMiscC,X : STA.w SprBulletproof,X
LDA.b #$02 : STA.w SprMiscC, X : STA.w SprBulletproof, X
; Set the 2nd key / heart piece items taken room flag
LDA.w $0403 : ORA.b #$20 : STA.w $0403
@@ -1012,15 +986,15 @@ SpritePrep_Blind_PrepareBattle:
; CMP.b #$06 ; FOLLOWER 06
; BEQ .despawn
LDA.w $0403 : AND.b #$20 : BEQ .despawn
LDA.b #$60 : STA.w SprTimerC,X
LDA.b #$01 : STA.w SprMiscB,X
LDA.b #$02 : STA.w SprMiscC,X
LDA.b #$04 : STA.w SprMiscE,X
LDA.b #$07 : STA.w $0DC0,X
LDA.b #$60 : STA.w SprTimerC, X
LDA.b #$01 : STA.w SprMiscB, X
LDA.b #$02 : STA.w SprMiscC, X
LDA.b #$04 : STA.w SprMiscE, X
LDA.b #$07 : STA.w $0DC0, X
STZ.w $0B69
RTL
.despawn
STZ.w SprState,X
STZ.w SprState, X
RTL
}
@@ -1038,7 +1012,7 @@ org $01B3E1
org $1DA0B1
BlindLaser_SpawnTrailGarnish:
{
LDA.w SprDelay,X : AND.b #$00 : BNE .exit
LDA.w SprDelay, X : AND.b #$00 : BNE .exit
PHX
TXY
@@ -1046,7 +1020,7 @@ BlindLaser_SpawnTrailGarnish:
LDX.b #$1D
.next_slot
LDA.l $7FF800,X : BEQ .free_slot
LDA.l $7FF800, X : BEQ .free_slot
DEX
BPL .next_slot
@@ -1064,15 +1038,15 @@ BlindLaser_SpawnTrailGarnish:
STA.l $7FF800, X
STA.w $0FB4
LDA.w $0DC0,Y : STA.l $7FF9FE,X
TYA : STA.l $7FF92C,X
LDA.w $0DC0, Y : STA.l $7FF9FE, X
TYA : STA.l $7FF92C, X
LDA.w SprX,Y : STA.l $7FF83C,X
LDA.w SprXH,Y : STA.l $7FF878,X
LDA.w SprY,Y : CLC : ADC.b #$10 : STA.l $7FF81E,X
LDA.w SprYH,Y : ADC.b #$00 : STA.l $7FF85A,X
LDA.w SprX, Y : STA.l $7FF83C, X
LDA.w SprXH, Y : STA.l $7FF878, X
LDA.w SprY, Y : CLC : ADC.b #$10 : STA.l $7FF81E, X
LDA.w SprYH, Y : ADC.b #$00 : STA.l $7FF85A, X
LDA.b #$0A : STA.l $7FF90E,X
LDA.b #$0A : STA.l $7FF90E, X
PLX