diff --git a/data/achievements.xml b/data/achievements.xml index 1cfd510fa..12ecbf378 100644 --- a/data/achievements.xml +++ b/data/achievements.xml @@ -25,5 +25,12 @@ title="Marathoner" description="Make a race with 5 laps or more"> + + + + + + diff --git a/src/achievements/achievement_info.hpp b/src/achievements/achievement_info.hpp index 6b8bab458..41dce20da 100644 --- a/src/achievements/achievement_info.hpp +++ b/src/achievements/achievement_info.hpp @@ -42,12 +42,13 @@ class AchievementInfo { public: /** Some handy names for the various achievements. */ - enum { ACHIEVE_COLUMBUS = 1, - ACHIEVE_FIRST = ACHIEVE_COLUMBUS, - ACHIEVE_STRIKE = 2, - ACHIEVE_ARCH_ENEMY = 3, - ACHIEVE_MARATHONER = 4, - ACHIEVE_LAST = ACHIEVE_MARATHONER + enum { ACHIEVE_COLUMBUS = 1, + ACHIEVE_FIRST = ACHIEVE_COLUMBUS, + ACHIEVE_STRIKE = 2, + ACHIEVE_ARCH_ENEMY = 3, + ACHIEVE_MARATHONER = 4, + ACHIEVE_GOLD_DRIVER = 5, + ACHIEVE_LAST = ACHIEVE_GOLD_DRIVER }; /** Achievement check type: * ALL_AT_LEAST: All goal values must be reached (or exceeded). diff --git a/src/karts/controller/skidding_ai.cpp b/src/karts/controller/skidding_ai.cpp index 9eeb44211..b905ab2bd 100644 --- a/src/karts/controller/skidding_ai.cpp +++ b/src/karts/controller/skidding_ai.cpp @@ -1247,7 +1247,7 @@ void SkiddingAI::handleItems(const float dt) // Leave some time between shots if(m_time_since_last_shot<3.0f) break; // Do not fire if the kart is driving too slow - if (m_kart->getSpeed() < 0.5 * m_kart->getCurrentMaxSpeed()) break; + if (m_kart->getSpeed() < 0.5 * m_kart->getCurrentMaxSpeed()) break; // Since cakes can be fired all around, just use a sane distance // with a bit of extra for backwards, as enemy will go towards cake diff --git a/src/modes/world.cpp b/src/modes/world.cpp index e90b89dbb..85789af83 100644 --- a/src/modes/world.cpp +++ b/src/modes/world.cpp @@ -445,6 +445,7 @@ void World::terminateRace() &best_player); } + // Check achievements PlayerManager::increaseAchievement(AchievementInfo::ACHIEVE_COLUMBUS, getTrack()->getIdent(), 1); if (raceHasLaps()) @@ -452,6 +453,39 @@ void World::terminateRace() PlayerManager::increaseAchievement(AchievementInfo::ACHIEVE_MARATHONER, "laps", race_manager->getNumLaps()); } + + Achievement *achiev = PlayerManager::getCurrentAchievementsStatus()->getAchievement(AchievementInfo::ACHIEVE_GOLD_DRIVER); + if (achiev) + { + std::string modeName = getIdent(); // Get the race mode name + int winnerPosition = 1; + int opponents = achiev->getInfo()->getGoalValue("opponents"); // Get the required opponents number + if (modeName == IDENT_FTL) + { + winnerPosition = 2; + opponents++; + } + for(unsigned int i = 0; i < kart_amount ; i++) + { + // Retrieve the current player + StateManager::ActivePlayer* p = m_karts[i]->getController()->getPlayer(); + if (p && p->getConstProfile() == PlayerManager::get()->getCurrentPlayer()) + { + // Check if the player has won + if (m_karts[i]->getPosition() == winnerPosition && kart_amount > opponents ) + { + // Update the achievement + std::transform(modeName.begin(), modeName.end(), modeName.begin(), std::tolower); + if (achiev->getValue("opponents") <= 0) + PlayerManager::increaseAchievement(AchievementInfo::ACHIEVE_GOLD_DRIVER, + "opponents", opponents); + PlayerManager::increaseAchievement(AchievementInfo::ACHIEVE_GOLD_DRIVER, + modeName, 1); + } + } + } // for i < kart_amount + } // if (achiev) + PlayerManager::get()->getCurrentPlayer()->raceFinished(); if (m_race_gui) m_race_gui->clearAllMessages(); diff --git a/src/modes/world.hpp b/src/modes/world.hpp index d8fe1c6a6..808f39ebf 100644 --- a/src/modes/world.hpp +++ b/src/modes/world.hpp @@ -25,6 +25,7 @@ * battle, etc.) */ +#include #include #include "modes/world_status.hpp"