1 /*
2  * Copyright (c) 2000 Mark B. Allan. All rights reserved.
3  *
4  * "Chromium B.S.U." is free software; you can redistribute
5  * it and/or use it and/or modify it under the terms of the
6  * "Clarified Artistic License"
7  */
8 
9 #ifdef HAVE_CONFIG_H
10 #include <chromium-bsu-config.h>
11 #endif
12 
13 #include "gettext.h"
14 
15 #include "ScreenItemAdd.h"
16 
17 #include <cstdio>
18 #include <cstdlib>
19 
20 #include "define.h"
21 #include "Global.h"
22 #include "EnemyFleet.h"
23 #include "PowerUps.h"
24 
25 //==============================================================================
ScreenItemAdd()26 ScreenItemAdd::ScreenItemAdd()
27 {
28 	game = Global::getInstance();
29 
30 	root = new ItemThing();
31 
32 	float p[3] = { 0.0, 0.0, 0.0 };
33 	for(int i = 0; i < NumEnemyTypes; i++)
34 	{
35 //		deadPool[i] = new EnemyAircraft((EnemyType)i, p);
36 		deadPool[i] = EnemyAircraft::makeNewEnemy((EnemyType)i, p);
37 		deadPool[i]->next = 0;
38 	}
39 }
40 
~ScreenItemAdd()41 ScreenItemAdd::~ScreenItemAdd()
42 {
43 	clear();
44 	for(int i = 0; i < NumEnemyTypes; i++)
45 	{
46 		delete deadPool[i];
47 		deadPool[i] = NULL;
48 	}
49 	delete root;
50 }
51 
52 //----------------------------------------------------------
clear()53 void ScreenItemAdd::clear()
54 {
55 	ItemThing	*cur;
56 	ItemThing *del;
57 
58 	cur = root->next;
59 	while(cur)
60 	{
61 		delete cur->item;
62 		del = cur;
63 		cur = cur->next;
64 		delete del;
65 	}
66 	root->next = 0;
67 	clearDeadPool();
68 }
69 
70 //----------------------------------------------------------
clearDeadPool()71 void ScreenItemAdd::clearDeadPool()
72 {
73 	EnemyAircraft *cur;
74 	EnemyAircraft *del;
75 	for(int i = 0; i < NumEnemyTypes; i++)
76 	{
77 		cur = deadPool[i]->next;
78 		while(cur)
79 		{
80 			del = cur;
81 			cur = cur->next;
82 			delete del;
83 		}
84 		deadPool[i]->next = 0;
85 	}
86 }
87 
88 //----------------------------------------------------------
putScreenItems()89 void ScreenItemAdd::putScreenItems()
90 {
91 //	ItemThing *delItem = 0;
92 	ItemThing *curItem = root->next;
93 
94 	while(curItem)
95 	{
96 		if(curItem->releaseTime <= game->gameFrame)
97 		{
98 			switch(curItem->item->itemType())
99 			{
100 				case ScreenItem::ItemEnemy:
101 					game->enemyFleet->addEnemy( (EnemyAircraft*)(curItem->item) );
102 					break;
103 				case ScreenItem::ItemPowerUp:
104 					game->powerUps->addPowerUp( (PowerUp*)(curItem->item) );
105 					break;
106 				case ScreenItem::ItemHero:
107 					fprintf(stderr, _("ScreenItemAdd::putScreenItems() Hero??? HUH???\n"));
108 					break;
109 			}
110 			//delItem = curItem;
111 			curItem = curItem->next;
112 			root->next = curItem;
113 		}
114 		else
115 			curItem = 0;
116 	}
117 }
118 
119 //----------------------------------------------------------
killScreenItem(ScreenItem * del)120 void ScreenItemAdd::killScreenItem(ScreenItem *del)
121 {
122 	EnemyAircraft *enemy;
123 	switch(del->itemType())
124 	{
125 		case ScreenItem::ItemEnemy: // add enemy to dead pool
126 			enemy = (EnemyAircraft*)del;
127 			enemy->back = 0;
128 			enemy->next = deadPool[enemy->type]->next;
129 			deadPool[enemy->type]->next = enemy;
130 			break;
131 		default:
132 			delete del;
133 			break;
134 	}
135 }
136 
137 //----------------------------------------------------------
loadScreenItems(const char *)138 bool ScreenItemAdd::loadScreenItems(const char*)
139 {
140 	switch((game->gameLevel-1)%3)
141 	{
142 		case 0:
143 			loadLevel1();
144 			break;
145 		case 1:
146 			loadLevel2();
147 			break;
148 		case 2:
149 			loadLevel3();
150 			break;
151 		case 3:
152 			loadLevel4();
153 			break;
154 		default:
155 			loadLevel1();
156 			break;
157 	}
158 	return true;
159 }
160 
161 //----------------------------------------------------------
addItem(int relTime,ScreenItem * newScreenItem)162 void ScreenItemAdd::addItem(int relTime, ScreenItem *newScreenItem)
163 {
164 	ItemThing *curItem = root;
165 	ItemThing *newItem = new ItemThing(relTime, newScreenItem);
166 
167 	while(curItem)
168 	{
169 		if(curItem->next == 0)
170 		{
171 			curItem->next = newItem;
172 			break;
173 		}
174 		if(relTime < curItem->next->releaseTime)
175 		{
176 			newItem->next = curItem->next;
177 			curItem->next = newItem;
178 			break;
179 		}
180 		curItem = curItem->next;
181 	}
182 }
183 
184 
185 //----------------------------------------------------------
addWave(EnemyWave & ew)186 void ScreenItemAdd::addWave(EnemyWave &ew)
187 {
188 	int		i;
189 	int		interval = 1;
190 	int		iteration = 0;
191 	float	p[3] = { ew.pos[0], ew.pos[1], ew.pos[2] };
192 	int	jitter = (int)(ew.jitter * (2.0-game->gameSkill));
193 	int	period = (int)(ew.period * (2.0-game->gameSkill));
194 
195 	if(jitter >= period)
196 		jitter = period - 1;
197 	for(i = ew.begin; i < ew.end; i++)
198 	{
199 		interval--;
200 		if(interval < 1)
201 		{
202 			switch(ew.formation)
203 			{
204 				case EnemyWave::None:
205 					p[0] = ew.pos[0] + ew.xJitter*SRAND;
206 //					addItem(i, new EnemyAircraft(ew.type, p) );
207 					addItem(i, EnemyAircraft::makeNewEnemy(ew.type, p) );
208 					interval = period + (int)(SRAND*jitter);
209 					break;
210 				case EnemyWave::Arrow:
211 					p[0] = ew.pos[0] + ew.xJitter*iteration;
212 //					addItem(i, new EnemyAircraft(ew.type, p, 0.0) );
213 					addItem(i, EnemyAircraft::makeNewEnemy(ew.type, p, 0.0) );
214 					if(iteration > 0)
215 					{
216 						p[0] = ew.pos[0] - ew.xJitter*iteration;
217 //						addItem(i, new EnemyAircraft(ew.type, p, 0.0) );
218 						addItem(i, EnemyAircraft::makeNewEnemy(ew.type, p, 0.0) );
219 					}
220 					interval = (int)period + (int)(SRAND*jitter);
221 					iteration++;
222 					break;
223 				default:
224 					p[0] = 0.0;
225 //					addItem(i, new EnemyAircraft(ew.type, p, 0.0) );
226 					addItem(i, EnemyAircraft::makeNewEnemy(ew.type, p, 0.0) );
227 					interval = 25;
228 					break;
229 			}
230 		}
231 	}
232 }
233 
234 //----------------------------------------------------------
dynamicEnemyAdd(EnemyType et,float * pos,int relTime)235 EnemyAircraft *ScreenItemAdd::dynamicEnemyAdd(EnemyType et, float *pos, int relTime)
236 {
237 	EnemyAircraft *addEnemy;
238 
239 	if(deadPool[et]->next)
240 	{
241 		addEnemy = deadPool[et]->next;
242 		deadPool[et]->next = addEnemy->next;
243 		addEnemy->init(pos);
244 	}
245 	else
246 	{
247 //		addEnemy = new EnemyAircraft(et, pos);
248 		addEnemy = EnemyAircraft::makeNewEnemy(et, pos);
249 	}
250 
251 	addItem(relTime, addEnemy);
252 
253 	return 	addEnemy;
254 }
255 
256 //----------------------------------------------------------
loadLevelXXX()257 void ScreenItemAdd::loadLevelXXX()
258 {
259 	int i;
260 	int	numIterations = 12000;
261 //	int	numIterations = (int)(11100 * game->gameSkill);
262 //	int	numIterations = (int)(1100 * game->gameSkill);
263 
264 	clearDeadPool();
265 	//-- Enemies
266 	float	r;
267 	float	d;
268 	int		waveDuration = 500;
269 	i = 600;
270 	addStraightWave(1, i, 0.4);
271 	while(i < numIterations-1000)
272 	{
273 		if(i < 1500)
274 			d = (i+250.0)/2000.0;
275 		else
276 			d = 1.0;
277 		r = FRAND;
278 		if      (r < 0.15)	addStraightArrowWave(i, waveDuration, d);
279 		else if (r < 0.25)	addOmniArrowWave(i, waveDuration, d);
280 		else if (r > 0.60)	addStraightWave(i, waveDuration, d);
281 		else				addOmniWave(i, waveDuration, d);
282 
283 		i += waveDuration;
284 		waveDuration = (int)(600.0*game->gameSkill) + (int)(100*SRAND);
285 		i += 50 + (int)(50*FRAND);
286 	}
287 
288 	//-- ray gun enemy starts halfway through...
289 	EnemyWave	rayWave(EnemyRayGun);
290 	rayWave.setXRand(8.0);
291 	rayWave.setFrequency(60, 5);
292 	rayWave.setFrequency(2000, 1000);
293 	rayWave.setInOut(numIterations/2, i-1000);
294 //	rayWave.setInOut(100, i-1000);
295 	addWave(rayWave);
296 
297 	//-- Boss
298 	EnemyWave	bossWave(EnemyBoss00);
299 	bossWave.setInOut(i+75, i+1000);
300 	bossWave.setPos(0.0, 15.0);
301 	bossWave.setXRand(4.0);
302 	bossWave.setFrequency(5000, 0);
303 	addWave(bossWave);
304 
305 	//-- Ammunition and PowerUps
306 	addAmmunition(0, numIterations+9000);
307 	addPowerUps(0, numIterations+9000);
308 }
309 
310 //----------------------------------------------------------
loadLevel1()311 void ScreenItemAdd::loadLevel1()
312 {
313 	loadLevelXXX();
314 
315 //	addStraightArrowWave(051, 800);
316 //	addOmniArrowWave(800, 1400);
317 //	addStraightArrowWave(1400, 2000);
318 //	addOmniArrowWave(2000, 2600);
319 //
320 //
321 //	addAmmunition(0, 10000);
322 //	addAmmunition(0, 10000);
323 //	addPowerUps(0, 10000);
324 //
325 //	//-- Boss
326 //	EnemyWave	bossWave(EnemyBoss00);
327 //	bossWave.setInOut(100, 1000);
328 //	bossWave.setPos(0.0, 15.0);
329 //	bossWave.setXRand(4.0);
330 //	bossWave.setFrequency(5000, 0);
331 //	addWave(bossWave);
332 //
333 //	EnemyWave	tankWave(EnemyTank);
334 //	tankWave.setPos(9.0, 11.0);
335 //	tankWave.setXRand(0.0);
336 //	tankWave.setFrequency(4000, 50);
337 //	tankWave.setInOut(1, 10000);
338 //	addWave(tankWave);
339 //
340 //	tankWave.setPos(-9.0, 11.0);
341 //	tankWave.setXRand(0.0);
342 //	tankWave.setFrequency(4000, 50);
343 //	tankWave.setInOut(2001, 10000);
344 //	addWave(tankWave);
345 //
346 //
347 //	EnemyWave	gnatWave(EnemyGnat);
348 //	gnatWave.setInOut(1, 500);
349 //	gnatWave.setPos(FRAND*4.0, 10.0);
350 //	gnatWave.setFrequency(50, 40);
351 //	gnatWave.setXRand(5.0);
352 //	addWave(gnatWave);
353 //
354 //	addAmmunition(5000);
355 //	addPowerUps(5000);
356 }
357 
358 //----------------------------------------------------------
loadLevel2()359 void ScreenItemAdd::loadLevel2()
360 {
361 	int i;
362 	int	numIterations = 14000;
363 //	int	numIterations = 1400;
364 
365 	clearDeadPool();
366 	//-- Enemies
367 	int		waves = 0;
368 	float	r;
369 	int		waveDuration = 500;
370 	i = 500;
371 	addStraightWave(100, i, 0.4);
372 	while(i < numIterations)
373 	{
374 		r = FRAND;
375 		waves++;
376 
377 		if( waves == 5  || waves == 6  ||
378 			waves == 11 || waves == 12 ||
379 			waves == 15 || waves == 16 )
380 		{
381 			addGnatWave(i, waveDuration, 1.0, false);
382 		}
383 		else if (waves < 5)
384 		{
385 			if     (r < 0.20)	addStraightArrowWave(i, waveDuration);
386 			else if(r < 0.30)	addOmniArrowWave	(i, waveDuration);
387 			else if(r < 0.60)	addOmniWave			(i, waveDuration);
388 			else				addStraightWave		(i, waveDuration);
389 		}
390 		else
391 		{
392 			if     (r < 0.25) 	addGnatWave			(i, waveDuration);
393 			else if(r < 0.35)	addStraightArrowWave(i, waveDuration);
394 			else if(r < 0.50)	addOmniArrowWave	(i, waveDuration);
395 			else if(r < 0.80)	addOmniWave			(i, waveDuration);
396 			else				addStraightWave		(i, waveDuration);
397 		}
398 		i += waveDuration;
399 		waveDuration = (int)(700.0 + 100.0*SRAND);
400 		i += 50 + (int)(50*FRAND);
401 	}
402 	EnemyWave	gnatWave(EnemyGnat);
403 	gnatWave.setInOut(2200, 5000);
404 	gnatWave.setPos(FRAND*4.0, 10.0);
405 	gnatWave.setFrequency(150, 140);
406 	gnatWave.setXRand(5.0);
407 	addWave(gnatWave);
408 
409 //	gnatWave.setInOut(8000, 11000);
410 
411 	//-- Boss
412 	EnemyWave	bossWave(EnemyBoss01);
413 	bossWave.setPos(0.0, 15.0);
414 	bossWave.setXRand(4.0);
415 	bossWave.setFrequency(5000, 0);
416 	bossWave.setInOut(numIterations+700, numIterations+710);
417 	addWave(bossWave);
418 
419 	//-- Ammunition and PowerUps
420 	addAmmunition(0, numIterations+9000);
421 	addPowerUps(0, numIterations+9000);
422 
423 }
424 
425 //----------------------------------------------------------
loadLevel3()426 void ScreenItemAdd::loadLevel3()
427 {
428 	int i;
429 	int	numIterations = 14000;
430 //	int	numIterations = 1400;
431 
432 	clearDeadPool();
433 	//-- Enemies
434 	int		waves = 0;
435 	float	r;
436 	int		waveDuration = 500;
437 	i = 500;
438 	addStraightWave(100, i, 0.5);
439 	while(i < numIterations)
440 	{
441 		r = FRAND;
442 		waves++;
443 
444 		if( waves ==  5 ||
445 			waves == 12 )
446 		{
447 			addGnatWave(i, waveDuration, 0.9, false);
448 		}
449 		else if (	waves ==  6 ||
450 					waves == 11 ||
451 					waves == 15 || waves == 16 )
452 		{
453 			EnemyWave	tankWave(EnemyTank);
454 			tankWave.setPos(0.0, 11.0);
455 			tankWave.setXRand(10.0);
456 			tankWave.setFrequency(700, 100);
457 			tankWave.setInOut(i+50, waveDuration-50);
458 			addWave(tankWave);
459 
460 			addStraightWave		(i, 300);
461 		}
462 		else if (waves < 5)
463 		{
464 			if     (r < 0.20)	addStraightArrowWave(i, waveDuration);
465 			else if(r < 0.30)	addOmniArrowWave	(i, waveDuration);
466 			else if(r < 0.60)	addOmniWave			(i, waveDuration);
467 			else				addStraightWave		(i, waveDuration);
468 		}
469 		else
470 		{
471 			if     (r < 0.25) 	addGnatWave			(i, waveDuration);
472 			else if(r < 0.35)	addStraightArrowWave(i, waveDuration);
473 			else if(r < 0.50)	addOmniArrowWave	(i, waveDuration);
474 			else if(r < 0.80)	addOmniWave			(i, waveDuration);
475 			else				addStraightWave		(i, waveDuration);
476 		}
477 		i += waveDuration;
478 		waveDuration = (int)(700.0 + 100.0*SRAND);
479 		i += 50 + (int)(50*FRAND);
480 	}
481 	EnemyWave	gnatWave(EnemyGnat);
482 	gnatWave.setInOut(3000, 5000);
483 	gnatWave.setPos(FRAND*4.0, 10.0);
484 	gnatWave.setFrequency(150, 140);
485 	gnatWave.setXRand(5.0);
486 	addWave(gnatWave);
487 
488 	gnatWave.setInOut(8000, 11000);
489 	addWave(gnatWave);
490 
491 	//-- give some extra power ups...
492 	addAmmunition(0, 2000, 500, 700, 0);
493 	addAmmunition(10000, 2000, 500, 700, 0);
494 	addPowerUps(3000, 2000, 2500, 2500, 0);
495 	addPowerUps(9500, 2000, 2500, 2500, 0);
496 	addPowerUps(numIterations, 2000, 2500, 2500, 1);
497 
498 	//-- Boss
499 	EnemyWave	bossWave(EnemyBoss01);
500 	bossWave.setPos(0.0, 15.0);
501 	bossWave.setXRand(4.0);
502 	bossWave.setFrequency(5000, 0);
503 	bossWave.setInOut(numIterations+700, numIterations+710);
504 	addWave(bossWave);
505 
506 	EnemyWave	tankWave(EnemyTank);
507 	tankWave.setPos(0.0, 11.0);
508 	tankWave.setXRand(10.0);
509 	tankWave.setFrequency(2000, 200);
510 	tankWave.setInOut(numIterations+400, numIterations+3000);
511 	addWave(tankWave);
512 
513 	//-- Ammunition and PowerUps
514 	addAmmunition(0, numIterations+9000);
515 	addPowerUps(0, numIterations+9000);
516 
517 }
518 
519 //----------------------------------------------------------
loadLevel4()520 void ScreenItemAdd::loadLevel4()
521 {
522 	int i;
523 	int	numIterations = 12000;
524 
525 	clearDeadPool();
526 	//-- Enemies
527 	float	r;
528 	float	d;
529 	int		waveDuration = 500;
530 	i = 600;
531 	addStraightWave(1, i, 0.4);
532 	while(i < numIterations-1000)
533 	{
534 		if(i < 1500)
535 			d = (i+250.0)/2000.0;
536 		else
537 			d = 1.0;
538 		r = FRAND;
539 		if      (r < 0.15)	addStraightArrowWave(i, waveDuration, d);
540 		else if (r < 0.25)	addOmniArrowWave(i, waveDuration, d);
541 		else if (r > 0.60)	addStraightWave(i, waveDuration, d);
542 		else
543 		{
544 			if     (r < 0.25) 	addGnatWave			(i, waveDuration);
545 			else if(r < 0.35)	addStraightArrowWave(i, waveDuration);
546 			else if(r < 0.50)	addOmniArrowWave	(i, waveDuration);
547 			else if(r < 0.80)	addOmniWave			(i, waveDuration);
548 			else				addStraightWave		(i, waveDuration);
549 		}
550 
551 		i += waveDuration;
552 		waveDuration = (int)(600.0*game->gameSkill) + (int)(100*SRAND);
553 		i += 50 + (int)(50*FRAND);
554 	}
555 
556 	EnemyWave	gnatWave(EnemyGnat);
557 	gnatWave.setInOut(3000, 5000);
558 	gnatWave.setPos(FRAND*4.0, 10.0);
559 	gnatWave.setFrequency(150, 140);
560 	gnatWave.setXRand(5.0);
561 	addWave(gnatWave);
562 
563 	gnatWave.setInOut(8000, 11000);
564 	addWave(gnatWave);
565 
566 	//-- ray gun enemy starts halfway through...
567 	EnemyWave	rayWave(EnemyRayGun);
568 	rayWave.setXRand(8.0);
569 	rayWave.setFrequency(60, 5);
570 	rayWave.setFrequency(2000, 1000);
571 	rayWave.setInOut(numIterations/2, i-1000);
572 	addWave(rayWave);
573 
574 	//-- Boss
575 	EnemyWave	bossWave(EnemyBoss00);
576 	bossWave.setInOut(i+75, i+1000);
577 	bossWave.setPos(0.0, 15.0);
578 	bossWave.setXRand(4.0);
579 	bossWave.setFrequency(5000, 0);
580 	addWave(bossWave);
581 
582 	//-- Ammunition and PowerUps
583 	addAmmunition(0, numIterations+9000);
584 	addPowerUps(0, numIterations+9000);
585 }
586 
587 //----------------------------------------------------------
addStraightWave(int o,int duration,float density)588 void ScreenItemAdd::addStraightWave(int o, int duration, float density)
589 {
590 	float freq = 1.0/density;
591 	EnemyWave	straightWave(EnemyStraight);
592 	straightWave.setXRand(8.0);
593 	straightWave.setFrequency((int)(60*freq), 5);
594 	straightWave.setInOut(o, o+duration);
595 	addWave(straightWave);
596 }
597 
598 //----------------------------------------------------------
addOmniWave(int o,int duration,float density)599 void ScreenItemAdd::addOmniWave(int o, int duration, float density)
600 {
601 	float freq = 1.0/density;
602 	EnemyWave	omniWave(EnemyOmni);
603 	omniWave.setXRand(1.0);
604 	omniWave.setFrequency((int)(39*freq), 7);
605 	omniWave.setPos((SRAND*8.0), 9.0);
606 	omniWave.setInOut(o, o+(duration/2)+50);
607 	addWave(omniWave);
608 	omniWave.setPos((SRAND*8.0), 9.0);
609 	omniWave.setInOut(o+(duration/2)-50, o+duration);
610 	addWave(omniWave);
611 
612 	EnemyWave	straightWave(EnemyStraight);
613 	straightWave.setXRand(8.0);
614 	straightWave.setFrequency(200, 50);
615 	straightWave.setInOut(o+100, o+duration);
616 	addWave(straightWave);
617 }
618 
619 //----------------------------------------------------------
addStraightArrowWave(int o,int,float density)620 void ScreenItemAdd::addStraightArrowWave(int o, int /*duration*/, float density)
621 {
622 	float freq = 1.0/density;
623 	float c = SRAND;
624 	EnemyWave	straightArrow(EnemyStraight);
625 	straightArrow.setInOut(o, o+130);
626 	straightArrow.setXRand(0.0);
627 	straightArrow.setPos(c, 10.0);
628 	straightArrow.setFrequency((int)(50*freq), 0);
629 	straightArrow.setXRand(1.6);
630 	straightArrow.setFormation(EnemyWave::Arrow);
631 	addWave(straightArrow);
632 
633 	EnemyWave	omniWave(EnemyOmni);
634 	omniWave.setFrequency((int)(15*freq), 5);
635 	omniWave.setPos(c, 9.0);
636 	omniWave.setXRand(2.0);
637 	omniWave.setInOut(o+220, o+260);
638 	addWave(omniWave);
639 
640 	omniWave.setXRand(3.0);
641 	omniWave.setFrequency((int)(22*freq), 5);
642 	omniWave.setInOut(o+440, o+600);
643 	addWave(omniWave);
644 }
645 
646 //----------------------------------------------------------
addOmniArrowWave(int o,int,float density)647 void ScreenItemAdd::addOmniArrowWave(int o, int /*duration*/, float density)
648 {
649 	float freq = 1.0/density;
650 	float c = SRAND*2.0;
651 
652 	EnemyWave	omniArrow(EnemyOmni);
653 	omniArrow.setFormation(EnemyWave::Arrow);
654 	omniArrow.setPos(c, 10.0);
655 	omniArrow.setFrequency((int)(25*freq), 0);
656 	omniArrow.setXRand(1.0);
657 	omniArrow.setInOut(o+50, o+150);
658 	addWave(omniArrow);
659 
660 	omniArrow.setInOut(o+250, o+320);
661 	addWave(omniArrow);
662 	omniArrow.setInOut(o+300, o+330);
663 	addWave(omniArrow);
664 	omniArrow.setInOut(o+350, o+470);
665 	addWave(omniArrow);
666 
667 	omniArrow.setFrequency(5, 0);
668 	omniArrow.setXRand(1.8);
669 	omniArrow.setInOut(o+550, o+555);
670 	addWave(omniArrow);
671 
672 }
673 
674 //----------------------------------------------------------
addGnatWave(int o,int duration,float density,bool mixed)675 void ScreenItemAdd::addGnatWave(int o, int duration, float density, bool mixed)
676 {
677 	float freq = 1.0/density;
678 	float c = -FRAND*3.0;
679 
680 	if(mixed)
681 	{
682 		EnemyWave	straightArrow(EnemyStraight);
683 		straightArrow.setInOut(o+50, o+duration);
684 		straightArrow.setXRand(0.0);
685 		straightArrow.setPos(c, 10.0);
686 		straightArrow.setFrequency((int)(90*freq), 20);
687 		straightArrow.setXRand(8.0);
688 		if(c > 0.0)
689 		{
690 			addWave(straightArrow);
691 		}
692 		else
693 		{
694 			EnemyWave	omniArrow(EnemyOmni);
695 			omniArrow.setInOut(o+50, o+130);
696 			omniArrow.setPos(c, 10.0);
697 			omniArrow.setFrequency((int)(20*freq), 0);
698 			omniArrow.setXRand(1.1);
699 			addWave(omniArrow);
700 			omniArrow.setInOut(o+320, o+400);
701 			addWave(omniArrow);
702 
703 			straightArrow.setInOut(o+200, o+250);
704 			addWave(straightArrow);
705 		}
706 
707 		EnemyWave	gnatWave(EnemyGnat);
708 	//	gnatWave.setInOut(o, o+(17*game->gameSkill)*(1.0+FRAND*0.2));
709 		gnatWave.setInOut(o, o+(int)((25*game->gameSkill)*(1.0+FRAND*0.2)));
710 		gnatWave.setPos(SRAND*5.0, 10.0);
711 		gnatWave.setFrequency((int)(3*freq), 0);
712 		gnatWave.setXRand(3.0);
713 		addWave(gnatWave);
714 	}
715 	else
716 	{
717 		EnemyWave	gnatWave(EnemyGnat);
718 	//	gnatWave.setInOut(o, o+(17*game->gameSkill)*(1.0+FRAND*0.2));
719 		gnatWave.setPos(-3.0+SRAND*5.0, 10.0);
720 		gnatWave.setFrequency((int)(1*freq), 0);
721 		gnatWave.setXRand(3.0);
722 		gnatWave.setInOut(o, o+35);
723 		addWave(gnatWave);
724 		gnatWave.setPos(SRAND*5.0, 10.0);
725 		gnatWave.setInOut(o+300, o+310);
726 		addWave(gnatWave);
727 		gnatWave.setFrequency((int)(30*freq), 0);
728 		gnatWave.setInOut(o+300, o+400);
729 		addWave(gnatWave);
730 	}
731 }
732 
733 //----------------------------------------------------------
addAmmunition(int o,int duration,int a,int b,int c)734 void ScreenItemAdd::addAmmunition(int o, int duration, int a, int b, int c)
735 {
736 	//-- Ammunition
737 	int		i;
738 #if 0
739 	int		ammoPause00 = 1;
740 	int		ammoPause01 = 1;
741 	int		ammoPause02 = 1;
742 #else
743 	int		ammoPause00 = a + (int)(FRAND*200);
744 	int		ammoPause01 = b +(int)(FRAND*200);
745 	int		ammoPause02 = c +(int)(FRAND*500);
746 #endif
747 	float	skill = 2.0-game->gameSkill;
748 	float	p[3] = {0.0, 9.0, 25.0};
749 
750 	for(i = o; i < o+duration; i++)
751 	{
752 		ammoPause00--;
753 		ammoPause01--;
754 		ammoPause02--;
755 		p[0] = 8.0*SRAND;
756 		if(ammoPause00 < 1)
757 		{
758 			ammoPause00 = (int)(skill * 2000+(int)(SRAND*500));
759 			addItem(i, new PowerUp(PowerUps::HeroAmmo00, p) );
760 		}
761 		else if(ammoPause01 < 1)
762 		{
763 			ammoPause01 = (int)(skill * 2500+(int)(SRAND*1000));
764 			addItem(i, new PowerUp(PowerUps::HeroAmmo01, p) );
765 		}
766 		else if(ammoPause02 < 1)
767 		{
768 			ammoPause02 = (int)(skill*skill * 4000+(int)(SRAND*1000));
769 			addItem(i, new PowerUp(PowerUps::HeroAmmo02, p) );
770 		}
771 	}
772 }
773 
774 
775 //----------------------------------------------------------
addPowerUps(int o,int duration,int a,int b,int c)776 void ScreenItemAdd::addPowerUps(int o, int duration, int a, int b, int c)
777 {
778 	//-- PowerUps
779 	int		i;
780 #if 0
781 	int		pwrPause00 = 1;
782 	int		pwrPause01 = 1;
783 	int		pwrPause02 = 1;
784 #else
785 	int		pwrPause00 = a+(int)(FRAND*500);
786 	int		pwrPause01 = b+(int)(FRAND*500);
787 	int		pwrPause02 = c+(int)(FRAND*1500);
788 #endif
789 	float	p[3] = {0.0, 9.0, 25.0};
790 
791 	for(i = o; i < o+duration; i++)
792 	{
793 		pwrPause00--;
794 		pwrPause01--;
795 		pwrPause02--;
796 		p[0] = 8.0*SRAND;
797 		if(pwrPause00 < 1)
798 		{
799 			pwrPause00 = 2500+(int)(SRAND*700);
800 			addItem(i, new PowerUp(PowerUps::Shields, p) );
801 		}
802 		else if(pwrPause01 < 1)
803 		{
804 			pwrPause01 = 4000+(int)(SRAND*900);
805 			addItem(i, new PowerUp(PowerUps::Repair, p) );
806 		}
807 		else if(pwrPause02 < 1)
808 		{
809 			pwrPause02 = 5000+(int)(SRAND*3000);
810 //			pwrPause02 = 500;
811 			addItem(i, new PowerUp(PowerUps::SuperShields, p) );
812 		}
813 	}
814 }
815 
816 //==============================================================================
ItemThing()817 ItemThing::ItemThing()
818 {
819 	releaseTime = -1;
820 	item = 0;
821 	next = 0;
822 }
ItemThing(int relTime,ScreenItem * newScreenItem)823 ItemThing::ItemThing(int relTime, ScreenItem *newScreenItem)
824 {
825 	releaseTime = relTime;
826 	item = newScreenItem;
827 	next = 0;
828 }
829 
830 
831 //==============================================================================
EnemyWave(EnemyType t)832 EnemyWave::EnemyWave(EnemyType t)
833 {
834 	type	= t;
835 	begin	= 1;
836 	end		= 500;
837 	period	= 60;
838 	jitter	= 10;
839 	formation = None;
840 
841 	pos[0]	= 0.0;
842 	pos[1]	= 10.0;
843 	pos[2]	= 25.0;
844 	xJitter	= 8.0;
845 }
846 
847 
848 
849