/** * 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; }
/** * 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; } }