Challenges integration.

This commit is contained in:
Steve 2016-02-27 16:16:21 +00:00
parent ef6e65a51c
commit 2e5b45064a
22 changed files with 395 additions and 124 deletions

View File

@ -1,7 +1,7 @@
VERSION = 0.6 VERSION = 0.6
REVISION = $(shell date +"%y%m%d") REVISION = $(shell date +"%y%m%d")
SEARCHPATH += src/ src/battle src/draw src/game src/galaxy src/json src/system src/test SEARCHPATH += src/ src/battle src/challenges src/draw src/game src/galaxy src/json src/system src/test
vpath %.c $(SEARCHPATH) vpath %.c $(SEARCHPATH)
vpath %.h $(SEARCHPATH) vpath %.h $(SEARCHPATH)
@ -9,7 +9,7 @@ DEPS += defs.h structs.h
OBJS += ai.o OBJS += ai.o
OBJS += battle.o bullets.o OBJS += battle.o bullets.o
OBJS += capitalShips.o challenges.o cJSON.o OBJS += capitalShips.o challengeHome.o challenges.o cJSON.o
OBJS += debris.o dev.o draw.o OBJS += debris.o dev.o draw.o
OBJS += effects.o entities.o extractionPoint.o OBJS += effects.o entities.o extractionPoint.o
OBJS += fighters.o OBJS += fighters.o

View File

@ -23,15 +23,15 @@
"challenges" : [ "challenges" : [
{ {
"type" : "CHALLENGE_TIME", "type" : "CHALLENGE_TIME",
"targetValue" : 10 "value" : 20
}, },
{ {
"type" : "CHALLENGE_TIME", "type" : "CHALLENGE_TIME",
"targetValue" : 15 "value" : 15
}, },
{ {
"type" : "CHALLENGE_TIME", "type" : "CHALLENGE_TIME",
"targetValue" : 20 "value" : 10
} }
], ],
"fighters" : [ "fighters" : [

View File

@ -0,0 +1,12 @@
[
{
"name" : "start",
"group" : "challenges",
"type" : "WT_BUTTON",
"text" : "Start Challenge Mission",
"x" : -1,
"y" : 680,
"w" : 250,
"h": 34
}
]

View File

@ -249,7 +249,7 @@ static void drawMenu(void)
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 0); SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 0);
SDL_RenderFillRect(app.renderer, &r); SDL_RenderFillRect(app.renderer, &r);
SDL_SetRenderDrawColor(app.renderer, 200, 200, 200, 255); SDL_SetRenderDrawColor(app.renderer, 200, 200, 200, SDL_ALPHA_OPAQUE);
SDL_RenderDrawRect(app.renderer, &r); SDL_RenderDrawRect(app.renderer, &r);
drawWidgets("inBattle"); drawWidgets("inBattle");
@ -305,7 +305,14 @@ static void continueGame(void)
destroyBattle(); destroyBattle();
initGalacticMap(); if (!battle.isChallenge)
{
initGalacticMap();
}
else
{
initChallengeHome();
}
} }
static void options(void) static void options(void)
@ -339,7 +346,14 @@ static void quitBattle(void)
destroyBattle(); destroyBattle();
initGalacticMap(); if (!battle.isChallenge)
{
initGalacticMap();
}
else
{
initChallengeHome();
}
} }
static void postBattle(void) static void postBattle(void)
@ -354,11 +368,13 @@ static void postBattle(void)
} }
} }
if (game.currentMission && !game.currentMission->completed) if (!battle.isChallenge)
{ {
game.currentMission->completed = (battle.status == MS_COMPLETE || !battle.numObjectivesTotal); if (game.currentMission && !game.currentMission->completed)
{
game.currentMission->completed = (battle.status == MS_COMPLETE || !battle.numObjectivesTotal);
}
} }
} }
void destroyBattle(void) void destroyBattle(void)

View File

@ -81,6 +81,7 @@ extern void drawLocations(void);
extern void destroyDebris(void); extern void destroyDebris(void);
extern void destroyBullets(void); extern void destroyBullets(void);
extern void destroyEffects(void); extern void destroyEffects(void);
extern void initChallengeHome(void);
extern App app; extern App app;
extern Battle battle; extern Battle battle;

View File

@ -0,0 +1,192 @@
/*
Copyright (C) 2015-2016 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 "challengeHome.h"
static void logic(void);
static void draw(void);
static void handleKeyboard(void);
static void drawChallenges(void);
static void updateChallengeMissions(void);
static void doChallenges(void);
static void startChallengeMission(void);
static SDL_Texture *background;
static int startIndex;
static Widget *start;
void initChallengeHome(void)
{
startSectionTransition();
stopMusic();
updateChallengeMissions();
saveGame();
app.delegate.logic = &logic;
app.delegate.draw = &draw;
memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS);
background = getTexture("gfx/backgrounds/background04.jpg");
battle.camera.x = battle.camera.y = 0;
game.currentMission = NULL;
startIndex = 0;
initBackground();
start = getWidget("start", "challenges");
start->enabled = 0;
start->action = startChallengeMission;
setMouse(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
endSectionTransition();
}
static void updateChallengeMissions(void)
{
Mission *m;
Challenge *c;
for (m = game.challengeMissionHead.next ; m != NULL ; m = m->next)
{
m->totalChallenges = m->completedChallenges = 0;
for (c = m->challengeHead.next ; c != NULL ; c = c->next)
{
m->totalChallenges++;
if (c->passed)
{
m->completedChallenges++;
}
}
}
}
static void logic(void)
{
handleKeyboard();
scrollBackground(-0.25, 0);
doStars(0.5, 0);
doChallenges();
doWidgets();
}
static void doChallenges(void)
{
Mission *c;
for (c = game.challengeMissionHead.next ; c != NULL ; c = c->next)
{
if (app.mouse.button[SDL_BUTTON_LEFT] && collision(app.mouse.x, app.mouse.y, 3, 3, c->rect.x, c->rect.y, c->rect.w, c->rect.h))
{
game.currentMission = c;
start->enabled = 1;
app.mouse.button[SDL_BUTTON_LEFT] = 0;
}
}
}
static void draw(void)
{
drawBackground(background);
drawStars();
drawChallenges();
drawWidgets("challenges");
}
static void drawChallenges(void)
{
Mission *c;
SDL_Rect r;
int i, endIndex;
r.x = 135;
r.y = 165;
r.w = r.h = 96;
endIndex = startIndex + MAX_ITEMS;
i = 0;
for (c = game.challengeMissionHead.next ; c != NULL ; c = c->next)
{
c->rect = r;
if (i >= startIndex && i <= endIndex)
{
SDL_SetRenderDrawColor(app.renderer, 0, 0, 0, 0);
SDL_RenderFillRect(app.renderer, &r);
if (game.currentMission == c)
{
SDL_SetRenderDrawColor(app.renderer, 64, 128, 200, SDL_ALPHA_OPAQUE);
SDL_RenderFillRect(app.renderer, &r);
SDL_SetRenderDrawColor(app.renderer, 128, 192, 255, SDL_ALPHA_OPAQUE);
SDL_RenderDrawRect(app.renderer, &r);
}
else
{
SDL_SetRenderDrawColor(app.renderer, 64, 64, 64, SDL_ALPHA_OPAQUE);
SDL_RenderDrawRect(app.renderer, &r);
}
drawText(r.x + (r.w / 2), r.y + 28, 30, TA_CENTER, colors.white, "%d", i + 1);
drawText(r.x + (r.w / 2), r.y + r.w + 5, 18, TA_CENTER, (c->completedChallenges < c->totalChallenges) ? colors.white : colors.green, "%d / %d", c->completedChallenges, c->totalChallenges);
r.x += 150;
if (r.x > SCREEN_WIDTH - 200)
{
r.y += 165;
r.x = 135;
}
}
i++;
}
}
static void handleKeyboard(void)
{
}
static void startChallengeMission(void)
{
initBattle();
loadMission(game.currentMission->filename);
}

View File

@ -0,0 +1,47 @@
/*
Copyright (C) 2015-2016 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"
#define MAX_ITEMS 21
extern void startSectionTransition(void);
extern void endSectionTransition(void);
extern void stopMusic(void);
extern void initBattle(void);
extern void loadMission(char *filename);
extern void setMouse(int x, int y);
extern void doStars(float dx, float dy);
extern void drawStars(void);
extern void doWidgets(void);
extern SDL_Texture *getTexture(const char *filename);
extern void drawBackground(SDL_Texture *texture);
extern void initBackground(void);
extern void scrollBackground(float x, float y);
extern void drawText(int x, int y, int size, int align, SDL_Color c, const char *format, ...);
extern void drawWidgets(char *groupName);
extern int collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2);
extern Widget *getWidget(const char *name, const char *group);
extern void saveGame(void);
extern App app;
extern Battle battle;
extern Colors colors;
extern Game game;

View File

@ -114,14 +114,14 @@ static void updateTimeChallenge(Challenge *c)
switch (c->type) switch (c->type)
{ {
case CHALLENGE_TIME: case CHALLENGE_TIME:
if (battle.stats[STAT_TIME] / FPS <= c->targetValue) if (battle.stats[STAT_TIME] / FPS < c->value)
{ {
c->passed = 1; c->passed = 1;
} }
break; break;
case CHALLENGE_TIME_MINS: case CHALLENGE_TIME_MINS:
if ((battle.stats[STAT_TIME] / FPS) / 60 <= c->targetValue) if ((battle.stats[STAT_TIME] / FPS) / 60 < c->value)
{ {
c->passed = 1; c->passed = 1;
} }
@ -137,7 +137,7 @@ static void updateAccuracyChallenge(Challenge *c)
percent /= battle.stats[STAT_SHOTS_FIRED]; percent /= battle.stats[STAT_SHOTS_FIRED];
percent *= 100; percent *= 100;
if (percent >= c->targetValue) if (percent >= c->value)
{ {
c->passed = 1; c->passed = 1;
} }
@ -151,7 +151,7 @@ static void updateArmourChallenge(Challenge *c)
percent /= player->maxHealth; percent /= player->maxHealth;
percent *= 100; percent *= 100;
if (percent >= c->targetValue) if (percent >= c->value)
{ {
c->passed = 1; c->passed = 1;
} }
@ -161,7 +161,7 @@ static void updateLossesChallenge(Challenge *c)
{ {
if (!c->passed) if (!c->passed)
{ {
c->passed = battle.stats[STAT_ALLIES_KILLED] <= c->targetValue; c->passed = battle.stats[STAT_ALLIES_KILLED] <= c->value;
} }
} }
@ -169,7 +169,7 @@ static void updatePlayerKillsChallenge(Challenge *c)
{ {
if (!c->passed) if (!c->passed)
{ {
c->passed = battle.stats[STAT_ENEMIES_KILLED_PLAYER] >= c->targetValue; c->passed = battle.stats[STAT_ENEMIES_KILLED_PLAYER] >= c->value;
} }
} }
@ -177,24 +177,24 @@ static void updateDisabledChallenge(Challenge *c)
{ {
if (!c->passed) if (!c->passed)
{ {
c->passed = battle.stats[STAT_ENEMIES_DISABLED] >= c->targetValue; c->passed = battle.stats[STAT_ENEMIES_DISABLED] >= c->value;
} }
} }
char *getChallengeDescription(Challenge *c) char *getChallengeDescription(Challenge *c)
{ {
return getFormattedChallengeDescription(challengeDescription[c->type], c->targetValue); return getFormattedChallengeDescription(challengeDescription[c->type], c->value);
} }
Challenge *getChallenge(Mission *mission, int type) Challenge *getChallenge(Mission *mission, int type, int value)
{ {
Challenge *challenge; Challenge *c;
for (challenge = mission->challengeHead.next ; challenge != NULL ; challenge = challenge->next) for (c = mission->challengeHead.next ; c != NULL ; c = c->next)
{ {
if (challenge->type == type) if (c->type == type && c->value == value)
{ {
return challenge; return c;
} }
} }

View File

@ -48,7 +48,6 @@ static void updatePandoranAdvance(void);
static void fallenOK(void); static void fallenOK(void);
static StarSystem *selectedStarSystem; static StarSystem *selectedStarSystem;
static Mission *selectedMission = {0};
static SDL_Texture *background; static SDL_Texture *background;
static SDL_Texture *starSystemTexture; static SDL_Texture *starSystemTexture;
static SDL_Texture *arrowTexture; static SDL_Texture *arrowTexture;
@ -263,12 +262,12 @@ static void doStarSystemView(void)
{ {
if (mission->available && app.mouse.button[SDL_BUTTON_LEFT] && collision(app.mouse.x - app.mouse.w / 2, app.mouse.y - app.mouse.h / 2, app.mouse.w, app.mouse.h, mission->rect.x, mission->rect.y, mission->rect.w, mission->rect.h)) if (mission->available && app.mouse.button[SDL_BUTTON_LEFT] && collision(app.mouse.x - app.mouse.w / 2, app.mouse.y - app.mouse.h / 2, app.mouse.w, app.mouse.h, mission->rect.x, mission->rect.y, mission->rect.w, mission->rect.h))
{ {
if (selectedMission != mission) if (game.currentMission != mission)
{ {
playSound(SND_GUI_CLICK); playSound(SND_GUI_CLICK);
} }
selectedMission = mission; game.currentMission = mission;
return; return;
} }
} }
@ -500,7 +499,7 @@ static void selectStarSystem(void)
{ {
show = SHOW_STAR_SYSTEM; show = SHOW_STAR_SYSTEM;
STRNCPY(game.selectedStarSystem, selectedStarSystem->name, MAX_NAME_LENGTH); STRNCPY(game.selectedStarSystem, selectedStarSystem->name, MAX_NAME_LENGTH);
selectedMission = selectedStarSystem->missionHead.next; game.currentMission = selectedStarSystem->missionHead.next;
playSound(SND_GUI_SELECT); playSound(SND_GUI_SELECT);
} }
} }
@ -542,7 +541,7 @@ static void drawStarSystemDetail(void)
mission->rect.w = 300; mission->rect.w = 300;
mission->rect.h = 40; mission->rect.h = 40;
if (mission == selectedMission) if (mission == game.currentMission)
{ {
SDL_SetRenderDrawColor(app.renderer, 32, 64, 128, 255); SDL_SetRenderDrawColor(app.renderer, 32, 64, 128, 255);
SDL_RenderFillRect(app.renderer, &mission->rect); SDL_RenderFillRect(app.renderer, &mission->rect);
@ -559,27 +558,27 @@ static void drawStarSystemDetail(void)
y += 50; y += 50;
} }
if (selectedMission->available) if (game.currentMission->available)
{ {
drawText(525, 135, 18, TA_LEFT, colors.lightGrey, "Pilot: %s", selectedMission->pilot); drawText(525, 135, 18, TA_LEFT, colors.lightGrey, "Pilot: %s", game.currentMission->pilot);
drawText(525, 160, 18, TA_LEFT, colors.lightGrey, "Craft: %s", selectedMission->craft); drawText(525, 160, 18, TA_LEFT, colors.lightGrey, "Craft: %s", game.currentMission->craft);
drawText(525, 185, 18, TA_LEFT, colors.lightGrey, "Squadron: %s", selectedMission->squadron); drawText(525, 185, 18, TA_LEFT, colors.lightGrey, "Squadron: %s", game.currentMission->squadron);
limitTextWidth(500); limitTextWidth(500);
drawText(525, 230, 22, TA_LEFT, colors.white, selectedMission->description); drawText(525, 230, 22, TA_LEFT, colors.white, game.currentMission->description);
limitTextWidth(0); limitTextWidth(0);
} }
if (selectedMission->completed) if (game.currentMission->completed)
{ {
drawText(525, SCREEN_HEIGHT - 95, 18, TA_LEFT, colors.green, "This mission has been completed."); drawText(525, SCREEN_HEIGHT - 95, 18, TA_LEFT, colors.green, "This mission has been completed.");
} }
else if (selectedMission->epic) else if (game.currentMission->epic)
{ {
drawText(525, SCREEN_HEIGHT - 95, 18, TA_LEFT, colors.yellow, "Note: this is an Epic Mission."); drawText(525, SCREEN_HEIGHT - 95, 18, TA_LEFT, colors.yellow, "Note: this is an Epic Mission.");
} }
startMissionButton->enabled = (!selectedMission->completed || selectedStarSystem->isSol); startMissionButton->enabled = (!game.currentMission->completed || selectedStarSystem->isSol);
drawWidgets("starSystem"); drawWidgets("starSystem");
} }
@ -646,8 +645,8 @@ static void handleMouse(void)
static void startMission(void) static void startMission(void)
{ {
initBattle(); initBattle();
game.currentMission = selectedMission;
loadMission(selectedMission->filename); loadMission(game.currentMission->filename);
} }
static void drawMenu(void) static void drawMenu(void)

View File

@ -84,7 +84,7 @@ Mission *loadMissionMeta(char *filename)
memset(challenge, 0, sizeof(Challenge)); memset(challenge, 0, sizeof(Challenge));
challenge->type = lookup(cJSON_GetObjectItem(node, "type")->valuestring); challenge->type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
challenge->targetValue = cJSON_GetObjectItem(node, "targetValue")->valueint; challenge->value = cJSON_GetObjectItem(node, "value")->valueint;
challengeTail->next = challenge; challengeTail->next = challenge;
challengeTail = challenge; challengeTail = challenge;
@ -817,6 +817,7 @@ Mission *getMission(char *filename)
StarSystem *starSystem; StarSystem *starSystem;
Mission *mission; Mission *mission;
/* First, search the star systems */
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next) for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
{ {
for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next) for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next)
@ -828,6 +829,17 @@ Mission *getMission(char *filename)
} }
} }
/* now search the challenges */
for (mission = game.challengeMissionHead.next ; mission != NULL ; mission = mission->next)
{
if (strcmp(mission->filename, filename) == 0)
{
return mission;
}
}
SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_WARN, "No such mission '%s'", filename);
return NULL; return NULL;
} }

View File

@ -68,7 +68,6 @@ static StarSystem *loadStarSystem(cJSON *starSystemJSON)
} }
starSystem->missionHead.completed = 1; starSystem->missionHead.completed = 1;
starSystem->missionTail = &starSystem->missionHead;
loadMissions(starSystem); loadMissions(starSystem);
@ -84,6 +83,9 @@ static void loadMissions(StarSystem *starSystem)
char name[MAX_NAME_LENGTH]; char name[MAX_NAME_LENGTH];
char path[MAX_FILENAME_LENGTH]; char path[MAX_FILENAME_LENGTH];
char **filenames; char **filenames;
Mission *mission, *tail;
tail = &starSystem->missionHead;
STRNCPY(name, starSystem->name, MAX_NAME_LENGTH); STRNCPY(name, starSystem->name, MAX_NAME_LENGTH);
@ -100,7 +102,9 @@ static void loadMissions(StarSystem *starSystem)
{ {
sprintf(path, "data/missions/%s/%s", name, filenames[i]); sprintf(path, "data/missions/%s/%s", name, filenames[i]);
loadMissionMeta(path); mission = loadMissionMeta(path);
tail->next = mission;
tail = mission;
free(filenames[i]); free(filenames[i]);
} }

View File

@ -27,30 +27,6 @@ void initGame(void)
STRNCPY(game.selectedStarSystem, "Sol", MAX_NAME_LENGTH); STRNCPY(game.selectedStarSystem, "Sol", MAX_NAME_LENGTH);
} }
void resetGame(void)
{
StarSystem *starSystem;
Mission *mission;
Challenge *challenge;
memset(&game.stats, 0, sizeof(int) * STAT_MAX);
for (starSystem = game.starSystemHead.next ; starSystem != NULL ; starSystem = starSystem->next)
{
for (mission = starSystem->missionHead.next ; mission != NULL ; mission = mission->next)
{
mission->completed = 0;
for (challenge = mission->challengeHead.next ; challenge != NULL ; challenge = challenge->next)
{
challenge->passed = 0;
}
}
}
STRNCPY(game.selectedStarSystem, "Sol", MAX_NAME_LENGTH);
}
void destroyGame(void) void destroyGame(void)
{ {
} }

View File

@ -81,7 +81,7 @@ void initTitle(void)
endSectionTransition(); endSectionTransition();
SDL_WarpMouseInWindow(app.window, SCREEN_WIDTH / 2, SCREEN_HEIGHT - 100); setMouse(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
playMusic("music/Rise of spirit.ogg"); playMusic("music/Rise of spirit.ogg");
} }
@ -199,20 +199,12 @@ static void handleKeyboard(void)
static void campaign(void) static void campaign(void)
{ {
if (fileExists(getSaveFilePath("game.save")))
{
loadGame();
}
else
{
resetGame();
}
initGalacticMap(); initGalacticMap();
} }
static void challenges(void) static void challenges(void)
{ {
initChallengeHome();
} }
static void options(void) static void options(void)

View File

@ -40,20 +40,17 @@ extern void drawWidgets(char *groupName);
extern void doWidgets(void); extern void doWidgets(void);
extern Widget *getWidget(const char *name, const char *group); extern Widget *getWidget(const char *name, const char *group);
extern void selectWidget(const char *name, const char *group); extern void selectWidget(const char *name, const char *group);
extern void loadGame(void);
extern int fileExists(char *filename);
extern void resetGame(void);
extern void initGalacticMap(void); extern void initGalacticMap(void);
extern void initOptions(void (*returnFromOptions)(void)); extern void initOptions(void (*returnFromOptions)(void));
extern void drawOptions(void); extern void drawOptions(void);
extern char *getSaveFilePath(char *filename);
extern void playMusic(char *filename); extern void playMusic(char *filename);
extern void destroyBattle(void); extern void destroyBattle(void);
extern void playSound(int id); extern void playSound(int id);
extern void initEffects(void); extern void initEffects(void);
extern void setMouse(int x, int y);
extern void initChallengeHome(void);
extern App app; extern App app;
extern Battle battle; extern Battle battle;
extern Colors colors; extern Colors colors;
extern Game game;
extern Entity *self; extern Entity *self;

