Files
BarotraumaModServer/LocalMods/More Level Content/CSharp/Shared/Store/PirateStore.cs
2026-06-09 00:42:10 +03:00

104 lines
3.7 KiBLFS
C#
Executable File

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Barotrauma;
using Barotrauma.Extensions;
using MoreLevelContent.Shared.Generation;
using static Barotrauma.Level;
namespace MoreLevelContent.Shared.Store
{
public class PirateStore : StoreBase<PirateStore>
{
private List<PirateOutpostDef> pirateOutposts;
private List<PirateNPCSetDef> pirateSets;
public override void Setup()
{
pirateOutposts = new List<PirateOutpostDef>();
pirateSets = new List<PirateNPCSetDef>();
HasContent = FindAndScoreOutpostFiles() && FindAndScoreNPCs();
}
internal PirateOutpostDef FindOutpostWithPath(string path)
{
return pirateOutposts.Find(p => p.SubInfo.FilePath == path);
}
internal void DumpPirateOutposts()
{
if (pirateOutposts.Count == 0)
{
Log.Warn("No pirate outposts found!");
return;
}
foreach (var item in pirateOutposts)
{
Log.Debug(item.SubInfo.FilePath);
}
}
public PirateNPCSetDef GetNPCSetForDiff(float diff, string seed) => GetElementWithPreferedDifficulty(diff, pirateSets, seed);
internal PirateOutpostDef GetPirateOutpostForDiff(float diff, string seed) => GetElementWithPreferedDifficulty(diff, pirateOutposts, seed);
private bool FindAndScoreOutpostFiles()
{
Log.Debug("Collecting pirate outposts...");
var pirateOutpostSets = MissionPrefab.Prefabs.Where(m => m.Tags.Contains("pirateoutpostset"));
Log.Debug($"outposts: {pirateOutpostSets.Count()}");
foreach (var item in pirateOutpostSets)
{
foreach (var outpost in item.ConfigElement.GetChildElements("PirateOutpost"))
{
var path = outpost.GetAttributeContentPath("path");
var min = outpost.GetAttributeInt("mindiff", 0);
var max = outpost.GetAttributeInt("maxdiff", 100);
var placement = outpost.GetAttributeEnum("placement", PlacementType.Bottom);
SubmarineInfo subInfo = new SubmarineInfo(path.Value);
pirateOutposts.Add(new PirateOutpostDef(subInfo, min, max, placement));
}
}
pirateOutposts = pirateOutposts.OrderBy(o => o.SubInfo.Name).ToList();
foreach (var item in pirateOutposts)
{
Log.Verbose(item.DifficultyRange.ToString());
}
if (pirateOutposts.Count > 0)
{
Log.Debug($"Collected {pirateOutposts.Count} pirate outposts");
return true;
}
else
{
Log.Error("Failed to find any pirate outposts!!!");
return false;
}
}
private bool FindAndScoreNPCs()
{
List<MissionPrefab> pirateMissions = MissionPrefab.Prefabs.Where(m => m.Identifier.StartsWith("mlc_mp")).ToList();
foreach (MissionPrefab prefab in pirateMissions)
{
pirateSets.Add(new PirateNPCSetDef(prefab, prefab.Name.Value));
}
Log.Verbose("Sorting sets by their diff ranges...");
pirateSets.Sort();
if (pirateSets.Count == 0)
{
Log.Error("Failed to find pirates to spawn :(");
return false;
}
Log.Verbose($"Collected {pirateSets.Count} pirate NPC sets to choose from.");
return true;
}
}
}