home *** CD-ROM | disk | FTP | other *** search
/ AI Game Programming Wisdom / AIGameProgrammingWisdom.iso / SourceCode / 06 General Architectures / 04 Christian / flee.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-09-16  |  2.1 KB  |  119 lines

  1.  
  2. #include "character.h"
  3. #include "Flee.h"
  4. #include "gametime.h"
  5. #include "util.h"
  6.  
  7. Flee::Flee()
  8. {
  9.     m_name      = "Flee"; // must match class name
  10.     m_owner     = NULL;
  11. }
  12.  
  13. void Flee::init   ( IEOwner * owner )
  14. {
  15.     m_owner = dynamic_cast<Character *> (owner);
  16. }
  17.  
  18. bool Flee::start ()
  19. {
  20.     m_state = Go;
  21.  
  22.     m_owner->animStart ( CA_Run );
  23.  
  24.     m_enemy = m_owner->getEnemy();
  25.  
  26.     printf ( "%s meows and takes out running.\n", m_owner->getName() );
  27.  
  28.     m_owner->setMotionSpeed ( m_owner->getRunSpeed() );
  29.  
  30.     m_clock = 0.0f;
  31.     m_changeDirTime = 3.0f;
  32.  
  33.     return false;
  34. }
  35.  
  36. bool Flee::update () 
  37. {
  38.     switch ( m_state )
  39.     {
  40.  
  41.     case Go:
  42.  
  43.         m_clock += GameTime::dt;
  44.  
  45.         if ( m_clock >= m_changeDirTime )
  46.         {
  47.  
  48.             m_clock = 0.0f;
  49.  
  50.             // get enemies position
  51.             int ex, ey;
  52.             m_enemy->getPos ( ex, ey );
  53.  
  54.             // get our position
  55.             int ox, oy;
  56.             m_owner->getPos ( ox, oy );
  57.  
  58.             // set movement direction away from enemy (only x or y, not both)
  59.             int xdir, ydir;
  60.  
  61.             if ( abs( ex - ox ) < abs (ey - oy ) )
  62.             {
  63.                 ydir = 0;
  64.  
  65.                 if ( ex > ox )
  66.                     xdir = -1;
  67.                 else
  68.                     xdir = 1;
  69.             }
  70.             else
  71.             {
  72.                 xdir = 0;
  73.  
  74.                 if ( ey > oy )
  75.                     ydir = -1;
  76.                 else
  77.                     ydir = 1;
  78.             }
  79.  
  80.             m_owner->setDirection ( xdir, ydir );
  81.         }
  82.  
  83.         // move
  84.         m_owner->move ();
  85.  
  86.         if ( m_owner->inNewPos() )
  87.         {
  88.             int x, y;
  89.             m_owner->getPos ( x, y );
  90.  
  91.             printf ( "%s fleeing %s at %d %d\n",
  92.                 m_owner->getName(), m_enemy->getName(), x, y );
  93.         }
  94.  
  95.         m_owner->burnEnergy();
  96.  
  97.         break;
  98.  
  99.     }
  100.  
  101.     return true;
  102. }
  103.  
  104. bool Flee::finish ()
  105. {
  106.     return true;
  107. }
  108.  
  109. IEOwner * Flee::getOwner ()
  110. {
  111.     return m_owner;
  112. }
  113.  
  114. const char * Flee::getName()
  115. {
  116.     return m_name.c_str();
  117. }
  118.  
  119.