Even more achievements stuff. Unlock manager is a mess!

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/branches/uni@13630 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
unitraxx 2013-09-04 19:44:10 +00:00
parent 178fc8613d
commit 03be63ea5b
11 changed files with 64 additions and 16 deletions

View File

@ -1,8 +1,16 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<achievements> <achievements>
<achievement id="1" type="map" title="Christoffel Columbus" description="Play every official track at least once." > <achievement id="1" type="map" title="Christoffel Columbus" description="Play every official track at least once." >
<entry key="mapid1" goal="1"/> <entry key="farm" goal="1"/>
<entry key="mapid2" goal="1"/> <entry key="scotland" goal="1"/>
<entry key="lighthouse" goal="1"/>
<entry key="sandtrack" goal="1"/>
<entry key="olivermath" goal="1"/>
<entry key="subsea" goal="1"/>
<entry key="mansion" goal="1"/>
<entry key="minigolf" goal="1"/>
<entry key="hacienda" goal="1"/>
<entry key="jungle" goal="1"/>
</achievement> </achievement>
<achievement id="2" type="single" goal="1" title="Strike!" description="Hit a kart with a bowling-ball." /> <achievement id="2" type="single" goal="1" title="Strike!" description="Hit a kart with a bowling-ball." />
</achievements> </achievements>

View File

@ -20,6 +20,8 @@
#include "achievements/achievement.hpp" #include "achievements/achievement.hpp"
#include "achievements/achievement_info.hpp" #include "achievements/achievement_info.hpp"
#include "guiengine/dialog_queue.hpp"
#include "states_screens/dialogs/notification_dialog.hpp"
#include "io/xml_writer.hpp" #include "io/xml_writer.hpp"
#include "utils/log.hpp" #include "utils/log.hpp"
#include "utils/translation.hpp" #include "utils/translation.hpp"
@ -58,7 +60,12 @@ void Achievement::check()
if(m_achievement_info->checkCompletion(this)) if(m_achievement_info->checkCompletion(this))
{ {
//show achievement //show achievement
GUIEngine::DialogQueue::get()->pushDialog(
new NotificationDialog(NotificationDialog::T_Achievements,
_("Completed achievement") + '"' + m_achievement_info->getDescription() + '".'
));
//send to server //send to server
Online::CurrentUser::get()->onAchieving(m_id);
m_achieved = true; m_achieved = true;
} }
} }
@ -100,6 +107,7 @@ void SingleAchievement::reset()
void SingleAchievement::increase(int increase) void SingleAchievement::increase(int increase)
{ {
m_progress += increase; m_progress += increase;
check();
} }
// ============================================================================ // ============================================================================
@ -164,6 +172,9 @@ void MapAchievement::reset()
void MapAchievement::increase(const std::string & key, int increase) void MapAchievement::increase(const std::string & key, int increase)
{ {
if ( m_progress_map.find(key) != m_progress_map.end()) if ( m_progress_map.find(key) != m_progress_map.end())
{
m_progress_map[key] += increase; m_progress_map[key] += increase;
check();
}
} }

View File

