2
0
Laserlicht 2 жил өмнө
parent
commit
68e536c290

+ 19 - 35
client/mainmenu/CHighScoreScreen.cpp

@@ -34,46 +34,30 @@
 
 auto HighScoreCalculation::calculate()
 {
-	struct result
+	struct Result
 	{
-		int basic;
-		int total;
-		int sumDays;
-		bool cheater;
+		int basic = 0;
+		int total = 0;
+		int sumDays = 0;
+		bool cheater = false;
 	};
 	
-	std::vector<int> scoresBasic;
-	std::vector<int> scoresTotal;
-	double sumBasic = 0;
-	double sumTotal = 0;
-	int sumDays = 0;
-	bool cheater = false;
+	Result firstResult, summary;
+	const std::array<double, 5> difficultyMultipliers{0.8, 1.0, 1.3, 1.6, 2.0}; 
 	for(auto & param : parameters)
 	{
 		double tmp = 200 - (param.day + 10) / (param.townAmount + 5) + (param.allDefeated ? 25 : 0) + (param.hasGrail ? 25 : 0);
-		scoresBasic.push_back(static_cast<int>(tmp));
-		sumBasic += tmp;
-		if(param.difficulty == 0)
-			tmp *= 0.8;
-		if(param.difficulty == 1)
-			tmp *= 1.0;
-		if(param.difficulty == 2)
-			tmp *= 1.3;
-		if(param.difficulty == 3)
-			tmp *= 1.6;
-		if(param.difficulty == 4)
-			tmp *= 2.0;
-		scoresTotal.push_back(static_cast<int>(tmp));
-		sumTotal += tmp;
-		sumDays += param.day;
-		if(param.usedCheat)
-			cheater = true;
+		firstResult = Result{static_cast<int>(tmp), static_cast<int>(tmp * difficultyMultipliers.at(param.difficulty)), param.day, param.usedCheat};
+		summary.basic += firstResult.basic * 5.0 / parameters.size();
+		summary.total += firstResult.total * 5.0 / parameters.size();
+		summary.sumDays += firstResult.sumDays;
+		summary.cheater |= firstResult.cheater;
 	}
 
-	if(scoresBasic.size() == 1)
-		return result { scoresBasic[0], scoresTotal[0], sumDays , cheater};
+	if(parameters.size() == 1)
+		return firstResult;
 
-	return result { static_cast<int>((sumBasic / parameters.size()) * 5.0), static_cast<int>((sumTotal / parameters.size()) * 5.0), sumDays, cheater };
+	return summary;
 }
 
 CreatureID HighScoreCalculation::getCreatureForPoints(int points, bool campaign)
@@ -104,9 +88,9 @@ CHighScoreScreen::CHighScoreScreen(HighScorePage highscorepage, int highlighted)
 
 void CHighScoreScreen::showPopupWindow(const Point & cursorPosition)
 {
-	for (int i = 0; i < 11; i++)
+	for (int i = 0; i < screenRows; i++)
 	{
-		bool currentGameNotInListEntry = (i == 10 && highlighted > 10);
+		bool currentGameNotInListEntry = i == (screenRows - 1) && highlighted > (screenRows - 1);
 
 		Rect r = Rect(80, 40 + i * 50, 635, 50);
 		if(r.isInside(cursorPosition - pos))
@@ -158,9 +142,9 @@ void CHighScoreScreen::addHighScores()
 	// Content
 	int y = 66;
 	auto & data = persistentStorage["highscore"][highscorepage == HighScorePage::SCENARIO ? "scenario" : "campaign"];
-	for (int i = 0; i < 11; i++)
+	for (int i = 0; i < screenRows; i++)
 	{
-		bool currentGameNotInListEntry = (i == 10 && highlighted > 10);
+		bool currentGameNotInListEntry = (i == (screenRows - 1) && highlighted > (screenRows - 1));
 		auto & curData = data[currentGameNotInListEntry ? highlighted : i];
 
 		ColorRGBA color = (i == highlighted || currentGameNotInListEntry) ? Colors::YELLOW : Colors::WHITE;

+ 2 - 0
client/mainmenu/CHighScoreScreen.h

@@ -64,6 +64,8 @@ private:
 	std::vector<std::shared_ptr<CLabel>> texts;
 	std::vector<std::shared_ptr<CAnimImage>> images;
 
+	const int screenRows = 11;
+
 	int highlighted;
 public:
 	CHighScoreScreen(HighScorePage highscorepage = HighScorePage::SCENARIO, int highlighted = -1);