option.Claimed = current.ActiveSeed == seed;
var claimIndex = i;
- option.ClaimPressed += args =>
+ option.ClaimPressed += _ =>
{
- SendMessage(new MagnetClaimOfferEvent()
+ SendMessage(new MagnetClaimOfferEvent
{
Index = claimIndex
});
{
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,
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");
public List<int> Offered = new();
[DataField]
- public int OfferCount = 6;
+ public int OfferCount = 5;
[DataField]
public int ActiveSeed;
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;
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<DungeonConfigPrototype>(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;
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);
/// Whether or not world generation is enabled.
/// </summary>
public static readonly CVarDef<bool> WorldgenEnabled =
- CVarDef.Create("worldgen.enabled", true, CVar.SERVERONLY);
+ CVarDef.Create("worldgen.enabled", false, CVar.SERVERONLY);
/// <summary>
/// The worldgen config to use.
--- /dev/null
+namespace Content.Shared.Salvage.Magnet;
+
+/// <summary>
+/// Space debis offered for the magnet.
+/// </summary>
+public record struct DebrisOffering : ISalvageMagnetOffering
+{
+ public string Id;
+}
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;
{
private readonly List<SalvageMapPrototype> _salvageMaps = new();
+ private Dictionary<ISalvageMagnetOffering, float> _offeringWeights = new()
+ {
+ { new AsteroidOffering(), 3.0f },
+ { new DebrisOffering(), 4.0f },
+ { new SalvageOffering(), 1.0f }
+ };
+
private readonly List<ProtoId<DungeonConfigPrototype>> _asteroidConfigs = new()
{
"BlobAsteroid",
private readonly MinMax _asteroidOreCount = new(5, 7);
+ private readonly List<ProtoId<DungeonConfigPrototype>> _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<string, int>();
-
- var data = new DungeonData();
- data.Apply(configProto.Data);
+ case AsteroidOffering:
+ var configId = _asteroidConfigs[rand.Next(_asteroidConfigs.Count)];
+ var configProto =_proto.Index(configId);
+ var layers = new Dictionary<string, int>();
- 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 data = new DungeonData();
+ data.Apply(configProto.Data);
- 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<OreDunGenPrototype>(ore));
+ 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 layerCount = layers.GetOrNew(ore);
- layerCount++;
- layers[ore] = layerCount;
- }
+ 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<OreDunGenPrototype>(ore));
- return new AsteroidOffering
- {
- Id = configId,
- DungeonConfig = config,
- MarkerLayers = layers,
- };
- }
+ var layerCount = layers.GetOrNew(ore);
+ layerCount++;
+ layers[ore] = layerCount;
+ }
- // Salvage map seed
- _salvageMaps.Clear();
- _salvageMaps.AddRange(_proto.EnumeratePrototypes<SalvageMapPrototype>());
- _salvageMaps.Sort((x, y) => string.Compare(x.ID, y.ID, StringComparison.Ordinal));
- var mapIndex = rand.Next(_salvageMaps.Count);
- var map = _salvageMaps[mapIndex];
+ 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<SalvageMapPrototype>());
+ _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,
- };
+ return new SalvageOffering
+ {
+ SalvageMap = map,
+ };
+ default:
+ throw new NotImplementedException($"Salvage type {type} not implemented!");
+ }
}
}
*[other] (Extraordinary)
}
+# Debris
+salvage-magnet-debris-ChunkDebris = Space Debris
+
# Asteroids
dungeon-config-proto-BlobAsteroid = Asteroid clump
dungeon-config-proto-ClusterAsteroid = Asteroid cluster
--- /dev/null
+- 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
--- /dev/null
+# 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