/**
 * Return a new enemy element
 * @param power Power of destruction of this new enemy
 * @param energy Energy level of this new enemey
 * @param current_image Current image index 
 * @param type Identifier of this enemy
 * @param shot_delay Delay value before two shots 
 * @return Pointer to the new enemy element
 */
static enemy *
lonely_foe_new (Sint16 power, Sint16 energy, Sint16 current_image,
                Sint32 type, Sint32 shot_delay)
{
  Sint32 i;
  enemy *foe;
  foe = enemy_get ();
  if (foe == NULL)
    {
      return NULL;
    }
  foe->spr.pow_of_dest = power;
  foe->spr.energy_level = energy;
  foe->spr.numof_images = 32;
  foe->spr.current_image = current_image;
  foe->spr.anim_count = 0;
  for (i = 0; i < foe->spr.numof_images; i++)
    {
      foe->spr.img[i] = (image *) & enemi[type][i];
    }
  foe->fire_rate = shot_delay;
  foe->fire_rate_count = foe->fire_rate;
  foe->displacement = DISPLACEMENT_LONELY_FOE;
  foe->type = type;
  foe->dead = FALSE;
  foe->visible = TRUE;
  return foe;
}
Example #2
0
/**
 * Initialize grid phase
 */
void
grid_start (void)
{
  Sint32 i, j, k;
  enemy *foe;
  spaceship_struct *ship = spaceship_get ();
  for (i = 0; i < GRID_WIDTH; i++)
    {
      for (j = 0; j < GRID_HEIGHT; j++)
        {
          /* enemy exists? */
          if (grid.enemy_num[i][j] != -1)
            {
              /* get a new enemy element */
              foe = enemy_get ();
              if (foe == NULL)
                {
                  continue;
                }

              /* little enemy or big enemy (Bloodsuckers, chief of the wave)? */
              if (grid.enemy_num[i][j] < ENEMIES_MAX_SMALL_TYPES)
                {
                  /* set power of the destruction */
                  foe->spr.pow_of_dest = (Sint16) (1 + grid.enemy_num[i][j]);
                  /* the level of energy of the sprite */
                  foe->spr.energy_level =
                    (Sint16) ((ship->type << 1) + foe->spr.pow_of_dest);
                  /* size of the enemy sprite as 16x16 pixels */
                  foe->type = 0;
                }
              else
                /*
                 * Bloodsuckers, the chief of the wave
                 */
                {
                  /* set power of the destruction */
                  foe->spr.pow_of_dest =
                    (Sint16) (6 +
                              (grid.enemy_num[i][j] -
                               ENEMIES_MAX_SMALL_TYPES) * 2);
                  /* the level of energy of the sprite */
                  foe->spr.energy_level =
                    (Sint16) ((ship->type << 2) + foe->spr.pow_of_dest + 10);
                  /* size of the enemy sprite as 32x32 pixels */
                  foe->type = 1;
                }
              /* set number of images of the sprite */
              foe->spr.numof_images = 8;

              /* set current image of the enemy sprite */
              foe->spr.current_image = (Sint16) (rand () % 8);
              /* delay before next image: speed of the animation */
              foe->spr.anim_speed = 10;
              /* counter delay before next image */
              foe->spr.anim_count = 0;

              /* set addresses of the images buffer */
              for (k = 0; k < foe->spr.numof_images; k++)
                {
                  if (grid.enemy_num[i][j] < ENEMIES_MAX_SMALL_TYPES)
                    /* enemy sprite of 16x16 pixels */
                    foe->spr.img[k] =
                      (image *) & enemi[grid.enemy_num[i][j]][32 + k];
                  else
                    /* enemy sprite of 32x32 pixels */
                    foe->spr.img[k] =
                      (image *) & enemi[grid.enemy_num[i][j]][k];
                }
              /* delay value before next shot */
              foe->fire_rate_count = grid.shoot_speed[i][j];
              /* type of displacement */
              foe->displacement = DISPLACEMENT_GRID;
              foe->pos_vaiss[XCOORD] = (Sint16) i;
              foe->pos_vaiss[YCOORD] = (Sint16) j;
            }
        }
    }
  /* set grid x coordinate */
  grid.coor_x = 128;
  /* set grid y coordinate */
  grid.coor_y = -176;
  /* enable the appearance of the grid of enemies */
  grid.is_appearing = TRUE;
  /* grid phase disable */
  grid.is_enable = FALSE;
  /* set movement toward right or left */
  grid.right_movement = rand () % 2 ? TRUE : FALSE;
  if (grid.right_movement)
    {
      grid.speed_x = grid.vit_dep_x;
    }
  else
    {
      grid.speed_x = -grid.vit_dep_x;
    }
}