carpet (#5464)
* carpet * reviews * why tf i gotta fix integration tests in the carpet pr
This commit is contained in:
@@ -26,7 +26,7 @@ namespace Content.IntegrationTests.Tests.Fluids
|
||||
|
||||
server.Assert(() =>
|
||||
{
|
||||
var solution = new Solution("water", FixedPoint2.New(20));
|
||||
var solution = new Solution("Water", FixedPoint2.New(20));
|
||||
var grid = GetMainGrid(mapManager);
|
||||
var (x, y) = GetMainTile(grid).GridIndices;
|
||||
var coordinates = new EntityCoordinates(grid.GridEntityId, x, y);
|
||||
@@ -65,7 +65,7 @@ namespace Content.IntegrationTests.Tests.Fluids
|
||||
server.Assert(() =>
|
||||
{
|
||||
var coordinates = grid.ToCoordinates();
|
||||
var solution = new Solution("water", FixedPoint2.New(20));
|
||||
var solution = new Solution("Water", FixedPoint2.New(20));
|
||||
var puddle = solution.SpillAt(coordinates, "PuddleSmear");
|
||||
Assert.Null(puddle);
|
||||
});
|
||||
@@ -125,7 +125,7 @@ namespace Content.IntegrationTests.Tests.Fluids
|
||||
// Spawn a puddle
|
||||
await server.WaitAssertion(() =>
|
||||
{
|
||||
var solution = new Solution("water", FixedPoint2.New(amount));
|
||||
var solution = new Solution("Water", FixedPoint2.New(amount));
|
||||
puddle = solution.SpillAt(sCoordinates, "PuddleSmear");
|
||||
|
||||
// Check that the puddle was created
|
||||
|
||||
@@ -29,6 +29,11 @@ namespace Content.Server.Chemistry.Components
|
||||
public int Amount { get; set; }
|
||||
public SolutionAreaEffectInceptionComponent? Inception { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Have we reacted with our tile yet?
|
||||
/// </summary>
|
||||
public bool ReactedTile = false;
|
||||
|
||||
/// <summary>
|
||||
/// Adds an <see cref="SolutionAreaEffectInceptionComponent"/> to owner so the effect starts spreading and reacting.
|
||||
/// </summary>
|
||||
@@ -138,7 +143,12 @@ namespace Content.Server.Chemistry.Components
|
||||
var reagent = PrototypeManager.Index<ReagentPrototype>(reagentQuantity.ReagentId);
|
||||
|
||||
// React with the tile the effect is on
|
||||
reagent.ReactionTile(tile, reagentQuantity.Quantity * solutionFraction);
|
||||
// We don't multiply by solutionFraction here since the tile is only ever reacted once
|
||||
if (!ReactedTile)
|
||||
{
|
||||
reagent.ReactionTile(tile, reagentQuantity.Quantity);
|
||||
ReactedTile = true;
|
||||
}
|
||||
|
||||
// Touch every entity on the tile
|
||||
foreach (var entity in tile.GetEntitiesInTileFast().ToArray())
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
using Content.Shared.Chemistry.Reaction;
|
||||
using Content.Shared.Chemistry.Reagent;
|
||||
using Content.Shared.FixedPoint;
|
||||
using Content.Shared.Maps;
|
||||
using Content.Shared.Whitelist;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Maths;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Serialization.Manager.Attributes;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
|
||||
namespace Content.Server.Chemistry.TileReactions;
|
||||
|
||||
[DataDefinition]
|
||||
public class CreateEntityReaction : ITileReaction
|
||||
{
|
||||
[DataField("entity", required: true, customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||
public string Entity = default!;
|
||||
|
||||
[DataField("usage")]
|
||||
public FixedPoint2 Usage = FixedPoint2.New(1);
|
||||
|
||||
/// <summary>
|
||||
/// How many of the whitelisted entity can fit on one tile?
|
||||
/// </summary>
|
||||
[DataField("maxOnTile")]
|
||||
public int MaxOnTile = 1;
|
||||
|
||||
/// <summary>
|
||||
/// The whitelist to use when determining what counts as "max entities on a tile".0
|
||||
/// </summary>
|
||||
[DataField("maxOnTileWhitelist")]
|
||||
public EntityWhitelist? Whitelist;
|
||||
|
||||
public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume)
|
||||
{
|
||||
if (reactVolume >= Usage)
|
||||
{
|
||||
// TODO probably pass this in args like reagenteffects do.
|
||||
var entMan = IoCManager.Resolve<IEntityManager>();
|
||||
|
||||
if (Whitelist != null)
|
||||
{
|
||||
int acc = 0;
|
||||
foreach (var ent in tile.GetEntitiesInTile())
|
||||
{
|
||||
if (Whitelist.IsValid(ent.Uid))
|
||||
acc += 1;
|
||||
|
||||
if (acc >= MaxOnTile)
|
||||
return FixedPoint2.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
entMan.SpawnEntity(Entity, tile.GridPosition().Offset(new Vector2(0.5f, 0.5f)));
|
||||
return Usage;
|
||||
}
|
||||
|
||||
return FixedPoint2.Zero;
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ using Robust.Server.GameObjects;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Map;
|
||||
using Robust.Shared.Prototypes;
|
||||
|
||||
namespace Content.Server.Fluids.Components
|
||||
{
|
||||
@@ -129,7 +130,7 @@ namespace Content.Server.Fluids.Components
|
||||
if (solution.TotalVolume <= 0) return null;
|
||||
|
||||
var mapManager = IoCManager.Resolve<IMapManager>();
|
||||
var entityManager = IoCManager.Resolve<IEntityManager>();
|
||||
var prototypeManager = IoCManager.Resolve<IPrototypeManager>();
|
||||
var serverEntityManager = IoCManager.Resolve<IServerEntityManager>();
|
||||
|
||||
// If space return early, let that spill go out into the void
|
||||
@@ -138,6 +139,17 @@ namespace Content.Server.Fluids.Components
|
||||
var gridId = tileRef.GridIndex;
|
||||
if (!mapManager.TryGetGrid(gridId, out var mapGrid)) return null; // Let's not spill to invalid grids.
|
||||
|
||||
// First, do all tile reactions
|
||||
foreach (var reagent in solution.Contents.ToArray())
|
||||
{
|
||||
var proto = prototypeManager.Index<ReagentPrototype>(reagent.ReagentId);
|
||||
proto.ReactionTile(tileRef, reagent.Quantity);
|
||||
}
|
||||
|
||||
// Tile reactions used up everything.
|
||||
if (solution.CurrentVolume == FixedPoint2.Zero)
|
||||
return null;
|
||||
|
||||
// Get normalized co-ordinate for spill location and spill it in the centre
|
||||
// TODO: Does SnapGrid or something else already do this?
|
||||
var spillGridCoords = mapGrid.GridTileToLocal(tileRef.GridIndices);
|
||||
|
||||
2
Resources/Locale/en-US/reagents/carpetium.ftl
Normal file
2
Resources/Locale/en-US/reagents/carpetium.ftl
Normal file
@@ -0,0 +1,2 @@
|
||||
carpetium-effect-blood-fibrous = Your blood feels oddly fibrous today.
|
||||
carpetium-effect-jumpsuit-insides = You feel like there's a jumpsuit inside you, for some reason.
|
||||
@@ -8,3 +8,8 @@
|
||||
- shoes
|
||||
- type: Sprite
|
||||
state: icon
|
||||
- type: Extractable
|
||||
juiceSolution:
|
||||
reagents:
|
||||
- ReagentId: Fiber
|
||||
Quantity: 5
|
||||
|
||||
@@ -9,6 +9,11 @@
|
||||
Slots: [innerclothing]
|
||||
EquipSound:
|
||||
path: /Audio/Items/jumpsuit_equip.ogg
|
||||
- type: Extractable
|
||||
juiceSolution:
|
||||
reagents:
|
||||
- ReagentId: Fiber
|
||||
Quantity: 10
|
||||
|
||||
- type: entity
|
||||
abstract: true
|
||||
@@ -22,3 +27,8 @@
|
||||
femaleMask: UniformTop
|
||||
EquipSound:
|
||||
path: /Audio/Items/jumpsuit_equip.ogg
|
||||
- type: Extractable
|
||||
juiceSolution:
|
||||
reagents:
|
||||
- ReagentId: Fiber
|
||||
Quantity: 5
|
||||
|
||||
@@ -11,6 +11,8 @@
|
||||
- type: IconSmooth
|
||||
key: full
|
||||
base: carpet_
|
||||
- type: Tag
|
||||
tags: [ Carpet ]
|
||||
- type: Physics
|
||||
canCollide: false
|
||||
fixtures:
|
||||
|
||||
25
Resources/Prototypes/Reagents/fun.yml
Normal file
25
Resources/Prototypes/Reagents/fun.yml
Normal file
@@ -0,0 +1,25 @@
|
||||
- type: reagent
|
||||
id: Carpetium
|
||||
name: carpetium
|
||||
desc: A mystical chemical, usually outsourced from the Clown Planet, that covers everything it touches in carpet.
|
||||
physicalDesc: fibrous
|
||||
color: "#800000"
|
||||
tileReactions:
|
||||
- !type:CreateEntityReaction
|
||||
entity: Carpet
|
||||
maxOnTileWhitelist:
|
||||
tags: [ Carpet ]
|
||||
metabolisms:
|
||||
Poison:
|
||||
effects:
|
||||
- !type:PopupMessage
|
||||
type: Local
|
||||
messages: [ "carpetium-effect-blood-fibrous", "carpetium-effect-jumpsuit-insides" ]
|
||||
probability: 0.1
|
||||
|
||||
- type: reagent
|
||||
id: Fiber
|
||||
name: fiber
|
||||
desc: A raw material, usually extracted from wool or other fabric products.
|
||||
physicalDesc: fibrous
|
||||
color: "#808080"
|
||||
9
Resources/Prototypes/Recipes/Reactions/fun.yml
Normal file
9
Resources/Prototypes/Recipes/Reactions/fun.yml
Normal file
@@ -0,0 +1,9 @@
|
||||
- type: reaction
|
||||
id: Carpetium
|
||||
reactants:
|
||||
SpaceDrugs:
|
||||
amount: 1
|
||||
Fiber:
|
||||
amount: 2
|
||||
products:
|
||||
Carpetium: 3
|
||||
@@ -27,6 +27,9 @@
|
||||
- type: Tag
|
||||
id: Carrot
|
||||
|
||||
- type: Tag
|
||||
id: Carpet
|
||||
|
||||
- type: Tag
|
||||
id: CanPilot
|
||||
|
||||
|
||||
Reference in New Issue
Block a user