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

  1.  
  2. #include "character.h"
  3. #include "SeesEnemy.h"
  4. #include "gametime.h"
  5. #include "util.h"
  6.  
  7. SeesEnemy::SeesEnemy()
  8. {
  9.     m_name      = "SeesEnemy";
  10.     m_owner     = NULL;
  11. }
  12.  
  13. void SeesEnemy::init   ( IEOwner * owner )
  14. {
  15.     m_owner = dynamic_cast<Character *> (owner);
  16. }
  17.  
  18.  
  19. bool SeesEnemy::update () 
  20. {
  21.     int px;
  22.     int py;
  23.  
  24.     m_owner->getPos ( px, py );
  25.  
  26.     int xdir;
  27.     int ydir;
  28.  
  29.     m_owner->getDirection ( xdir, ydir );
  30.  
  31.     int dist = m_owner->getSightRange();
  32.  
  33.     Character * enemy = lookForEnemy ( px, py, xdir, ydir, dist );
  34.  
  35.     if ( enemy )
  36.     {
  37.         m_owner->setEnemy ( enemy );
  38.         return true;
  39.     }
  40.     else
  41.     {
  42.         m_owner->setEnemy ( NULL );
  43.         return false;
  44.     }
  45. }
  46.  
  47.  
  48. IEOwner * SeesEnemy::getOwner ()
  49. {
  50.     return m_owner;
  51. }
  52.  
  53. const char * SeesEnemy::getName()
  54. {
  55.     return m_name.c_str();
  56. }
  57.  
  58. Character * SeesEnemy::lookForEnemy ( int x, int y, int xdir, int ydir, int range )
  59. {
  60.     int  i;
  61.     int  sx;
  62.     int  sy;
  63.  
  64.     Character * enemy = NULL;
  65.  
  66.     World2D  * world = m_owner->getWorld();
  67.     
  68.     int width  = world->getWidth();
  69.     int length = world->getLength();
  70.  
  71.     if ( xdir > 0 )
  72.     {
  73.         for ( i=x+1; i<=x+range; i++ )
  74.         {
  75.             sy = y;
  76.  
  77.             if ( i >= width )
  78.                 sx = 0 + (i - width);
  79.             else
  80.                 sx = i;
  81.  
  82.             enemy = testEnemy ( sx, sy );
  83.             if ( enemy )
  84.                 return enemy;
  85.         }
  86.     }
  87.     else if ( xdir < 0 )
  88.     {
  89.         for ( i=x-1; i>=x-range; i-- )
  90.         {
  91.             sy = y;
  92.  
  93.             if ( i < 0 )
  94.                 sx = width + i;
  95.             else
  96.                 sx = i;
  97.  
  98.             enemy = testEnemy ( sx, sy );
  99.             if ( enemy )
  100.                 return enemy;
  101.         }
  102.     }
  103.     else if ( ydir > 0 )
  104.     {
  105.         for ( i=y+1; i<=y+range; i++ )
  106.         {
  107.             sx = x;
  108.  
  109.             if ( i >= length )
  110.                 sy = 0 + (i - length);
  111.             else
  112.                 sy = i;
  113.  
  114.             enemy = testEnemy ( sx, sy );
  115.             if ( enemy )
  116.                 return enemy;
  117.         }
  118.     }
  119.     else if ( ydir < 0 )
  120.     {
  121.         for ( i=y-1; i>=y-range; i-- )
  122.         {
  123.             sx = x;
  124.  
  125.             if ( i < 0 )
  126.                 sy = range + i;
  127.             else
  128.                 sy = i;
  129.  
  130.             enemy = testEnemy ( sx, sy );
  131.             if ( enemy )
  132.                 return enemy;
  133.         }
  134.     }
  135.  
  136.     return NULL;
  137. }
  138.  
  139. Character * SeesEnemy::testEnemy ( int x, int y )
  140. {
  141.     Character * enemy = NULL;
  142.  
  143.     WorldPos * wpos;
  144.     WorldObj * obj;
  145.     World2D  * world = m_owner->getWorld();
  146.     
  147.     wpos = world->getPos ( x, y );
  148.  
  149.     obj  = wpos->getObj();
  150.  
  151.     if ( obj )
  152.     {
  153.         Character * other = (Character *)obj;
  154.  
  155.         if ( other )
  156.         {
  157.             if ( m_owner->isEnemy ( other ) )
  158.             {
  159.                 enemy = other;
  160.             }
  161.         }
  162.     }
  163.  
  164.     return enemy;
  165. }