Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ; ---------------------------------------------------------------------------
- ; Object 60 - Orbinaut enemy (LZ, SLZ, SBZ)
- ; ---------------------------------------------------------------------------
- Obj60: ; XREF: Obj_Index
- moveq #0,d0
- move.b $24(a0),d0
- move.w Obj60_Index(pc,d0.w),d1
- jmp Obj60_Index(pc,d1.w)
- ; ===========================================================================
- Obj60_Index: dc.w Obj60_Main-Obj60_Index
- dc.w Obj60_ChkSonic-Obj60_Index
- dc.w Obj60_Display-Obj60_Index
- dc.w Obj60_MoveOrb-Obj60_Index
- dc.w Obj60_ChkDel2-Obj60_Index
- ; ===========================================================================
- Obj60_Main: ; XREF: Obj60_Index
- move.l #Map_obj60,4(a0)
- move.w #$429,2(a0) ; SBZ specific code
- cmpi.b #5,($FFFFFE10).w ; check if level is SBZ
- beq.s loc_11D02
- move.w #$2429,2(a0) ; SLZ specific code
- loc_11D02:
- cmpi.b #1,($FFFFFE10).w ; check if level is LZ
- bne.s loc_11D10
- move.w #$467,2(a0) ; LZ specific code
- loc_11D10:
- ori.b #4,1(a0)
- move.b #4,$18(a0)
- move.b #$B,$20(a0)
- move.b #$C,$19(a0)
- moveq #0,d2
- lea $37(a0),a2
- movea.l a2,a3
- addq.w #1,a2
- moveq #3,d1
- Obj60_MakeOrbs:
- bsr.w SingleObjLoad2
- bne.s loc_11D90
- addq.b #1,(a3)
- move.w a1,d5
- subi.w #-$3000,d5
- lsr.w #6,d5
- andi.w #$7F,d5
- move.b d5,(a2)+
- move.b 0(a0),0(a1) ; load spiked orb object
- move.b #6,$24(a1)
- move.l 4(a0),4(a1)
- move.w 2(a0),2(a1)
- ori.b #4,1(a1)
- move.b #4,$18(a1)
- move.b #8,$19(a1)
- move.b #3,$1A(a1)
- move.b #$98,$20(a1)
- move.b d2,$26(a1)
- addi.b #$40,d2
- move.l a0,$3C(a1)
- dbf d1,Obj60_MakeOrbs ; repeat sequence 3 more times
- loc_11D90:
- moveq #1,d0
- btst #0,$22(a0)
- beq.s Obj60_Move
- neg.w d0
- Obj60_Move:
- move.b d0,$36(a0)
- move.b $28(a0),$24(a0) ; if type is 02, skip the firing rountine
- addq.b #2,$24(a0)
- move.w #-$40,$10(a0) ; move orbinaut to the left
- btst #0,$22(a0) ; is orbinaut reversed?
- beq.s locret_11DBC ; if not, branch
- neg.w $10(a0) ; move orbinaut to the right
- locret_11DBC:
- rts
- ; ===========================================================================
- Obj60_ChkSonic: ; XREF: Obj60_Index
- move.w ($FFFFD008).w,d0
- sub.w 8(a0),d0
- bcc.s loc_11DCA
- neg.w d0
- loc_11DCA:
- cmpi.w #$A0,d0 ; is Sonic within $A0 pixels of orbinaut?
- bcc.s Obj60_Animate ; if not, branch
- move.w ($FFFFD00C).w,d0
- sub.w $C(a0),d0
- bcc.s loc_11DDC
- neg.w d0
- loc_11DDC:
- cmpi.w #$50,d0 ; is Sonic within $50 pixels of orbinaut?
- bcc.s Obj60_Animate ; if not, branch
- tst.w ($FFFFFE08).w ; is debug mode on?
- bne.s Obj60_Animate ; if yes, branch
- move.b #1,$1C(a0) ; use "angry" animation
- Obj60_Animate:
- lea (Ani_obj60).l,a1
- bsr.w AnimateSprite
- bra.w Obj60_ChkDel
- ; ===========================================================================
- Obj60_Display: ; XREF: Obj60_Index
- bsr.w SpeedToPos
- Obj60_ChkDel: ; XREF: Obj60_Animate
- move.w 8(a0),d0
- andi.w #$FF80,d0
- move.w ($FFFFF700).w,d1
- subi.w #$80,d1
- andi.w #$FF80,d1
- sub.w d1,d0
- cmpi.w #$280,d0
- bhi.w Obj60_ChkGone
- bra.w DisplaySprite
- ; ===========================================================================
- Obj60_ChkGone: ; XREF: Obj60_ChkDel
- lea ($FFFFFC00).w,a2
- moveq #0,d0
- move.b $23(a0),d0
- beq.s loc_11E34
- bclr #7,2(a2,d0.w)
- loc_11E34:
- lea $37(a0),a2
- moveq #0,d2
- move.b (a2)+,d2
- subq.w #1,d2
- bcs.s Obj60_Delete
- loc_11E40:
- moveq #0,d0
- move.b (a2)+,d0
- lsl.w #6,d0
- addi.l #$FFD000,d0
- movea.l d0,a1
- bsr.w DeleteObject2
- dbf d2,loc_11E40
- Obj60_Delete:
- bra.w DeleteObject
- ; ===========================================================================
- Obj60_MoveOrb: ; XREF: Obj60_Index
- movea.l $3C(a0),a1
- cmpi.b #$60,0(a1)
- bne.w DeleteObject
- cmpi.b #2,$1A(a1)
- bne.s Obj60_Circle
- cmpi.b #$40,$26(a0)
- bne.s Obj60_Circle
- addq.b #2,$24(a0)
- subq.b #1,$37(a1)
- bne.s Obj60_FireOrb
- addq.b #2,$24(a1)
- Obj60_FireOrb:
- move.w #-$200,$10(a0) ; move orb to the left (quickly)
- btst #0,$22(a1)
- beq.s Obj60_Display2
- neg.w $10(a0)
- Obj60_Display2:
- bra.w DisplaySprite
- ; ===========================================================================
- Obj60_Circle: ; XREF: Obj60_MoveOrb
- move.b $26(a0),d0
- jsr (CalcSine).l
- asr.w #4,d1
- add.w 8(a1),d1
- move.w d1,8(a0)
- asr.w #4,d0
- add.w $C(a1),d0
- move.w d0,$C(a0)
- move.b $36(a1),d0
- add.b d0,$26(a0)
- bra.w DisplaySprite
- ; ===========================================================================
- Obj60_ChkDel2: ; XREF: Obj60_Index
- bsr.w SpeedToPos
- tst.b 1(a0)
- bpl.w DeleteObject
- bra.w DisplaySprite
- ; ===========================================================================
- Ani_obj60:
- include "_anim\obj60.asm"
- ; ---------------------------------------------------------------------------
- ; Sprite mappings - Orbinaut enemy (LZ, SLZ, SBZ)
- ; ---------------------------------------------------------------------------
- Map_obj60:
- include "_maps\obj60.asm"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement