using System; using System.Collections.Generic; using System.Linq; using Code.Example.Race.Racer.Player; using Code.Example.Race.Track; using Code.Infrastructure.EventBus; using Reflex.Attributes; namespace Code.Example.Race { public class RaceScores : IRacerPassedCheckpointHandler, IDisposable, IPlayerPassedCheckpointHandler { private Dictionary _scores = new(); private EventBus _eventBus; public RaceScores(EventBus eventBus) { _eventBus = eventBus; _eventBus.Subscribe(this); } public void SubscribeRacer(Racer.Racer racer) { _scores.Add(racer, new ScoreData()); } public void ChangeScore(Racer.Racer racer, int additionalScore) { _scores[racer].checkpointsPassed += additionalScore; _eventBus.RaiseEvent(x=> x.ScoreChanged(racer,_scores[racer], GetScores())); } public void LapPassed(Racer.Racer racer) { _scores[racer].lapsPassed++; _eventBus.RaiseEvent(x=> x.ScoreChanged(racer,_scores[racer], GetScores())); if (_scores[racer].lapsPassed >= _raceTrackData.trackData.LapCount) _eventBus.RaiseEvent(x=> x.RaceGameEnded(this)); } public void UnsubscribeRacer(Racer.Racer racer) { _scores.Remove(racer); } public List> GetScores() { return _scores.OrderByDescending(x => x.Value.checkpointsPassed).ToList(); } public void OnRacerPassedCheckpoint(Racer.Racer racer) => ChangeScore(racer,1); public void Dispose() { _eventBus.Unsubscribe(this); } [Inject] private RaceTrackData _raceTrackData; public void OnPlayerPassedCheckpoint(Racer.Racer racer) { var player = (PlayerRacer)racer; _raceTrackData.trackData.Checkpoints[player.CurrentWaypointIndex].Show(); } public void OnPlayerLapPassed(Racer.Racer racer) { } } public class ScoreData { public int checkpointsPassed; public int lapsPassed; } public interface IScoreChangedHandle : IGlobalSubscriber { void ScoreChanged(Racer.Racer racer, ScoreData score, List> scores); } }