Add gamerzilla support to achievements. (#4386)
* Add gamerzilla support to achievements. * Move all gamerzilla code into one file. Should we want to support another achievement system like Steam, it can be isolated to the WebAchievementsStatus class. * Add WebAchievementsStatus files. * Add version number to achievements file. Update graphics. Generate achievement list from internal system.
This commit is contained in:
parent
a27737ef85
commit
e2d4936056
@ -742,6 +742,19 @@ if(MINGW)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Find LibGamerzilla library or build it if missing
|
||||||
|
if (NOT APPLE)
|
||||||
|
include(FindPkgConfig)
|
||||||
|
pkg_search_module(GAMERZILLA OPTIONAL gamerzilla)
|
||||||
|
|
||||||
|
if (GAMERZILLA_LIBRARIES)
|
||||||
|
message(STATUS "Gamerzilla found")
|
||||||
|
include_directories(${GAMERZILLA_INCLUDE_DIRS})
|
||||||
|
target_link_libraries(supertuxkart ${GAMERZILLA_LIBRARIES})
|
||||||
|
add_definitions(-DGAMERZILLA)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
# ==== Checking if data folder exists ====
|
# ==== Checking if data folder exists ====
|
||||||
if(NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
if(NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/data)
|
||||||
message( FATAL_ERROR "${CMAKE_CURRENT_SOURCE_DIR}/data folder doesn't exist" )
|
message( FATAL_ERROR "${CMAKE_CURRENT_SOURCE_DIR}/data folder doesn't exist" )
|
||||||
|
@ -137,7 +137,7 @@
|
|||||||
egg-hunt-started-all
|
egg-hunt-started-all
|
||||||
egg-hunt-finished-all
|
egg-hunt-finished-all
|
||||||
-->
|
-->
|
||||||
<achievements>
|
<achievements version="1">
|
||||||
<achievement id="1" name="Christoffel Columbus" description="Play every official track at least once." >
|
<achievement id="1" name="Christoffel Columbus" description="Play every official track at least once." >
|
||||||
<goal type="race-finished-all" value="1"/>
|
<goal type="race-finished-all" value="1"/>
|
||||||
</achievement>
|
</achievement>
|
||||||
|
BIN
data/gamerzilla/achievement0.png
Normal file
BIN
data/gamerzilla/achievement0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
data/gamerzilla/achievement1.png
Normal file
BIN
data/gamerzilla/achievement1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
data/gamerzilla/supertuxkart.png
Normal file
BIN
data/gamerzilla/supertuxkart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 106 KiB |
@ -396,4 +396,8 @@ void Achievement::onCompletion()
|
|||||||
request->addParameter("achievementid", getID());
|
request->addParameter("achievementid", getID());
|
||||||
request->queue();
|
request->queue();
|
||||||
}
|
}
|
||||||
|
if (PlayerManager::getCurrentPlayer()->getUniqueID() == 1)
|
||||||
|
{
|
||||||
|
AchievementsManager::get()->getWebAchievementStatus()->achieved(m_achievement_info);
|
||||||
|
}
|
||||||
} // onCompletion
|
} // onCompletion
|
||||||
|
@ -93,6 +93,8 @@ public:
|
|||||||
uint32_t getID() const { return m_id; }
|
uint32_t getID() const { return m_id; }
|
||||||
irr::core::stringw getDescription() const;
|
irr::core::stringw getDescription() const;
|
||||||
irr::core::stringw getName() const;
|
irr::core::stringw getName() const;
|
||||||
|
std::string getRawName() const { return m_name; }
|
||||||
|
std::string getRawDescription() const { return m_description; }
|
||||||
bool isSecret() const { return m_is_secret; }
|
bool isSecret() const { return m_is_secret; }
|
||||||
|
|
||||||
// This function should not be called if copy already has children
|
// This function should not be called if copy already has children
|
||||||
|
@ -43,6 +43,8 @@ AchievementsManager::AchievementsManager()
|
|||||||
const std::string file_name = file_manager->getAsset("achievements.xml");
|
const std::string file_name = file_manager->getAsset("achievements.xml");
|
||||||
const XMLNode *root = file_manager->createXMLTree(file_name);
|
const XMLNode *root = file_manager->createXMLTree(file_name);
|
||||||
unsigned int num_nodes = root->getNumNodes();
|
unsigned int num_nodes = root->getNumNodes();
|
||||||
|
uint32_t version = 1;
|
||||||
|
root->get("version", &version);
|
||||||
for (unsigned int i = 0; i < num_nodes; i++)
|
for (unsigned int i = 0; i < num_nodes; i++)
|
||||||
{
|
{
|
||||||
const XMLNode *node = root->getNode(i);
|
const XMLNode *node = root->getNode(i);
|
||||||
@ -54,6 +56,7 @@ AchievementsManager::AchievementsManager()
|
|||||||
"Multiple achievements with the same id!");
|
"Multiple achievements with the same id!");
|
||||||
|
|
||||||
delete root;
|
delete root;
|
||||||
|
m_web = new WebAchievementsStatus(version, m_achievements_info);
|
||||||
} // AchievementsManager
|
} // AchievementsManager
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -64,6 +67,7 @@ AchievementsManager::~AchievementsManager()
|
|||||||
delete it->second;
|
delete it->second;
|
||||||
}
|
}
|
||||||
m_achievements_info.clear();
|
m_achievements_info.clear();
|
||||||
|
delete m_web;
|
||||||
} // ~AchievementsManager
|
} // ~AchievementsManager
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -72,7 +76,7 @@ AchievementsManager::~AchievementsManager()
|
|||||||
* \param node The XML of saved data, or NULL if no saved data exists.
|
* \param node The XML of saved data, or NULL if no saved data exists.
|
||||||
*/
|
*/
|
||||||
AchievementsStatus*
|
AchievementsStatus*
|
||||||
AchievementsManager::createAchievementsStatus(const XMLNode *node)
|
AchievementsManager::createAchievementsStatus(const XMLNode *node, bool updateWeb)
|
||||||
{
|
{
|
||||||
AchievementsStatus *status = new AchievementsStatus();
|
AchievementsStatus *status = new AchievementsStatus();
|
||||||
|
|
||||||
@ -90,6 +94,8 @@ AchievementsStatus*
|
|||||||
|
|
||||||
if (node)
|
if (node)
|
||||||
status->load(node);
|
status->load(node);
|
||||||
|
if (updateWeb)
|
||||||
|
m_web->updateAchievementsProgress(status);
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
} // createAchievementStatus
|
} // createAchievementStatus
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#define HEADER_ACHIEVEMENTS_MANAGER_HPP
|
#define HEADER_ACHIEVEMENTS_MANAGER_HPP
|
||||||
|
|
||||||
#include "achievements/achievements_status.hpp"
|
#include "achievements/achievements_status.hpp"
|
||||||
|
#include "achievements/web_achievements_status.hpp"
|
||||||
|
|
||||||
#include "utils/types.hpp"
|
#include "utils/types.hpp"
|
||||||
#include "utils/ptr_vector.hpp"
|
#include "utils/ptr_vector.hpp"
|
||||||
@ -43,6 +44,7 @@ private:
|
|||||||
static AchievementsManager* m_achievements_manager;
|
static AchievementsManager* m_achievements_manager;
|
||||||
|
|
||||||
std::map<uint32_t, AchievementInfo *> m_achievements_info;
|
std::map<uint32_t, AchievementInfo *> m_achievements_info;
|
||||||
|
WebAchievementsStatus *m_web;
|
||||||
|
|
||||||
AchievementsManager ();
|
AchievementsManager ();
|
||||||
~AchievementsManager ();
|
~AchievementsManager ();
|
||||||
@ -71,13 +73,14 @@ public:
|
|||||||
// ========================================================================
|
// ========================================================================
|
||||||
|
|
||||||
AchievementInfo* getAchievementInfo(uint32_t id) const;
|
AchievementInfo* getAchievementInfo(uint32_t id) const;
|
||||||
AchievementsStatus* createAchievementsStatus(const XMLNode *node=NULL);
|
AchievementsStatus* createAchievementsStatus(const XMLNode *node=NULL, bool updateWeb = false);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
const std::map<uint32_t, AchievementInfo *> & getAllInfo()
|
const std::map<uint32_t, AchievementInfo *> & getAllInfo()
|
||||||
{
|
{
|
||||||
return m_achievements_info;
|
return m_achievements_info;
|
||||||
} // getAllInfo
|
} // getAllInfo
|
||||||
|
|
||||||
|
WebAchievementsStatus* getWebAchievementStatus() { return m_web; }
|
||||||
}; // class AchievementsManager
|
}; // class AchievementsManager
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
93
src/achievements/web_achievements_status.cpp
Normal file
93
src/achievements/web_achievements_status.cpp
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
//
|
||||||
|
// SuperTuxKart - a fun racing game with go-kart
|
||||||
|
// Copyright (C) 2013-2015 Glenn De Jonghe
|
||||||
|
// (C) 2014-2015 Joerg Henrichs
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License
|
||||||
|
// as published by the Free Software Foundation; either version 3
|
||||||
|
// of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
|
||||||
|
#include "achievements/web_achievements_status.hpp"
|
||||||
|
|
||||||
|
#include "achievements/achievement.hpp"
|
||||||
|
#include "achievements/achievement_info.hpp"
|
||||||
|
#include "achievements/achievements_status.hpp"
|
||||||
|
#include "io/file_manager.hpp"
|
||||||
|
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
#include "gamerzilla.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Constructur, initialises this object with the data from the
|
||||||
|
* corresponding AchievementInfo.
|
||||||
|
*/
|
||||||
|
WebAchievementsStatus::WebAchievementsStatus(int version, std::map<uint32_t, AchievementInfo *> &info)
|
||||||
|
{
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
GamerzillaStart(false, (file_manager->getUserConfigDir() + "gamerzilla/").c_str());
|
||||||
|
Gamerzilla g;
|
||||||
|
std::string path = file_manager->getAsset("gamerzilla/");
|
||||||
|
std::string main_image = path + "supertuxkart.png";
|
||||||
|
std::string true_image = path + "achievement1.png";
|
||||||
|
std::string false_image = path + "achievement0.png";
|
||||||
|
GamerzillaInitGame(&g);
|
||||||
|
g.version = version;
|
||||||
|
g.short_name = strdup("supertuxkart");
|
||||||
|
g.name = strdup("SuperTuxKart");
|
||||||
|
g.image = strdup(main_image.c_str());
|
||||||
|
for (auto const &i : info)
|
||||||
|
{
|
||||||
|
GamerzillaGameAddTrophy(&g, i.second->getRawName().c_str(), i.second->getRawDescription().c_str(), 0, true_image.c_str(), false_image.c_str());
|
||||||
|
}
|
||||||
|
m_game_id = GamerzillaSetGame(&g);
|
||||||
|
GamerzillaClearGame(&g);
|
||||||
|
#endif
|
||||||
|
} // WebAchievementStatus
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
WebAchievementsStatus::~WebAchievementsStatus()
|
||||||
|
{
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
GamerzillaQuit();
|
||||||
|
#endif
|
||||||
|
} // ~WebAchievementStatus
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
/** Checks for an updates to achievements progress
|
||||||
|
* \param Current status
|
||||||
|
*/
|
||||||
|
void WebAchievementsStatus::updateAchievementsProgress(AchievementsStatus *status)
|
||||||
|
{
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
std::map<uint32_t, Achievement *> &a = status->getAllAchievements();
|
||||||
|
for (auto ¤t : a)
|
||||||
|
{
|
||||||
|
if (current.second->isAchieved())
|
||||||
|
{
|
||||||
|
GamerzillaSetTrophy(m_game_id, current.second->getInfo()->getRawName().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} // updateAchievementsProgress
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
/** Sets an achievement
|
||||||
|
* \param Achievement acquired
|
||||||
|
*/
|
||||||
|
void WebAchievementsStatus::achieved(AchievementInfo *info)
|
||||||
|
{
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
GamerzillaSetTrophy(m_game_id, info->getRawName().c_str());
|
||||||
|
#endif
|
||||||
|
}
|
52
src/achievements/web_achievements_status.hpp
Normal file
52
src/achievements/web_achievements_status.hpp
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
//
|
||||||
|
// SuperTuxKart - a fun racing game with go-kart
|
||||||
|
// Copyright (C) 2013-2015 Glenn De Jonghe
|
||||||
|
// (C) 2014-2015 Joerg Henrichs
|
||||||
|
//
|
||||||
|
// This program is free software; you can redistribute it and/or
|
||||||
|
// modify it under the terms of the GNU General Public License
|
||||||
|
// as published by the Free Software Foundation; either version 3
|
||||||
|
// of the License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU General Public License
|
||||||
|
// along with this program; if not, write to the Free Software
|
||||||
|
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
|
#ifndef HEADER_WEB_ACHIEVEMENTS_STATUS_HPP
|
||||||
|
#define HEADER_WEB_ACHIEVEMENTS_STATUS_HPP
|
||||||
|
|
||||||
|
#include "achievements/achievement_info.hpp"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class AchievementsStatus;
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
/** This class updates achievements on an online site. It detects when
|
||||||
|
* achievements haven't been updated and sends the changes.
|
||||||
|
* \ingroup achievements
|
||||||
|
*/
|
||||||
|
class WebAchievementsStatus
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
int m_game_id;
|
||||||
|
#endif
|
||||||
|
public:
|
||||||
|
|
||||||
|
WebAchievementsStatus(int version, std::map<uint32_t, AchievementInfo *> &info);
|
||||||
|
virtual ~WebAchievementsStatus();
|
||||||
|
|
||||||
|
void updateAchievementsProgress(AchievementsStatus *status);
|
||||||
|
void achieved(AchievementInfo *info);
|
||||||
|
|
||||||
|
#ifdef GAMERZILLA
|
||||||
|
int getGameID() const { return m_game_id; }
|
||||||
|
#endif
|
||||||
|
}; // class Achievement
|
||||||
|
#endif
|
@ -122,7 +122,7 @@ void PlayerProfile::loadRemainingData(const XMLNode *node)
|
|||||||
unlock_manager->createStoryModeStatus(xml_story_mode);
|
unlock_manager->createStoryModeStatus(xml_story_mode);
|
||||||
const XMLNode *xml_achievements = node->getNode("achievements");
|
const XMLNode *xml_achievements = node->getNode("achievements");
|
||||||
m_achievements_status = AchievementsManager::get()
|
m_achievements_status = AchievementsManager::get()
|
||||||
->createAchievementsStatus(xml_achievements);
|
->createAchievementsStatus(xml_achievements, m_unique_id == 1);
|
||||||
// Fix up any potentially missing icons.
|
// Fix up any potentially missing icons.
|
||||||
addIcon();
|
addIcon();
|
||||||
} // initRemainingData
|
} // initRemainingData
|
||||||
|
Loading…
Reference in New Issue
Block a user