diff --git a/game/Assets/Scripts/GameManager.cs b/game/Assets/Scripts/GameManager.cs
index fff8985..b32d042 100644
--- a/game/Assets/Scripts/GameManager.cs
+++ b/game/Assets/Scripts/GameManager.cs
@@ -13,7 +13,6 @@ public class GameManager : MonoBehaviour
public GameObject playerRoot;
public SpectatorCamera spectatorCamera;
public GameHUD gameHUD;
- public EliminationOverlay eliminationOverlay;
public GamePhase CurrentPhase { get; private set; } = GamePhase.Lobby;
public bool IsLocalEliminated { get; private set; } = false;
@@ -93,7 +92,6 @@ public class GameManager : MonoBehaviour
{
IsLocalEliminated = true;
TransitionTo(GamePhase.Eliminated);
- eliminationOverlay?.ShowEliminated();
}
}
@@ -102,7 +100,6 @@ public class GameManager : MonoBehaviour
if (sessionId == NetworkManager.Instance?.LocalSessionId)
{
TransitionTo(GamePhase.Qualified);
- eliminationOverlay?.ShowQualified();
}
}
@@ -122,7 +119,6 @@ public class GameManager : MonoBehaviour
void HandleGameEnd(string winner)
{
- eliminationOverlay?.ShowGameEnd(winner);
}
void HandleDisconnected()
diff --git a/game/Assets/Scripts/Race/CheckpointSystem.cs b/game/Assets/Scripts/Race/CheckpointSystem.cs
deleted file mode 100644
index 5e0e90f..0000000
--- a/game/Assets/Scripts/Race/CheckpointSystem.cs
+++ /dev/null
@@ -1,155 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-///
-/// Manages race checkpoints and the finish line.
-/// Place checkpoint GameObjects in order in the Inspector array.
-/// Each checkpoint needs a Collider set to "Is Trigger".
-/// The last checkpoint in the array is treated as the finish line.
-/// Attach to a persistent manager GameObject in the race scene.
-///
-public class CheckpointSystem : MonoBehaviour
-{
- public static CheckpointSystem Instance { get; private set; }
-
- [Header("Checkpoints (in order — last one = finish line)")]
- public Collider[] checkpoints;
-
- [Header("Visuals")]
- [Tooltip("Material to apply to active (next) checkpoint")]
- public Material checkpointActiveMaterial;
- [Tooltip("Material to apply to passed checkpoints")]
- public Material checkpointPassedMaterial;
- [Tooltip("Material to apply to finish line")]
- public Material finishLineMaterial;
-
- public int LocalCheckpointIndex => _localCheckpointIndex;
- public bool RaceStarted { get; private set; }
-
- private int _localCheckpointIndex = 0;
- private Renderer[] _checkpointRenderers;
- private bool _finished = false;
-
- void Awake()
- {
- Instance = this;
- }
-
- void Start()
- {
- _checkpointRenderers = new Renderer[checkpoints.Length];
- for (int i = 0; i < checkpoints.Length; i++)
- {
- _checkpointRenderers[i] = checkpoints[i].GetComponent();
- checkpoints[i].gameObject.name = $"Checkpoint_{i}";
-
- // Auto-assign index so trigger knows its position in the sequence
- var trigger = checkpoints[i].GetComponent();
- if (trigger != null) trigger.checkpointIndex = i;
- }
-
- // Tell HUD total checkpoints
- GameHUD.TotalCheckpoints = checkpoints.Length;
- UpdateCheckpointVisuals();
- }
-
- /// Called by CheckpointTrigger on each checkpoint object.
- public void OnLocalPlayerHitCheckpoint(int index)
- {
- if (_finished) return;
- if (index != _localCheckpointIndex) return;
-
- // CP0 = start gate: activate race HUD and start local timer
- if (index == 0)
- {
- RaceStarted = true;
- GameHUD.Instance?.SetLocalRaceActive(true);
- }
-
- _localCheckpointIndex++;
- StatsTracker.Instance?.RegisterCheckpoint();
- NetworkManager.Instance?.SendCheckpoint(_localCheckpointIndex);
-
- Debug.Log($"[Checkpoint] Reached {_localCheckpointIndex}/{checkpoints.Length}");
-
- // Update HUD
- GameHUD.Instance?.SetCheckpoint(_localCheckpointIndex, checkpoints.Length);
-
- UpdateCheckpointVisuals();
-
- if (_localCheckpointIndex >= checkpoints.Length)
- {
- _finished = true;
- StatsTracker.Instance?.RegisterFinish(GameHUD.Instance != null ? GameHUD.Instance.LocalRaceTimer : 0f);
- Debug.Log("[Checkpoint] FINISH LINE reached!");
- }
- else
- {
- StartCoroutine(FlashCheckpoint(_localCheckpointIndex));
- }
- }
-
- public void ResetForRound()
- {
- _localCheckpointIndex = 0;
- _finished = false;
- RaceStarted = false;
- UpdateCheckpointVisuals();
- GameHUD.Instance?.SetLocalRaceActive(false);
- }
-
- private void UpdateCheckpointVisuals()
- {
- for (int i = 0; i < checkpoints.Length; i++)
- {
- if (_checkpointRenderers[i] == null) continue;
-
- if (i < _localCheckpointIndex)
- {
- // Passed
- if (checkpointPassedMaterial != null)
- _checkpointRenderers[i].material = checkpointPassedMaterial;
- _checkpointRenderers[i].enabled = false; // hide passed checkpoints
- }
- else if (i == _localCheckpointIndex)
- {
- // Active (next to hit)
- _checkpointRenderers[i].enabled = true;
- if (i == checkpoints.Length - 1 && finishLineMaterial != null)
- _checkpointRenderers[i].material = finishLineMaterial;
- else if (checkpointActiveMaterial != null)
- _checkpointRenderers[i].material = checkpointActiveMaterial;
- }
- else
- {
- // Upcoming (not yet active)
- _checkpointRenderers[i].enabled = true;
- }
- }
- }
-
- private IEnumerator FlashCheckpoint(int index)
- {
- if (index < 0 || index >= checkpoints.Length) yield break;
- var rend = _checkpointRenderers[index];
- if (rend == null) yield break;
-
- Color orig = rend.material.HasProperty("_BaseColor")
- ? rend.material.GetColor("_BaseColor")
- : rend.material.color;
-
- for (int i = 0; i < 3; i++)
- {
- SetRendererColor(rend, new Color(0.3f, 1f, 0.5f));
- yield return new WaitForSeconds(0.08f);
- SetRendererColor(rend, orig);
- yield return new WaitForSeconds(0.08f);
- }
- }
-
- private static void SetRendererColor(Renderer rend, Color c)
- {
- if (rend.material.HasProperty("_BaseColor")) rend.material.SetColor("_BaseColor", c);
- else rend.material.color = c;
- }
-}
diff --git a/game/Assets/Scripts/Race/CheckpointTrigger.cs b/game/Assets/Scripts/Race/CheckpointTrigger.cs
deleted file mode 100644
index 521cc2a..0000000
--- a/game/Assets/Scripts/Race/CheckpointTrigger.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-using UnityEngine;
-
-///
-/// Attach to each checkpoint GameObject (which must have a trigger Collider).
-/// Set the checkpointIndex in the Inspector to match the checkpoint's position in the sequence.
-///
-public class CheckpointTrigger : MonoBehaviour
-{
- [Tooltip("Index in the CheckpointSystem.checkpoints array (0-based)")]
- public int checkpointIndex = 0;
-
- void OnTriggerEnter(Collider other)
- {
- // Only trigger for the local player (has PlayerController)
- if (other.GetComponent() == null) return;
- CheckpointSystem.Instance?.OnLocalPlayerHitCheckpoint(checkpointIndex);
- }
-}
diff --git a/game/Assets/Scripts/Stats/StatsTracker.cs b/game/Assets/Scripts/Stats/StatsTracker.cs
index def13ff..1924349 100644
--- a/game/Assets/Scripts/Stats/StatsTracker.cs
+++ b/game/Assets/Scripts/Stats/StatsTracker.cs
@@ -17,11 +17,9 @@ public class StatsTracker : MonoBehaviour
private float _totalDistance;
private int _totalJumps;
private float _maxSpeed;
- private float _bestRaceTime; // 0 = not set
private int _racesPlayed;
private int _qualifications;
private int _eliminations;
- private int _checkpointsTotal;
private int _bumpsGiven;
private float _totalPlaytime;
@@ -104,18 +102,6 @@ public class StatsTracker : MonoBehaviour
_bumpsGiven++;
}
- public void RegisterCheckpoint()
- {
- _checkpointsTotal++;
- }
-
- public void RegisterFinish(float raceTime)
- {
- if (raceTime <= 0f) return;
- if (_bestRaceTime <= 0f || raceTime < _bestRaceTime)
- _bestRaceTime = raceTime;
- }
-
// ─── Event handlers ──────────────────────────────────────────────────
private void OnConnected()
@@ -187,11 +173,11 @@ public class StatsTracker : MonoBehaviour
totalDistance = _totalDistance,
totalJumps = _totalJumps,
maxSpeed = _maxSpeed,
- bestRaceTime = _bestRaceTime > 0f ? _bestRaceTime : 0f,
+
racesPlayed = _racesPlayed,
qualifications = _qualifications,
eliminations = _eliminations,
- checkpointsTotal = _checkpointsTotal,
+
bumpsGiven = _bumpsGiven,
totalPlaytime = _totalPlaytime,
}
@@ -224,11 +210,9 @@ public class StatsTracker : MonoBehaviour
public float totalDistance;
public int totalJumps;
public float maxSpeed;
- public float bestRaceTime;
public int racesPlayed;
public int qualifications;
public int eliminations;
- public int checkpointsTotal;
public int bumpsGiven;
public float totalPlaytime;
}
diff --git a/game/Assets/Scripts/UI/EliminationOverlay.cs b/game/Assets/Scripts/UI/EliminationOverlay.cs
deleted file mode 100644
index ca18320..0000000
--- a/game/Assets/Scripts/UI/EliminationOverlay.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-using System.Collections;
-using UnityEngine;
-
-///
-/// Full-screen overlay for elimination, qualification, and game-end events.
-/// Fade in → hold → fade out automatically.
-///
-public class EliminationOverlay : MonoBehaviour
-{
- private enum OverlayType { None, Eliminated, Qualified, GameEnd }
-
- private OverlayType _type = OverlayType.None;
- private float _alpha = 0f;
- private string _winnerName = "";
-
- private static Texture2D _bgTex;
-
- void Start()
- {
- if (_bgTex == null)
- {
- _bgTex = new Texture2D(1, 1);
- _bgTex.SetPixel(0, 0, Color.white);
- _bgTex.Apply();
- }
- }
-
- public void ShowEliminated() => StartCoroutine(ShowOverlay(OverlayType.Eliminated, 3f));
- public void ShowQualified() => StartCoroutine(ShowOverlay(OverlayType.Qualified, 2.5f));
- public void ShowGameEnd(string winner)
- {
- _winnerName = winner;
- StartCoroutine(ShowOverlay(OverlayType.GameEnd, 6f));
- }
-
- private IEnumerator ShowOverlay(OverlayType type, float holdTime)
- {
- _type = type;
-
- // Fade in
- float t = 0f;
- while (t < 0.3f)
- {
- t += Time.deltaTime;
- _alpha = Mathf.Clamp01(t / 0.3f);
- yield return null;
- }
- _alpha = 1f;
-
- // Hold
- yield return new WaitForSeconds(holdTime);
-
- // Fade out
- t = 0f;
- while (t < 0.4f)
- {
- t += Time.deltaTime;
- _alpha = 1f - Mathf.Clamp01(t / 0.4f);
- yield return null;
- }
-
- _alpha = 0f;
- _type = OverlayType.None;
- }
-
- void OnGUI()
- {
- if (_type == OverlayType.None || _alpha < 0.01f) return;
-
- // Background tint
- Color bgColor = _type switch
- {
- OverlayType.Eliminated => new Color(0.7f, 0.05f, 0.05f, _alpha * 0.55f),
- OverlayType.Qualified => new Color(0.05f, 0.55f, 0.15f, _alpha * 0.45f),
- OverlayType.GameEnd => new Color(0.05f, 0.05f, 0.3f, _alpha * 0.6f),
- _ => Color.clear
- };
- GUI.color = bgColor;
- GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), _bgTex);
- GUI.color = Color.white;
-
- // Main text
- var mainStyle = new GUIStyle(GUI.skin.label)
- {
- alignment = TextAnchor.MiddleCenter,
- fontSize = 72,
- fontStyle = FontStyle.Bold,
- };
-
- string mainText = _type switch
- {
- OverlayType.Eliminated => "ÉLIMINÉ !",
- OverlayType.Qualified => "QUALIFIÉ !",
- OverlayType.GameEnd => "VICTOIRE !",
- _ => ""
- };
-
- Color textColor = _type switch
- {
- OverlayType.Eliminated => new Color(1f, 0.3f, 0.2f, _alpha),
- OverlayType.Qualified => new Color(0.3f, 1f, 0.5f, _alpha),
- OverlayType.GameEnd => new Color(1f, 0.85f, 0.1f, _alpha),
- _ => Color.clear
- };
- mainStyle.normal.textColor = textColor;
- GUI.Label(new Rect(0, Screen.height * 0.35f, Screen.width, 100f), mainText, mainStyle);
-
- // Sub text
- var subStyle = new GUIStyle(GUI.skin.label)
- {
- alignment = TextAnchor.MiddleCenter,
- fontSize = 26,
- fontStyle = FontStyle.Bold,
- };
- subStyle.normal.textColor = new Color(1f, 1f, 1f, _alpha * 0.85f);
-
- string subText = _type switch
- {
- OverlayType.Eliminated => "Meilleure chance la prochaine fois !",
- OverlayType.Qualified => "Tu passes au round suivant !",
- OverlayType.GameEnd => $"Gagnant : {_winnerName}",
- _ => ""
- };
- GUI.Label(new Rect(0, Screen.height * 0.35f + 100f, Screen.width, 50f), subText, subStyle);
-
- // Emoji accent
- var emojiStyle = new GUIStyle(GUI.skin.label)
- {
- alignment = TextAnchor.MiddleCenter,
- fontSize = 48,
- };
- emojiStyle.normal.textColor = new Color(1f, 1f, 1f, _alpha * 0.7f);
- string emoji = _type switch
- {
- OverlayType.Eliminated => "💀",
- OverlayType.Qualified => "✅",
- OverlayType.GameEnd => "🏆",
- _ => ""
- };
- GUI.Label(new Rect(0, Screen.height * 0.35f - 80f, Screen.width, 70f), emoji, emojiStyle);
- }
-}
diff --git a/game/Assets/Scripts/UI/GameHUD.cs b/game/Assets/Scripts/UI/GameHUD.cs
index 405a17d..5bc3823 100644
--- a/game/Assets/Scripts/UI/GameHUD.cs
+++ b/game/Assets/Scripts/UI/GameHUD.cs
@@ -16,9 +16,6 @@ public class GameHUD : MonoBehaviour
private float _roundTimer = 0f;
private bool _timerRunning = false;
- // Checkpoint info (set by CheckpointSystem)
- private int _checkpointsCurrent = 0;
- private int _checkpointsTotal = 5;
// Local race state (activated when CP0 gate is crossed, independent of server phase)
private bool _localRaceActive = false;
@@ -64,7 +61,6 @@ public class GameHUD : MonoBehaviour
_gameMode = mode;
_roundTimer = 0f;
_timerRunning = true;
- _checkpointsCurrent = 0;
}
void OnPhaseChanged(string phase)
@@ -95,7 +91,7 @@ public class GameHUD : MonoBehaviour
public void SetCountdown(float v) => _countdown = v;
public void SetRoundInfo(int round, string mode) { _roundNumber = round; _gameMode = mode; }
public void SetTotalRounds(int n) => _totalRounds = n;
- public void SetCheckpoint(int current, int total) { _checkpointsCurrent = current; _checkpointsTotal = total; }
+
public void SetLocalRaceActive(bool active)
{
@@ -207,38 +203,11 @@ public class GameHUD : MonoBehaviour
$"{mins:00}:{secs:00}", timerStyle);
}
- // ── Race: checkpoint progress (bottom center) ─────────────────────
- if (_gameMode == "race" && (_phase == "playing" || _localRaceActive))
- {
- float bw = 300f;
- float bx = (Screen.width - bw) / 2f;
- float by = Screen.height - 60f;
-
- GUI.color = new Color(0.08f, 0.08f, 0.12f, 0.85f);
- GUI.DrawTexture(new Rect(bx - 8f, by - 8f, bw + 16f, 36f), _bgTex);
- GUI.color = Color.white;
-
- // Background bar
- GUI.color = new Color(0.2f, 0.2f, 0.28f, 1f);
- GUI.DrawTexture(new Rect(bx, by, bw, 20f), _barBgTex);
-
- // Fill
- float fill = _checkpointsTotal > 0 ? (float)_checkpointsCurrent / _checkpointsTotal : 0f;
- GUI.color = new Color(0.3f, 1f, 0.5f, 1f);
- GUI.DrawTexture(new Rect(bx, by, bw * fill, 20f), _barFillTex);
- GUI.color = Color.white;
-
- var cpStyle = new GUIStyle(GUI.skin.label) { alignment = TextAnchor.MiddleCenter, fontSize = 11 };
- cpStyle.normal.textColor = Color.white;
- GUI.Label(new Rect(bx, by, bw, 20f),
- $"Checkpoint {_checkpointsCurrent} / {_checkpointsTotal}", cpStyle);
- }
-
}
// Static accessors for cross-script use
public static GameHUD Instance { get; private set; }
- public static int TotalCheckpoints { get; set; } = 5;
+
// Cached values updated from NetworkManager state polling
private int _cachedPlayersAlive = 0;