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:
parent
178fc8613d
commit
03be63ea5b
@ -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>
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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];
|
||||||
|
@ -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
|
||||||
|
@ -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")) );
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user