-init_engine_dots() {
- int i;
- for(i = 0; i<MAXENGINEDOTS; i++) {
- edot[i].active = 0;
- }
-}
-
-void
-new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s)
-{
- int i, n, x, y;
- uint16_t *pixel, c;
- uint32_t colorkey;
- int row_inc;
- double theta, r;
-
- n = 20;
- pixel = s->pixels;
- row_inc = s->pitch/sizeof(uint16_t) - s->w;
- colorkey = s->format->colorkey;
-
- if(SDL_MUSTLOCK(s)) { SDL_LockSurface(s); }
-
- for(i=0; i<n; i++) {
- pixel = s->pixels;
- for(y=0; y<s->h; y++) {
- for(x = 0; x<s->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) + dx;
- bdot[bd2].dy = 45*r*sin(theta) + dy;
- bdot[bd2].x = x + xbang;
- bdot[bd2].y = y + ybang;
- //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(s)) { SDL_UnlockSurface(s); }
-}
-
-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(bdot[i].x < 0 || bdot[i].x >= XSIZE || bdot[i].y < 0 || 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;
- }
- }
- }