109 lines
2.8 KiB
NASM
109 lines
2.8 KiB
NASM
;================================================================================
|
|
; Randomize Flute Dig Item
|
|
;--------------------------------------------------------------------------------
|
|
SpawnHauntedGroveItem:
|
|
LDA.b OverworldIndex : CMP.b #$2A : BEQ + : RTL : + ; Skip if not the haunted grove
|
|
LDA.b IndoorsFlag : BEQ + : RTL : + ; Skip if indoors
|
|
|
|
; todo - how does this work now?
|
|
LDA.l HauntedGroveItem_Player : STA.l !MULTIWORLD_SPRITEITEM_PLAYER_ID
|
|
|
|
LDA.b #$EB
|
|
JSL Sprite_SpawnDynamically
|
|
|
|
LDA.b #$01 : STA.w SprRedrawFlag, Y
|
|
|
|
LDX.b #$00
|
|
LDA.b LinkDirection : CMP.b #$04 : BEQ + : INX : +
|
|
|
|
LDA.l .x_speeds, X : STA.w SpriteVelocityX, Y
|
|
|
|
LDA.b #$00 : STA.w SpriteVelocityY, Y
|
|
LDA.b #$18 : STA.w SpriteVelocityZ, Y
|
|
LDA.b #$FF : STA.w EnemyStunTimer, Y
|
|
LDA.b #$30 : STA.w SpriteTimerE, Y
|
|
|
|
LDA.b LinkPosX : !ADD.l .x_offsets, X
|
|
AND.b #$F0 : STA.w SpritePosXLow, Y
|
|
LDA.b LinkPosX+1 : ADC.b #$00 : STA.w SpritePosXHigh, Y
|
|
|
|
LDA.b LinkPosY : !ADD.b #$16 : AND.b #$F0 : STA.w SpritePosYLow, Y
|
|
LDA.b LinkPosY+1 : ADC.b #$00 : STA.w SpritePosYHigh, Y
|
|
|
|
LDA.b #$00 : STA.w SpriteLayer, Y
|
|
TYX
|
|
|
|
LDX.b OverworldIndex ; haunted grove (208D0A)
|
|
LDA.l OverworldEventDataWRAM, X : AND.b #$40 : BNE +
|
|
LDA.b #$1B : JSL Sound_SetSfx3PanLong
|
|
+
|
|
RTL
|
|
|
|
;DATA - Flute Spawn Information
|
|
{
|
|
|
|
.x_speeds
|
|
db $F0
|
|
db $10
|
|
|
|
.x_offsets
|
|
db $00
|
|
db $13
|
|
|
|
}
|
|
;--------------------------------------------------------------------------------
|
|
FluteBoy:
|
|
LDA.b GameMode : CMP.b #$1A : BEQ +
|
|
LDA.b #$01 : STA.w $0FDD
|
|
JML FluteBoy_Abort
|
|
+
|
|
LDA.w SpriteActivity, X : CMP.b #$03 ; thing we wrote over
|
|
JML FluteBoy_Continue
|
|
;--------------------------------------------------------------------------------
|
|
FreeDuckCheck:
|
|
LDA.l OWMode+1 : AND.b #!FLAG_OW_MIXED : BNE .skipInvertedCheck
|
|
LDA.l InvertedMode : BEQ .done
|
|
.skipInvertedCheck
|
|
LDA.l FluteEquipment : CMP.b #$03 : BEQ .done ; flute is already active
|
|
|
|
; check the area, is it #$18 = 30?
|
|
LDA.b OverworldIndex : CMP.b #$18 : BNE .done
|
|
|
|
REP #$20
|
|
|
|
; Y coordinate boundaries for setting it off.
|
|
LDA.b LinkPosY
|
|
|
|
CMP.w #$0760 : BCC .done
|
|
CMP.w #$07E0 : BCS .done
|
|
|
|
; do if( (Ycoord >= 0x0760) && (Ycoord < 0x07e0
|
|
LDA.b LinkPosX
|
|
|
|
CMP.w #$01CF : BCC .done
|
|
CMP.w #$0230 : BCS .done
|
|
|
|
; do if( (Xcoord >= 0x1cf) && (Xcoord < 0x0230)
|
|
SEP #$20
|
|
|
|
; Apparently a special Overworld mode for doing this?
|
|
LDA.b #$2D : STA.b GameSubMode
|
|
|
|
; Trigger the sequence to start the weathervane explosion.
|
|
LDY.b #$00
|
|
LDA.b #$37
|
|
|
|
JSL AddWeathervaneExplosion
|
|
BRA .skipSong
|
|
.done
|
|
SEP #$20
|
|
LDA.b #$80 : STA.w FluteTimer ; thing we wrote over
|
|
LDA.b #$13
|
|
RTL
|
|
.skipSong
|
|
SEP #$20
|
|
LDA.b #$80 : STA.w FluteTimer ; thing we wrote over
|
|
LDA.b #$00
|
|
RTL
|
|
;--------------------------------------------------------------------------------
|