home *** CD-ROM | disk | FTP | other *** search
/ PC World 2006 July & August / PCWorld_2006-07-08_cd.bin / temacd / planearcade / planearcade.exe / Tank3.bmp / volker.cpp < prev    next >
C/C++ Source or Header  |  2004-10-16  |  11KB  |  537 lines

  1.  
  2. #include "main.h"
  3.  
  4.  
  5. //Inicializacia
  6. //----------------------------------------------------------
  7. void VOLKER::Initialize()
  8. {
  9.  
  10.     //gulky
  11.     //--------------
  12.     Bullet.Initialize();
  13.     Bullet.UnFriendly = true;
  14.  
  15.     //zvuk
  16.     //------------
  17.     if (SoundEnabled3D == 1)
  18.     {
  19.         Sound.InitialiseForWavMidi3D();
  20.         Sound.LoadSound("sounds/volker.wav");
  21.     }
  22.  
  23.     //reset hodnot
  24.     //------------
  25.     Reset();
  26. }
  27.  
  28. //reset hodnot - na konci kazdej hry
  29. //----------------------------------------------------------
  30. void VOLKER::Reset()
  31. {
  32.  
  33.     BulletTime = 0.0f;
  34.  
  35.     Bullet.Reset();
  36.  
  37.     Active = false;
  38.     ActiveTime = 0.0f;
  39.  
  40.     SoundPlay = false;
  41.     Sound.Stop();
  42.  
  43.     NormalMode = true;
  44.     CrazyMode = false;
  45.     DestroyedMode = false;
  46.  
  47.     Sledovanie = true;
  48.     Vyhybanie = false;
  49.     Uhybanie = false;
  50.     AITime = 0.0f;
  51.  
  52.     Pos = Get3D(0.0f,0.0f,0.0f);
  53.     Rot = Get3D(0.0f,0.0f,0.0f);
  54.     ActRotZ = 0.0f;
  55.     Matrix = GetMatrix(Pos,Rot,F_Scale);
  56.  
  57.     VrtulaRotation = 0.0f;
  58.  
  59.     Life = 1;
  60.  
  61. }
  62.  
  63. //zastavi zvuk
  64. //-------------------------------------------------------------
  65. void VOLKER::StopSound()
  66. {
  67.     SoundPlay = false;
  68.     Sound.Stop();    
  69. }
  70.  
  71. //Refresh
  72. //--------------------------------------------------------------
  73. void VOLKER::Refresh()
  74. {
  75.  
  76.     //ak nieje aktivny tak vyskoc
  77.     if (Active == false)
  78.         return;
  79.  
  80.     //-------------------------------------
  81.     //vypocitanie matice podla ktorej sa posunie
  82.     //------------------------------------
  83.     Matrix = GetMatrix(Pos,Rot,F_Scale);
  84.  
  85.     //------------------
  86.     //umela inteligencia
  87.     //------------------
  88.     if (NormalMode)
  89.     {
  90.  
  91.         if     (Sledovanie)
  92.             ProcessSledovanie();
  93.         else if(Vyhybanie)
  94.             ProcessVyhybanie();
  95.         else if(Uhybanie)
  96.             ProcessUhybanie();
  97.  
  98.     }
  99.  
  100.     //---------
  101.     //posunutie
  102.     //---------
  103.     if (NormalMode || CrazyMode)
  104.     {
  105.     
  106.         Pos = TransformPoint(Get3D(0.0f,0.0f,Power(Volker_Speed)),
  107.                               Matrix);
  108.  
  109.         //ak vysiel pri pade mimo -  otoc
  110.         if (CrazyMode = true)
  111.         {
  112.             if ((Pos.X < -F_MapSize || Pos.X > F_MapSize) ||
  113.                 (Pos.Y < -F_MapSize || Pos.Y > F_MapSize) ||
  114.                 (Pos.Z < -F_MapSize || Pos.Z > F_MapSize))
  115.             {
  116.                 Rot.Y = Rot.Y - 3.14f;
  117.             }
  118.         }
  119.  
  120.     }
  121.  
  122.     //-------------------------------------
  123.     //vypocitanie matice a koliznych bodov
  124.     //------------------------------------
  125.     Matrix = GetMatrix(Pos,Rot,F_Scale);
  126.  
  127.     //kolizne body
  128.     PL = Volker_Left;
  129.     PR = Volker_Right;
  130.     PU = Volker_Up;
  131.     PD = Volker_Down;
  132.     PF = Volker_Front;
  133.     PB = Volker_Back;
  134.  
  135.     PL = TransformPoint(PL,Matrix);
  136.     PR = TransformPoint(PR,Matrix);
  137.     PB = TransformPoint(PB,Matrix);
  138.     PF = TransformPoint(PF,Matrix);
  139.     PU = TransformPoint(PU,Matrix);
  140.     PD = TransformPoint(PD,Matrix);
  141.  
  142.     //gulomety
  143.     BL = TransformPoint(Volker_BulletLeft,Matrix);
  144.     BR = TransformPoint(Volker_BulletRight,Matrix);
  145.  
  146.     //vrtula
  147.     PV = TransformPoint(Volker_VrtulaPoint,Matrix);
  148.  
  149.     //----------------
  150.     //kolizia so zemov
  151.     //----------------
  152.     bool GroundCollision = GetGroundCollision();
  153.  
  154.     //-------------
  155.     //Zvuk motora
  156.     //-------------
  157.     if (NormalMode || CrazyMode)
  158.     {
  159.         if (SoundPlay == false && Menu.EnabledBriefring == false)
  160.         {
  161.             SoundPlay = true;
  162.             Sound.Play(true);    
  163.         }
  164.  
  165.         Sound.SetPosition(Pos,Volker_SoundScale);
  166.     }
  167.  
  168.     //-------------
  169.     //process
  170.     //-------------
  171.     if (NormalMode)
  172.     {
  173.         
  174.         //kolizia zo zemov
  175.         if (GroundCollision == true)
  176.         {
  177.             //particle
  178.             Explo.SpawnExplosion(Pos);
  179.             Explo.SpawnParticle(Pos);
  180.             Explo.F_Plane.Spawn(Pos);
  181.             Explo.F_Ball.Spawn(Pos);
  182.  
  183.             DestroyedMode = true;
  184.             NormalMode = false;
  185.             Life = -1;
  186.  
  187.             //zvuk
  188.             SoundLib.ExplodeLarge.SetPosition(Pos,ExplodeLarge_Scale);
  189.             SoundLib.ExplodeLarge.Play();
  190.  
  191.             //zastav zvuk motora
  192.             Sound.Stop();
  193.         }
  194.  
  195.         //zivoty
  196.         if (Life <= 0)
  197.         {
  198.             //particle
  199.             Explo.SpawnExplosion(Pos);
  200.             Explo.SpawnParticle(Pos);
  201.             Explo.F_Plane.Spawn(Pos);
  202.             Explo.F_Ball.Spawn(Pos);
  203.  
  204.             CrazyMode = true;
  205.             NormalMode = false;
  206.  
  207.             //zvuk
  208.             SoundLib.ExplodeSmall.SetPosition(Pos,ExplodeSmall_Scale);
  209.             SoundLib.ExplodeSmall.Play();
  210.  
  211.             //vypusti score particle
  212.             if (SpitFire.Life > 0)
  213.                 Score.DrawScore(Score_Volker,Pos);
  214.  
  215.             //pripocita score
  216.             if (SpitFire.Life > 0)
  217.                 SpitFire.Score += Score_Volker;            
  218.         }
  219.         
  220.     }
  221.     else if(CrazyMode)
  222.     {
  223.  
  224.         //kolizia zo zemov
  225.         if (GroundCollision == true)
  226.         {
  227.  
  228.             //particle
  229.             Explo.SpawnExplosion(Pos);
  230.             Explo.SpawnParticle(Pos);
  231.             Explo.F_Plane.Spawn(Pos);
  232.             Explo.F_Ball.Spawn(Pos);
  233.  
  234.             DestroyedMode = true;
  235.             CrazyMode = false;
  236.  
  237.             //zvuk
  238.             SoundLib.ExplodeLarge.SetPosition(Pos,ExplodeLarge_Scale);
  239.             SoundLib.ExplodeLarge.Play();
  240.  
  241.             //zastav zvuk motora
  242.             Sound.Stop();
  243.         }
  244.  
  245.         //crazy
  246.         Rot.Z += Power(0.1f);
  247.         Rot.X += Power(0.005f);
  248.         Pos.Y -= Power(2.0f);
  249.  
  250.         //particle
  251.         Explo.SpawnSmokePlane(Pos);
  252.         Explo.SpawnSmokeHit(Pos);
  253.  
  254.     }
  255.     else if(DestroyedMode)
  256.     {
  257.         Explo.SpawnSmokeGround(Pos);
  258.  
  259.         ActiveTime += PowerTime(1.0f);
  260.         if (ActiveTime > Volker_DestroyTime)
  261.             Active = false;
  262.     }
  263.  
  264.     //----------
  265.     //Render
  266.     //-----------
  267.  
  268.     //Naboje
  269.     Bullet.Refresh();
  270.  
  271.     //Normal
  272.     if ((NormalMode)||(CrazyMode))
  273.     {
  274.         //model
  275.         ModelLib.Volker_ModelNormal.Pos = Pos;
  276.         ModelLib.Volker_ModelNormal.Rot = Rot;
  277.         ModelLib.Volker_ModelNormal.Render();
  278.  
  279.         //vrtula
  280.         VrtulaRotation += Power(Volker_Speed/20.0f);
  281.         
  282.         ModelLib.Vrtula.Pos = PV;
  283.         ModelLib.Vrtula.Rot = Rot;
  284.         ModelLib.Vrtula.Rot.Z = VrtulaRotation;
  285.         ModelLib.Vrtula.Color.A = 0.6f;
  286.  
  287.         Engine.SetAlphaTest(true);
  288.         Engine.SetBlendTrans();
  289.             ModelLib.Vrtula.Render();
  290.         Engine.SetBlendNone();
  291.  
  292.  
  293.     }
  294.  
  295.     //destroyed
  296.     else if(DestroyedMode)
  297.     {
  298.         ModelLib.Volker_ModelDestroyed.Pos = Pos;
  299.         ModelLib.Volker_ModelDestroyed.Rot = Rot;
  300.         ModelLib.Volker_ModelDestroyed.Render();
  301.     }
  302.  
  303.  
  304. }
  305.  
  306. //umela inteligencia prechadzanie
  307. //--------------------------------------------------------
  308. void VOLKER::ProcessSledovanie()
  309. {
  310.  
  311.     //cas
  312.     //-------
  313.     AITime += PowerTime(1.0f);
  314.     
  315.  
  316.     //urci bod ktory ma sledova¥
  317.     //----------------------------
  318.     D3DXMATRIX AiMatrix = GetMatrix(Pos,Get3D(0.0f,Rot.Y,0.0),F_Scale);
  319.     SpitFirePoint = UnTransformPoint(SpitFire.SlPoint, AiMatrix);
  320.     Distance = CalcDistance(Get3D(0.0f,0.0f,0.0f),SpitFirePoint);
  321.  
  322.     //strelba
  323.     //----------
  324.     BulletTime += PowerTime(1.0f);
  325.     if (SpitFirePoint.X > -50.0f && SpitFirePoint.X < 50.0f &&
  326.         SpitFirePoint.Y > -50.0f && SpitFirePoint.Y < 50.0f &&
  327.         SpitFirePoint.Z > 0.0f && SpitFirePoint.Z < 2500.0f && BulletTime > Volker_BulletFreq)
  328.     {
  329.         //vypusti bullet
  330.         Bullet.SpawnBullet(BL,Rot);
  331.         Bullet.SpawnBullet(BR,Rot);
  332.         BulletTime = 0.0f;
  333.  
  334.         //zvuk
  335.         SoundLib.FireUnFriendly.SetPosition(Pos,FireUnFriendly_Scale);
  336.         SoundLib.FireUnFriendly.Play();
  337.     }
  338.     
  339.     //vodorovne
  340.     //---------
  341.     if (SpitFirePoint.Z > 0.0f)
  342.     {
  343.         ActRotZ = -(SpitFirePoint.X)/500.0f;            
  344.     }
  345.     if (SpitFirePoint.Z < 0.0f)
  346.     {
  347.         ActRotZ = -(SpitFirePoint.X)/1000.0f;
  348.  
  349.         if (SpitFirePoint.X > 0.0f && SpitFirePoint.X < 180.0f) 
  350.             ActRotZ = -Volker_MaxSteerZ;
  351.         if (SpitFirePoint.X < 0.0f && SpitFirePoint.X > -180.0f)
  352.             ActRotZ = Volker_MaxSteerZ;
  353.     }
  354.  
  355.     if (ActRotZ >  Volker_MaxSteerZ) ActRotZ =  Volker_MaxSteerZ;
  356.     if (ActRotZ < -Volker_MaxSteerZ) ActRotZ = -Volker_MaxSteerZ;
  357.         
  358.     //horizontalne
  359.     //------------
  360.     SpitFirePoint.Y = SpitFire.SlPoint.Y - Pos.Y;
  361.  
  362.     ActRotX = -(SpitFirePoint.Y)/300.0f;
  363.  
  364.     //upravenie steers
  365.     if (ActRotZ >  Volker_MaxSteerZ) ActRotZ =  Volker_MaxSteerZ;
  366.     if (ActRotZ < -Volker_MaxSteerZ) ActRotZ = -Volker_MaxSteerZ;
  367.     if (ActRotX >  Volker_MaxSteerX) ActRotX =  Volker_MaxSteerX;
  368.     if (ActRotX < -Volker_MaxSteerX) ActRotX = -Volker_MaxSteerX;
  369.     
  370.     //RotaciaX
  371.     Rot.X += (ActRotX-Rot.X) * Power(Volker_FactorX);
  372.  
  373.     //RotaciaZ
  374.     Rot.Z += (ActRotZ-Rot.Z) * Power(Volker_FactorZ);
  375.         
  376.     //RotaciaY
  377.     Rot.Y -= Power(sinf(Rot.Z)*Volker_FactorY);
  378.     
  379.     VECTOR3D P;
  380.     int i;
  381.     
  382.     //kolizia s volkerom
  383.     //------------------------------
  384.     P = TransformPoint(Get3D(0.0f,0.0f,40.0f),Matrix);
  385.     for (i=0;i<Max_Volkers;i++)
  386.     {
  387.         if (Level.Volker[i].Pos.X == Pos.X &&
  388.             Level.Volker[i].Pos.Y == Pos.Y &&
  389.             Level.Volker[i].Pos.Z == Pos.Z)
  390.             continue;
  391.  
  392.         if (Level.Volker[i].Active &&
  393.             Level.Volker[i].Life > 0)
  394.         {
  395.             if (Level.Volker[i].CollisionBox(Pos,P) == true)
  396.             {    
  397.                 Uhybanie = true;
  398.                 Sledovanie = false;
  399.                 AITime = 0.0f;
  400.             }
  401.         }
  402.     }
  403.  
  404.     //kolizia so zemou - vyhnutie sa
  405.     //------------------------------
  406.     P = TransformPoint(Get3D(0.0f,0.0f,550.0f),Matrix);
  407.     
  408.     if (Level.Krajina.Collise(Pos,P) == true)
  409.     {
  410.         Vyhybanie = true;
  411.         Sledovanie = false;
  412.         AITime = 0.0f;
  413.     }
  414.  
  415. }
  416.  
  417. //ai vyhybanie
  418. //--------------------------------------------------------
  419. void VOLKER::ProcessVyhybanie()
  420. {
  421.  
  422.     //cas
  423.     //-------
  424.     AITime += PowerTime(1.0f);
  425.  
  426.     if (AITime > Volker_VyhybanieMaxTime)
  427.     {
  428.         AITime = 0.0f;
  429.         Sledovanie = true;
  430.         Vyhybanie = false;
  431.     }
  432.  
  433.     //uhnutie sa
  434.     //-------------
  435.     ActRotX = -Volker_MaxSteerX*2.0f;
  436.  
  437.     //RotaciaX
  438.     Rot.X += (ActRotX-Rot.X) * Power(Volker_FactorX);
  439.  
  440.     //RotaciaZ
  441.     Rot.Z += (ActRotZ-Rot.Z) * Power(Volker_FactorZ);
  442.         
  443.     //RotaciaY
  444.     Rot.Y -= Power(sinf(Rot.Z)*Volker_FactorY);
  445.  
  446. }
  447.  
  448. //ai uhybanie
  449. //--------------------------------------------------------
  450. void VOLKER::ProcessUhybanie()
  451. {
  452.  
  453.     //cas
  454.     //-------
  455.     AITime += PowerTime(1.0f);
  456.  
  457.     if (AITime > Volker_UhybanieMaxTime)
  458.     {
  459.         AITime = 0.0f;
  460.         Sledovanie = true;
  461.         Uhybanie = false;
  462.     }
  463.  
  464.     //uhnutie sa
  465.     //-------------
  466.     ActRotZ = Volker_MaxSteerZ ;
  467.     ActRotX = -Volker_MaxSteerX;
  468.  
  469.     //RotaciaX
  470.     Rot.X += (ActRotX-Rot.X) * Power(Volker_FactorX);
  471.  
  472.     //RotaciaZ
  473.     Rot.Z += (ActRotZ-Rot.Z) * Power(Volker_FactorZ);
  474.         
  475.     //RotaciaY
  476.     Rot.Y -= Power(sinf(Rot.Z)*Volker_FactorY);
  477.  
  478. }
  479.  
  480.  
  481. //kolizia lietadla zo zemov a objektami
  482. //--------------------------------------------------------
  483. bool VOLKER::GetGroundCollision()
  484. {
  485.  
  486.     //Zem
  487.     //-------------
  488. /*    if (Level.Krajina.Collise(PR,PL) == true)
  489.     {
  490.         return true;
  491.     }
  492.  
  493.     if (Level.Krajina.Collise(PD,PU) == true)
  494.     {
  495.         return true;
  496.     }
  497. */
  498.     if (Level.Krajina.Collise(PB,PF) == true)
  499.     {
  500.         return true;
  501.     }
  502.     
  503.     return false;
  504.  
  505. }
  506.  
  507. //kolizia
  508. //-------------------------------------------------------------
  509. bool VOLKER::CollisionDetail(VECTOR3D P1, VECTOR3D P2)
  510. {
  511.     //ak nieje aktivny tak vrat false
  512.     if (Active == false)
  513.         return false;
  514.  
  515.     //ak je zostreleny vrat false
  516.     if (DestroyedMode == true)
  517.         return false;
  518.  
  519.     return ModelLib.Volker_ModelNormal.CollisionDetail(P1,P2,Matrix);
  520. }
  521.  
  522. //kolizia
  523. //-------------------------------------------------------------
  524. bool VOLKER::CollisionBox(VECTOR3D P1, VECTOR3D P2)
  525. {
  526.     //ak nieje aktivny tak vrat false
  527.     if (Active == false)
  528.         return false;
  529.  
  530.     //ak je zostreleny vrat false
  531.     if (DestroyedMode == true)
  532.         return false;
  533.  
  534.     return ModelLib.Volker_ModelNormal.CollisionBox(P1,P2,Matrix);
  535. }
  536.  
  537.