From a8a5d507fb5d05c09dc80bd7c7f3ffa565aa6909 Mon Sep 17 00:00:00 2001 From: Steve Date: Wed, 21 Oct 2015 19:21:45 +0100 Subject: [PATCH] Added mag cannons and Ray. --- data/battle/bullets.json | 8 ++ data/fighters/list.json | 3 +- data/fighters/ray.json | 25 ++++++ .../temper/03 - pirate uprising #3.json | 35 ++++++++ makefile | 2 +- sound/18382__inferno__hvylas.ogg | Bin 0 -> 5718 bytes sound/35677__jobro__laser1.ogg | Bin 8953 -> 0 bytes src/battle/bullets.c | 2 +- src/battle/bullets.h | 2 +- src/battle/fighterDefs.c | 5 +- src/battle/fighters.c | 60 +++++++++++--- src/battle/fighters.h | 1 + src/battle/objectives.c | 76 ++++++++++++------ src/defs.h | 10 ++- src/structs.h | 5 +- src/system/lookup.c | 1 + src/system/sound.c | 1 + 17 files changed, 193 insertions(+), 43 deletions(-) create mode 100644 data/fighters/ray.json create mode 100644 data/missions/temper/03 - pirate uprising #3.json create mode 100644 sound/18382__inferno__hvylas.ogg delete mode 100644 sound/35677__jobro__laser1.ogg diff --git a/data/battle/bullets.json b/data/battle/bullets.json index 025d012..66fd53a 100644 --- a/data/battle/bullets.json +++ b/data/battle/bullets.json @@ -21,5 +21,13 @@ "textureName" : "gfx/bullets/missile.png", "sound" : "SND_PLASMA", "flags" : "BF_ENGINE" + }, + + { + "type" : "BT_MAG", + "damage" : 10, + "textureName" : "gfx/bullets/magBolt.png", + "sound" : "SND_MAG", + "flags" : "BF_SYSTEM_DAMAGE" } ] diff --git a/data/fighters/list.json b/data/fighters/list.json index f97b142..384f297 100644 --- a/data/fighters/list.json +++ b/data/fighters/list.json @@ -6,5 +6,6 @@ "data/fighters/sphinx.json", "data/fighters/staticDart.json", "data/fighters/taf.json", - "data/fighters/unarmedDart.json" + "data/fighters/unarmedDart.json", + "data/fighters/ray.json" ] diff --git a/data/fighters/ray.json b/data/fighters/ray.json new file mode 100644 index 0000000..599dd70 --- /dev/null +++ b/data/fighters/ray.json @@ -0,0 +1,25 @@ +{ + "name" : "Ray", + "health" : 45, + "shield" : 45, + "speed" : 1.85, + "reloadTime" : 16, + "shieldRechargeRate" : 60, + "textureName" : "gfx/fighters/ray.png", + "guns" : [ + { + "type" : "BT_MAG", + "x" : -12, + "y" : -12 + }, + { + "type" : "BT_MAG", + "x" : 12, + "y" : -12 + } + ], + "missiles" : { + "type" : "MISSILE_MISSILE", + "ammo" : 4 + } +} diff --git a/data/missions/temper/03 - pirate uprising #3.json b/data/missions/temper/03 - pirate uprising #3.json new file mode 100644 index 0000000..49b580f --- /dev/null +++ b/data/missions/temper/03 - pirate uprising #3.json @@ -0,0 +1,35 @@ +{ + "name" : "Pirate Uprising #3", + "description" : "Allied intelligence have managed to locate one of the pirate ring leaders. We need to bring this man in alive, as he could provide us with further useful information that will allow us to eliminate other high ranking individuals.", + "background" : "gfx/backgrounds/background03.jpg", + "planet" : "gfx/planets/spirit.png", + "music" : "music/battleThemeA.mp3", + "objectives" : [ + { + "description" : "Capture Pirate Leader", + "targetName" : "Pirate Leader", + "targetValue" : 1 + }, + { + "description" : "Do not kill pirate leader", + "targetName" : "Pirate Leader", + "targetValue" : 1, + "condition" : 1 + } + ], + "player" : { + "type" : "Ray", + "side" : "SIDE_ALLIES", + "pilot" : "Ian Barclay", + "squadron" : "Steel Bulls" + }, + "fighters" : [ + { + "name" : "Pirate Leader", + "type" : "UnarmedDart", + "side" : "SIDE_PIRATE", + "x" : 800, + "y" : 200 + } + ] +} diff --git a/makefile b/makefile index 8f6e44e..6dcd124 100644 --- a/makefile +++ b/makefile @@ -1,6 +1,6 @@ PROG = tbftss -VERSION = 0.1 +VERSION = 0.2 CXXFLAGS += `sdl2-config --cflags` -DVERSION=$(VERSION) -DUNIX=1 CXXFLAGS += -DUNIX diff --git a/sound/18382__inferno__hvylas.ogg b/sound/18382__inferno__hvylas.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cfd324c50c73c080a088ca282a0673e81ac17fa2 GIT binary patch literal 5718 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 literal 0 HcmV?d00001 diff --git a/sound/35677__jobro__laser1.ogg b/sound/35677__jobro__laser1.ogg deleted file mode 100644 index 1f7bf2b9f94b80c7ebc6a0caf599d725460828f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8953 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 KU>dQG2>us(MuSrT diff --git a/src/battle/bullets.c b/src/battle/bullets.c index 4528051..ede1435 100644 --- a/src/battle/bullets.c +++ b/src/battle/bullets.c @@ -114,7 +114,7 @@ static void checkCollisions(Bullet *b) battle.stats.shotsHit++; } - damageFighter(f, b->damage); + damageFighter(f, b->damage, b->flags); b->life = 0; /* assuming that health <= 0 will always mean killed */ diff --git a/src/battle/bullets.h b/src/battle/bullets.h index 7b10524..914c65d 100644 --- a/src/battle/bullets.h +++ b/src/battle/bullets.h @@ -30,7 +30,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. extern SDL_Texture *getTexture(char *filename); extern void blitRotated(SDL_Texture *texture, int x, int y, int angle); extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2); -extern void damageFighter(Fighter *f, int damage); +extern void damageFighter(Fighter *f, int damage, long flags); extern void playBattleSound(int id, int x, int y); extern long flagsToLong(char *flags); extern long lookup(char *name); diff --git a/src/battle/fighterDefs.c b/src/battle/fighterDefs.c index 7bd8402..168aa7b 100644 --- a/src/battle/fighterDefs.c +++ b/src/battle/fighterDefs.c @@ -81,7 +81,7 @@ static void loadFighterDef(char *filename) STRNCPY(f->name, cJSON_GetObjectItem(root, "name")->valuestring, MAX_NAME_LENGTH); f->health = f->maxHealth = cJSON_GetObjectItem(root, "health")->valueint; f->shield = f->maxShield = cJSON_GetObjectItem(root, "shield")->valueint; - f->speed = cJSON_GetObjectItem(root, "speed")->valueint; + f->speed = cJSON_GetObjectItem(root, "speed")->valuedouble; f->reloadTime = cJSON_GetObjectItem(root, "reloadTime")->valueint; f->shieldRechargeRate = cJSON_GetObjectItem(root, "shieldRechargeRate")->valueint; f->texture = getTexture(cJSON_GetObjectItem(root, "textureName")->valuestring); @@ -118,6 +118,9 @@ static void loadFighterDef(char *filename) f->separationRadius = MAX(w, h); f->separationRadius *= 2; + /* all craft default to 100 system power */ + f->systemPower = 100; + cJSON_Delete(root); free(text); } diff --git a/src/battle/fighters.c b/src/battle/fighters.c index ac470f6..e4fdcc1 100644 --- a/src/battle/fighters.c +++ b/src/battle/fighters.c @@ -203,6 +203,7 @@ void doFighters(void) f->shieldRecharge = MAX(f->shieldRecharge - 1, 0); f->armourHit = MAX(f->armourHit - 25, 0); f->shieldHit = MAX(f->shieldHit - 5, 0); + f->systemHit = MAX(f->systemHit - 25, 0); if (self->thrust > 0.25) { @@ -237,6 +238,21 @@ void doFighters(void) f->die(); } + if (f->systemPower <= 0 && f->alive == ALIVE_ALIVE) + { + f->dx *= 0.995; + f->dy *= 0.995; + f->thrust = 0; + f->shield = f->maxShield = 0; + f->action = NULL; + + if (f->dx <= 0.01 && f->dy <= 0.01) + { + updateObjective(f->name); + f->alive = ALIVE_DISABLED; + } + } + if (f->alive == ALIVE_DEAD) { if (f == player) @@ -260,6 +276,8 @@ void doFighters(void) } updateObjective(f->name); + + updateCondition(f->name); } if (f == battle.fighterTail) @@ -340,6 +358,11 @@ void drawFighters(void) SDL_SetTextureColorMod(f->texture, 255, 255 - f->armourHit, 255 - f->armourHit); } + if (f->systemHit > 0) + { + SDL_SetTextureColorMod(f->texture, 255 - f->systemHit, 255, 255); + } + blitRotated(f->texture, f->x, f->y, f->angle); if (f->shieldHit > 0) @@ -386,21 +409,36 @@ void applyFighterBrakes(void) self->thrust = sqrt((self->dx * self->dx) + (self->dy * self->dy)); } -void damageFighter(Fighter *f, int damage) +void damageFighter(Fighter *f, int amount, long flags) { - f->shield -= damage; - - if (f->shield < 0) + if (flags & BF_SYSTEM_DAMAGE) { - f->health -= abs(f->shield); - f->shield = 0; - f->armourHit = 255; + f->systemPower = MAX(0, f->systemPower - amount); - playBattleSound(SND_ARMOUR_HIT, f->x, f->y); + f->systemHit = 255; + + if (f->systemPower == 0) + { + f->shield = f->maxShield = 0; + f->action = f->defaultAction = NULL; + } } - else if (f->shield > 0) + else { - f->shieldHit = 255; + f->shield -= amount; + + if (f->shield < 0) + { + f->health -= abs(f->shield); + f->shield = 0; + f->armourHit = 255; + + playBattleSound(SND_ARMOUR_HIT, f->x, f->y); + } + else if (f->shield > 0) + { + f->shieldHit = 255; + } } } @@ -441,6 +479,7 @@ static void spinDie(void) self->thinkTime = 0; self->armourHit = 0; self->shieldHit = 0; + self->systemHit = 0; self->angle += 8; @@ -463,6 +502,7 @@ static void straightDie(void) self->thinkTime = 0; self->armourHit = 0; self->shieldHit = 0; + self->systemHit = 0; if (rand() % 2 == 0) { diff --git a/src/battle/fighters.h b/src/battle/fighters.h index 594d838..d2226df 100644 --- a/src/battle/fighters.h +++ b/src/battle/fighters.h @@ -34,6 +34,7 @@ extern void addFighterExplosion(void); extern void addSmallFighterExplosion(void); extern void playBattleSound(int id, int x, int y); extern void updateObjective(char *name); +extern void updateCondition(char *name); extern Fighter *getFighterDef(char *name); extern void addHudMessage(SDL_Color c, char *format, ...); diff --git a/src/battle/objectives.c b/src/battle/objectives.c index b995505..ed7a8b1 100644 --- a/src/battle/objectives.c +++ b/src/battle/objectives.c @@ -24,9 +24,11 @@ void failIncompleteObjectives(void); void doObjectives(void) { + int conditionFailed; Objective *o; battle.numObjectivesComplete = battle.numObjectivesTotal = 0; + conditionFailed = 0; for (o = battle.objectiveHead.next ; o != NULL ; o = o->next) { @@ -34,18 +36,39 @@ void doObjectives(void) if (o->currentValue == o->targetValue) { - battle.numObjectivesComplete++; + switch (o->status) + { + case OS_COMPLETE: + battle.numObjectivesComplete++; + break; + + case OS_FAILED: + if (!o->optional) + { + conditionFailed = 1; + } + break; + } } } - if (battle.numObjectivesTotal > 0 && battle.numObjectivesComplete == battle.numObjectivesTotal && battle.status == MS_IN_PROGRESS) + if (battle.status == MS_IN_PROGRESS) { - battle.status = MS_COMPLETE; - battle.missionFinishedTimer = FPS; + if (battle.numObjectivesTotal > 0 && battle.numObjectivesComplete == battle.numObjectivesTotal) + { + battle.status = MS_COMPLETE; + battle.missionFinishedTimer = FPS; + + game.stats.missionsCompleted++; + + updateChallenges(); + } - game.stats.missionsCompleted++; - - updateChallenges(); + if (conditionFailed) + { + battle.status = MS_FAILED; + battle.missionFinishedTimer = FPS; + } } } @@ -55,9 +78,9 @@ void updateObjective(char *name) for (o = battle.objectiveHead.next ; o != NULL ; o = o->next) { - if (strcmp(o->targetName, name) == 0) + if (o->status != OS_CONDITION && o->currentValue < o->targetValue && strcmp(o->targetName, name) == 0) { - o->currentValue = MIN(o->targetValue, o->currentValue + 1); + o->currentValue++; if (o->targetValue - o->currentValue <= 10) { @@ -70,20 +93,27 @@ void updateObjective(char *name) if (o->currentValue == o->targetValue) { - switch (o->status) - { - case OS_INCOMPLETE: - o->status = OS_COMPLETE; - addHudMessage(colors.green, "%s - Objective Complete!", o->description); - break; - - case OS_CONDITIONAL: - o->status = OS_FAILED; - battle.status = MS_FAILED; - battle.missionFinishedTimer = FPS; - failIncompleteObjectives(); - break; - } + o->status = OS_COMPLETE; + addHudMessage(colors.green, "%s - Objective Complete!", o->description); + } + } + } +} + +void updateCondition(char *name) +{ + Objective *o; + + for (o = battle.objectiveHead.next ; o != NULL ; o = o->next) + { + if (o->status == OS_CONDITION && o->currentValue < o->targetValue && strcmp(o->targetName, name) == 0) + { + o->currentValue++; + + if (o->currentValue == o->targetValue) + { + o->status = OS_FAILED; + addHudMessage(colors.green, "%s - Objective Failed!", o->description); } } } diff --git a/src/defs.h b/src/defs.h index 456842a..d614454 100644 --- a/src/defs.h +++ b/src/defs.h @@ -46,8 +46,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define MAX_FIGHTER_GUNS 12 -#define BF_NONE 0 -#define BF_ENGINE (2 << 0) +#define BF_NONE 0 +#define BF_ENGINE (2 << 0) +#define BF_SYSTEM_DAMAGE (2 << 1) enum { @@ -60,7 +61,8 @@ enum { ALIVE_ALIVE, ALIVE_DYING, - ALIVE_DEAD + ALIVE_DEAD, + ALIVE_DISABLED }; enum @@ -125,7 +127,7 @@ enum OS_INCOMPLETE, OS_COMPLETE, OS_FAILED, - OS_CONDITIONAL + OS_CONDITION }; enum diff --git a/src/structs.h b/src/structs.h index 360ab1b..81805c4 100644 --- a/src/structs.h +++ b/src/structs.h @@ -76,7 +76,7 @@ struct Fighter { float dx; float dy; float thrust; - int speed; + float speed; int angle; int alive; int health; @@ -87,8 +87,10 @@ struct Fighter { int reloadTime; int shieldRecharge; int shieldRechargeRate; + int systemPower; int armourHit; int shieldHit; + int systemHit; int thinkTime; int aiActionTime; int aggression; @@ -158,6 +160,7 @@ struct Objective { int currentValue; int targetValue; int status; + int optional; Objective *next; }; diff --git a/src/system/lookup.c b/src/system/lookup.c index 87bb20e..6d613a8 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -53,6 +53,7 @@ void initLookups(void) addLookup("BF_NONE", BF_NONE); addLookup("BF_ENGINE", BF_ENGINE); + addLookup("BF_SYSTEM_DAMAGE", BF_SYSTEM_DAMAGE); addLookup("MISSILE_ROCKET", MISSILE_ROCKET); addLookup("MISSILE_MISSILE", MISSILE_MISSILE); diff --git a/src/system/sound.c b/src/system/sound.c index 8bc84c2..786fa08 100644 --- a/src/system/sound.c +++ b/src/system/sound.c @@ -93,6 +93,7 @@ static void loadSounds(void) { sounds[SND_ARMOUR_HIT] = Mix_LoadWAV("sound/275151__bird-man__gun-shot.ogg"); sounds[SND_PLASMA] = Mix_LoadWAV("sound/268344__julien-matthey__jm-noiz-laser-01.ogg"); + sounds[SND_MAG] = Mix_LoadWAV("sound/18382__inferno__hvylas.ogg"); sounds[SND_PARTICLE] = Mix_LoadWAV("sound/77087__supraliminal__laser-short.ogg"); sounds[SND_EXPLOSION_1] = Mix_LoadWAV("sound/162265__qubodup__explosive.ogg"); sounds[SND_EXPLOSION_2] = Mix_LoadWAV("sound/207322__animationisaac__short-explosion.ogg");