diff --git a/keydrop/dynamic_si_vram.asm b/keydrop/dynamic_si_vram.asm index 775c156..1c1d8a8 100644 --- a/keydrop/dynamic_si_vram.asm +++ b/keydrop/dynamic_si_vram.asm @@ -54,6 +54,20 @@ RequestSlottedTile: ++ LDA.b #!DynamicDropGFXSlotCount_OW +++ INC : STA.w SprItemGFX,X JMP .success + + CMP.b #$B5 : BNE + ; if good bee, use bee OAM slot + LDA.b $1B : BEQ ++ + LDA.b #!DynamicDropGFXSlotCount_UW + BRA +++ + ++ LDA.b #!DynamicDropGFXSlotCount_OW + +++ INC : INC : STA.w SprItemGFX,X + JMP .success + + CMP.b #$B2 : BNE + ; if fairy, use fairy OAM slot + LDA.b $1B : BEQ ++ + LDA.b #!DynamicDropGFXSlotCount_UW + BRA +++ + ++ LDA.b #!DynamicDropGFXSlotCount_OW + +++ STA.w SprItemGFX,X + JMP .success + PHA : PHX @@ -202,6 +216,7 @@ DrawSlottedTile: PLA : SEC : RTL + PLA + STA.b $BD ; store loot ID temporarily, will get overwritten in Sprite_DrawMultiple_quantity_preset call JSL.l IsNarrowSprite : BCS .narrow ; TODO: Instead of loading the whole fixed 16 bytes from DynamicOAMTile**_** into !SPRITE_DYNAMIC_OAM @@ -254,6 +269,23 @@ DrawSlottedTile: STA.w !SPRITE_DYNAMIC_OAM : STA.w !SPRITE_DYNAMIC_OAM+8 .draw + ; special handling + LDY.b $BD : CPY.b #$B2 : BNE + ; fairy + LDA.b $1A : AND.w #$0020 : BEQ ++ ; alternate every 32 frames + LDA.w !SPRITE_DYNAMIC_OAM+4 : CLC : ADC.w #$02 ; use other fairy GFX + STA.w !SPRITE_DYNAMIC_OAM+4 + ++ LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames + LDA.w !SPRITE_DYNAMIC_OAM+2 : SEC : SBC.w #$02 ; move fairy up 2 pixels + STA.w !SPRITE_DYNAMIC_OAM+2 + + CPY.b #$B5 : BNE + ; good bee + LDA.b $1A : AND.w #$0020 : BEQ ++ ; alternate every 32 frames + LDA.w !SPRITE_DYNAMIC_OAM+12 : SEC : SBC.w #$10 ; use other fairy GFX + STA.w !SPRITE_DYNAMIC_OAM+12 + ++ LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ + ; alternate every 32 frames + LDA.w !SPRITE_DYNAMIC_OAM+10 : SEC : SBC.w #$02 ; move fairy up 2 pixels + STA.w !SPRITE_DYNAMIC_OAM+10 + + + LDA.w #!SPRITE_DYNAMIC_OAM : STA.b $08 SEP #$20 STZ.b $07 @@ -292,6 +324,9 @@ DynamicOAMTileUW_thin: dw 0, 0 : db $6B, $00, $20, $00 ; key dw 0, 8 : db $7B, $00, $20, $00 + dw 0, 0 : db $7C, $00, $20, $00 ; good bee + dw 0, 8 : db $F4, $00, $20, $00 + DynamicOAMTileUW_full: dw -4, -1 : db $40, $00, $20, $02 dd 0, 0 @@ -308,6 +343,11 @@ DynamicOAMTileUW_full: dw -4, -1 : db $EE, $00, $20, $02 dd 0, 0 + ; add new slots above this line + + dw -4, -1 : db $EA, $00, $20, $02 ; fairy + dd 0, 0 + DynamicOAMTileOW_thin: ; dw 0, 0 : db $40, $00, $20, $00 ; dw 0, 8 : db $50, $00, $20, $00 @@ -332,6 +372,9 @@ DynamicOAMTileOW_thin: dw 0, 0 : db $6B, $00, $20, $00 ; key dw 0, 8 : db $7B, $00, $20, $00 + dw 0, 0 : db $7C, $00, $20, $00 ; good bee + dw 0, 8 : db $F4, $00, $20, $00 + DynamicOAMTileOW_full: ; dw 0, 0 : db $40, $00, $20, $02 ; dd 0, 0 @@ -348,3 +391,8 @@ DynamicOAMTileOW_full: ;dw 0, 0 : db $EE, $00, $20, $02 ;dd 0, 0 + ; add new slots above this line + + dw 0, 0 : db $EA, $00, $20, $02 ; fairy + dd 0, 0 + diff --git a/shopkeeper.asm b/shopkeeper.asm index 843957e..84f514d 100644 --- a/shopkeeper.asm +++ b/shopkeeper.asm @@ -809,18 +809,53 @@ Shopkeeper_DrawNextItem: SEP #$20 ; set 8-bit accumulator PLY + STZ $0E ; $0E will be used temporarily to store a non-zero value if VRAM slot is in OAM1 PHX : LDA #0 : XBA : TXA : LSR #2 : TAX : LDA.l !SHOP_INVENTORY_DISGUISE, X : PLX : CMP #$0 : BNE ++ - LDA.l !SHOP_INVENTORY, X ; get item palette + LDA.l !SHOP_INVENTORY, X ++ - CMP.b #$2E : BNE + : BRA .potion - + CMP.b #$2F : BNE + : BRA .potion - + CMP.b #$30 : BEQ .potion - + CMP.b #$34 : BCC .normal : CMP.b #$36+1 : BCS .normal + CMP.b #$2E : BNE + : JMP .potion + + CMP.b #$2F : BNE + : JMP .potion + + CMP.b #$30 : BNE + : JMP .potion + + CMP.b #$B2 : BNE + : BRA .fairy + + CMP.b #$B5 : BNE + : BRA .goodbee + + CMP.b #$34 : BCC + : CMP.b #$36+1 : BCS + BRA .rupee + + .normal LDA.w .tile_indices, Y : BRA + ; get item gfx index .rupee LDA.b #$0B ; rupee is #$0B because it's already there in VRAM + STA.b $0E + BRA .vramLoc + .fairy + REP #$20 + LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ ++ ; alternate every 32 frames + LDA.l !SPRITE_OAM+2 : SEC : SBC.w #$02 ; move fairy up 2 pixels + STA.l !SPRITE_OAM+2 + ++ + SEP #$20 + LDA.b $1A : AND.b #$20 : BEQ ++ ; alternate every 32 frames + LDA.b #$EC ; use other fairy GFX + STA.b $0E + BRA .vramLoc + ++ + LDA.b #$EA ; fairy is #$EA/EC because it's already there in VRAM + STA.b $0E + BRA .vramLoc + .goodbee + REP #$20 + LDA.b $1A : SEC : SBC.w #$10 : AND.w #$0020 : BEQ ++ ; alternate every 32 frames + LDA.l !SPRITE_OAM+2 : SEC : SBC.w #$02 ; move bee up 2 pixels + STA.l !SPRITE_OAM+2 + ++ + SEP #$20 + LDA.b $1A : AND.b #$20 : BEQ ++ ; alternate every 32 frames + LDA.b #$D4 ; use other bee GFX + STA.b $0E + BRA .vramLoc + ++ + LDA.b #$E4 ; good bee is #$E4/D4 because it's already there in VRAM + STA.b $0E BRA .vramLoc .potion LDA.b #$C0 ; potion is #$C0 because it's already there in VRAM @@ -835,15 +870,13 @@ Shopkeeper_DrawNextItem: AND #$FE .vramLoc STA.l !SPRITE_OAM+4 - PHA - PHX : LDA #0 : XBA : TXA : LSR #2 : TAX : LDA.l !SHOP_INVENTORY_DISGUISE, X : PLX : CMP #$0 : BNE ++ - LDA.l !SHOP_INVENTORY, X ; get item palette - ++ - JSL.l GetSpritePalette : STA.l !SPRITE_OAM+5 + PHX : LDA #0 : XBA : TXA : LSR #2 : TAX : LDA.l !SHOP_INVENTORY_DISGUISE, X : PLX : CMP #$0 : BNE ++ + LDA.l !SHOP_INVENTORY, X ; get item palette + ++ + JSL.l GetSpritePalette : STA.l !SPRITE_OAM+5 - PLA - AND.b #$01 : BNE .oam1 ; special case for rupee item + LDA.b $0E : BNE .oam1 ; item uses VRAM in OAM1 LDA.w .tile_indices, Y : AND.b #$01 : BEQ ++ ; get tile index sheet .oam1 LDA.l !SPRITE_OAM+5 @@ -866,6 +899,10 @@ Shopkeeper_DrawNextItem: LDA.b #$00 STA.l !SPRITE_OAM+7 JSR.w PrepNarrowLower + LDA.b $0E : AND.b #$0F : CMP.b #$04 : BNE + + ; special exception for bee gfx, need top tile to be blank + LDA.b #$7C : STA.l !SPRITE_OAM+4 + + LDA.b #$02 ++ PHX : PHA : LDA !SCRATCH_TEMP_X : TAX : PLA : JSR.w RequestItemOAM : PLX diff --git a/utilities.asm b/utilities.asm index c1eaa80..2495987 100644 --- a/utilities.asm +++ b/utilities.asm @@ -295,7 +295,7 @@ RTL db $08 ; Fairy db $08 ; Chicken db $08 ; Big Magic - db $08 ; Good Bee + db $04 ; Good Bee 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 @@ -364,7 +364,7 @@ IsNarrowSprite: LDX.b #$00 ; set index counter to 0 ;---- - - CPX.b #$24 : !BGE .false ; finish if we've done the whole list + CPX.b #(.smallSprites_end-.smallSprites) : !BGE .false ; finish if we've done the whole list CMP.l .smallSprites, X : BNE + ; skip to next if we don't match ;-- SEC ; set true state @@ -387,7 +387,8 @@ 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, $B4, $FF, $FF, $FF, $FF + db $AD, $AE, $AF, $B4, $B5 + .smallSprites_end } ;--------------------------------------------------------------------------------