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