Merge branch 'main' into kara
This commit is contained in:
750
utilities.asm
750
utilities.asm
@@ -6,156 +6,25 @@
|
||||
; out: A - Sprite GFX ID
|
||||
;--------------------------------------------------------------------------------
|
||||
GetSpriteID:
|
||||
JSR AttemptItemSubstitution
|
||||
CMP.b #$16 : BEQ .bottle ; Bottle
|
||||
CMP.b #$2B : BEQ .bottle ; Red Potion w/bottle
|
||||
CMP.b #$2C : BEQ .bottle ; Green Potion w/bottle
|
||||
CMP.b #$2D : BEQ .bottle ; Blue Potion w/bottle
|
||||
CMP.b #$3C : BEQ .bottle ; Bee w/bottle
|
||||
CMP.b #$3D : BEQ .bottle ; Fairy w/bottle
|
||||
CMP.b #$48 : BEQ .bottle ; Gold Bee w/bottle
|
||||
JSL.l AttemptItemSubstitution
|
||||
JSR.w ResolveLootID
|
||||
CMP.b #$6D : BEQ .server_F0 ; Server Request F0
|
||||
CMP.b #$6E : BEQ .server_F1 ; Server Request F1
|
||||
CMP.b #$6F : BEQ .server_F2 ; Server Request F2
|
||||
BRA .normal
|
||||
.bottle
|
||||
PHA : JSR.w CountBottles : CMP.l BottleLimit : !BLT +
|
||||
PLA : LDA.l BottleLimitReplacement
|
||||
JMP GetSpriteID
|
||||
+
|
||||
PLA : BRA .normal
|
||||
.server_F0
|
||||
JSL.l ItemVisualServiceRequest_F0
|
||||
BRA .normal
|
||||
JSL.l ItemVisualServiceRequest_F0
|
||||
BRA .normal
|
||||
.server_F1
|
||||
JSL.l ItemVisualServiceRequest_F1
|
||||
BRA .normal
|
||||
JSL.l ItemVisualServiceRequest_F1
|
||||
BRA .normal
|
||||
.server_F2
|
||||
JSL.l ItemVisualServiceRequest_F2
|
||||
JSL.l ItemVisualServiceRequest_F2
|
||||
.normal
|
||||
|
||||
PHX
|
||||
PHB : PHK : PLB
|
||||
;--------
|
||||
TAX : LDA.l .gfxSlots, X ; look up item gfx
|
||||
PLB : PLX
|
||||
CMP.b #$F8 : !BGE .specialHandling
|
||||
TAX : LDA.l ItemReceipts_graphics, X ; look up item gfx
|
||||
PLX
|
||||
RTL
|
||||
.specialHandling
|
||||
CMP.b #$F9 : BNE ++ ; Progressive Magic
|
||||
LDA.l MagicConsumption : BNE +++
|
||||
LDA.b #$3B : RTL ; Half Magic
|
||||
+++
|
||||
LDA.b #$3C : RTL ; Quarter Magic
|
||||
++ CMP.b #$FA : BNE ++ ; RNG Item (Single)
|
||||
JSL.l GetRNGItemSingle : JMP GetSpriteID
|
||||
++ CMP.b #$FB : BNE ++ ; RNG Item (Multi)
|
||||
JSL.l GetRNGItemMulti : JMP GetSpriteID
|
||||
++ CMP.b #$FD : BNE ++ ; Progressive Armor
|
||||
LDA.l ArmorEquipment : CMP.l ProgressiveArmorLimit : !BLT + ; Progressive Armor Limit
|
||||
LDA.l ProgressiveArmorReplacement
|
||||
JMP GetSpriteID
|
||||
+
|
||||
LDA.b #$04 : RTL
|
||||
++ CMP.b #$FE : BNE ++ ; Progressive Sword
|
||||
LDA.l HighestSword
|
||||
CMP.l ProgressiveSwordLimit : !BLT + ; Progressive Sword Limit
|
||||
LDA.l ProgressiveSwordReplacement
|
||||
JMP GetSpriteID
|
||||
+ : CMP.b #$00 : BNE + ; No Sword
|
||||
LDA.b #$43 : RTL
|
||||
+ : CMP.b #$01 : BNE + ; Fighter Sword
|
||||
LDA.b #$44 : RTL
|
||||
+ : CMP.b #$02 : BNE + ; Master Sword
|
||||
LDA.b #$45 : RTL
|
||||
+ ; CMP.b #$03 : BNE + ; Tempered Sword
|
||||
LDA.b #$46 : RTL
|
||||
+
|
||||
++ : CMP.b #$FF : BNE ++ ; Progressive Shield
|
||||
LDA.l HighestShield
|
||||
CMP.l ProgressiveShieldLimit : !BLT + ; Progressive Shield Limit
|
||||
LDA.l ProgressiveShieldReplacement
|
||||
JMP GetSpriteID
|
||||
+ : CMP.b #$00 : BNE + ; No Shield
|
||||
LDA.b #$2D : RTL
|
||||
+ : CMP.b #$01 : BNE + ; Fighter Shield
|
||||
LDA.b #$20 : RTL
|
||||
+ ; Everything Else
|
||||
LDA.b #$2E : RTL
|
||||
++ : CMP.b #$F8 : BNE ++ ; Progressive Bow
|
||||
LDA.l BowEquipment : INC : LSR
|
||||
CMP.l ProgressiveBowLimit : !BLT +
|
||||
LDA.l ProgressiveBowReplacement
|
||||
JMP GetSpriteID
|
||||
+ : CMP.b #$00 : BNE + ; No Bow
|
||||
LDA.b #$29 : RTL
|
||||
+ ; Any Bow
|
||||
LDA.b #$2A : RTL
|
||||
++
|
||||
RTL
|
||||
|
||||
;DATA - Loot Identifier to Sprite ID
|
||||
{
|
||||
.gfxSlots
|
||||
db $06, $44, $45, $46, $2D, $20, $2E, $09
|
||||
db $09, $0A, $08, $05, $10, $0B, $2C, $1B
|
||||
|
||||
db $1A, $1C, $14, $19, $0C, $07, $1D, $2F
|
||||
db $07, $15, $12, $0D, $0D, $0E, $11, $17
|
||||
|
||||
db $28, $27, $04, $04, $0F, $16, $03, $13
|
||||
db $01, $1E, $10, $00, $00, $00, $00, $00
|
||||
|
||||
db $00, $30, $22, $21, $24, $24, $24, $23
|
||||
db $23, $23, $29, $2A, $2C, $2B, $03, $03
|
||||
|
||||
db $34, $35, $31, $33, $02, $32, $36, $37
|
||||
db $2C, $43, $0C, $38, $39, $3A, $F9, $3C
|
||||
; db $2C, $06, $0C, $38, $FF, $FF, $FF, $FF
|
||||
|
||||
;5x
|
||||
db $44 ; Safe Master Sword
|
||||
db $3D, $3E, $3F, $40 ; Bomb & Arrow +5/+10
|
||||
db $2C, $00, $00 ; 3x Programmable Item
|
||||
db $41 ; Upgrade-Only Silver Arrows
|
||||
db $24 ; 1 Rupoor
|
||||
db $47 ; Null Item
|
||||
db $48, $48, $48 ; Red, Blue & Green Clocks
|
||||
db $FE, $FF ; Progressive Sword & Shield
|
||||
|
||||
;6x
|
||||
db $FD, $0D ; Progressive Armor & Gloves
|
||||
db $FA, $FB ; RNG Single & Multi
|
||||
db $F8, $F8 ; Progressive Bow x2
|
||||
db $FF, $FF, $FF, $FF ; Unused
|
||||
db $49, $4A, $49 ; Goal Item Single, Multi & Alt Multi
|
||||
db $39, $39, $39 ; Server Request F0, F1, F2
|
||||
|
||||
;7x
|
||||
db $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21, $21 ; Free Map
|
||||
|
||||
;8x
|
||||
db $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16, $16 ; Free Compass
|
||||
|
||||
;9x
|
||||
db $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22, $22 ; Free Big Key
|
||||
|
||||
;Ax
|
||||
db $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F, $0F ; Free Small Key
|
||||
|
||||
;Bx
|
||||
db $49 ; reserved for bee traps
|
||||
db $13, $13, $13, $13, $13 ; reserved for bonk shuffle
|
||||
db $13 ; Bomb Upgrade
|
||||
db $07 ; Cane Upgrade
|
||||
db $27 ; Bug Net Upgrade
|
||||
db $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
|
||||
db $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49, $49 ; Reserved
|
||||
}
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; GetSpritePalette
|
||||
@@ -163,281 +32,70 @@ RTL
|
||||
; out: A - Palette
|
||||
;--------------------------------------------------------------------------------
|
||||
GetSpritePalette:
|
||||
JSR AttemptItemSubstitution
|
||||
CMP.b #$16 : BEQ .bottle ; Bottle
|
||||
CMP.b #$2B : BEQ .bottle ; Red Potion w/bottle
|
||||
CMP.b #$2C : BEQ .bottle ; Green Potion w/bottle
|
||||
CMP.b #$2D : BEQ .bottle ; Blue Potion w/bottle
|
||||
CMP.b #$3C : BEQ .bottle ; Bee w/bottle
|
||||
CMP.b #$3D : BEQ .bottle ; Fairy w/bottle
|
||||
CMP.b #$48 : BEQ .bottle ; Gold Bee w/bottle
|
||||
BRA .notBottle
|
||||
.bottle
|
||||
PHA : JSR.w CountBottles : CMP.l BottleLimit : !BLT +
|
||||
PLA : LDA.l BottleLimitReplacement
|
||||
JMP GetSpritePalette
|
||||
+
|
||||
PLA : .notBottle
|
||||
PHX
|
||||
PHB : PHK : PLB
|
||||
;--------
|
||||
TAX : LDA.l GfxPalettes, X ; look up item gfx
|
||||
PLB : PLX
|
||||
CMP.b #$F6 : !BGE .specialHandling
|
||||
JSL.l AttemptItemSubstitution
|
||||
JSR.w ResolveLootID
|
||||
.resolved
|
||||
TAX
|
||||
LDA.l SpriteProperties_standing_palette, X : BIT #$80 : BNE .load_palette
|
||||
ASL
|
||||
RTL
|
||||
.specialHandling
|
||||
CMP.b #$FD : BNE ++ ; Progressive Sword
|
||||
LDA.l HighestSword
|
||||
CMP.l ProgressiveSwordLimit : !BLT + ; Progressive Sword Limit
|
||||
LDA.l ProgressiveSwordReplacement
|
||||
JMP GetSpritePalette
|
||||
+ : CMP.b #$00 : BNE + ; No Sword
|
||||
LDA.b #$04 : RTL
|
||||
+ : CMP.b #$01 : BNE + ; Fighter Sword
|
||||
LDA.b #$04 : RTL
|
||||
+ : CMP.b #$02 : BNE + ; Master Sword
|
||||
LDA.b #$02 : RTL
|
||||
+ ; Everything Else
|
||||
LDA.b #$08 : RTL
|
||||
++ : CMP.b #$FE : BNE ++ ; Progressive Shield
|
||||
LDA.l HighestShield
|
||||
CMP.l ProgressiveShieldLimit : !BLT + ; Progressive Shield Limit
|
||||
LDA.l ProgressiveShieldReplacement
|
||||
JMP GetSpritePalette
|
||||
+ : CMP.b #$00 : BNE + ; No Shield
|
||||
LDA.b #$04 : RTL
|
||||
+ : CMP.b #$01 : BNE + ; Fighter Shield
|
||||
LDA.b #$02 : RTL
|
||||
+ ; Everything Else
|
||||
LDA.b #$08 : RTL
|
||||
++ : CMP.b #$FF : BNE ++ ; Progressive Armor
|
||||
LDA.l HighestMail
|
||||
CMP.l ProgressiveArmorLimit : !BLT + ; Progressive Armor Limit
|
||||
LDA.l ProgressiveArmorReplacement
|
||||
JMP GetSpritePalette
|
||||
+ : CMP.b #$00 : BNE + ; Green Tunic
|
||||
LDA.b #$04 : RTL
|
||||
+ ; Everything Else
|
||||
LDA.b #$02 : RTL
|
||||
++ : CMP.b #$FC : BNE ++ ; Progressive Gloves
|
||||
LDA.l GloveEquipment : BNE + ; No Gloves
|
||||
LDA.b #$02 : RTL
|
||||
+ ; Everything Else
|
||||
LDA.b #$08 : RTL
|
||||
++ : CMP.b #$F8 : BNE ++ ; Progressive Bow
|
||||
LDA.l BowEquipment : INC : LSR
|
||||
CMP.l ProgressiveBowLimit : !BLT +
|
||||
LDA.l ProgressiveBowReplacement
|
||||
JMP GetSpritePalette
|
||||
+ : CMP.b #$00 : BNE + ; No Bow
|
||||
LDA.b #$08 : RTL
|
||||
+ ; Any Bow
|
||||
LDA.b #$02 : RTL
|
||||
++ : CMP.b #$F7 : BNE ++ ; Progressive Bombs
|
||||
LDA SpecialWeaponLevel
|
||||
CMP.b #$00 : BNE + ; No Bombs
|
||||
LDA.b #$08 : RTL
|
||||
+ : CMP.b #$01 : BNE + ; L1 Bombs
|
||||
LDA.b #$04 : RTL
|
||||
+ : CMP.b #$02 : BNE + ; L2 Bombs
|
||||
LDA.b #$02 : RTL
|
||||
+ ; Everything Else
|
||||
LDA.b #$0A : RTL
|
||||
++ : CMP.b #$FA : BNE ++ ; RNG Item (Single)
|
||||
JSL.l GetRNGItemSingle : JMP GetSpritePalette
|
||||
++ : CMP.b #$FB : BNE ++ ; RNG Item (Multi)
|
||||
JSL.l GetRNGItemMulti : JMP GetSpritePalette
|
||||
++
|
||||
.load_palette
|
||||
JSL.l LoadItemPalette
|
||||
ASL
|
||||
RTL
|
||||
|
||||
;DATA - Loot Identifier to Sprite Palette
|
||||
{
|
||||
GfxPalettes:
|
||||
db $00, $04, $02, $08, $04, $02, $08, $02
|
||||
db $04, $02, $02, $02, $04, $04, $04, $08
|
||||
|
||||
db $08, $08, $02, $02, $04, $02, $02, $02
|
||||
db $04, $02, $04, $02, $08, $08, $04, $02
|
||||
|
||||
db $0A, $02, $04, $02, $04, $04, $00, $04
|
||||
db $04, $08, $02, $02, $08, $04, $02, $08
|
||||
|
||||
db $04, $04, $08, $08, $08, $04, $02, $08
|
||||
db $02, $04, $08, $02, $04, $04, $02, $02
|
||||
|
||||
db $08, $08, $02, $04, $04, $08, $08, $08
|
||||
db $04, $04, $04, $02, $08, $08, $08, $08
|
||||
; db $04, $0A, $04, $02, $FF, $FF, $FF, $FF
|
||||
|
||||
db $04 ; Safe Master Sword
|
||||
db $08, $08, $08, $08 ; Bomb & Arrow +5/+10
|
||||
db $04, $00, $00 ; Programmable Items 1-3
|
||||
db $02 ; Upgrade-Only Silver Arrows
|
||||
db $06 ; 1 Rupoor
|
||||
db $02 ; Null Item
|
||||
db $02, $04, $08 ; Red, Blue & Green Clocks
|
||||
db $FD, $FE, $FF, $FC ; Progressive Sword, Shield, Armor & Gloves
|
||||
db $FA, $FB ; RNG Single & Multi
|
||||
db $F8, $F8 ; Progressive Bow
|
||||
db $00, $00, $00, $00 ; Unused
|
||||
db $08, $08, $08 ; Goal Item Single, Multi & Alt Multi
|
||||
db $04, $04, $04 ; Server Request F0, F1, F2
|
||||
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Free Map
|
||||
db $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04, $04 ; Free Compass
|
||||
;db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; *EVENT*
|
||||
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 $08 ; reserved for bee traps
|
||||
db $08, $08, $08, $08, $08 ; reserved for bonk shuffle
|
||||
db $F7 ; Bomb Upgrade
|
||||
db $0A ; Cane Upgrade
|
||||
db $02 ; Bug Net Upgrade
|
||||
db $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
|
||||
db $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08, $08 ; Unused
|
||||
}
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; IsNarrowSprite
|
||||
; in: A - Loot ID
|
||||
; out: Carry - 0 = Full, 1 = Narrow
|
||||
;--------------------------------------------------------------------------------
|
||||
IsNarrowSprite:
|
||||
PHA : PHX
|
||||
PHB : PHK : PLB
|
||||
JSR AttemptItemSubstitution
|
||||
;--------
|
||||
CMP.b #$16 : BEQ .bottle ; Bottle
|
||||
CMP.b #$2B : BEQ .bottle ; Red Potion w/bottle
|
||||
CMP.b #$2C : BEQ .bottle ; Green Potion w/bottle
|
||||
CMP.b #$2D : BEQ .bottle ; Blue Potion w/bottle
|
||||
CMP.b #$3C : BEQ .bottle ; Bee w/bottle
|
||||
CMP.b #$3D : BEQ .bottle ; Fairy w/bottle
|
||||
CMP.b #$48 : BEQ .bottle ; Gold Bee w/bottle
|
||||
BRA .notBottle
|
||||
.bottle
|
||||
JSR.w CountBottles : CMP.l BottleLimit : !BLT +
|
||||
LDA.l BottleLimitReplacement
|
||||
JSL.l IsNarrowSprite
|
||||
JMP .done
|
||||
+ : JMP .continue
|
||||
.notBottle
|
||||
CMP.b #$5E : BNE ++ ; Progressive Sword
|
||||
LDA.l HighestSword : CMP.l ProgressiveSwordLimit : !BLT + ; Progressive Sword Limit
|
||||
LDA.l ProgressiveSwordReplacement
|
||||
JSL.l IsNarrowSprite
|
||||
JMP .done
|
||||
+ : JMP .continue
|
||||
++ CMP.b #$5F : BNE ++ ; Progressive Shield
|
||||
LDA.l HighestShield : BNE + : JMP .done ; No Shield
|
||||
+ : CMP.l ProgressiveShieldLimit : !BLT .continue
|
||||
LDA.l ProgressiveShieldReplacement
|
||||
JSL.l IsNarrowSprite
|
||||
JMP .done
|
||||
++ CMP.b #$60 : BNE ++ ; Progressive Armor
|
||||
LDA.l HighestMail : CMP.l ProgressiveArmorLimit : !BLT .continue
|
||||
LDA.l ProgressiveArmorReplacement
|
||||
JSL.l IsNarrowSprite
|
||||
JMP .done
|
||||
+
|
||||
++ CMP.b #$62 : BNE ++ ; RNG Item (Single)
|
||||
JSL.l GetRNGItemSingle : JMP .continue
|
||||
++ CMP.b #$63 : BNE ++ ; RNG Item (Multi)
|
||||
JSL.l GetRNGItemMulti
|
||||
++ CMP.b #$64 : BEQ + ; Progressive Bow
|
||||
CMP.b #$65 : BNE .continue ; Progressive Bow (alt)
|
||||
+ : LDA.l BowEquipment : INC : LSR
|
||||
CMP.l ProgressiveBowLimit : !BLT +
|
||||
LDA.l ProgressiveBowReplacement
|
||||
JSL.l IsNarrowSprite
|
||||
JMP .done
|
||||
.continue
|
||||
;--------
|
||||
|
||||
LDX.b #$00 ; set index counter to 0
|
||||
;----
|
||||
-
|
||||
CPX.b #$2A : !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
|
||||
BRA .done ; we're done
|
||||
;--
|
||||
+
|
||||
INX ; increment index
|
||||
BRA - ; go back to beginning of loop
|
||||
;----
|
||||
.false
|
||||
CLC
|
||||
.done
|
||||
PLB : PLX : PLA
|
||||
RTL
|
||||
|
||||
;DATA - Half-Size Sprite Markers
|
||||
{
|
||||
.smallSprites
|
||||
db $04, $07, $08, $09, $0A, $0B, $0C, $13
|
||||
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, $B7, $FF, $FF, $FF, $FF
|
||||
db $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF
|
||||
}
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; PrepDynamicTile
|
||||
; in: A - Loot ID
|
||||
; in: SpriteID,X - Loot ID
|
||||
;-------------------------------------------------------------------------------- 20/8477
|
||||
PrepDynamicTile:
|
||||
PHA : PHX : PHY
|
||||
PHX : PHY : PHB
|
||||
JSR.w ResolveLootID
|
||||
-
|
||||
JSR.w LoadDynamicTileOAMTable
|
||||
JSL.l GetSpriteID ; convert loot id to sprite id
|
||||
JSL.l GetAnimatedSpriteTile_variable
|
||||
PLY : PLX : PLA
|
||||
JSL TransferItemReceiptToBuffer_using_ReceiptID
|
||||
SEP #$30
|
||||
PLB : PLY : PLX
|
||||
RTL
|
||||
.loot_resolved
|
||||
PHX : PHY : PHB
|
||||
BRA -
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; LoadDynamicTileOAMTable
|
||||
; in: A - Loot ID
|
||||
; in: SpriteID,X - Loot ID
|
||||
; out: A - Loot ID
|
||||
;-------------------------------------------------------------------------------- 20/847B
|
||||
LoadDynamicTileOAMTable:
|
||||
PHA : PHP
|
||||
|
||||
PHA
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA.w #$0000 : STA.l SpriteOAM
|
||||
STA.l SpriteOAM+2
|
||||
LDA.w #$0200 : STA.l SpriteOAM+6
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDA.b #$24 : STA.l SpriteOAM+4
|
||||
|
||||
LDA.b $01,s
|
||||
|
||||
JSL.l GetSpritePalette
|
||||
STA.l SpriteOAM+5 : STA.l SpriteOAM+13
|
||||
PLA
|
||||
JSL.l IsNarrowSprite : BCS .narrow
|
||||
PHP
|
||||
REP #$20
|
||||
LDA.w #$0000 : STA.l SpriteOAM : STA.l SpriteOAM+2
|
||||
LDA.w #$0200 : STA.l SpriteOAM+6
|
||||
SEP #$20
|
||||
LDA.b #$24 : STA.l SpriteOAM+4
|
||||
|
||||
LDA.w SpriteID,X
|
||||
JSL.l GetSpritePalette_resolved
|
||||
STA.l SpriteOAM+5 : STA.l SpriteOAM+13
|
||||
PHX
|
||||
LDA.l SpriteProperties_standing_width,X : BEQ .narrow
|
||||
BRA .done
|
||||
|
||||
.narrow
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
LDA.w #$0000 : STA.l SpriteOAM+7
|
||||
STA.l SpriteOAM+14
|
||||
REP #$20
|
||||
LDA.w #$0400 : STA.l SpriteOAM+7 : STA.l SpriteOAM+14
|
||||
LDA.w #$0000 : STA.l SpriteOAM+14
|
||||
LDA.w #$0800 : STA.l SpriteOAM+9
|
||||
LDA.w #$3400 : STA.l SpriteOAM+11
|
||||
|
||||
.done
|
||||
PLP : PLA
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
SEP #$20
|
||||
LDA.b #$04 : STA.l SpriteOAM
|
||||
|
||||
.done
|
||||
TXA
|
||||
PLX
|
||||
PLP
|
||||
RTS
|
||||
;--------------------------------------------------------------------------------
|
||||
; DrawDynamicTile
|
||||
; in: A - Loot ID
|
||||
@@ -446,15 +104,19 @@ RTS
|
||||
; This wastes two OAM slots if you don't want a shadow - fix later - I wrote "fix later" over a year ago and it's still not fixed (Aug 6, 2017) - lol (May 25th, 2019)
|
||||
;-------------------------------------------------------------------------------- 2084B8
|
||||
DrawDynamicTile:
|
||||
JSL.l IsNarrowSprite : BCS .narrow
|
||||
PHX
|
||||
TAX
|
||||
LDA.l SpriteProperties_standing_width,X : BEQ .narrow
|
||||
|
||||
.full
|
||||
PLX
|
||||
LDA.b #$01 : STA.b Scrap06
|
||||
LDA.b #$0C : JSL.l OAM_AllocateFromRegionC
|
||||
LDA.b #$02 : PHA
|
||||
BRA .draw
|
||||
|
||||
.narrow
|
||||
PLX
|
||||
LDA.b #$02 : STA.b Scrap06
|
||||
LDA.b #$10 : JSL.l OAM_AllocateFromRegionC
|
||||
LDA.b #$03 : PHA
|
||||
@@ -464,9 +126,9 @@ DrawDynamicTile:
|
||||
LDA.b #SpriteOAM>>8 : STA.b Scrap09
|
||||
STZ.b Scrap07
|
||||
LDA.b #$7E : PHB : PHA : PLB
|
||||
LDA.b #$01 : STA.l SpriteSkipEOR
|
||||
JSL Sprite_DrawMultiple_quantity_preset
|
||||
LDA.b #$00 : STA.l SpriteSkipEOR
|
||||
LDA.b #$01 : STA.l SpriteSkipEOR
|
||||
JSL Sprite_DrawMultiple_quantity_preset
|
||||
LDA.b #$00 : STA.l SpriteSkipEOR
|
||||
PLB
|
||||
|
||||
LDA.b OAMPtr : !ADD.b #$08 : STA.b OAMPtr ; leave the pointer in the right spot to draw the shadow, if desired
|
||||
@@ -475,14 +137,18 @@ DrawDynamicTile:
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
DrawDynamicTileNoShadow:
|
||||
JSL.l IsNarrowSprite : BCS .narrow
|
||||
PHX
|
||||
TAX
|
||||
LDA.l SpriteProperties_standing_width,X : BEQ .narrow
|
||||
|
||||
.full
|
||||
PLX
|
||||
LDA.b #$01 : STA.b Scrap06
|
||||
LDA.b #$04 : JSL.l OAM_AllocateFromRegionC
|
||||
BRA .draw
|
||||
|
||||
.narrow
|
||||
PLX
|
||||
LDA.b #$02 : STA.b Scrap06
|
||||
LDA.b #$08 : JSL.l OAM_AllocateFromRegionC
|
||||
|
||||
@@ -491,9 +157,9 @@ DrawDynamicTileNoShadow:
|
||||
LDA.b #SpriteOAM>>8 : STA.b Scrap09
|
||||
STZ.b Scrap07
|
||||
LDA.b #$7E : PHB : PHA : PLB
|
||||
LDA.b #$01 : STA.l SpriteSkipEOR
|
||||
JSL Sprite_DrawMultiple_quantity_preset
|
||||
LDA.l Bob : BNE + : LDA.b #$00 : STA.l SpriteSkipEOR : + ; Bob fix is conditional
|
||||
LDA.b #$01 : STA.l SpriteSkipEOR
|
||||
JSL Sprite_DrawMultiple_quantity_preset
|
||||
LDA.l Bob : BNE + : LDA.b #$00 : STA.l SpriteSkipEOR : + ; Bob fix is conditional
|
||||
PLB
|
||||
|
||||
LDA.b OAMPtr : !ADD.b #$08 : STA.b OAMPtr
|
||||
@@ -523,13 +189,13 @@ RTL
|
||||
; out: Carry - 1 = On Screen, 0 = Off Screen
|
||||
;--------------------------------------------------------------------------------
|
||||
Sprite_IsOnscreen:
|
||||
JSR _Sprite_IsOnscreen_DoWork
|
||||
JSR .check_sprite
|
||||
BCS +
|
||||
REP #$20
|
||||
LDA.b BG2H : PHA : !SUB.w #$0F : STA.b BG2H
|
||||
LDA.b BG2V : PHA : !SUB.w #$0F : STA.b BG2V
|
||||
SEP #$20
|
||||
JSR _Sprite_IsOnscreen_DoWork
|
||||
JSR .check_sprite
|
||||
REP #$20
|
||||
PLA : STA.b BG2V
|
||||
PLA : STA.b BG2H
|
||||
@@ -537,7 +203,7 @@ Sprite_IsOnscreen:
|
||||
+
|
||||
RTL
|
||||
|
||||
_Sprite_IsOnscreen_DoWork:
|
||||
.check_sprite
|
||||
LDA.w SpritePosXLow, X : CMP.b BG2H
|
||||
LDA.w SpritePosXHigh, X : SBC.b BG2H+1 : BNE .offscreen
|
||||
|
||||
@@ -580,106 +246,10 @@ RTL
|
||||
SkipDrawEOR:
|
||||
LDA.l SpriteSkipEOR : BEQ .normal
|
||||
LDA.w #$0000 : STA.l SpriteSkipEOR
|
||||
LDA.w Scrap04 : AND.w #$F0FF : STA.w Scrap04
|
||||
LDA.w #$0F00 : TRB.b Scrap04
|
||||
.normal
|
||||
LDA.b ($08), Y : EOR.w Scrap04 ; thing we wrote over
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; HexToDec
|
||||
; in: A(w) - Word to Convert
|
||||
; out: HexToDecDigit1 - HexToDecDigit5 (high - low)
|
||||
;--------------------------------------------------------------------------------
|
||||
HexToDec:
|
||||
PHA
|
||||
PHA
|
||||
LDA.w #$9090
|
||||
STA.b Scrap04 : STA.b Scrap06 ; temporarily store our decimal values here for speed
|
||||
PLA
|
||||
-
|
||||
CMP.w #1000 : !BLT +
|
||||
INC.b Scrap04
|
||||
!SUB.w #1000 : BRA -
|
||||
+ -
|
||||
CMP.w #100 : !BLT +
|
||||
INC.b Scrap05
|
||||
!SUB.w #100 : BRA -
|
||||
+ -
|
||||
CMP.w #10 : !BLT +
|
||||
INC.b Scrap06
|
||||
!SUB.w #10 : BRA -
|
||||
+ -
|
||||
CMP.w #1 : !BLT +
|
||||
INC.b Scrap07
|
||||
!SUB.w #1 : BRA -
|
||||
+
|
||||
LDA.b Scrap04 : STA.l HexToDecDigit2 ; move to digit storage
|
||||
LDA.b Scrap06 : STA.l HexToDecDigit4
|
||||
PLA
|
||||
RTL
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; CountBits
|
||||
; in: A(b) - Byte to count bits in
|
||||
; out: A(b) - sum of bits
|
||||
; caller is responsible for setting 8-bit mode and preserving X and Y
|
||||
;--------------------------------------------------------------------------------
|
||||
;CountBits:
|
||||
; PHX
|
||||
; TAX ; Save a copy of value
|
||||
; LSR #4 ; Shift down hi nybble, Leave <3> in C
|
||||
; PHA ; And save <7:4> in Stack
|
||||
; TXA ; Recover value
|
||||
; AND.b #$07 ; Put out <2:0> in X
|
||||
; TAX ; And save in X
|
||||
; LDA.l NybbleBitCounts, X ; Fetch count for <2:0>
|
||||
; PLX ; get <7:4>
|
||||
; ADC.l NybbleBitCounts, X ; Add count for S & C
|
||||
; PLX
|
||||
;RTL
|
||||
|
||||
; Look up table of bit counts in the values $00-$0F
|
||||
NybbleBitCounts:
|
||||
db #00, #01, #01, #02, #01, #02, #02, #03, #01, #02, #02, #03, #02, #03, #03, #04
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; HexToDec
|
||||
; in: A(w) - Word to Convert
|
||||
; out: HexToDecDigit1 - HexToDecDigit5 (high - low)
|
||||
;--------------------------------------------------------------------------------
|
||||
;HexToDec:
|
||||
; PHA
|
||||
; PHA
|
||||
; LDA.w #$9090
|
||||
; STA.l HexToDecDigit1 : STA.l HexToDecDigit3 : STA.l HexToDecDigit4 ; clear digit storage
|
||||
; PLA
|
||||
; -
|
||||
; CMP.w #10000 : !BLT +
|
||||
; PHA : SEP #$20 : LDA.l HexToDecDigit1 : INC : STA.l HexToDecDigit1 : REP #$20 : PLA
|
||||
; !SUB.w #10000 : BRA -
|
||||
; + -
|
||||
; CMP.w #1000 : !BLT +
|
||||
; PHA : SEP #$20 : LDA.l HexToDecDigit2 : INC : STA.l HexToDecDigit2 : REP #$20 : PLA
|
||||
; !SUB.w #1000 : BRA -
|
||||
; + -
|
||||
; CMP.w #100 : !BLT +
|
||||
; PHA : SEP #$20 : LDA.l HexToDecDigit3 : INC : STA.l HexToDecDigit3 : REP #$20 : PLA
|
||||
; !SUB.w #100 : BRA -
|
||||
; + -
|
||||
; CMP.w #10 : !BLT +
|
||||
; PHA : SEP #$20 : LDA.l HexToDecDigit4 : INC : STA.l HexToDecDigit4 : REP #$20 : PLA
|
||||
; !SUB.w #10 : BRA -
|
||||
; + -
|
||||
; CMP.w #1 : !BLT +
|
||||
; PHA : SEP #$20 : LDA.l HexToDecDigit5 : INC : STA.l HexToDecDigit5 : REP #$20 : PLA
|
||||
; !SUB.w #1 : BRA -
|
||||
; +
|
||||
; PLA
|
||||
;RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
|
||||
;--------------------------------------------------------------------------------
|
||||
; WriteVRAMStripe
|
||||
@@ -708,27 +278,27 @@ RTL
|
||||
; in: Y(w) - Address of Data to Copy
|
||||
;--------------------------------------------------------------------------------
|
||||
WriteVRAMBlock:
|
||||
PHX
|
||||
LDX.w GFXStripes ; get pointer
|
||||
AND.w #$7F : STA.w GFXStripes+2, X : INX #2 ; set destination
|
||||
PLA : ASL : AND.w #$3FFF : STA.w GFXStripes+2, X : INX #2 ; set length
|
||||
PHX
|
||||
LDX.w GFXStripes ; get pointer
|
||||
AND.w #$7F : STA.w GFXStripes+2, X : INX #2 ; set destination
|
||||
PLA : ASL : AND.w #$3FFF : STA.w GFXStripes+2, X : INX #2 ; set length
|
||||
|
||||
PHX
|
||||
TYX ; set X to source
|
||||
PHA
|
||||
TXA : !ADD #$1002 : TAY ; set Y to dest
|
||||
PLA
|
||||
;A is already the value we need for mvn
|
||||
MVN $7F7E ; currently we transfer from our buffers in 7F to the vram buffer in 7E
|
||||
PHX
|
||||
TYX ; set X to source
|
||||
PHA
|
||||
TXA : !ADD #$1002 : TAY ; set Y to dest
|
||||
PLA
|
||||
;A is already the value we need for mvn
|
||||
MVN $7F7E ; currently we transfer from our buffers in 7F to the vram buffer in 7E
|
||||
|
||||
!ADD 1, s ; add the length in A to the stack pointer on the top of the stack
|
||||
PLX : TAX ; pull and promptly ignore, copying the value we just got over it
|
||||
!ADD 1, s ; add the length in A to the stack pointer on the top of the stack
|
||||
PLX : TAX ; pull and promptly ignore, copying the value we just got over it
|
||||
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDA.b #$FF : STA.w GFXStripes+$02, X
|
||||
STX.w GFXStripes
|
||||
LDA.b #01 : STA.w NMISTRIPES
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
SEP #$20 ; set 8-bit accumulator
|
||||
LDA.b #$FF : STA.w GFXStripes+$02, X
|
||||
STX.w GFXStripes
|
||||
LDA.b #01 : STA.w NMISTRIPES
|
||||
REP #$20 ; set 16-bit accumulator
|
||||
RTL
|
||||
;--------------------------------------------------------------------------------
|
||||
;Byte 1 byte 2 Byte 3 byte 4
|
||||
@@ -746,8 +316,142 @@ RTL
|
||||
;This feature makes it easy to draw the same tile repeatedly. If this bit is set, the length bits should be set to 2 times the number of copies of the tile to upload. (Without subtracting 1!)
|
||||
;It is followed by a single tile (word). Combining this this with the D bit makes it easy to draw large horizontal or vertical runs of a tile without using much space. Geat for erasing or drawing horizontal or verical box edges.
|
||||
;================================================================================
|
||||
TransferVRAMStripes:
|
||||
JSL.l TransferNumericStripes
|
||||
JSL.l DoDungeonMapBossIcon
|
||||
LDA.b NMISTRIPES : CMP.b #$01 ; What we wrote over
|
||||
|
||||
DynamicDrawCleanup:
|
||||
PHA
|
||||
REP #$20
|
||||
LDA.w #$F000
|
||||
STA.w OAMBuffer
|
||||
STA.w OAMBuffer+$04
|
||||
STA.w OAMBuffer+$08
|
||||
STA.w OAMBuffer+$0C
|
||||
STZ.w OAMBuffer+$02
|
||||
STZ.w OAMBuffer+$06
|
||||
STZ.w OAMBuffer+$0A
|
||||
STZ.w OAMBuffer+$0E
|
||||
SEP #$20
|
||||
PLA
|
||||
RTL
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
CheckReceivedItemPropertiesBeforeLoad:
|
||||
PHX
|
||||
LDX.w CurrentSpriteSlot
|
||||
LDA.w AncillaID,X : CMP.b #$29 : BEQ .falling_sprite
|
||||
PLX
|
||||
LDA.b RoomIndex : BEQ .normalCode
|
||||
LDA.l RoomFade : BNE .load_palette
|
||||
.normalCode
|
||||
LDA.l SpriteProperties_chest_palette,X : BIT #$80 : BNE .load_palette
|
||||
RTL
|
||||
.load_palette
|
||||
JSL.l LoadItemPalette
|
||||
RTL
|
||||
.falling_sprite
|
||||
PLX
|
||||
LDA.l SpriteProperties_standing_palette,X : BIT #$80 : BNE .load_palette
|
||||
RTL
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
LoadItemPalette:
|
||||
; In: X - Loot ID
|
||||
; Out: A - Sprite palette index
|
||||
PHX : PHY : PHB
|
||||
LDA.b #PalettesVanillaBank>>16 : STA.b Scrap0C
|
||||
PEA $7E00
|
||||
PLB : PLB
|
||||
REP #$30
|
||||
|
||||
|
||||
CPX.w #$00C0 : BNE .not_prog_bombs
|
||||
LDA.l SpecialWeaponLevel : AND.w #$00FF : BNE +
|
||||
LDA.w #PalettesVanilla_blue_ice+$0E : BRA .continue ; none
|
||||
+ DEC : BNE +
|
||||
LDA.w #PalettesVanilla_green_blue_guard+$0E : BRA .continue ; fighter
|
||||
+ DEC : BNE +
|
||||
LDA.w #PalettesVanilla_blue_ice+$0E : BRA .continue ; master
|
||||
+ DEC : BNE +
|
||||
LDA.w #PalettesVanilla_red_melon+$0E : BRA .continue ; tempered
|
||||
+ LDA.w #PalettesCustom_golden_bombs : BRA .continue ; gold
|
||||
|
||||
.not_prog_bombs
|
||||
TXA : ASL : TAX
|
||||
LDA.l SpriteProperties_palette_addr, X
|
||||
|
||||
.continue
|
||||
STA.b Scrap0A
|
||||
|
||||
LDY.w #$000E
|
||||
JSR.w GTTorchCheck : BCS .aux
|
||||
LDA.w TransparencyFlag : BNE .SP05
|
||||
-
|
||||
LDA.b [Scrap0A], Y
|
||||
STA.w PaletteBuffer+$0170,Y
|
||||
DEY #2
|
||||
BPL -
|
||||
LDA.w #$0003
|
||||
BRA .done
|
||||
.SP05
|
||||
-
|
||||
LDA.b [Scrap0A], Y
|
||||
STA.w PaletteBuffer+$01B0,Y
|
||||
DEY #2
|
||||
BPL -
|
||||
LDA.w #$0005
|
||||
.done
|
||||
SEP #$30
|
||||
PLB : PLY : PLX
|
||||
INC.b NMICGRAM
|
||||
RTL
|
||||
.aux
|
||||
LDA.w TransparencyFlag : BNE .SP05_aux
|
||||
-
|
||||
LDA.b [Scrap0A], Y
|
||||
STA.w PaletteBufferAux+$0170,Y
|
||||
DEY #2
|
||||
BPL -
|
||||
LDA.w #$0003
|
||||
BRA .done
|
||||
.SP05_aux
|
||||
-
|
||||
LDA.b [Scrap0A], Y
|
||||
STA.w PaletteBufferAux+$01B0,Y
|
||||
DEY #2
|
||||
BPL -
|
||||
LDA.w #$0005
|
||||
BRA .done
|
||||
|
||||
TransferVRAMStripes:
|
||||
JSL.l TransferNewNameStripes
|
||||
JSL.l DoDungeonMapBossIcon
|
||||
LDA.b NMISTRIPES : CMP.b #$01 ; What we wrote over
|
||||
RTL
|
||||
|
||||
|
||||
ItemReceiptWidthCheck:
|
||||
PHX
|
||||
LDX.w CurrentSpriteSlot
|
||||
LDA.w AncillaID,X : CMP.b #$29 : BEQ .falling_sprite
|
||||
PLX
|
||||
LDA.l SpriteProperties_chest_width, X
|
||||
RTL
|
||||
.falling_sprite
|
||||
PLX
|
||||
LDA.l SpriteProperties_standing_width, X
|
||||
RTL
|
||||
|
||||
GTTorchCheck:
|
||||
PHX
|
||||
SEP #$30
|
||||
LDA.w RoomIndex : CMP.b #$8C : BNE .done
|
||||
LDX.w CurrentSpriteSlot
|
||||
LDA.w SpriteTypeTable,X : CMP.b #$3B : BNE .done; Bonk Item
|
||||
SEC
|
||||
REP #$30
|
||||
PLX
|
||||
RTS
|
||||
.done
|
||||
CLC
|
||||
REP #$30
|
||||
PLX
|
||||
RTS
|
||||
|
||||
Reference in New Issue
Block a user