home *** CD-ROM | disk | FTP | other *** search
/ The Games Machine 76 / XENIATGM66.iso / Messiah / data1.cab / Program_Executable_Files / messiahscripts / Enemies / SharedPain.hxx < prev    next >
Text File  |  1999-11-29  |  35KB  |  1,316 lines

  1.  
  2. //make sure BloodPos is set for ABSoulte Blood types
  3. SubRoutine(Sub_BloodFx2Abs)
  4. {
  5.         call(SetParticleSetID);
  6.         spawnparticle(fx_blood,-1,BloodPos,emptyvector,-1);
  7.         spawnparticle(fx_blood,-1,BloodPos,emptyvector,-1);
  8. }
  9. SubRoutine(Sub_BloodFxSprayAbs)
  10. {
  11.         call(SetParticleSetID);
  12.         spawnparticle(fx_bloodspray,-1,BloodPos,emptyvector,-1);
  13. }
  14.  
  15. SubRoutine(Sub_BloodFxSpurtAbs)
  16. {
  17.         call(SetParticleSetID);
  18.         spawnparticle(fx_bloodspurt,-1,BloodPos,emptyvector,-1);
  19. }
  20.  
  21.  
  22.  
  23. //no follow
  24. SubRoutine(Sub_BloodFx2)
  25. {
  26.         spawnparticle(fx_blood,0,emptyvector,emptyvector,-1);
  27.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  28. }
  29.  
  30. SubRoutine(Sub_BloodFx5)
  31. {
  32.         spawnparticle(fx_blood,0,emptyvector,emptyvector,-1);
  33.         spawnparticle(fx_blood,0,emptyvector,emptyvector,-1);
  34.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  35.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  36.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  37. }
  38.  
  39. SubRoutine(Sub_BloodFx10)
  40. {
  41.         spawnparticle(fx_blood,0,emptyvector,emptyvector,-1);
  42.         spawnparticle(fx_blood,0,emptyvector,emptyvector,-1);
  43.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  44.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  45.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  46.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  47.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  48.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  49.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  50.         spawnparticle(fx_bloodlesser,0,emptyvector,emptyvector,-1);
  51. }        
  52.  
  53. SubRoutine(Sub_BloodFxSpray)
  54. {
  55.         spawnparticle(fx_bloodspray,0,emptyvector,emptyvector,-1);
  56. }
  57.  
  58. SubRoutine(Sub_BloodFxSpurt)
  59. {
  60.         spawnparticle(fx_bloodspurt,0,emptyvector,emptyvector,-1);
  61. }
  62.  
  63.  
  64.  
  65. //follow
  66. SubRoutine(Sub_BloodFx2REL)
  67. {
  68.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  69.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  70. }
  71.  
  72. SubRoutine(Sub_BloodFx5REL)
  73. {
  74.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  75.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  76.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  77.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  78.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  79. }
  80.  
  81. SubRoutine(Sub_BloodFx10REL)
  82. {
  83.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  84.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  85.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  86.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  87.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  88.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  89.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  90.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  91.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  92.         spawnparticle(fx_bloodREL,0,emptyvector,emptyvector,-1);
  93. }
  94.  
  95. SubRoutine(Sub_BloodFxSprayREL)
  96. {
  97.         spawnparticle(fx_bloodsprayREL,0,emptyvector,emptyvector,-1);
  98. }
  99.  
  100. SubRoutine(Sub_BloodFxSpurtREL)
  101. {
  102.         spawnparticle(fx_bloodspurtREL,0,emptyvector,emptyvector,-1);
  103. }
  104.  
  105.  
  106.  
  107. //must be StateDead to call this
  108. SubRoutine(Sub_LostAnyLimbsLately,float(thislimb))
  109. {
  110.         if(vaction==CopHeadBlownOffDead)
  111.         {
  112.             scalebonematrix(4,0.001,_SXBoneAttRelative);
  113.  
  114.             if(vframe<74)
  115.             {
  116.                 if(vrnd<50)
  117.                 {
  118.                     if(vframe<24)
  119.                     {
  120.                         spawnparticle(fx_blood,4,emptyvector,emptyvector,-1);
  121.                         spawnparticle(fx_blood,4,emptyvector,emptyvector,-1);
  122.                     }
  123.                     spawnparticle(fx_bloodspray,4,emptyvector,emptyvector,-1);
  124.                 }
  125.             }
  126.         }
  127.         else
  128.         {
  129.             if(VSpecialFlag==_sFLAGLostALimb)
  130.             {
  131.                 if(thislimb==0)
  132.                 {
  133.                     if(vrnd<25)
  134.                     {
  135.                         float(_set,thislimb,1);
  136.                     }
  137.                     elseif(vrnd<50)
  138.                     {
  139.                         float(_set,thislimb,2);
  140.                     }
  141.                     elseif(vrnd<75)
  142.                     {
  143.                         float(_set,thislimb,3);
  144.                     }
  145.                     elseif(vrnd<100)
  146.                     {
  147.                         float(_set,thislimb,4);
  148.                     }
  149.                 }
  150.                 else
  151.                 {
  152.                     if(thislimb==1)
  153.                     {
  154.                         //right leg
  155.                         scalebonematrix(20,0.001,_SXBoneAttAbsolute);
  156.                     }
  157.                     elseif(thislimb==2)
  158.                     {
  159.                         //left arm
  160.                         scalebonematrix(6,0.001,_SXBoneAttAbsolute);
  161.                     }
  162.                     elseif(thislimb==3)
  163.                     {
  164.                         //left leg
  165.                         scalebonematrix(16,0.001,_SXBoneAttAbsolute);
  166.                     }
  167.                     elseif(thislimb==4)
  168.                     {
  169.                         //right arm
  170.                         scalebonematrix(10,0.001,_SXBoneAttAbsolute);
  171.                     }
  172.                 }
  173.             }
  174.         }
  175. }
  176.  
  177. Subroutine(Sub_DieBitch)
  178. {
  179.         state(_or,StateDead);
  180.  
  181.         if(VAICon==0 && VDifficulty<_DifficultyHard)
  182.         {
  183.             direction(_or,_DIRdepossesion);
  184.         }
  185. }
  186.  
  187. SubRoutine(Sub_CheckDeadOrDying,float(AIAbility),const(PoleDead),const(CrawlDead),const(StandDead),const(CrawlSpreadOut),const(CrawlEnergy),const(FallToCrawl),const(CrouchDead),const(ThrownDeath))
  188. {
  189.         //tony added, becoz Perry wants the borken leg people to eventually die ..paff!
  190.         if(vaction==CopCrawlIdle)
  191.         {
  192.             call(SubtractHealth,0,DamageCrawlDamage)
  193.         }
  194.  
  195. //CrawlEnergy is how much energy you must have to enter crawling mode, or 0 if there is no crawling
  196.         if(VHealth<=CrawlEnergy&&vstate!=StateDead)
  197.         {
  198.             if(VHealth<=0)
  199.             {
  200.                 call(CheckAttached,_CADropWeaponAndShells);
  201.                 callsub(Sub_DieBitch);
  202.  
  203.                 if(vstate==StateHarpooned)
  204.                 {
  205.                     spawnaction(PoleDead)
  206. //MISSING: Sound: dead
  207.                 }
  208.                 elseif(VState==StateCrawling)
  209.                 {
  210.                     if(VColSphereScale<60)    //Must be crawling already
  211.                     {
  212.                         spawnaction(CrawlDead)
  213. //MISSING: Sound: dead
  214.                     }
  215.                     else
  216.                     {
  217.                         spawnaction(FallToCrawl);
  218.                     }
  219.                 }
  220.                 elseif(VState==StateCrouching || VAIState==_AIstateCowering)
  221.                 {
  222.                     spawnaction(CrouchDead);
  223.                 }
  224.                 elseif(VState==StateThrown)
  225.                 {
  226.                     if(ThrownDeath!=0)
  227.                     {
  228.                         SpawnAction(ThrownDeath);
  229.                     }
  230.                     else
  231.                     {
  232.                         spawnaction(StandDead);
  233.                     }
  234.                 }
  235.                 else
  236.                 {
  237.                     spawnaction(StandDead);
  238. //MISSING: Sound: dead
  239.                 }
  240.             }
  241.             elseif(vstate!=StateCrawling&&vstate!=StateHarpooned)
  242.             {
  243. //MISSING: Sound: hit ground because energy is low
  244.                 if(AIAbility&!=_AIANoCrawl && vtrigger==_DIRhorcol && VState!=StateCrawling)
  245.                 {
  246.                     state(_or,StateCrawling);
  247.                     call(CheckAttached,_CADropWeaponAndShells);
  248.                 }
  249.             }
  250.         }
  251. }
  252.  
  253.  
  254. //using "WoundLightNoBreak" really sucks, because you can NEVER efficiently run away when you are being shot at
  255. //especially by the machine gun ....
  256. SubRoutine(Sub_CheckHit,float(AIAbility),const(WoundLight),const(WoundLightRun),const(WoundLightNoBreak),float(FireCount),const(PoleDead),const(WoundLightCrouch),const(ThrownForward),const(ThrownBack),const(ThrownLeft),const(ThrownRight))
  257. {        
  258.         if(vtrigger==_DIRactorbulletcol)
  259.         {
  260. //Please note: DIRactorbulletcol can be set, even when VActorColType=0. That is because you fall, or health is restored
  261.             if(VActorColType==_COLFire||VActorColType==_COLSteam||VActorColType==_COLsingleattach||VActorColType==_COLelectricity)
  262.             {
  263.                 //call(CheckAttached,_CADropWeaponAndShells);
  264.                 if(VActorColType==_COLsingleattach&&vstate!=StateHarpooned)
  265.                 {
  266.                     if(vstate==StateAttached)
  267.                     {
  268.                         if(vstate==StateDead)    //Already dead before this hit
  269.                         {
  270.                             spawnaction(PoleDead)
  271.                         }
  272.                         else
  273.                         {
  274.                             callsub(Sound_HitSmall);
  275.                         }
  276.  
  277.                         state(_or,StateHarpooned)
  278.                         state(_clr,StateExecuteAnim);
  279.                     }
  280.                     else
  281.                     {
  282.                         if(vstate!=StateDead)
  283.                         {
  284.                             if(vstate==StateCrawling)
  285.                             {
  286.                                 spawnaction(CopShotCrawl);
  287.                             }
  288.                             else
  289.                             {
  290.                                 spawnaction(WoundLight);
  291.                             }
  292.                         }
  293.                     }
  294.                 }
  295.                 elseif(VActorColType==_COLFire)
  296.                 {
  297.                     if(Vstate!=StateOnFire)
  298.                     {
  299. //MISSING: AI Get waypoint
  300.                         call(CheckAttached,_CADropWeaponAndShells);
  301.                         state(_clr,StateExecuteAnim);
  302.                         state(_or,StateOnFire)
  303.                     }
  304.                     if(FireCount>50)
  305.                     {
  306.                         float(_set,FireCount,50);    //Dont set to zero, that restarts fireanimation(with only head on fire at first)
  307.                     }
  308.                 }
  309.                 elseif(VActorColType==_COLelectricity)
  310.                 {
  311.                     if(Vstate!=StateElectricShock && VState!=StateThrown)
  312.                     {
  313. //MISSING: AI Get waypoint
  314.                         state(_clr,StateExecuteAnim);
  315.                         state(_or,StateElectricShock)
  316.                     }
  317.                     callsub(Sound_Steamed);                    //steamed should be fine
  318.                 }
  319.                 elseif(VActorColType==_COLSteam)
  320.                 {
  321.                     if(Vstate!=StateSteamed)
  322.                     {
  323. //MISSING: AI Get waypoint
  324.                         if(vstate!=StateDead)
  325.                         {
  326. //Missing: play sound
  327.                         }
  328.                         state(_clr,StateExecuteAnim);
  329.                         state(_or,StateSteamed)
  330.                     }
  331.                     callsub(Sound_Steamed);
  332.                 }
  333.             }
  334.             else    //Not mortal.
  335.             {
  336. //MISSING: when actor is dying, it should still react to explosions(except when on harpoon), and play sounds
  337.                 if(vstate!=StateDead&&vstate!=StateHarpooned&&VState!=StateOnFire&&VState!=StateSteamed&&VState!=StateCrawling)
  338.                 {
  339.                     if(AIAbility&!=_AIANoThrown && VTrigger==_DIRCloseToCollision && VState!=StateThrown)
  340.                     {
  341.                         if(VClass!=_ClassAngel)
  342.                         {
  343.                             if(vrnd<50)
  344.                             {
  345.                                 sample(SFXManBlastHit1,-1);
  346.                             }
  347.                             else
  348.                             {
  349.                                 sample(SFXManBlastHit2,-1);
  350.                             }
  351.                         }
  352.                         if(VColAngle>=3584 || VColAngle<=512)        //throw back
  353.                         {
  354.                             spawnaction(ThrownBack);
  355.                         }
  356.                         elseif(VColAngle>512 && VColAngle<1536)        //throw left
  357.                         {
  358.                             spawnaction(ThrownLeft);
  359.                         }
  360.                         elseif(VColAngle>=1536 && VColAngle<=2560)    //throw forward
  361.                         {
  362.                             spawnaction(ThrownForward);
  363.                         }
  364.                         elseif(VColAngle>2560 && VColAngle<3584)    //throw right
  365.                         {
  366.                             spawnaction(ThrownRight);
  367.                         }
  368.                         call(ThrowCharacter,20,20,-1);                //up, directionstrength
  369.                         state(_or,StateExecuteAnim);
  370.                         state(_or,StateThrown);
  371.                         PrintILog("THROWN ",VColAngle);                //torgeir, temp debug text
  372.                     }
  373.                     elseif(AIAbility&!=_AIANoCrawl && VAction!=WoundLightNoBreak && VAction!=WoundLight && VAction!=WoundLightRun && VTrigger==_DIRalive)
  374.                     {
  375.                         if(VHealth>0)
  376.                         {
  377.                             sample(SFXShotReact,-1);
  378.                         }
  379.                         if(VTrigger==_noDIR || VAICon!=0)
  380.                         {
  381.                             if(VState==StateCrouching)
  382.                             {
  383.                                 spawnaction(WoundLightCrouch);
  384.                             }
  385.                             else
  386.                             {
  387.                                 spawnaction(WoundLightNoBreak);
  388.                             }
  389.                             //callsub(Sound_HitSmall);
  390.                         }
  391.                         elseif(VTrigger==_DIRforward && VTrigger!=_DIRwalking)
  392.                         {
  393.                             //callsub(Sound_HitSmall);
  394.                             spawnaction(WoundLightRun);
  395.                         }
  396.                     }
  397.                 }
  398.             }
  399.         }
  400.  
  401.         call(ChangeHitByFireCount,-1);
  402. }
  403.  
  404. SubRoutine(Sub_CheckThrownFallDamage,float(FallStartAltitude),const(MaxFallAltitude))
  405. {
  406.         vector(_settoactorpos,TmpVector);
  407.         vector(_copyy,TmpVector,SubVar1);
  408.         float(_set,SubVar2,SubVar1)
  409.  
  410.         float(_sub,SubVar1,FallStartAltitude);
  411.         float(_div,SubVar1,MaxFallAltitude);
  412.  
  413.         if(VTrigger!=_DIRhorcol)
  414.         {
  415.             if(SubVar1>4)
  416.             {
  417.                 call(SubtractHealth,_COLFalling,50000)
  418.                 callsub(Sub_DieBitch);
  419.             }
  420.         }
  421.         elseif(VState!=StateNormal)
  422.         {
  423.             if(SubVar1>2)
  424.             {
  425.                 call(SubtractHealth,_COLFalling,50000)
  426.                 callsub(Sub_DieBitch);
  427.             }
  428.             State(_or,StateNormal);
  429.         }
  430.  
  431.         if(VTrigger==_DIRhorcol || FallStartAltitude<SubVar2)
  432.         {
  433.             float(_set,FallStartAltitude,SubVar2);        //FallDamage is measured from this height.
  434.         }
  435. }
  436.  
  437.  
  438.  
  439. SubRoutine(Sub_CheckFallDamage,float(AIAbility),const(LandAction),float(FallStartAltitude),const(MaxFallAltitude),const(MaxHealthLossFall),float(SubParmFallDead),const(BangHeadAction),const(FreakAction))
  440. {
  441.         vector(_settoactorpos,SubVector1);
  442.         vector(_copyy,SubVector1,SubVar1);
  443.         float(_set,SubVar3,SubVar1)
  444.  
  445.         ActorFlag(_clr,_AFLAGsignalfromparent);
  446.  
  447.         if(VState!=StateJump)                        //might need an else for banging the head
  448.         {
  449.             float(_sub,SubVar1,FallStartAltitude);
  450.             float(_div,SubVar1,MaxFallAltitude)
  451.  
  452.             if(Vtrigger!=_DIRhorcol)
  453.             {
  454.                 //special code for pak weapon to avoid fall damage and to use different animation
  455.                 if(VTrigger==_DIRHaveGun && VWeaponType==WeaponPak && SubVar1>0.02)
  456.                 {
  457.                     SpawnAction(CopPakWeaponDrift);
  458.                     ActorFlag(_or,_AFLAGsignalfromparent);
  459.                     float(_set,FallStartAltitude,SubVar3);
  460.                 }
  461.                 elseif(SubVar1>0.3)
  462.                 {
  463.                     spawnaction(FreakAction);
  464.                     State(_clr,StateNormal);
  465.                 }
  466.  
  467.                 if(SubVar1>4)    //2 times allowed height, instant death
  468.                 {
  469.                     call(SubtractHealth,_COLFalling,50000)
  470.                     callsub(Sub_DieBitch);
  471.                     //direction(_set,_DIRdepossesion);
  472.                     state(_clr,StateExecuteAnim);
  473.                     spawnaction(SubParmFallDead);
  474.                     CallSub(Sub_ChangeStateToNormal);
  475.                 }
  476.                 elseif(SubVar1>0.5)
  477.                 {
  478.                     //fallen for a long time
  479.                     if(VAIclass!=_AIclassAngel)
  480.                     {
  481.                         sample(SFXLongFallReact,-1);
  482.                     }
  483.                 }
  484.             }
  485.             else
  486.             {
  487.                 float(_set,SubVar4,0);
  488.  
  489.                 if(VClass==_ClassAngel && VActorFlag==_AFLAGcolfromabove)
  490.                 {
  491.                     float(_set,SubVar4,1);
  492.                 }
  493.  
  494.                 if(SubVar1>0.5)
  495.                 {
  496.                     if(VAIclass!=_AIclassAngel)
  497.                     {
  498.                         sample(SFXHardLandingReact,-1);
  499.                     }
  500.                 }
  501.  
  502.                 if(SubVar4==0)
  503.                 {
  504.         //MISSING: Sound: Stop the scream again
  505.                     if(SubVar1>2)    //2 times allowed height, instant death
  506.                     {
  507.         //MISSING: sound: FallDead
  508.                         call(SubtractHealth,_COLFalling,50000)
  509.                         callsub(Sub_DieBitch);
  510.                         //direction(_set,_DIRdepossesion);
  511.                         state(_clr,StateExecuteAnim);
  512.                         spawnaction(SubParmFallDead);
  513.                         CallSub(Sub_ChangeStateToNormal);
  514.                     }
  515.                     elseif(SubVar1>1&&VClass!=_ClassAngel)    //over allowed height: Break legs
  516.                     {
  517.                         if(AIAbility&!=_AIANoCrawl)
  518.                         {
  519.                             state(_or,StateCrawling)
  520.                         }
  521.                         state(_clr,StateExecuteAnim);
  522.                         sample(SFXShotInLegReact,-1);
  523.                         call(CheckAttached,_CADropWeaponAndShells);
  524.                         call(SubtractHealth,_COLFalling,MaxHealthLossFall)
  525.                         CallSub(Sub_ChangeStateToNormal);
  526.                     }
  527.                     else
  528.                     {
  529.                         if(SubVar1>0.5)                //If falldistance >50% of maxfallheight, subtract health
  530.                         {
  531.                             if(SubVar1>1)
  532.                             {
  533.                                 float(_set,SubVar1,1);
  534.                             }
  535.                             float(_mul,SubVar1,MaxHealthLossFall);
  536.                             call(SubtractHealth,_COLFalling,SubVar1)
  537.                             callsub(Sound_HitSmall);
  538.                         }
  539.                         if(VState!=StateNormal)
  540.                         {
  541.                             float(_Seti,SubVar2,VColFeetSphereBottom)
  542.                             float(_mul,SubVar2,-1)
  543.                             float(_add,SubVar2,70)
  544.                             if(VDistToGround<SubVar2)        //Same as InAirCheckGround:
  545.                             {
  546.                                 CallSub(Sub_ChangeStateToNormal);
  547.  
  548.                                 if(VAICon==0 && vaction!=LandAction)
  549.                                 {
  550.                                     if(VClass!=_ClassAngel)
  551.                                     {
  552.                                         if(vrnd<25)
  553.                                         {
  554.                                             sample(SFXFootStepBig1,-1);
  555.                                         }
  556.                                         elseif(vrnd<50)
  557.                                         {
  558.                                             sample(SFXFootStepBig2,-1);
  559.                                         }
  560.                                         elseif(vrnd<75)
  561.                                         {
  562.                                             sample(SFXFootStepBig3,-1);
  563.                                         }
  564.                                         else
  565.                                         {
  566.                                             sample(SFXFootStepBig4,-1);
  567.                                         }
  568.                                     }
  569.                                     else //VClass==_ClassAngel (this is for Bob), uses softer footstep sample
  570.                                     {
  571.                                         if(vrnd<25)
  572.                                         {
  573.                                             sample(SFXFootStepReg1,-1,75);
  574.                                         }
  575.                                         elseif(vrnd<50)
  576.                                         {
  577.                                             sample(SFXFootStepReg2,-1,75);
  578.                                         }
  579.                                         elseif(vrnd<75)
  580.                                         {
  581.                                             sample(SFXFootStepReg3,-1,75);
  582.                                         }
  583.                                         else
  584.                                         {
  585.                                             sample(SFXFootStepReg4,-1,75);
  586.                                         }
  587.                                     }
  588.                                 }
  589.  
  590.                                 spawnaction(LandAction);
  591.  
  592.         //                            call(checkconnections);
  593.                             }
  594.                             else
  595.                             {
  596.                                 move(0,-4,0);
  597.                             }
  598.                         }
  599.                     }
  600.                 }
  601.             }
  602.         }
  603.         elseif(VClass!=_ClassAngel)
  604.         {
  605.             vector(_set,TmpVector,0,0,0);
  606.             float(_seti,TmpFloat,VColSphereOffsetY);
  607.             vector(_sety,TmpVector,TmpFloat);
  608.  
  609.             vector(_copy,TmpVector2,TmpVector);
  610.             float(_seti,TmpFloat2,VColSphereSize);
  611.             float(_add,TmpFloat2,10);                //some slack
  612.             vector(_addy,TmpVector2,TmpFloat2);
  613.  
  614.             Collision(TmpVector,TmpVector2);
  615.             if(vcolflag==_DIRhorcol)
  616.             {
  617.                 //PrintILog("BANGHEAD VColDistance: ",VColDistance);
  618.                 vector(_settoactorpos,TmpVector);
  619.                 float(_seti,TmpFloat,VColSphereSize);
  620.                 vector(_addy,TmpVector,TmpFloat);
  621.  
  622.                 vector(_settocolpos,TmpVector2);
  623.                 vector(_sub,TmpVector2,TmpVector);
  624.                 vector(_copyy,TmpVector2,TmpFloat);
  625.                 move(0,TmpFloat,0);
  626.  
  627.                 //PrintLog("BANGHEAD ColMovedDist: ",TmpFloat);
  628.                 if(VState==StateBangedHead)
  629.                 {
  630.                     state(_clr,StateBangedHead|StateNormal);
  631.                     //maybe or in statefalling?
  632.                     //CallSub(Sub_ChangeStateToNormal);
  633.                     if(VDistToGround<150)                        //torg is pulling a late night number out of his ass here
  634.                     {
  635.                         spawnaction(BangHeadAction);
  636.                     }
  637.                 }
  638.                 elseif(VState==StateJump)
  639.                 {
  640.                     //break();
  641.                     state(_or,StateBangedHead);
  642.                 }
  643.             }
  644. //MISSING: Sound: Klonk head against object
  645.         }
  646.         elseif(VClass==_ClassAngel &&VTrigger==_DIRjump && Vtrigger==_DIRhorcol)
  647.         {
  648.             Collision(0,30,0,0,50,0);
  649.             if(vcolflag==_DIRhorcol)
  650.             {
  651.                 if(VState==StateBangedHead)
  652.                 {
  653.                     state(_clr,StateBangedHead);
  654.                     CallSub(Sub_ChangeStateToNormal);
  655.                     spawnaction(BangHeadAction);
  656.                 }
  657.                 elseif(VState==StateJump)
  658.                 {
  659.                     //break();
  660.                     state(_or,StateBangedHead);
  661.                 }
  662.             }
  663. //MISSING: Sound: Klonk head against object
  664.         }
  665.  
  666.         if(VTrigger==_DIRhorcol || FallStartAltitude<SubVar3 || Vstate==StateFlying || VState==StateGliding || VActiveTime==1)
  667.     //Delete the last two checks if you have to lose energy even if you flap before you land
  668.         {
  669.             float(_set,FallStartAltitude,SubVar3);        //FallDamage is measured from this height.
  670.         }
  671. }
  672.  
  673. //Subtract energy and handle actions
  674. SubRoutine(Sub_Harpooned,const(FlyFront),const(WallFront),const(IdleFront),const(BurnFront),const(FlyBack),const(WallBack),const(IdleBack),const(BurnBack))
  675. {
  676. //    SubVar1    - HitFront
  677.  
  678.         float(_set,SubVar1,1);                                //harpooned in stomach
  679.         if(VColAngle>1024 && VColAngle<3072)
  680.         {
  681.             float(_set,SubVar1,0);                            //harpooned in back
  682.         }
  683.  
  684.         if(VAction!=IdleFront && VAction!=IdleBack && VAction!=GENHarpoonFrontBeg)            //in idle?
  685.         {
  686.             if(VAction==BurnFront || VAction==BurnBack)        //burning
  687.             {
  688.                 if(VState!=StateOnFire)
  689.                 {
  690.                     if(SubVar1==0)
  691.                     {
  692.                         SpawnAction(IdleBack);
  693.                     }
  694.                     else
  695.                     {
  696.                         SpawnAction(IdleFront);
  697.                     }
  698.                     state(_clr,StateExecuteAnim);
  699.                 }
  700.             }
  701.             else
  702.             {
  703.                 State(_copyparent);
  704.  
  705.                 if(SubVar1==0)
  706.                 {
  707.                     if(VState==BulletStateStuckInWall)        //harpoon hit the wall yet?
  708.                     {
  709.                         if(VAction!=WallBack)
  710.                         {
  711.                             SpawnAction(WallBack);
  712.                         }
  713.                     }
  714.                     elseif(VAction!=FlyBack)
  715.                     {
  716.                         spawnaction(FlyBack);                //rocket forward
  717.                         float(_seti,TmpFloat,VColAngle);
  718.                         float(_sub,TmpFloat,2048);
  719.                         Turn(0,TmpFloat,0);
  720.                     }
  721.                 }
  722.                 else
  723.                 {
  724.                     if(VState==BulletStateStuckInWall)        //harpoon hit the wall yet?
  725.                     {
  726.                         if(VAction!=WallFront)
  727.                         {
  728.                             SpawnAction(WallFront);
  729.                         }
  730.                     }
  731.                     elseif(VAction!=FlyFront)
  732.                     {
  733.                         spawnaction(FlyFront);                //rocket backwards
  734.                         float(_seti,TmpFloat,VColAngle);
  735.                         Turn(0,TmpFloat,0);
  736.                     }
  737.                 }
  738.             }
  739.         }
  740.         elseif(VState==StateOnFire)                            //idle & on fire?
  741.         {
  742.             state(_or,StateExecuteAnim);
  743.             if(SubVar1==0)
  744.             {
  745.                 SpawnAction(BurnBack);
  746.             }
  747.             else
  748.             {
  749.                 SpawnAction(BurnFront);
  750.             }
  751.         }
  752.         else
  753.         {
  754.             if(VAction==IdleFront && VAction!=GENHarpoonFrontBeg)
  755.             {
  756.                 call(SearchForCloseActor,_AIclasscop|_AIclassworker|_AIclasschot|_AIclassangel|_AIclassbeast|_AIclassprost|_AIclasspimp|_AIclasspriest|_AIclassdweller|_AIclassscientist|_AIclassbarpeople|_AIclassmale|_AIclassfemale|_AIclassriotcop|_AIclassmedic|_AIclasssubgirl,256);
  757.                 if(VTrigger==_DIRTempFlag)
  758.                 {
  759.                     SpawnAction(GENHarpoonFrontBeg);
  760.                 }
  761.             }
  762.         }
  763.  
  764.         float(_seti,TmpFloat,VActiveTime)
  765.         float(_and,TmpFloat,31);
  766.         if(TmpFloat==0)
  767.         {
  768.             call(SubtractHealth,_COLsingleattach,DamageOnSpear);
  769.         }
  770. }
  771.  
  772. subroutine(Sub_Crawling,const(SubParmCrawlSpreadOut),const(SubParmFallToCrawl))
  773. {
  774.         if(VColSphereScale>60)    // || vactionlist!=SubParmCrawlSpreadOut)
  775.         {
  776.             spawnaction(SubParmFallToCrawl);
  777.         }
  778. }
  779.  
  780. subroutine(Sub_ElectricShock,const(ElectricShock0),const(ElectricShock1))
  781. {
  782.         if(VState==StateElectricShock)
  783.         {
  784.             if(vaction!=ElectricShock0 && vaction!=ElectricShock1)
  785.             {
  786.                 spawnaction(ElectricShock0);
  787.             }
  788.             elseif(vaction==ElectricShock0)
  789.             {
  790.                 float(_rnd2,tmpfloat1,100);
  791.                 float(_rnd2,tmpfloat2,100);
  792.                 float(_rnd2,tmpfloat3,100);
  793.                 float(_sub,tmpfloat1,50);
  794.                 float(_sub,tmpfloat2,50);
  795.                 float(_sub,tmpfloat3,50);
  796.                 vector(_setx,gactorpos,tmpfloat1);
  797.                 vector(_sety,gactorpos,tmpfloat2);
  798.                 vector(_setz,gactorpos,tmpfloat3);
  799.                 spawnparticle(fx_impactsparks,0,gactorpos,emptyvector,-1);
  800.             }
  801.             else
  802.             {
  803.                 float(_rnd2,tmpfloat1,100);
  804.                 float(_rnd2,tmpfloat2,100);
  805.                 float(_rnd2,tmpfloat3,100);
  806.                 float(_sub,tmpfloat1,50);
  807.                 float(_sub,tmpfloat2,50);
  808.                 float(_sub,tmpfloat3,50);
  809.                 vector(_setx,gactorpos,tmpfloat1);
  810.                 vector(_sety,gactorpos,tmpfloat2);
  811.                 vector(_setz,gactorpos,tmpfloat3);
  812.                 spawnparticle(fx_impactsparks,0,gactorpos,emptyvector,-1);
  813.             }
  814.         }
  815. }
  816.  
  817. subroutine(Sub_BurnedSteamedBlind,const(SubVarBurningRollOnFloor),const(SubVarBurnedIdle),const(SubVarGettingBurned),const(SubVarBlindForward),const(SubVarBlindBackwards),const(SubVarBurningRunInCircle),const(SubVarSlowGetUpFace),float(SubSteamCounter),const(IdleAction))
  818. {
  819.         if(VState==StateOnFire)
  820.         {
  821.             call(SubtractHealth,_COLfire,DamageInsideFire)
  822.             if(vtrigger==_DIRactorbulletcol&&VActorColType==_COLfire)    //Still inside the fire??
  823.             {
  824.                 if(vaction!=SubVarGettingBurned && vaction!=SubVarBlindForward && vaction!=SubVarBlindBackwards)
  825.                 {
  826.                     spawnaction(SubVarGettingBurned);
  827.                 }
  828.     //MISSING: AI must control him when inside fire - give waypoint to the outside, and make him run he has been there after a little while
  829.             }
  830.             else    //Not inside fire any more
  831.             {
  832.                 if(vaicon!=0)    //When computer has control of character, run and fall
  833.                 {
  834.                     if(vaction!=SubVarBurningRunInCircle && vaction!=SubVarBurningRollOnFloor)    
  835.                     {
  836.                         spawnaction(SubVarBurningRunInCircle);
  837.                     }
  838.                     elseif(vframe==20 && vaction==SubVarBurningRollOnFloor)
  839.                     {
  840.                         state(_change,StateOnFire,StateBlind);
  841.                     }
  842.                 }
  843.                 else    //The player controls him
  844.                 {
  845.                     if(vaction!=SubVarBurnedIdle && vaction!=SubVarBlindForward && vaction!=SubVarBlindBackwards)
  846.                     {
  847.                         spawnaction(SubVarBurnedIdle);
  848.                     }
  849.                 }
  850.             }    
  851.         }
  852.         else    //Steamed or Blind
  853.         {
  854.             if(vtrigger==_DIRactorbulletcol&&VActorColType==_COLSteam)
  855.             {
  856.                 float(_set,SubSteamCounter,DamageSteamDuration);
  857.                 if(vaicon!=0)
  858.                 {
  859.                 //MISSING: Control using AI here while inside steam
  860.                     if(vaction!=SubVarGettingBurned&&vaction!=SubVarBlindForward&&vaction!=SubVarBlindBackwards)
  861.                     {
  862.                         spawnaction(SubVarGettingBurned);
  863.                     }
  864.                 }
  865.                 else
  866.                 {
  867.                     if(vaction!=SubVarGettingBurned&&vaction!=SubVarBlindForward&&vaction!=SubVarBlindBackwards)
  868.                     {
  869.                         spawnaction(SubVarGettingBurned);
  870.                     }
  871.                 }
  872.             }
  873.             else
  874.             {
  875. //if this is here character is useless after being hit once by steam, not very player friendly
  876. //                if(vstate==StateSteamed)
  877. //                {
  878. //                    state(_change,StateSteamed,StateBlind)
  879. //                }
  880.                 if(vaicon!=0)
  881.                 {
  882.                     //MISSING: Decent AI to control him around when he is steamed. This also used for when he is crawling 
  883.                     if(vtrigger==_DIRhorcol)
  884.                     {
  885.                         if(VColAngle>=3584 || VColAngle<=512)        //throw back
  886.                         {
  887.                             turn(0,-5,0);
  888.                         }
  889.                         elseif(VColAngle>512 && VColAngle<1536)        //throw left
  890.                         {
  891.                             turn(0,5,0);
  892.                         }
  893.                         elseif(VColAngle>=1536 && VColAngle<=2560)    //throw forward
  894.                         {
  895.                             turn(0,5,0);
  896.                         }
  897.                         elseif(VColAngle>2560 && VColAngle<3584)    //throw right
  898.                         {
  899.                             turn(0,-5,0);
  900.                         }
  901.                     }
  902.  
  903.                     Direction(_clr,_DIRwalking);
  904.                     Direction(_set,_DIRforward);
  905.                 }
  906.                 if(vstate!=StateSteamed || SubSteamCounter!=0)
  907.                 {
  908.                     if(vaction!=SubVarBurnedIdle&&vaction!=SubVarBlindForward&&vaction!=SubVarBlindBackwards&&vaction!=SubVarSlowGetUpFace&&vaction!=SubVarBurningRollOnFloor)
  909.                     {
  910.                         spawnaction(SubVarBurnedIdle);
  911.                     }
  912.                 }
  913.             }
  914.  
  915.             if(VState==StateSteamed)
  916.             {
  917.                 if(SubSteamCounter==0)
  918.                 {
  919.                     State(_clr,StateSteamed);
  920.                     SpawnAction(IdleAction);
  921.                 }
  922.                 else
  923.                 {
  924.                     float(_sub,SubSteamCounter,1);
  925.                 }
  926.             }
  927.  
  928.             call(SubtractHealth,_COLSteam,DamageInsideSteam)        //you're basicly dying?
  929.         }
  930. }
  931.  
  932.  
  933.  
  934.  
  935.  
  936.  
  937. //type 0 : full body
  938. //type 1 : both hands
  939. //type 2 : left leg
  940. //type 3 : right arm
  941. //type 4 : torso
  942. //type 5 : shoulders up
  943.  
  944. //    spawnparticle(fx_actorfire,1,EmptyVector,EmptyVector,-1);
  945. //    spawnparticle(fx_actorfire,3,EmptyVector,EmptyVector,-1);
  946. //    spawnparticle(fx_actorfire,6,EmptyVector,EmptyVector,-1);
  947. //    spawnparticle(fx_actorfire,7,EmptyVector,EmptyVector,-1);
  948. //    spawnparticle(fx_actorfire,16,EmptyVector,EmptyVector,-1);
  949. //  spawnparticle(fx_actorfire,18,EmptyVector,EmptyVector,-1);
  950. //  spawnparticle(fx_actorfire,22,EmptyVector,EmptyVector,-1);
  951.  
  952. SubRoutine(Sub_ActorSmokeHands)
  953. {
  954.         //hands
  955.         if(ActorSmokeCount<190)
  956.         {
  957.             spawnparticle(fx_actorsmoke,8,EmptyVector,EmptyVector,fx_add);
  958.             spawnparticle(fx_actorsmoke,12,EmptyVector,EmptyVector,fx_add);
  959.             spawnparticle(fx_actorsmoke,8,EmptyVector,EmptyVector,fx_sub);
  960.             spawnparticle(fx_actorsmoke,12,EmptyVector,EmptyVector,fx_sub);
  961.         }
  962. }
  963. SubRoutine(Sub_ActorSmokeLeftLeg)
  964. {
  965.         //lower leg
  966.         if(ActorSmokeCount<185)
  967.         {
  968.             spawnparticle(fx_actorsmoke,16,EmptyVector,EmptyVector,fx_add);
  969.             spawnparticle(fx_actorsmoke,17,EmptyVector,EmptyVector,fx_add);
  970.             spawnparticle(fx_actorsmoke,18,EmptyVector,EmptyVector,fx_add);
  971.             spawnparticle(fx_actorsmoke,16,EmptyVector,EmptyVector,fx_sub);
  972.             spawnparticle(fx_actorsmoke,17,EmptyVector,EmptyVector,fx_sub);
  973.             spawnparticle(fx_actorsmoke,18,EmptyVector,EmptyVector,fx_sub);
  974.  
  975.         }
  976. }
  977. SubRoutine(Sub_ActorSmokeRightArm)
  978. {
  979.         //lower arms
  980.         if(ActorSmokeCount<215)
  981.         {
  982.             spawnparticle(fx_actorsmoke,11,EmptyVector,EmptyVector,fx_add);
  983.             spawnparticle(fx_actorsmoke,12,EmptyVector,EmptyVector,fx_add);
  984.             spawnparticle(fx_actorsmoke,11,EmptyVector,EmptyVector,fx_sub);
  985.             spawnparticle(fx_actorsmoke,12,EmptyVector,EmptyVector,fx_sub);
  986.         }
  987. }
  988. SubRoutine(Sub_ActorSmokeTorso)
  989. {
  990.         //collar and chest
  991.         if(ActorSmokeCount<225)
  992.         {
  993.             spawnparticle(fx_actorsmoke,1,EmptyVector,EmptyVector, fx_add);
  994.             spawnparticle(fx_actorsmoke,3,EmptyVector,EmptyVector, fx_sub);
  995.             spawnparticle(fx_actorsmoke,6,EmptyVector,EmptyVector, fx_add);
  996.             spawnparticle(fx_actorsmoke,7,EmptyVector,EmptyVector, fx_sub);
  997.             spawnparticle(fx_actorsmoke,16,EmptyVector,EmptyVector,fx_add);
  998.         }
  999. }
  1000. SubRoutine(Sub_ActorSmokeShouldersUp)
  1001. {
  1002.         //neck and head and torso
  1003.         if(ActorSmokeCount<255)
  1004.         {
  1005.             spawnparticle(fx_actorsmoke,5,EmptyVector,EmptyVector,fx_add);
  1006.             spawnparticle(fx_actorsmoke,9,EmptyVector,EmptyVector,fx_add);
  1007.             spawnparticle(fx_actorsmoke,5,EmptyVector,EmptyVector,fx_sub);
  1008.             spawnparticle(fx_actorsmoke,9,EmptyVector,EmptyVector,fx_sub);
  1009.         }
  1010. }
  1011. SubRoutine(Sub_ActorSmokeFullBody)
  1012. {
  1013.         //hands
  1014.         if(ActorSmokeCount<190)
  1015.         {
  1016.             spawnparticle(fx_actorsmoke,8,EmptyVector,EmptyVector,fx_add);
  1017.             spawnparticle(fx_actorsmoke,12,EmptyVector,EmptyVector,fx_add);
  1018.             spawnparticle(fx_actorsmoke,8,EmptyVector,EmptyVector,fx_sub);
  1019.             spawnparticle(fx_actorsmoke,12,EmptyVector,EmptyVector,fx_sub);
  1020.         }
  1021.  
  1022.         //lower arms
  1023.         if(ActorSmokeCount<215)
  1024.         {
  1025.             spawnparticle(fx_actorsmoke,11,EmptyVector,EmptyVector,fx_add);
  1026.             spawnparticle(fx_actorsmoke,11,EmptyVector,EmptyVector,fx_sub);
  1027.         }
  1028.  
  1029.         //upper arms
  1030.         if(ActorSmokeCount<130)
  1031.         {
  1032.             spawnparticle(fx_actorsmoke,10,EmptyVector,EmptyVector,fx_sub);
  1033.             spawnparticle(fx_actorsmoke,10,EmptyVector,EmptyVector,fx_add);
  1034.         }
  1035.  
  1036.         //collar and chest
  1037.         if(ActorSmokeCount<225)
  1038.         {
  1039.             spawnparticle(fx_actorsmoke,5,EmptyVector,EmptyVector,fx_add);
  1040.             spawnparticle(fx_actorsmoke,9,EmptyVector,EmptyVector,fx_sub);
  1041.             spawnparticle(fx_actorsmoke,13,EmptyVector,EmptyVector,fx_sub);
  1042.             spawnparticle(fx_actorsmoke,14,EmptyVector,EmptyVector,fx_add);
  1043.         }
  1044.  
  1045.         //neck and head and torso
  1046.         if(ActorSmokeCount<255)
  1047.         {
  1048.             spawnparticle(fx_actorsmoke,4,EmptyVector,EmptyVector,fx_add);
  1049.             spawnparticle(fx_actorsmoke,2,EmptyVector,EmptyVector,fx_add);
  1050.             spawnparticle(fx_actorsmoke,4,EmptyVector,EmptyVector,fx_sub);
  1051.             spawnparticle(fx_actorsmoke,2,EmptyVector,EmptyVector,fx_sub);
  1052.         }
  1053.  
  1054.         //upper thigh
  1055.         if(ActorSmokeCount<165)
  1056.         {
  1057.             spawnparticle(fx_actorsmoke,15,EmptyVector,EmptyVector,fx_add);
  1058.             spawnparticle(fx_actorsmoke,19,EmptyVector,EmptyVector,fx_add);
  1059.             spawnparticle(fx_actorsmoke,15,EmptyVector,EmptyVector,fx_sub);
  1060.             spawnparticle(fx_actorsmoke,19,EmptyVector,EmptyVector,fx_sub);
  1061.         }
  1062.  
  1063.         //lower leg
  1064.         if(ActorSmokeCount<185)
  1065.         {
  1066.             spawnparticle(fx_actorsmoke,17,EmptyVector,EmptyVector,fx_add);
  1067.             spawnparticle(fx_actorsmoke,21,EmptyVector,EmptyVector,fx_add);
  1068.             spawnparticle(fx_actorsmoke,17,EmptyVector,EmptyVector,fx_sub);
  1069.             spawnparticle(fx_actorsmoke,21,EmptyVector,EmptyVector,fx_sub);
  1070.         }
  1071.  
  1072.         //feet
  1073.         if(ActorSmokeCount<195)
  1074.         {
  1075.             spawnparticle(fx_actorsmoke,18,EmptyVector,EmptyVector,fx_sub);
  1076.             spawnparticle(fx_actorsmoke,22,EmptyVector,EmptyVector,fx_sub);
  1077.         }
  1078. }
  1079.  
  1080.  
  1081.  
  1082. SubRoutine(Sub_ActorSmokeEffect,float(SubParmSmokeCount),float(lifespan))    //Body is smoking
  1083. {
  1084. //SubParmSmokeCount - Counter that starts at zero,
  1085.  
  1086.  
  1087.         float(_add,SubParmSmokeCount,1);
  1088.  
  1089.         float(_set,ActorSmokeCount,SubParmSmokeCount);
  1090.  
  1091.         callsub(Sub_ActorSmokeFullBody);
  1092. /*
  1093.         if(ActorFireType<=20)
  1094.         {
  1095.             callsub(Sub_ActorSmokeFullBody);
  1096.         }
  1097.         elseif(ActorFireType<=30)
  1098.         {
  1099.             callsub(Sub_ActorSmokeLeftLeg);
  1100.         }
  1101.         elseif(ActorFireType<=40)
  1102.         {
  1103.             callsub(Sub_ActorSmokeRightArm);
  1104.         }
  1105.         elseif(ActorFireType<=50)
  1106.         {
  1107.             callsub(Sub_ActorSmokeHands);
  1108.         }
  1109.         elseif(ActorFireType<=60)
  1110.         {
  1111.             callsub(Sub_ActorSmokeTorso);
  1112.         }
  1113.         else
  1114.         {
  1115.             callsub(Sub_ActorSmokeShouldersUp);
  1116.         }
  1117. */
  1118. }
  1119.  
  1120.  
  1121. SubRoutine(Sub_ActorFireRightArm)
  1122. {
  1123.         //lower arms
  1124.         if(ActorFireCount>4)
  1125.         {
  1126.             spawnparticle(fx_actorfire,11,EmptyVector,EmptyVector,-1);
  1127.             spawnparticle(fx_actorfire,12,EmptyVector,EmptyVector,-1);
  1128.         }
  1129. }
  1130. SubRoutine(Sub_ActorFireHands)
  1131. {
  1132.         //hands
  1133.         if(ActorFireCount>4)
  1134.         {
  1135.             spawnparticle(fx_actorfire,8,EmptyVector,EmptyVector,-1);
  1136.             spawnparticle(fx_actorfire,12,EmptyVector,EmptyVector,-1);
  1137.         }
  1138. }
  1139. SubRoutine(Sub_ActorFireTorso)
  1140. {
  1141.         //collar and chest
  1142.         if(ActorFireCount>4)
  1143.         {
  1144.             spawnparticle(fx_actorfire,1,EmptyVector,EmptyVector,-1);
  1145.             spawnparticle(fx_actorfire,3,EmptyVector,EmptyVector,-1);
  1146.             spawnparticle(fx_actorfire,6,EmptyVector,EmptyVector,-1);
  1147.             spawnparticle(fx_actorfire,7,EmptyVector,EmptyVector,-1);
  1148.             spawnparticle(fx_actorfire,16,EmptyVector,EmptyVector,-1);
  1149.         }
  1150. }
  1151. SubRoutine(Sub_ActorFireShouldersUp)
  1152. {
  1153.         //neck and head and torso
  1154.         if(ActorFireCount>4)
  1155.         {
  1156.             spawnparticle(fx_actorfire,5,EmptyVector,EmptyVector,-1);
  1157.             spawnparticle(fx_actorfire,9,EmptyVector,EmptyVector,-1);
  1158.         }
  1159. }
  1160.  
  1161. SubRoutine(Sub_ActorFireLeftLeg)
  1162. {
  1163.         //lower leg
  1164.         if(ActorFireCount>12)
  1165.         {
  1166.             spawnparticle(fx_actorfire,16,EmptyVector,EmptyVector,-1);
  1167.             spawnparticle(fx_actorfire,17,EmptyVector,EmptyVector,-1);
  1168.             spawnparticle(fx_actorfire,18,EmptyVector,EmptyVector,-1);
  1169.         }
  1170. }
  1171.  
  1172. SubRoutine(Sub_ActorFireFullBody)
  1173. {
  1174.         //hands
  1175.         if(ActorFireCount>4)
  1176.         {
  1177.             spawnparticle(fx_actorfire,8,EmptyVector,EmptyVector,-1);
  1178.             spawnparticle(fx_actorfire,12,EmptyVector,EmptyVector,-1);
  1179.         }
  1180.  
  1181.         //lower arms
  1182.         if(ActorFireCount>8)
  1183.         {
  1184.             spawnparticle(fx_actorfire,11,EmptyVector,EmptyVector,-1);
  1185.         }
  1186.  
  1187.         //upper arms
  1188.         if(ActorFireCount>12)
  1189.         {
  1190.             spawnparticle(fx_actorfire,10,EmptyVector,EmptyVector,-1);
  1191.         }
  1192.  
  1193.         //neck and head and torso
  1194.         if(ActorFireCount>18)
  1195.         {
  1196.             spawnparticle(fx_actorfire,4,EmptyVector,EmptyVector,-1);
  1197.             spawnparticle(fx_actorfire,2,EmptyVector,EmptyVector,-1);
  1198.         }
  1199.  
  1200.         //collar and chest
  1201.         if(ActorFireCount>23)
  1202.         {
  1203.             spawnparticle(fx_actorfire,5,EmptyVector,EmptyVector,-1);
  1204.             spawnparticle(fx_actorfire,9,EmptyVector,EmptyVector,-1);
  1205.             spawnparticle(fx_actorfire,13,EmptyVector,EmptyVector,-1);
  1206.             spawnparticle(fx_actorfire,14,EmptyVector,EmptyVector,-1);
  1207.         }
  1208.  
  1209.         //upper thigh
  1210.         if(ActorFireCount>30)
  1211.         {
  1212.             spawnparticle(fx_actorfire,15,EmptyVector,EmptyVector,-1);
  1213.             spawnparticle(fx_actorfire,19,EmptyVector,EmptyVector,-1);
  1214.         }
  1215.  
  1216.         //lower thigh
  1217.         if(ActorFireCount>35)
  1218.         {
  1219.             spawnparticle(fx_actorfire,20,EmptyVector,EmptyVector,-1);
  1220.         }
  1221.  
  1222.         //lower leg
  1223.         if(ActorFireCount>40)
  1224.         {
  1225.             spawnparticle(fx_actorfire,17,EmptyVector,EmptyVector,-1);
  1226.             spawnparticle(fx_actorfire,21,EmptyVector,EmptyVector,-1);
  1227.         }
  1228.  
  1229.         //feet
  1230.         if(ActorFireCount>50)
  1231.         {
  1232.             spawnparticle(fx_actorfire,18,EmptyVector,EmptyVector,-1);
  1233.             spawnparticle(fx_actorfire,22,EmptyVector,EmptyVector,-1);
  1234.         }
  1235. }
  1236.  
  1237.  
  1238.  
  1239. SubRoutine(Sub_ActorFireEffect,float(SubParmSmokeCount),float(SubParmFireCount),float(lifespan))    //Put his body on fire
  1240. {
  1241.         float(_set,SubParmSmokeCount,0);
  1242.         call(ModelAmbient,-4,-7,-7);
  1243.  
  1244.         if(vrnd<50) //firelightflag>=5)
  1245.         {
  1246.             vector(_set,tmpvector,255,32,16);
  1247.             SpawnLight(fire_light,0,emptyvector,tmpvector,EmptyVector,400);
  1248.             //float(_set,firelightflag,0);
  1249.         }
  1250.         //float(_add,firelightflag,1);
  1251.  
  1252.         
  1253.         float(_set,TmpFloat,SubParmFireCount)
  1254.         float(_and,TmpFloat,31);    //Speed for how often it must subtract energy
  1255.         if(TmpFloat==0)
  1256.         {
  1257.             call(SubtractHealth,_COLfire,DamageOnFire)
  1258.         }
  1259.         float(_add,SubParmFireCount,1);
  1260.  
  1261.         float(_set,ActorFireCount,SubParmFireCount);
  1262.  
  1263.         callsub(Sub_ActorFireFullBody);
  1264.  
  1265.         /*
  1266.         if(ActorFireType<=20)
  1267.         {
  1268.             callsub(Sub_ActorFireFullBody);
  1269.         }
  1270.         elseif(ActorFireType<=30)
  1271.         {
  1272.             callsub(Sub_ActorFireLeftLeg);
  1273.         }
  1274.         elseif(ActorFireType<=40)
  1275.         {
  1276.             callsub(Sub_ActorFireRightArm);
  1277.         }
  1278.         elseif(ActorFireType<=50)
  1279.         {
  1280.             callsub(Sub_ActorFireHands);
  1281.         }
  1282.         elseif(ActorFireType<=60)
  1283.         {
  1284.             callsub(Sub_ActorFireTorso);
  1285.         }
  1286.         else
  1287.         {
  1288.             callsub(Sub_ActorFireShouldersUp);
  1289.         }
  1290.         */
  1291.  
  1292.         if(SubParmFireCount>lifespan)    //The fire must stop automatically if the character cant do it by himself.
  1293.         {
  1294.             if(VState==StateHarpooned||VState==StateCrawling||VState==StateDead||VAICon==0)
  1295.             {
  1296.                 state(_change,StateOnFire,StateBlind)
  1297.                 float(_set,SubParmFireCount,0)
  1298.             }
  1299.         }
  1300. }
  1301.  
  1302. SubRoutine(Sub_SqueezeCheck,const(CrushAction));
  1303. {
  1304.         if(VTrigger==_DIRalive && VActorFlag==_AFLAGSqueeze)
  1305.         {
  1306.             state(_set,StateDead);
  1307.             Direction(_clr,_DIRalive);
  1308.             spawnaction(CrushAction);
  1309.  
  1310.             if(VAICon!=0)
  1311.             {
  1312.                 sample(SFXWorkerCrushed2,Gactorpos);
  1313.             }
  1314.         }
  1315. }
  1316.