@ -57,6 +57,7 @@ AchievementsManager::AchievementsManager()
// ============================================================================ // ============================================================================
AchievementsManager::~AchievementsManager() AchievementsManager::~AchievementsManager()
{ {
save();
m_slots.clearAndDeleteAll(); m_slots.clearAndDeleteAll();
m_achievements_info.clearAndDeleteAll(); m_achievements_info.clearAndDeleteAll();
} }
@ -122,10 +123,6 @@ void AchievementsManager::parseConfigFile()
} }
m_slots.push_back(slot); m_slots.push_back(slot);
} }
bool something_changed = createSlotsIfNeeded();
if (something_changed) save();
delete root; delete root;
} // load } // load
@ -142,7 +139,7 @@ AchievementsSlot * AchievementsManager::createNewSlot(std::string id, bool onlin
/** Creates a slot for players that don't have one yet /** Creates a slot for players that don't have one yet
* \return true if any were created * \return true if any were created
*/ */
bool AchievementsManager::createSlotsIfNeeded() void AchievementsManager::createSlotsIfNeeded()
{ {
bool something_changed = false; bool something_changed = false;
@ -157,7 +154,7 @@ bool AchievementsManager::createSlotsIfNeeded()
} }
} }
return something_changed; if(something_changed) save();
} // UnlockManager::createSlotsIfNeeded } // UnlockManager::createSlotsIfNeeded
@ -212,13 +209,13 @@ AchievementsSlot * AchievementsManager::getSlot(const std::string & id, bool onl
// ============================================================================ // ============================================================================
void AchievementsManager::updateCurrentPlayer() void AchievementsManager::updateCurrentPlayer()
{ {
createSlotsIfNeeded();
if(Online::CurrentUser::get()->isRegisteredUser()) if(Online::CurrentUser::get()->isRegisteredUser())
{ {
m_active_slot = getSlot(StringUtils::toString(Online::CurrentUser::get()->getID()), true); m_active_slot = getSlot(StringUtils::toString(Online::CurrentUser::get()->getID()), true);
if(m_active_slot == NULL) if(m_active_slot == NULL)
{ {
m_active_slot = createNewSlot(StringUtils::toString(Online::CurrentUser::get()->getID()), true); m_active_slot = createNewSlot(StringUtils::toString(Online::CurrentUser::get()->getID()), true);
m_active_slot->sync();
} }
} }
else else

View File

@ -45,7 +45,6 @@ private :
PtrVector<AchievementInfo> m_achievements_info; PtrVector<AchievementInfo> m_achievements_info;
AchievementsManager (); AchievementsManager ();
~AchievementsManager (); ~AchievementsManager ();
bool createSlotsIfNeeded();
AchievementsSlot * createNewSlot(std::string id, bool online); AchievementsSlot * createNewSlot(std::string id, bool online);
public: public:
@ -60,7 +59,9 @@ public:
void save(); void save();
void onRaceEnd(); void onRaceEnd();
void updateCurrentPlayer(); void updateCurrentPlayer();
AchievementsSlot * getActive() const { return m_active_slot; }
AchievementsSlot * getSlot(const std::string & id, bool online); AchievementsSlot * getSlot(const std::string & id, bool online);
void createSlotsIfNeeded();
}; // class AchievementsManager }; // class AchievementsManager
#endif #endif

View File

@ -51,7 +51,7 @@ AchievementsSlot::AchievementsSlot(const XMLNode * input)
{ {
uint32_t achievement_id(0); uint32_t achievement_id(0);
xml_achievements[i]->get("id", &achievement_id); xml_achievements[i]->get("id", &achievement_id);
Achievement * achievement = findAchievement(achievement_id); Achievement * achievement = getAchievement(achievement_id);
if(achievement == NULL) if(achievement == NULL)
{ {
Log::warn("AchievementsSlot", "Found saved achievement data for a non-existent achievement. Discarding."); Log::warn("AchievementsSlot", "Found saved achievement data for a non-existent achievement. Discarding.");
@ -109,7 +109,7 @@ void AchievementsSlot::save(std::ofstream & out)
} }
// ============================================================================ // ============================================================================
Achievement * AchievementsSlot::findAchievement(uint32_t id) Achievement * AchievementsSlot::getAchievement(uint32_t id)
{ {
if ( m_achievements.find(id) != m_achievements.end()) if ( m_achievements.find(id) != m_achievements.end())
return m_achievements[id]; return m_achievements[id];

View File

@ -46,7 +46,7 @@ public :
void sync(); void sync();
void onRaceEnd(); void onRaceEnd();
const std::string & getID() const {return m_id;} const std::string & getID() const {return m_id;}
Achievement * findAchievement(uint32_t id); Achievement * getAchievement(uint32_t id);
}; };
#endif #endif

View File

@ -1242,15 +1242,17 @@ void cleanSuperTuxKart()
if(INetworkHttp::get()) if(INetworkHttp::get())
INetworkHttp::get()->stopNetworkThread(); INetworkHttp::get()->stopNetworkThread();
if(Online::HTTPManager::isRunning())
Online::HTTPManager::get()->stopNetworkThread();
//delete in reverse order of what they were created in. //delete in reverse order of what they were created in.
//see InitTuxkart() //see InitTuxkart()
Online::ServersManager::deallocate(); Online::ServersManager::deallocate();
Online::ProfileManager::deallocate(); Online::ProfileManager::deallocate();
AchievementsManager::deallocate();
Online::CurrentUser::deallocate(); Online::CurrentUser::deallocate();
GUIEngine::DialogQueue::deallocate(); GUIEngine::DialogQueue::deallocate();
if(Online::HTTPManager::isRunning())
Online::HTTPManager::get()->stopNetworkThread();
Referee::cleanup(); Referee::cleanup();
if(ReplayPlay::get()) ReplayPlay::destroy(); if(ReplayPlay::get()) ReplayPlay::destroy();
@ -1365,6 +1367,7 @@ int main(int argc, char *argv[] )
file_manager->getGUIDir() + "options_video.png") ); file_manager->getGUIDir() + "options_video.png") );
kart_properties_manager -> loadAllKarts (); kart_properties_manager -> loadAllKarts ();
unlock_manager = new UnlockManager(); unlock_manager = new UnlockManager();
AchievementsManager::get();
//m_tutorial_manager = new TutorialManager(); //m_tutorial_manager = new TutorialManager();
GUIEngine::addLoadingIcon( irr_driver->getTexture( GUIEngine::addLoadingIcon( irr_driver->getTexture(
file_manager->getTextureFile("gui_lock.png")) ); file_manager->getTextureFile("gui_lock.png")) );

