diff --git a/Core/sprite_functions.asm b/Core/sprite_functions.asm index 7af4a91..3d69b6c 100644 --- a/Core/sprite_functions.asm +++ b/Core/sprite_functions.asm @@ -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 } ; ========================================================= diff --git a/Sprites/Bosses/twinrova.asm b/Sprites/Bosses/twinrova.asm index 3389c5e..91a3615 100644 --- a/Sprites/Bosses/twinrova.asm +++ b/Sprites/Bosses/twinrova.asm @@ -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