From 895074a4cb642b440dfdbb47c56b0c173a35eb75 Mon Sep 17 00:00:00 2001 From: aerinon Date: Fri, 30 Sep 2022 15:28:38 -0600 Subject: [PATCH] Support for new items Support for static enemy drops Bug fix for wrong sprites dead --- enemizer/hooks/underworld_sprite_hooks.asm | 2 +- enemizer/underworld_sprites.asm | 5 ++ keydrop/standing_items.asm | 65 +++++++++++++-- newitems.asm | 96 +++++++++++++++++++--- utilities.asm | 16 +++- 5 files changed, 159 insertions(+), 25 deletions(-) diff --git a/enemizer/hooks/underworld_sprite_hooks.asm b/enemizer/hooks/underworld_sprite_hooks.asm index 9febb1a..4c4dc47 100644 --- a/enemizer/hooks/underworld_sprite_hooks.asm +++ b/enemizer/hooks/underworld_sprite_hooks.asm @@ -30,7 +30,7 @@ org $09C35A DEC.b $03 org $09C36E -LDA.b $03 +JSL GetSpriteSlot16Bit ; depended on high bit being zero, which it isn't anymore org $09C383 LDX.b $03 diff --git a/enemizer/underworld_sprites.asm b/enemizer/underworld_sprites.asm index 331c3d7..2d860e1 100644 --- a/enemizer/underworld_sprites.asm +++ b/enemizer/underworld_sprites.asm @@ -4,3 +4,8 @@ LoadUnderworldSprites: LDA.w $048E RTL +GetSpriteSlot16Bit: + LDA.b $03 : AND #$00FF + ASL A + TAY +RTL \ No newline at end of file diff --git a/keydrop/standing_items.asm b/keydrop/standing_items.asm index 081e6dc..01f6c90 100644 --- a/keydrop/standing_items.asm +++ b/keydrop/standing_items.asm @@ -318,10 +318,21 @@ RevealSpriteDrop: LDA.l SprItemReceipt, X : STA SpawnedItemID LDA.l SprItemMWPlayer, X : STA SpawnedItemMWPlayer LDY.b #$01 ; trigger the small key routines - LDA SpawnedItemID : CMP #$32 : BNE + + LDA.w SpawnedItemID : STA.b $00 : CMP #$32 : BNE + LDA.l StandingItemsOn : BNE + INY ; big key routine - + RTL ; unstun if stunned + + + PHX : LDX.b #$00 + - CPX.b #$1A : BCS .done + LDA.l MinorForcedDrops, X + CMP.b $00 : BNE + + INX : LDA.l MinorForcedDrops, X : STA.b $00 + PLX : PLA : PLA : PEA.w $06F9D7-1 ; change call stack for PrepareEnemyDrop + JSR IncrementCountForMinor + LDA.b $00 : RTL + + INX #2 : BRA - + .done PLX + RTL ; unstun if stunned .normal LDY.w $0CBA, X : BEQ .no_forced_drop RTL @@ -341,6 +352,41 @@ RevealSpriteDrop2: PEA.w $06E3CE-1 ; change return address to .no_forced_drop of (Sprite_DoTheDeath) RTL +MinorForcedDrops: +; Item ID -> Sprite ID +db $27, $DC ; BOMB REFILL 1 +db $28, $DD ; BOMB REFILL 4 +db $31, $DE ; BOMB REFILL 8 +db $34, $D9 ; GREEN RUPEE ($34) +db $35, $DA ; BLUE RUPEE ($35) +db $36, $DB ; RED RUPEE ($36) +db $42, $D8 ; HEART ($42) +db $44, $E2 ; ARROW REFILL 10 ($44) +db $45, $DF ; SMALL MAGIC DECANTER ($45) +db $B2, $E3 ; FAERIE ($B2) +db $B3, $0B ; CUCCO ($B3) +db $B4, $E0 ; LARGE MAGIC DECANTER ($B4) +db $B5, $E1 ; ARROW REFILL 5 (x??) + + +IncrementCountForMinor: + PHX : REP #$30 + LDA.w SpawnedItemIndex : ASL : TAX : LDA.l BitFieldMasks, X : STA $0A + LDA.b $A0 : ASL : TAX + LDA.l SpritePotData, X : BIT $0A : BNE .obtained + ORA $0A : STA SpritePotData, X + SEP #$30 + LDA $040C : CMP #$FF : BEQ + + BNE ++ + INC #2 ; treat sewers as HC + ++ LSR : TAX : LDA DungeonLocationsChecked, X : INC : STA DungeonLocationsChecked, X + ; Could increment GT Tower Pre Big Key but we aren't showing that stat right now + + REP #$30 + LDA TotalItemCounter : INC : STA TotalItemCounter ; Increment Item Total + .obtained + SEP #$30 : PLX +RTS + BitFieldMasks: dw $8000, $4000, $2000, $1000, $0800, $0400, $0200, $0100 dw $0080, $0040, $0020, $0010, $0008, $0004, $0002, $0001 @@ -348,6 +394,7 @@ dw $0080, $0040, $0020, $0010, $0008, $0004, $0002, $0001 ; Runs during Sprite_E4_SmallKey and duning Sprite_E5_BigKey spawns ShouldSpawnItem: LDA $048E : CMP.b #$87 : BNE + ; check for hera basement cage + CPX #$0A : BNE + ; the hera basement key is always sprite 0x0A LDA $A8 : AND.b #$03 : CMP.b #$02 : BNE + ; we're not in that quadrant LDA.w $0403 : AND.w KeyRoomFlagMasks,Y : RTL + @@ -372,8 +419,9 @@ ShouldSpawnItem: MarkSRAMForItem: LDA $048E : CMP.b #$87 : BNE + ; check for hera basement cage - LDA $A8 : AND.b #$03 : CMP.b #$02 : BNE + - LDA.w $0403 : ORA.w KeyRoomFlagMasks, Y : RTL + CPX #$0A : BNE + ; the hera basement key is always sprite 0x0A + LDA $A8 : AND.b #$03 : CMP.b #$02 : BNE + + LDA.w $0403 : ORA.w KeyRoomFlagMasks, Y : RTL + PHX : PHY : REP #$30 LDA.b $A0 : ASL : TAY LDA.l SpawnedItemIndex : ASL @@ -391,10 +439,11 @@ SpriteKeyPrep: LDA.w $0B9B : STA.w $0CBA, X ; what we wrote over PHA LDA $A0 : CMP #$87 : BNE .continue - LDA $A9 : ORA $AA : AND #$03 : CMP #$02 : BNE .continue - LDA #$00 : STA.w SpawnedItemFlag : STA SprItemFlags, X - LDA #$24 : STA $0E80, X - BRA + + CPX #$0A : BNE .continue ; the hera basement key is always sprite 0x0A + LDA $A9 : ORA $AA : AND #$03 : CMP #$02 : BNE .continue + LDA #$00 : STA.w SpawnedItemFlag : STA SprItemFlags, X + LDA #$24 : STA $0E80, X + BRA + .continue LDA.w SpawnedItemIndex : STA SprItemIndex, X LDA.w SpawnedItemMWPlayer : STA SprItemMWPlayer, X diff --git a/newitems.asm b/newitems.asm index df62be5..38b7bf8 100755 --- a/newitems.asm +++ b/newitems.asm @@ -40,6 +40,9 @@ ; #$90 - Big Keys ; #$A0 - Small Keys ; #$B0 - Bee Trap +; #$B2 - Fairy +; #$B3 - Chicken +; #$B4 - Big Magic ; #$FE - Server Request (Asychronous Chest) ; #$FF - Null Chest ;-------------------------------------------------------------------------------- @@ -395,10 +398,13 @@ AddReceivedItemExpandedGetItem: ++ JMP .done + CMP.b #$B0 : BNE + ; Bee Trap - LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI + ; DashBeeHive_SpawnBee - LDA $22 : STA $0D10, Y : LDA $23 : STA $0D30, Y ; from enemizer's Spawn_Bees + LDA.b #$79 : JSL Sprite_SpawnDynamically : BMI ++ ; DashBeeHive_SpawnBee + LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y + LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 LDA $20 : STA $0D00, Y : LDA $21 : STA $0D20, Y - + + LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link + ++ JMP .done + + JSR NewItemsChecks .done PLX LDA $02E9 : CMP.b #$01 ; thing we wrote over @@ -553,6 +559,7 @@ AddReceivedItemExpanded: ;DATA AddReceivedItemExpanded { ; This is a temporary measure for Fish to have consistent addresses +warnpc $A08800 org $A08800 .y_offsets @@ -590,7 +597,12 @@ org $A08800 db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Big Key db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Free Small Key db -4 ; Bee Trap - db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused + db -4 ; Apples + db -4 ; Fairy + db -4 ; Chicken + db -4 ; Big Magic + db -4 ; 5 Arrows + db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused db -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4, -4 ; Unused @@ -631,7 +643,12 @@ org $A08800 ;db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; *EVENT* db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key db 0 ; Bee Trap - db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused + db 0 ; Apples + db 0 ; Fairy + db 0 ; Chicken + db 4 ; Big Magic + db 0 ; 5 Arrows + db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ; Unused @@ -677,7 +694,12 @@ org $A08800 ;db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; *EVENT* db $47 ; Bee Trap - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused + db $47 ; Apples + db $47 ; Fairy + db $47 ; Chicken + db $3B ; Big Magic + db $02 ; 5 Arrows + db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused @@ -717,8 +739,12 @@ org $A08800 db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Free Big Key db $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00 ; Free Small Key db $02 ; Bee Trap - - db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused + db $02 ; Apples + db $02 ; Fairy + db $02 ; Chicken + db $00 ; Big Magic + db $02 ; 5 Arrows + db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused db $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02, $02 ; Unused @@ -759,7 +785,12 @@ org $A08800 db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Big Key db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Free Small Key db 1 ; Bee Trap - db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused + db 1 ; Apples + db 1 ; Fairy + db 1 ; Chicken + db 4 ; Big Magic + db 2 ; 5 Arrows + db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused db 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ; Unused @@ -801,7 +832,12 @@ org $A08800 dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Big Key dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Free Small Key dw $F36A ; Bee Trap - dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused + dw $F36A ; Apples + dw $F36A ; Fairy + dw $F36A ; Chicken + dw $F373 ; Big Magic + dw $F376 ; 5 Arrows + dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused dw $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A, $F36A ; Unused @@ -845,7 +881,12 @@ org $A08800 db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Big Key db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Free Small Key db $FF ; Bee Trap - db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused + db $FF ; Apples + db $FF ; Fairy + db $FF ; Chicken + db $80 ; Big Magic + db $05 ; 5 Arrows + db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ; Unused @@ -930,8 +971,12 @@ Link_ReceiveItemAlternatesExpanded: db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Compass db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Big Key db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Free Small Key - db -1 ; Bee Trap - db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused + db -1 ; Apples + db -1 ; Fairy + db -1 ; Chicken + db -1 ; Big Magic + db -1 ; 5 Arrows + db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused db -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ; Unused @@ -1213,3 +1258,28 @@ MaybeFlagCompassTotalEntrance: .done RTL ;-------------------------------------------------------------------------------- + +NewItemsChecks: + CMP.b #$B2 : BNE + ; Fairy + LDA.b #$E3 : JSL Sprite_SpawnDynamically : BMI .done + LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y + LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 + LDA.b $20 : SEC : SBC.b #$10 : STA.w $0D00,Y + LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 16 pixels + LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link + LDA.b #$FF : STA.w $0B58,Y ; allows them to expire + BRA .done + + CMP.b #$B3 : BNE + ; Chicken + LDA.b #$0B : JSL Sprite_SpawnDynamically : BMI .done + LDA $22 : CLC : ADC.b #$03 : AND.b #$F8 : STA $0D10,Y + LDA $23 : ADC.b #$00 : STA $0D30,Y ; round X to nearest 8 + LDA.b $20 : SEC : SBC.b #$08 : STA.w $0D00,Y + LDA.b $21 : SBC.b #$00 : STA.w $0D20,Y ; move up 8 pixels + LDA.b $EE : STA.w $0F20,Y ; spawns on same layer as link + BRA .done + + CMP.b #$B4 : BNE .done ; Big Magic + LDA.b #$80 : STA MagicFiller ; fill magic + .done +RTS + + diff --git a/utilities.asm b/utilities.asm index 988fd5e..eb6b52e 100644 --- a/utilities.asm +++ b/utilities.asm @@ -154,7 +154,12 @@ RTL db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key db $2C ; Bee Trap - db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused + db $4A ; Apples + db $4A ; Fairy + db $4A ; Chicken + db $3B ; Big Magic + db $02 ; 5 Arrows + db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Unused @@ -284,7 +289,12 @@ RTL db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Big Key db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Small Key db $04 ; Bee Trap - db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused + db $08 ; Apples + db $08 ; Fairy + db $08 ; Chicken + db $08 ; Big Magic + db $04 ; 5 Arrows + db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused @@ -375,7 +385,7 @@ RTL db $15, $18, $24, $2A, $34, $35, $36, $42 db $43, $45, $59, $A0, $A1, $A2, $A3, $A4 db $A5, $A6, $A7, $A8, $A9, $AA, $AB, $AC - db $AD, $AE, $AF, $FF, $FF, $FF, $FF, $FF + db $AD, $AE, $AF, $B4, $FF, $FF, $FF, $FF } ;--------------------------------------------------------------------------------