-void
-new_bang_dots(struct sprite *s)
-{
- int i, n, x, y;
- uint16_t *pixel, c;
- uint32_t colorkey;
- int row_inc;
- double theta, r;
- SDL_Surface *img = s->image;
-
- n = 20;
- pixel = img->pixels;
- row_inc = img->pitch/sizeof(uint16_t) - img->w;
- colorkey = img->format->colorkey;
-
- if(SDL_MUSTLOCK(img)) { SDL_LockSurface(img); }
-
- for(i=0; i<n; i++) {
- pixel = img->pixels;
- for(y=0; y<img->h; y++) {
- for(x = 0; x<img->w; x++) {
- c = *pixel++;
- if(c && c != colorkey) {
- theta = frnd()*M_PI*2;
- r = frnd(); r = 1 - r*r;
-
- bdot[bd2].dx = 45*r*cos(theta) + s->dx;
- bdot[bd2].dy = 45*r*sin(theta) + s->dy;
- bdot[bd2].x = x + s->x;
- bdot[bd2].y = y + s->y;
- //bdot[bd2].c = (i < n-3) ? 0 : c;
- bdot[bd2].life = frnd() * 99;
- bdot[bd2].decay = frnd()*3 + 1;
- bdot[bd2].active = 1;
-
- bd2 = (bd2+1) % MAXBANGDOTS;
- }
- pixel += row_inc;
- }
- }
- }
-
- if(SDL_MUSTLOCK(img)) { SDL_UnlockSurface(img); }
-}
-
-void
-move_bang_dots(float ticks)
-{
- int i;
- Sprite *hit;
-
- for(i=0; i<MAXBANGDOTS; i++) {
- if(!bdot[i].active) continue;
-
- // decrement life and maybe kill
- bdot[i].life -= bdot[i].decay * ticks/2.0;
- if(bdot[i].life < 0) { bdot[i].active = 0; continue; }
-
- // move and clip
- bdot[i].x += (bdot[i].dx - screendx)*ticks;
- bdot[i].y += (bdot[i].dy - screendy)*ticks;
- if(fclip(bdot[i].x, XSIZE) || fclip(bdot[i].y, YSIZE)) {
- bdot[i].active = 0;
- continue;
- }
-
- // check collisions
- if((hit = pixel_collides(bdot[i].x, bdot[i].y))) {
- if(hit->type != SHIP) { // they shouldn't hit the ship, but they do
- bdot[i].active = 0;
- hit->dx += ENGINE_DOT_WEIGHT * bdot[i].life * bdot[i].dx / sprite_mass(hit);
- hit->dy += ENGINE_DOT_WEIGHT * bdot[i].life * bdot[i].dy / sprite_mass(hit);
- continue;
- }
- }
- }
-}
-