source: ttyvaders/trunk/explosions.c @ 16

Last change on this file since 16 was 16, checked in by Sam Hocevar, 18 years ago
  • moved nuke from explosions to weapons.
  • used a cool Bresenham algorithm to draw the nuke circles.
  • nuke collides with aliens.
File size: 6.6 KB
Line 
1
2#include <stdlib.h>
3
4#include "common.h"
5
6static void draw_small_explosion( int x, int y, int frame );
7static void draw_big_explosion( int x, int y, int frame );
8
9void init_explosions( game *g, explosions *ex )
10{
11    int i;
12
13    for( i = 0; i < EXPLOSIONS; i++ )
14    {
15        ex->n[i] = 0;
16        ex->x[i] = -1;
17        ex->y[i] = -1;
18        ex->vx[i] = -1;
19        ex->vy[i] = -1;
20        ex->type[i] = 0;
21    }
22}
23
24void add_explosion( game *g, explosions *ex, int x, int y, int vx, int vy, int type )
25{
26    int i;
27
28    for( i = 0; i < EXPLOSIONS; i++ )
29    {
30        if( ex->n[i] <= 0 )
31        {
32            ex->x[i] = x;
33            ex->y[i] = y;
34            ex->vx[i] = vx;
35            ex->vy[i] = vy;
36            switch( type )
37            {
38                case 1: ex->n[i] = 13; break;
39                case 2: ex->n[i] = 30; break;
40                case 0: default: ex->n[i] = 7; break;
41            }
42            ex->type[i] = type;
43            break;
44        }
45    }
46}
47
48void draw_explosions( game *g, explosions *ex )
49{
50    int i;
51
52    for( i = 0; i < EXPLOSIONS; i++ )
53    {
54        if( ex->n[i] <= 0 )
55        {
56            continue;
57        }
58
59#if 0
60        GFX_COLOR( GREEN );
61        GFX_GOTO( ex->x[i] + 3, ex->y[i] );
62        switch( GET_RAND(0,3) )
63        {
64        case 0:
65            GFX_WRITE( 'p' );
66            GFX_WRITE( 'i' );
67            GFX_WRITE( 'f' );
68            break;
69        case 1:
70            GFX_WRITE( 'p' );
71            GFX_WRITE( 'a' );
72            GFX_WRITE( 'f' );
73            break;
74        case 2:
75            GFX_WRITE( 'p' );
76            GFX_WRITE( 'o' );
77            GFX_WRITE( 'u' );
78            GFX_WRITE( 'f' );
79            break;
80        }
81        GFX_WRITE( '!' );
82#endif
83
84        switch( ex->type[i] )
85        {
86            case 1:
87                draw_big_explosion( ex->x[i], ex->y[i], ex->n[i] );
88                break;
89            case 0:
90            default:
91                draw_small_explosion( ex->x[i], ex->y[i], ex->n[i] );
92                break;
93        }
94
95    }
96}
97
98void update_explosions( game *g, explosions *ex )
99{
100    int i;
101
102    for( i = 0; i < EXPLOSIONS; i++ )
103    {
104        if( ex->n[i] > 0 )
105        {
106            ex->x[i] += ex->vx[i];
107            ex->y[i] += ex->vy[i];
108            ex->n[i]--;
109        }
110    }
111}
112
113static void draw_small_explosion( int x, int y, int frame )
114{
115    switch( frame )
116    {
117    default:
118    case 6:
119        GFX_COLOR( YELLOW );
120        GFX_GOTO( x, y );
121        GFX_WRITE( '+' );
122        break;
123    case 5:
124        GFX_COLOR( YELLOW );
125        GFX_GOTO( x, y );
126        GFX_WRITE( 'o' );
127        break;
128    case 4:
129        GFX_COLOR( YELLOW );
130        GFX_GOTO( x, y-1 );
131        GFX_WRITE( '_' );
132        GFX_GOTO( x-1, y );
133        GFX_WRITE( ')' );
134        GFX_WRITE( '_' );
135        GFX_WRITE( '(' );
136        break;
137    case 3:
138        GFX_COLOR( YELLOW );
139        GFX_GOTO( x-1, y-1 );
140        GFX_WRITE( '.' );
141        GFX_WRITE( '_' );
142        GFX_WRITE( ',' );
143        GFX_GOTO( x-1, y );
144        GFX_WRITE( ')' );
145        GFX_WRITE( '_' );
146        GFX_WRITE( '(' );
147        GFX_GOTO( x-1, y+1 );
148        GFX_WRITE( '\'' );
149        GFX_WRITE( ' ' );
150        GFX_WRITE( '`' );
151        break;
152    case 2:
153        GFX_COLOR( YELLOW );
154        GFX_GOTO( x-1, y-1 );
155        GFX_WRITE( '.' );
156        GFX_WRITE( 'v' );
157        GFX_WRITE( ',' );
158        GFX_GOTO( x-1, y );
159        GFX_WRITE( '>' );
160        GFX_WRITE( ' ' );
161        GFX_WRITE( '<' );
162        GFX_GOTO( x-1, y+1 );
163        GFX_WRITE( '\'' );
164        GFX_WRITE( '^' );
165        GFX_WRITE( '`' );
166        break;
167    case 1:
168        GFX_COLOR( WHITE );
169        GFX_GOTO( x-1, y-1 );
170        GFX_WRITE( '.' );
171        GFX_WRITE( ' ' );
172        GFX_WRITE( ',' );
173        GFX_GOTO( x-1, y );
174        GFX_WRITE( ' ' );
175        GFX_WRITE( ' ' );
176        GFX_WRITE( ' ' );
177        GFX_GOTO( x-1, y+1 );
178        GFX_WRITE( '\'' );
179        GFX_WRITE( ' ' );
180        GFX_WRITE( '`' );
181        break;
182    }
183}
184
185static void draw_big_explosion( int x, int y, int frame )
186{
187    GFX_COLOR( YELLOW );
188
189    switch( frame )
190    {
191    default:
192    case 12:
193        GFX_GOTO( x, y );
194        GFX_WRITE( '+' );
195        break;
196    case 11:
197        GFX_GOTO( x, y );
198        GFX_WRITE( 'o' );
199        break;
200    case 10:
201        GFX_GOTO( x, y-1 );
202        GFX_WRITE( '_' );
203        GFX_GOTO( x-1, y );
204        GFX_WRITE( ')' );
205        GFX_WRITE( '_' );
206        GFX_WRITE( '(' );
207        break;
208    case 9:
209        GFX_GOTO( x-1, y-1 );
210        GFX_WRITE( '.' );
211        GFX_WRITE( '_' );
212        GFX_WRITE( ',' );
213        GFX_GOTO( x-1, y );
214        GFX_WRITE( ')' );
215        GFX_WRITE( '_' );
216        GFX_WRITE( '(' );
217        GFX_GOTO( x-1, y+1 );
218        GFX_WRITE( '\'' );
219        GFX_WRITE( ' ' );
220        GFX_WRITE( '`' );
221        break;
222    case 8:
223        GFX_GOTO( x-1, y-1 );
224        GFX_WRITE( '.' );
225        GFX_WRITE( 'v' );
226        GFX_WRITE( ',' );
227        GFX_GOTO( x-1, y );
228        GFX_WRITE( '>' );
229        GFX_WRITE( ' ' );
230        GFX_WRITE( '<' );
231        GFX_GOTO( x-1, y+1 );
232        GFX_WRITE( '\'' );
233        GFX_WRITE( '^' );
234        GFX_WRITE( '`' );
235        break;
236    case 6:
237        GFX_COLOR( RED );
238    case 7:
239    case 5:
240        GFX_GOTO( x-2, y-1 );
241        GFX_WRITE( '_' );
242        GFX_WRITE( '\\' );
243        GFX_WRITE( '~' );
244        GFX_WRITE( '/' );
245        GFX_WRITE( '_' );
246        GFX_GOTO( x-2, y );
247        GFX_WRITE( '>' );
248        GFX_WRITE( ' ' );
249        GFX_WRITE( ' ' );
250        GFX_WRITE( ' ' );
251        GFX_WRITE( '<' );
252        GFX_GOTO( x-2, y+1 );
253        GFX_WRITE( '~' );
254        GFX_WRITE( '/' );
255        GFX_WRITE( '_' );
256        GFX_WRITE( '\\' );
257        GFX_WRITE( '~' );
258        break;
259    case 3:
260        GFX_COLOR( RED );
261    case 4:
262    case 2:
263        GFX_GOTO( x-2, y-1 );
264        GFX_WRITE( '_' );
265        GFX_WRITE( '\\' );
266        GFX_WRITE( ' ' );
267        GFX_WRITE( '/' );
268        GFX_WRITE( '_' );
269        GFX_GOTO( x-2, y );
270        GFX_WRITE( '_' );
271        GFX_WRITE( ' ' );
272        GFX_WRITE( ' ' );
273        GFX_WRITE( ' ' );
274        GFX_WRITE( '_' );
275        GFX_GOTO( x-2, y+1 );
276        GFX_WRITE( ' ' );
277        GFX_WRITE( '/' );
278        GFX_WRITE( ' ' );
279        GFX_WRITE( '\\' );
280        GFX_WRITE( ' ' );
281        break;
282    case 1:
283        GFX_COLOR( WHITE );
284        GFX_GOTO( x-2, y-1 );
285        GFX_WRITE( '.' );
286        GFX_WRITE( ' ' );
287        GFX_WRITE( '\'' );
288        GFX_WRITE( ' ' );
289        GFX_WRITE( ',' );
290        GFX_GOTO( x-2, y );
291        GFX_WRITE( ' ' );
292        GFX_WRITE( ' ' );
293        GFX_WRITE( ' ' );
294        GFX_WRITE( ' ' );
295        GFX_WRITE( ' ' );
296        GFX_GOTO( x-2, y+1 );
297        GFX_WRITE( '\'' );
298        GFX_WRITE( ' ' );
299        GFX_WRITE( '.' );
300        GFX_WRITE( ' ' );
301        GFX_WRITE( '`' );
302        break;
303    }
304}
305
Note: See TracBrowser for help on using the repository browser.