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