瀏覽代碼

add some stats

Laserlicht 1 年之前
父節點
當前提交
58bfd27aad
共有 3 個文件被更改,包括 33 次插入3 次删除
  1. 15 3
      lib/gameState/GameStatistics.cpp
  2. 12 0
      lib/gameState/GameStatistics.h
  3. 6 0
      server/battles/BattleResultProcessor.cpp

+ 15 - 3
lib/gameState/GameStatistics.cpp

@@ -38,6 +38,8 @@ StatisticDataSetEntry StatisticDataSet::createEntry(const PlayerState * ps, cons
 	scenarioHighScores.parameters.push_back(param);
 	scenarioHighScores.isCampaign = false;
 
+	data.map = gs->map->name.toString();
+	data.timestamp = std::time(0);
 	data.day = gs->getDate(Date::DAY);
 	data.player = ps->color;
 	data.team = ps->team;
@@ -54,11 +56,13 @@ StatisticDataSetEntry StatisticDataSet::createEntry(const PlayerState * ps, cons
 	data.mightMagicRatio = Statistic::getMightMagicRatio(ps);
 	data.numMines = Statistic::getNumMines(gs, ps);
 	data.score = scenarioHighScores.calculate().total;
-	data.maxHeroLevel = Statistic::findBestHero(gs, ps->color)->level;
+	data.maxHeroLevel = Statistic::findBestHero(gs, ps->color) ? Statistic::findBestHero(gs, ps->color)->level : 0;
 	data.numBattlesNeutral = gs->statistic.values.numBattlesNeutral.count(ps->color) ? gs->statistic.values.numBattlesNeutral.at(ps->color) : 0;
 	data.numBattlesPlayer = gs->statistic.values.numBattlesPlayer.count(ps->color) ? gs->statistic.values.numBattlesPlayer.at(ps->color) : 0;
 	data.numWinBattlesNeutral = gs->statistic.values.numWinBattlesNeutral.count(ps->color) ? gs->statistic.values.numWinBattlesNeutral.at(ps->color) : 0;
 	data.numWinBattlesPlayer = gs->statistic.values.numWinBattlesPlayer.count(ps->color) ? gs->statistic.values.numWinBattlesPlayer.at(ps->color) : 0;
+	data.numHeroSurrendered = gs->statistic.values.numHeroSurrendered.count(ps->color) ? gs->statistic.values.numHeroSurrendered.at(ps->color) : 0;
+	data.numHeroEscaped = gs->statistic.values.numHeroEscaped.count(ps->color) ? gs->statistic.values.numHeroEscaped.at(ps->color) : 0;
 
 	return data;
 }
@@ -69,6 +73,8 @@ std::string StatisticDataSet::toCsv()
 
 	auto resources = std::vector<EGameResID>{EGameResID::GOLD, EGameResID::WOOD, EGameResID::MERCURY, EGameResID::ORE, EGameResID::SULFUR, EGameResID::CRYSTAL, EGameResID::GEMS};
 
+	ss << "Map" << ";";
+	ss << "Timestamp" << ";";
 	ss << "Day" << ";";
 	ss << "Player" << ";";
 	ss << "Team" << ";";
@@ -87,7 +93,9 @@ std::string StatisticDataSet::toCsv()
 	ss << "NumBattlesNeutral" << ";";
 	ss << "NumBattlesPlayer" << ";";
 	ss << "NumWinBattlesNeutral" << ";";
-	ss << "NumWinBattlesPlayer";
+	ss << "NumWinBattlesPlayer" << ";";
+	ss << "NumHeroSurrendered" << ";";
+	ss << "NumHeroEscaped";
 	for(auto & resource : resources)
 		ss << ";" << GameConstants::RESOURCE_NAMES[resource];
 	for(auto & resource : resources)
@@ -96,6 +104,8 @@ std::string StatisticDataSet::toCsv()
 
 	for(auto & entry : data)
 	{
+		ss << entry.map << ";";
+		ss << vstd::getFormattedDateTime(entry.timestamp, "%Y-%m-%dT%H-%M-%S") << ";";
 		ss << entry.day << ";";
 		ss << GameConstants::PLAYER_COLOR_NAMES[entry.player] << ";";
 		ss << entry.team.getNum() << ";";
@@ -114,7 +124,9 @@ std::string StatisticDataSet::toCsv()
 		ss << entry.numBattlesNeutral << ";";
 		ss << entry.numBattlesPlayer << ";";
 		ss << entry.numWinBattlesNeutral << ";";
-		ss << entry.numWinBattlesPlayer;
+		ss << entry.numWinBattlesPlayer << ";";
+		ss << entry.numHeroSurrendered << ";";
+		ss << entry.numHeroEscaped;
 		for(auto & resource : resources)
 			ss << ";" << entry.resources[resource];
 		for(auto & resource : resources)

+ 12 - 0
lib/gameState/GameStatistics.h

@@ -21,6 +21,8 @@ class CGMine;
 
 struct DLL_LINKAGE StatisticDataSetEntry
 {
+	std::string map;
+	time_t timestamp;
     int day;
     PlayerColor player;
 	TeamID team;
@@ -42,9 +44,13 @@ struct DLL_LINKAGE StatisticDataSetEntry
 	int numBattlesPlayer;
 	int numWinBattlesNeutral;
 	int numWinBattlesPlayer;
+	int numHeroSurrendered;
+	int numHeroEscaped;
 
 	template <typename Handler> void serialize(Handler &h)
 	{
+		h & map;
+		h & timestamp;
 		h & day;
 		h & player;
 		h & team;
@@ -66,6 +72,8 @@ struct DLL_LINKAGE StatisticDataSetEntry
 		h & numBattlesPlayer;
 		h & numWinBattlesNeutral;
 		h & numWinBattlesPlayer;
+		h & numHeroSurrendered;
+		h & numHeroEscaped;
 	}
 };
 
@@ -84,6 +92,8 @@ public:
 		std::map<PlayerColor, int> numBattlesPlayer;
 		std::map<PlayerColor, int> numWinBattlesNeutral;
 		std::map<PlayerColor, int> numWinBattlesPlayer;
+		std::map<PlayerColor, int> numHeroSurrendered;
+		std::map<PlayerColor, int> numHeroEscaped;
 
 		template <typename Handler> void serialize(Handler &h)
 		{
@@ -91,6 +101,8 @@ public:
 			h & numBattlesPlayer;
 			h & numWinBattlesNeutral;
 			h & numWinBattlesPlayer;
+			h & numHeroSurrendered;
+			h & numHeroEscaped;
 		}
 	};
 	ValueStorage values;

+ 6 - 0
server/battles/BattleResultProcessor.cpp

@@ -572,10 +572,16 @@ void BattleResultProcessor::battleAfterLevelUp(const BattleID & battleID, const
 	gameHandler->checkVictoryLossConditions(playerColors);
 
 	if (result.result == EBattleResult::SURRENDER)
+	{
+		gameHandler->gameState()->statistic.values.numHeroSurrendered[finishingBattle->loser]++;
 		gameHandler->heroPool->onHeroSurrendered(finishingBattle->loser, finishingBattle->loserHero);
+	}
 
 	if (result.result == EBattleResult::ESCAPE)
+	{
+		gameHandler->gameState()->statistic.values.numHeroEscaped[finishingBattle->loser]++;
 		gameHandler->heroPool->onHeroEscaped(finishingBattle->loser, finishingBattle->loserHero);
+	}
 
 	if (result.winner != 2 && finishingBattle->winnerHero && finishingBattle->winnerHero->stacks.empty()
 		&& (!finishingBattle->winnerHero->commander || !finishingBattle->winnerHero->commander->alive))