View File

@ -177,6 +177,11 @@ static void handleArguments(int argc, char *argv[])
if (!testingMission) if (!testingMission)
{ {
if (fileExists(getSaveFilePath("game.save")))
{
loadGame();
}
initTitle(); initTitle();
} }
} }

View File

@ -41,6 +41,9 @@ extern void prepareScene(void);
extern void presentScene(void); extern void presentScene(void);
extern void doModalDialog(void); extern void doModalDialog(void);
extern void drawModalDialog(void); extern void drawModalDialog(void);
extern void loadGame(void);
extern int fileExists(char *filename);
extern char *getSaveFilePath(char *filename);
App app; App app;
Colors colors; Colors colors;

View File

@ -235,7 +235,7 @@ struct Objective {
struct Challenge { struct Challenge {
int type; int type;
int targetValue; int value;
int passed; int passed;
Challenge *next; Challenge *next;
}; };
@ -251,6 +251,8 @@ struct Mission {
int available; int available;
int completed; int completed;
int epic; int epic;
int completedChallenges;
int totalChallenges;
SDL_Rect rect; SDL_Rect rect;
Challenge challengeHead; Challenge challengeHead;
Mission *next; Mission *next;
@ -267,7 +269,7 @@ struct StarSystem {
int availableMissions; int availableMissions;
int fallsToPandorans; int fallsToPandorans;
int isSol; int isSol;
Mission missionHead, *missionTail; Mission missionHead;
StarSystem *next; StarSystem *next;
}; };

View File

@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
static void loadStats(cJSON *stats); static void loadStats(cJSON *stats);
static void loadStarSystems(cJSON *starSystemsJSON); static void loadStarSystems(cJSON *starSystemsJSON);
static void loadMissions(cJSON *missionsCJSON); static void loadMissions(cJSON *missionsCJSON);
static void loadChallenges(Mission *mission, cJSON *challengesCJSON); static void loadChallenges(cJSON *challengesCJSON);
void loadGame(void) void loadGame(void)
{ {
@ -39,6 +39,8 @@ void loadGame(void)
loadStarSystems(cJSON_GetObjectItem(gameJSON, "starSystems")); loadStarSystems(cJSON_GetObjectItem(gameJSON, "starSystems"));
loadChallenges(cJSON_GetObjectItem(gameJSON, "challenges"));
loadStats(cJSON_GetObjectItem(gameJSON, "stats")); loadStats(cJSON_GetObjectItem(gameJSON, "stats"));
cJSON_Delete(root); cJSON_Delete(root);
@ -60,40 +62,41 @@ static void loadStarSystems(cJSON *starSystemsJSON)
} }
} }
static void loadMissions(cJSON *missionsCJSON) static void loadMissions(cJSON *missionsJSON)
{ {
Mission *mission; Mission *mission;
cJSON *missionCJSON; cJSON *missionJSON;
for (missionCJSON = missionsCJSON->child ; missionCJSON != NULL ; missionCJSON = missionCJSON->next) for (missionJSON = missionsJSON->child ; missionJSON != NULL ; missionJSON = missionJSON->next)
{ {
mission = getMission(cJSON_GetObjectItem(missionCJSON, "filename")->valuestring); mission = getMission(cJSON_GetObjectItem(missionJSON, "filename")->valuestring);
mission->completed = cJSON_GetObjectItem(missionJSON, "completed")->valueint;
mission->completed = cJSON_GetObjectItem(missionCJSON, "completed")->valueint;
if (cJSON_GetObjectItem(missionCJSON, "challenges"))
{
loadChallenges(mission, cJSON_GetObjectItem(missionCJSON, "challenges"));
}
} }
} }
static void loadChallenges(Mission *mission, cJSON *challengesCJSON) static void loadChallenges(cJSON *missionsJSON)
{ {
Mission *mission;
Challenge *challenge; Challenge *challenge;
cJSON *challengeCJSON; cJSON *missionJSON, *challengeJSON;
int type, value;
for (challengeCJSON = challengesCJSON->child ; challengeCJSON != NULL ; challengeCJSON = challengeCJSON->next) if (missionsJSON)
{ {
challenge = getChallenge(mission, lookup(cJSON_GetObjectItem(challengeCJSON, "type")->valuestring)); for (missionJSON = missionsJSON->child ; missionJSON != NULL ; missionJSON = missionJSON->next)
if (!challenge)
{ {
printf("Couldn't find challenge to update\n"); mission = getMission(cJSON_GetObjectItem(missionJSON, "filename")->valuestring);
continue;
for (challengeJSON = cJSON_GetObjectItem(missionJSON, "challenges")->child ; challengeJSON != NULL ; challengeJSON = challengeJSON->next)
{
type = lookup(cJSON_GetObjectItem(challengeJSON, "type")->valuestring);
value = cJSON_GetObjectItem(challengeJSON, "value")->valueint;
challenge = getChallenge(mission, type, value);
challenge->passed = cJSON_GetObjectItem(challengeJSON, "passed")->valueint;
}
} }
challenge->passed = cJSON_GetObjectItem(challengeCJSON, "passed")->valueint;
} }
} }

