2 Copyright (C) 2004 Parallel Realities
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #include "droidBoss.h"
23 void droidBossAttack();
25 void droidBossChangeParticles()
27 (self->x < player.x) ? self->face = 0 : self->face = 1;
34 switch (self->shieldFrequency)
40 color = graphics.yellow;
43 color = graphics.green;
46 color = graphics.cyan;
49 color = graphics.white;
53 for (int i = 0 ; i < 20 ; i++)
55 dy = Math::rrand(-150, -50);
57 map.addParticle(self->x + (Math::prand() % self->width), self->y + (Math::prand() % self->height), dx, dy, Math::rrand(1, 60), color, NULL, PAR_WEIGHTLESS);
60 self->setThinkTime(2);
61 self->setActionFinished(10);
62 self->think = &droidBossChangeParticles;
65 if (self->custom == 0)
67 self->setThinkTime(2);
68 self->setActionFinished(10);
69 self->think = &droidBossAttack;
73 void droidBossChasePlayer()
75 (self->x < player.x) ? self->face = 0 : self->face = 1;
79 Math::calculateSlope(player.x, player.y, self->x, self->y, &dx, &dy);
84 self->setThinkTime(10);
85 self->setActionFinished(10);
86 self->think = &droidBossAttack;
89 void droidBossChangeFrequency()
91 (self->x < player.x) ? self->face = 0 : self->face = 1;
93 self->shieldFrequency = Math::rrand(WP_PISTOL, WP_SPREAD);
95 self->think = &droidBossChangeParticles;
96 self->setThinkTime(2);
97 self->setActionFinished(2);
100 Math::removeBit(&self->flags, ENT_AIMS);
101 Math::removeBit(&self->flags, ENT_RAPIDFIRE);
103 switch (self->shieldFrequency)
106 self->currentWeapon = getWeaponByName("Aimed Pistol");
107 Math::addBit(&self->flags, ENT_AIMS);
108 self->setSprites(graphics.getSprite("JetpackBlobRight1", true), graphics.getSprite("JetpackBlobLeft1", true), graphics.getSprite("JetpackBlobLeft1", true));
111 self->currentWeapon = getWeaponByName("Machine Gun");
112 Math::addBit(&self->flags, ENT_RAPIDFIRE);
113 self->setSprites(graphics.getSprite("JetpackBlobRight2", true), graphics.getSprite("JetpackBlobLeft2", true), graphics.getSprite("JetpackBlobLeft2", true));
116 self->currentWeapon = getWeaponByName("Alien Laser Cannon");
117 self->setSprites(graphics.getSprite("JetpackBlobRight3", true), graphics.getSprite("JetpackBlobLeft3", true), graphics.getSprite("JetpackBlobLeft3", true));
120 self->currentWeapon = getWeaponByName("Aimed Pistol");
121 self->shieldFrequency = WP_PISTOL;
122 Math::addBit(&self->flags, ENT_AIMS);
123 self->setSprites(graphics.getSprite("JetpackBlobRight1", true), graphics.getSprite("JetpackBlobLeft1", true), graphics.getSprite("JetpackBlobLeft1", true));
126 self->currentWeapon = &weapon[WP_ALIENSPREAD];
127 Math::addBit(&self->flags, ENT_AIMS);
128 self->setSprites(graphics.getSprite("JetpackBlobRight4", true), graphics.getSprite("JetpackBlobLeft4", true), graphics.getSprite("JetpackBlobLeft4", true));
132 audio.playSound(SND_BOSSCUSTOM1, CH_AMBIANCE);
137 self->health -= Math::rrand(1, 2);
138 self->setActionFinished(30);
139 self->setThinkTime(2);
141 self->dx = Math::rrand(-3, 3);
142 self->dy = Math::rrand(-3, 3);
144 addExplosion(self->x + Math::prand() % self->width, self->y + Math::prand() % self->height, 50, &player);
145 addSmokeAndFire(self, Math::rrand(-5, 5), Math::rrand(-5, 5), 2);
147 if (self->health <= -100)
149 checkObjectives(self->name, false);
151 map.mainBossPart = NULL;
157 self->dx = Math::rrand(-8, 8);
158 self->dy = Math::rrand(-8, 8);
160 (self->dx > 0) ? self->face = 0 : self->face = 1;
165 self->setThinkTime(2);
166 self->setActionFinished(5);
167 self->think = &droidGoCrazy;
171 if (self->custom == 0)
173 Math::removeBit(&self->flags, ENT_IMMUNE);
174 self->think = &droidBossChangeFrequency;
175 self->setActionFinished(2);
176 self->setThinkTime(2);
180 void droidBossReact()
182 if ((Math::prand() % 10) == 0)
184 Math::addBit(&self->flags, ENT_IMMUNE);
185 audio.playSound(SND_BOSSCUSTOM2, CH_SPAWN);
187 self->think = &droidGoCrazy;
188 self->setActionFinished(2);
189 self->setThinkTime(2);
195 (self->x < player.x) ? self->face = 0 : self->face = 1;
197 if (hasClearShot((Entity*)self))
199 self->flags & ENT_AIMS ? addBullet((Entity*)self, 0, 0) : addBullet((Entity*)self, self->currentWeapon->getSpeed(self->face), 0);
201 if (self->currentWeapon == &weapon[WP_ALIENSPREAD])
203 addBullet(self, self->currentWeapon->getSpeed(self->face), 2);
204 addBullet(self, self->currentWeapon->getSpeed(self->face), -2);
208 self->setThinkTime(2);
209 self->setActionFinished(self->currentWeapon->reload);
212 if (self->custom == 0)
213 self->think = &droidBossAttack;
218 self->setThinkTime(60);
219 self->setActionFinished(60);
224 addExplosion(self->x, self->y, 50, self);
225 self->setThinkTime(2);
226 self->setActionFinished(2);
227 self->active = false;
229 self->think = &orbWait;
236 (self->x < player.x) ? self->face = 0 : self->face = 1;
240 Math::calculateSlope(player.x, player.y, self->x, self->y, &dx, &dy);
242 self->dx = (dx * (1 + game.skill));
243 self->dy = (dy * (1 + game.skill));
245 self->setThinkTime(2);
246 self->setActionFinished(Math::rrand(10, 90));
247 self->think = &doOrb;
251 int distX = (int)fabs(player.x - self->x);
252 int distY = (int)fabs(player.y - self->y);
257 int distance = (int)sqrt(distX + distY);
263 if ((Math::prand() % 10) == 0)
269 debug(("fireOrb()\n"));
271 map.boss[i]->active = true;
272 map.boss[i]->maxHealth = map.boss[i]->health = 1 * game.skill;
273 map.boss[i]->x = self->x;
274 map.boss[i]->y = self->y + 20;
276 map.boss[i]->think = &doOrb;
277 map.boss[i]->die = &orbExplode;
278 map.boss[i]->setActionFinished(2);
279 map.boss[i]->setThinkTime(2);
282 void droidBossOrbAttack()
284 debug(("droidBossClawAttack\n"));
286 for (int i = 1 ; i < 6 ; i++)
288 if (!map.boss[i]->active)
291 self->setThinkTime(2);
292 self->setActionFinished(90);
293 self->think = &droidBossAttack;
299 self->think = &droidBossAttack;
302 void droidBossMoveRandomly()
304 self->dx = Math::rrand(-200, 200);
305 self->dy = Math::rrand(-200, 200);
310 self->setThinkTime(2);
311 self->setActionFinished(90);
312 self->think = &droidBossAttack;
315 void droidBossAttack()
317 if (player.health < 1)
319 self->dx = self->dy = 0;
323 (self->x < player.x) ? self->face = 0 : self->face = 1;
325 int r = Math::prand() % 110;
329 self->think = &droidBossChasePlayer;
330 self->setThinkTime(2);
331 self->setActionFinished(2);
336 self->think = &droidBossFire;
337 self->setThinkTime(2);
338 self->setActionFinished(2);
339 self->custom = Math::rrand(1, 3);
343 self->think = &droidBossMoveRandomly;
344 self->setThinkTime(2);
345 self->setActionFinished(2);
350 self->think = &droidBossOrbAttack;
351 self->setThinkTime(2);
352 self->setActionFinished(2);
353 self->custom = Math::rrand(1, 3);
357 self->think = &droidBossChangeFrequency;
358 self->setThinkTime(2);
359 self->setActionFinished(2);
365 debug(("droidBossInit\n"));
367 map.boss[0] = new Boss();
368 strncpy(map.boss[0]->name, "BioMech Jetpack Blob", sizeof map.boss[0]->name);
369 map.boss[0]->health = 30 * game.skill;
370 map.boss[0]->maxHealth = 30 * game.skill;
371 map.boss[0]->setSprites(graphics.getSprite("JetpackBlobRight1", true), graphics.getSprite("JetpackBlobLeft1", true), graphics.getSprite("JetpackBlobLeft1", true));
372 map.boss[0]->currentWeapon = getWeaponByName("Aimed Pistol");
373 map.boss[0]->face = 1;
374 map.boss[0]->active = true;
375 map.boss[0]->x = 3172;
376 map.boss[0]->y = 4646;
377 map.boss[0]->immune = 0;
378 map.boss[0]->setThinkTime(2);
379 map.boss[0]->setActionFinished(2);
380 map.boss[0]->think = &droidBossChangeFrequency;
381 map.boss[0]->react = &droidBossReact;
382 map.boss[0]->die = &droidBossDie;
383 Math::addBit(&map.boss[0]->flags, ENT_FLIES);
385 map.setMainBossPart(map.boss[0]);
387 for (int i = 1 ; i < 6 ; i++)
389 map.boss[i] = new Boss();
390 strncpy(map.boss[i]->name, "Orb Bomb", sizeof map.boss[i]->name);
391 map.boss[i]->setSprites(graphics.getSprite("DroidOrb", true), graphics.getSprite("DroidOrb", true), graphics.getSprite("DroidOrb", true));
392 map.boss[i]->active = false;
393 map.boss[i]->face = 1;
394 map.boss[i]->think = &orbWait;
395 map.boss[i]->x = 9999;
396 map.boss[i]->y = 9999;
397 Math::addBit(&map.boss[i]->flags, ENT_FLIES);
400 audio.loadSound(SND_BOSSCUSTOM1, "sound/droidChangeFreq.wav");
401 audio.loadSound(SND_BOSSCUSTOM2, "sound/droidFreakOut.wav");
403 debug(("droidBossInit: Done\n"));