Files
BABA_YAGA/Assets/Scripts/Game/EloSystem.cs

65 lines
2.0 KiB
C#
Raw Normal View History

2026-04-29 13:10:00 +07:00
using UnityEngine;
using Fusion;
namespace Hallucinate.Game
{
public static class EloSystem
{
public static EloResult Calculate(
int ratingA, int ratingB,
int gamesPlayedA, int gamesPlayedB,
float resultA) // 1=win, 0=lose, 0.5=draw
{
float eA = 1f / (1f + Mathf.Pow(10f, (ratingB - ratingA) / 400f));
int kA = GetK(ratingA, gamesPlayedA);
int kB = GetK(ratingB, gamesPlayedB);
int nA = Mathf.Max(100, Mathf.RoundToInt(ratingA + kA * (resultA - eA)));
int nB = Mathf.Max(100, Mathf.RoundToInt(ratingB + kB * ((1 - resultA) - (1 - eA))));
return new EloResult(nA, nB, nA - ratingA, nB - ratingB);
}
private static int GetK(int r, int g) =>
g < 30 ? 40 : r < 1200 ? 32 : r < 2000 ? 24 : 16;
public static string GetRank(int rating)
{
if (rating < 800) return "Iron";
if (rating < 1000) return "Bronze";
if (rating < 1200) return "Silver";
if (rating < 1500) return "Gold";
if (rating < 1800) return "Platinum";
if (rating < 2100) return "Diamond";
return "Master";
}
public static string GetRankColor(int rating)
{
if (rating < 800) return "#8A8A8A";
if (rating < 1000) return "#CD7F32";
if (rating < 1200) return "#C0C0C0";
if (rating < 1500) return "#FFD700";
if (rating < 1800) return "#4DC8A0";
if (rating < 2100) return "#7B6EE8";
return "#E84D8A";
}
}
public struct EloResult : INetworkStruct
{
public int NewRatingA;
public int NewRatingB;
public int DeltaA;
public int DeltaB;
public EloResult(int nA, int nB, int dA, int dB)
{
NewRatingA = nA;
NewRatingB = nB;
DeltaA = dA;
DeltaB = dB;
}
}
}