Sophie

Sophie

distrib > Mandriva > 2009.1 > x86_64 > by-pkgid > 56c615211d295fb99ff45dd87fd8e366 > files > 106

lib64allegro-devel-4.2.2-4mdv2009.1.x86_64.rpm

#include "bullet.h"
#include "data.h"
#include "display.h"
#include "dirty.h"
#include "aster.h"
#include "game.h"

/* position of the bullets */
#define BULLET_SPEED    6

BULLET *bullet_list;

/* add a bullet to the list */
BULLET *add_bullet(int x, int y)
{
   BULLET *iter, *bullet;

   bullet = (BULLET *) malloc(sizeof(BULLET));
   bullet->x = x;
   bullet->y = y;
   bullet->next = NULL;

   /* special treatment for head */
   if (!bullet_list) {
      bullet_list = bullet;
   }
   else {
      for (iter = bullet_list; iter->next; iter = iter->next) ;

      iter->next = bullet;
   }

   return bullet;
}



/* delete a bullet and return the next in the list */
BULLET *delete_bullet(BULLET * bullet)
{
   BULLET *iter;

   /* special treatment for head */
   if (bullet == bullet_list) {
      bullet_list = bullet->next;
      free(bullet);
      return bullet_list;
   }
   else {
      for (iter = bullet_list; iter->next != bullet; iter = iter->next) ;

      iter->next = bullet->next;
      free(bullet);
      return iter->next;
   }
}



void move_bullets(void)
{
   BULLET *bullet = bullet_list;
   while (bullet) {
      bullet->y -= BULLET_SPEED;

      /* if the bullet is at the top of the screen, delete it */
      if (bullet->y < 8) {
         bullet = delete_bullet(bullet);
         goto bullet_updated;
      }
      else {

         /* shot an asteroid? */
         if (asteroid_collision(bullet->x, bullet->y, 20)) {
            score += 10;
            play_sample(data[BOOM_SPL].dat, 255, PAN(bullet->x), 1000, FALSE);
            /* delete the bullet that killed the alien */
            bullet = delete_bullet(bullet);
            goto bullet_updated;
         }
      }

      bullet = bullet->next;

      bullet_updated:;
   }
}



void draw_bullets(BITMAP *bmp)
{
   BULLET *bullet;
   for (bullet = bullet_list; bullet; bullet = bullet->next) {
      int x = bullet->x;
      int y = bullet->y;

      RLE_SPRITE *spr = data[ROCKET].dat;
      draw_rle_sprite(bmp, spr, x - spr->w / 2, y - spr->h / 2);
      if (animation_type == DIRTY_RECTANGLE)
         dirty_rectangle(x - spr->w / 2, y - spr->h / 2, spr->w, spr->h);
   }
}