;============================================================================
; Faxanadu (U).nes
;
; PRG14 ($8000 - $bfff)
;============================================================================
BASE $8000
;============================================================================
; TODO: Document Sprites_UpdateAll
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
EndGame_MainLoop
;
Game_MainLoop
;
GetRandom
;============================================================================
Sprites_UpdateAll:; [$8000]
LDA a:Sprites_UpdatesPaused
BNE @_spritesLoop
LDA a:DurationHourGlass
CMP #$ff
BNE @_spritesLoop
;
; The Hour Glass isn't being used and sprites aren't paused,
; so sprites can be updated.
;
INC a:SpriteUpdateCounter
;
; Begin the loop.
;
@_spritesLoop:; [$800f]
LDX #$07
;
; Process this sprite slot if it's populated with a
; valid sprite.
;
@_updateSprite:; [$8011]
STX a:CurrentSpriteIndex
LDA CurrentSprites_Entities,X
BMI @LAB_PRG14__8043
;
; The sprite at this index has a valid value, so proceed.
;
; We'll start by making sure that the elixir isn't set (again).
;
LDA a:Sprites_UpdatesPaused
BNE @_updateSpriteState
;
; The elixir is not active. Check if the sprite was hit.
;
LDA CurrentSprites_HitCounter,X
BNE @_handleHit
LDA CurrentSprites_HitByMagicBehavior,X
BMI @LAB_PRG14__802e
JSR Sprites_Maybe_UpdateHitByMagic
JMP @_updateSpriteState
@LAB_PRG14__802e:; [$802e]
JSR Sprites_UpdateBehavior
JSR Player_HitSpriteWithWeapon
JSR Sprite_CheckHitByCastMagic
JSR Sprite_GetBounds
JSR WasPlayerHitByMagic
JSR CurrentSprite_CheckHitPlayer
@_updateSpriteState:; [$8040]
JSR CurrentSprite_UpdateState
@LAB_PRG14__8043:; [$8043]
LDX a:CurrentSpriteIndex
DEX
BPL @_updateSprite
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
RTS
;
; The sprite has been hit. Reduce the hit counter. It'll
; eventually get to 0 if it's not hit again recently.
;
@_handleHit:; [$804e]
DEC CurrentSprites_HitCounter,X
LDA CurrentSprites_Entities,X
;
; Check if this sprite is Tamazutsu, Pakukame, or Zorugeriru.
;
CMP #$2c
BEQ @_updateSpriteState
CMP #$30
BEQ @_updateSpriteState
CMP #$31
BEQ @_updateSpriteState
;
; It's not any of those.
;
LDA #$02
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
JMP @_updateSpriteState
;============================================================================
; TODO: Document Sprites_UpdateAllStates
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Game_DrawScreenInFrozenState
;============================================================================
Sprites_UpdateAllStates:; [$8070]
LDA a:CurrentSpriteIndex
PHA
LDX #$07
@_loop:; [$8076]
STX a:CurrentSpriteIndex
JSR CurrentSprite_UpdateState
LDX a:CurrentSpriteIndex
DEX
BPL @_loop
PLA
STA a:CurrentSpriteIndex
RTS
SPRITE_UPDATE_HANDLERS:; [$8087]
dw SpriteUpdateHandler_Invisible-1; [0]:
dw SpriteUpdateHandler_Bread-1; [1]: Dropped bread
dw SpriteUpdateHandler_Coin-1; [2]: Dropped coin
dw SpriteUpdateHandler_Garbled03-1; [3]: TODO: Garbled 3
dw SpriteUpdateHandler_Enemy_Raiden-1; [4]: Enemy: Raiden
dw SpriteUpdateHandler_Enemy_NecronAides-1; [5]: Enemy: Necron Aides
dw SpriteUpdateHandler_Enemy_Zombie-1; [6]: Enemy: Zombie
dw SpriteUpdateHandler_Enemy_Hornet-1; [7]: Enemy: Hornet
dw SpriteUpdateHandler_Enemy_Bihoruda-1; [8]: Enemy: Bihoruda
dw SpriteUpdateHandler_Enemy_Lilith-1; [9]: Enemy: Lilith
;============================================================================
; SpriteUpdateHandler_Enemy_Garbled_10
;============================================================================
dw SpriteUpdateHandler_TODO_Garbled10-1; [10]: TODO: Garbled 10
dw SpriteUpdateHandler_Enemy_Yuinaru-1; [11]: Enemy: Yuinaru
dw SpriteUpdateHandler_Enemy_Snowman-1; [12]: Enemy: Snowman
dw SpriteUpdateHandler_Enemy_Nash-1; [13]: Enemy: Nash
dw SpriteUpdateHandler_Enemy_FireGiant-1; [14]: Enemy: Fire Giant
dw SpriteUpdateHandler_Enemy_Ishiisu-1; [15]: Enemy: Ishiisu
dw SpriteUpdateHandler_Enemy_ExecutionHood-1; [16]: Enemy: Execution Hood
dw SpriteUpdateHandler_Boss_Rokusutahn-1; [17]: Boss: Rokusutahn
dw SpriteUpdateHandler_Enemy_Unused18-1; [18]: Enemy: Unused #18
dw SpriteUpdateHandler_Effect_EnemyDeath-1; [19]: Effect: Enemy Death
dw SpriteUpdateHandler_Effect_LightningBall20-1; [20]: Effect: Lightning Ball
dw SpriteUpdateHandler_Enemy_Charron-1; [21]: Enemy: Charron
dw SpriteUpdateHandler_Invisible-1; [22]: Enemy: Unused 22
dw SpriteUpdateHandler_Enemy_Geributa-1; [23]: Enemy: Geributa
dw SpriteUpdateHandler_Enemy_Sugata-1; [24]: Enemy: Sugata
dw SpriteUpdateHandler_Enemy_Grimlock-1; [25]: Enemy: Grimlock
dw SpriteUpdateHandler_Enemy_GiantBees-1; [26]: Enemy: Giant Bees
dw SpriteUpdateHandler_Enemy_Myconid-1; [27]: Enemy: Myconid
dw SpriteUpdateHandler_Enemy_Naga-1; [28]: Enemy: Naga
dw SpriteUpdateHandler_Enemy_Unused29-1; [29]: Enemy: Unused #29
dw SpriteUpdateHandler_Enemy_GiantStrider-1; [30]: Enemy: Giant Strider
dw SpriteUpdateHandler_Enemy_SirGawaine_Wolfman-1; [31]: Enemy: Sir Gawaine
dw SpriteUpdateHandler_Enemy_Maskman-1; [32]: Enemy: Maskman
dw thunk_SpriteUpdateHandler_Enemy_SirGawaine_Wolfman-1; [33]: Enemy: Wolfman
dw SpriteUpdateHandler_Enemy_Yareeka-1; [34]: Enemy: Yareeka
dw SpriteUpdateHandler_Enemy_Magman-1; [35]: Enemy: Magman
dw SpriteUpdateHandler_Enemy_Unused36-1; [36]: Enemy: Unused #36
dw SpriteUpdateHandler_Invisible-1; [37]: Enemy: Unused #37
dw SpriteUpdateHandler_Enemy_Ikeda-1; [38]: Enemy: Ikeda
dw SpriteUpdateHandler_Enemy_Unused39-1; [39]: Enemy: Unused #39
dw SpriteUpdateHandler_Enemy_Lamprey-1; [40]: Enemy: Lamprey
dw SpriteUpdateHandler_Invisible-1; [41]: Enemy: Unused #41
dw SpriteUpdateHandler_Enemy_Monodron-1; [42]: Enemy: Monodron
dw SpriteUpdateHandler_Enemy_Unused43-1; [43]: Unused #43
dw SpriteUpdateHandler_Enemy_Tamazutsu-1; [44]: Enemy: Tamazutsu
dw SpriteUpdateHandler_Boss_Ripasheiku-1; [45]: Boss: Ripasheiku
dw SpriteUpdateHandler_Boss_Zoradohna-1; [46]: Boss: Zoradohna
dw SpriteUpdateHandler_Boss_Borabohra-1; [47]: Boss: Borabohra
dw SpriteUpdateHandler_Boss_Pakukame-1; [48]: Boss: Pakukame
dw SpriteUpdateHandler_Boss_Zorugeriru-1; [49]: Boss: Zorugeriru
dw SpriteUpdateHandler_Boss_KingGrieve-1; [50]: Boss: King Grieve
dw SpriteUpdateHandler_Boss_ShadowEura-1; [51]: Boss: Shadow Eura
dw SpriteUpdateHandler_NPC_Walking-1; [52]: NPC: Walking man 1
dw thunk1_SpriteUpdateHandler_NPC_Walking-1; [53]: NPC: Unused Blue Lady
dw thunk2_SpriteUpdateHandler_NPC_Walking-1; [54]: NPC: Unused Child
dw SpriteUpdateHandler_NPC_ArmorSalesman-1; [55]: NPC: Armor Salesman
dw SpriteUpdateHandler_NPC_MartialArts-1; [56]: NPC: Martial Arts
dw SpriteUpdateHandler_NPC_Priest-1; [57]: NPC: Priest
dw SpriteUpdateHandler_NPC_King-1; [58]: NPC: King
dw SpriteUpdateHandler_NPC_MagicTeacher-1; [59]: NPC: Magic Teacher
dw SpriteUpdateHandler_NPC_KeySalesman_Others-1; [60]: NPC: Key Salesman
dw SpriteUpdateHandler_NPC_KeySalesman_Others-1; [61]: NPC: Smoking Man
dw SpriteUpdateHandler_NPC_KeySalesman_Others-1; [62]: NPC: Man in Chair
dw SpriteUpdateHandler_NPC_KeySalesman_Others-1; [63]: NPC: Sitting Man 1
dw SpriteUpdateHandler_NPC_MeatSalesman_Others-1; [64]: NPC: Meat Salesman
dw SpriteUpdateHandler_NPC_MeatSalesman_Others-1; [65]: NPC: Lady in blue dress with cup
dw SpriteUpdateHandler_NPC_MeatSalesman_Others-1; [66]: NPC: King's Guard
dw SpriteUpdateHandler_NPC_Doctor-1; [67]: NPC: Doctor
dw SpriteUpdateHandler_NPC_MeatSalesman_Others-1; [68]: NPC: Walking Woman 1
dw SpriteUpdateHandler_NPC_MeatSalesman_Others-1; [69]: NPC: Walking Woman 2
dw SpriteUpdateHandler_Enemy_UnusedEyeball_Zozura-1; [70]: Enemy: Unused eyeball
dw SpriteUpdateHandler_Enemy_UnusedEyeball_Zozura-1; [71]: Enemy: Zozura
dw SpriteUpdateHandler_Item_Standard-1; [72]: Item: Glove
dw SpriteUpdateHandler_Item_Special-1; [73]: Item: Black Onyx
dw SpriteUpdateHandler_Item_Special-1; [74]: Item: Pendant
dw SpriteUpdateHandler_Item_Standard-1; [75]: Item: Red Potion
dw SpriteUpdateHandler_Item_Standard-1; [76]: Item: Poison
dw SpriteUpdateHandler_Item_Standard-1; [77]: Item: Elixir
dw SpriteUpdateHandler_Item_Standard-1; [78]: Item: Ointment
dw SpriteUpdateHandler_Invisible-1; [79]: Item: Intro trigger start point
dw SpriteUpdateHandler_Item_Standard-1; [80]: Item: Mattock
dw SpriteUpdateHandler_TODO_Garbled_81-1; [81]: TODO: Garbled #81
dw SpriteUpdateHandler_Deco_Fountain-1; [82]: Deco: Fountain
dw SpriteUpdateHandler_TODO_Unknown_83-1; [83]: TODO: Unknown #83
dw SpriteUpdateHandler_EnemyMagic-1; [84]: TODO: Unknown #84
dw SpriteUpdateHandler_Item_Standard-1; [85]: Item: Wing Boots
dw SpriteUpdateHandler_Item_Standard-1; [86]: Item: Hour Glass
dw SpriteUpdateHandler_Item_Special-1; [87]: Item: Magical Rod
dw SpriteUpdateHandler_Item_Special-1; [88]: Item: Battle Suit
dw SpriteUpdateHandler_Item_Special-1; [89]: Item: Battle Helmet
dw SpriteUpdateHandler_Item_Special-1; [90]: Item: Dragon Slayer
dw SpriteUpdateHandler_Item_Standard-1; [91]: Item: Mattock #2
dw SpriteUpdateHandler_Item_Standard-1; [92]: Item: Wing Boots (for quest)
dw SpriteUpdateHandler_Item_Standard-1; [93]: Item: Red Potion #2
dw SpriteUpdateHandler_Item_Standard-1; [94]: Item: Poison #2
dw SpriteUpdateHandler_Item_Standard-1; [95]: Item: Glove #2
dw SpriteUpdateHandler_Item_Standard-1; [96]: Item: Ointment #2
dw SpriteUpdateHandler__a5d2-1; [97]:
dw SpriteUpdateHandler__a5d2-1; [98]:
dw SpriteUpdateHandler__a5d2-1; [99]:
dw SpriteUpdateHandler_Effect_BossDeath-1; [100]: Effect: Boss Death
;============================================================================
; TODO: Document Sprites_Maybe_UpdateHitByMagic
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;============================================================================
Sprites_Maybe_UpdateHitByMagic:; [$8151]
LDY CurrentSprites_HitByMagicBehavior,X
BEQ @LAB_PRG14__8162
DEY
BEQ @LAB_PRG14__817a
DEY
BEQ @LAB_PRG14__8192
LDA #$ff
STA CurrentSprites_HitByMagicBehavior,X
RTS
@LAB_PRG14__8162:; [$8162]
LDA #$03
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
DEC CurrentSprites_HitByMagicIFrames,X
BNE @LAB_PRG14__8179
LDA #$ff
STA CurrentSprites_HitByMagicBehavior,X
@LAB_PRG14__8179:; [$8179]
RTS
@LAB_PRG14__817a:; [$817a]
LDA #$02
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
DEC CurrentSprites_HitByMagicIFrames,X
BNE @_return1
LDA #$ff
STA CurrentSprites_HitByMagicBehavior,X
@_return1:; [$8191]
RTS
@LAB_PRG14__8192:; [$8192]
LDA #$04
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
BCC @_return2
LDA #$ff
STA CurrentSprites_HitByMagicBehavior,X
@_return2:; [$81a6]
RTS
;============================================================================
; TODO: Document Player_HitEnemyWithMagic
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Sprite_CheckHitByCastMagic
;============================================================================
Player_HitEnemyWithMagic:; [$81a7]
LDA CurrentSprites_Entities,X
CMP #$05
BNE @LAB_PRG14__81b6
LDA CurrentSprites_Phases,X
ORA #$80
STA CurrentSprites_Phases,X
@LAB_PRG14__81b6:; [$81b6]
LDA #$02
JSR #$d0e4
LDA #$b7a0,Y
STA Temp_00
LDA a:SpecialItems
AND #$04
BEQ @LAB_PRG14__81cf
LDA Temp_00
LSR A
CLC
ADC Temp_00
STA Temp_00
@LAB_PRG14__81cf:; [$81cf]
LDA #$00
STA Temp_Addr_L
STY Temp_01
CPY #$00
BEQ @LAB_PRG14__81fd
LDY CurrentSprites_Entities,X
LDA #$b73b,Y
@LAB_PRG14__81df:; [$81df]
ASL A
ROL Temp_Addr_L
ASL A
ROL Temp_Addr_L
DEC Temp_01
BNE @LAB_PRG14__81df
LDA Temp_Addr_L
AND #$03
TAY
BEQ @LAB_PRG14__81fd
LSR Temp_00
DEY
BEQ @LAB_PRG14__81fd
LSR Temp_00
BEQ @LAB_PRG14__81fd
LDA #$00
STA Temp_00
@LAB_PRG14__81fd:; [$81fd]
LDA CurrentSprites_HP,X
SEC
SBC Temp_00
STA CurrentSprites_HP,X
BCS RETURN_822D
LDA CurrentSprites_Entities,X
CMP #$18
BNE @LAB_PRG14__8215
;
; If the enemy is Sugata, clear the greyscale set when it
; attacked so we don't get stuck in greyscale forever.
;
LDA ScreenColorMode; Load the screen color mode.
AND #$fe; Clear the greyscale bit.
STA ScreenColorMode; Store it.
;
; Add experience from the sprite.
;
@LAB_PRG14__8215:; [$8215]
JSR Player_AddExperienceFromSprite
;
; Play the killed enemy sound effect.
;
LDA #$03
JSR #$d0e4
;
; Check if this is a normal and big enemy. They need to be
; handled differently.
;
LDY CurrentSprites_Entities,X
LDA #$b544,Y
CMP #$07
BNE @_isSmallEnemy
;
; This is a big enemy. Handle cleanup specially.
;
JMP Sprite_ShowBigEnemyDeathByMagicOrWeapon
@_isSmallEnemy:; [$822a]
JMP Sprite_ShowNormalEnemyDeathByMagic
RETURN_822D:; [$822d]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Effect_EnemyDeath
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80ad]
;
SpriteUpdateHandler_Effect_BossDeath
;============================================================================
SpriteUpdateHandler_Effect_EnemyDeath:; [$822e]
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
LDA a:SpriteUpdateCounter
LSR A
BCS RETURN_822D
LDA #$00
STA CurrentSprite_FlipMask
STA Maybe_CurrentSprite_PPUOffset
JSR Sprite_EnterNextAppearancePhase
LDX a:CurrentSpriteIndex
LDA CurrentSprites_BehaviorData2,X
ASL A
ASL A
EOR #$ff
STA Temp_00
INC Temp_00
LDA CurrentSprites_YPos,X
CLC
ADC Temp_00
STA Maybe_Arg_CurrentSprite_PosY
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
LDA #$01
JSR Sprite_EnterNextAppearancePhase
LDX a:CurrentSpriteIndex
LDA CurrentSprites_BehaviorData2,X
ASL A
ASL A
STA Temp_00
LDA CurrentSprites_YPos,X
CLC
ADC Temp_00
STA Maybe_Arg_CurrentSprite_PosY
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
LDA #$02
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Effect_BossDeath
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::814f]
;============================================================================
SpriteUpdateHandler_Effect_BossDeath:; [$8279]
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
LDA CurrentSprites_Phases,X
CMP #$02
BEQ SpriteUpdateHandler_Effect_LightningBall20
CMP #$07
BEQ SpriteUpdateHandler_Effect_LightningBall20
JMP SpriteUpdateHandler_Effect_EnemyDeath
;============================================================================
; TODO: Document SpriteUpdateHandler_Effect_LightningBall20
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80af]
;
SpriteUpdateHandler_Effect_BossDeath
;============================================================================
SpriteUpdateHandler_Effect_LightningBall20:; [$828b]
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
LDA a:SpriteUpdateCounter
LSR A
BCS RETURN_822D
LDA #$00
STA CurrentSprite_FlipMask
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
JSR Sprite_EnterNextAppearancePhase
LDY #$03
@LAB_PRG14__82a2:; [$82a2]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_XPos_Full,X
STA Maybe_Arg_CurrentSprite_PosX
LDA CurrentSprites_YPos,X
STA Maybe_Arg_CurrentSprite_PosY
LDA CurrentSprites_BehaviorData2,X
ASL A
ASL A
EOR #$82f0,Y
STA Temp_00
BPL @LAB_PRG14__82bb
INC Temp_00
@LAB_PRG14__82bb:; [$82bb]
TYA
AND #$02
BNE @LAB_PRG14__82ca
LDA CurrentSprites_YPos,X
CLC
ADC Temp_00
STA Maybe_Arg_CurrentSprite_PosY
JMP @LAB_PRG14__82d1
@LAB_PRG14__82ca:; [$82ca]
LDA CurrentSprites_XPos_Full,X
CLC
ADC Temp_00
STA Maybe_Arg_CurrentSprite_PosX
@LAB_PRG14__82d1:; [$82d1]
LDA #$82f4,Y
STA CurrentSprite_FlipMask
LDA #$82ec,Y
STA Temp_00
TYA
PHA
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
LDA Temp_00
JSR Sprite_EnterNextAppearancePhase
PLA
TAY
DEY
BPL @LAB_PRG14__82a2
RTS
db $01; [0]:
db $02; [1]:
db $03; [2]:
BYTE_ARRAY_PRG14__82ec_3_:; [$82ef]
db $03; [3]:
db $ff; [0]:
db $00; [1]:
BYTE_ARRAY_PRG14__82f0_2_:; [$82f2]
db $ff; [2]:
BYTE_ARRAY_PRG14__82f0_3_:; [$82f3]
db $00; [3]:
db $00; [0]:
db $00; [1]:
db $00; [2]:
BYTE_ARRAY_PRG14__82f4_3_:; [$82f7]
db $40; [3]:
Sprite_CalcDistanceXToPlayer:; [$82f8]
LDA CurrentSprites_XPos_Full,X
SEC
SBC Player_PosX_Block
BCS @LAB_PRG14__8312
EOR #$ff
CLC
ADC #$01
CLC
LDY CurrentSprites_HitBoxTypes,X
SEC
SBC #$b4d1,Y
BCS @_returnTrue
LDA #$00
@_returnTrue:; [$8310]
CLC
RTS
@LAB_PRG14__8312:; [$8312]
SEC
SBC #$10
BCS @_return
LDA #$00
SEC
@_return:; [$831a]
RTS
Sprite_CalcDistanceYToPlayer:; [$831b]
LDA CurrentSprites_YPos,X
SEC
SBC Player_PosY
BCS @_return
EOR #$ff
CLC
ADC #$01
CLC
@_return:; [$8328]
RTS
;============================================================================
; TODO: Document SpriteBehavior_Unknown_29_SomeSetup
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Unknown_29
;============================================================================
SpriteBehavior_Unknown_29_SomeSetup:; [$8329]
JSR SpriteAction_FacePlayerX
JSR SpriteAction_FacePlayerY
JSR Sprite_CalcDistanceXToPlayer
STA CurrentSprites_BehaviorState_XFull,X
JSR Sprite_CalcDistanceYToPlayer
STA CurrentSprites_BehaviorState_YFull,X
CMP CurrentSprites_BehaviorState_XFull,X
BCS @LAB_PRG14__836c
LDA CurrentSprites_BehaviorState_YFull,X
STA a:Arg_PlayerHealthDelta_U
LDA CurrentSprites_BehaviorState_XFull,X
STA a:SpriteBehaviorUnknown20_SomethingXOrY
LDA #$00
STA a:Arg_PlayerHealthDelta_L
STA a:BYTE_04bf
STA CurrentSprites_BehaviorState_XFrac,X
JSR #$c0ec
LDA a:Arg_PlayerHealthDelta_U
STA CurrentSprites_BehaviorState_YFull,X
LDA a:Arg_PlayerHealthDelta_L
STA CurrentSprites_BehaviorState_YFrac,X
LDA #$01
STA CurrentSprites_BehaviorState_XFull,X
RTS
@LAB_PRG14__836c:; [$836c]
LDA CurrentSprites_BehaviorState_XFull,X
STA a:Arg_PlayerHealthDelta_U
LDA CurrentSprites_BehaviorState_YFull,X
STA a:SpriteBehaviorUnknown20_SomethingXOrY
LDA #$00
STA a:Arg_PlayerHealthDelta_L
STA a:BYTE_04bf
STA CurrentSprites_BehaviorState_YFrac,X
JSR #$c0ec
LDA a:Arg_PlayerHealthDelta_U
STA CurrentSprites_BehaviorState_XFull,X
LDA a:Arg_PlayerHealthDelta_L
STA CurrentSprites_BehaviorState_XFrac,X
LDA #$01
STA CurrentSprites_BehaviorState_YFull,X
RTS
;============================================================================
; MAYBE DEADCODE
;
; XREFS:
;
FUN_PRG14__8398
;============================================================================
FUN_PRG14__8398:; [$8398]
ASL CurrentSprites_BehaviorState_XFull,X
ROL CurrentSprites_BehaviorState_XFrac,X
ASL CurrentSprites_BehaviorState_YFull,X
ROL CurrentSprites_BehaviorState_YFrac,X
DEY
BNE FUN_PRG14__8398
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
FUN_PRG14__83a8:; [$83a8]
LDA CurrentSprites_BehaviorState_XFull,X
STA a:Arg_DeltaX_Frac
LDA CurrentSprites_BehaviorState_XFrac,X
STA a:Arg_DeltaX_Full
LDA CurrentSprites_BehaviorState_YFull,X
STA a:Arg_DeltaY_Frac
LDA CurrentSprites_BehaviorState_YFrac,X
STA a:Arg_DeltaY_Full
RTS
Sprites_CalcHorizSpriteMovement:; [$83c1]
STA a:Arg_DeltaX_Frac; Set pixels delta from A.
LDA #$00; A = 0
@_loop:; [$83c6]
ASL a:Arg_DeltaX_Frac; Shift the pixels delta amount left.
ROL A
DEY
BNE @_loop
STA a:Arg_DeltaX_Full
RTS
Sprites_CalcVerticalSpriteMovement:; [$83d1]
STA a:Arg_DeltaY_Frac
LDA #$00
@LAB_PRG14__83d6:; [$83d6]
ASL a:Arg_DeltaY_Frac
ROL A
DEY
BNE @LAB_PRG14__83d6
STA a:Arg_DeltaY_Full
RTS
Sprites_CalcYFromGravity:; [$83e1]
PHA
AND #$83f7,Y
STA Temp_00
PLA
AND #$83ff,Y
BEQ @LAB_PRG14__83f4
LDA #$83f7,Y
SEC
SBC Temp_00
RTS
@LAB_PRG14__83f4:; [$83f4]
LDA Temp_00
RTS
SPRITE_BEHAVIOR_HOP_PEAK_TICKS:; [$83f7]
db $ff; [0]:
db $7f; [1]:
db $3f; [2]:
db $1f; [3]:
db $0f; [4]:
db $07; [5]:
db $03; [6]:
db $01; [7]:
SPRITES_MAYBE_GRAVITY:; [$83ff]
db $00; [0]:
db $80; [1]:
db $40; [2]:
db $20; [3]:
db $10; [4]:
db $08; [5]:
db $04; [6]:
db $02; [7]:
;============================================================================
; TODO: Document SpriteAction_FlipXDirection
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
BSCRIPT_ACTIONS [$PRG14::a796]
;
SpriteBehavior_WalkForward
;============================================================================
SpriteAction_FlipXDirection:; [$8407]
LDA CurrentSprites_Flags,X
EOR #$01
STA CurrentSprites_Flags,X
RTS
SpriteAction_FlipYDirection:; [$8410]
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
RTS
Sprite_MoveHorizAndTurnAroundIfNeeded:; [$8419]
JSR Sprites_Something_SomethingAndMoveHoriz
BCC @_return
LDA CurrentSprites_Flags,X
EOR #$01
STA CurrentSprites_Flags,X
@_return:; [$8426]
RTS
Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz:; [$8427]
JSR FUN_PRG14__849a
LDA CurrentSprites_XPos_Full,X
CMP #$f0
BCC @_returnFalse
LDA CurrentSprites_Flags,X
LSR A
LDA CurrentSprites_XPos_Full,X
AND #$f0
BCS @LAB_PRG14__843d
CLC
ADC #$10
@LAB_PRG14__843d:; [$843d]
STA CurrentSprites_XPos_Full,X
LDA CurrentSprites_Flags,X
EOR #$01
STA CurrentSprites_Flags,X
SEC
RTS
@_returnFalse:; [$8449]
CLC
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
FUN_PRG14__844b:; [$844b]
JSR Sprite_Maybe_AddFacingPosX
LDA CurrentSprites_XPos_Full,X
CMP #$f0
BCC RETURN_846B
LDA CurrentSprites_Flags,X
LSR A
LDA CurrentSprites_XPos_Full,X
AND #$f0
BCS @LAB_PRG14__8461
CLC
ADC #$10
@LAB_PRG14__8461:; [$8461]
STA CurrentSprites_XPos_Full,X
LDA CurrentSprites_Flags,X
EOR #$01
STA CurrentSprites_Flags,X
RETURN_846B:; [$846b]
RTS
;============================================================================
; TODO: Document Sprite_Maybe_AddFacingPosX
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__844b
;============================================================================
Sprite_Maybe_AddFacingPosX:; [$846c]
LDA CurrentSprites_XPos_Full,X
CMP Player_PosX_Block
BEQ RETURN_846B
BCC @LAB_PRG14__847e
LDA CurrentSprites_Flags,X
AND #$01
BNE @LAB_PRG14__8488
JMP Sprite_SubtractPosX
@LAB_PRG14__847e:; [$847e]
LDA CurrentSprites_Flags,X
AND #$01
BEQ @LAB_PRG14__8488
JMP Sprite_AddPosX
@LAB_PRG14__8488:; [$8488]
CLC
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
FUN_PRG14__848a:; [$848a]
LDA #$00
STA a:Arg_DeltaX_Frac
LDA #$01
STA a:Arg_DeltaX_Full
;
; v-- Fall through --v
;
Sprites_Something_SomethingAndMoveHoriz:; [$8494]
JSR FUN_PRG14__849a
JMP MoveSpriteHorizIfPossible
FUN_PRG14__849a:; [$849a]
LDA CurrentSprites_Flags,X
LSR A
BCS Sprite_AddPosX
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document Sprite_SubtractPosX
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Sprite_Maybe_AddFacingPosX
;============================================================================
Sprite_SubtractPosX:; [$84a0]
LDA CurrentSprites_Maybe_XPos_Frac,X
SEC
SBC a:Arg_DeltaX_Frac
STA CurrentSprites_Maybe_XPos_Frac,X
LDA CurrentSprites_XPos_Full,X
SBC a:Arg_DeltaX_Full
STA CurrentSprites_XPos_Full,X
RTS
;============================================================================
; TODO: Document Sprite_AddPosX
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__849a
;
Sprite_Maybe_AddFacingPosX
;============================================================================
Sprite_AddPosX:; [$84b2]
LDA CurrentSprites_Maybe_XPos_Frac,X
CLC
ADC a:Arg_DeltaX_Frac
STA CurrentSprites_Maybe_XPos_Frac,X
LDA CurrentSprites_XPos_Full,X
ADC a:Arg_DeltaX_Full
STA CurrentSprites_XPos_Full,X
RTS
;============================================================================
; Move the sprite horizontally if possible.
;
; If the sprite cannot move, then this will do nothing.
;
; INPUTS:
; X:
; The index of the sprite.
;
; OUTPUTS:
; C:
; 1 if the sprite could move.
; 0 if the sprite could not move.
;
; XREFS:
;
Sprites_Something_SomethingAndMoveHoriz
;============================================================================
MoveSpriteHorizIfPossible:; [$84c4]
TYA
PHA
LDA CurrentSprites_Flags,X; Load the sprite flags.
AND #$01
TAX
JSR CurrentSprite_CanMoveInDirection; Check if this sprite can move at all
LDA Blocks_Result; Load the current block properties
BEQ @_cannotMove; If 0, it cannot move
LDX a:CurrentSpriteIndex; Load the current sprite
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$01
TAY
LDA CurrentSprites_XPos_Full,X; Load the X coordinate of the sprite
AND #$f0; Grab the X pos (top nibble)
CPY #$01
BCS @_updateHorizPos
CLC
ADC #$10; Add 1 to the block X position
@_updateHorizPos:; [$84e7]
STA CurrentSprites_XPos_Full,X; Store the block position for the sprite.
PLA; Restore the original Y register.
TAY
SEC; C = 1 (moved, true result)
RTS
@_cannotMove:; [$84ed]
PLA; Restore the registers
TAY
LDX a:CurrentSpriteIndex
CLC; C = 0 (could not move, false result)
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
FUN_PRG14__84f4:; [$84f4]
JSR Sprites_CanSpriteWalk
TAX
BNE SpriteBehavior_RestoreXRegister
LDX a:CurrentSpriteIndex
JSR Sprite_CanClimb
TAX
BEQ @LAB_PRG14__850d
LDX a:CurrentSpriteIndex
RTS
;============================================================================
; TODO: Document FUN_PRG14__8507
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Ishiisu
;============================================================================
FUN_PRG14__8507:; [$8507]
JSR Sprites_CanSpriteWalk
TAX
BNE SpriteBehavior_RestoreXRegister
;
; v-- Fall through --v
;
@LAB_PRG14__850d:; [$850d]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Flags,X
LSR A
PHP
LDA CurrentSprites_XPos_Full,X
AND #$f0
PLP
BCS @LAB_PRG14__851e
ADC #$10
@LAB_PRG14__851e:; [$851e]
STA CurrentSprites_XPos_Full,X
LDA InterruptCounter
AND #$3f; On interrupts 64 and 128...
BNE SpriteBehavior_RestoreXRegister
LDA CurrentSprites_Flags,X
EOR #$01
STA CurrentSprites_Flags,X
;============================================================================
; TODO: Document SpriteBehavior_RestoreXRegister
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__84f4
;
FUN_PRG14__8507
;============================================================================
SpriteBehavior_RestoreXRegister:; [$852e]
LDX a:CurrentSpriteIndex
RTS
SPRITE_WALK_PIXEL_MOVEMENT_TABLE:; [$8532]
db $00; [0]: 0 pixel movement
db $0f; [1]: 15 pixel movement
;============================================================================
; TODO: Document Sprite_CanClimb
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__84f4
;============================================================================
Sprite_CanClimb:; [$8534]
LDY CurrentSprites_HitBoxTypes,X
LDA CurrentSprites_YPos,X
CLC
ADC #$b4d8,Y
CLC
ADC #$10
JMP FUN_PRG14__854c
;============================================================================
; TODO: Document Sprites_CanSpriteWalk
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
FUN_PRG14__84f4
;
FUN_PRG14__8507
;
Sprites_SetCurrentSpriteCanMove
;============================================================================
Sprites_CanSpriteWalk:; [$8543]
LDY CurrentSprites_HitBoxTypes,X
LDA CurrentSprites_YPos,X
CLC
ADC #$b4d8,Y
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document FUN_PRG14__854c
;
; INPUTS:
; A
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Sprite_CanClimb
;============================================================================
FUN_PRG14__854c:; [$854c]
STA Arg_PixelPosY
INC Arg_PixelPosY
LDA CurrentSprites_Flags,X
AND #$01
TAY
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$8532,Y
STA Arg_PixelPosX
JSR #$e86c
JMP #$e887
Sprite_MoveVertAndFlipIfNeeded:; [$8564]
JSR Sprite_CalculateNewVertPos
JSR MoveSpriteVerticalIfPossible
BCC @_return
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@_return:; [$8574]
RTS
;============================================================================
; TODO: Document MoveSpriteVerticalIfPossible
;
; INPUTS:
; X
;
; OUTPUTS:
; C
;
; XREFS:
;
Sprite_MoveVertAndFlipIfNeeded
;
Sprite_MoveVertical
;============================================================================
MoveSpriteVerticalIfPossible:; [$8575]
LDA CurrentSprites_Flags,X
ROL A
ROL A
AND #$01
ORA #$02
TAX
JSR CurrentSprite_CanMoveInDirection
LDX a:CurrentSpriteIndex
LDA Blocks_Result
BEQ @_returnFalse
LDA CurrentSprites_Flags,X
ASL A
LDA CurrentSprites_YPos,X
AND #$f0
BCS @_returnTrue
CLC
ADC #$10
@_returnTrue:; [$8596]
STA CurrentSprites_YPos,X
SEC
RTS
@_returnFalse:; [$859a]
CLC
RTS
Sprite_Maybe_TurnAroundIfAtScreenEdgeVert:; [$859c]
JSR Sprite_CalculateNewVertPos
JSR Sprite_CapToBlockOppositeFalling
BCC @_return
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@_return:; [$85ac]
RTS
;============================================================================
; Move a sprite up or down based on the opposite of the falling flag.
;
; If the sprite is falling, the sprite's Y position will be
; kept on the same block, moving up if needed to the start
; of the block.
;
; If the sprite is rising, the sprite's Y position is moved
; to the top of the next block down.
;
; This is used in behavior code.
;
; INPUTS:
; X:
; The sprite index.
;
;
CurrentSprites_Flags:
; The sprite flags.
;
;
CurrentSprites_YPos:
; The sprite Y positions.
;
; OUTPUTS:
; C:
; 0 = Sitting at bottom of the screen.
; 1 = Capped to a block position.
;
;
CurrentSprites_YPos:
; The updated Y positions.
;
; XREFS:
;
Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
;============================================================================
Sprite_CapToBlockOppositeFalling:; [$85ad]
;
; Check if the Y position is at the bottom of the screen.
;
LDA CurrentSprites_YPos,X; Load the sprite's Y position.
CMP #$e0; Is Y < 224?
BCC @_return; If so, return.
;
; There's room to fall. Check if the sprite is falling.
;
LDA CurrentSprites_Flags,X; Load the sprite's flags.
ASL A; Shift the Falling flag into C.
LDA CurrentSprites_YPos,X; A = Y position.
AND #$f0; Round (floor) to a block position.
BCS @_setY; If falling, jump to set the position as Y.
;
; The sprite is not falling. It's moving up.
;
CLC; Else, clear carry.
ADC #$10; A += 16 (Y position)
;
; Set the resulting Y position for the sprite, and
; set C = 1 for the result.
;
@_setY:; [$85c0]
STA CurrentSprites_YPos,X; Set as the new Y position.
SEC; Set C = 1.
@_return:; [$85c3]
RTS
Sprite_MoveVertical:; [$85c4]
JSR Sprite_CalculateNewVertPos
JMP MoveSpriteVerticalIfPossible
Sprite_CalculateNewVertPos:; [$85ca]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
BMI @LAB_PRG14__85e1
LDA CurrentSprites_SomethingY,X
SEC
SBC a:Arg_DeltaY_Frac
STA CurrentSprites_SomethingY,X
LDA CurrentSprites_YPos,X
SBC a:Arg_DeltaY_Full
STA CurrentSprites_YPos,X
RTS
@LAB_PRG14__85e1:; [$85e1]
LDA CurrentSprites_SomethingY,X
CLC
ADC a:Arg_DeltaY_Frac
STA CurrentSprites_SomethingY,X
LDA CurrentSprites_YPos,X
ADC a:Arg_DeltaY_Full
STA CurrentSprites_YPos,X
RTS
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Flags,X
AND #$01
TAY
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$861d,Y
STA Arg_PixelPosX
LDY CurrentSprites_HitBoxTypes,X
LDA CurrentSprites_YPos,X
CLC
ADC #$b4d8,Y
STA Arg_PixelPosY
INC Arg_PixelPosY
JSR #$e86c
JSR #$e87c
STA Blocks_Result
LDX a:CurrentSpriteIndex
RTS
BYTE_ARRAY_PRG14__861d:; [$861d]
db $00; [0]:
db $0f; [1]:
Sprites_SetCurrentSpriteCanMove:; [$861f]
LDX a:CurrentSpriteIndex; X = Currently active sprite.
LDA CurrentSprites_Flags,X; A = Current sprite's flags.
AND #$02
BNE @LAB_PRG14__863d
JSR Sprites_CanSpriteWalk
STA Blocks_Result
BNE @LAB_PRG14__863d
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Flags,X
ORA #$04
STA CurrentSprites_Flags,X
SEC
RTS
@LAB_PRG14__863d:; [$863d]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Flags,X
AND #$fb
STA CurrentSprites_Flags,X
CLC
RTS
CurrentSprite_HandleFall:; [$864a]
LDX a:CurrentSpriteIndex; X = Currently active sprite.
LDA CurrentSprites_Flags,X; A = Current sprite's flags.
AND #$04; Can the sprite move?
BEQ @_done; If not, prepare to return.
;
; This sprite can move.
;
LDA CurrentSprites_YPos,X; A = Sprite's Y position.
CLC
ADC #$08; A += 8
STA CurrentSprites_YPos,X; Store as the new position.
CMP #$c0; Is this at the bottom of the screen?
BCS @_clearSprite; If so, jump to clear the sprite.
;
; Make the sprite fall, if it can.
;
LDX #$03; X = 3 (down direction)
JSR CurrentSprite_CanMoveInDirection; Can the sprite move down?
LDA Blocks_Result; A = result of that check.
BEQ @_done; If not, prepare to return.
;
; Move the sprite down.
;
LDX a:CurrentSpriteIndex; X = Currently active sprite.
LDA CurrentSprites_YPos,X; A = Sprite's Y position.
AND #$f0; Round to a block position (after the above += 8).
STA CurrentSprites_YPos,X; Store as the new position.
@_done:; [$8671]
LDX a:CurrentSpriteIndex; Restore the current sprite index.
RTS
@_clearSprite:; [$8675]
LDA #$ff
STA CurrentSprites_Entities,X
RTS
SpriteAction_FacePlayerX:; [$867b]
LDA Player_PosX_Block; Load the player's X position.
;
; Check if the player and sprite are in the same X position.
;
CMP CurrentSprites_XPos_Full,X; Compare to the sprite's X position.
BEQ @_return; If it's the same, return.
;
; Rotate the X position left one and take the right-most bit.
;
; This will effectively generate a flipping bit facing the
; left or right side of the screen, based on player position.
;
ROL A; Rotate the X position left.
AND #$01; And take the right-most bit for the facing bit.
STA Temp_00; Store it.
;
; Set the facing bit for the sprite.
;
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$fe; Clear the Facing Right bit.
ORA Temp_00; Set Facing Right depending on our rotate above.
STA CurrentSprites_Flags,X; Save it back out.
@_return:; [$8690]
RTS
SpriteAction_FacePlayerY:; [$8691]
LDA Player_PosY
;
; Check if the player and sprite are in the same Y position.
;
CMP CurrentSprites_YPos,X
BEQ @_return
;
; Rotate the Y position right one and take the left-most bit.
;
; This will effectively generate a flipping bit moving the Y
; direction up or down, based on player position.
;
ROR A
AND #$80
STA Temp_00
;
; Set the Y directinoal bit for the sprite.
;
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$7f; Clear the Falling bit.
ORA Temp_00; Set the Falling bit based on the rotate above.
STA CurrentSprites_Flags,X; Save it back out.
@_return:; [$86a6]
RTS
;============================================================================
; TODO: Document MoveRight
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CurrentSprite_CanMoveInDirection
;============================================================================
MoveRight:; [$86a7]
LDX CurrentSprites_HitBoxTypes,Y
LDA CurrentSprites_XPos_Full,Y
CLC
ADC #$b4d1,X
STA Arg_PixelPosX
BCC FUN_PRG14__86c6
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document Sprites_SetBlockIsMovingResult
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__86bd
;============================================================================
Sprites_SetBlockIsMovingResult:; [$86b5]
;
; Set the block as moving.
;
LDA #$01
STA Blocks_Result
LDX a:CurrentSpriteIndex
RTS
;============================================================================
; TODO: Document FUN_PRG14__86bd
;
; INPUTS:
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CurrentSprite_CanMoveInDirection
;============================================================================
FUN_PRG14__86bd:; [$86bd]
LDA CurrentSprites_XPos_Full,Y
CMP #$f1
BCS Sprites_SetBlockIsMovingResult
STA Arg_PixelPosX
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document FUN_PRG14__86c6
;
; INPUTS:
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
MoveRight
;============================================================================
FUN_PRG14__86c6:; [$86c6]
LDA CurrentSprites_YPos,Y
STA Arg_PixelPosY
JSR #$e86c
JSR #$e87c
STA Blocks_Result
BNE @LAB_PRG14__870c
LDY a:CurrentSpriteIndex
LDA CurrentSprites_HitBoxTypes,Y
TAY
LDA #$b4d8,Y
STA Temp_HitBoxValue
@LAB_PRG14__86e1:; [$86e1]
LDA Temp_HitBoxValue
SEC
SBC #$10
STA Temp_HitBoxValue
BCC @LAB_PRG14__86f8
TXA
CLC
ADC #$10
TAX
JSR #$e87c
STA Blocks_Result
BNE @LAB_PRG14__870c
BEQ @LAB_PRG14__86e1
@LAB_PRG14__86f8:; [$86f8]
LDY a:CurrentSpriteIndex
LDA CurrentSprites_YPos,Y
AND #$0f
BEQ @LAB_PRG14__870c
TXA
CLC
ADC #$10
TAX
JSR #$e87c
STA Blocks_Result
@LAB_PRG14__870c:; [$870c]
LDX a:CurrentSpriteIndex
RTS
CurrentSprite_CanMoveInDirection:; [$8710]
LDY a:CurrentSpriteIndex
TXA
BEQ FUN_PRG14__86bd
DEX
BEQ MoveRight
DEX
BEQ @LAB_PRG14__8731
LDX CurrentSprites_HitBoxTypes,Y
LDA CurrentSprites_YPos,Y
CLC
ADC #$b4d8,X
STA Arg_PixelPosY
CMP #$f0
BCC @LAB_PRG14__873a
@LAB_PRG14__872c:; [$872c]
LDA #$01
STA Blocks_Result
RTS
@LAB_PRG14__8731:; [$8731]
LDA CurrentSprites_YPos,Y
CMP #$f0
BCS @LAB_PRG14__872c
STA Arg_PixelPosY
@LAB_PRG14__873a:; [$873a]
LDA CurrentSprites_XPos_Full,Y
STA Arg_PixelPosX
JSR #$e86c
JSR #$e87c
STA Blocks_Result
BNE @LAB_PRG14__8778
LDY a:CurrentSpriteIndex
LDA CurrentSprites_HitBoxTypes,Y
TAY
LDA #$b4d1,Y
STA Temp_HitBoxValue
@LAB_PRG14__8755:; [$8755]
LDA Temp_HitBoxValue
SEC
SBC #$10
STA Temp_HitBoxValue
BCC @LAB_PRG14__8768
INX
JSR #$e87c
STA Blocks_Result
BNE @LAB_PRG14__8778
BEQ @LAB_PRG14__8755
@LAB_PRG14__8768:; [$8768]
LDY a:CurrentSpriteIndex
LDA CurrentSprites_XPos_Full,Y
AND #$0f
BEQ @LAB_PRG14__8778
INX
JSR #$e87c
STA Blocks_Result
@LAB_PRG14__8778:; [$8778]
LDX a:CurrentSpriteIndex
RTS
;============================================================================
; TODO: Document WasPlayerHitByMagic
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;============================================================================
WasPlayerHitByMagic:; [$877c]
LDA a:SelectedShield
CMP #$03
BCS RETURN_87CA
JSR Maybe_Player_CalcAnimFrame
SEC
SBC #$04
CMP #$03
BCC RETURN_87CA
LDX a:CurrentSpriteIndex
LDY CurrentSprites_Entities,X
CPY #$ff
BEQ RETURN_87CA
LDA #$b544,Y
CMP #$06
BNE RETURN_87CA
LDA a:SpriteBox_Width
CLC
ADC #$07
STA Temp_00
LDA a:Player_ShieldPositionX
CLC
ADC #$07
SEC
SBC a:SpriteBox_Left
CMP Temp_00
BCS RETURN_87CA
LDA a:SpriteBox_Height
CLC
ADC #$0f
STA Temp_00
LDA a:Player_ShieldPositionY
CLC
ADC #$0f
SEC
SBC a:SpriteBox_Top
CMP Temp_00
BCC FUN_PRG14__87cb
RETURN_87CA:; [$87ca]
RTS
;============================================================================
; TODO: Document FUN_PRG14__87cb
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
WasPlayerHitByMagic
;============================================================================
FUN_PRG14__87cb:; [$87cb]
JSR Player_HandleHitByMagic
LDX a:CurrentSpriteIndex
LDA #$ff
STA CurrentSprites_Entities,X
LDA #$0c
JSR #$d0e4
RTS
;============================================================================
; TODO: Document Player_HandleHitByMagic
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__87cb
;============================================================================
Player_HandleHitByMagic:; [$87dc]
LDX a:CurrentSpriteIndex
LDY CurrentSprites_Entities,X
LDA #$b6d7,Y
LDY a:SelectedShield
@LAB_PRG14__87e8:; [$87e8]
LSR A
DEY
BPL @LAB_PRG14__87e8
STA a:Arg_PlayerHealthDelta_U
LDA #$00
STA a:Arg_PlayerHealthDelta_L
LDA a:Arg_PlayerHealthDelta_U
BNE @LAB_PRG14__87fa
RTS
@LAB_PRG14__87fa:; [$87fa]
JSR Player_SetDamagedBySprite
JMP #$c08e
DEC CurrentSprites_HitCounter,X
RTS
;============================================================================
; TODO: Document Player_HitSpriteWithWeapon
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;============================================================================
Player_HitSpriteWithWeapon:; [$8804]
JSR Sprites_IsSpriteHidden
;
; Check if the sprite is visible. If so, return.
;
BNE RETURN_87CA
LDA Player_Flags
BPL RETURN_87CA
LDY PlayerHitsPhaseCounter
DEY
CPY #$02
BCS RETURN_87CA
;
; Check if the player has a weapon. If not, return.
;
LDA a:Player_CurWeapon
BMI RETURN_87CA
LDX a:CurrentSpriteIndex
LDY CurrentSprites_Entities,X
;
; Check if the sprite being hit is an enemy. If not, return.
;
LDA #$b544,Y
BEQ @LAB_PRG14__8828
CMP #$07
BNE RETURN_87CA
@LAB_PRG14__8828:; [$8828]
LDA CurrentSprites_XPos_Full,X
STA a:Something_Maybe_WeaponDistanceX
LDA CurrentSprites_YPos,X
STA a:Something_Maybe_WeaponDistanceY
JSR Sprites_IsSpriteOutOfWeaponRange
BCC @LAB_PRG14__883a
;
; The sprite isn't within range. Return.
;
JMP @_return
@LAB_PRG14__883a:; [$883a]
LDA CurrentSprites_Entities,X
CMP #$05
BNE @LAB_PRG14__8849
;
; TODO: Figure out why Necron Aides get bit 7 set.
;
LDA CurrentSprites_Phases,X
ORA #$80
STA CurrentSprites_Phases,X
@LAB_PRG14__8849:; [$8849]
LDA #$02
;
; Play the Hit Enemy sound.
;
JSR #$d0e4
;
; Stop the player from walking.
;
LDA Player_Flags
AND #$df
STA Player_Flags
;
; Set the flags and hit counter for the sprite.
;
LDY #$00
AND #$40
BEQ @LAB_PRG14__885b
INY
@LAB_PRG14__885b:; [$885b]
STY Temp_00
LDA CurrentSprites_Flags,X
AND #$fe
ORA Temp_00
STA CurrentSprites_Flags,X
LDA #$08
STA CurrentSprites_HitCounter,X
LDY a:Player_CurWeapon
;
; Set the base strength of the equipped weapon.
;
LDA #$b7a5,Y
STA Temp_00
LDA a:SpecialItems
;
; If there's no pendant equipped, increase weapon strength by 25%.
;
; This is the famous Pendant Bug. This should have been inversed. Oops.
;
AND #$02
BNE @_checkGlove
LDA Temp_00
LSR A
LSR A
CLC
ADC Temp_00
STA Temp_00
;
; If the player has the glove, add the strength of the
; glove based on the weapon strength.
;
; This is:
;
; Hand Dagger: 2HP
; Long Sword: 4HP
; Giant Blade: 8HP
; Dragon Slayer: 10HP
;
@_checkGlove:; [$8884]
LDA a:DurationGlove; Load the glove duration.
BMI @_updateSpriteHP; If it's no longer active, jump.
LDA Temp_00; Load the calculated weapon strength.
CLC
ADC #$88c7,Y; Add the glove strength for the current weapon.
STA Temp_00; Store as the new damage counter.
;
; Calculate the number of HP remaining for the enemy.
;
; We'll take the current HP, remove what we've calculated
; for the weapon strength.
;
@_updateSpriteHP:; [$8891]
LDA CurrentSprites_HP,X; Load the current HP for this enemy.
SEC
SBC Temp_00; Subtract the current damage.
STA CurrentSprites_HP,X; Store back as the enemy HP.
;
; Check if the sprite is still alive. If so, we're done.
;
BCS @_return; If the enemy is dead, we're done here.
;
; The sprite is dead, so begin handling post-death logic.
;
; Start by checking if this is Sugata. This is handled specially.
; When dead, the screen flashes.
;
LDA CurrentSprites_Entities,X
CMP #$18; Compare to Sugata.
BNE @_handleEnemyGeneric; If not, jump.
;
; When Sugata dies, make sure we restore color.
;
; Sugata will flash the screen, and this prevents the screen
; from getting stuck in greyscale.
;
LDA ScreenColorMode; Load the current screen mode.
AND #$fe; Clear bit 0, setting to greyscale.
STA ScreenColorMode; Store back as the screen mode.
@_handleEnemyGeneric:; [$88a9]
LDA #$03; Play sound #3.
;
; Play a sound for the enemy kill, reset state, and add
; experience.
;
JSR #$d0e4
LDA #$00
STA CurrentSprites_HitCounter,X; Clear the hit counter for the dead enemy.
JSR Player_AddExperienceFromSprite; Add experience for the current sprite.
;
; Check if we killed a standard enemy or a boss.
;
LDY CurrentSprites_Entities,X; Load the type of this enemy.
LDA #$b544,Y
CMP #$07; Is this a big enemy?
BNE @LAB_PRG14__88c3; If not, jump.
;
; This was a big enemy (a boss).
;
JMP Sprite_ShowBigEnemyDeathByMagicOrWeapon; Handle big enemy death cleanup.
;
; This was a standard enemy.
;
@LAB_PRG14__88c3:; [$88c3]
JMP Sprite_ShowNormalEnemyDeathByWeapon; Handle standard enemy death cleanup.
@_return:; [$88c6]
RTS
;============================================================================
; A mapping of weapon types to additional hit power.
;============================================================================
WEAPON_TO_GLOVE_STRENGTH:; [$88c7]
db $02; [0]: Hand Dagger -- 2HP
db $04; [1]: Long Sword -- 4HP
db $08; [2]: Giant Blade -- 8HP
db $0a; [3]: Dragon Slayer -- 10HP
;============================================================================
; Check if a sprite is out of the player's weapon range.
;
; Range will be checked in both an X and Y direction.
;
; INPUTS:
; X:
; The index of the sprite to check.
;
; OUTPUTS:
;
Temp_00:
; This will be clobbered with the last distance
; calculation.
;
; C:
; 1 if out of range.
; 0 if within range.
;
; XREFS:
;
Player_HitSpriteWithWeapon
;============================================================================
Sprites_IsSpriteOutOfWeaponRange:; [$88cb]
;
; First check the distance in the X position between the
; weapon and the sprite.
;
LDA CurrentSprites_Entities,X
ASL A
TAY
LDA #$b407,Y
CLC
ADC Maybe_WeaponRange_X
STA Temp_00
LDA PlayerPosXPlus10
CLC
;
; If that wasn't in range...
;
ADC Maybe_WeaponRange_X
SEC
SBC a:Something_Maybe_WeaponDistanceX
CMP Temp_00
BCS @_return
;
; Check the distance in the Y direction between the
; weapon and the sprite.
;
LDA #$b408,Y
CLC
ADC Maybe_WeaponRange_Y
STA Temp_00
LDA Maybe_Something_WeaponPosY
CLC
ADC Maybe_WeaponRange_Y
SEC
SBC a:Something_Maybe_WeaponDistanceY
CMP Temp_00
BCS @_return
@_return:; [$88fa]
RTS
;============================================================================
; Handle touching an item.
;
; This will cause the player to pick up the sprite.
;
; INPUTS:
; A:
; The current sprite index.
;
;
CurrentSprites_Entities:
; The entities of the sprites on the scren.
;
; OUTPUTS:
;
CurrentSprites_Entities:
; The new entities of the sprites, with this
; sprite cleared.
;
; CALLS:
; Player_PickUp
;============================================================================
Player_HandleTouchItem:; [$88fb]
LDA CurrentSprites_Entities,X; Load the entity at the given index.
JSR #$c764; Pick up the item.
LDX a:CurrentSpriteIndex; X = current sprite index.
;
; Remove the item from the screen.
;
LDA #$ff; A = 0xFF (unset)
STA CurrentSprites_Entities,X; Set the entity at this sprite index as 0xFF.
RETURN_8909:; [$8909]
RTS
;============================================================================
; TODO: Document CurrentSprite_CheckHitPlayer
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;============================================================================
CurrentSprite_CheckHitPlayer:; [$890a]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Entities,X
CMP #$ff
BEQ RETURN_8909
JSR Sprites_IsSpriteHidden
BNE RETURN_8998
LDA a:SpriteBox_Width
CLC
ADC #$0b
STA Temp_00
LDA Player_PosX_Block
CLC
ADC #$0b
SEC
SBC a:SpriteBox_Left
CMP Temp_00
BCS RETURN_8998
LDA a:SpriteBox_Height
CLC
ADC #$1b
STA Temp_00
LDA Player_PosY
CLC
ADC #$1b
SEC
SBC a:SpriteBox_Top
CMP Temp_00
BCS RETURN_8998
LDY CurrentSprites_Entities,X
LDA #$b544,Y
ASL A
TAY
CPY #$10
BCS @_return
LDA #$8959,Y
PHA
LDA #$8958,Y
PHA
@_return:; [$8957]
RTS
;============================================================================
; Handlers for touching entities in the game.
;============================================================================
SPRITE_COLLISION_HANDLERS:; [$8958]
dw Player_HandleTouchEnemy-1
dw Player_HandleTouchBreadOrCoin-1; Coin/meat touched
dw Player_CheckHandlePressUpOnNPC-1; Press Up on NPC
dw $8956; Large animation. Just return.
dw Player_HandleTouchNPC-1; Collide with NPC
dw Player_HandleTouchItem-1; Item touched
dw Player_HandleTouchEnemyMagic-1; Enemy magic touched
dw Player_HandleTouchEnemy-1; Enemy touched
;============================================================================
; Handle touching bread or money.
;
; If touching either of these, the sprite will be removed
; and the handler will be invoked to add HP or gold.
;
; INPUTS:
; X:
; The index of the sprite.
;
;
CurrentSprites_Entities:
; The current sprite entities on the screen.
;
; OUTPUTS:
; None
;
; CALLS:
;
Player_HandleTouchCoin
;
Player_HandleTouchBread
;============================================================================
Player_HandleTouchBreadOrCoin:; [$8968]
;
; Check if this is a gold coin or bread.
;
LDA CurrentSprites_Entities,X; Load the entity for this sprite.
CMP #$01; Is it bread?
BEQ @_isBread; If so, jump.
;
; This is a gold coin.
;
LDA #$ff
STA CurrentSprites_Entities,X; Clear the sprite.
JMP Player_HandleTouchCoin; Handle touching the gold coin.
;
; This is bread.
;
@_isBread:; [$8977]
LDA #$ff
STA CurrentSprites_Entities,X; Clear the sprite.
JMP Player_HandleTouchBread; Handle touching the bread.
;============================================================================
; Handle pressing Up next to an NPC.
;
; This will invoke an IScript for the NPC if the player
; pressed Up.
;
; INPUTS:
; X:
; The index of the sprite.
;
;
Joy1_ChangedButtonMask:
; The newly-changed button mask.
;
;
CurrentSprites_Values:
; The values of the current sprites on screen.
;
; OUTPUTS:
;
CurrentSprite_Value:
; The value of the sprite.
;
; CALLS:
;
MMC1_LoadBankAndJump
;============================================================================
Player_CheckHandlePressUpOnNPC:; [$897f]
;
; Check if Up is pressed.
;
LDA Joy1_ChangedButtonMask; Load the changed button mask.
CMP #$08; Is Up pressed?
BNE RETURN_8998; If not, return.
;
; Up was pressed. Get the value for this sprite. This will
; be used to invoke the sprite's associated IScript.
;
LDA CurrentSprites_Values,X; Load the value for the sprite.
STA a:CurrentSprite_Value; Store it as the current value.
CMP #$ff; Is it 0xFF?
BEQ RETURN_8998; If so, return.
JSR #$f859; Execute the handler.
db BANK_12_LOGIC; Bank = 12
dw IScripts_Begin-1; Address = IScripts_Begin
@_afterFarJump:; [$8995]
LDX a:CurrentSpriteIndex; X = current sprite index
RETURN_8998:; [$8998]
RTS
;============================================================================
; Handle touching an enemy's magic.
;
; If the player is not invincible via iframes or Ointment,
; this will trigger the same damage process as if the
; player touched the enemy directly.
;
; INPUTS:
; X:
; The index of the sprite.
;
;
Player_InvincibilityPhase:
; The current invincibility phase of the player.
;
;
DurationOintment:
; The remaining duration of any ointment.
;
; OUTPUTS:
;
CurrentSprites_Entities:
; The new entities map with this sprite unset.
;
; CALLS:
;
Player_HandleTouchEnemy
;============================================================================
Player_HandleTouchEnemyMagic:; [$8999]
LDA Player_InvincibilityPhase
BNE RETURN_89AD
LDA a:DurationOintment
BPL RETURN_89AD
JSR Player_HandleTouchEnemy
LDX a:CurrentSpriteIndex
LDA #$ff
STA CurrentSprites_Entities,X
RETURN_89AD:; [$89ad]
RTS
Player_HandleTouchEnemy:; [$89ae]
;
; Check if the player currently has iframes.
;
LDA Player_InvincibilityPhase; Load the invincibility phase.
BEQ @_canTakeDamage; If no iframes are available, begin processing the hit.
RTS; Else, return.
;
; Check if the player has Ointment active.
;
@_canTakeDamage:; [$89b3]
LDA a:DurationOintment; Check the ointment duration.
BPL RETURN_89AD; If there's time left, no damage will be taken. Return.
;
; Process special enemy handling.
;
LDA CurrentSprites_Entities,X; Load the sprite entity that hit the player.
CMP #$05; Is it the Necron Aides?
BNE @_handleDamage; If not, perform standard damage handling.
;
; This is the Necron Aides enemy.
;
LDA CurrentSprites_Phases,X; Load the phase of the enemy.
ORA #$80; Set the 7th bit.
STA CurrentSprites_Phases,X; Store it.
;
; Play the sound effect and process damage.
;
@_handleDamage:; [$89c7]
LDA #$04
JSR #$d0e4; Play the Player Hit sound.
JSR Player_SetDamagedBySprite; Mark the player as damaged and set state.
JMP Player_ApplyDamage; Apply damage.
db $60; [$89d2] byte
SPRITES_FACING_VALUE_TO_OPPOSITE_PLAYER_FACING_BITMASK:; [$89d3]
db $40; [0]:
db $00; [1]:
;============================================================================
; Set the player as damaged by another sprite.
;
; This will set the invincibility phase, giving the
; player iframes.
;
; It will also change the player direction to face
; the enemy, and apply knockback.
;
; INPUTS:
;
Player_Flags:
; The player's current flags.
;
;
Player_StatusFlag:
; The player's status flag.
;
; OUTPUTS:
;
Player_InvincibilityPhase:
; The player's new invincibility phase (60).
;
;
Player_Flags:
; The new player flags, with the facing direction
; changed.
;
;
Player_StatusFlag:
; The new status flag, with knockback applied.
;
; XREFS:
;
Player_HandleHitByMagic
;
Player_HandleTouchEnemy
;============================================================================
Player_SetDamagedBySprite:; [$89d5]
;
; Set the invincibility phase to 60.
;
LDA #$3c
STA Player_InvincibilityPhase; Set iframes to 60.
;
; Set the player's facing direction to face the enemy.
;
LDA CurrentSprites_Flags,X; Load the sprite's current flags.
AND #$01; Grab the direction bit.
TAY; Set to Y.
LDA Player_Flags; Load the player's flags.
AND #$bf; Unset the Facing Right bit.
ORA #$89d3,Y; Set facing to the opposite of the sprite's.
STA Player_Flags; Store it.
;
; Set knockback on the player.
;
LDA Player_StatusFlag; Load the player's status flag.
ORA #$02; Set knockback.
STA Player_StatusFlag; Store it.
RTS
;============================================================================
; Handle the player touching an NPC.
;
; This will invoke an IScript action when colliding
; with the NPC. It's used for the initial screen when
; approaching the walls of Eolis.
;
; INPUTS:
; X:
; The index of the sprite.
;
;
CurrentSprites_Values:
; The values of the current sprites on screen.
;
; OUTPUTS:
;
CurrentSprite_Value:
; The value of this sprite.
;
;
CurrentSprites_Entities:
; The entities of the current sprites on screen.
;
; CALLS:
;
MMC1_LoadBankAndJump
;============================================================================
Player_HandleTouchNPC:; [$89ef]
LDA CurrentSprites_Values,X; Load the value for this sprite.
STA a:CurrentSprite_Value; Store as the current sprite's value.
CMP #$ff; Is it 0xFF (unset)?
BEQ RETURN_8998; If so, return.
JSR #$f859; Else, execute the IScript at that value.
db BANK_12_LOGIC; Bank = 12
dw IScripts_Begin-1; Address = IScripts_Begin
;
; Clear this sprite.
;
@_afterFarJump:; [$89ff]
LDX a:CurrentSpriteIndex; X = current sprite index.
LDA #$ff; A = 0xFF
STA CurrentSprites_Entities,X; Set the entity at that index to 0xFF.
RTS
;============================================================================
; TODO: Document Sprite_GetBounds
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;============================================================================
Sprite_GetBounds:; [$8a08]
LDA #$00
STA Temp_Addr_U
LDA CurrentSprites_Entities,X
ASL A
ROL Temp_Addr_U
ASL A
ROL Temp_Addr_U
ADC #$73
STA Temp_Addr_L
LDA Temp_Addr_U
ADC #$b2
STA Temp_Addr_U
LDA CurrentSprites_Entities,X
CMP #$1f
BEQ @LAB_PRG14__8a2e
CMP #$20
BEQ @LAB_PRG14__8a40
CMP #$21
BNE Sprite_SetBoundsFromTemp
@LAB_PRG14__8a2e:; [$8a2e]
LDA CurrentSprites_Phases,X
CMP #$02
BNE Sprite_SetBoundsFromTemp
LDA #$71
STA Temp_Addr_L
LDA #$8a
STA Temp_Addr_U
JMP Sprite_SetBoundsFromTemp
@LAB_PRG14__8a40:; [$8a40]
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__8a49
CMP #$04
BNE Sprite_SetBoundsFromTemp
@LAB_PRG14__8a49:; [$8a49]
LDA #$75
STA Temp_Addr_L
LDA #$8a
STA Temp_Addr_U
Sprite_SetBoundsFromTemp:; [$8a51]
LDY #$00
LDA CurrentSprites_XPos_Full,X
CLC
ADC (Temp_Addr_L),Y
STA a:SpriteBox_Left
LDA CurrentSprites_YPos,X
CLC
INY
ADC (Temp_Addr_L),Y
STA a:SpriteBox_Top
INY
LDA (Temp_Addr_L),Y
STA a:SpriteBox_Width
INY
LDA (Temp_Addr_L),Y
STA a:SpriteBox_Height
RTS
SPRITE_GETBOUNDS_ADDR1:; [$8a71]
db $30; [0]:
db $08; [1]:
db $f0; [2]:
db $00; [3]:
SPRITE_GETBOUNDS_ADDR2:; [$8a75]
db $20; [0]:
db $10; [1]:
db $f8; [2]:
db $00; [3]:
;============================================================================
; TODO: Document Player_ApplyDamage
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Player_HandleTouchEnemy
;============================================================================
Player_ApplyDamage:; [$8a79]
LDY CurrentSprites_Entities,X
LDA #$b6d7,Y
STA Temp_Addr_U
STA Temp_05
LDA #$00
STA Temp_Addr_L
STA Temp_04
LSR Temp_05
ROR Temp_04
LSR Temp_05
ROR Temp_04
LSR Temp_05
ROR Temp_04
;
; If the player is wearing any armor, apply damage reduction.
;
LDY a:SelectedArmor; Load the current armor.
BEQ @_applyDamage; If it's 0 (leather), then jump.
CPY #$04; Is it > 4 (Battle Suit)?
BCS @_applyDamage; Then jump.
;
; Apply the armor's defense multiplier.
;
LDA #$8ad8,Y; Load the multiplier for this armor.
TAY; Y = A
@LAB_PRG14__8aa2:; [$8aa2]
LDA Temp_Addr_L
SEC
SBC Temp_04
STA Temp_Addr_L
LDA Temp_Addr_U
SBC Temp_05
STA Temp_Addr_U
DEY
BNE @LAB_PRG14__8aa2
@_applyDamage:; [$8ab2]
LDA Temp_Addr_L
STA a:Arg_PlayerHealthDelta_L
LDA Temp_Addr_U
STA a:Arg_PlayerHealthDelta_U
LDA a:SpecialItems
AND #$01
BEQ @LAB_PRG14__8ad4
LDA a:Arg_PlayerHealthDelta_L
SEC
SBC Temp_04
STA a:Arg_PlayerHealthDelta_L
LDA a:Arg_PlayerHealthDelta_U
SBC Temp_05
STA a:Arg_PlayerHealthDelta_U
@LAB_PRG14__8ad4:; [$8ad4]
JMP #$c08e
RETURN_8AD7:; [$8ad7]
RTS
;============================================================================
; Defense multipliers for each armor.
;============================================================================
ARMOR_DEFENSE_MULTIPLIERS:; [$8ad8]
db $00; [0]: Leather (0)
db $01; [1]: Studded Mail (1)
db $02; [2]: Full Plate (2)
db $04; [3]: Battle Suit (4)
Sprite_CheckHitByCastMagic:; [$8adc]
;
; Check if there's a valid cast magic type on screen.
;
LDA a:CastMagic_Type; Load the cast magic type.
CMP #$05; Check against the supported magic types.
BCS RETURN_8AD7; If not, then return.
;
; Check if the currently-processed sprite is visible on screen.
;
LDX a:CurrentSpriteIndex; Get the current sprite.
JSR Sprites_IsSpriteHidden; Check if the sprite is visible.
BNE RETURN_8AD7; If not, return.
;
; Check the sprite type.
;
LDA CurrentSprites_Entities,X; Get the type of this sprite.
CMP #$ff; Is it unset?
BEQ RETURN_8AD7; If so, return.
;
; Check if this is either a standard or big enemy.
;
TAY; Y = A (sprite type)
LDA #$b544,Y; A = Category type of this sprite
BEQ @_isEnemy; If it's a standard enemy, jump.
CMP #$07; Check if it's a big enemy.
BNE CastMagic_HitHandler_NoOp
;
; Check if the magic overlaps the sprite in the X direction.
;
@_isEnemy:; [$8afc]
LDY a:CastMagic_Type; Load the cast magic type.
LDA #$8b73,Y; Load the htbox width for the magic.
STA Temp_01; Store that.
LDY CurrentSprites_HitBoxTypes,X; Load the hitbox type for the sprite.
LDA #$b4d1,Y; Get the width of the sprite.
CLC
ADC Temp_01; Add the hitbox width for this.
STA Temp_00; Store that.
LDA a:CastMagic_XPos_Full; Load the cast magic X position.
CLC
ADC Temp_01; Add the hitbox width.
SEC
SBC CurrentSprites_XPos_Full,X; Subtract the sprite X position.
CMP Temp_00; Compare to the magic hitbox.
BCS CastMagic_HitHandler_NoOp; If it didn't overlap in the X position, return.
;
; Check if the magic overlaps the sprite in the Y direction.
;
LDY a:CastMagic_Type; Load the cast magic type.
LDA #$8b78,Y; Load the hitbox height of the magic.
STA Temp_01; Store that.
LDY CurrentSprites_HitBoxTypes,X; Load the hitbox type for the sprite.
LDA #$b4d8,Y; Get the height of the sprite.
CLC
ADC Temp_01; Add the hitbox height for this.
STA Temp_00; Store that.
LDA a:CastMagic_YPos_Full; Load the cast magic Y position.
CLC
ADC Temp_01; Add the hitbox height.
SEC
SBC CurrentSprites_YPos,X; Subtract the sprite Y position.
CMP Temp_00; Compare to the magic hitbox.
BCS CastMagic_HitHandler_NoOp; If it didn't overlap in the Y position, return.
;
; The magic hit the sprite. Update state on the sprite.
;
LDY a:CastMagic_Type; Load the cast magic type.
LDA #$8b7d,Y; Load the hit behavior for the magic.
STA CurrentSprites_HitByMagicBehavior,X; Store as the hit behavior for the sprite.
LDA #$8b82,Y; Load the hit behavior timeframe for the magic.
STA CurrentSprites_HitByMagicIFrames,X; Store for the sprite.
;
; Update the sprite to face the direction the magic is facing.
;
LDA a:CastMagic_Flags; Load the cast magic flags.
ROL A; Get the facing direction of the magic.
ROL A
ROL A
AND #$01
STA Temp_00; Store that.
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$fe; Clear the facing direction bit.
ORA Temp_00; Set it to match the magic's direction.
STA CurrentSprites_Flags,X; Store it back out.
;
; Give the player credit for hitting the enemy with magic.
;
LDY a:CastMagic_Type; Y = Cast magic type.
JSR Player_HitEnemyWithMagic; Update player state.
;
; Load the magic hit sprite handler for this magic type.
;
LDA a:CastMagic_Type; A = Cast magic type.
ASL A; Update to a word boundary for the lookup table.
TAY; Y = A
LDA #$bb10,Y; Load the next address from the lookup table.
PHA
LDA #$bb0f,Y
PHA
CastMagic_HitHandler_NoOp:; [$8b72]
RTS
;============================================================================
; Hitbox widths for each magic type.
;============================================================================
CAST_MAGIC_HIT_WIDTHS:; [$8b73]
db $0b; [0]: Deluge (11)
db $0b; [1]: Thunder (11)
db $1b; [2]: Fire (27)
db $0b; [3]: Death (11)
db $0b; [4]: Tilte (11)
;============================================================================
; Hitbox widths for each magic type.
;============================================================================
CAST_MAGIC_HIT_HEIGHTS:; [$8b78]
db $0b; [0]: Deluge (11)
db $1b; [1]: Thunder (27)
db $0b; [2]: Fire (11)
db $0b; [3]: Death (11)
db $0b; [4]: Tilte (11)
;============================================================================
; Magic behaviors for each magic type.
;============================================================================
CAST_MAGIC_HIT_BEHAVIORS:; [$8b7d]
db $00; [0]: Deluge (0)
db $01; [1]: Thunder (1)
db $02; [2]: Fire (2)
db $ff; [3]: Death (none)
db $ff; [4]: Tilte (none)
;============================================================================
; Hit iframe time for each magic type.
;============================================================================
CAST_MAGIC_HIT_IFRAMES:; [$8b82]
db $04; [0]: Deluge (4)
db $08; [1]: Thunder (8)
db $ff; [2]: Fire (none)
db $ff; [3]: Death (none)
db $ff; [4]: Tilte (none)
;============================================================================
; Add player experience based on the current sprite.
;
; This will calculate the 24-bit enemy experience for a
; sprite and add it to the player's experience.
;
; INPUTS:
; X:
; The index of the sprite whose experience will be
; added.
;
; OUTPUTS:
; X:
; The current sprite index.
;
;
Temp_Int24:
; #$ed:
; Clobbered.
;
; XREFS:
;
Player_HitEnemyWithMagic
;
Player_HitSpriteWithWeapon
;============================================================================
Player_AddExperienceFromSprite:; [$8b87]
LDY CurrentSprites_Entities,X; Load the current enemy sprite type.
LDA #$b60e,Y; Load the experience for that type.
STA Temp_Int24; Store as the lower byte of the experience.
LDA #$00
STA Temp_Int24.M; Store 0 as the middle byte.
JSR #$f957; Update the player's experience.
LDX a:CurrentSpriteIndex
RTS
;============================================================================
; Handle touching a gold coin.
;
; This will play the sound when picking up a coin,
; update the 24-bit gold amount, and then render to the
; screen.
;
; INPUTS:
; A:
; The index of the coin sprite.
;
; OUTPUTS:
; X:
; The current sprite index.
;
;
Gold_M:
; The new middle byte for the gold.
;
;
Gold:
; The new lower byte for the gold.
;
; CALLS:
;
Sound_PlayEffect
;
UI_DrawGoldValue
;
; XREFS:
;
Player_HandleTouchBreadOrCoin
;============================================================================
Player_HandleTouchCoin:; [$8b9a]
LDA #$09
JSR #$d0e4; Play sound 9 (coin touched).
;
; Update the lower byte of the gold.
;
LDA a:Gold; Load the lower byte of the gold.
CLC
ADC CurrentSprites_Values,X; Add the value of the coin;
Set Carry = overflow.
STA a:Gold; Store as the lower byte.
;
; Update the middle byte of the gold.
;
LDA a:Gold_M; Load the middle byte for the gold.
ADC #$00; Add with carry, set the carry bit if overflow.
STA a:Gold_M; Store as the middle byte.
;
; Update the upper byte of the gold.
;
LDA a:Gold_U; Load the upper byte for the gold.
ADC #$00; Add with carry, set carry bit if overflow.
STA a:Gold_U; Store as the upper byte.
;
; Render and prepare to return.
;
JSR #$f9e7; Render the new gold amount.
LDX a:CurrentSpriteIndex; Set X = current sprite index.
RTS
;============================================================================
; Handle touching bread.
;
; This will play the sound when picking up bread and
; update the player's health.
;
; INPUTS:
; @{symbol CurrentSpriteValues}:
; The values of the current sprites on the screen.
;
; OUTPUTS:
; None.
;
; CALLS:
;
Sound_PlayEffect
;
Player_AddHP
;
; XREFS:
;
Player_HandleTouchBreadOrCoin
;============================================================================
Player_HandleTouchBread:; [$8bc0]
LDA #$1b
JSR #$d0e4; Play sound 0x1B (pick up meat).
LDX a:CurrentSpriteIndex; Load the current sprite index for meat.
LDA CurrentSprites_Values,X; Load the HP value for it.
JSR #$c07b; Add it to the player's HP.
LDX a:CurrentSpriteIndex
RTS
;============================================================================
; TODO: Document CurrentSprite_UpdateState
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Sprites_UpdateAllStates
;
_updateSpriteState [$PRG14::8040]
;============================================================================
CurrentSprite_UpdateState:; [$8bd2]
LDA a:IScript_PortraitID
BPL @_return
;
; Check if this sprite is set.
;
LDX a:CurrentSpriteIndex; X = Current sprite index
LDY CurrentSprites_Entities,X; Y = Current sprite entity
BMI @_return; If unset, return.
;
; Check if this sprite is specifically Tamazutsu. It hides and
; won't be affected when hidden.
;
CPY #$2c; Check the sprite against Tamazutsu.
BEQ @_notTamazutsu; If not, handle the enemy normally.
;
; This is Tamazutsu. Check if it's visible or hiding.
;
JSR Sprites_IsSpriteHidden
BNE @_return
;
; Check the sprites hit counter. We'll do further updating
; for 2 frames, then stop for 2 frames, and rinse and repeat.
;
@_notTamazutsu:; [$8be8]
LDA CurrentSprites_HitCounter,X
AND #$02
BNE @_return
;
; Update sprite state.
;
LDA CurrentSprites_XPos_Full,X
STA Maybe_Arg_CurrentSprite_PosX
LDA CurrentSprites_YPos,X
STA Maybe_Arg_CurrentSprite_PosY
LDA Screen_Maybe_ScrollXCounter
STA Unused_Sprite_ScrollPosX
LDA Player_Something_ScrollPosY
STA Unused_Sprite_ScrollPosY
LDA CurrentSprites_PPUAddrs,X
STA Maybe_CurrentSprite_PPUOffset
JSR CurrentSprite_CalculateVisibility
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Entities,X
ASL A
TAY
LDA #$8088,Y
PHA
LDA #$8087,Y
PHA
@_return:; [$8c17]
RTS
;============================================================================
; A mapping between a sprite's facing bit to a flipmask.
;
; Sprites store a facing bit in bit 0.
;
; Flipmasks store a flip bit in bit 7.
;============================================================================
SPRITES_FACING_TO_FLIPMASK:; [$8c18]
db $00; [0]:
db $40; [1]:
;============================================================================
; TODO: Document CurrentSprite_CalculateVisibility
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CurrentSprite_UpdateState
;============================================================================
CurrentSprite_CalculateVisibility:; [$8c1a]
LDX a:CurrentSpriteIndex
LDA #$00
STA Temp_MovingSpriteVisibility
;
; Get the Y position of the current sprite and store
; as an argument for the ConvertPixelsToBlockPos() call.
;
LDA CurrentSprites_YPos,X
STA Arg_PixelPosY
;
; Get the X position of the current sprite and store
; as an argument for the ConvertPixelsToBlockPos() call.
;
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$04
STA Arg_PixelPosX
;
; Convert to a block position.
;
JSR #$e86c
JSR #$e8c3
CMP #$04
BEQ @LAB_PRG14__8c3e
CMP #$0d
BEQ @LAB_PRG14__8c3e
CMP #$09
BNE @LAB_PRG14__8c44
@LAB_PRG14__8c3e:; [$8c3e]
LDA Temp_MovingSpriteVisibility
ORA #$01
STA Temp_MovingSpriteVisibility
@LAB_PRG14__8c44:; [$8c44]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$0c
STA Arg_PixelPosX
JSR #$e86c
JSR #$e8c3
CMP #$04
BEQ @LAB_PRG14__8c60
CMP #$0d
BEQ @LAB_PRG14__8c60
CMP #$09
BNE @LAB_PRG14__8c66
@LAB_PRG14__8c60:; [$8c60]
LDA Temp_MovingSpriteVisibility
ORA #$02
STA Temp_MovingSpriteVisibility
@LAB_PRG14__8c66:; [$8c66]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Flags,X
AND #$01
BEQ @LAB_PRG14__8c7d
LDA Temp_MovingSpriteVisibility
BEQ Something_SetDAT26
CMP #$03
BEQ Something_SetDAT26
EOR #$03
JMP Something_SetDAT26
@LAB_PRG14__8c7d:; [$8c7d]
LDA Temp_MovingSpriteVisibility
Something_SetDAT26:; [$8c7f]
STA MovingSpriteVisibility
RTS
CurrentSprite_UpdateFlipMask:; [$8c82]
LDA CurrentSprites_Flags,X; Load flags for this sprite.
AND #$01; AND for the facing bit.
TAY; Y = result
LDA #$8c18,Y; Load the bitmask from the mapping table.
STA CurrentSprite_FlipMask; Store it.
RTS
Sprite_EnterNextAppearancePhase:; [$8c8e]
CLC
LDY CurrentSprites_Entities,X
ADC #$8c9f,Y
JMP #$f057
SpriteUpdateHandler_Invisible:; [$8c98]
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
STA MovingSpriteVisibility
RTS
SPRITE_APPEARANCE_PHASE_OFFSETS:; [$8c9f]
db $00; [0]:
db $db; [1]: Bread
db $93; [2]: Dropped coin
db $83; [3]:
db $01; [4]: Raiden
db $05; [5]:
db $07; [6]:
db $0a; [7]:
db $0c; [8]:
db $0e; [9]:
db $ef; [10]:
db $13; [11]:
db $15; [12]:
db $17; [13]:
db $1a; [14]:
db $1d; [15]:
db $21; [16]:
db $71; [17]:
db $6c; [18]:
db $a9; [19]:
db $a9; [20]:
db $23; [21]:
db $00; [22]:
db $26; [23]:
db $29; [24]:
db $2b; [25]:
db $2f; [26]:
db $31; [27]:
db $33; [28]:
db $35; [29]:
db $39; [30]:
db $3c; [31]:
db $3f; [32]:
db $44; [33]:
db $47; [34]:
db $49; [35]:
db $4b; [36]:
db $00; [37]:
db $4f; [38]:
db $52; [39]:
db $54; [40]:
db $00; [41]:
db $58; [42]: Monodron
db $5b; [43]:
db $5d; [44]:
db $79; [45]:
db $75; [46]:
db $64; [47]:
db $7d; [48]:
db $83; [49]:
db $80; [50]:
db $89; [51]:
db $ae; [52]:
db $b1; [53]:
db $b4; [54]:
db $b7; [55]:
db $b9; [56]:
db $bb; [57]:
db $bd; [58]:
db $c1; [59]:
db $c3; [60]:
db $c5; [61]:
db $c7; [62]:
db $c9; [63]:
db $cb; [64]:
db $cd; [65]:
db $cf; [66]:
db $d1; [67]:
db $d3; [68]:
db $d5; [69]:
db $d7; [70]:
db $d9; [71]:
db $dc; [72]:
db $dd; [73]:
db $de; [74]:
db $df; [75]:
db $e0; [76]:
db $e1; [77]:
db $e2; [78]:
db $00; [79]:
db $e3; [80]:
db $f1; [81]:
db $e8; [82]:
db $f3; [83]:
db $95; [84]:
db $f6; [85]:
db $f7; [86]:
db $f8; [87]:
db $f9; [88]:
db $fa; [89]:
db $fb; [90]:
db $e3; [91]:
db $f6; [92]:
db $df; [93]:
db $e0; [94]:
db $dc; [95]:
db $e2; [96]:
db $e8; [97]:
db $e8; [98]:
db $e8; [99]:
db $a9; [100]:
;============================================================================
; TODO: Document SpriteBehavior_MaybeFallingRocks__ClearEntity
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_BounceAndExpire
;============================================================================
SpriteBehavior_MaybeFallingRocks__ClearEntity:; [$8d04]
LDA #$ff
STA CurrentSprites_Entities,X
RTS
;============================================================================
; TODO: Document SpriteBehavior_BounceAndExpire
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5eb]
;============================================================================
SpriteBehavior_BounceAndExpire:; [$8d0a]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__8d22
LDA #$00
STA CurrentSprites_Phases,X
STA CurrentSprites_InternalBehaviorStates,X
STA CurrentSprites_PPUAddrs,X
LDA #$80
STA CurrentSprites_Flags,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__8d22:; [$8d22]
INC CurrentSprites_InternalBehaviorStates,X
BEQ SpriteBehavior_MaybeFallingRocks__ClearEntity
LDY CurrentSprites_Phases,X
BNE @LAB_PRG14__8d4c
LDA #$04
STA a:Arg_DeltaY_Full
LDA #$00
STA a:Arg_DeltaY_Frac
JSR Sprite_MoveVertical
BCC @_return1
INC CurrentSprites_Phases,X
LDA #$20
STA CurrentSprites_BehaviorData3,X
LDA CurrentSprites_Flags,X
AND #$7f
STA CurrentSprites_Flags,X
@_return1:; [$8d4b]
RTS
@LAB_PRG14__8d4c:; [$8d4c]
LDA CurrentSprites_BehaviorData3,X
LDY #$03
JSR Sprites_CalcYFromGravity
LDY #$04
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_MoveVertical
LDA CurrentSprites_Phases,X
TAY
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$1f
BNE @_return2
JSR SpriteAction_FlipYDirection
@_return2:; [$8d6d]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Coin
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::808b]
;============================================================================
SpriteUpdateHandler_Coin:; [$8d6e]
LDA #$00
STA CurrentSprite_FlipMask
LDY #$00
LDA CurrentSprites_InternalBehaviorStates,X
AND #$08
BEQ @LAB_PRG14__8d7c
INY
@LAB_PRG14__8d7c:; [$8d7c]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Raiden
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::808f]
;============================================================================
SpriteUpdateHandler_Enemy_Raiden:; [$8d80]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_Phases,X
CMP #$02
BEQ @LAB_PRG14__8d96
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
@LAB_PRG14__8d96:; [$8d96]
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$01
ORA #$02
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_NecronAides
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a613]
;============================================================================
SpriteBehavior_NecronAides:; [$8da3]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__8db3
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__8db3:; [$8db3]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_Phases,X
BMI @LAB_PRG14__8e0e
LDA CurrentSprites_Flags,X
ROL A
ROL A
AND #$01
TAY
LDA CurrentSprites_YPos,X
CLC
ADC #$8e3a,Y
STA Arg_PixelPosY
LDA CurrentSprites_XPos_Full,X
STA Arg_PixelPosX
JSR #$e86c
JSR #$e8c3
LDX a:CurrentSpriteIndex
CMP #$02
BEQ @LAB_PRG14__8de4
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@LAB_PRG14__8de4:; [$8de4]
LDA a:SpriteUpdateCounter
CMP #$17
BEQ @LAB_PRG14__8def
CMP #$75
BNE @LAB_PRG14__8df7
@LAB_PRG14__8def:; [$8def]
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@LAB_PRG14__8df7:; [$8df7]
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$03
TAY
LDA #$8e3c,Y
STA a:Arg_DeltaY_Frac
LDA #$8e40,Y
STA a:Arg_DeltaY_Full
JMP Sprite_CalculateNewVertPos
@LAB_PRG14__8e0e:; [$8e0e]
JSR Sprites_SetCurrentSpriteCanMove
BCC @LAB_PRG14__8e16
JMP CurrentSprite_HandleFall
@LAB_PRG14__8e16:; [$8e16]
LDA a:SpriteUpdateCounter
CMP #$26
BEQ @LAB_PRG14__8e25
CMP #$48
BEQ @LAB_PRG14__8e25
CMP #$93
BNE @LAB_PRG14__8e2d
@LAB_PRG14__8e25:; [$8e25]
LDA CurrentSprites_Flags,X
EOR #$01
STA CurrentSprites_Flags,X
@LAB_PRG14__8e2d:; [$8e2d]
LDA #$00
STA a:Arg_DeltaX_Frac
LDA #$01
STA a:Arg_DeltaX_Full
JMP Sprites_Something_SomethingAndMoveHoriz
BYTE_ARRAY_PRG14__8e3a:; [$8e3a]
db $ff; [0]:
db $20; [1]:
BYTE_ARRAY_PRG14__8e3c:; [$8e3c]
db $20; [0]:
db $40; [1]:
db $80; [2]:
db $00; [3]:
BYTE_ARRAY_PRG14__8e40:; [$8e40]
db $00; [0]:
db $00; [1]:
db $00; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_NecronAides
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8091]
;============================================================================
SpriteUpdateHandler_Enemy_NecronAides:; [$8e44]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LDY CurrentSprites_Phases,X
BMI @LAB_PRG14__8e52
LSR A
@LAB_PRG14__8e52:; [$8e52]
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Zombie
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8093]
;============================================================================
SpriteUpdateHandler_Enemy_Zombie:; [$8e57]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
JSR Sprite_GetPreviousSpritePhase
LSR A
BCS @LAB_PRG14__8e6f
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$03
TAY
LDA #$8e73,Y
TAY
@LAB_PRG14__8e6f:; [$8e6f]
TYA
JMP Sprite_EnterNextAppearancePhase
SPRITEBEHAVIOR_ENEMY_ZOMBIE_PHASES:; [$8e73]
db $00; [0]:
db $01; [1]:
db $02; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteBehavior_BuzzAround
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a665]
;============================================================================
SpriteBehavior_BuzzAround:; [$8e77]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__8e87
LDA #$00
STA CurrentSprites_Phases,X
STA CurrentSprites_BehaviorData2,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__8e87:; [$8e87]
LDA #$00
STA a:Arg_DeltaX_Frac
LDA #$02
STA a:Arg_DeltaX_Full
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
LDA CurrentSprites_BehaviorData2,X
LSR A
LSR A
LSR A
AND #$07
TAY
LDA #$8eb0,Y
STA a:Arg_DeltaY_Frac
LDA #$8eb8,Y
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertAndFlipIfNeeded
INC CurrentSprites_BehaviorData2,X; Increment the sprite's tick counter.
RTS
SPRITE_BEHAVIOR_BUZZ_AROUND_Y_FRAC:; [$8eb0]
db $00; [0]:
db $00; [1]:
db $80; [2]:
db $40; [3]:
db $00; [4]:
db $40; [5]:
db $80; [6]:
db $00; [7]:
SPRITE_BEHAVIOR_BUZZ_AROUND_X_FRAC:; [$8eb8]
db $02; [0]:
db $01; [1]:
db $00; [2]:
db $00; [3]:
db $00; [4]:
db $00; [5]:
db $00; [6]:
db $01; [7]:
db $ff,$01; [$8ec0] undefined
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Hornet
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8095]
;============================================================================
SpriteUpdateHandler_Enemy_Hornet:; [$8ec2]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Bihoruda
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a615]
;============================================================================
SpriteBehavior_Bihoruda:; [$8ecf]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__8ee1
LDA #$00
STA CurrentSprites_BehaviorData2,X
LDA #$40
STA CurrentSprites_BehaviorData3,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__8ee1:; [$8ee1]
LDA CurrentSprites_BehaviorData2,X
LDY #$02
JSR Sprites_CalcYFromGravity
LDY #$03
JSR Sprites_CalcHorizSpriteMovement
LDA a:Arg_DeltaX_Full
AND #$01
STA a:Arg_DeltaX_Full
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData3,X
LDY #$02
JSR Sprites_CalcYFromGravity
LDY #$03
JSR Sprites_CalcVerticalSpriteMovement
LDA a:Arg_DeltaY_Full
AND #$01
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertAndFlipIfNeeded
INC CurrentSprites_BehaviorData3,X
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Bihoruda
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8097]
;============================================================================
SpriteUpdateHandler_Enemy_Bihoruda:; [$8f18]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_BehaviorData2,X
AND #$7f
SEC
SBC #$30
CMP #$30
BCC @LAB_PRG14__8f2a
INY
@LAB_PRG14__8f2a:; [$8f2a]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Lilith
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a617]
;============================================================================
SpriteBehavior_Lilith:; [$8f2e]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__8f51
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_Phases,X
LDA CurrentSprites_Flags,X
ORA #$80
STA CurrentSprites_Flags,X
LDA #$3c
STA CurrentSprites_InternalBehaviorStates,X
JSR Sprite_SetBehaviorReady
JSR SpriteAction_RandomlyFlipXDirection
@LAB_PRG14__8f51:; [$8f51]
LDY CurrentSprites_Phases,X
BEQ @LAB_PRG14__8f59
JMP SpriteBehavior__8f9a
@LAB_PRG14__8f59:; [$8f59]
LDA #$01
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
LDY #$05
LDA CurrentSprites_BehaviorData3,X
JSR Sprites_CalcYFromGravity
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_CalculateNewVertPos
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$0f
BNE @LAB_PRG14__8f83
JSR SpriteAction_FlipYDirection
@LAB_PRG14__8f83:; [$8f83]
DEC CurrentSprites_InternalBehaviorStates,X
BNE @_return
INC CurrentSprites_Phases,X
JSR SpriteAction_FacePlayerX
JSR SpriteAction_FacePlayerY
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
@_return:; [$8f99]
RTS
SpriteBehavior__8f9a:; [$8f9a]
LDA CurrentSprites_BehaviorData2,X
LDY #$03
JSR Sprites_CalcYFromGravity
LDY #$04
JSR Sprites_CalcHorizSpriteMovement
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
AND #$3f
BNE @LAB_PRG14__8fb7
JSR SpriteAction_FacePlayerX
@LAB_PRG14__8fb7:; [$8fb7]
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
CMP #$27
BEQ @LAB_PRG14__8fc9
LDA #$00
STA CurrentSprites_BehaviorData3,X
JSR SpriteAction_FacePlayerY
@LAB_PRG14__8fc9:; [$8fc9]
LDA #$01
STA a:Arg_DeltaY_Full
LDA #$00
STA a:Arg_DeltaY_Frac
JMP Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
@_return:; [$8fd6]
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
FUN_PRG14__8fd7:; [$8fd7]
LDA #$00
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Lilith
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8099]
;============================================================================
SpriteUpdateHandler_Enemy_Lilith:; [$8fd9]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Yuinaru
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a619]
;============================================================================
SpriteBehavior_Yuinaru:; [$8fe7]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__8ff9
LDA #$00
STA CurrentSprites_BehaviorData2,X
LDA #$80
STA CurrentSprites_BehaviorData3,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__8ff9:; [$8ff9]
LDA CurrentSprites_BehaviorData2,X
LDY #$01
JSR Sprites_CalcYFromGravity
LDY #$03
JSR Sprites_CalcHorizSpriteMovement
LDA a:Arg_DeltaX_Full
AND #$03
STA a:Arg_DeltaX_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
LDY #$02
JSR Sprites_CalcYFromGravity
LDY #$03
JSR Sprites_CalcVerticalSpriteMovement
LDA a:Arg_DeltaY_Full
AND #$01
STA a:Arg_DeltaY_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
INC CurrentSprites_BehaviorData3,X
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Yuinaru
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::809d]
;============================================================================
SpriteUpdateHandler_Enemy_Yuinaru:; [$9033]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_BehaviorData2,X
AND #$08
BEQ @LAB_PRG14__9040
INY
@LAB_PRG14__9040:; [$9040]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Snowman
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::809f]
;============================================================================
SpriteUpdateHandler_Enemy_Snowman:; [$9044]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__905c
TAY
LDA a:SpriteUpdateCounter
LSR A
LSR A
CPY #$01
BNE @LAB_PRG14__9059
LSR A
@LAB_PRG14__9059:; [$9059]
AND #$01
TAY
@LAB_PRG14__905c:; [$905c]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Nash
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a61b]
;============================================================================
SpriteBehavior_Nash:; [$9060]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__906d
LDA #$78
STA CurrentSprites_BehaviorData2,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__906d:; [$906d]
LDY CurrentSprites_Phases,X
BEQ @LAB_PRG14__908f
DEY
BEQ @LAB_PRG14__90ce
DEC CurrentSprites_BehaviorData2,X
BEQ @LAB_PRG14__9084
LDA CurrentSprites_BehaviorData2,X
CMP #$0a
BNE @_return
JMP FUN_PRG14__a0a0
@LAB_PRG14__9084:; [$9084]
LDA #$00
STA CurrentSprites_Phases,X
LDA #$78
STA CurrentSprites_BehaviorData2,X
@_return:; [$908e]
RTS
@LAB_PRG14__908f:; [$908f]
JSR Sprite_SetVisible
DEC CurrentSprites_BehaviorData2,X
BNE @_return1
JSR Sprites_HideSprite
INC CurrentSprites_Phases,X
LDA #$3c
STA CurrentSprites_BehaviorData2,X
LDA Player_Flags
AND #$40
BNE @LAB_PRG14__90bd
LDA Player_PosX_Block
CLC
ADC #$20
STA CurrentSprites_XPos_Full,X
BCS @LAB_PRG14__90b5
CMP #$f0
BCC @_return1
@LAB_PRG14__90b5:; [$90b5]
LDA Player_PosX_Block
SEC
SBC #$20
STA CurrentSprites_XPos_Full,X
RTS
@LAB_PRG14__90bd:; [$90bd]
LDA Player_PosX_Block
SEC
SBC #$20
STA CurrentSprites_XPos_Full,X
BCS @_return1
LDA Player_PosX_Block
CLC
ADC #$20
STA CurrentSprites_XPos_Full,X
@_return1:; [$90cd]
RTS
@LAB_PRG14__90ce:; [$90ce]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE @_return2
LDA #$3c
STA CurrentSprites_BehaviorData2,X
INC CurrentSprites_Phases,X
@_return2:; [$90de]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Nash
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80a1]
;============================================================================
SpriteUpdateHandler_Enemy_Nash:; [$90df]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
BEQ @_return
CMP #$02
BEQ @LAB_PRG14__90f7
LDA a:SpriteUpdateCounter
AND #$04
BNE @_return
LDY #$00
BEQ @LAB_PRG14__910b
@_return:; [$90f6]
RTS
@LAB_PRG14__90f7:; [$90f7]
LDY #$00
LDA CurrentSprites_BehaviorData2,X
SEC
SBC #$0a
CMP #$28
BCS @LAB_PRG14__910b
LDY #$01
CMP #$14
BCS @LAB_PRG14__910b
LDY #$02
@LAB_PRG14__910b:; [$910b]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_FireGiant
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80a3]
;============================================================================
SpriteUpdateHandler_Enemy_FireGiant:; [$910f]
JSR CurrentSprite_UpdateFlipMask
LDY #$02
LDA CurrentSprites_Phases,X
CMP #$02
BNE @LAB_PRG14__9125
LDY #$00
LDA a:SpriteUpdateCounter
AND #$04
BEQ @LAB_PRG14__9125
INY
@LAB_PRG14__9125:; [$9125]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Ishiisu
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a667]
;============================================================================
SpriteBehavior_Ishiisu:; [$9129]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9136
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9136:; [$9136]
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__9176
LDA CurrentSprites_XPos_Full,X
SEC
SBC Player_PosX_Block
BCS @LAB_PRG14__9147
EOR #$ff
ADC #$01
@LAB_PRG14__9147:; [$9147]
CMP #$20
BCC @LAB_PRG14__915e
JSR SpriteAction_FacePlayerX
LDA #$c0
STA a:Arg_DeltaX_Frac
LDA #$00
STA a:Arg_DeltaX_Full
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
JMP FUN_PRG14__8507
@LAB_PRG14__915e:; [$915e]
LDA CurrentSprites_Flags,X
AND #$01
TAY
LDA Player_Flags
AND #$40
EOR #$918c,Y
BNE @_return1
INC CurrentSprites_Phases,X
LDA #$1e
STA CurrentSprites_BehaviorData2,X
@_return1:; [$9175]
RTS
@LAB_PRG14__9176:; [$9176]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
BEQ @LAB_PRG14__9188
CMP #$14
BNE @_return2
JMP FUN_PRG14__a0a0
@LAB_PRG14__9188:; [$9188]
INC CurrentSprites_Phases,X
@_return2:; [$918b]
RTS
BYTE_ARRAY_PRG14__918c:; [$918c]
db $40; [0]:
db $00; [1]:
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Ishiisu
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80a5]
;============================================================================
SpriteUpdateHandler_Enemy_Ishiisu:; [$918e]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__91a4
LDY #$00
LDA a:SpriteUpdateCounter
AND #$04
BEQ @LAB_PRG14__91af
LDY #$01
BNE @LAB_PRG14__91af
@LAB_PRG14__91a4:; [$91a4]
LDY #$02
LDA CurrentSprites_BehaviorData2,X
CMP #$14
BCS @LAB_PRG14__91af
LDY #$03
@LAB_PRG14__91af:; [$91af]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_ExecutionHood
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a669]
;============================================================================
SpriteBehavior_ExecutionHood:; [$91b3]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__91c3
LDA #$00
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__91c3:; [$91c3]
LDA CurrentSprites_Phases,X
AND #$03
CMP #$03
BEQ @LAB_PRG14__920b
LDA #$80
STA a:Arg_DeltaX_Frac
LDA #$00
STA a:Arg_DeltaX_Full
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
LDA CurrentSprites_BehaviorData3,X
LDY #$05
JSR Sprites_CalcYFromGravity
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
LDA #$00
STA a:Arg_DeltaY_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$07
BNE @LAB_PRG14__91fb
JSR SpriteAction_FlipYDirection
@LAB_PRG14__91fb:; [$91fb]
LDA CurrentSprites_BehaviorData3,X
AND #$0f
BNE @_return1
INC CurrentSprites_Phases,X
LDA #$0f
STA CurrentSprites_BehaviorData2,X
@_return1:; [$920a]
RTS
@LAB_PRG14__920b:; [$920b]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE @_return2
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData3,X
JMP FUN_PRG14__a093
@_return2:; [$921e]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_ExecutionHood
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80a7]
;============================================================================
SpriteUpdateHandler_Enemy_ExecutionHood:; [$921f]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_Phases,X
AND #$03
CMP #$03
BNE @LAB_PRG14__9235
LDA a:SpriteUpdateCounter
AND #$04
BEQ @LAB_PRG14__9235
INY
@LAB_PRG14__9235:; [$9235]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document BScript_Action_CastMagic
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
BSCRIPT_ACTIONS [$PRG14::a7a2]
;============================================================================
BScript_Action_CastMagic:; [$9239]
JSR Sprites_HasMaxOnScreen
BCS @_return
LDA CurrentSprites_Flags,X
AND #$01
STA CurrentSprites_Flags,Y
LDA CurrentSprites_XPos_Full,X
STA CurrentSprites_XPos_Full,Y
LDA CurrentSprites_YPos,X
CLC
ADC #$08
STA CurrentSprites_YPos,Y
LDA #$54
STA CurrentSprites_Entities,Y
LDA #$00
STA CurrentSprites_PPUAddrs,Y
JMP Sprite_Maybe_ResetState
@_return:; [$9260]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Charron
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80b1]
;============================================================================
SpriteUpdateHandler_Enemy_Charron:; [$9261]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__927b
CMP #$05
BEQ @LAB_PRG14__9280
LSR A
BCS @LAB_PRG14__927b
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$01
JMP @LAB_PRG14__927d
@LAB_PRG14__927b:; [$927b]
LDA #$01
@LAB_PRG14__927d:; [$927d]
JMP Sprite_EnterNextAppearancePhase
@LAB_PRG14__9280:; [$9280]
LDA #$02
BNE @LAB_PRG14__927d
;============================================================================
; TODO: Document _thunk_Sprite_ClearBehaviorReadyAndSetSubtypeBit7
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a623]
;============================================================================
_thunk_Sprite_ClearBehaviorReadyAndSetSubtypeBit7:; [$9284]
JMP Sprite_FinishBehavior
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Geributa
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80b5]
;============================================================================
SpriteUpdateHandler_Enemy_Geributa:; [$9287]
JSR CurrentSprite_UpdateFlipMask
LDY #$02
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__929b
LDY #$00
LDA a:SpriteUpdateCounter
AND #$04
BEQ @LAB_PRG14__929b
INY
@LAB_PRG14__929b:; [$929b]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Sugata
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80b7]
;============================================================================
SpriteUpdateHandler_Enemy_Sugata:; [$929f]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__92ac
INY
@LAB_PRG14__92ac:; [$92ac]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Grimlock
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80b9]
;============================================================================
SpriteUpdateHandler_Enemy_Grimlock:; [$92b0]
JSR CurrentSprite_UpdateFlipMask
LDY #$03
LDA CurrentSprites_Phases,X
CMP #$09
BEQ @LAB_PRG14__92d8
CMP #$0b
BEQ @LAB_PRG14__92d8
LDY #$00
CMP #$08
BCC @LAB_PRG14__92d8
TAY
LDA a:SpriteUpdateCounter
CPY #$0b
BEQ @LAB_PRG14__92cf
LSR A
@LAB_PRG14__92cf:; [$92cf]
LSR A
LSR A
AND #$03
TAY
LDA #$92dc,Y
TAY
@LAB_PRG14__92d8:; [$92d8]
TYA
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__92dc:; [$92dc]
db $00; [0]:
db $01; [1]:
db $02; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteBehavior_GiantBees
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a627]
;============================================================================
SpriteBehavior_GiantBees:; [$92e0]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__92ed
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__92ed:; [$92ed]
LDY CurrentSprites_Phases,X
BEQ @LAB_PRG14__92f8
DEY
BEQ @LAB_PRG14__932b
JMP @LAB_PRG14__9360
@LAB_PRG14__92f8:; [$92f8]
LDA #$00
STA a:Arg_DeltaY_Frac
LDA #$04
STA a:Arg_DeltaY_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
LDA CurrentSprites_YPos,X
CMP #$20
BCS @_return1
INC CurrentSprites_Phases,X
LDA #$ff
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
JSR SpriteAction_FacePlayerX
JSR SpriteAction_FacePlayerY
@_return1:; [$931c]
RTS
@LAB_PRG14__931d:; [$931d]
INC CurrentSprites_Phases,X
LDA #$40
STA CurrentSprites_BehaviorData2,X
LDA #$00
STA CurrentSprites_BehaviorData3,X
RTS
@LAB_PRG14__932b:; [$932b]
LDA CurrentSprites_BehaviorData3,X
BEQ @LAB_PRG14__931d
JSR Sprite_CalcDistanceYToPlayer
CMP #$08
BCC @LAB_PRG14__931d
LDA #$00
STA a:Arg_DeltaX_Frac
LDA #$01
STA a:Arg_DeltaX_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz
LDA CurrentSprites_BehaviorData3,X
LDY #$02
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
LDA CurrentSprites_BehaviorData3,X
SEC
SBC #$04
STA CurrentSprites_BehaviorData3,X
BCS @_return2
LDA #$00
STA CurrentSprites_BehaviorData3,X
@_return2:; [$935f]
RTS
@LAB_PRG14__9360:; [$9360]
JSR SpriteAction_FacePlayerX
LDA #$c0
STA a:Arg_DeltaX_Frac
LDA #$00
STA a:Arg_DeltaX_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz
LDA CurrentSprites_BehaviorData3,X
LDY #$04
JSR Sprites_CalcYFromGravity
LDY #$04
JSR Sprites_CalcVerticalSpriteMovement
LDA #$00
STA a:Arg_DeltaY_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$0f
BNE @LAB_PRG14__9397
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@LAB_PRG14__9397:; [$9397]
LDA CurrentSprites_BehaviorData3,X
AND #$7f
BNE @_return
LDA #$00
STA CurrentSprites_Phases,X
LDA CurrentSprites_Flags,X
AND #$7f
STA CurrentSprites_Flags,X
@_return:; [$93ab]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_GiantBees
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80bb]
;============================================================================
SpriteUpdateHandler_Enemy_GiantBees:; [$93ac]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__93b9
INY
@LAB_PRG14__93b9:; [$93b9]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Myconid
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80bd]
;============================================================================
SpriteUpdateHandler_Enemy_Myconid:; [$93bd]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
CMP #$01
BEQ @LAB_PRG14__93d4
CMP #$03
BEQ @LAB_PRG14__93d4
CMP #$05
BEQ @LAB_PRG14__93d4
LDA #$00
JMP Sprite_EnterNextAppearancePhase
@LAB_PRG14__93d4:; [$93d4]
TAY
LDA a:SpriteUpdateCounter
CPY #$05
BEQ @LAB_PRG14__93dd
LSR A
@LAB_PRG14__93dd:; [$93dd]
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Naga
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a629]
;============================================================================
SpriteBehavior_Naga:; [$93e5]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__93f5
LDA #$00
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__93f5:; [$93f5]
JSR SpriteAction_FacePlayerX
LDA CurrentSprites_BehaviorData3,X
LDY #$04
JSR Sprites_CalcYFromGravity
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
LDA a:Arg_DeltaY_Full
AND #$01
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertical
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$1f
BNE @LAB_PRG14__9422
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@LAB_PRG14__9422:; [$9422]
JSR Sprite_CalcDistanceYToPlayer
CMP #$10
BCC @_return
LDA CurrentSprites_Flags,X
PHA
JSR SpriteAction_FacePlayerY
LDA #$00
STA a:Arg_DeltaY_Full
LDA #$c0
STA a:Arg_DeltaY_Frac
JSR Sprite_MoveVertical
PLA
STA CurrentSprites_Flags,X
@_return:; [$9441]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Naga
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80bf]
;============================================================================
SpriteUpdateHandler_Enemy_Naga:; [$9442]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__944f
INY
@LAB_PRG14__944f:; [$944f]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Unused29
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80c1]
;============================================================================
SpriteUpdateHandler_Enemy_Unused29:; [$9453]
JSR CurrentSprite_UpdateFlipMask
LDY #$03
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__946c
CMP #$02
BEQ @LAB_PRG14__9470
LDY #$01
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__946c
LDY #$02
@LAB_PRG14__946c:; [$946c]
TYA
JMP Sprite_EnterNextAppearancePhase
@LAB_PRG14__9470:; [$9470]
LDY #$00
LDA a:SpriteUpdateCounter
AND #$10
BEQ @LAB_PRG14__946c
LDY #$02
BNE @LAB_PRG14__946c
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_GiantStrider
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80c3]
;============================================================================
SpriteUpdateHandler_Enemy_GiantStrider:; [$947d]
JSR CurrentSprite_UpdateFlipMask
LDY #$02
LDA CurrentSprites_Phases,X
CMP #$02
BEQ @LAB_PRG14__9493
LDY #$00
LDA a:SpriteUpdateCounter
AND #$04
BEQ @LAB_PRG14__9493
INY
@LAB_PRG14__9493:; [$9493]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_SirGawaineWolfman
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a637]
;============================================================================
SpriteBehavior_SirGawaineWolfman:; [$9497]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__94a4
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__94a4:; [$94a4]
JSR Sprites_SetCurrentSpriteCanMove
BCC @LAB_PRG14__94ac
JSR CurrentSprite_HandleFall
@LAB_PRG14__94ac:; [$94ac]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_CalcDistanceXToPlayer
CMP #$18
BEQ @_return1
BCC @LAB_PRG14__94d5
JSR SpriteAction_FacePlayerX
LDA #$01
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
LDA a:SpriteUpdateCounter
AND #$08
BEQ @_return1
INC CurrentSprites_Phases,X
@_return1:; [$94d4]
RTS
@LAB_PRG14__94d5:; [$94d5]
LDA #$01
STA CurrentSprites_Phases,X
LDA Player_Flags
AND #$01
BNE @LAB_PRG14__94f3
JSR SpriteAction_FacePlayerX
LDY #$00
LDA a:SpriteUpdateCounter
AND #$10
BEQ @LAB_PRG14__94ee
LDY #$02
@LAB_PRG14__94ee:; [$94ee]
TYA
STA CurrentSprites_Phases,X
RTS
@LAB_PRG14__94f3:; [$94f3]
LDA #$00
STA CurrentSprites_Phases,X
JSR SpriteAction_FacePlayerX
LDA #$02
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
LDA a:SpriteUpdateCounter
AND #$04
BNE @_return2
INC CurrentSprites_Phases,X
@_return2:; [$9512]
RTS
SpriteUpdateHandler_Enemy_SirGawaine_Wolfman:; [$9513]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Maskman
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80c7]
;============================================================================
SpriteUpdateHandler_Enemy_Maskman:; [$951c]
JSR CurrentSprite_UpdateFlipMask
LDY #$04
LDA CurrentSprites_Phases,X
LSR A
BCC @LAB_PRG14__9531
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__9531
INY
@LAB_PRG14__9531:; [$9531]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document thunk_SpriteUpdateHandler_Enemy_SirGawaine_Wolfman
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80c9]
;============================================================================
thunk_SpriteUpdateHandler_Enemy_SirGawaine_Wolfman:; [$9535]
JMP SpriteUpdateHandler_Enemy_SirGawaine_Wolfman
;============================================================================
; TODO: Document SpriteBehavior_Yareeka
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a62b]
;============================================================================
SpriteBehavior_Yareeka:; [$9538]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9548
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9548:; [$9548]
LDY CurrentSprites_Phases,X
CPY #$02
BEQ @LAB_PRG14__9580
DEY
BEQ @LAB_PRG14__9565
JSR FUN_PRG14__9593
LDA CurrentSprites_BehaviorData2,X
CMP #$40
BCC @_return1
INC CurrentSprites_Phases,X
LDA #$40
STA CurrentSprites_BehaviorData2,X
@_return1:; [$9564]
RTS
@LAB_PRG14__9565:; [$9565]
LDA #$02
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
DEC CurrentSprites_BehaviorData2,X
BNE @LAB_PRG14__957f
INC CurrentSprites_Phases,X
LDA #$40
STA CurrentSprites_BehaviorData2,X
@LAB_PRG14__957f:; [$957f]
RTS
@LAB_PRG14__9580:; [$9580]
JSR FUN_PRG14__9593
LDA CurrentSprites_BehaviorData2,X
CMP #$80
BCC @_return2
LDA #$00
STA CurrentSprites_Phases,X
STA CurrentSprites_BehaviorData2,X
@_return2:; [$9592]
RTS
;============================================================================
; TODO: Document FUN_PRG14__9593
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__9699
;
LAB_PRG14__96d5 [$PRG14::96d5]
;
SpriteBehavior_Yareeka
;============================================================================
FUN_PRG14__9593:; [$9593]
LDA CurrentSprites_BehaviorData2,X
INC CurrentSprites_BehaviorData2,X
LDY #$02
JSR Sprites_CalcYFromGravity
LDY #$03
JSR Sprites_CalcHorizSpriteMovement
LDA a:Arg_DeltaX_Full
AND #$01
STA a:Arg_DeltaX_Full
JMP Sprite_MoveHorizAndTurnAroundIfNeeded
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Yareeka
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80cb]
;============================================================================
SpriteUpdateHandler_Enemy_Yareeka:; [$95ae]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__95bc
LDY #$01
@LAB_PRG14__95bc:; [$95bc]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Magman
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a62d]
;============================================================================
SpriteBehavior_Magman:; [$95c0]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__95da
LDA #$3c
STA CurrentSprites_BehaviorData2,X
LDA #$00
STA CurrentSprites_Phases,X
LDA #$d0
STA CurrentSprites_YPos,X
LDA #$f0
STA CurrentSprites_XPos_Full,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__95da:; [$95da]
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__9602
DEC CurrentSprites_BehaviorData2,X
BNE @_return
INC CurrentSprites_Phases,X
LDA #$78
STA CurrentSprites_BehaviorData2,X
LDY #$30
LDA Player_Flags
AND #$40
BNE @LAB_PRG14__95f7
LDY #$d0
@LAB_PRG14__95f7:; [$95f7]
TYA
CLC
ADC Player_PosX_Block
STA CurrentSprites_XPos_Full,X
LDA Player_PosY
STA CurrentSprites_YPos,X
@_return:; [$9601]
RTS
@LAB_PRG14__9602:; [$9602]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE RETURN_961A
INC CurrentSprites_Phases,X
LDA #$3c
STA CurrentSprites_BehaviorData2,X
LDA #$d0
STA CurrentSprites_YPos,X
LDA #$f0
STA CurrentSprites_XPos_Full,X
RETURN_961A:; [$961a]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Magman
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80cd]
;============================================================================
SpriteUpdateHandler_Enemy_Magman:; [$961b]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
LSR A
BCC RETURN_961A
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__962e
INY
@LAB_PRG14__962e:; [$962e]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_EnemyUnused36
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a62f]
;============================================================================
SpriteBehavior_EnemyUnused36:; [$9632]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9644
LDA #$20
STA CurrentSprites_BehaviorData3,X
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9644:; [$9644]
LDA CurrentSprites_Phases,X
AND #$03
STA CurrentSprites_Phases,X
LDA CurrentSprites_BehaviorData3,X
LDY #$04
JSR Sprites_CalcYFromGravity
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
LDA a:Arg_DeltaY_Full
AND #$01
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertical
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$1f
BNE @LAB_PRG14__9671
JSR SpriteAction_FlipYDirection
@LAB_PRG14__9671:; [$9671]
LDA CurrentSprites_Phases,X
BNE FUN_PRG14__9699
LDA #$00
STA a:Arg_DeltaX_Full
LDA #$c0
STA a:Arg_DeltaX_Frac
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
JSR Sprite_CalcDistanceYToPlayer
CMP #$20
BCS @_return
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
@_return:; [$9692]
RTS
;============================================================================
; TODO: Document FUN_PRG14__9693
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__9699
;============================================================================
FUN_PRG14__9693:; [$9693]
LDA #$00
STA CurrentSprites_Phases,X
RTS
;============================================================================
; TODO: Document FUN_PRG14__9699
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_EnemyUnused36
;============================================================================
FUN_PRG14__9699:; [$9699]
JSR Sprite_CalcDistanceYToPlayer
CMP #$20
BCS FUN_PRG14__9693
LDY CurrentSprites_Phases,X
CPY #$03
BEQ @LAB_PRG14__96d5
DEY
BEQ @LAB_PRG14__96b8
JSR FUN_PRG14__9593
LDA CurrentSprites_BehaviorData2,X
CMP #$40
BCC @_return
INC CurrentSprites_Phases,X
@_return:; [$96b7]
RTS
@LAB_PRG14__96b8:; [$96b8]
LDA #$02
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
JSR Sprite_CalcDistanceXToPlayer
CMP #$30
BCS @_return
INC CurrentSprites_Phases,X
LDA #$40
STA CurrentSprites_BehaviorData2,X
@_return:; [$96d4]
RTS
@LAB_PRG14__96d5:; [$96d5]
JSR FUN_PRG14__9593
LDA CurrentSprites_BehaviorData2,X
CMP #$40
BCC @_return
LDA #$01
STA CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
@_return:; [$96e9]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Unused36
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80cf]
;============================================================================
SpriteUpdateHandler_Enemy_Unused36:; [$96ea]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
BNE @LAB_PRG14__96f6
LDY #$00
BEQ @LAB_PRG14__96f8
@LAB_PRG14__96f6:; [$96f6]
LDY #$02
@LAB_PRG14__96f8:; [$96f8]
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__9700
INY
@LAB_PRG14__9700:; [$9700]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Ikeda
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80d3]
;============================================================================
SpriteUpdateHandler_Enemy_Ikeda:; [$9704]
JSR CurrentSprite_UpdateFlipMask
LDY #$02
JSR Sprite_GetPreviousSpritePhase
LSR A
BCS @LAB_PRG14__9719
LDY #$00
LDA a:SpriteUpdateCounter
AND #$04
BEQ @LAB_PRG14__9719
INY
@LAB_PRG14__9719:; [$9719]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_EnemyUnused39
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a631]
;============================================================================
SpriteBehavior_EnemyUnused39:; [$971d]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__972d
LDA #$00
STA CurrentSprites_Phases,X
STA CurrentSprites_BehaviorData2,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__972d:; [$972d]
JSR Sprites_SetCurrentSpriteCanMove
BCC @LAB_PRG14__9735
JMP CurrentSprite_HandleFall
@LAB_PRG14__9735:; [$9735]
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$13
BEQ @LAB_PRG14__974b
CMP #$56
BEQ @LAB_PRG14__974b
CMP #$85
BEQ @LAB_PRG14__974b
CMP #$c9
BNE @LAB_PRG14__974e
@LAB_PRG14__974b:; [$974b]
JSR FUN_PRG14__a0a0
@LAB_PRG14__974e:; [$974e]
JSR SpriteAction_FacePlayerX
LDA #$40
STA a:Arg_DeltaX_Frac
LDA #$00
STA a:Arg_DeltaX_Full
JMP Sprite_MoveHorizAndTurnAroundIfNeeded
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Unused39
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80d5]
;============================================================================
SpriteUpdateHandler_Enemy_Unused39:; [$975e]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA a:SpriteUpdateCounter
AND #$10
BNE @LAB_PRG14__976c
LDY #$01
@LAB_PRG14__976c:; [$976c]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Lamprey
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80d7]
;============================================================================
SpriteUpdateHandler_Enemy_Lamprey:; [$9770]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$07
TAY
LDA CurrentSprite_FlipMask
EOR #$9793,Y
STA CurrentSprite_FlipMask
LDA #$978b,Y
TAY
TYA
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__978b:; [$978b]
db $00; [0]:
db $01; [1]:
db $01; [2]:
db $00; [3]:
db $01; [4]:
db $01; [5]:
db $00; [6]:
db $01; [7]:
BYTE_ARRAY_PRG14__9793:; [$9793]
db $00; [0]:
db $00; [1]:
db $40; [2]:
db $40; [3]:
db $40; [4]:
db $00; [5]:
db $00; [6]:
db $40; [7]:
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Monodron
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80db]
;============================================================================
SpriteUpdateHandler_Enemy_Monodron:; [$979b]
JSR CurrentSprite_UpdateFlipMask
JSR Sprite_GetPreviousSpritePhase
AND #$03
TAY
LDA #$97aa,Y
JMP Sprite_EnterNextAppearancePhase
SPRITE_MONODRON_APPEARANCE_PHASES:; [$97aa]
db $00; [0]:
db $02; [1]:
db $00; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteBehavior_EnemyUnused43
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a633]
;============================================================================
SpriteBehavior_EnemyUnused43:; [$97ae]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__97be
LDA #$00
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__97be:; [$97be]
JSR SpriteAction_FacePlayerX
LDA CurrentSprites_BehaviorData3,X
LDY #$04
JSR Sprites_CalcYFromGravity
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
LDA a:Arg_DeltaY_Full
AND #$01
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertical
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$1f
BNE @LAB_PRG14__97eb
LDA CurrentSprites_Flags,X
EOR #$80
STA CurrentSprites_Flags,X
@LAB_PRG14__97eb:; [$97eb]
LDY #$00
LDA Player_Flags
AND #$40
BEQ @LAB_PRG14__97f4
INY
@LAB_PRG14__97f4:; [$97f4]
LDA Player_PosX_Block
CLC
ADC #$9851,Y
SEC
SBC CurrentSprites_XPos_Full,X
BEQ @LAB_PRG14__9820
LDA #$00
ROL A
STA Temp_00
LDA CurrentSprites_Flags,X
PHA
AND #$fe
ORA Temp_00
STA CurrentSprites_Flags,X
LDA #$01
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
PLA
STA CurrentSprites_Flags,X
@LAB_PRG14__9820:; [$9820]
LDA Player_PosY
SEC
SBC #$18
SEC
SBC CurrentSprites_YPos,X
BEQ @_return
TAY
LDA #$00
ROR A
STA Temp_00
CPY #$20
BCC @_return
LDA CurrentSprites_Flags,X
PHA
AND #$7f
ORA Temp_00
STA CurrentSprites_Flags,X
LDA #$01
STA a:Arg_DeltaY_Full
LDA #$00
STA a:Arg_DeltaY_Frac
JSR Sprite_MoveVertical
PLA
STA CurrentSprites_Flags,X
@_return:; [$9850]
RTS
BYTE_ARRAY_PRG14__9851:; [$9851]
db $20; [0]:
BYTE_ARRAY_PRG14__9851_1_:; [$9852]
db $e0; [1]:
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Unused43
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80dd]
;============================================================================
SpriteUpdateHandler_Enemy_Unused43:; [$9853]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__9861
LDY #$01
@LAB_PRG14__9861:; [$9861]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Tamazutsu
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a635]
;============================================================================
SpriteBehavior_Tamazutsu:; [$9865]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9877
LDA #$3c
STA CurrentSprites_BehaviorData2,X
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9877:; [$9877]
JSR SpriteAction_FacePlayerX
LDY CurrentSprites_Phases,X
BEQ @LAB_PRG14__9887
DEY
BEQ @LAB_PRG14__988f
DEY
BEQ @LAB_PRG14__9897
BNE @LAB_PRG14__989f
@LAB_PRG14__9887:; [$9887]
JSR Sprite_SetVisible
LDA #$0b
JMP @LAB_PRG14__98a7
@LAB_PRG14__988f:; [$988f]
JSR Sprite_SetVisible
LDA #$3c
JMP @LAB_PRG14__98a7
@LAB_PRG14__9897:; [$9897]
JSR Sprites_HideSprite
LDA #$0b
JMP @LAB_PRG14__98a7
@LAB_PRG14__989f:; [$989f]
JSR Sprite_SetVisible
LDA #$3c
JMP @LAB_PRG14__98a7
@LAB_PRG14__98a7:; [$98a7]
DEC CurrentSprites_BehaviorData2,X
BNE RETURN_98B2
INC CurrentSprites_Phases,X
STA CurrentSprites_BehaviorData2,X
RETURN_98B2:; [$98b2]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Tamazutsu
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80df]
;============================================================================
SpriteUpdateHandler_Enemy_Tamazutsu:; [$98b3]
LDA CurrentSprites_Phases,X
AND #$03
STA CurrentSprites_Phases,X
JSR CurrentSprite_UpdateFlipMask
LDY CurrentSprites_Phases,X
BEQ @LAB_PRG14__98cb
DEY
BEQ @LAB_PRG14__98dc
DEY
BEQ @LAB_PRG14__98e9
BNE @LAB_PRG14__98f6
@LAB_PRG14__98cb:; [$98cb]
LDA CurrentSprites_BehaviorData2,X
CMP #$1e
BCS RETURN_98B2
LDY #$00
AND #$08
BEQ @LAB_PRG14__9900
LDY #$02
BNE @LAB_PRG14__9900
@LAB_PRG14__98dc:; [$98dc]
LDA CurrentSprites_BehaviorData2,X
LSR A
LSR A
TAY
LDA #$9905,Y
TAY
JMP @LAB_PRG14__9900
@LAB_PRG14__98e9:; [$98e9]
LDY #$0a
LDA CurrentSprites_BehaviorData2,X
AND #$08
BEQ @LAB_PRG14__9900
LDY #$0c
BNE @LAB_PRG14__9900
@LAB_PRG14__98f6:; [$98f6]
LDA CurrentSprites_BehaviorData2,X
LSR A
LSR A
TAY
LDA #$9908,Y
TAY
@LAB_PRG14__9900:; [$9900]
TYA
LSR A
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__9905:; [$9905]
db $08; [0]:
db $06; [1]:
db $04; [2]:
BYTE_ARRAY_PRG14__9908:; [$9908]
db $04; [0]:
db $06; [1]:
db $08; [2]:
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_Rokusutahn
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80a9]
;============================================================================
SpriteUpdateHandler_Boss_Rokusutahn:; [$990b]
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$03
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document FUN_PRG14__9917
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteOp_SwitchBehavior
;============================================================================
FUN_PRG14__9917:; [$9917]
LDA #$00
STA CurrentSprites_HitBoxTypes,X
SEC
LDA CurrentSprites_YPos,X
SBC #$10
STA a:Sprite12BodyPartHandler_3_
SBC #$10
STA a:Sprite12BodyPartHandler_4_
SBC #$10
STA a:Sprite12BodyPartHandler_5_
LDA CurrentSprites_XPos_Full,X
STA a:Sprite12BodyPartHandler
STA a:Sprite12BodyPartHandler_1_
STA a:Sprite12BodyPartHandler_2_
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
LDA #$00
STA CurrentSprites_Phases,X
RTS
CALL_FUN_PRG14__9a3c:; [$9947]
JMP FUN_PRG14__9a3c
;============================================================================
; TODO: Document FUN_PRG14__994a
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
CALL_FUN_PRG14__994a [$PRG14::9a2c]
;============================================================================
FUN_PRG14__994a:; [$994a]
LDA CurrentSprites_Phases,X
CMP #$03
BNE CALL_FUN_PRG14__9a3c
LDA CurrentSprites_InternalBehaviorStates,X
AND #$03
LSR A
BCS @LAB_PRG14__9983
BEQ @LAB_PRG14__996f
INC a:Sprite12BodyPartHandler_2_
DEC a:Sprite12BodyPartHandler_5_
DEC CurrentSprites_BehaviorData2,X
BNE @_return
LDA #$3c
STA CurrentSprites_BehaviorData2,X
INC CurrentSprites_InternalBehaviorStates,X
@_return:; [$996e]
RTS
@LAB_PRG14__996f:; [$996f]
DEC a:Sprite12BodyPartHandler_2_
INC a:Sprite12BodyPartHandler_5_
DEC CurrentSprites_BehaviorData2,X
BNE @_return1
LDA #$3c
STA CurrentSprites_BehaviorData2,X
INC CurrentSprites_InternalBehaviorStates,X
@_return1:; [$9982]
RTS
@LAB_PRG14__9983:; [$9983]
DEC CurrentSprites_BehaviorData2,X
BNE @_return2
INC CurrentSprites_InternalBehaviorStates,X
LDA #$08
STA CurrentSprites_BehaviorData2,X
@_return2:; [$9990]
RTS
;============================================================================
; TODO: Document FUN_PRG14__9991
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CALL_FUN_PRG14__9a2f [$PRG14::9a2f]
;============================================================================
FUN_PRG14__9991:; [$9991]
LDA CurrentSprites_BehaviorData2,X
BEQ FUN_PRG14__99f3
LDA CurrentSprites_InternalBehaviorStates,X
AND #$0f
BNE @LAB_PRG14__99dc
LDA CurrentSprites_InternalBehaviorStates,X
BNE @LAB_PRG14__99b6
LDA CurrentSprites_XPos_Full,X
LSR A
LSR A
LSR A
LSR A
STA Temp_00
LDA CurrentSprites_YPos,X
AND #$f0
ORA Temp_00
STA a:BYTE_03cf
JMP @LAB_PRG14__99d1
@LAB_PRG14__99b6:; [$99b6]
LSR A
LSR A
LSR A
LSR A
AND #$03
TAY
DEY
LDA Sprite12BodyPartHandler,Y
LSR A
LSR A
LSR A
LSR A
STA Temp_00
LDA #$037c,Y
AND #$f0
ORA Temp_00
STA a:BYTE_03cf
@LAB_PRG14__99d1:; [$99d1]
LDY Area_CurrentArea
LDA #$99ef,Y
STA a:BYTE_03ce
JSR #$d7b0
@LAB_PRG14__99dc:; [$99dc]
LDX a:CurrentSpriteIndex
INC CurrentSprites_InternalBehaviorStates,X
LDA CurrentSprites_InternalBehaviorStates,X
AND #$c0
BEQ @_return
LDA #$ff
STA CurrentSprites_Entities,X
@_return:; [$99ee]
RTS
BYTE_ARRAY_PRG14__99ef:; [$99ef]
db $00; [0]:
db $08; [1]:
db $00; [2]:
db $00; [3]:
;============================================================================
; TODO: Document FUN_PRG14__99f3
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__9991
;============================================================================
FUN_PRG14__99f3:; [$99f3]
LDY #$03
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$0f
CMP a:Sprite12BodyPartHandler
BCC @LAB_PRG14__9a03
INC a:Sprite12BodyPartHandler
DEY
@LAB_PRG14__9a03:; [$9a03]
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$1f
CMP a:Sprite12BodyPartHandler_1_
BCC @LAB_PRG14__9a11
INC a:Sprite12BodyPartHandler_1_
DEY
@LAB_PRG14__9a11:; [$9a11]
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$2f
CMP a:Sprite12BodyPartHandler_2_
BCC @LAB_PRG14__9a1f
INC a:Sprite12BodyPartHandler_2_
DEY
@LAB_PRG14__9a1f:; [$9a1f]
CPY #$03
BNE @LAB_PRG14__9a2b
INC CurrentSprites_BehaviorData2,X
LDA #$00
STA CurrentSprites_InternalBehaviorStates,X
@LAB_PRG14__9a2b:; [$9a2b]
RTS
CALL_FUN_PRG14__994a:; [$9a2c]
JMP FUN_PRG14__994a
CALL_FUN_PRG14__9a2f:; [$9a2f]
JMP FUN_PRG14__9991
;============================================================================
; TODO: Document SpriteBehavior_EnemyUnused18
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5f3]
;============================================================================
SpriteBehavior_EnemyUnused18:; [$9a32]
LDY CurrentSprites_Phases,X
BMI CALL_FUN_PRG14__9a2f
LDA CurrentSprites_BehaviorData3,X
BNE CALL_FUN_PRG14__994a
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document FUN_PRG14__9a3c
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__994a
;============================================================================
FUN_PRG14__9a3c:; [$9a3c]
LDA CurrentSprites_Phases,X
AND #$03
STA CurrentSprites_Phases,X
ASL A
TAY
LDA #$9a50,Y
PHA
LDA #$9a4f,Y
PHA
RTS
USHORT_ARRAY_PRG14__9a4f:; [$9a4f]
dw FUN_PRG14__9a57-1; [0]:
dw FUN_PRG14__9a7a-1; [1]:
dw FUN_PRG14__9a7a-1; [2]:
dw FUN_PRG14__9a57-1; [3]:
;============================================================================
; TODO: Document FUN_PRG14__9a57
;
; INPUTS:
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
USHORT_ARRAY_PRG14__9a4f [$PRG14::9a4f]
;
USHORT_ARRAY_PRG14__9a4f [$PRG14::9a55]
;============================================================================
FUN_PRG14__9a57:; [$9a57]
JSR FUN_PRG14__9a87
LDX #$9a91,Y
DEX
INC Sprite12BodyPartHandler,X
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document FUN_PRG14__9a61
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__9a7a
;============================================================================
FUN_PRG14__9a61:; [$9a61]
LDX a:CurrentSpriteIndex
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$40
BCC @_return
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
JMP FUN_PRG14__9aa1
@_return:; [$9a79]
RTS
;============================================================================
; TODO: Document FUN_PRG14__9a7a
;
; INPUTS:
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
USHORT_ARRAY_PRG14__9a4f [$PRG14::9a51]
;
USHORT_ARRAY_PRG14__9a4f [$PRG14::9a53]
;============================================================================
FUN_PRG14__9a7a:; [$9a7a]
JSR FUN_PRG14__9a87
LDX #$9a99,Y
DEX
DEC Sprite12BodyPartHandler,X
JMP FUN_PRG14__9a61
;============================================================================
; TODO: Document FUN_PRG14__9a87
;
; INPUTS:
; X
;
; OUTPUTS:
; A
;
; XREFS:
;
FUN_PRG14__9a57
;
FUN_PRG14__9a7a
;============================================================================
FUN_PRG14__9a87:; [$9a87]
LDA CurrentSprites_BehaviorData2,X
LSR A
LSR A
LSR A
AND #$07
TAY
RTS
BYTE_ARRAY_PRG14__9a91:; [$9a91]
db $00; [0]:
db $01; [1]:
db $02; [2]:
db $03; [3]:
db $02; [4]:
db $03; [5]:
db $03; [6]:
db $00; [7]:
BYTE_ARRAY_PRG14__9a99:; [$9a99]
db $00; [0]:
db $03; [1]:
db $03; [2]:
db $02; [3]:
db $03; [4]:
db $02; [5]:
db $01; [6]:
db $00; [7]:
;============================================================================
; TODO: Document FUN_PRG14__9aa1
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__9a61
;============================================================================
FUN_PRG14__9aa1:; [$9aa1]
LDA CurrentSprites_XPos_Full,X
SEC
SBC Player_PosX_Block
BCS @LAB_PRG14__9aac
EOR #$ff
ADC #$01
@LAB_PRG14__9aac:; [$9aac]
CMP #$40
BCS @LAB_PRG14__9ac0
LDA #$01
STA CurrentSprites_BehaviorData3,X
LDA #$00
STA CurrentSprites_InternalBehaviorStates,X
LDA #$08
STA CurrentSprites_BehaviorData2,X
RTS
@LAB_PRG14__9ac0:; [$9ac0]
LDA #$00
STA CurrentSprites_BehaviorData3,X
RTS
;============================================================================
; TODO: Document FUN_PRG14__9ac6
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;============================================================================
FUN_PRG14__9ac6:; [$9ac6]
LDA #$80
STA CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
LDA CurrentSprites_YPos,X
SEC
SBC #$30
STA a:Sprite12BodyPartHandler_5_
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_Unused18
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80ab]
;============================================================================
SpriteUpdateHandler_Enemy_Unused18:; [$9adc]
JSR CurrentSprite_UpdateFlipMask
LDA #$04
JSR Sprite_EnterNextAppearancePhase
LDX a:CurrentSpriteIndex
LDA a:Sprite12BodyPartHandler
STA Maybe_Arg_CurrentSprite_PosX
LDA a:Sprite12BodyPartHandler_3_
STA Maybe_Arg_CurrentSprite_PosY
LDA CurrentSprites_PPUAddrs,X
STA Maybe_CurrentSprite_PPUOffset
LDA #$04
JSR Sprite_EnterNextAppearancePhase
LDX a:CurrentSpriteIndex
LDA a:Sprite12BodyPartHandler_1_
STA Maybe_Arg_CurrentSprite_PosX
LDA a:Sprite12BodyPartHandler_4_
STA Maybe_Arg_CurrentSprite_PosY
LDA CurrentSprites_PPUAddrs,X
STA Maybe_CurrentSprite_PPUOffset
LDA #$04
JSR Sprite_EnterNextAppearancePhase
LDX a:CurrentSpriteIndex
LDA a:Sprite12BodyPartHandler_2_
STA Maybe_Arg_CurrentSprite_PosX
LDA a:Sprite12BodyPartHandler_5_
STA Maybe_Arg_CurrentSprite_PosY
LDA CurrentSprites_PPUAddrs,X
STA Maybe_CurrentSprite_PPUOffset
LDA CurrentSprites_BehaviorData3,X
BNE @LAB_PRG14__9b36
LDY #$02
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__9b41
LDY #$03
BNE @LAB_PRG14__9b41
@LAB_PRG14__9b36:; [$9b36]
LDY #$00
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__9b41
LDY #$01
@LAB_PRG14__9b41:; [$9b41]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Ripasheiku_CastMagicOrUpdatePos
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Ripasheiku
;============================================================================
SpriteBehavior_Ripasheiku_CastMagicOrUpdatePos:; [$9b45]
LDA a:SpriteUpdateCounter
AND #$3f
CMP #$20
BNE @LAB_PRG14__9b68
LDA CurrentSprites_Flags,X
AND #$01
TAY
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$9b81,Y
STA a:CurrentSprite_Arg_CastMagicX
LDA CurrentSprites_YPos,X
CLC
ADC #$20
STA a:CurrentSprite_Arg_CastMagicY
JSR Sprite_CastMagic
@LAB_PRG14__9b68:; [$9b68]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE @_return
LDA #$01
STA CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
JSR SpriteAction_FacePlayerX
@_return:; [$9b80]
RTS
BYTE_ARRAY_PRG14__9b81:; [$9b81]
db $10; [0]:
db $00; [1]:
;============================================================================
; TODO: Document SpriteBehavior_Ripasheiku
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5fb]
;============================================================================
SpriteBehavior_Ripasheiku:; [$9b83]
LDA a:Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9b9a
LDA #$03
STA CurrentSprites_HitBoxTypes,X
LDA #$1e
STA CurrentSprites_BehaviorData2,X
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9b9a:; [$9b9a]
LDY CurrentSprites_Phases,X
BEQ @LAB_PRG14__9ba8
DEY
BEQ @LAB_PRG14__9bbc
DEY
BNE SpriteBehavior_Ripasheiku_CastMagicOrUpdatePos
JMP @LAB_PRG14__9c0e
@LAB_PRG14__9ba8:; [$9ba8]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE @_return
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
@_return:; [$9bbb]
RTS
@LAB_PRG14__9bbc:; [$9bbc]
JSR Sprite_MoveHorizOneBlockOrTurnAround
LDA CurrentSprites_Flags,X
AND #$7f
STA CurrentSprites_Flags,X
LDA CurrentSprites_YPos,X
CMP #$30
BCC @LAB_PRG14__9bfe
LDA CurrentSprites_BehaviorData3,X
BPL @LAB_PRG14__9bde
LDA #$04
STA a:Arg_DeltaY_Full
LDA #$00
STA a:Arg_DeltaY_Frac
BEQ @LAB_PRG14__9be8
@LAB_PRG14__9bde:; [$9bde]
LDY #$03
JSR Sprites_CalcYFromGravity
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
@LAB_PRG14__9be8:; [$9be8]
JSR Sprite_MoveVertical
BCS @_return2
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$1f
BNE @_return1
LDA #$ff
STA CurrentSprites_BehaviorData3,X
@_return1:; [$9bfc]
RTS
@_return2:; [$9bfd]
RTS
@LAB_PRG14__9bfe:; [$9bfe]
LDA #$00
STA CurrentSprites_BehaviorData2,X
LDA #$ff
STA CurrentSprites_BehaviorData3,X
INC CurrentSprites_Phases,X
JMP SpriteAction_FacePlayerX
@LAB_PRG14__9c0e:; [$9c0e]
JSR Sprite_MoveHorizOneBlockOrTurnAround
LDA CurrentSprites_Flags,X
ORA #$80
STA CurrentSprites_Flags,X
LDA CurrentSprites_BehaviorData3,X
LDY #$02
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_MoveVertical
BCS @LAB_PRG14__9c31
LDA CurrentSprites_BehaviorData3,X
SEC
SBC #$04
STA CurrentSprites_BehaviorData3,X
BCS @_return3
@LAB_PRG14__9c31:; [$9c31]
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_InternalBehaviorStates,X
JSR SpriteAction_FacePlayerX
@_return3:; [$9c42]
RTS
;============================================================================
; TODO: Document Sprite_MoveHorizOneBlockOrTurnAround
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Ripasheiku
;============================================================================
Sprite_MoveHorizOneBlockOrTurnAround:; [$9c43]
LDA #$01
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_Ripasheiku
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80e1]
;============================================================================
SpriteUpdateHandler_Boss_Ripasheiku:; [$9c51]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__9c6a
CMP #$03
BEQ @LAB_PRG14__9c6e
LDY #$01
LDA a:SpriteUpdateCounter
AND #$08
BEQ @LAB_PRG14__9c6a
LDY #$02
@LAB_PRG14__9c6a:; [$9c6a]
TYA
JMP Sprite_EnterNextAppearancePhase
@LAB_PRG14__9c6e:; [$9c6e]
LDY #$01
LDA a:SpriteUpdateCounter
AND #$20
BEQ @LAB_PRG14__9c6a
LDY #$03
BNE @LAB_PRG14__9c6a
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_Zoradohna
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80e3]
;============================================================================
SpriteUpdateHandler_Boss_Zoradohna:; [$9c7b]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$03
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Borabohra
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5ff]
;============================================================================
SpriteBehavior_Borabohra:; [$9c89]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9c9e
LDA #$02
STA CurrentSprites_HitBoxTypes,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9c9e:; [$9c9e]
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__9cb5
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$14
BCC @_return1
INC CurrentSprites_Phases,X
JSR SpriteAction_FacePlayerX
@_return1:; [$9cb4]
RTS
@LAB_PRG14__9cb5:; [$9cb5]
LDA CurrentSprites_BehaviorData2,X
LDY #$02
JSR Sprites_CalcYFromGravity
LDY #$02
JSR Sprites_CalcHorizSpriteMovement
JSR Sprites_Something_SomethingAndMoveHoriz
INC CurrentSprites_BehaviorData2,X
AND #$7f
BNE @_return2
JSR SpriteAction_FacePlayerX
@_return2:; [$9ccf]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_Borabohra
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80e5]
;============================================================================
SpriteUpdateHandler_Boss_Borabohra:; [$9cd0]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__9ce2
LDA CurrentSprites_BehaviorData2,X
LSR A
LSR A
TAY
JMP @LAB_PRG14__9ced
@LAB_PRG14__9ce2:; [$9ce2]
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$06
CLC
ADC #$08
TAY
@LAB_PRG14__9ced:; [$9ced]
TYA
LSR A
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Pakukame
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a601]
;============================================================================
SpriteBehavior_Pakukame:; [$9cf2]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9d07
LDA #$00
STA CurrentSprites_Phases,X
STA CurrentSprites_BehaviorData2,X
LDA #$04
STA CurrentSprites_HitBoxTypes,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9d07:; [$9d07]
LDA CurrentSprites_Phases,X
CMP #$01
BCS @LAB_PRG14__9d2b
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$40
BCC @_return1
JSR Sprites_HasMaxOnScreen
BCS @_return1
JSR FUN_PRG14__9d78
BCS @_return1
INC CurrentSprites_Phases,X
LDA #$12
JSR #$d0e4
@_return1:; [$9d2a]
RTS
@LAB_PRG14__9d2b:; [$9d2b]
LDA a:SpriteUpdateCounter
AND #$07
BNE @_return2
INC CurrentSprites_Phases,X
LDA CurrentSprites_Phases,X
CMP #$05
BCC @LAB_PRG14__9d45
LDA #$00
STA CurrentSprites_Phases,X
STA CurrentSprites_BehaviorData2,X
@_return2:; [$9d44]
RTS
@LAB_PRG14__9d45:; [$9d45]
CMP #$03
BNE @_return2
JSR Sprites_HasMaxOnScreen
BCS @_return2
LDA CurrentSprites_YPos,X
ADC #$10
STA CurrentSprites_YPos,Y
LDA CurrentSprites_XPos_Full,X
ADC #$08
STA CurrentSprites_XPos_Full,Y
LDA #$9e
STA CurrentSprites_PPUAddrs,Y
LDA #$00
STA CurrentSprites_Flags,Y
LDA #$09
STA CurrentSprites_Entities,Y
TAX
LDA #$b5a9,X
STA CurrentSprites_HP,Y
LDX a:CurrentSpriteIndex
JMP Sprite_Maybe_ResetState
;============================================================================
; TODO: Document FUN_PRG14__9d78
;
; INPUTS:
; None.
;
; OUTPUTS:
; C
;
; XREFS:
;
SpriteBehavior_Pakukame
;============================================================================
FUN_PRG14__9d78:; [$9d78]
LDY #$07
LDA #$00
STA Temp_00
@LAB_PRG14__9d7e:; [$9d7e]
LDA CurrentSprites_Entities,Y
CMP #$09
BNE @LAB_PRG14__9d8f
INC Temp_00
LDA Temp_00
CMP #$03
BCC @LAB_PRG14__9d8f
SEC
RTS
@LAB_PRG14__9d8f:; [$9d8f]
DEY
BPL @LAB_PRG14__9d7e
CLC
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_Pakukame
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80e7]
;============================================================================
SpriteUpdateHandler_Boss_Pakukame:; [$9d94]
LDY #$00
LDA CurrentSprites_Phases,X
BEQ @LAB_PRG14__9d9f
LDY CurrentSprites_Phases,X
DEY
@LAB_PRG14__9d9f:; [$9d9f]
LDA #$9da5,Y
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__9da5:; [$9da5]
db $00; [0]:
db $01; [1]:
db $02; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteBehavior_Zorugeriru
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a603]
;============================================================================
SpriteBehavior_Zorugeriru:; [$9da9]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9dbe
LDA #$04
STA CurrentSprites_HitBoxTypes,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9dbe:; [$9dbe]
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__9de1
DEC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
AND #$0f
BNE @_return
JSR Sprites_HasMaxOnScreen
BCS @_return
JSR FUN_PRG14__9df7
BCS @_return
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
@_return:; [$9de0]
RTS
@LAB_PRG14__9de1:; [$9de1]
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$20
BCC @_return
INC CurrentSprites_Phases,X
LDA #$3c
STA CurrentSprites_BehaviorData2,X
JMP FUN_PRG14__9e13
@_return:; [$9df6]
RTS
;============================================================================
; TODO: Document FUN_PRG14__9df7
;
; INPUTS:
; None.
;
; OUTPUTS:
; C
;
; XREFS:
;
SpriteBehavior_Zorugeriru
;============================================================================
FUN_PRG14__9df7:; [$9df7]
LDY #$07
LDA #$00
STA Temp_00
@LAB_PRG14__9dfd:; [$9dfd]
LDA CurrentSprites_Entities,Y
CMP #$03
BNE @LAB_PRG14__9e0e
INC Temp_00
LDA Temp_00
CMP #$04
BCC @LAB_PRG14__9e0e
SEC
RTS
@LAB_PRG14__9e0e:; [$9e0e]
DEY
BPL @LAB_PRG14__9dfd
CLC
RETURN_9E12:; [$9e12]
RTS
;============================================================================
; TODO: Document FUN_PRG14__9e13
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Zorugeriru
;============================================================================
FUN_PRG14__9e13:; [$9e13]
JSR Sprites_HasMaxOnScreen
BCS RETURN_9E12
LDA #$03
STA CurrentSprites_Entities,Y
LDA #$00
STA CurrentSprites_Phases,Y
STA CurrentSprites_Flags,Y
LDA #$ff
STA CurrentSprites_HitByMagicBehavior,Y
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$10
STA Temp_00
LDA Player_PosX_Block
CMP CurrentSprites_XPos_Full,X
BCC @LAB_PRG14__9e3e
CMP Temp_00
BCS @LAB_PRG14__9e3e
SEC
SBC #$10
@LAB_PRG14__9e3e:; [$9e3e]
STA CurrentSprites_XPos_Full,Y
LDA #$20
STA CurrentSprites_YPos,Y
LDA CurrentSprites_PPUAddrs,X
STA CurrentSprites_PPUAddrs,Y
JMP Sprite_Maybe_ResetState
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_Zorugeriru
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80e9]
;============================================================================
SpriteUpdateHandler_Boss_Zorugeriru:; [$9e4f]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_Phases,X
LSR A
BCC @LAB_PRG14__9e63
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$03
TAY
@LAB_PRG14__9e63:; [$9e63]
LDA #$9e69,Y
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__9e69:; [$9e69]
db $00; [0]:
db $01; [1]:
db $02; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteBehavior_Garbled3
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5ed]
;============================================================================
SpriteBehavior_Garbled3:; [$9e6d]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9e82
LDA #$00
STA CurrentSprites_HitBoxTypes,X
LDA #$00
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9e82:; [$9e82]
LDY CurrentSprites_Phases,X
DEY
BEQ @LAB_PRG14__9ebc
DEY
BEQ @LAB_PRG14__9ed9
LDA CurrentSprites_Flags,X
ORA #$80
STA CurrentSprites_Flags,X
LDA CurrentSprites_BehaviorData3,X
LDY #$05
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_MoveVertical
BCS @LAB_PRG14__9eae
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
CMP #$41
BCC @_return1
DEC CurrentSprites_BehaviorData3,X
RTS
@LAB_PRG14__9eae:; [$9eae]
INC CurrentSprites_Phases,X
LDA #$05
STA CurrentSprites_BehaviorData2,X
LDA #$07
JSR #$d0e4
@_return1:; [$9ebb]
RTS
@LAB_PRG14__9ebc:; [$9ebc]
LDA CurrentSprites_BehaviorData2,X
AND #$01
ASL A
ASL A
SEC
SBC #$02
CLC
ADC CurrentSprites_YPos,X
STA CurrentSprites_YPos,X
DEC CurrentSprites_BehaviorData2,X
BNE @_return2
LDA #$0f
STA CurrentSprites_BehaviorData2,X
INC CurrentSprites_Phases,X
@_return2:; [$9ed8]
RTS
@LAB_PRG14__9ed9:; [$9ed9]
DEC CurrentSprites_BehaviorData2,X
BNE @_return3
LDA #$ff
STA CurrentSprites_Entities,X
@_return3:; [$9ee3]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Garbled03
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::808d]
;============================================================================
SpriteUpdateHandler_Garbled03:; [$9ee4]
JSR CurrentSprite_UpdateFlipMask
LDY #$03
LDA CurrentSprites_Phases,X
CMP #$02
BCC @LAB_PRG14__9eff
LDA CurrentSprites_BehaviorData2,X
CMP #$0a
BCS @LAB_PRG14__9eff
LDY #$03
CMP #$05
BCS @LAB_PRG14__9eff
LDY #$05
@LAB_PRG14__9eff:; [$9eff]
TYA
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_KingGrieve
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a605]
;============================================================================
SpriteBehavior_KingGrieve:; [$9f03]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__9f1d
LDA #$05
STA CurrentSprites_HitBoxTypes,X
LDA #$ff
STA CurrentSprites_BehaviorData3,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__9f1d:; [$9f1d]
LDA CurrentSprites_Phases,X
AND #$03
TAY
BEQ @LAB_PRG14__9f2e
DEY
BEQ SpriteBehavior_KingGrieve_9f65
DEY
BEQ SpriteBehavior_KingGrieve_MoveDown
JMP @LAB_PRG14__9f86
@LAB_PRG14__9f2e:; [$9f2e]
LDA #$01
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
LDA CurrentSprites_Flags,X
ORA #$80
STA CurrentSprites_Flags,X
LDA CurrentSprites_BehaviorData3,X
LDY #$02
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_MoveVertical
BCS @LAB_PRG14__9f5c
LDA CurrentSprites_BehaviorData3,X
SEC
SBC #$02
STA CurrentSprites_BehaviorData3,X
BCC @LAB_PRG14__9f5c
RTS
@LAB_PRG14__9f5c:; [$9f5c]
INC CurrentSprites_Phases,X
LDA #$3c
STA CurrentSprites_BehaviorData2,X
RTS
;============================================================================
; TODO: Document SpriteBehavior_KingGrieve_9f65
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_KingGrieve
;============================================================================
SpriteBehavior_KingGrieve_9f65:; [$9f65]
LDA a:SpriteUpdateCounter
AND #$0f
BNE @LAB_PRG14__9f86
LDA CurrentSprites_Flags,X
AND #$01
TAY
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$9f9c,Y
STA a:CurrentSprite_Arg_CastMagicX
LDA CurrentSprites_YPos,X
CLC
ADC #$04
STA a:CurrentSprite_Arg_CastMagicY
JSR Sprite_CastMagic
@LAB_PRG14__9f86:; [$9f86]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE @LAB_PRG14__9f9b
INC CurrentSprites_Phases,X
LDA #$ff
STA CurrentSprites_BehaviorData3,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
@LAB_PRG14__9f9b:; [$9f9b]
RTS
BYTE_ARRAY_PRG14__9f9c:; [$9f9c]
db $00; [0]:
db $30; [1]:
;============================================================================
; TODO: Document SpriteBehavior_KingGrieve_MoveDown
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_KingGrieve
;============================================================================
SpriteBehavior_KingGrieve_MoveDown:; [$9f9e]
LDA CurrentSprites_Flags,X
AND #$7f
STA CurrentSprites_Flags,X
LDA #$00
STA a:Arg_DeltaY_Frac
LDA #$01
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertical
BCS @LAB_PRG14__9fbb
LDA CurrentSprites_YPos,X
CMP #$10
BCS @LAB_PRG14__9fc3
@LAB_PRG14__9fbb:; [$9fbb]
INC CurrentSprites_Phases,X
LDA #$1e
STA CurrentSprites_BehaviorData2,X
@LAB_PRG14__9fc3:; [$9fc3]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_KingGrieve
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80eb]
;============================================================================
SpriteUpdateHandler_Boss_KingGrieve:; [$9fc4]
JSR CurrentSprite_UpdateFlipMask
LDY #$02
LDA CurrentSprites_Phases,X
AND #$03
BEQ @LAB_PRG14__9fd9
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$03
TAY
@LAB_PRG14__9fd9:; [$9fd9]
LDA #$9fdf,Y
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__9fdf:; [$9fdf]
db $00; [0]:
db $01; [1]:
BYTE_ARRAY_PRG14__9fdf_2_:; [$9fe1]
db $02; [2]:
db $01; [3]:
;============================================================================
; TODO: Document SpriteBehavior_ShadowEura
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a607]
;============================================================================
SpriteBehavior_ShadowEura:; [$9fe3]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a007
LDA #$06
STA CurrentSprites_HitBoxTypes,X
LDA #$00
STA CurrentSprites_InternalBehaviorStates,X
STA CurrentSprites_BehaviorData3,X
STA CurrentSprites_Phases,X
LDA #$14
STA CurrentSprites_BehaviorData2,X
JSR SpriteAction_FacePlayerX
JSR Sprite_SetBehaviorReady
LDA #$0a
STA CurrentMusic
@LAB_PRG14__a007:; [$a007]
JSR SpriteAction_FacePlayerX
LDA CurrentSprites_Phases,X
LSR A
BCS @LAB_PRG14__a053
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$07
BNE @LAB_PRG14__a052
INC CurrentSprites_InternalBehaviorStates,X
LDA CurrentSprites_InternalBehaviorStates,X
CMP #$0a
BCC @LAB_PRG14__a029
LDA #$00
STA CurrentSprites_InternalBehaviorStates,X
@LAB_PRG14__a029:; [$a029]
PHA
CMP #$03
BEQ @LAB_PRG14__a032
CMP #$08
BNE @LAB_PRG14__a035
@LAB_PRG14__a032:; [$a032]
JSR FUN_PRG14__a077
@LAB_PRG14__a035:; [$a035]
PLA
TAY
LDA #$a064,Y
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
DEC CurrentSprites_BehaviorData2,X
BNE @LAB_PRG14__a052
INC CurrentSprites_Phases,X
LDA #$1e
STA CurrentSprites_BehaviorData2,X
@LAB_PRG14__a052:; [$a052]
RTS
@LAB_PRG14__a053:; [$a053]
JSR SpriteAction_FacePlayerX
DEC CurrentSprites_BehaviorData2,X
BNE @_return
INC CurrentSprites_Phases,X
LDA #$14
STA CurrentSprites_BehaviorData2,X
@_return:; [$a063]
RTS
BYTE_ARRAY_PRG14__a064:; [$a064]
db $00; [0]:
db $00; [1]:
db $08; [2]:
db $08; [3]:
db $08; [4]:
db $00; [5]:
db $00; [6]:
db $08; [7]:
db $08; [8]:
db $08; [9]:
;============================================================================
; TODO: Document SpriteUpdateHandler_Boss_ShadowEura
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80ed]
;============================================================================
SpriteUpdateHandler_Boss_ShadowEura:; [$a06e]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_InternalBehaviorStates,X
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document FUN_PRG14__a077
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_ShadowEura
;============================================================================
FUN_PRG14__a077:; [$a077]
LDA CurrentSprites_Flags,X
AND #$01
TAY
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$a091,Y
STA a:CurrentSprite_Arg_CastMagicX
LDA CurrentSprites_YPos,X
CLC
ADC #$10
STA a:CurrentSprite_Arg_CastMagicY
JMP FUN_PRG14__a12d
BYTE_ARRAY_PRG14__a091:; [$a091]
db $00; [0]:
db $20; [1]:
;============================================================================
; TODO: Document FUN_PRG14__a093
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_ExecutionHood
;============================================================================
FUN_PRG14__a093:; [$a093]
JSR Sprites_HasMaxOnScreen
BCS RETURN_A0CA
LDA CurrentSprites_YPos,X
STA CurrentSprites_YPos,Y
JMP FUN_PRG14__a0ad
;============================================================================
; TODO: Document FUN_PRG14__a0a0
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
LAB_PRG14__974b [$PRG14::974b]
;
SpriteBehavior_Ishiisu
;
SpriteBehavior_Nash
;============================================================================
FUN_PRG14__a0a0:; [$a0a0]
JSR Sprites_HasMaxOnScreen
BCS RETURN_A0CA
LDA CurrentSprites_YPos,X
CLC
ADC #$0c
STA CurrentSprites_YPos,Y
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document FUN_PRG14__a0ad
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__a093
;============================================================================
FUN_PRG14__a0ad:; [$a0ad]
LDA #$51
STA CurrentSprites_Entities,Y
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$04
STA CurrentSprites_XPos_Full,Y
LDA CurrentSprites_Flags,X
AND #$01
STA CurrentSprites_Flags,Y
LDA #$00
STA CurrentSprites_PPUAddrs,Y
JMP Sprite_Maybe_ResetState
RETURN_A0CA:; [$a0ca]
RTS
;============================================================================
; TODO: Document SpriteBehavior_EnemyMagic
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a61d]
;
_thunk_SpriteBehavior__a0cb
;============================================================================
SpriteBehavior_EnemyMagic:; [$a0cb]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a0d3
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a0d3:; [$a0d3]
LDA #$02
STA a:Arg_DeltaX_Full
LDA #$00
STA a:Arg_DeltaX_Frac
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz
BCC @_return
LDA #$ff
STA CurrentSprites_Entities,X
@_return:; [$a0e7]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_TODO_Garbled_81
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8129]
;============================================================================
SpriteUpdateHandler_TODO_Garbled_81:; [$a0e8]
LDA #$00
STA CurrentSprite_FlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
Sprite_CastMagic:; [$a0f6]
JSR Sprites_HasMaxOnScreen
BCS @_return
LDA #$0a
STA CurrentSprites_Entities,Y
LDA a:CurrentSprite_Arg_CastMagicX
STA CurrentSprites_XPos_Full,Y
LDA a:CurrentSprite_Arg_CastMagicY
STA CurrentSprites_YPos,Y
LDA CurrentSprites_Flags,X
AND #$01
STA CurrentSprites_Flags,Y
LDA #$80
STA CurrentSprites_PPUAddrs,Y
JMP Sprite_Maybe_ResetState
@_return:; [$a11c]
RTS
;============================================================================
; TODO: Document _thunk_SpriteBehavior__a0cb
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a61f]
;============================================================================
_thunk_SpriteBehavior__a0cb:; [$a11d]
JMP SpriteBehavior_EnemyMagic
;============================================================================
; TODO: Document SpriteUpdateHandler_TODO_Garbled10
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::809b]
;============================================================================
SpriteUpdateHandler_TODO_Garbled10:; [$a120]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document FUN_PRG14__a12d
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__a077
;============================================================================
FUN_PRG14__a12d:; [$a12d]
JSR Sprites_HasMaxOnScreen
BCS @_return
LDA #$53
STA CurrentSprites_Entities,Y
LDA a:CurrentSprite_Arg_CastMagicX
STA CurrentSprites_XPos_Full,Y
LDA a:CurrentSprite_Arg_CastMagicY
STA CurrentSprites_YPos,Y
LDA CurrentSprites_Flags,X
AND #$01
STA CurrentSprites_Flags,Y
LDA #$00
STA CurrentSprites_PPUAddrs,Y
JMP Sprite_Maybe_ResetState
@_return:; [$a153]
RTS
;============================================================================
; TODO: Document SpriteBehavior_Unknown_29
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a621]
;============================================================================
SpriteBehavior_Unknown_29:; [$a154]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a183
LDA #$00
STA CurrentSprites_InternalBehaviorStates,X
LDA CurrentSprites_Flags,X
AND #$01
PHA
JSR SpriteBehavior_Unknown_29_SomeSetup
ASL CurrentSprites_BehaviorState_XFrac,X
ROL CurrentSprites_BehaviorState_XFull,X
ASL CurrentSprites_BehaviorState_YFrac,X
ROL CurrentSprites_BehaviorState_YFull,X
PLA
STA Temp_00
LDA CurrentSprites_Flags,X
AND #$fe
ORA Temp_00
STA CurrentSprites_Flags,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a183:; [$a183]
LDA CurrentSprites_BehaviorState_XFull,X
STA a:Arg_DeltaX_Full
LDA CurrentSprites_BehaviorState_XFrac,X
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
BCS @LAB_PRG14__a1bc
LDA CurrentSprites_BehaviorState_YFull,X
STA a:Arg_DeltaY_Full
LDA CurrentSprites_BehaviorState_YFrac,X
STA a:Arg_DeltaY_Frac
JSR Sprite_MoveVertical
BCS @LAB_PRG14__a1bc
LDA a:SpriteUpdateCounter
AND #$03
BNE @_return
INC CurrentSprites_InternalBehaviorStates,X
LDA CurrentSprites_InternalBehaviorStates,X
CMP #$03
BCC @_return
LDA #$00
STA CurrentSprites_InternalBehaviorStates,X
@_return:; [$a1bb]
RTS
@LAB_PRG14__a1bc:; [$a1bc]
LDA #$ff
STA CurrentSprites_Entities,X
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_TODO_Unknown_83
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::812d]
;============================================================================
SpriteUpdateHandler_TODO_Unknown_83:; [$a1c2]
LDA #$00
STA CurrentSprite_FlipMask
LDA CurrentSprites_InternalBehaviorStates,X
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document FUN_PRG14__a1cc
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;============================================================================
FUN_PRG14__a1cc:; [$a1cc]
JSR Sprites_HasMaxOnScreen
BCS @_return
LDA #$54
STA CurrentSprites_Entities,Y
LDA a:CurrentSprite_Arg_CastMagicX
STA CurrentSprites_XPos_Full,Y
LDA a:CurrentSprite_Arg_CastMagicY
STA CurrentSprites_YPos,Y
LDA CurrentSprites_Flags,X
AND #$01
ORA #$80
STA CurrentSprites_Flags,Y
LDA #$00
STA CurrentSprites_PPUAddrs,Y
JMP Sprite_Maybe_ResetState
@_return:; [$a1f4]
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler_EnemyMagic
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::812f]
;============================================================================
SpriteUpdateHandler_EnemyMagic:; [$a1f5]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$03
JMP Sprite_EnterNextAppearancePhase
Sprite_Maybe_ResetState:; [$a202]
TXA
PHA
LDA CurrentSprites_Entities,Y
ASL A
TAX
LDA #$ad2d,X
STA CurrentSprites_BehaviorAddrs_L,Y
LDA #$ad2e,X
STA CurrentSprites_BehaviorAddrs_U,Y
LDA #$ff
STA CurrentSprites_Behaviors,Y
STA CurrentSprites_HitByMagicBehavior,Y
LDX CurrentSprites_Entities,Y
LDA #$b4df,X
STA CurrentSprites_HitBoxTypes,Y
LDA #$00
STA CurrentSprites_Phases,Y
LDA CurrentSprites_Flags,Y
AND #$bf
STA CurrentSprites_Flags,Y
PLA
TAX
RTS
Sprites_HasMaxOnScreen:; [$a236]
LDY #$07; Y = 7 (our loop counter)
@_loop:; [$a238]
LDA CurrentSprites_Entities,Y; A = sprite entity at X
CMP #$ff; Is it 0xFF (unpopulated)?
BNE @_isPopulated; If not, jump to prepare the next loop.
;
; There's an unpopulated sprite. Return a false result.
;
CLC; Set C = 0
RTS; And return it.
@_isPopulated:; [$a241]
DEY; Y--
BPL @_loop; If >= 0, loop.
;
; All slots are populated. Return a true result.
;
SEC; Set C = 1
RTS; And return it.
;============================================================================
; TODO: Document SpriteBehavior_Ointment
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a639]
;============================================================================
SpriteBehavior_Ointment:; [$a246]
JSR Sprite_IsBehaviorNotReady
BNE Sprite_FallIfNeeded
LDA a:DurationOintment
BMI Sprite_SetReadyAndFallIfNeeded
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document SpriteBehavior_a25f_ClearEntity
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Glove
;============================================================================
SpriteBehavior_a25f_ClearEntity:; [$a250]
LDA #$ff
STA CurrentSprites_Entities,X
RTS
;============================================================================
; TODO: Document Sprite_SetReadyAndFallIfNeeded
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Glove
;
SpriteBehavior_Ointment
;============================================================================
Sprite_SetReadyAndFallIfNeeded:; [$a256]
JSR Sprite_SetBehaviorReady
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document Sprite_FallIfNeeded
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_Glove
;
SpriteBehavior_Ointment
;============================================================================
Sprite_FallIfNeeded:; [$a259]
JSR Sprites_SetCurrentSpriteCanMove
JMP CurrentSprite_HandleFall
;============================================================================
; TODO: Document SpriteBehavior_Glove
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a63b]
;============================================================================
SpriteBehavior_Glove:; [$a25f]
JSR Sprite_IsBehaviorNotReady
BNE Sprite_FallIfNeeded
LDA a:DurationGlove
BMI Sprite_SetReadyAndFallIfNeeded
BPL SpriteBehavior_a25f_ClearEntity
;
; v-- Fall through --v
;
SpriteUpdateHandler_NPC_Walking:; [$a26b]
JSR CurrentSprite_UpdateFlipMask
LDY #$00
LDA CurrentSprites_Phases,X
CMP #$02
BEQ @LAB_PRG14__a280
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
AND #$03
TAY
@LAB_PRG14__a280:; [$a280]
LDA #$a286,Y
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__a286:; [$a286]
db $00; [0]:
db $01; [1]:
db $00; [2]:
db $02; [3]:
;============================================================================
; TODO: Document thunk1_SpriteUpdateHandler_NPC_Walking
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80f1]
;============================================================================
thunk1_SpriteUpdateHandler_NPC_Walking:; [$a28a]
JMP SpriteUpdateHandler_NPC_Walking
;============================================================================
; TODO: Document thunk2_SpriteUpdateHandler_NPC_Walking
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80f3]
;============================================================================
thunk2_SpriteUpdateHandler_NPC_Walking:; [$a28d]
JMP SpriteUpdateHandler_NPC_Walking
;============================================================================
; TODO: Document SpriteUpdateHandler_NPC_ArmorSalesman
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80f5]
;============================================================================
SpriteUpdateHandler_NPC_ArmorSalesman:; [$a290]
LDA #$00
STA CurrentSprite_FlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_NPC_MartialArts
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80f7]
;============================================================================
SpriteUpdateHandler_NPC_MartialArts:; [$a2a0]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_NPC_Priest
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80f9]
;============================================================================
SpriteUpdateHandler_NPC_Priest:; [$a2af]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_NPC_King
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80fb]
;============================================================================
SpriteUpdateHandler_NPC_King:; [$a2be]
LDA #$40
STA CurrentSprite_FlipMask
LDY CurrentSprites_Phases,X
DEY
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$01
CLC
ADC #$a2d6,Y
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__a2d6:; [$a2d6]
db $00; [0]:
db $02; [1]:
;============================================================================
; TODO: Document SpriteUpdateHandler_NPC_MagicTeacher
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::80fd]
;============================================================================
SpriteUpdateHandler_NPC_MagicTeacher:; [$a2d8]
JSR CurrentSprite_UpdateFlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
SpriteUpdateHandler_NPC_KeySalesman_Others:; [$a2e7]
LDA #$40
STA CurrentSprite_FlipMask
;
; v-- Fall through --v
;
FUN_PRG14__a2eb:; [$a2eb]
LDA a:SpriteUpdateCounter
LSR A
LSR A
LSR A
LSR A
AND #$01
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_NPC_Doctor
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::810d]
;============================================================================
SpriteUpdateHandler_NPC_Doctor:; [$a2f7]
LDA #$00
STA CurrentSprite_FlipMask
JMP FUN_PRG14__a2eb
SpriteUpdateHandler_NPC_MeatSalesman_Others:; [$a2fe]
JSR CurrentSprite_UpdateFlipMask
JMP FUN_PRG14__a2eb
;============================================================================
; TODO: Document SpriteUpdateHandler_Enemy_UnusedEyeball_Zozura
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8113]
;
SPRITE_UPDATE_HANDLERS [$PRG14::8115]
;============================================================================
SpriteUpdateHandler_Enemy_UnusedEyeball_Zozura:; [$a304]
JSR CurrentSprite_UpdateFlipMask
JMP FUN_PRG14__a2eb
SpriteUpdateHandler_Item_Standard:; [$a30a]
LDA #$00
STA CurrentSprite_FlipMask
LDA #$00
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteUpdateHandler_Bread
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8089]
;============================================================================
SpriteUpdateHandler_Bread:; [$a313]
LDA #$00
STA Maybe_CurrentSprite_PPUOffset
STA CurrentSprite_FlipMask
LDA #$00
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_Fountain
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a659]
;============================================================================
SpriteBehavior_Fountain:; [$a31e]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a326
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a326:; [$a326]
LDA a:Quests
AND #$07
CMP #$07
BNE @LAB_PRG14__a332
JMP Sprites_HideSprite
@LAB_PRG14__a332:; [$a332]
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteUpdateHandler_Deco_Fountain
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::812b]
;
SpriteUpdateHandler__a5d2
;============================================================================
SpriteUpdateHandler_Deco_Fountain:; [$a335]
LDA #$00
STA CurrentSprite_FlipMask
LDA a:SpriteUpdateCounter
LSR A
LSR A
AND #$03
TAY
LDA #$a347,Y
JMP Sprite_EnterNextAppearancePhase
BYTE_ARRAY_PRG14__a347:; [$a347]
db $04; [0]:
db $05; [1]:
db $06; [2]:
db $05; [3]:
SpriteUpdateHandler_Item_Special:; [$a34b]
LDA #$00
STA CurrentSprite_FlipMask
LDA #$00
JMP Sprite_EnterNextAppearancePhase
;============================================================================
; TODO: Document SpriteBehavior_BattleSuitDroppedByZoradohna
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a63d]
;============================================================================
SpriteBehavior_BattleSuitDroppedByZoradohna:; [$a354]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a377
LDA a:SelectedArmor
CMP #$03
BEQ Sprites_ClearAllEntities
LDY a:NumberOfArmors
@LAB_PRG14__a363:; [$a363]
DEY
BMI @LAB_PRG14__a36f
LDA ArmorInventory,Y
CMP #$03
BEQ Sprites_ClearAllEntities
BNE @LAB_PRG14__a363
@LAB_PRG14__a36f:; [$a36f]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a377:; [$a377]
LDA #$2e
JSR #$efe6
BCC @LAB_PRG14__a381
JMP Sprites_HideSprite
@LAB_PRG14__a381:; [$a381]
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_BattleHelmetDroppedByZoradohna
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a63f]
;============================================================================
SpriteBehavior_BattleHelmetDroppedByZoradohna:; [$a384]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a3a7
LDA a:SelectedShield
CMP #$03
BEQ Sprites_ClearAllEntities
LDY a:NumberOfShields
@LAB_PRG14__a393:; [$a393]
DEY
BMI @LAB_PRG14__a39f
LDA ShieldInventory,Y
CMP #$03
BEQ Sprites_ClearAllEntities
BNE @LAB_PRG14__a393
@LAB_PRG14__a39f:; [$a39f]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a3a7:; [$a3a7]
LDA #$2e
JSR #$efe6
BCC @LAB_PRG14__a3b1
JMP Sprites_HideSprite
@LAB_PRG14__a3b1:; [$a3b1]
JMP Sprite_SetVisible
Sprites_ClearAllEntities:; [$a3b4]
LDY #$07
@_loop:; [$a3b6]
LDA #$ff
STA CurrentSprites_Entities,Y
DEY
BPL @_loop
RTS
;============================================================================
; TODO: Document SpriteBehavior_DragonSlayerDroppedByKingGrieve
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a641]
;============================================================================
SpriteBehavior_DragonSlayerDroppedByKingGrieve:; [$a3bf]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a3e2
LDA a:Player_CurWeapon
CMP #$03
BEQ Sprites_ClearAllEntities
LDY a:NumberOfWeapons
@LAB_PRG14__a3ce:; [$a3ce]
DEY
BMI @LAB_PRG14__a3da
LDA WeaponInventory,Y
CMP #$03
BEQ Sprites_ClearAllEntities
BNE @LAB_PRG14__a3ce
@LAB_PRG14__a3da:; [$a3da]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a3e2:; [$a3e2]
LDA #$32
JSR #$efe6
BCC @LAB_PRG14__a3ec
JMP Sprites_HideSprite
@LAB_PRG14__a3ec:; [$a3ec]
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_MattockDroppedFromRipasheiku
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a643]
;============================================================================
SpriteBehavior_MattockDroppedFromRipasheiku:; [$a3ef]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a406
LDA a:Quests
AND #$10
BEQ @LAB_PRG14__a3fe
JMP Sprites_Remove
@LAB_PRG14__a3fe:; [$a3fe]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a406:; [$a406]
LDA #$2d
JSR #$efe6
BCC @LAB_PRG14__a410
JMP Sprites_HideSprite
@LAB_PRG14__a410:; [$a410]
JMP Sprite_SetVisible
;============================================================================
; ## Behavior $2F: Wing Boots Dropped by Zorugeriru
;
; Shows the sprite on screen only if all conditions are met:
;
; 1. The player has not retrieved the Wingboots from Zorugeriru
; 2. Zorugeriru is not on the screen
;
; Parameters:
; 1. Unused (1 byte)
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a645]
;============================================================================
SpriteBehavior_WingBootsDroppedByZorugeriru:; [$a413]
JSR Sprite_IsBehaviorNotReady; Is the sprite behavior disabled?
BNE @LAB_PRG14__a42a
LDA a:Quests
AND #$08
BEQ @LAB_PRG14__a422
JMP Sprites_Remove
@LAB_PRG14__a422:; [$a422]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a42a:; [$a42a]
LDA #$31
JSR #$efe6
BCC @LAB_PRG14__a434
JMP Sprites_HideSprite
@LAB_PRG14__a434:; [$a434]
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_BlackOnyxDropFromZoradohna
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a647]
;============================================================================
SpriteBehavior_BlackOnyxDropFromZoradohna:; [$a437]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a44e
LDA a:SpecialItems
AND #$01
BEQ @LAB_PRG14__a446
JMP Sprites_Remove
@LAB_PRG14__a446:; [$a446]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a44e:; [$a44e]
LDA #$2e
JSR #$efe6
BCC @LAB_PRG14__a458
JMP Sprites_HideSprite
@LAB_PRG14__a458:; [$a458]
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_PendantDroppedFromRipasheiku
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a649]
;============================================================================
SpriteBehavior_PendantDroppedFromRipasheiku:; [$a45b]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a472
LDA a:SpecialItems
AND #$02
BEQ @LAB_PRG14__a46a
JMP Sprites_Remove
@LAB_PRG14__a46a:; [$a46a]
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a472:; [$a472]
LDA #$2d
JSR #$efe6
BCC @LAB_PRG14__a47c
JMP Sprites_HideSprite
@LAB_PRG14__a47c:; [$a47c]
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_ShowMagicalRod
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a661]
;============================================================================
SpriteBehavior_ShowMagicalRod:; [$a47f]
LDA a:SpecialItems
AND #$04
BEQ @_return
JMP Sprites_Remove
@_return:; [$a489]
RTS
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_50
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a64b]
;============================================================================
SpriteBehavior_RandomlyShowItem_50:; [$a48a]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a49a
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a497
JMP Sprites_Remove
@LAB_PRG14__a497:; [$a497]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a49a:; [$a49a]
JMP Sprite_ShowIfNoEnemies
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_51
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a64d]
;============================================================================
SpriteBehavior_RandomlyShowItem_51:; [$a49d]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a4ad
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a4aa
JMP Sprites_Remove
@LAB_PRG14__a4aa:; [$a4aa]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a4ad:; [$a4ad]
JMP Sprite_ShowIfNoEnemies
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_52
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a64f]
;============================================================================
SpriteBehavior_RandomlyShowItem_52:; [$a4b0]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a4c0
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a4bd
JMP Sprites_Remove
@LAB_PRG14__a4bd:; [$a4bd]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a4c0:; [$a4c0]
JMP Sprite_ShowIfNoEnemies
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_53
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a651]
;============================================================================
SpriteBehavior_RandomlyShowItem_53:; [$a4c3]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a4d3
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a4d0
JMP Sprites_Remove
@LAB_PRG14__a4d0:; [$a4d0]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a4d3:; [$a4d3]
JMP Sprite_ShowIfNoEnemies
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_54
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a653]
;============================================================================
SpriteBehavior_RandomlyShowItem_54:; [$a4d6]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a4e6
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a4e3
JMP Sprites_Remove
@LAB_PRG14__a4e3:; [$a4e3]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a4e6:; [$a4e6]
JMP Sprite_ShowIfNoEnemies
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_56
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a657]
;============================================================================
SpriteBehavior_RandomlyShowItem_56:; [$a4e9]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a4f9
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a4f6
JMP Sprites_Remove
@LAB_PRG14__a4f6:; [$a4f6]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a4f9:; [$a4f9]
JMP Sprite_ShowIfNoEnemies
;============================================================================
; TODO: Document SpriteBehavior_RandomlyShowItem_55
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a655]
;============================================================================
SpriteBehavior_RandomlyShowItem_55:; [$a4fc]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a50c
JSR Screen_Is3Of4Visits
BCC @LAB_PRG14__a509
JMP Sprites_Remove
@LAB_PRG14__a509:; [$a509]
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a50c:; [$a50c]
JMP Sprite_ShowIfNoEnemies
RTS
Sprite_ShowIfNoEnemies:; [$a510]
JSR Sprites_HasAnyEnemyOnScreen; Are there any enemies on screen?
BCC @_hideSprite; If so, jump to hide the sprite.
JMP Sprite_SetVisible; Else, show the sprite.
@_hideSprite:; [$a518]
JMP Sprites_HideSprite; Hide the sprite.
Sprites_MaybeResetPhaseAndEnable:; [$a51b]
LDA #$00
STA CurrentSprites_Phases,X
JMP Sprite_SetBehaviorReady
Sprites_Remove:; [$a523]
LDA #$ff
STA CurrentSprites_Entities,X; Unset the sprite entity.
RTS
Screen_Is3Of4Visits:; [$a529]
INC a:Screen_TrackedVisitCount; Increment the visit count.
LDA a:Screen_TrackedVisitCount; Load it.
CMP #$04; Is it < 4?
BCC @_returnTrue; If so, jump to return true.
LDA #$00; Else, reset the track to 0.
STA a:Screen_TrackedVisitCount; And store as the new count.
CLC; Set C = 0 (false result).
RTS
@_returnTrue:; [$a53a]
SEC; Set C = 1 (true result).
RTS
;============================================================================
; Return whether there are any enemies on screen.
;
; This will check for all current sprites on screen.
; If any are an enemy, this will set Carry to 1.
; Otherwise, Carry will be set to 0.
;
; INPUTS:
;
CurrentSprites_Entities:
; The sprite entities currently on screen.
;
;
SPRITE_CATEGORIES_BY_ENTITY:
; The mapping of sprite entities to categories.
;
; OUTPUTS:
; C:
; 1 = One or more enemies on screen.
; 0 = No enemies on screen.
;
; XREFS:
;
Sprite_ShowIfNoEnemies
;============================================================================
Sprites_HasAnyEnemyOnScreen:; [$a53c]
LDY #$07; Y = 7 (loop counter)
@_loop:; [$a53e]
LDA CurrentSprites_Entities,Y; A = Sprite entity at Y
CMP #$ff; Is it unset?
BEQ @_prepareNextLoop; If it's set, jump to prepare for next loop.
TAX; X = A
LDA #$b544,X; A = Sprite category for entity X
BNE @_prepareNextLoop; If not an enemy, jump to prepare for next loop.
LDX a:CurrentSpriteIndex; Else, restore the X register.
SEC; Set C = 1 (true result).
RTS
@_prepareNextLoop:; [$a550]
DEY; Y--
BPL @_loop; If Y >= 0, loop.
LDX a:CurrentSpriteIndex; Else, restore the X register.
CLC; Set C = 0 (false result).
RTS
;============================================================================
; TODO: Document SpriteBehavior_SpringOfFortress
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a65b]
;============================================================================
SpriteBehavior_SpringOfFortress:; [$a558]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a560
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a560:; [$a560]
LDA CurrentSprites_Phases,X
BNE FUN_PRG14__a59d
LDA a:Quests
AND #$01
BNE FUN_PRG14__a59d
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_SpringOfSky
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a65d]
;============================================================================
SpriteBehavior_SpringOfSky:; [$a56f]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a577
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a577:; [$a577]
LDA CurrentSprites_Phases,X
BNE FUN_PRG14__a59d
LDA a:Quests
AND #$02
BNE FUN_PRG14__a59d
JMP Sprite_SetVisible
;============================================================================
; TODO: Document SpriteBehavior_SpringOfJoker
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a65f]
;============================================================================
SpriteBehavior_SpringOfJoker:; [$a586]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a58e
JSR Sprites_MaybeResetPhaseAndEnable
@LAB_PRG14__a58e:; [$a58e]
LDA CurrentSprites_Phases,X
BNE FUN_PRG14__a59d
LDA a:Quests
AND #$04
BNE FUN_PRG14__a59d
JMP Sprite_SetVisible
FUN_PRG14__a59d:; [$a59d]
JSR Sprites_HideSprite
LDA CurrentSprites_Phases,X
BNE @LAB_PRG14__a5b0
INC CurrentSprites_Phases,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_BehaviorData3,X
@LAB_PRG14__a5b0:; [$a5b0]
LDA CurrentSprites_Phases,X
CMP #$01
BNE Sprite_SetPhase2
INC CurrentSprites_BehaviorData3,X
LDA CurrentSprites_BehaviorData3,X
AND #$03
BNE RETURN_A5CB
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$04
BCS Sprite_SetPhase2
RETURN_A5CB:; [$a5cb]
RTS
;============================================================================
; TODO: Document Sprite_SetPhase2
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__a59d
;============================================================================
Sprite_SetPhase2:; [$a5cc]
LDA #$02
STA CurrentSprites_Phases,X
RTS
;============================================================================
; TODO: Document SpriteUpdateHandler__a5d2
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_UPDATE_HANDLERS [$PRG14::8149]
;
SPRITE_UPDATE_HANDLERS [$PRG14::814b]
;
SPRITE_UPDATE_HANDLERS [$PRG14::814d]
;============================================================================
SpriteUpdateHandler__a5d2:; [$a5d2]
LDA CurrentSprites_Phases,X
BEQ RETURN_A5CB
CMP #$01
BEQ @LAB_PRG14__a5de
JMP SpriteUpdateHandler_Deco_Fountain
@LAB_PRG14__a5de:; [$a5de]
JSR CurrentSprite_UpdateFlipMask
LDA CurrentSprites_BehaviorData2,X
JMP Sprite_EnterNextAppearancePhase
SPRITE_BEHAVIORS:; [$a5e7]
dw SpriteBehavior_MoveTowardPlayer-1; [0]: Common
dw SpriteBehavior_Wait-1; [1]: Common
dw SpriteBehavior_BounceAndExpire-1; [2]: Item: Dropped coin
dw SpriteBehavior_Garbled3-1; [3]:
dw SpriteBehavior_WalkForward-1; [4]: Common
dw $a6ad; [5]:
dw SpriteBehavior_EnemyUnused18-1; [6]:
dw SpriteBehavior_LightningBallOrCharron-1; [7]:
dw SpriteBehavior_LightningBallOrCharron-1; [8]:
dw SpriteBehavior_Hop-1; [9]: Enemy: Monodron
dw SpriteBehavior_Ripasheiku-1; [10]: Boss: Dragon boss guy
dw $a6ad; [11]:
dw SpriteBehavior_Borabohra-1; [12]:
dw SpriteBehavior_Pakukame-1; [13]:
dw SpriteBehavior_Zorugeriru-1; [14]:
dw SpriteBehavior_KingGrieve-1; [15]:
dw SpriteBehavior_ShadowEura-1; [16]:
dw SpriteBehavior_SomethingEyeball_17-1; [17]:
dw SpriteBehavior_SomethingZoradohna_18-1; [18]:
dw SpriteBehavior_MoveVertically-1; [19]:
dw SpriteBehavior__a8d7-1; [20]:
dw SpriteBehavior_Fall-1; [21]: Common
dw SpriteBehavior_NecronAides-1; [22]: Enemy: Necron Aides
dw SpriteBehavior_Bihoruda-1; [23]: Enemy: Bihoruda
dw SpriteBehavior_Lilith-1; [24]: Enemy: Lilith
dw SpriteBehavior_Yuinaru-1; [25]: Enemy: Yuinaru
dw SpriteBehavior_Nash-1; [26]: Enemy: Nash
dw SpriteBehavior_EnemyMagic-1; [27]:
dw _thunk_SpriteBehavior__a0cb-1; [28]:
dw SpriteBehavior_Unknown_29-1; [29]:
dw _thunk_Sprite_ClearBehaviorReadyAndSetSubtypeBit7-1; [30]:
dw SpriteBehavior_FlashScreenHitPlayer-1; [31]:
dw SpriteBehavior_GiantBees-1; [32]: Enemy: Giant Bees
dw SpriteBehavior_Naga-1; [33]: Enemy: Naga
dw SpriteBehavior_Yareeka-1; [34]: Enemy: Yareeka
dw SpriteBehavior_Magman-1; [35]: Enemy: Magman
dw SpriteBehavior_EnemyUnused36-1; [36]: Enemy: Unused 36
dw SpriteBehavior_EnemyUnused39-1; [37]: Enemy: Unused 39
dw SpriteBehavior_EnemyUnused43-1; [38]: Enemy: Unused 43
dw SpriteBehavior_Tamazutsu-1; [39]: Enemy: Tamazutsu
dw SpriteBehavior_SirGawaineWolfman-1; [40]: Enemy: Sir Gawaine
Enemy: Wolfman
dw SpriteBehavior_Ointment-1; [41]: Item: Ointment
dw SpriteBehavior_Glove-1; [42]: Item: Glove
dw SpriteBehavior_BattleSuitDroppedByZoradohna-1; [43]: Item: Battle Suit
dw SpriteBehavior_BattleHelmetDroppedByZoradohna-1; [44]: Item: Battle Helmet
dw SpriteBehavior_DragonSlayerDroppedByKingGrieve-1; [45]: Item: Dragon Slayer
dw SpriteBehavior_MattockDroppedFromRipasheiku-1; [46]: Item: Mattock
dw SpriteBehavior_WingBootsDroppedByZorugeriru-1; [47]: Item: Wing Boots
dw SpriteBehavior_BlackOnyxDropFromZoradohna-1; [48]: Item: Black Onyx
dw SpriteBehavior_PendantDroppedFromRipasheiku-1; [49]: Item: Pendant
dw SpriteBehavior_RandomlyShowItem_50-1; [50]:
dw SpriteBehavior_RandomlyShowItem_51-1; [51]:
dw SpriteBehavior_RandomlyShowItem_52-1; [52]:
dw SpriteBehavior_RandomlyShowItem_53-1; [53]:
dw SpriteBehavior_RandomlyShowItem_54-1; [54]:
dw SpriteBehavior_RandomlyShowItem_55-1; [55]:
dw SpriteBehavior_RandomlyShowItem_56-1; [56]:
dw SpriteBehavior_Fountain-1; [57]: Spring of Fountain
dw SpriteBehavior_SpringOfFortress-1; [58]: Spring of Fortress
dw SpriteBehavior_SpringOfSky-1; [59]: Spring of Sky
dw SpriteBehavior_SpringOfJoker-1; [60]: Spring of Joker
dw SpriteBehavior_ShowMagicalRod-1; [61]: Item: Magical Rod
dw SpriteBehavior_BossDeath-1; [62]: Effect: Boss Death
dw SpriteBehavior_BuzzAround-1; [63]: Enemy: Hornet
dw SpriteBehavior_Ishiisu-1; [64]: Enemy: Ishiisu
dw SpriteBehavior_ExecutionHood-1; [65]: Enemy: Execution Hood
;============================================================================
; TODO: Document Sprites_UpdateBehavior
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
LAB_PRG14__802e [$PRG14::802e]
;============================================================================
Sprites_UpdateBehavior:; [$a66b]
LDA a:DurationHourGlass
BMI @LAB_PRG14__a679
LDY CurrentSprites_Entities,X
LDA #$b544,Y
BNE @LAB_PRG14__a679
;
; This is an enemy sprite, and the Hour Glass is active.
; Don't run any behavior updates.
;
RTS
;
; Set the currently-processing sprite behavior address to
; the one from the current sprites map.
;
@LAB_PRG14__a679:; [$a679]
LDX a:CurrentSpriteIndex
LDA CurrentSprites_BehaviorAddrs_L,X
STA Sprites_ReadInfoAddr
LDA CurrentSprites_BehaviorAddrs_U,X
STA Sprites_ReadInfoAddr.U
JSR Sprites_LoadNextOp
LDA CurrentSprites_Behaviors,X
ASL A
TAY
CPY #$84
BCS @_updateCurrentSprites
LDA #$a6
PHA
LDA #$a0
PHA
LDA #$a5e8,Y
PHA
LDA #$a5e7,Y
PHA
RTS
;
; Update the map of current sprites to sprite behavior addresses
; with the updated address.
;
@_updateCurrentSprites:; [$a6a1]
LDX a:CurrentSpriteIndex
LDA Sprites_ReadInfoAddr
STA CurrentSprites_BehaviorAddrs_L,X
LDA Sprites_ReadInfoAddr.U
STA CurrentSprites_BehaviorAddrs_U,X
RETURN_A6AE:; [$a6ae]
RTS
Sprites_CountdownBehavior:; [$a6af]
LDA CurrentSprites_BehaviorArg1,X
BEQ RETURN_A6AE
DEC CurrentSprites_BehaviorArg1,X
BNE RETURN_A6AE
JMP Sprite_FinishBehavior
Sprites_LoadNextOp:; [$a6bc]
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
CMP #$ff
BEQ @LAB_PRG14__a6cf
ASL A
TAY
LDA #$a6d9,Y
PHA
LDA #$a6d8,Y
PHA
RTS
@LAB_PRG14__a6cf:; [$a6cf]
LDA CurrentSprites_Behaviors,X
AND #$7f
STA CurrentSprites_Behaviors,X
RTS
SPRITE_OPS:; [$a6d8]
dw SpriteOp_SwitchBehavior-1; [0]:
dw SpriteOp_MaybeDisableAndGoTo-1; [1]:
dw SpriteOp_RunAction-1; [2]:
dw SpriteOp_CheckDistanceToPlayer-1; [3]:
dw SpriteOp_FinishBehavior-1; [4]:
dw SpriteOp_GoTo-1; [5]:
dw SpriteOp_AddToSpriteData-1; [6]:
dw SpriteOp_SetPhase-1; [7]:
;============================================================================
; TODO: Document SpriteOp_SetPhase
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6e6]
;============================================================================
SpriteOp_SetPhase:; [$a6e8]
LDA CurrentSprites_Behaviors,X
BMI @LAB_PRG14__a6f0
JMP RETURN_A771
@LAB_PRG14__a6f0:; [$a6f0]
LDY #$01
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_Phases,X
LDA #$02
JSR Sprites_IncrementScriptAddr
JMP Sprites_LoadNextOp
;============================================================================
; TODO: Document SpriteOp_SwitchBehavior
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6d8]
;============================================================================
SpriteOp_SwitchBehavior:; [$a6ff]
LDA CurrentSprites_Behaviors,X
BMI @LAB_PRG14__a707
JMP RETURN_A771
@LAB_PRG14__a707:; [$a707]
INC CurrentSprites_Phases,X
LDA #$01
JSR Sprites_IncrementScriptAddr
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_Behaviors,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorArg1,X
LDA #$02
JSR Sprites_IncrementScriptAddr
LDA CurrentSprites_Behaviors,X
CMP #$06
BNE @_return
JMP FUN_PRG14__9917
@_return:; [$a72b]
RTS
;============================================================================
; TODO: Document SpriteOp_MaybeDisableAndGoTo
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6da]
;============================================================================
SpriteOp_MaybeDisableAndGoTo:; [$a72c]
LDA CurrentSprites_Behaviors,X
BMI Sprites_MaybeDisableAndGoTo
JMP RETURN_A771
;============================================================================
; TODO: Document Sprites_MaybeDisableAndGoTo
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteOp_MaybeDisableAndGoTo
;============================================================================
Sprites_MaybeDisableAndGoTo:; [$a734]
LDA #$01
JSR Sprites_IncrementScriptAddr
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
PHA
INY
LDA (Sprites_ReadInfoAddr),Y
STA Sprites_ReadInfoAddr.U
PLA
STA Sprites_ReadInfoAddr
JSR Sprite_FinishBehavior
JMP Sprites_LoadNextOp
;============================================================================
; TODO: Document SpriteOp_GoTo
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6e2]
;============================================================================
SpriteOp_GoTo:; [$a74c]
LDA CurrentSprites_Behaviors,X
BMI @LAB_PRG14__a754
JMP RETURN_A771
@LAB_PRG14__a754:; [$a754]
LDA #$01
JSR Sprites_IncrementScriptAddr
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
PHA
INY
LDA (Sprites_ReadInfoAddr),Y
STA Sprites_ReadInfoAddr.U
PLA
STA Sprites_ReadInfoAddr
LDA #$00
STA CurrentSprites_Phases,X
JSR Sprite_FinishBehavior
JMP Sprites_LoadNextOp
RETURN_A771:; [$a771]
RTS
;============================================================================
; TODO: Document SpriteOp_RunAction
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6dc]
;============================================================================
SpriteOp_RunAction:; [$a772]
LDA CurrentSprites_Behaviors,X
BPL RETURN_A771
LDY #$01
LDA (Sprites_ReadInfoAddr),Y
ASL A
TAY
LDA #$a7
PHA
LDA #$8b
PHA
LDA #$a795,Y
PHA
LDA #$a794,Y
PHA
RTS
;============================================================================
; TODO: Document Sprites_Maybe_Skip2AndLoadNextAction
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;============================================================================
Sprites_Maybe_Skip2AndLoadNextAction:; [$a78c]
LDA #$02
JSR Sprites_IncrementScriptAddr
JMP Sprites_LoadNextOp
BSCRIPT_ACTIONS:; [$a794]
dw SpriteAction_FacePlayerX-1; [0]: Face Player (X)
dw SpriteAction_FlipXDirection-1; [1]: Flip X Direction
dw SpriteAction_FacePlayerY-1; [2]: Face Player (Y)
dw SpriteAction_FlipYDirection-1; [3]: Flip Y Direction
dw SpriteAction_RandomlyFlipXDirection-1; [4]: Randomly Flip X Direction
dw SpriteAction_RandomlyFlipYDirection-1; [5]: Randomly Flip Y Direction
dw SpriteAction_RiseUp-1; [6]: Rise Up
dw BScript_Action_CastMagic-1; [7]: Cast Magic
;============================================================================
; BScript Action $06: Rise Up
;
; This will clear the Falling flag for the sprite, causing it to rise up.
;
; XREFS:
;
BSCRIPT_ACTIONS [$PRG14::a7a0]
;============================================================================
SpriteAction_RiseUp:; [$a7a4]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$7f; Clear the Falling bit.
STA CurrentSprites_Flags,X; Store it.
RTS
;============================================================================
; BScript Action $04: Randomly flip the X direction.
;
; This will generate a random number. If it's < 128, the sprite will face
; right. Otherwise it will face left.
;
; XREFS:
;
BSCRIPT_ACTIONS [$PRG14::a79c]
;
SpriteBehavior_Lilith
;============================================================================
SpriteAction_RandomlyFlipXDirection:; [$a7ad]
JSR #$ca6e; Load a random value.
LDX a:CurrentSpriteIndex; X = Current sprite index.
CMP #$80; Is the random value < 128?
BCS @_setFaceRight; If so, jump to set facing right.
LDA CurrentSprites_Flags,X; Load the sprite flags.
AND #$fe; Clear the Facing Right bit.
STA CurrentSprites_Flags,X; Store it.
RTS
@_setFaceRight:; [$a7c0]
LDA CurrentSprites_Flags,X; Load the sprite flags.
ORA #$01; Set the Facing Right bit.
STA CurrentSprites_Flags,X; Store it.
RTS
;============================================================================
; BScript Action $05: Randomly flip the Y direction.
;
; This will generate a random number. If it's < 128, the sprite will fall.
; Otherwise it will rise.
;
; XREFS:
;
BSCRIPT_ACTIONS [$PRG14::a79e]
;============================================================================
SpriteAction_RandomlyFlipYDirection:; [$a7c9]
JSR #$ca6e; Load a random value.
LDX a:CurrentSpriteIndex; X = Current sprite index.
CMP #$80; Is the random value < 128?
BCS @_setFalling; If so, jump to set falling.
LDA CurrentSprites_Flags,X; Load the sprite flags.
AND #$7f; Clear the falling bit.
STA CurrentSprites_Flags,X; Store it.
RTS
@_setFalling:; [$a7dc]
LDA CurrentSprites_Flags,X; Load the sprite flags.
ORA #$80; Set the falling bit.
STA CurrentSprites_Flags,X; Store it.
RTS
;============================================================================
; BScript Op $03: Check Distance to Player.
;
; Check if the distance between the player and sprite is
; within or outside the given value.
;
; This can check in either the X or Y direction. Depending
; on the result, this will jump to one of two addresses
; defined in the arguments.
;
; Arguments:
; 1. Check direction (0=X, 1=Y) (1 byte)
; 2. Distance value (1 byte)
; 3. Address to jump to if distance < value (2 bytes)
; 4. Address to jump to if distance >= value (2 bytes)
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6de]
;============================================================================
SpriteOp_CheckDistanceToPlayer:; [$a7e5]
LDY #$01; Y = 1 (op direction argument)
LDA (Sprites_ReadInfoAddr),Y; Read the direction to check.
ASL A; Convert to a word boundary for the lookup table.
TAY; Y = A
LDA #$a7f5,Y; Load the lower byte of the subcommand address.
PHA; Push to the stack.
LDA #$a7f4,Y; Load the upper byte of the subcommand address.
PHA; Push to the stack.
RTS
;============================================================================
; Subcommand table for the Check Distance to Player op.
;
; Keys correspond to the first argument to the op.
;============================================================================
SPRITEOP_CHECKDISTANCETOPLAYER_SUBCOMMANDS:; [$a7f4]
dw SpriteOp_CheckDistanceToPlayer_X-1; [0]:
dw SpriteOp_CheckDistanceToPlayer_Y-1; [1]:
SpriteOp_CheckDistanceToPlayer_X:; [$a7f8]
LDA CurrentSprites_Behaviors,X; A = Sprite behavior
BPL @_checkDistance; If the behavior is ready, jump to check.
;
; The behavior is not ready, so skip this check and all
; arguments.
;
LDA #$07; 7 = bytes to skip.
JSR Sprites_IncrementScriptAddr; Skip them.
JMP Sprites_LoadNextOp; Load the next operation.
;
; Check the distance to the player. This will result in
; jumping to code that sets the address for one of the
; script jump address destinations.
;
@_checkDistance:; [$a805]
JSR Sprite_CalcDistanceXToPlayer; Calculate the distance between the sprite and player.
LDY #$02; Y = 2 (op distance argument)
CMP (Sprites_ReadInfoAddr),Y; Is distance < argument?
BCC @_isLessThan; If so, jump.
;
; The calculated distance is >= the distance argument.
; Choose the second address.
;
LDY #$04; Y = 4
INY; Y++ (5)
LDA (Sprites_ReadInfoAddr),Y; A = lower byte of jump address.
PHA; Push to the stack.
INY; Y++ (6)
LDA (Sprites_ReadInfoAddr),Y; A = upper byte of jump address.
STA Sprites_ReadInfoAddr.U; Store as the new upper byte of the read address.
PLA; Pop the lower byte.
STA Sprites_ReadInfoAddr; Store as the new lower byte of the read address.
RTS; Return.
;
; The calculated distance is < the distance argument.
; Choose the first address.
;
@_isLessThan:; [$a81d]
INY; Y++ (3)
LDA (Sprites_ReadInfoAddr),Y; A = lower byte of jump address.
PHA; Push to the stack.
INY; Y++ (4)
LDA (Sprites_ReadInfoAddr),Y; A = upper byte of jump address.
STA Sprites_ReadInfoAddr.U; Store as the new upper byte of the read address.
PLA; Pop the lower byte.
STA Sprites_ReadInfoAddr; Store as the new lower byte of the read address.
RTS; Return.
SpriteOp_CheckDistanceToPlayer_Y:; [$a82a]
LDA CurrentSprites_Behaviors,X; A = Sprite behavior
BPL @_checkDistance; If the behavior is ready, jump to check.
;
; The behavior is not ready, so skip this check and all
; arguments.
;
LDA #$07; 7 = bytes to skip.
JSR Sprites_IncrementScriptAddr; Skip them.
JMP Sprites_LoadNextOp; Load the next operation.
;
; Check the distance to the player. This will result in
; a value for Y, which will be the offset to the jump address
; - 1.
;
@_checkDistance:; [$a837]
JSR Sprite_CalcDistanceYToPlayer; Calculate the distance between the sprite and player.
LDY #$02; Y = 2 (op distance argument)
CMP (Sprites_ReadInfoAddr),Y; Is distance < argument?
BCC @_isLessThan; If so, jump.
;
; The calculated distance is >= the distance argument.
; Choose the first address.
;
LDY #$04; Y = 4 (byte before second address)
;
; Load the jump address for the script based on Y above.
;
@_isLessThan:; [$a842]
INY; Y++ (target jump address)
LDA (Sprites_ReadInfoAddr),Y; A = lower byte of jump address.
PHA; Push to the stack.
INY; Y++
LDA (Sprites_ReadInfoAddr),Y; A = upper byte of jump address.
STA Sprites_ReadInfoAddr.U; Store as the new upper byte of the read address.
PLA; Pop the lower byte.
STA Sprites_ReadInfoAddr; Store as the new lower byte of the read address.
RTS; Return.
;============================================================================
; Op $06: Add Value To Sprite Data
;
; Add a value to the existing value in a Current Sprites
; data block of RAM, as in:
;
; existing_value += new_value
;
; This is valid for several collections of Current
; Sprite data in RAM, including:
;
; *
CurrentSprites_Flags
; *
CurrentSprites_XPos_Full
; *
CurrentSprites_YPos
; *
CurrentSprites_HitCounter
; *
CurrentSprites_Values
;
;
; The value will be set for the current sprite in that array.
;
; Arguments:
; 1. Sprites data RAM address (2 bytes)
; 2. Value to set (1 byte)
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6e4]
;============================================================================
SpriteOp_AddToSpriteData:; [$a84f]
;
; Load the address from parameter 1.
;
LDY #$01; Y = 1 (argument 1, byte 1)
LDA (Sprites_ReadInfoAddr),Y; Load the lower byte.
STA Temp_Addr_L; Store as the lower byte of the address to write to.
INY; Y++ (argument 1, byte 2)
LDA (Sprites_ReadInfoAddr),Y; Load the upper byte.
STA Temp_Addr_U; Store as the upper byte of the address to write to.
;
; Load the value to set from parameter 2.
;
INY; Y++ (argument 2)
LDA (Sprites_ReadInfoAddr),Y; Load the value.
;
; Set the value in the address.
;
PHA; Push the new value to the stack.
TXA; A = X (sprite index)
TAY; Y = A
PLA; Pop the new value from the stack.
CLC
ADC (Temp_Addr_L),Y; Add the value from the address to our argument value.
STA (Temp_Addr_L),Y; Store it as the new value.
;
; Jump to the next op and load it.
;
LDA #$04; A = 4 (number of bytes to skip)
JSR Sprites_IncrementScriptAddr; Skip over those bytes.
JMP Sprites_LoadNextOp; Load the next op.
;============================================================================
; Op $04: Finish Behavior
;
; Immediately finish a behavior.
;
; This will unset the behavior ID and continue on with the next operation.
;
; Arguments: None
;
; XREFS:
;
SPRITE_OPS [$PRG14::a6e0]
;============================================================================
SpriteOp_FinishBehavior:; [$a86e]
LDA #$01; A = 1 (number of bytes to skip)
JSR Sprites_IncrementScriptAddr; Skip over the byte.
JSR Sprite_FinishBehavior; Finish the current behavior.
JMP Sprites_LoadNextOp; Load the next op.
Sprites_IncrementScriptAddr:; [$a879]
CLC; C = 0
ADC Sprites_ReadInfoAddr; A = offset + lower byte of the behavior address
If overflow, C = 1
STA Sprites_ReadInfoAddr; Store it.
LDA Sprites_ReadInfoAddr.U; A = upper byte of the behavior address
ADC #$00; Add carry, if set.
STA Sprites_ReadInfoAddr.U; Store it.
RTS
Sprite_IsBehaviorNotReady:; [$a885]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$40; Set Z = ready not set.
RTS
Sprite_SetBehaviorNotReady:; [$a88b]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$bf; Clear the Ready flag.
STA CurrentSprites_Flags,X; Store it.
RTS
Sprite_SetBehaviorReady:; [$a894]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
ORA #$40; Set the Ready flag.
STA CurrentSprites_Flags,X; Store it.
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
CurrentSpriteFlags_SetBit5:; [$a89d]
LDA CurrentSprites_Flags,X
ORA #$20
STA CurrentSprites_Flags,X
RTS
;============================================================================
; MAYBE DEADCODE
;============================================================================
Sprite_ClearFlags:; [$a8a6]
LDA #$00
STA CurrentSprites_Flags,X
RTS
Sprite_FinishBehavior:; [$a8ac]
JSR Sprite_SetBehaviorNotReady
LDA CurrentSprites_Behaviors,X
ORA #$80
STA CurrentSprites_Behaviors,X
RTS
Sprite_GetPreviousSpritePhase:; [$a8b8]
LDA CurrentSprites_Phases,X; Load the current phase.
SEC
SBC #$01; Subtract 1
RTS; Return the value.
Sprite_SetVisible:; [$a8bf]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
ORA #$10; Set the visibility flag.
STA CurrentSprites_Flags,X; And save it.
RTS
Sprites_IsSpriteHidden:; [$a8c8]
LDA CurrentSprites_Flags,X; Load the sprite's flags.
AND #$10; Check the visible flag.
RTS; And return Z.
Sprites_HideSprite:; [$a8ce]
LDA CurrentSprites_Flags,X; Load the flags for the given sprite.
AND #$ef; Clear the visible flag.
STA CurrentSprites_Flags,X; Set the new flags.
RTS
;============================================================================
; TODO: Document SpriteBehavior__a8d7
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a60f]
;============================================================================
SpriteBehavior__a8d7:; [$a8d7]
JSR Sprite_IsBehaviorNotReady
BNE FUN_PRG14__a91e
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorData2,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorData3,X
LDA #$02
JSR Sprites_IncrementScriptAddr
JSR Sprite_SetBehaviorReady
LDA CurrentSprites_Flags,X
ORA #$02
STA CurrentSprites_Flags,X
JMP FUN_PRG14__a91e
;============================================================================
; TODO: Document SpriteBehavior_MoveTowardPlayer
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5e7]
;============================================================================
SpriteBehavior_MoveTowardPlayer:; [$a8fc]
JSR Sprite_IsBehaviorNotReady
BNE FUN_PRG14__a91e
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorData2,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorData3,X
LDA #$02
JSR Sprites_IncrementScriptAddr
JSR Sprite_SetBehaviorReady
LDA CurrentSprites_Flags,X
AND #$fd
STA CurrentSprites_Flags,X
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document FUN_PRG14__a91e
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_MoveTowardPlayer
;
SpriteBehavior__a8d7
;============================================================================
FUN_PRG14__a91e:; [$a91e]
JSR Sprites_SetCurrentSpriteCanMove
BCC @LAB_PRG14__a92e
JSR CurrentSprite_HandleFall
LDA CurrentSprites_Flags,X
AND #$02
BEQ @LAB_PRG14__a92e
RTS
@LAB_PRG14__a92e:; [$a92e]
LDA CurrentSprites_BehaviorData2,X
STA a:Arg_DeltaX_Frac
LDA CurrentSprites_BehaviorData3,X
STA a:Arg_DeltaX_Full
JSR Sprites_Something_SomethingAndMoveHoriz
JSR Sprites_CountdownBehavior
RTS
;============================================================================
; TODO: Document SpriteBehavior_WalkForward
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5ef]
;============================================================================
SpriteBehavior_WalkForward:; [$a941]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a95b
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorData2,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorData3,X
LDA #$02
JSR Sprites_IncrementScriptAddr
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a95b:; [$a95b]
JSR Sprites_SetCurrentSpriteCanMove
BCC @LAB_PRG14__a966
JSR SpriteAction_FlipXDirection
JMP CurrentSprite_HandleFall
@LAB_PRG14__a966:; [$a966]
LDA CurrentSprites_BehaviorData2,X
STA a:Arg_DeltaX_Frac
LDA CurrentSprites_BehaviorData3,X
STA a:Arg_DeltaX_Full
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
JMP Sprites_CountdownBehavior
;============================================================================
; TODO: Document SpriteBehavior_Fall
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a611]
;============================================================================
SpriteBehavior_Fall:; [$a978]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__a980
JSR Sprite_SetBehaviorReady
@LAB_PRG14__a980:; [$a980]
JSR Sprites_SetCurrentSpriteCanMove
BCC Call_Sprites_CountdownBehavior
JSR CurrentSprite_HandleFall
JMP Sprites_CountdownBehavior
;============================================================================
; TODO: Document SpriteBehavior_Wait
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5e9]
;============================================================================
SpriteBehavior_Wait:; [$a98b]
JSR Sprite_IsBehaviorNotReady
BNE Call_Sprites_CountdownBehavior
JSR Sprite_SetBehaviorReady
Call_Sprites_CountdownBehavior:; [$a993]
JMP Sprites_CountdownBehavior
RTS
;============================================================================
; TODO: Document SpriteBehavior_SomethingEyeball_17
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a609]
;============================================================================
SpriteBehavior_SomethingEyeball_17:; [$a997]
JSR Sprite_IsBehaviorNotReady
BNE @_ready
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_XFrac,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_XFull,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_YFrac,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_YFull,X
LDA #$04
JSR Sprites_IncrementScriptAddr
JSR Sprite_SetBehaviorReady
@_ready:; [$a9bd]
LDA CurrentSprites_BehaviorState_XFrac,X
STA a:Arg_DeltaX_Frac
LDA CurrentSprites_BehaviorState_XFull,X
STA a:Arg_DeltaX_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeHoriz
LDA CurrentSprites_BehaviorState_YFrac,X
STA a:Arg_DeltaY_Frac
LDA CurrentSprites_BehaviorState_YFull,X
STA a:Arg_DeltaY_Full
JSR Sprite_Maybe_TurnAroundIfAtScreenEdgeVert
JMP Sprites_CountdownBehavior
;============================================================================
; TODO: Document SpriteBehavior_Hop
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5f9]
;============================================================================
SpriteBehavior_Hop:; [$a9de]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__aa14
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_XFrac,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_XFull,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_InternalBehaviorStates,X
LDA #$03
JSR Sprites_IncrementScriptAddr
LDA #$00
STA CurrentSprites_BehaviorArg1,X
JSR Sprite_SetBehaviorReady
LDA CurrentSprites_Flags,X
AND #$7f
STA CurrentSprites_Flags,X
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aa72,Y
STA CurrentSprites_BehaviorData3,X
@LAB_PRG14__aa14:; [$aa14]
LDA CurrentSprites_BehaviorState_XFull,X
STA a:Arg_DeltaX_Full
LDA CurrentSprites_BehaviorState_XFrac,X
STA a:Arg_DeltaX_Frac
JSR Sprites_Something_SomethingAndMoveHoriz
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aa77,Y
TAY
LDA CurrentSprites_BehaviorData3,X
JSR Sprites_CalcYFromGravity
PHA
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aa7c,Y
TAY
PLA
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_MoveVertical
BCC @LAB_PRG14__aa49
LDA CurrentSprites_Flags,X
BPL @LAB_PRG14__aa49
JMP Sprite_FinishBehavior
@LAB_PRG14__aa49:; [$aa49]
INC CurrentSprites_BehaviorData3,X
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aa77,Y
TAY
LDA CurrentSprites_BehaviorData3,X
AND #$83f7,Y
BNE @_return
LDA CurrentSprites_Flags,X
BMI @LAB_PRG14__aa63
;
; Begin falling.
;
JMP SpriteAction_FlipYDirection
@LAB_PRG14__aa63:; [$aa63]
LDY CurrentSprites_InternalBehaviorStates,X
LDA CurrentSprites_BehaviorData3,X
CMP #$aa81,Y
BCC @_return
DEC CurrentSprites_BehaviorData3,X
@_return:; [$aa71]
RTS
SPRITE_BEHAVIOUR_HOP_START_TICKS:; [$aa72]
db $40; [0]:
db $20; [1]:
db $10; [2]: Monodron
db $08; [3]:
db $10; [4]:
SPRITE_BEHAVIOR_HOP_GRAVITY:; [$aa77]
db $02; [0]:
db $03; [1]:
db $04; [2]:
db $05; [3]:
db $04; [4]:
SPRITE_BEHAVIOR_HOP_JUMP_STRENGTH:; [$aa7c]
db $04; [0]:
db $05; [1]:
db $06; [2]:
db $07; [3]:
db $07; [4]:
SPRITE_BEHAVIOR_HOP_GROUND_TICKS:; [$aa81]
db $c0; [0]:
db $60; [1]:
db $30; [2]:
db $18; [3]:
db $30; [4]:
;============================================================================
; TODO: Document SpriteBehavior_SomethingZoradohna_18
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a60b]
;============================================================================
SpriteBehavior_SomethingZoradohna_18:; [$aa86]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__aaae
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_XFrac,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_XFull,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_InternalBehaviorStates,X
LDA #$03
JSR Sprites_IncrementScriptAddr
JSR Sprite_SetBehaviorReady
LDA CurrentSprites_Flags,X
ORA #$80
STA CurrentSprites_Flags,X
@LAB_PRG14__aaae:; [$aaae]
LDA CurrentSprites_BehaviorState_XFull,X
STA a:Arg_DeltaX_Full
LDA CurrentSprites_BehaviorState_XFrac,X
STA a:Arg_DeltaX_Frac
JSR Sprite_MoveHorizAndTurnAroundIfNeeded
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aaf2,Y
TAY
LDA CurrentSprites_BehaviorData3,X
JSR Sprites_CalcYFromGravity
PHA
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aaf6,Y
TAY
PLA
JSR Sprites_CalcVerticalSpriteMovement
JSR Sprite_MoveVertical
INC CurrentSprites_BehaviorData3,X
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$aaf2,Y
TAY
DEY
LDA CurrentSprites_BehaviorData3,X
AND #$83f7,Y
BNE @LAB_PRG14__aaef
JMP SpriteAction_FlipYDirection
@LAB_PRG14__aaef:; [$aaef]
JMP Sprites_CountdownBehavior
BYTE_ARRAY_PRG14__aaf2:; [$aaf2]
db $03; [0]:
db $04; [1]:
db $05; [2]:
db $06; [3]:
BYTE_ARRAY_PRG14__aaf6:; [$aaf6]
db $03; [0]:
db $05; [1]:
db $05; [2]:
db $07; [3]:
;============================================================================
; TODO: Document SpriteBehavior_MoveVertically
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a60d]
;============================================================================
SpriteBehavior_MoveVertically:; [$aafa]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__ab14
LDY #$00
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_YFrac,X
INY
LDA (Sprites_ReadInfoAddr),Y
STA CurrentSprites_BehaviorState_YFull,X
LDA #$02
JSR Sprites_IncrementScriptAddr
JSR Sprite_SetBehaviorReady
@LAB_PRG14__ab14:; [$ab14]
LDA CurrentSprites_BehaviorState_YFrac,X
STA a:Arg_DeltaY_Frac
LDA CurrentSprites_BehaviorState_YFull,X
STA a:Arg_DeltaY_Full
JSR Sprite_MoveVertAndFlipIfNeeded
JMP Sprites_CountdownBehavior
;============================================================================
; Behavior $1F: Flashes the screen and hit player.
;
; This turns the screen greyscale for a frame and damages the player for
; 10HP.
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a625]
;============================================================================
SpriteBehavior_FlashScreenHitPlayer:; [$ab26]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__ab39
LDA #$02
STA CurrentSprites_BehaviorData2,X
LDA ScreenColorMode
ORA #$01
STA ScreenColorMode
JSR Sprite_SetBehaviorReady
@LAB_PRG14__ab39:; [$ab39]
DEC CurrentSprites_BehaviorData2,X
BNE @_return
LDA ScreenColorMode
AND #$fe
STA ScreenColorMode
LDA #$04
JSR #$d0e4
LDA #$3c
STA Player_InvincibilityPhase
LDA Player_StatusFlag
ORA #$02
STA Player_StatusFlag
LDA #$00
STA a:Arg_PlayerHealthDelta_L
LDA #$0a
STA a:Arg_PlayerHealthDelta_U
JSR #$c08e
LDX a:CurrentSpriteIndex
JMP Sprite_FinishBehavior
@_return:; [$ab66]
RTS
;============================================================================
; TODO: Document SpriteBehavior_BossDeath
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a663]
;============================================================================
SpriteBehavior_BossDeath:; [$ab67]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__ab77
LDA #$00
STA CurrentSprites_BehaviorData2,X
STA CurrentSprites_Phases,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__ab77:; [$ab77]
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$08
BCC @_return
INC CurrentSprites_Phases,X
LDY CurrentSprites_Phases,X
CPY #$0a
BCS @LAB_PRG14__abb0
LDA CurrentSprites_XPos_Full,X
CLC
ADC #$abb6,Y
STA CurrentSprites_XPos_Full,X
LDA CurrentSprites_YPos,X
CLC
ADC #$abc1,Y
STA CurrentSprites_YPos,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
LDA #$03
JSR #$d0e4
LDA CurrentSprites_Phases,X
CMP #$05
BCS @_return
JMP Sprite_HandleDeathDropIfPossible
@_return:; [$abaf]
RTS
@LAB_PRG14__abb0:; [$abb0]
LDA #$ff
STA CurrentSprites_Entities,X
RTS
BYTE_ARRAY_PRG14__abb6:; [$abb6]
db $00; [0]:
db $20; [1]:
db $f0; [2]:
db $f0; [3]:
db $20; [4]:
db $e0; [5]:
db $20; [6]:
db $f0; [7]:
db $f0; [8]:
db $20; [9]:
db $e0; [10]:
BYTE_ARRAY_PRG14__abc1:; [$abc1]
db $00; [0]:
db $20; [1]:
db $f0; [2]:
db $10; [3]:
db $e0; [4]:
db $00; [5]:
db $20; [6]:
db $f0; [7]:
db $10; [8]:
db $e0; [9]:
db $00; [10]:
;============================================================================
; TODO: Document SpriteBehavior_LightningBallOrCharron
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SPRITE_BEHAVIORS [$PRG14::a5f5]
;
SPRITE_BEHAVIORS [$PRG14::a5f7]
;============================================================================
SpriteBehavior_LightningBallOrCharron:; [$abcc]
JSR Sprite_IsBehaviorNotReady
BNE @LAB_PRG14__abd9
LDA #$00
STA CurrentSprites_BehaviorData2,X
JSR Sprite_SetBehaviorReady
@LAB_PRG14__abd9:; [$abd9]
INC CurrentSprites_BehaviorData2,X
LDA CurrentSprites_BehaviorData2,X
CMP #$08
BCC @LAB_PRG14__abeb
JSR Sprite_HandleDeathDropIfPossible
LDA #$ff
STA CurrentSprites_Entities,X
@LAB_PRG14__abeb:; [$abeb]
RTS
;============================================================================
; Show an effect for the death of a big enemy.
;
; This will replace the sprite with a big enemy death effect.
;
; INPUTS:
; X:
; The index of the enemy sprite.
;
; OUTPUTS:
; None
;
; XREFS:
;
Player_HitEnemyWithMagic
;
Player_HitSpriteWithWeapon
;============================================================================
Sprite_ShowBigEnemyDeathByMagicOrWeapon:; [$abec]
LDA #$64
JMP Sprite_SetDeathEntity
;============================================================================
; Show an effect for the death of a normal enemy by weapon.
;
; This will replace the sprite with an enemy death effect.
;
; INPUTS:
; X:
; The index of the enemy sprite.
;
; OUTPUTS:
; None
;
; XREFS:
;
Player_HitSpriteWithWeapon
;============================================================================
Sprite_ShowNormalEnemyDeathByWeapon:; [$abf1]
LDA #$13
JMP Sprite_SetDeathEntity
;============================================================================
; Show an effect for the death of a normal enemy by magic.
;
; This will clear sprite state, stop the sprite behavior,
; and set an explosion animation.
;
; INPUTS:
; X:
; The index of the enemy sprite.
;
; OUTPUTS:
; None
;
; XREFS:
;
Player_HitEnemyWithMagic
;============================================================================
Sprite_ShowNormalEnemyDeathByMagic:; [$abf6]
LDA #$14
;
; v-- Fall through --v
;
Sprite_SetDeathEntity:; [$abf8]
PHA
LDA CurrentSprites_Entities,X
STA CurrentSprites_InternalBehaviorStates,X
PLA
STA CurrentSprites_Entities,X
ASL A
TAY
LDA #$ad2d,Y
STA CurrentSprites_BehaviorAddrs_L,X
LDA #$ad2e,Y
STA CurrentSprites_BehaviorAddrs_U,X
LDA #$ff
STA CurrentSprites_Behaviors,X
STA CurrentSprites_HitByMagicBehavior,X
LDA #$00
STA CurrentSprites_BehaviorData2,X
JMP Sprite_SetBehaviorNotReady
;============================================================================
; TODO: Document Sprite_HandleDeathDropIfPossible
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
SpriteBehavior_BossDeath
;
SpriteBehavior_LightningBallOrCharron
;============================================================================
Sprite_HandleDeathDropIfPossible:; [$ac21]
JSR Sprites_HasMaxOnScreen
BCS @_return
JSR Maybe_Sprite_HandleDeathDrop
LDX a:CurrentSpriteIndex
@_return:; [$ac2c]
RTS
;============================================================================
; TODO: Document Maybe_Sprite_HandleDeathDrop
;
; INPUTS:
; X
; Y
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Sprite_HandleDeathDropIfPossible
;============================================================================
Maybe_Sprite_HandleDeathDrop:; [$ac2d]
STY Temp_00
LDY CurrentSprites_InternalBehaviorStates,X
LDA #$b672,Y
CMP #$ff
BEQ @_return
CMP #$40
BCS @_return
STA Temp_01
TAY
LDA #$aced,Y
LDY Temp_00
STA CurrentSprites_Values,Y
LDA CurrentSprites_XPos_Full,X
STA CurrentSprites_XPos_Full,Y
LDA CurrentSprites_YPos,X
STA CurrentSprites_YPos,Y
LDA #$00
STA CurrentSprites_HitCounter,Y
LDA #$ff
STA CurrentSprites_HitByMagicBehavior,Y
LDY #$00
LDA Temp_01
CMP #$30
BCC @LAB_PRG14__ac66
INY
INY
@LAB_PRG14__ac66:; [$ac66]
LDA #$ac72,Y
PHA
LDA #$ac71,Y
PHA
LDY Temp_00
@_return:; [$ac70]
RTS
;============================================================================
; XXX Address lookup table for next handlers
;============================================================================
SPRITE_DROP_HANDLERS:; [$ac71]
dw Sprites_ReplaceWithCoinDrop-1
SPRITE_DROP_HANDLERS_LAST:; [$ac73]
dw Sprite_ReplaceWithBreadDrop-1
Sprites_ReplaceWithCoinDrop:; [$ac75]
LDA #$10
JSR #$d0e4
TYA
TAX
LDA #$02
;
; v-- Fall through --v
;
Sprite_ReplaceWithDroppedItem:; [$ac7e]
;
; Set the sprite entity.
;
STA CurrentSprites_Entities,X; Set the provided sprite entity at the given index.
;
; Set the sprite behavior address.
;
ASL A; Convert the sprite entity to a word boundary for the behavior addresses.
TAY; Y = A
LDA #$ad2d,Y; Load the lower byte of the sprite behavior for this entity.
STA CurrentSprites_BehaviorAddrs_L,X; Set it as the current behavior for this sprite.
LDA #$ad2e,Y; Load the upper byte.
STA CurrentSprites_BehaviorAddrs_U,X; And set that.
;
; Set the sprite subtype to 0xFF (unset).
;
LDA #$ff; A = 0xFF
STA CurrentSprites_Behaviors,X; Set it as the subtype.
;
; Set the sprite hitbox.
;
LDY #$02; Y = 2
LDA #$b4df,Y; A = hitbox type for Y.
STA CurrentSprites_HitBoxTypes,X; Set as the hitbox.
;
; Disable sprite behaviors.
;
JMP Sprite_SetBehaviorNotReady; Disable behaviors for this sprite.
Sprite_ReplaceWithBreadDrop:; [$ac9f]
TYA; A = Y (sprite index)
TAX; X = A
LDA #$01; A = 1
JMP Sprite_ReplaceWithDroppedItem
;============================================================================
; MAYBE DEADCODE
;============================================================================
Sprite_ReplaceWithMattock:; [$aca6]
JSR @_Sprites_ReplaceWithMattock_HasMaxOnScreen; Check if all sprite slots are populated.
BCS @_return; If so, return.
;
; There are unpopulated slots. Populate at the given index.
;
LDA #$50; A = Mattock sprite ID.
STA CurrentSprites_Entities,X; Store as the entity at this index.
ASL A; Normalize to a word boundary.
TAY; Y = A
LDA #$ad2d,Y; A = 0x1B.
STA CurrentSprites_BehaviorAddrs_L,X; Set as lower byte.
LDA #$ad2e,Y; A = 0xB2.
STA CurrentSprites_BehaviorAddrs_U,X; Set as upper byte.
;
; Set the subtype to 0xFF (unset).
;
LDA #$ff; A = 0xFF
STA CurrentSprites_Behaviors,X; Set subtype to A.
;
; Set the hitbox of the sprite.
;
LDY CurrentSprites_Entities,X; Y = sprite entity.
LDA #$b4df,Y; A = hitbox type for Y.
STA CurrentSprites_HitBoxTypes,X; Store as the hitbox type.
;
; Set the Y position of the sprite to 32.
;
LDA #$20; A = 32
STA CurrentSprites_YPos,X; Set as X position.
;
; Set the X position of the sprite as 120.
;
LDA #$78; A = 120
STA CurrentSprites_XPos_Full,X; Set as X position.
;
; Set the PPU address for the sprite.
;
LDA #$90; A = 0x90
STA CurrentSprites_PPUAddrs,X; Set as the PPU address.
JMP Sprite_SetBehaviorNotReady; Disable behaviors for the sprite.
@_return:; [$acdc]
RTS
;============================================================================
; Return whether all sprite slots are populated.
;
; This is similar to
Sprites_HasMaxOnScreen, but
; is specific to
Sprite_ReplaceWithMattock.
;
; It differs in that the counter variable is X instead of Y.
;
; INPUTS:
;
CurrentSprites_Entities:
; All populated sprite entities on the screen.
;
; OUTPUTS:
; C:
; 1 if all sprite slot are populated.
; 0 if any are unpopulated.
;
; XREFS:
;
Sprite_ReplaceWithMattock
;============================================================================
@_Sprites_ReplaceWithMattock_HasMaxOnScreen:; [$acdd]
LDX #$07; X = 7 (our loop counter)
@_loop:; [$acdf]
LDA CurrentSprites_Entities,X; A = sprite entity at X
CMP #$ff; Is it 0xFF (unpopulated)?
BNE @_isPopulated; If not, jump to prepare the next loop.
;
; There's an unpopulated sprite. Return a false result.
;
CLC; Set C = 0
RTS; And return it.
@_isPopulated:; [$ace8]
DEX; X--
BPL @_loop; If >= 0, loop.
;
; All slots are populated. Return a true result.
;
SEC; Set C = 1
RTS; And return it.
SPRITE_MAYBE_DROP_RANDOM_DATA:; [$aced]
db $0a; [0]:
db $0f; [1]:
db $12; [2]:
db $14; [3]:
db $16; [4]:
db $1a; [5]:
db $20; [6]:
db $35; [7]:
db $38; [8]:
db $3b; [9]:
db $3f; [10]:
db $40; [11]:
db $43; [12]:
db $48; [13]:
db $4a; [14]:
db $4e; [15]:
db $55; [16]:
db $5a; [17]:
db $62; [18]:
db $64; [19]:
db $73; [20]:
db $78; [21]:
db $80; [22]:
db $88; [23]:
db $96; [24]:
db $b4; [25]:
db $be; [26]:
db $c8; [27]:
db $dc; [28]:
db $e6; [29]:
db $f0; [30]:
db $fa; [31]:
db $00; [32]:
db $00; [33]:
db $00; [34]:
db $00; [35]:
db $00; [36]:
db $00; [37]:
db $00; [38]:
db $00; [39]:
db $00; [40]:
db $00; [41]:
db $00; [42]:
db $00; [43]:
db $00; [44]:
db $00; [45]:
db $00; [46]:
db $00; [47]:
db $02; [48]:
db $04; [49]:
db $08; [50]:
db $10; [51]:
db $0e; [52]:
db $14; [53]:
db $19; [54]:
db $1e; [55]:
db $1f; [56]:
db $28; [57]:
db $32; [58]:
db $37; [59]:
db $3c; [60]:
db $40; [61]:
db $46; [62]:
db $4c; [63]:
;============================================================================
; A mapping of sprite entity IDs to behavior state addresses.
;============================================================================
SPRITE_BSCRIPTS:; [$ad2d]
dw $adf7; [0]:
SPRITE_BSCRIPTS_1_:; [$ad2f]
dw $adf8; [1]:
SPRITE_BSCRIPTS_2_:; [$ad31]
dw $af02; [2]:
dw $ae02; [3]:
dw $ae16; [4]:
dw $af31; [5]:
dw $af06; [6]:
dw $ae0a; [7]:
dw $ae0e; [8]:
dw $ae12; [9]:
dw $b120; [10]:
dw $af35; [11]:
dw $aee5; [12]:
dw $af39; [13]:
dw $af3d; [14]:
dw $af54; [15]:
dw $af58; [16]:
dw $b0ac; [17]:
dw $b0d3; [18]:
SPRITE_BSCRIPTS_19_:; [$ad53]
dw $af5c; [19]:
SPRITE_BSCRIPTS_20_:; [$ad55]
dw $af60; [20]:
dw $af68; [21]:
dw $adf7; [22]:
dw $af89; [23]:
dw $af98; [24]:
dw $afb5; [25]:
dw $b01b; [26]:
dw $b01f; [27]:
dw $b044; [28]:
dw $b0a8; [29]:
dw $b048; [30]:
dw $b07a; [31]:
dw $b07e; [32]:
dw $b07a; [33]:
dw $b058; [34]:
dw $b05c; [35]:
dw $b060; [36]:
dw $adf7; [37]:
dw $ae8c; [38]:
dw $b064; [39]:
dw $b068; [40]:
dw $adf7; [41]:
dw $aecc; [42]:
dw $b072; [43]:
dw $b076; [44]:
dw $b0d7; [45]:
dw $b0db; [46]:
dw $b108; [47]:
dw $b10c; [48]:
dw $b110; [49]:
dw $b114; [50]:
dw $b118; [51]:
dw $b124; [52]:
dw $b131; [53]:
dw $b149; [54]:
dw $b167; [55]:
dw $b16b; [56]:
dw $b173; [57]:
dw $b17d; [58]:
dw $b19e; [59]:
dw $b1ae; [60]:
dw $b1b2; [61]:
dw $b1ba; [62]:
dw $b1c2; [63]:
dw $b1c6; [64]:
dw $b1cc; [65]:
dw $b1de; [66]:
dw $b1a6; [67]:
dw $b1eb; [68]:
dw $b1fa; [69]:
dw $ae43; [70]:
dw $aeb1; [71]:
dw $b20f; [72]:
dw $b253; [73]:
dw $b257; [74]:
dw $b217; [75]:
dw $b217; [76]:
dw $b217; [77]:
dw $b20b; [78]:
dw $b217; [79]:
SPRITE_BSCRIPTS_80_:; [$adcd]
dw $b21b; [80]:
SPRITE_BSCRIPTS_81_:; [$adcf]
dw $b11c; [81]:
dw $b223; [82]:
dw $ae06; [83]:
dw $b11c; [84]:
dw $b213; [85]:
dw $b21f; [86]:
dw $b24f; [87]:
dw $b243; [88]:
dw $b247; [89]:
dw $b24b; [90]:
dw $b25b; [91]:
dw $b25f; [92]:
dw $b263; [93]:
dw $b267; [94]:
dw $b26b; [95]:
dw $b26f; [96]:
dw $b22b; [97]:
dw $b233; [98]:
dw $b23b; [99]:
dw $af64; [100]:
;============================================================================
; No-op sprite behavior script.
;============================================================================
BSCRIPTS_NOOP:; [$adf7]
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Bread drop sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_BREAD:; [$adf8]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels
db $00; |- 3 blocks
db $03; '- Hop mode 3
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $ff; |- For 255 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Garbled 3 sprite behavior script.
;============================================================================
SPRITE_BEHAVIORS_GARBLED_03:; [$ae02]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_GARBLED_3; [$ae03] SpriteBehavior
db $00; [$ae04] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Unknown 83 sprite behavior script.
;============================================================================
SPRITE_BEHAVIORS_UNKNOWN_83:; [$ae06]
db SPRITE_OP_SWITCH_BEHAVIOR; [$ae06] SpriteOp
db SPRITE_BEHAVIOR_UNKNOWN_29; [$ae07] SpriteBehavior
db $00; [$ae08] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Hornet enemy sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_HORNET:; [$ae0a]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_BUZZ_AROUND; |- Buzz around
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Bihoruda enemy sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_BIHORUDA:; [$ae0e]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_BIHORUDA; [$ae0f] SpriteBehavior
db $00; [$ae10] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Lilith enemy sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_LILITH:; [$ae12]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_LILITH; [$ae13] SpriteBehavior
db $00; [$ae14] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Raiden enemy sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_RAIDEN:; [$ae16]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $14; |- For 20 ticks
db $00; |- 0 pixels
db $01; '- 1 block
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $02; |- 2 pixels X
db $02; '- Hop mode 2
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $00; |- For 0 ticks
db $00; |- 0 pixels
db $01; '- 1 block
@_checkDistanceLoop:; [$ae28]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance
db $00; |- X direction
db $30; |- If < 48
dw $ae2f; |- Then @_isNearPlayer
dw $ae28; '- Else, @_checkDistanceLoop
@_isNearPlayer:; [$ae2f]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall
db $07; '- For 7 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $40; |- 64 pixels X
db $00; |- 0 blocks X
db $00; '- Hop mode 0
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $14; |- For 20 ticks
db $e0; |- 224 pixels
db $00; '- 0 blocks
db SPRITE_OP_GOTO; Op: Goto
dw $ae16; '- BSCRIPTS_ENEMY_RAIDEN
;============================================================================
; Unused eyeball enemy sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_EYEBALL:; [$ae43]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MAYBE_MOVE_XY; |- TODO: Move X/Y
db $00; |- For 0 ticks
db $00; |- 0 pixels X
db $01; |- 1 block X
db $00; |- 0 pixels Y
db $00; '- 0 blocks Y
@_waitNearPlayerX:; [$ae4c]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- X direction
db $30; |- If < 48
dw $ae53; |- Then @_isNearPlayerX
dw $ae4c; '- Else @_waitNearPlayerX
@_isNearPlayerX:; [$ae53]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WAIT; |- Wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_Y; '- Face player (Y)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MAYBE_MOVE_XY; |- Move X/Y
db $00; |- For 0 ticks
db $00; |- 0 pixels X
db $00; |- 0 blocks X
db $00; |- 0 pixels Y
db $01; '- 1 block Y
@_waitNearPlayerY:; [$ae60]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $01; |- Y direction
db $08; |- If < 8
dw $ae67; |- Then @_isNearPlayerY
dw $ae60; '- Then @_waitNearPlayerY
@_isNearPlayerY:; [$ae67]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WAIT; |- Wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MAYBE_MOVE_XY; |- Move X/Y
db $32; |- For 50 ticks
db $00; |- 0 pixels X
db $01; |- 1 block X
db $00; |- 0 pixels Y
db $00; '- 0 blocks Y
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_Y_DIRECTION; '- Flip Y direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MAYBE_MOVE_XY; |- Move X/Y
db $32; |- For 50 ticks
db $00; |- 0 pixels X
db $00; |- 0 blocks X
db $00; |- 0 pixels Y
db $01; '- 1 block Y
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WAIT; |- Wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_Y_DIRECTION; '- Randomly flip Y direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MAYBE_MOVE_XY; |- Move X/Y
db $0a; |- For 10 ticks
db $00; |- 0 pixels X
db $00; |- 0 blocks X
db $00; |- 0 pixels Y
db $01; '- 1 block Y
db SPRITE_OP_GOTO; Op: Goto
dw $ae43; '- BSCRIPTS_ENEMY_UNUSED_EYEBALL
;============================================================================
; Ikedia sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_IKEDA:; [$ae8c]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $00; |- For 0 ticks
db $00; |- 0 pixels
db $01; '- 1 block
@_waitNearPlayerX:; [$ae93]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- X direction
db $40; |- If < 64 pixels
dw $ae9a; |- Then _isNearPlayerX
dw $ae93; '- Else _waitNearPlayerX
@_isNearPlayerX:; [$ae9a]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 blocks X
db $01; '- Hop mode 1
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $0a; |- For 10 ticks
db $08; |- 8 pixels
db $00; '- 0 blocks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $c0; |- 192 pixels X
db $00; |- 0 blocks X
db $02; '- Hop mode 2
db SPRITE_OP_GOTO; Op: Goto
dw $ae8c; '- BSCRIPTS_ENEMY_IKEDA
;============================================================================
; Zozura sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_ZOZURA:; [$aeb1]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $3c; |- For 60 ticks
db $60; |- 96 pixels
db $00; '- 0 blocks
db SPRITE_OP_GOTO; Op: Goto
dw $aeb1; '- BSCRIPTS_ENEMY_ZOZURA
;
; DEADCODE: Unused logic for Zozura.
;
; In this version, Zozura would still walk toward the player,
; but would randomly change the X direction and continue
; walking.
;
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $3c; |- For 60 ticks
db $60; |- 96 pixels
db $00; '- 0 blocks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $14; |- For 20 ticks
db $60; |- 96 pixels
db $00; '- 0 blocks
db SPRITE_OP_GOTO; Op: Goto
dw $aeb1; '- BSCRIPTS_ENEMY_ZOZURA
;============================================================================
; Monodron sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_MONODRON:; [$aecc]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly change X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $05; '- For 5 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- X fractional amount
db $01; |- X full amount
db $02; '- Hop mode 2
db SPRITE_OP_RUN_ACTION; Op: Run Action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $14; '- For 20 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $80; |- X fractional amount
db $01; |- X full amount
db $02; '- Hop mode 2
db SPRITE_OP_GOTO; Op: Goto
dw $aecc; '- BSCRIPTS_ENEMY_MONODRON
;============================================================================
; Snowman sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_SNOWMAN:; [$aee5]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/Wait
db $1e; '- For 30 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $00; |- For 0 ticks
db $00; |- 0 pixels
db $02; '- 2 blocks
@_waitNearPlayer:; [$aef1]
db SPRITE_OP_CHECK_DISTANCE; Op: Check player distance
db $00; |- X direction
db $20; |- If < 32 pixels
dw $aef8; |- Then _isNearPlayer
dw $aef1; '- Else @_waitNearPlayer
@_isNearPlayer:; [$aef8]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $02; |- 2 blocks X
db $04; '- Hop mode 4
db SPRITE_OP_GOTO; Op: Goto
dw $aee5; '- BSCRIPTS_ENEMY_SNOWMAN
;============================================================================
; Coin sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_COIN:; [$af02]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_BOUNCE_AND_EXPIRE; |- Bounce and expire
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Zombie sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_ZOMBIE:; [$af06]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $14; |- For 20 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $28; |- For 40 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $14; |- For 20 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $28; |- For 40 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $3c; '- For 60 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_GOTO; Op: Goto
dw $af06; '- BSCRIPTS_ENEMY_ZOMBIE
;============================================================================
; Necron Aides sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_NECRON_AIDES:; [$af31]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af31] SpriteOp
db SPRITE_BEHAVIOR_NECRON_AIDES; [$af32] SpriteBehavior
db $00; [$af33] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Yuinaru sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_YUINARU:; [$af35]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af35] SpriteOp
db SPRITE_BEHAVIOR_YUINARU; [$af36] SpriteBehavior
db $00; [$af37] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Nash sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_NASH:; [$af39]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af39] SpriteOp
db SPRITE_BEHAVIOR_NASH; [$af3a] SpriteBehavior
db $00; [$af3b] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Fire Giant sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_FIRE_GIANT:; [$af3d]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
@_waitNearPlayer:; [$af42]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- X direction
db $20; |- If < 32 pixels
dw $af49; |- Then _isNearPlayer
dw $af42; '- Else _waitNearPlayer
@_isNearPlayer:; [$af49]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $28; |- For 40 ticks
db $80; |- 128 pixels X
db $01; '- 1 block X
db SPRITE_OP_GOTO; Op: Goto
dw $af3d; '- BSCRIPTS_ENEMY_FIRE_GIANT
;============================================================================
; Ishiisu sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_ISHIISU:; [$af54]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af54] SpriteOp
db SPRITE_BEHAVIOR_ISHIISU; [$af55] SpriteBehavior
db $00; [$af56] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Execution Hood sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_EXECUTION_HOOD:; [$af58]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af58] SpriteOp
db SPRITE_BEHAVIOR_EXECUTION_HOOD; [$af59] SpriteBehavior
db $00; [$af5a] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Lightning ball sprite behavior script.
;============================================================================
BSCRIPTS_LIGHTNING_BALL_19:; [$af5c]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af5c] SpriteOp
db SPRITE_BEHAVIOR_MAYBE_LIGHTNINGBALL; [$af5d] SpriteBehavior
db $00; [$af5e] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Charron sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_CHARRON:; [$af60]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af60] SpriteOp
db SPRITE_BEHAVIOR_LIGHTNINBALL_CHARRON; [$af61] SpriteBehavior
db $00; [$af62] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Boss death effect sprite behavior script.
;============================================================================
BSCRIPTS_EFFECT_BOSS_DEATH:; [$af64]
db SPRITE_OP_SWITCH_BEHAVIOR; [$af64] SpriteOp
db SPRITE_BEHAVIOR_EFFECT_BOSS_DEATH; [$af65] SpriteBehavior
db $00; [$af66] byte
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Unused 21 sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_21:; [$af68]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $10; '- For 16 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $1e; |- For 30 ticks
db $c0; |- 192 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $10; '- For 16 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $1e; |- For 30 ticks
db $00; |- 0 pixels X
db $01; '- 1 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WAIT; |- Wait
db $08; '- For 8 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_CAST_MAGIC; '- Cast magic
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WAIT; |- Wait
db $08; '- For 8 ticks
db SPRITE_OP_GOTO; Op: Goto
dw $af68; '- BSCRIPTS_ENEMY_UNUSED_21
;============================================================================
; Geributa sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_GERIBUTA:; [$af89]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_RANDOMLY_FLIP_X_DIRECTION; '- Randomly flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_CLEAR_READY_SET_BIT_7; [$af8c] SpriteBehavior
db $00; [$af8d] byte
@_moveTowardPlayerLoop:; [$af8e]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $1e; |- For 30 ticks
db $00; |- 0 pixels X
db $02; '- 2 blocks X
db SPRITE_OP_GOTO; Op: Goto
dw $af8e; '- @_moveTowardPlayerLoop
;============================================================================
; Sugata enemy behavior script.
;============================================================================
BSCRIPTS_ENEMY_SUGATA:; [$af98]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player (X)
db $1e; |- For 30 ticks
db $00; |- 0 pixels per tick
db $01; '- 1 block per tick
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $1e; '- For 30 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player (X)
db $28; |- For 40 ticks
db $00; |- 0 pixels per tick
db $01; '- 1 block per tick
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0a; '- For 10 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player (X)
db $14; |- For 20 ticks
db $80; |- 128 pixels per tick
db $00; '- 0 blocks per tick
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FLASH_DAMAGE_PLAYER; |- Flash screen, damage player
db $00; '- (unused)
db SPRITE_OP_GOTO; Op: Goto
dw $af98; '- BSCRIPTS_ENEMY_SUGATA
;============================================================================
; Grimlock enemy behavior script.
;============================================================================
BSCRIPTS_ENEMY_GRIMLOCK:; [$afb5]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $10; '- For 16 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $14; '- For 20 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0e; '- For 14 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $10; '- For 16 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $12; '- For 18 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $01; |- Y direction
db $10; |- If < 16 pixels
dw $afff; |- Then @_nearPlayerY
dw $afe5; '- Else @_awayFromPlayerY
@_awayFromPlayerY:; [$afe5]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $28; |- For 40 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
@_waitNearPlayerX:; [$afeb]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- X direction
db $10; |- If < 16 pixels
dw $aff5; |- Then @_nearPlayerX
dw $afeb; '- Else _waitNearPlayerX
db SPRITE_OP_GOTO; Op: Goto
dw $afb5; '- BSCRIPTS_ENEMY_GRIMLOCK
@_nearPlayerX:; [$aff5]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $02; '- Hop mode 2
db SPRITE_OP_GOTO; Op: Goto
dw $afb5; '- BSCRIPTS_ENEMY_GRIMLOCK
@_nearPlayerY:; [$afff]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SET_PHASE; Op: Set phase
db $09; '- 9
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $28; |- For 40 ticks
db $00; |- 0 pixels X
db $02; '- 2 pixels X
@_waitNearPlayerX2:; [$b007]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- X direction
db $10; |- If < 16 pixels
dw $b011; |- Then @_nearPlayerX2
dw $b007; '- Else @_waitNearPlayerX2
db SPRITE_OP_GOTO; Op: Goto
dw $afb5; '- BSCRIPTS_ENEMY_GRIMLOCK
@_nearPlayerX2:; [$b011]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $02; |- 2 blocks X
db $02; '- Hop mode 2
db SPRITE_OP_GOTO; Op: Goto
dw $afb5; '- BSCRIPTS_ENEMY_GRIMLOCK
;============================================================================
; Giant Bees sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_GIANT_BEES:; [$b01b]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b01b] SpriteOp
db SPRITE_BEHAVIOR_GIANT_BEES; [$b01c] SpriteBehavior
db $00; [$b01d] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Myconid sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_MYCONID:; [$b01f]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $3c; |- For 60 ticks
db $40; |- 64 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $1e; '- For 30 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $3c; |- For 60 ticks
db $40; |- 64 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $1e; '- For 30 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $28; |- For 40 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $80; |- 128 pixels X
db $00; |- 0 blocks X
db $02; '- Hop mode 2
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $1e; '- For 30 ticks
db SPRITE_OP_GOTO; Op: Goto
dw $b01f; '- BSCRIPTS_ENEMY_MYCONID
;============================================================================
; Naga sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_NAGA:; [$b044]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b044] SpriteOp
db SPRITE_BEHAVIOR_NAGA; [$b045] SpriteBehavior
db $00; [$b046] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Giant Strider sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_GIANT_STRIDER:; [$b048]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Walk toward player
db $3c; |- For 60 ticks
db $00; |- 0 pixels X
db $01; '- 1 block X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $02; '- Hop mode 2
db SPRITE_OP_GOTO; Op: Goto
dw $b048; '- BSCRIPTS_ENEMY_GIANT_STRIDER
;============================================================================
; Yareeka sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_YAREEKA:; [$b058]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b058] SpriteOp
db SPRITE_BEHAVIOR_YAREEKA; [$b059] SpriteBehavior
db $00; [$b05a] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Magman sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_MAGMAN:; [$b05c]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b05c] SpriteOp
db SPRITE_BEHAVIOR_MAGMAN; [$b05d] SpriteBehavior
db $00; [$b05e] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Unused 36 sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_36:; [$b060]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b060] SpriteOp
db SPRITE_BEHAVIOR_ENEMY_UNUSED_36; [$b061] SpriteBehavior
db $00; [$b062] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Unused 39 sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_39:; [$b064]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b064] SpriteOp
db SPRITE_BEHAVIOR_ENEMY_UNUSED_39; [$b065] SpriteBehavior
db $00; [$b066] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Lamprey sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_LAMPREY:; [$b068]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Walk toward player
db $3c; |- For 60 ticks
db $50; |- 80 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_GOTO; Op: Goto
dw $b068; '- BSCRIPTS_ENEMY_LAMPREY
;============================================================================
; Unused 43 sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_43:; [$b072]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b072] SpriteOp
db SPRITE_BEHAVIOR_ENEMY_UNUSED_43; [$b073] SpriteBehavior
db $00; [$b074] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Tamazutsu sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_TAMAZUTSU:; [$b076]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b076] SpriteOp
db SPRITE_BEHAVIOR_TAMAZUTSU; [$b077] SpriteBehavior
db $00; [$b078] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Sir Gawaine/Wolfman sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_SIR_GAWAINE_WOLFMAN:; [$b07a]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b07a] SpriteOp
db SPRITE_BEHAVIOR_SIR_GAWAINE_WOLFMAN; [$b07b] SpriteBehavior
db $00; [$b07c] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Maskman sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_MASKMAN:; [$b07e]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Walk toward player
db $14; |- For 20 ticks
db $00; |- 0 pixels X
db $01; '- 1 block X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $02; '- Hop mode 2
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Walk toward player
db $14; |- For 20 ticks
db $00; |- 0 pixels X
db $01; '- 1 block X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $02; '- Hop mode 2
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Walk toward player
db $14; |- For 20 ticks
db $00; |- 0 pixels X
db $01; '- 1 block X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $01; '- Hop mode 1
db SPRITE_OP_GOTO; Op: Goto
dw $b07e; '- BSCRIPTS_ENEMY_MASKMAN
;============================================================================
; Unused 29 sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_29:; [$b0a8]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Rokusutahn sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_ROKUSUTAHN:; [$b0ac]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $14; |- For 20 ticks
db $00; |- 0 pixels X
db $01; '- 1 block X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $14; |- For 20 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $08; |- For 8 ticks
db $00; |- 0 pixels X
db $01; '- 1 block X
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance
db $00; |- Check X
db $10; |- If < 16 pixels
dw $b0ca; |- Then hop
dw $b0d0; '- Else loop
@_hop:; [$b0ca]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b0ca] SpriteOp
db SPRITE_BEHAVIOR_HOP; Op: Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $00; |- 0 blocks X
db $02; '- Hop mode 2
@_loop:; [$b0d0]
db SPRITE_OP_GOTO; Op: Goto
dw $b0ac; '- BSCRIPTS_BOSS_ROKUSUTAHN
;============================================================================
; Unused 18 sprite behavior script.
;============================================================================
BSCRIPTS_ENEMY_UNUSED_18:; [$b0d3]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b0d3] SpriteOp
db SPRITE_BEHAVIOR_ENEMY_UNUSED_18; [$b0d4] SpriteBehavior
db $00; [$b0d5] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Ripasheiku sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_RIPASHEIKU:; [$b0d7]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_RIPASHEIKU; |- Ripasheiku boss
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Zoradohna sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_ZORADOHNA:; [$b0db]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WAIT; |- Wait
db $3c; '- For 60 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused
db $00; |- 0 pixels X
db $00; |- 0 blocks X
db $02; '- Hop mode 2
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLY_UP; '- Rise up
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_VERT; |- Move vertically
db $08; |- For 8 ticks
db $00; |- 0 pixels Y
db $02; '- 2 blocks Y
@_mainLoop:; [$b0ed]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_SOMETHING_ZORADOHNA_18; |- TODO
db $00; |- For 0 ticks
db $00; |- 0 pixels X
db $01; |- 1 block X
db $02; '- TODO: Value 2
@_waitNearPlayer:; [$b0f5]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- X direction
db $20; |- If < 32 pixels
dw $b0fc; |- Then @_isNearPlayer
dw $b0f5; '- Else @_waitNearPlayer
@_isNearPlayer:; [$b0fc]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $02; |- 2 blocks X
db $01; '- Hop mode 1
db SPRITE_OP_GOTO; Op: Goto
dw $b0ed; '- @_mainLoop
;============================================================================
; Borabohra sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_BORABOHRA:; [$b108]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b108] SpriteOp
db SPRITE_BEHAVIOR_BORABOHRA; [$b109] SpriteBehavior
db $00; [$b10a] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Pakukame sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_PAKUKAME:; [$b10c]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b10c] SpriteOp
db SPRITE_BEHAVIOR_PAKUKAME; [$b10d] SpriteBehavior
db $00; [$b10e] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Zorugeriru sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_ZORUGERIRU:; [$b110]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b110] SpriteOp
db SPRITE_BEHAVIOR_ZORUGERIRU; [$b111] SpriteBehavior
db $00; [$b112] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; King Grieve sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_KING_GRIEVE:; [$b114]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b114] SpriteOp
db SPRITE_BEHAVIOR_KING_GRIEVE; [$b115] SpriteBehavior
db $00; [$b116] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Shadow Eura sprite behavior script.
;============================================================================
BSCRIPTS_BOSS_SHADOW_EURA:; [$b118]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b118] SpriteOp
db SPRITE_BEHAVIOR_SHADOW_EURA; [$b119] SpriteBehavior
db $00; [$b11a] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Enemy magic spell sprite behavior script.
;============================================================================
BSCRIPTS_GARBLED_81:; [$b11c]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b11c] SpriteOp
db SPRITE_BEHAVIOR_SOMETHING_GARBLED_81; [$b11d] SpriteBehavior
db $00; [$b11e] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Unused garbled 10 sprite behavior script.
;============================================================================
BSCRIPTS_GARBLED_10:; [$b120]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b120] SpriteOp
db SPRITE_BEHAVIOR_SOMETHING_GARBLED_10; [$b121] SpriteBehavior
db $00; [$b122] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Walking Man NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_WALKING_MAN_1:; [$b124]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $3c; |- For 60 ticks
db $c0; |- 192 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Stand still
db $1e; '- For 30 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_GOTO; Op: Goto
dw $b124; '- BSCRIPTS_NPC_WALKING_MAN+1
;============================================================================
; Unused blue day NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_UNUSED_BLUE_LADY:; [$b131]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $50; |- For 80 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $14; |- For 20 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $50; |- For 80 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_GOTO; Op: Goto
dw $b131; '- BSCRIPTS_NPC_UNUSED_BLUE_LADY
;============================================================================
; Unused child NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_UNUSED_CHILD:; [$b149]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $3c; |- For 60 ticks
db $c0; |- 192 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $03; '- Hop mode 3
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_HOP; |- Hop
db $00; |- (unused)
db $00; |- 0 pixels X
db $01; |- 1 block X
db $03; '- Hop mode 3
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WALK_FORWARD; |- Walk forward
db $0a; |- For 10 ticks
db $c0; |- 192 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $05; '- For 5 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_GOTO; Op: Goto
dw $b149; '- BSCRIPTS_NPC_UNUSED_CHILD
;============================================================================
; Armor salesman NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_ARMOR_SALESMAN:; [$b167]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Martial Artist NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_MARTIAL_ARTS:; [$b16b]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $01; '- 1 tick
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_GOTO; Op: Goto
dw $b16b; '- BSCRIPTS_NPC_MARTIAL_ARTS
;============================================================================
; Priest NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_PRIEST:; [$b173]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_ADD_TO_SPRITE_DATA; Op: Set sprite data
dw $00ba; |- X position
db $04; '- to 4
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Stand still
db $00; '- For 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; King NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_KING:; [$b17d]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
;
; Wait until the King and the player are within 64 pixels
; of each other.
;
@_waitNearPlayerLoop:; [$b180]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- For 0 ticks
db $40; |- If < 64 pixels
dw $b187; |- Then @_nearPlayer
dw $b180; '- Else @_waitNearPlayerLoop
;
; The player is now near the King. The King will step forward
; 8 pixels and stand on the ground.
;
@_nearPlayer:; [$b187]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_ADD_TO_SPRITE_DATA; Op: Add value to
dw $00ba; |- Sprite X position
db $08; '- Plus 8
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
;
; Wait until the player has moved away from the King.
;
; This has a longer distance check, since the King's
; position incremented when standing up.
;
@_waitAwayFromPlayerLoop:; [$b18f]
db SPRITE_OP_CHECK_DISTANCE; Op: Check distance to player
db $00; |- For 0 ticks
db $48; |- If < 72 pixels
dw $b18f; |- Then @_waitAwayFromPlayerLoop
dw $b196; '- Else @_awayFromPlayer
;
; The player is now far enough away from the King.
; The King can sit down.
;
@_awayFromPlayer:; [$b196]
db SPRITE_OP_FINISH_BEHAVIOR; Op: Finish behavior
db SPRITE_OP_ADD_TO_SPRITE_DATA; Op: Add value to
dw $00ba; |- Sprite X position
db $f8; '- Minus 8
db SPRITE_OP_GOTO; Op: Goto
dw $b17d; '- BSCRIPTS_NPC_KING
;============================================================================
; Magic Teacher NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_MAGIC_TEACHER:; [$b19e]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $01; '- For 1 tick
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_MAYBE_DISABLE_AND_GOTO; Op: Maybe: Disable and Go To
dw $b19e; '- BSCRIPTS_NPC_MAGIC_TEACHER
;============================================================================
; Doctor NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_DOCTOR:; [$b1a6]
db SPRITE_OP_ADD_TO_SPRITE_DATA; Op: Add to sprite value
dw $00ba; |- Sprite X position
db $08; '- Add 8
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Key Salesman NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_KEY_SALESMAN:; [$b1ae]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Smoking Man NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_SMOKING_MAN:; [$b1b2]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $05; '- For 5 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_GOTO; Op: Goto
dw $b1b2; '- BSCRIPTS_NPC_SMOKING_MAN
;============================================================================
; Man in chair NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_MAN_IN_CHAIR:; [$b1ba]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $05; '- For 5 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_GOTO; Op: Goto
dw $b1ba; '- BSCRIPTS_NPC_MAN_IN_CHAIR
;============================================================================
; Sitting man NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_SITTING_MAN_1:; [$b1c2]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Meat Salesman NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_MEAT_SALESMAN:; [$b1c6]
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $00; '- For 0 ticks
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Blue lady in dress with cup NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_LADY_BLUE_DRESS_WITH_CUP:; [$b1cc]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $c0; |- For 192 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $05; '- For 5 ticks
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $28; |- For 40 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_GOTO; Op: Goto
dw $b1cc; '- BSCRIPTS_NPC_LADY_BLUE_DRESS_WITH_CUP
;============================================================================
; King's Guard NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_KINGS_GUARD:; [$b1de]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $50; |- For 80 ticks
db $c0; |- 192 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $05; '- For 5 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_GOTO; Op: Goto
dw $b1de; '- BSCRIPTS_NPC_KINGS_GUARD
;============================================================================
; Walking woman 1 NPC sprite behavior script.
;============================================================================
BSCRIPTS_NPC_WALKING_WOMAN_1:; [$b1eb]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $50; |- For 80 ticks
db $c0; |- 192 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FALL; |- Fall/wait
db $0a; '- For 10 ticks
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FACE_PLAYER_X; '- Face player (X)
db SPRITE_OP_GOTO; Op: Goto
dw $b1eb; '- BSCRIPTS_NPC_WALKING_WOMAN+1
;============================================================================
; Walking woman 2 sprite behavior script.
;============================================================================
BSCRIPTS_NPC_WALKING_WOMAN_2:; [$b1fa]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $3c; |- For 60 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MOVE_TOWARD_PLAYER; |- Move toward player
db $50; |- For 80 ticks
db $80; |- 128 pixels X
db $00; '- 0 blocks X
db SPRITE_OP_RUN_ACTION; Op: Run action
db SPRITE_ACTION_FLIP_X_DIRECTION; '- Flip X direction
db SPRITE_OP_GOTO; Op: Goto
dw $b1fa; '- BSCRIPTS_NPC_WALKING_WOMAN_2
;============================================================================
; Ointment item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_OINTMENT:; [$b20b]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b20b] SpriteOp
db SPRITE_BEHAVIOR_ITEM_OINTMENT; [$b20c] SpriteBehavior
db $00; [$b20d] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Glove item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_GLOVE:; [$b20f]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b20f] SpriteOp
db SPRITE_BEHAVIOR_ITEM_GLOVE; [$b210] SpriteBehavior
db $00; [$b211] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Wingboots item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_WINGBOOTS:; [$b213]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b213] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_55; [$b214] SpriteBehavior
db $00; [$b215] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Potion-like item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_POTIONLIKE:; [$b217]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b217] SpriteOp
db SPRITE_BEHAVIOR_FALL; [$b218] SpriteBehavior
db $00; [$b219] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Mattock item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_MATTOCK:; [$b21b]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b21b] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_50; [$b21c] SpriteBehavior
db $00; [$b21d] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Hour Glass item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_HOURGLASS:; [$b21f]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b21f] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_51; [$b220] SpriteBehavior
db $00; [$b221] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Fountain sprite behavior script.
;============================================================================
BSCRIPTS_FOUNTAIN:; [$b223]
db SPRITE_OP_ADD_TO_SPRITE_DATA; Op: Add to sprite value
dw $00ba; |- Sprite X position
db $08; '- Plus 8
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_FOUNTAIN; [$b228] SpriteBehavior
db $00; [$b229] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Spring of Trunk sprite behavior script.
;============================================================================
BSCRIPTS_SPRING_OF_FORTRESS:; [$b22b]
db SPRITE_OP_ADD_TO_SPRITE_DATA; [$b22b] SpriteOp
dw $00ba; [$b22c] pointer
db $08; [$b22f] byte
db SPRITE_OP_SWITCH_BEHAVIOR
db SPRITE_BEHAVIOR_SPRING_OF_FORTRESS; [$b230] SpriteBehavior
db $00; [$b231] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Spring of Sky sprite behavior script.
;============================================================================
BSCRIPTS_SPRING_OF_SKY:; [$b233]
db SPRITE_OP_ADD_TO_SPRITE_DATA; [$b233] SpriteOp
dw $00ba; [$b234] pointer
db $08; [$b237] byte
db SPRITE_OP_SWITCH_BEHAVIOR
db SPRITE_BEHAVIOR_SPRING_OF_SKY; [$b238] SpriteBehavior
db $00; [$b239] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Spring of Joker sprite behavior script.
;============================================================================
BSCRIPTS_SPRING_OF_JOKER:; [$b23b]
db SPRITE_OP_ADD_TO_SPRITE_DATA; [$b23b] SpriteOp
dw $00ba; [$b23c] pointer
db $08; [$b23f] byte
db SPRITE_OP_SWITCH_BEHAVIOR
db SPRITE_BEHAVIOR_SPRING_OF_JOKER; [$b240] SpriteBehavior
db $00; [$b241] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Battle Suit item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_BATTLE_SUIT:; [$b243]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b243] SpriteOp
db SPRITE_BEHAVIOR_BATTLE_SUIT_DROPPED_BY_ZORADOHNA; [$b244] SpriteBehavior
db $00; [$b245] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Battle Helmet item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_BATTLE_HELMET:; [$b247]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b247] SpriteOp
db SPRITE_BEHAVIOR_BATTLE_HELMET_DROPPED_BY_ZORADOHNA; [$b248] SpriteBehavior
db $00; [$b249] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Dragon Slayer item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_DRAGON_SLAYER:; [$b24b]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b24b] SpriteOp
db SPRITE_BEHAVIOR_DRAGON_SLAYER_DROPPED_BY_KING_GRIEVE; [$b24c] SpriteBehavior
db $00; [$b24d] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Magical Rod item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_MAGICAL_ROD:; [$b24f]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b24f] SpriteOp
db SPRITE_BEHAVIOR_SHOW_MAGICAL_ROD; [$b250] SpriteBehavior
db $00; [$b251] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Black Onyx dropped by Zoradohna sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_BLACK_ONYX:; [$b253]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_BLACK_ONYX_DROPPED_FROM_ZORADOHNA; |- Black Onyx drops from Zoradohna
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Pendant dropped from Ripasheiku sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_PENDANT:; [$b257]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_PENDANT_DROPPED_FROM_RIPASHEIKU; |- Pendant drops from Ripasheiku
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Mattock dropped by Ripasheiku sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_MATTOCK_QUEST:; [$b25b]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_MATTOCK_DROPPED_BY_RPIASHEIKU; |- Mattock drops from Ripasheiku
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Wing Boots dropped by Zorugeriru sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_WINGSBOOTS_QUEST:; [$b25f]
db SPRITE_OP_SWITCH_BEHAVIOR; Op: Switch behavior
db SPRITE_BEHAVIOR_WING_BOOTS_DROPPED_BY_ZORUGERIRU; |- Wing Boots drops by Zorugeriru
db $00; '- (unused)
db SPRITE_OP_END_SCRIPT; Op: End script
;============================================================================
; Red Potion 2 item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_RED_POTION2:; [$b263]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b263] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_52; [$b264] SpriteBehavior
db $00; [$b265] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Poison item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_POISON:; [$b267]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b267] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_53; [$b268] SpriteBehavior
db $00; [$b269] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Glove 2 item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_GLOVE2:; [$b26b]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b26b] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_54; [$b26c] SpriteBehavior
db $00; [$b26d] byte
db SPRITE_OP_END_SCRIPT
;============================================================================
; Ointment 2 item sprite behavior script.
;============================================================================
BSCRIPTS_OBJ_OINTMENT2:; [$b26f]
db SPRITE_OP_SWITCH_BEHAVIOR; [$b26f] SpriteOp
db SPRITE_BEHAVIOR_RANDOMLY_SHOW_ITEM_56; [$b270] SpriteBehavior
db $00,$ff; [$b271] byte
hex 00 00 10 20 00 08 10 08 04 08 08 08 00 00 10 10; [$b274] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 10; [$b283] undefined
hex 00 00 10 10 00 00 10 10 00 00 10 10 00 00 10 10; [$b293] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 20; [$b2a3] undefined
hex 00 00 10 20 04 00 18 30 00 00 10 20 00 00 00 00; [$b2b3] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 10 00 00 10 20; [$b2c3] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 20; [$b2d3] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 20; [$b2e3] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 20; [$b2f3] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 20; [$b303] undefined
hex 00 00 10 20 00 00 10 20 00 00 10 20 00 00 10 20; [$b313] undefined
hex 00 00 10 20 00 00 20 40 00 00 20 30 04 00 18 30; [$b323] undefined
hex 00 00 20 20 00 00 10 20 00 00 40 18 08 00 28 50; [$b333] undefined
hex f8 00 20 20 f8 00 20 20 f8 00 20 20 00 00 28 30; [$b343] undefined
hex f0 00 30 20 00 00 30 20 00 00 30 20 f0 00 30 20; [$b353] undefined
hex 00 00 20 20 f8 00 20 20 00 00 20 30 f8 00 20 20; [$b363] undefined
hex f8 00 20 20 f8 00 20 20 f8 00 20 20 f8 00 20 20; [$b373] undefined
hex f8 00 20 20 f8 00 20 20 00 00 10 10 00 00 10 10; [$b383] undefined
hex 00 00 08 10 00 00 08 10 00 00 08 10 00 00 08 10; [$b393] undefined
hex 00 00 08 10 00 00 10 10 00 00 10 10 00 00 10 c0; [$b3a3] undefined
hex 00 00 10 10 04 04 08 08 00 00 20 20 00 00 10 10; [$b3b3] undefined
hex 00 00 10 10 00 00 10 10 00 00 10 10 00 00 10 10; [$b3c3] undefined
hex 00 00 10 10 00 00 10 10 00 00 10 10 00 00 10 10; [$b3d3] undefined
hex 00 00 10 10 00 00 10 10 00 00 10 10 00 00 10 10; [$b3e3] undefined
hex 00 00 10 10 00 00 20 20 00 00 20 20 00 00 20 20; [$b3f3] undefined
db $00,$00,$20,$20; [$b403] undefined
MAYBE_SPRITE_EXTENTS:; [$b407]
SPRITE_ENTITY_WEAPON_RANGES:
db $10; [0]:
MAYBE_SPRITE_EXTENTS_1_:; [$b408]
db $20; [1]:
db $10; [2]:
db $08; [3]:
db $08; [4]:
db $08; [5]:
db $10; [6]:
db $10; [7]:
db $10; [8]:
db $20; [9]:
db $10; [10]:
db $20; [11]:
db $10; [12]:
db $20; [13]:
db $10; [14]:
db $10; [15]:
db $10; [16]:
db $10; [17]:
db $10; [18]:
db $10; [19]:
db $10; [20]:
db $10; [21]:
db $10; [22]:
db $10; [23]:
db $10; [24]:
db $20; [25]:
db $10; [26]:
db $20; [27]:
db $10; [28]:
db $10; [29]:
db $10; [30]:
db $20; [31]:
db $10; [32]:
db $20; [33]:
db $20; [34]:
db $10; [35]:
db $10; [36]:
db $20; [37]:
db $00; [38]:
db $00; [39]:
db $10; [40]:
db $20; [41]:
db $10; [42]:
db $20; [43]:
db $10; [44]:
db $10; [45]:
db $10; [46]:
db $20; [47]:
db $10; [48]:
db $20; [49]:
db $10; [50]:
db $20; [51]:
db $10; [52]:
db $20; [53]:
db $10; [54]:
db $20; [55]:
db $10; [56]:
db $20; [57]:
db $10; [58]:
db $20; [59]:
db $10; [60]:
db $20; [61]:
db $10; [62]:
db $20; [63]:
db $10; [64]:
db $20; [65]:
db $10; [66]:
db $20; [67]:
db $10; [68]:
db $20; [69]:
db $10; [70]:
db $20; [71]:
db $10; [72]:
db $20; [73]:
db $10; [74]:
db $20; [75]:
db $10; [76]:
db $20; [77]:
db $10; [78]:
db $20; [79]:
db $10; [80]:
db $20; [81]:
db $10; [82]:
db $20; [83]:
db $10; [84]:
db $20; [85]:
db $10; [86]:
db $20; [87]:
db $10; [88]:
db $20; [89]:
db $20; [90]:
db $20; [91]:
db $20; [92]:
db $18; [93]:
db $20; [94]:
db $10; [95]:
db $20; [96]:
db $18; [97]:
db $10; [98]:
db $20; [99]:
db $40; [100]:
db $10; [101]:
db $30; [102]:
db $20; [103]:
db $10; [104]:
db $20; [105]:
db $10; [106]:
db $20; [107]:
db $10; [108]:
db $20; [109]:
db $28; [110]:
db $30; [111]:
db $20; [112]:
db $20; [113]:
db $30; [114]:
db $20; [115]:
db $30; [116]:
db $20; [117]:
db $20; [118]:
db $20; [119]:
db $10; [120]:
db $20; [121]:
db $10; [122]:
db $20; [123]:
db $10; [124]:
db $20; [125]:
db $10; [126]:
db $20; [127]:
db $10; [128]:
db $20; [129]:
db $10; [130]:
db $20; [131]:
db $10; [132]:
db $20; [133]:
db $10; [134]:
db $20; [135]:
db $10; [136]:
db $20; [137]:
db $10; [138]:
db $20; [139]:
db $10; [140]:
db $10; [141]:
db $10; [142]:
db $10; [143]:
db $08; [144]:
db $10; [145]:
db $08; [146]:
db $10; [147]:
db $08; [148]:
db $10; [149]:
db $08; [150]:
db $10; [151]:
db $08; [152]:
db $10; [153]:
db $10; [154]:
db $10; [155]:
db $10; [156]:
db $10; [157]:
db $10; [158]:
db $c0; [159]:
db $10; [160]:
db $10; [161]:
db $08; [162]:
db $08; [163]:
db $20; [164]:
db $20; [165]:
db $10; [166]:
db $10; [167]:
db $10; [168]:
db $10; [169]:
db $10; [170]:
db $10; [171]:
db $10; [172]:
db $10; [173]:
db $10; [174]:
db $10; [175]:
db $10; [176]:
db $10; [177]:
db $10; [178]:
db $10; [179]:
db $10; [180]:
db $10; [181]:
db $10; [182]:
db $10; [183]:
db $10; [184]:
db $10; [185]:
db $10; [186]:
db $10; [187]:
db $10; [188]:
db $10; [189]:
db $10; [190]:
db $10; [191]:
db $10; [192]:
db $10; [193]:
db $10; [194]:
db $10; [195]:
db $10; [196]:
db $10; [197]:
db $10; [198]:
db $10; [199]:
db $10; [200]:
db $10; [201]:
SPRITE_HITBOX_WIDTHS:; [$b4d1]
db $0f; [0]:
db $0f; [1]:
db $1f; [2]:
db $1f; [3]:
db $1f; [4]:
db $3f; [5]:
db $2f; [6]:
SPRITE_HITBOX_HEIGHTS:; [$b4d8]
db $0f; [0]:
db $1f; [1]:
db $2f; [2]:
db $3f; [3]:
db $1f; [4]:
db $1f; [5]:
db $4f; [6]:
;============================================================================
; A mapping of sprite entity IDs to hitbox types.
;============================================================================
SPRITE_ENTITIES_HITBOX_TYPES:; [$b4df]
db SPRITE_HITBOX_1; [0]:
db SPRITE_HITBOX_1; [1]:
SPRITE_ENTITIES_HITBOX_TYPES_2_:; [$b4e1]
db SPRITE_HITBOX_0; [2]:
db SPRITE_HITBOX_1; [3]:
db SPRITE_HITBOX_1; [4]:
db SPRITE_HITBOX_1; [5]:
db SPRITE_HITBOX_1; [6]:
db SPRITE_HITBOX_0; [7]:
db SPRITE_HITBOX_0; [8]:
db SPRITE_HITBOX_0; [9]:
db SPRITE_HITBOX_0; [10]:
db SPRITE_HITBOX_0; [11]:
db SPRITE_HITBOX_1; [12]:
db SPRITE_HITBOX_1; [13]:
db SPRITE_HITBOX_1; [14]:
db SPRITE_HITBOX_1; [15]:
db SPRITE_HITBOX_1; [16]:
db SPRITE_HITBOX_2; [17]:
db SPRITE_HITBOX_1; [18]:
db SPRITE_HITBOX_1; [19]:
db SPRITE_HITBOX_1; [20]:
db SPRITE_HITBOX_1; [21]:
db SPRITE_HITBOX_1; [22]:
db SPRITE_HITBOX_1; [23]:
db SPRITE_HITBOX_1; [24]:
db SPRITE_HITBOX_1; [25]:
db SPRITE_HITBOX_1; [26]:
db SPRITE_HITBOX_1; [27]:
db SPRITE_HITBOX_1; [28]:
db SPRITE_HITBOX_1; [29]:
db SPRITE_HITBOX_1; [30]:
db SPRITE_HITBOX_1; [31]:
db SPRITE_HITBOX_1; [32]:
db SPRITE_HITBOX_1; [33]:
db SPRITE_HITBOX_1; [34]:
db SPRITE_HITBOX_1; [35]:
db SPRITE_HITBOX_1; [36]:
db SPRITE_HITBOX_1; [37]:
db SPRITE_HITBOX_1; [38]:
db SPRITE_HITBOX_1; [39]:
db SPRITE_HITBOX_1; [40]:
db SPRITE_HITBOX_1; [41]:
db SPRITE_HITBOX_1; [42]:
db SPRITE_HITBOX_1; [43]:
db SPRITE_HITBOX_1; [44]:
db SPRITE_HITBOX_3; [45]:
db SPRITE_HITBOX_2; [46]:
db SPRITE_HITBOX_2; [47]:
db SPRITE_HITBOX_1; [48]:
db SPRITE_HITBOX_1; [49]:
db SPRITE_HITBOX_1; [50]:
db SPRITE_HITBOX_1; [51]:
db SPRITE_HITBOX_1; [52]:
db SPRITE_HITBOX_1; [53]:
db SPRITE_HITBOX_1; [54]:
db SPRITE_HITBOX_1; [55]:
db SPRITE_HITBOX_1; [56]:
db SPRITE_HITBOX_1; [57]:
db SPRITE_HITBOX_1; [58]:
db SPRITE_HITBOX_1; [59]:
db SPRITE_HITBOX_1; [60]:
db SPRITE_HITBOX_1; [61]:
db SPRITE_HITBOX_1; [62]:
db SPRITE_HITBOX_1; [63]:
db SPRITE_HITBOX_1; [64]:
db SPRITE_HITBOX_1; [65]:
db SPRITE_HITBOX_1; [66]:
db SPRITE_HITBOX_1; [67]:
db SPRITE_HITBOX_1; [68]:
db SPRITE_HITBOX_1; [69]:
db SPRITE_HITBOX_0; [70]:
db SPRITE_HITBOX_0; [71]:
db SPRITE_HITBOX_0; [72]:
db SPRITE_HITBOX_0; [73]:
db SPRITE_HITBOX_0; [74]:
db SPRITE_HITBOX_0; [75]:
db SPRITE_HITBOX_0; [76]:
db SPRITE_HITBOX_0; [77]:
db SPRITE_HITBOX_0; [78]:
db SPRITE_HITBOX_1; [79]:
SPRITE_ENTITIES_HITBOX_TYPES_80_:; [$b52f]
db SPRITE_HITBOX_0; [80]:
SPRITE_ENTITIES_HITBOX_TYPES_81_:; [$b530]
db SPRITE_HITBOX_0; [81]:
db SPRITE_HITBOX_4; [82]:
db SPRITE_HITBOX_0; [83]:
db SPRITE_HITBOX_0; [84]:
db SPRITE_HITBOX_0; [85]:
db SPRITE_HITBOX_0; [86]:
db SPRITE_HITBOX_0; [87]:
db SPRITE_HITBOX_0; [88]:
db SPRITE_HITBOX_0; [89]:
db SPRITE_HITBOX_0; [90]:
db SPRITE_HITBOX_0; [91]:
db SPRITE_HITBOX_0; [92]:
db SPRITE_HITBOX_0; [93]:
db SPRITE_HITBOX_0; [94]:
db SPRITE_HITBOX_0; [95]:
db SPRITE_HITBOX_0; [96]:
db SPRITE_HITBOX_4; [97]:
db SPRITE_HITBOX_4; [98]:
db SPRITE_HITBOX_4; [99]:
db SPRITE_HITBOX_1; [100]:
;============================================================================
; The category of a sprite entity.
;
; This is used to categorize a sprite entity into the following:
;
; 0 = Enemy
; 1 = Dropped item
; 2 = NPC
; 3 = Special effect
; 4 = Game trigger
; 5 = Item
; 6 = Magic effect
; 7 = Boss
;============================================================================
SPRITE_CATEGORIES_BY_ENTITY:; [$b544]
db SPRITE_ENEMY; [0]:
db SPRITE_DROPPED; [1]:
db SPRITE_DROPPED; [2]:
db SPRITE_ENEMY; [3]:
db SPRITE_ENEMY; [4]:
db SPRITE_ENEMY; [5]:
db SPRITE_ENEMY; [6]:
db SPRITE_ENEMY; [7]:
db SPRITE_ENEMY; [8]:
db SPRITE_ENEMY; [9]:
db SPRITE_MAGIC; [10]:
db SPRITE_ENEMY; [11]:
db SPRITE_ENEMY; [12]:
db SPRITE_ENEMY; [13]:
db SPRITE_ENEMY; [14]:
db SPRITE_ENEMY; [15]:
db SPRITE_ENEMY; [16]:
db SPRITE_BOSS; [17]:
db SPRITE_BOSS; [18]:
db SPRITE_EFFECT; [19]:
db SPRITE_EFFECT; [20]:
db SPRITE_ENEMY; [21]:
db SPRITE_ENEMY; [22]:
db SPRITE_ENEMY; [23]:
db SPRITE_ENEMY; [24]:
db SPRITE_ENEMY; [25]:
db SPRITE_ENEMY; [26]:
db SPRITE_ENEMY; [27]:
db SPRITE_ENEMY; [28]:
db SPRITE_ENEMY; [29]:
db SPRITE_ENEMY; [30]:
db SPRITE_ENEMY; [31]:
db SPRITE_ENEMY; [32]:
db SPRITE_ENEMY; [33]:
db SPRITE_ENEMY; [34]:
db SPRITE_ENEMY; [35]:
db SPRITE_ENEMY; [36]:
db SPRITE_ENEMY; [37]:
db SPRITE_ENEMY; [38]:
db SPRITE_ENEMY; [39]:
db SPRITE_ENEMY; [40]:
db SPRITE_ENEMY; [41]:
db SPRITE_ENEMY; [42]:
db SPRITE_ENEMY; [43]:
db SPRITE_ENEMY; [44]:
db SPRITE_BOSS; [45]:
db SPRITE_BOSS; [46]:
db SPRITE_BOSS; [47]:
db SPRITE_BOSS; [48]:
db SPRITE_BOSS; [49]:
db SPRITE_BOSS; [50]:
db SPRITE_BOSS; [51]:
db SPRITE_NPC; [52]:
db SPRITE_NPC; [53]:
db SPRITE_NPC; [54]:
db SPRITE_NPC; [55]:
db SPRITE_NPC; [56]:
db SPRITE_NPC; [57]:
db SPRITE_NPC; [58]:
db SPRITE_NPC; [59]:
db SPRITE_NPC; [60]:
db SPRITE_NPC; [61]:
db SPRITE_NPC; [62]:
db SPRITE_NPC; [63]:
db SPRITE_NPC; [64]:
db SPRITE_NPC; [65]:
db SPRITE_NPC; [66]:
db SPRITE_NPC; [67]:
db SPRITE_NPC; [68]:
db SPRITE_NPC; [69]:
db SPRITE_ENEMY; [70]:
db SPRITE_ENEMY; [71]:
db SPRITE_ITEM; [72]:
db SPRITE_ITEM; [73]:
db SPRITE_ITEM; [74]:
db SPRITE_ITEM; [75]:
db SPRITE_ITEM; [76]:
db SPRITE_ITEM; [77]:
db SPRITE_ITEM; [78]:
db SPRITE_TRIGGER; [79]:
db SPRITE_ITEM; [80]:
db SPRITE_MAGIC; [81]:
db SPRITE_EFFECT; [82]:
db SPRITE_MAGIC; [83]:
db SPRITE_MAGIC; [84]:
db SPRITE_ITEM; [85]:
db SPRITE_ITEM; [86]:
db SPRITE_ITEM; [87]:
db SPRITE_ITEM; [88]:
db SPRITE_ITEM; [89]:
db SPRITE_ITEM; [90]:
db SPRITE_ITEM; [91]:
db SPRITE_ITEM; [92]:
db SPRITE_ITEM; [93]:
db SPRITE_ITEM; [94]:
db SPRITE_ITEM; [95]:
db SPRITE_ITEM; [96]:
db SPRITE_EFFECT; [97]:
db SPRITE_EFFECT; [98]:
db SPRITE_EFFECT; [99]:
db SPRITE_EFFECT; [100]:
;============================================================================
; Starting HP for each entity type.
;============================================================================
SPRITE_ENTITIES_HP:; [$b5a9]
db $00; [0]:
db $00; [1]:
db $00; [2]:
db $00; [3]:
db $12; [4]:
db $18; [5]:
db $0e; [6]:
db $03; [7]:
db $05; [8]:
SPRITE_ENTITIES_HP_9_:; [$b5b2]
db $07; [9]:
db $08; [10]:
db $03; [11]:
db $10; [12]:
db $0c; [13]:
db $14; [14]:
db $18; [15]:
db $64; [16]:
db $46; [17]:
db $24; [18]:
db $00; [19]:
db $00; [20]:
db $1a; [21]:
db $08; [22]:
db $12; [23]:
db $16; [24]:
db $1d; [25]:
db $13; [26]:
db $16; [27]:
db $17; [28]:
db $00; [29]:
db $1d; [30]:
db $23; [31]:
db $20; [32]:
db $26; [33]:
db $30; [34]:
db $17; [35]:
db $24; [36]:
db $1f; [37]:
db $11; [38]:
db $20; [39]:
db $38; [40]:
db $24; [41]:
db $0a; [42]:
db $0b; [43]:
db $1a; [44]:
db $4b; [45]:
db $73; [46]:
db $69; [47]:
db $28; [48]:
db $18; [49]:
db $fa; [50]:
db $fa; [51]:
db $00; [52]:
db $00; [53]:
db $00; [54]:
db $00; [55]:
db $00; [56]:
db $00; [57]:
db $00; [58]:
db $00; [59]:
db $00; [60]:
db $00; [61]:
db $00; [62]:
db $00; [63]:
db $00; [64]:
db $00; [65]:
db $00; [66]:
db $00; [67]:
db $00; [68]:
db $00; [69]:
db $10; [70]:
db $09; [71]:
db $00; [72]:
db $00; [73]:
db $00; [74]:
db $00; [75]:
db $00; [76]:
db $00; [77]:
db $00; [78]:
db $00; [79]:
db $00; [80]:
db $08; [81]:
db $00; [82]:
db $08; [83]:
db $08; [84]:
db $00; [85]:
db $00; [86]:
db $00; [87]:
db $00; [88]:
db $00; [89]:
db $00; [90]:
db $00; [91]:
db $00; [92]:
db $00; [93]:
db $00; [94]:
db $00; [95]:
db $00; [96]:
db $00; [97]:
db $00; [98]:
db $00; [99]:
db $00; [100]:
;============================================================================
; Experience gained from defeating each entity type.
;============================================================================
ENEMY_EXPERIENCE:; [$b60e]
db $00; [0]:
db $00; [1]:
db $00; [2]:
db $00; [3]:
db $23; [4]:
db $37; [5]:
db $19; [6]:
db $19; [7]:
db $23; [8]:
db $19; [9]:
db $00; [10]:
db $19; [11]:
db $37; [12]:
db $3c; [13]:
db $2d; [14]:
db $0a; [15]:
db $32; [16]:
db $78; [17]:
db $5a; [18]:
db $00; [19]:
db $00; [20]:
db $41; [21]:
db $00; [22]:
db $28; [23]:
db $0d; [24]:
db $3a; [25]:
db $1d; [26]:
db $1a; [27]:
db $23; [28]:
db $00; [29]:
db $30; [30]:
db $3a; [31]:
db $36; [32]:
db $31; [33]:
db $1e; [34]:
db $3e; [35]:
db $26; [36]:
db $19; [37]:
db $21; [38]:
db $1d; [39]:
db $1e; [40]:
db $18; [41]:
db $14; [42]:
db $12; [43]:
db $0f; [44]:
db $5a; [45]:
db $9e; [46]:
db $4b; [47]:
db $55; [48]:
db $50; [49]:
db $00; [50]:
db $00; [51]:
db $00; [52]:
db $00; [53]:
db $00; [54]:
db $00; [55]:
db $00; [56]:
db $00; [57]:
db $00; [58]:
db $00; [59]:
db $00; [60]:
db $00; [61]:
db $00; [62]:
db $00; [63]:
db $00; [64]:
db $00; [65]:
db $00; [66]:
db $00; [67]:
db $00; [68]:
db $00; [69]:
db $19; [70]:
db $1e; [71]:
db $00; [72]:
db $00; [73]:
db $00; [74]:
db $00; [75]:
db $00; [76]:
db $00; [77]:
db $00; [78]:
db $00; [79]:
db $00; [80]:
db $08; [81]:
db $00; [82]:
db $08; [83]:
db $08; [84]:
db $00; [85]:
db $00; [86]:
db $00; [87]:
db $00; [88]:
db $00; [89]:
db $00; [90]:
db $00; [91]:
db $00; [92]:
db $00; [93]:
db $00; [94]:
db $00; [95]:
db $00; [96]:
db $00; [97]:
db $00; [98]:
db $00; [99]:
BYTE_ARRAY_PRG14__b672:; [$b672]
db $ff; [0]:
db $ff; [1]:
db $ff; [2]:
db $00; [3]:
db $08; [4]:
db $11; [5]:
db $ff; [6]:
db $07; [7]:
db $08; [8]:
db $ff; [9]:
db $00; [10]:
db $32; [11]:
db $13; [12]:
db $12; [13]:
db $11; [14]:
db $15; [15]:
db $1d; [16]:
db $15; [17]:
db $06; [18]:
db $ff; [19]:
db $ff; [20]:
db $14; [21]:
db $00; [22]:
db $0f; [23]:
db $13; [24]:
db $12; [25]:
db $14; [26]:
db $32; [27]:
db $38; [28]:
db $ff; [29]:
db $16; [30]:
db $18; [31]:
db $19; [32]:
db $1a; [33]:
db $33; [34]:
db $1b; [35]:
db $17; [36]:
db $18; [37]:
db $13; [38]:
db $33; [39]:
db $34; [40]:
db $33; [41]:
db $09; [42]:
db $34; [43]:
db $15; [44]:
db $19; [45]:
db $1c; [46]:
db $08; [47]:
db $16; [48]:
db $03; [49]:
db $ff; [50]:
db $ff; [51]:
db $ff; [52]:
db $ff; [53]:
db $ff; [54]:
db $ff; [55]:
db $ff; [56]:
db $ff; [57]:
db $ff; [58]:
db $ff; [59]:
db $ff; [60]:
db $ff; [61]:
db $ff; [62]:
db $ff; [63]:
db $ff; [64]:
db $ff; [65]:
db $ff; [66]:
db $ff; [67]:
db $ff; [68]:
db $ff; [69]:
db $0f; [70]:
db $32; [71]:
db $ff; [72]:
db $ff; [73]:
db $ff; [74]:
db $ff; [75]:
db $ff; [76]:
db $ff; [77]:
db $ff; [78]:
db $ff; [79]:
db $ff; [80]:
db $00; [81]:
db $ff; [82]:
db $00; [83]:
db $00; [84]:
db $ff; [85]:
db $ff; [86]:
db $ff; [87]:
db $ff; [88]:
db $ff; [89]:
db $ff; [90]:
db $ff; [91]:
db $ff; [92]:
db $ff; [93]:
db $ff; [94]:
db $ff; [95]:
db $ff; [96]:
db $ff; [97]:
db $ff; [98]:
db $ff; [99]:
db $ff; [100]:
;============================================================================
; Attack damage from each sprite entity type.
;============================================================================
SPRITE_ENTITY_DAMAGES:; [$b6d7]
db $00; [0]:
db $00; [1]:
db $00; [2]:
db $1f; [3]:
db $07; [4]: Raiden
db $09; [5]: Necron Aides
db $06; [6]: Zombie
db $03; [7]: Hornet
db $04; [8]: Bihoruda
db $06; [9]: Lilith
db $1c; [10]:
db $03; [11]: Yuinaru
db $04; [12]: Snowman
db $05; [13]: Nash
db $07; [14]: Fire Giant
db $0d; [15]: Ishiisu
db $0f; [16]: Execution Hood
db $14; [17]: Rokusutahn
db $14; [18]: Unused enemy (round body of snake boss)
db $00; [19]: Enemy death effect
db $00; [20]: Lightning ball effect
db $07; [21]: Charron
db $0a; [22]: Unused
db $0a; [23]: Geributa
db $04; [24]: Sugata
db $0d; [25]: Grimlock
db $05; [26]: Giant Bees
db $0e; [27]: Myconid
db $17; [28]: Naga
db $00; [29]: Unused (skeleton knight with sword and shield)
db $0f; [30]: Giant Strider
db $0c; [31]: Sir Gawaine
db $0b; [32]: Maskman
db $11; [33]: Wolfman
db $12; [34]: Yareeka
db $09; [35]: Magman
db $10; [36]: Unused enemy (curly-tailed guy with spear)
db $0b; [37]: Unused enemy
db $07; [38]: Ikeda
db $0a; [39]: Unused (blue muppet-looking guy)
db $10; [40]: Lamprey
db $0c; [41]: Unused enemy
db $05; [42]: Monodron
db $06; [43]: Unused enemy (winged skeleton guy)
db $0f; [44]: Tamazutsu
db $12; [45]: Ripasheiku
db $1c; [46]: Zoradohna
db $18; [47]: Borabohra
db $0d; [48]: Pakukame
db $0b; [49]: Zorugeriru
db $28; [50]: King Grieve
db $29; [51]: Shadow Eura
db $00; [52]:
db $00; [53]:
db $00; [54]:
db $00; [55]:
db $00; [56]:
db $00; [57]:
db $00; [58]:
db $00; [59]:
db $00; [60]:
db $00; [61]:
db $00; [62]:
db $00; [63]:
db $00; [64]:
db $00; [65]:
db $00; [66]:
db $00; [67]:
db $00; [68]:
db $00; [69]:
db $08; [70]: Unused enemy (eyeball)
db $07; [71]: Zozura
db $00; [72]:
db $00; [73]:
db $00; [74]:
db $00; [75]:
db $00; [76]:
db $00; [77]:
db $00; [78]:
db $00; [79]:
db $00; [80]:
db $08; [81]: ? Garbled
db $00; [82]:
db $1c; [83]:
db $08; [84]:
db $00; [85]:
db $00; [86]:
db $00; [87]:
db $00; [88]:
db $00; [89]:
db $00; [90]:
db $00; [91]:
db $00; [92]:
db $00; [93]:
db $00; [94]:
db $00; [95]:
db $00; [96]:
db $00; [97]:
db $00; [98]:
db $00; [99]:
SOMETHING_SPRITE_ENTITY_ADDR_VALUES:; [$b73b]
db $fc; [0]:
db $fc; [1]:
db $fc; [2]:
db $fc; [3]:
db $10; [4]:
db $50; [5]:
db $0c; [6]:
db $00; [7]:
db $00; [8]:
db $00; [9]:
db $fc; [10]:
db $00; [11]:
db $04; [12]:
db $fc; [13]:
db $40; [14]:
db $14; [15]:
db $c0; [16]:
db $00; [17]:
db $d0; [18]:
db $fc; [19]:
db $fc; [20]:
db $00; [21]:
db $fc; [22]:
db $00; [23]:
db $3c; [24]:
db $00; [25]:
db $0c; [26]:
db $14; [27]:
db $00; [28]:
db $00; [29]:
db $00; [30]:
db $00; [31]:
db $00; [32]:
db $00; [33]:
db $00; [34]:
db $00; [35]:
db $00; [36]:
db $54; [37]:
db $00; [38]:
db $40; [39]:
db $00; [40]:
db $00; [41]:
db $00; [42]:
db $00; [43]:
db $14; [44]:
db $40; [45]:
db $f4; [46]:
db $e0; [47]:
db $44; [48]:
db $00; [49]:
db $fc; [50]:
db $fc; [51]:
db $fc; [52]:
db $fc; [53]:
db $fc; [54]:
db $fc; [55]:
db $fc; [56]:
db $fc; [57]:
db $fc; [58]:
db $fc; [59]:
db $fc; [60]:
db $fc; [61]:
db $fc; [62]:
db $fc; [63]:
db $fc; [64]:
db $fc; [65]:
db $fc; [66]:
db $fc; [67]:
db $fc; [68]:
db $fc; [69]:
db $00; [70]:
db $00; [71]:
db $00; [72]:
db $fc; [73]:
db $fc; [74]:
db $00; [75]:
db $fc; [76]:
db $00; [77]:
db $fc; [78]:
db $fc; [79]:
db $00; [80]:
db $fc; [81]:
db $fc; [82]:
db $fc; [83]:
db $fc; [84]:
db $fc; [85]:
db $fc; [86]:
db $fc; [87]:
db $fc; [88]:
db $fc; [89]:
db $fc; [90]:
db $fc; [91]:
db $fc; [92]:
db $fc; [93]:
db $fc; [94]:
db $fc; [95]:
db $fc; [96]:
db $fc; [97]:
db $fc; [98]:
db $fc; [99]:
db $fc; [$b79f] undefined
;============================================================================
; Magic damage.
;============================================================================
MAGIC_DAMAGE:; [$b7a0]
db $06; [0]: Deluge -- 6HP
db $09; [1]: Thunder -- 9HP
db $18; [2]: Fire -- 12HP
db $22; [3]: Death -- 34HP
db $26; [4]: Tilte -- 38HP
;============================================================================
; Weapon damage.
;============================================================================
WEAPON_STRENGTHS:; [$b7a5]
db $04; [0]: Hand Dagger -- 4HP
db $08; [1]: Long Sword -- 8HP
db $0c; [2]: Giant Blade -- 12HP
db $10; [3]: Dragon Slayer -- 16HP
;============================================================================
; MP costs for magic spells.
;============================================================================
MAGIC_COSTS:; [$b7a9]
db $02; [0]: Deluge
db $04; [1]: Thunder
db $06; [2]: Fire
db $0a; [3]: Death
db $10; [4]: Tilte
;============================================================================
; TODO: Document Player_InitInventoryState
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Game_InitStateForStartScreen
;============================================================================
Player_InitInventoryState:; [$b7ae]
LDA #$00
STA a:NumberOfWeapons
STA a:NumberOfShields
STA a:NumberOfMagicSpells
STA a:NumberOfItems
STA a:NumberOfArmors
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document PlayerDeath_ResetSelectedItemState
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Player_HandleDeath
;============================================================================
PlayerDeath_ResetSelectedItemState:; [$b7bf]
LDA #$00
STA a:SelectedArmor
LDA #$ff
STA a:SelectedWeapon
STA a:Player_CurWeapon
STA a:SelectedShield
STA a:SelectedMagic
STA a:SelectedItem
RETURN_B7D5:; [$b7d5]
RTS
;============================================================================
; TODO: Document Player_DrawWeapon
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
EndGame_MainLoop
;
Game_DrawScreenInFrozenState
;
Game_MainLoop
;============================================================================
Player_DrawWeapon:; [$b7d6]
LDA a:IScript_PortraitID
BPL RETURN_B7D5
LDA a:Player_CurWeapon
BMI RETURN_B7D5
LDA Maybe_Player_NormArmorState
AND #$01
STA Temp_00
JSR Player_GetNormalizedWeaponID
ASL A
ORA Temp_00
ASL A
TAX
LDA #$b89f,X
STA Temp_Addr_L
LDA #$b8a0,X
STA Temp_Addr_U
JSR Maybe_Player_CalcAnimFrame
STA Temp_00
ASL A
TAY
LDA Player_Flags
AND #$40
BEQ @LAB_PRG14__b806
INY
@LAB_PRG14__b806:; [$b806]
LDA (Temp_Addr_L),Y
JSR Something_SetValueAndFFForNeg
LDA Player_PosX_Block
CLC
ADC Temp_04
STA PlayerPosXPlus10
LDA Screen_Maybe_ScrollXCounter
ADC Temp_05
STA Maybe_Something_WeaponPosX
CMP Screen_Maybe_ScrollXCounter
BNE RETURN_B7D5
LDA a:Player_CurWeapon
ASL A
TAX
LDA #$b90f,X
STA Temp_Addr_L
LDA #$b910,X
STA Temp_Addr_U
LDY Temp_00
LDA Player_PosY
CLC
ADC (Temp_Addr_L),Y
STA Maybe_Something_WeaponPosY
LDA Player_Something_ScrollPosY
ADC #$00
STA DrawWeapon_Unused_00D1
LDA a:Player_CurWeapon
ASL A
TAX
LDA #$b897,X
STA Maybe_WeaponRange_X
LDA #$b898,X
STA Maybe_WeaponRange_Y
LDA Maybe_Something_WeaponPosX
CMP Screen_Maybe_ScrollXCounter
BEQ @LAB_PRG14__b850
RTS
@LAB_PRG14__b850:; [$b850]
LDA Player_Flags
AND #$40
STA CurrentSprite_FlipMask
LDA PlayerPosXPlus10
STA Maybe_Arg_CurrentSprite_PosX
LDA Maybe_Something_WeaponPosY
STA Maybe_Arg_CurrentSprite_PosY
LDA Temp_00
PHA
JSR CurrentSprite_CalculateVisibility_MaybeWithArg
PLA
STA Temp_00
LDX a:Player_CurWeapon
LDA #$b87c,X
STA Maybe_CurrentSprite_PPUOffset
LDA Temp_00
CLC
ADC #$b878,X
JMP #$f039
;============================================================================
; Sprite addresses for each weapon type.
;============================================================================
WEAPONS_SPRITE_L:; [$b878]
db $40; [0]:
db $48; [1]:
db $50; [2]:
db $58; [3]:
WEAPONS_SPRITE_U:; [$b87c]
db $38; [0]:
db $38; [1]:
db $38; [2]:
db $34; [3]:
;============================================================================
; TODO: Document Something_SetValueAndFFForNeg
;
; INPUTS:
; A
;
; OUTPUTS:
; TODO
;
; XREFS:
;
Player_DrawWeapon
;
FUN_PRG15_MIRROR__ec58
;============================================================================
Something_SetValueAndFFForNeg:; [$b880]
STA Temp_04
LDA #$00
STA Temp_05
LDA Temp_04
BPL @_return
LDA #$ff
STA Temp_05
@_return:; [$b88e]
RTS
hex 18 10 18 18 18 18 20 00; [$b88f] undefined
MAYBE_WEAPON_RANGES_U:; [$b897]
dw $0408,$0810,$0810,$0810; [$b897] ushort
PTR_ARRAY_PRG14__b89f:; [$b89f]
dw $b8af; [0]:
dw $b8bf; [1]:
dw $b8cf; [2]:
dw $b8df; [3]:
dw $b8ef; [4]:
dw $b8ff; [5]:
dw $b8ff; [6]:
dw $b8ff; [7]:
DAT_PRG14__b8af:; [$b8af]
hex f8 10 fc 0c f8 10 f8 10 f8 10 f8 0e f0 18 00 00; [$b8af] undefined
DAT_PRG14__b8bf:; [$b8bf]
hex f8 10 f8 10 f8 10 f8 10 f8 10 f8 10 f0 18 00 00; [$b8bf] undefined
DAT_PRG14__b8cf:; [$b8cf]
hex f8 10 fc 0c f8 10 f8 10 f8 10 f0 10 e8 18 00 00; [$b8cf] undefined
DAT_PRG14__b8df:; [$b8df]
hex f8 10 f8 10 f8 10 f8 10 f8 10 f0 10 e8 18 00 00; [$b8df] undefined
DAT_PRG14__b8ef:; [$b8ef]
hex f0 10 fc 0c f8 10 f0 10 f8 10 f0 10 e8 18 00 00; [$b8ef] undefined
DAT_PRG14__b8ff:; [$b8ff]
hex f0 10 f8 10 f8 10 f0 10 f8 10 f0 10 e8 18 00 00; [$b8ff] undefined
PTR_ARRAY_PRG14__b90f:; [$b90f]
dw $b917; [0]: Hand dagger
dw $b91f; [1]: Long sword
dw $b91f; [2]: Giant blade
dw $b91f; [3]: Dragon slayer
DAT_PRG14__b917:; [$b917]
hex 08 08 08 08 08 08 06 00; [$b917] undefined
DAT_PRG14__b91f:; [$b91f]
hex 00 08 08 00 08 08 06 00; [$b91f] undefined
;============================================================================
; TODO: Document Maybe_Player_CalcAnimFrame
;
; INPUTS:
; None.
;
; OUTPUTS:
; A
;
; XREFS:
;
Player_DrawShield
;
Player_DrawWeapon
;
WasPlayerHitByMagic
;============================================================================
Maybe_Player_CalcAnimFrame:; [$b927]
LDA Player_Flags
LSR A
BCC @LAB_PRG14__b933
LDA Player_Flags
BMI @LAB_PRG14__b958
LDA #$03
RTS
@LAB_PRG14__b933:; [$b933]
AND #$04
BEQ @LAB_PRG14__b954
LDA Player_PosX_Block
AND #$0f
BEQ @LAB_PRG14__b943
LDA Player_Flags
AND #$04
BNE @LAB_PRG14__b954
@LAB_PRG14__b943:; [$b943]
LDA Player_Flags
AND #$10
BEQ @LAB_PRG14__b954
LDA Player_MovementTick
AND #$10
ASL A
ASL A
STA CurrentSprite_FlipMask
LDA #$07
RTS
@LAB_PRG14__b954:; [$b954]
LDA Player_Flags
BPL @LAB_PRG14__b95e
@LAB_PRG14__b958:; [$b958]
LDX PlayerHitsPhaseCounter
LDA #$b97b,X
RTS
@LAB_PRG14__b95e:; [$b95e]
LDA Player_StatusFlag
BPL @LAB_PRG14__b969
LDA Joy1_ButtonMask
BPL @LAB_PRG14__b969
LDA #$03
RTS
@LAB_PRG14__b969:; [$b969]
LDA Player_Flags
AND #$20
BEQ @LAB_PRG14__b976
LDA Player_MovementTick
LSR A
LSR A
LSR A
AND #$03
@LAB_PRG14__b976:; [$b976]
TAX
LDA #$b97e,X
RTS
BYTE_ARRAY_PRG14__b97b:; [$b97b]
db $04; [0]:
db $05; [1]:
db $06; [2]:
BYTE_ARRAY_PRG14__b97e:; [$b97e]
db $00; [0]:
db $01; [1]:
db $02; [2]:
db $01; [3]:
;============================================================================
; TODO: Document Player_DrawShield
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
EndGame_MainLoop
;
Game_DrawScreenInFrozenState
;
Game_MainLoop
;============================================================================
Player_DrawShield:; [$b982]
LDA a:IScript_PortraitID
BPL @_return
LDA a:SelectedShield
BMI @_return
CMP #$03
BEQ @_return
JSR Maybe_Player_CalcAnimFrame
STA Temp_00
ASL A
TAY
LDA Player_Flags
AND #$40
BEQ @LAB_PRG14__b99e
INY
@LAB_PRG14__b99e:; [$b99e]
LDA Player_PosX_Block
CLC
ADC #$b9dd,Y
STA a:Player_ShieldPositionX
LDA Player_PosY
CLC
ADC #$08
STA a:Player_ShieldPositionY
LDA Player_Flags
AND #$40
STA CurrentSprite_FlipMask
LDA #$30
STA Maybe_CurrentSprite_PPUOffset
LDA a:Player_ShieldPositionX
STA Maybe_Arg_CurrentSprite_PosX
LDA a:Player_ShieldPositionY
STA Maybe_Arg_CurrentSprite_PosY
LDA Temp_00
PHA
JSR CurrentSprite_CalculateVisibility_MaybeWithArg
PLA
STA Temp_00
LDY Temp_00
LDA #$b9d5,Y
JMP #$f039
@_return:; [$b9d4]
RTS
MAYBE_SHIELD_SPRITE_PPU_OFFSETS:; [$b9d5]
db $60; [0]:
db $60; [1]:
db $60; [2]:
db $60; [3]:
db $61; [4]:
db $60; [5]:
db $62; [6]:
db $42; [7]:
SHIELD_SPRITE_OFFSETS_X:; [$b9dd]
db $00; [0]:
db $08; [1]:
db $00; [2]:
db $08; [3]:
db $00; [4]:
db $08; [5]:
db $00; [6]:
db $08; [7]:
db $00; [8]:
db $08; [9]:
db $00; [10]:
db $08; [11]:
db $08; [12]:
db $00; [13]:
db $00; [14]:
db $00; [15]:
CurrentSprite_CalculateVisibility_MaybeWithArg:; [$b9ed]
LDA #$00
STA Temp_MovingSpriteVisibility
LDA Maybe_Arg_CurrentSprite_PosY
STA Arg_PixelPosY
LDA Maybe_Arg_CurrentSprite_PosX
CLC
ADC #$04
STA Arg_PixelPosX
JSR #$e86c
JSR #$e8c3
CMP #$04
BEQ @LAB_PRG14__ba0e
CMP #$0d
BEQ @LAB_PRG14__ba0e
CMP #$09
BNE @LAB_PRG14__ba14
@LAB_PRG14__ba0e:; [$ba0e]
LDA Temp_MovingSpriteVisibility
ORA #$01
STA Temp_MovingSpriteVisibility
@LAB_PRG14__ba14:; [$ba14]
LDA Maybe_Arg_CurrentSprite_PosX
CLC
ADC #$0c
STA Arg_PixelPosX
JSR #$e86c
JSR #$e8c3
CMP #$04
BEQ @LAB_PRG14__ba2d
CMP #$0d
BEQ @LAB_PRG14__ba2d
CMP #$09
BNE @LAB_PRG14__ba33
@LAB_PRG14__ba2d:; [$ba2d]
LDA Temp_MovingSpriteVisibility
ORA #$02
STA Temp_MovingSpriteVisibility
@LAB_PRG14__ba33:; [$ba33]
LDA Player_Flags
AND #$40
BEQ @LAB_PRG14__ba46
LDA Temp_MovingSpriteVisibility
BEQ SUB_PRG14__ba48
CMP #$03
BEQ SUB_PRG14__ba48
EOR #$03
JMP SUB_PRG14__ba48
@LAB_PRG14__ba46:; [$ba46]
LDA Temp_MovingSpriteVisibility
SUB_PRG14__ba48:; [$ba48]
STA MovingSpriteVisibility
RTS
;============================================================================
; Return the player's current weapon.
;
; If the weapon is unset, it will be normalized to a
; hand dagger.
;
; INPUTS:
;
Player_CurWeapon:
; The current weapon.
;
; OUTPUTS:
; A:
; The normalized weapon.
;
; XREFS:
;
Player_DrawWeapon
;============================================================================
Player_GetNormalizedWeaponID:; [$ba4b]
LDA a:Player_CurWeapon; Load the player's current weapon.
CMP #$ff; Is it unset?
BNE @_return; If not, return.
LDA #$00; Else, return the Hand Dagger.
@_return:; [$ba54]
RTS
;============================================================================
; Clear the visible magic on the screen.
;
; INPUTS:
; None.
;
; OUTPUTS:
;
CastMagic_Type:
; The magic, unset.
;
; XREFS:
;
Game_InitStateForSpawn
;============================================================================
Player_ClearVisibleMagic:; [$ba55]
LDA #$ff
STA a:CastMagic_Type; Unset the cast magic type.
RTS
Player_CastMagic:; [$ba5b]
;
; Check if there's any visible magic on the screen.
;
; If so, run its handler and return.
;
LDA a:CastMagic_Type; Load the visible magic.
BPL CastMagic_RunSpellHandler; If unset, jump to the next function in the spell cast logic.
;
; Check if the player is climbing a ladder.
;
JSR #$ecf6; Check if the player can cast magic.
BCS @_return2; If not, we're done.
;
; Check if the player has pressed Up-B to cast magic.
;
LDA Joy1_ButtonMask; Load the current button mask.
AND #$08; Has Up been pressed?
BEQ @_return1; If not, return.
LDA Joy1_ChangedButtonMask; Load the newly-changed button mask.
AND #$40; Has B been pressed?
BEQ @_return1; If not, return.
;
; Load the currently-selected magic spell.
;
; Only the primary spells (not extra stages of the spells)
; are supported.
;
LDA a:SelectedMagic; Load the magic spell.
CMP #$05; Compare against 5 (Tilte -- last spell).
BCC @LAB_PRG14__ba79; If a valid spell, then jump.
@_return1:; [$ba78]
RTS; We're done.
;
; If the player has enough MP for the spell, reduce the MP
; for the spell cost.
;
@LAB_PRG14__ba79:; [$ba79]
JSR #$c0c3; Reduce the MP.
BCS @_return1; If there's not enough, we're done.
;
; Load the magic spell again.
;
LDA a:SelectedMagic; Load the magic spell.
CMP #$04; Compare it to 4 (Fire).
BEQ @_playTilteSound
;
; This is any magic spell other than Tilte, which
; has its own sound.
;
LDA #$05
JSR #$d0e4; Play the standard magic sound effect.
JMP @_placeMagic
;
; This is Tilte magic. Play its sound effect.
;
@_playTilteSound:; [$ba8d]
LDA #$14
JSR #$d0e4; Play the Tilte magic sound effect.
;
; Begin placing the magic spell on the screen.
;
@_placeMagic:; [$ba92]
LDA a:SelectedMagic; Load the magic spell.
STA a:CastMagic_Type; Set it as the visible magic.
;
; Calculate the direction the player is facing in order
; to know which direction to send the spell.
;
LDA Player_Flags; Load the player's flags.
AND #$40; Pull out the Facing Right bit.
STA a:CastMagic_Flags; Store as the direction.
;
; Set the initial X position of the magic.
;
LDY a:CastMagic_Type; Y = visible magic
LDA Player_PosX_Block; A = player X position
ADC #$baf2,Y; Load the relative starting X position for the spell.
STA a:CastMagic_XPos_Full; Set it as the full X start position.
LDA Player_PosY; A = player Y position
CLC
;
; Set the initial Y position of the magic.
;
ADC #$baed,Y; Load the relative starting Y position for the spell.
STA a:CastMagic_YPos_Full; Set it as the full Y start position.
;
; Clear the rest of the default state.
;
LDA #$00
STA a:CastMagic_XPos_Frac; Fractional X = 0
STA a:CastMagic_YPos_Frac; Fraction Y = 0
STA a:CastMagic_Counter; Counter = 0
STA a:CastMagic_Phase; Phase = 0
;
; Tilte behaves differently, so check which spell's being cast.
;
LDA a:CastMagic_Type; Load the magic spell.
CMP #$04; Compare against Tilte.
BNE CastMagic_RunSpellHandler; If Tilte, jump to the next function in the spell cast logic.
;
; This is Tilte. Set the flags as initially falling for the
; downward arc.
;
LDA a:CastMagic_Flags; Load the magic's flags.
ORA #$80; Set the Falling bit.
STA a:CastMagic_Flags; Store it back out.
;
; Set the magic counter to a default of 33.
;
LDA #$21; A = 0x21
STA a:CastMagic_Counter; Store as the magic's counter.
JMP CastMagic_RunSpellHandler; Jump to the next function in the spell cast logic.
@_return2:; [$bad8]
RTS
;============================================================================
; Run the handler for spawning or updating the current spell.
;
; This will fetch the address of the method used to handle
; a spell and put it on the stack, running it once this
; function has finished.
;
; NOTES:
; This is pushing two addresses onto the stack for A:
;
; 1.
CastMagic_RunUpdateSpellHandler as the
; finish
; handler.
;
; 2. The address of the handler.
;
; INPUTS:
; VisiblePlayerMagic:
; The magic spell currently set.
;
; OUTPUTS:
; A:
; The address of the handler.
;
; XREFS:
;
Player_CastMagic
;============================================================================
CastMagic_RunSpellHandler:; [$bad9]
;
; Push PRG15_MIRROR:C2E9 to the stack as the result
; after our magic function.
;
LDA #$c2
PHA
LDA #$e8
PHA
;
; Load the current spell into A and shift left 1 for lookup.
;
; Transfer that to Y as the index into the lookup table for
; the address.
;
LDA a:CastMagic_Type; A = Current spell
ASL A; Multiply by 2.
TAY; Y = A
LDA #$baf8,Y; Load the upper nibble of the address
PHA; Push onto A
LDA #$baf7,Y; Load the lower nibble of the address
PHA; Push onto A
;============================================================================
; TODO: Document CastMagic_Noop
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb09]
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb39]
;============================================================================
CastMagic_Noop:; [$baec]
RTS
CAST_MAGIC_START_Y:; [$baed]
db $08; [0]: Deluge
db $00; [1]: Thunder
db $00; [2]: Fire
db $08; [3]: Death
db $08; [4]: Tilte
CAST_MAGIC_START_X:; [$baf2]
db $00; [0]: Deluge
db $00; [1]: Thunder
db $00; [2]: Fire
db $00; [3]: Death
db $00; [4]: Tilte
CAST_MAGIC_UPDATE_HANDLERS:; [$baf7]
dw CastMagic_UpdateDeluge-1; [0]: Deluge
dw CastMagic_UpdateThunderOrDeath-1; [1]: Thunder
dw CastMagic_UpdateFire-1; [2]: Fire
dw CastMagic_HandleDeath-1; [3]: Death
dw CastMagic_UpdateTilte-1; [4]: Tilte
dw CastMagic_Unused_UpdateDelugeAfterFirstHit-1; [5]: Deluge after first hit
dw CastMagic_UpdateThunderAfterFirstHit-1; [6]: Thunder after first hit
dw CastMagic_UpdateFireAfterFirstHit-1; [7]: Fire after first hit
dw CastMagic_UpdateDeathAfterFirstHit-1; [8]: Death after first hit
dw CastMagic_Noop-1; [9]: UNUSED: No-op
dw CastMagic_Unused_UpdateHitWallEffect-1; [10]: UNUSED: Hit Wall effect
dw CastMagic_UpdateTilteAfterFirstHit-1; [11]: Tilte magic after first hit
CAST_MAGIC_HIT_HANDLERS:; [$bb0f]
dw CastMagic_HitHandler_Deluge-1; [0]: Deluge
dw CastMagic_HitHandler_Thunder-1; [1]: Thunder
dw CastMagic_HitHandler_Fire-1; [2]: Fire
dw CastMagic_HitHandler_Death-1; [3]: Death
dw CastMagic_HitHandler_Tilte-1; [4]: Tilte
dw CastMagic_HitHandler_NoOp-1; [5]: Deluge after first hit
dw CastMagic_HitHandler_NoOp-1; [6]: Thunder after first hit
dw CastMagic_HitHandler_NoOp-1; [7]: Fire after first hit
dw CastMagic_HitHandler_NoOp-1; [8]: Death after first hit
dw CastMagic_HitHandler_NoOp-1; [9]: UNUSED
dw CastMagic_HitHandler_NoOp-1; [10]: UNUSED: Hit Wall effect
dw CastMagic_HitHandler_NoOp-1; [11]: Tilte after first hit
;============================================================================
; Handlers for finishing casting a magic spell.
;============================================================================
CAST_MAGIC_UPDATE_HANDLERS:; [$bb27]
dw CastMagic_FinishHandler_Deluge-1; [0]: Deluge
dw CastMagic_FinishHandler_Thunder-1; [1]: Thunder
dw CastMagic_FinishHandler_Fire-1; [2]: Fire
dw CastMagic_FinishHandler_Death-1; [3]: Death
dw CastMagic_FinishHandler_Tilte-1; [4]: Tilte
dw CastMagic_FinishHandler_DelugeOrDeathAfterHit-1; [5]: Deluge after first hit
dw CastMagic_FinishHandler_Thunder-1; [6]: Thunder after first hit
dw CastMagic_FinishHandler_Fire-1; [7]: Fire after first hit
dw CastMagic_FinishHandler_DelugeOrDeathAfterHit-1; [8]: Death after first hit
dw CastMagic_Noop-1; [9]: UNUSED
dw CastMagic_FinishHandler_HitWallEffect-1; [10]: UNUSED: Hit Wall effect
dw CastMagic_FinishHandler_TilteAfterFirstHit-1; [11]: Tilte after first hit
CastMagic_Clear:; [$bb3f]
LDA #$ff
STA a:CastMagic_Type
RTS
CastMagic_UpdateDeluge:; [$bb45]
;
; Update the position by X +/- 3 and check if the
; magic flew off-screen.
;
LDA #$03
STA a:Arg_DeltaX_Full; Set delta X block argument to 3.
LDA #$00
STA a:Arg_DeltaX_Frac; Set delta X pixel argument to 0.
JSR CastMagic_UpdateXPosition; Update position.
BCC @_checkCollision; If not off-screen, check for collision.
;
; It's off-screen. Clear the magic.
;
JMP CastMagic_Clear; Clear the magic.
;
; Check if the magic is on a block other than air.
;
@_checkCollision:; [$bb57]
LDA Blocks_Result; Check which block the magic is on.
BEQ @_return; If air, we're done.
;
; It hit a block. Play the sound effect.
;
LDA #$0a
JSR #$d0e4; Play the Magic Hit Obstacle sound effect.
;
; Clear the magic spell.
;
; NOTE:
; Originally, it seems this was meant to set a
; Hit Wall effect instead. This can be re-enabled
; by changing
CastMagic_Type to 10.
;
LDA #$ff
STA a:CastMagic_Type; Unset the cast magic spell.
LDA #$04
STA a:CastMagic_Unused_HitWallDeltaPosY; Set the Hit Wall appearance offset.
@_return:; [$bb6a]
RTS
;============================================================================
; Handle the Deluge magic hitting something.
;
; This will set an animation counter, clear out the magic
; type, and update the X position based on the sprite's
; X position.
;
; INPUTS:
;
CurrentSpriteIndex:
; The current sprite index of the entity that
; was hit.
;
; OUTPUTS:
;
CastMagic_Counter:
; Set to 4.
;
;
CastMagic_Type:
; Unset (0xFF).
;
;
CastMagic_XPos_Full:
; The same position as the sprite that was hit.
;
; XREFS:
;
CAST_MAGIC_HIT_HANDLERS [$PRG14::bb0f]
;============================================================================
CastMagic_HitHandler_Deluge:; [$bb6b]
LDA #$ff
STA a:CastMagic_Type; Unset the magic type.
LDA #$04
STA a:CastMagic_Counter; Set the magic counter to 4.
;
; Update the X position of the cast magic to the sprite's
; x position.
;
LDX a:CurrentSpriteIndex; X = current sprite index
LDA CurrentSprites_XPos_Full,X; A = current sprite X position.
STA a:CastMagic_XPos_Full; Store as the X position.
RTS
CastMagic_UpdateThunderOrDeath:; [$bb7e]
;
; Update the position by X +/- 2 and check if the
; magic flew off-screen.
;
LDA #$02
STA a:Arg_DeltaX_Full; Set the delta X position to check to 2.
LDA #$00
STA a:Arg_DeltaX_Frac; Set the delta fractional X position to 0.
JSR CastMagic_UpdateXPosition; Update the X position and check if it stayed on-screen.
BCC @_return; If still on-screen, jump.
;
; It's off-screen. Clear the magic.
;
JMP CastMagic_Clear; Clear the magic.
@_return:; [$bb90]
RTS
;============================================================================
; Handle the Thunder magic hitting something.
;
; This will reset the animation counter (as it will
; still go through the enemy) and set a Thunder Explosion
; effect.
;
; INPUTS:
; None.
;
; OUTPUTS:
;
CastMagic_Counter:
; Set to 0x18.
;
;
CastMagic_Type:
; Set to the Thunder Explosion state.
;
; XREFS:
;
CAST_MAGIC_HIT_HANDLERS [$PRG14::bb11]
;============================================================================
CastMagic_HitHandler_Thunder:; [$bb91]
LDA #$18
STA a:CastMagic_Counter; Set the magic counter to 24.
LDA #$06
STA a:CastMagic_Type; Set the magic type to the thunder explosion effect.
RTS
CastMagic_UpdateFire:; [$bb9c]
;
; Update X +/- 4 and check if the magic flew off-screen.
;
LDA #$04
STA a:Arg_DeltaX_Full; Full Delta X = 4
LDA #$00
STA a:Arg_DeltaX_Frac; Fractional Delta X = 0
JSR CastMagic_UpdateXPosition; Update the X position.
BCC @_checkCollision; If not off-screen, check for collision.
;
; It's off-screen. Clear the magic.
;
JMP CastMagic_Clear; Clear the magic.
;
; Check if the magic is on a block other than air.
;
@_checkCollision:; [$bbae]
LDA Blocks_Result; Check which block the magic is on.
BEQ @_return; If air, we're done.
;
; It hit a block. Play the sound effect.
;
LDA #$0a
JSR #$d0e4; Play the Magic Hit Obstacle sound effect.
;
; Clear the magic spell.
;
; NOTE:
; Originally, it seems this was meant to set a
; Hit Wall effect instead. This can be re-enabled
; by changing
CastMagic_Type to 10.
;
LDA #$00
STA a:CastMagic_Unused_HitWallDeltaPosY; Set the Hit Wall appearance offset.
LDA #$ff
STA a:CastMagic_Type; Unset the cast magic spell.
;
; Set the final X position.
;
; If facing right, this will add 16 to the position, letting
; it appear to go off-screen.
;
LDA a:CastMagic_Flags; Load the magic's flags.
AND #$40; Check the direction bit.
LSR A; If set, divide by 8 (resulting in 16).
LSR A
ADC a:CastMagic_XPos_Full; Add to the current position.
STA a:CastMagic_XPos_Full; And set it.
;
; Switch the direction of the spell.
;
LDA a:CastMagic_Flags; Load the flags.
AND #$7f; Clear the Attacking bit.
EOR #$40; Toggle the Facing Right bit.
STA a:CastMagic_Flags; Store it.
@_return:; [$bbd8]
RTS
;============================================================================
; Handle the Fire magic hitting something.
;
; This will clear out the animation counter and then
; set the type to a Fire magic that will disappear
; after hitting 255 enemies (which won't happen).
;
; INPUTS:
;
CurrentSpriteIndex:
; The current sprite index of the entity that
; was hit.
;
; OUTPUTS:
;
CastMagic_Counter:
; Set to 0xFF.
;
;
CastMagic_Type:
; Set to the next type of Fire spell.
;
; XREFS:
;
CAST_MAGIC_HIT_HANDLERS [$PRG14::bb13]
;============================================================================
CastMagic_HitHandler_Fire:; [$bbd9]
LDA #$ff
STA a:CastMagic_Counter; Set the counter to 0xFF.
LDA #$07
STA a:CastMagic_Type; Set the magic type to the post-hit handler.
LDX a:CurrentSpriteIndex; X = Current sprite index.
RTS
;============================================================================
; Handle casting Thunder or Death magic.
;
; This is a thunking function that forwards to
;
CastMagic_UpdateThunderOrDeath.
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bafd]
;============================================================================
CastMagic_HandleDeath:; [$bbe7]
JMP CastMagic_UpdateThunderOrDeath
;============================================================================
; Handle the Death magic hitting something.
;
; This will unset the magic from the screen.
;
; INPUTS:
; None
;
; OUTPUTS:
;
CastMagic_Type:
; Unset (0xFF).
;
; XREFS:
;
CAST_MAGIC_HIT_HANDLERS [$PRG14::bb15]
;============================================================================
CastMagic_HitHandler_Death:; [$bbea]
LDA #$ff
STA a:CastMagic_Type; Set the magic type to 0xFF (unset).
RTS
CastMagic_ClearTilte:; [$bbf0]
JMP CastMagic_Clear
;============================================================================
; Handle casting or updating the Tilte spell.
;
; This spell has two phases:
;
; 1. A slow-moving curved phase
; 2. A fast-moving missile phase
;
; During phase 1, this will control the X/Y positions in a
; curved form. Depending on the tick count, it will move
; downward toward the bottom of the arc, horizontal at
; the bottom, back up, or begin a transition to phase 2.
;
; In phase 2, it will simply move in a single diagonal
; direction.
;
; The block won't collide with anything on the screen,
; and will move through enemies.
;
; INPUTS:
; None
;
; OUTPUTS:
;
CastMagic_Unused_HitWallDeltaPosY:
; Set to 0 if the magic hit an obstacle.
;
;
CastMagic_Flags:
; Cleared attack flags.
;
;
CastMagic_XPos_Full:
; The new X position.
;
;
CastMagic_Type:
; Unset if clearing the magic.
;
;
Arg_DeltaX_Frac:
;
Arg_DeltaX_Full:
; Clobbered.
;
; CALLS:
;
CastMagic_Clear
;
CastMagic_UpdateXPosition
;
Sound_PlayEffect
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::baff]
;============================================================================
CastMagic_UpdateTilte:; [$bbf3]
;
; Update based on the phase of this magic.
;
LDA a:CastMagic_Phase; Check the phase.
LSR A; Check bit 0 for even/odd.
BCS @_curveMagicPhase; If odd, jump.
;
; We're in the initial, curved magic phase. It dips down and
; then back up.
;
; Update X +/- 1 and check if the magic flew off the screen.
; We'll calculate gravity-based Y movement next.
;
LDA #$01
STA a:Arg_DeltaX_Full; Full Delta X = 1
LDA #$00
STA a:Arg_DeltaX_Frac; Fractional Delta X = 0
JSR CastMagic_UpdateXPosition; Update position.
BCS CastMagic_ClearTilte; If off-screen, jump to clear.
;
; Calculate the next movement behavior.
;
LDA a:CastMagic_Counter; Load the magic tick counter.
LDY #$03; Y = 3
JSR Sprites_CalcYFromGravity; Calculate the movement behavior (delta Y).
LDY #$03; Y = 3 (count)
JSR Sprites_CalcVerticalSpriteMovement; Calculate vertical movement.
LDA #$00
STA a:Arg_DeltaY_Full; Full Delta Y = 0
JSR CastMagic_UpdateYPosition; Update the Y position.
BCS CastMagic_ClearTilte; If off-screen, jump to clear.
;
; It's on-screen. Manage cycle of the magic.
;
; First, check if we're on tick 32, 64, 96, or 128.
;
LDA a:CastMagic_Counter; A = counter.
AND #$1f; Check against anything but 32, 64, or 128.
BNE @_incAndReturn; If 32, 64, or 128, jump to finish up.
;
; We're on a non-32/64/128 phase, dictating curve movement
; and possibly phase transition.
;
; When 32 is hit, the magic will appear and move downward.
;
; When 64 is hit, it will begin moving horizontally at the
; bottom of the arc.
;
; When 96 is hit, it will begin moving upward toward the
; top of the arc.
;
; When 128 is hit, it will transition to the missile phase.
;
LDA a:CastMagic_Flags; Load the magic flags.
EOR #$80; Toggle the Falling phase.
STA a:CastMagic_Flags; Store the updated flags.
BPL @_incAndReturn; If attacking is clear, jump to finish up.
;
; Switch to the missile phase.
;
INC a:CastMagic_Phase; Increment the phase.
;
; Clear the falling flag, moving back up.
;
LDA a:CastMagic_Flags; Load the magic flags.
AND #$7f; Clear attacking.
STA a:CastMagic_Flags; Store it.
RTS
@_incAndReturn:; [$bc3c]
INC a:CastMagic_Counter; Increment the tick counter.
RTS
;
; The magic is in the fast-moving diagonal missile phase.
;
; We'll update X +/- 4 and Y + 4 for the movement, annd check
; if it's off-screen.
;
@_curveMagicPhase:; [$bc40]
LDA #$04
STA a:Arg_DeltaX_Full; Full Delta X = 4
STA a:Arg_DeltaY_Full; Full Delta Y = 4
LDA #$00
STA a:Arg_DeltaX_Frac; Fractional Delta X = 0
STA a:Arg_DeltaY_Frac; Fractional Delta Y = 0
JSR CastMagic_UpdateXPosition; Update the X position.
BCS CastMagic_ClearTilte; If off-screen, jump to clear.
JSR CastMagic_UpdateYPosition; Update the Y position.
BCS CastMagic_ClearTilte; If off-screen, jump to clear.
RTS
;============================================================================
; Handle Tilte magic hitting something.
;
; This will turn off the transition counter and
; set the type to be the Tilte explosion effect.
;
; INPUTS:
; None
;
; OUTPUTS:
;
CastMagic_Counter:
; Reset to 0.
;
;
CastMagic_Type:
; Set to the Tilte Explosion type.
;
; XREFS:
;
CAST_MAGIC_HIT_HANDLERS [$PRG14::bb17]
;============================================================================
CastMagic_HitHandler_Tilte:; [$bc5b]
LDA #$00
STA a:CastMagic_Counter; Set the counter to 0.
LDA #$0b
STA a:CastMagic_Type; Set the type to the post-collision Tilte type.
RTS
;============================================================================
; UNUSED: Handle updating a Deluge spell that has collided at least once.
;
; This would update the Deluge spell as normal, and then
; decrement a tick counter. Once that counter hits 0, the
; spell will clear.
;
; However, this never actually gets run. Instead, the spell
; is cleared as soon as the first hit occurs.
;
; INPUTS:
;
CastMagic_Counter:
; The counter indicating the max number of ticks
; before disappearing.
;
; OUTPUTS:
;
CastMagic_Counter:
; The decremented counter value.
;
;
CastMagic_Type:
; The cleared magic type, if the counter reaches 0.
;
; CALLS:
;
CastMagic_UpdateDeluge
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb01]
;============================================================================
CastMagic_Unused_UpdateDelugeAfterFirstHit:; [$bc66]
JSR CastMagic_UpdateDeluge; Run standard Deluge behavior.
DEC a:CastMagic_Counter; Decrement the tick counter.
BNE @_return; If > 0, return.
;
; The magic spell has dissipated. Clear it.
;
LDA #$ff
STA a:CastMagic_Type; Clear the active magic spell.
@_return:; [$bc73]
RTS
;============================================================================
; Handle updating a Thunder spell that has collided at least once.
;
; This will update the Thunder spell as normal, and then
; decrement a tick counter. Once that counter hits 0, the
; spell will clear.
;
; INPUTS:
;
CastMagic_Counter:
; The counter indicating the max number of ticks
; before disappearing.
;
; OUTPUTS:
;
CastMagic_Counter:
; The decremented counter value.
;
;
CastMagic_Type:
; The cleared magic type, if the counter reaches 0.
;
; CALLS:
;
CastMagic_UpdateThunderOrDeath
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb03]
;============================================================================
CastMagic_UpdateThunderAfterFirstHit:; [$bc74]
JSR CastMagic_UpdateThunderOrDeath; Run standard Thunder behavior.
DEC a:CastMagic_Counter; Decrement the tick counter.
BNE @_return; If > 0, return.
;
; The magic spell has dissipated. Clear it.
;
LDA #$ff
STA a:CastMagic_Type; Clear the active magic spell.
@_return:; [$bc81]
RTS
;============================================================================
; Handle updating a Fire spell that has collided at least once.
;
; This will update the Fire spell as normal, and then
; decrement a tick counter. Once that counter hits 0, the
; spell will clear.
;
; INPUTS:
;
CastMagic_Counter:
; The counter indicating the max number of ticks
; before disappearing.
;
; OUTPUTS:
;
CastMagic_Counter:
; The decremented counter value.
;
;
CastMagic_Type:
; The cleared magic type, if the counter reaches 0.
;
; CALLS:
;
CastMagic_UpdateFire
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb05]
;============================================================================
CastMagic_UpdateFireAfterFirstHit:; [$bc82]
JSR CastMagic_UpdateFire; Run standard Fire behavior.
DEC a:CastMagic_Counter; Decrement the tick counter.
BNE @_return; If > 0, return.
;
; The magic spell has dissipated. Clear it.
;
LDA #$ff
STA a:CastMagic_Type; Clear the active magic spell.
@_return:; [$bc8f]
RTS
;============================================================================
; Handle updating a Death spell that has collided at least once.
;
; This will immediately clear the current magic type.
;
; INPUTS:
; None.
;
; OUTPUTS:
; None.
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb07]
;============================================================================
CastMagic_UpdateDeathAfterFirstHit:; [$bc90]
LDA #$ff
STA a:CastMagic_Type; Clear the active magic spell.
RTS
;============================================================================
; UNUSED
;============================================================================
JMP CastMagic_Clear
;============================================================================
; UNUSED: Handle updating magic type 10.
;
; This isn't a type used in the game. If called, this
; would clear the current magic type.
;
; INPUTS:
; None.
;
; OUTPUTS:
;
CastMagic_Type:
; Unset.
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb0b]
;============================================================================
CastMagic_Unused_UpdateHitWallEffect:; [$bc99]
LDA #$ff
STA a:CastMagic_Type; Clear the active magic spell.
RTS
;============================================================================
; Handle updating a Tilte spell that has collided at least once.
;
; This will simply increment the tick counter. Once that is >= 16,
; the spell will clear.
;
; INPUTS:
;
CastMagic_Counter:
; The counter indicating the max number of ticks
; before disappearing.
;
; OUTPUTS:
;
CastMagic_Counter:
; The incremented counter value.
;
;
CastMagic_Type:
; The cleared magic type, if the counter reaches 16 or
; higher.
;
; XREFS:
;
CAST_MAGIC_UPDATE_HANDLERS [$PRG14::bb0d]
;============================================================================
CastMagic_UpdateTilteAfterFirstHit:; [$bc9f]
INC a:CastMagic_Counter; Increment the tick counter.
LDA a:CastMagic_Counter; Load the counter value.
CMP #$10; Is it < 16?
BCC @_return; If so, return.
;
; The magic spell has dissipated. Clear it.
;
LDA #$ff
STA a:CastMagic_Type; Clear the active magic spell.
@_return:; [$bcae]
RTS
CastMagic_UpdateXPosition:; [$bcaf]
LDA a:CastMagic_Flags
AND #$40
BNE @LAB_PRG14__bcd4
LDA a:CastMagic_XPos_Frac
SEC
SBC a:Arg_DeltaX_Frac
STA a:CastMagic_XPos_Frac
LDA a:CastMagic_XPos_Full
SBC a:Arg_DeltaX_Full
STA a:CastMagic_XPos_Full
LDX #$00
JSR FUN_PRG14__bd8f
LDA a:CastMagic_XPos_Full
CMP #$f0
RTS
@LAB_PRG14__bcd4:; [$bcd4]
LDA a:CastMagic_XPos_Frac
CLC
ADC a:Arg_DeltaX_Frac
STA a:CastMagic_XPos_Frac
LDA a:CastMagic_XPos_Full
ADC a:Arg_DeltaX_Full
STA a:CastMagic_XPos_Full
LDX #$01
JSR FUN_PRG14__bd8f
LDX a:CastMagic_Type
LDA a:CastMagic_XPos_Full
CMP #$bcf6,X
RTS
BYTE_ARRAY_PRG14__bcf6:; [$bcf6]
db $f0; [0]:
db $f0; [1]:
db $e0; [2]:
db $f0; [3]:
db $f0; [4]:
;============================================================================
; TODO: Document CastMagic_UpdateYPosition
;
; INPUTS:
; None.
;
; OUTPUTS:
; C
;
; XREFS:
;
CastMagic_UpdateTilte
;============================================================================
CastMagic_UpdateYPosition:; [$bcfb]
LDA a:CastMagic_Flags
BMI @LAB_PRG14__bd1e
LDA a:CastMagic_YPos_Frac
SEC
SBC a:Arg_DeltaY_Frac
STA a:CastMagic_YPos_Frac
LDA a:CastMagic_YPos_Full
SBC a:Arg_DeltaY_Full
STA a:CastMagic_YPos_Full
LDX #$02
JSR FUN_PRG14__bd8f
LDA a:CastMagic_YPos_Full
CMP #$f0
RTS
@LAB_PRG14__bd1e:; [$bd1e]
LDA a:CastMagic_YPos_Frac
CLC
ADC a:Arg_DeltaY_Frac
STA a:CastMagic_YPos_Frac
LDA a:CastMagic_YPos_Full
ADC a:Arg_DeltaY_Full
STA a:CastMagic_YPos_Full
LDA a:Arg_DeltaY_Frac
PHP
LDX #$03
JSR FUN_PRG14__bd8f
PLP
RTS
;============================================================================
; TODO: Document CastMagic_Maybe_CheckRightEdgeOrImpassable
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__bd8f
;============================================================================
CastMagic_Maybe_CheckRightEdgeOrImpassable:; [$bd3c]
LDA a:CastMagic_XPos_Full
STA Arg_PixelPosX
CMP #$f0
BCC CastMagic_Maybe_CheckImpassableY
;============================================================================
; TODO: Document CastMagic_SetShouldDisperse
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CastMagic_Maybe_CheckXOrImpassable
;============================================================================
CastMagic_SetShouldDisperse:; [$bd45]
LDA #$01
STA Blocks_Result; Set block result to 1.
RTS
;============================================================================
; TODO: Document CastMagic_Maybe_CheckXOrImpassable
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
FUN_PRG14__bd8f
;============================================================================
CastMagic_Maybe_CheckXOrImpassable:; [$bd4a]
LDY a:CastMagic_Type
LDA a:CastMagic_XPos_Full
CLC
ADC #$bd9d,Y
STA Arg_PixelPosX
BCS CastMagic_SetShouldDisperse
;
; v-- Fall through --v
;
;============================================================================
; TODO: Document CastMagic_Maybe_CheckImpassableY
;
; INPUTS:
; None.
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CastMagic_Maybe_CheckRightEdgeOrImpassable
;============================================================================
CastMagic_Maybe_CheckImpassableY:; [$bd58]
LDA a:CastMagic_YPos_Full
STA Arg_PixelPosY
JSR #$e86c
JSR #$e87c
STA Blocks_Result
BNE @_return
LDY a:CastMagic_Type
LDA #$bda9,Y
CMP #$10
BCC @LAB_PRG14__bd7d
TXA
CLC
ADC #$10
TAX
JSR #$e87c
STA Blocks_Result
BNE @_return
@LAB_PRG14__bd7d:; [$bd7d]
LDA a:CastMagic_YPos_Full
AND #$0f
BEQ @_return
TXA
CLC
ADC #$10
TAX
JSR #$e87c
STA Blocks_Result
@_return:; [$bd8e]
RTS
;============================================================================
; TODO: Document FUN_PRG14__bd8f
;
; INPUTS:
; X
;
; OUTPUTS:
; TODO
;
; XREFS:
;
CastMagic_UpdateXPosition
;
CastMagic_UpdateYPosition
;============================================================================
FUN_PRG14__bd8f:; [$bd8f]
TXA
BEQ CastMagic_Maybe_CheckRightEdgeOrImpassable
DEX
BEQ CastMagic_Maybe_CheckXOrImpassable
DEX
BEQ @LAB_PRG14__bd98
@LAB_PRG14__bd98:; [$bd98]
LDA #$00
STA Blocks_Result
RTS
BYTE_ARRAY_PRG14__bd9d:; [$bd9d]
db $0f; [0]:
db $0f; [1]:
db $1f; [2]:
db $0f; [3]:
db $0f; [4]:
db $0f; [5]:
db $0f; [6]:
db $1f; [7]:
db $0f; [8]:
db $0f; [9]:
db $0f; [10]:
db $0f; [11]:
BYTE_ARRAY_PRG14__bda9:; [$bda9]
db $0f; [0]:
db $1f; [1]:
db $0f; [2]:
db $0f; [3]:
db $0f; [4]:
db $0f; [5]:
db $1f; [6]:
db $0f; [7]:
db $0f; [8]:
db $0f; [9]:
db $0f; [10]:
db $0f; [11]:
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bdb5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bdc5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bdd5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bde5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bdf5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be05] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be15] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be25] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be35] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be45] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be55] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be65] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be75] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be85] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$be95] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bea5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$beb5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bec5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bed5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bee5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bef5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf05] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf15] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf25] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf35] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf45] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf55] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf65] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf75] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf85] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bf95] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bfa5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bfb5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bfc5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bfd5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff; [$bfe5] undefined
hex ff ff ff ff ff ff ff ff ff ff ff; [$bff5] undefined