update map gen
This commit is contained in:
@@ -1,27 +1,43 @@
|
||||
using UnityEngine;
|
||||
using Fusion;
|
||||
|
||||
namespace Hallucinate.Game
|
||||
{
|
||||
/// <summary>
|
||||
/// Pure logic for Elo rating calculations.
|
||||
/// Follows the 1v1 competitive formula with dynamic K-factor.
|
||||
/// </summary>
|
||||
public static class EloSystem
|
||||
{
|
||||
public const int RATING_FLOOR = 100;
|
||||
public const int PLACEMENT_GAMES = 30;
|
||||
|
||||
public static EloResult Calculate(
|
||||
int ratingA, int ratingB,
|
||||
int gamesPlayedA, int gamesPlayedB,
|
||||
float resultA) // 1=win, 0=lose, 0.5=draw
|
||||
{
|
||||
// 1. Expected Scores
|
||||
float eA = 1f / (1f + Mathf.Pow(10f, (ratingB - ratingA) / 400f));
|
||||
float eB = 1f - eA;
|
||||
|
||||
// 2. K-Factors
|
||||
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))));
|
||||
// 3. New Ratings
|
||||
int nA = Mathf.Max(RATING_FLOOR, Mathf.RoundToInt(ratingA + kA * (resultA - eA)));
|
||||
int nB = Mathf.Max(RATING_FLOOR, Mathf.RoundToInt(ratingB + kB * ((1f - resultA) - eB)));
|
||||
|
||||
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;
|
||||
private static int GetK(int rating, int gamesPlayed)
|
||||
{
|
||||
if (gamesPlayed < PLACEMENT_GAMES) return 40;
|
||||
if (rating < 1200) return 32;
|
||||
if (rating < 2000) return 24;
|
||||
return 16;
|
||||
}
|
||||
|
||||
public static string GetRank(int rating)
|
||||
{
|
||||
@@ -36,29 +52,13 @@ namespace Hallucinate.Game
|
||||
|
||||
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;
|
||||
if (rating < 800) return "#8A8A8A"; // Iron
|
||||
if (rating < 1000) return "#CD7F32"; // Bronze
|
||||
if (rating < 1200) return "#C0C0C0"; // Silver
|
||||
if (rating < 1500) return "#FFD700"; // Gold
|
||||
if (rating < 1800) return "#4DC8A0"; // Platinum
|
||||
if (rating < 2100) return "#7B6EE8"; // Diamond
|
||||
return "#E84D8A"; // Master
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user