mirror of
				https://github.com/OpenFusionProject/OpenFusion.git
				synced 2025-10-31 08:40:12 +00:00 
			
		
		
		
	Compare commits
	
		
			2 Commits
		
	
	
		
			1.5.1
			...
			50df74212b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 50df74212b | ||
|   | f4b36b8f73 | 
| @@ -99,31 +99,47 @@ static void racingEnd(CNSocket* sock, CNPacketData* data) { | |||||||
|     if (EPData.find(mapNum) == EPData.end() || EPData[mapNum].EPID == 0) |     if (EPData.find(mapNum) == EPData.end() || EPData[mapNum].EPID == 0) | ||||||
|         return; // IZ not found |         return; // IZ not found | ||||||
|  |  | ||||||
|     uint64_t now = getTime() / 1000; |     EPInfo& epInfo = EPData[mapNum]; | ||||||
|  |     EPRace& epRace = EPRaces[sock]; | ||||||
|  |     // if there are no divide-by-zero dangers, and at least one factor has been specified | ||||||
|  |     // we switch over to OG scoring | ||||||
|  |     bool useOGScoring = (epInfo.maxPods > 0) && (epInfo.maxTime > 0) && ( | ||||||
|  |         (epInfo.scaleFactor > 0.0) || (epInfo.podFactor > 0.0) || (epInfo.timeFactor > 0.0)); | ||||||
|  |  | ||||||
|     int timeDiff = now - EPRaces[sock].startTime; |     uint64_t now = getTime() / 1000; | ||||||
|     int score = 500 * EPRaces[sock].collectedRings.size() - 10 * timeDiff; |     int timeDiff = now - epRace.startTime; | ||||||
|     if (score < 0) score = 0; // lol |     int podsCollected = epRace.collectedRings.size(); | ||||||
|     int fm = score * plr->level * (1.0f / 36) * 0.3f; |     int score = 0, fm = 0; | ||||||
|  |  | ||||||
|  |     if (useOGScoring) { | ||||||
|  |         score = std::min(epInfo.maxScore, (int)std::exp( | ||||||
|  |             (epInfo.podFactor * podsCollected) / epInfo.maxPods | ||||||
|  |             - (epInfo.timeFactor * timeDiff) / epInfo.maxTime | ||||||
|  |             + epInfo.scaleFactor)); | ||||||
|  |         fm = (1.0 + std::exp(epInfo.scaleFactor - 1.0) * epInfo.podFactor * podsCollected) / epInfo.maxPods; | ||||||
|  |     } else { | ||||||
|  |         score = std::max(0, 500 * podsCollected - 10 * timeDiff); | ||||||
|  |         fm = score * plr->level * (1.0f / 36) * 0.3f; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     // we submit the ranking first... |     // we submit the ranking first... | ||||||
|     Database::RaceRanking postRanking = {}; |     Database::RaceRanking postRanking = {}; | ||||||
|     postRanking.EPID = EPData[mapNum].EPID; |     postRanking.EPID = epInfo.EPID; | ||||||
|     postRanking.PlayerID = plr->iID; |     postRanking.PlayerID = plr->iID; | ||||||
|     postRanking.RingCount = EPRaces[sock].collectedRings.size(); |     postRanking.RingCount = podsCollected; | ||||||
|     postRanking.Score = score; |     postRanking.Score = score; | ||||||
|     postRanking.Time = timeDiff; |     postRanking.Time = timeDiff; | ||||||
|     postRanking.Timestamp = getTimestamp(); |     postRanking.Timestamp = getTimestamp(); | ||||||
|     Database::postRaceRanking(postRanking); |     Database::postRaceRanking(postRanking); | ||||||
|  |  | ||||||
|     // ...then we get the top ranking, which may or may not be what we just submitted |     // ...then we get the top ranking, which may or may not be what we just submitted | ||||||
|     Database::RaceRanking topRankingPlayer = Database::getTopRaceRanking(EPData[mapNum].EPID, plr->iID); |     Database::RaceRanking topRankingPlayer = Database::getTopRaceRanking(epInfo.EPID, plr->iID); | ||||||
|  |  | ||||||
|     INITSTRUCT(sP_FE2CL_REP_EP_RACE_END_SUCC, resp); |     INITSTRUCT(sP_FE2CL_REP_EP_RACE_END_SUCC, resp); | ||||||
|  |  | ||||||
|     // get rank scores and rewards |     // get rank scores and rewards | ||||||
|     std::vector<int>* rankScores = &EPRewards[EPData[mapNum].EPID].first; |     std::vector<int>* rankScores = &EPRewards[epInfo.EPID].first; | ||||||
|     std::vector<int>* rankRewards = &EPRewards[EPData[mapNum].EPID].second; |     std::vector<int>* rankRewards = &EPRewards[epInfo.EPID].second; | ||||||
|  |  | ||||||
|     // top ranking |     // top ranking | ||||||
|     int topRank = 0; |     int topRank = 0; | ||||||
|   | |||||||
| @@ -7,7 +7,11 @@ | |||||||
| #include <set> | #include <set> | ||||||
|  |  | ||||||
| struct EPInfo { | struct EPInfo { | ||||||
|     int zoneX, zoneY, EPID, maxScore, maxTime; |     // available through XDT (maxScore may be updated by drops) | ||||||
|  |     int zoneX, zoneY, EPID, maxScore; | ||||||
|  |     // (maybe) available through drops | ||||||
|  |     int maxTime = 0, maxPods = 0; | ||||||
|  |     double scaleFactor = 0.0, podFactor = 0.0, timeFactor = 0.0; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| struct EPRace { | struct EPRace { | ||||||
|   | |||||||
| @@ -584,8 +584,35 @@ static void loadDrops(json& dropData) { | |||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             EPInfo& epInfo = Racing::EPData[EPMap]; | ||||||
|  |  | ||||||
|             // time limit isn't stored in the XDT, so we include it in the reward table instead |             // time limit isn't stored in the XDT, so we include it in the reward table instead | ||||||
|             Racing::EPData[EPMap].maxTime = race["TimeLimit"]; |             epInfo.maxTime = (int)race["TimeLimit"]; | ||||||
|  |  | ||||||
|  |             // update max score (if present) | ||||||
|  |             if (race.find("ScoreCap") != race.end()) { | ||||||
|  |                 epInfo.maxScore = (int)race["ScoreCap"]; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // update max pods (if present) | ||||||
|  |             if (race.find("TotalPods") != race.end()) { | ||||||
|  |                 epInfo.maxPods = (int)race["TotalPods"]; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // update scale factor (if present) | ||||||
|  |             if (race.find("ScaleFactor") != race.end()) { | ||||||
|  |                 epInfo.scaleFactor = (double)race["ScaleFactor"]; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // update pod factor (if present) | ||||||
|  |             if (race.find("PodFactor") != race.end()) { | ||||||
|  |                 epInfo.podFactor = (double)race["PodFactor"]; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // update time factor (if present) | ||||||
|  |             if (race.find("TimeFactor") != race.end()) { | ||||||
|  |                 epInfo.timeFactor = (double)race["TimeFactor"]; | ||||||
|  |             } | ||||||
|  |  | ||||||
|             // score cutoffs |             // score cutoffs | ||||||
|             std::vector<int> rankScores; |             std::vector<int> rankScores; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user