More cleanup.

This commit is contained in:
onpon4 2015-04-07 19:16:46 -04:00
parent 4775b3fad4
commit e5ed96e1c6
11 changed files with 841 additions and 839 deletions

View File

@ -682,6 +682,186 @@ void alien_defs_init()
alien_defs[CD_URANUSBOSSWING2].flags = FL_WEAPCO | FL_IMMORTAL;
}
void aliens_init()
{
FILE *fp;
char string[255];
int index;
int alienType;
int placeAttempt;
int barrierSpeed;
for (int i = 0 ; i < ALIEN_MAX ; i++)
{
aliens[i].active = false;
aliens[i].shield = -1;
aliens[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;
aliens[index] = alien_defs[alienType];
aliens[index].owner = &aliens[index];
aliens[index].target = &aliens[index];
aliens[index].face = rand() % 2;
aliens[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(&aliens[index]))
break;
if (placeAttempt > 1000)
showErrorAndExit(2, "");
}
if (currentGame.area == MISN_CERADSE)
addCargo(&aliens[index], P_CARGO);
else if (currentGame.area == MISN_NEROD)
addCargo(&aliens[index], P_PHOEBE);
if (index == ALIEN_KLINE)
{
aliens[ALIEN_KLINE].target = &player;
}
if (aliens[index].classDef == CD_CLOAKFIGHTER)
{
aliens[index].active = false;
aliens[index].maxShield = aliens[index].shield = 400;
aliens[index].flags &= ~FL_RUNSAWAY;
aliens[index].speed = 3;
}
if ((aliens[index].classDef == CD_MOBILE_RAY) && (index >= 11))
{
aliens[index].active = false;
}
if (aliens[index].classDef == CD_FIREFLY)
{
aliens[index].active = false;
}
if (aliens[index].classDef == CD_BARRIER)
{
aliens[index].owner = &aliens[ALIEN_BOSS];
aliens[index].speed = barrierSpeed;
barrierSpeed++;
}
if ((currentGame.area == MISN_POSWIC) &&
(aliens[index].classDef == CD_BOSS))
{
aliens[index].imageIndex[1] = 29;
aliens[index].flags |= FL_IMMORTAL;
}
if (currentGame.area == MISN_ELLESH)
aliens[index].flags |= FL_HASMINIMUMSPEED;
if (currentGame.area == MISN_JUPITER)
{
aliens[index].flags = FL_WEAPCO;
if (index == ALIEN_BOSS)
aliens[index].chance[1] = 5;
}
}
fclose(fp);
if (currentGame.area == MISN_MOEBO)
{
aliens[ALIEN_BOSS].target = &player;
aliens[ALIEN_BOSS].x = -screen->w / 2;
aliens[ALIEN_BOSS].y = screen->h / 2;
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[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 == MISN_ELAMALE) ||
(currentGame.area == MISN_FELLON))
{
aliens[ALIEN_BOSS].target = &player;
aliens[ALIEN_BOSS].x = -screen->w / 2;
aliens[ALIEN_BOSS].y = screen->h / 2;
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[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[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[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 == MISN_FELLON)
{
aliens[ALIEN_BOSS].AIType = AI_EVASIVE;
for (int i = 10 ; i < 15 ; i++)
{
aliens[i].imageIndex[0] += 15;
aliens[i].imageIndex[1] += 15;
aliens[i].image[0] = shipShape[aliens[i].imageIndex[0]];
aliens[i].image[1] = shipShape[aliens[i].imageIndex[1]];
}
}
}
else if (currentGame.area == MISN_URANUS)
{
aliens[ALIEN_BOSS].target = &player;
aliens[ALIEN_BOSS].x = -screen->w / 2;
aliens[ALIEN_BOSS].y = screen->h / 2;
aliens[ALIEN_BOSS_PART1].owner = &aliens[ALIEN_BOSS];
aliens[ALIEN_BOSS_PART1].dy = 20;
aliens[ALIEN_BOSS_PART2].owner = &aliens[ALIEN_BOSS];
aliens[ALIEN_BOSS_PART2].dy = -16;
}
}
}
bool alien_add()
{
int index = alien_getFreeIndex();

View File

@ -24,6 +24,7 @@ extern object alien_defs[CD_MAX];
extern object aliens[ALIEN_MAX];
void alien_defs_init();
void aliens_init();
bool alien_add();
void alien_addDrone(object *hostAlien);
void alien_addSmallAsteroid(object *hostAlien);

View File

@ -65,7 +65,7 @@ object *addCargo(object *owner, int cargoType)
return &cargo[index];
}
static void becomeCollectable(int i)
void cargo_becomeCollectable(int i)
{
if (cargo[i].collectType != P_PHOEBE)
{
@ -81,41 +81,3 @@ static void becomeCollectable(int i)
cargo[i].active = false;
}
void doCargo()
{
float dx, dy, chainX, chainY;
for (int i = 0 ; i < MAX_CARGO ; i++)
{
if (cargo[i].active)
{
if (!cargo[i].owner->active)
{
becomeCollectable(i);
continue;
}
blit(cargo[i].image[0], (int)cargo[i].x, (int)cargo[i].y);
cargo[i].x += engine.ssx + engine.smx;
cargo[i].y += engine.ssy + engine.smy;
LIMIT(cargo[i].x, cargo[i].owner->x - 50, cargo[i].owner->x + 50);
LIMIT(cargo[i].y, cargo[i].owner->y - 50, cargo[i].owner->y + 50);
dx = (cargo[i].x - cargo[i].owner->x) / 10;
dy = (cargo[i].y - cargo[i].owner->y) / 10;
chainX = cargo[i].x - cargo[i].dx;
chainY = cargo[i].y - cargo[i].dy;
// draw the chain link line
for (int j = 0 ; j < 10 ; j++)
{
blit(shape[30], (int)chainX, (int)chainY);
chainX -= dx;
chainY -= dy;
}
}
}
}

View File

@ -24,6 +24,6 @@ extern object cargo[MAX_CARGO];
extern void initCargo();
extern object *addCargo(object *owner, int cargoType);
extern void doCargo();
void cargo_becomeCollectable(int i);
#endif

View File

@ -206,7 +206,7 @@ void addCollectable(float x, float y, int type, int value, int life)
engine.collectableTail = collectable;
}
static void explodeMine(collectables *collectable)
void explodeMine(collectables *collectable)
{
if ((collectable->x >= 0) && (collectable->x <= screen->w) &&
(collectable->y >= 0) && (collectable->y <= screen->h))
@ -269,254 +269,3 @@ void checkMineBulletCollisions(object *bullet)
}
}
}
/*
Loops through the currently active collectables (in a linked list). The collectable
will travel in the direction that was defined when it was made. Its life will decreased
whilst it remains active. It will be removed if the player touches it or if its life
reaches 0. When it is picked up, depending on the type of collectable it is, mission requirements
will be updated. Information will be displayed and appropriate player variables altered.
*/
void doCollectables()
{
collectables *collectable = engine.collectableHead;
collectables *prevCollectable = engine.collectableHead;
engine.collectableTail = engine.collectableHead;
char temp[40];
while (collectable->next != NULL)
{
collectable = collectable->next;
if (collectable->active)
{
if ((collectable->x + collectable->image->w > 0) &&
(collectable->x < screen->w) &&
(collectable->y + collectable->image->h > 0) &&
(collectable->y < screen->h))
blit(collectable->image, (int)collectable->x, (int)collectable->y);
collectable->x += engine.ssx + engine.smx;
collectable->y += engine.ssy + engine.smy;
collectable->x += collectable->dx;
collectable->y += collectable->dy;
collectable->life--;
if ((player.shield > 0) && (collision(collectable, &player)))
{
switch(collectable->type)
{
case P_CASH:
currentGame.cash += collectable->value;
currentGame.cashEarned += collectable->value;
sprintf(temp, "Got $%d ", collectable->value);
break;
case P_ROCKET:
LIMIT_ADD(player.ammo[1], collectable->value, 0,
currentGame.maxRocketAmmo);
if (player.ammo[1] == currentGame.maxRocketAmmo)
sprintf(temp, "Rocket Ammo at Maximum");
else
{
if (collectable->value > 1)
sprintf(temp, "Got %d rockets", collectable->value);
else
sprintf(temp, "Got a rocket");
}
currentGame.rocketPickups += collectable->value;
break;
case P_SHIELD:
LIMIT_ADD(player.shield, 10, 0, player.maxShield);
currentGame.shieldPickups ++;
sprintf(temp, "Restored 10 shield points");
break;
case P_PLASMA_RATE:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (weapon[W_PLAYER_WEAPON].reload[0] <= rate2reload[currentGame.maxPlasmaRate])
sprintf(temp, "Firing rate already at maximum");
else
{
weapon[W_PLAYER_WEAPON].reload[0] -= 2;
sprintf(temp, "Firing rate increased");
}
}
else
{
sprintf(temp, "Upgrade failed (no plasma ammo)");
}
break;
case P_PLASMA_SHOT:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (weapon[W_PLAYER_WEAPON].ammo[0] >= currentGame.maxPlasmaOutput)
sprintf(temp, "Plasma output already at maximum");
else
{
weapon[W_PLAYER_WEAPON].ammo[0]++;
sprintf(temp, "Plasma output increased");
}
}
else
{
sprintf(temp, "Upgrade failed (no plasma ammo)");
}
break;
case P_PLASMA_DAMAGE:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (weapon[W_PLAYER_WEAPON].damage >= currentGame.maxPlasmaDamage)
sprintf(temp, "Plasma damage already at maximum");
else {
weapon[W_PLAYER_WEAPON].damage++;
sprintf(temp, "Plasma damage increased");
}
}
else
{
sprintf(temp, "Upgrade failed (no plasma ammo)");
}
break;
case P_SUPER:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
weapon[W_PLAYER_WEAPON].ammo[0] = 5;
weapon[W_PLAYER_WEAPON].damage = 5;
weapon[W_PLAYER_WEAPON].reload[0] = rate2reload[5];
weapon[W_PLAYER_WEAPON].flags |= WF_SPREAD;
sprintf(temp, "Picked up a Super Charge!!");
}
else
{
sprintf(temp, "Damn! Upgrade failed (no plasma ammo)");
}
break;
case P_PLASMA_AMMO:
if (player.ammo[0] >= currentGame.maxPlasmaAmmo)
sprintf(temp, "Plasma cells already at Maximum");
else
{
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (collectable->value > 1)
{
sprintf(temp, "Got %d plasma cells", collectable->value);
}
else
{
sprintf(temp, "Got a plasma cell");
if ((rand() % 25) == 0)
sprintf(temp, "Got one whole plasma cell (wahoo!)");
}
}
currentGame.cellPickups += collectable->value;
break;
case P_CARGO:
strcpy(temp, "Picked up some Cargo");
currentGame.cargoPickups++;
break;
case P_SLAVES:
sprintf(temp, "Rescued %d slaves", collectable->value);
currentGame.slavesRescued += collectable->value;
break;
case P_ESCAPEPOD:
sprintf(temp, "Picked up an Escape Pod");
break;
case P_ORE:
sprintf(temp, "Picked up some Ore");
break;
}
updateMissionRequirements(M_COLLECT, collectable->type,
collectable->value);
collectable->active = false;
if (collectable->type != P_MINE)
{
setInfoLine(temp, FONT_WHITE);
if (collectable->type == P_SHIELD)
audio_playSound(SFX_SHIELDUP, player.x);
else
audio_playSound(SFX_PICKUP, player.x);
}
}
// stop people from exploiting a weapon check condition
if (player.ammo[0] == 0)
{
weapon[W_PLAYER_WEAPON].ammo[0] = currentGame.minPlasmaOutput;
weapon[W_PLAYER_WEAPON].damage = currentGame.minPlasmaDamage;
weapon[W_PLAYER_WEAPON].reload[0] = rate2reload[currentGame.minPlasmaRate];
}
}
if (collectable->life < 1)
{
collectable->active = false;
if ((collectable->type == P_CARGO) ||
(collectable->type == P_ESCAPEPOD) ||
(collectable->type == P_SLAVES))
updateMissionRequirements(M_PROTECT_PICKUP, collectable->type, 1);
}
if (collectable->active)
{
prevCollectable = collectable;
engine.collectableTail = collectable;
}
else
{
if (collectable->type == P_MINE)
explodeMine(collectable);
prevCollectable->next = collectable->next;
delete collectable;
collectable = prevCollectable;
}
}
}

