Start of capital ships.

This commit is contained in:
Steve 2015-12-07 19:19:14 +00:00
parent 7c99ccc845
commit 6084251e9f
16 changed files with 390 additions and 11 deletions

View File

@ -10,7 +10,7 @@ DEPS += defs.h structs.h
OBJS += ai.o
OBJS += battle.o bullets.o
OBJS += challenges.o cJSON.o
OBJS += capitalShips.o challenges.o cJSON.o
OBJS += draw.o
OBJS += effects.o entities.o extractionPoint.o
OBJS += fighters.o

View File

@ -0,0 +1,3 @@
[
"data/capitalShips/test.json"
]

View File

@ -0,0 +1,46 @@
{
"name" : "Test Frigate",
"health" : 1,
"shield" : 500,
"shieldRechargeRate" : 60,
"texture" : "gfx/capitalShips/test/body.png",
"components" : [
{
"health" : 100,
"texture" : "gfx/capitalShips/test/core.png",
"x" : 0,
"y" : -100,
"flags" : "EF_TAKES_DAMAGE"
},
{
"health" : 100,
"texture" : "gfx/capitalShips/test/engine1.png",
"x" : -112,
"y" : 281,
"flags" : "EF_TAKES_DAMAGE"
},
{
"health" : 100,
"texture" : "gfx/capitalShips/test/engine1.png",
"x" : 112,
"y" : 281,
"flags" : "EF_TAKES_DAMAGE"
},
{
"health" : 100,
"texture" : "gfx/capitalShips/test/engine2.png",
"x" : -34,
"y" : 268,
"flags" : "EF_TAKES_DAMAGE"
},
{
"health" : 100,
"texture" : "gfx/capitalShips/test/engine2.png",
"x" : 34,
"y" : 268,
"flags" : "EF_TAKES_DAMAGE"
}
],
"guns" : [
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

187
src/battle/capitalShips.c Normal file
View File

@ -0,0 +1,187 @@
/*
Copyright (C) 2015 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "capitalShips.h"
static void componentDie(void);
static void loadCapitalShipDef(char *filename);
static void loadComponents(Entity *parent, cJSON *components);
static void loadGuns(Entity *parent, cJSON *guns);
static Entity defHead, *defTail;
Entity *spawnCapitalShip(char *name, int x, int y, int side)
{
Entity *def, *e, *capitalShip;
for (def = defHead.next ; def != NULL ; def = def->next)
{
if (strcmp(def->name, name) == 0)
{
e = spawnEntity();
memcpy(e, def, sizeof(Entity));
e->id = battle.entId;
e->next = NULL;
e->x = x;
e->y = y;
e->side = side;
if (e->type == ET_CAPITAL_SHIP)
{
capitalShip = e;
}
else
{
e->owner = capitalShip;
}
}
}
return capitalShip;
}
static void componentDie(void)
{
self->alive = ALIVE_DEAD;
addSmallExplosion();
playBattleSound(SND_EXPLOSION_1 + rand() % 4, self->x, self->y);
}
static void die(void)
{
}
void loadCapitalShipDefs(void)
{
cJSON *root, *node;
char *text;
text = readFile(getFileLocation("data/capitalShips/list.json"));
root = cJSON_Parse(text);
memset(&defHead, 0, sizeof(Entity));
defTail = &defHead;
for (node = root->child ; node != NULL ; node = node->next)
{
loadCapitalShipDef(node->valuestring);
}
cJSON_Delete(root);
free(text);
}
static void loadCapitalShipDef(char *filename)
{
cJSON *root;
char *text;
Entity *e;
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO, "Loading %s", filename);
text = readFile(getFileLocation(filename));
e = malloc(sizeof(Entity));
memset(e, 0, sizeof(Entity));
defTail->next = e;
defTail = e;
e->type = ET_CAPITAL_SHIP;
e->active = 1;
root = cJSON_Parse(text);
STRNCPY(e->name, cJSON_GetObjectItem(root, "name")->valuestring, MAX_NAME_LENGTH);
STRNCPY(e->defName, e->name, MAX_NAME_LENGTH);
e->health = e->maxHealth = cJSON_GetObjectItem(root, "health")->valueint;
e->shield = e->maxShield = cJSON_GetObjectItem(root, "shield")->valueint;
e->shieldRechargeRate = cJSON_GetObjectItem(root, "shieldRechargeRate")->valueint;
e->texture = getTexture(cJSON_GetObjectItem(root, "texture")->valuestring);
e->die = die;
SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h);
loadComponents(e, cJSON_GetObjectItem(root, "components"));
loadGuns(e, cJSON_GetObjectItem(root, "guns"));
cJSON_Delete(root);
free(text);
}
static void loadComponents(Entity *parent, cJSON *components)
{
Entity *e;
cJSON *component;
if (components)
{
component = components->child;
while (component)
{
e = malloc(sizeof(Entity));
memset(e, 0, sizeof(Entity));
defTail->next = e;
defTail = e;
e->active = 1;
e->type = ET_CAPITAL_SHIP_COMPONENT;
STRNCPY(e->name, parent->name, MAX_NAME_LENGTH);
STRNCPY(e->defName, parent->defName, MAX_NAME_LENGTH);
e->health = e->maxHealth = cJSON_GetObjectItem(component, "health")->valueint;
e->offsetX = cJSON_GetObjectItem(component, "x")->valueint;
e->offsetY = cJSON_GetObjectItem(component, "y")->valueint;
e->texture = getTexture(cJSON_GetObjectItem(component, "texture")->valuestring);
SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h);
if (cJSON_GetObjectItem(component, "flags"))
{
e->flags = flagsToLong(cJSON_GetObjectItem(component, "flags")->valuestring);
}
e->die = componentDie;
component = component->next;
}
}
}
static void loadGuns(Entity *parent, cJSON *guns)
{
}
void destroyCapitalShipDefs(void)
{
Entity *e;
while (defHead.next)
{
e = defHead.next;
defHead.next = e->next;
free(e);
}
}

34
src/battle/capitalShips.h Normal file
View File

@ -0,0 +1,34 @@
/*
Copyright (C) 2015 Parallel Realities
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "../common.h"
#include "../json/cJSON.h"
extern Entity *spawnEntity(void);
extern void addSmallExplosion(void);
extern void playBattleSound(int id, int x, int y);
extern SDL_Texture *getTexture(char *filename);
extern char *readFile(char *filename);
extern char *getFileLocation(char *filename);
extern long flagsToLong(char *flags);
extern Battle battle;
extern Entity *self;

View File

@ -80,6 +80,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define EF_RETREATING (2 << 8)
#define EF_NO_EPIC (2 << 9)
#define EF_STATIC (2 << 10)
#define EF_TAKES_DAMAGE (2 << 11)
#define AIF_NONE 0
#define AIF_FOLLOWS_PLAYER (2 << 0)
@ -105,7 +106,10 @@ enum
ET_FIGHTER,
ET_ITEM,
ET_WAYPOINT,
ET_EXTRACTION_POINT
ET_EXTRACTION_POINT,
ET_CAPITAL_SHIP_COMPONENT,
ET_CAPITAL_SHIP_GUN,
ET_CAPITAL_SHIP
};
enum

View File

@ -23,10 +23,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static void loadObjectives(cJSON *node);
static void loadPlayer(cJSON *node);
static void loadFighters(cJSON *node);
static void loadCapitalShips(cJSON *node);
static void loadEntities(cJSON *node);
static void loadItems(cJSON *node);
static unsigned long hashcode(const char *str);
static char **toFighterTypeArray(char *types, int *numTypes);
static char **toTypeArray(char *types, int *numTypes);
static void loadEpicData(cJSON *node);
void loadMission(char *filename)
@ -55,6 +56,8 @@ void loadMission(char *filename)
loadFighters(cJSON_GetObjectItem(root, "fighters"));
loadCapitalShips(cJSON_GetObjectItem(root, "capitalShips"));
loadEntities(cJSON_GetObjectItem(root, "entities"));
loadItems(cJSON_GetObjectItem(root, "items"));
@ -216,7 +219,7 @@ static void loadFighters(cJSON *node)
active = 1;
number = 1;
types = toFighterTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes);
types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes);
side = lookup(cJSON_GetObjectItem(node, "side")->valuestring);
x = cJSON_GetObjectItem(node, "x")->valuedouble * GRID_CELL_WIDTH;
y = cJSON_GetObjectItem(node, "y")->valuedouble * GRID_CELL_HEIGHT;
@ -262,8 +265,11 @@ static void loadFighters(cJSON *node)
f = spawnFighter(type, x, y, side);
f->x += (rand() % scatter) - (rand() % scatter);
f->y += (rand() % scatter) - (rand() % scatter);
if (scatter > 1)
{
f->x += (rand() % scatter) - (rand() % scatter);
f->y += (rand() % scatter) - (rand() % scatter);
}
f->active = active;
@ -295,6 +301,88 @@ static void loadFighters(cJSON *node)
}
}
static void loadCapitalShips(cJSON *node)
{
Entity *e;
char **types, *name, *groupName, *type;
int side, scatter, number, active;
int i, numTypes;
float x, y;
if (node)
{
node = node->child;
while (node)
{
name = NULL;
groupName = NULL;
scatter = 1;
active = 1;
number = 1;
types = toTypeArray(cJSON_GetObjectItem(node, "types")->valuestring, &numTypes);
side = lookup(cJSON_GetObjectItem(node, "side")->valuestring);
x = cJSON_GetObjectItem(node, "x")->valuedouble * GRID_CELL_WIDTH;
y = cJSON_GetObjectItem(node, "y")->valuedouble * GRID_CELL_HEIGHT;
if (cJSON_GetObjectItem(node, "name"))
{
name = cJSON_GetObjectItem(node, "name")->valuestring;
}
if (cJSON_GetObjectItem(node, "groupName"))
{
groupName = cJSON_GetObjectItem(node, "groupName")->valuestring;
}
if (cJSON_GetObjectItem(node, "number"))
{
number = cJSON_GetObjectItem(node, "number")->valueint;
}
if (cJSON_GetObjectItem(node, "scatter"))
{
scatter = cJSON_GetObjectItem(node, "scatter")->valueint;
}
if (cJSON_GetObjectItem(node, "active"))
{
active = cJSON_GetObjectItem(node, "active")->valueint;
}
for (i = 0 ; i < number ; i++)
{
type = types[rand() % numTypes];
e = spawnCapitalShip(type, x, y, side);
if (scatter > 1)
{
e->x += (rand() % scatter) - (rand() % scatter);
e->y += (rand() % scatter) - (rand() % scatter);
}
e->active = active;
if (name)
{
STRNCPY(e->name, name, MAX_NAME_LENGTH);
}
if (groupName)
{
STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH);
}
}
node = node->next;
free(types);
}
}
}
static void loadEntities(cJSON *node)
{
Entity *e;
@ -374,8 +462,11 @@ static void loadEntities(cJSON *node)
e->x = x;
e->y = y;
e->x += (rand() % scatter) - (rand() % scatter);
e->y += (rand() % scatter) - (rand() % scatter);
if (scatter > 1)
{
e->x += (rand() % scatter) - (rand() % scatter);
e->y += (rand() % scatter) - (rand() % scatter);
}
e->active = active;
@ -465,8 +556,11 @@ static void loadItems(cJSON *node)
e->y = y;
e->active = active;
e->x += (rand() % scatter) - (rand() % scatter);
e->y += (rand() % scatter) - (rand() % scatter);
if (scatter > 1)
{
e->x += (rand() % scatter) - (rand() % scatter);
e->y += (rand() % scatter) - (rand() % scatter);
}
SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h);
}
@ -476,7 +570,7 @@ static void loadItems(cJSON *node)
}
}
static char **toFighterTypeArray(char *types, int *numTypes)
static char **toTypeArray(char *types, int *numTypes)
{
int i;
char **typeArray, *type;

View File

@ -28,6 +28,7 @@ extern long lookup(char *name);
extern char *readFile(char *filename);
extern SDL_Texture *getTexture(char *filename);
extern Entity *spawnFighter(char *name, int x, int y, int side);
extern Entity *spawnCapitalShip(char *name, int x, int y, int side);
extern void startSectionTransition(void);
extern void endSectionTransition(void);
extern void playMusic(char *filename);

View File

@ -79,6 +79,8 @@ struct Entity {
int side;
float x;
float y;
int offsetX;
int offsetY;
int w;
int h;
float dx;

View File

@ -120,6 +120,8 @@ void initGameSystem(void)
loadFighterDefs();
loadCapitalShipDefs();
loadItemDefs();
initBulletDefs();
@ -219,6 +221,8 @@ void cleanup(void)
destroyFighterDefs();
destroyCapitalShipDefs();
destroyBulletDefs();
destroyItemDefs();

View File

@ -32,6 +32,7 @@ extern int writeFile(char *filename, char *data);
extern char *getSaveFilePath(char *filename);
extern void initSounds(void);
extern void loadFighterDefs(void);
extern void loadCapitalShipDefs(void);
extern void loadItemDefs(void);
extern void initFonts(void);
extern void initBulletDefs(void);
@ -45,6 +46,7 @@ extern void destroyFonts(void);
extern void destroySounds(void);
extern void destroyGame(void);
extern void destroyFighterDefs(void);
extern void destroyCapitalShipDefs(void);
extern void destroyBulletDefs(void);
extern void destroyItemDefs(void);
extern void destroyStarSystems(void);

View File

@ -32,6 +32,7 @@ void initLookups(void)
addLookup("ET_WAYPOINT", ET_WAYPOINT);
addLookup("ET_EXTRACTION_POINT", ET_EXTRACTION_POINT);
addLookup("ET_CAPITAL_SHIP", ET_CAPITAL_SHIP);
addLookup("EF_NO_KILL", EF_NO_KILL);
addLookup("EF_DISABLED", EF_DISABLED);
@ -43,6 +44,7 @@ void initLookups(void)
addLookup("EF_COLLECTS_ITEMS", EF_COLLECTS_ITEMS);
addLookup("EF_NO_EPIC", EF_NO_EPIC);
addLookup("EF_STATIC", EF_STATIC);
addLookup("EF_TAKES_DAMAGE", EF_TAKES_DAMAGE);
addLookup("AIF_NONE", AIF_NONE);
addLookup("AIF_MOVES_TO_PLAYER", AIF_MOVES_TO_PLAYER);