diff --git a/src/battle/hud.c b/src/battle/hud.c index e781e9e..f8df36c 100644 --- a/src/battle/hud.c +++ b/src/battle/hud.c @@ -476,6 +476,10 @@ static void drawObjectives(void) { drawText(SCREEN_WIDTH / 2, 35, 14, TA_CENTER, colors.white, "%d / %d", battle.stats[STAT_ENEMIES_SURRENDERED], game.currentMission->challengeData.surrenderLimit); } + else if (game.currentMission->challengeData.waypointLimit) + { + drawText(SCREEN_WIDTH / 2, 35, 14, TA_CENTER, colors.white, "%d / %d", battle.stats[STAT_WAYPOINTS_VISITED], game.currentMission->challengeData.waypointLimit); + } else if (player->flags & EF_MUST_DISABLE) { drawText(SCREEN_WIDTH / 2, 35, 14, TA_CENTER, colors.white, _("System Power : %d%%"), player->systemPower); diff --git a/src/challenges/challenges.c b/src/challenges/challenges.c index f87f08c..738ea0f 100644 --- a/src/challenges/challenges.c +++ b/src/challenges/challenges.c @@ -29,6 +29,7 @@ static void updatePlayerKillsChallenge(Challenge *c); static void updateDisabledChallenge(Challenge *c); static void updateItemsChallenge(Challenge *c); static void updateSurrenderChallenge(Challenge *c); +static void updateWaypointChallenge(Challenge *c); static void completeChallenge(void); static void failChallenge(void); static int updateChallenges(void); @@ -63,6 +64,7 @@ void initChallenges(void) challengeDescription[CHALLENGE_PLAYER_ITEMS] = _("Collect %d packages"); challengeDescription[CHALLENGE_RESCUE] = _("Rescue %d civilians"); challengeDescription[CHALLENGE_SURRENDER] = _("Cause %d enemies to surrender"); + challengeDescription[CHALLENGE_WAYPOINTS] = _("Reach %d waypoints"); tail = &game.challengeMissionHead; @@ -216,6 +218,11 @@ static int challengeFinished(void) return 1; } + if (game.currentMission->challengeData.waypointLimit > 0 && (battle.stats[STAT_WAYPOINTS_VISITED]) >= game.currentMission->challengeData.waypointLimit) + { + return 1; + } + if (game.currentMission->challengeData.eliminateThreats && !battle.hasThreats) { return 1; @@ -283,6 +290,10 @@ static int updateChallenges(void) case CHALLENGE_SURRENDER: updateSurrenderChallenge(c); break; + + case CHALLENGE_WAYPOINTS: + updateWaypointChallenge(c); + break; } } @@ -427,6 +438,14 @@ static void updateSurrenderChallenge(Challenge *c) } } +static void updateWaypointChallenge(Challenge *c) +{ + if (!c->passed) + { + c->passed = battle.stats[STAT_WAYPOINTS_VISITED] >= c->value; + } +} + char *getChallengeDescription(Challenge *c) { if (c->type == CHALLENGE_TIME) diff --git a/src/defs.h b/src/defs.h index 6d056cc..6d5aecb 100644 --- a/src/defs.h +++ b/src/defs.h @@ -338,6 +338,7 @@ enum CHALLENGE_RESCUE, CHALLENGE_SURVIVE, CHALLENGE_SURRENDER, + CHALLENGE_WAYPOINTS, CHALLENGE_MAX }; diff --git a/src/system/lookup.c b/src/system/lookup.c index dd914e7..be0c139 100644 --- a/src/system/lookup.c +++ b/src/system/lookup.c @@ -158,6 +158,7 @@ void initLookups(void) addLookup("CHALLENGE_PLAYER_ITEMS", CHALLENGE_PLAYER_ITEMS); addLookup("CHALLENGE_RESCUE", CHALLENGE_RESCUE); addLookup("CHALLENGE_SURRENDER", CHALLENGE_SURRENDER); + addLookup("CHALLENGE_WAYPOINTS", CHALLENGE_WAYPOINTS); addLookup("STAT_PERCENT_COMPLETE", STAT_PERCENT_COMPLETE); addLookup("STAT_MISSIONS_STARTED", STAT_MISSIONS_STARTED);