diff --git a/LTTP_RND_GeneralBugfixes.asm b/LTTP_RND_GeneralBugfixes.asm index 328c917..d1eb1bc 100644 --- a/LTTP_RND_GeneralBugfixes.asm +++ b/LTTP_RND_GeneralBugfixes.asm @@ -26,7 +26,7 @@ org $3FFFFF ; <- 1FFFFF db #$00 ; expand file to 2mb org $1FFFF8 ; <- FFFF8 timestamp rom -db #$20, #$18, #$02, #$15 ; year/month/day +db #$20, #$18, #$02, #$17 ; year/month/day ;================================================================================ diff --git a/shopkeeper.asm b/shopkeeper.asm index 3b276e1..c726214 100644 --- a/shopkeeper.asm +++ b/shopkeeper.asm @@ -345,33 +345,52 @@ Sprite_ShopKeeper: PLB RTL ;-------------------------------------------------------------------------------- -;-------------------------------------------------------------------------------- -Shopkeeper_DrawMerchant: - LDA.l !SHOP_MERCHANT : AND.b #$0F - BEQ Shopkeeper_DrawMerchant_Type0 - CMP.b #$01 : BEQ Shopkeeper_DrawMerchant_Type1 -Shopkeeper_DrawMerchant_Type0: - LDA.b #$02 : STA $06 ; request 2 OAM slots - LDA #$08 : JSL.l OAM_AllocateFromRegionA ; request 8 bytes - STZ $07 - LDA $1A : AND #$10 : BEQ + - LDA.b #.oam_shopkeeper_f1 : STA $08 - LDA.b #.oam_shopkeeper_f1>>8 : STA $09 - BRA ++ +macro DrawMerchant(head,body,speed) + PHX : LDX.b #$00 + LDA $1A : AND : BEQ + + - + LDA.w .oam_shopkeeper_f1, X : STA !BIGRAM, X : INX + CPX.b #$10 : !BLT - + - LDA.b #.oam_shopkeeper_f2 : STA $08 - LDA.b #.oam_shopkeeper_f2>>8 : STA $09 + - + LDA.w .oam_shopkeeper_f2, X : STA !BIGRAM, X : INX + CPX.b #$10 : !BLT - ++ - JSL.l Sprite_DrawMultiple_quantity_preset - LDA $90 : !ADD.b #$04*2 : STA $90 ; increment oam pointer - LDA $92 : INC #2 : STA $92 + PLX + + LDA !SHOP_MERCHANT : LSR #4 : AND.b #$0E : ORA !BIGRAM+5 : STA !BIGRAM+5 + LDA !SHOP_MERCHANT : LSR #4 : AND.b #$0E : ORA !BIGRAM+13 : STA !BIGRAM+13 + + PHB + LDA.b #$02 : STA $06 ; request 2 OAM slots + LDA #$08 : JSL.l OAM_AllocateFromRegionA ; request 8 bytes + STZ $07 + + LDA.b #!BIGRAM : STA $08 + LDA.b #!BIGRAM>>8 : STA $09 + LDA.b #$7E : PHA : PLB ; set data bank to $7E + JSL.l Sprite_DrawMultiple_quantity_preset + LDA $90 : !ADD.b #$04*2 : STA $90 ; increment oam pointer + LDA $92 : INC #2 : STA $92 + PLB RTS .oam_shopkeeper_f1 -dw 0, -8 : db $00, $0A, $00, $02 -dw 0, 0 : db $10, $0A, $00, $02 +dw 0, -8 : db , $00, $00, $02 +dw 0, 0 : db , $00, $00, $02 .oam_shopkeeper_f2 -dw 0, -8 : db $00, $0A, $00, $02 -dw 0, 0 : db $10, $4A, $00, $02 +dw 0, -8 : db , $00, $00, $02 +dw 0, 0 : db , $40, $00, $02 +endmacro +;-------------------------------------------------------------------------------- +Shopkeeper_DrawMerchant: + LDA.l !SHOP_MERCHANT : AND.b #$03 + BEQ Shopkeeper_DrawMerchant_Type0 + CMP.b #$01 : BNE + : BRL Shopkeeper_DrawMerchant_Type1 : + + CMP.b #$02 : BNE + : BRL Shopkeeper_DrawMerchant_Type2 : + + CMP.b #$03 : BNE + : BRL Shopkeeper_DrawMerchant_Type3 : + +;-------------------------------------------------------------------------------- +Shopkeeper_DrawMerchant_Type0: +%DrawMerchant(#$00, #$10, #$10) ;-------------------------------------------------------------------------------- Shopkeeper_DrawMerchant_Type1: LDA.b #$01 : STA $06 ; request 1 OAM slot @@ -394,6 +413,12 @@ dw 0, 0 : db $46, $0A, $00, $02 .oam_shopkeeper_f2 dw 0, 0 : db $46, $4A, $00, $02 ;-------------------------------------------------------------------------------- +Shopkeeper_DrawMerchant_Type2: +%DrawMerchant(#$84, #$10, #$40) +;-------------------------------------------------------------------------------- +Shopkeeper_DrawMerchant_Type3: +%DrawMerchant(#$8E, #$10, #$40) +;-------------------------------------------------------------------------------- Shopkeeper_SetupHitboxes: PHX : PHY : PHP LDY.b #$00 @@ -440,6 +465,7 @@ Shopkeeper_BuyItem: JSL.l Sprite_GetEmptyBottleIndex : BMI .full_bottles + + LDA !SHOP_TYPE : AND.b #$80 : BNE .buy ; don't charge if this is a take-any REP #$20 : LDA $7EF360 : CMP.l !SHOP_INVENTORY+1, X : SEP #$20 : !BGE .buy .cant_afford @@ -455,7 +481,9 @@ Shopkeeper_BuyItem: LDA.b #$3C : STA $012E ; error sound BRA .done .buy - REP #$20 : LDA $7EF360 : !SUB !SHOP_INVENTORY+1, X : STA $7EF360 : SEP #$20 ; Take price away + LDA !SHOP_TYPE : AND.b #$80 : BNE ++ ; don't charge if this is a take-any + REP #$20 : LDA $7EF360 : !SUB !SHOP_INVENTORY+1, X : STA $7EF360 : SEP #$20 ; Take price away + ++ LDA.l !SHOP_INVENTORY, X : TAY : JSL.l Link_ReceiveItem LDA.l !SHOP_INVENTORY+3, X : INC : STA.l !SHOP_INVENTORY+3, X @@ -484,11 +512,21 @@ db #$01, #$02, #$04 Setup_ShopItemCollisionHitbox: ;The complications with XBA are to handle the fact that nintendo likes to store ;high and low bytes of 16 bit postion values seperately :-( - ; load shopkeeper X (16 bit) - LDA $0D30, X : XBA : LDA $0D10, X - REP #$20 ; set 16-bit accumulator - !ADD.w Shopkeeper_DrawNextItem_item_offsets, Y + REP #$20 ; set 16-bit accumulator + LDA $00 : PHA + SEP #$20 ; set 8-bit accumulator + + ; load shopkeeper X (16 bit) + LDA $0D30, X : XBA : LDA $0D10, X + + REP #$20 ; set 16-bit accumulator + PHA : PHY + LDA !SHOP_TYPE : AND.w #$0003 : DEC : ASL : TAY + LDA.w Shopkeeper_DrawNextItem_item_offsets_idx, Y : STA $00 ; get table from the table table + PLY : PLA + + !ADD ($00), Y !ADD.w #$0002 ; a small negative margin ; TODO: add 4 for a narrow item SEP #$20 ; set 8-bit accumulator @@ -500,7 +538,9 @@ Setup_ShopItemCollisionHitbox: LDA $0D20, X : XBA : LDA $0D00, X REP #$20 ; set 16-bit accumulator - !ADD.w Shopkeeper_DrawNextItem_item_offsets+2, Y + PHY : INY #2 + !ADD ($00), Y + PLY PHA : LDA !SHOP_TYPE : AND.w #$0080 : BEQ + ; lower by 4 for Take-any PLA : !ADD.w #$0004 BRA ++ @@ -514,6 +554,10 @@ Setup_ShopItemCollisionHitbox: ; TODO: for narrow sprite store make width 4 (i.e. 8 pixels smaller) LDA.b #14 : STA $07 ; Hitbox height, always 14 + + REP #$20 ; set 16-bit accumulator + PLA : STA $00 + SEP #$20 ; set 8-bit acc RTS ;-------------------------------------------------------------------------------- ; Adjusts the already set up collision hitbox to be a suitable interaction hitbox @@ -586,13 +630,17 @@ Shopkeeper_DrawNextItem: LDA.l !SHOP_STATE : AND.w Shopkeeper_ItemMasks, Y : BEQ + : BRL .next : + PHY - TYA : ASL #2 : TAY + + LDA !SHOP_TYPE : AND.b #$03 : DEC : ASL : TAY REP #$20 ; set 16-bit accumulator - LDA.w .item_offsets, Y : STA.l !SPRITE_OAM + LDA.w .item_offsets_idx, Y : STA $00 ; get table from the table table + LDA 1,s : ASL #2 : TAY ; set Y to the item index + LDA ($00), Y : STA.l !SPRITE_OAM ; load X-coordinate + INY #2 LDA !SHOP_TYPE : AND.w #$0080 : BNE + - LDA.w .item_offsets+2, Y : STA.l !SPRITE_OAM+2 : BRA ++ + LDA ($00), Y : STA.l !SPRITE_OAM+2 : BRA ++ ; load Y-coordinate + - LDA.w .item_offsets+2, Y : !ADD.w #$0004 : STA.l !SPRITE_OAM+2 + LDA ($00), Y : !ADD.w #$0004 : STA.l !SPRITE_OAM+2 ; load Y-coordinate ++ SEP #$20 ; set 8-bit accumulator PLY @@ -637,7 +685,16 @@ Shopkeeper_DrawNextItem: INX #4 RTS ;-------------------------------------------------------------------------------- -.item_offsets +.item_offsets_idx +dw #.item_offsets_1 +dw #.item_offsets_2 +dw #.item_offsets_3 +.item_offsets_1 +dw 8, 40 +.item_offsets_2 +dw -16, 40 +dw 32, 40 +.item_offsets_3 dw -40, 40 dw 8, 40 dw 56, 40 @@ -652,9 +709,15 @@ Shopkeeper_DrawNextPrice: REP #$20 ; set 16-bit accumulator PHY - TYA : ASL : TAY - LDA.w .price_columns, Y : STA !COLUMN_LOW - LDA.w .price_offsets, Y : STA $0E ; set coordinate + LDA !SHOP_TYPE : AND.w #$0003 : DEC : ASL : TAY + LDA.w Shopkeeper_DrawNextItem_item_offsets_idx, Y : STA $00 ; get table from the table table + LDA.w .price_columns_idx, Y : STA $02 ; get table from the table table + PLY : PHY + TYA : ASL #2 : TAY + LDA ($00), Y : STA $0E ; set coordinate + TYA : LSR : TAY + LDA ($02), Y : STA !COLUMN_LOW + INY : LDA ($02), Y : STA !COLUMN_HIGH PLY LDA.l !SHOP_INVENTORY+1, X : STA $0C ; set value JSR.w DrawPrice @@ -672,11 +735,17 @@ Shopkeeper_DrawNextPrice: !ADD $92 : STA $92 PLP : PLY : PLX PLB -RTS -.price_columns +RTS +.price_columns_idx +dw #.price_columns_1 +dw #.price_columns_2 +dw #.price_columns_3 +.price_columns_1 +db #$00, #$FF +.price_columns_2 +db #$00, #$80, #$80, $FF +.price_columns_3 db #$00, #$60, #$60, #$90, #$90, $FF -.price_offsets -dw #-40, #8, #56 ;-------------------------------------------------------------------------------- RequestItemOAM: PHX : PHY : PHA diff --git a/tables.asm b/tables.asm index e134b23..da5be16 100644 --- a/tables.asm +++ b/tables.asm @@ -1427,22 +1427,22 @@ db $FF, $FF, $FF, $FF ; d - 0=Check Door - 1=Skip Door Check ; qq - # of items for sale -;shopkeeper_config - -ppp --ss +;shopkeeper_config - ppp- --ss ; ppp - palette ; ss - sprite type org $30C800 ; PC 0x184800 - 0x18487F - max 16 shops ShopTable: ;db [id][roomID-low][roomID-high][doorID][zero][shop_config][shopkeeper_config][sram_index] db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF -db $01, $0F, $01, $57, $00, $03, $51, $00 -db $02, $0F, $01, $60, $00, $03, $51, $03 -db $FF, $12, $01, $58, $00, $03, $50, $06 -db $02, $0F, $01, $57, $00, $03, $50, $09 -db $03, $0F, $01, $60, $00, $03, $50, $0c -db $04, $0F, $01, $6F, $00, $03, $50, $0f -db $05, $FF, $00, $00, $00, $03, $50, $12 -db $06, $1F, $01, $46, $00, $03, $50, $15 -db $FF, $12, $01, $58, $00, $03, $50, $18 +db $01, $0F, $01, $57, $00, $03, $C1, $00 +db $02, $0F, $01, $60, $00, $03, $C1, $03 +db $FF, $12, $01, $58, $00, $02, $E3, $06 +db $02, $0F, $01, $57, $00, $03, $A0, $09 +db $03, $0F, $01, $60, $00, $03, $A0, $0c +db $04, $0F, $01, $6F, $00, $03, $A0, $0f +db $05, $FF, $00, $00, $00, $03, $A0, $12 +db $06, $1F, $01, $46, $00, $03, $A0, $15 +db $FF, $12, $01, $58, $00, $03, $A0, $18 org $30C880 ; PC 0x184880 - 0x184FFF - max 240 entries ShopContentsTable: ;db [id][item][price-low][price-high][max][repl_id][repl_price-low][repl_price-high] @@ -1453,7 +1453,7 @@ db $02, $2E, $96, $00, $00, $FF, $00, $00 db $02, $AF, $50, $00, $00, $FF, $00, $00 db $02, $31, $32, $00, $00, $FF, $00, $00 db $FF, $2E, $96, $00, $00, $FF, $00, $00 -db $FF, $AF, $50, $00, $00, $FF, $00, $00 +db $FF, $30, $2C, $01, $00, $FF, $00, $00 db $FF, $31, $32, $00, $00, $FF, $00, $00 db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF ;================================================================================