diff --git a/data/capitalShips/corvette.json b/data/capitalShips/corvette.json index b89bac4..d55a100 100644 --- a/data/capitalShips/corvette.json +++ b/data/capitalShips/corvette.json @@ -6,84 +6,86 @@ "texture" : "gfx/capitalShips/test/body.png", "components" : [ { - "health" : 350, + "health" : 150, "texture" : "gfx/capitalShips/test/core.png", "x" : 0, "y" : -125, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : -32, "y" : -250, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : 32, "y" : -250, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : -110, "y" : -30, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : 110, "y" : -30, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : 0, "y" : 0, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : 0, "y" : 50, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 350, + "health" : 50, "texture" : "gfx/capitalShips/test/component.png", "x" : 0, "y" : 100, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" - }, + } + ], + "engines" : [ { - "health" : 250, + "health" : 100, "texture" : "gfx/capitalShips/test/engine1.png", "x" : -112, "y" : 281, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 250, + "health" : 100, "texture" : "gfx/capitalShips/test/engine1.png", "x" : 112, "y" : 281, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 250, + "health" : 100, "texture" : "gfx/capitalShips/test/engine2.png", "x" : -34, "y" : 268, "flags" : "EF_TAKES_DAMAGE+EF_STATIC" }, { - "health" : 250, + "health" : 100, "texture" : "gfx/capitalShips/test/engine2.png", "x" : 34, "y" : 268, diff --git a/src/battle/capitalShips.c b/src/battle/capitalShips.c index 8247ee7..44356fa 100644 --- a/src/battle/capitalShips.c +++ b/src/battle/capitalShips.c @@ -23,9 +23,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static void think(void); static void gunThink(void); static void componentDie(void); +static void engineDie(void); static void loadCapitalShipDef(char *filename); static void loadComponents(Entity *parent, cJSON *components); static void loadGuns(Entity *parent, cJSON *guns); +static void loadEngines(Entity *parent, cJSON *engines); static Entity defHead, *defTail; @@ -107,10 +109,29 @@ static void componentDie(void) addSmallExplosion(); playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y); - if (self->type == ET_CAPITAL_SHIP_COMPONENT) + self->owner->health--; +} + +static void engineDie(void) +{ + Entity *e; + + self->alive = ALIVE_DEAD; + addSmallExplosion(); + playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y); + + for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - self->owner->health--; + if (e != self && e->owner == self->owner && e->type == ET_CAPITAL_SHIP_ENGINE) + { + return; + } } + + /* no more engines - stop moving */ + self->owner->speed = 0; + self->owner->action = NULL; + self->owner->dx = self->owner->dy = 0; } static void die(void) @@ -185,6 +206,8 @@ static void loadCapitalShipDef(char *filename) loadGuns(e, cJSON_GetObjectItem(root, "guns")); + loadEngines(e, cJSON_GetObjectItem(root, "engines")); + cJSON_Delete(root); free(text); } @@ -294,6 +317,50 @@ static void loadGuns(Entity *parent, cJSON *guns) } } +static void loadEngines(Entity *parent, cJSON *engines) +{ + Entity *e; + cJSON *engine; + + if (engines) + { + engine = engines->child; + + while (engine) + { + e = malloc(sizeof(Entity)); + memset(e, 0, sizeof(Entity)); + defTail->next = e; + defTail = e; + + e->active = 1; + + e->type = ET_CAPITAL_SHIP_ENGINE; + sprintf(e->name, "%s (Engine)", parent->name); + sprintf(e->defName, "%s (Engine)", parent->defName); + e->health = e->maxHealth = cJSON_GetObjectItem(engine, "health")->valueint; + e->offsetX = cJSON_GetObjectItem(engine, "x")->valueint; + e->offsetY = cJSON_GetObjectItem(engine, "y")->valueint; + e->texture = getTexture(cJSON_GetObjectItem(engine, "texture")->valuestring); + + if (cJSON_GetObjectItem(engine, "flags")) + { + e->flags = flagsToLong(cJSON_GetObjectItem(engine, "flags")->valuestring); + } + + SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); + + e->systemPower = 100; + + e->die = engineDie; + + e->owner = parent; + + engine = engine->next; + } + } +} + void destroyCapitalShipDefs(void) { Entity *e; diff --git a/src/defs.h b/src/defs.h index 0e2874f..c5aed92 100644 --- a/src/defs.h +++ b/src/defs.h @@ -110,6 +110,7 @@ enum ET_EXTRACTION_POINT, ET_CAPITAL_SHIP_COMPONENT, ET_CAPITAL_SHIP_GUN, + ET_CAPITAL_SHIP_ENGINE, ET_CAPITAL_SHIP };