Files
tbd-station-14/Content.Shared/Salvage/SharedSalvageSystem.cs
2023-03-10 16:41:22 +11:00

78 lines
2.7 KiB
C#

using Content.Shared.Dataset;
using Content.Shared.Procedural.Loot;
using Content.Shared.Procedural.Rewards;
using Content.Shared.Random;
using Content.Shared.Random.Helpers;
using Content.Shared.Salvage.Expeditions.Structure;
using Robust.Shared.Prototypes;
namespace Content.Shared.Salvage;
public abstract class SharedSalvageSystem : EntitySystem
{
public static readonly TimeSpan MissionCooldown = TimeSpan.FromMinutes(5);
public static readonly TimeSpan MissionFailedCooldown = TimeSpan.FromMinutes(10);
public static float GetDifficultyModifier(DifficultyRating difficulty)
{
// These should reflect how many salvage staff are expected to be required for the mission.
switch (difficulty)
{
case DifficultyRating.None:
return 1f;
case DifficultyRating.Minor:
return 1.5f;
case DifficultyRating.Moderate:
return 3f;
case DifficultyRating.Hazardous:
return 6f;
case DifficultyRating.Extreme:
return 10f;
default:
throw new ArgumentOutOfRangeException(nameof(difficulty), difficulty, null);
}
}
public static string GetFTLName(DatasetPrototype dataset, int seed)
{
var random = new System.Random(seed);
return $"{dataset.Values[random.Next(dataset.Values.Count)]}-{random.Next(10, 100)}-{(char) (65 + random.Next(26))}";
}
public static string GetFaction(List<string> factions, int seed)
{
var adjustedSeed = new System.Random(seed + 1);
return factions[adjustedSeed.Next(factions.Count)];
}
public static IEnumerable<SalvageLootPrototype> GetLoot(List<string> loots, int seed, IPrototypeManager protoManager)
{
var adjustedSeed = new System.Random(seed + 2);
for (var i = 0; i < loots.Count; i++)
{
var loot = loots[i];
var a = protoManager.Index<WeightedRandomPrototype>(loot);
var lootConfig = a.Pick(adjustedSeed);
yield return protoManager.Index<SalvageLootPrototype>(lootConfig);
}
}
public static ISalvageReward GetReward(WeightedRandomPrototype proto, int seed, IPrototypeManager protoManager)
{
var adjustedSeed = new System.Random(seed + 3);
var rewardProto = proto.Pick(adjustedSeed);
return protoManager.Index<SalvageRewardPrototype>(rewardProto).Reward;
}
#region Structure
public static int GetStructureCount(SalvageStructure structure, int seed)
{
var adjustedSeed = new System.Random(seed + 4);
return adjustedSeed.Next(structure.MinStructures, structure.MaxStructures + 1);
}
#endregion
}