|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
-
- #include <stdlib.h>
- #include <math.h>
-
- #include "common.h"
-
- static void draw_small_explosion( int x, int y, int frame );
- static void draw_big_explosion( int x, int y, int frame );
- static void draw_huge_explosion( int x, int y, int frame );
-
- void init_explosions( game *g, explosions *ex )
- {
- int i;
-
- for( i = 0; i < EXPLOSIONS; i++ )
- {
- ex->n[i] = 0;
- ex->x[i] = -1;
- ex->y[i] = -1;
- ex->vx[i] = -1;
- ex->vy[i] = -1;
- ex->type[i] = 0;
- }
- }
-
- void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type )
- {
- int i;
-
- for( i = 0; i < EXPLOSIONS; i++ )
- {
- if( ex->n[i] <= 0 )
- {
- ex->x[i] = x;
- ex->y[i] = y;
- ex->vx[i] = vx;
- ex->vy[i] = vy;
- switch( type )
- {
- case 1: ex->n[i] = 13; break;
- case 2: ex->n[i] = 30; break;
- case 0: default: ex->n[i] = 7; break;
- }
- ex->type[i] = type;
- break;
- }
- }
- }
-
- void draw_explosions( game *g, explosions *ex )
- {
- int i;
-
- for( i = 0; i < EXPLOSIONS; i++ )
- {
- if( ex->n[i] <= 0 )
- {
- continue;
- }
-
- #if 0
- GFX_COLOR( GREEN );
- GFX_GOTO( ex->x[i] + 3, ex->y[i] );
- switch( GET_RAND(0,3) )
- {
- case 0:
- GFX_WRITE( 'p' );
- GFX_WRITE( 'i' );
- GFX_WRITE( 'f' );
- break;
- case 1:
- GFX_WRITE( 'p' );
- GFX_WRITE( 'a' );
- GFX_WRITE( 'f' );
- break;
- case 2:
- GFX_WRITE( 'p' );
- GFX_WRITE( 'o' );
- GFX_WRITE( 'u' );
- GFX_WRITE( 'f' );
- break;
- }
- GFX_WRITE( '!' );
- #endif
-
- switch( ex->type[i] )
- {
- case 2:
- draw_huge_explosion( ex->x[i], ex->y[i], ex->n[i] );
- break;
- case 1:
- draw_big_explosion( ex->x[i], ex->y[i], ex->n[i] );
- break;
- case 0:
- default:
- draw_small_explosion( ex->x[i], ex->y[i], ex->n[i] );
- break;
- }
-
- }
- }
-
- void update_explosions( game *g, explosions *ex )
- {
- int i;
-
- for( i = 0; i < EXPLOSIONS; i++ )
- {
- if( ex->n[i] > 0 )
- {
- ex->x[i] += ex->vx[i];
- ex->y[i] += ex->vy[i];
- ex->n[i]--;
- }
- }
- }
-
- static void draw_small_explosion( int x, int y, int frame )
- {
- switch( frame )
- {
- default:
- case 6:
- GFX_COLOR( YELLOW );
- GFX_GOTO( x, y );
- GFX_WRITE( '+' );
- break;
- case 5:
- GFX_COLOR( YELLOW );
- GFX_GOTO( x, y );
- GFX_WRITE( 'o' );
- break;
- case 4:
- GFX_COLOR( YELLOW );
- GFX_GOTO( x, y-1 );
- GFX_WRITE( '_' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( ')' );
- GFX_WRITE( '_' );
- GFX_WRITE( '(' );
- break;
- case 3:
- GFX_COLOR( YELLOW );
- GFX_GOTO( x-1, y-1 );
- GFX_WRITE( '.' );
- GFX_WRITE( '_' );
- GFX_WRITE( ',' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( ')' );
- GFX_WRITE( '_' );
- GFX_WRITE( '(' );
- GFX_GOTO( x-1, y+1 );
- GFX_WRITE( '\'' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '`' );
- break;
- case 2:
- GFX_COLOR( YELLOW );
- GFX_GOTO( x-1, y-1 );
- GFX_WRITE( '.' );
- GFX_WRITE( 'v' );
- GFX_WRITE( ',' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( '>' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '<' );
- GFX_GOTO( x-1, y+1 );
- GFX_WRITE( '\'' );
- GFX_WRITE( '^' );
- GFX_WRITE( '`' );
- break;
- case 1:
- GFX_COLOR( WHITE );
- GFX_GOTO( x-1, y-1 );
- GFX_WRITE( '.' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ',' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_GOTO( x-1, y+1 );
- GFX_WRITE( '\'' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '`' );
- break;
- }
- }
-
- static void draw_big_explosion( int x, int y, int frame )
- {
- GFX_COLOR( YELLOW );
-
- switch( frame )
- {
- default:
- case 12:
- GFX_GOTO( x, y );
- GFX_WRITE( '+' );
- break;
- case 11:
- GFX_GOTO( x, y );
- GFX_WRITE( 'o' );
- break;
- case 10:
- GFX_GOTO( x, y-1 );
- GFX_WRITE( '_' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( ')' );
- GFX_WRITE( '_' );
- GFX_WRITE( '(' );
- break;
- case 9:
- GFX_GOTO( x-1, y-1 );
- GFX_WRITE( '.' );
- GFX_WRITE( '_' );
- GFX_WRITE( ',' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( ')' );
- GFX_WRITE( '_' );
- GFX_WRITE( '(' );
- GFX_GOTO( x-1, y+1 );
- GFX_WRITE( '\'' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '`' );
- break;
- case 8:
- GFX_GOTO( x-1, y-1 );
- GFX_WRITE( '.' );
- GFX_WRITE( 'v' );
- GFX_WRITE( ',' );
- GFX_GOTO( x-1, y );
- GFX_WRITE( '>' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '<' );
- GFX_GOTO( x-1, y+1 );
- GFX_WRITE( '\'' );
- GFX_WRITE( '^' );
- GFX_WRITE( '`' );
- break;
- case 6:
- GFX_COLOR( RED );
- case 7:
- case 5:
- GFX_GOTO( x-2, y-1 );
- GFX_WRITE( '_' );
- GFX_WRITE( '\\' );
- GFX_WRITE( '~' );
- GFX_WRITE( '/' );
- GFX_WRITE( '_' );
- GFX_GOTO( x-2, y );
- GFX_WRITE( '>' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '<' );
- GFX_GOTO( x-2, y+1 );
- GFX_WRITE( '~' );
- GFX_WRITE( '/' );
- GFX_WRITE( '_' );
- GFX_WRITE( '\\' );
- GFX_WRITE( '~' );
- break;
- case 3:
- GFX_COLOR( RED );
- case 4:
- case 2:
- GFX_GOTO( x-2, y-1 );
- GFX_WRITE( '_' );
- GFX_WRITE( '\\' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '/' );
- GFX_WRITE( '_' );
- GFX_GOTO( x-2, y );
- GFX_WRITE( '_' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '_' );
- GFX_GOTO( x-2, y+1 );
- GFX_WRITE( ' ' );
- GFX_WRITE( '/' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '\\' );
- GFX_WRITE( ' ' );
- break;
- case 1:
- GFX_COLOR( WHITE );
- GFX_GOTO( x-2, y-1 );
- GFX_WRITE( '.' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '\'' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ',' );
- GFX_GOTO( x-2, y );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_WRITE( ' ' );
- GFX_GOTO( x-2, y+1 );
- GFX_WRITE( '\'' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '.' );
- GFX_WRITE( ' ' );
- GFX_WRITE( '`' );
- break;
- }
- }
-
- static void draw_circle( int x, int y, float r );
-
- static void draw_huge_explosion( int x, int y, int frame )
- {
- float r = 1.5 * (30 - frame);
-
- GFX_COLOR( BLUE );
- draw_circle( x, y, r );
-
- r += 0.7;
-
- GFX_COLOR( CYAN );
- draw_circle( x, y, r );
-
- r += 0.7;
-
- GFX_COLOR( WHITE );
- draw_circle( x, y, r );
- }
-
- static void draw_circle( int x, int y, float r )
- {
- #if 1
- float c;
-
- for( c = 0 ; c <= 90 ; c += 1 )
- {
- float dx = 0.5 + r * 2.0 * sin( c * M_PI / 180.0 );
- float dy = 0.5 + r * cos( c * M_PI / 180.0 );
-
- GFX_GOTO( x + dx, y + dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x - dx, y + dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x + dx, y - dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x - dx, y - dy );
- GFX_WRITE( '#' );
- }
- #endif
-
- #if 0
- int dx,dy,a2,b2, S, T;
- float a = r*8, b = r*2;
-
- a2 = a*a;
- b2 = b*b;
- dx = 0;
- dy = b;
- S = a2*(1-2*b) + 2*b2;
- T = b2 - 2*a2*(2*b-1);
- GFX_GOTO( x + dx, y + dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x - dx, y + dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x + dx, y - dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x - dx, y - dy );
- GFX_WRITE( '#' );
-
- do
- {
- if (S<0)
- {
- S += 2*b2*(2*x+3);
- T += 4*b2*(x+1);
- dx++;
- }
- else if (T<0)
- {
- S += 2*b2*(2*x+3) - 4*a2*(dy-1);
- T += 4*b2*(x+1) - 2*a2*(2*dy-3);
- dx++;
- dy--;
- }
- else
- {
- S -= 4*a2*(dy-1);
- T -= 2*a2*(2*dy-3);
- dy--;
- }
- GFX_GOTO( x + dx, y + dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x - dx, y + dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x + dx, y - dy );
- GFX_WRITE( '#' );
- GFX_GOTO( x - dx, y - dy );
- GFX_WRITE( '#' );
- }
- while (dy>0);
- #endif
-
- }
-
|