using Barotrauma; using MoreLevelContent.Shared.Generation.Interfaces; using MoreLevelContent.Shared.Generation.Pirate; using MoreLevelContent.Shared.Utils; using System.Collections.Generic; namespace MoreLevelContent.Shared.Generation { public class LevelContentProducer : IActive { /// /// If the the generator has outposts to spawn or not /// public bool Active { get; private set; } public LevelContentProducer() { Log.Verbose("LevelContentProducer::ctr.."); AddDirector(PirateOutpostDirector.Instance); AddDirector(MissionGenerationDirector.Instance); AddDirector(CaveGenerationDirector.Instance); // AddDirector(PirateEncounterDirector.Instance); } private readonly List submarineGenerators = new List(); private readonly List npcGenerators = new List(); private readonly List levelStartGenerators = new List(); private readonly List roundStart = new List(); public void Cleanup() => Log.Verbose("LevelContentProducer::Cleanup"); public void AddDirector(GenerationDirector director) where Director : class { director.Setup(); if (!director.Active) { Log.Error($"Did not add director {director} as it was not active!"); } Active = true; if (director is IGenerateSubmarine) { submarineGenerators.Add(director as IGenerateSubmarine); Log.Verbose($"Added {director} to Submarine generators"); } if (director is IGenerateNPCs) { npcGenerators.Add(director as IGenerateNPCs); Log.Verbose($"Added {director} to NPC generators"); } if (director is ILevelStartGenerate) { levelStartGenerators.Add(director as ILevelStartGenerate); Log.Verbose($"Added {director} to level start generators"); } if (director is IRoundStatus) { roundStart.Add(director as IRoundStatus); Log.Verbose($"Added {director} to round start generators"); } } internal void LevelGenerate(LevelData levelData, bool mirror) { SubPlacementUtils.ClearBlockedRects(); Log.Verbose("Called level generate"); foreach (ILevelStartGenerate levelStart in levelStartGenerators) { levelStart.OnLevelGenerationStart(levelData, mirror); } } public void StartRound() { Log.Verbose("Called start round"); foreach (IRoundStatus generator in roundStart) { generator.BeforeRoundStart(); } } public void EndRound() { Log.Verbose("Called end round"); foreach (IRoundStatus generator in roundStart) { generator.RoundEnd(); } } public void CreateWrecks() { Log.Verbose("Called create wrecks"); foreach (IGenerateSubmarine generateSubmarine in submarineGenerators) { generateSubmarine.GenerateSub(); } } public void SpawnNPCs() { Log.Verbose("Called spawn NPCS"); foreach (IGenerateNPCs generateNPCs in npcGenerators) { generateNPCs.SpawnNPCs(); } } } }