Add large room lanmola boss code
This commit is contained in:
636
Dungeons/Lanmola.asm
Normal file
636
Dungeons/Lanmola.asm
Normal file
@@ -0,0 +1,636 @@
|
||||
; ==============================================================================\
|
||||
; RAM used
|
||||
|
||||
;$35-$37 as some temp draw ram
|
||||
;$70 lanmola kill count
|
||||
;$7EEA00-$7EEAB8 draw table storage
|
||||
;$7EEAB8-$7EEAC9 room cleared flags
|
||||
|
||||
; ==============================================================================
|
||||
; Hooks
|
||||
|
||||
org $05AB93
|
||||
Sprite2_CheckDamage:
|
||||
|
||||
org $05F955
|
||||
Sprite2_CheckIfActivePermissive:
|
||||
|
||||
org $05FA2E
|
||||
Sprite2_MoveAltitude:
|
||||
|
||||
org $05F9ED
|
||||
Sprite2_Move:
|
||||
|
||||
org $068F95 ; skip SpritePrep_Bosses
|
||||
NOP : NOP : NOP
|
||||
;JSR $8F1C ; original JSR
|
||||
JSL Lanmola_FinishInitialization
|
||||
|
||||
org $05B60E
|
||||
dw Sprite_Lanmola
|
||||
|
||||
org $1AF9D6
|
||||
JSL SetShrapnelTimer
|
||||
|
||||
org $1AF981
|
||||
Lanmola_SpawnShrapnel:
|
||||
|
||||
org $1DF614
|
||||
Sprite_ConvertVelocityToAngle:
|
||||
|
||||
org $05A377 ;replace vanilla sprite_lanmola.asm
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_FinishInitialization:
|
||||
{
|
||||
PHB : PHK : PLB
|
||||
|
||||
LDA.l .starting_delay, X : STA $0DF0, X
|
||||
|
||||
LDA.b #$FF : STA $0F70, X
|
||||
|
||||
PHX
|
||||
|
||||
LDY.b #$3F
|
||||
|
||||
LDA $7EEA00, X : TAX ;.sprite_regions
|
||||
|
||||
LDA.b #$FF
|
||||
|
||||
.reset_extended_sprites
|
||||
STA $7FFE00, X
|
||||
|
||||
INX
|
||||
|
||||
DEY : BPL .reset_extended_sprites
|
||||
|
||||
PLX
|
||||
|
||||
LDA.b #$07 : STA $7FF81E, X
|
||||
|
||||
JSL Sprite_Lanmola_Init_DataLONG
|
||||
|
||||
PLB
|
||||
|
||||
RTL
|
||||
|
||||
.starting_delay
|
||||
db $80, $CF, $FF, $60
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
print pc
|
||||
Sprite_Lanmola:
|
||||
{
|
||||
;JSR Sprite2_CheckIfActivePermissive
|
||||
|
||||
LDA $0D80, X
|
||||
|
||||
JSL UseImplicitRegIndexedLocalJumpTable
|
||||
|
||||
dw Lanmola_Wait ;0x00
|
||||
dw Lanmola_Mound ;0x01
|
||||
dw Lanmola_Fly ;0x02
|
||||
dw Lanmola_Dive ;0x03
|
||||
dw Lanmola_Reset ;0x04
|
||||
dw Lanmola_Death ;0x05
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Wait: ;0x00
|
||||
{
|
||||
JSR Lanmola_Draw
|
||||
|
||||
LDA $0DF0, X : BNE .delay ; ORA $0F00, X :
|
||||
LDA.b #$7F : STA $0DF0, X
|
||||
|
||||
INC $0D80, X
|
||||
|
||||
;Play rumbling sound
|
||||
LDA.b #$35 : JSL Sound_SetSfx2PanLong
|
||||
|
||||
.delay
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Mound: ;0x01
|
||||
{
|
||||
JSL Lanmola_MoveSegment
|
||||
JSR Lanmola_DrawMound
|
||||
JSL CheckIfActive : BCS Lanmola_Wait_delay
|
||||
|
||||
LDA $0DF0, X : BNE .return
|
||||
JSL Lanmola_SpawnShrapnel
|
||||
|
||||
LDA.b #$13 : STA $012D
|
||||
|
||||
TXY
|
||||
JSL GetRandomInt : AND.b #$07 : TAX
|
||||
LDA $7EEAA8, X : STA $0DA0, Y ; Get random X pos to have the lanmola fly to. ;.randXPos
|
||||
|
||||
JSL GetRandomInt : AND.b #$07 : TAX
|
||||
LDA $7EEAB0, X : STA $0DB0, Y ; Get random Y pos to have the lanmola fly to. ;.randYPos
|
||||
TYX
|
||||
|
||||
INC $0D80, X
|
||||
|
||||
LDA.b #$18 : STA $0F80, X
|
||||
|
||||
STZ $0EC0, X
|
||||
STZ $0ED0, X
|
||||
|
||||
; ALTERNATE ENTRY POINT
|
||||
.Lanmola_SetScatterSandPosition
|
||||
|
||||
LDA $0D30, X : STA $0DC0, X
|
||||
LDA $0D20, X : STA $0EB0, X
|
||||
|
||||
LDA $0D10, X : STA $0DE0, X
|
||||
LDA $0D00, X : STA $0E70, X
|
||||
|
||||
LDA.b #$4A : STA $0E00, X
|
||||
|
||||
.return
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Fly: ;0x02
|
||||
{
|
||||
JSR Lanmola_Draw
|
||||
JSL Lanmola_DrawDirtLONG
|
||||
JSL CheckIfActive : BCS Lanmola_Mound_return
|
||||
|
||||
JSR Sprite2_CheckDamage
|
||||
JSR Sprite2_MoveAltitude
|
||||
|
||||
; Slowly decrease the Y speed when first coming out of the ground
|
||||
LDA $0EC0, X : BNE .notRising
|
||||
LDA $0F80, X : SEC : SBC.b #$01 : STA $0F80, X : BNE .beta
|
||||
INC $0EC0, X
|
||||
|
||||
.beta
|
||||
|
||||
BRA .dontSwitchDirections
|
||||
|
||||
.notRising
|
||||
|
||||
; Use the Y speed to bob up and down
|
||||
LDA $1A : AND.b #$01 : BNE .dontSwitchDirections ; Every other frame.
|
||||
TXY
|
||||
LDA $0ED0, X : AND.b #$01 : TAX
|
||||
|
||||
LDA $0F80, Y : CLC : ADC $7EEA9C, X : STA $0F80, Y : CMP $7EEA9E, X : BNE .dontSwitchDirections2 ;.y_speed_slope ;.y_speeds
|
||||
TYX : INC $0ED0, X ; Switch direction
|
||||
|
||||
.dontSwitchDirections2
|
||||
TYX
|
||||
|
||||
.dontSwitchDirections
|
||||
|
||||
LDA $0DA0, X : STA $04
|
||||
LDA $0D30, X : STA $05
|
||||
LDA $0DB0, X : STA $06
|
||||
LDA $0D20, X : STA $07
|
||||
LDA $0D10, X : STA $00
|
||||
LDA $0D30, X : STA $01
|
||||
LDA $0D00, X : STA $02
|
||||
LDA $0D20, X : STA $03
|
||||
|
||||
REP #$20
|
||||
|
||||
; If our position is 0x0002 away from the random X and Y pos we chose earlier go to the next stage.
|
||||
LDA $00 : SEC : SBC $04 : CLC : ADC.w #$0002 : CMP.w #$0004 : BCS .notCloseEnough
|
||||
LDA $02 : SEC : SBC $06 : CLC : ADC.w #$0002 : CMP.w #$0004 : SEP #$20 : BCS .notCloseEnough
|
||||
INC $0D80, X
|
||||
|
||||
.notCloseEnough
|
||||
|
||||
SEP #$20
|
||||
|
||||
LDA.b #$0A
|
||||
|
||||
JSL Sprite_ProjectSpeedTowardsEntityLong
|
||||
|
||||
LDA $00 : STA $0D40, X
|
||||
LDA $01 : STA $0D50, X
|
||||
|
||||
JSR Sprite2_Move
|
||||
|
||||
.return
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Dive: ;0x03
|
||||
{
|
||||
JSR Lanmola_Draw
|
||||
JSL Lanmola_DrawDirtLONG
|
||||
JSL CheckIfActive : BCS Lanmola_Fly_return
|
||||
|
||||
JSR Sprite2_CheckDamage
|
||||
JSR Sprite2_Move
|
||||
JSR Sprite2_MoveAltitude
|
||||
|
||||
LDA $0F80, X : CMP.b #$EC : BMI .alpha
|
||||
SEC : SBC.b #$01 : STA $0F80, X
|
||||
|
||||
.alpha
|
||||
|
||||
; If we are under the ground go to the reset stage
|
||||
LDA $0F70, X : BPL .notUnderGroundYet
|
||||
INC $0D80, X
|
||||
|
||||
LDA.b #$80 : STA $0DF0, X
|
||||
|
||||
JSR Lanmola_Mound_Lanmola_SetScatterSandPosition
|
||||
|
||||
.notUnderGroundYet
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Reset: ;0x04
|
||||
{
|
||||
JSR Lanmola_Draw
|
||||
JSL Lanmola_DrawDirtLONG
|
||||
JSL CheckIfActive : BCS Lanmola_Dive_notUnderGroundYet
|
||||
|
||||
LDA $0DF0, X : BNE .wait
|
||||
STZ $0D80, X ; Go back to wait phase
|
||||
|
||||
TXY
|
||||
JSL GetRandomInt : AND.b #$07 : TAX
|
||||
LDA $7EEAA8, X : STA $0D10, Y ; Get random X pos to have the lanmola fly to. ;.randXPos
|
||||
|
||||
JSL GetRandomInt : AND.b #$07 : TAX
|
||||
LDA $7EEAB0, X : STA $0D00, Y ; Get random Y pos to have the lanmola fly to. ;.randYPos
|
||||
TYX
|
||||
|
||||
.wait
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Death: ;0x05
|
||||
{
|
||||
JSR Lanmola_Draw
|
||||
|
||||
LDA $0DF0, X : BNE .timerNotDone
|
||||
STZ $0DD0, X
|
||||
|
||||
; Y is the index where we write in RAM
|
||||
PHX ; keep X
|
||||
TYX ; Since we'll need X for long we move Y in X
|
||||
LDA $7EEAB8, X : ORA $00 : STA $7EEAB8, X
|
||||
PLX ; pull back x because sprite will crash otherwise even if it's dying...
|
||||
|
||||
; There can only be 4 so we only need to check for 4
|
||||
PHX : LDX.b #$03
|
||||
|
||||
.next_sprite
|
||||
LDA $0E20, X : CMP.b #$54 : BNE .notLanmola
|
||||
LDA $0DD0, X : BNE .oneIsntDead
|
||||
|
||||
.notLanmola
|
||||
|
||||
DEX : BPL .next_sprite
|
||||
TYX : LDA.b #$0F : STA $7EEAB8, X
|
||||
LDA.b #$1A : STA $012F
|
||||
|
||||
.oneIsntDead
|
||||
PLX
|
||||
|
||||
.timerNotDone
|
||||
|
||||
LDA $0DF0, X : CMP.b #$20 : BCC Lanmola_Reset_wait
|
||||
CMP.b #$A0 : BCS Lanmola_Reset_wait
|
||||
AND.b #$0F : BNE Lanmola_Reset_wait
|
||||
TXY
|
||||
LDA $7FF81E, X : TAX
|
||||
|
||||
LDA $0E80, Y : SEC : SBC $7EEAA0, X ;.dataDeath
|
||||
|
||||
PHY : TXY : PLX
|
||||
AND.b #$3F : CLC : ADC $7EEA00, X : PHX : TAX ;.sprite_regions
|
||||
|
||||
LDA $7FFC00, X : STA $0A
|
||||
LDA $7EE800, X : STA $0B
|
||||
|
||||
LDA $7FFD00, X : SEC : SBC $7FFE00, X : STA $0C
|
||||
LDA $7EE900, X : STA $0D
|
||||
|
||||
REP #$20
|
||||
LDA $0A : SEC : SBC $E2 : STA $0A
|
||||
LDA $0C : SEC : SBC $E8 : STA $0C
|
||||
SEP #$20
|
||||
|
||||
PLX
|
||||
|
||||
; Spawn a sprite that instantly dies as a boss explosion.
|
||||
LDA.b #$00 : JSL Sprite_SpawnDynamically : BMI .spawn_failed
|
||||
LDA.b #$0B : STA $0AAA
|
||||
|
||||
LDA.b #$04 : STA $0DD0, Y
|
||||
|
||||
LDA.b #$1F : STA $0DF0, Y : STA $0D90, Y
|
||||
|
||||
LDA $0A : STA $0D10, Y
|
||||
LDA $0B : STA $0D30, Y
|
||||
LDA $0C : STA $0D00, Y
|
||||
LDA $0D : STA $0D20, Y
|
||||
|
||||
LDA.b #$03 : STA $0E40, Y
|
||||
|
||||
LDA.b #$0C : STA $0F50, Y
|
||||
|
||||
LDA.b #$0C : JSL Sound_SetSfx2PanLong
|
||||
|
||||
LDA $7FF81E, X : BMI .beta
|
||||
DEC A : STA $7FF81E, X
|
||||
|
||||
.beta
|
||||
.spawn_failed
|
||||
.return
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_Draw:
|
||||
{
|
||||
JSL Lanmola_MoveSegment
|
||||
|
||||
LDA $0B89, X : STA $03
|
||||
|
||||
LDA $7FF81E, X : BPL .beta
|
||||
RTS
|
||||
|
||||
.beta
|
||||
|
||||
PHX
|
||||
|
||||
STA $0F
|
||||
|
||||
LDA $0D40, X : ASL A : ROL A : AND.b #$01 : TAX
|
||||
|
||||
LDA $7EEA06, X : STA $0C ;.data2
|
||||
|
||||
LDA $7EEA04, X : TAY ;.data1
|
||||
|
||||
LDX $0F
|
||||
|
||||
.loopBody
|
||||
PHX : STX $0D
|
||||
|
||||
LDA $02 : CLC : ADC $04 : TAX
|
||||
|
||||
LDA $02 : SEC : SBC.b #$08 : AND.b #$3F : STA $02
|
||||
|
||||
LDA $7FFC00, X : STA $0A
|
||||
LDA $7EE800, X : STA $0B
|
||||
LDA $7FFD00, X : STA $08
|
||||
LDA $7EE900, X : STA $09
|
||||
LDA $7FFE00, X : STA $05
|
||||
|
||||
PHX
|
||||
|
||||
TYA : CLC : ADC.b #$20 : TAX
|
||||
|
||||
REP #$20
|
||||
LDA $0A : SEC : SBC $E2 : STA ($90), Y ;Body X byte
|
||||
|
||||
STZ $37
|
||||
BPL .notNegative
|
||||
INC $37
|
||||
|
||||
.notNegative
|
||||
|
||||
PHY : TXY : PLX
|
||||
STA ($90), Y ;Shadow X byte
|
||||
PHY : TXY : PLX
|
||||
|
||||
INY : INX
|
||||
|
||||
CLC : ADC.w #$0040 : CMP.w #$0140 : SEP #$20 : BCS .out_of_boundsX
|
||||
LDA $05 : BMI .out_of_boundsX
|
||||
STA $06 : STZ $07
|
||||
|
||||
REP #$20
|
||||
LDA $08 : SEC : SBC $06 : SEC : SBC $E8 : STA ($90), Y ;Body Y byte
|
||||
CLC : ADC.w #$0010 : CMP.w #$0100
|
||||
|
||||
BCC .on_screen_y1
|
||||
SEP #$20
|
||||
LDA.b #$F0 : STA ($90), Y ;Body offscreen Y Byte
|
||||
REP #$20
|
||||
|
||||
.on_screen_y1
|
||||
|
||||
PHY : TXY : PLX
|
||||
|
||||
LDA $08 : CLC : ADC.w #$000A : SEC : SBC $E8 : STA ($90), Y ;Shadow Y byte
|
||||
CLC : ADC.w #$0010 : CMP.w #$0100
|
||||
SEP #$20
|
||||
PHY : TXY : PLX
|
||||
|
||||
BCC .on_screen_y2
|
||||
PHY : TXY : PLX
|
||||
LDA.b #$F0 : STA ($90), Y ;Shadow offscreen Y Byte
|
||||
PHY : TXY : PLX
|
||||
|
||||
.on_screen_y2
|
||||
|
||||
BRA .skip
|
||||
|
||||
.out_of_boundsX
|
||||
LDA.b #$F0 : STA ($90), Y ;Body offscreen Y Byte
|
||||
PHY : TXY : PLX
|
||||
LDA.b #$F0 : STA ($90), Y ;Shadow offscreen Y Byte
|
||||
PHY : TXY : PLX
|
||||
|
||||
.skip
|
||||
|
||||
PLX
|
||||
|
||||
PHY
|
||||
|
||||
LDA $7FFF00, X : TAX
|
||||
|
||||
LDY $0D
|
||||
|
||||
LDA $0F : CMP.b #$07 : BNE .dontDrawTail
|
||||
CPY.b #$00 : BNE .dontDrawTail
|
||||
LDA $7EEA18, X ;.chrTail
|
||||
BRA .notHead
|
||||
|
||||
.dontDrawTail
|
||||
|
||||
LDA.b #$C6
|
||||
|
||||
CPY $0F : BNE .notHead
|
||||
LDA $7EEA08, X ;.chrHead
|
||||
|
||||
.notHead
|
||||
|
||||
PLY : INY : STA ($90), Y ;Body chr
|
||||
|
||||
PHY
|
||||
|
||||
TYA : CLC : ADC.b #$20 : TAY
|
||||
|
||||
LDA.b #$6C : STA ($90), Y ;Shadow chr
|
||||
LDA.b #$36 : INY : STA ($90), Y ;Shadow properties
|
||||
|
||||
PLY
|
||||
|
||||
INY
|
||||
|
||||
LDA $7EEA28, X : ORA $03 : STA ($90), Y ;Body properties ;.propertiesBody
|
||||
|
||||
TYA : PHY : LSR #2 : TAY
|
||||
CLC : ADC.b #$08 : TAX
|
||||
|
||||
LDA.b #$02 : ORA $37 : STA ($92), Y ;Body size and extra X bit
|
||||
PHY : TXY : PLX : STA ($92), Y ;Shadow size and extra X bit
|
||||
|
||||
PLA : CLC : ADC $0C : TAY
|
||||
|
||||
PLX : DEX : BMI .bodyDone
|
||||
JMP .loopBody
|
||||
|
||||
.bodyDone
|
||||
|
||||
PLX
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_DrawMound:
|
||||
{
|
||||
LDA.b #$04 : JSL OAM_AllocateFromRegionB
|
||||
|
||||
PHX
|
||||
|
||||
LDA $0DF0, X : LSR #3 : TAX
|
||||
|
||||
LDA $7EEA54, X : TAX ;.frameMound
|
||||
|
||||
LDY.b #$00
|
||||
|
||||
REP #$20
|
||||
LDA $0FDA : SEC : SBC $E8 : STA $02
|
||||
LDA $0FD8 : SEC : SBC $E2 : STA ($90), Y
|
||||
|
||||
STZ $37
|
||||
BPL .notNegative
|
||||
INC $37
|
||||
|
||||
.notNegative
|
||||
|
||||
INY
|
||||
|
||||
CLC : ADC.w #$0040 : CMP.w #$0140 : BCS .out_of_boundsx
|
||||
|
||||
LDA $02 : STA ($90), Y
|
||||
|
||||
CLC : ADC.w #$0010 : CMP.w #$0100
|
||||
BCC .on_screen_y
|
||||
.out_of_boundsx
|
||||
LDA.w #$00F0 : STA ($90), Y
|
||||
|
||||
.on_screen_y
|
||||
SEP #$20
|
||||
|
||||
LDA $7EEA48, X : INY : STA ($90), Y ;.chrMound
|
||||
LDA $7EEA4E, X : INY : STA ($90), Y ;.propertiesMound
|
||||
|
||||
TYA : LSR #2 : TAY
|
||||
|
||||
LDA.b #$02 : ORA $37 : STA ($92), Y ;.sizesMound
|
||||
|
||||
PLX
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
warnpc $05A880
|
||||
|
||||
; ==============================================================================
|
||||
org $1DCFCB
|
||||
|
||||
Sprite_Shrapnel:
|
||||
{
|
||||
; This sprite manifests as a boulder outdoors, and as shrapnel indoors.
|
||||
LDA $1B : BEQ $5B ;Boulder_Main
|
||||
|
||||
; Check if we can draw.
|
||||
LDA $0FC6 : CMP.b #$03 : BCS .invalid_gfx_loaded
|
||||
JSL $06DBF8 ;Sprite_PrepAndDrawSingleSmallLong
|
||||
|
||||
.invalid_gfx_loaded
|
||||
|
||||
;JSR $E8A2 ;Sprite4_CheckIfActive
|
||||
JSL CheckIfActive : BCC .active
|
||||
RTS
|
||||
|
||||
.active
|
||||
|
||||
LDA $1A : ASL #2 : AND.b #$C0 : STA $0F50, X ; : ORA.b #$00
|
||||
|
||||
JSR $E948 ;Sprite4_MoveXyz
|
||||
|
||||
TXA : EOR $1A : AND.b #$03 : BNE .noTileCollision
|
||||
REP #$20
|
||||
|
||||
LDA $0FD8 : SEC : SBC $22 : CLC : ADC.w #$0004
|
||||
|
||||
CMP.w #$0010 : BCS .player_not_close
|
||||
|
||||
LDA $0FDA : SEC : SBC $20 : CLC : ADC.w #$FFFC
|
||||
|
||||
CMP.w #$000C : BCS .player_not_close
|
||||
|
||||
SEP #$20
|
||||
|
||||
JSL $06F41F ;Sprite_AttemptDamageToPlayerPlusRecoilLong
|
||||
|
||||
.player_not_close
|
||||
|
||||
SEP #$20
|
||||
|
||||
;JSR $8094 : BEQ .noTileCollision ;Sprite4_CheckTileCollision
|
||||
;STZ $0DD0, X
|
||||
|
||||
.noTileCollision
|
||||
|
||||
LDA $0DF0, X : BNE .timerNotDone
|
||||
STZ $0DD0, X
|
||||
|
||||
.timerNotDone
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
warnpc $1DD02A
|
||||
331
Dungeons/Lanmola_Expanded.asm
Normal file
331
Dungeons/Lanmola_Expanded.asm
Normal file
@@ -0,0 +1,331 @@
|
||||
pullpc
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_DrawDirtLONG:
|
||||
{
|
||||
PHB : PHK : PLB
|
||||
|
||||
JSR Lanmola_DrawDirt
|
||||
|
||||
PLB
|
||||
|
||||
RTL
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_DrawDirt:
|
||||
{
|
||||
LDA $0E00, X : BNE .timerNotDone
|
||||
RTS
|
||||
|
||||
.timerNotDone
|
||||
|
||||
; Determine weather the dirt should draw in front of or behind the body
|
||||
; based on its y velocity.
|
||||
LDA $0D40, X : ASL A : ROL A : ASL A : EOR $0D80, X : AND.b #$02 : BEQ .nu
|
||||
LDA.b #$08 : JSL OAM_AllocateFromRegionB
|
||||
BRA .xi
|
||||
|
||||
.nu
|
||||
LDA.b #$08 : JSL OAM_AllocateFromRegionC
|
||||
|
||||
.xi
|
||||
|
||||
LDY.b #$00
|
||||
|
||||
LDA $0E00, X : LSR #2 : AND.b #$03 : EOR.b #$03 : ASL A : STA $06
|
||||
|
||||
LDA $0DC0, X : XBA
|
||||
LDA $0DE0, X
|
||||
REP #$20 : SEC : SBC $E2 : STA $00 : SEP #$20
|
||||
|
||||
STZ $37
|
||||
BPL .notNegative3
|
||||
INC $37
|
||||
|
||||
.notNegative3
|
||||
|
||||
LDA $0EB0, X : XBA
|
||||
LDA $0E70, X
|
||||
REP #$20 : SEC : SBC $E8 : STA $02 : SEP #$20
|
||||
|
||||
PHX
|
||||
|
||||
LDX.b #$01
|
||||
|
||||
.dirtLoop
|
||||
PHX
|
||||
|
||||
TXA : CLC : ADC $06 : ASL : TAX
|
||||
|
||||
REP #$20
|
||||
LDA $00 : CLC : ADC $7EEA64, X : STA ($90), Y ;dirt x ;.xDirt
|
||||
|
||||
STZ $36
|
||||
BPL .notNegative4
|
||||
INC $36
|
||||
|
||||
.notNegative4
|
||||
|
||||
INY
|
||||
|
||||
CLC : ADC.w #$0040 : CMP.w #$0140 : BCS .out_of_bounds3
|
||||
|
||||
LDA $02 : CLC : ADC $7EEA74, X : STA ($90), Y ;dirt y ;.yDirt
|
||||
|
||||
REP #$20
|
||||
CLC : ADC.w #$0010 : CMP.w #$0100
|
||||
SEP #$20
|
||||
|
||||
BCC .on_screen_y
|
||||
.out_of_bounds3
|
||||
SEP #$20
|
||||
LDA.b #$F0 : STA ($90), Y
|
||||
|
||||
.on_screen_y
|
||||
|
||||
TXA : LSR : TAX
|
||||
|
||||
LDA $7EEA84, X : INY : STA ($90), Y ;dirt chr ;.chrDirt
|
||||
LDA $7EEA8C, X : INY : STA ($90), Y ;dirt properties ;.propertiesDirt
|
||||
|
||||
PHY
|
||||
|
||||
TYA : LSR #2 : TAY
|
||||
|
||||
LDA $7EEA94, X : ORA $37 : ORA $36 : STA ($92), Y ;.sizesDirt
|
||||
|
||||
PLY : INY
|
||||
|
||||
PLX : DEX : BPL .dirtLoop
|
||||
|
||||
PLX
|
||||
|
||||
RTS
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Sprite_Lanmola_Init_DataLONG:
|
||||
{
|
||||
PHB : PHK : PLB
|
||||
|
||||
JSR Sprite_Lanmola_Init_Data
|
||||
|
||||
PLB
|
||||
|
||||
RTL
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Sprite_Lanmola_Init_Data:
|
||||
{
|
||||
PHX
|
||||
|
||||
LDX.b #$00
|
||||
.loop
|
||||
LDA .sprite_regions, X : STA $7EEA00, X
|
||||
|
||||
INX : CPX.b #$B8 : BCC .loop
|
||||
|
||||
PLX
|
||||
|
||||
RTS
|
||||
|
||||
;$7EEA00
|
||||
.sprite_regions
|
||||
db $00, $40, $80, $C0
|
||||
|
||||
;$7EEA04
|
||||
.data1
|
||||
db $00, $1C
|
||||
|
||||
;$7EEA06
|
||||
.data2
|
||||
db $01, $F9
|
||||
|
||||
;$7EEA08
|
||||
.chrHead
|
||||
db $C4, $E2, $C2, $E0, $C0, $E0, $C2, $E2, $C4, $E2, $C2, $E0, $C0, $E0, $C2, $E2
|
||||
|
||||
;$7EEA18
|
||||
.chrTail
|
||||
db $CC, $E4, $CA, $E6, $C8, $E6, $CA, $E4, $CC, $E4, $CA, $E6, $C8, $E6, $CA, $E4
|
||||
|
||||
;$7EEA28
|
||||
.propertiesBody
|
||||
db $F3, $F3, $F3, $F3, $B3, $B3, $B3, $B3, $33, $33, $33, $33, $73, $73, $73, $73
|
||||
;db $C0, $C0, $C0, $C0, $80, $80, $80, $80, $00, $00, $00, $00, $40, $40, $40, $40
|
||||
; 1 yellow, green, pink
|
||||
; 3 metroid colors
|
||||
; 5 ice blue
|
||||
; 7 red and yellow
|
||||
; 9 blue and red
|
||||
; B neon green and yellow
|
||||
; D silver and yellow
|
||||
; F yellow and red
|
||||
|
||||
;$7EEA38
|
||||
.oamCoord90
|
||||
dw $0930, $08F0, $08B0, $0870
|
||||
|
||||
;$7EEA40
|
||||
.oamCoord92
|
||||
dw $0A6C, $0A5C, $0A4C, $0A3C
|
||||
|
||||
;$7EEA48
|
||||
.chrMound
|
||||
db $EE, $EE, $EC, $EC, $CE, $CE
|
||||
;db $EE, $EE, $EC, $EC, $CE, $CE
|
||||
|
||||
;$7EEA4E
|
||||
.propertiesMound
|
||||
db $39, $79, $39, $79, $39, $79
|
||||
;db $31, $71, $31, $71, $31, $71
|
||||
|
||||
;$7EEA54
|
||||
.frameMound
|
||||
db $04, $05, $04, $05, $04, $05, $04, $05
|
||||
db $04, $03, $02, $01, $01, $01, $00, $00
|
||||
|
||||
;$7EEA64
|
||||
.xDirt
|
||||
dw $FFF8, $0008, $FFF6, $000A, $FFF0, $0010, $FFE8, $0020
|
||||
;db $F8, $08, $F6, $0A, $F0, $10, $E8, $20
|
||||
|
||||
;$7EEA74
|
||||
.yDirt
|
||||
dw $0000, $0000, $FFFF, $FFFF, $FFFF, $FFFF, $0003, $0003
|
||||
;db $00, $00, $FF, $FF, $FF, $FF, $03, $03
|
||||
|
||||
;$7EEA84
|
||||
.chrDirt
|
||||
db $E8, $E8, $E8, $E8, $EA, $EA, $EA, $EA
|
||||
|
||||
;$7EEA8C
|
||||
.propertiesDirt
|
||||
db $39, $79, $39, $79, $39, $79, $39, $79
|
||||
;db $00, $40, $00, $40, $00, $40, $00, $40
|
||||
|
||||
;$7EEA94
|
||||
.sizesDirt
|
||||
db $02, $02, $02, $02, $02, $02, $00, $00
|
||||
|
||||
;$7EEA9C
|
||||
.y_speed_slope
|
||||
db 2, -2
|
||||
|
||||
;$7EEA9E
|
||||
.y_speeds
|
||||
db $10, $F0
|
||||
|
||||
;$7EEAA0
|
||||
.dataDeath
|
||||
db 0, 8, 16, 24, 32, 40, 48, 56
|
||||
|
||||
;$7EEAA8
|
||||
.randXPos
|
||||
db $58, $50, $60, $70, $80, $90, $A0, $98
|
||||
|
||||
;$7EEAB0
|
||||
.randYPos
|
||||
db $68, $60, $70, $80, $90, $A0, $A8, $B0
|
||||
|
||||
;$7EEAB8
|
||||
.lanmoalKilledState
|
||||
|
||||
;7EEACA
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
Lanmola_MoveSegment:
|
||||
{
|
||||
PHX
|
||||
TXA : ASL A : TAX
|
||||
|
||||
REP #$20
|
||||
LDA $7EEA38, X : STA $90 ;.oamCoord90
|
||||
LDA $7EEA40, X : STA $92 ;.oamCoord92
|
||||
SEP #$20
|
||||
|
||||
PLX
|
||||
|
||||
LDA $0D40, X : SEC : SBC $0F80, X : STA $00
|
||||
LDA $0D50, X : STA $01
|
||||
JSL Sprite_ConvertVelocityToAngle : STA $0F
|
||||
|
||||
LDA $7EEA00, X : STA $04 ;.sprite_regions
|
||||
|
||||
PHX
|
||||
|
||||
; Store the current position, angle, and hieght of the sprite
|
||||
; so that we can set the other segments to them later.
|
||||
LDA $0D30, X : PHA ;high x
|
||||
LDA $0D20, X : PHA ;high y
|
||||
LDA $0D10, X : PHA ;lower x
|
||||
LDA $0D00, X : PHA ;lower y
|
||||
|
||||
LDA $0F70, X : PHA ;height
|
||||
LDA $0F : PHA ;angle
|
||||
|
||||
LDA $0E80, X : STA $02 : STA $05
|
||||
|
||||
CLC : ADC $04 : TAX
|
||||
|
||||
PLA : STA $7FFF00, X ;angle
|
||||
PLA : STA $7FFE00, X ;height
|
||||
|
||||
PLA : STA $7FFD00, X ;lower y
|
||||
PLA : STA $7FFC00, X ;lower x
|
||||
PLA : STA $7EE900, X ;high y
|
||||
PLA : STA $7EE800, X ;high x
|
||||
|
||||
PLX
|
||||
|
||||
LDA $0DD0, X : CMP.b #$09 : BNE .notActive
|
||||
LDA $11 : ORA $0FC1 : BNE .notActive
|
||||
LDA $10 : CMP #$0E : BEQ .notActive
|
||||
LDA $5D : CMP #$08 : BEQ .notActive ;in medallion cut scene
|
||||
CMP #$09 : BEQ .notActive ;in medallion cut scene
|
||||
CMP #$0A : BEQ .notActive ;in medallion cut scene
|
||||
LDA $05 : INC A : AND.b #$3F : STA $0E80, X
|
||||
|
||||
.notActive
|
||||
|
||||
RTL
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
SetShrapnelTimer:
|
||||
{
|
||||
LDA.b #$40 : STA $0DF0, Y
|
||||
|
||||
JSL GetRandomInt ; replaced code
|
||||
|
||||
RTL
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
|
||||
CheckIfActive:
|
||||
{
|
||||
SEC
|
||||
|
||||
;Check if sprite is active (pause menu, etc...)
|
||||
LDA $10 : CMP #$0E : BEQ .inMenu
|
||||
LDA $5D : CMP #$08 : BEQ .inMenu ;in medallion cut scene
|
||||
CMP #$09 : BEQ .inMenu ;in medallion cut scene
|
||||
CMP #$0A : BEQ .inMenu ;in medallion cut scene
|
||||
|
||||
CLC
|
||||
.inMenu
|
||||
|
||||
RTL
|
||||
}
|
||||
|
||||
; ==============================================================================
|
||||
@@ -72,7 +72,7 @@ namespace Oracle
|
||||
incsrc "Overworld/master_sword.asm"
|
||||
print "End of master_sword.asm ", pc
|
||||
|
||||
incsrc "Overworld/custom_gfx.asm"
|
||||
;incsrc "Overworld/custom_gfx.asm"
|
||||
print "End of custom_gfx.asm ", pc
|
||||
|
||||
incsrc "Overworld/maku_tree.asm"
|
||||
@@ -112,6 +112,12 @@ namespace Oracle
|
||||
incsrc "Dungeons/spike_subtype.asm"
|
||||
print "End of spike_subtype.asm ", pc
|
||||
|
||||
incsrc "Dungeons/Lanmola.asm"
|
||||
print "End of Dungeons/Lanmola.asm ", pc
|
||||
|
||||
incsrc "Dungeons/Lanmola_Expanded.asm"
|
||||
print "End of Dungeons/Lanmola_Expanded.asm ", pc
|
||||
|
||||
print ""
|
||||
|
||||
; ---------------------------------------------------------
|
||||
@@ -126,7 +132,7 @@ namespace Oracle
|
||||
incsrc "Music/dungeon_theme.asm"
|
||||
print "End of Music/dungeon_theme.asm ", pc
|
||||
|
||||
incsrc "Music/entrance_music_fix.asm"
|
||||
; incsrc "Music/entrance_music_fix.asm"
|
||||
|
||||
print ""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user