From 73eb5517bfad946f384037117000b0e47b2c68c2 Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 26 Oct 2015 17:27:43 +0000 Subject: [PATCH] Start of waypoints. --- data/missions/test/test.json | 10 +++--- gfx/entities/waypoint.png | Bin 0 -> 15204 bytes makefile | 4 +-- src/battle/battle.c | 14 ++++++++ src/battle/battle.h | 2 ++ src/battle/entities.c | 64 +++++++++++++++++++++++++++++++++++ src/battle/entities.h | 28 +++++++++++++++ src/battle/objectives.h | 1 - src/battle/waypoints.c | 42 +++++++++++++++++++++++ src/battle/waypoints.h | 28 +++++++++++++++ src/defs.h | 5 +++ src/galaxy/mission.c | 37 ++++++++++++++++++++ src/galaxy/mission.h | 1 + src/json/cJSON.c | 2 +- src/json/cJSON.h | 8 ++--- src/structs.h | 23 +++++++++++++ src/system/lookup.c | 2 ++ 17 files changed, 258 insertions(+), 13 deletions(-) create mode 100644 gfx/entities/waypoint.png create mode 100644 src/battle/entities.c create mode 100644 src/battle/entities.h create mode 100644 src/battle/waypoints.c create mode 100644 src/battle/waypoints.h diff --git a/data/missions/test/test.json b/data/missions/test/test.json index d09f980..1767e0c 100644 --- a/data/missions/test/test.json +++ b/data/missions/test/test.json @@ -8,12 +8,12 @@ "type" : "Nymph", "side" : "SIDE_CSN" }, - "triggers" : [ + "entities" : [ { - "type" : "TRIGGER_TIME", - "targetName" : "TIME", - "targetValue" : 10, - "action" : "TA_COMPLETE_MISSION" + "name" : "Waypoint", + "type" : "ET_WAYPOINT", + "x" : 100, + "y" : 100 } ] } diff --git a/gfx/entities/waypoint.png b/gfx/entities/waypoint.png new file mode 100644 index 0000000000000000000000000000000000000000..e84fa0ecd3d7e30df776e1e485794ba6302c3fc9 GIT binary patch literal 15204 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 + free(ent); + } + battle.entityTail = &battle.entityHead; + while (battle.bulletHead.next) { b = battle.bulletHead.next; diff --git a/src/battle/battle.h b/src/battle/battle.h index a1cbaa8..44bef77 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -35,6 +35,8 @@ extern void drawBullets(void); extern void doStars(float dx, float dy); extern void drawStars(void); extern void doFighters(void); +extern void doEntities(void); +extern void drawEntities(void); extern void drawFighters(void); extern void initStars(void); extern void doPlayer(void); diff --git a/src/battle/entities.c b/src/battle/entities.c new file mode 100644 index 0000000..6fea766 --- /dev/null +++ b/src/battle/entities.c @@ -0,0 +1,64 @@ +/* +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 "entities.h" + +void doEntities(void) +{ + Entity *e, *prev; + + prev = &battle.entityHead; + + for (e = battle.entityHead.next ; e != NULL ; e = e->next) + { + e->x += e->dx; + e->y += e->dy; + + e->x -= battle.ssx; + e->y -= battle.ssy; + + if (e->action != NULL) + { + if (--e->thinkTime <= 0) + { + e->action(); + } + } + + if (e->health <= 0) + { + prev->next = e->next; + free(e); + e = prev; + } + + prev = e; + } +} + +void drawEntities(void) +{ + Entity *e; + + for (e = battle.entityHead.next ; e != NULL ; e = e->next) + { + blitRotated(e->texture, e->x, e->y, e->angle); + } +} diff --git a/src/battle/entities.h b/src/battle/entities.h new file mode 100644 index 0000000..518d828 --- /dev/null +++ b/src/battle/entities.h @@ -0,0 +1,28 @@ +/* +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 "SDL2/SDL.h" + +#include "../defs.h" +#include "../structs.h" + +extern void blitRotated(SDL_Texture *t, int x, int y, int angle); + +extern Battle battle; diff --git a/src/battle/objectives.h b/src/battle/objectives.h index 4688adf..f18dfc5 100644 --- a/src/battle/objectives.h +++ b/src/battle/objectives.h @@ -30,4 +30,3 @@ extern void failMission(void); extern Battle battle; extern Colors colors; -extern Game game; diff --git a/src/battle/waypoints.c b/src/battle/waypoints.c new file mode 100644 index 0000000..3a69da0 --- /dev/null +++ b/src/battle/waypoints.c @@ -0,0 +1,42 @@ +/* +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 "waypoints.h" + +static void rotate(void); + +Entity *spawnWaypoint(void) +{ + Entity *waypoint = malloc(sizeof(Entity)); + memset(waypoint, 0, sizeof(Entity)); + battle.entityTail->next = waypoint; + battle.entityTail = waypoint; + + waypoint->health = waypoint->maxHealth = FPS; + waypoint->texture = getTexture("gfx/entities/waypoint.png"); + waypoint->action = rotate; + + return waypoint; +} + +static void rotate(void) +{ + +} diff --git a/src/battle/waypoints.h b/src/battle/waypoints.h new file mode 100644 index 0000000..588a06a --- /dev/null +++ b/src/battle/waypoints.h @@ -0,0 +1,28 @@ +/* +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 "SDL2/SDL.h" + +#include "../defs.h" +#include "../structs.h" + +extern Battle battle; + +extern SDL_Texture *getTexture(char *filename); diff --git a/src/defs.h b/src/defs.h index 8a285cd..9a05eb1 100644 --- a/src/defs.h +++ b/src/defs.h @@ -57,6 +57,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define FF_IMMORTAL (2 << 2) #define FF_MISSION_TARGET (2 << 3) +enum +{ + ET_WAYPOINT +}; + enum { TA_LEFT, diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 53f7fdb..6496c22 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -25,6 +25,7 @@ static void loadTriggers(cJSON *node); static void loadPlayer(cJSON *node); static void loadFighters(cJSON *node); static void loadFighterGroups(cJSON *node); +static void loadEntities(cJSON *node); static unsigned long hashcode(const char *str); static char **toFighterTypeArray(char *types, int *numTypes); @@ -58,6 +59,8 @@ void loadMission(char *filename) loadFighterGroups(cJSON_GetObjectItem(root, "fighterGroups")); + loadEntities(cJSON_GetObjectItem(root, "entities")); + STRNCPY(music, cJSON_GetObjectItem(root, "music")->valuestring, MAX_NAME_LENGTH); cJSON_Delete(root); @@ -246,6 +249,40 @@ static void loadFighterGroups(cJSON *node) } } +static void loadEntities(cJSON *node) +{ + Entity *e; + int type; + + if (node) + { + node = node->child; + + while (node) + { + type = lookup(cJSON_GetObjectItem(node, "type")->valuestring); + + switch (type) + { + case ET_WAYPOINT: + e = spawnWaypoint(); + break; + } + + STRNCPY(e->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + e->x = cJSON_GetObjectItem(node, "x")->valueint; + e->y = cJSON_GetObjectItem(node, "y")->valueint; + + if (cJSON_GetObjectItem(node, "flags")) + { + e->flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring); + } + + node = node->next; + } + } +} + static char **toFighterTypeArray(char *types, int *numTypes) { int i; diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index b1e1282..9ba9e15 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -35,6 +35,7 @@ extern void playMusic(char *filename); extern void stopMusic(void); extern void initPlayer(void); extern long flagsToLong(char *flags); +extern Entity *spawnWaypoint(void); extern Battle battle; extern Fighter *player; diff --git a/src/json/cJSON.c b/src/json/cJSON.c index 46cbf72..a330f69 100644 --- a/src/json/cJSON.c +++ b/src/json/cJSON.c @@ -338,7 +338,7 @@ cJSON *cJSON_ParseWithOpts(const char *value,const char **return_parse_end,int r /* Default options for cJSON_Parse */ cJSON *cJSON_Parse(const char *value) {return cJSON_ParseWithOpts(value,0,0);} -/* Render a cJSON item/Fighter/structure to text. */ +/* Render a cJSON item/entity/structure to text. */ char *cJSON_Print(cJSON *item) {return print_value(item,0,1,0);} char *cJSON_PrintUnformatted(cJSON *item) {return print_value(item,0,0,0);} diff --git a/src/json/cJSON.h b/src/json/cJSON.h index ce38cf2..466d10d 100644 --- a/src/json/cJSON.h +++ b/src/json/cJSON.h @@ -65,13 +65,13 @@ extern void cJSON_InitHooks(cJSON_Hooks* hooks); /* Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished. */ extern cJSON *cJSON_Parse(const char *value); -/* Render a cJSON Fighter to text for transfer/storage. Free the char* when finished. */ +/* Render a cJSON entity to text for transfer/storage. Free the char* when finished. */ extern char *cJSON_Print(cJSON *item); -/* Render a cJSON Fighter to text for transfer/storage without any formatting. Free the char* when finished. */ +/* Render a cJSON entity to text for transfer/storage without any formatting. Free the char* when finished. */ extern char *cJSON_PrintUnformatted(cJSON *item); -/* Render a cJSON Fighter to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ +/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */ extern char *cJSON_PrintBuffered(cJSON *item,int prebuffer,int fmt); -/* Delete a cJSON Fighter and all subentities. */ +/* Delete a cJSON entity and all subentities. */ extern void cJSON_Delete(cJSON *c); /* Returns the number of items in an array (or object). */ diff --git a/src/structs.h b/src/structs.h index 88b6fc5..3d1d523 100644 --- a/src/structs.h +++ b/src/structs.h @@ -23,6 +23,7 @@ typedef struct Texture Texture; typedef struct Lookup Lookup; typedef struct Weapon Weapon; typedef struct Fighter Fighter; +typedef struct Entity Entity; typedef struct Bullet Bullet; typedef struct Effect Effect; typedef struct Objective Objective; @@ -68,6 +69,27 @@ struct Weapon { int y; }; +struct Entity { + int type; + char name[MAX_NAME_LENGTH]; + int side; + float x; + float y; + float dx; + float dy; + int angle; + int health; + int maxHealth; + int shield; + int thinkTime; + long flags; + void (*action)(void); + void (*defaultAction)(void); + void (*die)(void); + SDL_Texture *texture; + Entity *next; +}; + struct Fighter { char name[MAX_NAME_LENGTH]; int active; @@ -223,6 +245,7 @@ typedef struct { SDL_Texture *background, *planetTexture; PointF planet; Fighter fighterHead, *fighterTail; + Entity entityHead, *entityTail; Bullet bulletHead, *bulletTail; Effect effectHead, *effectTail; Objective objectiveHead, *objectiveTail; diff --git a/src/system/lookup.c b/src/system/lookup.c index 2be68e3..c9f28c7 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -30,6 +30,8 @@ void initLookups(void) memset(&head, 0, sizeof(Lookup)); tail = &head; + addLookup("ET_WAYPOINT", ET_WAYPOINT); + addLookup("FF_NO_KILL", FF_NO_KILL); addLookup("FF_DISABLE", FF_DISABLE); addLookup("FF_IMMORTAL", FF_IMMORTAL);