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