diff --git a/common.mk b/common.mk index 99c15d9..e0ad765 100644 --- a/common.mk +++ b/common.mk @@ -16,7 +16,7 @@ OBJS += fighters.o OBJS += galacticMap.o game.o grid.o OBJS += hud.o OBJS += init.o input.o io.o items.o -OBJS += load.o lookup.o +OBJS += load.o locations.o lookup.o OBJS += main.o messageBox.o mission.o missionInfo.o OBJS += objectives.o options.o OBJS += player.o diff --git a/src/battle/battle.c b/src/battle/battle.c index 0cb641e..e89fc4e 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -46,6 +46,7 @@ void initBattle(void) battle.entityTail = &battle.entityHead; battle.effectTail = &battle.effectHead; battle.objectiveTail = &battle.objectiveHead; + battle.locationTail = &battle.locationHead; app.delegate.logic = &logic; app.delegate.draw = &draw; @@ -147,17 +148,17 @@ static void doBattle(void) if (player != NULL) { + doLocations(); + doMessageBox(); - } - - if (battle.status == MS_IN_PROGRESS) - { - if (player != NULL) + + if (battle.status == MS_IN_PROGRESS) { doScript(); } } - else + + if (battle.status != MS_IN_PROGRESS) { battle.missionFinishedTimer--; } @@ -194,6 +195,11 @@ static void draw(void) drawEffects(); + if (dev.debug) + { + drawLocations(); + } + drawHud(); if (player != NULL) @@ -358,6 +364,7 @@ void destroyBattle(void) Debris *d; Effect *e; Objective *o; + Location *l; while (battle.entityHead.next) { @@ -399,6 +406,14 @@ void destroyBattle(void) } battle.objectiveTail = &battle.objectiveHead; + while (battle.locationHead.next) + { + l = battle.locationHead.next; + battle.locationHead.next = l->next; + free(l); + } + battle.locationTail = &battle.locationHead; + cJSON_Delete(battle.missionJSON); resetHud(); diff --git a/src/battle/battle.h b/src/battle/battle.h index 7f9eb9b..b21496d 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -78,6 +78,8 @@ extern void initBullets(void); extern void initDebris(void); extern void doDebris(void); extern void drawDebris(void); +extern void doLocations(void); +extern void drawLocations(void); extern App app; extern Battle battle; diff --git a/src/battle/locations.c b/src/battle/locations.c new file mode 100644 index 0000000..39d9d01 --- /dev/null +++ b/src/battle/locations.c @@ -0,0 +1,52 @@ +/* +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 "locations.h" + +void doLocations(void) +{ + Location *l, *prev; + + prev = &battle.locationHead; + + for (l = battle.locationHead.next ; l != NULL ; l = l->next) + { + if (getDistance(player->x, player->y, l->x, l->y) <= l->size) + { + runScriptFunction(l->name); + + prev->next = l->next; + free(l); + l = prev; + } + + prev = l; + } +} + +void drawLocations(void) +{ + Location *l; + + for (l = battle.locationHead.next ; l != NULL ; l = l->next) + { + drawCircle(l->x - battle.camera.x, l->y - battle.camera.y, l->size, 0, 255, 0, 255); + } +} diff --git a/src/battle/locations.h b/src/battle/locations.h new file mode 100644 index 0000000..59b9fa8 --- /dev/null +++ b/src/battle/locations.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 "../common.h" + +extern Battle battle; +extern Entity *player; + +extern int getDistance(int x1, int y1, int x2, int y2); +extern void runScriptFunction(char *format, ...); +extern void drawCircle(int cx, int cy, int radius, int r, int g, int b, int a); diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index 4bff541..2dadbec 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -26,6 +26,7 @@ static void loadFighters(cJSON *node); static void loadCapitalShips(cJSON *node); static void loadEntities(cJSON *node); static void loadItems(cJSON *node); +static void loadLocations(cJSON *node); static unsigned long hashcode(const char *str); static char **toTypeArray(char *types, int *numTypes); static void loadEpicData(cJSON *node); @@ -62,6 +63,8 @@ void loadMission(char *filename) loadItems(cJSON_GetObjectItem(root, "items")); + loadLocations(cJSON_GetObjectItem(root, "locations")); + STRNCPY(music, cJSON_GetObjectItem(root, "music")->valuestring, MAX_NAME_LENGTH); if (cJSON_GetObjectItem(root, "epic")) @@ -630,6 +633,34 @@ static void loadItems(cJSON *node) } } +static void loadLocations(cJSON *node) +{ + Location *l; + + if (node) + { + node = node->child; + + while (node) + { + l = malloc(sizeof(Location)); + memset(l, 0, sizeof(Location)); + battle.locationTail->next = l; + battle.locationTail = l; + + STRNCPY(l->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); + l->x = cJSON_GetObjectItem(node, "x")->valueint * GRID_CELL_WIDTH; + l->y = cJSON_GetObjectItem(node, "y")->valueint * GRID_CELL_HEIGHT; + l->size = cJSON_GetObjectItem(node, "size")->valueint; + + l->x += (GRID_CELL_WIDTH / 2); + l->y += (GRID_CELL_HEIGHT / 2); + + node = node->next; + } + } +} + static char **toTypeArray(char *types, int *numTypes) { int i; diff --git a/src/structs.h b/src/structs.h index 128e405..955b9bb 100644 --- a/src/structs.h +++ b/src/structs.h @@ -35,6 +35,7 @@ typedef struct HudMessage HudMessage; typedef struct MessageBox MessageBox; typedef struct GridCell GridCell; typedef struct ScriptRunner ScriptRunner; +typedef struct Location Location; typedef struct { int debug; @@ -202,6 +203,14 @@ struct Effect { Effect *next; }; +struct Location { + char name[MAX_NAME_LENGTH]; + int x; + int y; + int size; + Location *next; +}; + struct Objective { int active; char description[MAX_DESCRIPTION_LENGTH]; @@ -281,6 +290,7 @@ typedef struct { Debris debrisHead, *debrisTail; Effect effectHead, *effectTail; Objective objectiveHead, *objectiveTail; + Location locationHead, *locationTail; struct cJSON *missionJSON; unsigned int stats[STAT_MAX]; GridCell grid[GRID_SIZE][GRID_SIZE];