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 "EnemyAircraft.h"
16
17 #include <cstdio>
18 #include <cstdlib>
19 #include <cmath>
20
21 #include "Config.h"
22
23 #include "define.h"
24 #include "Ammo.h"
25 #include "Global.h"
26 #include "EnemyAmmo.h"
27 #include "HeroAircraft.h"
28 #include "ScreenItemAdd.h"
29
30 #include "EnemyAircraft_Straight.h"
31 #include "EnemyAircraft_Omni.h"
32 #include "EnemyAircraft_RayGun.h"
33 #include "EnemyAircraft_Tank.h"
34 #include "EnemyAircraft_Gnat.h"
35 #include "EnemyAircraft_Boss00.h"
36 #include "EnemyAircraft_Boss01.h"
37
38 int EnemyAircraft::allocated = 0;
39
40 //=================================================================
EnemyAircraft(EnemyType et,float p[3],float randFact)41 EnemyAircraft::EnemyAircraft(EnemyType et, float p[3], float randFact)
42 : ScreenItem(ScreenItem::ItemEnemy)
43 {
44 type = et;
45
46 game = Global::getInstance();
47
48 Config *config = Config::instance();
49
50 EnemyAircraft::init(p, randFact);
51
52 float xBound = config->screenBoundX()-2.0;
53 if(pos[0] < -xBound)
54 pos[0] = -xBound;
55 if(pos[0] > xBound)
56 pos[0] = xBound;
57
58 allocated++;
59 }
60
61 //----------------------------------------------------------
~EnemyAircraft()62 EnemyAircraft::~EnemyAircraft()
63 {
64 allocated--;
65 }
66
67 //----------------------------------------------------------
68 // this is only here to get rid of the IRIX compiler warning...
init()69 void EnemyAircraft::init()
70 {
71 ScreenItem::init();
72 }
73
74 //----------------------------------------------------------
init(float * p,float randFact)75 void EnemyAircraft::init(float *p, float randFact)
76 {
77 ScreenItem::init();
78 over = 0; //-- if this points to another aircraft, this aircraft will be inserted after that
79 // aircraft in the fleet list
80
81 pos[0] = p[0];
82 pos[1] = p[1];
83 pos[2] = p[2];
84
85 shootInterval = 1;
86 shootSwap = 0;
87 randMoveX = randFact*FRAND;
88 lastMoveX = 0.0;
89 lastMoveY = 0.0;
90 preFire = 0.0;
91 target = game->hero;
92
93 next = 0;
94 back = 0;
95
96 secondaryMove[0] = secondaryMove[1] = 0.0;
97
98 shootVec[0] = 0.0;
99 shootVec[1] = -0.2;
100 shootVec[2] = 0.0;
101
102 vel[0] = 0.0;
103 vel[1] = 0.0;
104 vel[2] = 0.0;
105 }
106
107
108 //----------------------------------------------------------
printNumAllocated(void)109 void EnemyAircraft::printNumAllocated(void)
110 {
111 fprintf(stderr, _("%d EnemyAircraft allocated\n"), allocated);
112 }
113
114 //----------------------------------------------------------
makeNewEnemy(EnemyType et,float p[3],float randFact)115 EnemyAircraft* EnemyAircraft::makeNewEnemy(EnemyType et, float p[3], float randFact)
116 {
117 EnemyAircraft *enemy = 0;
118
119 switch(et)
120 {
121 case EnemyStraight:
122 enemy = new EnemyAircraft_Straight(et, p, randFact);
123 break;
124 case EnemyOmni:
125 enemy = new EnemyAircraft_Omni(et, p, randFact);
126 break;
127 case EnemyRayGun:
128 enemy = new EnemyAircraft_RayGun(et, p, randFact);
129 break;
130 case EnemyTank:
131 enemy = new EnemyAircraft_Tank(et, p, randFact);
132 break;
133 case EnemyGnat:
134 enemy = new EnemyAircraft_Gnat(et, p, randFact);
135 break;
136 case EnemyBoss00:
137 enemy = new EnemyAircraft_Boss00(et, p, randFact);
138 break;
139 case EnemyBoss01:
140 enemy = new EnemyAircraft_Boss01(et, p, randFact);
141 break;
142 case NumEnemyTypes:
143 default:
144 enemy = 0;
145 break;
146 }
147 return enemy;
148 }
149
150 ////----------------------------------------------------------
151 //void EnemyAircraft::drawGL(GLuint tex, GLuint xtraTex)
152 //{
153 // float *p = pos;
154 // float szx = size[0];
155 // float szy = size[1];
156 // glBindTexture(GL_TEXTURE_2D, tex);
157 // glColor4f(1.0, 1.0, 1.0, 1.0);
158 //
159 // glPushMatrix();
160 // glTranslatef( p[0], p[1], p[2] );
161 // glBegin(GL_TRIANGLE_STRIP);
162 // glTexCoord2f(1.0, 0.0); glVertex3f( szx, szy, 0.0);
163 // glTexCoord2f(0.0, 0.0); glVertex3f(-szx, szy, 0.0);
164 // glTexCoord2f(1.0, 1.0); glVertex3f( szx, -szy, 0.0);
165 // glTexCoord2f(0.0, 1.0); glVertex3f(-szx, -szy, 0.0);
166 // glEnd();
167 // glPopMatrix();
168 //
169 // switch(type)
170 // {
171 // case EnemyStraight:
172 // if(preFire)
173 // {
174 // glBlendFunc(GL_SRC_ALPHA, GL_ONE);
175 // glBindTexture(GL_TEXTURE_2D, xtraTex);
176 // glColor4f(1.0, 1.0, 1.0, preFire);
177 // szx = 0.55*preFire;
178 // glPushMatrix();
179 // glTranslatef(p[0], p[1]-0.9, p[2]);
180 // glRotatef(IRAND, 0.0, 0.0, 1.0);
181 // drawQuad(szx,szx+0.1);
182 // glPopMatrix();
183 // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
184 // glColor4f(1.0, 1.0, 1.0, 1.0);
185 // }
186 // break;
187 // case EnemyOmni:
188 // glColor4f(1.0, 0.0, 0.0, 1.0);
189 // glBindTexture(GL_TEXTURE_2D, xtraTex);
190 // glPushMatrix();
191 // glTranslatef(p[0], p[1], p[2]);
192 // glRotatef(-(age*8), 0.0, 0.0, 1.0);
193 // drawQuad(szx,szy);
194 // glPopMatrix();
195 // glColor4f(1.0, 1.0, 1.0, 1.0);
196 // break;
197 // case EnemyTank:
198 // if(preFire)
199 // {
200 // glBlendFunc(GL_SRC_ALPHA, GL_ONE);
201 // glBindTexture(GL_TEXTURE_2D, xtraTex);
202 // glColor4f(1.0, 1.0, 1.0, preFire);
203 // glPushMatrix();
204 // glTranslatef(p[0], p[1]-0.63, p[2]);//NOTE: offset is ~szy*0.3
205 // glRotatef(IRAND, 0.0, 0.0, 1.0);
206 // szx = 0.4+0.6*preFire;
207 // drawQuad(szx,szx);
208 // glPopMatrix();
209 // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
210 // glColor4f(1.0, 1.0, 1.0, 1.0);
211 // }
212 // break;
213 // case EnemyBoss00:
214 // if(preFire)
215 // {
216 // glBlendFunc(GL_SRC_ALPHA, GL_ONE);
217 // glBindTexture(GL_TEXTURE_2D, xtraTex);
218 // glColor4f(1.0, 1.0, 1.0, preFire);
219 // szx = 0.4+0.6*preFire;
220 // glPushMatrix();
221 // glTranslatef(p[0]+1.1, p[1]-0.4, p[2]);
222 // glRotatef(IRAND, 0.0, 0.0, 1.0);
223 // drawQuad(szx,szx);
224 // glPopMatrix();
225 // glPushMatrix();
226 // glTranslatef(p[0]-1.1, p[1]-0.4, p[2]);
227 // glRotatef(IRAND, 0.0, 0.0, 1.0);
228 // drawQuad(szx,szx);
229 // glPopMatrix();
230 // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
231 // glColor4f(1.0, 1.0, 1.0, 1.0);
232 // }
233 // break;
234 // case EnemyBoss01:
235 // if(preFire)
236 // {
237 // glBlendFunc(GL_SRC_ALPHA, GL_ONE);
238 // glBindTexture(GL_TEXTURE_2D, xtraTex);
239 // glColor4f(1.0, 1.0, 1.0, preFire);
240 // szx = 0.9*preFire;
241 // if(shootSwap)
242 // {
243 // glPushMatrix();
244 // glTranslatef(p[0]-1.22, p[1]-1.22, p[2]);
245 // glRotatef(IRAND, 0.0, 0.0, 1.0);
246 // drawQuad(szx,szx);
247 // drawQuad(szx+0.2,szx+0.2);
248 // glPopMatrix();
249 // }
250 // else
251 // {
252 // glPushMatrix();
253 // glTranslatef(p[0]+0.55, p[1]-1.7, p[2]);
254 // glRotatef(IRAND, 0.0, 0.0, 1.0);
255 // drawQuad(szx,szx);
256 // drawQuad(szx+0.3,szx+0.3);
257 // glPopMatrix();
258 // }
259 // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
260 // glColor4f(1.0, 1.0, 1.0, 1.0);
261 // }
262 // break;
263 // default:
264 // break;
265 // }
266 //}
267 //
268 //----------------------------------------------------------
checkHit(ActiveAmmo * ammo)269 bool EnemyAircraft::checkHit(ActiveAmmo *ammo)
270 {
271 bool retVal = false;
272 if( ammo->pos[1] > pos[1]-size[1] )
273 {
274 if( (ammo->pos[1] < pos[1]+size[1]) &&
275 (ammo->pos[0] > pos[0]-size[0]) &&
276 (ammo->pos[0] < pos[0]+size[0]) )
277 {
278 retVal = true;
279 }
280 }
281 return retVal;
282 }
283
284 //----------------------------------------------------------
calcShootInterval()285 void EnemyAircraft::calcShootInterval()
286 {
287 shootInterval = 1;
288 }
289
290 //----------------------------------------------------------
291 //void EnemyAircraft::init(float *p, float randFact)
292 //{
293 // ScreenItem::init();
294 // over = 0; //-- if this points to another aircraft, this aircraft will be inserted after that
295 // // aircraft in the fleet list
296 //
297 // pos[0] = p[0];
298 // pos[1] = p[1];
299 // pos[2] = p[2];
300 //
301 // shootInterval = 1;
302 // shootSwap = 0;
303 // randMoveX = randFact*FRAND;
304 // lastMoveX = 0.0;
305 // lastMoveY = 0.0;
306 // preFire = 0.0;
307 // target = game->hero;
308 //
309 // next = 0;
310 // back = 0;
311 //
312 // secondaryMove[0] = secondaryMove[1] = 0.0;
313 //
314 // shootVec[0] = 0.0;
315 // shootVec[1] = -0.2;
316 // shootVec[2] = 0.0;
317 //
318 // vel[0] = 0.0;
319 // vel[1] = 0.0;
320 // vel[2] = 0.0;
321 //
322 // float frand = FRAND*randFact;
323 // switch(type)
324 // {
325 // case EnemyStraight:
326 // damage = baseDamage = -110.0*game->gameSkill;
327 // size[0] = 0.75;
328 // size[1] = 1.02;
329 // collisionMove = 0.5;
330 // vel[1] = -0.046-frand*0.04;
331 // break;
332 // case EnemyOmni:
333 // damage = baseDamage = -45.0;
334 // size[0] = 0.7;
335 // size[1] = 0.7;
336 // collisionMove = 0.7;
337 // vel[1] = -0.071-frand*0.04;
338 //// vel[1] = -0.021-frand*0.04;
339 // break;
340 // case EnemyRayGun:
341 // damage = baseDamage = -1000.0*game->gameSkill;
342 // size[0] = 1.2;
343 // size[1] = 1.2;
344 // collisionMove = 0.2;
345 // vel[1] = 0.03;
346 // randMoveX = 0.5+0.5*randMoveX;
347 // break;
348 // case EnemyTank:
349 // damage = baseDamage = -2000.0*game->gameSkill;
350 // size[0] = 1.9;
351 // size[1] = 2.1;
352 // collisionMove = 0.1;
353 // vel[1] = 0.03;
354 // break;
355 // case EnemyGnat:
356 // damage = baseDamage = -10.0;
357 // size[0] = 0.45;
358 // size[1] = 0.45;
359 // collisionMove = 0.0;
360 // randMoveX = 0.5+0.5*randMoveX;
361 // vel[0] = 0.2;
362 // vel[1] = 0.1;
363 // break;
364 // case EnemyBoss00:
365 // damage = baseDamage = -10000.0*game->gameSkill;
366 //// damage = baseDamage = -8.0*game->gameSkill;
367 // size[0] = 3.5;
368 // size[1] = 2.275;
369 // collisionMove = 0.05;
370 // vel[1] = 0.02;
371 // break;
372 // case EnemyBoss01:
373 // damage = baseDamage = -10000.0*game->gameSkill;
374 //// damage = baseDamage = -8.0*game->gameSkill;
375 // size[0] = 2.6;
376 // size[1] = 2.3;
377 // collisionMove = 0.1;
378 // vel[1] = 0.02;
379 // age = 600;
380 // break;
381 // case NumEnemyTypes:
382 // break;
383 // }
384 //}
385 //
386 ////-- NOTE: Many of the firing rates are not adjusted by game->speedAdj
387 ////-- so they will not be totally correct. Should be close enough for jazz, though.
388 ////----------------------------------------------------------
389 //void EnemyAircraft::update()
390 //{
391 // Config *config = Config::instance();
392 // EnemyAircraft *tmpAircraft = 0;
393 // float v[3] = { 0.0, -0.2, 0.0 };
394 //// float *hpos = target->getPos();
395 // float *hpos = game->hero->getPos();
396 // float a = hpos[0]-pos[0];
397 // float b = hpos[1]-pos[1];
398 // float dist;
399 // float ammoSpeed = 0.35*game->speedAdj;
400 //
401 // int omniSwap = 108;
402 // int tmpInt;
403 // //-- update age
404 // age++;
405 // shootInterval--;
406 //
407 // pos[0] += secondaryMove[0]*game->speedAdj;
408 // pos[1] += secondaryMove[1]*game->speedAdj;
409 // float s = (1.0-game->speedAdj)+(game->speedAdj*0.7);
410 // secondaryMove[0] *= s;
411 // secondaryMove[1] *= s;
412 // move();
413 //
414 // float p[3] = { pos[0], pos[1], pos[2] };
415 // switch(type)
416 // {
417 // //------------------------------- Straight
418 // case EnemyStraight:
419 // if(shootInterval < 10)
420 // preFire = (10-shootInterval)/10.0;
421 // else
422 // preFire = 0.0;
423 // if(!shootInterval)
424 // {
425 // calcShootInterval();
426 // p[1] -= 0.9;
427 // game->enemyAmmo->addAmmo(0, p, shootVec);
428 // }
429 // break;
430 // //------------------------------- Omni
431 // case EnemyOmni:
432 // shootSwap = shootSwap%omniSwap;
433 // if(shootSwap < 18)
434 // {
435 // if(!(shootSwap%6))
436 // {
437 // //ammoSpeed = 0.22;
438 // ammoSpeed = 0.3*game->gameSkill*game->speedAdj;
439 // dist = fabs(a) + fabs(b);
440 // //dist = sqrt(a*a+b*b);
441 // v[0] = a/dist;
442 // v[1] = b/dist;
443 //
444 // shootVec[0] = ammoSpeed*v[0];
445 // shootVec[1] = ammoSpeed*v[1]/*+vel[1]*/;
446 // }
447 // game->enemyAmmo->addAmmo(1, p, shootVec);
448 // }
449 // if(pos[1] < config->screenBoundY())
450 // shootSwap++;
451 // break;
452 // //------------------------------- Ray Gun
453 // case EnemyRayGun:
454 // if(fabs(a) < 1.5) //-- big center gun
455 // {
456 // v[1] = -0.6;
457 // p[1] = pos[1]-0.5;
458 // game->enemyAmmo->addAmmo(3, p, v);
459 // }
460 // break;
461 // //------------------------------- Tank
462 // case EnemyTank:
463 // p[1] = pos[1] - 1.7;
464 // if(fabs(a) < 4.0)
465 // {
466 // if(shootSwap == 0 || shootSwap == 8 || shootSwap == 16 )
467 // {
468 // v[1] = -0.2;
469 // p[0] = pos[0] + 1.5;
470 // game->enemyAmmo->addAmmo(0, p, v);
471 // p[0] = pos[0] - 1.5;
472 // game->enemyAmmo->addAmmo(0, p, v);
473 // }
474 // shootSwap = ++shootSwap%100;
475 // }
476 //// else
477 //// shootSwap = 0;
478 //
479 // if(!((tmpInt = age/200)%2)) //-- omni shooters
480 // {
481 // tmpInt = age%200;
482 // if(tmpInt < 100)
483 // {
484 // preFire = (float)tmpInt/100.0f;
485 // }
486 // else if(tmpInt < 170)
487 // {
488 // if(!(age%10))
489 // {
490 // p[1] = pos[1]-0.45;
491 // b = hpos[1]-p[1];
492 //
493 // p[0] = pos[0];
494 // a = hpos[0]-p[0];
495 // dist = fabs(a) + fabs(b);
496 // shootVec[0] = 2.0*ammoSpeed*a/dist;
497 // shootVec[1] = 2.0*ammoSpeed*b/dist;
498 // secondaryMove[0] -= shootVec[0]*0.1;
499 // secondaryMove[1] -= shootVec[1]*0.1;
500 // game->enemyAmmo->addAmmo(2, p, shootVec);
501 // preFire -= 0.4;
502 // if(preFire < 0.0)
503 // preFire = 0.0;
504 // }
505 // else
506 // preFire += 0.035;
507 // }
508 // else
509 // preFire = 0.0;
510 // }
511 // break;
512 // //------------------------------- Gnat
513 // case EnemyGnat:
514 // if(!shootInterval)
515 // {
516 // calcShootInterval();
517 // if(fabs(a) < 2.0 && b < 0.0) //--
518 // {
519 // v[1] = -0.39;
520 // p[1] = pos[1]-0.5;
521 // game->enemyAmmo->addAmmo(4, p, v);
522 // }
523 // }
524 // break;
525 // //------------------------------- Boss 0
526 // case EnemyBoss00:
527 // if(fabs(a) < 1.6) //-- big center gun
528 // {
529 // v[1] = -0.6;
530 // p[1] = pos[1]-1.7;
531 // game->enemyAmmo->addAmmo(3, p, v);
532 // }
533 // if(!(age%5)) //-- side cannons
534 // {
535 // shootSwap = ++shootSwap%15;
536 // if(shootSwap < 6)
537 // {
538 // v[1] = -0.2;
539 // p[1] = pos[1]-1.9;
540 // p[0] = pos[0]+2.0+((shootSwap%3)*0.4);
541 // game->enemyAmmo->addAmmo(0, p, v);
542 // p[0] = pos[0]-2.0-((shootSwap%3)*0.4);
543 // game->enemyAmmo->addAmmo(0, p, v);
544 // }
545 // }
546 // if(!((age-1)%7))
547 // {
548 // dist = fabs(a) + fabs(b);
549 // shootVec[0] = ammoSpeed*a/dist;
550 // shootVec[1] = ammoSpeed*b/dist;
551 // }
552 // if(!((age/200)%2)) //-- omni shooters
553 // {
554 // if(!((age/100)%2))
555 // {
556 // if(!((age/50)%2))
557 // {
558 // p[1] = pos[1]-0.45;
559 // p[0] = pos[0]-1.1;
560 // game->enemyAmmo->addAmmo(1, p, shootVec);
561 // p[0] = pos[0]+1.1;
562 // game->enemyAmmo->addAmmo(1, p, shootVec);
563 // }
564 // preFire = (age%100)/100.0f;
565 // }
566 // else if(!(age%10))
567 // {
568 // p[1] = pos[1]-0.45;
569 // b = hpos[1]-p[1];
570 //
571 // p[0] = pos[0]-1.1;
572 // a = hpos[0]-p[0];
573 // dist = fabs(a) + fabs(b);
574 // shootVec[0] = 2.0*ammoSpeed*a/dist;
575 // shootVec[1] = 2.0*ammoSpeed*b/dist;
576 // game->enemyAmmo->addAmmo(2, p, shootVec);
577 // p[0] = pos[0]+1.1;
578 // a = hpos[0]-p[0];
579 // dist = fabs(a) + fabs(b);
580 // shootVec[0] = 2.0*ammoSpeed*a/dist;
581 // shootVec[1] = 2.0*ammoSpeed*b/dist;
582 // game->enemyAmmo->addAmmo(2, p, shootVec);
583 // preFire -= 0.4;
584 // if(preFire < 0.0)
585 // preFire = 0.0;
586 // }
587 // else
588 // preFire += 0.035;
589 // }
590 // else
591 // preFire = 0.0;
592 // break;
593 // //------------------------------- Boss 1
594 // case EnemyBoss01:
595 // if(fabs(a) < 5.0)
596 // {
597 // shootVec[1] = -0.65;
598 // preFire = (age%6)/6.0;
599 // if( !(age%6) )
600 // {
601 // shootSwap = !shootSwap;
602 // if(shootSwap)
603 // {
604 // p[0] = pos[0]+0.55;
605 // p[1] = pos[1]-1.7;
606 // game->enemyAmmo->addAmmo(0, p, shootVec);
607 // p[1] += 0.5;
608 // game->enemyAmmo->addAmmo(0, p, shootVec);
609 // }
610 // else
611 // {
612 // p[0] = pos[0]-1.22;
613 // p[1] = pos[1]-1.22;
614 // game->enemyAmmo->addAmmo(0, p, shootVec);
615 // p[1] += 0.5;
616 // game->enemyAmmo->addAmmo(0, p, shootVec);
617 // }
618 // }
619 // }
620 // else
621 // {
622 // if(preFire > 0.0) preFire -= 0.05;
623 // else preFire = 0.0;
624 // }
625 // //-- add Gnats
626 // if( !((age/512)%2) )
627 // {
628 // if( !((age/64)%2) && !(age%5) )
629 // {
630 // p[0] += 1.7;
631 // p[1] += 1.2;
632 // tmpAircraft = game->itemAdd->dynamicEnemyAdd(EnemyGnat, p, game->gameFrame+2);
633 // tmpAircraft->over = this;
634 // tmpAircraft->setTarget(this);
635 // }
636 // }
637 // break;
638 // case NumEnemyTypes:
639 // break;
640 // }
641 //}
642 //
643 ////----------------------------------------------------------
644 //void EnemyAircraft::calcShootInterval()
645 //{
646 // switch(type)
647 // {
648 // case EnemyStraight:
649 // shootInterval = (int)((30.0 + FRAND*90.0)/game->speedAdj);
650 // break;
651 // case EnemyOmni:
652 // shootInterval = 1;
653 // break;
654 // case EnemyRayGun:
655 // shootInterval = 1;
656 // break;
657 // case EnemyTank:
658 // shootInterval = 1;
659 // break;
660 // case EnemyGnat:
661 // shootInterval = (int)((1.0 + FRAND*5.0)/game->speedAdj);
662 // break;
663 // case EnemyBoss00:
664 // shootInterval = 1;
665 // break;
666 // case EnemyBoss01:
667 // shootInterval = 1;
668 // break;
669 // case NumEnemyTypes:
670 // break;
671 // }
672 //}
673 //
674 ////----------------------------------------------------------
675 //void EnemyAircraft::move()
676 //{
677 // Config *config = Config::instance();
678 // float *hpos;
679 // if(target)
680 // hpos = target->getPos();
681 // else
682 // hpos = pos;
683 // float diff[2] = { hpos[0]-pos[0], hpos[1]-pos[1] };
684 // float tmp = 0.0;
685 // float tmpd = 0.0;
686 // float tmps = 0.0;
687 // float randX;
688 // float v0,v1;
689 // float x,y,tmpX,tmpY,speed;
690 // float dist;
691 // float approachDist;
692 // switch(type)
693 // {
694 // case EnemyStraight:
695 // pos[1] += (game->speedAdj*(vel[1] * game->gameSkill));
696 // break;
697 // case EnemyOmni:
698 // lastMoveX = (0.9*lastMoveX)+(0.1*(0.01*diff[0]));
699 // pos[0] += game->speedAdj*(randMoveX*lastMoveX);
700 // pos[1] += (game->speedAdj*(vel[1] * game->gameSkill));
701 // break;
702 // case EnemyRayGun:
703 // if( (tmpd = fabs(diff[0])) < 3.0)
704 // tmps = ((3.0-tmpd)/3.0)*(0.1*sin(age*0.25));
705 // if(fabs(diff[1]) < 7.0)
706 // diff[1] *= 0.1;
707 // lastMoveX = (0.975*lastMoveX)+(0.0020*diff[0]);
708 // lastMoveY = (0.90*lastMoveY)+(0.001*diff[1]);
709 // pos[0] += game->speedAdj*(randMoveX*lastMoveX * (game->gameSkill+0.1) + tmps);
710 // pos[1] += game->speedAdj*(lastMoveY+vel[1] * (game->gameSkill+0.1));
711 // break;
712 // case EnemyTank:
713 // if(fabs(diff[0]) > 8.0)
714 // v1 = 0.04;
715 // else
716 // {
717 // v1 = 0.04*(fabs(diff[0])/8.0);
718 // }
719 // vel[1] = 0.99*vel[1] + 0.01*v1;
720 //
721 // if(pos[1] < -3.0)
722 // vel[1] = -0.1;
723 // else if(pos[1] < 0.0)
724 // vel[1] *= 0.99;
725 //
726 // if(pos[0] < 0.0)
727 // pos[0] = game->speedAdj*(0.998*pos[0] + 0.002*(-config->screenBoundX()+2.85));
728 // else
729 // pos[0] = game->speedAdj*(0.998*pos[0] + 0.002*( config->screenBoundX()-2.85));
730 // switch((age/50)%8)
731 // {
732 // case 2:
733 // pos[1] += game->speedAdj*(0.05);
734 // break;
735 // default:
736 // pos[1] -= game->speedAdj*(vel[1]);
737 // break;
738 // }
739 // break;
740 // case EnemyGnat:
741 // if(target == game->hero)
742 // randX = randMoveX;
743 // else
744 // randX = 0.75+FRAND*0.15;
745 // tmps = 3.8;
746 // dist = sqrt(diff[0]*diff[0]+diff[1]*diff[1])*randX;
747 //// dist = fabs(diff[0])+fabs(diff[1])*randX;
748 // tmpd = 0.4+0.6*((dist+0.2*sin(age*0.001))/tmps);
749 // speed = tmpd*0.25*randX;
750 // tmp = (diff[0]/dist);
751 // x = speed*tmp;//*(1.0+tmp);
752 // tmp = (diff[1]/dist);
753 // y = speed*tmp;
754 // if(dist < tmps)
755 // {
756 // tmpX = x;
757 // tmpY = y;
758 // x = tmpd*tmpX + -(1.0-tmpd)*diff[1]/tmpd;
759 // y = tmpd*tmpY + (1.0-tmpd)*diff[0]/tmpd;
760 // y += 0.01*sin(game->gameFrame*0.001);
761 // }
762 // else
763 // {
764 // tmpd = .97;
765 // tmpX = x;
766 // tmpY = y;
767 // if(randX < 0.65)
768 // {
769 // x = tmpd*tmpX + (1.0-tmpd)*diff[1]/tmpd;
770 // y = tmpd*tmpY + -(1.0-tmpd)*diff[0]/tmpd;
771 // }
772 // else
773 // {
774 // x = tmpd*tmpX + -(1.0-tmpd)*diff[1]/tmpd;
775 // y = tmpd*tmpY + (1.0-tmpd)*diff[0]/tmpd;
776 // }
777 // }
778 //
779 // tmp = randX*0.2;
780 // if( (age/8)%2 )
781 // v0 = vel[0]*(0.85-tmp) + (0.2+tmp)*(randX-0.2)*x;
782 // else
783 // v0 = vel[0];
784 // v1 = vel[1]*(0.85-tmp) + (0.2+tmp)*(randX-0.2)*y;
785 //
786 // if(age < 50)
787 // {
788 // float amt;
789 // if(age > 20) amt = (age-20)/30.0;
790 // else amt = 0.0;
791 // vel[0] = (1.0-amt)*vel[0] + amt*v0;
792 // vel[1] = (1.0-amt)*vel[1] + amt*v1;
793 // }
794 // else
795 // {
796 // vel[0] = v0;
797 // vel[1] = v1;
798 // }
799 //
800 // pos[0] += game->speedAdj*vel[0];
801 // pos[1] += game->speedAdj*vel[1];
802 //
803 // if(pos[1] < -10.0)
804 // pos[1] = -10.0;
805 // break;
806 // case EnemyBoss00:
807 // approachDist = 7.0*(2.0-game->gameSkill);
808 // if(fabs(diff[1]) < (approachDist+0.0*sin(game->frame*0.05)) )
809 // {
810 // diff[1] = diff[1] * diff[1]/approachDist;
811 // }
812 // diff[0] += 5.0*sin(age*0.1);
813 // lastMoveX = (0.98*lastMoveX)+(0.0005*game->gameSkill*diff[0]);
814 // lastMoveY = (0.90*lastMoveY)+(0.001*game->gameSkill*diff[1]);
815 // pos[0] += game->speedAdj*(lastMoveX);
816 // pos[1] += game->speedAdj*(lastMoveY+vel[1]);
817 // break;
818 // case EnemyBoss01:
819 // if( (((age+25)/512)%2) )
820 // approachDist = 9.0*(2.0-game->gameSkill);
821 // else
822 // approachDist = 12.0*(2.0-game->gameSkill);
823 //
824 // if(fabs(diff[1]) < (approachDist+2.0*sin(game->frame*0.05)) )
825 // diff[1] = diff[1] * diff[1]/approachDist;
826 // diff[0] += 5.0*sin(age*0.1);
827 //
828 // if( ((age/512)%2) )
829 // {
830 // lastMoveX = (0.98*lastMoveX)+(0.0010*game->gameSkill*diff[0]);
831 // lastMoveY = (0.90*lastMoveY)+(0.0020*game->gameSkill*diff[1]);
832 // }
833 // else //-- release gnats
834 // {
835 // lastMoveX = (0.90*lastMoveX)+(0.0003*game->gameSkill*diff[0]);
836 // lastMoveY = (0.90*lastMoveY)+(0.0010*game->gameSkill*diff[1]);
837 // }
838 // pos[0] += game->speedAdj*(lastMoveX);
839 // pos[1] += game->speedAdj*(lastMoveY+vel[1]);
840 // break;
841 // default:
842 // pos[1] -= game->speedAdj*0.02;
843 // break;
844 // }
845 // if(pos[0] < -config->screenBoundX())
846 // pos[0] = -config->screenBoundX();
847 // if(pos[0] > config->screenBoundX())
848 // pos[0] = config->screenBoundX();
849 //}
850 //
851