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

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