Difference between revisions of "Moldorm (Boss)"
From TLoZ: ALTTP Hacking Resources
| Line 1: | Line 1: | ||
| − | {{ | + | {{subpage|Sprites}} |
| − | | | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | }} | ||
| − | == Description == | + | Sprite {{$|09}}: Moldorm (Boss) |
| − | * | + | == Octorok (One Way) == |
| + | === Description === | ||
| + | :Ooo* | ||
| − | == Combat Strategy == | + | === Combat Strategy === |
| − | Hit his tail, | + | Hit his tail, try not to fall down. |
| − | == | + | == Stats And Properties == |
| + | See [[Sprite Properties]] | ||
| − | == | + | '''{{$|06B089}}''' |
| + | {|{{Prettytable}} | ||
| + | !Bit(s) | ||
| + | !Info | ||
| + | !Value | ||
| + | |- | ||
| + | | {{Hex|7}} | ||
| + | | Harmless | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|6}} | ||
| + | | ? | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|5}} | ||
| + | | ? | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|4-0}} | ||
| + | | OAM Slots | ||
| + | | {{Hex|01111}} ({{$|0F}}) | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B17C}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7-0}} | ||
| + | | HP | ||
| + | | {{Hex|0000 1100}} ({{$|0C}}) | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B26F}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7-4}} | ||
| + | | ? | ||
| + | | {{Hex|0001}} ({{$|01}}) | ||
| + | |- | ||
| + | | {{Hex|3-0}} | ||
| + | | [[Damage Types|Damage Type]] | ||
| + | | {{Hex|0011}} ({{$|03}}) | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B362}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7}} | ||
| + | | No Death Animation | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|6}} | ||
| + | | Invincible | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|5}} | ||
| + | | Adjust Child coordinates | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|4}} | ||
| + | | Draw Shadow | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|3-1}} | ||
| + | | Palette | ||
| + | | {{Hex|000}} ({{$|06}}) | ||
| + | |- | ||
| + | | {{Hex|0}} | ||
| + | | ? | ||
| + | | {{Hex|1}} | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B455}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7}} | ||
| + | | Ignore Collision Settings | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|6}} | ||
| + | | Statis | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|5}} | ||
| + | | Persist | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|4-0}} | ||
| + | | Hit Box Dimensions | ||
| + | | {{Hex|00000}} ({{$|00}}) | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B548}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7-4}} | ||
| + | | Tile Interaction Hit Box | ||
| + | | {{Hex|0000}} ({{$|00}}) | ||
| + | |- | ||
| + | | {{Hex|3}} | ||
| + | | ? | ||
| + | | {{Hex|1}} | ||
| + | |- | ||
| + | | {{Hex|2}} | ||
| + | | ? | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|1}} | ||
| + | | Dies Like A Boss | ||
| + | | {{Hex|1}} | ||
| + | |- | ||
| + | | {{Hex|0}} | ||
| + | | Falls In Holes | ||
| + | | {{Hex|0}} | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B63B}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7}} | ||
| + | | Disable Tile Interactions | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|6}} | ||
| + | | ? | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|5}} | ||
| + | | Is shield Blockable | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|4}} | ||
| + | | Alternate Damage Sound | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|3-0}} | ||
| + | | Prize Pack | ||
| + | | {{Hex|0000}} ({{$|00}}) | ||
| + | |} | ||
| + | |||
| + | '''{{$|06B72E}}''' | ||
| + | {|{{Prettytable}} | ||
| + | ! Bit(s) | ||
| + | ! Info | ||
| + | ! Value | ||
| + | |- | ||
| + | | {{Hex|7}} | ||
| + | | ? | ||
| + | | {{Hex|1}} | ||
| + | |- | ||
| + | | {{Hex|6}} | ||
| + | | ? | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|5}} | ||
| + | | Is Interactive | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|4}} | ||
| + | | Deflect Projectiles | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|3}} | ||
| + | | Collide With Less Tiles | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|2}} | ||
| + | | Impervious To Sword/Hammer | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|1}} | ||
| + | | Impervious To Arrows? | ||
| + | | {{Hex|0}} | ||
| + | |- | ||
| + | | {{Hex|0}} | ||
| + | | ? | ||
| + | | {{Hex|1}} | ||
| + | |} | ||
| + | |||
| + | == Code == | ||
| + | <Code> | ||
| + | ; *$ED6D1-$ED6F5 LONG | ||
| + | Sprite_InitializedSegmented: | ||
| + | { | ||
| + | PHX : TXY | ||
| + | |||
| + | LDX.b #$7F | ||
| + | |||
| + | .init_segment_loop | ||
| + | |||
| + | LDA $0D10, Y : STA $7FFC00, X | ||
| + | LDA $0D30, Y : STA $7FFC80, X | ||
| + | |||
| + | LDA $0D00, Y : STA $7FFD00, X | ||
| + | LDA $0D20, Y : STA $7FFD80, X | ||
| + | |||
| + | DEX : BPL .init_segment_loop | ||
| + | |||
| + | PLX | ||
| + | |||
| + | RTL | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED6F6-$ED6FD LONG | ||
| + | Sprite_GiantMoldormLong: | ||
| + | { | ||
| + | PHB : PHK : PLB | ||
| + | |||
| + | JSR Sprite_GiantMoldorm | ||
| + | |||
| + | PLB | ||
| + | |||
| + | RTL | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; $ED6FE-$ED74D DATA | ||
| + | pool Sprite_GiantMoldorm: | ||
| + | { | ||
| + | |||
| + | .x_speeds | ||
| + | db 24, 22, 17, 9, 0, -9, -17, -22 | ||
| + | db -24, -22, -17, -9, 0, 9, 17, 22 | ||
| + | db 36, 33, 25, 13, 0, -13, -25, -33 | ||
| + | db -36, -33, -25, -13, 0, 13, 25, 33 | ||
| + | |||
| + | .y_speeds | ||
| + | db 0, 9, 17, 22, 24, 22, 17, 9 | ||
| + | db 0, -9, -17, -22, -24, -22, -17, -9 | ||
| + | db 0, 13, 25, 33, 36, 33, 25, 13 | ||
| + | db 0, -13, -25, -33, -36, -33, -25, -13 | ||
| + | |||
| + | .direction | ||
| + | db 8, 9, 10, 11, 12, 13, 14, 15 | ||
| + | db 0, 1, 2, 3, 4, 5, 6, 7 | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED74E-$ED7FD LOCAL | ||
| + | Sprite_GiantMoldorm: | ||
| + | { | ||
| + | JSR GiantMoldorm_Draw | ||
| + | JSR Sprite4_CheckIfActive | ||
| + | |||
| + | LDA $0D80, X : CMP.b #$03 : BNE .not_scheduled_for_death | ||
| + | |||
| + | JMP GiantMoldorm_AwaitDeath | ||
| + | |||
| + | .not_scheduled_for_death | ||
| + | |||
| + | JSL Sprite_CheckDamageFromPlayerLong | ||
| + | |||
| + | LDA.b #$07 | ||
| + | |||
| + | LDY $0E50, X : CPY.b #$03 : BCS .not_desperate_yet | ||
| + | |||
| + | INC $0E80, X | ||
| + | |||
| + | LDA.b #$03 | ||
| + | |||
| + | .not_desperate_yet | ||
| + | |||
| + | INC $0E80, X | ||
| + | |||
| + | AND $1A : BNE .skip_sound_effect_this_frame | ||
| + | |||
| + | LDA.b #$31 : JSL Sound_SetSfx3PanLong | ||
| + | |||
| + | .skip_sound_effect_this_frame | ||
| + | |||
| + | LDA $0EA0, X : BEQ .not_stunned_from_damage | ||
| + | |||
| + | LDA.b #$40 : STA !timer_2, X | ||
| + | |||
| + | LDA $1A : AND.b #$03 : BNE .stun_timer_delay | ||
| + | |||
| + | DEC $0EA0, X | ||
| + | |||
| + | .stun_timer_delay | ||
| + | |||
| + | RTS | ||
| + | |||
| + | .not_stunned_from_damage | ||
| + | |||
| + | LDA $46 : BNE .dont_repulse_player | ||
| + | |||
| + | JSL Sprite_CheckDamageToPlayerLong : BCC .dont_repulse_player | ||
| + | |||
| + | JSL Player_HaltDashAttackLong | ||
| + | |||
| + | LDA.b #$28 : JSL Sprite_ProjectSpeedTowardsPlayerLong | ||
| + | |||
| + | LDA $00 : STA $27 | ||
| + | |||
| + | LDA $01 : STA $28 | ||
| + | |||
| + | LDA.b #$18 : STA $46 | ||
| + | |||
| + | LDA.b #$30 : STA !timer_1, X | ||
| + | |||
| + | ; Wait... how does this work? This value gets overriden by the call... | ||
| + | ; I think this may be a certified \bug | ||
| + | LDA.b #$32 : JSL Sound_SetSfxPan : STA $012F | ||
| + | |||
| + | .dont_repulse_player | ||
| + | |||
| + | LDY $0DE0, X | ||
| + | |||
| + | LDA $0E50, X : CMP.b #$03 : BCS .not_desperate_2 | ||
| + | |||
| + | TYA : ADD.b #$10 : TAY | ||
| + | |||
| + | .not_desperate_2 | ||
| + | |||
| + | LDA .x_speeds, Y : STA $0D50, X | ||
| + | |||
| + | LDA .y_speeds, Y : STA $0D40, X | ||
| + | |||
| + | JSR Sprite4_Move | ||
| + | |||
| + | JSR Sprite4_CheckTileCollision : BEQ .no_tile_collision | ||
| + | |||
| + | LDY $0DE0, X | ||
| + | |||
| + | LDA .directions, Y : STA $0DE0, X | ||
| + | |||
| + | ; I guess... this is where the ticking sound comes from? | ||
| + | LDA.b #$21 : JSL Sound_SetSfx2PanLong | ||
| + | |||
| + | .no_tile_collision | ||
| + | |||
| + | LDA $0D80, X | ||
| + | |||
| + | JSL UseImplicitRegIndexedLocalJumpTable | ||
| + | |||
| + | dw GiantMoldorm_StraightPath | ||
| + | dw GiantMoldorm_SpinningMeander | ||
| + | dw GiantMoldorm_LungeAtPlayer | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED7FE-$ED82C JUMP LOCATION | ||
| + | GiantMoldorm_StraightPath: | ||
| + | { | ||
| + | LDA !timer_0, X : BNE .wait | ||
| + | |||
| + | LDA.b #$01 | ||
| + | |||
| + | INC $0ED0, X : LDY $0ED0, X : CPY.b #$03 : BNE .beta | ||
| + | |||
| + | STZ $0ED0, X | ||
| + | |||
| + | LDA.b #$02 | ||
| + | |||
| + | .beta | ||
| + | |||
| + | STA $0D80, X | ||
| + | |||
| + | ; \note Resultant value is either 1 or -1. | ||
| + | JSL GetRandomInt : AND.b #$02 : DEC A : STA $0EB0, X | ||
| + | |||
| + | JSL GetRandomInt : AND.b #$1F : ADC.b #$20 : STA !timer_0, X | ||
| + | |||
| + | .wait | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED82D-$ED851 JUMP LOCATION | ||
| + | GiantMoldorm_SpinningMeander: | ||
| + | { | ||
| + | LDA !timer_0, X : BNE .wait | ||
| + | |||
| + | JSL GetRandomInt : AND.b #$0F : ADC.b #$08 : STA !timer_0, X | ||
| + | |||
| + | STZ $0D80, X | ||
| + | |||
| + | RTS | ||
| + | |||
| + | .wait | ||
| + | |||
| + | AND.b #$03 : BNE .dont_adjust_direction | ||
| + | |||
| + | LDA $0DE0, X : ADD $0EB0, X : AND.b #$0F : STA $0DE0, X | ||
| + | |||
| + | .dont_adjust_direction | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED852-$ED880 JUMP LOCATION | ||
| + | GiantMoldorm_LungeAtPlayer: | ||
| + | { | ||
| + | TXA : EOR $1A : AND.b #$03 : BNE .frame_delay | ||
| + | |||
| + | LDA.b #$1F : JSL Sprite_ApplySpeedTowardsPlayerLong | ||
| + | |||
| + | JSL Sprite_ConvertVelocityToAngle | ||
| + | |||
| + | CMP $0DE0, X : BNE .current_direction_doesnt_match | ||
| + | |||
| + | STZ $0D80, X | ||
| + | |||
| + | LDA.b #$30 : STA !timer_0, X | ||
| + | |||
| + | RTS | ||
| + | |||
| + | .current_direction_doesnt_match | ||
| + | |||
| + | PHP : LDA $0DE0, X : PLP : BMI .rotate_one_way | ||
| + | |||
| + | ; rotate the other way... don't know if it's clockwise or counter | ||
| + | ; clockwise. | ||
| + | INC #2 | ||
| + | |||
| + | .rotate_one_way | ||
| + | |||
| + | DEC A : AND.b #$0F : STA $0DE0, X | ||
| + | |||
| + | .frame_delay | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED881-$ED8F1 LOCAL | ||
| + | GiantMoldorm_Draw: | ||
| + | { | ||
| + | JSR Sprite4_PrepOamCoord | ||
| + | |||
| + | LDA.b #$0B : STA $0F50, X | ||
| + | |||
| + | JSR GiantMoldorm_DrawEyeballs | ||
| + | |||
| + | REP #$20 | ||
| + | |||
| + | LDA $90 : ADD.w #$0008 : STA $90 | ||
| + | |||
| + | INC $92 : INC $92 | ||
| + | |||
| + | SEP #$20 | ||
| + | |||
| + | PHX : TXY | ||
| + | |||
| + | LDA $0E80, X : AND.b #$7F : TAX | ||
| + | |||
| + | LDA $0D10, Y : STA $7FFC00, X | ||
| + | LDA $0D00, Y : STA $7FFD00, X | ||
| + | |||
| + | LDA $0D30, Y : STA $7FFC80, X | ||
| + | LDA $0D20, Y : STA $7FFD80, X | ||
| + | |||
| + | PLX | ||
| + | |||
| + | JSR GiantMoldorm_DrawHead | ||
| + | |||
| + | LDA $0DA0, X : CMP.b #$04 : BCS .dont_draw_segment | ||
| + | |||
| + | JSR GiantMoldorm_DrawSegment_A | ||
| + | |||
| + | LDA $0DA0, X : CMP.b #$03 : BCS .dont_draw_segment | ||
| + | |||
| + | JSR GiantMoldorm_DrawSegment_B | ||
| + | |||
| + | LDA $0DA0, X : CMP.b #$02 : BCS .dont_draw_segment | ||
| + | |||
| + | JSR GiantMoldorm_DrawSegment_C | ||
| + | |||
| + | LDA $0DA0, X : BNE .dont_draw_segment | ||
| + | |||
| + | JSR GiantMoldorm_Tail | ||
| + | |||
| + | .dont_draw_segment | ||
| + | |||
| + | JSR GiantMoldorm_IncrementalSegmentExplosion | ||
| + | JSL Sprite_Get_16_bit_CoordsLong | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED8F2-$ED912 LOCAL | ||
| + | GiantMoldorm_IncrementalSegmentExplosion: | ||
| + | { | ||
| + | LDA $0DD0, X : CMP.b #$09 : BNE .alive_and_well | ||
| + | |||
| + | LDA !timer_4, X : BEQ .delay_explosion | ||
| + | CMP.b #$50 : BCS .delay_explosion | ||
| + | |||
| + | AND.b #$0F : ORA $11 : ORA $0FC1 : BNE .delay_explosion | ||
| + | |||
| + | ; Move on to the next segment. | ||
| + | INC $0DA0, X | ||
| + | |||
| + | JSL Sprite_MakeBossDeathExplosion | ||
| + | |||
| + | .delay_explosion | ||
| + | .alive_and_well | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; $ED913-$ED992 DATA | ||
| + | pool GiantMoldorm_DrawHead: | ||
| + | { | ||
| + | |||
| + | .oam_groups | ||
| + | dw -8, -8 : db $80, $00, $00, $02 | ||
| + | dw 8, -8 : db $82, $00, $00, $02 | ||
| + | dw -8, 8 : db $A0, $00, $00, $02 | ||
| + | dw 8, 8 : db $A2, $00, $00, $02 | ||
| + | |||
| + | dw -8, -8 : db $82, $40, $00, $02 | ||
| + | dw 8, -8 : db $80, $40, $00, $02 | ||
| + | dw -8, 8 : db $A2, $40, $00, $02 | ||
| + | dw 8, 8 : db $A0, $40, $00, $02 | ||
| + | |||
| + | dw -6, -6 : db $80, $00, $00, $02 | ||
| + | dw 6, -6 : db $82, $00, $00, $02 | ||
| + | dw -6, 6 : db $A0, $00, $00, $02 | ||
| + | dw 6, 6 : db $A2, $00, $00, $02 | ||
| + | |||
| + | dw -6, -6 : db $82, $40, $00, $02 | ||
| + | dw 6, -6 : db $80, $40, $00, $02 | ||
| + | dw -6, 6 : db $A2, $40, $00, $02 | ||
| + | dw 6, 6 : db $A0, $40, $00, $02 | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$ED993-$ED9B7 LOCAL | ||
| + | GiantMoldorm_DrawHead: | ||
| + | { | ||
| + | LDA.b #$00 : XBA | ||
| + | |||
| + | LDA !timer_1, X : AND.b #$02 : STA $00 | ||
| + | |||
| + | LDA $0E80, X : LSR A : AND.b #$01 : ORA $00 | ||
| + | |||
| + | REP #$20 | ||
| + | |||
| + | ASL #5 : ADC.w #.oam_groups : STA $08 | ||
| + | |||
| + | SEP #$20 | ||
| + | |||
| + | LDA.b #$04 : JMP Sprite4_DrawMultiple | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; $ED9B8-$ED9F7 DATA | ||
| + | pool GiantMoldorm_DrawSegment_A: | ||
| + | { | ||
| + | |||
| + | .oam_groups | ||
| + | dw -8, -8 : db $84, $00, $00, $02 | ||
| + | dw 8, -8 : db $86, $00, $00, $02 | ||
| + | dw -8, 8 : db $A4, $00, $00, $02 | ||
| + | dw 8, 8 : db $A6, $00, $00, $02 | ||
| + | |||
| + | dw -8, -8 : db $86, $40, $00, $02 | ||
| + | dw 8, -8 : db $84, $40, $00, $02 | ||
| + | dw -8, 8 : db $A6, $40, $00, $02 | ||
| + | dw 8, 8 : db $A4, $40, $00, $02 | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; \note The segment nearest the head. | ||
| + | ; *$ED9F8-$EDA4F LOCAL | ||
| + | GiantMoldorm_DrawSegment_A: | ||
| + | { | ||
| + | TXY | ||
| + | |||
| + | PHX | ||
| + | |||
| + | LDA $0E80, X : SUB.b #$10 | ||
| + | |||
| + | ; *$EDA00 ALTERNATE ENTRY POINT | ||
| + | shared GiantMoldorm_DrawLargeSegment: | ||
| + | |||
| + | AND.b #$7F : TAX | ||
| + | |||
| + | LDA $7FFC00, X : STA $0FD8 | ||
| + | LDA $7FFC80, X : STA $0FD9 | ||
| + | |||
| + | LDA $7FFD00, X : STA $0FDA | ||
| + | LDA $7FFD80, X : STA $0FDB | ||
| + | |||
| + | PLX | ||
| + | |||
| + | LDA.b #$00 : XBA | ||
| + | |||
| + | LDA $0E80, X : LSR A : AND.b #$01 | ||
| + | |||
| + | REP #$20 | ||
| + | |||
| + | ASL #5 : ADC.w #.oam_groups : STA $08 | ||
| + | |||
| + | REP #$20 | ||
| + | |||
| + | LDA $90 : ADD.w #$0010 : STA $90 | ||
| + | |||
| + | LDA $92 : ADD.w #$0004 : STA $92 | ||
| + | |||
| + | SEP #$20 | ||
| + | |||
| + | SEP #$20 | ||
| + | |||
| + | LDA.b #$04 | ||
| + | |||
| + | JMP Sprite4_DrawMultiple | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDA50-$EDA5A LOCAL | ||
| + | GiantMoldorm_DrawSegment_B: | ||
| + | { | ||
| + | TXY | ||
| + | |||
| + | PHX | ||
| + | |||
| + | LDA $0E80, X : SUB.b #$1C | ||
| + | |||
| + | JMP GiantMoldorm_DrawLargeSegment | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; $EDA5B-$EDA5E DATA | ||
| + | pool GiantMoldorm_DrawSegment_C: | ||
| + | { | ||
| + | |||
| + | .vh_flip | ||
| + | db $00, $40, $C0, $80 | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDA5F-$EDAB9 LOCAL | ||
| + | GiantMoldorm_DrawSegment_C: | ||
| + | { | ||
| + | STZ $0DC0, X | ||
| + | |||
| + | REP #$20 | ||
| + | |||
| + | LDA $90 : ADD.w #$0010 : STA $90 | ||
| + | |||
| + | LDA $92 : ADD.w #$0004 : STA $92 | ||
| + | |||
| + | SEP #$20 | ||
| + | |||
| + | TXY | ||
| + | |||
| + | PHX | ||
| + | |||
| + | LDA $0E80, X : SUB.b #$28 | ||
| + | |||
| + | ; *$EDA7E ALTERNATE ENTRY POINT | ||
| + | shared GiantMoldorm_PrepAndDrawSingleLargeLong: | ||
| + | |||
| + | AND.b #$7F : TAX | ||
| + | |||
| + | LDA $7FFC00, X : STA $0FD8 | ||
| + | LDA $7FFC80, X : STA $0FD9 | ||
| + | |||
| + | LDA $7FFD00, X : STA $0FDA | ||
| + | LDA $7FFD80, X : STA $0FDB | ||
| + | |||
| + | PLX | ||
| + | |||
| + | LDA $0E80, X : LSR A : AND.b #$03 : TAY | ||
| + | |||
| + | LDA $0F50, X : PHA | ||
| + | |||
| + | AND.b #$3F : ORA .vh_flip, Y : STA $0F50, X | ||
| + | |||
| + | JSL Sprite_PrepAndDrawSingleLargeLong | ||
| + | |||
| + | PLA : STA $0F50, X | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDABA-$EDB16 LOCAL | ||
| + | GiantMoldorm_Tail: | ||
| + | { | ||
| + | JSR GiantMoldorm_DrawTail | ||
| + | |||
| + | LDA !timer_2, X : BNE .temporarily_invulnerable | ||
| + | |||
| + | LDA.b #$01 : STA $0D90, X | ||
| + | |||
| + | STZ $0F60, X | ||
| + | STZ $0CAA, X | ||
| + | |||
| + | LDA $0D10, X : PHA | ||
| + | LDA $0D30, X : PHA | ||
| + | |||
| + | LDA $0D00, X : PHA | ||
| + | LDA $0D20, X : PHA | ||
| + | |||
| + | LDA $0FD8 : STA $0D10, X | ||
| + | LDA $0FD9 : STA $0D30, X | ||
| + | |||
| + | LDA $0FDA : STA $0D00, X | ||
| + | LDA $0FDB : STA $0D20, X | ||
| + | |||
| + | JSL Sprite_CheckDamageFromPlayerLong | ||
| + | |||
| + | STZ $0D90, X | ||
| + | |||
| + | LDA.b #$09 : STA $0F60, X | ||
| + | LDA.b #$04 : STA $0CAA, X | ||
| + | |||
| + | PLA : STA $0D20, X | ||
| + | PLA : STA $0D00, X | ||
| + | |||
| + | PLA : STA $0D30, X | ||
| + | PLA : STA $0D10, X | ||
| + | |||
| + | .temporarily_invulnerable | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDB17-$EDB3D LOCAL | ||
| + | GiantMoldorm_DrawTail: | ||
| + | { | ||
| + | REP #$20 | ||
| + | |||
| + | LDA $90 : ADD.w #$0004 : STA $90 | ||
| + | |||
| + | LDA $92 : ADD.w #$0001 : STA $92 | ||
| + | |||
| + | SEP #$20 | ||
| + | |||
| + | INC $0DC0, X | ||
| + | |||
| + | LDA.b #$0D : STA $0F50, X | ||
| + | |||
| + | TXY | ||
| + | PHX | ||
| + | |||
| + | LDA $0E80, X : SUB.b #$30 | ||
| + | |||
| + | JMP GiantMoldorm_PrepAndDrawSingleLargeLong | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; $EDB3E-$EDB9D DATA | ||
| + | pool GiantMoldorm_DrawEyeballs: | ||
| + | { | ||
| + | |||
| + | .x_offsets | ||
| + | dw 16, 15, 12, 6, 0, -6, -12, -13 | ||
| + | dw -16, -13, -12, -6, 0, 6, 12, 15 | ||
| + | |||
| + | .y_offsets | ||
| + | dw 0, 6, 12, 15, 16, 15, 12, 6 | ||
| + | dw 0, -6, -12, -13, -16, -13, -12, -6 | ||
| + | |||
| + | .chr | ||
| + | db $AA, $AA, $A8, $A8, $8A, $8A, $A8, $A8 | ||
| + | db $AA, $AA, $A8, $A8, $8A, $8A, $A8, $A8 | ||
| + | |||
| + | .vh_flip | ||
| + | db $00, $00, $00, $00, $80, $80, $40, $40 | ||
| + | db $40, $40, $C0, $C0, $00, $00, $80, $80 | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDB9E-$EDC10 LOCAL | ||
| + | GiantMoldorm_DrawEyeballs: | ||
| + | { | ||
| + | STZ $07 | ||
| + | |||
| + | LDA $0EA0, X : BEQ .dont_accelerate_eyerolling | ||
| + | |||
| + | LDA $1A : STA $07 | ||
| + | |||
| + | .dont_accelerate_eyerolling | ||
| + | |||
| + | LDA $0DE0, X : ADD.b #$FF : STA $06 | ||
| + | |||
| + | PHX | ||
| + | |||
| + | LDX.b #$01 | ||
| + | |||
| + | .draw_eyes_loop | ||
| + | |||
| + | LDA $06 : AND.b #$0F : ASL A : PHX : TAX | ||
| + | |||
| + | REP #$20 | ||
| + | |||
| + | LDA $00 : ADD .x_offsets, X : STA ($90), Y | ||
| + | |||
| + | AND.w #$0100 : STA $0E | ||
| + | |||
| + | LDA $02 : ADD .y_offsets, X : INY : STA ($90), Y | ||
| + | |||
| + | ADC.w #$0010 : CMP.w #$0100 : SEP #$20 : BCC .on_screen_y | ||
| + | |||
| + | LDA.b #$F0 : STA ($90), Y | ||
| + | |||
| + | .on_screen_y | ||
| + | |||
| + | LDA $06 : ADD $07 : AND.b #$0F : TAX | ||
| + | |||
| + | LDA .chr, X : INY : STA ($90), Y | ||
| + | |||
| + | LDA .vh_flip, X : ORA $05 : INY : STA ($90), Y | ||
| + | |||
| + | PHY : TYA : LSR #2 : TAY | ||
| + | |||
| + | LDA $0F : ORA.b #$02 : STA ($92), Y | ||
| + | |||
| + | LDA $06 : ADD.b #$02 : STA $06 | ||
| + | |||
| + | PLY : INY | ||
| + | |||
| + | PLX : DEX : BPL .draw_eyes_loop | ||
| + | |||
| + | PLX | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDC11-$EDC29 JUMP LOCATION | ||
| + | GiantMoldorm_AwaitDeath: | ||
| + | { | ||
| + | LDA !timer_4, X : BNE .delay | ||
| + | |||
| + | ; *$EDC16 ALTERNATE ENTRY POINT | ||
| + | Sprite_ScheduleBossForDeath: | ||
| + | |||
| + | LDA.b #$04 : STA $0DD0, X | ||
| + | |||
| + | STZ $0D90, X | ||
| + | |||
| + | LDA.b #$E0 : STA !timer_0, X | ||
| + | |||
| + | RTS | ||
| + | |||
| + | .delay | ||
| + | |||
| + | ORA.b #$E0 : STA $0EF0, X | ||
| + | |||
| + | RTS | ||
| + | } | ||
| + | |||
| + | ; ============================================================================== | ||
| + | |||
| + | ; *$EDC2A-$EDC71 LONG | ||
| + | Sprite_MakeBossDeathExplosion: | ||
| + | { | ||
| + | LDA.b #$0C : JSL Sound_SetSfx2PanLong | ||
| + | |||
| + | ; *$EDC30 ALTERNATE ENTRY POINT | ||
| + | .silent | ||
| + | |||
| + | ; Spawn a.... raven? What? Oh it's just a dummy sprite that will be | ||
| + | ; transmuted to an explosion. | ||
| + | LDA.b #$00 : JSL Sprite_SpawnDynamically : BMI .spawn_failed | ||
| + | |||
| + | LDA.b #$0B : STA $0AAA | ||
| + | |||
| + | LDA.b #$04 : STA $0DD0, Y | ||
| + | LDA.b #$03 : STA $0E40, Y | ||
| + | LDA.b #$0C : STA $0F50, Y | ||
| + | |||
| + | LDA $0FD8 : STA $0D10, Y | ||
| + | LDA $0FD9 : STA $0D30, Y | ||
| + | |||
| + | LDA $0FDA : STA $0D00, Y | ||
| + | LDA $0FDB : STA $0D20, Y | ||
| + | |||
| + | LDA.b #$1F : STA !timer_0, Y | ||
| + | STA $0D90, Y | ||
| + | |||
| + | LDA.b #$02 : STA $0F20, Y | ||
| + | |||
| + | .spawn_failed | ||
| + | |||
| + | RTL | ||
| + | } | ||
| + | </Code> | ||
Revision as of 00:40, 20 December 2016
This is a subpage of Sprites
Sprite $09: Moldorm (Boss)
Octorok (One Way)
Description
- Ooo*
Combat Strategy
Hit his tail, try not to fall down.
Stats And Properties
$06B089
| Bit(s) | Info | Value |
|---|---|---|
| 7 | Harmless | 0 |
| 6 | ? | 0 |
| 5 | ? | 0 |
| 4-0 | OAM Slots | 01111 ($0F) |
$06B17C
| Bit(s) | Info | Value |
|---|---|---|
| 7-0 | HP | 0000 1100 ($0C) |
$06B26F
| Bit(s) | Info | Value |
|---|---|---|
| 7-4 | ? | 0001 ($01) |
| 3-0 | Damage Type | 0011 ($03) |
$06B362
| Bit(s) | Info | Value |
|---|---|---|
| 7 | No Death Animation | 0 |
| 6 | Invincible | 0 |
| 5 | Adjust Child coordinates | 0 |
| 4 | Draw Shadow | 0 |
| 3-1 | Palette | 000 ($06) |
| 0 | ? | 1 |
$06B455
| Bit(s) | Info | Value |
|---|---|---|
| 7 | Ignore Collision Settings | 0 |
| 6 | Statis | 0 |
| 5 | Persist | 0 |
| 4-0 | Hit Box Dimensions | 00000 ($00) |
$06B548
| Bit(s) | Info | Value |
|---|---|---|
| 7-4 | Tile Interaction Hit Box | 0000 ($00) |
| 3 | ? | 1 |
| 2 | ? | 0 |
| 1 | Dies Like A Boss | 1 |
| 0 | Falls In Holes | 0 |
$06B63B
| Bit(s) | Info | Value |
|---|---|---|
| 7 | Disable Tile Interactions | 0 |
| 6 | ? | 0 |
| 5 | Is shield Blockable | 0 |
| 4 | Alternate Damage Sound | 0 |
| 3-0 | Prize Pack | 0000 ($00) |
$06B72E
| Bit(s) | Info | Value |
|---|---|---|
| 7 | ? | 1 |
| 6 | ? | 0 |
| 5 | Is Interactive | 0 |
| 4 | Deflect Projectiles | 0 |
| 3 | Collide With Less Tiles | 0 |
| 2 | Impervious To Sword/Hammer | 0 |
| 1 | Impervious To Arrows? | 0 |
| 0 | ? | 1 |
Code
; *$ED6D1-$ED6F5 LONG
Sprite_InitializedSegmented:
{
PHX : TXY
LDX.b #$7F
.init_segment_loop
LDA $0D10, Y : STA $7FFC00, X
LDA $0D30, Y : STA $7FFC80, X
LDA $0D00, Y : STA $7FFD00, X
LDA $0D20, Y : STA $7FFD80, X
DEX : BPL .init_segment_loop
PLX
RTL
}
- ==============================================================================
; *$ED6F6-$ED6FD LONG
Sprite_GiantMoldormLong:
{
PHB : PHK : PLB
JSR Sprite_GiantMoldorm
PLB
RTL
}
- ==============================================================================
; $ED6FE-$ED74D DATA
pool Sprite_GiantMoldorm:
{
.x_speeds
db 24, 22, 17, 9, 0, -9, -17, -22
db -24, -22, -17, -9, 0, 9, 17, 22
db 36, 33, 25, 13, 0, -13, -25, -33
db -36, -33, -25, -13, 0, 13, 25, 33
.y_speeds
db 0, 9, 17, 22, 24, 22, 17, 9
db 0, -9, -17, -22, -24, -22, -17, -9
db 0, 13, 25, 33, 36, 33, 25, 13
db 0, -13, -25, -33, -36, -33, -25, -13
.direction
db 8, 9, 10, 11, 12, 13, 14, 15
db 0, 1, 2, 3, 4, 5, 6, 7
}
- ==============================================================================
; *$ED74E-$ED7FD LOCAL
Sprite_GiantMoldorm:
{
JSR GiantMoldorm_Draw
JSR Sprite4_CheckIfActive
LDA $0D80, X : CMP.b #$03 : BNE .not_scheduled_for_death
JMP GiantMoldorm_AwaitDeath
.not_scheduled_for_death
JSL Sprite_CheckDamageFromPlayerLong
LDA.b #$07
LDY $0E50, X : CPY.b #$03 : BCS .not_desperate_yet
INC $0E80, X
LDA.b #$03
.not_desperate_yet
INC $0E80, X
AND $1A : BNE .skip_sound_effect_this_frame
LDA.b #$31 : JSL Sound_SetSfx3PanLong
.skip_sound_effect_this_frame
LDA $0EA0, X : BEQ .not_stunned_from_damage
LDA.b #$40 : STA !timer_2, X
LDA $1A : AND.b #$03 : BNE .stun_timer_delay
DEC $0EA0, X
.stun_timer_delay
RTS
.not_stunned_from_damage
LDA $46 : BNE .dont_repulse_player
JSL Sprite_CheckDamageToPlayerLong : BCC .dont_repulse_player
JSL Player_HaltDashAttackLong
LDA.b #$28 : JSL Sprite_ProjectSpeedTowardsPlayerLong
LDA $00 : STA $27
LDA $01 : STA $28
LDA.b #$18 : STA $46
LDA.b #$30 : STA !timer_1, X
; Wait... how does this work? This value gets overriden by the call...
; I think this may be a certified \bug
LDA.b #$32 : JSL Sound_SetSfxPan : STA $012F
.dont_repulse_player
LDY $0DE0, X
LDA $0E50, X : CMP.b #$03 : BCS .not_desperate_2
TYA : ADD.b #$10 : TAY
.not_desperate_2
LDA .x_speeds, Y : STA $0D50, X
LDA .y_speeds, Y : STA $0D40, X
JSR Sprite4_Move
JSR Sprite4_CheckTileCollision : BEQ .no_tile_collision
LDY $0DE0, X
LDA .directions, Y : STA $0DE0, X
; I guess... this is where the ticking sound comes from?
LDA.b #$21 : JSL Sound_SetSfx2PanLong
.no_tile_collision
LDA $0D80, X
JSL UseImplicitRegIndexedLocalJumpTable
dw GiantMoldorm_StraightPath
dw GiantMoldorm_SpinningMeander
dw GiantMoldorm_LungeAtPlayer
}
- ==============================================================================
; *$ED7FE-$ED82C JUMP LOCATION
GiantMoldorm_StraightPath:
{
LDA !timer_0, X : BNE .wait
LDA.b #$01
INC $0ED0, X : LDY $0ED0, X : CPY.b #$03 : BNE .beta
STZ $0ED0, X
LDA.b #$02
.beta
STA $0D80, X
; \note Resultant value is either 1 or -1.
JSL GetRandomInt : AND.b #$02 : DEC A : STA $0EB0, X
JSL GetRandomInt : AND.b #$1F : ADC.b #$20 : STA !timer_0, X
.wait
RTS
}
- ==============================================================================
; *$ED82D-$ED851 JUMP LOCATION
GiantMoldorm_SpinningMeander:
{
LDA !timer_0, X : BNE .wait
JSL GetRandomInt : AND.b #$0F : ADC.b #$08 : STA !timer_0, X
STZ $0D80, X
RTS
.wait
AND.b #$03 : BNE .dont_adjust_direction
LDA $0DE0, X : ADD $0EB0, X : AND.b #$0F : STA $0DE0, X
.dont_adjust_direction
RTS
}
- ==============================================================================
; *$ED852-$ED880 JUMP LOCATION
GiantMoldorm_LungeAtPlayer:
{
TXA : EOR $1A : AND.b #$03 : BNE .frame_delay
LDA.b #$1F : JSL Sprite_ApplySpeedTowardsPlayerLong
JSL Sprite_ConvertVelocityToAngle
CMP $0DE0, X : BNE .current_direction_doesnt_match
STZ $0D80, X
LDA.b #$30 : STA !timer_0, X
RTS
.current_direction_doesnt_match
PHP : LDA $0DE0, X : PLP : BMI .rotate_one_way
; rotate the other way... don't know if it's clockwise or counter
; clockwise.
INC #2
.rotate_one_way
DEC A : AND.b #$0F : STA $0DE0, X
.frame_delay
RTS
}
- ==============================================================================
; *$ED881-$ED8F1 LOCAL
GiantMoldorm_Draw:
{
JSR Sprite4_PrepOamCoord
LDA.b #$0B : STA $0F50, X
JSR GiantMoldorm_DrawEyeballs
REP #$20
LDA $90 : ADD.w #$0008 : STA $90
INC $92 : INC $92
SEP #$20
PHX : TXY
LDA $0E80, X : AND.b #$7F : TAX
LDA $0D10, Y : STA $7FFC00, X
LDA $0D00, Y : STA $7FFD00, X
LDA $0D30, Y : STA $7FFC80, X
LDA $0D20, Y : STA $7FFD80, X
PLX
JSR GiantMoldorm_DrawHead
LDA $0DA0, X : CMP.b #$04 : BCS .dont_draw_segment
JSR GiantMoldorm_DrawSegment_A
LDA $0DA0, X : CMP.b #$03 : BCS .dont_draw_segment
JSR GiantMoldorm_DrawSegment_B
LDA $0DA0, X : CMP.b #$02 : BCS .dont_draw_segment
JSR GiantMoldorm_DrawSegment_C
LDA $0DA0, X : BNE .dont_draw_segment
JSR GiantMoldorm_Tail
.dont_draw_segment
JSR GiantMoldorm_IncrementalSegmentExplosion
JSL Sprite_Get_16_bit_CoordsLong
RTS
}
- ==============================================================================
; *$ED8F2-$ED912 LOCAL
GiantMoldorm_IncrementalSegmentExplosion:
{
LDA $0DD0, X : CMP.b #$09 : BNE .alive_and_well
LDA !timer_4, X : BEQ .delay_explosion
CMP.b #$50 : BCS .delay_explosion
AND.b #$0F : ORA $11 : ORA $0FC1 : BNE .delay_explosion
; Move on to the next segment.
INC $0DA0, X
JSL Sprite_MakeBossDeathExplosion
.delay_explosion
.alive_and_well
RTS
}
- ==============================================================================
; $ED913-$ED992 DATA
pool GiantMoldorm_DrawHead:
{
.oam_groups
dw -8, -8 : db $80, $00, $00, $02
dw 8, -8 : db $82, $00, $00, $02
dw -8, 8 : db $A0, $00, $00, $02
dw 8, 8 : db $A2, $00, $00, $02
dw -8, -8 : db $82, $40, $00, $02
dw 8, -8 : db $80, $40, $00, $02
dw -8, 8 : db $A2, $40, $00, $02
dw 8, 8 : db $A0, $40, $00, $02
dw -6, -6 : db $80, $00, $00, $02
dw 6, -6 : db $82, $00, $00, $02
dw -6, 6 : db $A0, $00, $00, $02
dw 6, 6 : db $A2, $00, $00, $02
dw -6, -6 : db $82, $40, $00, $02
dw 6, -6 : db $80, $40, $00, $02
dw -6, 6 : db $A2, $40, $00, $02
dw 6, 6 : db $A0, $40, $00, $02
}
- ==============================================================================
; *$ED993-$ED9B7 LOCAL
GiantMoldorm_DrawHead:
{
LDA.b #$00 : XBA
LDA !timer_1, X : AND.b #$02 : STA $00
LDA $0E80, X : LSR A : AND.b #$01 : ORA $00
REP #$20
ASL #5 : ADC.w #.oam_groups : STA $08
SEP #$20
LDA.b #$04 : JMP Sprite4_DrawMultiple
}
- ==============================================================================
; $ED9B8-$ED9F7 DATA
pool GiantMoldorm_DrawSegment_A:
{
.oam_groups
dw -8, -8 : db $84, $00, $00, $02
dw 8, -8 : db $86, $00, $00, $02
dw -8, 8 : db $A4, $00, $00, $02
dw 8, 8 : db $A6, $00, $00, $02
dw -8, -8 : db $86, $40, $00, $02
dw 8, -8 : db $84, $40, $00, $02
dw -8, 8 : db $A6, $40, $00, $02
dw 8, 8 : db $A4, $40, $00, $02
}
- ==============================================================================
; \note The segment nearest the head.
; *$ED9F8-$EDA4F LOCAL
GiantMoldorm_DrawSegment_A:
{
TXY
PHX
LDA $0E80, X : SUB.b #$10
; *$EDA00 ALTERNATE ENTRY POINT
shared GiantMoldorm_DrawLargeSegment:
AND.b #$7F : TAX
LDA $7FFC00, X : STA $0FD8
LDA $7FFC80, X : STA $0FD9
LDA $7FFD00, X : STA $0FDA
LDA $7FFD80, X : STA $0FDB
PLX
LDA.b #$00 : XBA
LDA $0E80, X : LSR A : AND.b #$01
REP #$20
ASL #5 : ADC.w #.oam_groups : STA $08
REP #$20
LDA $90 : ADD.w #$0010 : STA $90
LDA $92 : ADD.w #$0004 : STA $92
SEP #$20
SEP #$20
LDA.b #$04
JMP Sprite4_DrawMultiple
}
- ==============================================================================
; *$EDA50-$EDA5A LOCAL
GiantMoldorm_DrawSegment_B:
{
TXY
PHX
LDA $0E80, X : SUB.b #$1C
JMP GiantMoldorm_DrawLargeSegment
}
- ==============================================================================
; $EDA5B-$EDA5E DATA
pool GiantMoldorm_DrawSegment_C:
{
.vh_flip
db $00, $40, $C0, $80
}
- ==============================================================================
; *$EDA5F-$EDAB9 LOCAL
GiantMoldorm_DrawSegment_C:
{
STZ $0DC0, X
REP #$20
LDA $90 : ADD.w #$0010 : STA $90
LDA $92 : ADD.w #$0004 : STA $92
SEP #$20
TXY
PHX
LDA $0E80, X : SUB.b #$28
; *$EDA7E ALTERNATE ENTRY POINT
shared GiantMoldorm_PrepAndDrawSingleLargeLong:
AND.b #$7F : TAX
LDA $7FFC00, X : STA $0FD8
LDA $7FFC80, X : STA $0FD9
LDA $7FFD00, X : STA $0FDA
LDA $7FFD80, X : STA $0FDB
PLX
LDA $0E80, X : LSR A : AND.b #$03 : TAY
LDA $0F50, X : PHA
AND.b #$3F : ORA .vh_flip, Y : STA $0F50, X
JSL Sprite_PrepAndDrawSingleLargeLong
PLA : STA $0F50, X
RTS
}
- ==============================================================================
; *$EDABA-$EDB16 LOCAL
GiantMoldorm_Tail:
{
JSR GiantMoldorm_DrawTail
LDA !timer_2, X : BNE .temporarily_invulnerable
LDA.b #$01 : STA $0D90, X
STZ $0F60, X
STZ $0CAA, X
LDA $0D10, X : PHA
LDA $0D30, X : PHA
LDA $0D00, X : PHA
LDA $0D20, X : PHA
LDA $0FD8 : STA $0D10, X
LDA $0FD9 : STA $0D30, X
LDA $0FDA : STA $0D00, X
LDA $0FDB : STA $0D20, X
JSL Sprite_CheckDamageFromPlayerLong
STZ $0D90, X
LDA.b #$09 : STA $0F60, X
LDA.b #$04 : STA $0CAA, X
PLA : STA $0D20, X
PLA : STA $0D00, X
PLA : STA $0D30, X
PLA : STA $0D10, X
.temporarily_invulnerable
RTS
}
- ==============================================================================
; *$EDB17-$EDB3D LOCAL
GiantMoldorm_DrawTail:
{
REP #$20
LDA $90 : ADD.w #$0004 : STA $90
LDA $92 : ADD.w #$0001 : STA $92
SEP #$20
INC $0DC0, X
LDA.b #$0D : STA $0F50, X
TXY
PHX
LDA $0E80, X : SUB.b #$30
JMP GiantMoldorm_PrepAndDrawSingleLargeLong
}
- ==============================================================================
; $EDB3E-$EDB9D DATA
pool GiantMoldorm_DrawEyeballs:
{
.x_offsets
dw 16, 15, 12, 6, 0, -6, -12, -13
dw -16, -13, -12, -6, 0, 6, 12, 15
.y_offsets
dw 0, 6, 12, 15, 16, 15, 12, 6
dw 0, -6, -12, -13, -16, -13, -12, -6
.chr
db $AA, $AA, $A8, $A8, $8A, $8A, $A8, $A8
db $AA, $AA, $A8, $A8, $8A, $8A, $A8, $A8
.vh_flip
db $00, $00, $00, $00, $80, $80, $40, $40
db $40, $40, $C0, $C0, $00, $00, $80, $80
}
- ==============================================================================
; *$EDB9E-$EDC10 LOCAL
GiantMoldorm_DrawEyeballs:
{
STZ $07
LDA $0EA0, X : BEQ .dont_accelerate_eyerolling
LDA $1A : STA $07
.dont_accelerate_eyerolling
LDA $0DE0, X : ADD.b #$FF : STA $06
PHX
LDX.b #$01
.draw_eyes_loop
LDA $06 : AND.b #$0F : ASL A : PHX : TAX
REP #$20
LDA $00 : ADD .x_offsets, X : STA ($90), Y
AND.w #$0100 : STA $0E
LDA $02 : ADD .y_offsets, X : INY : STA ($90), Y
ADC.w #$0010 : CMP.w #$0100 : SEP #$20 : BCC .on_screen_y
LDA.b #$F0 : STA ($90), Y
.on_screen_y
LDA $06 : ADD $07 : AND.b #$0F : TAX
LDA .chr, X : INY : STA ($90), Y
LDA .vh_flip, X : ORA $05 : INY : STA ($90), Y
PHY : TYA : LSR #2 : TAY
LDA $0F : ORA.b #$02 : STA ($92), Y
LDA $06 : ADD.b #$02 : STA $06
PLY : INY
PLX : DEX : BPL .draw_eyes_loop
PLX
RTS
}
- ==============================================================================
; *$EDC11-$EDC29 JUMP LOCATION
GiantMoldorm_AwaitDeath:
{
LDA !timer_4, X : BNE .delay
; *$EDC16 ALTERNATE ENTRY POINT
Sprite_ScheduleBossForDeath:
LDA.b #$04 : STA $0DD0, X
STZ $0D90, X
LDA.b #$E0 : STA !timer_0, X
RTS
.delay
ORA.b #$E0 : STA $0EF0, X
RTS
}
- ==============================================================================
; *$EDC2A-$EDC71 LONG
Sprite_MakeBossDeathExplosion:
{
LDA.b #$0C : JSL Sound_SetSfx2PanLong
; *$EDC30 ALTERNATE ENTRY POINT
.silent
; Spawn a.... raven? What? Oh it's just a dummy sprite that will be
; transmuted to an explosion.
LDA.b #$00 : JSL Sprite_SpawnDynamically : BMI .spawn_failed
LDA.b #$0B : STA $0AAA
LDA.b #$04 : STA $0DD0, Y
LDA.b #$03 : STA $0E40, Y
LDA.b #$0C : STA $0F50, Y
LDA $0FD8 : STA $0D10, Y
LDA $0FD9 : STA $0D30, Y
LDA $0FDA : STA $0D00, Y
LDA $0FDB : STA $0D20, Y
LDA.b #$1F : STA !timer_0, Y
STA $0D90, Y
LDA.b #$02 : STA $0F20, Y
.spawn_failed
RTL
}