using System.Text.Json.Serialization;
using SPTarkov.Server.Core.Models.Common;
using SPTarkov.Server.Core.Models.Eft.Common;
namespace SPTarkov.Server.Core.Models.Spt.Config;
public record LocationConfig : BaseConfig
{
[JsonPropertyName("kind")]
public override string Kind { get; set; } = "spt-location";
///
/// Rogues are classified as bosses and spawn immediately, this can result in no scavs spawning, delay rogues spawning to allow scavs to spawn first
///
[JsonPropertyName("rogueLighthouseSpawnTimeSettings")]
public required RogueLighthouseSpawnTimeSettings RogueLighthouseSpawnTimeSettings { get; set; }
[JsonPropertyName("looseLootMultiplier")]
public required Dictionary LooseLootMultiplier { get; set; }
[JsonPropertyName("staticLootMultiplier")]
public required Dictionary StaticLootMultiplier { get; set; }
///
/// Custom bot waves to add to a locations base json on game start if addCustomBotWavesToMaps is true
///
[JsonPropertyName("customWaves")]
public CustomWaves? CustomWaves { get; set; }
///
/// Open zones to add to map
///
[JsonPropertyName("openZones")]
public required Dictionary> OpenZones { get; set; }
///
/// Key = map id, value = dict of item tpls that should only have x forced loot spawn position
///
[JsonPropertyName("lootMaxSpawnLimits")]
public required Dictionary> LootMaxSpawnLimits { get; set; }
///
/// How many attempts should be taken to fit an item into a container before giving up
///
[JsonPropertyName("fitLootIntoContainerAttempts")]
public int FitLootIntoContainerAttempts { get; set; }
///
/// Add all possible zones to each maps `OpenZones` property
///
[JsonPropertyName("addOpenZonesToAllMaps")]
public bool AddOpenZonesToAllMaps { get; set; }
///
/// Allow addition of custom bot waves designed by SPT to be added to maps - defined in configs/location.json.customWaves
///
[JsonPropertyName("addCustomBotWavesToMaps")]
public bool AddCustomBotWavesToMaps { get; set; }
///
/// Should the limits defined inside botTypeLimits to be applied to locations on game start
///
[JsonPropertyName("enableBotTypeLimits")]
public bool EnableBotTypeLimits { get; set; }
///
/// Add limits to a locations base.MinMaxBots array if enableBotTypeLimits is true
///
[JsonPropertyName("botTypeLimits")]
public required Dictionary> BotTypeLimits { get; set; }
///
/// Container randomisation settings
///
[JsonPropertyName("containerRandomisationSettings")]
public required ContainerRandomisationSettings ContainerRandomisationSettings { get; set; }
///
/// How full must a random loose magazine be %
///
[JsonPropertyName("minFillLooseMagazinePercent")]
public int MinFillLooseMagazinePercent { get; set; }
///
/// How full must a random static magazine be %
///
[JsonPropertyName("minFillStaticMagazinePercent")]
public int MinFillStaticMagazinePercent { get; set; }
[JsonPropertyName("allowDuplicateItemsInStaticContainers")]
public bool AllowDuplicateItemsInStaticContainers { get; set; }
///
/// Chance loose magazines have ammo in them TODO - rename to dynamicMagazineLootHasAmmoChancePercent
///
[JsonPropertyName("magazineLootHasAmmoChancePercent")]
public int MagazineLootHasAmmoChancePercent { get; set; }
///
/// Chance static magazines have ammo in them
///
[JsonPropertyName("staticMagazineLootHasAmmoChancePercent")]
public int StaticMagazineLootHasAmmoChancePercent { get; set; }
///
/// Key: map, value: loose loot ids to ignore
///
[JsonPropertyName("looseLootBlacklist")]
public required Dictionary> LooseLootBlacklist { get; set; }
///
/// Key: map, value: settings to control how long scav raids are
///
[JsonPropertyName("scavRaidTimeSettings")]
public required ScavRaidTimeSettings ScavRaidTimeSettings { get; set; }
///
/// Settings to adjust mods for lootable equipment in raid
///
[JsonPropertyName("equipmentLootSettings")]
public required EquipmentLootSettings EquipmentLootSettings { get; set; }
///
/// Min percentage to set raider spawns at, -1 makes no changes
///
[JsonPropertyName("reserveRaiderSpawnChanceOverrides")]
public required ReserveRaiderSpawnChanceOverrides ReserveRaiderSpawnChanceOverrides { get; set; }
///
/// Containers to remove all children from when generating static/loose loot
///
[JsonPropertyName("tplsToStripChildItemsFrom")]
public required HashSet TplsToStripChildItemsFrom { get; set; }
///
/// Map ids players cannot visit
///
[JsonPropertyName("nonMaps")]
public required HashSet NonMaps { get; set; }
[JsonPropertyName("transitSettings")]
public TransitSettings? TransitSettings { get; set; }
}
public record TransitSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("effectsToRemove")]
public HashSet? EffectsToRemove { get; set; }
[JsonPropertyName("adjustLimbHealthPoints")]
public bool? AdjustLimbHealthPoints { get; set; }
[JsonPropertyName("limbHealPercent")]
public int? LimbHealPercent { get; set; }
}
public record ReserveRaiderSpawnChanceOverrides
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("nonTriggered")]
public int NonTriggered { get; set; }
[JsonPropertyName("triggered")]
public int Triggered { get; set; }
}
public record EquipmentLootSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
///
/// Percentage chance item will be added to equipment
///
[JsonPropertyName("modSpawnChancePercent")]
public required Dictionary ModSpawnChancePercent { get; set; }
}
public record RogueLighthouseSpawnTimeSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("enabled")]
public bool Enabled { get; set; }
[JsonPropertyName("waitTimeSeconds")]
public int WaitTimeSeconds { get; set; }
}
public record CustomWaves
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
///
/// Bosses spawn on raid start
///
[JsonPropertyName("boss")]
public Dictionary> Boss { get; set; } = [];
[JsonPropertyName("normal")]
public Dictionary> Normal { get; set; } = [];
}
public record BotTypeLimit : MinMax
{
[JsonPropertyName("type")]
public new required string Type { get; set; }
}
public record ContainerRandomisationSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("enabled")]
public bool Enabled { get; set; }
///
/// What maps can use the container randomisation feature
///
[JsonPropertyName("maps")]
public required Dictionary Maps { get; set; }
///
/// Some container types don't work when randomised
///
[JsonPropertyName("containerTypesToNotRandomise")]
public required HashSet ContainerTypesToNotRandomise { get; set; }
[JsonPropertyName("containerGroupMinSizeMultiplier")]
public double ContainerGroupMinSizeMultiplier { get; set; }
[JsonPropertyName("containerGroupMaxSizeMultiplier")]
public double ContainerGroupMaxSizeMultiplier { get; set; }
}
public record ScavRaidTimeSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("settings")]
public required ScavRaidTimeConfigSettings Settings { get; set; }
[JsonPropertyName("maps")]
public required Dictionary Maps { get; set; }
}
public record ScavRaidTimeConfigSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
[JsonPropertyName("trainArrivalDelayObservedSeconds")]
public int TrainArrivalDelayObservedSeconds { get; set; }
}
public record ScavRaidTimeLocationSettings
{
[JsonExtensionData]
public Dictionary? ExtensionData { get; set; }
///
/// Should loot be reduced by same percent length of raid is reduced by
///
[JsonPropertyName("reduceLootByPercent")]
public bool ReduceLootByPercent { get; set; }
///
/// Smallest % of container loot that should be spawned
///
[JsonPropertyName("minStaticLootPercent")]
public double MinStaticLootPercent { get; set; }
///
/// Smallest % of loose loot that should be spawned
///
[JsonPropertyName("minDynamicLootPercent")]
public double MinDynamicLootPercent { get; set; }
///
/// Chance raid time is reduced
///
[JsonPropertyName("reducedChancePercent")]
public double ReducedChancePercent { get; set; }
///
/// How much should raid time be reduced - weighted
///
[JsonPropertyName("reductionPercentWeights")]
public Dictionary ReductionPercentWeights { get; set; } = [];
///
/// Should bot waves be removed / spawn times be adjusted
///
[JsonPropertyName("adjustWaves")]
public bool AdjustWaves { get; set; }
}