From 31a8383f90d8c66caa2ff61eeef1fe0be1c62246 Mon Sep 17 00:00:00 2001 From: onpon4 Date: Sun, 8 Mar 2015 20:59:33 -0400 Subject: [PATCH] Changed the way Kline works. Kline previously had a maximum of 500 or 750 health, and uses some hacks to cause it to flee just as it was destroyed, and to advance to new stages in the final battle. I've replaced this with a much larger amount of health, and progression being based on how much health he has. Also some other stuff. --- src/Starfighter.cpp | 641 +---------------------------------------- src/aliens.cpp | 688 ++++++++++++++++++++++++++++++++++++++++++-- src/aliens.h | 3 +- src/bullets.cpp | 75 +++-- src/cargo.cpp | 6 +- src/collectable.cpp | 27 +- src/defs.h | 17 +- src/game.cpp | 182 ++++++------ src/messages.cpp | 10 +- src/misc.cpp | 2 +- src/missions.cpp | 15 +- src/player.cpp | 8 +- src/script.cpp | 4 +- 13 files changed, 852 insertions(+), 826 deletions(-) diff --git a/src/Starfighter.cpp b/src/Starfighter.cpp index de0c35d..acb435c 100644 --- a/src/Starfighter.cpp +++ b/src/Starfighter.cpp @@ -110,647 +110,8 @@ int main(int argc, char **argv) audio_loadSounds(); initWeapons(); - initVars(); - - // Dual Plasma Fighter. - alien_defs[CD_DUALFIGHTER].classDef = CD_DUALFIGHTER; - alien_defs[CD_DUALFIGHTER].AIType = AI_NORMAL; - alien_defs[CD_DUALFIGHTER].speed = 4; - alien_defs[CD_DUALFIGHTER].maxShield = 5; - alien_defs[CD_DUALFIGHTER].shield = 5; - alien_defs[CD_DUALFIGHTER].imageIndex[0] = 2; - alien_defs[CD_DUALFIGHTER].imageIndex[1] = 3; - alien_defs[CD_DUALFIGHTER].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_DUALFIGHTER].weaponType[1] = W_ROCKETS; - alien_defs[CD_DUALFIGHTER].chance[0] = 100; - alien_defs[CD_DUALFIGHTER].chance[1] = 1; - alien_defs[CD_DUALFIGHTER].collectChance = 50; - alien_defs[CD_DUALFIGHTER].collectType = P_ANYTHING; - alien_defs[CD_DUALFIGHTER].collectValue = 50; - alien_defs[CD_DUALFIGHTER].flags = FL_WEAPCO; - - // Missile Boat - alien_defs[CD_MISSILEBOAT].classDef = CD_MISSILEBOAT; - alien_defs[CD_MISSILEBOAT].AIType = AI_DEFENSIVE; - alien_defs[CD_MISSILEBOAT].speed = 2; - alien_defs[CD_MISSILEBOAT].maxShield = 50; - alien_defs[CD_MISSILEBOAT].shield = 50; - alien_defs[CD_MISSILEBOAT].imageIndex[0] = 4; - alien_defs[CD_MISSILEBOAT].imageIndex[1] = 5; - alien_defs[CD_MISSILEBOAT].weaponType[0] = W_ROCKETS; - alien_defs[CD_MISSILEBOAT].weaponType[1] = W_DOUBLE_ROCKETS; - alien_defs[CD_MISSILEBOAT].chance[0] = 25; - alien_defs[CD_MISSILEBOAT].chance[1] = 4; - alien_defs[CD_MISSILEBOAT].collectChance = 25; - alien_defs[CD_MISSILEBOAT].collectType = P_ANYTHING; - alien_defs[CD_MISSILEBOAT].collectValue = 75; - alien_defs[CD_MISSILEBOAT].flags = FL_WEAPCO; - - //Prototype fighter - alien_defs[CD_PROTOFIGHTER].classDef = CD_PROTOFIGHTER; - alien_defs[CD_PROTOFIGHTER].AIType = AI_DEFENSIVE; - alien_defs[CD_PROTOFIGHTER].speed = 5; - alien_defs[CD_PROTOFIGHTER].maxShield = 15; - alien_defs[CD_PROTOFIGHTER].shield = 15; - alien_defs[CD_PROTOFIGHTER].imageIndex[0] = 6; - alien_defs[CD_PROTOFIGHTER].imageIndex[1] = 7; - alien_defs[CD_PROTOFIGHTER].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_PROTOFIGHTER].weaponType[1] = P_ANYTHING; - alien_defs[CD_PROTOFIGHTER].chance[0] = 100; - alien_defs[CD_PROTOFIGHTER].chance[1] = 1; - alien_defs[CD_PROTOFIGHTER].collectChance = 50; - alien_defs[CD_PROTOFIGHTER].collectType = P_ANYTHING; - alien_defs[CD_PROTOFIGHTER].collectValue = 50; - alien_defs[CD_PROTOFIGHTER].flags = FL_WEAPCO; - - // Phoebe and Ursula - alien_defs[CD_FRIEND].classDef = CD_FRIEND; - alien_defs[CD_FRIEND].AIType = AI_OFFENSIVE; - alien_defs[CD_FRIEND].speed = 3; - alien_defs[CD_FRIEND].maxShield = 50; - alien_defs[CD_FRIEND].shield = 50; - alien_defs[CD_FRIEND].imageIndex[0] = 20; - alien_defs[CD_FRIEND].imageIndex[1] = 21; - alien_defs[CD_FRIEND].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_FRIEND].weaponType[1] = W_HOMING_MISSILE; - alien_defs[CD_FRIEND].chance[0] = 100; - alien_defs[CD_FRIEND].chance[1] = 5; - alien_defs[CD_FRIEND].collectChance = 0; - alien_defs[CD_FRIEND].collectType = P_CASH; - alien_defs[CD_FRIEND].collectValue = 0; - alien_defs[CD_FRIEND].flags = FL_FRIEND; - - // Boss 1 - alien_defs[CD_FRIGATE].classDef = CD_BOSS; - alien_defs[CD_FRIGATE].AIType = AI_NORMAL; - alien_defs[CD_FRIGATE].speed = 2; - alien_defs[CD_FRIGATE].maxShield = 550; - alien_defs[CD_FRIGATE].shield = 550; - alien_defs[CD_FRIGATE].imageIndex[0] = 8; - alien_defs[CD_FRIGATE].imageIndex[1] = 9; - alien_defs[CD_FRIGATE].weaponType[0] = W_MICRO_ROCKETS; - alien_defs[CD_FRIGATE].weaponType[1] = W_ENERGYRAY; - alien_defs[CD_FRIGATE].chance[0] = 100; - alien_defs[CD_FRIGATE].chance[1] = 85; - alien_defs[CD_FRIGATE].collectChance = 100; - alien_defs[CD_FRIGATE].collectType = P_CASH; - alien_defs[CD_FRIGATE].collectValue = 500; - alien_defs[CD_FRIGATE].flags = FL_WEAPCO; - - alien_defs[CD_FRIGATE_WING1].classDef = CD_FRIGATE_WING1; - alien_defs[CD_FRIGATE_WING1].AIType = AI_NORMAL; - alien_defs[CD_FRIGATE_WING1].speed = 2; - alien_defs[CD_FRIGATE_WING1].maxShield = 100; - alien_defs[CD_FRIGATE_WING1].shield = 100; - alien_defs[CD_FRIGATE_WING1].imageIndex[0] = 10; - alien_defs[CD_FRIGATE_WING1].imageIndex[1] = 11; - alien_defs[CD_FRIGATE_WING1].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_FRIGATE_WING1].weaponType[1] = W_ROCKETS; - alien_defs[CD_FRIGATE_WING1].chance[0] = 100; - alien_defs[CD_FRIGATE_WING1].chance[1] = 10; - alien_defs[CD_FRIGATE_WING1].collectChance = 100; - alien_defs[CD_FRIGATE_WING1].collectType = P_ANYTHING; - alien_defs[CD_FRIGATE_WING1].collectValue = 250; - alien_defs[CD_FRIGATE_WING1].flags = FL_WEAPCO | FL_DAMAGEOWNER; - - alien_defs[CD_FRIGATE_WING2].classDef = CD_FRIGATE_WING2; - alien_defs[CD_FRIGATE_WING2].AIType = AI_NORMAL; - alien_defs[CD_FRIGATE_WING2].speed = 2; - alien_defs[CD_FRIGATE_WING2].maxShield = 100; - alien_defs[CD_FRIGATE_WING2].shield = 100; - alien_defs[CD_FRIGATE_WING2].imageIndex[0] = 12; - alien_defs[CD_FRIGATE_WING2].imageIndex[1] = 13; - alien_defs[CD_FRIGATE_WING2].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_FRIGATE_WING2].weaponType[1] = W_ROCKETS; - alien_defs[CD_FRIGATE_WING2].chance[0] = 100; - alien_defs[CD_FRIGATE_WING2].chance[1] = 10; - alien_defs[CD_FRIGATE_WING2].collectChance = 100; - alien_defs[CD_FRIGATE_WING2].collectType = P_ANYTHING; - alien_defs[CD_FRIGATE_WING2].collectValue = 250; - alien_defs[CD_FRIGATE_WING2].flags = FL_WEAPCO | FL_DAMAGEOWNER; - - // Transport ship - alien_defs[CD_TRANSPORTSHIP].classDef = CD_TRANSPORTSHIP; - alien_defs[CD_TRANSPORTSHIP].AIType = AI_EVASIVE; - alien_defs[CD_TRANSPORTSHIP].speed = 4; - alien_defs[CD_TRANSPORTSHIP].maxShield = 10; - alien_defs[CD_TRANSPORTSHIP].shield = 10; - alien_defs[CD_TRANSPORTSHIP].imageIndex[0] = 14; - alien_defs[CD_TRANSPORTSHIP].imageIndex[1] = 15; - alien_defs[CD_TRANSPORTSHIP].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_TRANSPORTSHIP].weaponType[1] = W_DOUBLE_SHOT; - alien_defs[CD_TRANSPORTSHIP].chance[0] = 0; - alien_defs[CD_TRANSPORTSHIP].chance[1] = 0; - alien_defs[CD_TRANSPORTSHIP].collectChance = 100; - alien_defs[CD_TRANSPORTSHIP].collectType = P_WEAPONS; - alien_defs[CD_TRANSPORTSHIP].collectValue = 30; - alien_defs[CD_TRANSPORTSHIP].flags = FL_WEAPCO | FL_NOFIRE; - - // Cargo ship - alien_defs[CD_CARGOSHIP].classDef = CD_CARGOSHIP; - alien_defs[CD_CARGOSHIP].AIType = AI_EVASIVE; - alien_defs[CD_CARGOSHIP].speed = 4; - alien_defs[CD_CARGOSHIP].maxShield = 10; - alien_defs[CD_CARGOSHIP].shield = 10; - alien_defs[CD_CARGOSHIP].imageIndex[0] = 22; - alien_defs[CD_CARGOSHIP].imageIndex[1] = 23; - alien_defs[CD_CARGOSHIP].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_CARGOSHIP].weaponType[1] = W_DOUBLE_SHOT; - alien_defs[CD_CARGOSHIP].chance[0] = 0; - alien_defs[CD_CARGOSHIP].chance[1] = 0; - alien_defs[CD_CARGOSHIP].collectChance = 50; - alien_defs[CD_CARGOSHIP].collectType = P_ANYTHING; - alien_defs[CD_CARGOSHIP].collectValue = 100; - alien_defs[CD_CARGOSHIP].flags = FL_WEAPCO | FL_NOFIRE; - - // Weapco Miner - alien_defs[CD_MINER].classDef = CD_MINER; - alien_defs[CD_MINER].AIType = AI_EVASIVE; - alien_defs[CD_MINER].speed = 4; - alien_defs[CD_MINER].maxShield = 25; - alien_defs[CD_MINER].shield = 25; - alien_defs[CD_MINER].imageIndex[0] = 16; - alien_defs[CD_MINER].imageIndex[1] = 17; - alien_defs[CD_MINER].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_MINER].weaponType[1] = W_DOUBLE_SHOT; - alien_defs[CD_MINER].chance[0] = 0; - alien_defs[CD_MINER].chance[1] = 0; - alien_defs[CD_MINER].collectChance = 100; - alien_defs[CD_MINER].collectType = P_ANYTHING; - alien_defs[CD_MINER].collectValue = 30; - alien_defs[CD_MINER].flags = FL_WEAPCO | FL_NOFIRE | FL_DROPMINES; - - // Kline - alien_defs[CD_KLINE].classDef = CD_KLINE; - alien_defs[CD_KLINE].AIType = AI_OFFENSIVE; - alien_defs[CD_KLINE].speed = 5; - alien_defs[CD_KLINE].maxShield = 500; - alien_defs[CD_KLINE].shield = 500; - alien_defs[CD_KLINE].imageIndex[0] = 18; - alien_defs[CD_KLINE].imageIndex[1] = 19; - alien_defs[CD_KLINE].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_KLINE].weaponType[1] = W_MICRO_ROCKETS; - alien_defs[CD_KLINE].chance[0] = 100; - alien_defs[CD_KLINE].chance[1] = 2; - alien_defs[CD_KLINE].collectChance = 0; - alien_defs[CD_KLINE].collectType = P_ANYTHING; - alien_defs[CD_KLINE].collectValue = 0; - alien_defs[CD_KLINE].flags = FL_WEAPCO | FL_CANNOTDIE | FL_ALWAYSFACE | FL_CIRCLES; - - // Aim Fighter - alien_defs[CD_AIMFIGHTER].classDef = CD_AIMFIGHTER; - alien_defs[CD_AIMFIGHTER].AIType = AI_NORMAL; - alien_defs[CD_AIMFIGHTER].speed = 3; - alien_defs[CD_AIMFIGHTER].maxShield = 15; - alien_defs[CD_AIMFIGHTER].shield = 15; - alien_defs[CD_AIMFIGHTER].imageIndex[0] = 8; - alien_defs[CD_AIMFIGHTER].imageIndex[1] = 9; - alien_defs[CD_AIMFIGHTER].weaponType[0] = W_AIMED_SHOT; - alien_defs[CD_AIMFIGHTER].weaponType[1] = W_AIMED_SHOT; - alien_defs[CD_AIMFIGHTER].chance[0] = 7; - alien_defs[CD_AIMFIGHTER].chance[1] = 1; - alien_defs[CD_AIMFIGHTER].collectChance = 75; - alien_defs[CD_AIMFIGHTER].collectType = P_ANYTHING; - alien_defs[CD_AIMFIGHTER].collectValue = 100; - alien_defs[CD_AIMFIGHTER].flags = FL_WEAPCO | FL_AIMS; - - // Slave ship - alien_defs[CD_SLAVETRANSPORT].classDef = CD_SLAVETRANSPORT; - alien_defs[CD_SLAVETRANSPORT].AIType = AI_EVASIVE; - alien_defs[CD_SLAVETRANSPORT].speed = 2; - alien_defs[CD_SLAVETRANSPORT].maxShield = 10; - alien_defs[CD_SLAVETRANSPORT].shield = 20; - alien_defs[CD_SLAVETRANSPORT].imageIndex[0] = 10; - alien_defs[CD_SLAVETRANSPORT].imageIndex[1] = 11; - alien_defs[CD_SLAVETRANSPORT].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_SLAVETRANSPORT].weaponType[1] = W_DOUBLE_SHOT; - alien_defs[CD_SLAVETRANSPORT].chance[0] = 0; - alien_defs[CD_SLAVETRANSPORT].chance[1] = 0; - alien_defs[CD_SLAVETRANSPORT].collectChance = 100; - alien_defs[CD_SLAVETRANSPORT].collectType = P_SLAVES; - alien_defs[CD_SLAVETRANSPORT].collectValue = 25; - alien_defs[CD_SLAVETRANSPORT].flags = FL_WEAPCO | FL_NOFIRE; - - // Good Transport - alien_defs[CD_GOODTRANSPORT].classDef = CD_GOODTRANSPORT; - alien_defs[CD_GOODTRANSPORT].AIType = AI_EVASIVE; - alien_defs[CD_GOODTRANSPORT].speed = 3; - alien_defs[CD_GOODTRANSPORT].maxShield = 75; - alien_defs[CD_GOODTRANSPORT].shield = 75; - alien_defs[CD_GOODTRANSPORT].imageIndex[0] = 12; - alien_defs[CD_GOODTRANSPORT].imageIndex[1] = 13; - alien_defs[CD_GOODTRANSPORT].weaponType[0] = W_AIMED_SHOT; - alien_defs[CD_GOODTRANSPORT].weaponType[1] = W_AIMED_SHOT; - alien_defs[CD_GOODTRANSPORT].chance[0] = 100; - alien_defs[CD_GOODTRANSPORT].chance[1] = 100; - alien_defs[CD_GOODTRANSPORT].collectChance = 0; - alien_defs[CD_GOODTRANSPORT].collectType = P_ANYTHING; - alien_defs[CD_GOODTRANSPORT].collectValue = 0; - alien_defs[CD_GOODTRANSPORT].flags = FL_FRIEND | FL_NOFIRE | FL_AIMS; - - // Sid Wilson - alien_defs[CD_SID].classDef = CD_SID; - alien_defs[CD_SID].AIType = AI_NORMAL; - alien_defs[CD_SID].speed = 3; - alien_defs[CD_SID].maxShield = 50; - alien_defs[CD_SID].shield = 50; - alien_defs[CD_SID].imageIndex[0] = 24; - alien_defs[CD_SID].imageIndex[1] = 25; - alien_defs[CD_SID].weaponType[0] = W_IONCANNON; - alien_defs[CD_SID].weaponType[1] = W_IONCANNON; - alien_defs[CD_SID].chance[0] = 100; - alien_defs[CD_SID].chance[1] = 0; - alien_defs[CD_SID].collectChance = 0; - alien_defs[CD_SID].collectType = P_ANYTHING; - alien_defs[CD_SID].collectValue = 0; - alien_defs[CD_SID].flags = FL_FRIEND | FL_AIMS; - - // Mining Vessel Boss - alien_defs[CD_MINEBOSS].classDef = CD_BOSS; - alien_defs[CD_MINEBOSS].AIType = AI_NORMAL; - alien_defs[CD_MINEBOSS].speed = 3; - alien_defs[CD_MINEBOSS].maxShield = 1000; - alien_defs[CD_MINEBOSS].shield = 1000; - alien_defs[CD_MINEBOSS].imageIndex[0] = 26; - alien_defs[CD_MINEBOSS].imageIndex[1] = 27; - alien_defs[CD_MINEBOSS].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_MINEBOSS].weaponType[1] = W_SPREADSHOT; - alien_defs[CD_MINEBOSS].chance[0] = 0; - alien_defs[CD_MINEBOSS].chance[1] = 0; - alien_defs[CD_MINEBOSS].collectChance = 100; - alien_defs[CD_MINEBOSS].collectType = P_ANYTHING; - alien_defs[CD_MINEBOSS].collectValue = 1000; - alien_defs[CD_MINEBOSS].flags = FL_WEAPCO | FL_IMMORTAL; - - alien_defs[CD_BOSS2_WING1].classDef = CD_BOSS2_WING1; - alien_defs[CD_BOSS2_WING1].AIType = AI_NORMAL; - alien_defs[CD_BOSS2_WING1].speed = 1; - alien_defs[CD_BOSS2_WING1].maxShield = 250; - alien_defs[CD_BOSS2_WING1].shield = 250; - alien_defs[CD_BOSS2_WING1].imageIndex[0] = 28; - alien_defs[CD_BOSS2_WING1].imageIndex[1] = 29; - alien_defs[CD_BOSS2_WING1].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_BOSS2_WING1].weaponType[1] = W_SPREADSHOT; - alien_defs[CD_BOSS2_WING1].chance[0] = 0; - alien_defs[CD_BOSS2_WING1].chance[1] = 0; - alien_defs[CD_BOSS2_WING1].collectChance = 100; - alien_defs[CD_BOSS2_WING1].collectType = P_ANYTHING; - alien_defs[CD_BOSS2_WING1].collectValue = 250; - alien_defs[CD_BOSS2_WING1].flags = FL_WEAPCO | FL_DAMAGEOWNER; - - alien_defs[CD_BOSS2_WING2].classDef = CD_BOSS2_WING2; - alien_defs[CD_BOSS2_WING2].AIType = AI_NORMAL; - alien_defs[CD_BOSS2_WING2].speed = 1; - alien_defs[CD_BOSS2_WING2].maxShield = 500; - alien_defs[CD_BOSS2_WING2].shield = 500; - alien_defs[CD_BOSS2_WING2].imageIndex[0] = 30; - alien_defs[CD_BOSS2_WING2].imageIndex[1] = 31; - alien_defs[CD_BOSS2_WING2].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_BOSS2_WING2].weaponType[1] = W_SPREADSHOT; - alien_defs[CD_BOSS2_WING2].chance[0] = 0; - alien_defs[CD_BOSS2_WING2].chance[1] = 0; - alien_defs[CD_BOSS2_WING2].collectChance = 100; - alien_defs[CD_BOSS2_WING2].collectType = P_ANYTHING; - alien_defs[CD_BOSS2_WING2].collectValue = 250; - alien_defs[CD_BOSS2_WING2].flags = FL_WEAPCO | FL_DEPLOYDRONES | FL_DAMAGEOWNER; - - alien_defs[CD_BOSS2_WING3].classDef = CD_BOSS2_WING3; - alien_defs[CD_BOSS2_WING3].AIType = AI_NORMAL; - alien_defs[CD_BOSS2_WING3].speed = 1; - alien_defs[CD_BOSS2_WING3].maxShield = 500; - alien_defs[CD_BOSS2_WING3].shield = 500; - alien_defs[CD_BOSS2_WING3].imageIndex[0] = 32; - alien_defs[CD_BOSS2_WING3].imageIndex[1] = 33; - alien_defs[CD_BOSS2_WING3].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_BOSS2_WING3].weaponType[1] = W_SPREADSHOT; - alien_defs[CD_BOSS2_WING3].chance[0] = 0; - alien_defs[CD_BOSS2_WING3].chance[1] = 0; - alien_defs[CD_BOSS2_WING3].collectChance = 100; - alien_defs[CD_BOSS2_WING3].collectType = P_ANYTHING; - alien_defs[CD_BOSS2_WING3].collectValue = 250; - alien_defs[CD_BOSS2_WING3].flags = FL_WEAPCO | FL_DEPLOYDRONES | FL_DAMAGEOWNER; - - alien_defs[CD_BOSS2_WING4].classDef = CD_BOSS2_WING4; - alien_defs[CD_BOSS2_WING4].AIType = AI_NORMAL; - alien_defs[CD_BOSS2_WING4].speed = 1; - alien_defs[CD_BOSS2_WING4].maxShield = 250; - alien_defs[CD_BOSS2_WING4].shield = 250; - alien_defs[CD_BOSS2_WING4].imageIndex[0] = 34; - alien_defs[CD_BOSS2_WING4].imageIndex[1] = 35; - alien_defs[CD_BOSS2_WING4].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_BOSS2_WING4].weaponType[1] = W_SPREADSHOT; - alien_defs[CD_BOSS2_WING4].chance[0] = 0; - alien_defs[CD_BOSS2_WING4].chance[1] = 0; - alien_defs[CD_BOSS2_WING4].collectChance = 100; - alien_defs[CD_BOSS2_WING4].collectType = P_ANYTHING; - alien_defs[CD_BOSS2_WING4].collectValue = 250; - alien_defs[CD_BOSS2_WING4].flags = FL_WEAPCO | FL_DAMAGEOWNER; - - // Drone - alien_defs[CD_DRONE].classDef = CD_DRONE; - alien_defs[CD_DRONE].AIType = AI_OFFENSIVE; - alien_defs[CD_DRONE].speed = 8; - alien_defs[CD_DRONE].maxShield = 5; - alien_defs[CD_DRONE].shield = 5; - alien_defs[CD_DRONE].imageIndex[0] = 36; - alien_defs[CD_DRONE].imageIndex[1] = 37; - alien_defs[CD_DRONE].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_DRONE].weaponType[1] = W_LASER; - alien_defs[CD_DRONE].chance[0] = 100; - alien_defs[CD_DRONE].chance[1] = 0; - alien_defs[CD_DRONE].collectChance = 10; - alien_defs[CD_DRONE].collectType = P_SHIELD; - alien_defs[CD_DRONE].collectValue = 1; - alien_defs[CD_DRONE].flags = FL_WEAPCO; - - // Experimental Fighter - alien_defs[CD_CLOAKFIGHTER].classDef = CD_CLOAKFIGHTER; - alien_defs[CD_CLOAKFIGHTER].AIType = AI_OFFENSIVE; - alien_defs[CD_CLOAKFIGHTER].speed = 6; - alien_defs[CD_CLOAKFIGHTER].maxShield = 1000; - alien_defs[CD_CLOAKFIGHTER].shield = 1000; - alien_defs[CD_CLOAKFIGHTER].imageIndex[0] = 10; - alien_defs[CD_CLOAKFIGHTER].imageIndex[1] = 11; - alien_defs[CD_CLOAKFIGHTER].weaponType[0] = W_SPREADSHOT; - alien_defs[CD_CLOAKFIGHTER].weaponType[1] = W_DOUBLE_ROCKETS; - alien_defs[CD_CLOAKFIGHTER].chance[0] = 100; - alien_defs[CD_CLOAKFIGHTER].chance[1] = 5; - alien_defs[CD_CLOAKFIGHTER].collectChance = 100; - alien_defs[CD_CLOAKFIGHTER].collectType = P_CASH; - alien_defs[CD_CLOAKFIGHTER].collectValue = 250; - alien_defs[CD_CLOAKFIGHTER].flags = FL_WEAPCO | FL_CANCLOAK | FL_RUNSAWAY; - - // Evil Ursula - alien_defs[CD_EVILURSULA].classDef = CD_EVILURSULA; - alien_defs[CD_EVILURSULA].AIType = AI_OFFENSIVE; - alien_defs[CD_EVILURSULA].speed = 5; - alien_defs[CD_EVILURSULA].maxShield = 500; - alien_defs[CD_EVILURSULA].shield = 500; - alien_defs[CD_EVILURSULA].imageIndex[0] = 12; - alien_defs[CD_EVILURSULA].imageIndex[1] = 13; - alien_defs[CD_EVILURSULA].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_EVILURSULA].weaponType[1] = W_HOMING_MISSILE; - alien_defs[CD_EVILURSULA].chance[0] = 100; - alien_defs[CD_EVILURSULA].chance[1] = 100; - alien_defs[CD_EVILURSULA].collectChance = 100; - alien_defs[CD_EVILURSULA].collectType = P_ESCAPEPOD; - alien_defs[CD_EVILURSULA].collectValue = 1; - alien_defs[CD_EVILURSULA].flags = FL_WEAPCO; - - // Mercenary - alien_defs[CD_KRASS].classDef = CD_KRASS; - alien_defs[CD_KRASS].AIType = AI_OFFENSIVE; - alien_defs[CD_KRASS].speed = 5; - alien_defs[CD_KRASS].maxShield = 1000; - alien_defs[CD_KRASS].shield = 1000; - alien_defs[CD_KRASS].imageIndex[0] = 26; - alien_defs[CD_KRASS].imageIndex[1] = 27; - alien_defs[CD_KRASS].weaponType[0] = W_SPREADSHOT; - alien_defs[CD_KRASS].weaponType[1] = W_CHARGER; - alien_defs[CD_KRASS].chance[0] = 100; - alien_defs[CD_KRASS].chance[1] = 0; - alien_defs[CD_KRASS].collectChance = 100; - alien_defs[CD_KRASS].collectType = P_ANYTHING; - alien_defs[CD_KRASS].collectValue = 2250; - alien_defs[CD_KRASS].flags = FL_FRIEND | FL_IMMORTAL; - - // Executive Transport - alien_defs[CD_EXEC].classDef = CD_BOSS; - alien_defs[CD_EXEC].AIType = AI_NORMAL; - alien_defs[CD_EXEC].speed = 5; - alien_defs[CD_EXEC].maxShield = 1000; - alien_defs[CD_EXEC].shield = 1000; - alien_defs[CD_EXEC].imageIndex[0] = 28; - alien_defs[CD_EXEC].imageIndex[1] = 28; - alien_defs[CD_EXEC].weaponType[0] = W_SPREADSHOT; - alien_defs[CD_EXEC].weaponType[1] = W_HOMING_MISSILE; - alien_defs[CD_EXEC].chance[0] = 0; - alien_defs[CD_EXEC].chance[1] = 0; - alien_defs[CD_EXEC].collectChance = 0; - alien_defs[CD_EXEC].collectType = P_ANYTHING; - alien_defs[CD_EXEC].collectValue = 2000; - alien_defs[CD_EXEC].flags = FL_WEAPCO | FL_NOFIRE; - - // Asteroid - alien_defs[CD_ASTEROID].classDef = CD_ASTEROID; - alien_defs[CD_ASTEROID].AIType = AI_WANDER; - alien_defs[CD_ASTEROID].speed = 1; - alien_defs[CD_ASTEROID].maxShield = 50; - alien_defs[CD_ASTEROID].shield = 50; - alien_defs[CD_ASTEROID].imageIndex[0] = 38; - alien_defs[CD_ASTEROID].imageIndex[1] = 38; - alien_defs[CD_ASTEROID].weaponType[0] = W_SPREADSHOT; - alien_defs[CD_ASTEROID].weaponType[1] = W_HOMING_MISSILE; - alien_defs[CD_ASTEROID].chance[0] = 0; - alien_defs[CD_ASTEROID].chance[1] = 0; - alien_defs[CD_ASTEROID].collectChance = 25; - alien_defs[CD_ASTEROID].collectType = P_ORE; - alien_defs[CD_ASTEROID].collectValue = 1; - alien_defs[CD_ASTEROID].flags = FL_WEAPCO; - - alien_defs[CD_ASTEROID2].classDef = CD_ASTEROID2; - alien_defs[CD_ASTEROID2].AIType = AI_WANDER; - alien_defs[CD_ASTEROID2].speed = 1; - alien_defs[CD_ASTEROID2].maxShield = 10; - alien_defs[CD_ASTEROID2].shield = 10; - alien_defs[CD_ASTEROID2].imageIndex[0] = 39; - alien_defs[CD_ASTEROID2].imageIndex[1] = 40; - alien_defs[CD_ASTEROID2].weaponType[0] = W_SPREADSHOT; - alien_defs[CD_ASTEROID2].weaponType[1] = W_HOMING_MISSILE; - alien_defs[CD_ASTEROID2].chance[0] = 0; - alien_defs[CD_ASTEROID2].chance[1] = 0; - alien_defs[CD_ASTEROID2].collectChance = 25; - alien_defs[CD_ASTEROID2].collectType = P_ORE; - alien_defs[CD_ASTEROID2].collectValue = 1; - alien_defs[CD_ASTEROID2].flags = FL_WEAPCO; - - // Escort - alien_defs[CD_ESCORT].classDef = CD_ESCORT; - alien_defs[CD_ESCORT].AIType = AI_NORMAL; - alien_defs[CD_ESCORT].speed = 3; - alien_defs[CD_ESCORT].maxShield = 200; - alien_defs[CD_ESCORT].shield = 200; - alien_defs[CD_ESCORT].imageIndex[0] = 30; - alien_defs[CD_ESCORT].imageIndex[1] = 31; - alien_defs[CD_ESCORT].weaponType[0] = W_LASER; - alien_defs[CD_ESCORT].weaponType[1] = W_LASER; - alien_defs[CD_ESCORT].chance[0] = 25; - alien_defs[CD_ESCORT].chance[1] = 25; - alien_defs[CD_ESCORT].collectChance = 100; - alien_defs[CD_ESCORT].collectType = P_ANYTHING; - alien_defs[CD_ESCORT].collectValue = 100; - alien_defs[CD_ESCORT].flags = FL_WEAPCO; - - // Mobile Ray Cannon - alien_defs[CD_MOBILE_RAY].classDef = CD_MOBILE_RAY; - alien_defs[CD_MOBILE_RAY].AIType = AI_OFFENSIVE; - alien_defs[CD_MOBILE_RAY].speed = 5; - alien_defs[CD_MOBILE_RAY].maxShield = 250; - alien_defs[CD_MOBILE_RAY].shield = 250; - alien_defs[CD_MOBILE_RAY].imageIndex[0] = 10; - alien_defs[CD_MOBILE_RAY].imageIndex[1] = 11; - alien_defs[CD_MOBILE_RAY].weaponType[0] = W_ENERGYRAY; - alien_defs[CD_MOBILE_RAY].weaponType[1] = W_ENERGYRAY; - alien_defs[CD_MOBILE_RAY].chance[0] = 50; - alien_defs[CD_MOBILE_RAY].chance[1] = 50; - alien_defs[CD_MOBILE_RAY].collectChance = 75; - alien_defs[CD_MOBILE_RAY].collectType = P_SHIELD; - alien_defs[CD_MOBILE_RAY].collectValue = 100; - alien_defs[CD_MOBILE_RAY].flags = FL_WEAPCO; - - // Rebel Carrier - alien_defs[CD_REBELCARRIER].classDef = CD_REBELCARRIER; - alien_defs[CD_REBELCARRIER].AIType = AI_OFFENSIVE; - alien_defs[CD_REBELCARRIER].speed = 2; - alien_defs[CD_REBELCARRIER].maxShield = 100; - alien_defs[CD_REBELCARRIER].shield = 100; - alien_defs[CD_REBELCARRIER].imageIndex[0] = 32; - alien_defs[CD_REBELCARRIER].imageIndex[1] = 33; - alien_defs[CD_REBELCARRIER].weaponType[0] = W_DOUBLE_ROCKETS; - alien_defs[CD_REBELCARRIER].weaponType[1] = W_MICRO_ROCKETS; - alien_defs[CD_REBELCARRIER].chance[0] = 50; - alien_defs[CD_REBELCARRIER].chance[1] = 2; - alien_defs[CD_REBELCARRIER].collectChance = 0; - alien_defs[CD_REBELCARRIER].collectType = P_SHIELD; - alien_defs[CD_REBELCARRIER].collectValue = 0; - alien_defs[CD_REBELCARRIER].flags = FL_FRIEND; - - // Pluto Boss - alien_defs[CD_PLUTOBOSS].classDef = CD_PLUTOBOSS; - alien_defs[CD_PLUTOBOSS].AIType = AI_OFFENSIVE; - alien_defs[CD_PLUTOBOSS].speed = 4; - alien_defs[CD_PLUTOBOSS].maxShield = 500; - alien_defs[CD_PLUTOBOSS].shield = 500; - alien_defs[CD_PLUTOBOSS].imageIndex[0] = 12; - alien_defs[CD_PLUTOBOSS].imageIndex[1] = 13; - alien_defs[CD_PLUTOBOSS].weaponType[0] = W_DOUBLE_ROCKETS; - alien_defs[CD_PLUTOBOSS].weaponType[1] = W_MICRO_ROCKETS; - alien_defs[CD_PLUTOBOSS].chance[0] = 50; - alien_defs[CD_PLUTOBOSS].chance[1] = 2; - alien_defs[CD_PLUTOBOSS].collectChance = 0; - alien_defs[CD_PLUTOBOSS].collectType = P_SHIELD; - alien_defs[CD_PLUTOBOSS].collectValue = 1000; - alien_defs[CD_PLUTOBOSS].flags = FL_WEAPCO; - - // Pluto Boss Barrier - alien_defs[CD_BARRIER].classDef = CD_BARRIER; - alien_defs[CD_BARRIER].AIType = AI_OFFENSIVE; - alien_defs[CD_BARRIER].speed = 1; - alien_defs[CD_BARRIER].maxShield = 250; - alien_defs[CD_BARRIER].shield = 250; - alien_defs[CD_BARRIER].imageIndex[0] = 32; - alien_defs[CD_BARRIER].imageIndex[1] = 33; - alien_defs[CD_BARRIER].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_BARRIER].weaponType[1] = W_MICRO_ROCKETS; - alien_defs[CD_BARRIER].chance[0] = 0; - alien_defs[CD_BARRIER].chance[1] = 0; - alien_defs[CD_BARRIER].collectChance = 100; - alien_defs[CD_BARRIER].collectType = P_ANYTHING; - alien_defs[CD_BARRIER].collectValue = 25; - alien_defs[CD_BARRIER].flags = FL_WEAPCO | FL_NOFIRE; - - // Neptune Boss - alien_defs[CD_NEPTUNEBOSS].classDef = CD_NEPTUNEBOSS; - alien_defs[CD_NEPTUNEBOSS].AIType = AI_OFFENSIVE; - alien_defs[CD_NEPTUNEBOSS].speed = 4; - alien_defs[CD_NEPTUNEBOSS].maxShield = 800; - alien_defs[CD_NEPTUNEBOSS].shield = 800; - alien_defs[CD_NEPTUNEBOSS].imageIndex[0] = 12; - alien_defs[CD_NEPTUNEBOSS].imageIndex[1] = 13; - alien_defs[CD_NEPTUNEBOSS].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_NEPTUNEBOSS].weaponType[1] = W_MICRO_ROCKETS; - alien_defs[CD_NEPTUNEBOSS].chance[0] = 100; - alien_defs[CD_NEPTUNEBOSS].chance[1] = 0; - alien_defs[CD_NEPTUNEBOSS].collectChance = 100; - alien_defs[CD_NEPTUNEBOSS].collectType = P_ANYTHING; - alien_defs[CD_NEPTUNEBOSS].collectValue = 1000; - alien_defs[CD_NEPTUNEBOSS].flags = FL_WEAPCO; - - // Mobile Shield - alien_defs[CD_MOBILESHIELD].classDef = CD_MOBILESHIELD; - alien_defs[CD_MOBILESHIELD].AIType = AI_EVASIVE; - alien_defs[CD_MOBILESHIELD].speed = 6; - alien_defs[CD_MOBILESHIELD].maxShield = 150; - alien_defs[CD_MOBILESHIELD].shield = 150; - alien_defs[CD_MOBILESHIELD].imageIndex[0] = 34; - alien_defs[CD_MOBILESHIELD].imageIndex[1] = 35; - alien_defs[CD_MOBILESHIELD].weaponType[0] = W_DOUBLE_SHOT; - alien_defs[CD_MOBILESHIELD].weaponType[1] = W_MICRO_ROCKETS; - alien_defs[CD_MOBILESHIELD].chance[0] = 0; - alien_defs[CD_MOBILESHIELD].chance[1] = 0; - alien_defs[CD_MOBILESHIELD].collectChance = 100; - alien_defs[CD_MOBILESHIELD].collectType = P_ANYTHING; - alien_defs[CD_MOBILESHIELD].collectValue = 25; - alien_defs[CD_MOBILESHIELD].flags = FL_WEAPCO | FL_NOFIRE; - - // Firefly - alien_defs[CD_FIREFLY].classDef = CD_FIREFLY; - alien_defs[CD_FIREFLY].AIType = AI_OFFENSIVE; - alien_defs[CD_FIREFLY].speed = 5; - alien_defs[CD_FIREFLY].maxShield = 250; - alien_defs[CD_FIREFLY].shield = 250; - alien_defs[CD_FIREFLY].imageIndex[0] = 0; - alien_defs[CD_FIREFLY].imageIndex[1] = 1; - alien_defs[CD_FIREFLY].weaponType[0] = W_TRIPLE_SHOT; - alien_defs[CD_FIREFLY].weaponType[1] = W_DOUBLE_ROCKETS; - alien_defs[CD_FIREFLY].chance[0] = 100; - alien_defs[CD_FIREFLY].chance[1] = 5; - alien_defs[CD_FIREFLY].collectChance = 100; - alien_defs[CD_FIREFLY].collectType = P_ANYTHING; - alien_defs[CD_FIREFLY].collectValue = 250; - alien_defs[CD_FIREFLY].flags = FL_WEAPCO; - - // Uranus Boss - alien_defs[CD_URANUSBOSS].classDef = CD_URANUSBOSS; - alien_defs[CD_URANUSBOSS].AIType = AI_OFFENSIVE; - alien_defs[CD_URANUSBOSS].speed = 4; - alien_defs[CD_URANUSBOSS].maxShield = 750; - alien_defs[CD_URANUSBOSS].shield = 750; - alien_defs[CD_URANUSBOSS].imageIndex[0] = 41; - alien_defs[CD_URANUSBOSS].imageIndex[1] = 42; - alien_defs[CD_URANUSBOSS].weaponType[0] = W_SPREADSHOT; - alien_defs[CD_URANUSBOSS].weaponType[1] = W_DOUBLE_ROCKETS; - alien_defs[CD_URANUSBOSS].chance[0] = 100; - alien_defs[CD_URANUSBOSS].chance[1] = 5; - alien_defs[CD_URANUSBOSS].collectChance = 100; - alien_defs[CD_URANUSBOSS].collectType = P_ANYTHING; - alien_defs[CD_URANUSBOSS].collectValue = 500; - alien_defs[CD_URANUSBOSS].flags = FL_WEAPCO; - - // Uranus Boss Wing 1 - alien_defs[CD_URANUSBOSSWING1].classDef = CD_URANUSBOSSWING1; - alien_defs[CD_URANUSBOSSWING1].AIType = AI_OFFENSIVE; - alien_defs[CD_URANUSBOSSWING1].speed = 4; - alien_defs[CD_URANUSBOSSWING1].maxShield = 250; - alien_defs[CD_URANUSBOSSWING1].shield = 250; - alien_defs[CD_URANUSBOSSWING1].imageIndex[0] = 43; - alien_defs[CD_URANUSBOSSWING1].imageIndex[1] = 44; - alien_defs[CD_URANUSBOSSWING1].weaponType[0] = W_DOUBLE_ROCKETS; - alien_defs[CD_URANUSBOSSWING1].weaponType[1] = W_DOUBLE_ROCKETS; - alien_defs[CD_URANUSBOSSWING1].chance[0] = 5; - alien_defs[CD_URANUSBOSSWING1].chance[1] = 0; - alien_defs[CD_URANUSBOSSWING1].collectChance = 100; - alien_defs[CD_URANUSBOSSWING1].collectType = P_ANYTHING; - alien_defs[CD_URANUSBOSSWING1].collectValue = 250; - alien_defs[CD_URANUSBOSSWING1].flags = FL_WEAPCO | FL_IMMORTAL; - - // Uranus Boss Wing 2 - alien_defs[CD_URANUSBOSSWING2].classDef = CD_URANUSBOSSWING2; - alien_defs[CD_URANUSBOSSWING2].AIType = AI_OFFENSIVE; - alien_defs[CD_URANUSBOSSWING2].speed = 4; - alien_defs[CD_URANUSBOSSWING2].maxShield = 250; - alien_defs[CD_URANUSBOSSWING2].shield = 250; - alien_defs[CD_URANUSBOSSWING2].imageIndex[0] = 45; - alien_defs[CD_URANUSBOSSWING2].imageIndex[1] = 46; - alien_defs[CD_URANUSBOSSWING2].weaponType[0] = W_DOUBLE_ROCKETS; - alien_defs[CD_URANUSBOSSWING2].weaponType[1] = W_DOUBLE_ROCKETS; - alien_defs[CD_URANUSBOSSWING2].chance[0] = 5; - alien_defs[CD_URANUSBOSSWING2].chance[1] = 0; - alien_defs[CD_URANUSBOSSWING2].collectChance = 100; - alien_defs[CD_URANUSBOSSWING2].collectType = P_ANYTHING; - alien_defs[CD_URANUSBOSSWING2].collectValue = 250; - alien_defs[CD_URANUSBOSSWING2].flags = FL_WEAPCO | FL_IMMORTAL; + alien_defs_init(); setColorIndexes(); diff --git a/src/aliens.cpp b/src/aliens.cpp index bbb3e7b..28c0ad5 100644 --- a/src/aliens.cpp +++ b/src/aliens.cpp @@ -20,7 +20,649 @@ along with this program. If not, see . #include "Starfighter.h" object alien_defs[CD_MAX]; -object aliens[MAX_ALIENS]; +object aliens[ALIEN_MAX]; + +void alien_defs_init() +{ + // Dual Plasma Fighter. + alien_defs[CD_DUALFIGHTER].classDef = CD_DUALFIGHTER; + alien_defs[CD_DUALFIGHTER].AIType = AI_NORMAL; + alien_defs[CD_DUALFIGHTER].speed = 4; + alien_defs[CD_DUALFIGHTER].maxShield = 5; + alien_defs[CD_DUALFIGHTER].shield = 5; + alien_defs[CD_DUALFIGHTER].imageIndex[0] = 2; + alien_defs[CD_DUALFIGHTER].imageIndex[1] = 3; + alien_defs[CD_DUALFIGHTER].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_DUALFIGHTER].weaponType[1] = W_ROCKETS; + alien_defs[CD_DUALFIGHTER].chance[0] = 100; + alien_defs[CD_DUALFIGHTER].chance[1] = 1; + alien_defs[CD_DUALFIGHTER].collectChance = 50; + alien_defs[CD_DUALFIGHTER].collectType = P_ANYTHING; + alien_defs[CD_DUALFIGHTER].collectValue = 50; + alien_defs[CD_DUALFIGHTER].flags = FL_WEAPCO; + + // Missile Boat + alien_defs[CD_MISSILEBOAT].classDef = CD_MISSILEBOAT; + alien_defs[CD_MISSILEBOAT].AIType = AI_DEFENSIVE; + alien_defs[CD_MISSILEBOAT].speed = 2; + alien_defs[CD_MISSILEBOAT].maxShield = 50; + alien_defs[CD_MISSILEBOAT].shield = 50; + alien_defs[CD_MISSILEBOAT].imageIndex[0] = 4; + alien_defs[CD_MISSILEBOAT].imageIndex[1] = 5; + alien_defs[CD_MISSILEBOAT].weaponType[0] = W_ROCKETS; + alien_defs[CD_MISSILEBOAT].weaponType[1] = W_DOUBLE_ROCKETS; + alien_defs[CD_MISSILEBOAT].chance[0] = 25; + alien_defs[CD_MISSILEBOAT].chance[1] = 4; + alien_defs[CD_MISSILEBOAT].collectChance = 25; + alien_defs[CD_MISSILEBOAT].collectType = P_ANYTHING; + alien_defs[CD_MISSILEBOAT].collectValue = 75; + alien_defs[CD_MISSILEBOAT].flags = FL_WEAPCO; + + //Prototype fighter + alien_defs[CD_PROTOFIGHTER].classDef = CD_PROTOFIGHTER; + alien_defs[CD_PROTOFIGHTER].AIType = AI_DEFENSIVE; + alien_defs[CD_PROTOFIGHTER].speed = 5; + alien_defs[CD_PROTOFIGHTER].maxShield = 15; + alien_defs[CD_PROTOFIGHTER].shield = 15; + alien_defs[CD_PROTOFIGHTER].imageIndex[0] = 6; + alien_defs[CD_PROTOFIGHTER].imageIndex[1] = 7; + alien_defs[CD_PROTOFIGHTER].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_PROTOFIGHTER].weaponType[1] = P_ANYTHING; + alien_defs[CD_PROTOFIGHTER].chance[0] = 100; + alien_defs[CD_PROTOFIGHTER].chance[1] = 1; + alien_defs[CD_PROTOFIGHTER].collectChance = 50; + alien_defs[CD_PROTOFIGHTER].collectType = P_ANYTHING; + alien_defs[CD_PROTOFIGHTER].collectValue = 50; + alien_defs[CD_PROTOFIGHTER].flags = FL_WEAPCO; + + // Phoebe and Ursula + alien_defs[CD_FRIEND].classDef = CD_FRIEND; + alien_defs[CD_FRIEND].AIType = AI_OFFENSIVE; + alien_defs[CD_FRIEND].speed = 3; + alien_defs[CD_FRIEND].maxShield = 50; + alien_defs[CD_FRIEND].shield = 50; + alien_defs[CD_FRIEND].imageIndex[0] = 20; + alien_defs[CD_FRIEND].imageIndex[1] = 21; + alien_defs[CD_FRIEND].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_FRIEND].weaponType[1] = W_HOMING_MISSILE; + alien_defs[CD_FRIEND].chance[0] = 100; + alien_defs[CD_FRIEND].chance[1] = 5; + alien_defs[CD_FRIEND].collectChance = 0; + alien_defs[CD_FRIEND].collectType = P_CASH; + alien_defs[CD_FRIEND].collectValue = 0; + alien_defs[CD_FRIEND].flags = FL_FRIEND; + + // Boss 1 + alien_defs[CD_FRIGATE].classDef = CD_BOSS; + alien_defs[CD_FRIGATE].AIType = AI_NORMAL; + alien_defs[CD_FRIGATE].speed = 2; + alien_defs[CD_FRIGATE].maxShield = 550; + alien_defs[CD_FRIGATE].shield = 550; + alien_defs[CD_FRIGATE].imageIndex[0] = 8; + alien_defs[CD_FRIGATE].imageIndex[1] = 9; + alien_defs[CD_FRIGATE].weaponType[0] = W_MICRO_ROCKETS; + alien_defs[CD_FRIGATE].weaponType[1] = W_ENERGYRAY; + alien_defs[CD_FRIGATE].chance[0] = 100; + alien_defs[CD_FRIGATE].chance[1] = 85; + alien_defs[CD_FRIGATE].collectChance = 100; + alien_defs[CD_FRIGATE].collectType = P_CASH; + alien_defs[CD_FRIGATE].collectValue = 500; + alien_defs[CD_FRIGATE].flags = FL_WEAPCO; + + alien_defs[CD_FRIGATE_WING1].classDef = CD_FRIGATE_WING1; + alien_defs[CD_FRIGATE_WING1].AIType = AI_NORMAL; + alien_defs[CD_FRIGATE_WING1].speed = 2; + alien_defs[CD_FRIGATE_WING1].maxShield = 100; + alien_defs[CD_FRIGATE_WING1].shield = 100; + alien_defs[CD_FRIGATE_WING1].imageIndex[0] = 10; + alien_defs[CD_FRIGATE_WING1].imageIndex[1] = 11; + alien_defs[CD_FRIGATE_WING1].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_FRIGATE_WING1].weaponType[1] = W_ROCKETS; + alien_defs[CD_FRIGATE_WING1].chance[0] = 100; + alien_defs[CD_FRIGATE_WING1].chance[1] = 10; + alien_defs[CD_FRIGATE_WING1].collectChance = 100; + alien_defs[CD_FRIGATE_WING1].collectType = P_ANYTHING; + alien_defs[CD_FRIGATE_WING1].collectValue = 250; + alien_defs[CD_FRIGATE_WING1].flags = FL_WEAPCO | FL_DAMAGEOWNER; + + alien_defs[CD_FRIGATE_WING2].classDef = CD_FRIGATE_WING2; + alien_defs[CD_FRIGATE_WING2].AIType = AI_NORMAL; + alien_defs[CD_FRIGATE_WING2].speed = 2; + alien_defs[CD_FRIGATE_WING2].maxShield = 100; + alien_defs[CD_FRIGATE_WING2].shield = 100; + alien_defs[CD_FRIGATE_WING2].imageIndex[0] = 12; + alien_defs[CD_FRIGATE_WING2].imageIndex[1] = 13; + alien_defs[CD_FRIGATE_WING2].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_FRIGATE_WING2].weaponType[1] = W_ROCKETS; + alien_defs[CD_FRIGATE_WING2].chance[0] = 100; + alien_defs[CD_FRIGATE_WING2].chance[1] = 10; + alien_defs[CD_FRIGATE_WING2].collectChance = 100; + alien_defs[CD_FRIGATE_WING2].collectType = P_ANYTHING; + alien_defs[CD_FRIGATE_WING2].collectValue = 250; + alien_defs[CD_FRIGATE_WING2].flags = FL_WEAPCO | FL_DAMAGEOWNER; + + // Transport ship + alien_defs[CD_TRANSPORTSHIP].classDef = CD_TRANSPORTSHIP; + alien_defs[CD_TRANSPORTSHIP].AIType = AI_EVASIVE; + alien_defs[CD_TRANSPORTSHIP].speed = 4; + alien_defs[CD_TRANSPORTSHIP].maxShield = 10; + alien_defs[CD_TRANSPORTSHIP].shield = 10; + alien_defs[CD_TRANSPORTSHIP].imageIndex[0] = 14; + alien_defs[CD_TRANSPORTSHIP].imageIndex[1] = 15; + alien_defs[CD_TRANSPORTSHIP].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_TRANSPORTSHIP].weaponType[1] = W_DOUBLE_SHOT; + alien_defs[CD_TRANSPORTSHIP].chance[0] = 0; + alien_defs[CD_TRANSPORTSHIP].chance[1] = 0; + alien_defs[CD_TRANSPORTSHIP].collectChance = 100; + alien_defs[CD_TRANSPORTSHIP].collectType = P_WEAPONS; + alien_defs[CD_TRANSPORTSHIP].collectValue = 30; + alien_defs[CD_TRANSPORTSHIP].flags = FL_WEAPCO | FL_NOFIRE; + + // Cargo ship + alien_defs[CD_CARGOSHIP].classDef = CD_CARGOSHIP; + alien_defs[CD_CARGOSHIP].AIType = AI_EVASIVE; + alien_defs[CD_CARGOSHIP].speed = 4; + alien_defs[CD_CARGOSHIP].maxShield = 10; + alien_defs[CD_CARGOSHIP].shield = 10; + alien_defs[CD_CARGOSHIP].imageIndex[0] = 22; + alien_defs[CD_CARGOSHIP].imageIndex[1] = 23; + alien_defs[CD_CARGOSHIP].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_CARGOSHIP].weaponType[1] = W_DOUBLE_SHOT; + alien_defs[CD_CARGOSHIP].chance[0] = 0; + alien_defs[CD_CARGOSHIP].chance[1] = 0; + alien_defs[CD_CARGOSHIP].collectChance = 50; + alien_defs[CD_CARGOSHIP].collectType = P_ANYTHING; + alien_defs[CD_CARGOSHIP].collectValue = 100; + alien_defs[CD_CARGOSHIP].flags = FL_WEAPCO | FL_NOFIRE; + + // Weapco Miner + alien_defs[CD_MINER].classDef = CD_MINER; + alien_defs[CD_MINER].AIType = AI_EVASIVE; + alien_defs[CD_MINER].speed = 4; + alien_defs[CD_MINER].maxShield = 25; + alien_defs[CD_MINER].shield = 25; + alien_defs[CD_MINER].imageIndex[0] = 16; + alien_defs[CD_MINER].imageIndex[1] = 17; + alien_defs[CD_MINER].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_MINER].weaponType[1] = W_DOUBLE_SHOT; + alien_defs[CD_MINER].chance[0] = 0; + alien_defs[CD_MINER].chance[1] = 0; + alien_defs[CD_MINER].collectChance = 100; + alien_defs[CD_MINER].collectType = P_ANYTHING; + alien_defs[CD_MINER].collectValue = 30; + alien_defs[CD_MINER].flags = FL_WEAPCO | FL_NOFIRE | FL_DROPMINES; + + // Kline + alien_defs[CD_KLINE].classDef = CD_KLINE; + alien_defs[CD_KLINE].AIType = AI_OFFENSIVE; + alien_defs[CD_KLINE].speed = 5; + alien_defs[CD_KLINE].maxShield = 2000; + alien_defs[CD_KLINE].shield = 2000; + alien_defs[CD_KLINE].imageIndex[0] = 18; + alien_defs[CD_KLINE].imageIndex[1] = 19; + alien_defs[CD_KLINE].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_KLINE].weaponType[1] = W_MICRO_ROCKETS; + alien_defs[CD_KLINE].chance[0] = 100; + alien_defs[CD_KLINE].chance[1] = 2; + alien_defs[CD_KLINE].collectChance = 0; + alien_defs[CD_KLINE].collectType = P_ANYTHING; + alien_defs[CD_KLINE].collectValue = 0; + alien_defs[CD_KLINE].flags = FL_WEAPCO | FL_ALWAYSFACE | FL_CIRCLES; + + // Aim Fighter + alien_defs[CD_AIMFIGHTER].classDef = CD_AIMFIGHTER; + alien_defs[CD_AIMFIGHTER].AIType = AI_NORMAL; + alien_defs[CD_AIMFIGHTER].speed = 3; + alien_defs[CD_AIMFIGHTER].maxShield = 15; + alien_defs[CD_AIMFIGHTER].shield = 15; + alien_defs[CD_AIMFIGHTER].imageIndex[0] = 8; + alien_defs[CD_AIMFIGHTER].imageIndex[1] = 9; + alien_defs[CD_AIMFIGHTER].weaponType[0] = W_AIMED_SHOT; + alien_defs[CD_AIMFIGHTER].weaponType[1] = W_AIMED_SHOT; + alien_defs[CD_AIMFIGHTER].chance[0] = 7; + alien_defs[CD_AIMFIGHTER].chance[1] = 1; + alien_defs[CD_AIMFIGHTER].collectChance = 75; + alien_defs[CD_AIMFIGHTER].collectType = P_ANYTHING; + alien_defs[CD_AIMFIGHTER].collectValue = 100; + alien_defs[CD_AIMFIGHTER].flags = FL_WEAPCO | FL_AIMS; + + // Slave ship + alien_defs[CD_SLAVETRANSPORT].classDef = CD_SLAVETRANSPORT; + alien_defs[CD_SLAVETRANSPORT].AIType = AI_EVASIVE; + alien_defs[CD_SLAVETRANSPORT].speed = 2; + alien_defs[CD_SLAVETRANSPORT].maxShield = 10; + alien_defs[CD_SLAVETRANSPORT].shield = 20; + alien_defs[CD_SLAVETRANSPORT].imageIndex[0] = 10; + alien_defs[CD_SLAVETRANSPORT].imageIndex[1] = 11; + alien_defs[CD_SLAVETRANSPORT].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_SLAVETRANSPORT].weaponType[1] = W_DOUBLE_SHOT; + alien_defs[CD_SLAVETRANSPORT].chance[0] = 0; + alien_defs[CD_SLAVETRANSPORT].chance[1] = 0; + alien_defs[CD_SLAVETRANSPORT].collectChance = 100; + alien_defs[CD_SLAVETRANSPORT].collectType = P_SLAVES; + alien_defs[CD_SLAVETRANSPORT].collectValue = 25; + alien_defs[CD_SLAVETRANSPORT].flags = FL_WEAPCO | FL_NOFIRE; + + // Good Transport + alien_defs[CD_GOODTRANSPORT].classDef = CD_GOODTRANSPORT; + alien_defs[CD_GOODTRANSPORT].AIType = AI_EVASIVE; + alien_defs[CD_GOODTRANSPORT].speed = 3; + alien_defs[CD_GOODTRANSPORT].maxShield = 75; + alien_defs[CD_GOODTRANSPORT].shield = 75; + alien_defs[CD_GOODTRANSPORT].imageIndex[0] = 12; + alien_defs[CD_GOODTRANSPORT].imageIndex[1] = 13; + alien_defs[CD_GOODTRANSPORT].weaponType[0] = W_AIMED_SHOT; + alien_defs[CD_GOODTRANSPORT].weaponType[1] = W_AIMED_SHOT; + alien_defs[CD_GOODTRANSPORT].chance[0] = 100; + alien_defs[CD_GOODTRANSPORT].chance[1] = 100; + alien_defs[CD_GOODTRANSPORT].collectChance = 0; + alien_defs[CD_GOODTRANSPORT].collectType = P_ANYTHING; + alien_defs[CD_GOODTRANSPORT].collectValue = 0; + alien_defs[CD_GOODTRANSPORT].flags = FL_FRIEND | FL_NOFIRE | FL_AIMS; + + // Sid Wilson + alien_defs[CD_SID].classDef = CD_SID; + alien_defs[CD_SID].AIType = AI_NORMAL; + alien_defs[CD_SID].speed = 3; + alien_defs[CD_SID].maxShield = 50; + alien_defs[CD_SID].shield = 50; + alien_defs[CD_SID].imageIndex[0] = 24; + alien_defs[CD_SID].imageIndex[1] = 25; + alien_defs[CD_SID].weaponType[0] = W_IONCANNON; + alien_defs[CD_SID].weaponType[1] = W_IONCANNON; + alien_defs[CD_SID].chance[0] = 100; + alien_defs[CD_SID].chance[1] = 0; + alien_defs[CD_SID].collectChance = 0; + alien_defs[CD_SID].collectType = P_ANYTHING; + alien_defs[CD_SID].collectValue = 0; + alien_defs[CD_SID].flags = FL_FRIEND | FL_AIMS; + + // Mining Vessel Boss + alien_defs[CD_MINEBOSS].classDef = CD_BOSS; + alien_defs[CD_MINEBOSS].AIType = AI_NORMAL; + alien_defs[CD_MINEBOSS].speed = 3; + alien_defs[CD_MINEBOSS].maxShield = 1000; + alien_defs[CD_MINEBOSS].shield = 1000; + alien_defs[CD_MINEBOSS].imageIndex[0] = 26; + alien_defs[CD_MINEBOSS].imageIndex[1] = 27; + alien_defs[CD_MINEBOSS].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_MINEBOSS].weaponType[1] = W_SPREADSHOT; + alien_defs[CD_MINEBOSS].chance[0] = 0; + alien_defs[CD_MINEBOSS].chance[1] = 0; + alien_defs[CD_MINEBOSS].collectChance = 100; + alien_defs[CD_MINEBOSS].collectType = P_ANYTHING; + alien_defs[CD_MINEBOSS].collectValue = 1000; + alien_defs[CD_MINEBOSS].flags = FL_WEAPCO | FL_IMMORTAL; + + alien_defs[CD_BOSS2_WING1].classDef = CD_BOSS2_WING1; + alien_defs[CD_BOSS2_WING1].AIType = AI_NORMAL; + alien_defs[CD_BOSS2_WING1].speed = 1; + alien_defs[CD_BOSS2_WING1].maxShield = 250; + alien_defs[CD_BOSS2_WING1].shield = 250; + alien_defs[CD_BOSS2_WING1].imageIndex[0] = 28; + alien_defs[CD_BOSS2_WING1].imageIndex[1] = 29; + alien_defs[CD_BOSS2_WING1].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_BOSS2_WING1].weaponType[1] = W_SPREADSHOT; + alien_defs[CD_BOSS2_WING1].chance[0] = 0; + alien_defs[CD_BOSS2_WING1].chance[1] = 0; + alien_defs[CD_BOSS2_WING1].collectChance = 100; + alien_defs[CD_BOSS2_WING1].collectType = P_ANYTHING; + alien_defs[CD_BOSS2_WING1].collectValue = 250; + alien_defs[CD_BOSS2_WING1].flags = FL_WEAPCO | FL_DAMAGEOWNER; + + alien_defs[CD_BOSS2_WING2].classDef = CD_BOSS2_WING2; + alien_defs[CD_BOSS2_WING2].AIType = AI_NORMAL; + alien_defs[CD_BOSS2_WING2].speed = 1; + alien_defs[CD_BOSS2_WING2].maxShield = 500; + alien_defs[CD_BOSS2_WING2].shield = 500; + alien_defs[CD_BOSS2_WING2].imageIndex[0] = 30; + alien_defs[CD_BOSS2_WING2].imageIndex[1] = 31; + alien_defs[CD_BOSS2_WING2].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_BOSS2_WING2].weaponType[1] = W_SPREADSHOT; + alien_defs[CD_BOSS2_WING2].chance[0] = 0; + alien_defs[CD_BOSS2_WING2].chance[1] = 0; + alien_defs[CD_BOSS2_WING2].collectChance = 100; + alien_defs[CD_BOSS2_WING2].collectType = P_ANYTHING; + alien_defs[CD_BOSS2_WING2].collectValue = 250; + alien_defs[CD_BOSS2_WING2].flags = FL_WEAPCO | FL_DEPLOYDRONES | FL_DAMAGEOWNER; + + alien_defs[CD_BOSS2_WING3].classDef = CD_BOSS2_WING3; + alien_defs[CD_BOSS2_WING3].AIType = AI_NORMAL; + alien_defs[CD_BOSS2_WING3].speed = 1; + alien_defs[CD_BOSS2_WING3].maxShield = 500; + alien_defs[CD_BOSS2_WING3].shield = 500; + alien_defs[CD_BOSS2_WING3].imageIndex[0] = 32; + alien_defs[CD_BOSS2_WING3].imageIndex[1] = 33; + alien_defs[CD_BOSS2_WING3].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_BOSS2_WING3].weaponType[1] = W_SPREADSHOT; + alien_defs[CD_BOSS2_WING3].chance[0] = 0; + alien_defs[CD_BOSS2_WING3].chance[1] = 0; + alien_defs[CD_BOSS2_WING3].collectChance = 100; + alien_defs[CD_BOSS2_WING3].collectType = P_ANYTHING; + alien_defs[CD_BOSS2_WING3].collectValue = 250; + alien_defs[CD_BOSS2_WING3].flags = FL_WEAPCO | FL_DEPLOYDRONES | FL_DAMAGEOWNER; + + alien_defs[CD_BOSS2_WING4].classDef = CD_BOSS2_WING4; + alien_defs[CD_BOSS2_WING4].AIType = AI_NORMAL; + alien_defs[CD_BOSS2_WING4].speed = 1; + alien_defs[CD_BOSS2_WING4].maxShield = 250; + alien_defs[CD_BOSS2_WING4].shield = 250; + alien_defs[CD_BOSS2_WING4].imageIndex[0] = 34; + alien_defs[CD_BOSS2_WING4].imageIndex[1] = 35; + alien_defs[CD_BOSS2_WING4].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_BOSS2_WING4].weaponType[1] = W_SPREADSHOT; + alien_defs[CD_BOSS2_WING4].chance[0] = 0; + alien_defs[CD_BOSS2_WING4].chance[1] = 0; + alien_defs[CD_BOSS2_WING4].collectChance = 100; + alien_defs[CD_BOSS2_WING4].collectType = P_ANYTHING; + alien_defs[CD_BOSS2_WING4].collectValue = 250; + alien_defs[CD_BOSS2_WING4].flags = FL_WEAPCO | FL_DAMAGEOWNER; + + // Drone + alien_defs[CD_DRONE].classDef = CD_DRONE; + alien_defs[CD_DRONE].AIType = AI_OFFENSIVE; + alien_defs[CD_DRONE].speed = 8; + alien_defs[CD_DRONE].maxShield = 5; + alien_defs[CD_DRONE].shield = 5; + alien_defs[CD_DRONE].imageIndex[0] = 36; + alien_defs[CD_DRONE].imageIndex[1] = 37; + alien_defs[CD_DRONE].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_DRONE].weaponType[1] = W_LASER; + alien_defs[CD_DRONE].chance[0] = 100; + alien_defs[CD_DRONE].chance[1] = 0; + alien_defs[CD_DRONE].collectChance = 10; + alien_defs[CD_DRONE].collectType = P_SHIELD; + alien_defs[CD_DRONE].collectValue = 1; + alien_defs[CD_DRONE].flags = FL_WEAPCO; + + // Experimental Fighter + alien_defs[CD_CLOAKFIGHTER].classDef = CD_CLOAKFIGHTER; + alien_defs[CD_CLOAKFIGHTER].AIType = AI_OFFENSIVE; + alien_defs[CD_CLOAKFIGHTER].speed = 6; + alien_defs[CD_CLOAKFIGHTER].maxShield = 1000; + alien_defs[CD_CLOAKFIGHTER].shield = 1000; + alien_defs[CD_CLOAKFIGHTER].imageIndex[0] = 10; + alien_defs[CD_CLOAKFIGHTER].imageIndex[1] = 11; + alien_defs[CD_CLOAKFIGHTER].weaponType[0] = W_SPREADSHOT; + alien_defs[CD_CLOAKFIGHTER].weaponType[1] = W_DOUBLE_ROCKETS; + alien_defs[CD_CLOAKFIGHTER].chance[0] = 100; + alien_defs[CD_CLOAKFIGHTER].chance[1] = 5; + alien_defs[CD_CLOAKFIGHTER].collectChance = 100; + alien_defs[CD_CLOAKFIGHTER].collectType = P_CASH; + alien_defs[CD_CLOAKFIGHTER].collectValue = 250; + alien_defs[CD_CLOAKFIGHTER].flags = FL_WEAPCO | FL_CANCLOAK | FL_RUNSAWAY; + + // Evil Ursula + alien_defs[CD_EVILURSULA].classDef = CD_EVILURSULA; + alien_defs[CD_EVILURSULA].AIType = AI_OFFENSIVE; + alien_defs[CD_EVILURSULA].speed = 5; + alien_defs[CD_EVILURSULA].maxShield = 500; + alien_defs[CD_EVILURSULA].shield = 500; + alien_defs[CD_EVILURSULA].imageIndex[0] = 12; + alien_defs[CD_EVILURSULA].imageIndex[1] = 13; + alien_defs[CD_EVILURSULA].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_EVILURSULA].weaponType[1] = W_HOMING_MISSILE; + alien_defs[CD_EVILURSULA].chance[0] = 100; + alien_defs[CD_EVILURSULA].chance[1] = 100; + alien_defs[CD_EVILURSULA].collectChance = 100; + alien_defs[CD_EVILURSULA].collectType = P_ESCAPEPOD; + alien_defs[CD_EVILURSULA].collectValue = 1; + alien_defs[CD_EVILURSULA].flags = FL_WEAPCO; + + // Mercenary + alien_defs[CD_KRASS].classDef = CD_KRASS; + alien_defs[CD_KRASS].AIType = AI_OFFENSIVE; + alien_defs[CD_KRASS].speed = 5; + alien_defs[CD_KRASS].maxShield = 1000; + alien_defs[CD_KRASS].shield = 1000; + alien_defs[CD_KRASS].imageIndex[0] = 26; + alien_defs[CD_KRASS].imageIndex[1] = 27; + alien_defs[CD_KRASS].weaponType[0] = W_SPREADSHOT; + alien_defs[CD_KRASS].weaponType[1] = W_CHARGER; + alien_defs[CD_KRASS].chance[0] = 100; + alien_defs[CD_KRASS].chance[1] = 0; + alien_defs[CD_KRASS].collectChance = 100; + alien_defs[CD_KRASS].collectType = P_ANYTHING; + alien_defs[CD_KRASS].collectValue = 2250; + alien_defs[CD_KRASS].flags = FL_FRIEND | FL_IMMORTAL; + + // Executive Transport + alien_defs[CD_EXEC].classDef = CD_BOSS; + alien_defs[CD_EXEC].AIType = AI_NORMAL; + alien_defs[CD_EXEC].speed = 5; + alien_defs[CD_EXEC].maxShield = 1000; + alien_defs[CD_EXEC].shield = 1000; + alien_defs[CD_EXEC].imageIndex[0] = 28; + alien_defs[CD_EXEC].imageIndex[1] = 28; + alien_defs[CD_EXEC].weaponType[0] = W_SPREADSHOT; + alien_defs[CD_EXEC].weaponType[1] = W_HOMING_MISSILE; + alien_defs[CD_EXEC].chance[0] = 0; + alien_defs[CD_EXEC].chance[1] = 0; + alien_defs[CD_EXEC].collectChance = 0; + alien_defs[CD_EXEC].collectType = P_ANYTHING; + alien_defs[CD_EXEC].collectValue = 2000; + alien_defs[CD_EXEC].flags = FL_WEAPCO | FL_NOFIRE; + + // Asteroid + alien_defs[CD_ASTEROID].classDef = CD_ASTEROID; + alien_defs[CD_ASTEROID].AIType = AI_WANDER; + alien_defs[CD_ASTEROID].speed = 1; + alien_defs[CD_ASTEROID].maxShield = 50; + alien_defs[CD_ASTEROID].shield = 50; + alien_defs[CD_ASTEROID].imageIndex[0] = 38; + alien_defs[CD_ASTEROID].imageIndex[1] = 38; + alien_defs[CD_ASTEROID].weaponType[0] = W_SPREADSHOT; + alien_defs[CD_ASTEROID].weaponType[1] = W_HOMING_MISSILE; + alien_defs[CD_ASTEROID].chance[0] = 0; + alien_defs[CD_ASTEROID].chance[1] = 0; + alien_defs[CD_ASTEROID].collectChance = 25; + alien_defs[CD_ASTEROID].collectType = P_ORE; + alien_defs[CD_ASTEROID].collectValue = 1; + alien_defs[CD_ASTEROID].flags = FL_WEAPCO; + + alien_defs[CD_ASTEROID2].classDef = CD_ASTEROID2; + alien_defs[CD_ASTEROID2].AIType = AI_WANDER; + alien_defs[CD_ASTEROID2].speed = 1; + alien_defs[CD_ASTEROID2].maxShield = 10; + alien_defs[CD_ASTEROID2].shield = 10; + alien_defs[CD_ASTEROID2].imageIndex[0] = 39; + alien_defs[CD_ASTEROID2].imageIndex[1] = 40; + alien_defs[CD_ASTEROID2].weaponType[0] = W_SPREADSHOT; + alien_defs[CD_ASTEROID2].weaponType[1] = W_HOMING_MISSILE; + alien_defs[CD_ASTEROID2].chance[0] = 0; + alien_defs[CD_ASTEROID2].chance[1] = 0; + alien_defs[CD_ASTEROID2].collectChance = 25; + alien_defs[CD_ASTEROID2].collectType = P_ORE; + alien_defs[CD_ASTEROID2].collectValue = 1; + alien_defs[CD_ASTEROID2].flags = FL_WEAPCO; + + // Escort + alien_defs[CD_ESCORT].classDef = CD_ESCORT; + alien_defs[CD_ESCORT].AIType = AI_NORMAL; + alien_defs[CD_ESCORT].speed = 3; + alien_defs[CD_ESCORT].maxShield = 200; + alien_defs[CD_ESCORT].shield = 200; + alien_defs[CD_ESCORT].imageIndex[0] = 30; + alien_defs[CD_ESCORT].imageIndex[1] = 31; + alien_defs[CD_ESCORT].weaponType[0] = W_LASER; + alien_defs[CD_ESCORT].weaponType[1] = W_LASER; + alien_defs[CD_ESCORT].chance[0] = 25; + alien_defs[CD_ESCORT].chance[1] = 25; + alien_defs[CD_ESCORT].collectChance = 100; + alien_defs[CD_ESCORT].collectType = P_ANYTHING; + alien_defs[CD_ESCORT].collectValue = 100; + alien_defs[CD_ESCORT].flags = FL_WEAPCO; + + // Mobile Ray Cannon + alien_defs[CD_MOBILE_RAY].classDef = CD_MOBILE_RAY; + alien_defs[CD_MOBILE_RAY].AIType = AI_OFFENSIVE; + alien_defs[CD_MOBILE_RAY].speed = 5; + alien_defs[CD_MOBILE_RAY].maxShield = 250; + alien_defs[CD_MOBILE_RAY].shield = 250; + alien_defs[CD_MOBILE_RAY].imageIndex[0] = 10; + alien_defs[CD_MOBILE_RAY].imageIndex[1] = 11; + alien_defs[CD_MOBILE_RAY].weaponType[0] = W_ENERGYRAY; + alien_defs[CD_MOBILE_RAY].weaponType[1] = W_ENERGYRAY; + alien_defs[CD_MOBILE_RAY].chance[0] = 50; + alien_defs[CD_MOBILE_RAY].chance[1] = 50; + alien_defs[CD_MOBILE_RAY].collectChance = 75; + alien_defs[CD_MOBILE_RAY].collectType = P_SHIELD; + alien_defs[CD_MOBILE_RAY].collectValue = 100; + alien_defs[CD_MOBILE_RAY].flags = FL_WEAPCO; + + // Rebel Carrier + alien_defs[CD_REBELCARRIER].classDef = CD_REBELCARRIER; + alien_defs[CD_REBELCARRIER].AIType = AI_OFFENSIVE; + alien_defs[CD_REBELCARRIER].speed = 2; + alien_defs[CD_REBELCARRIER].maxShield = 100; + alien_defs[CD_REBELCARRIER].shield = 100; + alien_defs[CD_REBELCARRIER].imageIndex[0] = 32; + alien_defs[CD_REBELCARRIER].imageIndex[1] = 33; + alien_defs[CD_REBELCARRIER].weaponType[0] = W_DOUBLE_ROCKETS; + alien_defs[CD_REBELCARRIER].weaponType[1] = W_MICRO_ROCKETS; + alien_defs[CD_REBELCARRIER].chance[0] = 50; + alien_defs[CD_REBELCARRIER].chance[1] = 2; + alien_defs[CD_REBELCARRIER].collectChance = 0; + alien_defs[CD_REBELCARRIER].collectType = P_SHIELD; + alien_defs[CD_REBELCARRIER].collectValue = 0; + alien_defs[CD_REBELCARRIER].flags = FL_FRIEND; + + // Pluto Boss + alien_defs[CD_PLUTOBOSS].classDef = CD_PLUTOBOSS; + alien_defs[CD_PLUTOBOSS].AIType = AI_OFFENSIVE; + alien_defs[CD_PLUTOBOSS].speed = 4; + alien_defs[CD_PLUTOBOSS].maxShield = 500; + alien_defs[CD_PLUTOBOSS].shield = 500; + alien_defs[CD_PLUTOBOSS].imageIndex[0] = 12; + alien_defs[CD_PLUTOBOSS].imageIndex[1] = 13; + alien_defs[CD_PLUTOBOSS].weaponType[0] = W_DOUBLE_ROCKETS; + alien_defs[CD_PLUTOBOSS].weaponType[1] = W_MICRO_ROCKETS; + alien_defs[CD_PLUTOBOSS].chance[0] = 50; + alien_defs[CD_PLUTOBOSS].chance[1] = 2; + alien_defs[CD_PLUTOBOSS].collectChance = 0; + alien_defs[CD_PLUTOBOSS].collectType = P_SHIELD; + alien_defs[CD_PLUTOBOSS].collectValue = 1000; + alien_defs[CD_PLUTOBOSS].flags = FL_WEAPCO; + + // Pluto Boss Barrier + alien_defs[CD_BARRIER].classDef = CD_BARRIER; + alien_defs[CD_BARRIER].AIType = AI_OFFENSIVE; + alien_defs[CD_BARRIER].speed = 1; + alien_defs[CD_BARRIER].maxShield = 250; + alien_defs[CD_BARRIER].shield = 250; + alien_defs[CD_BARRIER].imageIndex[0] = 32; + alien_defs[CD_BARRIER].imageIndex[1] = 33; + alien_defs[CD_BARRIER].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_BARRIER].weaponType[1] = W_MICRO_ROCKETS; + alien_defs[CD_BARRIER].chance[0] = 0; + alien_defs[CD_BARRIER].chance[1] = 0; + alien_defs[CD_BARRIER].collectChance = 100; + alien_defs[CD_BARRIER].collectType = P_ANYTHING; + alien_defs[CD_BARRIER].collectValue = 25; + alien_defs[CD_BARRIER].flags = FL_WEAPCO | FL_NOFIRE; + + // Neptune Boss + alien_defs[CD_NEPTUNEBOSS].classDef = CD_NEPTUNEBOSS; + alien_defs[CD_NEPTUNEBOSS].AIType = AI_OFFENSIVE; + alien_defs[CD_NEPTUNEBOSS].speed = 4; + alien_defs[CD_NEPTUNEBOSS].maxShield = 800; + alien_defs[CD_NEPTUNEBOSS].shield = 800; + alien_defs[CD_NEPTUNEBOSS].imageIndex[0] = 12; + alien_defs[CD_NEPTUNEBOSS].imageIndex[1] = 13; + alien_defs[CD_NEPTUNEBOSS].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_NEPTUNEBOSS].weaponType[1] = W_MICRO_ROCKETS; + alien_defs[CD_NEPTUNEBOSS].chance[0] = 100; + alien_defs[CD_NEPTUNEBOSS].chance[1] = 0; + alien_defs[CD_NEPTUNEBOSS].collectChance = 100; + alien_defs[CD_NEPTUNEBOSS].collectType = P_ANYTHING; + alien_defs[CD_NEPTUNEBOSS].collectValue = 1000; + alien_defs[CD_NEPTUNEBOSS].flags = FL_WEAPCO; + + // Mobile Shield + alien_defs[CD_MOBILESHIELD].classDef = CD_MOBILESHIELD; + alien_defs[CD_MOBILESHIELD].AIType = AI_EVASIVE; + alien_defs[CD_MOBILESHIELD].speed = 6; + alien_defs[CD_MOBILESHIELD].maxShield = 150; + alien_defs[CD_MOBILESHIELD].shield = 150; + alien_defs[CD_MOBILESHIELD].imageIndex[0] = 34; + alien_defs[CD_MOBILESHIELD].imageIndex[1] = 35; + alien_defs[CD_MOBILESHIELD].weaponType[0] = W_DOUBLE_SHOT; + alien_defs[CD_MOBILESHIELD].weaponType[1] = W_MICRO_ROCKETS; + alien_defs[CD_MOBILESHIELD].chance[0] = 0; + alien_defs[CD_MOBILESHIELD].chance[1] = 0; + alien_defs[CD_MOBILESHIELD].collectChance = 100; + alien_defs[CD_MOBILESHIELD].collectType = P_ANYTHING; + alien_defs[CD_MOBILESHIELD].collectValue = 25; + alien_defs[CD_MOBILESHIELD].flags = FL_WEAPCO | FL_NOFIRE; + + // Firefly + alien_defs[CD_FIREFLY].classDef = CD_FIREFLY; + alien_defs[CD_FIREFLY].AIType = AI_OFFENSIVE; + alien_defs[CD_FIREFLY].speed = 5; + alien_defs[CD_FIREFLY].maxShield = 250; + alien_defs[CD_FIREFLY].shield = 250; + alien_defs[CD_FIREFLY].imageIndex[0] = 0; + alien_defs[CD_FIREFLY].imageIndex[1] = 1; + alien_defs[CD_FIREFLY].weaponType[0] = W_TRIPLE_SHOT; + alien_defs[CD_FIREFLY].weaponType[1] = W_DOUBLE_ROCKETS; + alien_defs[CD_FIREFLY].chance[0] = 100; + alien_defs[CD_FIREFLY].chance[1] = 5; + alien_defs[CD_FIREFLY].collectChance = 100; + alien_defs[CD_FIREFLY].collectType = P_ANYTHING; + alien_defs[CD_FIREFLY].collectValue = 250; + alien_defs[CD_FIREFLY].flags = FL_WEAPCO; + + // Uranus Boss + alien_defs[CD_URANUSBOSS].classDef = CD_URANUSBOSS; + alien_defs[CD_URANUSBOSS].AIType = AI_OFFENSIVE; + alien_defs[CD_URANUSBOSS].speed = 4; + alien_defs[CD_URANUSBOSS].maxShield = 750; + alien_defs[CD_URANUSBOSS].shield = 750; + alien_defs[CD_URANUSBOSS].imageIndex[0] = 41; + alien_defs[CD_URANUSBOSS].imageIndex[1] = 42; + alien_defs[CD_URANUSBOSS].weaponType[0] = W_SPREADSHOT; + alien_defs[CD_URANUSBOSS].weaponType[1] = W_DOUBLE_ROCKETS; + alien_defs[CD_URANUSBOSS].chance[0] = 100; + alien_defs[CD_URANUSBOSS].chance[1] = 5; + alien_defs[CD_URANUSBOSS].collectChance = 100; + alien_defs[CD_URANUSBOSS].collectType = P_ANYTHING; + alien_defs[CD_URANUSBOSS].collectValue = 500; + alien_defs[CD_URANUSBOSS].flags = FL_WEAPCO; + + // Uranus Boss Wing 1 + alien_defs[CD_URANUSBOSSWING1].classDef = CD_URANUSBOSSWING1; + alien_defs[CD_URANUSBOSSWING1].AIType = AI_OFFENSIVE; + alien_defs[CD_URANUSBOSSWING1].speed = 4; + alien_defs[CD_URANUSBOSSWING1].maxShield = 250; + alien_defs[CD_URANUSBOSSWING1].shield = 250; + alien_defs[CD_URANUSBOSSWING1].imageIndex[0] = 43; + alien_defs[CD_URANUSBOSSWING1].imageIndex[1] = 44; + alien_defs[CD_URANUSBOSSWING1].weaponType[0] = W_DOUBLE_ROCKETS; + alien_defs[CD_URANUSBOSSWING1].weaponType[1] = W_DOUBLE_ROCKETS; + alien_defs[CD_URANUSBOSSWING1].chance[0] = 5; + alien_defs[CD_URANUSBOSSWING1].chance[1] = 0; + alien_defs[CD_URANUSBOSSWING1].collectChance = 100; + alien_defs[CD_URANUSBOSSWING1].collectType = P_ANYTHING; + alien_defs[CD_URANUSBOSSWING1].collectValue = 250; + alien_defs[CD_URANUSBOSSWING1].flags = FL_WEAPCO | FL_IMMORTAL; + + // Uranus Boss Wing 2 + alien_defs[CD_URANUSBOSSWING2].classDef = CD_URANUSBOSSWING2; + alien_defs[CD_URANUSBOSSWING2].AIType = AI_OFFENSIVE; + alien_defs[CD_URANUSBOSSWING2].speed = 4; + alien_defs[CD_URANUSBOSSWING2].maxShield = 250; + alien_defs[CD_URANUSBOSSWING2].shield = 250; + alien_defs[CD_URANUSBOSSWING2].imageIndex[0] = 45; + alien_defs[CD_URANUSBOSSWING2].imageIndex[1] = 46; + alien_defs[CD_URANUSBOSSWING2].weaponType[0] = W_DOUBLE_ROCKETS; + alien_defs[CD_URANUSBOSSWING2].weaponType[1] = W_DOUBLE_ROCKETS; + alien_defs[CD_URANUSBOSSWING2].chance[0] = 5; + alien_defs[CD_URANUSBOSSWING2].chance[1] = 0; + alien_defs[CD_URANUSBOSSWING2].collectChance = 100; + alien_defs[CD_URANUSBOSSWING2].collectType = P_ANYTHING; + alien_defs[CD_URANUSBOSSWING2].collectValue = 250; + alien_defs[CD_URANUSBOSSWING2].flags = FL_WEAPCO | FL_IMMORTAL; +} /* This simply pulls back an alien from the array that is @@ -271,7 +913,7 @@ void alien_addSmallAsteroid(object *hostAlien) void alien_addFriendly(int type) { - if (type != FR_SID) + if (type != ALIEN_SID) aliens[type] = alien_defs[CD_FRIEND]; else aliens[type] = alien_defs[CD_SID]; @@ -290,10 +932,10 @@ void alien_addFriendly(int type) else aliens[type].y = rrand((int)(screen->h / 2) - 150, (int)(screen->h / 2)); - if (type == FR_PHOEBE) + if (type == ALIEN_PHOEBE) aliens[type].classDef = CD_PHOEBE; - if (type == FR_URSULA) + if (type == ALIEN_URSULA) aliens[type].classDef = CD_URSULA; // For the sake of it being the final battle :) @@ -319,7 +961,7 @@ bool alien_place(object *alien) alien->y = rrand(screen->h / 3, (2 * screen->h) / 3); } - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { if ((aliens[i].owner != alien) && (aliens[i].shield > 0)) { @@ -336,7 +978,7 @@ bool alien_place(object *alien) void alien_setAI(object *alien) { // Make friendly craft generally concentrate on smaller fighters - if ((alien->flags & FL_FRIEND) && (alien->target == &aliens[WC_BOSS])) + if ((alien->flags & FL_FRIEND) && (alien->target == &aliens[ALIEN_BOSS])) { if ((rand() % 5) == 0) { @@ -416,15 +1058,17 @@ void alien_setAI(object *alien) void alien_setKlineAttackMethod(object *alien) { - alien->maxShield -= 500; - - if (alien->maxShield >= 1000) + if (alien->shield <= 500) { - setRadioMessage(FACE_KLINE, "Very good, Bainfield. Now let's get a little more serious...", 1); - alien->weaponType[0] = W_SPREADSHOT; - alien->chance[1] = 40; + 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->flags &= ~FL_CANNOTDIE; } - else if (alien->maxShield >= 500) + else if (alien->shield <= 1000) { setRadioMessage(FACE_KLINE, "Your ability to stay alive irritates me!! Try dodging some of these!!", 1); alien->weaponType[0] = W_DIRSHOCKMISSILE; @@ -435,16 +1079,10 @@ void alien_setKlineAttackMethod(object *alien) } else { - 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->flags &= ~FL_CANNOTDIE; + setRadioMessage(FACE_KLINE, "Very good, Bainfield. Now let's get a little more serious...", 1); + alien->weaponType[0] = W_SPREADSHOT; + alien->chance[1] = 40; } - - alien->shield = 500; } /* @@ -520,7 +1158,7 @@ void alien_searchForTarget(object *alien) } } - i = rand() % MAX_ALIENS; + i = rand() % ALIEN_MAX; object *targetEnemy = &aliens[i]; @@ -613,7 +1251,7 @@ int alien_enemiesInFront(object *alien) { object *anEnemy = aliens; - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { if ((alien != anEnemy) && (anEnemy->flags & FL_WEAPCO) && (anEnemy->shield > 0)) @@ -672,7 +1310,7 @@ void alien_move(object *alien) if (checkCollisions) { - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { if ((alien->flags & FL_LEAVESECTOR) || (alien->classDef == CD_DRONE) || diff --git a/src/aliens.h b/src/aliens.h index 3856749..08f58f5 100644 --- a/src/aliens.h +++ b/src/aliens.h @@ -21,8 +21,9 @@ along with this program. If not, see . #define ALIEN_H extern object alien_defs[CD_MAX]; -extern object aliens[MAX_ALIENS]; +extern object aliens[ALIEN_MAX]; +void alien_defs_init(); bool alien_add(); void alien_addDrone(object *hostAlien); void alien_addSmallAsteroid(object *hostAlien); diff --git a/src/bullets.cpp b/src/bullets.cpp index 3db5a9a..5dc06b9 100644 --- a/src/bullets.cpp +++ b/src/bullets.cpp @@ -205,7 +205,8 @@ void fireBullet(object *attacker, int weaponType) // Reset the weapon reload time. Double it if it is not friendly or // a boss or Kline attacker->reload[weaponType] = theWeapon->reload[0]; - if ((attacker->flags & FL_WEAPCO) && (attacker != &aliens[WC_BOSS]) && (attacker != &aliens[WC_KLINE]) && (theWeapon->id != W_LASER)) + if ((attacker->flags & FL_WEAPCO) && (attacker != &aliens[ALIEN_BOSS]) && + (attacker != &aliens[ALIEN_KLINE]) && (theWeapon->id != W_LASER)) attacker->reload[weaponType] *= 2; if ((engine.cheatAmmo) || (theWeapon->id == WT_LASER)) @@ -247,7 +248,7 @@ static object *getRandomEnemy(object *bullet) return &player; } - i = rand() % MAX_ALIENS; + i = rand() % ALIEN_MAX; if ((aliens[i].shield < 1) || (!aliens[i].active)) return NULL; @@ -448,7 +449,7 @@ void fireRay(object *attacker) object *anEnemy = aliens; - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { if (anEnemy->flags & FL_IMMORTAL) continue; @@ -564,7 +565,7 @@ void doBullets() bullet->x += engine.ssx + engine.smx; bullet->y += engine.ssy + engine.smy; - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { alien = &aliens[i]; @@ -606,26 +607,47 @@ void doBullets() alien->hit = 5; } - if (alien->flags & FL_CANNOTDIE) + if (alien->classDef == CD_KLINE) { - limitInt(&alien->shield, 1, alien->maxShield); - if (alien->shield == 1) + if (currentGame.area == 11) { - if (currentGame.area != 26) + if ((alien->shield <= alien->maxShield - 500) && + !(alien->flags & FL_LEAVESECTOR)) { - if (!(alien->flags & FL_LEAVESECTOR)) - { - alien->flags |= FL_LEAVESECTOR; - alien->flags &= ~FL_CIRCLES; - if (currentGame.area == 11) - setRadioMessage(FACE_KLINE, "Seems I underestimated you, Bainfield. We'll meet again!", 1); - else if (currentGame.area == 25) - setRadioMessage(FACE_SID, "Chris, Kethlan is getting away!", 1); - } + alien->flags |= FL_LEAVESECTOR; + alien->flags &= ~FL_CIRCLES; + setRadioMessage(FACE_KLINE, "Seems I underestimated you, Bainfield. We'll meet again!", 1); } - else + } + else if (currentGame.area == 25) + { + if ((alien->shield <= alien->maxShield - 750) && + !(alien->flags & FL_LEAVESECTOR)) { + alien->flags |= FL_LEAVESECTOR; + alien->flags &= ~FL_CIRCLES; + setRadioMessage(FACE_SID, "Chris, Kethlan is getting away!", 1); + } + } + else if (currentGame.area == 26) + { + if (alien->shield + bullet->damage > 1500 && + alien->shield <= 1500) alien_setKlineAttackMethod(alien); + else if (alien->shield + bullet->damage > 1000 && + alien->shield <= 1000) + alien_setKlineAttackMethod(alien); + else if (alien->shield + bullet->damage > 500 && + alien->shield <= 500) + alien_setKlineAttackMethod(alien); + } + else + { + if ((alien->shield <= alien->maxShield - 100) && + !(alien->flags & FL_LEAVESECTOR)) + { + alien->flags |= FL_LEAVESECTOR; + alien->flags &= ~FL_CIRCLES; } } } @@ -635,17 +657,17 @@ void doBullets() alien->flags |= FL_LEAVESECTOR; } - if (bullet->id != WT_CHARGER) + if (bullet->id == WT_CHARGER) + { + bullet->shield -= alien->shield; + if (bullet->shield <= 0) + bullet->active = false; + } + else { bullet->active = false; bullet->shield = 0; } - else if (bullet->id == WT_CHARGER) - { - bullet->shield -= alien->shield; - if (bullet->shield < 0) - bullet->active = false; - } audio_playSound(SFX_HIT, alien->x); if (alien->AIType == AI_EVASIVE) @@ -659,7 +681,8 @@ void doBullets() if (!(alien->flags & FL_DISABLED)) { alien->flags += FL_DISABLED; - updateMissionRequirements(M_DISABLE_TARGET, alien->classDef, 1); + updateMissionRequirements(M_DISABLE_TARGET, + alien->classDef, 1); } alien->systemPower = 0; diff --git a/src/cargo.cpp b/src/cargo.cpp index c90a4a3..b9be49d 100644 --- a/src/cargo.cpp +++ b/src/cargo.cpp @@ -73,9 +73,9 @@ static void becomeCollectable(int i) } else { - aliens[FR_PHOEBE].active = true; - aliens[FR_PHOEBE].x = cargo[i].x; - aliens[FR_PHOEBE].y = cargo[i].y; + aliens[ALIEN_PHOEBE].active = true; + aliens[ALIEN_PHOEBE].x = cargo[i].x; + aliens[ALIEN_PHOEBE].y = cargo[i].y; setRadioMessage(FACE_PHOEBE, "Thanks!! Watch out, WEAPCO! Phoebe's loose and she's ANGRY!!!", 1); } diff --git a/src/collectable.cpp b/src/collectable.cpp index b9867dd..6f0a336 100644 --- a/src/collectable.cpp +++ b/src/collectable.cpp @@ -24,11 +24,13 @@ Create a new collectable item based on supplied arguments. */ void addCollectable(float x, float y, int type, int value, int life) { + int r; + if (type == P_ANYTHING) { type = P_CASH; - int r = rand() % 9; + r = rand() % 9; switch (r) { @@ -48,7 +50,16 @@ void addCollectable(float x, float y, int type, int value, int life) { type = P_PLASMA_RATE; - int r = rand() % 61; + if ((currentGame.difficulty >= DIFFICULTY_NIGHTMARE) || + ((currentGame.difficulty > DIFFICULTY_EASY) && + ((currentGame.area == 5) || (currentGame.area == 11) || + (currentGame.area == 18) || (currentGame.area == 25)))) + { + // Deny the Super Charge in Nightmare difficulty, and on bosses. + r = rand() % 59; + } + else + r = rand() % 61; if (r <= 19) type = P_PLASMA_DAMAGE; @@ -126,18 +137,6 @@ void addCollectable(float x, float y, int type, int value, int life) } } - // Deny the Super Charge in Nightmare difficulty, and on bosses. - if (type == P_SUPER) - { - if ((currentGame.difficulty >= DIFFICULTY_NIGHTMARE) || - ((currentGame.difficulty > DIFFICULTY_EASY) && - ((currentGame.area == 5) || (currentGame.area == 11) || - (currentGame.area == 18) || (currentGame.area == 25)))) - { - type = P_PLASMA_DAMAGE; - } - } - // Shield bonus is useless in Nightmare difficulty; give cash instead. if (type == P_SHIELD) { diff --git a/src/defs.h b/src/defs.h index 2774257..3d939ae 100644 --- a/src/defs.h +++ b/src/defs.h @@ -86,7 +86,6 @@ along with this program. If not, see . #define MAX_WEAPONS 20 #define MAX_SHAPES 100 #define MAX_SHIPSHAPES 120 -#define MAX_ALIENS 25 #define MAX_TEXTSHAPES 150 #define MAX_FONTSHAPES 6 #define MAX_SHOPSHAPES 6 @@ -108,11 +107,17 @@ enum { // These are for Alien *indexes* NOT classdefs!! enum { - WC_BOSS = 14, - WC_KLINE, - FR_PHOEBE, - FR_URSULA, - FR_SID + ALIEN_BOSS_PART4 = 10, + ALIEN_BOSS_PART3 = 11, + ALIEN_BOSS_PART2 = 12, + ALIEN_BOSS_PART1 = 13, + ALIEN_BOSS = 14, + ALIEN_KLINE, + ALIEN_PHOEBE, + ALIEN_URSULA, + ALIEN_SID, + ALIEN_GOODTRANSPORT = 19, + ALIEN_MAX = 25 }; // Droppables diff --git a/src/game.cpp b/src/game.cpp index 3e5addb..ff83ea7 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -143,7 +143,7 @@ int mainGameLoop() initPlayer(); // Init aliens - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { aliens[i].active = false; aliens[i].shield = -1; @@ -192,11 +192,9 @@ int mainGameLoop() else if (currentGame.area == 7) addCargo(&aliens[index], P_PHOEBE); - if (index == WC_KLINE) + if (index == ALIEN_KLINE) { - aliens[WC_KLINE].target = &player; - if (currentGame.area == 25) - aliens[WC_KLINE].shield = 750; + aliens[ALIEN_KLINE].target = &player; } if (aliens[index].classDef == CD_CLOAKFIGHTER) @@ -219,7 +217,7 @@ int mainGameLoop() if (aliens[index].classDef == CD_BARRIER) { - aliens[index].owner = &aliens[WC_BOSS]; + aliens[index].owner = &aliens[ALIEN_BOSS]; aliens[index].speed = barrierSpeed; barrierSpeed++; } @@ -236,7 +234,7 @@ int mainGameLoop() if (currentGame.area == 23) { aliens[index].flags = FL_WEAPCO; - if (index == WC_BOSS) + if (index == ALIEN_BOSS) aliens[index].chance[1] = 5; } } @@ -245,49 +243,49 @@ int mainGameLoop() if (currentGame.area == 5) { - aliens[WC_BOSS].target = &player; - aliens[WC_BOSS].x = -screen->w / 2; - aliens[WC_BOSS].y = screen->h / 2; + aliens[ALIEN_BOSS].target = &player; + aliens[ALIEN_BOSS].x = -screen->w / 2; + aliens[ALIEN_BOSS].y = screen->h / 2; - aliens[13].owner = &aliens[WC_BOSS]; - aliens[13].target = &player; - aliens[13].dx = -25; - aliens[13].dy = -21; + aliens[ALIEN_BOSS_PART1].owner = &aliens[ALIEN_BOSS]; + aliens[ALIEN_BOSS_PART1].target = &player; + aliens[ALIEN_BOSS_PART1].dx = -25; + aliens[ALIEN_BOSS_PART1].dy = -21; - aliens[12].owner = &aliens[WC_BOSS]; - aliens[12].target = &player; - aliens[12].dx = -20; - aliens[12].dy = 37; + aliens[ALIEN_BOSS_PART2].owner = &aliens[ALIEN_BOSS]; + aliens[ALIEN_BOSS_PART2].target = &player; + aliens[ALIEN_BOSS_PART2].dx = -20; + aliens[ALIEN_BOSS_PART2].dy = 37; } else if ((currentGame.area == 11) || (currentGame.area == 14)) { - aliens[WC_BOSS].target = &player; - aliens[WC_BOSS].x = -screen->w / 2; - aliens[WC_BOSS].y = screen->h / 2; + aliens[ALIEN_BOSS].target = &player; + aliens[ALIEN_BOSS].x = -screen->w / 2; + aliens[ALIEN_BOSS].y = screen->h / 2; - aliens[13].owner = &aliens[WC_BOSS]; - aliens[13].target = &player; - aliens[13].dx = 15; - aliens[13].dy = -22; + aliens[ALIEN_BOSS_PART1].owner = &aliens[ALIEN_BOSS]; + aliens[ALIEN_BOSS_PART1].target = &player; + aliens[ALIEN_BOSS_PART1].dx = 15; + aliens[ALIEN_BOSS_PART1].dy = -22; - aliens[12].owner = &aliens[WC_BOSS]; - aliens[12].target = &player; - aliens[12].dx = 15; - aliens[12].dy = 22; + aliens[ALIEN_BOSS_PART2].owner = &aliens[ALIEN_BOSS]; + aliens[ALIEN_BOSS_PART2].target = &player; + aliens[ALIEN_BOSS_PART2].dx = 15; + aliens[ALIEN_BOSS_PART2].dy = 22; - aliens[11].owner = &aliens[13]; - aliens[11].target = &player; - aliens[11].dx = -35; - aliens[11].dy = -12; + aliens[ALIEN_BOSS_PART3].owner = &aliens[ALIEN_BOSS_PART1]; + aliens[ALIEN_BOSS_PART3].target = &player; + aliens[ALIEN_BOSS_PART3].dx = -35; + aliens[ALIEN_BOSS_PART3].dy = -12; - aliens[10].owner = &aliens[12]; - aliens[10].target = &player; - aliens[10].dx = -35; - aliens[10].dy = 20; + aliens[ALIEN_BOSS_PART4].owner = &aliens[ALIEN_BOSS_PART2]; + aliens[ALIEN_BOSS_PART4].target = &player; + aliens[ALIEN_BOSS_PART4].dx = -35; + aliens[ALIEN_BOSS_PART4].dy = 20; if (currentGame.area == 14) { - aliens[WC_BOSS].AIType = AI_EVASIVE; + aliens[ALIEN_BOSS].AIType = AI_EVASIVE; for (int i = 10 ; i < 15 ; i++) { @@ -301,15 +299,15 @@ int mainGameLoop() } else if (currentGame.area == 21) { - aliens[WC_BOSS].target = &player; - aliens[WC_BOSS].x = -screen->w / 2; - aliens[WC_BOSS].y = screen->h / 2; + aliens[ALIEN_BOSS].target = &player; + aliens[ALIEN_BOSS].x = -screen->w / 2; + aliens[ALIEN_BOSS].y = screen->h / 2; - aliens[13].owner = &aliens[WC_BOSS]; - aliens[13].dy = 20; + aliens[ALIEN_BOSS_PART1].owner = &aliens[ALIEN_BOSS]; + aliens[ALIEN_BOSS_PART1].dy = 20; - aliens[12].owner = &aliens[WC_BOSS]; - aliens[12].dy = -16; + aliens[ALIEN_BOSS_PART2].owner = &aliens[ALIEN_BOSS]; + aliens[ALIEN_BOSS_PART2].dy = -16; } } @@ -318,20 +316,20 @@ int mainGameLoop() currentGame.hasWingMate1 = 1; if (currentGame.area == 11) - aliens[WC_KLINE].active = false; + aliens[ALIEN_KLINE].active = false; for (int i = 0 ; i < engine.maxAliens ; i++) alien_add(); if (currentGame.hasWingMate1) - alien_addFriendly(FR_PHOEBE); + alien_addFriendly(ALIEN_PHOEBE); if (currentGame.hasWingMate2) - alien_addFriendly(FR_URSULA); + alien_addFriendly(ALIEN_URSULA); if ((currentGame.area == 9) || (currentGame.area == 17) || (currentGame.area == 25)) - alien_addFriendly(FR_SID); + alien_addFriendly(ALIEN_SID); // Disable Wingmates for certain missions switch (currentGame.area) @@ -344,8 +342,8 @@ int mainGameLoop() case 18: case 24: case 26: - aliens[FR_PHOEBE].active = false; - aliens[FR_URSULA].active = false; + aliens[ALIEN_PHOEBE].active = false; + aliens[ALIEN_URSULA].active = false; break; } @@ -360,14 +358,13 @@ int mainGameLoop() { if ((currentGame.system > 1) && ((rand() % 5) == 0)) { - aliens[WC_KLINE] = alien_defs[CD_KLINE]; - aliens[WC_KLINE].owner = &aliens[WC_KLINE]; - aliens[WC_KLINE].target = &player; - aliens[WC_KLINE].shield = 100; - aliens[WC_KLINE].active = true; - aliens[WC_KLINE].x = player.x + 1000; - aliens[WC_KLINE].y = player.y; - player_setTarget(WC_KLINE); + aliens[ALIEN_KLINE] = alien_defs[CD_KLINE]; + aliens[ALIEN_KLINE].owner = &aliens[ALIEN_KLINE]; + aliens[ALIEN_KLINE].target = &player; + aliens[ALIEN_KLINE].active = true; + aliens[ALIEN_KLINE].x = player.x + 1000; + aliens[ALIEN_KLINE].y = player.y; + player_setTarget(ALIEN_KLINE); } if ((currentGame.system == 2) && (currentGame.experimentalShield > 0)) @@ -389,15 +386,11 @@ int mainGameLoop() if (currentGame.area == 26) { - aliens[WC_KLINE].x = player.x + 1000; - aliens[WC_KLINE].y = player.y; - - aliens[WC_KLINE].deathCounter = -250; - aliens[WC_KLINE].maxShield = 1500; - aliens[WC_KLINE].shield = 500; + aliens[ALIEN_KLINE].x = player.x + 1000; + aliens[ALIEN_KLINE].y = player.y; } - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { aliens[i].systemPower = aliens[i].maxShield; aliens[i].deathCounter = 0 - (aliens[i].maxShield * 3); @@ -416,23 +409,23 @@ int mainGameLoop() case 20: case 21: case 23: - player_setTarget(WC_BOSS); + player_setTarget(ALIEN_BOSS); break; case 7: - player_setTarget(FR_PHOEBE); + player_setTarget(ALIEN_PHOEBE); break; case 8: - player_setTarget(19); + player_setTarget(ALIEN_GOODTRANSPORT); break; case 9: - player_setTarget(FR_SID); + player_setTarget(ALIEN_SID); break; case 10: player_setTarget(0); break; case 25: case 26: - player_setTarget(WC_KLINE); + player_setTarget(ALIEN_KLINE); break; default: break; @@ -469,7 +462,7 @@ int mainGameLoop() allowableAliens = 999999999; } - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { if ((aliens[i].active) && (aliens[i].flags & FL_WEAPCO)) { @@ -512,27 +505,31 @@ int mainGameLoop() if ((!missionFailed()) && (currentGame.area != 26)) { leaveSector(); - if ((engine.done == 2) && (currentGame.area != 10) && (currentGame.area != 15)) + if ((engine.done == 2) && (currentGame.area != 10) && + (currentGame.area != 15)) { - if ((aliens[FR_PHOEBE].shield > 0) && (currentGame.area != 25)) + if ((aliens[ALIEN_PHOEBE].shield > 0) && + (currentGame.area != 25)) { - aliens[FR_PHOEBE].x = player.x - 40; - aliens[FR_PHOEBE].y = player.y - 35; - aliens[FR_PHOEBE].face = 0; + aliens[ALIEN_PHOEBE].x = player.x - 40; + aliens[ALIEN_PHOEBE].y = player.y - 35; + aliens[ALIEN_PHOEBE].face = 0; } - if ((aliens[FR_URSULA].shield > 0) && (currentGame.area != 25)) + if ((aliens[ALIEN_URSULA].shield > 0) && + (currentGame.area != 25)) { - aliens[FR_URSULA].x = player.x - 40; - aliens[FR_URSULA].y = player.y + 45; - aliens[FR_URSULA].face = 0; + aliens[ALIEN_URSULA].x = player.x - 40; + aliens[ALIEN_URSULA].y = player.y + 45; + aliens[ALIEN_URSULA].face = 0; } - if ((currentGame.area == 9) || (currentGame.area == 17)) + if ((currentGame.area == 9) || + (currentGame.area == 17)) { - aliens[FR_SID].x = player.x - 100; - aliens[FR_SID].y = player.y; - aliens[FR_SID].face = 0; + aliens[ALIEN_SID].x = player.x - 100; + aliens[ALIEN_SID].y = player.y; + aliens[ALIEN_SID].face = 0; } } } @@ -578,7 +575,7 @@ int mainGameLoop() object *alien = aliens; - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { if (alien->active) { @@ -730,7 +727,8 @@ int mainGameLoop() if (alien->classDef == CD_MOBILESHIELD) { - limitInt(&(++aliens[WC_BOSS].shield), 0, aliens[WC_BOSS].maxShield); + limitInt(&(++aliens[ALIEN_BOSS].shield), 0, + aliens[ALIEN_BOSS].maxShield); } limitCharAdd(&alien->reload[0], -1, 0, 999); @@ -806,7 +804,7 @@ int mainGameLoop() 600 + rand() % 2400); // Kline drops mines a lot more often - if ((alien == &aliens[WC_KLINE])) + if ((alien == &aliens[ALIEN_KLINE])) { if ((rand() % 10) == 0) addCollectable(alien->x, alien->y, P_MINE, 25, @@ -856,7 +854,7 @@ int mainGameLoop() { alien->active = false; if ((alien->classDef == CD_BOSS) || - (alien->owner == &aliens[WC_BOSS]) || + (alien->owner == &aliens[ALIEN_BOSS]) || (alien->flags & FL_FRIEND) || (alien->classDef == CD_ASTEROID) || (alien->classDef == CD_KLINE)) @@ -928,16 +926,16 @@ int mainGameLoop() engine.missionCompleteTimer = SDL_GetTicks() + 7000; // specific to Boss 1 - if ((currentGame.area == 5) && (aliens[WC_BOSS].flags & FL_ESCAPED)) + if ((currentGame.area == 5) && (aliens[ALIEN_BOSS].flags & FL_ESCAPED)) { - audio_playSound(SFX_DEATH, aliens[WC_BOSS].x); + audio_playSound(SFX_DEATH, aliens[ALIEN_BOSS].x); clearScreen(white); updateScreen(); for (int i = 0 ; i < 300 ; i++) { SDL_Delay(10); if ((rand() % 25) == 0) - audio_playSound(SFX_EXPLOSION, aliens[WC_BOSS].x); + audio_playSound(SFX_EXPLOSION, aliens[ALIEN_BOSS].x); } SDL_Delay(1000); break; diff --git a/src/messages.cpp b/src/messages.cpp index 435f444..822ee37 100644 --- a/src/messages.cpp +++ b/src/messages.cpp @@ -64,7 +64,7 @@ void getKillMessage(object *ally) bool firstPlace = false; int faceToUse = FACE_PHOEBE; - if (ally == &aliens[FR_PHOEBE]) + if (ally == &aliens[ALIEN_PHOEBE]) { strcpy(otherName, "Ursula"); kills = currentGame.wingMate1Kills; @@ -147,13 +147,13 @@ const char *getKlineInsult() void getPlayerDeathMessage() { - if (aliens[WC_KLINE].active) + if (aliens[ALIEN_KLINE].active) { setRadioMessage(FACE_KLINE, getKlineInsult(), 1); return; } - if ((aliens[WC_BOSS].active) && (aliens[WC_BOSS].classDef == CD_KRASS)) + if ((aliens[ALIEN_BOSS].active) && (aliens[ALIEN_BOSS].classDef == CD_KRASS)) { setRadioMessage(FACE_KRASS, "That was the easiest $90,000,000 I've ever earned! Bwwah!! Ha!! Ha!! Ha!!", 1); return; @@ -180,7 +180,7 @@ void getMissFireMessage(object *ally) { int faceToUse = FACE_PHOEBE; - if (ally == &aliens[FR_PHOEBE]) + if (ally == &aliens[ALIEN_PHOEBE]) faceToUse = FACE_PHOEBE; else faceToUse = FACE_URSULA; @@ -192,7 +192,7 @@ void getPlayerHitMessage(object *ally) { int faceToUse = FACE_PHOEBE; - if (ally == &aliens[FR_PHOEBE]) + if (ally == &aliens[ALIEN_PHOEBE]) faceToUse = FACE_PHOEBE; else faceToUse = FACE_URSULA; diff --git a/src/misc.cpp b/src/misc.cpp index b1ff406..7d92aff 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -176,7 +176,7 @@ void doInfo() textSurface(38, text, 90, 21, FONT_WHITE); blitText(38); - for (int i = 0; i < MAX_ALIENS; i++) + for (int i = 0; i < ALIEN_MAX; i++) doArrow(i); fontColor = FONT_WHITE; diff --git a/src/missions.cpp b/src/missions.cpp index 69d592f..d36f4a1 100644 --- a/src/missions.cpp +++ b/src/missions.cpp @@ -268,9 +268,10 @@ automatically die */ static void mission_killAllEnemies() { - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) { - if ((aliens[i].flags & FL_WEAPCO) && (aliens[i].active) && (aliens[i].shield > 0)) + if ((aliens[i].flags & FL_WEAPCO) && (aliens[i].active) && + (aliens[i].shield > 0)) aliens[i].shield = 0; } } @@ -511,11 +512,11 @@ static char revealHiddenObjectives() { mission_killAllEnemies(); syncScriptEvents(); - aliens[WC_KLINE].active = true; - aliens[WC_KLINE].x = player.x + 1000; - aliens[WC_KLINE].y = player.y; - aliens[WC_KLINE].flags |= FL_IMMORTAL | FL_NOFIRE; - player_setTarget(WC_KLINE); + aliens[ALIEN_KLINE].active = true; + aliens[ALIEN_KLINE].x = player.x + 1000; + aliens[ALIEN_KLINE].y = player.y; + aliens[ALIEN_KLINE].flags |= FL_IMMORTAL | FL_NOFIRE; + player_setTarget(ALIEN_KLINE); audio_playMusic("music/last_cyber_dance.ogg", -1); } } diff --git a/src/player.cpp b/src/player.cpp index 73d6358..09dbf3b 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -221,7 +221,7 @@ void doPlayer() engine.keyState[KEY_PAUSE] = 0; } - if (((currentGame.area == 18) && (aliens[WC_BOSS].shield > 0)) || + if (((currentGame.area == 18) && (aliens[ALIEN_BOSS].shield > 0)) || (currentGame.area == 24)) { player.face = 0; @@ -312,13 +312,13 @@ void doPlayer() player.shield--; if (player.shield == -1) { - if ((currentGame.hasWingMate1) || (aliens[WC_KLINE].active)) + if ((currentGame.hasWingMate1) || (aliens[ALIEN_KLINE].active)) getPlayerDeathMessage(); // Make it look like the ships are all still moving... if (currentGame.area == 18) { - for (int i = 0 ; i < MAX_ALIENS ; i++) + for (int i = 0 ; i < ALIEN_MAX ; i++) aliens[i].flags |= FL_LEAVESECTOR; } @@ -338,7 +338,7 @@ void doPlayer() limitFloat(&engine.ssy, -cameraMaxSpeed, cameraMaxSpeed); // Specific for the mission were you have to chase the Executive Transport - if ((currentGame.area == 18) && (aliens[WC_BOSS].shield > 0) && + if ((currentGame.area == 18) && (aliens[ALIEN_BOSS].shield > 0) && (player.shield > 0)) { engine.ssx = -6; diff --git a/src/script.cpp b/src/script.cpp index cb3c981..8537f6a 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -49,8 +49,8 @@ void loadScriptEvents() } if ((currentGame.area == MAX_MISSIONS - 1) && - (aliens[WC_KLINE].classDef == CD_KLINE) && - (aliens[WC_KLINE].active)) + (aliens[ALIEN_KLINE].classDef == CD_KLINE) && + (aliens[ALIEN_KLINE].active)) setKlineGreeting(); char filename[255];