From b52686ea3851e422bffbf8391f5b88f9c75845d4 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 23 Aug 2024 22:09:36 -0400 Subject: [PATCH] Add space debris to salvage magnet (#31113) * add space debris to salvage magnet * multiplication * necessary mercy for NPCs * back and forth on mercy --- .../UI/SalvageMagnetBoundUserInterface.cs | 13 +- .../Magnet/SalvageMagnetDataComponent.cs | 2 +- .../Salvage/SalvageSystem.Magnet.cs | 8 +- Content.Shared/CCVar/CCVars.cs | 2 +- .../Salvage/Magnet/DebrisOffering.cs | 9 ++ .../Salvage/SharedSalvageSystem.Magnet.cs | 112 ++++++++++------- .../Locale/en-US/salvage/salvage-magnet.ftl | 3 + .../Procedural/Magnet/space_debris.yml | 40 ++++++ .../Magnet/space_debris_templates.yml | 115 ++++++++++++++++++ 9 files changed, 251 insertions(+), 53 deletions(-) create mode 100644 Content.Shared/Salvage/Magnet/DebrisOffering.cs create mode 100644 Resources/Prototypes/Procedural/Magnet/space_debris.yml create mode 100644 Resources/Prototypes/Procedural/Magnet/space_debris_templates.yml diff --git a/Content.Client/Salvage/UI/SalvageMagnetBoundUserInterface.cs b/Content.Client/Salvage/UI/SalvageMagnetBoundUserInterface.cs index 7e99426f87..d691f9acef 100644 --- a/Content.Client/Salvage/UI/SalvageMagnetBoundUserInterface.cs +++ b/Content.Client/Salvage/UI/SalvageMagnetBoundUserInterface.cs @@ -53,9 +53,9 @@ public sealed class SalvageMagnetBoundUserInterface : BoundUserInterface option.Claimed = current.ActiveSeed == seed; var claimIndex = i; - option.ClaimPressed += args => + option.ClaimPressed += _ => { - SendMessage(new MagnetClaimOfferEvent() + SendMessage(new MagnetClaimOfferEvent { Index = claimIndex }); @@ -72,20 +72,20 @@ public sealed class SalvageMagnetBoundUserInterface : BoundUserInterface { var count = asteroid.MarkerLayers[resource]; - var container = new BoxContainer() + var container = new BoxContainer { Orientation = BoxContainer.LayoutOrientation.Horizontal, HorizontalExpand = true, }; - var resourceLabel = new Label() + var resourceLabel = new Label { Text = Loc.GetString("salvage-magnet-resources", ("resource", resource)), HorizontalAlignment = Control.HAlignment.Left, }; - var countLabel = new Label() + var countLabel = new Label { Text = Loc.GetString("salvage-magnet-resources-count", ("count", count)), HorizontalAlignment = Control.HAlignment.Right, @@ -98,6 +98,9 @@ public sealed class SalvageMagnetBoundUserInterface : BoundUserInterface option.AddContent(container); } + break; + case DebrisOffering debris: + option.Title = Loc.GetString($"salvage-magnet-debris-{debris.Id}"); break; case SalvageOffering salvage: option.Title = Loc.GetString($"salvage-map-wreck"); diff --git a/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs b/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs index 4c4a222280..07a8fe1f38 100644 --- a/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs +++ b/Content.Server/Salvage/Magnet/SalvageMagnetDataComponent.cs @@ -44,7 +44,7 @@ public sealed partial class SalvageMagnetDataComponent : Component public List Offered = new(); [DataField] - public int OfferCount = 6; + public int OfferCount = 5; [DataField] public int ActiveSeed; diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs index 57a57d3c63..81db78fb20 100644 --- a/Content.Server/Salvage/SalvageSystem.Magnet.cs +++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Content.Server.Salvage.Magnet; using Content.Shared.Humanoid; using Content.Shared.Mobs.Components; +using Content.Shared.Procedural; using Content.Shared.Radio; using Content.Shared.Salvage.Magnet; using Robust.Server.Maps; @@ -269,6 +270,11 @@ public sealed partial class SalvageSystem var grid = _mapManager.CreateGridEntity(salvMap); await _dungeon.GenerateDungeonAsync(asteroid.DungeonConfig, grid.Owner, grid.Comp, Vector2i.Zero, seed); break; + case DebrisOffering debris: + var debrisProto = _prototypeManager.Index(debris.Id); + var debrisGrid = _mapManager.CreateGridEntity(salvMap); + await _dungeon.GenerateDungeonAsync(debrisProto, debrisGrid.Owner, debrisGrid.Comp, Vector2i.Zero, seed); + break; case SalvageOffering wreck: var salvageProto = wreck.SalvageMap; @@ -309,7 +315,7 @@ public sealed partial class SalvageSystem bounds = bounds?.Union(childAABB) ?? childAABB; // Update mass scanner names as relevant. - if (offering is AsteroidOffering) + if (offering is AsteroidOffering or DebrisOffering) { _metaData.SetEntityName(mapChild, Loc.GetString("salvage-asteroid-name")); _gravity.EnableGravity(mapChild); diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 7e61ec8a58..c3307c53fb 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2134,7 +2134,7 @@ namespace Content.Shared.CCVar /// Whether or not world generation is enabled. /// public static readonly CVarDef WorldgenEnabled = - CVarDef.Create("worldgen.enabled", true, CVar.SERVERONLY); + CVarDef.Create("worldgen.enabled", false, CVar.SERVERONLY); /// /// The worldgen config to use. diff --git a/Content.Shared/Salvage/Magnet/DebrisOffering.cs b/Content.Shared/Salvage/Magnet/DebrisOffering.cs new file mode 100644 index 0000000000..953b9dcad9 --- /dev/null +++ b/Content.Shared/Salvage/Magnet/DebrisOffering.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Salvage.Magnet; + +/// +/// Space debis offered for the magnet. +/// +public record struct DebrisOffering : ISalvageMagnetOffering +{ + public string Id; +} diff --git a/Content.Shared/Salvage/SharedSalvageSystem.Magnet.cs b/Content.Shared/Salvage/SharedSalvageSystem.Magnet.cs index 7285e36126..a530844598 100644 --- a/Content.Shared/Salvage/SharedSalvageSystem.Magnet.cs +++ b/Content.Shared/Salvage/SharedSalvageSystem.Magnet.cs @@ -5,6 +5,7 @@ using Content.Shared.Random; using Content.Shared.Random.Helpers; using Content.Shared.Salvage.Magnet; using Robust.Shared.Prototypes; +using Robust.Shared.Random; using Robust.Shared.Utility; namespace Content.Shared.Salvage; @@ -13,6 +14,13 @@ public abstract partial class SharedSalvageSystem { private readonly List _salvageMaps = new(); + private Dictionary _offeringWeights = new() + { + { new AsteroidOffering(), 3.0f }, + { new DebrisOffering(), 4.0f }, + { new SalvageOffering(), 1.0f } + }; + private readonly List> _asteroidConfigs = new() { "BlobAsteroid", @@ -25,61 +33,75 @@ public abstract partial class SharedSalvageSystem private readonly MinMax _asteroidOreCount = new(5, 7); + private readonly List> _debrisConfigs = new() + { + "ChunkDebris" + }; + public ISalvageMagnetOffering GetSalvageOffering(int seed) { var rand = new System.Random(seed); - // Asteroid seed - if (seed % 2 == 0) + var type = SharedRandomExtensions.Pick(_offeringWeights, rand); + switch (type) { - var configId = _asteroidConfigs[rand.Next(_asteroidConfigs.Count)]; - var configProto =_proto.Index(configId); - var layers = new Dictionary(); + case AsteroidOffering: + var configId = _asteroidConfigs[rand.Next(_asteroidConfigs.Count)]; + var configProto =_proto.Index(configId); + var layers = new Dictionary(); - var data = new DungeonData(); - data.Apply(configProto.Data); + var data = new DungeonData(); + data.Apply(configProto.Data); - var config = new DungeonConfig() - { - Data = data, - Layers = new(configProto.Layers), - MaxCount = configProto.MaxCount, - MaxOffset = configProto.MaxOffset, - MinCount = configProto.MinCount, - MinOffset = configProto.MinOffset, - ReserveTiles = configProto.ReserveTiles - }; + var config = new DungeonConfig + { + Data = data, + Layers = new(configProto.Layers), + MaxCount = configProto.MaxCount, + MaxOffset = configProto.MaxOffset, + MinCount = configProto.MinCount, + MinOffset = configProto.MinOffset, + ReserveTiles = configProto.ReserveTiles + }; - var count = _asteroidOreCount.Next(rand); - var weightedProto = _proto.Index(_asteroidOreWeights); - for (var i = 0; i < count; i++) - { - var ore = weightedProto.Pick(rand); - config.Layers.Add(_proto.Index(ore)); + var count = _asteroidOreCount.Next(rand); + var weightedProto = _proto.Index(_asteroidOreWeights); + for (var i = 0; i < count; i++) + { + var ore = weightedProto.Pick(rand); + config.Layers.Add(_proto.Index(ore)); - var layerCount = layers.GetOrNew(ore); - layerCount++; - layers[ore] = layerCount; - } + var layerCount = layers.GetOrNew(ore); + layerCount++; + layers[ore] = layerCount; + } - return new AsteroidOffering - { - Id = configId, - DungeonConfig = config, - MarkerLayers = layers, - }; + return new AsteroidOffering + { + Id = configId, + DungeonConfig = config, + MarkerLayers = layers, + }; + case DebrisOffering: + var id = rand.Pick(_debrisConfigs); + return new DebrisOffering + { + Id = id + }; + case SalvageOffering: + // Salvage map seed + _salvageMaps.Clear(); + _salvageMaps.AddRange(_proto.EnumeratePrototypes()); + _salvageMaps.Sort((x, y) => string.Compare(x.ID, y.ID, StringComparison.Ordinal)); + var mapIndex = rand.Next(_salvageMaps.Count); + var map = _salvageMaps[mapIndex]; + + return new SalvageOffering + { + SalvageMap = map, + }; + default: + throw new NotImplementedException($"Salvage type {type} not implemented!"); } - - // Salvage map seed - _salvageMaps.Clear(); - _salvageMaps.AddRange(_proto.EnumeratePrototypes()); - _salvageMaps.Sort((x, y) => string.Compare(x.ID, y.ID, StringComparison.Ordinal)); - var mapIndex = rand.Next(_salvageMaps.Count); - var map = _salvageMaps[mapIndex]; - - return new SalvageOffering() - { - SalvageMap = map, - }; } } diff --git a/Resources/Locale/en-US/salvage/salvage-magnet.ftl b/Resources/Locale/en-US/salvage/salvage-magnet.ftl index 5ed2649569..e160a8c0e0 100644 --- a/Resources/Locale/en-US/salvage/salvage-magnet.ftl +++ b/Resources/Locale/en-US/salvage/salvage-magnet.ftl @@ -31,6 +31,9 @@ salvage-magnet-resources-count = {$count -> *[other] (Extraordinary) } +# Debris +salvage-magnet-debris-ChunkDebris = Space Debris + # Asteroids dungeon-config-proto-BlobAsteroid = Asteroid clump dungeon-config-proto-ClusterAsteroid = Asteroid cluster diff --git a/Resources/Prototypes/Procedural/Magnet/space_debris.yml b/Resources/Prototypes/Procedural/Magnet/space_debris.yml new file mode 100644 index 0000000000..26b4ae25c8 --- /dev/null +++ b/Resources/Prototypes/Procedural/Magnet/space_debris.yml @@ -0,0 +1,40 @@ +- type: dungeonConfig + id: ChunkDebris + # Floor generation + layers: + - !type:NoiseDunGen + tileCap: 500 + capStd: 32 + iterations: 5 + layers: + - tile: FloorSteel + threshold: 0.50 + noise: + frequency: 0.05 + noiseType: OpenSimplex2 + fractalType: FBm + octaves: 3 + lacunarity: 3 + gain: 0.5 + - tile: Plating + threshold: 0.35 + noise: + frequency: 0.05 + noiseType: OpenSimplex2 + fractalType: FBm + octaves: 3 + lacunarity: 3 + gain: 0.3 + - tile: Lattice + threshold: 0.25 + noise: + frequency: 0.05 + noiseType: OpenSimplex2 + fractalType: FBm + octaves: 3 + lacunarity: 3 + gain: 0.5 + + # Generate biome + - !type:BiomeDunGen + biomeTemplate: SpaceDebris diff --git a/Resources/Prototypes/Procedural/Magnet/space_debris_templates.yml b/Resources/Prototypes/Procedural/Magnet/space_debris_templates.yml new file mode 100644 index 0000000000..6500f4415b --- /dev/null +++ b/Resources/Prototypes/Procedural/Magnet/space_debris_templates.yml @@ -0,0 +1,115 @@ +# Asteroid +- type: biomeTemplate + id: SpaceDebris + layers: + - !type:BiomeEntityLayer + threshold: 0.20 + noise: + seed: 0 + noiseType: OpenSimplex2 + fractalType: Ridged + octaves: 4 + frequency: 0.065 + gain: 5 + lacunarity: 1.5 + allowedTiles: + - Plating + - FloorSteel + entities: + - WallSolid + - AirlockMaintLocked + - Girder + - Girder + - WallReinforced + - WallSolid + - WallSolid + - !type:BiomeEntityLayer + threshold: 0.5 + noise: + seed: 0 + noiseType: OpenSimplex2 + fractalType: Ridged + octaves: 4 + frequency: 0.065 + gain: 2 + lacunarity: 1.5 + allowedTiles: + - Plating + - Lattice + entities: + - Grille + - Grille + - Grille + - GrilleBroken + - !type:BiomeDecalLayer + allowedTiles: + - FloorSteel + threshold: -0.5 + divisions: 1 + noise: + seed: 1 + frequency: 1 + decals: + - DirtHeavy + - DirtHeavy + - DirtHeavy + - DirtMedium + - DirtMedium + - DirtLight + - !type:BiomeEntityLayer + threshold: 0.45 + noise: + seed: 1 + noiseType: OpenSimplex2 + fractalType: Ridged + octaves: 4 + frequency: 0.065 + gain: 2 + lacunarity: 1.5 + allowedTiles: + - Plating + - FloorSteel + entities: + - WeldingFuelTankFull + - Table + - SalvageCanisterSpawner + - Rack + - ClosetMaintenanceFilledRandom + - ClosetMaintenanceFilledRandom + - !type:BiomeEntityLayer + allowedTiles: + - FloorSteel + - Plating + threshold: 0.2 + noise: + seed: 1 + frequency: 1 + entities: + - SalvageSpawnerScrapCommon + - SalvageSpawnerScrapCommon75 + - SalvageSpawnerScrapCommon75 + - SalvageSpawnerScrapValuable + - SalvageSpawnerScrapValuable75 + - !type:BiomeEntityLayer + allowedTiles: + - FloorSteel + threshold: 0.7 + noise: + seed: 1 + frequency: 1 + entities: + - SalvageSpawnerTreasureValuable + - SalvageSpawnerEquipmentValuable + - SalvageSpawnerTreasure + - SalvageSpawnerTreasure + - SalvageSpawnerEquipment + - SalvageSpawnerEquipment + - !type:BiomeEntityLayer + allowedTiles: + - FloorSteel + threshold: 0.85 + noise: + seed: 1 + frequency: 1 + entities: + - SalvageSpawnerMobMagnet75