Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Obj7A_Delete:
- jmp DeleteObject
- ; ===========================================================================
- ; ---------------------------------------------------------------------------
- ; Object 7A - Eggman (SLZ)
- ; ---------------------------------------------------------------------------
- Obj7A: ; XREF: Obj_Index
- moveq #0,d0
- move.b $24(a0),d0
- move.w Obj7A_Index(pc,d0.w),d1
- jmp Obj7A_Index(pc,d1.w)
- ; ===========================================================================
- Obj7A_Index: dc.w Obj7A_Main-Obj7A_Index
- dc.w Obj7A_ShipMain-Obj7A_Index
- dc.w Obj7A_FaceMain-Obj7A_Index
- dc.w Obj7A_FlameMain-Obj7A_Index
- dc.w Obj7A_TubeMain-Obj7A_Index
- Obj7A_ObjData: dc.b 2, 0, 4 ; routine number, animation, priority
- dc.b 4, 1, 4
- dc.b 6, 7, 4
- dc.b 8, 0, 3
- ; ===========================================================================
- Obj7A_Main: ; XREF: Obj7A_Index
- move.w #$2188,8(a0) ; starting x pos
- move.w #$228,$C(a0) ; starting y pos
- move.w 8(a0),$30(a0) ; copy for boss moving routine.
- move.w $C(a0),$38(a0) ; ''
- move.b #$F,$20(a0) ; set hitbox.
- move.b #8,$21(a0) ; set number of hits to 8
- lea Obj7A_ObjData(pc),a2
- movea.l a0,a1
- moveq #3,d1 ; object is split into 4 parts.
- bra.s Obj7A_LoadBoss
- ; ===========================================================================
- Obj7A_Loop:
- jsr SingleObjLoad2 ; find free obj space
- bne.s loc_1895C ; if there isn't, don't load the rest
- move.b #$7A,0(a1) ; load the boss obj
- move.w 8(a0),8(a1) ; copy x pos to obj
- move.w $C(a0),$C(a1) ; copy y pos to obj
- Obj7A_LoadBoss: ; XREF: Obj7A_Main
- bclr #0,$22(a0) ; set x orientation
- clr.b $25(a1) ; clear the second routine counter
- move.b (a2)+,$24(a1) ; load the ship/face/flame/tube each pass
- move.b (a2)+,$1C(a1) ; copy the respective anim id
- move.b (a2)+,$18(a1) ; set sprite priorities
- move.l #Map_Eggman,4(a1) ; set eggman sprite mappings
- move.w #$400,2(a1) ; set maptile value
- move.b #4,1(a1) ; use playfield coords
- move.b #$20,$19(a1) ; set horiz radius
- move.l a0,$34(a1) ; store source object addr in ram
- dbf d1,Obj7A_Loop ; repeat sequence 3 more times
- loc_1895C:
- lea ($FFFFD040).w,a1 ; load obj ram space
- lea $2A(a0),a2 ; load dedicated space in boss' ram to store available seesaw addresses
- moveq #$5E,d0 ; seesaw obj id
- moveq #$3E,d1 ; check 3F*40 times
- loc_18968:
- cmp.b (a1),d0 ; is it a seesaw
- bne.s loc_18974 ; if not branch
- tst.b $28(a1)
- beq.s loc_18974
- move.w a1,(a2)+ ; copy seesaw address to boss' ram
- ; DANGER - Routine doesn't set a bound for 3 seesaws,
- yet only has slots for 3 seesaws. It does this for 3F*40 times
- so theoretically, adding more seesaws through hacking or
- debug might flood ram and bug/crash the game through
- corrupting obj ram.
- loc_18974:
- adda.w #$40,a1 ; load next obj slot
- dbf d1,loc_18968 ; loop 3F*40 times
- Obj7A_ShipMain: ; XREF: Obj7A_Index
- moveq #0,d0 ; clear d0
- move.b $25(a0),d0 ; load the routine counter value
- move.w Obj7A_ShipIndex(pc,d0.w),d0 ; get the routine distance
- jsr Obj7A_ShipIndex(pc,d0.w) ; jump to it
- lea (Ani_Eggman).l,a1 ; load eggman ani scripts
- jsr AnimateSprite ; run them
- moveq #3,d0 ; prepare x/y flip
- and.b $22(a0),d0 ; get obj status
- andi.b #$FC,1(a0) ; clear stored x/y flip bits
- or.b d0,1(a0) ; update and set x/y flip
- jmp DisplaySprite ; write to sprite buffer
- ; ===========================================================================
- Obj7A_ShipIndex:dc.w loc_189B8-Obj7A_ShipIndex
- dc.w loc_18A5E-Obj7A_ShipIndex
- dc.w Obj7A_MakeBall-Obj7A_ShipIndex
- dc.w loc_18B48-Obj7A_ShipIndex
- dc.w loc_18B80-Obj7A_ShipIndex
- dc.w loc_18BC6-Obj7A_ShipIndex
- ; ===========================================================================
- ; init boss starting pos
- loc_189B8: ; XREF: Obj7A_ShipIndex
- move.w #-$100,$10(a0) ; Set an xvel of 1px left
- cmpi.w #$2120,$30(a0) ; Has the ship reached x-2120?
- bcc.s loc_189CA ; If it hasn't, branch.
- addq.b #2,$25(a0) ; begin regular movement on next obj pass (loc_18A5E)
- ; Updates boss movement
- loc_189CA:
- bsr.w BossMove ; set new boss move values in $30/$38
- move.b $3F(a0),d0 ; load boss bob counter
- addq.b #2,$3F(a0) ; increment the counter
- jsr (CalcSine).l ; generate next sinusoidal height
- asr.w #6,d0 ; divide by 0x40, keep amplitude sign
- add.w $38(a0),d0 ; add new boss vertical values
- move.w d0,$C(a0) ; set vertical position
- move.w $30(a0),8(a0) set horizontal position.
- bra.s loc_189FE ; jump to <-
- ; ===========================================================================
- ; copies new boss movement without bob, used for fleeing
- loc_189EE:
- bsr.w BossMove ; store next x/y movement in $30/$38
- move.w $38(a0),$C(a0) ; update vpos
- move.w $30(a0),8(a0) ; update hpos
- loc_189FE:
- cmpi.b #6,$25(a0) ; is the boss running a 'defeated' routine?
- bcc.s locret_18A44 ; if it is, just run anims etc.
- tst.b $22(a0)
- bmi.s loc_18A46
- tst.b $20(a0)
- bne.s locret_18A44
- tst.b $3E(a0)
- bne.s loc_18A28
- move.b #$20,$3E(a0) ; Set vulnerability counter to 32 frames.
- move.w #$AC,d0 ; load boss hit sound id
- jsr (PlaySound_Special).l ; play boss damage sound
- loc_18A28:
- lea ($FFFFFB22).w,a1 ; Load the palette entry to flash.
- moveq #0,d0 : Clear d0.
- tst.w (a1) ; is it already white
- bne.s loc_18A36 ; if it is skip
- move.w #$EEE,d0 ; color bits for white
- loc_18A36:
- move.w d0,(a1) ; fill first palette with white
- subq.b #1,$3E(a0) ; subtract from hit timer
- bne.s locret_18A44 ; if the boss is still invincible, branch
- move.b #$F,$20(a0) ; reset hitbox
- locret_18A44:
- rts ; Finish anim/flip code in Obj7A
- ; ===========================================================================
- loc_18A46:
- moveq #100,d0 ; 1000 points trimmed
- bsr.w AddPoints ; add to score
- move.b #6,$25(a0)
- move.b #$78,$3C(a0)
- clr.w $10(a0) ; stop horizontal movement
- rts
- ; ===========================================================================
- ; Start boss moving again after dropping bomb.
- loc_18A5E: ; XREF: Obj7A_ShipIndex
- move.w $30(a0),d0
- move.w #$200,$10(a0) ; set speed to 2px right
- btst #0,$22(a0) ; is obj x flipped (obj may 'start' facing left so right is flipped)?
- bne.s loc_18A7C ; if it is, branch.
- neg.w $10(a0) ; invert x speed
- cmpi.w #$2008,d0 ; has the boss reached the left limit?
- bgt.s loc_18A88 ; if it hasn't, branch.
- bra.s loc_18A82 ; set to flip facing right
- ; ===========================================================================
- loc_18A7C:
- cmpi.w #$2138,d0 ; has obj reached right limit?
- blt.s loc_18A88 ; if it hasn't, branch
- loc_18A82:
- bchg #0,$22(a0) ; Flip obj x orientation
- loc_18A88:
- move.w 8(a0),d0 ; get boss xpos
- moveq #-1,d1 ; set d1 to $FFFFFFFF
- moveq #2,d2 ; check 3 seesaws
- lea $2A(a0),a2
- moveq #$28,d4
- tst.w $10(a0)
- bpl.s loc_18A9E
- neg.w d4
- loc_18A9E:
- move.w (a2)+,d1
- movea.l d1,a3
- btst #3,$22(a3) ; is sonic on seesaw
- bne.s loc_18AB4 ; if yes check others
- move.w 8(a3),d3 ; get seesaw hpos
- add.w d4,d3
- sub.w d0,d3
- beq.s loc_18AC0 ; set to drop bomb
- loc_18AB4:
- dbf d2,loc_18A9E
- move.b d2,$28(a0) ; set as no seesaw ($FF)
- bra.w loc_189CA ; run boss movement
- ; ===========================================================================
- loc_18AC0:
- move.b d2,$28(a0) ; store id of seesaw as subtype
- addq.b #2,$25(a0) ; run obj7a_makeball on next pass
- move.b #$28,$3C(a0) ; Set eggman freeze timer
- bra.w loc_189CA
- ; ===========================================================================
- ; bomb generating code
- Obj7A_MakeBall: ; XREF: Obj7A_ShipIndex
- cmpi.b #$28,$3C(a0)
- bne.s loc_18B36
- moveq #-1,d0
- move.b $28(a0),d0
- ext.w d0
- bmi.s loc_18B40
- subq.w #2,d0
- neg.w d0
- add.w d0,d0
- lea $2A(a0),a1
- move.w (a1,d0.w),d0
- movea.l d0,a2
- lea ($FFFFD040).w,a1 ; load the rest of objram
- moveq #$3E,d1
- loc_18AFA:
- cmp.l $3C(a1),d0
- beq.s loc_18B40
- adda.w #$40,a1
- dbf d1,loc_18AFA
- move.l a0,-(sp)
- lea (a2),a0
- jsr SingleObjLoad2 bookmark
- movea.l (sp)+,a0
- bne.s loc_18B40
- move.b #$7B,(a1) ; load spiked ball object
- move.w 8(a0),8(a1) ; inherit the x position of the boss.
- move.w $C(a0),$C(a1) ; inherit the y position of the boss.
- addi.w #$20,$C(a1) ; Offset by 32px downwards.
- move.b $22(a2),$22(a1) ; inherit the status flags of the boss.
- move.l a2,$3C(a1)
- loc_18B36:
- subq.b #1,$3C(a0)
- beq.s loc_18B40
- bra.w loc_189FE
- ; ===========================================================================
- loc_18B40:
- subq.b #2,$25(a0)
- bra.w loc_189CA
- ; ===========================================================================
- loc_18B48: ; XREF: Obj7A_ShipIndex
- subq.b #1,$3C(a0)
- bmi.s loc_18B52
- bra.w BossDefeated ; load a random .boss explosion
- ; ===========================================================================
- loc_18B52:
- addq.b #2,$25(a0)
- clr.w $12(a0)
- bset #0,$22(a0)
- bclr #7,$22(a0)
- clr.w $10(a0)
- move.b #-$18,$3C(a0)
- tst.b ($FFFFF7A7).w
- bne.s loc_18B7C
- move.b #1,($FFFFF7A7).w
- loc_18B7C:
- bra.w loc_189FE
- ; ===========================================================================
- loc_18B80: ; XREF: Obj7A_ShipIndex
- addq.b #1,$3C(a0)
- beq.s loc_18B90
- bpl.s loc_18B96
- addi.w #$18,$12(a0)
- bra.s loc_18BC2
- ; ===========================================================================
- loc_18B90:
- clr.w $12(a0)
- bra.s loc_18BC2
- ; ===========================================================================
- loc_18B96:
- cmpi.b #$20,$3C(a0)
- bcs.s loc_18BAE
- beq.s loc_18BB4
- cmpi.b #$2A,$3C(a0)
- bcs.s loc_18BC2
- addq.b #2,$25(a0)
- bra.s loc_18BC2
- ; ===========================================================================
- loc_18BAE:
- subq.w #8,$12(a0)
- bra.s loc_18BC2
- ; ===========================================================================
- ; for when the boss flees
- loc_18BB4:
- clr.w $12(a0) ; cancel vertical movement
- move.w #$84,d0 ; load slz music id
- jsr (PlaySound).l ; play SLZ music
- loc_18BC2:
- bra.w loc_189EE ; make the boss move.
- ; ===========================================================================
- loc_18BC6: ; XREF: Obj7A_ShipIndex
- move.w #$400,$10(a0)
- move.w #-$40,$12(a0)
- cmpi.w #$2160,($FFFFF72A).w
- bcc.s loc_18BE0
- addq.w #2,($FFFFF72A).w
- bra.s loc_18BE8
- ; ===========================================================================
- loc_18BE0:
- tst.b 1(a0)
- bpl.w Obj7A_Delete
- loc_18BE8:
- bsr.w BossMove
- bra.w loc_189CA
- ; ===========================================================================
- Obj7A_FaceMain: ; XREF: Obj7A_Index
- moveq #0,d0
- moveq #1,d1
- movea.l $34(a0),a1
- move.b $25(a1),d0
- cmpi.b #6,d0
- bmi.s loc_18C06
- moveq #$A,d1
- bra.s loc_18C1A
- ; ===========================================================================
- loc_18C06:
- tst.b $20(a1)
- bne.s loc_18C10
- moveq #5,d1
- bra.s loc_18C1A
- ; ===========================================================================
- loc_18C10:
- cmpi.b #4,($FFFFD024).w
- bcs.s loc_18C1A
- moveq #4,d1
- loc_18C1A:
- move.b d1,$1C(a0)
- cmpi.b #$A,d0
- bne.s loc_18C32
- move.b #6,$1C(a0)
- tst.b 1(a0)
- bpl.w Obj7A_Delete
- loc_18C32:
- bra.s loc_18C6C
- ; ===========================================================================
- Obj7A_FlameMain: ; XREF: Obj7A_Index
- move.b #8,$1C(a0)
- movea.l $34(a0),a1
- cmpi.b #$A,$25(a1)
- bne.s loc_18C56
- tst.b 1(a0)
- bpl.w Obj7A_Delete
- move.b #$B,$1C(a0)
- bra.s loc_18C6C
- ; ===========================================================================
- loc_18C56:
- cmpi.b #8,$25(a1)
- bgt.s loc_18C6C
- cmpi.b #4,$25(a1)
- blt.s loc_18C6C
- move.b #7,$1C(a0)
- loc_18C6C:
- lea (Ani_Eggman).l,a1
- jsr AnimateSprite
- loc_18C78:
- movea.l $34(a0),a1
- move.w 8(a1),8(a0)
- move.w $C(a1),$C(a0)
- move.b $22(a1),$22(a0)
- moveq #3,d0
- and.b $22(a0),d0
- andi.b #-4,1(a0)
- or.b d0,1(a0)
- jmp DisplaySprite
- ; ===========================================================================
- Obj7A_TubeMain: ; XREF: Obj7A_Index
- movea.l $34(a0),a1
- cmpi.b #$A,$25(a1)
- bne.s loc_18CB8
- tst.b 1(a0)
- bpl.w Obj7A_Delete
- loc_18CB8:
- move.l #Map_BossItems,4(a0)
- move.w #$246C,2(a0)
- move.b #3,$1A(a0)
- bra.s loc_18C78
- ; ===========================================================================
Add Comment
Please, Sign In to add comment