From 8faeaa7cc24a49b0ad8b25ea3b9d6da90bb48c55 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 8 Nov 2024 21:05:46 -0500 Subject: [PATCH] Port Bloodstains And Footprints (#1190) # Description This ports https://github.com/WWhiteDreamProject/wwdpublic/pull/110 from WWDP. This features significantly increases the interactions players have with Blood puddles, but introducing a mechanic whereby if players walk through puddles of blood, or attempt to drag a bloody corpse, they leave behind bloodstains as evidence of their presence or actions. You can avoid leaving marks from dragging corpses by using a rollerbed, and you can avoid leaving bloody footprints by avoiding walking in blood. This creates a great deal of emergent gameplay for all roles, but especially Traitors, Security(DETECTIVES!) and Janitors(Who now have to clean up bloody footprints!). Naturally, you can use syndicate soap to clean up any evidence of your crimes. # TODO - [x] Code Cleanup and Namespaces

Media

![image](https://github.com/user-attachments/assets/a60b3af7-6881-4338-836f-32bf45df9f90)

# Changelog :cl: - add: Added Bloodstains, Body Dragging Marks, and Bloody Footprints to the game. Characters that walk through puddles of blood will now leave behind bloody footprints. Dragging a corpse leaves a trail of blood wherever the corpse was moved. --------- Co-authored-by: Spatison <137375981+Spatison@users.noreply.github.com> --- .../FootPrint/FootPrintsVisualizerSystem.cs | 65 ++++++++++ Content.Server/FootPrint/FootPrintsSystem.cs | 122 ++++++++++++++++++ .../FootPrint/PuddleFootPrintsSystem.cs | 52 ++++++++ .../Footprint/FootPrintComponent.cs | 23 ++++ Content.Shared/Footprint/FootPrintVisuals.cs | 25 ++++ .../Footprint/FootPrintsComponent.cs | 88 +++++++++++++ .../Footprint/PuddleFootPrintsComponent.cs | 11 ++ .../Prototypes/Entities/Effects/puddle.yml | 39 ++++++ .../Entities/Mobs/Species/arachne.yml | 3 + .../Entities/Mobs/Species/arachnid.yml | 5 + .../Entities/Mobs/Species/diona.yml | 3 + .../Entities/Mobs/Species/dwarf.yml | 5 + .../Entities/Mobs/Species/harpy.yml | 5 +- .../Entities/Mobs/Species/human.yml | 1 + .../Prototypes/Entities/Mobs/Species/moth.yml | 1 + .../Entities/Mobs/Species/reptilian.yml | 3 + .../Entities/Mobs/Species/skeleton.yml | 3 +- .../Entities/Mobs/Species/slime.yml | 3 + .../Prototypes/Entities/Mobs/Species/vox.yml | 3 + Resources/Prototypes/Store/categories.yml | 5 + .../Prototypes/_White/Store/categories.yml | 4 - .../Effects/footprints.rsi/dragging-1.png | Bin 0 -> 591 bytes .../Effects/footprints.rsi/dragging-2.png | Bin 0 -> 563 bytes .../Effects/footprints.rsi/dragging-3.png | Bin 0 -> 615 bytes .../Effects/footprints.rsi/dragging-4.png | Bin 0 -> 504 bytes .../Effects/footprints.rsi/dragging-5.png | Bin 0 -> 558 bytes .../Effects/footprints.rsi/dragging-test.png | Bin 0 -> 414 bytes .../footprint-left-bare-diona.png | Bin 0 -> 255 bytes .../footprint-left-bare-dwarf.png | Bin 0 -> 209 bytes .../footprint-left-bare-human.png | Bin 0 -> 168 bytes .../footprint-left-bare-lizard.png | Bin 0 -> 195 bytes .../footprint-left-bare-slime.png | Bin 0 -> 199 bytes .../footprint-left-bare-spider.png | Bin 0 -> 175 bytes .../footprint-right-bare-diona.png | Bin 0 -> 250 bytes .../footprint-right-bare-dwarf.png | Bin 0 -> 213 bytes .../footprint-right-bare-human.png | Bin 0 -> 166 bytes .../footprint-right-bare-lizard.png | Bin 0 -> 195 bytes .../footprint-right-bare-slime.png | Bin 0 -> 200 bytes .../footprint-right-bare-spider.png | Bin 0 -> 172 bytes .../footprints.rsi/footprint-shoes.png | Bin 0 -> 146 bytes .../Effects/footprints.rsi/footprint-suit.png | Bin 0 -> 219 bytes .../Textures/Effects/footprints.rsi/meta.json | 71 ++++++++++ 42 files changed, 534 insertions(+), 6 deletions(-) create mode 100644 Content.Client/FootPrint/FootPrintsVisualizerSystem.cs create mode 100644 Content.Server/FootPrint/FootPrintsSystem.cs create mode 100644 Content.Server/FootPrint/PuddleFootPrintsSystem.cs create mode 100644 Content.Shared/Footprint/FootPrintComponent.cs create mode 100644 Content.Shared/Footprint/FootPrintVisuals.cs create mode 100644 Content.Shared/Footprint/FootPrintsComponent.cs create mode 100644 Content.Shared/Footprint/PuddleFootPrintsComponent.cs delete mode 100644 Resources/Prototypes/_White/Store/categories.yml create mode 100644 Resources/Textures/Effects/footprints.rsi/dragging-1.png create mode 100644 Resources/Textures/Effects/footprints.rsi/dragging-2.png create mode 100644 Resources/Textures/Effects/footprints.rsi/dragging-3.png create mode 100644 Resources/Textures/Effects/footprints.rsi/dragging-4.png create mode 100644 Resources/Textures/Effects/footprints.rsi/dragging-5.png create mode 100644 Resources/Textures/Effects/footprints.rsi/dragging-test.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-left-bare-diona.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-left-bare-dwarf.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-left-bare-human.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-left-bare-lizard.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-left-bare-slime.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-left-bare-spider.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-right-bare-diona.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-right-bare-dwarf.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-right-bare-human.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-right-bare-lizard.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-right-bare-slime.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-right-bare-spider.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-shoes.png create mode 100644 Resources/Textures/Effects/footprints.rsi/footprint-suit.png create mode 100644 Resources/Textures/Effects/footprints.rsi/meta.json diff --git a/Content.Client/FootPrint/FootPrintsVisualizerSystem.cs b/Content.Client/FootPrint/FootPrintsVisualizerSystem.cs new file mode 100644 index 00000000000..3998d6b3c17 --- /dev/null +++ b/Content.Client/FootPrint/FootPrintsVisualizerSystem.cs @@ -0,0 +1,65 @@ +using Content.Shared.FootPrint; +using Robust.Client.GameObjects; +using Robust.Client.Graphics; +using Robust.Shared.Random; + +namespace Content.Client.FootPrint; + +public sealed class FootPrintsVisualizerSystem : VisualizerSystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInitialized); + SubscribeLocalEvent(OnShutdown); + } + + private void OnInitialized(EntityUid uid, FootPrintComponent comp, ComponentInit args) + { + if (!TryComp(uid, out var sprite)) + return; + + sprite.LayerMapReserveBlank(FootPrintVisualLayers.Print); + UpdateAppearance(uid, comp, sprite); + } + + private void OnShutdown(EntityUid uid, FootPrintComponent comp, ComponentShutdown args) + { + if (TryComp(uid, out var sprite) + && sprite.LayerMapTryGet(FootPrintVisualLayers.Print, out var layer)) + sprite.RemoveLayer(layer); + } + + private void UpdateAppearance(EntityUid uid, FootPrintComponent component, SpriteComponent sprite) + { + if (!sprite.LayerMapTryGet(FootPrintVisualLayers.Print, out var layer) + || !TryComp(component.PrintOwner, out var printsComponent) + || !TryComp(uid, out var appearance) + || !_appearance.TryGetData(uid, FootPrintVisualState.State, out var printVisuals, appearance)) + return; + + sprite.LayerSetState(layer, new RSI.StateId(printVisuals switch + { + FootPrintVisuals.BareFootPrint => printsComponent.RightStep ? printsComponent.RightBarePrint : printsComponent.LeftBarePrint, + FootPrintVisuals.ShoesPrint => printsComponent.ShoesPrint, + FootPrintVisuals.SuitPrint => printsComponent.SuitPrint, + FootPrintVisuals.Dragging => _random.Pick(printsComponent.DraggingPrint), + _ => throw new ArgumentOutOfRangeException($"Unknown {printVisuals} parameter.") + }), printsComponent.RsiPath); + + if (_appearance.TryGetData(uid, FootPrintVisualState.Color, out var printColor, appearance)) + sprite.LayerSetColor(layer, printColor); + } + + protected override void OnAppearanceChange (EntityUid uid, FootPrintComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite is not { } sprite) + return; + + UpdateAppearance(uid, component, sprite); + } +} diff --git a/Content.Server/FootPrint/FootPrintsSystem.cs b/Content.Server/FootPrint/FootPrintsSystem.cs new file mode 100644 index 00000000000..0e45acff5cc --- /dev/null +++ b/Content.Server/FootPrint/FootPrintsSystem.cs @@ -0,0 +1,122 @@ +using Content.Server.Atmos.Components; +using Content.Shared.Inventory; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.FootPrint; +using Content.Shared.Standing; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Robust.Shared.Map; +using Robust.Shared.Random; + +namespace Content.Server.FootPrint; + +public sealed class FootPrintsSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly IMapManager _map = default!; + + [Dependency] private readonly SharedSolutionContainerSystem _solution = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + private EntityQuery _transformQuery; + private EntityQuery _mobThresholdQuery; + private EntityQuery _appearanceQuery; + private EntityQuery _layingQuery; + + public override void Initialize() + { + base.Initialize(); + + _transformQuery = GetEntityQuery(); + _mobThresholdQuery = GetEntityQuery(); + _appearanceQuery = GetEntityQuery(); + _layingQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnStartupComponent); + SubscribeLocalEvent(OnMove); + } + + private void OnStartupComponent(EntityUid uid, FootPrintsComponent component, ComponentStartup args) + { + component.StepSize = Math.Max(0f, component.StepSize + _random.NextFloat(-0.05f, 0.05f)); + } + + private void OnMove(EntityUid uid, FootPrintsComponent component, ref MoveEvent args) + { + if (component.PrintsColor.A <= 0f + || !_transformQuery.TryComp(uid, out var transform) + || !_mobThresholdQuery.TryComp(uid, out var mobThreshHolds) + || !_map.TryFindGridAt(_transform.GetMapCoordinates((uid, transform)), out var gridUid, out _)) + return; + + var dragging = mobThreshHolds.CurrentThresholdState is MobState.Critical or MobState.Dead + || _layingQuery.TryComp(uid, out var laying) && laying.IsCrawlingUnder; + var distance = (transform.LocalPosition - component.StepPos).Length(); + var stepSize = dragging ? component.DragSize : component.StepSize; + + if (!(distance > stepSize)) + return; + + component.RightStep = !component.RightStep; + + var entity = Spawn(component.StepProtoId, CalcCoords(gridUid, component, transform, dragging)); + var footPrintComponent = EnsureComp(entity); + + footPrintComponent.PrintOwner = uid; + Dirty(entity, footPrintComponent); + + if (_appearanceQuery.TryComp(entity, out var appearance)) + { + _appearance.SetData(entity, FootPrintVisualState.State, PickState(uid, dragging), appearance); + _appearance.SetData(entity, FootPrintVisualState.Color, component.PrintsColor, appearance); + } + + if (!_transformQuery.TryComp(entity, out var stepTransform)) + return; + + stepTransform.LocalRotation = dragging + ? (transform.LocalPosition - component.StepPos).ToAngle() + Angle.FromDegrees(-90f) + : transform.LocalRotation + Angle.FromDegrees(180f); + + component.PrintsColor = component.PrintsColor.WithAlpha(Math.Max(0f, component.PrintsColor.A - component.ColorReduceAlpha)); + component.StepPos = transform.LocalPosition; + + if (!TryComp(entity, out var solutionContainer) + || !_solution.ResolveSolution((entity, solutionContainer), footPrintComponent.SolutionName, ref footPrintComponent.Solution, out var solution) + || string.IsNullOrWhiteSpace(component.ReagentToTransfer) || solution.Volume >= 1) + return; + + _solution.TryAddReagent(footPrintComponent.Solution.Value, component.ReagentToTransfer, 1, out _); + } + + private EntityCoordinates CalcCoords(EntityUid uid, FootPrintsComponent component, TransformComponent transform, bool state) + { + if (state) + return new EntityCoordinates(uid, transform.LocalPosition); + + var offset = component.RightStep + ? new Angle(Angle.FromDegrees(180f) + transform.LocalRotation).RotateVec(component.OffsetPrint) + : new Angle(transform.LocalRotation).RotateVec(component.OffsetPrint); + + return new EntityCoordinates(uid, transform.LocalPosition + offset); + } + + private FootPrintVisuals PickState(EntityUid uid, bool dragging) + { + var state = FootPrintVisuals.BareFootPrint; + + if (_inventory.TryGetSlotEntity(uid, "shoes", out _)) + state = FootPrintVisuals.ShoesPrint; + + if (_inventory.TryGetSlotEntity(uid, "outerClothing", out var suit) && TryComp(suit, out _)) + state = FootPrintVisuals.SuitPrint; + + if (dragging) + state = FootPrintVisuals.Dragging; + + return state; + } +} diff --git a/Content.Server/FootPrint/PuddleFootPrintsSystem.cs b/Content.Server/FootPrint/PuddleFootPrintsSystem.cs new file mode 100644 index 00000000000..706ba25359d --- /dev/null +++ b/Content.Server/FootPrint/PuddleFootPrintsSystem.cs @@ -0,0 +1,52 @@ +using System.Linq; +using Content.Shared.FootPrint; +using Content.Shared.Chemistry.Components.SolutionManager; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Fluids; +using Content.Shared.Fluids.Components; +using Robust.Shared.Physics.Events; + +namespace Content.Server.FootPrint; + +public sealed class PuddleFootPrintsSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainer = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStepTrigger); + } + + private void OnStepTrigger(EntityUid uid, PuddleFootPrintsComponent component, ref EndCollideEvent args) + { + if (!TryComp(uid, out var appearance) + || !TryComp(uid, out var puddle) + || !TryComp(args.OtherEntity, out var tripper) + || !TryComp(uid, out var solutionManager) + || !_solutionContainer.ResolveSolution((uid, solutionManager), puddle.SolutionName, ref puddle.Solution, out var solutions)) + return; + + var totalSolutionQuantity = solutions.Contents.Sum(sol => (float) sol.Quantity); + var waterQuantity = (from sol in solutions.Contents where sol.Reagent.Prototype == "Water" select (float) sol.Quantity).FirstOrDefault(); + + if (waterQuantity / (totalSolutionQuantity / 100f) > component.OffPercent || solutions.Contents.Count <= 0) + return; + + tripper.ReagentToTransfer = + solutions.Contents.Aggregate((l, r) => l.Quantity > r.Quantity ? l : r).Reagent.Prototype; + + if (_appearance.TryGetData(uid, PuddleVisuals.SolutionColor, out var color, appearance) + && _appearance.TryGetData(uid, PuddleVisuals.CurrentVolume, out var volume, appearance)) + AddColor((Color) color, (float) volume * component.SizeRatio, tripper); + + _solutionContainer.RemoveEachReagent(puddle.Solution.Value, 1); + } + + private void AddColor(Color col, float quantity, FootPrintsComponent component) + { + component.PrintsColor = component.ColorQuantity == 0f ? col : Color.InterpolateBetween(component.PrintsColor, col, component.ColorInterpolationFactor); + component.ColorQuantity += quantity; + } +} diff --git a/Content.Shared/Footprint/FootPrintComponent.cs b/Content.Shared/Footprint/FootPrintComponent.cs new file mode 100644 index 00000000000..e1f9716057f --- /dev/null +++ b/Content.Shared/Footprint/FootPrintComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Chemistry.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.FootPrint; + +/// +/// This is used for marking footsteps, handling footprint drawing. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FootPrintComponent : Component +{ + /// + /// Owner (with ) of a print (this component). + /// + [AutoNetworkedField] + public EntityUid PrintOwner; + + [DataField] + public string SolutionName = "step"; + + [DataField] + public Entity? Solution; +} diff --git a/Content.Shared/Footprint/FootPrintVisuals.cs b/Content.Shared/Footprint/FootPrintVisuals.cs new file mode 100644 index 00000000000..f980f60a6d9 --- /dev/null +++ b/Content.Shared/Footprint/FootPrintVisuals.cs @@ -0,0 +1,25 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.FootPrint; + +[Serializable, NetSerializable] +public enum FootPrintVisuals : byte +{ + BareFootPrint, + ShoesPrint, + SuitPrint, + Dragging +} + +[Serializable, NetSerializable] +public enum FootPrintVisualState : byte +{ + State, + Color +} + +[Serializable, NetSerializable] +public enum FootPrintVisualLayers : byte +{ + Print +} diff --git a/Content.Shared/Footprint/FootPrintsComponent.cs b/Content.Shared/Footprint/FootPrintsComponent.cs new file mode 100644 index 00000000000..2b2c4ed66ed --- /dev/null +++ b/Content.Shared/Footprint/FootPrintsComponent.cs @@ -0,0 +1,88 @@ +using System.Numerics; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.FootPrint; + +[RegisterComponent] +public sealed partial class FootPrintsComponent : Component +{ + [ViewVariables(VVAccess.ReadOnly), DataField] + public ResPath RsiPath = new("/Textures/Effects/footprints.rsi"); + + // all of those are set as a layer + [ViewVariables(VVAccess.ReadOnly), DataField] + public string LeftBarePrint = "footprint-left-bare-human"; + + [ViewVariables(VVAccess.ReadOnly), DataField] + public string RightBarePrint = "footprint-right-bare-human"; + + [ViewVariables(VVAccess.ReadOnly), DataField] + public string ShoesPrint = "footprint-shoes"; + + [ViewVariables(VVAccess.ReadOnly), DataField] + public string SuitPrint = "footprint-suit"; + + [ViewVariables(VVAccess.ReadOnly), DataField] + public string[] DraggingPrint = + [ + "dragging-1", + "dragging-2", + "dragging-3", + "dragging-4", + "dragging-5", + ]; + // yea, those + + [ViewVariables(VVAccess.ReadOnly), DataField] + public EntProtoId StepProtoId = "Footstep"; + + [ViewVariables(VVAccess.ReadOnly), DataField] + public Color PrintsColor = Color.FromHex("#00000000"); + + /// + /// The size scaling factor for footprint steps. Must be positive. + /// + [DataField] + public float StepSize = 0.7f; + + /// + /// The size scaling factor for drag marks. Must be positive. + /// + [DataField] + public float DragSize = 0.5f; + + /// + /// The amount of color to transfer from the source (e.g., puddle) to the footprint. + /// + [DataField] + public float ColorQuantity; + + /// + /// The factor by which the alpha channel is reduced in subsequent footprints. + /// + [DataField] + public float ColorReduceAlpha = 0.1f; + + [DataField] + public string? ReagentToTransfer; + + [DataField] + public Vector2 OffsetPrint = new(0.1f, 0f); + + /// + /// Tracks which foot should make the next print. True for right foot, false for left. + /// + public bool RightStep = true; + + /// + /// The position of the last footprint in world coordinates. + /// + public Vector2 StepPos = Vector2.Zero; + + /// + /// Controls how quickly the footprint color transitions between steps. + /// Value between 0 and 1, where higher values mean faster color changes. + /// + public float ColorInterpolationFactor = 0.2f; +} diff --git a/Content.Shared/Footprint/PuddleFootPrintsComponent.cs b/Content.Shared/Footprint/PuddleFootPrintsComponent.cs new file mode 100644 index 00000000000..0e2ddfe3836 --- /dev/null +++ b/Content.Shared/Footprint/PuddleFootPrintsComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.FootPrint; + +[RegisterComponent] +public sealed partial class PuddleFootPrintsComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + public float SizeRatio = 0.2f; + + [ViewVariables(VVAccess.ReadWrite)] + public float OffPercent = 80f; +} diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index 6a29a8af456..7f6125e73d3 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -166,3 +166,42 @@ solution: puddle - type: BadDrink - type: IgnoresFingerprints + - type: PuddleFootPrints + +- type: entity + name: Footstep + id: Footstep + save: false + description: Trace of liquid + components: + - type: Clickable + - type: FootstepModifier + footstepSoundCollection: + collection: FootstepWater + params: + volume: 3 + - type: Transform + noRot: false + - type: Sprite + drawdepth: FloorObjects + color: "#FFFFFF80" + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + slipFixture: + shape: + !type:PhysShapeAabb + bounds: "-0.4,-0.4,0.4,0.4" + mask: + - ItemMask + layer: + - SlipLayer + hard: false + - type: SolutionContainerManager + solutions: + step: { maxVol: 2 } + - type: FootPrint + - type: Puddle + solution: step + - type: Appearance diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml index 24ebafd91d1..ddbdc57e0ad 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml @@ -135,6 +135,9 @@ fireStackAlternateState: 3 - type: Spider - type: IgnoreSpiderWeb + - type: FootPrints + leftBarePrint: "footprint-left-bare-spider" + rightBarePrint: "footprint-right-bare-spider" - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index d576101e652..f512e71d325 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -127,6 +127,11 @@ sprite: "Effects/creampie.rsi" state: "creampie_arachnid" visible: false + - type: Spider + - type: IgnoreSpiderWeb + - type: FootPrints + leftBarePrint: "footprint-left-bare-spider" + rightBarePrint: "footprint-right-bare-spider" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 113151ad083..07d621b139d 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -120,6 +120,9 @@ whitelist: types: - Shard + - type: FootPrints + leftBarePrint: "footprint-left-bare-diona" + rightBarePrint: "footprint-right-bare-diona" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml index 069ecb3eaf3..7f315040356 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/dwarf.yml @@ -65,6 +65,11 @@ - SolCommon - type: LightweightDrunk boozeStrengthMultiplier: 0.5 + - type: Stamina + critThreshold: 115 + - type: FootPrints + leftBarePrint: "footprint-left-bare-dwarf" + rightBarePrint: "footprint-right-bare-dwarf" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml index ce87e105497..4ad6ea03cd9 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml @@ -127,6 +127,9 @@ - Shard - Landmine - Mousetrap + - type: FootPrints + leftBarePrint: "footprint-left-bare-lizard" + rightBarePrint: "footprint-right-bare-lizard" # I was about to complain about this, then I remembered birbs have dinosaur feet. So this is valid. - type: entity save: false @@ -218,4 +221,4 @@ checkCanInteract: false icon: { sprite: Interface/Actions/flight.rsi, state: flight_off } iconOn: { sprite : Interface/Actions/flight.rsi, state: flight_on } - event: !type:ToggleFlightEvent \ No newline at end of file + event: !type:ToggleFlightEvent diff --git a/Resources/Prototypes/Entities/Mobs/Species/human.yml b/Resources/Prototypes/Entities/Mobs/Species/human.yml index 013789cd2be..ee2886602d1 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/human.yml @@ -28,6 +28,7 @@ understands: - TauCetiBasic - SolCommon + - type: FootPrints - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/moth.yml b/Resources/Prototypes/Entities/Mobs/Species/moth.yml index fef380d1d56..5f684222264 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/moth.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/moth.yml @@ -122,6 +122,7 @@ sprite: "Effects/creampie.rsi" state: "creampie_moth" visible: false + - type: FootPrints - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index b27b4c6029d..ee5d6285659 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -66,6 +66,9 @@ understands: - TauCetiBasic - Draconic + - type: FootPrints + leftBarePrint: "footprint-left-bare-lizard" + rightBarePrint: "footprint-right-bare-lizard" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml index 28ea5b030f6..2d34c87cfb4 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/skeleton.yml @@ -9,7 +9,7 @@ components: - type: HumanoidAppearance species: Skeleton - - type: Carriable # Carrying system from nyanotrasen. + - type: Carriable # Carrying system from nyanotrasen. - type: Icon sprite: Mobs/Species/Skeleton/parts.rsi state: full @@ -102,6 +102,7 @@ probability: 0.5 - type: FireVisuals alternateState: Standing + - type: FootPrints - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index 7faade46f84..e8909166257 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -117,6 +117,9 @@ understands: - TauCetiBasic - Bubblish + - type: FootPrints + leftBarePrint: "footprint-left-bare-slime" + rightBarePrint: "footprint-right-bare-slime" - type: entity parent: MobHumanDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index ec8035563b7..58e2b3b6463 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -102,6 +102,9 @@ sprite: "Effects/creampie.rsi" state: "creampie_vox" # Not default visible: false + - type: FootPrints + leftBarePrint: "footprint-left-bare-lizard" + rightBarePrint: "footprint-right-bare-lizard" - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Store/categories.yml b/Resources/Prototypes/Store/categories.yml index 1b377902e43..489145813e2 100644 --- a/Resources/Prototypes/Store/categories.yml +++ b/Resources/Prototypes/Store/categories.yml @@ -104,6 +104,11 @@ name: store-category-disruption priority: 12 +- type: storeCategory + id: UplinkSales + name: Sales + priority: 10 + #revenant - type: storeCategory id: RevenantAbilities diff --git a/Resources/Prototypes/_White/Store/categories.yml b/Resources/Prototypes/_White/Store/categories.yml deleted file mode 100644 index cb9cfbc88f8..00000000000 --- a/Resources/Prototypes/_White/Store/categories.yml +++ /dev/null @@ -1,4 +0,0 @@ -- type: storeCategory - id: UplinkSales - name: Sales - priority: 10 diff --git a/Resources/Textures/Effects/footprints.rsi/dragging-1.png b/Resources/Textures/Effects/footprints.rsi/dragging-1.png new file mode 100644 index 0000000000000000000000000000000000000000..74d2aeb0743125350069ff66773c5083326555ff GIT binary patch literal 591 zcmV-V0Px%2}wjjR9J=0SG#fJFc5v~@mQ(>i8v~O${Dx-M`RJch@~j9iV&kKz=0GCC1`*| zHHfFt-~tmqXoVjwd3-P75DQ}8?!E;;;Dzuz^hoNt8B9K7M2OKhWE{Pxk7UdhaYpp}k*Nn{92ypNPXR}$* z+2L@=T{errRjLPcuH6@LP8LRKz%DqHgcJLGKOT=)W1|QdW7dPSiaX$Xu<7Q{TzCmM zJ-lIyUPQFt@2%5hq@xH}@ETf&KJx(Ed;&;k0ApQHO3edvd08DpU<-i1T)~)ZZes8`#V&U0bNy9 z$s;*cf@BS2ST2`eKMesuDfI#Xr_;+&+)hylvYR5jC+J@;%z{rdCag5co)c%vP4AeI0!-NNPYS^%A+;b(RDtx!G)@ zr(iY#4(rHQ`Px$?MXyIR9J=OmpzWcFc5`bwjoG#NVX*;a+2g0sn~vVq@~YRz6G3wNJzHpNZ=}4 zAfsUXM}oH5SE0e4`R0usCBT1IHfOUCqBXx6W1nvYD9h3rKO7DN07xl+0Dw}u1AwZk zG63M5w{>0LVUEY+6s|{*vMeElXa`GnObF4MnAsQ8N33{Aru#Vx0{C<~ot$w>>CT3V zH8Bam1=RQbLyU9YdX~Qqz&USycKh7WTJKUIya2X!zCv>qbs*HeZTnc;?e;wYK1nH` zVoE8eQ=x+x1Tfv7&*uqxHzI^2+aCn5W!&%;_GuV~#xyep;Ng|l1Qg4WGy*AQ1IrB`%or$EJQ=_zQ*6!{q5wrvWaCbK(1reEG+?~fpvp9=s0002ovPDHLkV1i%0 B_D=u+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/dragging-3.png b/Resources/Textures/Effects/footprints.rsi/dragging-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f7274dd3c0ed0a8aaf2d10114e96917e78a3f7 GIT binary patch literal 615 zcmV-t0+{`YP)Px%AxT6*R9J=Wm(7Z+Fcim+!+;9nreLInx|+wZZ{fVK z$K$cnc3rmxg1{yhtN;ihIa;i$u4^dEvUkjKxwLX^5CF-2-_K8{Q|G%7qSIHFWy_r) z2!Jt0$6Oe7fKn>;3ZR|7IcsV@<;JWTs?~9_SskEOdQ9% z&1U1Mm(nZ%9YzJggxHs5*$&{(KO#bi)1Bc5>Nk`70ue$P*4O|5002ovPDHLkV1k|! B8~6YK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/dragging-4.png b/Resources/Textures/Effects/footprints.rsi/dragging-4.png new file mode 100644 index 0000000000000000000000000000000000000000..5eb34b5d5708e656752f60d2fa245aaf270f5925 GIT binary patch literal 504 zcmVPx$vPnciR9J=WRxxhFFbupF1T<*$;xS9VkR|X3vTJho=1K9MOxp7Sqkr*|EgAyD zK!=8f;#w9Zd+Y&0B#S1GM^P5=k3@7`cb*#O;(e)ur9|Fh231wP%&oP4upNLeo|I*I zNF_kApw`;6G3GD|{s90)v;nYT+pg;X0LGYu|6bd+K?33uaBw23iD*kiTYp_C^~ZKR z&L+T4wAS_geuq*D<9`4chN1Re+ev({vI!Y|--C$ixMcb8!!T@CAprbHD_P4?Axc0Z|CoqU>g8O>CXm`v zIS3Mvv``F^{WGh8R7M|MibW-`)_(HAQxrvZi%Is+szUjjQ)`@+pPeMrBm$uu%#uJ!1f~M-_xs@eF{IXN1SD|I9dpVOBv6)R<2(1q z<9RAsAJI1SrFYI6{R%?BN0J9|+*PXA~Pcoc&>&;u= uX39qrfjO`e#+ZhG{+e^{5)1wh0Qd$W5WavLR`q-U0000Px$=t)FDR9J=WS38dCFcdwB9v@4{1&t{XJ8^cAD$_Gd$}Hej?1JnhmEBN8P#{Cz z6vK@i<9y7(lSY~&Malhe@8N#(0eO$kjT?Q#->i~c>O+TcRO(G#g zPKn8f{7FapU;>2QZnyQxl$_44-&k}KumifmIp;ZDmt|?o(nqAP3WF8!kz$Os^o%hg zQS|-pI|QV4&dajAb6||Y7<1Q-q1FUdfH0fQg8b7o{dfui##q*8uj{%s52P;&Z)d^? zaL)6|WHRV?I-Q#9F`Lm#zz)C|YliQ9J~uv##RB$B#Btor0&Z1!XbbGVU9VSf>9y7{ z#x(L~v$4&E8z+ds4HAI7TrRy%?oh7RYwt!pLIBh0G>c=un-IdQKO7Ep**$$@3C!p7 zA(wBV_g2g~&x|ps>pD2Fvy$Ni0HCTWR8`f|*&6_Kw_z;$2;{)mKXIn}PIgHV+-F88 zfu~@o4ZQ>&Dev)kY{^4acu578%jIa_m$ks2ll^}G@4pimi(mro2E3fWvlF_Ax(rIG zExqvqfY$mi00<#6S4XgIcZs6No9j;qTYNoSvRm?Z*Qm8FY|>*e>U|)JqG+{Ry#YXy wBvFziot4vCztdssLP&L@>(k5qMEgPx$SV=@dR9J=8mqBiXFbqXMRd;hAmXYQJT&4S7qF3Prm9m`s%$jZz6j`?O9bnY? zn;9VB$B$!&35K?9`vR~ur{?neP=?RqxQR|rr(+ZP$cKwgaYt=CcvIdr1e@t9s;0( zkLHC7Q1d`qoOAwlZmW(h&KM3rlNLPZ`~*}Nx)7g%z|ZoRo#T}Opd4s|9~u(^Xo?Xv zm!nbvoaW)$uesngA`{@1asiB!2Zi-xD%~lGg8%>k07*qo IM6N<$f?hzfr~m)} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-diona.png b/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-diona.png new file mode 100644 index 0000000000000000000000000000000000000000..fa40e0f2977b3ee9794d3a2fcb228476c62b3247 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}J3U<-Ln2z= zPTt6S$Uwk#zaV$O2FC0;)?o<@*I!1qSTU#Yn7^FC(AmT&@i6!agLY`mG^GjeLdCs* zet+_Zq3^N9x&2O?w9^F*pXTW3zue?fbm6DX^eC?l94{6{$UOB=;FvyZ&01FnONJMW zDz$cP0%g3Frv(Kkyz#K}u=9-bbAybW(a9Q~MWWss9J2xE{pVzhjchF2_ z^3Y_QKmWzutGV~fJtysct<89b$8*)zQ)k-l^DDM|kiK{Kr$zVqOv4_avlu*G{an^L HB{Ts55bjZ* literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-human.png b/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-human.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ab3257c583dbeb76012e533a90e386b13dc8ab GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}NuDl_ArY-_ zFBoziFyLW!*v)_X|Ne(JD^80w?b;G>X{DJ-ciwgt9VZu;5QAe33^|&|mwx9n{$1a) z`?2Qi#WxRc4G9g7bT2!Qdv2zlK5xd_OqY%mzop}sOkaO=s=k1rU~VZ>&{WH*w}S)U Q0BvLNboFyt=akR{0LZL8O#lD@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-lizard.png b/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-lizard.png new file mode 100644 index 0000000000000000000000000000000000000000..e53ba99227e429913d603028577ba1464040bb23 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}wVp1HArY-_ zFKy&yR^(}Y_}_@R=do|ZJSM4NXGWpxs$P|DUQ+dQxuegs6`Zqt&i8cAchCQ)Z>?Ar z?ZO}+_-xKHh3lRS4FXJSO&OAU`k&9#zfjG-;M%Xy|5H}wh2C8{<$JMB>OO{=ZE@K% s(`8saG-H!_g1nyXe=?`|+~2#rw1j)78&qol`;+07#lh)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-slime.png b/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-slime.png new file mode 100644 index 0000000000000000000000000000000000000000..87561cb16196846accc1779665c29c31d6a8a06d GIT binary patch literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}jh-%!ArY-_ zFYo0&tRUic(ffo_UO&dw=)D4|@R z^Cae<-DiHr%MaHl-&rfj?|q=8f+b^Z?ls>qCO^ZLfcHERpSl~kCIp=dXMf}HcCULw x(5X_!&)MJa&3-TcVCSY8kAHV|bgZdhUOhu{+EOWH9-w0wJYD@<);T3K0RTmdPk#Ua literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-spider.png b/Resources/Textures/Effects/footprints.rsi/footprint-left-bare-spider.png new file mode 100644 index 0000000000000000000000000000000000000000..4939e72c4b55171a84c2f8b6c9130f99d9bc75e5 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}nVv3=ArY-_ zFDUXIFyLW!$o}j4f71Eynyi5VnU12BB^J(?YmR746LoNLd2-t0(@fFuuLbXY%h?%r zSSu|uS!9#2w)LL1$EP{XXV!#Wogw*bj>^f71v95sosws0xOR)7;fzdvm5YnZzqf3S X(~VtjTgTe~DWM4fM$6~(uewe_Ycdt`&+u^S=^B`gdZoR$k53aO4OW#4pCclP|o zDcAo_*y2&;@ynyiTPoW9!e_R$2dsA*7oL>0xF*&jpys)u?*WTV^x1_AnP(n6qqkon_}w(1{$rfFzQ^s!whwA5>3XN=14tZ9;&;&Y16{oOsgbi;SO zhSJzh!&(1#)(i0!$gofP^6u|-?mbb{T5Ip0{rrr{GM(YsoECv~x&dC5?`nDy`OL*D z-q!oR&GtRbJ!fEy|>&mXzkZeHP7c1?|;gY*lF6mI>W95=rjgT LS3j3^P6yZVy@Cw?UlFq_Q`JW$yQQQlJ+n%{&}*{IN7D3(w0I0 z&R!V?YsS3phD+-fOEEA!n{)N!Uxw9?&t;ucLK6TVI6R90 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-right-bare-lizard.png b/Resources/Textures/Effects/footprints.rsi/footprint-right-bare-lizard.png new file mode 100644 index 0000000000000000000000000000000000000000..e53ba99227e429913d603028577ba1464040bb23 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}wVp1HArY-_ zFKy&yR^(}Y_}_@R=do|ZJSM4NXGWpxs$P|DUQ+dQxuegs6`Zqt&i8cAchCQ)Z>?Ar z?ZO}+_-xKHh3lRS4FXJSO&OAU`k&9#zfjG-;M%Xy|5H}wh2C8{<$JMB>OO{=ZE@K% s(`8saG-H!_g1nyXe=?`|+~2#rw1j)78&qol`;+07#lh)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-right-bare-slime.png b/Resources/Textures/Effects/footprints.rsi/footprint-right-bare-slime.png new file mode 100644 index 0000000000000000000000000000000000000000..c10fe24f0b0c139e4615a2c66410f41b393af1df GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}O`a}}ArY-_ zFYo4UP!MT-*lfX`9C68dYL2V_ONlp*8+Jzopr0M}kaO8@`> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-shoes.png b/Resources/Textures/Effects/footprints.rsi/footprint-shoes.png new file mode 100644 index 0000000000000000000000000000000000000000..6cf329a9b6fe8ddc5af18ec0b463c3a621a252a4 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJNKY5Xkcv5PFKy&HV8Fq0Vafmh zlXrQUZRfbId0}1DtD^kt)<+CGIy$%*65jVtD-dkl{rJaT2Dvjju?b;Zd&JJpyf;-$ v@agCHn+JvWT$5UL>vKmgzlV#bP0l+XkKYGOFD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/footprint-suit.png b/Resources/Textures/Effects/footprints.rsi/footprint-suit.png new file mode 100644 index 0000000000000000000000000000000000000000..6bc32d343c7b4989d76804ca145da19dd67736d1 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Q$1ZALn2z= zPI2UNR^)M6ED}@2%)0*RUDmHGd7Edx^LiWqr9A4E>*oV!9~@Df(IL^6_{X}>l<7d& z3CmStsjv1Xuicty=yuX_e@s8n(zRQCwU-9O?l539+;OXk;vd$@?2>=|MRyF_t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/footprints.rsi/meta.json b/Resources/Textures/Effects/footprints.rsi/meta.json new file mode 100644 index 00000000000..0ce2e096ac5 --- /dev/null +++ b/Resources/Textures/Effects/footprints.rsi/meta.json @@ -0,0 +1,71 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "IMPERIAL SPACE", + "states": [ + { + "name": "footprint-left-bare-diona" + }, + { + "name": "footprint-left-bare-dwarf" + }, + { + "name": "footprint-left-bare-human" + }, + { + "name": "footprint-left-bare-lizard" + }, + { + "name": "footprint-left-bare-slime" + }, + { + "name": "footprint-left-bare-spider" + }, + { + "name": "footprint-right-bare-diona" + }, + { + "name": "footprint-right-bare-dwarf" + }, + { + "name": "footprint-right-bare-human" + }, + { + "name": "footprint-right-bare-lizard" + }, + { + "name": "footprint-right-bare-slime" + }, + { + "name": "footprint-right-bare-spider" + }, + { + "name": "footprint-shoes" + }, + { + "name": "footprint-suit" + }, + { + "name": "dragging-1" + }, + { + "name": "dragging-2" + }, + { + "name": "dragging-3" + }, + { + "name": "dragging-4" + }, + { + "name": "dragging-5" + }, + { + "name": "dragging-test" + } + ] +}