Show and apply challenge restrictions.

This commit is contained in:
Steve 2016-03-02 22:19:26 +00:00
parent f9880354db
commit 2c71b16e17
5 changed files with 82 additions and 19 deletions

View File

@ -15,7 +15,6 @@
"challenge" : { "challenge" : {
"timeLimit" : 120, "timeLimit" : 120,
"killLimit" : 5, "killLimit" : 5,
"noMissiles" : 1,
"challenges" : [ "challenges" : [
{ {
"type" : "CHALLENGE_TIME", "type" : "CHALLENGE_TIME",

View File

@ -33,6 +33,7 @@ static void handleKeyboard(void);
static void faceMouse(void); static void faceMouse(void);
static void handleMouse(void); static void handleMouse(void);
static void preFireMissile(void); static void preFireMissile(void);
static void applyRestrictions(void);
static int selectedPlayerIndex; static int selectedPlayerIndex;
static int availableGuns[BT_MAX]; static int availableGuns[BT_MAX];
@ -96,6 +97,11 @@ void doPlayer(void)
{ {
self = player; self = player;
if (game.currentMission->challengeData.isChallenge)
{
applyRestrictions();
}
if (player->alive == ALIVE_ALIVE) if (player->alive == ALIVE_ALIVE)
{ {
handleKeyboard(); handleKeyboard();
@ -139,6 +145,29 @@ void doPlayer(void)
} }
} }
static void applyRestrictions(void)
{
if (game.currentMission->challengeData.noMissiles)
{
player->missiles = 0;
}
if (game.currentMission->challengeData.noBoost)
{
battle.boostTimer = 0;
}
if (game.currentMission->challengeData.noECM)
{
battle.ecmTimer = 0;
}
if (game.currentMission->challengeData.noGuns)
{
player->reload = 1;
}
}
static void handleKeyboard(void) static void handleKeyboard(void)
{ {
if (battle.status == MS_IN_PROGRESS) if (battle.status == MS_IN_PROGRESS)
@ -235,7 +264,7 @@ static void handleMouse(void)
if (app.mouse.button[SDL_BUTTON_RIGHT]) if (app.mouse.button[SDL_BUTTON_RIGHT])
{ {
if (battle.boostTimer > BOOST_FINISHED_TIME) if (battle.boostTimer > BOOST_FINISHED_TIME || game.currentMission->challengeData.noBoost)
{ {
applyFighterThrust(); applyFighterThrust();
} }

View File

@ -45,10 +45,10 @@ static SDL_Texture *planetTexture;
static PointF planet; static PointF planet;
static int totalChallenges; static int totalChallenges;
static int show; static int show;
static char challenge[3][MAX_DESCRIPTION_LENGTH]; static Challenge *challenge[3];
static int passed[3];
static char timeLimit[MAX_DESCRIPTION_LENGTH]; static char timeLimit[MAX_DESCRIPTION_LENGTH];
static char restrictions[MAX_DESCRIPTION_LENGTH]; static char restrictions[MAX_DESCRIPTION_LENGTH];
static int hasRestrictions;
void initChallengeHome(void) void initChallengeHome(void)
{ {
@ -109,6 +109,8 @@ static void unlockChallenges(void)
{ {
m->available = i <= completedChallenges; m->available = i <= completedChallenges;
m->available = 1;
completedChallenges += m->completedChallenges; completedChallenges += m->completedChallenges;
totalChallenges += m->totalChallenges; totalChallenges += m->totalChallenges;
@ -180,28 +182,45 @@ static void updateChallengeMissionData(void)
STRNCPY(timeLimit, timeToString(game.currentMission->challengeData.timeLimit, 0), MAX_DESCRIPTION_LENGTH); STRNCPY(timeLimit, timeToString(game.currentMission->challengeData.timeLimit, 0), MAX_DESCRIPTION_LENGTH);
sprintf(restrictions, "%s", listRestrictions()); sprintf(restrictions, "%s", listRestrictions());
i = 0; memset(challenge, 0, sizeof(Challenge*) * 3);
for (i = 0 ; i < 3 ; i++)
{
strcpy(challenge[i], "");
passed[i] = 0;
}
i = 0; i = 0;
for (c = game.currentMission->challengeData.challengeHead.next ; c != NULL ; c = c->next) for (c = game.currentMission->challengeData.challengeHead.next ; c != NULL ; c = c->next)
{ {
STRNCPY(challenge[i], getChallengeDescription(c), MAX_DESCRIPTION_LENGTH); challenge[i++] = c;
passed[i] = c->passed; }
}
i++; static void addRestriction(char *buffer, int restricted, char *description)
{
if (restricted)
{
if (strlen(buffer) > 0)
{
strcat(buffer, ". ");
}
strcat(buffer, description);
hasRestrictions = 1;
} }
} }
static char *listRestrictions(void) static char *listRestrictions(void)
{ {
return _("None"); static char textBuffer[MAX_DESCRIPTION_LENGTH];
memset(textBuffer, '\0', MAX_DESCRIPTION_LENGTH);
hasRestrictions = 0;
addRestriction(textBuffer, game.currentMission->challengeData.noMissiles, _("No Missiles"));
addRestriction(textBuffer, game.currentMission->challengeData.noECM, _("No ECM"));
addRestriction(textBuffer, game.currentMission->challengeData.noBoost, _("No Boost"));
addRestriction(textBuffer, game.currentMission->challengeData.noGuns, _("No Guns"));
return strlen(textBuffer) > 0 ? textBuffer : "-";
} }
static void draw(void) static void draw(void)
@ -316,15 +335,23 @@ static void drawChallenges(void)
r.y -= 50; r.y -= 50;
drawText((SCREEN_WIDTH / 2) - 25, SCREEN_HEIGHT - r.y, 18, TA_RIGHT, colors.white, _("Craft: %s"), game.currentMission->craft); drawText((SCREEN_WIDTH / 2) - 25, SCREEN_HEIGHT - r.y, 18, TA_RIGHT, colors.white, _("Craft: %s"), game.currentMission->craft);
drawText((SCREEN_WIDTH / 2) + 25, SCREEN_HEIGHT - r.y, 18, TA_LEFT, (passed[0]) ? colors.green : colors.white, challenge[0]); drawText((SCREEN_WIDTH / 2) + 25, SCREEN_HEIGHT - r.y, 18, TA_LEFT, (challenge[0]->passed) ? colors.green : colors.white, "1. %s", getChallengeDescription(challenge[0]));
r.y -= 30; r.y -= 30;
drawText((SCREEN_WIDTH / 2) - 25, SCREEN_HEIGHT - r.y, 18, TA_RIGHT, colors.white, _("Time Limit: %s"), timeLimit); drawText((SCREEN_WIDTH / 2) - 25, SCREEN_HEIGHT - r.y, 18, TA_RIGHT, colors.white, _("Time Limit: %s"), timeLimit);
drawText((SCREEN_WIDTH / 2) + 25, SCREEN_HEIGHT - r.y, 18, TA_LEFT, (passed[0]) ? colors.green : colors.white, challenge[1]);
if (challenge[1])
{
drawText((SCREEN_WIDTH / 2) + 25, SCREEN_HEIGHT - r.y, 18, TA_LEFT, (challenge[1]->passed) ? colors.green : colors.white, "2. %s", getChallengeDescription(challenge[1]));
}
r.y -= 30; r.y -= 30;
drawText((SCREEN_WIDTH / 2) - 25, SCREEN_HEIGHT - r.y, 18, TA_RIGHT, colors.white, _("Restrictions: %s"), restrictions); drawText((SCREEN_WIDTH / 2) - 25, SCREEN_HEIGHT - r.y, 18, TA_RIGHT, hasRestrictions ? colors.red : colors.white, _("Restrictions: %s"), restrictions);
drawText((SCREEN_WIDTH / 2) + 25, SCREEN_HEIGHT - r.y, 18, TA_LEFT, (passed[0]) ? colors.green : colors.white, challenge[2]);
if (challenge[2])
{
drawText((SCREEN_WIDTH / 2) + 25, SCREEN_HEIGHT - r.y, 18, TA_LEFT, (challenge[2]->passed) ? colors.green : colors.white, "3. %s", getChallengeDescription(challenge[2]));
}
} }
} }

View File

@ -81,6 +81,10 @@ Mission *loadMissionMeta(char *filename)
mission->challengeData.isChallenge = 1; mission->challengeData.isChallenge = 1;
mission->challengeData.timeLimit = cJSON_GetObjectItem(node, "timeLimit")->valueint * FPS; mission->challengeData.timeLimit = cJSON_GetObjectItem(node, "timeLimit")->valueint * FPS;
mission->challengeData.killLimit = cJSON_GetObjectItem(node, "killLimit")->valueint; mission->challengeData.killLimit = cJSON_GetObjectItem(node, "killLimit")->valueint;
mission->challengeData.noMissiles = cJSON_GetObjectItem(node, "noMissiles") ? 1 : 0;
mission->challengeData.noECM = cJSON_GetObjectItem(node, "noECM") ? 1 : 0;
mission->challengeData.noBoost = cJSON_GetObjectItem(node, "noBoost") ? 1 : 0;
mission->challengeData.noGuns = cJSON_GetObjectItem(node, "noGuns") ? 1 : 0;
node = cJSON_GetObjectItem(node, "challenges"); node = cJSON_GetObjectItem(node, "challenges");

View File

@ -246,6 +246,10 @@ typedef struct {
int killLimit; int killLimit;
int lossLimit; int lossLimit;
int itemLimit; int itemLimit;
int noMissiles;
int noBoost;
int noECM;
int noGuns;
Challenge challengeHead; Challenge challengeHead;
} ChallengeData; } ChallengeData;