258 lines
10 KiB
C#
258 lines
10 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
using System.Globalization;
|
||
|
using JetBrains.Annotations;
|
||
|
|
||
|
namespace RoR2.Stats;
|
||
|
|
||
|
public class StatDef
|
||
|
{
|
||
|
public delegate string DisplayValueFormatterDelegate(ref StatField statField);
|
||
|
|
||
|
public static readonly List<StatDef> allStatDefs;
|
||
|
|
||
|
private static readonly Dictionary<string, StatDef> nameToStatDef;
|
||
|
|
||
|
public int index;
|
||
|
|
||
|
public readonly string name;
|
||
|
|
||
|
public readonly string displayToken;
|
||
|
|
||
|
public readonly StatRecordType recordType;
|
||
|
|
||
|
public readonly StatDataType dataType;
|
||
|
|
||
|
public double pointValue;
|
||
|
|
||
|
public readonly DisplayValueFormatterDelegate displayValueFormatter;
|
||
|
|
||
|
public Action onChangeCallback;
|
||
|
|
||
|
public static readonly StatDef totalGamesPlayed;
|
||
|
|
||
|
public static readonly StatDef totalTimeAlive;
|
||
|
|
||
|
public static readonly StatDef totalKills;
|
||
|
|
||
|
public static readonly StatDef totalMinionKills;
|
||
|
|
||
|
public static readonly StatDef totalDeaths;
|
||
|
|
||
|
public static readonly StatDef totalDamageDealt;
|
||
|
|
||
|
public static readonly StatDef totalMinionDamageDealt;
|
||
|
|
||
|
public static readonly StatDef totalDamageTaken;
|
||
|
|
||
|
public static readonly StatDef totalHealthHealed;
|
||
|
|
||
|
public static readonly StatDef highestDamageDealt;
|
||
|
|
||
|
public static readonly StatDef highestLevel;
|
||
|
|
||
|
public static readonly StatDef goldCollected;
|
||
|
|
||
|
public static readonly StatDef maxGoldCollected;
|
||
|
|
||
|
public static readonly StatDef totalDistanceTraveled;
|
||
|
|
||
|
public static readonly StatDef totalItemsCollected;
|
||
|
|
||
|
public static readonly StatDef highestItemsCollected;
|
||
|
|
||
|
public static readonly StatDef totalStagesCompleted;
|
||
|
|
||
|
public static readonly StatDef highestStagesCompleted;
|
||
|
|
||
|
public static readonly StatDef highestInfiniteTowerWaveReached;
|
||
|
|
||
|
public static readonly StatDef totalPurchases;
|
||
|
|
||
|
public static readonly StatDef highestPurchases;
|
||
|
|
||
|
public static readonly StatDef totalGoldPurchases;
|
||
|
|
||
|
public static readonly StatDef highestGoldPurchases;
|
||
|
|
||
|
public static readonly StatDef totalBloodPurchases;
|
||
|
|
||
|
public static readonly StatDef highestBloodPurchases;
|
||
|
|
||
|
public static readonly StatDef totalLunarPurchases;
|
||
|
|
||
|
public static readonly StatDef highestLunarPurchases;
|
||
|
|
||
|
public static readonly StatDef totalTier1Purchases;
|
||
|
|
||
|
public static readonly StatDef highestTier1Purchases;
|
||
|
|
||
|
public static readonly StatDef totalTier2Purchases;
|
||
|
|
||
|
public static readonly StatDef highestTier2Purchases;
|
||
|
|
||
|
public static readonly StatDef totalTier3Purchases;
|
||
|
|
||
|
public static readonly StatDef highestTier3Purchases;
|
||
|
|
||
|
public static readonly StatDef totalDronesPurchased;
|
||
|
|
||
|
public static readonly StatDef totalTurretsPurchased;
|
||
|
|
||
|
public static readonly StatDef totalGreenSoupsPurchased;
|
||
|
|
||
|
public static readonly StatDef totalRedSoupsPurchased;
|
||
|
|
||
|
public static readonly StatDef suicideHermitCrabsAchievementProgress;
|
||
|
|
||
|
public static readonly StatDef firstTeleporterCompleted;
|
||
|
|
||
|
public static readonly StatDef totalEliteKills;
|
||
|
|
||
|
public static readonly StatDef totalBurnDeaths;
|
||
|
|
||
|
public static readonly StatDef totalDeathsWhileBurning;
|
||
|
|
||
|
public static readonly StatDef totalTeleporterBossKillsWitnessed;
|
||
|
|
||
|
public static readonly StatDef totalCrocoInfectionsInflicted;
|
||
|
|
||
|
public static readonly StatDef totalCrocoWeakEnemyKills;
|
||
|
|
||
|
public static readonly StatDef totalMaulingRockKills;
|
||
|
|
||
|
public static readonly StatDef chefAlternateSpecialBarbecueBisonAchievementProgress;
|
||
|
|
||
|
private static string[] bodyNames;
|
||
|
|
||
|
[CanBeNull]
|
||
|
public static StatDef Find(string statName)
|
||
|
{
|
||
|
nameToStatDef.TryGetValue(statName, out var value);
|
||
|
return value;
|
||
|
}
|
||
|
|
||
|
private StatDef(string name, StatRecordType recordType, StatDataType dataType, double pointValue, DisplayValueFormatterDelegate displayValueFormatter)
|
||
|
{
|
||
|
this.name = name;
|
||
|
this.recordType = recordType;
|
||
|
this.dataType = dataType;
|
||
|
this.pointValue = pointValue;
|
||
|
this.displayValueFormatter = displayValueFormatter;
|
||
|
displayToken = "STATNAME_" + name.ToUpper(CultureInfo.InvariantCulture);
|
||
|
}
|
||
|
|
||
|
static StatDef()
|
||
|
{
|
||
|
allStatDefs = new List<StatDef>();
|
||
|
nameToStatDef = new Dictionary<string, StatDef>();
|
||
|
totalGamesPlayed = Register("totalGamesPlayed", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalTimeAlive = Register("totalTimeAlive", StatRecordType.Sum, StatDataType.Double, 1.0, TimeMMSSDisplayValueFormatter);
|
||
|
totalKills = Register("totalKills", StatRecordType.Sum, StatDataType.ULong, 10.0);
|
||
|
totalMinionKills = Register("totalMinionKills", StatRecordType.Sum, StatDataType.ULong, 10.0);
|
||
|
totalDeaths = Register("totalDeaths", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalDamageDealt = Register("totalDamageDealt", StatRecordType.Sum, StatDataType.ULong, 0.01);
|
||
|
totalMinionDamageDealt = Register("totalMinionDamageDealt", StatRecordType.Sum, StatDataType.ULong, 0.01);
|
||
|
totalDamageTaken = Register("totalDamageTaken", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalHealthHealed = Register("totalHealthHealed", StatRecordType.Sum, StatDataType.ULong, 0.01);
|
||
|
highestDamageDealt = Register("highestDamageDealt", StatRecordType.Max, StatDataType.ULong, 1.0);
|
||
|
highestLevel = Register("highestLevel", StatRecordType.Max, StatDataType.ULong, 100.0);
|
||
|
goldCollected = Register("totalGoldCollected", StatRecordType.Sum, StatDataType.ULong, 1.0);
|
||
|
maxGoldCollected = Register("maxGoldCollected", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalDistanceTraveled = Register("totalDistanceTraveled", StatRecordType.Sum, StatDataType.Double, 0.01, DistanceMarathonsDisplayValueFormatter);
|
||
|
totalItemsCollected = Register("totalItemsCollected", StatRecordType.Sum, StatDataType.ULong, 110.0);
|
||
|
highestItemsCollected = Register("highestItemsCollected", StatRecordType.Max, StatDataType.ULong, 10.0);
|
||
|
totalStagesCompleted = Register("totalStagesCompleted", StatRecordType.Sum, StatDataType.ULong, 100.0);
|
||
|
highestStagesCompleted = Register("highestStagesCompleted", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
highestInfiniteTowerWaveReached = Register("highestInfiniteTowerWaveReached", StatRecordType.Max, StatDataType.ULong, 100.0);
|
||
|
totalPurchases = Register("totalPurchases", StatRecordType.Sum, StatDataType.ULong, 35.0);
|
||
|
highestPurchases = Register("highestPurchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalGoldPurchases = Register("totalGoldPurchases", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
highestGoldPurchases = Register("highestGoldPurchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalBloodPurchases = Register("totalBloodPurchases", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
highestBloodPurchases = Register("highestBloodPurchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalLunarPurchases = Register("totalLunarPurchases", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
highestLunarPurchases = Register("highestLunarPurchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalTier1Purchases = Register("totalTier1Purchases", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
highestTier1Purchases = Register("highestTier1Purchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalTier2Purchases = Register("totalTier2Purchases", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
highestTier2Purchases = Register("highestTier2Purchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalTier3Purchases = Register("totalTier3Purchases", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
highestTier3Purchases = Register("highestTier3Purchases", StatRecordType.Max, StatDataType.ULong, 0.0);
|
||
|
totalDronesPurchased = Register("totalDronesPurchased", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalTurretsPurchased = Register("totalTurretsPurchased", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalGreenSoupsPurchased = Register("totalGreenSoupsPurchased", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalRedSoupsPurchased = Register("totalRedSoupsPurchased", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
suicideHermitCrabsAchievementProgress = Register("suicideHermitCrabsAchievementProgress", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
firstTeleporterCompleted = Register("firstTeleporterCompleted", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalEliteKills = Register("totalEliteKills", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalBurnDeaths = Register("totalBurnDeaths", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalDeathsWhileBurning = Register("totalDeathsWhileBurning", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalTeleporterBossKillsWitnessed = Register("totalTeleporterBossKillsWitnessed", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalCrocoInfectionsInflicted = Register("totalCrocoInfectionsInflicted", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalCrocoWeakEnemyKills = Register("totalCrocoWeakEnemyKills", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
totalMaulingRockKills = Register("totalMaulingRockKills", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
chefAlternateSpecialBarbecueBisonAchievementProgress = Register("chefAlternateSpecialBarbecueBisonAchievementProgress", StatRecordType.Sum, StatDataType.ULong, 0.0);
|
||
|
}
|
||
|
|
||
|
[SystemInitializer(new Type[]
|
||
|
{
|
||
|
typeof(BodyCatalog),
|
||
|
typeof(ItemCatalog),
|
||
|
typeof(EquipmentCatalog),
|
||
|
typeof(SceneCatalog)
|
||
|
})]
|
||
|
private static void Init()
|
||
|
{
|
||
|
PerBodyStatDef.RegisterStatDefs();
|
||
|
PerItemStatDef.RegisterStatDefs();
|
||
|
PerEquipmentStatDef.RegisterStatDefs();
|
||
|
PerStageStatDef.RegisterStatDefs();
|
||
|
}
|
||
|
|
||
|
public static StatDef Register(string name, StatRecordType recordType, StatDataType dataType, double pointValue, DisplayValueFormatterDelegate displayValueFormatter = null)
|
||
|
{
|
||
|
if (displayValueFormatter == null)
|
||
|
{
|
||
|
displayValueFormatter = DefaultDisplayValueFormatter;
|
||
|
}
|
||
|
StatDef statDef = new StatDef(name, recordType, dataType, pointValue, displayValueFormatter)
|
||
|
{
|
||
|
index = allStatDefs.Count
|
||
|
};
|
||
|
allStatDefs.Add(statDef);
|
||
|
nameToStatDef.Add(statDef.name, statDef);
|
||
|
return statDef;
|
||
|
}
|
||
|
|
||
|
public static string DefaultDisplayValueFormatter(ref StatField statField)
|
||
|
{
|
||
|
return statField.ToLocalNumeric();
|
||
|
}
|
||
|
|
||
|
public static string TimeMMSSDisplayValueFormatter(ref StatField statField)
|
||
|
{
|
||
|
ulong num = 0uL;
|
||
|
num = statField.dataType switch
|
||
|
{
|
||
|
StatDataType.ULong => statField.GetULongValue(),
|
||
|
StatDataType.Double => (ulong)statField.GetDoubleValue(),
|
||
|
_ => throw new ArgumentOutOfRangeException(),
|
||
|
};
|
||
|
ulong num2 = num / 60;
|
||
|
ulong num3 = num - num2 * 60;
|
||
|
return $"{num2:00}:{num3:00}";
|
||
|
}
|
||
|
|
||
|
public static string DistanceMarathonsDisplayValueFormatter(ref StatField statField)
|
||
|
{
|
||
|
double num = 0.0;
|
||
|
return string.Format(arg0: statField.dataType switch
|
||
|
{
|
||
|
StatDataType.ULong => statField.GetULongValue(),
|
||
|
StatDataType.Double => statField.GetDoubleValue(),
|
||
|
_ => throw new ArgumentOutOfRangeException(),
|
||
|
} * 2.3699E-05, format: Language.GetString("STAT_VALUE_MARATHONS_FORMAT"));
|
||
|
}
|
||
|
}
|