From 60ce5b5089ca053e6d81d29f07a8e21d89ad392a Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 22 Apr 2020 04:23:12 +1000 Subject: [PATCH] Add puddles / reagent spills (#743) --- Content.Client/EntryPoint.cs | 6 +- .../Components/Fluids/BucketComponent.cs | 120 +++++++ .../Components/Fluids/CanSpillComponent.cs | 47 +++ .../Components/Fluids/MopComponent.cs | 112 ++++++ .../Components/Fluids/PuddleComponent.cs | 333 ++++++++++++++++++ .../Components/Fluids/SpillHelper.cs | 90 +++++ .../Components/Nutrition/DrinkComponent.cs | 7 +- .../GameObjects/EntitySystems/PuddleSystem.cs | 47 +++ Content.Shared/Chemistry/ReagentUnit.cs | 20 +- .../Shared/Chemistry/Solution_Tests.cs | 23 +- Resources/Audio/effects/Fluids/slosh.ogg | Bin 0 -> 28844 bytes Resources/Audio/effects/Fluids/splat.ogg | Bin 0 -> 11605 bytes .../Audio/effects/Fluids/watersplash.ogg | Bin 0 -> 24381 bytes .../Prototypes/Entities/Fluids/puddle.yml | 119 +++++++ Resources/Prototypes/Entities/Janitor.yml | 38 +- Resources/Prototypes/Reagents/chemicals.yml | 4 +- .../Textures/Fluids/gibblet.rsi/gibblet-0.png | Bin 0 -> 343 bytes .../Textures/Fluids/gibblet.rsi/gibblet-1.png | Bin 0 -> 301 bytes .../Textures/Fluids/gibblet.rsi/gibblet-2.png | Bin 0 -> 353 bytes .../Textures/Fluids/gibblet.rsi/gibblet-3.png | Bin 0 -> 367 bytes .../Textures/Fluids/gibblet.rsi/gibblet-4.png | Bin 0 -> 349 bytes .../Textures/Fluids/gibblet.rsi/meta.json | 31 ++ Resources/Textures/Fluids/smear.rsi/meta.json | 39 ++ .../Textures/Fluids/smear.rsi/smear-0.png | Bin 0 -> 553 bytes .../Textures/Fluids/smear.rsi/smear-1.png | Bin 0 -> 519 bytes .../Textures/Fluids/smear.rsi/smear-2.png | Bin 0 -> 481 bytes .../Textures/Fluids/smear.rsi/smear-3.png | Bin 0 -> 509 bytes .../Textures/Fluids/smear.rsi/smear-4.png | Bin 0 -> 470 bytes .../Textures/Fluids/smear.rsi/smear-5.png | Bin 0 -> 511 bytes .../Textures/Fluids/smear.rsi/smear-6.png | Bin 0 -> 387 bytes .../Textures/Fluids/splatter.rsi/meta.json | 35 ++ .../Fluids/splatter.rsi/splatter-0.png | Bin 0 -> 392 bytes .../Fluids/splatter.rsi/splatter-1.png | Bin 0 -> 400 bytes .../Fluids/splatter.rsi/splatter-2.png | Bin 0 -> 440 bytes .../Fluids/splatter.rsi/splatter-3.png | Bin 0 -> 383 bytes .../Fluids/splatter.rsi/splatter-4.png | Bin 0 -> 279 bytes .../Fluids/splatter.rsi/splatter-5.png | Bin 0 -> 267 bytes Resources/Textures/Fluids/vomit.rsi/meta.json | 27 ++ .../Textures/Fluids/vomit.rsi/vomit-0.png | Bin 0 -> 566 bytes .../Textures/Fluids/vomit.rsi/vomit-1.png | Bin 0 -> 663 bytes .../Textures/Fluids/vomit.rsi/vomit-2.png | Bin 0 -> 523 bytes .../Textures/Fluids/vomit.rsi/vomit-3.png | Bin 0 -> 457 bytes .../Textures/Fluids/vomit_toxin.rsi/meta.json | 27 ++ .../Fluids/vomit_toxin.rsi/vomit_toxin-0.png | Bin 0 -> 613 bytes .../Fluids/vomit_toxin.rsi/vomit_toxin-1.png | Bin 0 -> 722 bytes .../Fluids/vomit_toxin.rsi/vomit_toxin-2.png | Bin 0 -> 573 bytes .../Fluids/vomit_toxin.rsi/vomit_toxin-3.png | Bin 0 -> 501 bytes .../Textures/Fluids/writing.rsi/meta.json | 31 ++ .../Textures/Fluids/writing.rsi/writing-0.png | Bin 0 -> 439 bytes .../Textures/Fluids/writing.rsi/writing-1.png | Bin 0 -> 373 bytes .../Textures/Fluids/writing.rsi/writing-2.png | Bin 0 -> 362 bytes .../Textures/Fluids/writing.rsi/writing-3.png | Bin 0 -> 402 bytes .../Textures/Fluids/writing.rsi/writing-4.png | Bin 0 -> 296 bytes 53 files changed, 1143 insertions(+), 13 deletions(-) create mode 100644 Content.Server/GameObjects/Components/Fluids/BucketComponent.cs create mode 100644 Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs create mode 100644 Content.Server/GameObjects/Components/Fluids/MopComponent.cs create mode 100644 Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs create mode 100644 Content.Server/GameObjects/Components/Fluids/SpillHelper.cs create mode 100644 Content.Server/GameObjects/EntitySystems/PuddleSystem.cs create mode 100644 Resources/Audio/effects/Fluids/slosh.ogg create mode 100644 Resources/Audio/effects/Fluids/splat.ogg create mode 100644 Resources/Audio/effects/Fluids/watersplash.ogg create mode 100644 Resources/Prototypes/Entities/Fluids/puddle.yml create mode 100644 Resources/Textures/Fluids/gibblet.rsi/gibblet-0.png create mode 100644 Resources/Textures/Fluids/gibblet.rsi/gibblet-1.png create mode 100644 Resources/Textures/Fluids/gibblet.rsi/gibblet-2.png create mode 100644 Resources/Textures/Fluids/gibblet.rsi/gibblet-3.png create mode 100644 Resources/Textures/Fluids/gibblet.rsi/gibblet-4.png create mode 100644 Resources/Textures/Fluids/gibblet.rsi/meta.json create mode 100644 Resources/Textures/Fluids/smear.rsi/meta.json create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-0.png create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-1.png create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-2.png create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-3.png create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-4.png create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-5.png create mode 100644 Resources/Textures/Fluids/smear.rsi/smear-6.png create mode 100644 Resources/Textures/Fluids/splatter.rsi/meta.json create mode 100644 Resources/Textures/Fluids/splatter.rsi/splatter-0.png create mode 100644 Resources/Textures/Fluids/splatter.rsi/splatter-1.png create mode 100644 Resources/Textures/Fluids/splatter.rsi/splatter-2.png create mode 100644 Resources/Textures/Fluids/splatter.rsi/splatter-3.png create mode 100644 Resources/Textures/Fluids/splatter.rsi/splatter-4.png create mode 100644 Resources/Textures/Fluids/splatter.rsi/splatter-5.png create mode 100644 Resources/Textures/Fluids/vomit.rsi/meta.json create mode 100644 Resources/Textures/Fluids/vomit.rsi/vomit-0.png create mode 100644 Resources/Textures/Fluids/vomit.rsi/vomit-1.png create mode 100644 Resources/Textures/Fluids/vomit.rsi/vomit-2.png create mode 100644 Resources/Textures/Fluids/vomit.rsi/vomit-3.png create mode 100644 Resources/Textures/Fluids/vomit_toxin.rsi/meta.json create mode 100644 Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-0.png create mode 100644 Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-1.png create mode 100644 Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-2.png create mode 100644 Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-3.png create mode 100644 Resources/Textures/Fluids/writing.rsi/meta.json create mode 100644 Resources/Textures/Fluids/writing.rsi/writing-0.png create mode 100644 Resources/Textures/Fluids/writing.rsi/writing-1.png create mode 100644 Resources/Textures/Fluids/writing.rsi/writing-2.png create mode 100644 Resources/Textures/Fluids/writing.rsi/writing-3.png create mode 100644 Resources/Textures/Fluids/writing.rsi/writing-4.png diff --git a/Content.Client/EntryPoint.cs b/Content.Client/EntryPoint.cs index 7e5dd43715..a13ef741be 100644 --- a/Content.Client/EntryPoint.cs +++ b/Content.Client/EntryPoint.cs @@ -138,7 +138,11 @@ namespace Content.Client "TransformableContainer", "Mind", "MovementSpeedModifier", - "StorageFill" + "StorageFill", + "Mop", + "Bucket", + "Puddle", + "CanSpill", }; foreach (var ignoreName in registerIgnore) diff --git a/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs new file mode 100644 index 0000000000..98b9cf9891 --- /dev/null +++ b/Content.Server/GameObjects/Components/Fluids/BucketComponent.cs @@ -0,0 +1,120 @@ +using System; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.GameObjects.Components.Sound; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.Chemistry; +using Content.Shared.Interfaces; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Serialization; + +namespace Content.Server.GameObjects.Components.Fluids +{ + /// + /// Can a mop click on this entity and dump its fluids + /// + [RegisterComponent] + public class BucketComponent : Component, IAttackBy + { +#pragma warning disable 649 + [Dependency] private readonly ILocalizationManager _localizationManager; +#pragma warning restore 649 + + public override string Name => "Bucket"; + + public ReagentUnit MaxVolume + { + get => _contents.MaxVolume; + set => _contents.MaxVolume = value; + } + + public ReagentUnit CurrentVolume => _contents.CurrentVolume; + + private SolutionComponent _contents; + + private string _sound; + + /// + public override void ExposeData(ObjectSerializer serializer) + { + serializer.DataFieldCached(ref _sound, "sound", "/Audio/effects/Fluids/watersplash.ogg"); + } + + /// + public override void Initialize() + { + base.Initialize(); + _contents = Owner.GetComponent(); + } + + private bool TryGiveToMop(MopComponent mopComponent) + { + // Let's fill 'er up + // If this is called the mop should be empty but just in case we'll do Max - Current + var transferAmount = ReagentUnit.Min(mopComponent.MaxVolume - mopComponent.CurrentVolume, CurrentVolume); + var solution = _contents.SplitSolution(transferAmount); + if (!mopComponent.Contents.TryAddSolution(solution) || mopComponent.CurrentVolume == 0) + { + return false; + } + + if (_sound == null) + { + return true; + } + + Owner.TryGetComponent(out SoundComponent soundComponent); + soundComponent?.Play(_sound); + + return true; + } + + public bool AttackBy(AttackByEventArgs eventArgs) + { + if (!eventArgs.AttackWith.TryGetComponent(out MopComponent mopComponent)) + { + return false; + } + + // Give to the mop if it's empty + if (mopComponent.CurrentVolume == 0) + { + if (!TryGiveToMop(mopComponent)) + { + return false; + } + + Owner.PopupMessage(eventArgs.User, _localizationManager.GetString("Splish")); + return true; + } + + var transferAmount = ReagentUnit.Min(mopComponent.CurrentVolume, MaxVolume - CurrentVolume); + if (transferAmount == 0) + { + return false; + } + + var solution = mopComponent.Contents.SplitSolution(transferAmount); + if (!_contents.TryAddSolution(solution)) + { + //This really shouldn't happen + throw new InvalidOperationException(); + } + + // Give some visual feedback shit's happening (for anyone who can't hear sound) + Owner.PopupMessage(eventArgs.User, _localizationManager.GetString("Sploosh")); + + if (_sound == null) + { + return true; + } + + Owner.TryGetComponent(out SoundComponent soundComponent); + soundComponent?.Play(_sound); + + return true; + + } + } +} diff --git a/Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs b/Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs new file mode 100644 index 0000000000..b48fca2312 --- /dev/null +++ b/Content.Server/GameObjects/Components/Fluids/CanSpillComponent.cs @@ -0,0 +1,47 @@ +using System; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Shared.Chemistry; +using Content.Shared.GameObjects; +using Robust.Shared.GameObjects; +using Robust.Shared.Interfaces.GameObjects; + +namespace Content.Server.GameObjects.Components.Fluids +{ + [RegisterComponent] + public class CanSpillComponent : Component + { + public override string Name => "CanSpill"; + // TODO: If the Owner doesn't have a SolutionComponent straight up just have this remove itself? + + /// + /// Transfers solution from the held container to the target container. + /// + [Verb] + private sealed class FillTargetVerb : Verb + { + protected override string GetText(IEntity user, CanSpillComponent component) + { + return "Spill liquid"; + } + + protected override VerbVisibility GetVisibility(IEntity user, CanSpillComponent component) + { + if (component.Owner.TryGetComponent(out SolutionComponent solutionComponent)) + { + return solutionComponent.CurrentVolume > ReagentUnit.Zero ? VerbVisibility.Visible : VerbVisibility.Disabled; + } + + return VerbVisibility.Invisible; + } + + protected override void Activate(IEntity user, CanSpillComponent component) + { + var solutionComponent = component.Owner.GetComponent(); + // Need this as when we split the component's owner may be deleted + var entityLocation = component.Owner.Transform.GridPosition; + var solution = solutionComponent.SplitSolution(solutionComponent.CurrentVolume); + SpillHelper.SpillAt(entityLocation, solution, "PuddleSmear"); + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Fluids/MopComponent.cs b/Content.Server/GameObjects/Components/Fluids/MopComponent.cs new file mode 100644 index 0000000000..22f722ea9c --- /dev/null +++ b/Content.Server/GameObjects/Components/Fluids/MopComponent.cs @@ -0,0 +1,112 @@ +using System; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Server.GameObjects.Components.Sound; +using Content.Server.GameObjects.EntitySystems; +using Content.Shared.Chemistry; +using Content.Shared.Interfaces; +using Robust.Shared.GameObjects; +using Robust.Shared.IoC; +using Robust.Shared.Localization; +using Robust.Shared.Serialization; + +namespace Content.Server.GameObjects.Components.Fluids +{ + /// + /// For cleaning up puddles + /// + [RegisterComponent] + public class MopComponent : Component, IAfterAttack + { +#pragma warning disable 649 + [Dependency] private readonly ILocalizationManager _localizationManager; +#pragma warning restore 649 + + public override string Name => "Mop"; + internal SolutionComponent Contents => _contents; + private SolutionComponent _contents; + + public ReagentUnit MaxVolume + { + get => _contents.MaxVolume; + set => _contents.MaxVolume = value; + } + + public ReagentUnit CurrentVolume => _contents.CurrentVolume; + + // Currently there's a separate amount for pickup and dropoff so + // Picking up a puddle requires multiple clicks + // Dumping in a bucket requires 1 click + // Long-term you'd probably use a cooldown and start the pickup once we have some form of global cooldown + public ReagentUnit PickupAmount => _pickupAmount; + private ReagentUnit _pickupAmount; + + private string _pickupSound; + + /// + public override void ExposeData(ObjectSerializer serializer) + { + serializer.DataFieldCached(ref _pickupSound, "pickup_sound", "/Audio/effects/Fluids/slosh.ogg"); + // The turbo mop will pickup more + serializer.DataFieldCached(ref _pickupAmount, "pickup_amount", ReagentUnit.New(5)); + } + + public override void Initialize() + { + base.Initialize(); + _contents = Owner.GetComponent(); + + } + + void IAfterAttack.AfterAttack(AfterAttackEventArgs eventArgs) + { + Solution solution; + if (eventArgs.Attacked == null) + { + if (CurrentVolume <= 0) + { + return; + } + // Drop the liquid on the mop on to the ground I guess? Potentially change by design + // Maybe even use a toggle mode instead of "Pickup" and "dropoff" + solution = _contents.SplitSolution(CurrentVolume); + SpillHelper.SpillAt(eventArgs.ClickLocation, solution, "PuddleSmear"); + + return; + } + + if (!eventArgs.Attacked.TryGetComponent(out PuddleComponent puddleComponent)) + { + return; + } + // Essentially pickup either: + // - _pickupAmount, + // - whatever's left in the puddle, or + // - whatever we can still hold (whichever's smallest) + var transferAmount = ReagentUnit.Min(ReagentUnit.New(5), puddleComponent.CurrentVolume, MaxVolume - CurrentVolume); + if (transferAmount == 0) + { + return; + } + + solution = puddleComponent.SplitSolution(transferAmount); + // Probably don't recolor a mop? Could work, if we layered it maybe + if (!_contents.TryAddSolution(solution, false, true)) + { + // I can't imagine why this would happen + throw new InvalidOperationException(); + } + + // Give some visual feedback shit's happening (for anyone who can't hear sound) + Owner.PopupMessage(eventArgs.User, _localizationManager.GetString("Swish")); + + if (_pickupSound == null) + { + return; + } + + Owner.TryGetComponent(out SoundComponent soundComponent); + soundComponent?.Play(_pickupSound); + + } + } +} diff --git a/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs new file mode 100644 index 0000000000..ebc8d8b3be --- /dev/null +++ b/Content.Server/GameObjects/Components/Fluids/PuddleComponent.cs @@ -0,0 +1,333 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Content.Server.GameObjects.Components.Chemistry; +using Content.Shared.Chemistry; +using Content.Shared.Physics; +using Robust.Server.GameObjects; +using Robust.Server.GameObjects.EntitySystems; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components; +using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Random; +using Robust.Shared.IoC; +using Robust.Shared.Maths; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; +using Robust.Shared.ViewVariables; +using Timer = Robust.Shared.Timers.Timer; + +namespace Content.Server.GameObjects.Components.Fluids +{ + /// + /// Puddle on a floor + /// + [RegisterComponent] + public class PuddleComponent : Component + { + // Current design: Something calls the SpillHelper.Spill, that will either + // A) Add to an existing puddle at the location (normalised to tile-center) or + // B) add a new one + // From this every time a puddle is spilt on it will try and overflow to its neighbours if possible, + // and also update its appearance based on volume level (opacity) and chemistry color + // Small puddles will evaporate after a set delay + + // TODO: 'leaves fluidtracks', probably in a separate component for stuff like gibb chunks?; + // TODO: Add stuff like slipping -> probably in a separate component (for stuff like bananas) and using BumpEntMsg + + // based on behaviour (e.g. someone being punched vs slashed with a sword would have different blood sprite) + // to check for low volumes for evaporation or whatever + + public override string Name => "Puddle"; + + private CancellationTokenSource _evaporationToken; + private ReagentUnit _evaporateThreshold; // How few we can hold prior to self-destructing + private float _evaporateTime; + private string _spillSound; + private DateTime _lastOverflow = DateTime.Now; + private SpriteComponent _spriteComponent; + + private SnapGridComponent _snapGrid; + + public ReagentUnit MaxVolume + { + get => _contents.MaxVolume; + set => _contents.MaxVolume = value; + } + + [ViewVariables] + public ReagentUnit CurrentVolume => _contents.CurrentVolume; + + // Volume at which the fluid will try to spill to adjacent components + // Currently a random number, potentially change + public ReagentUnit OverflowVolume => _overflowVolume; + [ViewVariables] + private ReagentUnit _overflowVolume; + + private SolutionComponent _contents; + private int _spriteVariants; + // Whether the underlying solution color should be used + private bool _recolor; + + /// + public override void ExposeData(ObjectSerializer serializer) + { + serializer.DataFieldCached(ref _spillSound, "spill_sound", "/Audio/effects/Fluids/splat.ogg"); + serializer.DataField(ref _overflowVolume, "overflow_volume", ReagentUnit.New(20)); + serializer.DataField(ref _evaporateTime, "evaporate_time", 600.0f); + // Long-term probably have this based on the underlying reagents + serializer.DataField(ref _evaporateThreshold, "evaporate_threshold", ReagentUnit.New(2)); + serializer.DataField(ref _spriteVariants, "variants", 1); + serializer.DataField(ref _recolor, "recolor", false); + } + + public override void Initialize() + { + base.Initialize(); + if (Owner.TryGetComponent(out SolutionComponent solutionComponent)) + { + _contents = solutionComponent; + } + else + { + _contents = Owner.AddComponent(); + _contents.Initialize(); + } + + _snapGrid = Owner.GetComponent(); + + // Smaller than 1m^3 for now but realistically this shouldn't be hit + MaxVolume = ReagentUnit.New(1000); + + // Random sprite state set server-side so it's consistent across all clients + _spriteComponent = Owner.GetComponent(); + var robustRandom = IoCManager.Resolve(); + var randomVariant = robustRandom.Next(0, _spriteVariants - 1); + var baseName = new ResourcePath(_spriteComponent.BaseRSIPath).FilenameWithoutExtension; + + _spriteComponent.LayerSetState(0, $"{baseName}-{randomVariant}"); // TODO: Remove hardcode + _spriteComponent.Rotation = Angle.FromDegrees(robustRandom.Next(0, 359)); + // UpdateAppearance should get called soon after this so shouldn't need to call Dirty() here + } + + // Flow rate should probably be controlled globally so this is it for now + internal bool TryAddSolution(Solution solution, bool sound = true, bool checkForEvaporate = true) + { + if (solution.TotalVolume == 0) + { + return false; + } + var result = _contents.TryAddSolution(solution); + if (!result) + { + return false; + } + + UpdateStatus(); + CheckOverflow(); + if (checkForEvaporate) + { + CheckEvaporate(); + } + + UpdateAppearance(); + if (!sound) + { + return true; + } + + var entitySystemManager = IoCManager.Resolve(); + entitySystemManager.GetEntitySystem().Play(_spillSound); + return true; + } + + internal Solution SplitSolution(ReagentUnit quantity) + { + var split = _contents.SplitSolution(quantity); + CheckEvaporate(); + UpdateAppearance(); + return split; + } + + public void CheckEvaporate() + { + if (CurrentVolume == 0) + { + Owner.Delete(); + } + } + + private void UpdateStatus() + { + // If UpdateStatus is getting called again it means more fluid has been updated so let's just wait + _evaporationToken?.Cancel(); + + if (CurrentVolume > _evaporateThreshold) + { + return; + } + + _evaporationToken = new CancellationTokenSource(); + + // KYS to evaporate + Timer.Spawn(TimeSpan.FromSeconds(_evaporateTime), CheckEvaporate, _evaporationToken.Token); + } + + private void UpdateAppearance() + { + if (Owner.Deleted) + { + return; + } + // Opacity based on level of fullness to overflow + // Hard-cap lower bound for visibility reasons + var volumeScale = (CurrentVolume.Float() / OverflowVolume.Float()) * 0.75f + 0.25f; + var cappedScale = Math.Min(1.0f, volumeScale); + // Color based on the underlying solutioncomponent + Color newColor; + if (_recolor) + { + newColor = _contents.SubstanceColor.WithAlpha(cappedScale); + } + else + { + newColor = _spriteComponent.Color.WithAlpha(cappedScale); + } + + _spriteComponent.Color = newColor; + + _spriteComponent.Dirty(); + + } + + /// + /// Will overflow this entity to neighboring entities if required + /// + private void CheckOverflow() + { + if (CurrentVolume <= _overflowVolume) + { + return; + } + + // Essentially: + // Spill at least 1 solution to each neighbor (so most of the time each puddle is getting 1 max) + // If there's no puddle at the neighbor then add one. + + // Setup + // If there's more neighbors to spill to then there are reagents to go around (coz integers) + var overflowAmount = CurrentVolume - OverflowVolume; + + var neighborPuddles = new List(8); + + // Will overflow to each neighbor; if it already has a puddle entity then add to that + + foreach (var direction in RandomDirections()) + { + // Can't spill < 1 reagent so stop overflowing + if ((ReagentUnit.Epsilon * neighborPuddles.Count) == overflowAmount) + { + break; + } + + // If we found an existing puddle on that tile then we don't need to spawn a new one + var noSpawn = false; + + foreach (var entity in _snapGrid.GetInDir(direction)) + { + // Don't overflow to walls + if (entity.TryGetComponent(out CollidableComponent collidableComponent) && + collidableComponent.CollisionLayer == (int) CollisionGroup.Impassable) + { + noSpawn = true; + break; + } + + if (!entity.TryGetComponent(out PuddleComponent puddleComponent)) + { + continue; + } + + // If we've overflowed recently don't include it + noSpawn = true; + // TODO: PauseManager + if ((DateTime.Now - puddleComponent._lastOverflow).TotalSeconds < 1) + { + break; + } + + neighborPuddles.Add(entity); + break; + } + + if (noSpawn) + { + continue; + } + + var grid = _snapGrid.DirectionToGrid(direction); + // We'll just add the co-ordinates as we need to figure out how many puddles we need to spawn first + var entityManager = IoCManager.Resolve(); + neighborPuddles.Add(entityManager.SpawnEntity(Owner.Prototype.ID, grid)); + } + + if (neighborPuddles.Count == 0) + { + return; + } + + var spillAmount = overflowAmount / ReagentUnit.New(neighborPuddles.Count); + + SpillToNeighbours(neighborPuddles, spillAmount); + } + + // TODO: Move the below to SnapGrid? + /// + /// Will yield a random direction until none are left + /// + /// + private static IEnumerable RandomDirections() + { + var directions = new[] + { + Direction.East, + Direction.SouthEast, + Direction.South, + Direction.SouthWest, + Direction.West, + Direction.NorthWest, + Direction.North, + Direction.NorthEast, + }; + + var robustRandom = IoCManager.Resolve(); + var n = directions.Length; + + while (n > 1) + { + n--; + var k = robustRandom.Next(n + 1); + var value = directions[k]; + directions[k] = directions[n]; + directions[n] = value; + } + + foreach (var direction in directions) + { + yield return direction; + } + } + + private void SpillToNeighbours(IEnumerable neighbors, ReagentUnit spillAmount) + { + foreach (var neighborPuddle in neighbors) + { + var solution = _contents.SplitSolution(spillAmount); + + neighborPuddle.GetComponent().TryAddSolution(solution, false, false); + + } + } + } +} diff --git a/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs b/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs new file mode 100644 index 0000000000..e064a61e80 --- /dev/null +++ b/Content.Server/GameObjects/Components/Fluids/SpillHelper.cs @@ -0,0 +1,90 @@ +using Content.Shared.Chemistry; +using Robust.Server.Interfaces.GameObjects; + +using Robust.Shared.Interfaces.GameObjects; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; +using Robust.Shared.Map; + +namespace Content.Server.GameObjects.Components.Fluids +{ + public static class SpillHelper + { + + /// + /// Spills the specified solution at the entity's location if possible. + /// + /// Entity location to spill at + /// Initial solution for the prototype + /// Prototype to use + internal static void SpillAt(IEntity entity, Solution solution, string prototype) + { + var entityLocation = entity.Transform.GridPosition; + SpillAt(entityLocation, solution, prototype); + } + + // Other functions will be calling this one + + /// + /// Spills solution at the specified grid co-ordinates + /// + /// + /// Initial solution for the prototype + /// Prototype to use + internal static void SpillAt(GridCoordinates gridCoordinates, Solution solution, string prototype) + { + if (solution.TotalVolume == 0) + { + return; + } + + var mapManager = IoCManager.Resolve(); + var entityManager = IoCManager.Resolve(); + var serverEntityManager = IoCManager.Resolve(); + + var mapGrid = mapManager.GetGrid(gridCoordinates.GridID); + + // If space return early, let that spill go out into the void + var tileRef = mapGrid.GetTileRef(gridCoordinates); + if (tileRef.Tile.IsEmpty) + { + return; + } + + // Get normalized co-ordinate for spill location and spill it in the centre + // TODO: Does SnapGrid or something else already do this? + var spillTileMapGrid = mapManager.GetGrid(gridCoordinates.GridID); + var spillTileRef = spillTileMapGrid.GetTileRef(gridCoordinates).GridIndices; + var spillGridCoords = spillTileMapGrid.GridTileToLocal(spillTileRef); + + var spilt = false; + + foreach (var spillEntity in entityManager.GetEntitiesAt(spillTileMapGrid.ParentMapId, spillGridCoords.Position)) + { + if (!spillEntity.TryGetComponent(out PuddleComponent puddleComponent)) + { + continue; + } + + if (!puddleComponent.TryAddSolution(solution)) + { + continue; + } + + spilt = true; + break; + } + + // Did we add to an existing puddle + if (spilt) + { + return; + } + + var puddle = serverEntityManager.SpawnEntity(prototype, spillGridCoords); + puddle.GetComponent().TryAddSolution(solution); + } + + } + +} diff --git a/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs b/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs index 3a3886f52b..f7741b8f44 100644 --- a/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs +++ b/Content.Server/GameObjects/Components/Nutrition/DrinkComponent.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using Content.Server.GameObjects.Components.Chemistry; using Content.Server.GameObjects.Components.Sound; using Content.Server.GameObjects.EntitySystems; @@ -7,6 +8,7 @@ using Content.Shared.GameObjects.Components.Nutrition; using Content.Shared.Interfaces; using Content.Shared.Maths; using Robust.Server.GameObjects; +using Robust.Server.GameObjects.EntitySystems; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; @@ -119,9 +121,12 @@ namespace Content.Server.GameObjects.Components.Nutrition var split = _contents.SplitSolution(transferAmount); if (stomachComponent.TryTransferSolution(split)) { + // When we split Finish gets called which may delete the can so need to use the entity system for sound if (_useSound != null) { - Owner.GetComponent()?.Play(_useSound); + var entitySystemManager = IoCManager.Resolve(); + var audioSystem = entitySystemManager.GetEntitySystem(); + audioSystem.Play(_useSound); user.PopupMessage(user, _localizationManager.GetString("Slurp")); } } diff --git a/Content.Server/GameObjects/EntitySystems/PuddleSystem.cs b/Content.Server/GameObjects/EntitySystems/PuddleSystem.cs new file mode 100644 index 0000000000..4cb51c3f6e --- /dev/null +++ b/Content.Server/GameObjects/EntitySystems/PuddleSystem.cs @@ -0,0 +1,47 @@ +using Content.Server.GameObjects.Components.Fluids; +using Robust.Shared.GameObjects; +using Robust.Shared.GameObjects.Components.Transform; +using Robust.Shared.GameObjects.Systems; +using Robust.Shared.Interfaces.Map; +using Robust.Shared.IoC; +using Robust.Shared.Map; + +namespace Content.Server.GameObjects.EntitySystems +{ + public class PuddleSystem : EntitySystem + { + public override void Initialize() + { + base.Initialize(); + EntityQuery = new TypeEntityQuery(typeof(PuddleComponent)); + var mapManager = IoCManager.Resolve(); + mapManager.TileChanged += HandleTileChanged; + } + + public override void Shutdown() + { + base.Shutdown(); + var mapManager = IoCManager.Resolve(); + mapManager.TileChanged -= HandleTileChanged; + } + + private void HandleTileChanged(object sender, TileChangedEventArgs eventArgs) + { + // If this gets hammered you could probably queue up all the tile changes every tick but I doubt that would ever happen. + var entities = EntityManager.GetEntities(EntityQuery); + + foreach (var entity in entities) + { + // If the tile becomes space then delete it (potentially change by design) + if (eventArgs.NewTile.GridIndex == entity.Transform.GridID && + entity.TryGetComponent(out SnapGridComponent snapGridComponent) && + snapGridComponent.Position == eventArgs.NewTile.GridIndices && + eventArgs.NewTile.Tile.IsEmpty) + { + entity.Delete(); + break; // Currently it's one puddle per tile, if that changes remove this + } + } + } + } +} diff --git a/Content.Shared/Chemistry/ReagentUnit.cs b/Content.Shared/Chemistry/ReagentUnit.cs index 43c2354f03..e74bd41fc8 100644 --- a/Content.Shared/Chemistry/ReagentUnit.cs +++ b/Content.Shared/Chemistry/ReagentUnit.cs @@ -1,7 +1,5 @@ using Robust.Shared.Interfaces.Serialization; -using Robust.Shared.Serialization; using System; -using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq; @@ -13,7 +11,9 @@ namespace Content.Shared.Chemistry private int _value; private static readonly int Shift = 2; - public static ReagentUnit MaxValue => new ReagentUnit(int.MaxValue); + public static ReagentUnit MaxValue { get; } = new ReagentUnit(int.MaxValue); + public static ReagentUnit Epsilon { get; } = new ReagentUnit(1); + public static ReagentUnit Zero { get; } = new ReagentUnit(0); private double ShiftDown() { @@ -131,6 +131,16 @@ namespace Content.Shared.Chemistry return a.ShiftDown() != b; } + public static bool operator ==(ReagentUnit a, ReagentUnit b) + { + return a.Equals(b); + } + + public static bool operator !=(ReagentUnit a, ReagentUnit b) + { + return !a.Equals(b); + } + public static bool operator <=(ReagentUnit a, ReagentUnit b) { return a._value <= b._value; @@ -204,12 +214,12 @@ namespace Content.Shared.Chemistry return ToString(); } - public bool Equals([AllowNull] ReagentUnit other) + public bool Equals(ReagentUnit other) { return _value == other._value; } - public int CompareTo([AllowNull] ReagentUnit other) + public int CompareTo(ReagentUnit other) { if(other._value > _value) { diff --git a/Content.Tests/Shared/Chemistry/Solution_Tests.cs b/Content.Tests/Shared/Chemistry/Solution_Tests.cs index d5d101353e..26d40328c9 100644 --- a/Content.Tests/Shared/Chemistry/Solution_Tests.cs +++ b/Content.Tests/Shared/Chemistry/Solution_Tests.cs @@ -12,7 +12,7 @@ namespace Content.Tests.Shared.Chemistry var solution = new Solution(); solution.AddReagent("water", ReagentUnit.New(1000)); var quantity = solution.GetReagentQuantity("water"); - + Assert.That(quantity.Int(), Is.EqualTo(1000)); } @@ -302,6 +302,27 @@ namespace Content.Tests.Shared.Chemistry Assert.That(splitSolution.TotalVolume.Int(), Is.EqualTo(0)); } + [Test] + public void SplitSolutionZero() + { + var solution = new Solution(); + solution.AddReagent("chem.Impedrezene", ReagentUnit.New(0.01 + 0.19)); + solution.AddReagent("chem.Thermite", ReagentUnit.New(0.01 + 0.39)); + solution.AddReagent("chem.Li", ReagentUnit.New(0.01 + 0.17)); + solution.AddReagent("chem.F", ReagentUnit.New(0.01 + 0.17)); + solution.AddReagent("chem.Na", ReagentUnit.New(0 + 0.13)); + solution.AddReagent("chem.Hg", ReagentUnit.New(0.15 + 4.15)); + solution.AddReagent("chem.Cu", ReagentUnit.New(0 + 0.13)); + solution.AddReagent("chem.U", ReagentUnit.New(0.76 + 20.77)); + solution.AddReagent("chem.Fe", ReagentUnit.New(0.01 + 0.36)); + solution.AddReagent("chem.SpaceDrugs", ReagentUnit.New(0.02 + 0.41)); + solution.AddReagent("chem.Al", ReagentUnit.New(0)); + solution.AddReagent("chem.Glucose", ReagentUnit.New(0)); + solution.AddReagent("chem.O", ReagentUnit.New(0)); + + solution.SplitSolution(ReagentUnit.New(0.98)); + } + [Test] public void AddSolution() { diff --git a/Resources/Audio/effects/Fluids/slosh.ogg b/Resources/Audio/effects/Fluids/slosh.ogg new file mode 100644 index 0000000000000000000000000000000000000000..78df794db120a42af1bd57ba2d1db8636c3f1538 GIT binary patch literal 28844 zcmagF1y~);vMxLeclV&d-3jh4A-Dwz?(RVrP7*9Y2rj{$-~?MhaCf&rfZ)MNApAqV zz0cYIx%WADo}uaKny&7ydaJs+r%ZwR*g%d{g{vq31ggl zu8`ex!D4FUw;CHlsNI(g7S2WWMGnqm%=9Rj28aMC7fD5$2m;N=#5|fNk_1em$lV8M ziZk8OSW0q3(Rc=^!&G^G6eK+t{!x-2C%n&8KOv3IUO%O*$~~)VQPqxQ9N;k~w43>_ z1oiJYsKLHSBavF-NTWQmk7h1Pbq87fGc0NV3Jw!ccu%18nPB)c`RF8_`Wc%BKK~@I zoR+ql4tRMP>v>zvdwb1$2O6YC7&QkPG)EXML>OO3ydsJG*L@SXe*Jj=9Xd4x$fXrZ z*<$|mlga_k_P>?zsCEF5r34w%U2n8A7+XqH zGyZDOag1~e)Fty!T5oRJM7qbA5=MIAKRG|V4CKnvDX@%mHxsLm^cDD?-Bdbq>7qVZ z*I*)jr=*1d%)Lp@U~Fj7{)gYcU{Pw4Io2h#3D$VCl;O~VY7FLXEi;ctQ6J0xCwwG9 zy}eo>>B|bG4va%GC!i^!NuuLLL{Kuj|rBYiaNFkB_HIm3w_aWwD&?^2@ai?_SxD=EBagYBb*TAC(?@1nZEnYDl zZ5=&tCxee(%S{o+3tsEut5zXl2wC zXwdjCgZam7*5|$c!*U)?7{AeKT1EL z{SV8reOsLRwmACjZgd>en-se@>18dS9EYk7zWhJ$|FRqfcRKI}El19s?msLC#!W5* zT2n2X+W9|Y6q^JE>M2M3p9%l~SOSL1Uq7Ou$v&&eKdZ^Eqb>HoTMS5@5#ZhB+7rj*aE{FoUJp@1l0HE9h++RuD$CL(hWyiQtvyumd7z>l8l$hC5NO+m) zi|{PAGV`aD1`Co&RNiJ4;90z>1S7HYmG7YlZTH;ea{S=kYWM=Y8V9klV;+xlml=Wfelx> z@gzPK0(upExp4xkd3?3`4}7D1{2JOi!}vP0+B(ZbYC4VdYWQku7uq`bayo=M(%3|P;Nu)f^_ou!G@WxYPW=}vHG;pa1a#&b`87Os zG<2*Cv~>);tqiVp^yUIpK&qD7BB72>qt4=`lTJ$Drl*dvp4H;Djsa1S(R{?_Rp2Jc zBj@>9FOd3b&gxZ@*E*A3x}E)}lCpHBva-^$MyIl>N~2GEWuMB1YHiA@Du!yS%c~p@ zKx$PwL0e~U|HWetHdk8xI&wBu%~5}8D-@Mwa%KbpesG9eeVWp?zuJ zjA0C}1rE<{f#sMIYGM5&0c5qCTYx34Tv$M$qRg&40s=XIN=mV`08dM)v;kyQSU{wr z%-u*}nL}lg54~d#1nMseV z!s3*bm>Uz7Rl!~p}a?=v(~ZScY|ME~2X$_8Br`^rAB zar#0M73I$jL=Mi}J7mgsm5+^=_7WMzfsJc9@E6V5KN5_b#OBgHlq=_EG-E-6g;V=% z`sHIE^09H2&mR)O#&?zsV}z2Y%t2O(nlWGvBgdAa6nl`6uKBKEXUW5n z|7ymt;;{`CaE9=RZ@JV3y$%!}kc6UIG%yVrK506GEXcBvN5v@6~l+W(G&W4#pjS%@#@RO)mru(*PBa1+BP`8uU9z zq=h756C?!$7C27}NkF|65?Fw;CGo(LW+Am0lVV~Hf1%969D$>(L|+I7xM<{HJm)x( ztWOSh=pR2~hGCAu9ZBt}&BKBluByyf8UjkR(hGz_Veg2ceP#WEBuZt(9FGb;2nFlP zuc?M$1bYZ}=0ZEd4uw5Y=9P<&OJ#s$KGm?j6vGiqzVM(J9g53b;su3YD z!I1_DV7!+X1}25cQ;!5q4hXA0LmB1DUVVoun!-8r3jTQz z#0@*?4$2_GVYCGRRuGYa8u%x20*oZ6EPR%K2LYu9#TdgKNnrk#dpA=Cg}FBsjB$!c z9zzdsl6{OnVn71;*as4XcF7-;Opmz#4ov<#hx&gRL@5|&;p&33bsxzSlz*afdAz@m z7LNZ4(o_F={EwLZzoYm6EobCV2}15a6F{;P4H-DMjYOIm37CpvftNkLEG_k(%Huy$j|Q+yzsbpnZ~9RDcF#=m2)zft|Tw z&OD|8lt1Vp=FH#m&l#cv8_uo(RI$b_@6Q z8AR11Mrgu8HT+W+p738~IKsRCKnn!a?mzD(zmWb5EtEX4jF|!i8Pne!J(xrNCxH74 z#&A3^luHIV|5KKX2e$Dyyi3-6L?kGhN5WsI{>`D%Jc{e@%QXMgeT)S`h{8X5VcI>q z{Gq3ge4E|yFKh>t0VoClxGmTpFwYH8_hyEtsDvlDVfb$+V5ibcp z8H6tY)Igxv0F(|fIy%}qF283Bo=(;>yx{9L0{vg|V}gS6&r${9Z~mVJvZUNU8mhUZZ@BJ)PZ*j0{}d+>FfZ+&s^^7@4{GxO)1Sm>8Ium>4-Z*jw5dnHU&2IeMGA zM(LTjIoU@p_yXqy$+8_r5=C?EiQx32ru(vztMWdTfA@Q*yTXI3Vb~*nXuXpj@%78B z6w<`y3z4(v`SJX%!G!cPNu6o0_9_to2?9VJXY7SG)K{tgpawV9OR&#jw-QP%lV}=p z0!Yg}A7)4_5TXz2*Z?4EM2SLi)-vf+2uDvIR_NrUrTeSHU&p_Roqv1h;!XwpsPAeu zbRv!jav4p0SJnBU%LGkm-{v)mt_PF!mrv(L*Z{DRgOo7OjiUpV!(4fe3%C*h3&Hb# z$Y#gKWzgnS2$T{6(Bs`a2R0~CUEu(j7tVyC!;uTH7Rk2OZ}|rC9Zy4kF|s)=q=>MJ zW5W*_8TbLfelGU}2#}8PFS&_;R}+Zzr(0YSq)4pWUivVznSJ(m({YEU0Li}D*jr4MdX9saomaS$%QGV z(@=bEuh&z(-n6+pG0XMwBvKO?=!L-e7fRuxH{OuJTxc$LLwunGer9=&SM#;A<)6?Z zUwytUA@U7;I`Nbk9RM05wpB6ta--6x`b8Rf-wr(!bA4(3QVhvU9O#~eC%Ex4z z=_w5&s6>{#c;Uw49jlK1mHy@B7HWm`XGvJ*t6TE1xht=uh7&YAek7WY&n&OpBOSU; z<(s3nZCNVKY7q#A0^By7DB(^s=f2~ID0LvJW!^dy{effSLm4fiw{epIZv25x|{G25O(q1)+mvGt7 zcwMimM<}S@1d{?vr`ovOLuIHlM8&F2tPn#Vp-y%N+fEae>F)UqxV7qTTTN3Fba=RaG9siX< z5jmyfQK8W@RNeaL#*KovX|Go!DImqFQupYReels0H0f7E;-Hw7gmug(Wm(#plKk#3;M}$(&2IMQD353+&q+T%{N|A=Xp)h=IfVEZf=h5x+yIL(2QJ3C3)xIl>AFijZXuA`)Ida?6XH=Rt&_h@WZ^c zY5_LPDZpHta$4m6R6g@rHM-Vlsh41(P|ncN^B#dL!e5K<;z=)9866N8?|t6z;})vR z+{?W$5xWp14x=VGn$Il`@@s9m#jnSMTQbC-$d5bSG2|nqyRaoiuO$uhuVTH9(ZTB! zSR%A)_&V%Ug_j@k4&k~k!wh@fPeS4~kQ*eATJ7fm?0odSJ>d`K z${9S~jTySrBiU#^vaf`k3^A#+GdR>UM6-**wJtkoGdjYw;>c6~FAb^uZ;KPKLk&4P4!B@cp zu-(!?EiG_s`6^;%V)USl$||-afBMBc2ikFN|2~b#H7xrY#X`G}j5~03;3~sHYQpYB zG$nJ|L43J+!I%AG(1yPG&x+uYg!>U+v3YRQ*r!&^pX7e$$(kXl{N(|}L7?t}8gmwJ zRdUZ>lhT%h3&%0ew-YRuegrR0wJ0F!}PD8d>M!)xR_3L zhvav)F_;o-vBag%9x}R+))mqF+aN3M^aCKjg%I@?&YaD{g9W6v&IM1^UGOCloSmSB-^DAA;lQ_YWsb4+e8u- zS6Na%)(x?~2=it0=z4}A9$ z#WUo-TU*-q;C818x5~>X9rro3U-c=730)AQKUr8$YVA7C*4UT&DL<{7dX#HaG&GIF zJXJj*+g2Lctbw`bI`nAv?R$U*X5+hjK`-8g@vFACfha$Z9X021)6QF;TMIs82Mi-I zP)|_1<>M3RYXm|jOVwEYsiQQc%$75r)9G!^yZl_1q zeBsI=Z?LJ$mxEd!z*18&%&)+yxn^#Q`%EMnQ}A_TV^Kqx_5GJN!gB`4uca1m8J&-@Rg?y~~tKdcytY>`YmSN`l6fLO#%G3ZYeaWRJUQ$#OA&Fp5jqcj>*Ub2p5F;2sV?uuOD zq-i-|*yeZ#bqGlV4u9}E^}c4~ z3}$?i%rmrY5mWj%jWe8I`QKS@MY3eQOo%C^glZr=3l?0;(V0K-bokA!DXfeh40pcO z$-K=UQ6hH5M}?{-mDmwDut75lF|GK`Q>J-9P1Sdsd5BxtIQDH>9u0}lW%#E$9G`UW zD0FGAfXFgQJQ@RetN+jG=87SFuhwxV(XC@ay$*@PAuGQFCcao}FhAr=~T0II|zS?NV*13MW zRQV=bqohAv8vRo(+I(u4A$yi3k7S8$zgeWdgO_lhUc-Mt$_DL!qS$}uXep$2b zB>8*QPA_#P8-)q9;cLd*5l&U91|-SY31BLKKa&{|5RW2v&f?}Lwaj8~*rXk#{DzJ7V(+?N)|>q2&BZ!0ufXFbiAGJi%p9tucZ5&)+NClK9!#JhPZ z!0eP$$U2G}T4TavSw5|@N zhRx8xNuZlV)i-lnjuuSk&sDn;FSL=vNW29moPad|^PUd{IL%RNwRkeTGg}lRf_?uc zYAYxCmAHCK!nY&ohu1WhD*zdwEf2q74Do&k0P#=2IAWkPr-S`+%@O%f33pYbcnj{_ z=kTRdcB@40LqLe@Hc=qc^%>5hssySDqNna4{yPn2Dj`E2SD||oTbpu*HllZTM^=Ho zhz@8n0JU?mJUnnCvb`>a_<}6Ec`iuW9A*@u%F~Rl=LEc^0H`~y;fNwvU}W&fvWwC7 zKW}f#=yz8W7v|Bk2+bi1*q6a2aa8h0mzI?AYc?dEWP<^AsiqZe(-(xjgD? z`S9+_MywZZ)t;y9*=fco#h=6H9Rl=Kl+Z(Po zH+e)1UF&;Ia0HsHRXkn^ST@-=NY04xwjL2pce&qXeoDT)E{NT~IXS^0$mMnp(a?F$ ziG0cl0LgVO0ER4N+~Ahw^w%k%PFgDq;M~#yw{E`%fQwE%;45==n$&l<=({68PT5{=Mk8G--c(yV?s(kJU1nVRTazr=^NkmMwd1bW zUpSAS1V0>Ca9590s)ZuaJ>?(G=Tra?b{T7q&KiHr+BV!41JK_Y;#n6g*PjP5y4w{U z@(eC$-Z5He=bzltH7&)nLQglK&eqv`o3Zgr)7To-5rqMVo!maKt3Q`%&JrKLG^~6* zq-2r|ugTdJ*ydXCKJI;mnxNY}C22+tdnFx$1(a+q+`8=B=d{>x^Do0nA38;s$3IHg zo~Zn>MZ#&kW@uX4k4o7%spRgn&40FwdCFM1$!*_osLFDh6Gn*dNEZY9;O-@;mCzQr z7`EXydy~cS@ibH9$-B^6X#(g5>p9|k0sRL> zlbPn=T77=L9(3(<;tlxVwUeC~PG|tsMU1&^?(1pQ0T2KW)OcgTJdl8YZDFK=W(r=9 zTNv=*f7i)r9m4kJrq=GBk)f{fsp+AKsllnyk)E!#$Q8*&-gG4GfwAJTZbCp_D3h+^ zfI<;Xl?lkE$e=p=`EGEQ>9<{N{CHp8waswv`OEk@bN=2jBEdo{n|y@LCPWrwm>w#V zNNAGcc7Gl4!n{v`fVv{i3C-@6UaO8*H|>q_#M!Hi+&=tR>&~yLs zaBjIZ-{_8CB=wp1H{;<}Z)Tr>C7nKDL65hC?8_1PM^T;M0~p-+VH8HG$nS}jFEyFp zWG(Mi$!SMkZP4maeF*R%Hcf6Wmh^G%`c6LJQ-fEi>Vk~@{rUd>h3PP9eTykWPz`GZ z(XZQbcL?Ey;y3g353dAm9`wxokfzu6VN(;@$i7M*8>%9w=-_@scI1k_HI~05!RQPc zb}XMWz*YK{KAnWb_VgY+@h~4DQC3%XQ0wxwowR%A_jDggkM&mR3io-jaKq%f{7Zm( z7F-Jg8*lI+Dc0>AULzD4F(x-y1xBv^r?c>kdsMg|hvjzb=SV-}bfWU@Mw#pUVI6kP zS8H3A+Q$8j)9p{RrLw3BZ?Ao{9Iut1I3oF622bc{PmlMNkje~oAMhHtm?a~x&}3Es zDBr+$c7v75Q-NnUKHz}e4!5-S^O;3bZ zzKh1EqeGw7fopcCMrnD5paB8dPr_@_*=8lXY`*&(L>7Ra77^8Wo13)At4OqKLFwAT z5aB{1NGq`ecdp*t_|4r;T7Spp|`Pin~r{ApaVZA5GVHi9Nh8reb?Lp~4d`8oNd z!oriVfUB@HZ0C!ZtXWROf~q-hZZFsGni;*XJssd7kztF!%^^?*0}&=5djEL%{Hud8 z(x9H^RlmO#stlRjd45OolQ~d^Ub)|0 z!^==Up;`q`>t|ns56X@#Yp)q!ug(iv<(bk(%ih)pe!fK@+LRl}%^RmiP{=}tW}%(N znFBBHg#m@h!Lg_UG5`qbCr?oid7~2*hW&hXKjj#*S5~>_15W^2Y#j>BCeVs9_17P# zz@LW+jZO~?%ZWh;>2{08CE@cZ+2r0EA2HdG;U&K>7%X58Jz)SgboU8hYi2hjFTb~n zuy-$fX>_|xIyZ%{slm1k&Q&?74X&@k|7AMjX`blHSbbeXfag2n6x!6nAO5TR4f9AE zwK!sCn%ge91Lm{qRs_^EsiAL&J~hj6vSNM}=I>vW$gX%{DnjG{m_&Ep3Z@M%AUTe_ zG1UrAdTZ$*me=N2QpE~;2Yhp*$Tn7YGvIRdoR*W7tWgvsjvzos{j$JZ@zDp`ChXCy zK^M^myB(FRAmW-jZ&F0FS{Jm_=2$!{9`Hnzd^)Y@a*(2QjDG5Wzdf!Ba-HR!~S%l^r=?Y7E zRRRYDMUy}EKl7FKRTIqNgnKPH$e+TP2qC}cg8-?w;+Pl$e{T6UnmBWem$G+Qw=QzO zfB#mejd$oz!mwej#T?**w6Ti|er3bCC8ny~=hd3bJGVxPsg_r_Sq*${Li+4Z`JTFBWZkW!?U%-CzR`*RSK{=ETHo#SI_|YhH?xs2gSh3 z6J{b4xH2`?p;f@h74b$UH%AzZ4eSD}uhxd&?W}D$5g+`KI6N77c2Hlx;w;L8(0HH{ zvh1?MmZiKU5k6#t4X~ElZT;p^9eLG7M+i+ZM+6TTd74*ro%n~y#>kx8TCVy>Bo4_L zeu-`IAADbXV@+eu>vF@@?F_uG5s;5AWdj>xmsF3EcMvyXv;H%HP>Y0QV7Ksig; zcbgy@R4uv9f1F=7Lj;?P%E#a;;PqlR&;V$>sj(3JX%>+1TaymRZdy?k=sk-jrgZJ7 za;jMY5KzDaQ^bNW6}DAK`N+QypkGnq(Izy&5^}@SbK@9vA?u?{4ch-YLVx;QXb{YF4{Hkyh{^-GVwr3zG_dA(A6x zXSTRiY+@l8;alTeHbpp^ zg{BTfz6>~$<+nN^5S-n#J;{?@1OO&3bnL8B)T+#=_HKS9Io`)+b>Cs^1KQ_J>4f}{ zGHeJ^SI4LrI+TekSsEySpWqR#6dwlzwW76WnrWeE=?YtFHm%bWL@Whxx8*X+Kippo z0xMX{(1eMZD5F?l9nZ`n-a@n}>Y$p*oMzwkoPE4rqkL!fcoz zk!)F?8y#F@0U!5@)d9foJG;t$`Lu=)r#S1x-7l=B!QRDbiK`I`F}E)(IFfOYE%a1m zXaEo+Bvg@ufe1i{^zJpyZVXaHyD1uqU-D8ZZ=k$RoPRH%;wtyRnw_Dcf*e0VJEuLM zfEMt(Se!TO<5se09^zA;4VhxZBo8cmaWN|jkF7ug#&=fuit__(veeR-$+Rf#zc!55 zZ$J9QzPwP3LgP|_HbzsaiTWX&?vwrg6G6FC@*+fyf*=O+2W8ZVqmL0EPzfA-;ZOED zu-1~SPo!`~&1RoD zna$2OjX0Msn$b|p@sawe4J!85_ou-xOiu`T*k<~8kaT&Ct^zeMKO0;xcY9E4Y#5{H zzS`r~&23PKL{`@p8?UFj`5cB_bG`~uc9VE5)zM^$xx(S-{}X|dbaa7-3yvs(Qiv@K ziDY_D&#N6$a$p1Y%`vP)uyM)K=UTMo1R2j|x$1W3Tqpa8jKUs;3jf3@*ARhn=$lk? z26#^4q7b($%A0-!=BSGy@{R1cTf(64y`Eg6Fg{(88@c~t)d#hz=HMVbYVD!DFHSlv z+eKpf-{>Q9pTxMSmr;LeUFrGZnJ@F!g7DAQE9Z0Q&Owe*-jb7DqZ79)0$XA$WDS!1 zzD<%z+yokCP6~Nx3HZ7vLWZPULwFj4AHSsThQI8xfbxf*;AQ`yodajf@PO-oPIy*Dq@>Do<`wa^@v>25+j zwLs@m3Oz8`F_MO)7$cZ=eu9b{up5!qX;t`mg;LoM%{FVIJM!iua46?kFc}5wT=rU8 zD@H)Zx-9}_+}xOaaelx%j(Dl4FjdD;0tpmbhad%p@dg0w#$3mV-Iy4CC|HH4ielmM z%>cmt=ZCc=X~C5BKOg4Dd{j+ZlD?adIdVi@&$$3i;U3Hx4c~K6ue>>or_b&~sMmKZ z$Cu#((9ocs5@v_qP%2?AEo$W7o>Jci9pZ7BTh+Mc8m%)EUeTYR$0r;{7d?p+_DkpI@`rGX?P;c*Kd-rGe5S&iiENZKveI(>-^?2oh8gQ`+%lY~}QTzYFUhNgr9 z37sKT%60`j%WAMk>ny zND8d0Eq#}`qdA&1wPRm&yK-0${*zX6f1OolyxV;dkgE=U(tcqyELW;(+xr^+LT*50^@jwDo1iG8qXt zE<;l_iYzLXXdqdnv=2z+XwrVKXJ$8L+p%cF( zOnJ4l7>%yZs+u(LnNU`B=S*$l30yUIHLv4wUyE95AAyGHLbHe$bSkqbaS_XHI$%+c z`ghbTaYnLz=TC9B18iw5Q8E#Ec9}3$eoH<{>Dbu>(bjxyyj;o}Uz4>V5KsU5xxpcr z1+T}gh{sbF66H}aqREkwp@E^V!($6oUk7`p24=d3##p(6_QEK9{H)wiP@_Bzs zUY0p2XRjgbh4#*=gDd};W{Z`8rW`Ss%CyvE|17LAWqzb5bFZEdC!?UZ=k^XUBEf>U3D~pi0I}@~f4T*>Wrhj@iN=HNfGX z<+DxH6Ekul)Muq&Fp9IR?6l5B8Mj|JpQS3FVm~(v-~0Z=|BQUVU}!^dUr5(7W*(mw z72S8F`q`ZTE<68HdlD|{agE~jb5E$Jm+0{Xz30}87&)Z_F{jqk1$@TTdf{|+`SMg6 zE9oD@$4ku=6(#FWjyc|=!kZl8{GoYn|8-=z6mkd;h!0|fpt{59TE@+chon^rtFf_!9gQSIHW;qi zxb-Ipzj~wIso;Y@1`!^`SVOgbOFj9eulbvZ(zMb7i|;c7Cpx@z3u}Ua&33L(4uv0Z zCC*l7i==*My;S8s1t%1vs%3KO2Q-!Lm%E*;Kir>3qYPcFMt^YW<9d@fxxlQrmY;|Z zE~3LB*^Vrer)^l2Y=aCn+mQVWDjc<8kqO`rLP!6K;u?YmH8i!Ak(h}ow_KTQJcs6I z|0H@#BOI{tZJBsbt$Kv??swvH|e__aiXxkwrTY7F4?Kr`dtHD%K_7Fdh%u6FN2SW z%rsn<_=J8JxH;Uqj&QZS>yI?6sn`5NE(9I3lk|TfWi6oFa~eA{bkk^tY3dq zCije~N8sgeWNm=yS}8A8R%Z2V0?W(8;rq*IMOv<`FIJzwu(Y zzYIvk^f5LV7DSj)4^}>>ehI_nBFBA;UXM|&MJ6noTUJPVYiskHxyTC|)}+*}Tv~zn zrI$ zihFnPv`WwC{4$MkfEtY;^qlWMau#pfP@Zz`?)m|5J0|BL6BNAAnAJ|7z$|c^=#$;=gfx;qW9Xu1Iai`r}eX(YzXb zh2@9E_0eCB&)GyPJ|LO|?6p}()CJ@!I7?Y;>3b~0Ad}}!Mm~|T7Zk&=aY|RJA8$<4 z_;BeP>AYRqW+#JHN^$hGz*B>Zl4$`9A_ znwfsjMmA=T1JZwbWG59!%$GNs}KxtKHlxha>f&7Q3+9^$~p{FUdXY1;!&PN;y>d1BxY z=x8E;YJtSDfw;ok1_%A@*4WuU-;@hayGhW~y~=!3U1~QC-7!lE zr>Qj2fIc$5)2Zu$U}N{atfkzPL*^}-yjM*(T9+4v{PF{ozfcaa*|tZ{f1SPQ@KLy)wkf+C9>$4Zf-Da~K^1|Ze01!|@gmfjx`pc~XkZvB z-zbes3BMTl`~iNp$Yy=TCxPf($1Z;EhrPyn@Gi$ila!8n=oQW4u>KxwK!1qowHK$# z4Fe*)=e$BUqBZ;!OsZIhIe{XTQ7ZNO%NmY5vZF~S66%xSHN?!=MO&Vru>P5l zD6~hJbxW>pz1g2X{aafWCW-Zn;y`tB4ncxHM6EB}*ZcBM`@iF{g`k|d0;=c+STE>M zv%zmbZ@Lr`*j&Za^SuybbS8bsQ#D>(fWw%%opTkkI(NVp9c;SUpLg)UuCjI-6nuUh zLN7ipCM7uj+Ye5{?B)!mdKv7#WRE#P;5!MKZboF75U$EwA~ITR_O(&ZW1OZYk;rV# z@8c**L}?EbC}G}-%re&>g>RB!7|QKFzB5;5;iqdt!@PY*_YlhQFF8#yKfju!jYvroYr;;J%dUGZ(5J)~{)yf5K=vwR2)`874||PK)QiaV z&g^wY?%}Up)DhSC#*UxVkcpeO#6|X|o1?4GVC_=C%U$HtU9A$NKl3XndhS1HBY!~n zBP|vrjl`GX?TkLZZHJ%0y{H4%Y16w4&ScGEF-_}uK0IryN%z(G#8s5S8FsAIWp6x< zAwW+!_ETqnUn1D*RzCuh3^=5k_)MN<4`FKhKYqOSR-CzpNw13oU$R{fDr(R?psv8! z2whxOjs)#bW&2L}Pa7WQ$UFk@E{t8$#Xqb}#+Y4^8TrJrD&mi*$&f;_{4~BSd_DK3 z95Ff{g!v%6-u5lXe`8yN$?;srhnUhHdE(pdVZI`I(C&(C16?($^}bYq3x&|NAXj6E zYaPUM72=HYMr;bQfv&!CZ{f4PbFw`oW4fs7*-o!xqUPcG)4oz3AD`E1F;)D`R>Wpe zR5)`41)y`eC2l`vQ_ta<9`c(z#>;j?vT9k@lwU9{RRCe^mR);f|B&LVsCe9w_eQLgRzfDqR z0@yNwl4|-TsG~{)(8+R*C5i?`scdhKV_~jsvSGtOuL{nHg0nWujCGS@P!W}*3~A_K zLD|n32_``RrboK4Z9@6*)PjNA>yNtXdLl1XP;KC8$cHqhpDXa?!D|Ai$(YZ_AqdJz z6_P)8T&Fjh!B_2skV`SOK%0JoWIR}dFVowIOhT;*q z=*q9o^& zg~9!8>{m1M{pB^OkInKJ=`TBfJ|TAJH6lF#Iw!s}E_N%%kmmHDeUJzk5X({;9F`Pw zG-Vi)yj@V`*y62^GC?bYD#`Xe8B1_U&YjS|OXZenx0#NU) zR^K2Sfw#iUO@_2P`L~SAj!hkFrXOSz4Yk+kKo6m^Y`6Y2k8>?O(;l*v-(~%R!Q-yr zf?lMLOhBikzY=4|WS%;RYZ}f!N#rXM7u#XT)dhj)H05WU%AZr)T_u`GRmnGt6j4aWZR`w$ zY_kt1AkZnoBjP__j*^e;S(M2sUdr1har(%()V}||snUz6{VGRy)a)mb!+lr!zfU!Y zJcjiDY$bqeVZcf2l@<{{-+15P*vjZw_hkPXY+#^krhA~HA3{Z#p{t4nWJ7swXnP9??|7IKe-v0nbso;?wXOMtndjOf!`xfuSShx51_E*yf<1UlkEQBB77D$?1 zXO4}(z==BhT}uL?u=ZrSSdy((_(iqz^KzTur-MFW0-7=ABe6Vq49W665hAN^{1St` z;Dp1peuuIT#|r?<6%N=x{%l}s)I?qr)ciTPPE4KN=U2zYvrFl5vR(N+?$$dC^tQ6o zY4C&ASspx$5{+$13(qE;vfLa$T?|fj{E5#OG}$q=6_oe=Y_(m^BMTfj23C^Pl)~cA z#oHyFH^}ZUvwrLlRgAYdZ>yJYG~2^%kE@HJS=@4@zqpx;pfgd35=dPU34CCBE7!#= zN2fo@d#T9z>vr$+gs;Bmw=KUA1wU`f2upIn1e{RUEQjHMYsY0mM6>;jy@*!$S|wcfd!f^m{LhK^8pF#&p_^KB&VyMmQI*Hn zQfu?WqN@X0D4=_~nLiJkx? z)eJM%UUv{N*MrTA!JYmd-h9q2&od`~KeLtZ&tbN{y4XP5v!KP3hNKU|XF=`w!6f@} zY%&`StqkDOI5^}!#;DFrWcnpvN(QF0Q&HNB0aI404^0hi_^{R56 zwpB&1|6_nDeqXiU8O8*&2mqb>C8qc`YPpPB7s^?O;DvZ1f13}%TEwT3pR=V6CurYt z<_lR4dZlG*feI_fF_z$X+AI;!JVR#}mGm>{{n(9B6nxLM&S#moB~*CT)B0=*i~nCy zR~Zmh7j5qhJ*0qigLHREDAFa}CEX!iL!)#E5)zUkNJvQx-Cfcp-615GJ%(%+%3L?Pl z<)W&yp*ZvyMkrOB4=8QO!$j&%)#3OWb6Q{BLq?hn@r{u{?Ttv1YB57kW|~l=HrsFTP&j5I zTuJf>`Ukbv8|3vwy!kFA*++9+c=P!6IoUhfbj~UIbCHdkZ$M5T7zt@XOCB;TpOI3)d^(lPIn;qQWZYD zegG~v@CR{8t$%;GHupYr8QqKM&gkZLJcy=sM6;&bcPwY1Wk%q%nP&P#O{&9)ZUc)4 zS`9LVi9ILlj{1Hy%k}j}r?_)l5|~%r(hRRUVKzST_5Ex@GWAtGZkoSS z&BmLN=T`VkBCQ_fW{krXTvh%7r;^}&);*4#3r81MnS)~dq%y-Qs~z)08b5Nym_tUn z)cudz`WksgTQbTm>dw$l|pt^2jL`Zw3ZS) zE*6w_@IJ80-bXgxNnFIJcU`z(^N8?CzZ)t=xoZ>PKu)VtD!&k}wu?rxZI)PhiCk*% z%}^0WdrK*-eL0!Yknd!`wNd5bQEuDfvWTdZv|YW@D%dff))@))Z;3lN*WT1GsMveQ z;P*K1KAVy*V5n@b{YrCaOxRy#ty}UJt4IKd5+5y|uw_FUM zy(h%*iFzoYysP=rv{y9!kI;iJ;%{Whr6;ErTJP`_3Z%4x^z^O)L%Fy^NFUE zd{x5k>ZJze2vU23enVCc!YUl*`YP9M~`>Grl0mh>|ZXmgBYIo5U^pJv+SUB$t1Rcr^QxQ7Pr&Zef=9r9^tt zwwvOSS^F)ODNMp=nOS5JS_Oyghh1K@8vwC0BS0E3EA_g>jSwQ&;l{vVz4V;9We);a zGG?^BTuhxvjd{MP^k-!&BHXs9OCbziq)|Ta^CI#{PiPs@Ft`TMcXA94B?TwlQr;zWD4zE1H)3Nh^uj z{t)&Jc{B1kBI6uOs`2xQzCe`*LT;Ixo^S3ooY;r@P#nf9jaHnZ$j0g(c@4mYR0cHH zbH4l|`zXR5AP_aQag}D{I_uFkdhQ$Y)bD+^rBzx*A?7tP?Y8(~%0K6Q9XnLFPJj1K zm5Eq4#v;w=Q*y=Bh|i1Y<7d^3P;OD4n=B^t&xHgfxYo{xXv;kWXr&1abZctu0dhLnEY_C%3z+qg?7AICEB3k0&|#AMy!uKB!bp;<#}FgH#`A zcH_{SGdBz+6mD=?nw)ld1AQVxAdiG^4(2y|n%*0x`?J8>SZTAf?irYN(MAo_2=2)_ zv9mO3{%|!k27ch$L{EY9cF!tUb+&pUecG9b&aX;P%#L^{p!!Uskeqw0H)cXjHBW(~ z7ma4^3%~2wwqhj1C^e~5cySD%G#RS{jmduRI@13!8cbjJ_^g&6F1_|f*c0cNtgv=0 zLg8#bJnJ#r1ZNJe9=7S6A66G5xGEdk++4(O;{L!cq?U+Ti8SL(OTBTpq&W||xjtYM z)fOiA(khmwnD90-Ny)K3dtVn+f(4QuK8FO<(s{23due-QyCe_9E(i*WUHn=8Wf$l%CcP*RDxfj1&eqa# z$829~P@HbY_@?PjF8AN^S$%AAvUZ+-IbES}nPb9-Rr?Sfv`_z43}`a`(iwJfL3}h7 zbY4VvdT!D8qFyoC`cv?t8Cn>AB6AT@X?)`ew|nZZuoB%yBnD;3zWUc``P3FKL(^Y6 zn1>-=U+X+(g)rV%t2$IXAXn6(R$#zOp*eFD8pZM--&O&AuVkO6S|h8(@xe(M-wOan z@NiK|Kr8h3sKip4gPpzi)94Z3MchNG;hvo{cVwDYiM27xE^0QmyZV~(?@{v@=zk!M zY9HFOSLk`JeW(EZwIHm&;#a4`$GiK^yBX$mrq{$&^M6r?X{oEHc}6R%j26d&yMJYT zF<=&v4hj;1p0=pLf&fW-+O|L_Qz-tT)xn(V_G3fpgZ(#UadEc z=vI6FmBFaJcGO3=w?$jMxUDH4XM9WU4#(fHOZsHWF9!vee63g#X=+6}IOg8ORM=Nl z`ZLT7IWL#j#%-^3BRe+NpjYrP{Pe(7L7$N1?pv*#SnXJ}i@+O4XxH>hVJyF{l|U8~ zuoDk0i(MQPy2lJoKm&prDK<67QJ)$5%q1_?wTs0%eY(1baI574Q7}Mibn-6qY+_l* zuV{Fpx{?AR{xJTClrp`#6KS`CHPQT`H4OW34~Eq7;4X>UR$esCY!g^TfDE5W9m4> zLvv(AZCGLMed50$9@&WgLB&?Jp@Ws5QsL#4Kz5E_4MexZCTx~Bme*#3o&k?DkA-T$ zTjvQ*vomzg^vpu641TNg*YER_{-Qp$@tF{&!A$>~m#x$*!Sws}TO;LFM zZqXeRI7MnZgwWjoz=<`rf}33$^j_45p&fW0hHuNbElKQ4?kas;#bzJb%#pFk#!J+D zq#%US6$cRx6r$aQ7O))<*ezImS*dO&&nFK~4oUDWAt~nEI=3{Z+LtXU&#Eit^)%0` zR_@We@yLhmXitV4=d6BW`h5*bNkIsi9~_eZ$608P`hTF|KW5AdT@MmV#~&tE76v9} zW?pVY_j2DjD+?1V2Rk2EcUNa;YjZmb3pWo36Ayb^J-B=J#{r+$+CxZeB=jKZr~#(nkG3c9 z?o8_jR4KjF;}t!oe4dg&>1_5Uw@-?IU zI{};S+F)ULdA6{lR#Nq19_GO-lz7@vm4E(qFsYJuZF|@4lIo@Hw+Ft(3qEdG>NPrI zSL9AhoS44YKV&8V;Hw`g;00365mD1{Dw)c7L3~dv?EUh5R%0mE+O8iG4K5H-7Gwg_ zhGQ0W)vCE-wz966{)sQI?#tEubZmJ1Y3KfiY6i`FiCkKRF>km!`?&*>>ggBlE9AL~ zDX1%3FzSXCNGjw2H9NW|t)@%7SmrnM>0o-@&WbQCvwk=xqmwY(d^IIYDQ(l)HGhpl zjI~gHdC^7UeONzT{_U+nQH3n(VY#%#y?;{=Kx4Bg*i2MSj)zNX)!xASWQqpl*aGVP zY;bCVdng>~^yfxcMiXu&DFM>7KPK?rom1^T7dR#6muT%EfC2a-c9E}%NvMQ_$CC}y zMKxoBjOG)xi%~Nm=%)V`H6h5Nt@C^^T21x{*p;}-#Wa4os3n(NtggoILwp;Dc}a!P z&;&t-+w=YmPt+o)l-Me8?b2)=LR7=Dy7oD2us1ipM+n=C^pxG5|Ul#Xd;{LgF1%yHiK zv2g|2=jD{^N+zsv=j`>{nT4S9%*#OnRK~o#tYT|YaXb>QF>$sT=PiC`-RZ5Kp?Y3t zXMU6OW-Wl7Rls7=g@T*#QgeiiQ5bS8DTye5@iZgfa&ZJ z21XCCOSJVBQ3p2qWbSR8uLBJL%Z(W~2ozaGjiH*pxOjRHltm z1xcQ_z%<9twkOH`2ZBK-W;Cmc1|2=8fr4QN2g8ZyRe0Ot1z{GFmUdkI{waXU2#l|q ziu1RSzHV&&yMKQqebtw;y>c~lp0u`T?ZVFX)>dqhE0Pfgni_a}wNX{oF_eY{-43N2 z3|uN+3vXlQ+Zq>Nlf#fIDqM((m-_?=`->jl;XE8P;I&|B{=-w5Dl|cE+5h8MHO}4a zQNLDa0&Cydu3K_)6xtTXSPE@p45>VizkdjW0+M=E8pXA*9oev{FH;G4im7?##>V9Y#Y~W^=4G|am(bWb4 zeaT)>KLZyV;HnN(`WzRc3a;_!j!uYf|N5EH{#oZ>=y4sgMnw}6Lm}|{MiYjB&!1R|5&m>J1^^g-6Z4K6iq33XlIetL z6h?1)q(qt%t6QDqk+lfvk$o4-xqljL_`ICQyO0Js49k^s&T_#zwGn4{n%^rQWuCp; z*|G0p8iSrkupLJn`-*BOHy3PS7_?z((LMXD0rI|I`(Z_?1V30s*)?Qz5Ifwxo{#YlW1-jo z;2E>rr7C~jVD9(%OL=sD?zfVkY`ETOOg1X{cthq+V-}uOLg|Khd1|5V#pI&zobaD! zFJ~l@`hM>`D89=S4F2a%J`3D-sJVJ?efy~rg92THWPJ?RQeV5tiH}mUIqe&en>P6C zz#eZ8SwowvMD-OVyGi-CxcpFSq6!}>GY!aOWU*hXh93ZubMOz#CU zuzVgvJomd`x2v0cSxp8O;y>&S0O^4eUW6on^=wd#QI8x@3d~0J|U91tLc_pbYe9 zR-S@iVNrx!Hlw93!InSkY`nWvV!y0TaEw+EU&#b1zNm39bme{pbs{M+T&N0eW*M>e zsQ>ay#c3)hZ&O1*T$RG;RYNV-g&W$QN<@#VwD5aJ$T!7MI#ULY(zGb+97FNc1dL>; z1ReHT&ni|>Jq7f|ZfH2h@mGCoSbJe|UhP>Eg#XqK3JABBQELbq2cL=mJ(SDT<)S?D z98%`IDeTLOY4i3cL4%x>15``0;Ml;bQ2gSXiWUN7@qP%jePb!T<+b13-4pF!JJQ=M z|1m32VS3{1Q+SUiDGCA+$kE!SM!#8D(@PwQ6B*I#iRsN(nP6IyP>W6}6^u}^p}+%j zv6H_cfGC+|#TeUbbFDWDla{IV^~A%-$l{hV@_cw9Ac%|8J_-P!HdrE(g29j*Q_(PA zr;*R~VpOsnHL?CVM^;{t1h{ov@sE8GZDr*umWhS>JW$-&An+d>&a6L?L#GMO`(>vw zjVw+K1YKFYsXI7t0(G>*&||07$(t$;?TJ4nM=SRM4YIqL@3gq&9Gb(=ykH$EHDV613RPrdqnH0LV83xHMKW#I`MUw;GX)p)hr91(wLXi4V-yz9{# zcujn$sD7}27VC(6VPi7}B0Dha^}n=rvN(#SgR1wJX)tlSh={ice& zMc1O}VP#3V60&4s3H<4C-k+m#+Qty<`iJ#ox$W?{Jxs-R1`;$op=At*P$CgfjnpkyfDaK$R{_;Y{J`Q|^FkW1wn9$9qaK#_Fi; z=$TFTY#>D}&(K)!5z7*99Zhwes8kQ&Rk=xiOg-s#etL*pVi$}Hysw<36%QbdbaX^< zV%#)U=BUhg*>$VIG%E<$gZ2%zu;PvPjU|!Ti`2kC1;2U3;%v}YPf}?UM2bV;c+mH`E0b*(TII-Dc za)S=cogO;qH8rWZW~mwXl6!_l%H4|jMNq_Bvxs2pXNx6dm5E_etA| z%j5p{mE4fel|i+QV2>NKS2TlbHspuj51r>XXO;9G`!r%mxg~stlWxsyahuR%J~=6i zRa{NiN|xYM<yCk;-x^=hRcT&)0b4Qe@YQ*?PxkR$ysoPlgV2@Wdo^PdC*TwnleE+%S* zmLW#aw~~pC>lZgS7gq}-=wZpj#mn2(`@J-`ps+AMCnuTRB(nBHO@iITo?(f}++XsX z%5zN2y!-l?kY2HN2)L{P+NC~{YsVgDW;9q%VrAqhK!o=8D~k`2A|Q?-+53S5 zcr1cW%YhdI8oiD^661z%y5v|z_9==R194l_@F3euk5j(J-AC8dZhb_*3V*sXNprSW zxXPiO#PUIIpUaBCYykf=y=?fcOBI!nQ8aPDWOK!MPfSu4wiGH2&>@*I8uCFLb&ZG= zKE;p5Q4whg70y=(a`9eCzg+J}2{{RuLhi$Q_cWoU)@)SafpKKh4N^c0Aq}esm^Ut<>f}J% zd>I&p#a6?eaqqN#1Y_oTfp2Fz#*69+erqca#?XbLB{(DG zl_e1wp;f;4mt-w$jgf8n!{=7D)9Jfdwg`UWNschk9Bl6WF14d|0^&yq$`D*24{Z3r z4KW}t;;ri+`d5LupHbzxEJwh<@zo2~FS(5dKkV5C^(tG74hzM^AnXD|B4b{?0$$Pu zW_b!f*T=tg4G(v;s>gA??>o*we)H$EBH^f)E!0RrskxeEyMsfX_YLy+w+NN$Pv0nJ zc2Q2cF9chI>+`?%WYUg-ql{fdDci}$jvXhNk8vcj!|Zgtd?unO{aF9b|8_*Kl4K+F zAl^6t&=QErOzQP2Aw*8G{*E2`Pw)zy(k^YlH>27v(HzL zw^yc&i5(c+mi^RX#+u$*1dk{eVQ3*2o_)SvNAGJbZ@=;oa(I`-L#D)B>VN0sJBd6QRusSd*=V_r(!woLWh$`tDrkKSTn zP9F{C@#o;TU#c$Uj|7kztJC@N*Dl77nRa(``6s3wUn8!cr z_*bgecI8uG=M&N1`7?4gty7g5E+M&7jG-@W)#2-3|J@5Suz-BQ_=CBu-!OB&u|%#Y zGk(NT@Wea>P-ap3+nZ|Ce1D0us=A03hK6>ZC6stwdxxa9necSE`t(fFj?tFk@h34^ z{8YLJp!H&C+=#nOOsspkG}@=$ZB8<{75LpN@kV&c z(vrn{D;zlmpD}rZ$wM|2rvsvD@>!|!x}rw(3-;>iRl_;q_wuErdLw$&Zp1lt07vD4 z*H_usQK7>KJT39}K2OI6!(?bv4uxZ3o>7A|-%|$%OXJwoHhp^k!+!81YvV+O0>9=* zek9wtaK}HJ{zY5ph0&WCTl72w;=l~gt{BihP_vO>id(HZij(i`zq^}R3cL8eqD~Le z@cQ=2DFX-Jus_ccycG8i}AJtwKz!s!_s$$oTXC691zC0{Wm1 zdHNr8mRD)vsTP;M*yX0_JE349IPvl6+D=`}J*V>)kKkj2@QZjWORFRrOktqt|INq4 z4Mj3(=FLsgcIebw>Qi_kRh|ph^hcNZqI-^E5n*Dh#WD1ChrvF){cY9wF5d^Vjt{6| zE9VsiYS_!JUV)=Xb>T@>X99u$Hu8KV@>;Y@py3?eI7pq5vFeG+2$XRsI*yO9^TB+n zpIA;>CuauKeEgZzL}=IFFb*rc0vGBRS}dkh&}Mbn4Apv?%>Az2i8YxJr+<Xl=G2JXY8;1E$W9&4)r^D?Z!g_wdnpY^eyHtCyJZxb%EbSfqYb@S@d>MYa<#CsbMOb$ujfpB@B1xE zlF^n+fR(!8vcDYs<#B+;XcUSoyxRV-saOo4xa0#5=)uP&?Hc%*@Pt!uxjUWy#AMTF zQ8%Qo9P1N(4Z7V7`6*%o_Zn1u!0LZQi*kgX1yxhBe5Ax(Nz8sSOAFMrZ=4pobNi{! z^{pHVY9kT8rpAWRpAUnnkmaBq{6N1@VWwOU8q@Ht3WDV$AETi+xT?W)NPzhBn&u|X zHV92J6OaccrADo>3aA`*n)lvUW0LuCY5^X-9aGGE=dpML|~DVmD&ZM3AE92y)fc_>C(`Q=b*P*EChZvPqUM{R1+$ey4H|UUYt)h!HKe0tz zHk59Xx8#^yF;c>Xz^eSr6G-aB4I_on3OD`WFROwt4H~jSs;71=d4jk_(buDt$Bw80tV&tG6N%;c}YGGrVQVg?!lz~l3?@Wlq{ zJ^n4J;ReJC4#3_`{2>P)55Ri_PYIIoDW$d6BlFEz7Op72DrGxJ8Ua|JDg=Q!GGcD1Sym=( zC_4v-d>O|*#Tmj(<`-eatES(~HXW#lh{9VA_~!OS)p)BWEZ&ofO2S@Qs`0EzgxTz? zHQ0;X75@+`Ub=n54QMM&3!=(jwt5&pf!Z=-WO(yh&G>KjWW^ek^X?|fTuvH=QR*?z zbtb!2{X?n@-`W?q5@#i>7+!CJG@aDwpyeJgAR8U-18I?a4*a=;TBrTxM>Ra-$>9u7FT8Ub2w6iCl zp)#9%lC93N+dqd*EHl(i=+LNqqoR>8f{<0B1bFLqpfKRXfXq>@J^=1Ln$V(cBkiF? zdtHrmz|k(NvEV_|6R)>_ikOt)v~-NNx1#iZ{$_`lnF;|;F)khC@?IM$R#V@x(X`Q8 z8O9kF^m~BRSc21Vo<5mEByOwLCr%+vZF)b>550+Wf!#rc=DP-nAB}gStPH9{8V-S_ zgSw1A<)o#HFhg39019$=uo@U&{ZfUj{`g9wh7++N=h5BW{hwZ%ZXb}T+#{u9y;9N> ze@XfzJyE9J7mRN6+ULG?GRv2Bt1xgq5~pu(=<1<-3IM|}HbH2tm-^~Oz|x>+=lADf z5MJQJY^s|9H&F8wpwoNF9_9bXm6+s6AESIb$sOn{lST6Pe3fC5V48^DWtyX7j{Pfl z)Ax#4-Szv<`Vhb%0N)`2qgRWh*^0d?0!F$fBZk+iP>YHLdbhNvXuJ+cU??M6^%siy zeYlWh{~0EPW#K7*HF*9ifBtbI;jeQHt;s-H;!(S>t{F5aV#x&OYThM)c}11pZiE@b z3|0M;aDqMrZXOuCZ(f7(b12b3H$X{6j0oOs5B-7D*l@AzYnjxeY9<&O{e3!gDKTaD zwj}AZbk~{mS&S2ZzjDrHxmepMq}Z$8#|4K!)?sg}8AWirl(GRsuNSY)ij7I%>y2Gp z=-705I=|~T-CJ}&f;)ua#vN9E$|)2I&MZp-i#~Q@YnTFWUa@okN5lutF43sYm3U8T T7=PWQm*lpCF_Hwwu?7AI1-_UP literal 0 HcmV?d00001 diff --git a/Resources/Audio/effects/Fluids/splat.ogg b/Resources/Audio/effects/Fluids/splat.ogg new file mode 100644 index 0000000000000000000000000000000000000000..bc84113d3472e8ddfcb39d90a931d61b55c421ac GIT binary patch literal 11605 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/effects/Fluids/watersplash.ogg b/Resources/Audio/effects/Fluids/watersplash.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cad20d6354da3ed6240508baf94c893e51402550 GIT binary patch literal 24381 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/gibblet.rsi/gibblet-1.png b/Resources/Textures/Fluids/gibblet.rsi/gibblet-1.png new file mode 100644 index 0000000000000000000000000000000000000000..601c6217bfe2d07a099f76129262a4b64e66b00b GIT binary patch literal 301 zcmV+|0n+}7P)qZfbz zPyl`c06?ANZ@zL80%$J-05FM&JquzNfClaK)9T)5GytF`*)QL7?Y<(+EiHgn^>Pg0 zNQoV^YQ>7`C6&ynlaOTZ1rPSK0M^sx=2ca7Ypsj| zxJ&>{Zlww@}T04*6D@fdnhyb`TIe_t{0*u6nvyh)WJ+zYV764$h)e~_MQAc)nfNURVEcrO* zdA>(F5iTJU7UssT>%Q56EiqLAs@j|N6oH7y03h*ocJ%gd#j)vttr)<~uiozpD(UVB zlK&W~>O$nHL}VmZ&RQ&6rCbSMaxWtC&_xx(C1XW#XxrYVpAtmyn-7TNx zhxfpLqxp~M2>Y7^n9WC(^K&CO1)Ks-0Y~8%uWiYcjX^H^00000NkvXXu0mjfxtX5d literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/gibblet.rsi/gibblet-3.png b/Resources/Textures/Fluids/gibblet.rsi/gibblet-3.png new file mode 100644 index 0000000000000000000000000000000000000000..05ea5903a200f7c3c20c7c0977c3ec91ab4e5adb GIT binary patch literal 367 zcmV-#0g(QQP)#dyI-?Z!>e?>NK}S7%XQHLi?wX8 zc1>+t9ybR}+P(6?!Ynwe(Ad%37t&2aDT6R>8RwYipnY!$@V6VFuzw8H=WG5HE8#UC6T*Pw_?-Bthq N002ovPDHLkV1j`|p6~zw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/gibblet.rsi/gibblet-4.png b/Resources/Textures/Fluids/gibblet.rsi/gibblet-4.png new file mode 100644 index 0000000000000000000000000000000000000000..2b952839d764425169bed1b6911444363bb8b041 GIT binary patch literal 349 zcmV-j0iyniP)aO|#Ars+$o8~t8$OAjkFs9^ zE&*RHfaLrZ0VL;EaFVl#+#~U(ksDDDvEft;UR9u%yh}i|r)BMf>lUnOGfoQo00000NkvXXu0mjft`(SZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/gibblet.rsi/meta.json b/Resources/Textures/Fluids/gibblet.rsi/meta.json new file mode 100644 index 0000000000..9e665591fa --- /dev/null +++ b/Resources/Textures/Fluids/gibblet.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/aff0d780742ca3902d8b05f854c212c8cda32c4f/icons/effects/blood.dmi", + "states": [ + { + "name": "gibblet-0", + "directions": 1 + }, + { + "name": "gibblet-1", + "directions": 1 + }, + { + "name": "gibblet-2", + "directions": 1 + }, + { + "name": "gibblet-3", + "directions": 1 + }, + { + "name": "gibblet-4", + "directions": 1 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Fluids/smear.rsi/meta.json b/Resources/Textures/Fluids/smear.rsi/meta.json new file mode 100644 index 0000000000..3450d9e4de --- /dev/null +++ b/Resources/Textures/Fluids/smear.rsi/meta.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/aff0d780742ca3902d8b05f854c212c8cda32c4f/icons/effects/blood.dmi", + "states": [ + { + "name": "smear-0", + "directions": 1 + }, + { + "name": "smear-1", + "directions": 1 + }, + { + "name": "smear-2", + "directions": 1 + }, + { + "name": "smear-3", + "directions": 1 + }, + { + "name": "smear-4", + "directions": 1 + }, + { + "name": "smear-5", + "directions": 1 + }, + { + "name": "smear-6", + "directions": 1 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Fluids/smear.rsi/smear-0.png b/Resources/Textures/Fluids/smear.rsi/smear-0.png new file mode 100644 index 0000000000000000000000000000000000000000..3fe54f28de4d3450c83b28b447f4b2daee083853 GIT binary patch literal 553 zcmV+^0@nSBP)o&Sk?WB0CL7s~i=%X5c8-@Sz1B zJ?uneSKyPj2e6z42QsZ#gR?Gxk2UbtgDD}P$}VofNZ}m;-1K)w^4>XFb8@wmT>k-_ zw}`<<0AHEpHHm4-w&F~d$GwkHcnH02TxvbDQx=coLPNT-4co2jI%U2wlf9UP#zG71 zgxm2OovH78J(qaS33{=V>{UTG0+@2yP95|(F=_4~({vUX`?+(8(!xy#6iZSC>$*-N zl6b;|04xf8QI*r&6|ZVx^nJfn7SLVr$cfUOA?XumM3=vi*T-5TBP|} rUR%hjfR=Ax{>S8ODK`Btc&GdT@R|3Pf22t000000NkvXXu0mjfW+VQ| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/smear.rsi/smear-1.png b/Resources/Textures/Fluids/smear.rsi/smear-1.png new file mode 100644 index 0000000000000000000000000000000000000000..12a5a3430a9619d7505633adc0ee78edc987248d GIT binary patch literal 519 zcmV+i0{H!jP){S3%^|oVdNhvK1L{)Dor4e)sI9uBTG@R`N=0H^kdLJ{G zveskI%>hIT6hCsrgZ-!X5-oybdn~&QU{q|hM|xN|Jc5%>uOjl(>s&Y`<|K5ks)I4e&MN@8iC}{B zvrM;l{H@lF#Zy(_b*vLDxoO89^(IXfpmR&ayzXYQvtG61{Eh2egzkbMa+eWt&YGM) zcNrmF#0C!{+yyJ9czOzg=%0vi0AWB5h?&%!6(MaR?~o?zqwBb59thF1m~oqw1A7&)(^D}yj4GsCUIOqR@(c2SX8UcDH9-IX002ov JPDHLkV1jCT<2(QW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/smear.rsi/smear-2.png b/Resources/Textures/Fluids/smear.rsi/smear-2.png new file mode 100644 index 0000000000000000000000000000000000000000..8dc6eaab765172ec63f0be1ecd771bb5935f225b GIT binary patch literal 481 zcmV<70UrK|P)$Y1c{0BCImVi$oR{SfRy5*v^yGZC#+3CJb^O}_wCfz>cLe*kLQ z+5jY~!~lY$#sF;7aRb-ACX069L>&@X_nRVQ!BZ>h4--HV6ueq&CxMmFv+hC^fM+R2 zNr52^QNqzVOGL*#fTn~pPAUQXt=-)$L^jt0B3n>)?C&GM%wtq&@;kqq74 z(2zq(vfbllLR1l(5;WYHP37AHQRc>401`PK@IEGL%>>p~v()SZM8*T!WO@#QXI2FZ zz8|UhpF0ReiQ7zUrk^3PF#7QIKK?ME=82^TZV|6an0@D~~|jxT?NX_0;4lCv+Yy4GPH-*ys!7O#|14u% zL}ZR~BFdoEf zCuh7+=e~w83qW<<4XPf^dQLHC`I4dV02$H}c87?DdJxI_K`0{NRdczP^B00000NkvXXu0mjf0BGcN literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/smear.rsi/smear-4.png b/Resources/Textures/Fluids/smear.rsi/smear-4.png new file mode 100644 index 0000000000000000000000000000000000000000..1065e9be334b95b3d3709cae4058556cf9af80e7 GIT binary patch literal 470 zcmV;{0V)28P)|p3fsI`P(h!a14Y{N{oR=U&PZjF8w zfSDh+0=&}F0L=W*Cl`^=jDKd`>1+}*^CJV0^>r2S=$UyX`gwX(V>CAdx&yEa<8Ope zkZjNhc&fFAQsI4OeiBi^aS>UZIcqfT#o6V6=hPOR;Z_IYnTRaRyyDsO>i{%(lj{Tg zW;^k~c7PGUmIL_Y?fex@O4v*W8n?y;fW7W&{TC1g=N~FyLDU*~!9zqQb8l!G+^d9P z5=I$~Nd-PCdC}_zI&4Ut0+AyILnyPaMMS3NTW}oLv?>f+ag;bteQ)Jv{YE87G-$<5 z4Vyr71QrE1KF?DMI1A%Gd$t<~kS;IO-cJON0)uetI`wt)m)knFgD z?%p-00T3cG8+_D^hGm!u;&sI{u$L6@Z1lqMw&LXgSMBfoGy1mx-*xF}(3ALO>;M1& M07*qoM6N<$g4pKJQ>CwfENluM2i*oc2O$a6j(Rxdsy{{oZex@bIwK`i1dTO z_6G`1SQlkea0U z0RTjbL981l1?s}7b0z_-h)#YLLdRkdKQS_ID_Ib)D9sV>6>S>8JHd1!Z!)NX0YJ0Y zIMt}`gwBfl#P=oqeN&_$iw+}4aPd~|K)vC8KR>W@UOfvAX-XBWxhtHC@k$Dkw;b<+ zo4U4Dryv)R-xgEsTa^Qj^|yc2UaEm_#@AC&8^4^OzqVr+_bmVb002ovPDHLkV1h@Q B*tq}z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/smear.rsi/smear-6.png b/Resources/Textures/Fluids/smear.rsi/smear-6.png new file mode 100644 index 0000000000000000000000000000000000000000..e4660497824f65dd5a6a1c8d1d4e3a164989687a GIT binary patch literal 387 zcmV-}0et?6P)Nkl1?0tjF_oiQD z&&);0shhC8C zn%O>Zh@A%Bwhi@#NbM0B9>>kSZUX|{S%|z%KwqMPnYm2U^oYnrZG9vOXV@PATczmy zsFC$)0=-L+gg(<7YTXBkH^mT8#F!J|`K|{tV;QIA$oZivFy4nX0?$bLP53E!D+x!E h)05xuz@NY;j@twYa#r&CSi*+uP62 z&*$go-{0R*ChAQ90004WQchCc1%2!n`K*lc>F?f-vk z!S3aw+q{&?cw%!%0z}T4ejVq-@7glv=p?nd;Y3w5w;3(ep9w{+Dah|TLfZ&20n{>b z#wXt{u#!YfI51qRd3k3Z-lI_TDqFsjP2ErbO|H9eQ)3qMfy0CBMTZ%^0<L^a+e~sdFm+rQeGrCq+W4T!vOheRT~H7^hGW m5D|{w7dHX#t@U62|F(DM#sqavA6Q@j0000 z>Hq&~Wzz`+Na&(dEnsXNUtP&#fd33U1L%~&GntS8epim@M7~SJ=QWoaChv;y@JQ`| zzLB*6=rO_FzpBFc0SO-cEU+>*OfS~~3<1}`>|1Y_3}#LWY*6IDqezu36gi&K=$mY) zh<;X($r!y>(X|PlS5h;eONlzI%u^H1f5=pf>fFXT?gkMI7pkRD5+ktdY7{sV#!l6W z8IhO?J{|8qjpMX?>)LhGXKdc%H!(p+0(2&(F`-*VpCc z<;~5_+}zyA$jG?3xV5#l($dn<(9oNkn;9nd`~Uy|0d!JMQvg8b*k%9#0ToF^K~y-6 zty9~UgCGpd1>GX-y0md`|No&IE+SIx=|g!?4>L?M69jnW!e>Zyew;GSClus}D#&NW zBgVW5^g_y^h%>JEeJN%`ML=8Op~uHYfZyO^r#!kNI;9E(wfRpxfjd z27;Mq7Gsy>GM4|+FTWWu#)D{u>^KbYeF00A0UQ?ab}Sh=7QESLs8~iyh;@Y7t(RcM z@)g?o{R~bhZ7>87yZoA6>Mq7y1PFsHD6qAl2Zy*{GbWxyaCblInDflMW9l!EhRms} z7^m;2p2v*YlfHX`UmHRwMp}7HVBMf3=yw9R3gjl#1Q6YGHWiH)AN>TB8$DhO&2>E@ iVa1PrkH6;m!u1aleFiK3N8srI0000E~*4Eb2($e4G-{>W5h5!Hn0d!JMQvg8b*k%9#0O(0XK~y-6ol=XA0x<}Lr3Lm- z-0SK6|EJ165~I?ZNU}7WftjHc;LE^o8;_WVD3x({#X$jsRK+kzl*2sh53ZQ?C}x}L z&_F?q0?Kc}R`GI@NVx+H;WI@tzsy|^XMn{VQwjh*PNHng;I3g%EynE-*l%mCCmtrv z*u81ACjz_@)X6<;kfqCP;(^QVkrRPN_;+>RxA3+K7U8NltnwJ?8E1jT{lAFp&+$ov zw?Av%7MC!I>8eTzYjb$$JZMIoI0oI8lvD(`DOFN^F>ny-5>pqBGJYmphs!J9)_Lo57JU*Q7%zyu@qlZ$-2~cznyVVap(U zR!w)X2-%YI_zzY0XUPjl-3L*JbCiu#*G`tKCE2{ z6l5$3@(X5gcy=QV$l2iO;us<^HMh@@?~nnH>s$@Dg~4rN2gL#=u9~N$&>~^HVam*A ziIu_2n*@w=WQ5;r@u~P2obzA2VdEA4Lmn5G%FSU-I&sk{e_ul)x6zf0f%}uSctwjW z@BT1bySqb^@$Q6m<)ws@Y_yUY5#woAIQ@cZ?Xcp}qh#o2w^_vWWg``E-aCsc2|+MV_DhCI&J5!L%Q{Er z{+aG_x$sVWdn@~YCBPkiEN>MM=S%li0ekW93vlkVEB2cO9Nf=B_$b)0+ zXm+3`9wbzEEEIy;8uiaN_^JRhslqjpnDxgZBpHDqI5#!r#HRvsa>aNyd-Yg|5D*zr zQPAok{e7P`Y|nv`?cRt4AfO0RlqC@oi1GX~7dBTx-f$r2K_XWH#X_RTCh{f$r)Tx8 zo~wEWc{sTQ#E%RjP2{jU1eS!F=na7ZxZ;ViZ=Q^sLg3uA#CYxog4tYPo$-1nvJK4+ zI5#aN>C#oh5%J?~QI-91ZgZjCfn0u>L_z$BqGowrdh+D?JpyuXcWzpc(K1{>MN!dG z33dNR*pvgSA;_IfQS0%k700>nZe7k|UrwLq13XU8b-Z*SZ&v02DZwpEN17HXH)t+iSnZ_q7{w?zzW@LL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit.rsi/vomit-1.png b/Resources/Textures/Fluids/vomit.rsi/vomit-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dc6499e5e34f1cb05ba794a3e76c007f600cbf83 GIT binary patch literal 663 zcmV;I0%-k-P){I1fPuh`fYvjy zk8j4@`1gFYeGdSp^yX@D@5j8nT|YmQrq*>tIwB$$0JNf$h^QdwAq_p%KuWDksdZ^; z9dfa^1blPKAlv{I1%-v7K$=>o2*kL{fZN*zjepOAlG53&#i!as2u$g%ocE|&-|yWJ zN$LEc1>c-mfldUGOL2v@L{U15Q$9qROrVDts6e3D zO{{<*i&oa>DnO4)m^HN(n+&WyYzZmFV`0Y5e6v`yo~tN`>=u6tzge#|DyBF(B9`P_o*_|`fWlNzSN1+!lz#Em(&QmSFoqE}+m!@+@FqDaC8+BU?-(p}J+>kY@ZOF1kZH8>eO9506N9k<#2ax xgYEm}%Nh7;yo7;awQfIKz0cy`VBoI?@COfhUM6i9_VNG#002ovPDHLkV1h|!H$(sc literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit.rsi/vomit-2.png b/Resources/Textures/Fluids/vomit.rsi/vomit-2.png new file mode 100644 index 0000000000000000000000000000000000000000..e1e2bcd6a5ecf868974d63ed9295572c9c812bf8 GIT binary patch literal 523 zcmV+m0`&cfP)+=q(S5jp$(^r`6d)JiI#PgDz^lW&hXuF~-?axyetwH&osWTF7op*U1wtH- zW+;bo9P!Hd_0sBZ0B->QJ%DEV%r6Bnw`17K`PjRtG*dR31JL6pfV&uI^f{cZ*zGG&6RLO?Hlh8e)JV1Q~H zYA)m8059#=xIi}ntZ7tj!y3#P5mo`wUuOic@*IGRAar(thI?+qO24zv;XvYS5l)Q3 zPu@TyfDXpEDa5M`R1Y`um8F?-?F>kz+rb&2clr$sFd9HU=YqK%gGiqVLgzLBvD6@d z1WVnL%at&y1AzFv3sg@*wGFH1MgR#N z4Ap`cI$zjPp7K5#s0GUgLeUo-a+7u zmCdZqhHBYVnA-tBJx`WHwqy(4{_UbXFM_z(ko##28e{c6TvyL7hV-)7(q;0<7p_zfZD{7CIZN+|#U N002ovPDHLkV1kvT>+S#m literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit.rsi/vomit-3.png b/Resources/Textures/Fluids/vomit.rsi/vomit-3.png new file mode 100644 index 0000000000000000000000000000000000000000..13ed9cb3d7a30bc64d6cdfe2bf8d1a4cefa23f32 GIT binary patch literal 457 zcmV;)0XF`LP)}fViu3FhCd}b7X*cfX)%$(E!;aclTf$3MGM3`k;O2nrHo=eo1!R zFbv!?Uhb;?1b6~G0Ui#Z()V~*fGMoqEt6N{+u4Fnw%}SPv>Ff2P4#fLpxGHvP00$3 z>KKm&jw4L9D`ze(;tPQ47zF{_L#U1sE8pALYI`zyffN%2TXa&Z)SfQ@A*3o0z(CAX z#1ROga|PtH@J>uTVXB=W;QegnVM^_BbI)-#zQw5?TyY^mY*FpHO*^vfp1JZ-RN<3T0t|SM{+d*5(cASdWMRoRl8>=!stqSE*Hotsj%jaai-{kH&qD<11Lyj9HIls^X0 z3ln!|R_|(nrJcU^1-)4duKkzzpF{Wr_)`EM&Vt6=0n=B$00000NkvXXu0mjfh^fo4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit_toxin.rsi/meta.json b/Resources/Textures/Fluids/vomit_toxin.rsi/meta.json new file mode 100644 index 0000000000..2a60f9e2db --- /dev/null +++ b/Resources/Textures/Fluids/vomit_toxin.rsi/meta.json @@ -0,0 +1,27 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/aff0d780742ca3902d8b05f854c212c8cda32c4f/icons/effects/blood.dmi", + "states": [ + { + "name": "vomit_toxin-0", + "directions": 1 + }, + { + "name": "vomit_toxin-1", + "directions": 1 + }, + { + "name": "vomit_toxin-2", + "directions": 1 + }, + { + "name": "vomit_toxin-3", + "directions": 1 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-0.png b/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-0.png new file mode 100644 index 0000000000000000000000000000000000000000..7931469583cb047e61a71d03fe05cea863e3023d GIT binary patch literal 613 zcmV-r0-F7aP)1`ZL>2|Nv4Wgeh_kz_gX z&q&#nEBi$B|K4=J?w(|~+wn+zcqse35|Ayvv=0@~9KI$G6)+e7zkn=X&&vH|0Z;k2 zfhfy2ZI-Xw{@&k+h!$|HUq&W#fJMBZq$ufZ5i?U@&#uG^>XdO*0G@u{FU`pUvc;yw zhjTTGut$x8wJ2#R?1yw6Kix0QXaU(`6INrOGH&!Fq(ayuURHP;znUom=t(^+JCYFk z?H~jb&IBRLH&LFrE1)-5Q@iDy?JY}hsmyOHHx97{m60fNn4JO( zfTE+YJ1Ss_rKz8zC*!0PWcj95(z3#ZFb{BmWqBqt4$%?F@~#0H2J@-gBDOfaG;)7) zh>Jpe1p4ypNj!)x&~TJzrDraDe+3_JJ{w5v>oy-CZ zD-=_pXeoqaN$7gw`zi>=91o<~0y<)V(BnG@`xU+ug+oK_%zcnUL!EKNS$O&zpi@d@uR(Z&-pD00000NkvXXu0mjfz_Sf- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-1.png b/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e63513eeb50d1c61ee52793a18939cb586c6df35 GIT binary patch literal 722 zcmV;@0xkWCP)_=2cH{5MKVf`1NBF= z0Xzf;#-l8GYQA4p;bI8@+GaKWY;#5!3BJTQ)^w;*BnV=XLdKy+Ygm?e4>#8`%rN01 zzwd2c^@`TV5)^#%afU!0!S-m_qi8KiDG1_`~(;J#bNh(;kikl9KzR zj12F})9w%iH3~*1lV1gRy1C12UiE3f8eD>K5J3I@ye-r0kHC&OE8|rUw9O_m)1tE@e& zvNgn25Fo%qS`i1}OJ105!g+92uU-*TjAw-QuzLS)_||BfO=exyx6LZ!Fz=raKa{r3 zCbM~Uc5H*o=gSW*!F%FE6!>|v-Co-NFU9|%z&{P}8`dREdNS2JbN~PV07*qoM6N<$ Ef{oBk8UO$Q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-2.png b/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-2.png new file mode 100644 index 0000000000000000000000000000000000000000..92328a5ac24c7db1810c24e98bf567bef450389c GIT binary patch literal 573 zcmV-D0>b@?P)7-Tyh)s@+TEmER9eF2PP#HB)x+GE7Z6_BcAMn@#jn2jTXh&zC{TF#zS!F zZ5%M80(!^q!Au$xnI3nv;hZzG6g*9SNplb_Sf&+0pPChf=%~YY`Uic zn1kG`919`W*+4~ZJ%9l3xeZh4Je%(I zuVpwJps%Npq*bqbxzl$tWtGhe3?_#Q&w)PD!QvpSz|7cmPep0#cuvAU<4boz-yKUM zS?aXg($=w@w7;2d$b?@~;FfXKACixQGyc@2GZg=}0uO)(z%Ak@2qN;i7giX100000 LNkvXXu0mjfjm`&k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-3.png b/Resources/Textures/Fluids/vomit_toxin.rsi/vomit_toxin-3.png new file mode 100644 index 0000000000000000000000000000000000000000..6f5b3d845af3de9ed5ffbae6f0d1ce29f0cae147 GIT binary patch literal 501 zcmVA-wE6a+zI?R0zLa0Z%SaZ{8MyUy!SpnE9hto zu64pZR$uZq57V=PPR@X_saPgsY!&wb_M=`8i=1<*h+_XT%D@CbgCHnWdI!*+8Su1x zIZ$V86?eZA`X}3J9>=j>Pm2Qw>Sa=aP9#+DJK!Mn%LF!Q6dGH7D%Kv+QVMDno zf*d>3TqZ{xggNK|1ej^h2uQ8~c*M(>w&c@sEPl75^SPXitzx}>ezQJ4ZJilu-wb1N zYlv}^STBbK>vPpFa3Dv|zQ*rtN@FLH;9Avxi@@KCpLH8{6>mFBs#5~y!otVabSDJb r&h)i6XlE_B_Fv-v9Kt(+e~Q2dS&qX9jB=<}00000NkvXXu0mjfWoO`3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/writing.rsi/meta.json b/Resources/Textures/Fluids/writing.rsi/meta.json new file mode 100644 index 0000000000..0d24adffa6 --- /dev/null +++ b/Resources/Textures/Fluids/writing.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "https://github.com/discordia-space/CEV-Eris/raw/aff0d780742ca3902d8b05f854c212c8cda32c4f/icons/effects/blood.dmi", + "states": [ + { + "name": "writing-0", + "directions": 1 + }, + { + "name": "writing-1", + "directions": 1 + }, + { + "name": "writing-2", + "directions": 1 + }, + { + "name": "writing-3", + "directions": 1 + }, + { + "name": "writing-4", + "directions": 1 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Fluids/writing.rsi/writing-0.png b/Resources/Textures/Fluids/writing.rsi/writing-0.png new file mode 100644 index 0000000000000000000000000000000000000000..591daa76b75ffb4e605fe78c09ea13042c1ac151 GIT binary patch literal 439 zcmV;o0Z9IdP)Q(#R6NoMc_S8=|o zz9iX=qxeu&FGebWEqI7iRkf1jBtGJ6Ro!S4&My@tIg4XBJ%o3$g8R6f+?Y!_F766+O%+*s?V6m zdxJmUFe*5!#;~foNjk&jA`WA@s_u;n&ai^jNpb+6s_M=t!9TO+Dz2&pgSj6|e)|@* hJ!=0fFwRU|;0G(OkdKVDp@jed002ovPDHLkV1ktG&I14d literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/writing.rsi/writing-1.png b/Resources/Textures/Fluids/writing.rsi/writing-1.png new file mode 100644 index 0000000000000000000000000000000000000000..9e0f3fc91d3b3ddce72c0495dc3305b4b0d77621 GIT binary patch literal 373 zcmV-*0gC>KP)VAVH7l2CX670#iz0-X&tbQ#qd7B6vbi{Y!u~-F@pWvav1tNlC zun20gi6AnL;4^rWFvWZIm9yK~hsFAzz4qy5vzbNKzJ
3^71)e;`!C@x`w*Gb;~ z6M(9k;xwKnd4yZIm}Fj6XYm57RkeQ*Kvf;U2A<&yKKJL#c#o4+wT_!u#&;aYLA*(_ z(+yq1s=A8vxQ02t;sWmXFYc1e_tK9M!8FOKKcF7q2tJ{!stzkSgX>u9?=}Zdpf_B@ zE_V9XOH8qa8#sZ-xQCC}^gF7_Sl@6Pw|j$cIF{rIKHv~uC0WIDoWoX*vJ1p zTwQw7W)eP0rZeRPoAo^}CYeOC2p)Z*ZXkIk>4R{Gm|@?tAaGMZO@NewogupbelW%+AKN7y$qhpr3`G<_pB!^YhX^e{>}5J;z~x5ZTtTT zZ(u*esGHz>Nw|RV4m1COo+af8SIY#sCNOzOZLrP!&3YnNpD{f4jFgR(DnAXUfzvw?Mp-?n8g~cZ&z|S>}=saU|HatF0y%2pQ>qNwCCpo zb{96(a_;f;a$=aY%3EV)>TcbaA~zU{7I-dqZhgC1ph3Re;nI#JzPEE3Zr?t@Qo!NE zeEL9XN5P604wl~o6zi|9pS~gf;naq@FcudFIC|TV|J^0EX-akIWMCLFc)I$ztaD0e F0su1|jI;m% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/writing.rsi/writing-3.png b/Resources/Textures/Fluids/writing.rsi/writing-3.png new file mode 100644 index 0000000000000000000000000000000000000000..c65c4aaec6e5b684b63f9a407f28340680afb2e7 GIT binary patch literal 402 zcmV;D0d4+?P)CSns@VQpJ1kF3RFu^23Zbq!)!SP`sRL=b~PSQJGKf(S;-a&
    g=a5ywc+ceSJ8$bhS01co4U`t;I zCE0`hIDk($g?U`XGG?pl{@-zZDlml;c!Q(3HCkWB1)NE;FoNBi}JB!}^(s$M0TuBvZ;?)RyHBww)$H*g8xaj~lAlWfI~k@PRI zQdO6GtAQlju(PUu>GFODC-DrbY8}(Ki_h51m{O2rdsY4TAKyOP@HCE9)e*c%^0umu zCz-<)Ea_goR#hK2;`(gE2Utxqz#`U@?8Z-AtE$&HgqumOj{{(zuJGz!TbooEO5j6HT{FhC97Bqkc&;T01Z=^V9qnQH>@Bjb+07*qoM6N<$f)bCi)Bpeg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Fluids/writing.rsi/writing-4.png b/Resources/Textures/Fluids/writing.rsi/writing-4.png new file mode 100644 index 0000000000000000000000000000000000000000..ad7e11ec13e969b953edd46ed73e835c314ec5e5 GIT binary patch literal 296 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ_nt0}Ar*7pURU&XaTH*9@IEup zKx0waVta>Y{1Pq#TV@_zR{vy`f>MX8i$IPT|3lN`NuO3d+|ZpM&@55&aMr!T4+3SU zHZfcOHry?}ZPn|j*@hQiy<-hvKtUh!83i{A3r=SKe6(Xmf5+3tJ6GbfLKpw(QA*;w zy<$TPUz*^Hhs^C3r_Su&$Smd3I`zyO-Y02BpKX=OE}lK}FTb>n&E<%cm_e_d*~UKI zH;*NrR~*seGx}_%6j#`PMBL7Jv+)<%6KC}Dj6RFxR~%5CS8%mQz2YF-yxB{ucN}Y- kpKL9?lKFApwfPUtQ@q?3KMn}m2lP6Fr>mdKI;Vst09k2zG5`Po literal 0 HcmV?d00001