View File

@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
extern char *readFile(char *filename); extern char *readFile(char *filename);
extern Mission *getMission(char *filename); extern Mission *getMission(char *filename);
extern Challenge *getChallenge(Mission *mission, int type); extern Challenge *getChallenge(Mission *mission, int type, int value);
extern int lookup(char *lookup); extern int lookup(char *lookup);
extern char *getSaveFilePath(char *filename); extern char *getSaveFilePath(char *filename);
extern char *getLookupName(char *prefix, long num); extern char *getLookupName(char *prefix, long num);

View File

@ -21,8 +21,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "save.h" #include "save.h"
static void saveStarSystems(cJSON *gameJSON); static void saveStarSystems(cJSON *gameJSON);
static void saveChallenges(cJSON *gameJSON);
static cJSON *getMissionsJSON(StarSystem *starSystem); static cJSON *getMissionsJSON(StarSystem *starSystem);
static cJSON *getChallengesJSON(Mission *mission);
static void saveStats(cJSON *gameJSON); static void saveStats(cJSON *gameJSON);
void saveGame(void) void saveGame(void)
@ -39,6 +39,8 @@ void saveGame(void)
cJSON_AddStringToObject(gameJSON, "selectedStarSystem", game.selectedStarSystem); cJSON_AddStringToObject(gameJSON, "selectedStarSystem", game.selectedStarSystem);
saveStarSystems(gameJSON); saveStarSystems(gameJSON);
saveChallenges(gameJSON);
saveStats(gameJSON); saveStats(gameJSON);
@ -85,36 +87,44 @@ static cJSON *getMissionsJSON(StarSystem *starSystem)
cJSON_AddStringToObject(missionJSON, "filename", mission->filename); cJSON_AddStringToObject(missionJSON, "filename", mission->filename);
cJSON_AddNumberToObject(missionJSON, "completed", mission->completed); cJSON_AddNumberToObject(missionJSON, "completed", mission->completed);
if (mission->challengeHead.next)
{
cJSON_AddItemToObject(missionJSON, "challenges", getChallengesJSON(mission));
}
cJSON_AddItemToArray(missionsJSON, missionJSON); cJSON_AddItemToArray(missionsJSON, missionJSON);
} }
return missionsJSON; return missionsJSON;
} }
static cJSON *getChallengesJSON(Mission *mission) static void saveChallenges(cJSON *gameJSON)
{ {
cJSON *challengesJSON, *challengeJSON; Mission *mission;
Challenge *challenge; Challenge *c;
cJSON *missionsJSON, *missionJSON, *challengesJSON, *challengeJSON;
challengesJSON = cJSON_CreateArray(); missionsJSON = cJSON_CreateArray();
for (challenge = mission->challengeHead.next ; challenge != NULL ; challenge = challenge->next) for (mission = game.challengeMissionHead.next ; mission != NULL ; mission = mission->next)
{ {
challengeJSON = cJSON_CreateObject(); missionJSON = cJSON_CreateObject();
cJSON_AddStringToObject(challengeJSON, "type", getLookupName("CHALLENGE_", challenge->type)); cJSON_AddStringToObject(missionJSON, "filename", mission->filename);
cJSON_AddNumberToObject(challengeJSON, "targetValue", challenge->targetValue);
cJSON_AddNumberToObject(challengeJSON, "passed", challenge->passed);
cJSON_AddItemToArray(challengesJSON, challengeJSON); challengesJSON = cJSON_CreateArray();
for (c = mission->challengeHead.next ; c != NULL ; c = c->next)
{
challengeJSON = cJSON_CreateObject();
cJSON_AddStringToObject(challengeJSON, "type", getLookupName("CHALLENGE_", c->type));
cJSON_AddNumberToObject(challengeJSON, "value", c->value);
cJSON_AddNumberToObject(challengeJSON, "passed", c->passed);
cJSON_AddItemToArray(challengesJSON, challengeJSON);
}
cJSON_AddItemToObject(missionJSON, "challenges", challengesJSON);
cJSON_AddItemToArray(missionsJSON, missionJSON);
} }
return challengesJSON; cJSON_AddItemToObject(gameJSON, "challenges", missionsJSON);
} }
static void saveStats(cJSON *gameJSON) static void saveStats(cJSON *gameJSON)

View File

@ -63,7 +63,7 @@ static void loadChallenges(char *filename)
memset(challenge, 0, sizeof(Challenge)); memset(challenge, 0, sizeof(Challenge));
challenge->type = lookup(cJSON_GetObjectItem(node, "type")->valuestring); challenge->type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
challenge->targetValue = cJSON_GetObjectItem(node, "targetValue")->valueint; challenge->value = cJSON_GetObjectItem(node, "value")->valueint;
challengeTail->next = challenge; challengeTail->next = challenge;
challengeTail = challenge; challengeTail = challenge;