1 /* $Id: prize.c,v 1.2 1998/04/30 05:11:58 mrogre Exp $ */
2 /* Copyright (c) 1998 Joe Rumsey (mrogre@mediaone.net) */
3 #include "copyright.h"
4 #include <config.h>
5
6 #include <stdlib.h>
7 #include "Wlib.h"
8 #include "images.h"
9 #include "struct.h"
10 #include "data.h"
11 #include "defs.h"
12 #include "proto.h"
13 #include "sound.h"
14
15 #define PR_SING 0
16 #define PR_DOUB 1
17 #define PR_TRIP 2
18 #define PR_SPEED 3
19 #define PR_SHIELD 4
20 #define PR_SMART 5
21 #define PR_LEMON 6
22 #define PR_EXTRABULLET 7
23
24 #ifdef ENABLE_SPREAD_SHOT
25 #define PR_SPREAD 8
26 #endif
27
28 #ifdef ENABLE_MACHINE_GUN
29 # ifdef ENABLE_SPREAD_SHOT
30 # define PR_MACHINE 9
31 # define NUMPRIZES 10
32 # else
33 # define PR_MACHINE 8
34 # define NUMPRIZES 9
35 # endif /* ENABLE_SPREAD_SHOT */
36 #else
37 # ifdef ENABLE_SPREAD_SHOT
38 # define PR_SPREAD 8
39 # define NUMPRIZES 9
40 # else
41 # define NUMPRIZES 8
42 # endif /* ENABLE_SPREAD_SHOT */
43 #endif /* ENABLE_MACHINE_GUN */
44
45 #define PRIZESPEED 3
46
47 W_Image *prizeImages[NUMPRIZES];
48
49 struct prize {
50 struct prize *next, *prev;
51 int x, y, type, dying;
52 } *first_prize; /* 8-) */
53
init_prizes()54 void init_prizes()
55 {
56 prizeImages[0] = getImage(I_PR_SING);
57 prizeImages[1] = getImage(I_PR_DOUB);
58 prizeImages[2] = getImage(I_PR_TRIP);
59 prizeImages[3] = getImage(I_PR_SPEED);
60 prizeImages[4] = getImage(I_PR_SHIELD);
61 prizeImages[5] = getImage(I_PR_BRAIN);
62 prizeImages[6] = getImage(I_PR_LEMON);
63 prizeImages[7] = getImage(I_PR_EXTRABULLET);
64 #ifdef ENABLE_SPREAD_SHOT
65 prizeImages[8] = getImage(I_PR_SPREAD);
66 #endif
67
68 #ifdef ENABLE_MACHINE_GUN
69 prizeImages[NUMPRIZES - 1] = getImage(I_PR_MACHINE);
70 #endif
71 }
72
new_prize(int x,int y)73 void new_prize(int x, int y)
74 {
75 struct prize *p;
76
77 p = malloc(sizeof(struct prize));
78 p->next = first_prize;
79 p->prev = 0;
80 if(first_prize)
81 first_prize->prev = p;
82 first_prize = p;
83 p->x = x;
84 p->y = y;
85 p->type = random()%NUMPRIZES;
86 p->dying = 0;
87 }
88
undo_prizes()89 void undo_prizes()
90 {
91 struct prize *p = first_prize, *nextp;
92
93 while(p) {
94 nextp = p->next;
95
96 W_CacheClearArea(baseWin,
97 p->x-prizeImages[p->type]->width/2, p->y-prizeImages[p->type]->width/2,
98 prizeImages[p->type]->width+1, prizeImages[p->type]->height);
99 if(p->dying) {
100 if(p->next)
101 p->next->prev = p->prev;
102 if(p->prev)
103 p->prev->next = p->next;
104 if(p == first_prize)
105 first_prize = p->next;
106 free(p);
107 }
108 p = nextp;
109 }
110 }
111
do_prizes()112 void do_prizes()
113 {
114 struct prize *p = first_prize;
115 int i,k, ne;
116 #ifdef SOUND
117 int oldPlaySounds;
118 #endif
119
120 while(p) {
121 if(!paused)
122 p->y+=PRIZESPEED;
123 W_DrawImage(baseWin,
124 p->x-prizeImages[p->type]->width/2, p->y-prizeImages[p->type]->width/2,
125 0, prizeImages[p->type], W_Green);
126
127 if(p->y > (WINHEIGHT-20) && (ABS(p->x - plx) < 15)
128 #ifdef NO_PRIZE_WHILE_DEAD
129 && !pldead
130 #endif
131 ) {
132 p->dying = 1;
133 #ifdef SOUND
134 play_sound(SND_DDLOO);
135 #endif
136 switch(p->type) {
137 case PR_SING:
138 if(weapon == SINGLESHOT)
139 maxtorps++;
140 else
141 weapon = SINGLESHOT;
142 break;
143 case PR_DOUB:
144 if(weapon == DOUBLESHOT)
145 maxtorps++;
146 else {
147 weapon = DOUBLESHOT;
148 if(maxtorps < 4)
149 maxtorps = 4;
150 }
151 break;
152 case PR_TRIP:
153 if(weapon == TRIPLESHOT)
154 maxtorps++;
155 else {
156 weapon = TRIPLESHOT;
157 if(maxtorps < 6)
158 maxtorps=6;
159 }
160 break;
161 case PR_SPEED:
162 if(movespeed < MAXSPEED)
163 movespeed++;
164 break;
165 #ifdef ENABLE_SPREAD_SHOT
166 case PR_SPREAD:
167 if (weapon == SPREADSHOT)
168 maxtorps++;
169 else {
170 weapon = SPREADSHOT;
171 if (maxtorps < 5)
172 maxtorps = 5;
173 }
174 break;
175 #endif /* ENABLE_SPREAD_SHOT */
176 #ifdef ENABLE_MACHINE_GUN
177 case PR_MACHINE:
178 if (weapon == MACHINEGUN)
179 maxtorps++;
180 else {
181 weapon = MACHINEGUN;
182 if (maxtorps < 3)
183 maxtorps = 3;
184 }
185 break;
186 #endif /* ENABLE_MACHINE_GUN */
187 case PR_SHIELD:
188 #ifdef ACTIVATED_SHIELD
189 if (shieldon)
190 plshield += SHIELDTIME;
191 else
192 shieldsleft += SHIELDTIME;
193 if (shieldsleft + plshield > MAXSHIELDS)
194 {
195 if (shieldon)
196 {
197 shieldsleft = 0;
198 plshield = MAXSHIELDS;
199 } else {
200 shieldsleft = MAXSHIELDS;
201 plshield = 0;
202 }
203 }
204 #else
205 plshield = SHIELDTIME;
206 #ifdef SOUND
207 play_sound(SND_SHIELD);
208 #endif /* SOUND */
209 #endif /* ACTIVATED_SHIELD */
210 break;
211 case PR_SMART:
212 #ifdef SOUND
213 play_sound(SND_SMART);
214 oldPlaySounds = playSounds;
215 playSounds = 0;
216 #endif
217 for(i=0;i<MAXALIENS;i++) {
218 if(aliens[i].alive && !aliens[i].dying) {
219 aliens[i].dying = 1;
220 if(i >= 10) {
221 if(aliens[i].dir < 0)
222 score += 50;
223 else {
224 score += (6-(i/10))*100;
225 if(!(random()%(gotlemon ? 3 : PRIZECHANCE)))
226 new_prize(aliens[i].x, aliens[i].y);
227 }
228 new_explosion(aliens[i].x, aliens[i].y, 0);
229 } else {
230 if(aliens[i].dir < 0)
231 score += 200;
232 else {
233 ne=0; /* count how many escorts */
234 for(k = i+9;k < i+12; k++) {
235 if(aliens[k].escorting == i)
236 ne++;
237 }
238 score_flagship(aliens[i].x, aliens[i].y, ne);
239 }
240 new_explosion(aliens[i].x, aliens[i].y, 1);
241 }
242 }
243 }
244 #ifdef SOUND
245 playSounds = oldPlaySounds;
246 #endif
247 break;
248 case PR_LEMON:
249 gotlemon = 1;
250 maxtorps = MINTORPS;
251 weapon = 0;
252 movespeed = MINSPEED;
253 break;
254 case PR_EXTRABULLET:
255 if(maxtorps < MAXTORPS)
256 maxtorps++;
257 break;
258 }
259 if(maxtorps > MAXTORPS)
260 maxtorps = MAXTORPS;
261 } else if(p->y > WINHEIGHT) {
262 p->dying = 1;
263 }
264 p=p->next;
265 }
266 }
267
268