Files
BABA_YAGA/Assets/Scripts/Network/MatchResultManager.cs
2026-04-29 13:10:00 +07:00

78 lines
2.6 KiB
C#

using Fusion;
using UnityEngine;
using Hallucinate.Game;
using Hallucinate.UI;
using System.Linq;
namespace Hallucinate.Network
{
public class MatchResultManager : NetworkBehaviour
{
public static MatchResultManager Instance { get; private set; }
public override void Spawned()
{
if (Object.HasStateAuthority) Instance = this;
}
[Rpc(RpcSources.StateAuthority, RpcTargets.All)]
public void RPC_BroadcastResult(PlayerRef winner, EloResult eloResult)
{
Debug.Log($"Game Over! Winner: {winner}. Elo updated.");
// Update local Elo display and show Result UI
if (Runner.LocalPlayer == winner)
{
ShowResultUI(true, eloResult.DeltaA, eloResult.NewRatingA);
}
else
{
ShowResultUI(false, eloResult.DeltaB, eloResult.NewRatingB);
}
}
private void ShowResultUI(bool isWin, int delta, int newRating)
{
var hud = FindFirstObjectByType<HUDController>();
if (hud != null)
{
// In a real scenario, we might push a new Result screen
// For now, let's assume HUD has a result panel
Debug.Log($"RESULT: {(isWin ? "WIN" : "LOSS")} | Delta: {delta} | New Rating: {newRating}");
// Save to PlayerPrefs as a dummy "Server" persistence
PlayerPrefs.SetInt("EloRating", newRating);
int gamesPlayed = PlayerPrefs.GetInt("GamesPlayed", 0);
PlayerPrefs.SetInt("GamesPlayed", gamesPlayed + 1);
PlayerPrefs.Save();
}
}
public void ProcessMatchEnd(PlayerRef winner)
{
if (!Object.HasStateAuthority) return;
// Get ratings for both players
// In a real game, these would come from the server/metadata
int ratingA = PlayerPrefs.GetInt("EloRating", 1000);
int ratingB = 1000; // Placeholder for opponent
int gamesA = PlayerPrefs.GetInt("GamesPlayed", 0);
int gamesB = 0; // Placeholder
float resultA = (Runner.LocalPlayer == winner) ? 1.0f : 0.0f;
EloResult elo = EloSystem.Calculate(ratingA, ratingB, gamesA, gamesB, resultA);
RPC_BroadcastResult(winner, elo);
// Shut down runner after some delay
Invoke(nameof(ShutdownRunner), 5.0f);
}
private void ShutdownRunner()
{
Runner.Shutdown();
}
}
}