using System.Collections.Generic; using Godot; using Mr.BrickAdventures.Progression; using Mr.BrickAdventures.scripts.Resources; namespace Mr.BrickAdventures.Autoloads; /// /// Translates domain events into Godot signals on the . /// /// /// /// The adapter half of ADR-0004. Aggregates raise plain records with no engine dependency; this is the /// single place that turns them into signals, which is what makes "state changed ⇒ signal fired" /// un-bypassable. Existing subscribers and scene wiring keep working unchanged. /// /// /// Not a Node — it has no lifecycle of its own. The composition root owns one and hands it every /// batch of drained events. /// /// public sealed class ProgressionEventRepublisher { private readonly LevelCatalogue _catalogue; private readonly SceneTree _tree; public ProgressionEventRepublisher(LevelCatalogue catalogue, SceneTree tree) { _catalogue = catalogue; _tree = tree; } public void Publish(IReadOnlyList events) { foreach (var @event in events) Publish(@event); } private void Publish(ProgressionEvent @event) { switch (@event) { case LevelStarted started: // The existing signal is keyed by array index because GhostManager names its replay // files ghost_level_{index}.json. Transitional: once ghosts key on LevelId this // becomes a straight pass-through and the index lookup goes away. EventBus.EmitLevelStarted(IndexOf(started.Level), _tree.CurrentScene); break; case RunEnded: EventBus.EmitRunEnded(); break; case AchievementUnlocked unlocked: EventBus.EmitAchievementUnlocked(unlocked.Achievement.Value); break; case LivesChanged lives: EventBus.EmitLivesChanged(lives.Remaining.Value); break; case TotalCoinsChanged coins: EventBus.EmitCoinsChanged(coins.Total.Value); break; case SkillSetChanged: EventBus.EmitSkillSetChanged(); break; default: GD.PushWarning($"No signal is published for domain event {@event.GetType().Name}."); break; } } private int IndexOf(LevelId level) { for (var i = 0; i < _catalogue.Levels.Count; i++) if (_catalogue.Levels[i]?.Id == level.Value) return i; return -1; } }