From 30b2f4eb3661c338b8c786bde5a5ceabd904beeb Mon Sep 17 00:00:00 2001 From: FinnHornhoover Date: Tue, 10 Oct 2023 22:36:10 +0300 Subject: [PATCH] added config option for racing score modes --- config.ini | 5 +++++ src/Racing.cpp | 6 +----- src/TableData.cpp | 20 ++------------------ src/settings.cpp | 4 ++++ src/settings.hpp | 1 + 5 files changed, 13 insertions(+), 23 deletions(-) diff --git a/config.ini b/config.ini index fb7977d..be14f07 100644 --- a/config.ini +++ b/config.ini @@ -51,6 +51,11 @@ motd=Welcome to OpenFusion! # and pre-Academy builds must *not* contain it. #enabledpatches=1013 +# Use Original FusionFall's racing score and reward calculation? +# Set false to use Retro's calculation, make sure you have the correct +# patch(es) loaded. +ogracingscores=true + # xdt json filename #xdtdata=xdt.json # NPC json filename diff --git a/src/Racing.cpp b/src/Racing.cpp index 180d483..e8977d2 100644 --- a/src/Racing.cpp +++ b/src/Racing.cpp @@ -99,17 +99,13 @@ static void racingEnd(CNSocket* sock, CNPacketData* data) { 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)); uint64_t now = getTime() / 1000; int timeDiff = now - epRace.startTime; int podsCollected = epRace.collectedRings.size(); int score = 0, fm = 0; - if (useOGScoring) { + if (settings::OGRACINGSCORES) { score = std::min(epInfo.maxScore, (int)std::exp( (epInfo.podFactor * podsCollected) / epInfo.maxPods - (epInfo.timeFactor * timeDiff) / epInfo.maxTime diff --git a/src/TableData.cpp b/src/TableData.cpp index de05177..f562b04 100644 --- a/src/TableData.cpp +++ b/src/TableData.cpp @@ -577,28 +577,12 @@ static void loadDrops(json& dropData) { // time limit isn't stored in the XDT, so we include it in the reward table instead epInfo.maxTime = (int)race["TimeLimit"]; - // update max score (if present) - if (race.find("ScoreCap") != race.end()) { + // the following has to be present based on the score calculation method + if (settings::OGRACINGSCORES) { 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"]; } diff --git a/src/settings.cpp b/src/settings.cpp index 14d8de4..a148cbb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -66,6 +66,9 @@ int settings::MONITORINTERVAL = 5000; // event mode settings int settings::EVENTMODE = 0; +// racing score mode +bool settings::OGRACINGSCORES = true; + void settings::init() { INIReader reader("config.ini"); @@ -110,6 +113,7 @@ void settings::init() { EVENTMODE = reader.GetInteger("shard", "eventmode", EVENTMODE); DISABLEFIRSTUSEFLAG = reader.GetBoolean("shard", "disablefirstuseflag", DISABLEFIRSTUSEFLAG); ANTICHEAT = reader.GetBoolean("shard", "anticheat", ANTICHEAT); + OGRACINGSCORES = reader.GetBoolean("shard", "ogracingscores", OGRACINGSCORES); MONITORENABLED = reader.GetBoolean("monitor", "enabled", MONITORENABLED); MONITORPORT = reader.GetInteger("monitor", "port", MONITORPORT); MONITORINTERVAL = reader.GetInteger("monitor", "interval", MONITORINTERVAL); diff --git a/src/settings.hpp b/src/settings.hpp index 1ea3a43..4986784 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -36,6 +36,7 @@ namespace settings { extern int MONITORPORT; extern int MONITORINTERVAL; extern bool DISABLEFIRSTUSEFLAG; + extern bool OGRACINGSCORES; void init(); }