using System; using Cysharp.Threading.Tasks; namespace DanieleMarotta.RiversongCodeShowcase { public class OnboardingSystem : GameSystem, IInitializable, IDisposable { [InjectService] private ISignalBus _signalBus; [InjectService] private World _world; [InjectService] private GameConfig _config; public OnboardingSystem(IServiceLocator serviceLocator) : base(serviceLocator) { } public UniTask InitializeAsync() { _signalBus.Subscribe(OnBuildingCreated); _signalBus.Subscribe(OnBuildingUpgraded); _signalBus.Subscribe(OnPathQueryFailed); _signalBus.Subscribe(OnPopulationChanged); return UniTask.CompletedTask; } public void Dispose() { _signalBus.Unsubscribe(OnBuildingCreated); _signalBus.Unsubscribe(OnBuildingUpgraded); _signalBus.Unsubscribe(OnPathQueryFailed); _signalBus.Unsubscribe(OnPopulationChanged); } private void OnBuildingCreated(BuildingCreatedSignal signal) { CompleteEvent(OnboardingEvents.FirstBuildingPlaced); if (!signal.Building.Definition.IsHouse) return; CompleteEvent(OnboardingEvents.FirstHousePlaced); } private void OnBuildingUpgraded(BuildingUpgradedSignal signal) { CompleteEvent(OnboardingEvents.FirstHouseUpgrade); } private void OnPathQueryFailed(PathQueryFailedSignal signal) { if ((signal.TraversalRules & PathTraversalRules.RoadsOnly) == 0) return; CompleteEvent(OnboardingEvents.FirstRoadFailure); } private void OnPopulationChanged(PopulationChangedSignal signal) { if (signal.Population < _config.Onboarding.PopulationMilestone) return; CompleteEvent(OnboardingEvents.FirstPopulationMilestone); } private void CompleteEvent(OnboardingEvents completedEvent) { var onboardingState = _world.OnboardingState; if ((onboardingState.CompletedEvents & completedEvent) != 0) return; onboardingState.CompletedEvents |= completedEvent; _signalBus.Raise(new OnboardingEventCompleted(completedEvent)); } } }