source: libcaca/trunk/src/collide.c @ 23

Last change on this file since 23 was 23, checked in by Sam Hocevar, 20 years ago
  • new weapon: bomb.
  • beam now collides with aliens.
File size: 8.1 KB
Line 
1
2#include <stdlib.h>
3
4#include "common.h"
5
6void collide_weapons_tunnel( game *g, weapons *wp, tunnel *t, explosions *ex )
7{
8    int i, x, y;
9
10    for( i = 0; i < WEAPONS; i++ )
11    {
12        x = wp->x[i] >> 4;
13        y = wp->y[i] >> 4;
14
15        switch( wp->type[i] )
16        {
17            case WEAPON_NONE:
18                break;
19            case WEAPON_SEEKER:
20            case WEAPON_BOMB:
21                if( x <= t->left[y]
22                     || x >= t->right[y] )
23                {
24                    int damage = wp->type[i] == WEAPON_SEEKER ? 1 : 2;
25
26                    add_explosion( g, ex, x, y, 0, 1, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM );
27
28                    if( x <= t->left[y] )
29                    {
30                        t->right[y-2] -= damage - 1;
31                        t->left[y-1] -= damage;
32                        t->left[y] -= damage + 1;
33                        t->left[y+1] -= damage;
34                        t->right[y+2] -= damage - 1;
35                    }
36                    else
37                    {
38                        t->right[y-2] += damage - 1;
39                        t->right[y-1] += damage;
40                        t->right[y] += damage + 1;
41                        t->right[y+1] += damage;
42                        t->right[y+2] += damage - 1;
43                    }
44
45                    wp->type[i] = WEAPON_NONE;
46                }
47                break;
48            case WEAPON_LASER:
49                if( x <= t->left[y+1]
50                     || x >= t->right[y+1] )
51                {
52                    add_explosion( g, ex, x, y+1, 0, 1, EXPLOSION_SMALL );
53
54                    if( x <= t->left[y+1] )
55                    {
56                        t->left[y]--;
57                        t->left[y+1]-=2;
58                        t->left[y+2]--;
59                    }
60                    else
61                    {
62                        t->right[y]++;
63                        t->right[y+1]+=2;
64                        t->right[y+2]++;
65                    }
66
67                    wp->type[i] = WEAPON_NONE;
68                }
69                else if( x <= t->left[y]
70                          || x >= t->right[y] )
71                {
72                    add_explosion( g, ex, x, y, 0, 1, EXPLOSION_SMALL );
73
74                    if( x <= t->left[y] )
75                    {
76                        t->left[y-1]--;
77                        t->left[y]-=2;
78                        t->left[y+1]--;
79                    }
80                    else
81                    {
82                        t->right[y-1]++;
83                        t->right[y]+=2;
84                        t->right[y+1]++;
85                    }
86
87                    wp->type[i] = WEAPON_NONE;
88                }
89                break;
90            case WEAPON_NUKE:
91            case WEAPON_BEAM:
92                /* The nuke and the laser do not break the tunnel */
93                break;
94        }
95    }
96}
97
98void collide_weapons_aliens( game *g, weapons *wp, aliens *al, explosions *ex )
99{
100    int i, j, x, y;
101
102    for( i = 0; i < WEAPONS; i++ )
103    {
104        int ok = 0;
105        int r;
106
107        x = wp->x[i] >> 4;
108        y = wp->y[i] >> 4;
109
110        switch( wp->type[i] )
111        {
112            case WEAPON_NONE:
113                break;
114            case WEAPON_NUKE:
115                /* Big nuke */
116                r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8;
117
118                for( j = 0; j < ALIENS; j++ )
119                {
120                    if( al->type[j] == ALIEN_NONE )
121                    {
122                        continue;
123                    }
124
125                    if( wp->n[i] == 0 /* Nuke destroys _everything_ */ ||
126                        (al->x[j] - x) * (al->x[j] - x)
127                          + 4 * (al->y[j] - y) * (al->y[j] - y)
128                        <= r * r )
129                    {
130                        /* Kill alien, not nuke */
131                        al->type[j] = ALIEN_NONE;
132                        add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
133                        add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
134                    }
135                }
136                break;
137            case WEAPON_BEAM:
138                r = (29 - wp->n[i]) * (29 - wp->n[i]) / 8;
139
140                for( j = 0; j < ALIENS; j++ )
141                {
142                    if( al->type[j] == ALIEN_NONE )
143                    {
144                        continue;
145                    }
146
147                    if( x >= al->x[j] && x <= al->x[j] + 4
148                         && y >= al->y[j] + 2 && y-5-r <= al->y[j] )
149                    {
150                        al->life[j] -= 4;
151                        if( al->life[j] <= 0 )
152                        {
153                            al->type[j] = ALIEN_NONE;
154                            add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
155                            add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
156                        }
157                    }
158                }
159                break;
160
161            case WEAPON_LASER:
162                for( j = 0; j < ALIENS; j++ )
163                {
164                    if( al->type[j] == ALIEN_NONE )
165                    {
166                        continue;
167                    }
168
169                    if( x >= al->x[j] && x <= al->x[j] + 4
170                         && y >= al->y[j] && y <= al->y[j] + 2 )
171                    {
172                        al->life[j]--;
173                        if( al->life[j] <= 0 )
174                        {
175                            al->type[j] = ALIEN_NONE;
176                            add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
177                            add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
178                        }
179                        ok = 1;
180                    }
181                    else if( x >= al->x[j] && x <= al->x[j] + 4
182                              && y+1 >= al->y[j] && y+1 <= al->y[j] + 2 )
183                    {
184                        al->life[j]--;
185                        if( al->life[j] <= 0 )
186                        {
187                            al->type[j] = ALIEN_NONE;
188                            add_explosion( g, ex, al->x[j], al->y[j]+1, 0, 0, EXPLOSION_MEDIUM );
189                            add_bonus( g, g->bo, al->x[j], al->y[j]+1, GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
190                        }
191                        ok = 1;
192                    }
193                }
194
195                if( ok )
196                {
197                    add_explosion( g, ex, x, y+1, 0, 0, EXPLOSION_SMALL );
198                    wp->type[i] = WEAPON_NONE;
199                }
200                break;
201
202            case WEAPON_SEEKER:
203            case WEAPON_BOMB:
204                for( j = 0; j < ALIENS; j++ )
205                {
206                    if( al->type[j] == ALIEN_NONE )
207                    {
208                        continue;
209                    }
210
211                    if( x >= al->x[j] && x <= al->x[j] + 4
212                         && y >= al->y[j] && y <= al->y[j] + 2 )
213                    {
214                        al->life[j]--;
215                        if( al->life[j] <= 0 )
216                        {
217                            al->type[j] = ALIEN_NONE;
218                            add_explosion( g, ex, al->x[j], al->y[j], 0, 0, EXPLOSION_MEDIUM );
219                            add_bonus( g, g->bo, al->x[j], al->y[j], GET_RAND(0,5) ? BONUS_GREEN : BONUS_LIFE );
220                        }
221                        ok = 1;
222                    }
223                }
224
225                if( ok )
226                {
227                    add_explosion( g, ex, x, y+1, 0, 0, wp->type[i] == WEAPON_SEEKER ? EXPLOSION_SMALL : EXPLOSION_MEDIUM );
228                    wp->type[i] = WEAPON_NONE;
229                }
230                break;
231        }
232    }
233}
234
235void collide_player_tunnel( game *g, player *p, tunnel *t, explosions *ex )
236{
237    if( p->x <= t->left[p->y] )
238    {
239        p->x += 2;
240        add_explosion( g, ex, p->x+1, p->y-2, 0, 0, EXPLOSION_SMALL );
241    }
242    else if( p->x + 5 >= t->right[p->y] )
243    {
244        p->x -= 2;
245        add_explosion( g, ex, p->x+4, p->y-2, 0, 0, EXPLOSION_SMALL );
246    }
247}
248
Note: See TracBrowser for help on using the repository browser.