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 #include "EnemyAircraft_Boss00.h"
9 
10 #include <cstdio>
11 #include <cstdlib>
12 #include <cmath>
13 
14 #include "Config.h"
15 
16 #include "define.h"
17 #include "Ammo.h"
18 #include "Global.h"
19 #include "EnemyAmmo.h"
20 #include "HeroAircraft.h"
21 #include "ScreenItemAdd.h"
22 
23 //=================================================================
EnemyAircraft_Boss00(EnemyType et,float p[3],float randFact)24 EnemyAircraft_Boss00::EnemyAircraft_Boss00(EnemyType et, float p[3], float randFact)
25 	: EnemyAircraft(et, p, randFact)
26 {
27 	init(p, randFact);
28 }
29 
30 //----------------------------------------------------------
~EnemyAircraft_Boss00()31 EnemyAircraft_Boss00::~EnemyAircraft_Boss00()
32 {
33 }
34 
35 //----------------------------------------------------------
36 // this is only here to get rid of the IRIX compiler warning...
init()37 void EnemyAircraft_Boss00::init()
38 {
39 	EnemyAircraft::init();
40 }
41 
42 //----------------------------------------------------------
init(float * p,float randFact)43 void EnemyAircraft_Boss00::init(float *p, float randFact)
44 {
45 	EnemyAircraft::init(p, randFact);
46 
47 	damage = baseDamage = -10000.0*game->gameSkill;
48 	size[0] = 3.5;
49 	size[1] = 2.275;
50 	collisionMove = 0.05;
51 	vel[1] = 0.02;
52 }
53 
54 //-- NOTE: Many of the firing rates are not adjusted by game->speedAdj
55 //-- so they will not be totally correct. Should be close enough for jazz, though.
56 //----------------------------------------------------------
update()57 void EnemyAircraft_Boss00::update()
58 {
59 	float	v[3] = { 0.0, -0.2, 0.0 };
60 //	float	*hpos = target->getPos();
61 	float	*hpos = game->hero->getPos();
62 	float	a = hpos[0]-pos[0];
63 	float	b = hpos[1]-pos[1];
64 	float	dist;
65 	float	ammoSpeed = 0.35*game->speedAdj;
66 
67 	//-- update age
68 	age++;
69 	shootInterval--;
70 
71 	pos[0] += secondaryMove[0]*game->speedAdj;
72 	pos[1] += secondaryMove[1]*game->speedAdj;
73 	float s = (1.0-game->speedAdj)+(game->speedAdj*0.7);
74 	secondaryMove[0] *= s;
75 	secondaryMove[1] *= s;
76 	move();
77 
78 	float	p[3] = { pos[0], pos[1], pos[2] };
79 
80 	if(fabs(a) < 1.6) //-- big center gun
81 	{
82 		v[1] = -0.6;
83 		p[1] = pos[1]-1.7;
84 		game->enemyAmmo->addAmmo(3, p, v);
85 	}
86 	if(!(age%5)) //-- side cannons
87 	{
88 		shootSwap++;
89 		shootSwap %= 15;
90 		if(shootSwap < 6)
91 		{
92 			v[1] = -0.2;
93 			p[1] = pos[1]-1.9;
94 			p[0] = pos[0]+2.0+((shootSwap%3)*0.4);
95 			game->enemyAmmo->addAmmo(0, p, v);
96 			p[0] = pos[0]-2.0-((shootSwap%3)*0.4);
97 			game->enemyAmmo->addAmmo(0, p, v);
98 		}
99 	}
100 	if(!((age-1)%7))
101 	{
102 		dist = fabs(a) + fabs(b);
103 		shootVec[0] = ammoSpeed*a/dist;
104 		shootVec[1] = ammoSpeed*b/dist;
105 	}
106 	if(!((age/200)%2)) //-- omni shooters
107 	{
108 		if(!((age/100)%2))
109 		{
110 			if(!((age/50)%2))
111 			{
112 				p[1] = pos[1]-0.45;
113 				p[0] = pos[0]-1.1;
114 				game->enemyAmmo->addAmmo(1, p, shootVec);
115 				p[0] = pos[0]+1.1;
116 				game->enemyAmmo->addAmmo(1, p, shootVec);
117 			}
118 			preFire = (age%100)/100.0f;
119 		}
120 		else if(!(age%10))
121 		{
122 			p[1] = pos[1]-0.45;
123 			b = hpos[1]-p[1];
124 
125 			p[0] = pos[0]-1.1;
126 			a = hpos[0]-p[0];
127 			dist = fabs(a) + fabs(b);
128 			shootVec[0] = 2.0*ammoSpeed*a/dist;
129 			shootVec[1] = 2.0*ammoSpeed*b/dist;
130 			game->enemyAmmo->addAmmo(2, p, shootVec);
131 			p[0] = pos[0]+1.1;
132 			a = hpos[0]-p[0];
133 			dist = fabs(a) + fabs(b);
134 			shootVec[0] = 2.0*ammoSpeed*a/dist;
135 			shootVec[1] = 2.0*ammoSpeed*b/dist;
136 			game->enemyAmmo->addAmmo(2, p, shootVec);
137 			preFire -= 0.4;
138 			if(preFire < 0.0)
139 				preFire = 0.0;
140 		}
141 		else
142 			preFire += 0.035;
143 	}
144 	else
145 		preFire = 0.0;
146 }
147 
148 //----------------------------------------------------------
move()149 void EnemyAircraft_Boss00::move()
150 {
151 	Config *config = Config::instance();
152 	float	*hpos;
153 	if(target)
154 		hpos = target->getPos();
155 	else
156 		hpos = pos;
157 	float	diff[2] = { hpos[0]-pos[0], hpos[1]-pos[1] };
158 	float	approachDist;
159 
160 	approachDist = 7.0*(2.0-game->gameSkill);
161 	if(fabs(diff[1]) < (approachDist+0.0*sin(game->frame*0.05)) )
162 	{
163 		diff[1] = diff[1] * diff[1]/approachDist;
164 	}
165 	diff[0] += 5.0*sin(age*0.1);
166 	lastMoveX = (0.98*lastMoveX)+(0.0005*game->gameSkill*diff[0]);
167 	lastMoveY = (0.90*lastMoveY)+(0.001*game->gameSkill*diff[1]);
168 	pos[0] += game->speedAdj*(lastMoveX);
169 	pos[1] += game->speedAdj*(lastMoveY+vel[1]);
170 
171 
172 	if(pos[0] < -config->screenBoundX())
173 		pos[0] = -config->screenBoundX();
174 	if(pos[0] >  config->screenBoundX())
175 		pos[0] =  config->screenBoundX();
176 }
177