From 8c0b7fdb2fb8e88c07fe3bd1a132b3f419c868b2 Mon Sep 17 00:00:00 2001 From: Steve Date: Mon, 16 Nov 2015 12:31:50 +0000 Subject: [PATCH] Further item code updates: allow items to be created and collected. --- data/battle/items.json | 2 +- sound/56246__q-k__latch-04.ogg | Bin 0 -> 8533 bytes src/battle/items.c | 17 ++++++- src/battle/items.h | 5 ++ src/defs.h | 11 +++-- src/galaxy/mission.c | 88 ++++++++++++++++++++++++++++++++- src/galaxy/mission.h | 1 + src/system/lookup.c | 1 + src/system/sound.c | 1 + 9 files changed, 118 insertions(+), 8 deletions(-) create mode 100644 sound/56246__q-k__latch-04.ogg diff --git a/data/battle/items.json b/data/battle/items.json index bf44259..6917620 100644 --- a/data/battle/items.json +++ b/data/battle/items.json @@ -1,6 +1,6 @@ [ { - "name" : "Smile", + "name" : "smile", "textureName" : "gfx/items/smile.png" } ] diff --git a/sound/56246__q-k__latch-04.ogg b/sound/56246__q-k__latch-04.ogg new file mode 100644 index 0000000000000000000000000000000000000000..75864ba836a171a474df6755c9b464f3dee21de8 GIT binary patch literal 8533 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 HjuiP{%)$Vb literal 0 HcmV?d00001 diff --git a/src/battle/items.c b/src/battle/items.c index 8e26e3b..2d91d14 100644 --- a/src/battle/items.c +++ b/src/battle/items.c @@ -43,10 +43,14 @@ void loadItemDefs(void) e = malloc(sizeof(Entity)); memset(e, 0, sizeof(Entity)); + e->type = ET_ITEM; + e->active = 1; STRNCPY(e->name, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); STRNCPY(e->defName, cJSON_GetObjectItem(node, "name")->valuestring, MAX_NAME_LENGTH); e->texture = getTexture(cJSON_GetObjectItem(node, "textureName")->valuestring); + e->health = e->maxHealth = FPS; + SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); defTail->next = e; @@ -66,6 +70,10 @@ Entity *spawnItem(char *name) memcpy(item, def, sizeof(Entity)); + item->dx = rand() % 100 - rand() % 100; + item->dx *= 0.01; + item->dy = rand() % 100 - rand() % 100; + item->dy *= 0.01; item->action = action; return item; @@ -98,8 +106,13 @@ static void action(void) { if ((e->flags & EF_COLLECTS_ITEMS) && collision(self->x - (self->w / 2), self->y - (self->h / 2), self->w, self->h, e->x - (e->w / 2), e->y - (e->h / 2), e->w, e->h)) { - e->alive = ALIVE_DEAD; - printf("Picked up an Item\n"); + self->alive = ALIVE_DEAD; + playSound(SND_GET_ITEM); + addHudMessage(colors.white, "Picked up %s", self->name); + + updateObjective(self->name, TT_ITEM); + + checkTrigger(self->name, TRIGGER_ITEM); } } } diff --git a/src/battle/items.h b/src/battle/items.h index 83532b1..a900ada 100644 --- a/src/battle/items.h +++ b/src/battle/items.h @@ -31,5 +31,10 @@ extern long flagsToLong(char *flags); extern Entity *spawnEntity(void); extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore); extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2); +extern void playSound(int id); +extern void addHudMessage(SDL_Color c, char *format, ...); +extern void updateObjective(char *name, int type); +extern void checkTrigger(char *name, int type); extern Entity *self; +extern Colors colors; diff --git a/src/defs.h b/src/defs.h index 8db6119..27d55f9 100644 --- a/src/defs.h +++ b/src/defs.h @@ -83,9 +83,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. enum { ET_FIGHTER, + ET_ITEM, ET_WAYPOINT, - ET_EXTRACTION_POINT, - ET_ITEM + ET_EXTRACTION_POINT }; enum @@ -154,6 +154,7 @@ enum SND_EXPLOSION_2, SND_EXPLOSION_3, SND_EXPLOSION_4, + SND_GET_ITEM, SND_MISSILE, SND_BOOST, SND_GUI_CLICK, @@ -176,7 +177,8 @@ enum TT_DESTROY, TT_DISABLE, TT_WAYPOINT, - TT_ESCAPED + TT_ESCAPED, + TT_ITEM }; enum @@ -184,7 +186,8 @@ enum TRIGGER_TIME, TRIGGER_KILLS, TRIGGER_WAYPOINT, - TRIGGER_ESCAPES + TRIGGER_ESCAPES, + TRIGGER_ITEM }; enum diff --git a/src/galaxy/mission.c b/src/galaxy/mission.c index b1dae65..f8ed906 100644 --- a/src/galaxy/mission.c +++ b/src/galaxy/mission.c @@ -27,6 +27,8 @@ static void loadFighters(cJSON *node); static void loadFighterGroups(cJSON *node); static void loadEntities(cJSON *node); static void loadEntityGroups(cJSON *node); +static void loadItems(cJSON *node); +static void loadItemGroups(cJSON *node); static unsigned long hashcode(const char *str); static char **toFighterTypeArray(char *types, int *numTypes); static void loadEpicData(cJSON *node); @@ -65,6 +67,10 @@ void loadMission(char *filename) loadEntityGroups(cJSON_GetObjectItem(root, "entityGroups")); + loadItems(cJSON_GetObjectItem(root, "items")); + + loadItemGroups(cJSON_GetObjectItem(root, "itemGroups")); + STRNCPY(music, cJSON_GetObjectItem(root, "music")->valuestring, MAX_NAME_LENGTH); if (cJSON_GetObjectItem(root, "epic")) @@ -422,7 +428,87 @@ static void loadEntityGroups(cJSON *node) STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); } - e->id = battle.entId++; + e->x = x; + e->y = y; + + e->x += (rand() % scatter) - (rand() % scatter); + e->y += (rand() % scatter) - (rand() % scatter); + + SDL_QueryTexture(e->texture, NULL, NULL, &e->w, &e->h); + } + + node = node->next; + } + } +} + +static void loadItems(cJSON *node) +{ +} + +static void loadItemGroups(cJSON *node) +{ + Entity *e; + char *name, *groupName, *type; + int i, scatter, number; + long flags; + float x, y; + + flags = -1; + scatter = 1; + + if (node) + { + node = node->child; + + while (node) + { + type = cJSON_GetObjectItem(node, "type")->valuestring; + number = cJSON_GetObjectItem(node, "number")->valueint; + x = cJSON_GetObjectItem(node, "x")->valuedouble * GRID_CELL_WIDTH; + y = cJSON_GetObjectItem(node, "y")->valuedouble * GRID_CELL_HEIGHT; + name = NULL; + groupName = NULL; + + 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, "scatter")) + { + scatter = cJSON_GetObjectItem(node, "scatter")->valueint; + } + + if (cJSON_GetObjectItem(node, "flags")) + { + flags = flagsToLong(cJSON_GetObjectItem(node, "flags")->valuestring); + } + + for (i = 0 ; i < number ; i++) + { + e = spawnItem(type); + + if (name) + { + STRNCPY(e->name, name, MAX_NAME_LENGTH); + } + + if (groupName) + { + STRNCPY(e->groupName, groupName, MAX_NAME_LENGTH); + } + + if (flags != -1) + { + e->flags = flags; + } + e->x = x; e->y = y; diff --git a/src/galaxy/mission.h b/src/galaxy/mission.h index 8b733ba..4807dd7 100644 --- a/src/galaxy/mission.h +++ b/src/galaxy/mission.h @@ -39,6 +39,7 @@ extern Entity *spawnWaypoint(void); extern void activateNextWaypoint(void); extern void selectWidget(const char *name, const char *group); extern Entity *spawnExtractionPoint(void); +extern Entity *spawnItem(char *type); extern void failIncompleteObjectives(void); extern void fleeAllEnemies(void); diff --git a/src/system/lookup.c b/src/system/lookup.c index daa2ac2..985f780 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -47,6 +47,7 @@ void initLookups(void) addLookup("TT_DISABLE", TT_DISABLE); addLookup("TT_WAYPOINT", TT_WAYPOINT); addLookup("TT_ESCAPED", TT_ESCAPED); + addLookup("TT_ITEM", TT_ITEM); addLookup("WT_BUTTON", WT_BUTTON); addLookup("WT_SELECT", WT_SELECT); diff --git a/src/system/sound.c b/src/system/sound.c index 1810001..ebe10a9 100644 --- a/src/system/sound.c +++ b/src/system/sound.c @@ -98,6 +98,7 @@ static void loadSounds(void) sounds[SND_MISSILE] = Mix_LoadWAV("sound/65787__iwilldstroyu__laserrocket.ogg"); sounds[SND_BOOST] = Mix_LoadWAV("sound/18380__inferno__hvrl.ogg"); /*sounds[SND_ECM] = Mix_LoadWAV("sound/18380__inferno__hvrl.ogg");*/ + sounds[SND_GET_ITEM] = Mix_LoadWAV("sound/56246__q-k__latch-04.ogg"); sounds[SND_EXPLOSION_1] = Mix_LoadWAV("sound/162265__qubodup__explosive.ogg"); sounds[SND_EXPLOSION_2] = Mix_LoadWAV("sound/207322__animationisaac__short-explosion.ogg"); sounds[SND_EXPLOSION_3] = Mix_LoadWAV("sound/254071__tb0y298__firework-explosion.ogg");