home *** CD-ROM | disk | FTP | other *** search
/ PC Format (South-Africa) 2001 June / PCFJune.iso / Xenon / XenonSource.exe / xenon / source / clone.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-09-09  |  3.1 KB  |  160 lines

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CClone
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    CActor
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. CClone::CClone()
  20. {
  21.     m_min_angle = 0.f;
  22.     m_max_angle = 0.f;
  23.     m_current_angle = 0.f;
  24.     m_required_angle = 0.f;
  25.     m_engine = 0;
  26. }
  27.  
  28. //-------------------------------------------------------------
  29.  
  30. CClone::~CClone()
  31. {
  32. //    CActor::~CActor();
  33. }
  34.  
  35. //-------------------------------------------------------------
  36.  
  37. bool CClone::activate()
  38. {
  39.     if (!isActive()) {
  40.         m_engine = new CCloneEngine;
  41.         m_scene->addActor(m_engine);
  42.         m_engine->activate();
  43.         m_engine->setOffset(gsCVector(0.f,10.f));
  44.         m_engine->setOwner(this);
  45.         m_engine->setParams(gsCVector(0.f,-16.f),gsCVector(0.f,0.f),0.05f);
  46.  
  47.         m_timer.start();
  48.         }
  49.  
  50.     return CUpgrade::activate();
  51. }
  52.  
  53. //-------------------------------------------------------------
  54.  
  55. void CClone::kill()
  56. {
  57.     if (m_engine) {
  58.         m_engine->kill();
  59.         m_engine = 0;
  60.         }
  61.  
  62.     CUpgrade::kill();
  63. }
  64.  
  65. //-------------------------------------------------------------
  66.  
  67. bool CClone::update(Controls *controls)
  68. {
  69.     CShip *ship = (CShip *) getOwner();
  70.  
  71.     if (!ship) {
  72.         explode();
  73.         kill();
  74.         return true;
  75.         }
  76.  
  77.     if (getShield() == 0) {
  78.         ship->detachClone(this);
  79.         setOwner(0);
  80.         explode();
  81.         kill();
  82.         return true;
  83.         }
  84.  
  85.     if (controls->up)
  86.         m_required_angle = m_max_angle;
  87.     if (controls->down)
  88.         m_required_angle = m_min_angle;
  89.  
  90.     int thrust = 0;
  91.  
  92.     if (m_current_angle != m_required_angle) {
  93.  
  94.         float delta = m_required_angle - m_current_angle;
  95.  
  96.         if (gsAbs(delta) < CLONE_ANGLE_STEP)
  97.             m_current_angle = m_required_angle;
  98.         else {
  99.             if (delta > 0) {
  100.                 m_current_angle += CLONE_ANGLE_STEP;
  101.                 if (m_min_angle > m_max_angle)
  102.                     thrust = 1;
  103.                 }
  104.             else {
  105.                 m_current_angle -= CLONE_ANGLE_STEP;
  106.                 if (m_min_angle < m_max_angle)
  107.                     thrust = 1;
  108.                 }
  109.             }
  110.         }
  111.  
  112.     if (m_engine)
  113.         m_engine->applyThrust(thrust);
  114.  
  115.     m_offset = gsCVector::polar(CLONE_RADIUS,m_current_angle);
  116.  
  117.     int d = ship->getDiveLevel();
  118.  
  119.     if (d == 0) {
  120.         m_position = ship->getPosition() + m_offset;
  121.         if (ship->isCloaked()) {
  122.             if (!ship->isCloakFlashing())
  123.                 m_sprite.setFrame(CLONE_CLOAK_FRAME);
  124.             else
  125.                 m_sprite.setFrame(0);
  126.             }
  127.         else
  128.             animate(ANIMATE_LOOP,0,CLONE_FRAMES);
  129.         }
  130.     else {
  131.         m_position = ship->getPosition() + m_offset * ship->getDiveScale();
  132.         m_sprite.setFrame(CLONE_DIVE_OFFSET + CLONE_DIVE_FRAMES * d / SHIP_DIVE_FRAMES);
  133.         }
  134.  
  135.     return true;
  136. }
  137.  
  138. //-------------------------------------------------------------
  139.  
  140. void CClone::setAngleRange(float min,float max)
  141. {
  142.     m_min_angle = min;
  143.     m_max_angle = max;
  144.  
  145.     setAngle(m_min_angle,true);
  146. }
  147.  
  148. //-------------------------------------------------------------
  149.  
  150. void CClone::setAngle(float angle,bool set)
  151. {
  152.     if (set)
  153.         m_current_angle = angle;
  154.  
  155.     m_required_angle = angle;
  156. }
  157.  
  158. //-------------------------------------------------------------
  159.  
  160.