; --------------------------------------------------------------------------- ; Босс-Sonic Runners ; --------------------------------------------------------------------------- ; Hits BossSR_Hits = 8 ; Attributes ;_Setup1 = 2 ;_Setup2 = 4 ;_Setup3 = 6 ; Dynamic object variables obBSR_Routine = $30 ; .b obBSR_Pinch = $31 ; .b obBSR_Warning = $32 ; .b ; =============== S U B R O U T I N E ======================================= Obj_BossSR: move.l #Obj_Wait,address(a0) move.w #$1F,$2E(a0) move.l #Obj_BossSR_CreateTYM,$34(a0) Obj_BossSR_Wait: rts ; --------------------------------------------------------------------------- Obj_BossSR_CreateTYM: move.l #Obj_BossSR_Wait,$34(a0) lea ChildObjDat_BossSRTYM(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- Obj_BossSR_Start: move.l #Obj_BossSR_Main,address(a0) Obj_BossSR_Main: moveq #0,d0 move.b routine(a0),d0 move.w BossSR_Index(pc,d0.w),d0 jsr BossSR_Index(pc,d0.w) bsr.w BossSR_CheckTouch jmp (Draw_And_Touch_Sprite).l ; --------------------------------------------------------------------------- BossSR_Index: offsetTable offsetTableEntry.w BossSR_Init ; 0 offsetTableEntry.w BossSR_Setup ; 2 offsetTableEntry.w BossSR_Setup2 ; 4 offsetTableEntry.w BossSR_Setup3 ; 6 ; --------------------------------------------------------------------------- BossSR_Init: lea ObjDat_BossSR(pc),a1 jsr (SetUp_ObjAttributes).l move.b #_Setup2,routine(a0) move.b #BossSR_Hits,collision_property(a0) st (Boss_flag).w move.w #$7F,$2E(a0) move.l #BossSR_MoveDown_Intro,$34(a0) move.w #$100,y_vel(a0) lea ChildObjDat_RobotnikHud(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.w a0,parent3(a1) + lea Child1_MakeRoboHead3(pc),a2 jsr (CreateChild1_Normal).l lea ChildObjDat_RobotnikFire(pc),a2 jsr (CreateChild1_Normal).l lea ChildObjDat_BossSRTube(pc),a2 jmp (CreateChild1_Normal).l ; --------------------------------------------------------------------------- BossSR_Setup3: move.b (Level_frame_counter+1).w,d0 andi.w #7,d0 bne.s BossSR_Setup sfx sfx_BreakBridge,0,0,0 BossSR_Setup: jsr (Swing_UpAndDown).l BossSR_Setup2: jsr (MoveSprite2).l jmp (Obj_Wait).l ; --------------------------------------------------------------------------- BossSR_MoveDown_Intro: move.b #_Setup1,routine(a0) move.l #BossSR_MoveDown_Laugh,$34(a0) clr.w y_vel(a0) jmp (Swing_Setup1).l ; --------------------------------------------------------------------------- BossSR_MoveDown_Laugh: bset #5,status(a0) move.w #$4F,$2E(a0) move.l #BossSR_MoveDown_StopLaugh,$34(a0) rts ; --------------------------------------------------------------------------- BossSR_MoveDown_StopLaugh: move.w #$F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) bclr #5,status(a0) rts ; =============== S U B R O U T I N E ======================================= BossSR_PinchMode: sf obBSR_Pinch(a0) bset #6,status(a0) move.b #_Setup3,routine(a0) move.w #$4F,$2E(a0) clr.b obBSR_Routine(a0) move.l #BossSR_PinchMode_Stop,$34(a0) lea ChildObjDat_BossSRTube_Fire(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- BossSR_PinchMode_Stop: bclr #6,status(a0) move.l #BossSR_SetSubroutine,$34(a0) rts ; =============== S U B R O U T I N E ======================================= BossSR_SetSubroutine: tst.b obBSR_Pinch(a0) bne.s BossSR_PinchMode moveq #0,d0 move.b obBSR_Routine(a0),d0 addq.b #1,obBSR_Routine(a0) lea BossSR_SetMovement(pc),a1 cmpi.b #BossSR_Hits/4+1,$29(a0) bhs.s + lea BossSR_SetPinchMovement(pc),a1 + move.b (a1,d0.w),d0 bmi.s + move.l BossSR_Movement(pc,d0.w),$34(a0) rts + clr.b obBSR_Routine(a0) rts ; --------------------------------------------------------------------------- _SpikeBallJump = 0 _SpikeBallDown = 1<<2 _RocketUp = 2<<2 _RocketDown = 3<<2 _RocketUpDown = 4<<2 _BossAttack = 5<<2 _SpikeBallJump2 = 6<<2 _SpikeBallDown2 = 7<<2 _SpikeBallJumpx2 = 8<<2 _SpikeBallDownx2 = 9<<2 _SpikeBallUp = 10<<2 _BossLaugh = 11<<2 _BossLaserDown = 12<<2 _BossLaserUp = 13<<2 ; --------------------------------------------------------------------------- BossSR_Movement: dc.l BossSR_SpikeBallJump_Attack ; 0 dc.l BossSR_SpikeBallDown_Attack ; 1 dc.l BossSR_RocketUp_Attack ; 2 dc.l BossSR_RocketDown_Attack ; 3 dc.l BossSR_RocketUpDown_Attack ; 4 dc.l BossSR_Boss_Attack ; 5 dc.l BossSR_SpikeBallJump2_Attack ; 6 dc.l BossSR_SpikeBallDown2_Attack ; 7 dc.l BossSR_SpikeBallJumpx2_Attack ; 8 dc.l BossSR_SpikeBallDownx2_Attack ; 9 dc.l BossSR_SpikeBallUp_Attack ; 10 dc.l BossSR_Boss_Laugh ; 11 dc.l BossSR_Laser_Attack_Down ; 12 (Pinch) dc.l BossSR_Laser_Attack_Up ; 13 (Pinch) ; --------------------------------------------------------------------------- BossSR_SetMovement: dc.b _SpikeBallJump dc.b _SpikeBallJump dc.b _SpikeBallJump dc.b _SpikeBallDown dc.b _SpikeBallDown dc.b _SpikeBallJump2 dc.b _SpikeBallJump dc.b _SpikeBallJump dc.b _SpikeBallDown dc.b _SpikeBallDown2 dc.b _SpikeBallDown dc.b _SpikeBallDown dc.b _BossLaugh dc.b _RocketDown dc.b _RocketDown dc.b _RocketUp dc.b _RocketDown dc.b _SpikeBallJumpx2 dc.b _BossLaugh dc.b _SpikeBallUp dc.b _SpikeBallDown dc.b _SpikeBallUp dc.b _SpikeBallDown dc.b _SpikeBallUp dc.b _RocketUpDown dc.b _SpikeBallDown dc.b _SpikeBallDownx2 dc.b _SpikeBallJump dc.b _SpikeBallJumpx2 dc.b _SpikeBallDown dc.b _SpikeBallDownx2 dc.b _SpikeBallJump dc.b _SpikeBallJumpx2 dc.b _SpikeBallDown dc.b _SpikeBallDown dc.b _SpikeBallJump dc.b _SpikeBallDown2 dc.b _SpikeBallDown dc.b _SpikeBallDown dc.b _SpikeBallJump dc.b _SpikeBallDownx2 dc.b _BossLaugh dc.b _RocketDown dc.b _RocketUpDown dc.b _RocketUp dc.b _RocketDown dc.b _RocketUp dc.b _BossLaugh dc.b _BossAttack dc.b _BossLaugh dc.b _SpikeBallDownx2 dc.b _SpikeBallJumpx2 dc.b _SpikeBallDownx2 dc.b _SpikeBallJumpx2 dc.b _SpikeBallDownx2 dc.b _SpikeBallJumpx2 dc.b _SpikeBallUp dc.b _SpikeBallUp dc.b _SpikeBallDown dc.b _SpikeBallDown dc.b _SpikeBallUp dc.b _SpikeBallUp dc.b _SpikeBallDown dc.b _SpikeBallUp dc.b _SpikeBallJump dc.b _SpikeBallDown dc.b _SpikeBallJump dc.b _SpikeBallDown dc.b _SpikeBallJump dc.b _SpikeBallDown dc.b _SpikeBallJump2 dc.b -1 ; Конец even BossSR_SetPinchMovement: dc.b _BossLaserDown dc.b _BossLaserUp dc.b _BossLaserDown dc.b _BossLaserUp dc.b _BossLaserDown dc.b _BossLaserUp dc.b _BossAttack dc.b _RocketUp dc.b _RocketDown dc.b _RocketUpDown dc.b _RocketUp dc.b _RocketDown dc.b _RocketUpDown dc.b _BossLaserDown dc.b _BossLaserDown dc.b _BossLaserDown dc.b _BossLaserUp dc.b _RocketUpDown dc.b _BossLaserDown dc.b _BossLaserUp dc.b _RocketUpDown dc.b _RocketUpDown dc.b _BossAttack dc.b _RocketUp dc.b _RocketDown dc.b _RocketUp dc.b _RocketDown dc.b -1 ; Конец even ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_SpikeBallJump_Attack: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_SpikeBallJump_CheckPos,$34(a0) BossSR_SpikeBallJump_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$60,d0 cmp.w y_pos(a0),d0 blo.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallJump_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallJump_Attack_Start: move.w #$2F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара 2 ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_SpikeBallDown_Attack: move.b #_Setup2,routine(a0) move.w #$200,y_vel(a0) move.l #BossSR_SpikeBallDown_CheckPos,$34(a0) BossSR_SpikeBallDown_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$80,d0 cmp.w y_pos(a0),d0 bhs.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallDown_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallDown_Attack_Start: move.w #$2F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #2,subtype(a1) + rts ; --------------------------------------------------------------------------- ; Босс атакует с помощью ракеты (Вверх) ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_RocketUp_Attack: move.b #_Setup2,routine(a0) move.w #$200,y_vel(a0) move.l #BossSR_RocketUp_CheckPos,$34(a0) BossSR_RocketUp_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$A0,d0 cmp.w y_pos(a0),d0 bhs.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_RocketUp_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_RocketUp_Attack_Start: move.b #_Setup1,routine(a0) move.w #$2F,$2E(a0) sfx sfx_FireShot,0,0,0 move.l #BossSR_SetSubroutine,$34(a0) lea ChildObjDat_BossSRRocket(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- ; Босс атакует с помощью ракеты (Вниз) ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_RocketDown_Attack: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_RocketDown_CheckPos,$34(a0) BossSR_RocketDown_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$60,d0 cmp.w y_pos(a0),d0 blo.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_RocketDown_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_RocketDown_Attack_Start: move.b #_Setup1,routine(a0) move.w #$2F,$2E(a0) sfx sfx_FireShot,0,0,0 move.l #BossSR_SetSubroutine,$34(a0) lea ChildObjDat_BossSRRocket(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #2,subtype(a1) + rts ; --------------------------------------------------------------------------- ; Босс атакует с помощью ракеты (Вверх/Вниз) ; --------------------------------------------------------------------------- BossSR_RocketUpDown_Attack: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_RocketUpDown_CheckPos,$34(a0) BossSR_RocketUpDown_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$30,d0 cmp.w y_pos(a0),d0 blo.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_RocketUpDown_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_RocketUpDown_Attack_Start: move.b #_Setup1,routine(a0) move.w #$2F,$2E(a0) sfx sfx_FireShot,0,0,0 move.l #BossSR_SetSubroutine,$34(a0) lea ChildObjDat_BossSRRocket2(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- ; Босс атакует самостоятельно ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_Boss_Attack: move.b #_Setup2,routine(a0) move.w #$200,y_vel(a0) move.l #BossSR_Boss_Attack_CheckPos,$34(a0) BossSR_Boss_Attack_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$A0,d0 cmp.w y_pos(a0),d0 bhs.s + move.w d0,y_pos(a0) sfx sfx_Squeak,0,0,0 move.l #BossSR_Boss_Attack_MoveAttack,$34(a0) clr.w y_vel(a0) + rts ; --------------------------------------------------------------------------- BossSR_Boss_Attack_MoveAttack: move.w #-$600,x_vel(a0) move.w #$5F,$2E(a0) move.l #BossSR_Boss_Attack_MoveDown,$34(a0) rts ; --------------------------------------------------------------------------- BossSR_Boss_Attack_MoveDown: move.w #$DC8,x_pos(a0) move.w #$358,y_pos(a0) move.w #$100,y_vel(a0) move.w #$7F,$2E(a0) move.l #BossSR_Boss_Attack_StopMove,$34(a0) clr.w x_vel(a0) rts ; --------------------------------------------------------------------------- BossSR_Boss_Attack_StopMove: move.b #_Setup1,routine(a0) move.w #$1F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) clr.w y_vel(a0) jmp (Swing_Setup1).l ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара 3 ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_SpikeBallJump2_Attack: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_SpikeBallJump2_CheckPos,$34(a0) BossSR_SpikeBallJump2_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$60,d0 cmp.w y_pos(a0),d0 blo.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallJump2_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallJump2_Attack_Start: move.w #$37,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #4,subtype(a1) + rts ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара 4 ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_SpikeBallDown2_Attack: move.b #_Setup2,routine(a0) move.w #$200,y_vel(a0) move.l #BossSR_SpikeBallDown2_CheckPos,$34(a0) BossSR_SpikeBallDown2_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$80,d0 cmp.w y_pos(a0),d0 bhs.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallDown2_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallDown2_Attack_Start: move.w #$37,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #6,subtype(a1) + rts ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара x2 ; --------------------------------------------------------------------------- BossSR_SpikeBallJumpx2_Attack: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_SpikeBallJumpx2_CheckPos,$34(a0) BossSR_SpikeBallJumpx2_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$60,d0 cmp.w y_pos(a0),d0 blo.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallJumpx2_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallJumpx2_Attack_Start: move.w #$F,$2E(a0) move.l #BossSR_SpikeBallJumpx2_Attack_Start2,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- BossSR_SpikeBallJumpx2_Attack_Start2: move.w #$3F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара 2 x2 ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_SpikeBallDownx2_Attack: move.b #_Setup2,routine(a0) move.w #$200,y_vel(a0) move.l #BossSR_SpikeBallDownx2_CheckPos,$34(a0) BossSR_SpikeBallDownx2_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$80,d0 cmp.w y_pos(a0),d0 bhs.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallDownx2_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallDownx2_Attack_Start: move.w #$B,$2E(a0) move.l #BossSR_SpikeBallDownx2_Attack_Start2,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #2,subtype(a1) + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallDownx2_Attack_Start2: move.w #$3F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #2,subtype(a1) + rts ; --------------------------------------------------------------------------- ; Босс атакует с помощью шипастого шара 5 ; --------------------------------------------------------------------------- BossSR_SpikeBallUp_Attack: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_SpikeBallUp_CheckPos,$34(a0) BossSR_SpikeBallUp_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$60,d0 cmp.w y_pos(a0),d0 blo.s + move.w d0,y_pos(a0) move.b #_Setup1,routine(a0) move.l #BossSR_SpikeBallUp_Attack_Start,$34(a0) clr.w y_vel(a0) jsr (Swing_Setup1).l + rts ; --------------------------------------------------------------------------- BossSR_SpikeBallUp_Attack_Start: move.w #$2F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) sfx sfx_SpikeBall2,0,0,0 lea ChildObjDat_BossSRSpikeBall(pc),a2 jsr (CreateChild6_Simple).l bne.s + move.b #8,subtype(a1) + rts ; --------------------------------------------------------------------------- ; Босс смеётся ; --------------------------------------------------------------------------- BossSR_Boss_Laugh: bset #5,status(a0) move.w #$4F,$2E(a0) move.l #BossSR_Boss_Laugh_Stop,$34(a0) rts ; --------------------------------------------------------------------------- BossSR_Boss_Laugh_Stop: bclr #5,status(a0) move.w #$2F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) rts ; --------------------------------------------------------------------------- ; Босс атакует с помощью лазера (Сверху) ; --------------------------------------------------------------------------- BossSR_Laser_Attack_Up: move.b #_Setup2,routine(a0) move.w #-$200,y_vel(a0) move.l #BossSR_Laser_Up_CheckPos,$34(a0) BossSR_Laser_Up_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$80,d0 cmp.w y_pos(a0),d0 blo.s ++ move.w d0,y_pos(a0) tst.b obBSR_Warning(a0) bne.s + st obBSR_Warning(a0) sfx sfx_Siren,0,0,0 move.w #$F,$2E(a0) + move.l #BossSR_Laser_Up_Attack_Start,$34(a0) clr.w y_vel(a0) + rts ; --------------------------------------------------------------------------- BossSR_Laser_Up_Attack_Start: sfx sfx_Laser6,0,0,0 move.w #$F,$2E(a0) move.l #BossSR_Laser_Up_Stop,$34(a0) lea ChildObjDat_BossSRLaser(pc),a2 jmp (CreateChild1_Normal).l ; --------------------------------------------------------------------------- BossSR_Laser_Up_Stop: move.b #_Setup1,routine(a0) move.w #$1F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) jmp (Swing_Setup1).l ; --------------------------------------------------------------------------- ; Босс атакует с помощью лазера (Снизу) ; --------------------------------------------------------------------------- BossSR_Laser_Attack_Down: move.b #_Setup2,routine(a0) move.w #$200,y_vel(a0) move.l #BossSR_Laser_Down_CheckPos,$34(a0) BossSR_Laser_Down_CheckPos: move.w (Camera_Y_pos).w,d0 addi.w #$B0,d0 cmp.w y_pos(a0),d0 bhs.s ++ move.w d0,y_pos(a0) tst.b obBSR_Warning(a0) bne.s + st obBSR_Warning(a0) sfx sfx_Siren,0,0,0 move.w #$F,$2E(a0) + move.l #BossSR_Laser_Down_Attack_Start,$34(a0) clr.w y_vel(a0) + rts ; --------------------------------------------------------------------------- BossSR_Laser_Down_Attack_Start: sfx sfx_Laser6,0,0,0 move.w #$F,$2E(a0) move.l #BossSR_Laser_Down_Stop,$34(a0) lea ChildObjDat_BossSRLaser(pc),a2 jmp (CreateChild1_Normal).l ; --------------------------------------------------------------------------- BossSR_Laser_Down_Stop: move.b #_Setup1,routine(a0) move.w #$1F,$2E(a0) move.l #BossSR_SetSubroutine,$34(a0) jmp (Swing_Setup1).l ; --------------------------------------------------------------------------- ; Проверка урона ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= BossSR_CheckTouch: tst.b collision_flags(a0) bne.s BossSR_CheckTouch_Return tst.b collision_property(a0) beq.s BossSR_CheckTouch_WaitExplosive tst.b $1C(a0) bne.s ++ move.b #$30,$1C(a0) sfx sfx_HitBoss,0,0,0 bset #6,status(a0) tst.w (Ring_count).w bne.s + jsr (Create_New_Sprite).l bne.s + move.l #Obj_Bouncing_Ring,(a1) move.w x_pos(a0),x_pos(a1) move.w y_pos(a0),y_pos(a1) move.w a0,$3E(a1) + cmpi.b #BossSR_Hits/4,$29(a0) bne.s + st obBSR_Pinch(a0) + moveq #0,d0 btst #0,$1C(a0) bne.s + addq.w #3*2,d0 + jsr (BossFlash).l subq.b #1,$1C(a0) bne.s BossSR_CheckTouch_Return bclr #6,status(a0) move.b collision_restore_flags(a0),collision_flags(a0) BossSR_CheckTouch_Return: rts ; --------------------------------------------------------------------------- BossSR_CheckTouch_WaitExplosive: move.l #Wait_FadeToLevelMusic,address(a0) move.l #BossSR_CheckTouch_WaitExplosive_Restore,$34(a0) addq.b #2,(BackgroundEvent_routine).w bset #7,status(a0) lea (Child6_CreateBossExplosion).l,a2 jsr (CreateChild1_Normal).l bne.s + move.b #4,subtype(a1) + move.w #$7F,$2E(a0) jmp (BossDefeated_NoTime).l ; --------------------------------------------------------------------------- BossSR_CheckTouch_WaitExplosive_Restore: move.l #loc_7A3E6,(a0) bset #0,render_flags(a0) move.w #$400,x_vel(a0) clr.w y_vel(a0) rts ; --------------------------------------------------------------------------- loc_7A3E6: subq.w #1,$2E(a0) bmi.s loc_7A3F8 jsr (MoveSprite2).l jmp (Draw_Sprite).l ; --------------------------------------------------------------------------- loc_7A3F8: addq.b #2,(Dynamic_resize_routine).w move.l #Go_Delete_Sprite,address(a0) rts ; --------------------------------------------------------------------------- ; Огонь из трубы босса ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRTube_Fire: btst #1,(Level_frame_counter+1).w beq.s BossSRTube_Fire_Draw move.l a0,-(sp) movea.w parent3(a0),a0 lea ChildObjDat_BossGreyBall_Fire(pc),a2 jsr (CreateChild1_Normal).l bne.s + move.b #24/2,$3A(a1) move.b #24/2,$3B(a1) move.w #$100,$3C(a1) + movea.l (sp)+,a0 BossSRTube_Fire_Draw: jsr (Refresh_ChildPositionAdjusted).l jmp (Child_CheckParent).l ; --------------------------------------------------------------------------- ; Труба босса ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRTube: lea ObjDat_BossSRTube(pc),a1 jsr (SetUp_ObjAttributes).l move.l #+,address(a0) + jsr (Refresh_ChildPositionAdjusted).l moveq #0,d0 jmp (Child_Draw_Sprite_FlickerMove).l ; --------------------------------------------------------------------------- ; Шипастый шар босса ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRSpikeBall: moveq #0,d0 move.b routine(a0),d0 move.w BossSRSpikeBall_Index(pc,d0.w),d1 jsr BossSRSpikeBall_Index(pc,d1.w) movea.w parent3(a0),a1 btst #7,status(a1) bne.w BossSRSpikeBall_Remove jmp (Sprite_CheckDeleteTouchXY).l ; --------------------------------------------------------------------------- BossSRSpikeBall_Index: offsetTable offsetTableEntry.w BossSRSpikeBall_Init offsetTableEntry.w BossSRSpikeBall_Setup offsetTableEntry.w BossSRSpikeBall_Setup2 offsetTableEntry.w BossSRSpikeBall_Setup3 offsetTableEntry.w BossSRSpikeBall_Setup4 offsetTableEntry.w BossSRSpikeBall_Setup5 ; --------------------------------------------------------------------------- BossSRSpikeBall_Init: lea ObjDat_BossSRSpikeBall(pc),a1 jsr (SetUp_ObjAttributes).l move.b #48/2,y_radius(a0) move.l #BossSRSpikeBall_Fall,$34(a0) tst.b subtype(a0) beq.s + move.l #BossSRSpikeBall_Fall2,$34(a0) + cmpi.b #4,subtype(a0) bne.s + move.b #_Setup3,routine(a0) move.l #BossSRSpikeBall_Fall,$34(a0) clr.b collision_flags(a0) + cmpi.b #6,subtype(a0) bne.s + move.b #_Setup3,routine(a0) move.l #BossSRSpikeBall_Fall4,$34(a0) clr.b collision_flags(a0) + cmpi.b #8,subtype(a0) bne.s + move.l #BossSRSpikeBall_Fall5,$34(a0) move.b #128/2,y_radius(a0) + rts ; --------------------------------------------------------------------------- BossSRSpikeBall_Setup3: bsr.w BossSRSpikeBall_CheckPlayer btst #0,(V_int_run_count+3).w beq.s BossSRSpikeBall_Setup eori.w #$6000,art_tile(a0) BossSRSpikeBall_Setup: jsr (MoveSprite).l jmp (ObjHitFloor_DoRoutine).l ; --------------------------------------------------------------------------- BossSRSpikeBall_Setup5: moveq #0,d0 move.b angle(a0),d0 addq.b #4,d0 move.b d0,angle(a0) jsr (GetSineCosine).l asr.w #2,d0 neg.w d0 move.w d0,y_vel(a0) bra.s BossSRSpikeBall_Setup2 ; --------------------------------------------------------------------------- BossSRSpikeBall_Setup4: btst #0,(V_int_run_count+3).w beq.s BossSRSpikeBall_Setup2 eori.w #$6000,art_tile(a0) BossSRSpikeBall_Setup2: jsr (MoveSprite2).l jmp (Obj_Wait).l ; --------------------------------------------------------------------------- BossSRSpikeBall_Fall: sfx sfx_SpikeBall,0,0,0 move.w #-$300,x_vel(a0) move.w #-$500,y_vel(a0) lea ChildObjDat_BossGreyBall_Spark(pc),a2 jmp (CreateChild6_Simple).l ; --------------------------------------------------------------------------- BossSRSpikeBall_Fall5: move.b #_Setup2,routine(a0) move.w #-$400,x_vel(a0) move.w #4,$2E(a0) move.l #BossSRSpikeBall_Fall_Up,$34(a0) clr.w y_vel(a0) lea ChildObjDat_BossSRSpikeBallFan(pc),a2 jmp (CreateChild1_Normal).l ; --------------------------------------------------------------------------- BossSRSpikeBall_Fall_Up: move.b #_Setup5,routine(a0) move.w #-$200,y_vel(a0) move.w #7,$2E(a0) move.l #BossSRSpikeBall_Fall6,$34(a0) rts ; --------------------------------------------------------------------------- BossSRSpikeBall_Fall2: move.b #_Setup2,routine(a0) BossSRSpikeBall_Fall4: sfx sfx_SpikeBall,0,0,0 move.w #-$400,x_vel(a0) BossSRSpikeBall_Fall6: clr.w y_vel(a0) move.l #BossSRSpikeBall_Return,$34(a0) BossSRSpikeBall_Return: rts ; --------------------------------------------------------------------------- obSpikeBall_CheckXY: dc.w -32 ; X right pos dc.w 40 ; X left pos dc.w -32 ; Y down pos dc.w 64 ; Y up pos ; --------------------------------------------------------------------------- BossSRSpikeBall_CheckPlayer: lea (Player_1).w,a1 lea obSpikeBall_CheckXY(pc),a2 jsr (Check_InMyRange).l beq.s BossSRSpikeBall_CheckPlayer_Return jsr (Check_PlayerAttack).l beq.s BossSRSpikeBall_Hurt tst.w y_vel(a1) bpl.s BossSRSpikeBall_Hurt move.b #_Setup4,routine(a0) movea.w parent3(a0),a1 move.w x_pos(a0),d1 move.w y_pos(a0),d2 sub.w x_pos(a1),d1 sub.w y_pos(a1),d2 jsr (GetArcTan).l jsr (GetSineCosine).l move.w #-$A00,d2 muls.w d2,d1 asr.l #8,d1 move.w d1,x_vel(a0) muls.w d2,d0 asr.l #8,d0 move.w d0,y_vel(a0) sfx sfx_SpikeAttack,0,0,0 move.l #BossSRSpikeBall_Fall3,$34(a0) BossSRSpikeBall_CheckPlayer_Return: rts ; --------------------------------------------------------------------------- BossSRSpikeBall_Hurt: jmp (sub_24280).l ; --------------------------------------------------------------------------- BossSRSpikeBall_Fall3: move.w (Camera_X_pos).w,d0 addi.w #$110,d0 cmp.w x_pos(a0),d0 bge.s BossSRSpikeBall_Fall3_Return movea.w parent3(a0),a1 move.b collision_flags(a1),collision_restore_flags(a1) move.b #0,collision_flags(a1) subq.b #1,boss_hitcount2(a1) clr.l x_vel(a0) lea ChildObjDat_BossGreyBall_Splinter(pc),a2 jsr (CreateChild6_Simple).l BossSRSpikeBall_Remove: move.l #Go_Delete_Sprite,address(a0) BossSRSpikeBall_Fall3_Return: rts ; --------------------------------------------------------------------------- ; Шипастый шар босса (Пропеллер) ; --------------------------------------------------------------------------- Obj_BossSRSpikeBallFan: lea ObjDat_BossSRSpikeBallFan(pc),a1 jsr (SetUp_ObjAttributes).l move.l #BossSRSpikeBallFan_Move,address(a0) BossSRSpikeBallFan_Move: subq.b #1,child_dy(a0) cmpi.b #-16,child_dy(a0) bne.s BossSRSpikeBallFan_Draw move.l #BossSRSpikeBallFan_Animate,address(a0) BossSRSpikeBallFan_Animate: lea AniRaw_BossSRSpikeBallFan(pc),a1 jsr (Animate_RawNoSST).l BossSRSpikeBallFan_Draw: jsr (Refresh_ChildPositionAdjusted).l jmp (Child_Draw_Sprite).l ; --------------------------------------------------------------------------- AniRaw_BossSRSpikeBallFan: dc.b 0, 3, 0, 1, 2, $FC even ; --------------------------------------------------------------------------- ; Ракета босса ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRRocket: move.w (Camera_X_pos).w,d0 addi.w #$140,d0 move.w d0,x_pos(a0) move.w (Camera_Y_pos).w,d0 move.w #$70,d1 tst.b subtype(a0) beq.s + move.w #$C0,d1 + add.w d1,d0 move.w d0,y_pos(a0) lea ObjDat_BossSRRocket(pc),a1 jsr (SetUp_ObjAttributes).l move.w #-$600,x_vel(a0) lea ChildObjDat_BossSRRocket_Fire(pc),a2 jsr (CreateChild1_Normal).l move.l #+,address(a0) + jsr (MoveSprite2).l movea.w parent3(a0),a1 btst #7,status(a1) bne.w BossSRSpikeBall_Remove move.b (V_int_run_count+3).w,d3 andi.b #7,d3 bne.s + lea ChildObjDat_BossSRRocket_Smoke(pc),a2 jsr (CreateChild1_Normal).l + jmp (Sprite_CheckDeleteTouchXY).l ; --------------------------------------------------------------------------- ; Ракета босса (Огонь) ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRRocket_Fire: lea ObjDat_BossSRRocket_Fire(pc),a1 jsr (SetUp_ObjAttributes).l move.l #+,address(a0) + moveq #1,d0 btst #0,(V_int_run_count+3).w beq.s + addq.b #1,d0 + move.b d0,mapping_frame(a0) jsr (Refresh_ChildPositionAdjusted).l jmp (Child_Draw_Sprite).l ; --------------------------------------------------------------------------- ; Ракета босса (Дым) ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRRocket_Smoke: lea ObjDat_BossSRRocket_Smoke(pc),a1 jsr (SetUp_ObjAttributes).l move.l #Go_Delete_Sprite,$34(a0) move.l #BossSRRocket_Smoke_Draw,(a0) movea.w parent3(a0),a1 move.w x_vel(a1),d0 asr.w #3,d0 move.w d0,x_vel(a0) BossSRRocket_Smoke_Draw: lea AniRaw_BossSRRocket_Smoke(pc),a1 jsr (Animate_RawNoSSTMultiDelay).l jsr (MoveSprite2).l jmp (Child_Draw_Sprite).l ; --------------------------------------------------------------------------- AniRaw_BossSRRocket_Smoke: dc.b 0, 3 dc.b 0, 3 dc.b 1, 3 dc.b 2, 4 dc.b 3, 5 dc.b $F4, 0 ; --------------------------------------------------------------------------- ; Лазер босса ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRLaser: lea ObjDat3_BossSRLaser(pc),a1 jsr (SetUp_ObjAttributes).l movea.w parent3(a0),a1 jsr (Refresh_ChildPositionAdjusted).l moveq #0,d0 tst.b subtype(a0) beq.s loc_7ABB8 moveq #6,d0 move.b #0,mapping_frame(a0) move.w #$100,priority(a0) loc_7ABB8: move.w d0,$2E(a0) move.l #loc_7ABC2,(a0) loc_7ABC2: subq.w #1,$2E(a0) bmi.s loc_7ABCE jmp (Child_Draw_Sprite).l ; --------------------------------------------------------------------------- loc_7ABCE: move.l #loc_7ABEE,(a0) move.w #-$700,d0 btst #0,render_flags(a0) beq.s loc_7ABE2 neg.w d0 loc_7ABE2: move.w d0,x_vel(a0) loc_7ABEE: jsr (MoveSprite2).l jmp (Sprite_CheckDeleteTouch).l ; --------------------------------------------------------------------------- ; Test your might ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_BossSRTYM: move.w (Camera_X_pos).w,d0 addi.w #$64,d0 move.w d0,x_pos(a0) move.w (Camera_Y_pos).w,d0 addi.w #$60,d0 move.w d0,y_pos(a0) lea ObjDat3_BossSRTYM(pc),a1 jsr (SetUp_ObjAttributes).l move.w #$A7,$2E(a0) move.l #BossSRTYM_Draw,address(a0) BossSRTYM_Draw: subq.w #1,$2E(a0) bmi.s BossSRTYM_Remove btst #3,$2F(a0) beq.s BossSRTYM_CheckParent jmp (Child_Draw_Sprite).l ; --------------------------------------------------------------------------- BossSRTYM_CheckParent: jmp (Child_CheckParent).l ; --------------------------------------------------------------------------- BossSRTYM_Remove: movea.w parent3(a0),a1 move.w #$2F,$2E(a1) move.l #Obj_BossSR_Start,$34(a1) move.l #Go_Delete_Sprite,address(a0) rts ; --------------------------------------------------------------------------- ; Голова роботника ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_RobotnikHead3: jsr (Refresh_ChildPositionAdjusted).l moveq #0,d0 move.b routine(a0),d0 move.w RobotnikHead3_Index(pc,d0.w),d1 jsr RobotnikHead3_Index(pc,d1.w) jmp (Child_Draw_Sprite2).l ; --------------------------------------------------------------------------- RobotnikHead3_Index: offsetTable offsetTableEntry.w Obj_RobotnikHead3Init offsetTableEntry.w Obj_RobotnikHead3Main offsetTableEntry.w Obj_RobotnikHead3End ; --------------------------------------------------------------------------- Obj_RobotnikHead3Init: lea ObjDat_RobotnikHead(pc),a1 jsr (SetUp_ObjAttributes).l move.l #AniRaw_RobotnikHead,$30(a0) movea.w parent3(a0),a1 btst #7,art_tile(a1) beq.s + bset #7,art_tile(a0) + rts ; --------------------------------------------------------------------------- Obj_RobotnikHead3Main: movea.w parent3(a0),a1 btst #5,status(a1) bne.s Obj_RobotnikHead3_Laugh cmpi.b #id_SonicHurt,(Player_1+routine).w bhs.s Obj_RobotnikHead3_Laugh jsr (Animate_Raw).l movea.w parent3(a0),a1 btst #7,status(a1) bne.s ++ btst #6,status(a1) beq.s + move.b #2,mapping_frame(a0) + rts ; --------------------------------------------------------------------------- + move.b #4,routine(a0) move.b #5,mapping_frame(a0) Obj_RobotnikHeadEnd: rts ; --------------------------------------------------------------------------- Obj_RobotnikHead3End: movea.w parent3(a0),a1 btst #7,status(a1) bne.s Obj_RobotnikHeadEnd lea AniRaw_RobotnikHead(pc),a1 jmp (Animate_RawNoSST).l ; --------------------------------------------------------------------------- Obj_RobotnikHead3_Laugh: lea AniRaw_RobotnikHead_Laugh(pc),a1 jmp (Animate_RawNoSST).l ; --------------------------------------------------------------------------- ; Огонь из корабля ; --------------------------------------------------------------------------- ; =============== S U B R O U T I N E ======================================= Obj_RobotnikFire: lea ObjDat3_RobotnikFire(pc),a1 jsr (SetUp_ObjAttributes3).l move.l #+,(a0) + movea.w parent3(a0),a1 btst #7,status(a1) bne.s RobotnikFire_Remove btst #6,$38(a1) bne.s Obj_RobotnikHeadEnd btst #0,(V_int_run_count+3).w bne.s Obj_RobotnikHeadEnd jsr (Refresh_ChildPositionAdjusted).l jsr (Add_SpriteToCollisionResponseList).l jmp (Draw_Sprite).l ; --------------------------------------------------------------------------- RobotnikFire_Remove: jmp (Delete_Current_Sprite).l ; =============== S U B R O U T I N E ======================================= ObjDat_BossSR: dc.l Map_RobotnikShip dc.w $E0 dc.w $200 dc.b 80/2 dc.b 80/2 dc.b 7 dc.b $F ObjDat_RobotnikHead: dc.l Map_RobotnikShip dc.w $E0 dc.w $280 dc.b $10 dc.b 8 dc.b 0 dc.b 0 ObjDat3_RobotnikFire: dc.w $200 dc.b 8 dc.b 4 dc.b 8 dc.b 0 ObjDat_BossSRTube: dc.l Map_RobotnikTube dc.w $6152 dc.w $180 dc.b 48/2 dc.b 16/2 dc.b 0 dc.b 0 ObjDat_BossSRSpikeBall: dc.l Map_RobotnikSpikeBall dc.w $6168 dc.w $280 dc.b 48/2 dc.b 48/2 dc.b 0 dc.b $F|$80 ObjDat_BossSRSpikeBallFan: dc.l Map_RobotnikSpikeBallFan dc.w $61B9 dc.w $300 dc.b 48/2 dc.b 8/2 dc.b 2 dc.b 0 ObjDat_BossSRRocket: dc.l Map_RobotnikRocket dc.w $6158 dc.w $280 dc.b 64/2 dc.b 16/2 dc.b 0 dc.b $B|$80 ObjDat_BossSRRocket_Fire: dc.l Map_RobotnikRocket dc.w $6158 dc.w $280 dc.b 16/2 dc.b 16/2 dc.b 1 dc.b 0 ObjDat_BossSRRocket_Smoke: dc.l Map_RobotnikRocket_Smoke dc.w $61C5 dc.w $300 dc.b 16/2 dc.b 16/2 dc.b 0 dc.b 0 ObjDat3_BossSRLaser: dc.l Map_RobotnikLaser dc.w $617E dc.w $280 dc.b 48/2 dc.b 16/2 dc.b 1 dc.b $1C|$80 ObjDat3_BossSRTYM: dc.l Map_RobotnikTYM dc.w $2186 dc.w $280 dc.b 136/2 dc.b 24/2 dc.b 0 dc.b 0 AniRaw_RobotnikHead: dc.b 5 dc.b 0 dc.b 1 dc.b $FC AniRaw_RobotnikHead_Laugh: dc.b 5 dc.b 3 dc.b 4 dc.b $FC Child1_MakeRoboHead3: dc.w 1-1 dc.l Obj_RobotnikHead3 dc.b 0, $E4 ChildObjDat_RobotnikFire: dc.w 1-1 dc.l Obj_RobotnikFire dc.b $1E, 0 ChildObjDat_BossSRTYM: dc.w 1-1 dc.l Obj_BossSRTYM ChildObjDat_BossSRTube: dc.w 1-1 dc.l Obj_BossSRTube dc.b -16, 24 ChildObjDat_BossSRTube_Fire: dc.w 1-1 dc.l Obj_BossSRTube_Fire ChildObjDat_BossSRSpikeBall: dc.w 1-1 dc.l Obj_BossSRSpikeBall ChildObjDat_BossSRSpikeBallFan: dc.w 1-1 dc.l Obj_BossSRSpikeBallFan dc.b -4, 0 ChildObjDat_BossSRRocket: dc.w 1-1 dc.l Obj_BossSRRocket ChildObjDat_BossSRRocket2: dc.w 2-1 dc.l Obj_BossSRRocket ChildObjDat_BossSRRocket_Fire: dc.w 1-1 dc.l Obj_BossSRRocket_Fire dc.b 48, 0 ChildObjDat_BossSRRocket_Smoke: dc.w 1-1 dc.l Obj_BossSRRocket_Smoke dc.b 40, -8 ChildObjDat_BossSRLaser: dc.w 2-1 dc.l Obj_BossSRLaser dc.b $F4, $FC dc.l Obj_BossSRLaser dc.b $E8, $FC ; --------------------------------------------------------------------------- include "Objects/Boss Robotnik/Object Data/Map - Robotnik Laser.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik Rocket.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik Rocket Smoke.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik Ship.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik Spike Ball Fan.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik Spike Ball.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik Tube.asm" include "Objects/Boss Robotnik/Object Data/Map - Robotnik TYM.asm"