View File

@ -21,7 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define COLLECTABLE_H
extern void addCollectable(float x, float y, int type, int value, int life);
void explodeMine(collectables *collectable);
extern void checkMineBulletCollisions(object *bullet);
extern void doCollectables();
#endif

View File

@ -19,75 +19,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "Starfighter.h"
void addDebris(int x, int y, int amount)
{
if ((rand() % 2) == 0)
audio_playSound(SFX_DEBRIS, x);
else
audio_playSound(SFX_DEBRIS2, x);
object *debris;
amount = RANDRANGE(3, rand() % amount);
LIMIT(amount, 3, 8);
for (int i = 0 ; i < amount ; i++)
{
debris = new object;
debris->next = NULL;
debris->x = x;
debris->y = y;
debris->thinktime = RANDRANGE(60, 180);
debris->dx = RANDRANGE(-500, 500);
debris->dy = RANDRANGE(-500, 500);
if (debris->dx != 0)
debris->dx /= 100;
if (debris->dy != 0)
debris->dy /= 100;
engine.debrisTail->next = debris;
engine.debrisTail = debris;
}
}
void doDebris()
{
object *prevDebris = engine.debrisHead;
object *debris = engine.debrisHead;
engine.debrisTail = engine.debrisHead;
while (debris->next != NULL)
{
debris = debris->next;
if (debris->thinktime > 0)
{
debris->thinktime--;
debris->x += engine.ssx + engine.smx;
debris->y += engine.ssy + engine.smy;
debris->x += debris->dx;
debris->y += debris->dy;
addExplosion(debris->x + RANDRANGE(-10, 10), debris->y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
}
if (debris->thinktime < 1)
{
prevDebris->next = debris->next;
delete debris;
debris = prevDebris;
}
else
{
prevDebris = debris;
engine.debrisTail = debris;
}
}
}

View File

@ -20,7 +20,4 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifndef DEBRIS_H
#define DEBRIS_H
extern void addDebris(int x, int y, int amount);
extern void doDebris();
#endif

View File

@ -129,6 +129,292 @@ void newGame()
initPlanetMissions(currentGame.system);
}
static void game_addDebris(int x, int y, int amount)
{
if ((rand() % 2) == 0)
audio_playSound(SFX_DEBRIS, x);
else
audio_playSound(SFX_DEBRIS2, x);
object *debris;
amount = RANDRANGE(3, rand() % amount);
LIMIT(amount, 3, 8);
for (int i = 0 ; i < amount ; i++)
{
debris = new object;
debris->next = NULL;
debris->x = x;
debris->y = y;
debris->thinktime = RANDRANGE(60, 180);
debris->dx = RANDRANGE(-500, 500);
debris->dy = RANDRANGE(-500, 500);
if (debris->dx != 0)
debris->dx /= 100;
if (debris->dy != 0)
debris->dy /= 100;
engine.debrisTail->next = debris;
engine.debrisTail = debris;
}
}
/*
Loops through the currently active collectables (in a linked list). The collectable
will travel in the direction that was defined when it was made. Its life will decreased
whilst it remains active. It will be removed if the player touches it or if its life
reaches 0. When it is picked up, depending on the type of collectable it is, mission requirements
will be updated. Information will be displayed and appropriate player variables altered.
*/
static void game_doCollectables()
{
collectables *collectable = engine.collectableHead;
collectables *prevCollectable = engine.collectableHead;
engine.collectableTail = engine.collectableHead;
char temp[40];
while (collectable->next != NULL)
{
collectable = collectable->next;
if (collectable->active)
{
if ((collectable->x + collectable->image->w > 0) &&
(collectable->x < screen->w) &&
(collectable->y + collectable->image->h > 0) &&
(collectable->y < screen->h))
blit(collectable->image, (int)collectable->x, (int)collectable->y);
collectable->x += engine.ssx + engine.smx;
collectable->y += engine.ssy + engine.smy;
collectable->x += collectable->dx;
collectable->y += collectable->dy;
collectable->life--;
if ((player.shield > 0) && (collision(collectable, &player)))
{
switch(collectable->type)
{
case P_CASH:
currentGame.cash += collectable->value;
currentGame.cashEarned += collectable->value;
sprintf(temp, "Got $%d ", collectable->value);
break;
case P_ROCKET:
LIMIT_ADD(player.ammo[1], collectable->value, 0,
currentGame.maxRocketAmmo);
if (player.ammo[1] == currentGame.maxRocketAmmo)
sprintf(temp, "Rocket Ammo at Maximum");
else
{
if (collectable->value > 1)
sprintf(temp, "Got %d rockets", collectable->value);
else
sprintf(temp, "Got a rocket");
}
currentGame.rocketPickups += collectable->value;
break;
case P_SHIELD:
LIMIT_ADD(player.shield, 10, 0, player.maxShield);
currentGame.shieldPickups ++;
sprintf(temp, "Restored 10 shield points");
break;
case P_PLASMA_RATE:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (weapon[W_PLAYER_WEAPON].reload[0] <= rate2reload[currentGame.maxPlasmaRate])
sprintf(temp, "Firing rate already at maximum");
else
{
weapon[W_PLAYER_WEAPON].reload[0] -= 2;
sprintf(temp, "Firing rate increased");
}
}
else
{
sprintf(temp, "Upgrade failed (no plasma ammo)");
}
break;
case P_PLASMA_SHOT:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (weapon[W_PLAYER_WEAPON].ammo[0] >= currentGame.maxPlasmaOutput)
sprintf(temp, "Plasma output already at maximum");
else
{
weapon[W_PLAYER_WEAPON].ammo[0]++;
sprintf(temp, "Plasma output increased");
}
}
else
{
sprintf(temp, "Upgrade failed (no plasma ammo)");
}
break;
case P_PLASMA_DAMAGE:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (weapon[W_PLAYER_WEAPON].damage >= currentGame.maxPlasmaDamage)
sprintf(temp, "Plasma damage already at maximum");
else {
weapon[W_PLAYER_WEAPON].damage++;
sprintf(temp, "Plasma damage increased");
}
}
else
{
sprintf(temp, "Upgrade failed (no plasma ammo)");
}
break;
case P_SUPER:
currentGame.powerups++;
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
(player.ammo[0] > 0))
{
if ((currentGame.area != MISN_INTERCEPTION) ||
(currentGame.difficulty == DIFFICULTY_ORIGINAL))
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
weapon[W_PLAYER_WEAPON].ammo[0] = 5;
weapon[W_PLAYER_WEAPON].damage = 5;
weapon[W_PLAYER_WEAPON].reload[0] = rate2reload[5];
weapon[W_PLAYER_WEAPON].flags |= WF_SPREAD;
sprintf(temp, "Picked up a Super Charge!!");
}
else
{
sprintf(temp, "Damn! Upgrade failed (no plasma ammo)");
}
break;
case P_PLASMA_AMMO:
if (player.ammo[0] >= currentGame.maxPlasmaAmmo)
sprintf(temp, "Plasma cells already at Maximum");
else
{
LIMIT_ADD(player.ammo[0], collectable->value,
0, currentGame.maxPlasmaAmmo);
if (collectable->value > 1)
{
sprintf(temp, "Got %d plasma cells", collectable->value);
}
else
{
sprintf(temp, "Got a plasma cell");
if ((rand() % 25) == 0)
sprintf(temp, "Got one whole plasma cell (wahoo!)");
}
}
currentGame.cellPickups += collectable->value;
break;
case P_CARGO:
strcpy(temp, "Picked up some Cargo");
currentGame.cargoPickups++;
break;
case P_SLAVES:
sprintf(temp, "Rescued %d slaves", collectable->value);
currentGame.slavesRescued += collectable->value;
break;
case P_ESCAPEPOD:
sprintf(temp, "Picked up an Escape Pod");
break;
case P_ORE:
sprintf(temp, "Picked up some Ore");
break;
}
updateMissionRequirements(M_COLLECT, collectable->type,
collectable->value);
collectable->active = false;
if (collectable->type != P_MINE)
{
setInfoLine(temp, FONT_WHITE);
if (collectable->type == P_SHIELD)
audio_playSound(SFX_SHIELDUP, player.x);
else
audio_playSound(SFX_PICKUP, player.x);
}
}
// stop people from exploiting a weapon check condition
if (player.ammo[0] == 0)
{
weapon[W_PLAYER_WEAPON].ammo[0] = currentGame.minPlasmaOutput;
weapon[W_PLAYER_WEAPON].damage = currentGame.minPlasmaDamage;
weapon[W_PLAYER_WEAPON].reload[0] = rate2reload[currentGame.minPlasmaRate];
}
}
if (collectable->life < 1)
{
collectable->active = false;
if ((collectable->type == P_CARGO) ||
(collectable->type == P_ESCAPEPOD) ||
(collectable->type == P_SLAVES))
updateMissionRequirements(M_PROTECT_PICKUP, collectable->type, 1);
}
if (collectable->active)
{
prevCollectable = collectable;
engine.collectableTail = collectable;
}
else
{
if (collectable->type == P_MINE)
explodeMine(collectable);
prevCollectable->next = collectable->next;
delete collectable;
collectable = prevCollectable;
}
}
}
/*
This handles active bullets in a linked list. The current bullet and
previous bullet pointers are first assigned to the main header bullet
@ -715,7 +1001,7 @@ static void game_doAliens()
(aliens[i].flags & FL_FRIEND) ||
(aliens[i].classDef == CD_ASTEROID) ||
(aliens[i].classDef == CD_KLINE))
addDebris((int)aliens[i].x, (int)aliens[i].y,
game_addDebris((int)aliens[i].x, (int)aliens[i].y,
aliens[i].maxShield);
if (aliens[i].classDef == CD_ASTEROID)
@ -741,13 +1027,369 @@ static void game_doAliens()
}
}
static void game_doPlayer()
{
// This causes the motion to slow
engine.ssx *= 0.99;
engine.ssy *= 0.99;
engine.smx = 0;
engine.smy = 0;
int shapeToUse;
float cd;
float cc;
bool xmoved = false;
bool ymoved = false;
if (player.shield > -100)
{
if (player.shield > 0)
{
if ((engine.keyState[KEY_FIRE]))
ship_fireBullet(&player, 0);
if ((engine.keyState[KEY_ALTFIRE]) && (player.weaponType[1] != W_NONE))
{
if ((player.weaponType[1] != W_CHARGER) &&
(player.weaponType[1] != W_LASER) && (player.ammo[1] > 0))
{
ship_fireBullet(&player, 1);
}
if (player.weaponType[1] == W_LASER)
{
if (player.ammo[1] < 100)
{
ship_fireBullet(&player, 1);
player.ammo[1] += 2;
if (player.ammo[1] >= 100)
{
player.ammo[1] = 200;
setInfoLine("Laser Overheat!!", FONT_WHITE);
}
}
}
}
if (player.weaponType[1] == W_CHARGER)
{
if (engine.keyState[KEY_ALTFIRE] &&
((currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
!(engine.keyState[KEY_FIRE])))
{
if (!player_chargerFired)
{
if (currentGame.difficulty == DIFFICULTY_ORIGINAL)
{
LIMIT_ADD(player.ammo[1], 1, 0, 200);
}
else
{
LIMIT_ADD(player.ammo[1], 1, 0, 150);
if (player.ammo[1] >= 150)
{
ship_fireBullet(&player, 1);
player.ammo[1] = 0;
player_chargerFired = true;
}
}
}
}
else
{
if (player.ammo[1] > 0)
ship_fireBullet(&player, 1);
player.ammo[1] = 0;
player_chargerFired = false;
}
}
if ((engine.keyState[KEY_SWITCH]))
{
if ((weapon[W_PLAYER_WEAPON].ammo[0] >= 3) &&
(weapon[W_PLAYER_WEAPON].ammo[0] <= currentGame.maxPlasmaOutput))
{
weapon[W_PLAYER_WEAPON].flags ^= WF_SPREAD;
if (weapon[W_PLAYER_WEAPON].flags & WF_SPREAD)
{
setInfoLine("Weapon set to Spread", FONT_WHITE);
}
else
{
setInfoLine("Weapon set to Concentrate", FONT_WHITE);
}
}
engine.keyState[KEY_SWITCH] = 0;
}
LIMIT_ADD(player.reload[0], -1, 0, 999);
LIMIT_ADD(player.reload[1], -1, 0, 999);
if (engine.keyState[KEY_UP])
{
player.y -= player.speed;
engine.ssy += 0.1;
ymoved = true;
}
if (engine.keyState[KEY_DOWN])
{
player.y += player.speed;
engine.ssy -= 0.1;
ymoved = true;
}
if (engine.keyState[KEY_LEFT])
{
player.x -= player.speed;
engine.ssx += 0.1;
player.face = 1;
xmoved = true;
}
if (engine.keyState[KEY_RIGHT])
{
player.x += player.speed;
engine.ssx -= 0.1;
player.face = 0;
xmoved = true;
}
if (engine.keyState[KEY_ESCAPE])
{
if ((engine.done == 0) && (engine.gameSection == SECTION_GAME) &&
(currentMission.remainingObjectives1 == 0))
{
audio_playSound(SFX_FLY, screen->w / 2);
engine.done = 2;
engine.missionCompleteTimer = (SDL_GetTicks() - 1);
}
}
if (engine.keyState[KEY_PAUSE])
{
engine.paused = true;
engine.keyState[KEY_PAUSE] = 0;
}
if (((currentGame.area == MISN_ELLESH) &&
(aliens[ALIEN_BOSS].shield > 0)) ||
(currentGame.area == MISN_MARS))
{
player.face = 0;
xmoved = true;
ymoved = true;
}
if (engine.done == 0)
{
if (xmoved)
{
if (player.x < xViewBorder)
{
engine.smx += xViewBorder - player.x;
player.x = xViewBorder;
}
else if (player.x > screen->w - xViewBorder)
{
engine.smx += (screen->w - xViewBorder) - player.x;
player.x = screen->w - xViewBorder;
}
}
else if (currentGame.difficulty != DIFFICULTY_ORIGINAL)
{
cd = player.x - screen->w / 2;
if (cd < 0)
{
cc = MAX(cd / 10, MAX(0, engine.ssx) - cameraMaxSpeed);
player.x -= cc;
engine.smx -= cc;
}
else if (cd > 0)
{
cc = MIN(cd / 10, cameraMaxSpeed + MIN(0, engine.ssx));
player.x -= cc;
engine.smx -= cc;
}
}
if (ymoved)
{
if (player.y < yViewBorder)
{
engine.smy += yViewBorder - player.y;
player.y = yViewBorder;
}
else if (player.y > screen->h - yViewBorder)
{
engine.smy += (screen->h - yViewBorder) - player.y;
player.y = screen->h - yViewBorder;
}
}
else if (currentGame.difficulty != DIFFICULTY_ORIGINAL)
{
cd = player.y - screen->h / 2;
if (cd < 0)
{
cc = MAX(cd / 10, MAX(0, engine.ssy) - cameraMaxSpeed);
player.y -= cc;
engine.smy -= cc;
}
else if (cd > 0)
{
cc = MIN(cd / 10, cameraMaxSpeed + MIN(0, engine.ssy));
player.y -= cc;
engine.smy -= cc;
}
}
}
if ((player.maxShield <= 1) || (player.shield > engine.lowShield))
addEngine(&player);
shapeToUse = player.face;
if (player.hit)
shapeToUse += SHIP_HIT_INDEX;
LIMIT_ADD(player.hit, -1, 0, 100);
blit(shipShape[shapeToUse], (int)player.x, (int)player.y);
if ((player.maxShield > 1) && (player.shield <= engine.lowShield) &&
(rand() % 5 < 1))
addExplosion(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 20), E_SMOKE);
}
else
{
player.active = false;
player.shield--;
if (player.shield == -1)
{
if ((currentGame.hasWingMate1) || (aliens[ALIEN_KLINE].active))
getPlayerDeathMessage();
// Make it look like the ships are all still moving...
if (currentGame.area == MISN_ELLESH)
{
for (int i = 0 ; i < ALIEN_MAX ; i++)
aliens[i].flags |= FL_LEAVESECTOR;
}
audio_playSound(SFX_DEATH, player.x);
audio_playSound(SFX_EXPLOSION, player.x);
}
engine.keyState[KEY_UP] = engine.keyState[KEY_DOWN] = engine.keyState[KEY_LEFT] = engine.keyState[KEY_RIGHT] = 0;
if ((rand() % 3) == 0)
addExplosion(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
if (player.shield == -99)
game_addDebris((int)player.x, (int)player.y, player.maxShield);
}
}
LIMIT(engine.ssx, -cameraMaxSpeed, cameraMaxSpeed);
LIMIT(engine.ssy, -cameraMaxSpeed, cameraMaxSpeed);
// Specific for the mission were you have to chase the Executive Transport
if ((currentGame.area == MISN_ELLESH) && (aliens[ALIEN_BOSS].shield > 0) &&
(player.shield > 0))
{
engine.ssx = -6;
engine.ssy = 0;
}
if (currentGame.area == MISN_MARS)
{
engine.ssx = -6;
engine.ssy = 0;
}
player.dx = engine.ssx;
player.dy = engine.ssy;
}
static void game_doCargo()
{
float dx, dy, chainX, chainY;
for (int i = 0 ; i < MAX_CARGO ; i++)
{
if (cargo[i].active)
{
if (!cargo[i].owner->active)
{
cargo_becomeCollectable(i);
continue;
}
blit(cargo[i].image[0], (int)cargo[i].x, (int)cargo[i].y);
cargo[i].x += engine.ssx + engine.smx;
cargo[i].y += engine.ssy + engine.smy;
LIMIT(cargo[i].x, cargo[i].owner->x - 50, cargo[i].owner->x + 50);
LIMIT(cargo[i].y, cargo[i].owner->y - 50, cargo[i].owner->y + 50);
dx = (cargo[i].x - cargo[i].owner->x) / 10;
dy = (cargo[i].y - cargo[i].owner->y) / 10;
chainX = cargo[i].x - cargo[i].dx;
chainY = cargo[i].y - cargo[i].dy;
// draw the chain link line
for (int j = 0 ; j < 10 ; j++)
{
blit(shape[30], (int)chainX, (int)chainY);
chainX -= dx;
chainY -= dy;
}
}
}
}
static void game_doDebris()
{
object *prevDebris = engine.debrisHead;
object *debris = engine.debrisHead;
engine.debrisTail = engine.debrisHead;
while (debris->next != NULL)
{
debris = debris->next;
if (debris->thinktime > 0)
{
debris->thinktime--;
debris->x += engine.ssx + engine.smx;
debris->y += engine.ssy + engine.smy;
debris->x += debris->dx;
debris->y += debris->dy;
addExplosion(debris->x + RANDRANGE(-10, 10), debris->y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
}
if (debris->thinktime < 1)
{
prevDebris->next = debris->next;
delete debris;
debris = prevDebris;
}
else
{
prevDebris = debris;
engine.debrisTail = debris;
}
}
}
int mainGameLoop()
{
FILE *fp;
char string[255];
int index, alienType, placeAttempt;
int barrierSpeed;
resetLists();
setMission(currentGame.area);
@ -755,177 +1397,7 @@ int mainGameLoop()
initCargo();
initPlayer();
// Init aliens
for (int i = 0 ; i < ALIEN_MAX ; i++)
{
aliens[i].active = false;
aliens[i].shield = -1;
aliens[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;
aliens[index] = alien_defs[alienType];
aliens[index].owner = &aliens[index];
aliens[index].target = &aliens[index];
aliens[index].face = rand() % 2;
aliens[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(&aliens[index]))
break;
if (placeAttempt > 1000)
showErrorAndExit(2, "");
}
if (currentGame.area == MISN_CERADSE)
addCargo(&aliens[index], P_CARGO);
else if (currentGame.area == MISN_NEROD)
addCargo(&aliens[index], P_PHOEBE);
if (index == ALIEN_KLINE)
{
aliens[ALIEN_KLINE].target = &player;
}
if (aliens[index].classDef == CD_CLOAKFIGHTER)
{
aliens[index].active = false;
aliens[index].maxShield = aliens[index].shield = 400;
aliens[index].flags &= ~FL_RUNSAWAY;
aliens[index].speed = 3;
}
if ((aliens[index].classDef == CD_MOBILE_RAY) && (index >= 11))
{
aliens[index].active = false;
}
if (aliens[index].classDef == CD_FIREFLY)
{
aliens[index].active = false;
}
if (aliens[index].classDef == CD_BARRIER)
{
aliens[index].owner = &aliens[ALIEN_BOSS];
aliens[index].speed = barrierSpeed;
barrierSpeed++;
}
if ((currentGame.area == MISN_POSWIC) &&
(aliens[index].classDef == CD_BOSS))
{
aliens[index].imageIndex[1] = 29;
aliens[index].flags |= FL_IMMORTAL;
}
if (currentGame.area == MISN_ELLESH)
aliens[index].flags |= FL_HASMINIMUMSPEED;
if (currentGame.area == MISN_JUPITER)
{
aliens[index].flags = FL_WEAPCO;
if (index == ALIEN_BOSS)
aliens[index].chance[1] = 5;
}
}
fclose(fp);
if (currentGame.area == MISN_MOEBO)
{
aliens[ALIEN_BOSS].target = &player;
aliens[ALIEN_BOSS].x = -screen->w / 2;
aliens[ALIEN_BOSS].y = screen->h / 2;
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[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 == MISN_ELAMALE) ||
(currentGame.area == MISN_FELLON))
{
aliens[ALIEN_BOSS].target = &player;
aliens[ALIEN_BOSS].x = -screen->w / 2;
aliens[ALIEN_BOSS].y = screen->h / 2;
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[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[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[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 == MISN_FELLON)
{
aliens[ALIEN_BOSS].AIType = AI_EVASIVE;
for (int i = 10 ; i < 15 ; i++)
{
aliens[i].imageIndex[0] += 15;
aliens[i].imageIndex[1] += 15;
aliens[i].image[0] = shipShape[aliens[i].imageIndex[0]];
aliens[i].image[1] = shipShape[aliens[i].imageIndex[1]];
}
}
}
else if (currentGame.area == MISN_URANUS)
{
aliens[ALIEN_BOSS].target = &player;
aliens[ALIEN_BOSS].x = -screen->w / 2;
aliens[ALIEN_BOSS].y = screen->h / 2;
aliens[ALIEN_BOSS_PART1].owner = &aliens[ALIEN_BOSS];
aliens[ALIEN_BOSS_PART1].dy = 20;
aliens[ALIEN_BOSS_PART2].owner = &aliens[ALIEN_BOSS];
aliens[ALIEN_BOSS_PART2].dy = -16;
}
}
aliens_init();
// specific for Phoebe being captured!
if (currentGame.area == MISN_NEROD)
@ -1189,14 +1661,12 @@ int mainGameLoop()
unBuffer();
doStarfield();
doCollectables();
game_doCollectables();
game_doBullets();
game_doAliens();
doPlayer();
doCargo();
doDebris();
game_doPlayer();
game_doCargo();
game_doDebris();
doExplosions();
doInfo();

View File

@ -20,7 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "Starfighter.h"
object player;
static bool charger_fired = false;
bool player_chargerFired = false;
/*
Initialises the player for a new game.
@ -99,298 +99,12 @@ char player_checkShockDamage(float x, float y)
void exitPlayer()
{
charger_fired = false;
player_chargerFired = false;
if ((player.weaponType[1] == W_CHARGER) || (player.weaponType[1] == W_LASER))
player.ammo[1] = 0;
}
void doPlayer()
{
// This causes the motion to slow
engine.ssx *= 0.99;
engine.ssy *= 0.99;
engine.smx = 0;
engine.smy = 0;
int shapeToUse;
float cd;
float cc;
bool xmoved = false;
bool ymoved = false;
if (player.shield > -100)
{
if (player.shield > 0)
{
if ((engine.keyState[KEY_FIRE]))
ship_fireBullet(&player, 0);
if ((engine.keyState[KEY_ALTFIRE]) && (player.weaponType[1] != W_NONE))
{
if ((player.weaponType[1] != W_CHARGER) &&
(player.weaponType[1] != W_LASER) && (player.ammo[1] > 0))
{
ship_fireBullet(&player, 1);
}
if (player.weaponType[1] == W_LASER)
{
if (player.ammo[1] < 100)
{
ship_fireBullet(&player, 1);
player.ammo[1] += 2;
if (player.ammo[1] >= 100)
{
player.ammo[1] = 200;
setInfoLine("Laser Overheat!!", FONT_WHITE);
}
}
}
}
if (player.weaponType[1] == W_CHARGER)
{
if (engine.keyState[KEY_ALTFIRE] &&
((currentGame.difficulty == DIFFICULTY_ORIGINAL) ||
!(engine.keyState[KEY_FIRE])))
{
if (!charger_fired)
{
if (currentGame.difficulty == DIFFICULTY_ORIGINAL)
{
LIMIT_ADD(player.ammo[1], 1, 0, 200);
}
else
{
LIMIT_ADD(player.ammo[1], 1, 0, 150);
if (player.ammo[1] >= 150)
{
ship_fireBullet(&player, 1);
player.ammo[1] = 0;
charger_fired = true;
}
}
}
}
else
{
if (player.ammo[1] > 0)
ship_fireBullet(&player, 1);
player.ammo[1] = 0;
charger_fired = false;
}
}
if ((engine.keyState[KEY_SWITCH]))
{
if ((weapon[W_PLAYER_WEAPON].ammo[0] >= 3) &&
(weapon[W_PLAYER_WEAPON].ammo[0] <= currentGame.maxPlasmaOutput))
{
weapon[W_PLAYER_WEAPON].flags ^= WF_SPREAD;
if (weapon[W_PLAYER_WEAPON].flags & WF_SPREAD)
{
setInfoLine("Weapon set to Spread", FONT_WHITE);
}
else
{
setInfoLine("Weapon set to Concentrate", FONT_WHITE);
}
}
engine.keyState[KEY_SWITCH] = 0;
}
LIMIT_ADD(player.reload[0], -1, 0, 999);
LIMIT_ADD(player.reload[1], -1, 0, 999);
if (engine.keyState[KEY_UP])
{
player.y -= player.speed;
engine.ssy += 0.1;
ymoved = true;
}
if (engine.keyState[KEY_DOWN])
{
player.y += player.speed;
engine.ssy -= 0.1;
ymoved = true;
}
if (engine.keyState[KEY_LEFT])
{
player.x -= player.speed;
engine.ssx += 0.1;
player.face = 1;
xmoved = true;
}
if (engine.keyState[KEY_RIGHT])
{
player.x += player.speed;
engine.ssx -= 0.1;
player.face = 0;
xmoved = true;
}
if (engine.keyState[KEY_ESCAPE])
{
if ((engine.done == 0) && (engine.gameSection == SECTION_GAME) &&
(currentMission.remainingObjectives1 == 0))
{
audio_playSound(SFX_FLY, screen->w / 2);
engine.done = 2;
engine.missionCompleteTimer = (SDL_GetTicks() - 1);
}
}
if (engine.keyState[KEY_PAUSE])
{
engine.paused = true;
engine.keyState[KEY_PAUSE] = 0;
}
if (((currentGame.area == MISN_ELLESH) &&
(aliens[ALIEN_BOSS].shield > 0)) ||
(currentGame.area == MISN_MARS))
{
player.face = 0;
xmoved = true;
ymoved = true;
}
if (engine.done == 0)
{
if (xmoved)
{
if (player.x < xViewBorder)
{
engine.smx += xViewBorder - player.x;
player.x = xViewBorder;
}
else if (player.x > screen->w - xViewBorder)
{
engine.smx += (screen->w - xViewBorder) - player.x;
player.x = screen->w - xViewBorder;
}
}
else if (currentGame.difficulty != DIFFICULTY_ORIGINAL)
{
cd = player.x - screen->w / 2;
if (cd < 0)
{
cc = MAX(cd / 10, MAX(0, engine.ssx) - cameraMaxSpeed);
player.x -= cc;
engine.smx -= cc;
}
else if (cd > 0)
{
cc = MIN(cd / 10, cameraMaxSpeed + MIN(0, engine.ssx));
player.x -= cc;
engine.smx -= cc;
}
}
if (ymoved)
{
if (player.y < yViewBorder)
{
engine.smy += yViewBorder - player.y;
player.y = yViewBorder;
}
else if (player.y > screen->h - yViewBorder)
{
engine.smy += (screen->h - yViewBorder) - player.y;
player.y = screen->h - yViewBorder;
}
}
else if (currentGame.difficulty != DIFFICULTY_ORIGINAL)
{
cd = player.y - screen->h / 2;
if (cd < 0)
{
cc = MAX(cd / 10, MAX(0, engine.ssy) - cameraMaxSpeed);
player.y -= cc;
engine.smy -= cc;
}
else if (cd > 0)
{
cc = MIN(cd / 10, cameraMaxSpeed + MIN(0, engine.ssy));
player.y -= cc;
engine.smy -= cc;
}
}
}
if ((player.maxShield <= 1) || (player.shield > engine.lowShield))
addEngine(&player);
shapeToUse = player.face;
if (player.hit)
shapeToUse += SHIP_HIT_INDEX;
LIMIT_ADD(player.hit, -1, 0, 100);
blit(shipShape[shapeToUse], (int)player.x, (int)player.y);
if ((player.maxShield > 1) && (player.shield <= engine.lowShield) &&
(rand() % 5 < 1))
addExplosion(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 20), E_SMOKE);
}
else
{
player.active = false;
player.shield--;
if (player.shield == -1)
{
if ((currentGame.hasWingMate1) || (aliens[ALIEN_KLINE].active))
getPlayerDeathMessage();
// Make it look like the ships are all still moving...
if (currentGame.area == MISN_ELLESH)
{
for (int i = 0 ; i < ALIEN_MAX ; i++)
aliens[i].flags |= FL_LEAVESECTOR;
}
audio_playSound(SFX_DEATH, player.x);
audio_playSound(SFX_EXPLOSION, player.x);
}
engine.keyState[KEY_UP] = engine.keyState[KEY_DOWN] = engine.keyState[KEY_LEFT] = engine.keyState[KEY_RIGHT] = 0;
if ((rand() % 3) == 0)
addExplosion(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
if (player.shield == -99)
addDebris((int)player.x, (int)player.y, player.maxShield);
}
}
LIMIT(engine.ssx, -cameraMaxSpeed, cameraMaxSpeed);
LIMIT(engine.ssy, -cameraMaxSpeed, cameraMaxSpeed);
// Specific for the mission were you have to chase the Executive Transport
if ((currentGame.area == MISN_ELLESH) && (aliens[ALIEN_BOSS].shield > 0) &&
(player.shield > 0))
{
engine.ssx = -6;
engine.ssy = 0;
}
if (currentGame.area == MISN_MARS)
{
engine.ssx = -6;
engine.ssy = 0;
}
player.dx = engine.ssx;
player.dy = engine.ssy;
}
void flushInput()
{
for (int i = 0; i < KEY_LAST; i++)

View File

@ -21,12 +21,12 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define PLAYER_H
extern object player;
extern bool player_chargerFired;
extern void initPlayer();
void player_setTarget(int index);
char player_checkShockDamage(float x, float y);
extern void exitPlayer();
extern void doPlayer();
extern void flushInput();
extern void getPlayerInput();
extern void leaveSector();