View File

@ -19,6 +19,7 @@
#include "online/current_user.hpp" #include "online/current_user.hpp"
#include "achievements/achievements_manager.hpp"
#include "addons/addons_manager.hpp" #include "addons/addons_manager.hpp"
#include "config/user_config.hpp" #include "config/user_config.hpp"
#include "online/servers_manager.hpp" #include "online/servers_manager.hpp"
@ -152,6 +153,8 @@ namespace Online{
UserConfigParams::m_saved_session = true; UserConfigParams::m_saved_session = true;
} }
ProfileManager::get()->addPersistent(m_profile); ProfileManager::get()->addPersistent(m_profile);
AchievementsManager::get()->updateCurrentPlayer();
AchievementsManager::get()->getActive()->sync();
m_profile->fetchFriends(); m_profile->fetchFriends();
} }
else else
@ -229,6 +232,7 @@ namespace Online{
UserConfigParams::m_saved_user = 0; UserConfigParams::m_saved_user = 0;
UserConfigParams::m_saved_token = ""; UserConfigParams::m_saved_token = "";
UserConfigParams::m_saved_session = false; UserConfigParams::m_saved_session = false;
AchievementsManager::get()->updateCurrentPlayer();
} }
void CurrentUser::SignOutRequest::callback() void CurrentUser::SignOutRequest::callback()
@ -627,6 +631,23 @@ namespace Online{
} }
} }
// ============================================================================
void CurrentUser::onAchieving(uint32_t achievement_id) const
{
if(isRegisteredUser())
{
HTTPRequest * request = new HTTPRequest(true);
request->setURL((std::string)UserConfigParams::m_server_multiplayer + "client-user.php");
request->setParameter("action", std::string("achieving"));
request->setParameter("token", getToken());
request->setParameter("userid", getID());
request->setParameter("achievementid", achievement_id);
HTTPManager::get()->addRequest(request);
}
}
// ============================================================================ // ============================================================================
irr::core::stringw CurrentUser::getUserName() const irr::core::stringw CurrentUser::getUserName() const
{ {

View File

@ -170,6 +170,7 @@ namespace Online{
const XMLRequest * requestUserSearch(const irr::core::stringw & search_string) const; const XMLRequest * requestUserSearch(const irr::core::stringw & search_string) const;
void onSTKQuit() const; void onSTKQuit() const;
void onAchieving(uint32_t achievement_id) const;
/** Returns the username if signed in. */ /** Returns the username if signed in. */
irr::core::stringw getUserName() const; irr::core::stringw getUserName() const;

View File

@ -129,6 +129,11 @@ void NotificationDialog::onUpdate(float dt)
ProfileManager::get()->setVisiting(CurrentUser::get()->getID()); ProfileManager::get()->setVisiting(CurrentUser::get()->getID());
StateManager::get()->pushScreen(OnlineProfileFriends::getInstance()); StateManager::get()->pushScreen(OnlineProfileFriends::getInstance());
} }
else if (m_type == T_Achievements)
{
ProfileManager::get()->setVisiting(CurrentUser::get()->getID());
StateManager::get()->pushScreen(OnlineProfileFriends::getInstance()); //FIXME should actually pop up achievements screen
}
} }
return; return;
} }

View File

@ -36,7 +36,8 @@ class NotificationDialog : public GUIEngine::ModalDialog
public: public:
enum Type enum Type
{ {
T_Friends = 1 T_Friends = 1,
T_Achievements = 2
}; };
private: private: