Moved some things.
This commit is contained in:
parent
37befa8d3c
commit
9974848ce8
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
CXXFLAGS ?= -O2 -Wall -g
|
||||
CXXFLAGS += `pkg-config --cflags sdl2 SDL2_image SDL2_mixer` -DLINUX
|
||||
LIBS = `pkg-config --libs sdl2 SDL2_image SDL2_mixer`
|
||||
OBJS = ai.o aliens.o audio.o bullets.o cargo.o collectable.o comms.o debris.o events.o explosions.o game.o globals.o graphics.o init.o intermission.o loadSave.o messages.o misc.o missions.o player.o resources.o script.o shop.o Starfighter.o title.o weapons.o
|
||||
OBJS = aliens.o audio.o bullets.o cargo.o collectable.o comms.o debris.o events.o explosions.o game.o globals.o graphics.o init.o intermission.o loadSave.o messages.o misc.o missions.o player.o resources.o script.o shop.o Starfighter.o title.o weapons.o
|
||||
|
||||
VERSION = 1.3-dev
|
||||
PROG = starfighter
|
||||
|
|
|
@ -112,7 +112,683 @@ int main(int argc, char **argv)
|
|||
initWeapons();
|
||||
|
||||
initVars();
|
||||
defineAliens();
|
||||
|
||||
// Dual Plasma Fighter.
|
||||
defEnemy[CD_DUALFIGHTER].classDef = CD_DUALFIGHTER;
|
||||
defEnemy[CD_DUALFIGHTER].AIType = AI_NORMAL;
|
||||
defEnemy[CD_DUALFIGHTER].speed = 4;
|
||||
defEnemy[CD_DUALFIGHTER].maxShield = 5;
|
||||
defEnemy[CD_DUALFIGHTER].shield = 5;
|
||||
defEnemy[CD_DUALFIGHTER].imageIndex[0] = 2;
|
||||
defEnemy[CD_DUALFIGHTER].imageIndex[1] = 3;
|
||||
defEnemy[CD_DUALFIGHTER].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_DUALFIGHTER].weaponType[1] = W_ROCKETS;
|
||||
defEnemy[CD_DUALFIGHTER].chance[0] = 100;
|
||||
defEnemy[CD_DUALFIGHTER].chance[1] = 1;
|
||||
defEnemy[CD_DUALFIGHTER].score = 25;
|
||||
defEnemy[CD_DUALFIGHTER].collectChance = 50;
|
||||
defEnemy[CD_DUALFIGHTER].collectType = P_ANYTHING;
|
||||
defEnemy[CD_DUALFIGHTER].collectValue = 50;
|
||||
defEnemy[CD_DUALFIGHTER].flags = FL_WEAPCO;
|
||||
|
||||
// Missile Boat
|
||||
defEnemy[CD_MISSILEBOAT].classDef = CD_MISSILEBOAT;
|
||||
defEnemy[CD_MISSILEBOAT].AIType = AI_DEFENSIVE;
|
||||
defEnemy[CD_MISSILEBOAT].speed = 2;
|
||||
defEnemy[CD_MISSILEBOAT].maxShield = 50;
|
||||
defEnemy[CD_MISSILEBOAT].shield = 50;
|
||||
defEnemy[CD_MISSILEBOAT].imageIndex[0] = 4;
|
||||
defEnemy[CD_MISSILEBOAT].imageIndex[1] = 5;
|
||||
defEnemy[CD_MISSILEBOAT].weaponType[0] = W_ROCKETS;
|
||||
defEnemy[CD_MISSILEBOAT].weaponType[1] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_MISSILEBOAT].chance[0] = 25;
|
||||
defEnemy[CD_MISSILEBOAT].chance[1] = 4;
|
||||
defEnemy[CD_MISSILEBOAT].score = 250;
|
||||
defEnemy[CD_MISSILEBOAT].collectChance = 25;
|
||||
defEnemy[CD_MISSILEBOAT].collectType = P_ANYTHING;
|
||||
defEnemy[CD_MISSILEBOAT].collectValue = 75;
|
||||
defEnemy[CD_MISSILEBOAT].flags = FL_WEAPCO;
|
||||
|
||||
//Prototype fighter
|
||||
defEnemy[CD_PROTOFIGHTER].classDef = CD_PROTOFIGHTER;
|
||||
defEnemy[CD_PROTOFIGHTER].AIType = AI_DEFENSIVE;
|
||||
defEnemy[CD_PROTOFIGHTER].speed = 5;
|
||||
defEnemy[CD_PROTOFIGHTER].maxShield = 15;
|
||||
defEnemy[CD_PROTOFIGHTER].shield = 15;
|
||||
defEnemy[CD_PROTOFIGHTER].imageIndex[0] = 6;
|
||||
defEnemy[CD_PROTOFIGHTER].imageIndex[1] = 7;
|
||||
defEnemy[CD_PROTOFIGHTER].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_PROTOFIGHTER].weaponType[1] = P_ANYTHING;
|
||||
defEnemy[CD_PROTOFIGHTER].chance[0] = 100;
|
||||
defEnemy[CD_PROTOFIGHTER].chance[1] = 1;
|
||||
defEnemy[CD_PROTOFIGHTER].score = 50;
|
||||
defEnemy[CD_PROTOFIGHTER].collectChance = 50;
|
||||
defEnemy[CD_PROTOFIGHTER].collectType = P_ANYTHING;
|
||||
defEnemy[CD_PROTOFIGHTER].collectValue = 50;
|
||||
defEnemy[CD_PROTOFIGHTER].flags = FL_WEAPCO;
|
||||
|
||||
// Phoebe and Ursula
|
||||
defEnemy[CD_FRIEND].classDef = CD_FRIEND;
|
||||
defEnemy[CD_FRIEND].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_FRIEND].speed = 3;
|
||||
defEnemy[CD_FRIEND].maxShield = 50;
|
||||
defEnemy[CD_FRIEND].shield = 50;
|
||||
defEnemy[CD_FRIEND].imageIndex[0] = 20;
|
||||
defEnemy[CD_FRIEND].imageIndex[1] = 21;
|
||||
defEnemy[CD_FRIEND].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_FRIEND].weaponType[1] = W_HOMING_MISSILE;
|
||||
defEnemy[CD_FRIEND].chance[0] = 100;
|
||||
defEnemy[CD_FRIEND].chance[1] = 5;
|
||||
defEnemy[CD_FRIEND].score = 0;
|
||||
defEnemy[CD_FRIEND].collectChance = 0;
|
||||
defEnemy[CD_FRIEND].collectType = P_CASH;
|
||||
defEnemy[CD_FRIEND].collectValue = 0;
|
||||
defEnemy[CD_FRIEND].flags = FL_FRIEND;
|
||||
|
||||
// Boss 1
|
||||
defEnemy[CD_FRIGATE].classDef = CD_BOSS;
|
||||
defEnemy[CD_FRIGATE].AIType = AI_NORMAL;
|
||||
defEnemy[CD_FRIGATE].speed = 2;
|
||||
defEnemy[CD_FRIGATE].maxShield = 550;
|
||||
defEnemy[CD_FRIGATE].shield = 550;
|
||||
defEnemy[CD_FRIGATE].imageIndex[0] = 8;
|
||||
defEnemy[CD_FRIGATE].imageIndex[1] = 9;
|
||||
defEnemy[CD_FRIGATE].weaponType[0] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_FRIGATE].weaponType[1] = W_ENERGYRAY;
|
||||
defEnemy[CD_FRIGATE].chance[0] = 100;
|
||||
defEnemy[CD_FRIGATE].chance[1] = 85;
|
||||
defEnemy[CD_FRIGATE].score = 500;
|
||||
defEnemy[CD_FRIGATE].collectChance = 100;
|
||||
defEnemy[CD_FRIGATE].collectType = P_CASH;
|
||||
defEnemy[CD_FRIGATE].collectValue = 250;
|
||||
defEnemy[CD_FRIGATE].flags = FL_WEAPCO;
|
||||
|
||||
defEnemy[CD_FRIGATE_WING1].classDef = CD_FRIGATE_WING1;
|
||||
defEnemy[CD_FRIGATE_WING1].AIType = AI_NORMAL;
|
||||
defEnemy[CD_FRIGATE_WING1].speed = 2;
|
||||
defEnemy[CD_FRIGATE_WING1].maxShield = 100;
|
||||
defEnemy[CD_FRIGATE_WING1].shield = 100;
|
||||
defEnemy[CD_FRIGATE_WING1].imageIndex[0] = 10;
|
||||
defEnemy[CD_FRIGATE_WING1].imageIndex[1] = 11;
|
||||
defEnemy[CD_FRIGATE_WING1].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_FRIGATE_WING1].weaponType[1] = W_ROCKETS;
|
||||
defEnemy[CD_FRIGATE_WING1].chance[0] = 100;
|
||||
defEnemy[CD_FRIGATE_WING1].chance[1] = 10;
|
||||
defEnemy[CD_FRIGATE_WING1].score = 500;
|
||||
defEnemy[CD_FRIGATE_WING1].collectChance = 100;
|
||||
defEnemy[CD_FRIGATE_WING1].collectType = P_ANYTHING;
|
||||
defEnemy[CD_FRIGATE_WING1].collectValue = 250;
|
||||
defEnemy[CD_FRIGATE_WING1].flags = FL_WEAPCO | FL_DAMAGEOWNER;
|
||||
|
||||
defEnemy[CD_FRIGATE_WING2].classDef = CD_FRIGATE_WING2;
|
||||
defEnemy[CD_FRIGATE_WING2].AIType = AI_NORMAL;
|
||||
defEnemy[CD_FRIGATE_WING2].speed = 2;
|
||||
defEnemy[CD_FRIGATE_WING2].maxShield = 100;
|
||||
defEnemy[CD_FRIGATE_WING2].shield = 100;
|
||||
defEnemy[CD_FRIGATE_WING2].imageIndex[0] = 12;
|
||||
defEnemy[CD_FRIGATE_WING2].imageIndex[1] = 13;
|
||||
defEnemy[CD_FRIGATE_WING2].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_FRIGATE_WING2].weaponType[1] = W_ROCKETS;
|
||||
defEnemy[CD_FRIGATE_WING2].chance[0] = 100;
|
||||
defEnemy[CD_FRIGATE_WING2].chance[1] = 10;
|
||||
defEnemy[CD_FRIGATE_WING2].score = 500;
|
||||
defEnemy[CD_FRIGATE_WING2].collectChance = 100;
|
||||
defEnemy[CD_FRIGATE_WING2].collectType = P_ANYTHING;
|
||||
defEnemy[CD_FRIGATE_WING2].collectValue = 250;
|
||||
defEnemy[CD_FRIGATE_WING2].flags = FL_WEAPCO | FL_DAMAGEOWNER;
|
||||
|
||||
// Transport ship
|
||||
defEnemy[CD_TRANSPORTSHIP].classDef = CD_TRANSPORTSHIP;
|
||||
defEnemy[CD_TRANSPORTSHIP].AIType = AI_EVASIVE;
|
||||
defEnemy[CD_TRANSPORTSHIP].speed = 4;
|
||||
defEnemy[CD_TRANSPORTSHIP].maxShield = 10;
|
||||
defEnemy[CD_TRANSPORTSHIP].shield = 10;
|
||||
defEnemy[CD_TRANSPORTSHIP].imageIndex[0] = 14;
|
||||
defEnemy[CD_TRANSPORTSHIP].imageIndex[1] = 15;
|
||||
defEnemy[CD_TRANSPORTSHIP].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_TRANSPORTSHIP].weaponType[1] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_TRANSPORTSHIP].chance[0] = 0;
|
||||
defEnemy[CD_TRANSPORTSHIP].chance[1] = 0;
|
||||
defEnemy[CD_TRANSPORTSHIP].score = 25;
|
||||
defEnemy[CD_TRANSPORTSHIP].collectChance = 100;
|
||||
defEnemy[CD_TRANSPORTSHIP].collectType = P_WEAPONS;
|
||||
defEnemy[CD_TRANSPORTSHIP].collectValue = 30;
|
||||
defEnemy[CD_TRANSPORTSHIP].flags = FL_WEAPCO | FL_NOFIRE;
|
||||
|
||||
// Cargo ship
|
||||
defEnemy[CD_CARGOSHIP].classDef = CD_CARGOSHIP;
|
||||
defEnemy[CD_CARGOSHIP].AIType = AI_EVASIVE;
|
||||
defEnemy[CD_CARGOSHIP].speed = 4;
|
||||
defEnemy[CD_CARGOSHIP].maxShield = 10;
|
||||
defEnemy[CD_CARGOSHIP].shield = 10;
|
||||
defEnemy[CD_CARGOSHIP].imageIndex[0] = 22;
|
||||
defEnemy[CD_CARGOSHIP].imageIndex[1] = 23;
|
||||
defEnemy[CD_CARGOSHIP].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_CARGOSHIP].weaponType[1] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_CARGOSHIP].chance[0] = 0;
|
||||
defEnemy[CD_CARGOSHIP].chance[1] = 0;
|
||||
defEnemy[CD_CARGOSHIP].score = 25;
|
||||
defEnemy[CD_CARGOSHIP].collectChance = 50;
|
||||
defEnemy[CD_CARGOSHIP].collectType = P_ANYTHING;
|
||||
defEnemy[CD_CARGOSHIP].collectValue = 100;
|
||||
defEnemy[CD_CARGOSHIP].flags = FL_WEAPCO | FL_NOFIRE;
|
||||
|
||||
// Weapco Miner
|
||||
defEnemy[CD_MINER].classDef = CD_MINER;
|
||||
defEnemy[CD_MINER].AIType = AI_EVASIVE;
|
||||
defEnemy[CD_MINER].speed = 4;
|
||||
defEnemy[CD_MINER].maxShield = 25;
|
||||
defEnemy[CD_MINER].shield = 25;
|
||||
defEnemy[CD_MINER].imageIndex[0] = 16;
|
||||
defEnemy[CD_MINER].imageIndex[1] = 17;
|
||||
defEnemy[CD_MINER].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_MINER].weaponType[1] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_MINER].chance[0] = 0;
|
||||
defEnemy[CD_MINER].chance[1] = 0;
|
||||
defEnemy[CD_MINER].score = 100;
|
||||
defEnemy[CD_MINER].collectChance = 100;
|
||||
defEnemy[CD_MINER].collectType = P_ANYTHING;
|
||||
defEnemy[CD_MINER].collectValue = 30;
|
||||
defEnemy[CD_MINER].flags = FL_WEAPCO | FL_NOFIRE | FL_DROPMINES;
|
||||
|
||||
// Kline
|
||||
defEnemy[CD_KLINE].classDef = CD_KLINE;
|
||||
defEnemy[CD_KLINE].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_KLINE].speed = 5;
|
||||
defEnemy[CD_KLINE].maxShield = 750;
|
||||
defEnemy[CD_KLINE].shield = 750;
|
||||
defEnemy[CD_KLINE].imageIndex[0] = 18;
|
||||
defEnemy[CD_KLINE].imageIndex[1] = 19;
|
||||
defEnemy[CD_KLINE].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_KLINE].weaponType[1] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_KLINE].chance[0] = 100;
|
||||
defEnemy[CD_KLINE].chance[1] = 2;
|
||||
defEnemy[CD_KLINE].score = 0;
|
||||
defEnemy[CD_KLINE].collectChance = 0;
|
||||
defEnemy[CD_KLINE].collectType = P_ANYTHING;
|
||||
defEnemy[CD_KLINE].collectValue = 0;
|
||||
defEnemy[CD_KLINE].flags = FL_WEAPCO | FL_CANNOTDIE | FL_ALWAYSFACE | FL_CIRCLES;
|
||||
|
||||
// Aim Fighter
|
||||
defEnemy[CD_AIMFIGHTER].classDef = CD_AIMFIGHTER;
|
||||
defEnemy[CD_AIMFIGHTER].AIType = AI_NORMAL;
|
||||
defEnemy[CD_AIMFIGHTER].speed = 3;
|
||||
defEnemy[CD_AIMFIGHTER].maxShield = 15;
|
||||
defEnemy[CD_AIMFIGHTER].shield = 15;
|
||||
defEnemy[CD_AIMFIGHTER].imageIndex[0] = 8;
|
||||
defEnemy[CD_AIMFIGHTER].imageIndex[1] = 9;
|
||||
defEnemy[CD_AIMFIGHTER].weaponType[0] = W_AIMED_SHOT;
|
||||
defEnemy[CD_AIMFIGHTER].weaponType[1] = W_AIMED_SHOT;
|
||||
defEnemy[CD_AIMFIGHTER].chance[0] = 7;
|
||||
defEnemy[CD_AIMFIGHTER].chance[1] = 1;
|
||||
defEnemy[CD_AIMFIGHTER].score = 50;
|
||||
defEnemy[CD_AIMFIGHTER].collectChance = 75;
|
||||
defEnemy[CD_AIMFIGHTER].collectType = P_ANYTHING;
|
||||
defEnemy[CD_AIMFIGHTER].collectValue = 100;
|
||||
defEnemy[CD_AIMFIGHTER].flags = FL_WEAPCO | FL_AIMS;
|
||||
|
||||
// Slave ship
|
||||
defEnemy[CD_SLAVETRANSPORT].classDef = CD_SLAVETRANSPORT;
|
||||
defEnemy[CD_SLAVETRANSPORT].AIType = AI_EVASIVE;
|
||||
defEnemy[CD_SLAVETRANSPORT].speed = 2;
|
||||
defEnemy[CD_SLAVETRANSPORT].maxShield = 10;
|
||||
defEnemy[CD_SLAVETRANSPORT].shield = 20;
|
||||
defEnemy[CD_SLAVETRANSPORT].imageIndex[0] = 10;
|
||||
defEnemy[CD_SLAVETRANSPORT].imageIndex[1] = 11;
|
||||
defEnemy[CD_SLAVETRANSPORT].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_SLAVETRANSPORT].weaponType[1] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_SLAVETRANSPORT].chance[0] = 0;
|
||||
defEnemy[CD_SLAVETRANSPORT].chance[1] = 0;
|
||||
defEnemy[CD_SLAVETRANSPORT].score = 25;
|
||||
defEnemy[CD_SLAVETRANSPORT].collectChance = 100;
|
||||
defEnemy[CD_SLAVETRANSPORT].collectType = P_SLAVES;
|
||||
defEnemy[CD_SLAVETRANSPORT].collectValue = 25;
|
||||
defEnemy[CD_SLAVETRANSPORT].flags = FL_WEAPCO | FL_NOFIRE;
|
||||
|
||||
// Good Transport
|
||||
defEnemy[CD_GOODTRANSPORT].classDef = CD_GOODTRANSPORT;
|
||||
defEnemy[CD_GOODTRANSPORT].AIType = AI_EVASIVE;
|
||||
defEnemy[CD_GOODTRANSPORT].speed = 3;
|
||||
defEnemy[CD_GOODTRANSPORT].maxShield = 75;
|
||||
defEnemy[CD_GOODTRANSPORT].shield = 75;
|
||||
defEnemy[CD_GOODTRANSPORT].imageIndex[0] = 12;
|
||||
defEnemy[CD_GOODTRANSPORT].imageIndex[1] = 13;
|
||||
defEnemy[CD_GOODTRANSPORT].weaponType[0] = W_AIMED_SHOT;
|
||||
defEnemy[CD_GOODTRANSPORT].weaponType[1] = W_AIMED_SHOT;
|
||||
defEnemy[CD_GOODTRANSPORT].chance[0] = 100;
|
||||
defEnemy[CD_GOODTRANSPORT].chance[1] = 100;
|
||||
defEnemy[CD_GOODTRANSPORT].score = 0;
|
||||
defEnemy[CD_GOODTRANSPORT].collectChance = 0;
|
||||
defEnemy[CD_GOODTRANSPORT].collectType = P_ANYTHING;
|
||||
defEnemy[CD_GOODTRANSPORT].collectValue = 0;
|
||||
defEnemy[CD_GOODTRANSPORT].flags = FL_FRIEND | FL_NOFIRE | FL_AIMS;
|
||||
|
||||
// Sid Wilson
|
||||
defEnemy[CD_SID].classDef = CD_SID;
|
||||
defEnemy[CD_SID].AIType = AI_NORMAL;
|
||||
defEnemy[CD_SID].speed = 3;
|
||||
defEnemy[CD_SID].maxShield = 50;
|
||||
defEnemy[CD_SID].shield = 50;
|
||||
defEnemy[CD_SID].imageIndex[0] = 24;
|
||||
defEnemy[CD_SID].imageIndex[1] = 25;
|
||||
defEnemy[CD_SID].weaponType[0] = W_IONCANNON;
|
||||
defEnemy[CD_SID].weaponType[1] = W_IONCANNON;
|
||||
defEnemy[CD_SID].chance[0] = 100;
|
||||
defEnemy[CD_SID].chance[1] = 0;
|
||||
defEnemy[CD_SID].score = 0;
|
||||
defEnemy[CD_SID].collectChance = 0;
|
||||
defEnemy[CD_SID].collectType = P_ANYTHING;
|
||||
defEnemy[CD_SID].collectValue = 0;
|
||||
defEnemy[CD_SID].flags = FL_FRIEND | FL_AIMS;
|
||||
|
||||
// Mining Vessel Boss
|
||||
defEnemy[CD_MINEBOSS].classDef = CD_BOSS;
|
||||
defEnemy[CD_MINEBOSS].AIType = AI_NORMAL;
|
||||
defEnemy[CD_MINEBOSS].speed = 3;
|
||||
defEnemy[CD_MINEBOSS].maxShield = 1000;
|
||||
defEnemy[CD_MINEBOSS].shield = 1000;
|
||||
defEnemy[CD_MINEBOSS].imageIndex[0] = 26;
|
||||
defEnemy[CD_MINEBOSS].imageIndex[1] = 27;
|
||||
defEnemy[CD_MINEBOSS].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_MINEBOSS].weaponType[1] = W_SPREADSHOT;
|
||||
defEnemy[CD_MINEBOSS].chance[0] = 0;
|
||||
defEnemy[CD_MINEBOSS].chance[1] = 0;
|
||||
defEnemy[CD_MINEBOSS].score = 1000;
|
||||
defEnemy[CD_MINEBOSS].collectChance = 100;
|
||||
defEnemy[CD_MINEBOSS].collectType = P_ANYTHING;
|
||||
defEnemy[CD_MINEBOSS].collectValue = 255;
|
||||
defEnemy[CD_MINEBOSS].flags = FL_WEAPCO | FL_IMMORTAL;
|
||||
|
||||
defEnemy[CD_BOSS2_WING1].classDef = CD_BOSS2_WING1;
|
||||
defEnemy[CD_BOSS2_WING1].AIType = AI_NORMAL;
|
||||
defEnemy[CD_BOSS2_WING1].speed = 1;
|
||||
defEnemy[CD_BOSS2_WING1].maxShield = 250;
|
||||
defEnemy[CD_BOSS2_WING1].shield = 250;
|
||||
defEnemy[CD_BOSS2_WING1].imageIndex[0] = 28;
|
||||
defEnemy[CD_BOSS2_WING1].imageIndex[1] = 29;
|
||||
defEnemy[CD_BOSS2_WING1].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_BOSS2_WING1].weaponType[1] = W_SPREADSHOT;
|
||||
defEnemy[CD_BOSS2_WING1].chance[0] = 0;
|
||||
defEnemy[CD_BOSS2_WING1].chance[1] = 0;
|
||||
defEnemy[CD_BOSS2_WING1].score = 1000;
|
||||
defEnemy[CD_BOSS2_WING1].collectChance = 100;
|
||||
defEnemy[CD_BOSS2_WING1].collectType = P_ANYTHING;
|
||||
defEnemy[CD_BOSS2_WING1].collectValue = 255;
|
||||
defEnemy[CD_BOSS2_WING1].flags = FL_WEAPCO | FL_DAMAGEOWNER;
|
||||
|
||||
defEnemy[CD_BOSS2_WING2].classDef = CD_BOSS2_WING2;
|
||||
defEnemy[CD_BOSS2_WING2].AIType = AI_NORMAL;
|
||||
defEnemy[CD_BOSS2_WING2].speed = 1;
|
||||
defEnemy[CD_BOSS2_WING2].maxShield = 500;
|
||||
defEnemy[CD_BOSS2_WING2].shield = 500;
|
||||
defEnemy[CD_BOSS2_WING2].imageIndex[0] = 30;
|
||||
defEnemy[CD_BOSS2_WING2].imageIndex[1] = 31;
|
||||
defEnemy[CD_BOSS2_WING2].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_BOSS2_WING2].weaponType[1] = W_SPREADSHOT;
|
||||
defEnemy[CD_BOSS2_WING2].chance[0] = 0;
|
||||
defEnemy[CD_BOSS2_WING2].chance[1] = 0;
|
||||
defEnemy[CD_BOSS2_WING2].score = 1000;
|
||||
defEnemy[CD_BOSS2_WING2].collectChance = 100;
|
||||
defEnemy[CD_BOSS2_WING2].collectType = P_ANYTHING;
|
||||
defEnemy[CD_BOSS2_WING2].collectValue = 255;
|
||||
defEnemy[CD_BOSS2_WING2].flags = FL_WEAPCO | FL_DEPLOYDRONES | FL_DAMAGEOWNER;
|
||||
|
||||
defEnemy[CD_BOSS2_WING3].classDef = CD_BOSS2_WING3;
|
||||
defEnemy[CD_BOSS2_WING3].AIType = AI_NORMAL;
|
||||
defEnemy[CD_BOSS2_WING3].speed = 1;
|
||||
defEnemy[CD_BOSS2_WING3].maxShield = 500;
|
||||
defEnemy[CD_BOSS2_WING3].shield = 500;
|
||||
defEnemy[CD_BOSS2_WING3].imageIndex[0] = 32;
|
||||
defEnemy[CD_BOSS2_WING3].imageIndex[1] = 33;
|
||||
defEnemy[CD_BOSS2_WING3].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_BOSS2_WING3].weaponType[1] = W_SPREADSHOT;
|
||||
defEnemy[CD_BOSS2_WING3].chance[0] = 0;
|
||||
defEnemy[CD_BOSS2_WING3].chance[1] = 0;
|
||||
defEnemy[CD_BOSS2_WING3].score = 1000;
|
||||
defEnemy[CD_BOSS2_WING3].collectChance = 100;
|
||||
defEnemy[CD_BOSS2_WING3].collectType = P_ANYTHING;
|
||||
defEnemy[CD_BOSS2_WING3].collectValue = 255;
|
||||
defEnemy[CD_BOSS2_WING3].flags = FL_WEAPCO | FL_DEPLOYDRONES | FL_DAMAGEOWNER;
|
||||
|
||||
defEnemy[CD_BOSS2_WING4].classDef = CD_BOSS2_WING4;
|
||||
defEnemy[CD_BOSS2_WING4].AIType = AI_NORMAL;
|
||||
defEnemy[CD_BOSS2_WING4].speed = 1;
|
||||
defEnemy[CD_BOSS2_WING4].maxShield = 250;
|
||||
defEnemy[CD_BOSS2_WING4].shield = 250;
|
||||
defEnemy[CD_BOSS2_WING4].imageIndex[0] = 34;
|
||||
defEnemy[CD_BOSS2_WING4].imageIndex[1] = 35;
|
||||
defEnemy[CD_BOSS2_WING4].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_BOSS2_WING4].weaponType[1] = W_SPREADSHOT;
|
||||
defEnemy[CD_BOSS2_WING4].chance[0] = 0;
|
||||
defEnemy[CD_BOSS2_WING4].chance[1] = 0;
|
||||
defEnemy[CD_BOSS2_WING4].score = 1000;
|
||||
defEnemy[CD_BOSS2_WING4].collectChance = 100;
|
||||
defEnemy[CD_BOSS2_WING4].collectType = P_ANYTHING;
|
||||
defEnemy[CD_BOSS2_WING4].collectValue = 255;
|
||||
defEnemy[CD_BOSS2_WING4].flags = FL_WEAPCO | FL_DAMAGEOWNER;
|
||||
|
||||
// Drone
|
||||
defEnemy[CD_DRONE].classDef = CD_DRONE;
|
||||
defEnemy[CD_DRONE].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_DRONE].speed = 8;
|
||||
defEnemy[CD_DRONE].maxShield = 5;
|
||||
defEnemy[CD_DRONE].shield = 5;
|
||||
defEnemy[CD_DRONE].imageIndex[0] = 36;
|
||||
defEnemy[CD_DRONE].imageIndex[1] = 37;
|
||||
defEnemy[CD_DRONE].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_DRONE].weaponType[1] = W_LASER;
|
||||
defEnemy[CD_DRONE].chance[0] = 100;
|
||||
defEnemy[CD_DRONE].chance[1] = 0;
|
||||
defEnemy[CD_DRONE].score = 0;
|
||||
defEnemy[CD_DRONE].collectChance = 10;
|
||||
defEnemy[CD_DRONE].collectType = P_SHIELD;
|
||||
defEnemy[CD_DRONE].collectValue = 1;
|
||||
defEnemy[CD_DRONE].flags = FL_WEAPCO;
|
||||
|
||||
// Experimental Fighter
|
||||
defEnemy[CD_CLOAKFIGHTER].classDef = CD_CLOAKFIGHTER;
|
||||
defEnemy[CD_CLOAKFIGHTER].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_CLOAKFIGHTER].speed = 6;
|
||||
defEnemy[CD_CLOAKFIGHTER].maxShield = 1000;
|
||||
defEnemy[CD_CLOAKFIGHTER].shield = 1000;
|
||||
defEnemy[CD_CLOAKFIGHTER].imageIndex[0] = 10;
|
||||
defEnemy[CD_CLOAKFIGHTER].imageIndex[1] = 11;
|
||||
defEnemy[CD_CLOAKFIGHTER].weaponType[0] = W_SPREADSHOT;
|
||||
defEnemy[CD_CLOAKFIGHTER].weaponType[1] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_CLOAKFIGHTER].chance[0] = 100;
|
||||
defEnemy[CD_CLOAKFIGHTER].chance[1] = 5;
|
||||
defEnemy[CD_CLOAKFIGHTER].score = 550;
|
||||
defEnemy[CD_CLOAKFIGHTER].collectChance = 100;
|
||||
defEnemy[CD_CLOAKFIGHTER].collectType = P_CASH;
|
||||
defEnemy[CD_CLOAKFIGHTER].collectValue = 255;
|
||||
defEnemy[CD_CLOAKFIGHTER].flags = FL_WEAPCO | FL_CANCLOAK | FL_RUNSAWAY;
|
||||
|
||||
// Evil Ursula
|
||||
defEnemy[CD_EVILURSULA].classDef = CD_EVILURSULA;
|
||||
defEnemy[CD_EVILURSULA].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_EVILURSULA].speed = 5;
|
||||
defEnemy[CD_EVILURSULA].maxShield = 500;
|
||||
defEnemy[CD_EVILURSULA].shield = 500;
|
||||
defEnemy[CD_EVILURSULA].imageIndex[0] = 12;
|
||||
defEnemy[CD_EVILURSULA].imageIndex[1] = 13;
|
||||
defEnemy[CD_EVILURSULA].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_EVILURSULA].weaponType[1] = W_HOMING_MISSILE;
|
||||
defEnemy[CD_EVILURSULA].chance[0] = 100;
|
||||
defEnemy[CD_EVILURSULA].chance[1] = 100;
|
||||
defEnemy[CD_EVILURSULA].score = 500;
|
||||
defEnemy[CD_EVILURSULA].collectChance = 100;
|
||||
defEnemy[CD_EVILURSULA].collectType = P_ESCAPEPOD;
|
||||
defEnemy[CD_EVILURSULA].collectValue = 1;
|
||||
defEnemy[CD_EVILURSULA].flags = FL_WEAPCO;
|
||||
|
||||
// Mercenary
|
||||
defEnemy[CD_KRASS].classDef = CD_KRASS;
|
||||
defEnemy[CD_KRASS].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_KRASS].speed = 5;
|
||||
defEnemy[CD_KRASS].maxShield = 1000;
|
||||
defEnemy[CD_KRASS].shield = 1000;
|
||||
defEnemy[CD_KRASS].imageIndex[0] = 26;
|
||||
defEnemy[CD_KRASS].imageIndex[1] = 27;
|
||||
defEnemy[CD_KRASS].weaponType[0] = W_SPREADSHOT;
|
||||
defEnemy[CD_KRASS].weaponType[1] = W_CHARGER;
|
||||
defEnemy[CD_KRASS].chance[0] = 100;
|
||||
defEnemy[CD_KRASS].chance[1] = 0;
|
||||
defEnemy[CD_KRASS].score = 2000;
|
||||
defEnemy[CD_KRASS].collectChance = 100;
|
||||
defEnemy[CD_KRASS].collectType = P_ANYTHING;
|
||||
defEnemy[CD_KRASS].collectValue = 255;
|
||||
defEnemy[CD_KRASS].flags = FL_FRIEND | FL_IMMORTAL;
|
||||
|
||||
// Executive Transport
|
||||
defEnemy[CD_EXEC].classDef = CD_BOSS;
|
||||
defEnemy[CD_EXEC].AIType = AI_NORMAL;
|
||||
defEnemy[CD_EXEC].speed = 5;
|
||||
defEnemy[CD_EXEC].maxShield = 1000;
|
||||
defEnemy[CD_EXEC].shield = 1000;
|
||||
defEnemy[CD_EXEC].imageIndex[0] = 28;
|
||||
defEnemy[CD_EXEC].imageIndex[1] = 28;
|
||||
defEnemy[CD_EXEC].weaponType[0] = W_SPREADSHOT;
|
||||
defEnemy[CD_EXEC].weaponType[1] = W_HOMING_MISSILE;
|
||||
defEnemy[CD_EXEC].chance[0] = 0;
|
||||
defEnemy[CD_EXEC].chance[1] = 0;
|
||||
defEnemy[CD_EXEC].score = 2000;
|
||||
defEnemy[CD_EXEC].collectChance = 0;
|
||||
defEnemy[CD_EXEC].collectType = P_ANYTHING;
|
||||
defEnemy[CD_EXEC].collectValue = 0;
|
||||
defEnemy[CD_EXEC].flags = FL_WEAPCO | FL_NOFIRE;
|
||||
|
||||
// Asteroid
|
||||
defEnemy[CD_ASTEROID].classDef = CD_ASTEROID;
|
||||
defEnemy[CD_ASTEROID].AIType = AI_WANDER;
|
||||
defEnemy[CD_ASTEROID].speed = 1;
|
||||
defEnemy[CD_ASTEROID].maxShield = 50;
|
||||
defEnemy[CD_ASTEROID].shield = 50;
|
||||
defEnemy[CD_ASTEROID].imageIndex[0] = 38;
|
||||
defEnemy[CD_ASTEROID].imageIndex[1] = 38;
|
||||
defEnemy[CD_ASTEROID].weaponType[0] = W_SPREADSHOT;
|
||||
defEnemy[CD_ASTEROID].weaponType[1] = W_HOMING_MISSILE;
|
||||
defEnemy[CD_ASTEROID].chance[0] = 0;
|
||||
defEnemy[CD_ASTEROID].chance[1] = 0;
|
||||
defEnemy[CD_ASTEROID].score = 0;
|
||||
defEnemy[CD_ASTEROID].collectChance = 25;
|
||||
defEnemy[CD_ASTEROID].collectType = P_ORE;
|
||||
defEnemy[CD_ASTEROID].collectValue = 1;
|
||||
defEnemy[CD_ASTEROID].flags = FL_WEAPCO;
|
||||
|
||||
defEnemy[CD_ASTEROID2].classDef = CD_ASTEROID2;
|
||||
defEnemy[CD_ASTEROID2].AIType = AI_WANDER;
|
||||
defEnemy[CD_ASTEROID2].speed = 1;
|
||||
defEnemy[CD_ASTEROID2].maxShield = 10;
|
||||
defEnemy[CD_ASTEROID2].shield = 10;
|
||||
defEnemy[CD_ASTEROID2].imageIndex[0] = 39;
|
||||
defEnemy[CD_ASTEROID2].imageIndex[1] = 40;
|
||||
defEnemy[CD_ASTEROID2].weaponType[0] = W_SPREADSHOT;
|
||||
defEnemy[CD_ASTEROID2].weaponType[1] = W_HOMING_MISSILE;
|
||||
defEnemy[CD_ASTEROID2].chance[0] = 0;
|
||||
defEnemy[CD_ASTEROID2].chance[1] = 0;
|
||||
defEnemy[CD_ASTEROID2].score = 0;
|
||||
defEnemy[CD_ASTEROID2].collectChance = 25;
|
||||
defEnemy[CD_ASTEROID2].collectType = P_ORE;
|
||||
defEnemy[CD_ASTEROID2].collectValue = 1;
|
||||
defEnemy[CD_ASTEROID2].flags = FL_WEAPCO;
|
||||
|
||||
// Escort
|
||||
defEnemy[CD_ESCORT].classDef = CD_ESCORT;
|
||||
defEnemy[CD_ESCORT].AIType = AI_NORMAL;
|
||||
defEnemy[CD_ESCORT].speed = 3;
|
||||
defEnemy[CD_ESCORT].maxShield = 200;
|
||||
defEnemy[CD_ESCORT].shield = 200;
|
||||
defEnemy[CD_ESCORT].imageIndex[0] = 30;
|
||||
defEnemy[CD_ESCORT].imageIndex[1] = 31;
|
||||
defEnemy[CD_ESCORT].weaponType[0] = W_LASER;
|
||||
defEnemy[CD_ESCORT].weaponType[1] = W_LASER;
|
||||
defEnemy[CD_ESCORT].chance[0] = 25;
|
||||
defEnemy[CD_ESCORT].chance[1] = 25;
|
||||
defEnemy[CD_ESCORT].score = 450;
|
||||
defEnemy[CD_ESCORT].collectChance = 100;
|
||||
defEnemy[CD_ESCORT].collectType = P_ANYTHING;
|
||||
defEnemy[CD_ESCORT].collectValue = 100;
|
||||
defEnemy[CD_ESCORT].flags = FL_WEAPCO;
|
||||
|
||||
// Mobile Ray Cannon
|
||||
defEnemy[CD_MOBILE_RAY].classDef = CD_MOBILE_RAY;
|
||||
defEnemy[CD_MOBILE_RAY].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_MOBILE_RAY].speed = 5;
|
||||
defEnemy[CD_MOBILE_RAY].maxShield = 250;
|
||||
defEnemy[CD_MOBILE_RAY].shield = 250;
|
||||
defEnemy[CD_MOBILE_RAY].imageIndex[0] = 10;
|
||||
defEnemy[CD_MOBILE_RAY].imageIndex[1] = 11;
|
||||
defEnemy[CD_MOBILE_RAY].weaponType[0] = W_ENERGYRAY;
|
||||
defEnemy[CD_MOBILE_RAY].weaponType[1] = W_ENERGYRAY;
|
||||
defEnemy[CD_MOBILE_RAY].chance[0] = 50;
|
||||
defEnemy[CD_MOBILE_RAY].chance[1] = 50;
|
||||
defEnemy[CD_MOBILE_RAY].score = 1000;
|
||||
defEnemy[CD_MOBILE_RAY].collectChance = 75;
|
||||
defEnemy[CD_MOBILE_RAY].collectType = P_SHIELD;
|
||||
defEnemy[CD_MOBILE_RAY].collectValue = 2;
|
||||
defEnemy[CD_MOBILE_RAY].flags = FL_WEAPCO;
|
||||
|
||||
// Rebel Carrier
|
||||
defEnemy[CD_REBELCARRIER].classDef = CD_REBELCARRIER;
|
||||
defEnemy[CD_REBELCARRIER].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_REBELCARRIER].speed = 2;
|
||||
defEnemy[CD_REBELCARRIER].maxShield = 100;
|
||||
defEnemy[CD_REBELCARRIER].shield = 100;
|
||||
defEnemy[CD_REBELCARRIER].imageIndex[0] = 32;
|
||||
defEnemy[CD_REBELCARRIER].imageIndex[1] = 33;
|
||||
defEnemy[CD_REBELCARRIER].weaponType[0] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_REBELCARRIER].weaponType[1] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_REBELCARRIER].chance[0] = 50;
|
||||
defEnemy[CD_REBELCARRIER].chance[1] = 2;
|
||||
defEnemy[CD_REBELCARRIER].score = 0;
|
||||
defEnemy[CD_REBELCARRIER].collectChance = 0;
|
||||
defEnemy[CD_REBELCARRIER].collectType = P_SHIELD;
|
||||
defEnemy[CD_REBELCARRIER].collectValue = 0;
|
||||
defEnemy[CD_REBELCARRIER].flags = FL_FRIEND;
|
||||
|
||||
// Pluto Boss
|
||||
defEnemy[CD_PLUTOBOSS].classDef = CD_PLUTOBOSS;
|
||||
defEnemy[CD_PLUTOBOSS].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_PLUTOBOSS].speed = 4;
|
||||
defEnemy[CD_PLUTOBOSS].maxShield = 500;
|
||||
defEnemy[CD_PLUTOBOSS].shield = 500;
|
||||
defEnemy[CD_PLUTOBOSS].imageIndex[0] = 12;
|
||||
defEnemy[CD_PLUTOBOSS].imageIndex[1] = 13;
|
||||
defEnemy[CD_PLUTOBOSS].weaponType[0] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_PLUTOBOSS].weaponType[1] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_PLUTOBOSS].chance[0] = 50;
|
||||
defEnemy[CD_PLUTOBOSS].chance[1] = 2;
|
||||
defEnemy[CD_PLUTOBOSS].score = 1000;
|
||||
defEnemy[CD_PLUTOBOSS].collectChance = 0;
|
||||
defEnemy[CD_PLUTOBOSS].collectType = P_SHIELD;
|
||||
defEnemy[CD_PLUTOBOSS].collectValue = 0;
|
||||
defEnemy[CD_PLUTOBOSS].flags = FL_WEAPCO;
|
||||
|
||||
// Pluto Boss Barrier
|
||||
defEnemy[CD_BARRIER].classDef = CD_BARRIER;
|
||||
defEnemy[CD_BARRIER].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_BARRIER].speed = 1;
|
||||
defEnemy[CD_BARRIER].maxShield = 250;
|
||||
defEnemy[CD_BARRIER].shield = 250;
|
||||
defEnemy[CD_BARRIER].imageIndex[0] = 32;
|
||||
defEnemy[CD_BARRIER].imageIndex[1] = 33;
|
||||
defEnemy[CD_BARRIER].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_BARRIER].weaponType[1] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_BARRIER].chance[0] = 0;
|
||||
defEnemy[CD_BARRIER].chance[1] = 0;
|
||||
defEnemy[CD_BARRIER].score = 1000;
|
||||
defEnemy[CD_BARRIER].collectChance = 100;
|
||||
defEnemy[CD_BARRIER].collectType = P_ANYTHING;
|
||||
defEnemy[CD_BARRIER].collectValue = 25;
|
||||
defEnemy[CD_BARRIER].flags = FL_WEAPCO | FL_NOFIRE;
|
||||
|
||||
// Neptune Boss
|
||||
defEnemy[CD_NEPTUNEBOSS].classDef = CD_NEPTUNEBOSS;
|
||||
defEnemy[CD_NEPTUNEBOSS].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_NEPTUNEBOSS].speed = 4;
|
||||
defEnemy[CD_NEPTUNEBOSS].maxShield = 800;
|
||||
defEnemy[CD_NEPTUNEBOSS].shield = 800;
|
||||
defEnemy[CD_NEPTUNEBOSS].imageIndex[0] = 12;
|
||||
defEnemy[CD_NEPTUNEBOSS].imageIndex[1] = 13;
|
||||
defEnemy[CD_NEPTUNEBOSS].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_NEPTUNEBOSS].weaponType[1] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_NEPTUNEBOSS].chance[0] = 100;
|
||||
defEnemy[CD_NEPTUNEBOSS].chance[1] = 0;
|
||||
defEnemy[CD_NEPTUNEBOSS].score = 1000;
|
||||
defEnemy[CD_NEPTUNEBOSS].collectChance = 100;
|
||||
defEnemy[CD_NEPTUNEBOSS].collectType = P_ANYTHING;
|
||||
defEnemy[CD_NEPTUNEBOSS].collectValue = 25;
|
||||
defEnemy[CD_NEPTUNEBOSS].flags = FL_WEAPCO;
|
||||
|
||||
// Mobile Shield
|
||||
defEnemy[CD_MOBILESHIELD].classDef = CD_MOBILESHIELD;
|
||||
defEnemy[CD_MOBILESHIELD].AIType = AI_EVASIVE;
|
||||
defEnemy[CD_MOBILESHIELD].speed = 6;
|
||||
defEnemy[CD_MOBILESHIELD].maxShield = 150;
|
||||
defEnemy[CD_MOBILESHIELD].shield = 150;
|
||||
defEnemy[CD_MOBILESHIELD].imageIndex[0] = 34;
|
||||
defEnemy[CD_MOBILESHIELD].imageIndex[1] = 35;
|
||||
defEnemy[CD_MOBILESHIELD].weaponType[0] = W_DOUBLE_SHOT;
|
||||
defEnemy[CD_MOBILESHIELD].weaponType[1] = W_MICRO_ROCKETS;
|
||||
defEnemy[CD_MOBILESHIELD].chance[0] = 0;
|
||||
defEnemy[CD_MOBILESHIELD].chance[1] = 0;
|
||||
defEnemy[CD_MOBILESHIELD].score = 250;
|
||||
defEnemy[CD_MOBILESHIELD].collectChance = 100;
|
||||
defEnemy[CD_MOBILESHIELD].collectType = P_ANYTHING;
|
||||
defEnemy[CD_MOBILESHIELD].collectValue = 25;
|
||||
defEnemy[CD_MOBILESHIELD].flags = FL_WEAPCO | FL_NOFIRE;
|
||||
|
||||
// Firefly
|
||||
defEnemy[CD_FIREFLY].classDef = CD_FIREFLY;
|
||||
defEnemy[CD_FIREFLY].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_FIREFLY].speed = 5;
|
||||
defEnemy[CD_FIREFLY].maxShield = 250;
|
||||
defEnemy[CD_FIREFLY].shield = 250;
|
||||
defEnemy[CD_FIREFLY].imageIndex[0] = 0;
|
||||
defEnemy[CD_FIREFLY].imageIndex[1] = 1;
|
||||
defEnemy[CD_FIREFLY].weaponType[0] = W_TRIPLE_SHOT;
|
||||
defEnemy[CD_FIREFLY].weaponType[1] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_FIREFLY].chance[0] = 100;
|
||||
defEnemy[CD_FIREFLY].chance[1] = 5;
|
||||
defEnemy[CD_FIREFLY].score = 500;
|
||||
defEnemy[CD_FIREFLY].collectChance = 100;
|
||||
defEnemy[CD_FIREFLY].collectType = P_ANYTHING;
|
||||
defEnemy[CD_FIREFLY].collectValue = 250;
|
||||
defEnemy[CD_FIREFLY].flags = FL_WEAPCO;
|
||||
|
||||
// Uranus Boss
|
||||
defEnemy[CD_URANUSBOSS].classDef = CD_URANUSBOSS;
|
||||
defEnemy[CD_URANUSBOSS].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_URANUSBOSS].speed = 4;
|
||||
defEnemy[CD_URANUSBOSS].maxShield = 750;
|
||||
defEnemy[CD_URANUSBOSS].shield = 750;
|
||||
defEnemy[CD_URANUSBOSS].imageIndex[0] = 41;
|
||||
defEnemy[CD_URANUSBOSS].imageIndex[1] = 42;
|
||||
defEnemy[CD_URANUSBOSS].weaponType[0] = W_SPREADSHOT;
|
||||
defEnemy[CD_URANUSBOSS].weaponType[1] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_URANUSBOSS].chance[0] = 100;
|
||||
defEnemy[CD_URANUSBOSS].chance[1] = 5;
|
||||
defEnemy[CD_URANUSBOSS].score = 500;
|
||||
defEnemy[CD_URANUSBOSS].collectChance = 100;
|
||||
defEnemy[CD_URANUSBOSS].collectType = P_ANYTHING;
|
||||
defEnemy[CD_URANUSBOSS].collectValue = 250;
|
||||
defEnemy[CD_URANUSBOSS].flags = FL_WEAPCO;
|
||||
|
||||
// Uranus Boss Wing 1
|
||||
defEnemy[CD_URANUSBOSSWING1].classDef = CD_URANUSBOSSWING1;
|
||||
defEnemy[CD_URANUSBOSSWING1].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_URANUSBOSSWING1].speed = 4;
|
||||
defEnemy[CD_URANUSBOSSWING1].maxShield = 250;
|
||||
defEnemy[CD_URANUSBOSSWING1].shield = 250;
|
||||
defEnemy[CD_URANUSBOSSWING1].imageIndex[0] = 43;
|
||||
defEnemy[CD_URANUSBOSSWING1].imageIndex[1] = 44;
|
||||
defEnemy[CD_URANUSBOSSWING1].weaponType[0] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_URANUSBOSSWING1].weaponType[1] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_URANUSBOSSWING1].chance[0] = 5;
|
||||
defEnemy[CD_URANUSBOSSWING1].chance[1] = 0;
|
||||
defEnemy[CD_URANUSBOSSWING1].score = 500;
|
||||
defEnemy[CD_URANUSBOSSWING1].collectChance = 100;
|
||||
defEnemy[CD_URANUSBOSSWING1].collectType = P_ANYTHING;
|
||||
defEnemy[CD_URANUSBOSSWING1].collectValue = 250;
|
||||
defEnemy[CD_URANUSBOSSWING1].flags = FL_WEAPCO | FL_IMMORTAL;
|
||||
|
||||
// Uranus Boss Wing 2
|
||||
defEnemy[CD_URANUSBOSSWING2].classDef = CD_URANUSBOSSWING2;
|
||||
defEnemy[CD_URANUSBOSSWING2].AIType = AI_OFFENSIVE;
|
||||
defEnemy[CD_URANUSBOSSWING2].speed = 4;
|
||||
defEnemy[CD_URANUSBOSSWING2].maxShield = 250;
|
||||
defEnemy[CD_URANUSBOSSWING2].shield = 250;
|
||||
defEnemy[CD_URANUSBOSSWING2].imageIndex[0] = 45;
|
||||
defEnemy[CD_URANUSBOSSWING2].imageIndex[1] = 46;
|
||||
defEnemy[CD_URANUSBOSSWING2].weaponType[0] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_URANUSBOSSWING2].weaponType[1] = W_DOUBLE_ROCKETS;
|
||||
defEnemy[CD_URANUSBOSSWING2].chance[0] = 5;
|
||||
defEnemy[CD_URANUSBOSSWING2].chance[1] = 0;
|
||||
defEnemy[CD_URANUSBOSSWING2].score = 500;
|
||||
defEnemy[CD_URANUSBOSSWING2].collectChance = 100;
|
||||
defEnemy[CD_URANUSBOSSWING2].collectType = P_ANYTHING;
|
||||
defEnemy[CD_URANUSBOSSWING2].collectValue = 250;
|
||||
defEnemy[CD_URANUSBOSSWING2].flags = FL_WEAPCO | FL_IMMORTAL;
|
||||
|
||||
setColorIndexes();
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "defs.h"
|
||||
#include "structs.h"
|
||||
|
||||
#include "ai.h"
|
||||
#include "aliens.h"
|
||||
#include "audio.h"
|
||||
#include "bullets.h"
|
||||
|
|
192
src/ai.cpp
192
src/ai.cpp
|
@ -1,192 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2003 Parallel Realities
|
||||
Copyright (C) 2011 Guus Sliepen
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 3
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "Starfighter.h"
|
||||
|
||||
/*
|
||||
Some very simple artificial intelligence routines for the aliens.
|
||||
Shouldn't really be called AI since they just do things at random.
|
||||
Aliens are assigned various AI types and this routine makes use of them.
|
||||
Levels of aggression, defence and evasion are all here.
|
||||
*/
|
||||
|
||||
void alien_setAI(object *alien)
|
||||
{
|
||||
// Make friendly craft generally concentrate on smaller fighters
|
||||
if ((alien->flags & FL_FRIEND) && (alien->target == &enemy[WC_BOSS]))
|
||||
{
|
||||
if ((rand() % 5) == 0)
|
||||
{
|
||||
alien->target = alien;
|
||||
alien->thinktime = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
int i = rand() % 10;
|
||||
float tx = alien->target->x;
|
||||
float ty = alien->target->y;
|
||||
|
||||
int chase = 0; // Chance in 10 of chasing player
|
||||
int area = 0; // Chance in 10 of moving to an area around the player
|
||||
int stop = 0; // Chance in 10 of hanging back
|
||||
int point = 0; // Size of area alien will move into
|
||||
|
||||
switch (alien->AIType)
|
||||
{
|
||||
case AI_NORMAL:
|
||||
chase = 3;
|
||||
point = 6;
|
||||
stop = 9;
|
||||
area = 250;
|
||||
break;
|
||||
case AI_OFFENSIVE:
|
||||
chase = 7;
|
||||
point = 8;
|
||||
stop = 9;
|
||||
area = 50;
|
||||
break;
|
||||
case AI_DEFENSIVE:
|
||||
chase = 2;
|
||||
point = 6;
|
||||
stop = 8;
|
||||
area = 300;
|
||||
break;
|
||||
case AI_EVASIVE:
|
||||
chase = 1;
|
||||
point = 8;
|
||||
stop = 9;
|
||||
area = 600;
|
||||
break;
|
||||
case AI_WANDER:
|
||||
chase = -1;
|
||||
point = 0;
|
||||
stop = 10;
|
||||
area = 1200;
|
||||
break;
|
||||
}
|
||||
|
||||
if (i <= chase)
|
||||
{
|
||||
// Chase the target
|
||||
alien->dx = ((alien->x - tx) / ((300 / alien->speed) + rand() % 100));
|
||||
alien->dy = ((alien->y - ty) / ((300 / alien->speed) + rand() % 100));
|
||||
return;
|
||||
}
|
||||
else if ((i >= point) && (i <= stop))
|
||||
{
|
||||
// Fly to a random point around the target
|
||||
tx += (rand() % area - (rand() % area * 2));
|
||||
ty += (rand() % area - (rand() % area * 2));
|
||||
alien->dx = ((alien->x - tx) / ((300 / alien->speed) + rand() % 100));
|
||||
alien->dy = ((alien->y - ty) / ((300 / alien->speed) + rand() % 100));
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Hang back
|
||||
alien->dx = 0;
|
||||
alien->dy = 0;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void alien_setKlineAttackMethod(object *alien)
|
||||
{
|
||||
alien->maxShield -= 500;
|
||||
if (alien->maxShield == 0)
|
||||
alien->flags &= ~FL_CANNOTDIE;
|
||||
|
||||
if (alien->maxShield == 1000)
|
||||
{
|
||||
setRadioMessage(FACE_KLINE, "Very good, Bainfield. Now let's get a little more serious...", 1);
|
||||
alien->weaponType[0] = W_SPREADSHOT;
|
||||
alien->chance[1] = 40;
|
||||
}
|
||||
else if (alien->maxShield == 500)
|
||||
{
|
||||
setRadioMessage(FACE_KLINE, "Your ability to stay alive irritates me!! Try dodging some of these!!", 1);
|
||||
alien->weaponType[0] = W_DIRSHOCKMISSILE;
|
||||
alien->weaponType[1] = W_DIRSHOCKMISSILE;
|
||||
alien->chance[0] = 2;
|
||||
alien->chance[1] = 2;
|
||||
alien->flags |= FL_AIMS;
|
||||
}
|
||||
else if (alien->maxShield == 0)
|
||||
{
|
||||
setRadioMessage(FACE_KLINE, "ENOUGH!! THIS ENDS NOW!!!", 1);
|
||||
alien->weaponType[0] = W_AIMED_SHOT;
|
||||
alien->weaponType[1] = W_MICRO_HOMING_MISSILES;
|
||||
alien->flags |= FL_CANCLOAK;
|
||||
alien->chance[0] = 100;
|
||||
alien->chance[1] = 2;
|
||||
}
|
||||
|
||||
alien->shield = 500;
|
||||
}
|
||||
|
||||
/*
|
||||
This AI is exclusively for Kline.
|
||||
*/
|
||||
void alien_setKlineAI(object *alien)
|
||||
{
|
||||
// Weapon type change
|
||||
if ((rand() % 3) == 0)
|
||||
{
|
||||
if (currentGame.area != 26)
|
||||
{
|
||||
alien->flags &= ~FL_AIMS;
|
||||
|
||||
switch(rand() % 2)
|
||||
{
|
||||
case 0:
|
||||
alien->weaponType[0] = W_TRIPLE_SHOT;
|
||||
break;
|
||||
case 1:
|
||||
alien->weaponType[0] = W_AIMED_SHOT;
|
||||
alien->flags |= FL_AIMS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
alien->flags &= ~(FL_CIRCLES | FL_CONTINUOUS_FIRE | FL_DROPMINES);
|
||||
|
||||
switch(rand() % 10)
|
||||
{
|
||||
case 0:
|
||||
if ((alien->weaponType[0] != W_DIRSHOCKMISSILE) && (alien->weaponType[1] != W_MICRO_HOMING_MISSILES))
|
||||
alien->flags |= FL_CONTINUOUS_FIRE;
|
||||
alien->dx = ((alien->x - alien->target->x) / ((300 / alien->speed) + rand() % 100));
|
||||
alien->dy = ((alien->y - alien->target->y) / ((300 / alien->speed) + rand() % 100));
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
// Kline only attacks then he is ready!
|
||||
if ((!(alien->flags & FL_NOFIRE)) && (currentGame.area == 11))
|
||||
alien->flags |= FL_DROPMINES;
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
alien->flags |= FL_CIRCLES;
|
||||
break;
|
||||
default:
|
||||
alien_setAI(alien);
|
||||
break;
|
||||
}
|
||||
}
|
27
src/ai.h
27
src/ai.h
|
@ -1,27 +0,0 @@
|
|||
/*
|
||||
Copyright (C) 2003 Parallel Realities
|
||||
Copyright (C) 2011 Guus Sliepen
|
||||
Copyright (C) 2015 Julian Marchant
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 3
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef AI_H
|
||||
#define AI_H
|
||||
|
||||
void alien_setAI(object *alien);
|
||||
void alien_setKlineAttackMethod(object *alien);
|
||||
void alien_setKlineAI(object *alien);
|
||||
|
||||
#endif
|
1557
src/aliens.cpp
1557
src/aliens.cpp
File diff suppressed because it is too large
Load Diff
21
src/aliens.h
21
src/aliens.h
|
@ -17,18 +17,23 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef ALIENS_H
|
||||
#define ALIENS_H
|
||||
#ifndef ALIEN_H
|
||||
#define ALIEN_H
|
||||
|
||||
extern object defEnemy[MAX_DEFALIENS];
|
||||
extern object enemy[MAX_ALIENS];
|
||||
|
||||
bool alien_add();
|
||||
void player_setTarget(int index);
|
||||
void initAliens();
|
||||
void mission_killAllEnemies();
|
||||
void doAliens();
|
||||
void setAlienShapes();
|
||||
void defineAliens();
|
||||
void alien_addDrone(object *hostAlien);
|
||||
void alien_addSmallAsteroid(object *hostAlien);
|
||||
void alien_addFriendly(int type);
|
||||
bool alien_place(object *alien);
|
||||
void alien_setAI(object *alien);
|
||||
void alien_setKlineAttackMethod(object *alien);
|
||||
void alien_setKlineAI(object *alien);
|
||||
void alien_searchForTarget(object *alien);
|
||||
int alien_checkTarget(object *alien);
|
||||
int alien_enemiesInFront(object *alien);
|
||||
void alien_move(object *alien);
|
||||
|
||||
#endif
|
||||
|
|
634
src/game.cpp
634
src/game.cpp
|
@ -122,6 +122,16 @@ void newGame()
|
|||
|
||||
int mainGameLoop()
|
||||
{
|
||||
static float barrierLoop = 0;
|
||||
|
||||
bool canFire;
|
||||
int shapeToUse;
|
||||
FILE *fp;
|
||||
char string[255];
|
||||
int index, alienType, placeAttempt;
|
||||
int barrierSpeed;
|
||||
int n;
|
||||
|
||||
resetLists();
|
||||
|
||||
setMission(currentGame.area);
|
||||
|
@ -129,7 +139,305 @@ int mainGameLoop()
|
|||
|
||||
initCargo();
|
||||
initPlayer();
|
||||
initAliens();
|
||||
|
||||
// Init aliens
|
||||
for (int i = 0 ; i < MAX_ALIENS ; i++)
|
||||
{
|
||||
enemy[i].active = false;
|
||||
enemy[i].shield = -1;
|
||||
enemy[i].flags = 0;
|
||||
}
|
||||
|
||||
engine.targetIndex = -1;
|
||||
|
||||
strcpy(string, "");
|
||||
barrierSpeed = 1;
|
||||
|
||||
sprintf(string, "data/aliens%d.dat", currentGame.area);
|
||||
fp = fopen(string, "rb");
|
||||
|
||||
if (fp != NULL)
|
||||
{
|
||||
while (fscanf(fp, "%d %d ", &index, &alienType) == 2)
|
||||
{
|
||||
placeAttempt = 0;
|
||||
|
||||
enemy[index] = defEnemy[alienType];
|
||||
enemy[index].owner = &enemy[index];
|
||||
enemy[index].target = &enemy[index];
|
||||
enemy[index].face = rand() % 2;
|
||||
enemy[index].active = true;
|
||||
|
||||
/*
|
||||
we make 1000 attempts to place this enemy since it is required. If after
|
||||
1000 attempts we still haven't managed to place the alien, then it
|
||||
simply isn't going to happen and we will just exit the game. The chances
|
||||
of this happening are very very low!
|
||||
*/
|
||||
while (true)
|
||||
{
|
||||
placeAttempt++;
|
||||
|
||||
if (alien_place(&enemy[index]))
|
||||
break;
|
||||
|
||||
if (placeAttempt > 1000)
|
||||
showErrorAndExit(2, "");
|
||||
}
|
||||
|
||||
if (currentGame.area == 2)
|
||||
addCargo(&enemy[index], P_CARGO);
|
||||
else if (currentGame.area == 7)
|
||||
addCargo(&enemy[index], P_PHOEBE);
|
||||
|
||||
if (index == WC_KLINE)
|
||||
{
|
||||
enemy[WC_KLINE].target = &player;
|
||||
if (currentGame.area == 25)
|
||||
enemy[WC_KLINE].shield = 500;
|
||||
}
|
||||
|
||||
if (enemy[index].classDef == CD_CLOAKFIGHTER)
|
||||
{
|
||||
enemy[index].active = false;
|
||||
enemy[index].maxShield = enemy[index].shield = 400;
|
||||
enemy[index].flags &= ~FL_RUNSAWAY;
|
||||
enemy[index].speed = 3;
|
||||
}
|
||||
|
||||
if ((enemy[index].classDef == CD_MOBILE_RAY) && (index >= 11))
|
||||
{
|
||||
enemy[index].active = false;
|
||||
}
|
||||
|
||||
if (enemy[index].classDef == CD_FIREFLY)
|
||||
{
|
||||
enemy[index].active = false;
|
||||
}
|
||||
|
||||
if (enemy[index].classDef == CD_BARRIER)
|
||||
{
|
||||
enemy[index].owner = &enemy[WC_BOSS];
|
||||
enemy[index].speed = barrierSpeed;
|
||||
barrierSpeed++;
|
||||
}
|
||||
|
||||
if ((currentGame.area == 17) && (enemy[index].classDef == CD_BOSS))
|
||||
{
|
||||
enemy[index].imageIndex[1] = 29;
|
||||
enemy[index].flags |= FL_IMMORTAL;
|
||||
}
|
||||
|
||||
if (currentGame.area == 18)
|
||||
enemy[index].flags |= FL_HASMINIMUMSPEED;
|
||||
|
||||
if (currentGame.area == 23)
|
||||
{
|
||||
enemy[index].flags = FL_WEAPCO;
|
||||
if (index == WC_BOSS)
|
||||
enemy[index].chance[1] = 5;
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
if (currentGame.area == 5)
|
||||
{
|
||||
enemy[WC_BOSS].target = &player;
|
||||
enemy[WC_BOSS].x = -screen->w / 2;
|
||||
enemy[WC_BOSS].y = screen->h / 2;
|
||||
|
||||
enemy[13].owner = &enemy[WC_BOSS];
|
||||
enemy[13].target = &player;
|
||||
enemy[13].dx = -25;
|
||||
enemy[13].dy = -21;
|
||||
|
||||
enemy[12].owner = &enemy[WC_BOSS];
|
||||
enemy[12].target = &player;
|
||||
enemy[12].dx = -20;
|
||||
enemy[12].dy = 37;
|
||||
}
|
||||
else if ((currentGame.area == 11) || (currentGame.area == 14))
|
||||
{
|
||||
enemy[WC_BOSS].target = &player;
|
||||
enemy[WC_BOSS].x = -screen->w / 2;
|
||||
enemy[WC_BOSS].y = screen->h / 2;
|
||||
|
||||
enemy[13].owner = &enemy[WC_BOSS];
|
||||
enemy[13].target = &player;
|
||||
enemy[13].dx = 15;
|
||||
enemy[13].dy = -22;
|
||||
|
||||
enemy[12].owner = &enemy[WC_BOSS];
|
||||
enemy[12].target = &player;
|
||||
enemy[12].dx = 15;
|
||||
enemy[12].dy = 22;
|
||||
|
||||
enemy[11].owner = &enemy[13];
|
||||
enemy[11].target = &player;
|
||||
enemy[11].dx = -35;
|
||||
enemy[11].dy = -12;
|
||||
|
||||
enemy[10].owner = &enemy[12];
|
||||
enemy[10].target = &player;
|
||||
enemy[10].dx = -35;
|
||||
enemy[10].dy = 20;
|
||||
|
||||
if (currentGame.area == 14)
|
||||
{
|
||||
enemy[WC_BOSS].AIType = AI_EVASIVE;
|
||||
|
||||
for (int i = 10 ; i < 15 ; i++)
|
||||
{
|
||||
enemy[i].imageIndex[0] += 15;
|
||||
enemy[i].imageIndex[1] += 15;
|
||||
|
||||
enemy[i].image[0] = shipShape[enemy[i].imageIndex[0]];
|
||||
enemy[i].image[1] = shipShape[enemy[i].imageIndex[1]];
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (currentGame.area == 21)
|
||||
{
|
||||
enemy[WC_BOSS].target = &player;
|
||||
enemy[WC_BOSS].x = -screen->w / 2;
|
||||
enemy[WC_BOSS].y = screen->h / 2;
|
||||
|
||||
enemy[13].owner = &enemy[WC_BOSS];
|
||||
enemy[13].dy = 20;
|
||||
|
||||
enemy[12].owner = &enemy[WC_BOSS];
|
||||
enemy[12].dy = -16;
|
||||
}
|
||||
}
|
||||
|
||||
// specific for Phoebe being captured!
|
||||
if (currentGame.area == 7)
|
||||
currentGame.hasWingMate1 = 1;
|
||||
|
||||
if (currentGame.area == 11)
|
||||
enemy[WC_KLINE].active = false;
|
||||
|
||||
for (int i = 0 ; i < engine.maxAliens ; i++)
|
||||
alien_add();
|
||||
|
||||
if (currentGame.hasWingMate1)
|
||||
alien_addFriendly(FR_PHOEBE);
|
||||
|
||||
if (currentGame.hasWingMate2)
|
||||
alien_addFriendly(FR_URSULA);
|
||||
|
||||
if ((currentGame.area == 9) || (currentGame.area == 17) ||
|
||||
(currentGame.area == 25))
|
||||
alien_addFriendly(FR_SID);
|
||||
|
||||
// Disable Wingmates for certain missions
|
||||
switch (currentGame.area)
|
||||
{
|
||||
case 7:
|
||||
case 9:
|
||||
case 10:
|
||||
case 15:
|
||||
case 16:
|
||||
case 18:
|
||||
case 24:
|
||||
case 26:
|
||||
enemy[FR_PHOEBE].active = false;
|
||||
enemy[FR_URSULA].active = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (currentGame.area == 10)
|
||||
{
|
||||
enemy[0].collectChance = 100;
|
||||
enemy[0].collectType = P_ESCAPEPOD;
|
||||
}
|
||||
|
||||
// Some specifics for interception missions
|
||||
if (currentGame.area == MAX_MISSIONS - 1)
|
||||
{
|
||||
if ((currentGame.system > 1) && ((rand() % 5) == 0))
|
||||
{
|
||||
enemy[WC_KLINE] = defEnemy[CD_KLINE];
|
||||
enemy[WC_KLINE].owner = &enemy[WC_KLINE];
|
||||
enemy[WC_KLINE].target = &player;
|
||||
enemy[WC_KLINE].shield = 100;
|
||||
enemy[WC_KLINE].active = true;
|
||||
enemy[WC_KLINE].x = player.x + 1000;
|
||||
enemy[WC_KLINE].y = player.y;
|
||||
player_setTarget(WC_KLINE);
|
||||
}
|
||||
|
||||
if ((currentGame.system == 2) && (currentGame.experimentalShield > 0))
|
||||
{
|
||||
if ((rand() % 2) == 0)
|
||||
{
|
||||
enemy[10] = defEnemy[CD_CLOAKFIGHTER];
|
||||
enemy[10].owner = &enemy[10];
|
||||
enemy[10].target = &enemy[10];
|
||||
enemy[10].shield = 1000;
|
||||
enemy[10].active = true;
|
||||
enemy[10].x = player.x - 1000;
|
||||
enemy[10].y = player.y;
|
||||
player_setTarget(10);
|
||||
enemy[10].shield = currentGame.experimentalShield;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (currentGame.area == 26)
|
||||
{
|
||||
enemy[WC_KLINE].flags |= FL_IMMORTAL | FL_NOFIRE | FL_NOMOVE;
|
||||
|
||||
enemy[WC_KLINE].x = screen->w * 2 / 3;
|
||||
enemy[WC_KLINE].y = screen->h * 2 / 3;
|
||||
|
||||
enemy[WC_KLINE].deathCounter = -250;
|
||||
enemy[WC_KLINE].maxShield = 1500;
|
||||
enemy[WC_KLINE].shield = 500;
|
||||
}
|
||||
|
||||
for (int i = 0 ; i < MAX_ALIENS ; i++)
|
||||
{
|
||||
enemy[i].systemPower = enemy[i].maxShield;
|
||||
enemy[i].deathCounter = 0 - (enemy[i].maxShield * 3);
|
||||
limitInt(&enemy[i].deathCounter, -350, 0);
|
||||
}
|
||||
|
||||
// Set target energy meter
|
||||
switch (currentGame.area)
|
||||
{
|
||||
case 5:
|
||||
case 11:
|
||||
case 13:
|
||||
case 17:
|
||||
case 18:
|
||||
case 19:
|
||||
case 20:
|
||||
case 21:
|
||||
case 23:
|
||||
player_setTarget(WC_BOSS);
|
||||
break;
|
||||
case 7:
|
||||
player_setTarget(FR_PHOEBE);
|
||||
break;
|
||||
case 8:
|
||||
player_setTarget(19);
|
||||
break;
|
||||
case 9:
|
||||
player_setTarget(FR_SID);
|
||||
break;
|
||||
case 10:
|
||||
player_setTarget(0);
|
||||
break;
|
||||
case 25:
|
||||
case 26:
|
||||
player_setTarget(WC_KLINE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
clearInfoLines();
|
||||
|
||||
loadScriptEvents();
|
||||
|
@ -174,7 +482,8 @@ int mainGameLoop()
|
|||
// Default to no aliens dead...
|
||||
engine.allAliensDead = 0;
|
||||
|
||||
engine.keyState[KEY_FIRE] = engine.keyState[KEY_ALTFIRE] = 0;
|
||||
engine.keyState[KEY_FIRE] = 0;
|
||||
engine.keyState[KEY_ALTFIRE] = 0;
|
||||
flushInput();
|
||||
|
||||
while (engine.done != 1)
|
||||
|
@ -260,7 +569,323 @@ int mainGameLoop()
|
|||
doStarfield();
|
||||
doCollectables();
|
||||
doBullets();
|
||||
doAliens();
|
||||
|
||||
barrierLoop += 0.2;
|
||||
|
||||
// A global variable for checking if all the aliens are dead
|
||||
engine.allAliensDead = 1;
|
||||
|
||||
object *alien = enemy;
|
||||
|
||||
for (int i = 0 ; i < MAX_ALIENS ; i++)
|
||||
{
|
||||
if (alien->active)
|
||||
{
|
||||
if (alien->shield > 0)
|
||||
{
|
||||
if ((alien->flags & FL_WEAPCO) && (!(alien->flags & FL_DISABLED)))
|
||||
engine.allAliensDead = 0;
|
||||
|
||||
// Set part attributes
|
||||
if (alien->owner != alien)
|
||||
{
|
||||
alien->face = alien->owner->face;
|
||||
|
||||
if (alien->face == 0)
|
||||
alien->x = alien->owner->x - alien->dx;
|
||||
else
|
||||
alien->x = alien->owner->x + alien->owner->image[0]->w + alien->dx - alien->image[0]->w;
|
||||
|
||||
alien->y = (alien->owner->y + alien->dy);
|
||||
|
||||
if (alien->owner->shield < 1)
|
||||
{
|
||||
if ((alien->classDef != CD_URANUSBOSSWING1) &&
|
||||
(alien->classDef != CD_URANUSBOSSWING2))
|
||||
{
|
||||
alien->shield = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
alien->flags &= ~FL_IMMORTAL;
|
||||
alien->owner = alien;
|
||||
alien->chance[0] = 25;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
canFire = true; // The alien is allowed to fire
|
||||
|
||||
limitInt(&--alien->thinktime, 0, 250);
|
||||
|
||||
if (alien->target->shield < 1)
|
||||
alien->target = alien;
|
||||
|
||||
// Specific to Sid to stop him pissing about(!)
|
||||
if ((alien->classDef == CD_SID) &&
|
||||
(alien->target->flags & FL_DISABLED))
|
||||
alien->target = alien;
|
||||
|
||||
if (alien->target == alien)
|
||||
{
|
||||
if (engine.missionCompleteTimer == 0)
|
||||
{
|
||||
alien_searchForTarget(alien);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (alien->flags & FL_FRIEND)
|
||||
{
|
||||
alien->target = &player;
|
||||
alien->thinktime = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((!(alien->flags & FL_DISABLED)) &&
|
||||
(alien->thinktime == 0) && (alien->target != alien) &&
|
||||
(alien->owner == alien))
|
||||
{
|
||||
if (alien->classDef == CD_KLINE)
|
||||
alien_setKlineAI(alien);
|
||||
else
|
||||
alien_setAI(alien);
|
||||
|
||||
alien->thinktime = (rand() % 25) * 10;
|
||||
|
||||
// Face direction of movement unless you always face
|
||||
// your target(!)
|
||||
if (!(alien->flags & FL_ALWAYSFACE))
|
||||
{
|
||||
alien->face = (alien->dx > 0);
|
||||
}
|
||||
|
||||
limitFloat(&alien->dx, 0 - alien->speed, alien->speed);
|
||||
limitFloat(&alien->dy, 0 - alien->speed, alien->speed);
|
||||
|
||||
}
|
||||
|
||||
if (alien->flags & FL_ALWAYSFACE)
|
||||
{
|
||||
alien->face = 0;
|
||||
if (alien->x > alien->target->x) alien->face = 1;
|
||||
}
|
||||
|
||||
if ((currentGame.area == 18) && (alien->classDef == CD_BOSS))
|
||||
alien->face = 0;
|
||||
|
||||
if ((alien->flags & FL_DEPLOYDRONES) && ((rand() % 300) == 0))
|
||||
alien_addDrone(alien);
|
||||
|
||||
if (alien->flags & FL_LEAVESECTOR)
|
||||
{
|
||||
limitFloat(&(alien->dx -= 0.5), 0, -15);
|
||||
alien->dy = 0;
|
||||
alien->thinktime = 999;
|
||||
alien->face = 0;
|
||||
|
||||
if (alien->x >= 5000)
|
||||
{
|
||||
alien->flags -= FL_LEAVESECTOR;
|
||||
alien->flags += FL_ESCAPED;
|
||||
alien->active = false;
|
||||
|
||||
if (alien->classDef == CD_CLOAKFIGHTER)
|
||||
{
|
||||
currentGame.experimentalShield = alien->shield;
|
||||
setInfoLine("Experimental Fighter has fled",
|
||||
FONT_CYAN);
|
||||
}
|
||||
|
||||
alien->shield = 0;
|
||||
updateMissionRequirements(M_ESCAPE_TARGET,
|
||||
alien->classDef, 1);
|
||||
|
||||
if (alien->classDef != CD_CLOAKFIGHTER)
|
||||
updateMissionRequirements(M_DESTROY_TARGET_TYPE,
|
||||
alien->classDef, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// This deals with the Experimental Fighter in Mordor
|
||||
// (and Kline on the final mission)
|
||||
// It can cloak and uncloak at random. When cloaked,
|
||||
// its sprite is not displayed. However the engine
|
||||
// trail is still visible!
|
||||
if ((alien->flags & FL_CANCLOAK) && ((rand() % 500) == 0))
|
||||
{
|
||||
if (alien->flags & FL_ISCLOAKED)
|
||||
alien->flags -= FL_ISCLOAKED;
|
||||
else
|
||||
alien->flags += FL_ISCLOAKED;
|
||||
playSound(SFX_CLOAK, alien->x);
|
||||
}
|
||||
|
||||
if (alien->classDef == CD_BARRIER)
|
||||
{
|
||||
alien->dx = -10 + (sinf(barrierLoop + alien->speed) * 60);
|
||||
alien->dy = 20 + (cosf(barrierLoop + alien->speed) * 40);
|
||||
}
|
||||
|
||||
if (alien->classDef == CD_MOBILESHIELD)
|
||||
{
|
||||
limitInt(&(++enemy[WC_BOSS].shield), 0, enemy[WC_BOSS].maxShield);
|
||||
}
|
||||
|
||||
limitCharAdd(&alien->reload[0], -1, 0, 999);
|
||||
limitCharAdd(&alien->reload[1], -1, 0, 999);
|
||||
|
||||
if ((!(alien->flags & FL_DISABLED)) &&
|
||||
(!(alien->flags & FL_NOFIRE)))
|
||||
{
|
||||
if ((alien->target->shield > 0))
|
||||
canFire = alien_checkTarget(alien);
|
||||
|
||||
if (((alien->thinktime % 2) == 0) &&
|
||||
(alien->flags & FL_FRIEND))
|
||||
canFire = alien_enemiesInFront(alien);
|
||||
}
|
||||
else
|
||||
{
|
||||
canFire = false;
|
||||
}
|
||||
|
||||
if ((canFire) && (dev.fireAliens))
|
||||
{
|
||||
if ((alien->reload[0] == 0) &&
|
||||
((rand() % 1000 < alien->chance[0]) ||
|
||||
(alien->flags & FL_CONTINUOUS_FIRE)))
|
||||
{
|
||||
fireBullet(alien, 0);
|
||||
}
|
||||
if ((alien->reload[1] == 0) &&
|
||||
((rand() % 1000 < alien->chance[1]) ||
|
||||
(alien->flags & FL_CONTINUOUS_FIRE)))
|
||||
{
|
||||
if ((alien->weaponType[1] != W_ENERGYRAY) &&
|
||||
(alien->weaponType[1] != W_LASER))
|
||||
{
|
||||
if (alien->weaponType[1] == W_CHARGER)
|
||||
alien->ammo[1] = 50 + rand() % 150;
|
||||
fireBullet(alien, 1);
|
||||
}
|
||||
else if (alien->weaponType[1] == W_LASER)
|
||||
{
|
||||
alien->flags += FL_FIRELASER;
|
||||
}
|
||||
else if ((alien->weaponType[1] == W_ENERGYRAY) &&
|
||||
(alien->ammo[0] == 250))
|
||||
{
|
||||
alien->flags += FL_FIRERAY;
|
||||
playSound(SFX_ENERGYRAY, alien->x);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (alien->flags & FL_FIRERAY)
|
||||
{
|
||||
fireRay(alien);
|
||||
}
|
||||
else
|
||||
{
|
||||
limitCharAdd(&alien->ammo[0], 1, 0, 250);
|
||||
}
|
||||
|
||||
if (alien->flags & FL_FIRELASER)
|
||||
{
|
||||
fireBullet(alien, 1);
|
||||
if ((rand() % 25) == 0)
|
||||
alien->flags -= FL_FIRELASER;
|
||||
}
|
||||
|
||||
if (alien->flags & FL_DROPMINES)
|
||||
{
|
||||
if ((rand() % 150) == 0)
|
||||
addCollectable(alien->x, alien->y, P_MINE, 25,
|
||||
600 + rand() % 2400);
|
||||
|
||||
// Kline drops mines a lot more often
|
||||
if ((alien == &enemy[WC_KLINE]))
|
||||
{
|
||||
if ((rand() % 10) == 0)
|
||||
addCollectable(alien->x, alien->y, P_MINE, 25,
|
||||
600 + rand() % 2400);
|
||||
}
|
||||
}
|
||||
|
||||
shapeToUse = alien->imageIndex[alien->face];
|
||||
|
||||
if (alien->hit)
|
||||
shapeToUse += SHIP_HIT_INDEX;
|
||||
|
||||
limitCharAdd(&alien->hit, -1, 0, 100);
|
||||
|
||||
if ((alien->x + alien->image[0]->w > 0) &&
|
||||
(alien->x < screen->w) &&
|
||||
(alien->y + alien->image[0]->h > 0) &&
|
||||
(alien->y < screen->h))
|
||||
{
|
||||
if ((!(alien->flags & FL_DISABLED)) &&
|
||||
(alien->classDef != CD_ASTEROID) &&
|
||||
(alien->classDef != CD_ASTEROID2))
|
||||
addEngine(alien);
|
||||
if ((!(alien->flags & FL_ISCLOAKED)) || (alien->hit > 0))
|
||||
blit(shipShape[shapeToUse], (int)alien->x,
|
||||
(int)alien->y);
|
||||
if (alien->flags & FL_DISABLED)
|
||||
{
|
||||
if ((rand() % 10) == 0)
|
||||
addExplosion(alien->x + (rand() % alien->image[0]->w), alien->y + (rand() % alien->image[0]->h), E_ELECTRICAL);
|
||||
}
|
||||
}
|
||||
|
||||
if ((currentGame.area == 24) && (alien->x < -300))
|
||||
alien->active = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
alien->shield--;
|
||||
if ((alien->x > 0) && (alien->x < screen->w) &&
|
||||
(alien->y > 0) && (alien->y < screen->h))
|
||||
{
|
||||
blit(alien->image[alien->face], (int)alien->x, (int)alien->y);
|
||||
addExplosion(alien->x + (rand() % alien->image[0]->w), alien->y + (rand() % alien->image[0]->h), E_BIG_EXPLOSION);
|
||||
}
|
||||
if (alien->shield < alien->deathCounter)
|
||||
{
|
||||
alien->active = false;
|
||||
if ((alien->classDef == CD_BOSS) ||
|
||||
(alien->owner == &enemy[WC_BOSS]) ||
|
||||
(alien->flags & FL_FRIEND) ||
|
||||
(alien->classDef == CD_ASTEROID) ||
|
||||
(alien->classDef == CD_KLINE))
|
||||
addDebris((int)alien->x, (int)alien->y,
|
||||
alien->maxShield);
|
||||
|
||||
if (alien->classDef == CD_ASTEROID)
|
||||
{
|
||||
n = 1 + (rand() % 3);
|
||||
for (int i = 0 ; i < n ; i++)
|
||||
alien_addSmallAsteroid(alien);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust the movement even whilst exploding
|
||||
if ((dev.moveAliens) && (!(alien->flags & FL_NOMOVE)) &&
|
||||
(!(alien->flags & FL_DISABLED)))
|
||||
alien_move(alien);
|
||||
|
||||
if ((currentGame.area != 18) || (alien->shield < 0))
|
||||
alien->x += engine.ssx;
|
||||
|
||||
alien->x += engine.smx;
|
||||
alien->y += engine.ssy + engine.smy;
|
||||
}
|
||||
|
||||
alien++;
|
||||
}
|
||||
|
||||
doPlayer();
|
||||
doCargo();
|
||||
doDebris();
|
||||
|
@ -285,7 +910,8 @@ int mainGameLoop()
|
|||
if ((currentGame.area == 24) && (engine.addAliens > -1))
|
||||
{
|
||||
if ((rand() % 10) == 0)
|
||||
addCollectable(rrand(800, 100), player.y, P_MINE, 25, 180 + rand() % 60);
|
||||
addCollectable(rrand(800, 100), player.y, P_MINE, 25,
|
||||
180 + rand() % 60);
|
||||
}
|
||||
|
||||
if (engine.addAliens > -1)
|
||||
|
|
|
@ -40,8 +40,6 @@ void initVars()
|
|||
star[i].speed = 1 + (rand() % 3);
|
||||
}
|
||||
|
||||
// These are good values for sound and music
|
||||
|
||||
if (engine.useAudio)
|
||||
{
|
||||
Mix_Volume(-1, 100);
|
||||
|
|
|
@ -262,6 +262,19 @@ void setMission(int mission)
|
|||
engine.timeTaken = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
Call this whenever a mission requires all the remaining aliens to
|
||||
automatically die
|
||||
*/
|
||||
static void mission_killAllEnemies()
|
||||
{
|
||||
for (int i = 0 ; i < MAX_ALIENS ; i++)
|
||||
{
|
||||
if ((enemy[i].flags & FL_WEAPCO) && (enemy[i].active) && (enemy[i].shield > 0))
|
||||
enemy[i].shield = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void checkTimer()
|
||||
{
|
||||
for (int i = 0 ; i < 3 ; i++)
|
||||
|
|
|
@ -64,6 +64,13 @@ void initPlayer()
|
|||
player.ammo[1] = 0;
|
||||
}
|
||||
|
||||
void player_setTarget(int index)
|
||||
{
|
||||
engine.targetIndex = index;
|
||||
engine.targetShield = 85;
|
||||
engine.targetShield /= enemy[index].shield;
|
||||
}
|
||||
|
||||
void exitPlayer()
|
||||
{
|
||||
charger_fired = false;
|
||||
|
|
|
@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
extern object player;
|
||||
|
||||
extern void initPlayer();
|
||||
void player_setTarget(int index);
|
||||
extern void exitPlayer();
|
||||
extern void doPlayer();
|
||||
extern void flushInput();
|
||||
|
|
|
@ -130,7 +130,16 @@ void loadGameGraphics()
|
|||
|
||||
loadBackground(systemBackground[currentGame.system]);
|
||||
|
||||
setAlienShapes();
|
||||
for (int i = 0 ; i < MAX_DEFALIENS ; i++)
|
||||
{
|
||||
if (shipShape[defEnemy[i].imageIndex[0]] != NULL)
|
||||
{
|
||||
defEnemy[i].image[0] = shipShape[defEnemy[i].imageIndex[0]];
|
||||
defEnemy[i].image[1] = shipShape[defEnemy[i].imageIndex[1]];
|
||||
defEnemy[i].engineX = defEnemy[i].image[0]->w;
|
||||
defEnemy[i].engineY = (defEnemy[i].image[0]->h / 2);
|
||||
}
|
||||
}
|
||||
|
||||
setWeaponShapes();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue