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

  1. //-------------------------------------------------------------
  2. //
  3. // Class:    CWallHugger
  4. //
  5. // Author:    John M Phillips
  6. //
  7. // Started:    06/05/00
  8. //
  9. // Base:    CAlien
  10. //
  11. // Derived:    None
  12. //
  13. //-------------------------------------------------------------
  14.  
  15. #include "game.h"
  16.  
  17. //-------------------------------------------------------------
  18.  
  19. gsCRandom CWallHugger::m_random;
  20.  
  21. //-------------------------------------------------------------
  22.  
  23. CWallHugger::CWallHugger()
  24. {
  25.     m_grade = WALLHUGGER_STATIC;
  26.     m_weapon = 0;
  27.     m_fired = false;
  28. }
  29.  
  30. //-------------------------------------------------------------
  31.  
  32. CWallHugger::~CWallHugger()
  33. {
  34. }
  35.  
  36. //-------------------------------------------------------------
  37.  
  38. void CWallHugger::findWall()
  39. {
  40.     //TEMP
  41.  
  42.     if (m_position.getX() < 320.f) {
  43.         m_side = WALLHUGGER_LEFT;
  44.         m_weapon->setDirection(gsCVector(1.f,0.f));
  45.         }
  46.     else {
  47.         m_side = WALLHUGGER_RIGHT;
  48.         m_weapon->setDirection(gsCVector(-1.f,0.f));
  49.         }
  50. }
  51.  
  52. //-------------------------------------------------------------
  53.  
  54. bool CWallHugger::activate()
  55. {
  56.     if (!isActive()) {
  57.         m_weapon = new CSpinnerWeapon;
  58.         m_scene->addActor(m_weapon);
  59.         m_weapon->activate();
  60.         m_weapon->setOwner(this);
  61.         m_weapon->setOffset(gsCVector(0.f,0.f));
  62.         m_weapon->setFiringMode(WEAPON_MANUAL);
  63.  
  64.         m_state = WALLHUGGER_STILL;
  65.         m_timer.start();
  66.         }
  67.  
  68.     return CActor::activate();
  69. }
  70.  
  71. //-------------------------------------------------------------
  72.  
  73. void CWallHugger::kill()
  74. {
  75.     if (m_weapon) {
  76.         m_weapon->kill();
  77.         m_weapon = 0;
  78.         }
  79.  
  80.     CActor::kill();
  81. }
  82.  
  83. //-------------------------------------------------------------
  84.  
  85. bool CWallHugger::validWalkPosition()
  86. {
  87.     gsCMap *map = m_scene->getMap();
  88.     
  89.     gsCPoint top,bot;
  90.  
  91.     if (m_side == WALLHUGGER_LEFT) {
  92.         top = gsCPoint(getPosition()) + gsCPoint(-32,-32);
  93.         bot = gsCPoint(getPosition()) + gsCPoint(-32,32);
  94.         }
  95.     else {
  96.         top = gsCPoint(getPosition()) + gsCPoint(32,-32);
  97.         bot = gsCPoint(getPosition()) + gsCPoint(32,32);
  98.         }
  99.  
  100.     gsCPoint tile_size = map->getImage()->getTileSize();
  101.  
  102.     gsCMapTile *top_tile = map->getMapTile(top / tile_size);
  103.     gsCMapTile *bot_tile = map->getMapTile(bot / tile_size);
  104.  
  105.     bool top_solid = !top_tile || !top_tile->isEmpty();
  106.     bool bot_solid = !bot_tile || !bot_tile->isEmpty();
  107.  
  108.     return top_solid && bot_solid;
  109. }
  110.  
  111. //-------------------------------------------------------------
  112.         
  113. bool CWallHugger::update(Controls *controls)
  114. {
  115.     if (m_shield == 0) {
  116.         explode();
  117.         kill();
  118.         return true;
  119.         }
  120.  
  121.     findWall();
  122.  
  123.     switch (m_state) {
  124.         case WALLHUGGER_STILL:
  125.             {
  126.             m_sprite.setFrame(m_side + WALLHUGGER_WALK_START);
  127.  
  128.             if (m_timer.getTime() >= WALLHUGGER_STILL_TIME) {
  129.  
  130.                 if (m_grade == WALLHUGGER_STATIC ||
  131.                     m_random.getInt(100) < 50) {
  132.                     m_state = WALLHUGGER_SHOOTING;
  133.                     m_fired = false;
  134.                     }
  135.                 else {
  136.                     m_state = WALLHUGGER_WALKING;
  137.                     if (m_random.getInt(100) < 50)
  138.                         setVelocity(gsCVector(0.f,-WALLHUGGER_WALK_SPEED));
  139.                     else
  140.                         setVelocity(gsCVector(0.f,WALLHUGGER_WALK_SPEED));
  141.                     }
  142.  
  143.                 m_timer.start();
  144.                 }
  145.             }
  146.             break;
  147.         case WALLHUGGER_WALKING:
  148.             {
  149.                 int frame = (int) (m_timer.getTime() * getActorInfo().m_anim_rate);
  150.                 m_sprite.setFrame(m_side + WALLHUGGER_WALK_START + frame % WALLHUGGER_WALK_FRAMES);
  151.  
  152.                 m_position += m_velocity;
  153.  
  154.                 // cancel movement if off edge of wall
  155.  
  156.                 if (!validWalkPosition()) {
  157.                     m_position -= m_velocity;
  158.  
  159.                     m_state = WALLHUGGER_STILL;
  160.                     m_timer.start();
  161.                     }
  162.  
  163.                 if (m_timer.getTime() >= WALLHUGGER_WALK_TIME) {
  164.                     m_state = WALLHUGGER_STILL;
  165.                     m_timer.start();
  166.                     }
  167.             }
  168.             break;
  169.         case WALLHUGGER_SHOOTING:
  170.             {
  171.                 int frame = (int) (m_timer.getTime() * getActorInfo().m_anim_rate);
  172.                 if (frame >= WALLHUGGER_SHOT_FRAMES) {
  173.                     m_sprite.setFrame(m_side + WALLHUGGER_WALK_START);
  174.                     m_state = WALLHUGGER_STILL;
  175.                     m_timer.start();
  176.                     }            
  177.                 else {
  178.                     m_sprite.setFrame(m_side + WALLHUGGER_SHOT_START + frame);
  179.                     if (!m_fired && frame >= WALLHUGGER_LAUNCH_FRAME) {
  180.                         m_weapon->fire();
  181.                         m_fired = true;
  182.                         }
  183.                     }
  184.             }
  185.             break;
  186.         }
  187.  
  188.     return true;
  189. }
  190.  
  191. //-------------------------------------------------------------
  192.  
  193. void CWallHugger::setGrade(WallHuggerGrade grade)
  194. {
  195.     m_grade = grade;
  196.  
  197.     switch (m_grade) {
  198.         case WALLHUGGER_STATIC:
  199.             m_weapon->setGrade(WEAPON_STANDARD);
  200.             break;
  201.         case WALLHUGGER_MOVING:
  202.             m_weapon->setGrade(WEAPON_MEDIUM);
  203.             break;
  204.         }
  205. }
  206.  
  207. //-------------------------------------------------------------
  208.  
  209.