Added Survive challenge type.

This commit is contained in:
Steve 2016-04-13 11:02:08 +01:00
parent 97d7e542e2
commit 5fa24f55f2
4 changed files with 73 additions and 0 deletions

View File

@ -21,6 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "challenges.h" #include "challenges.h"
static void updateTimeChallenge(Challenge *c); static void updateTimeChallenge(Challenge *c);
static void updateSurvivalChallenge(Challenge *c);
static void updateAccuracyChallenge(Challenge *c); static void updateAccuracyChallenge(Challenge *c);
static void updateArmourChallenge(Challenge *c); static void updateArmourChallenge(Challenge *c);
static void updateLossesChallenge(Challenge *c); static void updateLossesChallenge(Challenge *c);
@ -48,6 +49,7 @@ void initChallenges(void)
challengeDescription[CHALLENGE_ARMOUR] = _("Retain at least %d%% armour"); challengeDescription[CHALLENGE_ARMOUR] = _("Retain at least %d%% armour");
challengeDescription[CHALLENGE_TIME] = _("Complete challenge in %d seconds or less"); challengeDescription[CHALLENGE_TIME] = _("Complete challenge in %d seconds or less");
challengeDescription[CHALLENGE_SURVIVE] = _("Survive for %d seconds");
challengeDescription[CHALLENGE_SHOT_ACCURACY] = _("Attain a %d%% shot hit accuracy"); challengeDescription[CHALLENGE_SHOT_ACCURACY] = _("Attain a %d%% shot hit accuracy");
challengeDescription[CHALLENGE_ROCKET_ACCURACY] = _("Attain a %d%% rocket hit accuracy"); challengeDescription[CHALLENGE_ROCKET_ACCURACY] = _("Attain a %d%% rocket hit accuracy");
challengeDescription[CHALLENGE_MISSILE_ACCURACY] = _("Attain a %d%% missile hit accuracy"); challengeDescription[CHALLENGE_MISSILE_ACCURACY] = _("Attain a %d%% missile hit accuracy");
@ -81,6 +83,60 @@ void initChallenges(void)
free(filenames); free(filenames);
} }
void loadChallenge(Mission *mission, cJSON *node)
{
int i;
Challenge *challenge;
mission->challengeData.isChallenge = 1;
/* limits */
mission->challengeData.timeLimit = getJSONValue(node, "timeLimit", 0) * FPS;
mission->challengeData.killLimit = getJSONValue(node, "killLimit", 0);
mission->challengeData.escapeLimit = getJSONValue(node, "escapeLimit", 0);
mission->challengeData.waypointLimit = getJSONValue(node, "waypointLimit", 0);
mission->challengeData.itemLimit = getJSONValue(node, "itemLimit", 0);
mission->challengeData.rescueLimit = getJSONValue(node, "rescueLimit", 0);
/* restrictions */
mission->challengeData.noMissiles = getJSONValue(node, "noMissiles", 0);
mission->challengeData.noECM = getJSONValue(node, "noECM", 0);
mission->challengeData.noBoost = getJSONValue(node, "noBoost", 0);
mission->challengeData.noGuns = getJSONValue(node, "noGuns", 0);
if (getJSONValue(node, "noWeapons", 0))
{
mission->challengeData.noMissiles = mission->challengeData.noGuns = 1;
}
/* misc */
mission->challengeData.allowPlayerDeath = getJSONValue(node, "allowPlayerDeath", 0);
node = cJSON_GetObjectItem(node, "challenges");
if (node)
{
node = node->child;
i = 0;
while (node && i < MAX_CHALLENGES)
{
challenge = malloc(sizeof(Challenge));
memset(challenge, 0, sizeof(Challenge));
challenge->type = lookup(cJSON_GetObjectItem(node, "type")->valuestring);
challenge->value = cJSON_GetObjectItem(node, "value")->valueint;
mission->challengeData.challenges[i] = challenge;
node = node->next;
i++;
}
}
}
void doChallenges(void) void doChallenges(void)
{ {
int passed; int passed;
@ -172,6 +228,10 @@ static int updateChallenges(void)
updateTimeChallenge(c); updateTimeChallenge(c);
break; break;
case CHALLENGE_SURVIVE:
updateSurvivalChallenge(c);
break;
case CHALLENGE_SHOT_ACCURACY: case CHALLENGE_SHOT_ACCURACY:
case CHALLENGE_ROCKET_ACCURACY: case CHALLENGE_ROCKET_ACCURACY:
case CHALLENGE_MISSILE_ACCURACY: case CHALLENGE_MISSILE_ACCURACY:
@ -245,6 +305,14 @@ static void updateTimeChallenge(Challenge *c)
} }
} }
static void updateSurvivalChallenge(Challenge *c)
{
if (battle.stats[STAT_TIME] / FPS >= c->value)
{
c->passed = 1;
}
}
static void updateAccuracyChallenge(Challenge *c) static void updateAccuracyChallenge(Challenge *c)
{ {
float percent; float percent;

View File

@ -19,6 +19,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#include "../common.h" #include "../common.h"
#include "../json/cJSON.h"
extern Mission *loadMissionMeta(char *filename); extern Mission *loadMissionMeta(char *filename);
extern char **getFileList(char *dir, int *count); extern char **getFileList(char *dir, int *count);
@ -30,6 +31,8 @@ extern char *getLookupName(char *prefix, long num);
extern char *timeToString(long millis, int showHours); extern char *timeToString(long millis, int showHours);
extern void updateAccuracyStats(unsigned int *stats); extern void updateAccuracyStats(unsigned int *stats);
extern char *timeToString(long millis, int showHours); extern char *timeToString(long millis, int showHours);
extern int getJSONValue(cJSON *node, char *name, int defValue);
extern long lookup(char *name);
extern Dev dev; extern Dev dev;
extern Battle battle; extern Battle battle;

View File

@ -309,6 +309,7 @@ enum
CHALLENGE_DISABLE, CHALLENGE_DISABLE,
CHALLENGE_ITEMS, CHALLENGE_ITEMS,
CHALLENGE_RESCUE, CHALLENGE_RESCUE,
CHALLENGE_SURVIVE,
CHALLENGE_MAX CHALLENGE_MAX
}; };

View File

@ -130,6 +130,7 @@ void initLookups(void)
addLookup("CHALLENGE_ARMOUR", CHALLENGE_ARMOUR); addLookup("CHALLENGE_ARMOUR", CHALLENGE_ARMOUR);
addLookup("CHALLENGE_TIME", CHALLENGE_TIME); addLookup("CHALLENGE_TIME", CHALLENGE_TIME);
addLookup("CHALLENGE_SURVIVE", CHALLENGE_SURVIVE);
addLookup("CHALLENGE_SHOT_ACCURACY", CHALLENGE_SHOT_ACCURACY); addLookup("CHALLENGE_SHOT_ACCURACY", CHALLENGE_SHOT_ACCURACY);
addLookup("CHALLENGE_ROCKET_ACCURACY", CHALLENGE_ROCKET_ACCURACY); addLookup("CHALLENGE_ROCKET_ACCURACY", CHALLENGE_ROCKET_ACCURACY);
addLookup("CHALLENGE_MISSILE_ACCURACY", CHALLENGE_MISSILE_ACCURACY); addLookup("CHALLENGE_MISSILE_ACCURACY", CHALLENGE_MISSILE_ACCURACY);