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