/* * GameSTatistics.h, part of VCMI engine * * Authors: listed in file AUTHORS in main folder * * License: GNU General Public License v2.0 or later * Full text of license available in license.txt file, in main folder * */ #pragma once #include "../GameConstants.h" #include "../ResourceSet.h" VCMI_LIB_NAMESPACE_BEGIN struct PlayerState; class CGameState; class CGHeroInstance; class CGMine; struct DLL_LINKAGE StatisticDataSetEntry { std::string map; time_t timestamp; int day; PlayerColor player; TeamID team; bool isHuman; EPlayerStatus status; TResources resources; int numberHeroes; int numberTowns; int numberArtifacts; si64 armyStrength; int income; float mapExploredRatio; float obeliskVisitedRatio; std::map numMines; int score; int maxHeroLevel; int numBattlesNeutral; int numBattlesPlayer; int numWinBattlesNeutral; int numWinBattlesPlayer; int numHeroSurrendered; int numHeroEscaped; template void serialize(Handler &h) { h & map; h & timestamp; h & day; h & player; h & team; h & isHuman; h & status; h & resources; h & numberHeroes; h & numberTowns; h & numberArtifacts; h & armyStrength; h & income; h & mapExploredRatio; h & obeliskVisitedRatio; h & numMines; h & score; h & maxHeroLevel; h & numBattlesNeutral; h & numBattlesPlayer; h & numWinBattlesNeutral; h & numWinBattlesPlayer; h & numHeroSurrendered; h & numHeroEscaped; } }; class DLL_LINKAGE StatisticDataSet { std::vector data; public: void add(StatisticDataSetEntry entry); static StatisticDataSetEntry createEntry(const PlayerState * ps, const CGameState * gs); std::string toCsv(); struct ValueStorage { std::map numBattlesNeutral; std::map numBattlesPlayer; std::map numWinBattlesNeutral; std::map numWinBattlesPlayer; std::map numHeroSurrendered; std::map numHeroEscaped; template void serialize(Handler &h) { h & numBattlesNeutral; h & numBattlesPlayer; h & numWinBattlesNeutral; h & numWinBattlesPlayer; h & numHeroSurrendered; h & numHeroEscaped; } }; ValueStorage values; template void serialize(Handler &h) { h & data; h & values; } }; class DLL_LINKAGE Statistic { static std::vector getMines(const CGameState * gs, const PlayerState * ps); public: static int getNumberOfArts(const PlayerState * ps); static si64 getArmyStrength(const PlayerState * ps, bool withTownGarrison = false); static int getIncome(const CGameState * gs, const PlayerState * ps); static float getMapExploredRatio(const CGameState * gs, PlayerColor player); static const CGHeroInstance * findBestHero(const CGameState * gs, const PlayerColor & color); static std::vector> getRank(std::vector> stats); static int getObeliskVisited(const CGameState * gs, const TeamID & t); static float getObeliskVisitedRatio(const CGameState * gs, const TeamID & t); static std::map getNumMines(const CGameState * gs, const PlayerState * ps); }; VCMI_LIB_NAMESPACE_END