From c31ffff9ac2c24926efd409b408568c76e2b8eda Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Fri, 23 Aug 2024 22:06:37 -0400 Subject: [PATCH] add new salv loot into the vgroid procgen (#31290) add new loot into vgroid procgen --- .../DungeonJob.EntityTableDunGen.cs | 59 +++ .../Procedural/DungeonJob/DungeonJob.cs | 3 + .../DungeonLayers/EntityTableDunGen.cs | 21 + .../Spawners/Random/Salvage/spawners.yml | 358 +++++++++--------- Resources/Prototypes/Procedural/vgroid.yml | 34 +- 5 files changed, 304 insertions(+), 171 deletions(-) create mode 100644 Content.Server/Procedural/DungeonJob/DungeonJob.EntityTableDunGen.cs create mode 100644 Content.Shared/Procedural/DungeonLayers/EntityTableDunGen.cs diff --git a/Content.Server/Procedural/DungeonJob/DungeonJob.EntityTableDunGen.cs b/Content.Server/Procedural/DungeonJob/DungeonJob.EntityTableDunGen.cs new file mode 100644 index 0000000000..8f9be82272 --- /dev/null +++ b/Content.Server/Procedural/DungeonJob/DungeonJob.EntityTableDunGen.cs @@ -0,0 +1,59 @@ +using System.Linq; +using System.Threading.Tasks; +using Content.Server.Ghost.Roles.Components; +using Content.Server.NPC.Systems; +using Content.Shared.EntityTable; +using Content.Shared.Physics; +using Content.Shared.Procedural; +using Content.Shared.Procedural.DungeonLayers; +using Robust.Shared.Collections; + +namespace Content.Server.Procedural.DungeonJob; + +public sealed partial class DungeonJob +{ + private async Task PostGen( + EntityTableDunGen gen, + Dungeon dungeon, + Random random) + { + var availableRooms = new ValueList(); + availableRooms.AddRange(dungeon.Rooms); + var availableTiles = new ValueList(dungeon.AllTiles); + + var count = random.Next(gen.MinCount, gen.MaxCount + 1); + var npcs = _entManager.System(); + + for (var i = 0; i < count; i++) + { + while (availableTiles.Count > 0) + { + var tile = availableTiles.RemoveSwap(random.Next(availableTiles.Count)); + + if (!_anchorable.TileFree(_grid, + tile, + (int) CollisionGroup.MachineLayer, + (int) CollisionGroup.MachineLayer)) + { + continue; + } + + var entities = _entManager.System().GetSpawns(gen.Table, random).ToList(); + foreach (var ent in entities) + { + var uid = _entManager.SpawnAtPosition(ent, _maps.GridTileToLocal(_gridUid, _grid, tile)); + _entManager.RemoveComponent(uid); + _entManager.RemoveComponent(uid); + npcs.SleepNPC(uid); + } + + break; + } + + await SuspendDungeon(); + + if (!ValidateResume()) + return; + } + } +} diff --git a/Content.Server/Procedural/DungeonJob/DungeonJob.cs b/Content.Server/Procedural/DungeonJob/DungeonJob.cs index 6631eb24b0..5a6a8510ff 100644 --- a/Content.Server/Procedural/DungeonJob/DungeonJob.cs +++ b/Content.Server/Procedural/DungeonJob/DungeonJob.cs @@ -239,6 +239,9 @@ public sealed partial class DungeonJob : Job> case MobsDunGen mob: await PostGen(mob, dungeons[^1], random); break; + case EntityTableDunGen entityTable: + await PostGen(entityTable, dungeons[^1], random); + break; case NoiseDistanceDunGen distance: dungeons.Add(await GenerateNoiseDistanceDunGen(position, distance, reservedTiles, seed, random)); break; diff --git a/Content.Shared/Procedural/DungeonLayers/EntityTableDunGen.cs b/Content.Shared/Procedural/DungeonLayers/EntityTableDunGen.cs new file mode 100644 index 0000000000..71e9bae0cc --- /dev/null +++ b/Content.Shared/Procedural/DungeonLayers/EntityTableDunGen.cs @@ -0,0 +1,21 @@ +using Content.Shared.EntityTable.EntitySelectors; + +namespace Content.Shared.Procedural.DungeonLayers; + + +/// +/// Spawns entities inside of the dungeon randomly. +/// +public sealed partial class EntityTableDunGen : IDunGenLayer +{ + // Counts separate to config to avoid some duplication. + + [DataField] + public int MinCount = 1; + + [DataField] + public int MaxCount = 1; + + [DataField(required: true)] + public EntityTableSelector Table; +} diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml index 81a7109575..503fcc3380 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml @@ -121,6 +121,54 @@ tableId: SalvageScrapSpawnerValuable prob: 0.75 +- type: entityTable + id: SalvageTreasureSpawnerCommon + table: !type:GroupSelector + children: + # 80% chance of some treasure + - !type:GroupSelector + weight: 80 + children: + - !type:NestedSelector + tableId: SalvageTreasureCommon + weight: 60 + - !type:NestedSelector + tableId: SalvageTreasureUncommon + weight: 30 + - !type:NestedSelector + tableId: SalvageTreasureRare + weight: 9 + - !type:NestedSelector + tableId: SalvageTreasureLegendary + weight: 1 + # 10% chance of low-level equipment + - !type:GroupSelector + weight: 10 + children: + - !type:NestedSelector + tableId: SalvageEquipmentCommon + weight: 60 + - !type:NestedSelector + tableId: SalvageEquipmentUncommon + weight: 40 + # 5% chance of moderate scrap + - !type:GroupSelector + weight: 5 + children: + - !type:NestedSelector + tableId: SalvageScrapLowValue + weight: 60 + - !type:NestedSelector + tableId: SalvageScrapHighValue + weight: 30 + - !type:NestedSelector + tableId: SalvageScrapLarge + weight: 10 + # 5% chance of maintenance fluff + - !type:NestedSelector + tableId: MaintFluffTable + weight: 5 + - type: entity parent: MarkerBase id: SalvageSpawnerTreasure @@ -134,52 +182,62 @@ state: diamond - type: EntityTableSpawner offset: 0.4 - table: !type:GroupSelector + table: !type:NestedSelector + tableId: SalvageTreasureSpawnerCommon prob: 0.75 + +- type: entityTable + id: SalvageTreasureSpawnerValuable + table: !type:GroupSelector + children: + # 80% chance of some treasure + - !type:GroupSelector + weight: 80 children: - # 80% chance of some treasure - - !type:GroupSelector - weight: 80 - children: - - !type:NestedSelector - tableId: SalvageTreasureCommon - weight: 60 - - !type:NestedSelector - tableId: SalvageTreasureUncommon - weight: 30 - - !type:NestedSelector - tableId: SalvageTreasureRare - weight: 9 - - !type:NestedSelector - tableId: SalvageTreasureLegendary - weight: 1 - # 10% chance of low-level equipment - - !type:GroupSelector - weight: 10 - children: - - !type:NestedSelector - tableId: SalvageEquipmentCommon - weight: 60 - - !type:NestedSelector - tableId: SalvageEquipmentUncommon - weight: 40 - # 5% chance of moderate scrap - - !type:GroupSelector - weight: 5 - children: - - !type:NestedSelector - tableId: SalvageScrapLowValue - weight: 60 - - !type:NestedSelector - tableId: SalvageScrapHighValue - weight: 30 - - !type:NestedSelector - tableId: SalvageScrapLarge - weight: 10 - # 5% chance of maintenance fluff - !type:NestedSelector - tableId: MaintFluffTable + tableId: SalvageTreasureCommon + weight: 45 + - !type:NestedSelector + tableId: SalvageTreasureUncommon + weight: 35 + - !type:NestedSelector + tableId: SalvageTreasureRare + weight: 15 + - !type:NestedSelector + tableId: SalvageTreasureLegendary weight: 5 + # 10% chance of low-level equipment + - !type:GroupSelector + weight: 10 + children: + - !type:NestedSelector + tableId: SalvageEquipmentCommon + weight: 50 + - !type:NestedSelector + tableId: SalvageEquipmentUncommon + weight: 40 + - !type:NestedSelector + tableId: SalvageEquipmentUncommon + weight: 10 + # 5% chance of moderate scrap + - !type:GroupSelector + weight: 5 + children: + - !type:NestedSelector + tableId: SalvageScrapLowValue + weight: 30 + - !type:NestedSelector + tableId: SalvageScrapHighValue + weight: 45 + - !type:NestedSelector + tableId: SalvageScrapLarge + weight: 25 + # 5% chance of maintenance fluff + - !type:NestedSelector + tableId: MaintFluffTable + weight: 5 + rolls: !type:RangeNumberSelector + range: 1, 2 - type: entity parent: MarkerBase @@ -194,57 +252,51 @@ state: diamond - type: EntityTableSpawner offset: 0.4 - table: !type:GroupSelector + table: !type:NestedSelector + tableId: SalvageTreasureSpawnerValuable prob: 0.75 + +- type: entityTable + id: SalvageEquipmentSpawnerCommon + table: !type:GroupSelector + children: + # 80% chance of equipment item + - !type:GroupSelector + weight: 80 children: - # 80% chance of some treasure - - !type:GroupSelector - weight: 80 - children: - - !type:NestedSelector - tableId: SalvageTreasureCommon - weight: 45 - - !type:NestedSelector - tableId: SalvageTreasureUncommon - weight: 35 - - !type:NestedSelector - tableId: SalvageTreasureRare - weight: 15 - - !type:NestedSelector - tableId: SalvageTreasureLegendary - weight: 5 - # 10% chance of low-level equipment - - !type:GroupSelector - weight: 10 - children: - - !type:NestedSelector - tableId: SalvageEquipmentCommon - weight: 50 - - !type:NestedSelector - tableId: SalvageEquipmentUncommon - weight: 40 - - !type:NestedSelector - tableId: SalvageEquipmentUncommon - weight: 10 - # 5% chance of moderate scrap - - !type:GroupSelector + - !type:NestedSelector + tableId: SalvageEquipmentCommon + weight: 60 + - !type:NestedSelector + tableId: SalvageEquipmentUncommon + weight: 30 + - !type:NestedSelector + tableId: SalvageEquipmentRare + weight: 9 + - !type:NestedSelector + tableId: SalvageEquipmentLegendary + weight: 1 + # 15% chance of decent-ish treasure + - !type:GroupSelector + weight: 15 + children: + - !type:NestedSelector + tableId: SalvageTreasureCommon + weight: 75 + - !type:NestedSelector + tableId: SalvageTreasureUncommon + weight: 20 + - !type:NestedSelector + tableId: SalvageTreasureRare weight: 5 - children: - - !type:NestedSelector - tableId: SalvageScrapLowValue - weight: 30 - - !type:NestedSelector - tableId: SalvageScrapHighValue - weight: 45 - - !type:NestedSelector - tableId: SalvageScrapLarge - weight: 25 - # 5% chance of maintenance fluff + # 5% chance of decent maintenance loot + - !type:GroupSelector + weight: 5 + children: + - !type:NestedSelector + tableId: MaintToolsTable - !type:NestedSelector tableId: MaintFluffTable - weight: 5 - rolls: !type:RangeNumberSelector - range: 1, 2 - type: entity parent: MarkerBase @@ -259,46 +311,57 @@ state: walkietalkie - type: EntityTableSpawner offset: 0.4 - table: !type:GroupSelector + table: !type:NestedSelector + tableId: SalvageEquipmentSpawnerCommon prob: 0.75 + +- type: entityTable + id: SalvageEquipmentSpawnerValuable + table: !type:GroupSelector + children: + # 80% chance of equipment item + - !type:GroupSelector + weight: 80 children: - # 80% chance of equipment item - - !type:GroupSelector - weight: 80 - children: - - !type:NestedSelector - tableId: SalvageEquipmentCommon - weight: 60 - - !type:NestedSelector - tableId: SalvageEquipmentUncommon - weight: 30 - - !type:NestedSelector - tableId: SalvageEquipmentRare - weight: 9 - - !type:NestedSelector - tableId: SalvageEquipmentLegendary - weight: 1 - # 15% chance of decent-ish treasure - - !type:GroupSelector + - !type:NestedSelector + tableId: SalvageEquipmentCommon + weight: 45 + - !type:NestedSelector + tableId: SalvageEquipmentUncommon + weight: 35 + - !type:NestedSelector + tableId: SalvageEquipmentRare weight: 15 - children: - - !type:NestedSelector - tableId: SalvageTreasureCommon - weight: 75 - - !type:NestedSelector - tableId: SalvageTreasureUncommon - weight: 20 - - !type:NestedSelector - tableId: SalvageTreasureRare - weight: 5 - # 5% chance of decent maintenance loot - - !type:GroupSelector + - !type:NestedSelector + tableId: SalvageEquipmentLegendary weight: 5 - children: - - !type:NestedSelector - tableId: MaintToolsTable - - !type:NestedSelector - tableId: MaintFluffTable + # 14% chance of decent-ish treasure + - !type:GroupSelector + weight: 14 + children: + - !type:NestedSelector + tableId: SalvageTreasureCommon + weight: 60 + - !type:NestedSelector + tableId: SalvageTreasureUncommon + weight: 30 + - !type:NestedSelector + tableId: SalvageTreasureRare + weight: 10 + # 5% chance of decent maintenance loot + - !type:GroupSelector + weight: 5 + children: + - !type:NestedSelector + tableId: MaintToolsTable + - !type:NestedSelector + tableId: MaintFluffTable + # 1% chance of syndie maintenance loot + - !type:GroupSelector + weight: 1 + children: + - !type:NestedSelector + tableId: SyndieMaintLoot - type: entity parent: MarkerBase @@ -313,52 +376,9 @@ state: walkietalkie - type: EntityTableSpawner offset: 0.4 - table: !type:GroupSelector + table: !type:NestedSelector + tableId: SalvageEquipmentSpawnerValuable prob: 0.75 - children: - # 80% chance of equipment item - - !type:GroupSelector - weight: 80 - children: - - !type:NestedSelector - tableId: SalvageEquipmentCommon - weight: 45 - - !type:NestedSelector - tableId: SalvageEquipmentUncommon - weight: 35 - - !type:NestedSelector - tableId: SalvageEquipmentRare - weight: 15 - - !type:NestedSelector - tableId: SalvageEquipmentLegendary - weight: 5 - # 14% chance of decent-ish treasure - - !type:GroupSelector - weight: 14 - children: - - !type:NestedSelector - tableId: SalvageTreasureCommon - weight: 60 - - !type:NestedSelector - tableId: SalvageTreasureUncommon - weight: 30 - - !type:NestedSelector - tableId: SalvageTreasureRare - weight: 10 - # 5% chance of decent maintenance loot - - !type:GroupSelector - weight: 5 - children: - - !type:NestedSelector - tableId: MaintToolsTable - - !type:NestedSelector - tableId: MaintFluffTable - # 1% chance of syndie maintenance loot - - !type:GroupSelector - weight: 1 - children: - - !type:NestedSelector - tableId: SyndieMaintLoot - type: entity name: Salvage Canister Spawner diff --git a/Resources/Prototypes/Procedural/vgroid.yml b/Resources/Prototypes/Procedural/vgroid.yml index 315f908fad..8c8d9147c4 100644 --- a/Resources/Prototypes/Procedural/vgroid.yml +++ b/Resources/Prototypes/Procedural/vgroid.yml @@ -141,9 +141,39 @@ layers: - !type:ExteriorDunGen proto: Experiment + - !type:EntityTableDunGen + minCount: 25 + maxCount: 40 + table: !type:NestedSelector + tableId: SalvageScrapSpawnerCommon + - !type:EntityTableDunGen + minCount: 30 + maxCount: 40 + table: !type:NestedSelector + tableId: SalvageScrapSpawnerValuable + - !type:EntityTableDunGen + minCount: 15 + maxCount: 25 + table: !type:NestedSelector + tableId: SalvageTreasureSpawnerCommon + - !type:EntityTableDunGen + minCount: 15 + maxCount: 25 + table: !type:NestedSelector + tableId: SalvageEquipmentSpawnerCommon + - !type:EntityTableDunGen + minCount: 15 + maxCount: 20 + table: !type:NestedSelector + tableId: SalvageTreasureSpawnerValuable + - !type:EntityTableDunGen + minCount: 15 + maxCount: 20 + table: !type:NestedSelector + tableId: SalvageEquipmentSpawnerValuable - !type:MobsDunGen - minCount: 5 - maxCount: 8 + minCount: 8 + maxCount: 15 groups: - id: MobGoliath amount: 1