home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2002 May / Game.EXE_05_2002.iso / Alawar / src / Monster.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2002-04-04  |  4.1 KB  |  205 lines

  1. #include "Monster.h"
  2. #include "Level.h"
  3.  
  4. static Direction get_random_direction()
  5. {
  6.     const int random_number = rand()%16;
  7.     if ( random_number < 4 )
  8.         return Direction::LEFT;
  9.     if ( random_number < 8 )
  10.         return Direction::RIGHT;
  11.     if ( random_number < 12 )
  12.         return Direction::UP;
  13.     if ( random_number < 16 )
  14.         return Direction::DOWN;
  15.  
  16.     return Direction::STAND;
  17. }
  18.  
  19. Direction Monster::make_new_descision()
  20. {
  21.     Direction dir = get_random_direction();
  22.     int i(0);
  23.     while (!level->next_direction( this, dir ) )
  24.     {
  25.         dir = get_random_direction();
  26.         ++i;
  27.         if ( i > 3 )
  28.             break;
  29.     }
  30.     return dir;
  31. }
  32.  
  33. void Monster::life_cycle(float delta_time)
  34. {
  35.     anim.move( get_position().get_x()-anim.get_width()/2, get_position().get_y()-anim.get_height()/2 );
  36.     anim.life_cycle( delta_time );
  37.     switch( state )
  38.     {
  39.     case CREATING:
  40.         if( anim.is_finished() )
  41.             change_state( LIVING );
  42.         break;
  43.     case LIVING:
  44.         if ( pos.go_to( speed * delta_time ) )
  45.         {
  46.             if ( !level->next_direction( this, current_direction ) )
  47.             {
  48.                 Direction dir = make_new_descision();
  49.                 change_direction( dir );
  50.             }
  51.         }
  52.         break;
  53.     case WEAK:
  54.         current_weak_time += delta_time;
  55.         if ( current_weak_time > weak_time )
  56.             change_state( LIVING );
  57.         if ( pos.go_to( speed * delta_time ) )
  58.         {
  59.             if ( !level->next_direction( this, current_direction ) )
  60.             {
  61.                 Direction dir = make_new_descision();
  62.                 change_direction( dir );
  63.             }
  64.         }
  65.         break;
  66.     case DYING:
  67.         if( anim.is_finished() )
  68.                 change_state( DEAD );
  69.         break;
  70.     case DEAD:
  71.         current_eye_time += delta_time;
  72.         if ( current_eye_time >= eye_time )
  73.         {
  74.             change_state( CREATING );
  75.             break;
  76.         }
  77.         //Γετ≡εΣΦ≥ⁿ±  ≈σ≡στ φσΩε≥ε≡εσ Γ≡σ∞ 
  78.         if ( pos.go_to( speed * delta_time ) )
  79.         {
  80.             if ( !level->next_direction( this, current_direction ) )
  81.             {
  82.                 Direction dir = make_new_descision();
  83.                 change_direction( dir );
  84.             }
  85.         }
  86.         break;
  87.     }
  88. }
  89.  
  90. String Monster::get_name()const
  91. {
  92.     return name;
  93. }
  94.  
  95. float Monster::get_size()const
  96. {
  97.     return anim.get_width();
  98. }
  99.  
  100. void Monster::process_collision(const Creature * cre)
  101. {
  102.     if ( cre->get_name() == "Pacman" )
  103.     {
  104.         if ( state == LIVING )
  105.         {
  106.             //cool :)
  107.         }
  108.         if ( state == WEAK )
  109.         {
  110.             change_state( DYING );
  111.         }
  112.     }
  113. }
  114.  
  115. bool Monster::is_solid()const
  116. {
  117.     return state != CREATING && state != DYING && state != DEAD;
  118. }
  119.  
  120. void Monster::process_death(const Creature * cre)
  121. {
  122.     if ( cre->get_name() == "Pacman" )
  123.         change_state( DYING );
  124.     if ( cre->get_name() == "PowerDot" )
  125.         if( state == LIVING || state == WEAK )
  126.             change_state( WEAK );
  127. }
  128.  
  129. bool Monster::is_alive()const
  130. {
  131.     return true;    //?
  132. }
  133.  
  134. Monster::Monster( Scene2D * scene, Level * level )
  135. :    Creature( level ),
  136.     anim( scene, 1, "data/monster_01" ),
  137.     state( DEAD ),
  138.     weak_time( 5 ),
  139.     current_weak_time( 0 ),
  140.     eye_time( 5 ),
  141.     current_eye_time( 0 ),
  142.     current_direction( Direction::STAND )
  143. {
  144.     speed = 2;    //∩ε ΦΣσσ ²≥ε Γ±σ Φτ ΦφΦ°ΩΦ
  145.     change_state( CREATING );
  146. }
  147.  
  148. void Monster::change_state( state_enum new_state )
  149. {
  150. //    switch( state ) // ╧εΩΦφ≤≥ⁿ ∩≡σΣ√Σ≤∙σσ ±ε±≥ε φΦσ
  151. //    {}
  152.     speed = 2;
  153.     state = new_state;
  154.     switch( state ) // ╟αΘ≥Φ Γ φεΓεσ ±ε±≥ε φΦσ
  155.     {
  156.     case CREATING:
  157.         level->move( this, "monster_start" );
  158.         change_state( LIVING );
  159.         break;
  160.     case LIVING:
  161.         anim.start( 0, true );
  162.         anim.move( get_position().get_x()-anim.get_width()/2, get_position().get_y()-anim.get_height()/2 );
  163.         name = "Monster";
  164.         current_direction = Direction::STAND;
  165.         break;
  166.     case WEAK:
  167.         current_weak_time = 0;
  168.         name = "Cat";
  169.         anim.start( 5, true );
  170.         speed = 1;
  171.         break;
  172.     case DYING:
  173.         change_state( DEAD );
  174.         break;
  175.     case DEAD:
  176.         current_eye_time = 0;
  177.         anim.start( 4, true );
  178.         break;
  179.     }
  180. }
  181.  
  182. void Monster::change_direction( Direction dir )
  183. {
  184.     if ( state == LIVING )
  185.     if ( current_direction != dir )
  186.     {
  187.         switch( dir.get_dir() )
  188.         {
  189.         case Direction::RIGHT:
  190.             anim.start(0,true);
  191.             break;
  192.         case Direction::LEFT:
  193.             anim.start(2,true);
  194.             break;
  195.         case Direction::UP:
  196.             anim.start(1,true);
  197.             break;
  198.         case Direction::DOWN:
  199.             anim.start(3,true);
  200.             break;
  201.         }
  202.     }
  203.     current_direction = dir;
  204. }
  205.