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

  1.  
  2. SubRoutine(Sub_Deposses)
  3. {
  4.         if(VDifficulty<_DifficultyHard && VAIcon==0)
  5.         {
  6.             callsub(Sub_InitDepossesion,0,0,0);
  7.             //DePossesion callback effect init here
  8.             call(MatrixCallback,_SXEXPActorMatrixBulb,0.1,120);
  9.  
  10.             camera(fly_camera_distance,fly_camera_angle);
  11.             Target(fly_camera_Tdistance,fly_camera_Tangle);
  12.         }
  13. }
  14.  
  15.  
  16. SubRoutine(Sub_AlignToWallOnLedge,float(RayAdd))
  17. {
  18.         float(_set,TmpFloat,0);
  19.         float(_set,TmpFloat4,0);
  20.         //    See if the wall is in front of actor
  21.         //
  22.         vector(_set,TmpVector,0,0,0);
  23.         vector(_set,TmpVector2,0,0,0);
  24.         float(_seti,TmpFloat2,VColFeetSphereSize);
  25.         float(_add,TmpFloat2,RayAdd);
  26.         float(_set,TmpFloat3,TmpFloat2);
  27.         float(_inv,TmpFloat2);
  28.         vector(_setz,TmpVector2,TmpFloat2);
  29.         Collision(TmpVector,TmpVector2);
  30.         if(VColFlag==_DIRvercol)
  31.         {
  32.             float(_seti,TmpFloat4,VColAngle);
  33.         }
  34.         else
  35.         {
  36.             //    See if the wall is behind actor
  37.             //
  38.             vector(_set,TmpVector2,0,0,0);
  39.             vector(_setz,TmpVector2,TmpFloat3);
  40.             Collision(TmpVector,TmpVector2);
  41.             if(VColFlag==_DIRvercol)
  42.             {
  43.                 float(_seti,TmpFloat4,VColAngle);
  44.                 float(_add,TmpFloat4,2048);
  45.             }
  46.             else
  47.             {
  48.                 //    Check left side
  49.                 //    
  50.                 vector(_setz,TmpVector2,0);
  51.                 vector(_setx,TmpVector2,TmpFloat3);
  52.                 Collision(TmpVector,TmpVector2);
  53.                 if(VColFlag==_DIRvercol)
  54.                 {
  55.                     float(_seti,TmpFloat4,VColAngle);
  56.                     float(_add,TmpFloat4,1024);
  57.                 }
  58.                 else
  59.                 {
  60.                     //    Check right side
  61.                     //    
  62.                     vector(_setx,TmpVector2,TmpFloat2);
  63.                     Collision(TmpVector,TmpVector2);
  64.                     if(VColFlag==_DIRvercol)
  65.                     {
  66.                         float(_seti,TmpFloat4,VColAngle);
  67.                         float(_add,TmpFloat4,-1024);
  68.                     }
  69.                 }
  70.             }
  71.         }
  72.  
  73.         if(TmpFloat4!=0)
  74.         {
  75.             Turn(0,TmpFloat4,0);
  76.             print("align angle ",TmpFloat4);
  77.         }
  78. }
  79.  
  80.  
  81. //Checks if character is jumping or falling
  82. SubRoutine(Sub_CheckJumpFallDown,float(AIAbility),const(OnStairsAction),float(JumpPressCounter),float(DownwardPull),const(JumpSpeed),const(JumpAction),float(AirMoveSpeedForward),float(AirMoveSpeedSideways),const(FallAction),const(MaxAirSpeed))
  83. {
  84. //OnStairsAction
  85. //JumpPressCounter
  86. //DownwardPull
  87. //JumpSpeed
  88. //JumpAction
  89. //AirMoveSpeedForward
  90. //AirMoveSpeedSideways
  91. //FallAction
  92. //MaxAirSpeed
  93.         if(VState!=StateThrown)
  94.         {
  95.             if(AIAbility&!=_AIAJump)
  96.             {
  97.                 Direction(_clr,_DIRjump);
  98.             }
  99.  
  100.             if(vtrigger==_DIRjump&&votrigger!=_DIRjump)
  101.             {
  102.                 if(VAICon==0 && vaction!=JumpAction && VClass!=_ClassAngel)
  103.                 {
  104.                     if(vrnd<50)
  105.                     {
  106.                         sample(SFXThrow1,-1);
  107.                     }
  108.                     else
  109.                     {
  110.                         sample(SFXThrow2,-1);
  111.                     }
  112.                 }
  113.  
  114.                 spawnaction(JumpAction);
  115.  
  116.     //            call(CheckConnections)
  117.                 float(_set,JumpPressCounter,0)
  118.                 if(VActor==Bob1)
  119.                 {
  120.                     //XXX state(_or,StateExecuteAnim);
  121.                     float(_set,DownwardPull,BobJumpSpeed);
  122.                 }
  123.                 else
  124.                 {
  125.                     float(_set,DownwardPull,JumpSpeed);
  126.                     if(VState==StateCrouching)
  127.                     {
  128.                         float(_div,DownwardPull,2);
  129.                     }
  130.                 }
  131.                 state(_change,StateNormal,StateJump);
  132.  
  133.                 vector(_speedfromdirflags,TmpVector1)
  134.                 float(_set,SubVar1,MaxAirSpeed)        //Get initial speed
  135.                 vector(_setZ,TmpVector2,SubVar1)
  136.                 float(_mul,SubVar1,-1)
  137.                 vector(_setX,TmpVector2,SubVar1)
  138.                 vector(_mul,TmpVector1,TmpVector2)
  139.                 vector(_copyX,TmpVector1,AirMoveSpeedSideways)
  140.                 vector(_copyZ,TmpVector1,AirMoveSpeedForward)
  141.  
  142.             }
  143.             else    //Check if falling.
  144.             {
  145.                 if(VAction!=OnStairsAction)        //Not when walking on stairs
  146.                 {
  147.                     if(Vtrigger!=_DIRhorcol)
  148.                     {
  149.                         float(_Seti,SubVar1,VColFeetSphereBottom)
  150.                         float(_mul,SubVar1,-1)
  151.                         float(_add,SubVar1,70)
  152.  
  153.                         if(VDistToGround>SubVar1)
  154.                         {
  155.                             if(VState!=StateThrown)
  156.                             {
  157.                                 float(_set,SubSubParm1,FallAction)
  158.                                 callsub(Sub_InitFall)                //fucks up climb XXX
  159.                             }
  160.  
  161.                             vector(_speedfromdirflags,TmpVector1)
  162.                             float(_set,SubVar1,MaxAirSpeed)    //Set initial speed
  163.                             vector(_setZ,TmpVector2,SubVar1)
  164.                             float(_mul,SubVar1,-1)
  165.                             vector(_setX,TmpVector2,SubVar1)
  166.                             vector(_mul,TmpVector1,TmpVector2)
  167.                             vector(_copyX,TmpVector1,AirMoveSpeedSideways)
  168.                             vector(_copyZ,TmpVector1,AirMoveSpeedForward)
  169.                         }
  170.                     }
  171.                 }
  172.             }
  173.         }
  174. }
  175.  
  176. SubRoutine(Sub_CheckSliding,const(OnStairsAction),const(SlideAction))
  177. {
  178.         if(vtrigger!=_DIRjump && VAction!=OnStairsAction)
  179.         {
  180.             if(Vtrigger!=_DIRhorcol && VTrigger==_DIRvercol && VState!=StateExecuteAnim)
  181.             {
  182.                 //fire ray down from character and get the angle from the surface
  183.                 //below and do stuff depending on the angle.
  184. /*                if(VClass==_ClassAngel)
  185.                 {
  186.                     Collision(0,-30,0,0,-80,0);
  187.                 }
  188.                 else
  189.                 {
  190. */
  191.  
  192.                     float(_seti,TmpFloat,VColFeetSphereBottom);
  193.                     float(_add,TmpFloat,10);
  194.                     vector(_set,TmpVector,0,0,0);
  195.                     vector(_sety,TmpVector,TmpFloat);
  196.                     vector(_set,TmpVector2,0,0,0);
  197.                     float(_sub,TmpFloat,20);
  198.                     vector(_sety,TmpVector2,TmpFloat);
  199.                     Collision(TmpVector,TmpVector2);
  200. //                }
  201.                 Slope(46,_Less);
  202.  
  203.                 if(VTrigger==_DIRTempFlag)
  204.                 {
  205.                     if(VState!=StateFalling)
  206.                     {
  207.                         float(_set,SubSubParm1,SlideAction)
  208.                         callsub(Sub_InitFall)
  209.                     }
  210.                     elseif(VAction!=SlideAction)
  211.                     {
  212.                         spawnaction(SlideAction);
  213.                     }
  214.                 }
  215.             }
  216.         }
  217. }
  218.  
  219. //cop jump
  220. //CallSub(Sub_Jump,JumpPressCounter,DownwardPull,15,CopJumpGravity,2,0)
  221.  
  222. SubRoutine(Sub_Jump,float(JumpPressCounter),float(DownwardPull),const(MinHoldJumpAction),const(JumpGravity),const(FrameStartMoveUp),const(FallingAction))
  223. {
  224.         if(vtrigger==_DIRjump || JumpPressCounter<MinHoldJumpAction)
  225.         {
  226.             float(_add,JumpPressCounter,1)
  227.             if(VFrame>=FrameStartMoveUp)
  228.             {
  229.                 if(VActor==Bob1)
  230.                 {
  231.                     float(_sub,DownwardPull,BobJumpGravity);
  232.                     float(_set,SubVar1,0);
  233.                     if(vtrigger!=_nodir)
  234.                     {
  235.                         if(vtrigger!=_DIRvercol||ColAngleTmp>400||ColAngleTmp<-400)
  236.                         {
  237.                             float(_set,SubVar1,1);
  238.                         }
  239.                     }
  240.                     if(SubVar1==0)    //If bob is not moving along X or Z, move more up, and increase gravity
  241.                     {
  242.                         float(_sub,DownwardPull,BobJumpGravityNoMove);
  243.                         move(0,BobJumpNoMoveExtraYMovement,0);
  244.                     }
  245.                 }
  246.                 else
  247.                 {
  248.                     float(_sub,DownwardPull,JumpGravity);
  249.                 }
  250.                 move(0,DownwardPull,0);
  251.             }
  252.             if(vendofanim!=0)
  253.             {
  254.                 float(_set,JumpPressCounter,0);
  255.                     
  256.                 if(VActor==Bob1)
  257.                 {
  258.                     state(_change,StateJump,StateFlying);
  259.                 }
  260.                 else
  261.                 {
  262.                     move(0,-2,0);
  263.                     float(_set,SubSubParm1,FallingAction)
  264.                     callsub(Sub_InitFall)
  265.                 }
  266.             }
  267.         }
  268.         else
  269.         {
  270.             float(_set,JumpPressCounter,0);
  271.             float(_set,DownwardPull,0)
  272.             float(_set,SubSubParm1,FallingAction)
  273.             callsub(Sub_InitFall)
  274.         }
  275. }
  276.  
  277.  
  278. SubRoutine(Sub_InitFall)
  279. {
  280. //SubSubParm1: Action when falling (0 for no change)
  281.     if(SubSubParm1!=0)
  282.     {
  283.         spawnaction(SubSubParm1);
  284.     }
  285. //    call(CheckConnections)
  286.     //state(_clr,StateHeadTrack);        //SAXS: don't see a need for clearing this. Come tell me otherwise
  287.  
  288.     state(_clr,StateNormal);
  289.     state(_clr,StateFlying);
  290.     state(_clr,StateGliding);
  291.     state(_clr,StateJump);
  292.     state(_or,StateFalling);
  293. }
  294.  
  295. SubRoutine(Sub_MoveInAir,float(SubParm1),float(SubParm2),const(SubParm3),const(SubParm4))
  296. {
  297. //SubParm1=AirSpeedSideways
  298. //SubParm2=AirSpeedForward
  299. //SubParm3=MaxAirSpeed
  300. //SubParm4=Bulb Factor
  301.         if(VState!=StateThrown)
  302.         {
  303.             vector(_speedfromdirflags,TmpVector1)
  304.  
  305.             vector(_set,TmpVector3,0,0,0)
  306.             float(_set,SubVar1,SubParm3)
  307.             vector(_setZ,TmpVector3,SubVar1)
  308.             float(_mul,SubVar1,-1)
  309.             vector(_setX,TmpVector3,SubVar1)
  310.             vector(_mul,TmpVector1,TmpVector3)
  311.  
  312.             vector(_setX,TmpVector2,SubParm1)
  313.             vector(_setZ,TmpVector2,SubParm2)
  314.             vector(_sub,TmpVector1,TmpVector2)
  315.  
  316.             vector(_setX,TmpVector3,SubParm4)
  317.             vector(_setZ,TmpVector3,SubParm4)
  318.             vector(_mul,TmpVector1,TmpVector3)
  319.             vector(_add,TmpVector1,TmpVector2)
  320.             vector(_copyX,TmpVector1,SubParm1)
  321.             vector(_copyZ,TmpVector1,SubParm2)
  322.  
  323.             float(_seti,SubVar1,VActionRotation)
  324.             vector(_rotate,TmpVector1,SubVar1)    //This must be done after bulb because if you change direction in air, it should continue in the direction you were going before
  325.             vector(_copyX,TmpVector1,SubVar1)
  326.             vector(_copyZ,TmpVector1,SubVar2)
  327.             move(SubVar1,0,SubVar2)
  328.         }
  329. }
  330.  
  331. SubRoutine(Sub_CheckClimbUp,const(ClimbAction),const(MinHeight),float(ColAngleCorrectNeeded),float(CheckHeight),const(MoveForward))        //Check for grab onto ledge
  332. {
  333. //MinHeight:    Minimum height above rootbone when it grabs
  334. //CheckHeight:    Height to check
  335.  
  336.         Direction(_clr,_DIRTempFlag);
  337.         if(vtrigger==_DIRvercol || VClass==_ClassAngel)
  338.         {
  339.             if(ColAngleTmpFace<600&&ColAngleTmpFace>-600)
  340.             {
  341. //                if(vtrigger==_DIRwalk||vtrigger==_DIRrun)
  342. //                {
  343.                     //if(vstate==StateJump||vstate==stateFalling||vstate==stateFlying||vstate==stateGliding)
  344.                     if(vstate|=StateJump|stateFalling|stateFlying|stateGliding)
  345.                     {
  346.                         float(_set,SubVar2,MinHeight);
  347.                         float(_add,SubVar2,CheckHeight)            //Height checked
  348.                         vector(_set,TmpVector,0,0,0)
  349.                         vector(_sety,TmpVector,MinHeight);
  350.                         float(_seti,SubVar3,VColFeetSphereSize)
  351.                         float(_mul,SubVar3,-1)
  352.                         float(_add,SubVar3,-20)
  353.                         vector(_set,TmpVector2,0,0,0)
  354.                         vector(_sety,TmpVector2,MinHeight);
  355.                         vector(_setz,TmpVector2,SubVar3)        //-Sphere-20
  356.                         Collision(TmpVector,TmpVector2);
  357.                         if(vcolflag==_DIRvercol)
  358.                         {
  359.                             Slope(80,_Less);                                //more than 10 degrees slope?
  360.                             if(VTrigger!=_DIRTempFlag)
  361.                             {
  362.                                 //yes, see if it is a stupid Damien Box
  363.                                 vector(_set,TmpVector3,0,20,0);
  364.                                 vector(_sub,TmpVector,TmpVector3);
  365.                                 vector(_sub,TmpVector2,TmpVector3);
  366.                                 Collision(TmpVector,TmpVector2);
  367.                                 Slope(81,_Less);                                //more than 10 degrees slope?
  368.                             }
  369.                             if(VTrigger==_DIRTempFlag)    //Lower horizontal collision
  370.                             {
  371.                                 float(_seti,TmpFloat2,VColAngle);
  372.                                 float(_seti,SubVar1,VColDistance);
  373.                                 vector(_set,TmpVector,0,0,0)
  374.                                 vector(_set,TmpVector2,0,0,0)
  375.                                 vector(_sety,TmpVector,SubVar2)
  376.                                 vector(_sety,TmpVector2,SubVar2)
  377.                                 float(_set,SubVar4,SubVar3);
  378.                                 float(_add,SubVar4,-20)
  379.                                 vector(_setz,TmpVector2,SubVar4)        //-Sphere-40
  380.                                 Collision(TmpVector,TmpVector2);
  381.                                 if(vcolflag|=_DIRallcol)    //Upper horizontal collision, Must not be neither wall nor tilted floor here 
  382.                                 {
  383.                                 }
  384.                                 else
  385.                                 {
  386.                                     float(_mul,SubVar1,SubVar3);
  387.                                     float(_div,SubVar1,100);    //Find exact distance to wall.
  388.                                     float(_add,SubVar1,1);
  389.  
  390.                                     vector(_setz,TmpVector,SubVar1);
  391.                                     vector(_setz,TmpVector2,SubVar1);
  392.                                     float(_set,SubVar4,SubVar2);
  393.                                     float(_add,SubVar4,100)        //Altitude that will be used for railing-check
  394.                                     vector(_sety,TmpVector,SubVar4)
  395.                                     vector(_sety,TmpVector2,SubVar2)
  396.                                     Collision(TmpVector,TmpVector2);
  397.                                     if(vcolflag|=_DIRallcol)    //Vertical collision to make sure it is not a railing (if there is something above it)
  398.                                     {
  399.                                     }
  400.                                     else
  401.                                     {
  402.                                         vector(_set,TmpVector,0,0,0)
  403.                                         vector(_sety,TmpVector,SubVar2)
  404.                                         vector(_setz,TmpVector,SubVar3)        //-Sphere-20
  405.                                         vector(_set,TmpVector2,0,0,0)
  406.                                         vector(_sety,TmpVector2,MinHeight)
  407.                                         vector(_setz,TmpVector2,SubVar3)    //-Sphere-20
  408.                                         Collision(TmpVector,TmpVector2);    //Collision to get height of edge relative to model
  409.                                         if(VClass==_ClassAngel)
  410.                                         {
  411.                                             Slope(0,_Equal);
  412.                                         }
  413.                                         else
  414.                                         {
  415.                                             Direction(_or,_DIRTempFlag);
  416.                                         }
  417.  
  418.                                         //    if this doesn't collide then there is nothing to grab on to really
  419.                                         //    don't grab moving keyframeobjects
  420.                                         if(vcolflag==_DIRhorcol && VTrigger==_DIRTempFlag && VColObjTriggered==false)
  421.                                         {
  422.                                             float(_seti,SubVar1,VColDistance);
  423.                                             float(_mul,SubVar1,CheckHeight);
  424.                                             float(_div,SubVar1,-100);            //-100/height checked
  425.                                             float(_add,SubVar1,3);                //just make sure they're above the grab surface
  426.                                             float(_set,TmpFloat,MoveForward);
  427.                                             float(_inv,TmpFloat);
  428.                                             MoveFeetColOffset(0,0,TmpFloat);
  429.                                             move(0,SubVar1,MoveForward);        //Corrects his altitude
  430.                                             //float(_set,ColAngleCorrectNeeded,ColAngleTmpFace);    //Align to wall
  431.                                             float(_set,ColAngleCorrectNeeded,TmpFloat2);    //Align to wall
  432.                                             spawnaction(ClimbAction);
  433.                                             callsub(sub_ChangeStateToNormal)
  434.                                             state(_or,StateExecuteAnim);
  435.                                             Direction(_set,_DIRTempFlag);
  436.  
  437.                                             if(VClass!=_ClassAngel)
  438.                                             {
  439.                                                 sample(SFXGrunt,-1);
  440.                                             }
  441.                                             else
  442.                                             {
  443.                                                 rotatebone(0,0,0,0);
  444.                                             }
  445.                                         }
  446.                                     }
  447.                                 }
  448.                             }
  449.                         }
  450.                     }
  451. //                }
  452.             }
  453.         }
  454.         if(ColAngleCorrectNeeded!=0)    //Correct angle when climbing up or walking stairs
  455.         {
  456.             float(_set,SubVar1,ColAngleCorrectNeeded);
  457.             float(_mul,SubVar1,0.1);
  458.             turn(0,SubVar1,0);
  459.             float(_sub,ColAngleCorrectNeeded,SubVar1);
  460.             rotatebone(0,0,0,0);
  461.  
  462.         }
  463. }
  464.  
  465. SubRoutine(sub_AlignToWallAndCheckRunUpStairs,const(SubParm1),const(SubParm2),const(SubParmHitWallIdle),float(SubParm4),const(SubParmHitWallIdleFront),const(SubParmHitWallSpreadOut),const(SubParm9),const(SubParmMoveList),const(SubParmMoveListGun),float(SubParmForceRunFrames))
  466. {
  467. //Checks if character has to walk up stairs, and controls the stairwalking
  468. //Turns character to slide along or face wall. Check if character is allowed to walk in a direction if close to a wall
  469.  
  470. //SubParm1: Action when running up stairs
  471. //SubParm2: Idle action
  472. //SubParmHitWallIdle: Idle action when hitting wall
  473. //SubParm4: ColAngleCorrectNeeded
  474. //SubParmHitWallIdleFront: Idle action when hitting wall frontally
  475. //SubParmHitWallSpreadOut
  476. //SubParm9:    How much must be added to Y when running on stairs
  477. //SubParmMoveList: List of all move-actions
  478.         if(vtrigger==_DIRvercol)
  479.         {
  480.             if(vtrigger!=_DIRleft&&vtrigger!=_DIRright)
  481.             {
  482. //Corrects angle when walking along wall, or facing wall
  483.                 if(VColNrVerRebounds==1)
  484.                 {
  485.                     if(VActionList==SubParmMoveList||VActionList==SubParmMoveListGun)
  486.                     {
  487.                         if(VColMaterialProperties|=_MATStairOrLedge)
  488.                         {
  489.                         }
  490.                         else
  491.                         {
  492.                             vector(_vectorfromdirflags,TmpVector2)
  493.  
  494.                             float(_seti,SubVar1,VColFeetSphereSize)
  495.                             float(_Mul,SubVar1,-2.1)
  496.                             vector(_setx,TmpVector3,SubVar1)        //-60 for bob
  497.                             float(_Mul,SubVar1,-1)
  498.                             vector(_setz,TmpVector3,SubVar1)        //60
  499.                             vector(_mul,TmpVector2,TmpVector3)
  500.  
  501.                             float(_seti,SubVar1,VColFeetSphereBottom)
  502.                             float(_add,SubVar1,15)
  503.                             vector(_sety,TmpVector2,SubVar1);
  504.                             vector(_set,TmpVector,0,0,0)
  505.                             vector(_sety,TmpVector,SubVar1);
  506.  
  507.                             collision(TmpVector,TmpVector2);
  508.                             if(vcolflag==_DIRvercol)
  509.                             {
  510.                                 float(_seti,SubVar1,VColAngle)
  511.                                 if(SubVar1>400||SubVar1<-400)    //turn away from wall, if hitting
  512.                                 {
  513.                                     if(SubVar1<1024&&SubVar1>-1024)    //Hit edge when going down stairs should not be corrected
  514.                                     {
  515.                                         if(SubVar1<0)
  516.                                         {
  517.                                             float(_add,SubVar1,1024);
  518.                                         }
  519.                                         else
  520.                                         {
  521.                                             float(_sub,SubVar1,1024);
  522.                                         }    
  523.                     
  524.                                         float(_mul,SubVar1,0.1);
  525.                                         turn(0,SubVar1,0);
  526.                                     }
  527.                                 }
  528.                                 else    //Turn to face wall, when close to angle.
  529.                                 {
  530.                                     float(_set,SubParm4,SubVar1);
  531.                 
  532.                                     float(_Seti,SubVar1,VTrigger)
  533.                                     float(_And,SubVar1,_DIRMoveBits)
  534.                                     if(SubVar1!=_DIRforward)
  535.                                     {
  536.                                         spawnaction(SubParmHitWallIdle);
  537.                                     }
  538.                                     else
  539.                                     {
  540.                                         spawnaction(SubParmHitWallIdleFront);
  541.                                     }
  542.                                 }
  543.                             }
  544.                         }
  545.                     }
  546.                 }
  547.             }
  548.  
  549.             if(vaction!=SubParm1)    //Not already on stairs
  550.             {
  551.                 if(vstate==StateNormal&&Vtrigger==_DIRMove)
  552.                 {
  553.                     if(VColMaterialProperties==_MATStair)
  554.                     {
  555.                         if(ColAngleTmpFace<600&&ColAngleTmpFace>-600)
  556.                         {
  557.                             if(vtrigger==_DIRforward)
  558.                             {
  559.                                 float(_seti,SubVar1,VColFeetSphereBottom);
  560.                                 float(_add,SubVar1,28);
  561.                                 float(_seti,SubVar2,VColFeetSphereSize);
  562.                                 float(_mul,SubVar2,-1);
  563.                                 float(_add,SubVar2,-20);
  564.  
  565.                                 vector(_set,TmpVector,0,0,0)
  566.                                 vector(_sety,TmpVector,SubVar1);
  567.                                 vector(_copy,TmpVector2,TmpVector)
  568.                                 vector(_setz,TmpVector2,SubVar2)
  569.                                 Collision(TmpVector,TmpVector2);
  570.                                 if(vcolflag!=_DIRvercol)
  571.                                 {
  572.                                     float(_sub,SubVar1,13);
  573.                                     vector(_sety,TmpVector,SubVar1);
  574.                                     vector(_sety,TmpVector2,SubVar1);
  575.                                     Collision(TmpVector,TmpVector2);
  576.                                     if(vcolflag==_DIRvercol)
  577.                                     {
  578.                                         spawnaction(SubParm1);
  579.                                     }
  580.                                 }
  581.                             }
  582.                         }
  583.                     }
  584.                     elseif(VColMaterialProperties==_MATSmallLedge)
  585.                     {
  586.                         if(ColAngleTmp<600&&ColAngleTmp>-600)
  587.                         {
  588.                             if(VClass==_ClassAngel)
  589.                             {
  590.                                 Direction(_set,_DIRjump)
  591.                             }
  592.                             else
  593.                             {
  594.                                 float(_set,SubParmForceRunFrames,8);    //Frames he will be running to get over ledge
  595.                             }
  596.                         }
  597.                     }
  598.                 }
  599.             }
  600.         }
  601. //Check if already on stairs, if you still are, keep running
  602.         if(vaction==SubParm1)
  603.         {
  604.             debugmessage("You specified a stair material. Don t");
  605.             if(vtrigger==_DIRforward)
  606.             {
  607.                 move(0,SubParm9,0);    //Bob -0.33
  608.                 float(_seti,SubVar1,VColFeetSphereBottom);
  609.                 vector(_set,TmpVector,0,0,50)
  610.                 vector(_set,TmpVector2,0,0,-80)
  611.                 float(_seti,SubVar2,VColFeetSphereSize);
  612.                 float(_mul,SubVar2,-2)
  613.                 float(_add,SubVar2,-20);
  614.                 vector(_sety,TmpVector,SubVar1);
  615.                 vector(_sety,TmpVector2,SubVar1);
  616.                 vector(_setz,TmpVector2,SubVar2)    //Bob=-80
  617.                 Collision(TmpVector,TmpVector2);
  618.                 if(vcolflag==_DIRvercol)
  619.                 {
  620.                     if(VColNrVerRebounds==1)
  621.                     {
  622.                         if(VColMaterialProperties|=_MATStair)
  623.                         {
  624.                             float(_seti,SubParm4,VColAngle);    //Correct angle
  625.                         }
  626.                     }
  627.                     vector(_set,TmpVector,-10,10,-60)
  628.                     float(_add,SubVar2,20);
  629.                     vector(_setz,TmpVector,SubVar2);        //Bob=-60
  630.                     vector(_copy,TmpVector2,TmpVector);
  631.                     float(_mul,SubVar1,1.1);
  632.                     vector(_sety,TmpVector2,SubVar1);
  633.                     Collision(TmpVector,TmpVector2);    //Send ray down Front-right
  634.                     if(vcolflag!=_DIRhorcol)
  635.                     {
  636.                         vector(_set,TmpVector3,-1,1,1)
  637.                         vector(_mul,TmpVector,TmpVector2)
  638.                         vector(_mul,TmpVector,TmpVector3)
  639.                         Collision(TmpVector,TmpVector2);    //Send ray down Front-left
  640.                         if(vcolflag!=_DIRhorcol)
  641.                         {
  642.                             spawnaction(SubParm2);
  643.                     printlog("spawn action 44");
  644.                             float(_set,SubParm4,0);
  645.                         }
  646.                     }
  647.                     
  648.                 }
  649.                 else
  650.                 {
  651.                     spawnaction(SubParm2);
  652.                 }
  653.             }
  654.             else
  655.             {
  656.                 spawnaction(SubParm2);
  657.             }
  658.         }
  659. //If standing against wall, and pressing move-button, make collision-check before allowing character to run
  660.         //if(VActionList==SubParmHitWallSpreadOut||VAction==SubParmHitWallIdleFront)
  661.         if(VActionList==SubParmHitWallSpreadOut || VAction==SubParmHitWallIdleFront || VAction==SubParmHitWallIdle)
  662.         {
  663.             //printlog("HITWALL:  Inside actionlist");
  664.             if(VTrigger==_DIRMove)
  665.             {
  666.                 vector(_vectorfromdirflags,TmpVector2)
  667.  
  668.                 float(_seti,SubVar1,VColFeetSphereSize)
  669.                 float(_Mul,SubVar1,-2.1)
  670.                 vector(_setx,TmpVector3,SubVar1)        //-60 for bob
  671.                 float(_Mul,SubVar1,-1)
  672.                 vector(_setz,TmpVector3,SubVar1)        //60
  673.                 vector(_mul,TmpVector2,TmpVector3)
  674.  
  675.                 float(_seti,SubVar1,VColFeetSphereBottom)
  676.                 float(_add,SubVar1,15)
  677.                 vector(_sety,TmpVector2,SubVar1);
  678.                 vector(_set,TmpVector,0,0,0)
  679.                 vector(_sety,TmpVector,SubVar1);
  680.  
  681.                 collision(TmpVector,TmpVector2);
  682.                 if(vcolflag==_DIRvercol)
  683.                 {
  684.                     if(VColAngle>400||VColAngle<-400)
  685.                     {
  686.                         SpawnAction(SubParm2);
  687.                     }
  688.                     elseif(VColMaterialProperties|=_MATStairOrLedge)
  689.                     {
  690.                         if(vtrigger==_DIRforward)
  691.                         {
  692.                             SpawnAction(SubParm2);
  693.                         }
  694.                     }
  695.  
  696.  
  697.                 }
  698.                 else
  699.                 {
  700.                         SpawnAction(SubParm2);
  701.                 }
  702.             }
  703.         }
  704.         if(SubParmForceRunFrames>0)
  705.         {
  706.             //printlog("HITWALL:  Inside forcerunframes");
  707.             float(_sub,SubParmForceRunFrames,1);
  708.             Call(ForceRunning);
  709.         }
  710. }
  711.  
  712.  
  713.  
  714. SubRoutine(Sub_BobFlapControl,float(SubParm1))
  715. {
  716. //SubParm1=BobFlapStrength
  717.         if(SubParm1>=0)
  718.         {
  719.             if(vframe<=6)
  720.             {
  721.                 move(0,11,0);
  722.             }
  723.             if(SubParm1<1)
  724.             {
  725. //                move(0,-5,0);
  726.                 if(vframe<3)
  727.                 {
  728.                     setframe(3);
  729.                 }
  730.                 elseif(vframe==4)
  731.                 {
  732.                     setframe(11);
  733.                 }
  734.                 if(SubParm1<0)
  735.                 {
  736.                     float(_set,SubParm1,0);
  737.                 }
  738.             }
  739.             elseif(SubParm1<2)
  740.             {
  741. //                move(0,-4,0);
  742.                 if(vframe<3)
  743.                 {
  744.                     setframe(3);
  745.                 }
  746.                 elseif(vframe==5)
  747.                 {
  748.                     setframe(10);
  749.                 }
  750.             }
  751.             elseif(SubParm1<3)
  752.             {
  753. //                move(0,-3,0);
  754.                 if(vframe<3)
  755.                 {
  756.                     setframe(3);
  757.                 }
  758.                 elseif(vframe==6)
  759.                 {
  760.                     setframe(9);
  761.                 }
  762.             }
  763.             elseif(SubParm1<4)
  764.             {
  765. //                move(0,-2,0);
  766.                 if(vframe<2)
  767.                 {
  768.                     setframe(2);
  769.                 }
  770.                 elseif(vframe==8)
  771.                 {
  772.                     setframe(11);
  773.                 }
  774.             }
  775.             elseif(SubParm1<5)
  776.             {
  777. //                move(0,-1,0);
  778.                 if(vframe<1)
  779.                 {
  780.                     setframe(1);
  781.                 }
  782.                 elseif(vframe==10)
  783.                 {
  784.                     setframe(12);
  785.                 }
  786.             }
  787.             else
  788.             {
  789.                 float(_set,SubParm1,5);
  790.             }
  791.         }
  792. }
  793.  
  794. SubRoutine(Sub_MoveBobInAir,float(SubParm1),float(SubParm2),float(SubParm3),float(SubParm4))
  795. {
  796.         if(vstate!=StateNormal)
  797.         {
  798. //SubParm1=AirSpeedForward
  799. //SubParm2=AirSpeedSideways
  800. //SubParm3=TurnSpeed
  801. //SubParm4=ColAngleCorrectNeeded
  802. /*            if(vaction==BobFlyBackFlip)
  803.             {
  804.                 float(_mul,SubParm1,BobDccAirBackFlip);
  805.                 float(_mul,SubParm2,BobDccAirBackFlip);
  806.                 RotateBone(0,0,0,0);
  807.             }
  808.             else
  809.             { 
  810. */
  811.                 if(vtrigger==_DIRvercol)
  812.                 {
  813.                     if(ColAngleTmp<400&&ColAngleTmp>-400)    //If bouncing straight into wall, with full speed, backflip
  814.                     {
  815.                         if(vdisttoground>100)
  816.                         {
  817.                             if(SubParm1<-14.37)
  818.                             {
  819.                                 //if(vaction!=BobFlyBackFlip)
  820.                                 if(vaction!=BobFlySmackWall)
  821.                                 { 
  822. //Checks if there are colis above and below character. Because it is annoying if he backflips when close to edge
  823.                                     Collision(0,100,0,0,100,-50);
  824.                                     if(vcolflag==_DIRvercol)
  825.                                     {
  826.                                         Collision(0,-100,0,0,-100,-50);
  827.                                         if(vcolflag==_DIRvercol)
  828.                                         {
  829.                                             //spawnaction(BobFlyBackFlip);
  830.                                             spawnaction(BobFlySmackWall);
  831.                                             sample(SFXBobUumph,-1);
  832.                                             state(_or,StateExecuteAnim);
  833.                                         }
  834.                                     }
  835.                                 }
  836.                             }
  837.                         }
  838.                         if(vtrigger!=_DIRLeft&&vtrigger!=_DIRRight)
  839.                         {
  840.                             float(_set,SubParm4,ColAngleTmp);    //SubVar1);
  841.                         }
  842.                         float(_mul,SubParm1,0.85)
  843.                         float(_mul,SubParm2,0.85)
  844.                     }
  845.                     else
  846.                     {
  847.                         if(VColNrVerRebounds==1)
  848.                         {
  849.                             if(vtrigger!=_DIRLeft&&vtrigger!=_DIRRight)
  850.                             {
  851.                                 float(_set,Var1,ColAngleTmp);
  852.                                 if(Var1<0)
  853.                                 {
  854.                                     float(_add,Var1,1024);
  855.                                 }
  856.                                 else
  857.                                 {
  858.                                     float(_sub,Var1,1024);
  859.                                 }
  860.                                 float(_mul,Var1,0.1);
  861.                                 turn(0,Var1,0);
  862.                             }
  863.                         }
  864.                     }
  865.                     float(_mul,SubParm1,0.80)
  866.                     float(_mul,SubParm2,0.80)
  867.                 }
  868.  
  869.  
  870.  
  871.                 if(vtrigger==_DIRforward)
  872.                 {
  873.                     camera(flyForward_camera_distance,flyForward_camera_angle);
  874.                     Target(flyForward_camera_Tdistance,flyForward_camera_Tangle);
  875.                     if(vtrigger==_DIRwalking)
  876.                     {
  877.                         if(SubParm1<=BobMaxWalkSpeedFwdAir)
  878.                         {
  879.                             float(_set,SubParm1,BobMaxWalkSpeedFwdAir);
  880.                         }
  881.                         else
  882.                         {
  883.                             float(_sub,SubParm1,BobAccAir);
  884.                         }
  885.                     }
  886.                     else
  887.                     {
  888.                         if(SubParm1<=BobMaxRunSpeedFwdAir)
  889.                         {
  890.                             float(_set,SubParm1,BobMaxRunSpeedFwdAir);
  891.                         }
  892.                         else
  893.                         {
  894.                             float(_sub,SubParm1,BobAccAir);
  895.                         }
  896.                     }
  897.                 }
  898.                 elseif(vtrigger==_DIRbackward)
  899.                 {
  900.                     camera(flyBackward_camera_distance,flyBackward_camera_angle);
  901.                     Target(flyBackward_camera_Tdistance,flyBackward_camera_Tangle);
  902.                     if(vtrigger==_DIRbackward)
  903.                     {
  904.                         if(SubParm1>=BobMaxWalkSpeedBwdAir)
  905.                         {
  906.                             float(_set,SubParm1,BobMaxWalkSpeedBwdAir);
  907.                         }
  908.                         else
  909.                         {
  910.                             float(_add,SubParm1,BobAccAir);
  911.                         }
  912.                     }
  913.                     else
  914.                     {
  915.                         if(SubParm1>=BobMaxRunSpeedBwdAir)
  916.                         {
  917.                             float(_set,SubParm1,BobMaxRunSpeedBwdAir);
  918.                         }
  919.                         else
  920.                         {
  921.                             float(_add,SubParm1,BobAccAir);
  922.                         }
  923.                     }
  924.                 }
  925.                 else
  926.                 {
  927. //on todo list                    camera(fly_camera_distance,fly_camera_angle);
  928. //on todo list                    Target(fly_camera_Tdistance,fly_camera_Tangle);
  929.                     float(_mul,SubParm1,BobDccAir);
  930.                 }
  931.  
  932.                 if(VTrigger==_DIRwalking)
  933.                 {
  934.                     if(vtrigger==_DIRSideRight)
  935.                     {
  936.                         if(SubParm2<=BobMaxWalkSpeedSideAirNeg)
  937.                         {
  938.                             float(_set,SubParm2,BobMaxWalkSpeedSideAirNeg);
  939.                         }
  940.                         else
  941.                         {
  942.                             float(_sub,SubParm2,BobAccAirSide);
  943.                         }
  944.                     }
  945.                     elseif(vtrigger==_DIRSideLeft)
  946.                     {
  947.                         if(SubParm2>=BobMaxWalkSpeedSideAir)
  948.                         {
  949.                             float(_set,SubParm2,BobMaxWalkSpeedSideAir);
  950.                         }
  951.                         else
  952.                         {
  953.                             float(_add,SubParm2,BobAccAirSide);
  954.                         }
  955.                     }
  956.                     else
  957.                     {
  958.                         float(_mul,SubParm2,BobDccAir);
  959.                     }    
  960.                 }
  961.                 else
  962.                 {
  963.                     elseif(vtrigger==_DIRSideRight)
  964.                     {
  965.                         if(SubParm2<=BobMaxRunSpeedSideAirNeg)
  966.                         {
  967.                             float(_set,SubParm2,BobMaxRunSpeedSideAirNeg);
  968.                         }
  969.                         else
  970.                         {
  971.                             float(_sub,SubParm2,BobAccAirSide);
  972.                         }
  973.                     }
  974.                     elseif(vtrigger==_DIRSideLeft)
  975.                     {
  976.                         if(SubParm2>=BobMaxRunSpeedSideAir)
  977.                         {
  978.                             float(_set,SubParm2,BobMaxRunSpeedSideAir);
  979.                         }
  980.                         else
  981.                         {
  982.                             float(_add,SubParm2,BobAccAirSide);
  983.                         }
  984.                     }
  985.                     else
  986.                     {
  987.                         float(_mul,SubParm2,BobDccAir);
  988.                     }    
  989.                 }
  990.     
  991.                 float(_Set,TmpFloat3,SubParm3);
  992.                 if(TmpFloat3<0)
  993.                 {
  994.                     float(_mul,TmpFloat3,-0.15);        //TurnSpeed when turning left
  995.                 }
  996.                 else
  997.                 {
  998.                     float(_mul,TmpFloat3,-0.20);        //TurnSpeed when turning right
  999.                 }
  1000.                 float(_add,TmpFloat3,SubParm2);
  1001.  
  1002.                 float(_set,TmpFloat,SubParm1);
  1003.                 if(TmpFloat3>0)
  1004.                 {
  1005.                     float(_sub,TmpFloat,TmpFloat3);
  1006.                 }
  1007.                 else
  1008.                 {
  1009.                     float(_add,TmpFloat,TmpFloat3);
  1010.                 }
  1011.                 float(_set,TmpFloat2,TmpFloat);    //The following lines correct for the fact that the Bob is not on straight angles.
  1012.                 float(_mul,TmpFloat,-14);
  1013.                 float(_mul,TmpFloat2,-5);
  1014.                 float(_mul,TmpFloat3,27);
  1015.                 float(_add,TmpFloat2,TmpFloat3);
  1016.                 rotatebone(0,TmpFloat,0,TmpFloat2);
  1017. //            }
  1018.             move(SubParm2,0,SubParm1);
  1019.         }
  1020. }    
  1021.