diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs index 98aaf672c23..734c550f92e 100644 --- a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs +++ b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs @@ -6,7 +6,7 @@ namespace Content.Server.Ghost.Roles.Components; [RegisterComponent] -[Access(typeof(GhostRoleSystem))] +//[Access(typeof(GhostRoleSystem))] // Goobstation edit - removed access public sealed partial class GhostRoleComponent : Component { [DataField("name")] private string _roleName = "Unknown"; diff --git a/Content.Server/Ghost/Roles/GhostRoleSystem.cs b/Content.Server/Ghost/Roles/GhostRoleSystem.cs index a5802e44bb0..798fef5aa05 100644 --- a/Content.Server/Ghost/Roles/GhostRoleSystem.cs +++ b/Content.Server/Ghost/Roles/GhostRoleSystem.cs @@ -786,6 +786,7 @@ private void OnSpawnerTakeRole(EntityUid uid, GhostRoleMobSpawnerComponent compo var spawnedEvent = new GhostRoleSpawnerUsedEvent(uid, mob); RaiseLocalEvent(mob, spawnedEvent); + RaiseLocalEvent(uid, spawnedEvent); // Goobstation edit if (ghostRole.MakeSentient) _mindSystem.MakeSentient(mob, ghostRole.AllowMovement, ghostRole.AllowSpeech); diff --git a/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs b/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs index 4a49ed3b42c..ae692690f17 100644 --- a/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs +++ b/Content.Server/Spawners/EntitySystems/ConditionalSpawnerSystem.cs @@ -1,3 +1,4 @@ +using Content.Goobstation.Common.Spawner; using Content.Server.GameTicking; using Content.Server.Spawners.Components; using Content.Shared.EntityTable; @@ -99,7 +100,12 @@ private void Spawn(EntityUid uid, ConditionalSpawnerComponent component) var coords = _xform.GetMapCoordinates(uid, xform); var rotation = _xform.GetWorldRotation(xform); - Spawn(_robustRandom.Pick(component.Prototypes), coords, rotation: rotation); + var spawned = Spawn(_robustRandom.Pick(component.Prototypes), coords, rotation: rotation); // Goobstation edit - saved in variable + + // Goobstation edit start + var spawnedEv = new SpawnerActivationEvent(spawned); + RaiseLocalEvent(uid, ref spawnedEv); + // Goobstation edit end } private void Spawn(EntityUid uid, RandomSpawnerComponent component) @@ -117,7 +123,12 @@ private void Spawn(EntityUid uid, RandomSpawnerComponent component) var coords = _xform.GetMapCoordinates(uid, xform).Offset(vOffset); var rotation = _xform.GetWorldRotation(xform); - Spawn(proto, coords, rotation: rotation); + var spawned = Spawn(proto, coords, rotation: rotation); // Goobstation edit - saved in variable + + // Goobstation edit start + var spawnedEv = new SpawnerActivationEvent(spawned); + RaiseLocalEvent(uid, ref spawnedEv); + // Goobstation edit end } private EntProtoId? GetPrototype(Entity spawner) @@ -168,7 +179,12 @@ private void Spawn(Entity ent) var vOffset = _robustRandom.NextVector2(-offset, offset); var trueCoords = coords.Offset(vOffset); - Spawn(proto, trueCoords, rotation: rotation); + var spawned = Spawn(proto, trueCoords, rotation: rotation); // Goobstation edit - saved in variable + + // Goobstation edit start + var spawnedEv = new SpawnerActivationEvent(spawned); + RaiseLocalEvent(ent.Owner, ref spawnedEv); + // Goobstation edit end } } } diff --git a/Content.Server/Spawners/EntitySystems/SpawnerSystem.cs b/Content.Server/Spawners/EntitySystems/SpawnerSystem.cs index bcbfdb626e1..9e297287f20 100644 --- a/Content.Server/Spawners/EntitySystems/SpawnerSystem.cs +++ b/Content.Server/Spawners/EntitySystems/SpawnerSystem.cs @@ -1,3 +1,4 @@ +using Content.Goobstation.Common.Spawner; using Content.Server.Spawners.Components; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -49,7 +50,12 @@ private void OnTimerFired(EntityUid uid, TimedSpawnerComponent component) for (var i = 0; i < number; i++) { var entity = _random.Pick(component.Prototypes); - SpawnAtPosition(entity, coordinates); + var spawned = SpawnAtPosition(entity, coordinates); // Goobstation edit - saved in variable + + // Goobstation edit start + var spawnedEv = new SpawnerActivationEvent(spawned); + RaiseLocalEvent(uid, ref spawnedEv); + // Goobstation edit end } } } diff --git a/Content.Shared/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs b/Content.Shared/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs index 6984be91f96..4a7bc3c08a8 100644 --- a/Content.Shared/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs +++ b/Content.Shared/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.EntityTable.EntitySelectors; using Robust.Shared.Prototypes; namespace Content.Shared.Ghost.Roles.Components diff --git a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs index b944acc4435..4d80577ef43 100644 --- a/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs +++ b/Content.Shared/StepTrigger/Systems/StepTriggerSystem.cs @@ -146,6 +146,7 @@ private bool CanTrigger(EntityUid uid, EntityUid otherUid, StepTriggerComponent var msg = new StepTriggerAttemptEvent { Source = uid, Tripper = otherUid }; RaiseLocalEvent(uid, ref msg); + RaiseLocalEvent(otherUid, ref msg); // Goobstation edit return msg.Continue && !msg.Cancelled; } diff --git a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs index ad3d9ce426f..37a6a512066 100644 --- a/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedEntityStorageSystem.cs @@ -411,7 +411,7 @@ public bool IsOpen(EntityUid target, EntityStorageComponent? component = null) public bool CanOpen(EntityUid user, EntityUid target, bool silent = false, EntityStorageComponent? component = null) { - if (!Resolve(target, ref component)) + if (!Resolve(target, ref component, false)) // Goobstation edit - suppress error return false; if (!HasComp(user)) diff --git a/Content.Shared/Trigger/Systems/TriggerSystem.Spawn.cs b/Content.Shared/Trigger/Systems/TriggerSystem.Spawn.cs index 0bc1cffe666..4fcd2d8897a 100644 --- a/Content.Shared/Trigger/Systems/TriggerSystem.Spawn.cs +++ b/Content.Shared/Trigger/Systems/TriggerSystem.Spawn.cs @@ -1,3 +1,4 @@ +using Content.Goobstation.Common.Spawner; using Content.Shared.GameTicking; using Content.Shared.Trigger.Components.Effects; using Content.Shared.Trigger.Components.Triggers; @@ -68,13 +69,15 @@ private void HandleSpawnTableOnTrigger(EntityWhether to use predicted spawning. private void SpawnTriggerHelper(Entity target, EntProtoId proto, bool useMapCoords, bool predicted) { + EntityUid? spawned = null; // Goobstation edit - saved in variable + if (useMapCoords) { var mapCoords = _transform.GetMapCoordinates(target); if (predicted) - EntityManager.PredictedSpawn(proto, mapCoords); + spawned = EntityManager.PredictedSpawn(proto, mapCoords); // Goobstation edit - saved in variable else if (_net.IsServer) - Spawn(proto, mapCoords); + spawned = Spawn(proto, mapCoords); // Goobstation edit - saved in variable } else @@ -84,10 +87,18 @@ private void SpawnTriggerHelper(Entity target, EntProtoId pr return; if (predicted) - PredictedSpawnAttachedTo(proto, coords); + spawned = PredictedSpawnAttachedTo(proto, coords); // Goobstation edit - saved in variable else if (_net.IsServer) - SpawnAttachedTo(proto, coords); + spawned = SpawnAttachedTo(proto, coords); // Goobstation edit - saved in variable } + + // Goobstation edit start + if (spawned == null) + return; + + var spawnedEv = new SpawnerActivationEvent(spawned.Value); + RaiseLocalEvent(target.Owner, ref spawnedEv); + // Goobstation edit end } private void HandleDeleteOnTrigger(Entity ent, ref TriggerEvent args) diff --git a/Content.Shared/Trigger/Systems/TriggerSystem.cs b/Content.Shared/Trigger/Systems/TriggerSystem.cs index 5a2cbe707a9..21a32a0fe84 100644 --- a/Content.Shared/Trigger/Systems/TriggerSystem.cs +++ b/Content.Shared/Trigger/Systems/TriggerSystem.cs @@ -1,3 +1,4 @@ +using Content.Goobstation.Common.Trigger; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.DeviceLinking; @@ -78,6 +79,12 @@ public bool Trigger(EntityUid trigger, EntityUid? user = null, string? key = nul var triggerEvent = new TriggerEvent(user, key, predicted); RaiseLocalEvent(trigger, ref triggerEvent, true); + + // Goobstation edit start + var afterTriggerEvent = new AfterTriggerEvent(user, key, predicted, triggerEvent.Handled); + RaiseLocalEvent(trigger, ref afterTriggerEvent, true); + // Goobstation edit end + return triggerEvent.Handled; } diff --git a/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisuals.cs b/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisuals.cs new file mode 100644 index 00000000000..89cfca6164e --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisuals.cs @@ -0,0 +1,7 @@ +namespace Content.Goobstation.Client.CombatMode; + +public enum CombatModeVisuals +{ + Combat, + Layer, +} diff --git a/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisualsComponent.cs b/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisualsComponent.cs new file mode 100644 index 00000000000..8f9ce866e26 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisualsComponent.cs @@ -0,0 +1,4 @@ +namespace Content.Goobstation.Client.CombatMode; + +[RegisterComponent] +public sealed partial class CombatModeVisualsComponent : Component; diff --git a/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisualsSystem.cs b/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisualsSystem.cs new file mode 100644 index 00000000000..28fc382dc6d --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Client/CombatMode/CombatModeVisualsSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.CombatMode; + +namespace Content.Goobstation.Client.CombatMode; + +public sealed partial class CombatModeVisualsSystem : EntitySystem +{ + [Dependency] private SharedAppearanceSystem _appearance = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnCombatToggle); + SubscribeLocalEvent(OnCombatStartup); + } + + private void OnCombatToggle(Entity ent, ref ToggleCombatActionEvent args) + => UpdateAppearance(ent.Owner); + + private void OnCombatStartup(Entity ent, ref ComponentStartup args) + => UpdateAppearance(ent.Owner); + + private void UpdateAppearance(EntityUid uid) + { + if (!TryComp(uid, out var combat)) + return; + + _appearance.SetData(uid, CombatModeVisuals.Combat, combat.IsInCombatMode); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Common/Spawner/SpawnerActivationEvent.cs b/Modules/GoobStation/Content.Goobstation.Common/Spawner/SpawnerActivationEvent.cs new file mode 100644 index 00000000000..bea32e39cca --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Common/Spawner/SpawnerActivationEvent.cs @@ -0,0 +1,8 @@ +namespace Content.Goobstation.Common.Spawner; + +/// +/// Raised after an entity was spawned from any sort of spawner. +/// +/// +[ByRefEvent] +public record struct SpawnerActivationEvent(EntityUid Spawned); diff --git a/Modules/GoobStation/Content.Goobstation.Common/Trigger/TriggerEvents.cs b/Modules/GoobStation/Content.Goobstation.Common/Trigger/TriggerEvents.cs new file mode 100644 index 00000000000..a27d86b8887 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Common/Trigger/TriggerEvents.cs @@ -0,0 +1,4 @@ +namespace Content.Goobstation.Common.Trigger; + +[ByRefEvent] +public record struct AfterTriggerEvent(EntityUid? User = null, string? Key = null, bool Predicted = true, bool Handled = false); diff --git a/Modules/GoobStation/Content.Goobstation.Server/Spawner/GhostRoleTableSpawnerComponent.cs b/Modules/GoobStation/Content.Goobstation.Server/Spawner/GhostRoleTableSpawnerComponent.cs new file mode 100644 index 00000000000..e44226d868a --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Spawner/GhostRoleTableSpawnerComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.EntityTable.EntitySelectors; + +namespace Content.Goobstation.Server.Spawner; + +/// +/// A version of that supports . +/// +[RegisterComponent] +public sealed partial class GhostRoleTableSpawnerComponent : Component +{ + [DataField] + public EntityTableSelector? Table; + + [DataField] + public bool DeleteOnSpawn = true; + + [DataField] + public int AvailableTakeovers = 1; + + [ViewVariables] + public int CurrentTakeovers = 0; +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Spawner/GhostRoleTableSpawnerSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Spawner/GhostRoleTableSpawnerSystem.cs new file mode 100644 index 00000000000..2b7f6eddd78 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Spawner/GhostRoleTableSpawnerSystem.cs @@ -0,0 +1,99 @@ +using System.Linq; +using Content.Server.Ghost.Roles.Components; +using Content.Server.Ghost.Roles.Events; +using Content.Shared.EntityTable; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Content.Shared.Players; +using Content.Shared.Roles; +using Robust.Shared.Player; +using Robust.Shared.Utility; + +namespace Content.Goobstation.Server.Spawner; + +public sealed partial class GhostRoleTableSpawnerSystem : EntitySystem +{ + [Dependency] private EntityTableSystem _table = default!; + [Dependency] private SharedTransformSystem _transform = default!; + [Dependency] private SharedMindSystem _mindSystem = default!; + [Dependency] private SharedRoleSystem _roleSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSpawnerTakeRole); + } + + private void OnSpawnerTakeRole(Entity ent, ref TakeGhostRoleEvent args) + { + var (uid, component) = ent; + + if (!TryComp(uid, out GhostRoleComponent? ghostRole) || + !CanTakeGhost(uid, ghostRole)) + { + args.TookRole = false; + return; + } + + var spawns = _table.GetSpawns(ent.Comp.Table).ToList(); + if (spawns.Count == 0) + return; + + var proto = spawns[0]; + + var mob = Spawn(proto, Transform(uid).Coordinates); + _transform.AttachToGridOrMap(mob); + + var spawnedEvent = new GhostRoleSpawnerUsedEvent(uid, mob); + RaiseLocalEvent(mob, spawnedEvent); + RaiseLocalEvent(uid, spawnedEvent); // Goobstation edit + + if (ghostRole.MakeSentient) + _mindSystem.MakeSentient(mob, ghostRole.AllowMovement, ghostRole.AllowSpeech); + + EnsureComp(mob); + + GhostRoleInternalCreateMindAndTransfer(args.Player, uid, mob, ghostRole); + + if (++component.CurrentTakeovers < component.AvailableTakeovers) + { + args.TookRole = true; + return; + } + + ghostRole.Taken = true; + + if (component.DeleteOnSpawn) + QueueDel(uid); + + args.TookRole = true; + } + + private bool CanTakeGhost(EntityUid uid, GhostRoleComponent? component = null) + { + return Resolve(uid, ref component, false) && + !component.Taken && + !MetaData(uid).EntityPaused; + } + + public void GhostRoleInternalCreateMindAndTransfer(ICommonSession player, EntityUid roleUid, EntityUid mob, GhostRoleComponent? role = null) + { + if (!Resolve(roleUid, ref role)) + return; + + DebugTools.AssertNotNull(player.ContentData()); + + // After taking a ghost role, the player cannot return to the original body, so wipe the player's current mind + // unless it is a visiting mind + if(_mindSystem.TryGetMind(player.UserId, out _, out var mind) && !mind.IsVisitingEntity) + _mindSystem.WipeMind(player); + + var newMind = _mindSystem.CreateMind(player.UserId, + Comp(mob).EntityName); + + _mindSystem.SetUserId(newMind, player.UserId); + _mindSystem.TransferTo(newMind, mob); + + _roleSystem.MindAddRoles(newMind.Owner, role.MindRoles, newMind.Comp); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Spawner/SpawnerLinkSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Spawner/SpawnerLinkSystem.cs new file mode 100644 index 00000000000..bb05ee158bf --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Spawner/SpawnerLinkSystem.cs @@ -0,0 +1,42 @@ +using Content.Goobstation.Common.Spawner; +using Content.Goobstation.Shared.Spawner; +using Content.Server.Ghost.Roles.Events; +using Content.Shared.Teleportation.Components; +using Content.Shared.Teleportation.Systems; + +namespace Content.Goobstation.Server.Spawner; + +public sealed partial class SpawnerLinkSystem : EntitySystem +{ + [Dependency] private LinkedEntitySystem _link = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnSpawnerActivation); + SubscribeLocalEvent(OnLinkTransferActivation); + SubscribeLocalEvent(OnGhostRoleSpawnerUsed); + } + + private void OnSpawnerActivation(Entity ent, ref SpawnerActivationEvent args) + { + _link.TryLink(ent.Owner, args.Spawned); + } + + private void OnLinkTransferActivation(Entity ent, ref SpawnerActivationEvent args) + => TransferLinks(ent.Owner, args.Spawned); + + private void OnGhostRoleSpawnerUsed(Entity ent, ref GhostRoleSpawnerUsedEvent args) + => TransferLinks(ent.Owner, args.Spawned); + + private void TransferLinks(Entity from, EntityUid to) + { + if (!Resolve(from.Owner, ref from.Comp)) + return; + + foreach (var linked in from.Comp.LinkedEntities) + { + _link.TryLink(to, linked); + } + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Trigger/AnnounceOnTriggerComponent.cs b/Modules/GoobStation/Content.Goobstation.Server/Trigger/AnnounceOnTriggerComponent.cs new file mode 100644 index 00000000000..46f78d4397a --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Trigger/AnnounceOnTriggerComponent.cs @@ -0,0 +1,32 @@ +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Audio; + +namespace Content.Goobstation.Server.Trigger; + +[RegisterComponent] +public sealed partial class AnnounceOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Locale id of the announcement message. + /// + [DataField(required: true)] + public LocId Message = string.Empty; + + /// + /// Locale id of the announcement's sender, defaults to Central Command. + /// + [DataField] + public LocId? Sender; + + /// + /// Sound override for the announcement. + /// + [DataField] + public SoundSpecifier? Sound; + + /// + /// Color override for the announcement. + /// + [DataField] + public Color? Color; +} diff --git a/Modules/GoobStation/Content.Goobstation.Server/Trigger/AnnounceOnTriggerSystem.cs b/Modules/GoobStation/Content.Goobstation.Server/Trigger/AnnounceOnTriggerSystem.cs new file mode 100644 index 00000000000..23fdcba010a --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Server/Trigger/AnnounceOnTriggerSystem.cs @@ -0,0 +1,26 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Trigger; + +namespace Content.Goobstation.Server.Trigger; + +public sealed partial class AnnounceOnTriggerSystem : EntitySystem +{ + [Dependency] private ChatSystem _chat = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAnnounceTrigger); + } + + private void OnAnnounceTrigger(Entity ent, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + var comp = ent.Comp; + var message = Loc.GetString(comp.Message); + var sender = comp.Sender != null ? Loc.GetString(comp.Sender) : Loc.GetString("chat-manager-sender-announcement"); + _chat.DispatchGlobalAnnouncement(message, sender, playSound: true, comp.Sound, comp.Color); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Containers/ContainerComponentGrantComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Containers/ContainerComponentGrantComponent.cs new file mode 100644 index 00000000000..b792331942f --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Containers/ContainerComponentGrantComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Goobstation.Shared.Containers; + +/// +/// Adds components to any entity that is inserted into the container. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class ContainerComponentGrantComponent : Component +{ + [DataField(required: true)] + public ComponentRegistry Components; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Containers/GoobContainerSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Containers/GoobContainerSystem.cs new file mode 100644 index 00000000000..867134b3b74 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Containers/GoobContainerSystem.cs @@ -0,0 +1,29 @@ +using Robust.Shared.Containers; +using Robust.Shared.Timing; + +namespace Content.Goobstation.Shared.Containers; + +public sealed partial class GoobContainerSystem : EntitySystem +{ + [Dependency] private IGameTiming _timing = default!; + + /// + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInsert); + SubscribeLocalEvent(OnRemoved); + } + + private void OnInsert(Entity ent, ref EntInsertedIntoContainerMessage args) + { + if (!_timing.ApplyingState) + EntityManager.AddComponents(args.Entity, ent.Comp.Components, false); + } + + private void OnRemoved(Entity ent, ref EntRemovedFromContainerMessage args) + { + if (!_timing.ApplyingState) + EntityManager.RemoveComponents(args.Entity, ent.Comp.Components); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/EntityConditions/Conditions/TriggerCountCondition.cs b/Modules/GoobStation/Content.Goobstation.Shared/EntityConditions/Conditions/TriggerCountCondition.cs new file mode 100644 index 00000000000..29d8f3c8552 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/EntityConditions/Conditions/TriggerCountCondition.cs @@ -0,0 +1,28 @@ +using Content.Goobstation.Shared.Trigger.Components.Counter; +using Content.Shared.Destructible.Thresholds; +using Content.Shared.EntityConditions; +using Robust.Shared.Prototypes; + +namespace Content.Goobstation.Shared.EntityConditions.Conditions; + +public sealed partial class TriggerCountConditionSystem : EntityConditionSystem +{ + protected override void Condition(Entity entity, ref EntityConditionEvent args) + { + if (entity.Comp.Counts.TryGetValue(args.Condition.Key, out var count) + && args.Condition.Count.Min <= count + && args.Condition.Count.Max >= count) + args.Result = true; + } +} + +public sealed partial class TriggerCountCondition : EntityConditionBase +{ + [DataField(required: true)] + public MinMax Count; + + [DataField] + public string Key; + + public override string EntityConditionGuidebookText(IPrototypeManager prototype) => ""; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/EntityEffects/Effects/Visuals/ScaleSprite.cs b/Modules/GoobStation/Content.Goobstation.Shared/EntityEffects/Effects/Visuals/ScaleSprite.cs new file mode 100644 index 00000000000..b10f936037d --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/EntityEffects/Effects/Visuals/ScaleSprite.cs @@ -0,0 +1,10 @@ +using System.Numerics; +using Content.Shared.EntityEffects; + +namespace Content.Goobstation.Shared.EntityEffects.Effects.Visuals; + +public sealed partial class ScaleSprite : EntityEffectBase +{ + [DataField] + public Vector2 Scale; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/EntityEffects/Effects/Visuals/ScaleSpriteEntityEffectSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/EntityEffects/Effects/Visuals/ScaleSpriteEntityEffectSystem.cs new file mode 100644 index 00000000000..02348a8d609 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/EntityEffects/Effects/Visuals/ScaleSpriteEntityEffectSystem.cs @@ -0,0 +1,20 @@ +using Content.Shared.EntityEffects; +using Content.Shared.Sprite; +using Robust.Shared.Network; + +namespace Content.Goobstation.Shared.EntityEffects.Effects.Visuals; + +public sealed partial class ScaleSpriteEntityEffectSystem : EntityEffectSystem +{ + [Dependency] private SharedScaleVisualsSystem _scale = default!; + [Dependency] private INetManager _net = default!; + + protected override void Effect(Entity entity, ref EntityEffectEvent args) + { + if (!_net.IsServer) + return; // It breaks in prediction + + // TODO add proper scale scaling. I mean... the EntityEffects scale scaling the vector scale. You know. + _scale.SetSpriteScale(entity.Owner, _scale.GetSpriteScale(entity.Owner) * args.Effect.Scale); + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Spawner/LinkedEntityTransferComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Spawner/LinkedEntityTransferComponent.cs new file mode 100644 index 00000000000..13b2fba2d02 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Spawner/LinkedEntityTransferComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Spawner; + +[RegisterComponent, NetworkedComponent] +public sealed partial class LinkedEntityTransferComponent : Component; diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Spawner/SpawnerLinkComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Spawner/SpawnerLinkComponent.cs new file mode 100644 index 00000000000..c588f2295c3 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Spawner/SpawnerLinkComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Spawner; + +/// +/// Links entities together after they were spawned by this entity. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class SpawnerLinkComponent : Component; diff --git a/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/Components/StepTriggerExceptComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/Components/StepTriggerExceptComponent.cs new file mode 100644 index 00000000000..15f1e29572d --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/Components/StepTriggerExceptComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Whitelist; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.StepTrigger.Components; + +/// +/// Component that makes a step trigger ignore some entities. +/// +/// +/// Usually you want to use on the stepper instead of this component. +/// +[RegisterComponent, NetworkedComponent] +[Access(typeof(GoobStepTriggerSystem))] +public sealed partial class StepTriggerExceptComponent : Component +{ + [DataField] + public EntityWhitelist? Whitelist; + + [DataField] + public EntityWhitelist? Blacklist; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/Components/StepTriggerImmuneComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/Components/StepTriggerImmuneComponent.cs new file mode 100644 index 00000000000..ef0d6082fe2 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/Components/StepTriggerImmuneComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Whitelist; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.StepTrigger.Components; + +/// +/// Component that makes an entity immune to some step triggers. +/// +[RegisterComponent, NetworkedComponent] +[Access(typeof(GoobStepTriggerSystem))] +public sealed partial class StepTriggerImmuneComponent : Component +{ + [DataField] + public EntityWhitelist? Whitelist; + + [DataField] + public EntityWhitelist? Blacklist; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/GoobStepTriggerSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/GoobStepTriggerSystem.cs new file mode 100644 index 00000000000..6e211abe0d9 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/StepTrigger/GoobStepTriggerSystem.cs @@ -0,0 +1,29 @@ +using Content.Goobstation.Shared.StepTrigger.Components; +using Content.Shared.StepTrigger.Systems; +using Content.Shared.Whitelist; + +namespace Content.Goobstation.Shared.StepTrigger; + +public sealed partial class GoobStepTriggerSystem : EntitySystem +{ + [Dependency] private EntityWhitelistSystem _whitelist = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnImmuneTrigger); + SubscribeLocalEvent(OnExceptTrigger); + } + + private void OnImmuneTrigger(Entity ent, ref StepTriggerAttemptEvent args) + { + if (_whitelist.CheckBoth(args.Source, ent.Comp.Blacklist, ent.Comp.Whitelist)) + args.Cancelled = true; + } + + private void OnExceptTrigger(Entity ent, ref StepTriggerAttemptEvent args) + { + if (_whitelist.CheckBoth(args.Tripper, ent.Comp.Blacklist, ent.Comp.Whitelist)) + args.Cancelled = true; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Conditions/TriggerCounterLimitComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Conditions/TriggerCounterLimitComponent.cs new file mode 100644 index 00000000000..249faf00d03 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Conditions/TriggerCounterLimitComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Trigger.Systems; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Trigger.Components.Conditions; + +/// +/// Allows the trigger to actually activate only when the +/// total amount of triggers is within a certain range. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerCounterLimitComponent : Component +{ + /// + /// Max amount of each trigger key activation. + /// + [DataField, AutoNetworkedField] + public Dictionary MaxCounts = new() + { + [TriggerSystem.DefaultTriggerKey] = 1, + }; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Counter/TriggerCounterComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Counter/TriggerCounterComponent.cs new file mode 100644 index 00000000000..c17f4d216ae --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Counter/TriggerCounterComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Trigger.Components.Counter; + +/// +/// Counts the total amount of triggers that this entity had in its entire lifetime. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerCounterComponent : BaseXOnTriggerComponent +{ + /// + /// Keys to count when they are triggered. + /// + [DataField(required: true)] + public HashSet CountKeys; + + /// + /// Amount of triggers per each trigger key. + /// + [ViewVariables, AutoNetworkedField] + public Dictionary Counts = new(); +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Counter/TriggerOnConditionComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Counter/TriggerOnConditionComponent.cs new file mode 100644 index 00000000000..dc4b49c2e55 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Counter/TriggerOnConditionComponent.cs @@ -0,0 +1,18 @@ +using Content.Shared.EntityConditions; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Trigger.Components.Counter; + +/// +/// Triggers a key when the trigger count reaches a certain range. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnConditionComponent : BaseXOnTriggerComponent +{ + /// + /// Amount of triggers per each trigger key. + /// + [DataField(required: true)] + public Dictionary Triggers; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/LinkedEntityEffectOnTriggerComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/LinkedEntityEffectOnTriggerComponent.cs new file mode 100644 index 00000000000..d51028060a8 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/LinkedEntityEffectOnTriggerComponent.cs @@ -0,0 +1,25 @@ +using Content.Shared.EntityEffects; +using Content.Shared.Teleportation.Components; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Trigger.Components.Effects; + +/// +/// Applies an entity effect to all entities in the +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class LinkedEntityEffectOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The effects to apply. + /// + [DataField, AutoNetworkedField] + public EntityEffect[] Effects; + + /// + /// Optional scale multiplier for the effects. + /// + [DataField, AutoNetworkedField] + public float Scale = 1f; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/ResetCounterOnTriggerComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/ResetCounterOnTriggerComponent.cs new file mode 100644 index 00000000000..10ec5a032c4 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/ResetCounterOnTriggerComponent.cs @@ -0,0 +1,19 @@ +using Content.Goobstation.Shared.Trigger.Components.Counter; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Trigger.Components.Effects; + +/// +/// When triggered, resets a list of keys from their activation counts in . +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ResetCounterOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Dictionary of trigger keys -> list of keys to reset. + /// If a key is not specified in , does nothing. + /// + [DataField] + public Dictionary Reset = new(); +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/TileReplaceOnTriggerComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/TileReplaceOnTriggerComponent.cs new file mode 100644 index 00000000000..dfe9b4c14ea --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/TileReplaceOnTriggerComponent.cs @@ -0,0 +1,39 @@ +using Content.Shared.Maps; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Goobstation.Shared.Trigger.Components.Effects; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TileReplaceOnTriggerComponent : BaseXOnTriggerComponent +{ + [DataField, AutoNetworkedField] + public ProtoId Tile; + + /// + /// The default range in which the tiles are spawned. + /// + [DataField, AutoNetworkedField] + public float Radius = 1f; + + /// + /// The chance to spawn a tile for each tile inside the radius. + /// + [DataField, AutoNetworkedField] + public float Prob = 0.1f; + + /// + /// If true and the entity has , the + /// will be scaled to the total amount of triggers in the activated key. + /// After that it's multiplied by in order to modify the speed of growth. + /// + [DataField, AutoNetworkedField] + public bool RadiusCounterScaling; + + /// + /// How much per each trigger do we scale the if is enabled. + /// + [DataField, AutoNetworkedField] + public float RadiusCounterModifier = 0.1f; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/TriggerOnTriggerComponent.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/TriggerOnTriggerComponent.cs new file mode 100644 index 00000000000..6ece628a446 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Components/Effects/TriggerOnTriggerComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Trigger.Systems; +using Robust.Shared.GameStates; + +namespace Content.Goobstation.Shared.Trigger.Components.Effects; + +/// +/// Activates a list of trigger keys when it's triggered by some other specific trigger key. +/// Use this in order to easily multiply a trigger. +/// +/// +/// Use this only if you know what you're doing, because this is basically a dangerous workaround. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnTriggerComponent : Component +{ + [DataField, AutoNetworkedField] + public string KeyIn = TriggerSystem.DefaultTriggerKey; + + [DataField(required: true), AutoNetworkedField] + public HashSet KeysOut; +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/GoobTriggerSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/GoobTriggerSystem.cs new file mode 100644 index 00000000000..5bf237e464f --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/GoobTriggerSystem.cs @@ -0,0 +1,115 @@ +using System.Numerics; +using Content.Goobstation.Shared.Trigger.Components.Conditions; +using Content.Goobstation.Shared.Trigger.Components.Counter; +using Content.Goobstation.Shared.Trigger.Components.Effects; +using Content.Shared.Maps; +using Content.Shared.Random.Helpers; +using Content.Shared.Trigger; +using Content.Shared.Trigger.Systems; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Goobstation.Shared.Trigger; + +public sealed partial class GoobTriggerSystem : EntitySystem +{ + [Dependency] private IGameTiming _timing = default!; + [Dependency] private ITileDefinitionManager _tiledef = default!; + [Dependency] private TileSystem _tile = default!; + [Dependency] private TurfSystem _turf = default!; + [Dependency] private TriggerSystem _trigger = default!; + [Dependency] private SharedMapSystem _map = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTriggerCounter); + SubscribeLocalEvent(OnTriggerTileReplace); + SubscribeLocalEvent(OnTriggerTrigger); + SubscribeLocalEvent(OnTriggerLimitCounter); + } + + private void OnTriggerCounter(Entity ent, ref TriggerEvent args) + { + if (!_timing.IsFirstTimePredicted + || args.Key != null + && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + foreach (var key in ent.Comp.CountKeys) + { + ent.Comp.Counts.TryAdd(key, 0); + ent.Comp.Counts[key] += 1; + } + } + + private void OnTriggerTileReplace(Entity ent, ref TriggerEvent args) + { + var tgtPos = Transform(ent.Owner); + if (tgtPos.GridUid is not { } gridUid || !TryComp(gridUid, out MapGridComponent? mapGrid)) + return; + var radius = ent.Comp.Radius; + + if (args.Key != null + && ent.Comp.RadiusCounterScaling + && TryComp(ent.Owner, out TriggerCounterComponent? counter) + && counter.Counts.TryGetValue(args.Key, out var count)) + radius *= count * ent.Comp.RadiusCounterModifier; + + var box = new Box2( + tgtPos.Coordinates.Position + new Vector2(-radius, -radius), + tgtPos.Coordinates.Position + new Vector2(radius, radius)); + + var tileEnumerator = _map.GetLocalTilesEnumerator(gridUid, mapGrid, box); + var convertTile = (ContentTileDefinition) _tiledef[ent.Comp.Tile]; + + while (tileEnumerator.MoveNext(out var tile)) + { + var random = SharedRandomExtensions.PredictedRandom( + _timing, + new NetEntity(SharedRandomExtensions.HashCodeCombine(tile.X, tile.Y, tile.Tile.TypeId))); + + if (tile.Tile.TypeId == convertTile.TileId + || _turf.GetContentTileDefinition(tile).Name == convertTile.Name + || !random.Prob(ent.Comp.Prob)) + continue; + + _tile.ReplaceTile(tile, convertTile); + _tile.PickVariant(convertTile, random); + } + } + + private void OnTriggerLimitCounter(Entity ent, ref AttemptTriggerEvent args) + { + if (args.Key != null && !ent.Comp.MaxCounts.ContainsKey(args.Key)) + return; + + if (!TryComp(ent.Owner, out TriggerCounterComponent? comp)) + return; + + var key = args.Key ?? TriggerSystem.DefaultTriggerKey; + if (comp.Counts[key] >= ent.Comp.MaxCounts[key]) + args.Cancelled = true; + } + + private void OnTriggerTrigger(Entity ent, ref TriggerEvent args) + { + if (ent.Comp.KeysOut.Contains(ent.Comp.KeyIn)) + { + Log.Error($"{nameof(TriggerOnTriggerComponent)} on entity {ToPrettyString(ent.Owner)} had referenced its {nameof(TriggerOnTriggerComponent.KeyIn)} in the {nameof(TriggerOnTriggerComponent.KeysOut)} field, causing a self-reference!"); + ent.Comp.KeysOut.Remove(ent.Comp.KeyIn); + return; + } + + if (args.Key != ent.Comp.KeyIn) + return; + + foreach (var key in ent.Comp.KeysOut) + { + _trigger.Trigger(ent.Owner, args.User, key, args.Predicted); + } + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs new file mode 100644 index 00000000000..6bfd6b5363a --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs @@ -0,0 +1,27 @@ +using Content.Goobstation.Shared.Trigger.Components.Effects; +using Content.Shared.EntityEffects; +using Content.Shared.Teleportation.Components; +using Content.Shared.Trigger; + +namespace Content.Goobstation.Shared.Trigger.Systems; + +public sealed partial class LinkedEntityEffectOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private SharedEntityEffectsSystem _effects = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (!TryComp(ent.Owner, out LinkedEntityComponent? linkedEntity)) + return; + + foreach (var entity in linkedEntity.LinkedEntities) + { + if (TerminatingOrDeleted(entity) || !Exists(entity)) + continue; + + _effects.ApplyEffects(entity, ent.Comp.Effects, ent.Comp.Scale); + } + + args.Handled = true; + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/ResetCounterOnTriggerSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/ResetCounterOnTriggerSystem.cs new file mode 100644 index 00000000000..6b7ef1c8835 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/ResetCounterOnTriggerSystem.cs @@ -0,0 +1,38 @@ +using Content.Goobstation.Shared.Trigger.Components.Counter; +using Content.Goobstation.Shared.Trigger.Components.Effects; +using Content.Shared.Trigger; + +namespace Content.Goobstation.Shared.Trigger.Systems; + +public sealed partial class ResetCounterOnTriggerSystem : XOnTriggerSystem +{ + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (!TryComp(ent.Owner, out TriggerCounterComponent? counter)) + return; + + // Reset everything if it's a general key. + if (args.Key == null) + { + foreach (var key in counter.CountKeys) + { + counter.Counts[key] = 0; + } + return; + } + + foreach (var (key, reset) in ent.Comp.Reset) + { + if (key != args.Key) + continue; + + foreach (var keyValue in reset) + { + if (!counter.Counts.ContainsKey(keyValue)) + continue; + + counter.Counts[keyValue] = 0; + } + } + } +} diff --git a/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/TriggerOnConditionSystem.cs b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/TriggerOnConditionSystem.cs new file mode 100644 index 00000000000..a1860a22ed2 --- /dev/null +++ b/Modules/GoobStation/Content.Goobstation.Shared/Trigger/Systems/TriggerOnConditionSystem.cs @@ -0,0 +1,27 @@ +using Content.Goobstation.Shared.Trigger.Components.Counter; +using Content.Shared.EntityConditions; +using Content.Shared.Trigger; +using Content.Shared.Trigger.Systems; + +namespace Content.Goobstation.Shared.Trigger.Systems; + +public sealed partial class TriggerOnConditionSystem : XOnTriggerSystem +{ + [Dependency] private SharedEntityConditionsSystem _conditions = default!; + [Dependency] private TriggerSystem _trigger = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key) + || !TryComp(ent.Owner, out TriggerCounterComponent? counter)) + return; + + foreach (var (keyOut, conditions) in ent.Comp.Triggers) + { + if (!_conditions.TryConditions(target, conditions)) + continue; + + _trigger.Trigger(ent.Owner, args.User, keyOut, args.Predicted); + } + } +} diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/VoidsEmbrace.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/VoidsEmbrace.ogg new file mode 100644 index 00000000000..66eac7e13e5 Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/VoidsEmbrace.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_ash.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_ash.ogg new file mode 100644 index 00000000000..a85aa0f6a9c Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_ash.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_blade.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_blade.ogg new file mode 100644 index 00000000000..da7c313ad8a Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_blade.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_cosmos.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_cosmos.ogg new file mode 100644 index 00000000000..413e7215000 Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_cosmos.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_flesh.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_flesh.ogg new file mode 100644 index 00000000000..b488cafd0bf Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_flesh.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_knock.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_knock.ogg new file mode 100644 index 00000000000..73f0a7f0b3b Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_knock.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_rust.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_rust.ogg new file mode 100644 index 00000000000..5cfc73b2cf5 Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_rust.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_void.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_void.ogg new file mode 100644 index 00000000000..797784952d1 Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/ascend_void.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/attributions.yml b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/attributions.yml new file mode 100644 index 00000000000..a9b97355002 --- /dev/null +++ b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/attributions.yml @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2024 Piras314 +# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 Aiden +# SPDX-FileCopyrightText: 2025 username <113782077+whateverusername0@users.noreply.github.com> +# SPDX-FileCopyrightText: 2025 whateverusername0 +# +# SPDX-License-Identifier: AGPL-3.0-or-later + +- files: ["ascend_ash.ogg", "ascend_blade.ogg", "ascend_flesh.ogg", "ascend_knock.ogg", "ascend_rust.ogg", "ascend_void.ogg", "ascend_cosmos", "heretic_gain.ogg", "heretic_gain_intense.ogg", "VoidsEmbrace.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Taken from /tg/station" + source: "https://github.com/tgstation/tgstation/tree/master/sound/music/antag/heretic" diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/heretic_gain.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/heretic_gain.ogg new file mode 100644 index 00000000000..9944e833a66 Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/heretic_gain.ogg differ diff --git a/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/heretic_gain_intense.ogg b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/heretic_gain_intense.ogg new file mode 100644 index 00000000000..5e6d4f4174f Binary files /dev/null and b/Modules/GoobStation/Resources/Audio/Ambience/Antag/Heretic/heretic_gain_intense.ogg differ diff --git a/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/bingle/gamerule.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/bingle/gamerule.ftl new file mode 100644 index 00000000000..6227bbe2037 --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/bingle/gamerule.ftl @@ -0,0 +1,2 @@ +bingle-pit-ascension = bongle +bingle-pit-ascension-sender = Bingle Pit diff --git a/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/bingle/popups.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/bingle/popups.ftl new file mode 100644 index 00000000000..fa23be8a108 --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/bingle/popups.ftl @@ -0,0 +1 @@ +bingle-pit-grow = The pit expands! diff --git a/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/chat/speech_verbs.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/chat/speech_verbs.ftl new file mode 100644 index 00000000000..e21b3f0f54e --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/chat/speech_verbs.ftl @@ -0,0 +1,5 @@ +chat-speech-verb-name-bingle = Bingle +bingle-verb-1 = Croaks +bingle-verb-2 = Mumbles +bingle-verb-3 = Harks +bingle-verb-4 = Grumbles diff --git a/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/damage/damage.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/damage/damage.ftl new file mode 100644 index 00000000000..7be7612bcee --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/damage/damage.ftl @@ -0,0 +1,2 @@ +damage-group-electronic = Electronic +damage-type-ion = Ion diff --git a/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/ghost/ghost_roles.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/ghost/ghost_roles.ftl new file mode 100644 index 00000000000..8693fea9acd --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/ghost/ghost_roles.ftl @@ -0,0 +1,3 @@ +ghost-role-information-bingle-name = Bingle +ghost-role-information-bingle-description = The Pit is love. The Pit is life. The Pit must grow. Use +w to bing with other Bingles. +ghost-role-information-bingle-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with other Bingles. You must feed the pit. diff --git a/Modules/GoobStation/Resources/Locale/en-US/gps/gps.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/gps/gps.ftl similarity index 100% rename from Modules/GoobStation/Resources/Locale/en-US/gps/gps.ftl rename to Modules/GoobStation/Resources/Locale/en-US/_Goobstation/gps/gps.ftl diff --git a/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/stack/stack.ftl b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/stack/stack.ftl new file mode 100644 index 00000000000..5ecf94d0331 --- /dev/null +++ b/Modules/GoobStation/Resources/Locale/en-US/_Goobstation/stack/stack.ftl @@ -0,0 +1 @@ +stack-bingle-tile = bingle tile diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Catalog/Fills/Crates/fun.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Catalog/Fills/Crates/fun.yml new file mode 100644 index 00000000000..c9f213272db --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Catalog/Fills/Crates/fun.yml @@ -0,0 +1,13 @@ +- type: entity + id: CrateFunBingleLoot + parent: CrateBingle + name: Bingle loot + components: + - type: StorageFill + contents: + - id: PlushieBingle + amount: 3 + - id: PlushieBingleSmall + - id: PlushieBongle + - id: PlushieBingleYakub + - id: PlushieBinglePony diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/groups.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/groups.yml new file mode 100644 index 00000000000..5bb295717fd --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/groups.yml @@ -0,0 +1,5 @@ +- type: damageGroup + id: Electronic + name: damage-group-electronic + damageTypes: + - Ion diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml new file mode 100644 index 00000000000..923c37177df --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/modifier_sets.yml @@ -0,0 +1,238 @@ +- type: damageModifierSet + id: Silicon + coefficients: + Heat: 0.8 + Blunt: 0.9 + Slash: 0.9 + Piercing: 0.9 + +- type: damageModifierSet + id: SiliconProtected + coefficients: + Blunt: 0.6 + Slash: 0.6 + Piercing: 0.6 + Heat: 0.5 + flatReductions: + Blunt: 5 + Slash: 5 + Piercing: 5 + +- type: damageModifierSet + id: Yowie + coefficients: + Blunt: 0.75 + Slash: 0.75 + Piercing: 0.75 + Cold: 0.9 + Bloodloss: 0.9 + Poison: 0.0 # Yea, heroin is heaps good for ya + Radiation: 0.7 # Engie yowies need some help against anti-rads + +- type: damageModifierSet + id: Tajaran + coefficients: # Literally the same as felinids, but heat and cold cuz fur + Blunt: 1.15 + Slash: 1.15 + Piercing: 1.15 + Heat: 1.20 + Cold: 0.80 + +- type: damageModifierSet + id: FireShark + coefficients: + Heat: 0.25 + Cold: 0.25 + Poison: 0.0 + Radiation: 0.0 + Asphyxiation: 0.0 + Cellular: 0.0 + +# Mech armor +- type: damageModifierSet + id: ThinArmor + coefficients: + Blunt: 0.8 + Slash: 0.8 + Piercing: 0.9 + Shock: 1.2 + Heat: 0.8 + Ion: 1.0 + flatReductions: + Blunt: 3 + Heat: 2 + +- type: damageModifierSet + id: LightArmor + coefficients: + Blunt: 0.75 + Slash: 0.75 + Piercing: 0.7 + Shock: 1.2 + Heat: 0.7 + Ion: 1.0 + flatReductions: + Blunt: 5 + Heat: 5 + +- type: damageModifierSet + id: MediumArmorNT + coefficients: + Blunt: 0.6 + Slash: 0.6 + Piercing: 0.65 + Shock: 1.4 + Heat: 0.7 + Ion: 1.0 + flatReductions: + Blunt: 8 + Heat: 10 + +- type: damageModifierSet + id: HeavyArmorNT + coefficients: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.35 + Shock: 1.8 + Heat: 0.6 + Ion: 1.0 + flatReductions: + Blunt: 15 + Heat: 15 + +- type: damageModifierSet + id: MediumArmorSyndi + coefficients: + Blunt: 0.6 + Slash: 0.6 + Piercing: 0.6 + Shock: 1.4 + Heat: 0.75 + Ion: 1.0 + flatReductions: + Blunt: 8 + Heat: 5 + +- type: damageModifierSet + id: HeavyArmorSyndi + coefficients: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.4 + Shock: 1.8 + Heat: 0.7 + Ion: 1.0 + flatReductions: + Blunt: 10 + Heat: 7 + +- type: damageModifierSet + id: Bingle + coefficients: + Blunt: 0.9 # 10% reduction to all + Slash: 0.9 + Piercing: 0.9 + Shock: 0.9 + Heat: 0.9 + Ion: 2.0 # double damage from ion + +- type: damageModifierSet + id: BingleUpgraded + coefficients: + Blunt: 0.8 # 20% reduction to all + Slash: 0.8 + Piercing: 0.8 + Shock: 0.8 + Heat: 0.8 + Ion: 2.0 # double damage from ion + +- type: damageModifierSet + id: HisGraceAscended + coefficients: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.5 + Cold: 0.5 + Heat: 0.5 + +- type: damageModifierSet + id: StructuralImmunity + coefficients: + Structural: 0 + +- type: damageModifierSet + id: Dragon + coefficients: + Blunt: 0.9 + Slash: 0.85 + Piercing: 0.8 + Shock: 1.2 # I guess snakes better conduct electricity???????? + Heat: 0.7 + +- type: damageModifierSet + id: StrongCrates + coefficients: + Blunt: 0.5 + Slash: 0.5 + Piercing: 0.5 + Heat: 0.5 + flatReductions: + Blunt: 20 + Slash: 20 + Piercing: 20 + Heat: 20 + Structural: 30 + +# Barricades + +- type: damageModifierSet + id: BarricadeSteel + coefficients: + Blunt: 0.9 + Slash: 0.9 + Piercing: 0.9 + flatReductions: + Blunt: 5 + Slash: 5 + Piercing: 5 + Heat: 5 + Structural: 5 + +- type: damageModifierSet + id: BarricadeSteelFolding + flatReductions: + Blunt: 5 + Slash: 5 + Piercing: 5 + Heat: 3 + +- type: damageModifierSet + id: BarricadePlasteel + coefficients: + Blunt: 0.7 + Slash: 0.6 + Piercing: 0.7 + Structural: 0.75 + Heat: 0.5 + flatReductions: + Blunt: 5 + Slash: 5 + Piercing: 5 + Heat: 3 + Structural: 5 + +- type: damageModifierSet + id: BarricadePlasteelFolding + coefficients: + Blunt: 0.8 + Slash: 0.7 + Piercing: 0.8 + Structural: 0.85 + Heat: 0.5 + flatReductions: + Blunt: 5 + Slash: 5 + Piercing: 5 + Heat: 3 + Structural: 3 diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/types.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/types.yml new file mode 100644 index 00000000000..471442453df --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Damage/types.yml @@ -0,0 +1,5 @@ +- type: damageType + id: Ion + name: damage-type-ion + armorCoefficientPrice: 1 + armorFlatPrice: 1 diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/bingle.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/bingle.yml new file mode 100644 index 00000000000..e0a19e13d65 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Markers/Spawners/bingle.yml @@ -0,0 +1,26 @@ +- type: entity + id: SpawnPointGhostBingle + name: ghost role spawn point + suffix: Bingle + parent: MarkerBase + components: + - type: GhostRole + name: ghost-role-information-bingle-name + description: ghost-role-information-bingle-description + rules: ghost-role-information-bingle-rules + mindRoles: + - MindRoleGhostRoleTeamAntagonist + raffle: null # no raffle for spammed role fuck you + - type: GhostRoleTableSpawner + table: !type:GroupSelector + children: + - id: MobBingle + weight: 49 # 49/50 + - id: MobTurkle + weight: 1 # 01/50 + - type: LinkedEntityTransfer + - type: Sprite + layers: + - state: green + - sprite: Mobs/Bingle/bingle.rsi + state: icon diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/bingle.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/bingle.yml new file mode 100644 index 00000000000..090e6a4065d --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Mobs/Player/bingle.yml @@ -0,0 +1,227 @@ +# Base bingle +- type: entity + name: bingle + id: MobBingle + parent: MobSpaceBasic + description: bingle + components: + #- type: Bingle + # upgradedID: MobBingleUpgraded + - type: GhostTakeoverAvailable + - type: GhostRole + name: ghost-role-information-bingle-name + description: ghost-role-information-bingle-description + rules: ghost-role-information-bingle-rules + mindRoles: + - MindRoleGhostRoleTeamAntagonist + raffle: + settings: default + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Bingle/bingle.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: alive + - map: ["combat"] + state: combat + visible: false + - type: MobThresholds + thresholds: + 0: Alive + 100: Dead + - type: MobState + allowedStates: + - Alive + - Dead + - type: DamageStateVisuals + states: + Alive: + Base: alive + Dead: + Base: dead + - type: Bloodstream + bloodReferenceSolution: + reagents: + - ReagentId: Nitrogen + Quantity: 100 + - type: MeleeWeapon + altDisarm: false + soundHit: + path: /Audio/Weapons/Xeno/alien_claw_flesh3.ogg + angle: 0 + wideAnimationRotation: 0 + animation: WeaponArcSlash + damage: + types: + Blunt: 7 + Structural: 14 # breaks down the walls and airlocks in 10 hits + Ion: 5 + bluntStaminaDamageFactor: 2.0 + - type: MovementSpeedModifier + baseWalkSpeed : 2 # same as slime + baseSprintSpeed : 4 + #- type: Sprinter + # staminaDrainRate: 27 #fat legs + - type: Stamina + baseCritThreshold: 120 + - type: StaminaDamageOnHit # Should consistently stamcrit in 3 hits, 4-5 against sec + damage: 25 + sound: /Audio/Weapons/egloves.ogg + - type: Damageable + damageModifierSet: Bingle + - type: Injurable + damageContainer: Biological + - type: FootstepModifier + footstepSoundCollection: + path: /Audio/Effects/Footsteps/slime1.ogg + params: + volume: 3 + - type: TypingIndicator + proto: alien + - type: Speech + speechVerb: Bingle + speechSounds: Slime + #- type: LanguageKnowledge + # speaks: + # - Bingle + # understands: + # - TauCetiBasic + #- type: CollectiveMind + # defaultChannel: Binglemind + # respectAccents: true + # channels: + # - Binglemind + - type: PassiveDamage #passive Healing + allowedStates: + - Alive + damage: + types: + Blunt: -0.5 + Slash: -0.5 + Piercing: -0.5 + Heat: -0.5 + Shock: -0.5 + Caustic: -0.5 + Poison: -0.5 + #- type: NightVision + # color: "#008080" + # activateSound: null + # deactivateSound: null + - type: FlashImmunity + #- type: Butcherable + # spawned: + # - id: FoodMeatBingle + # amount: 3 + - type: StepTriggerImmune + whitelist: + tags: + - BinglePit + - type: CombatModeVisuals + - type: GenericVisualizer + visuals: + enum.CombatModeVisuals.Combat: + combat: + True: { visible: true } + False: { visible: false } + - type: Tag + tags: + - DoorBumpOpener + - Bingle + +- type: entity + id: MobBingleUpgraded + parent: MobBingle + suffix: Upgraded + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Bingle/bingle.rsi + layers: + - map: [ "enum.DamageStateVisualLayers.Base", "movement" ] + state: Upgraded + - map: [ "combat" ] + state: combat + visible: false + - type: DamageStateVisuals + states: + Alive: + Base: Upgraded + Dead: + Base: dead_upgraded + - type: MeleeWeapon + soundHit: + path: /Audio/Weapons/Xeno/alien_claw_flesh3.ogg + angle: 0 + wideAnimationRotation: 0 + animation: WeaponArcSlash + damage: + types: + Blunt: 14 + Structural: 28 + Ion: 7 + - type: Damageable + damageModifierSet: BingleUpgraded + +- type: polymorph + id: BingleUpgraded + configuration: + entity: MobBingleUpgraded + forced: true + inventory: None + revertOnCrit: false + revertOnDeath: false + polymorphPopup: null + +# Skin - turkle +- type: entity + name: turkle + id: MobTurkle + parent: MobBingle + description: A bingle from foreign lands lost to time. Seems very proud of their homeland. + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Bingle/turkle.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: alive + - map: ["combat"] + state: combat + visible: false + #- type: NightVision + # color: "#802000" + # activateSound: null + # deactivateSound: null + - type: PointLight + radius: 1.2 + energy: 2 + color: "#ad2a33" + - type: Tag + tags: + - DoorBumpOpener + - Turkle + +- type: entity + id: MobTurkleUpgraded + parent: MobBingleUpgraded + suffix: Upgraded + components: + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Bingle/turkle.rsi + layers: + - map: [ "enum.DamageStateVisualLayers.Base", "movement" ] + state: Upgraded + - map: [ "combat" ] + state: combat + visible: false + +- type: polymorph + id: TurkleUpgraded + configuration: + entity: MobTurkleUpgraded + forced: true + inventory: None + revertOnCrit: false + revertOnDeath: false + polymorphPopup: null diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Objects/Fun/plushies.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Objects/Fun/plushies.yml new file mode 100644 index 00000000000..2eedc56f5c1 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Objects/Fun/plushies.yml @@ -0,0 +1,80 @@ +- type: entity + parent: BasePlushie + id: BaseBinglePlushie + abstract: true + components: + - type: EmitSoundOnUse + sound: + path: /Audio/Effects/falling.ogg + - type: EmitSoundOnActivate + sound: + path: /Audio/Effects/falling.ogg + - type: EmitSoundOnTrigger + sound: + path: /Audio/Effects/falling.ogg + - type: EmitSoundOnCollide + sound: + path: /Audio/Effects/falling.ogg + - type: Edible + requiresSpecialDigestion: true + useSound: + path: /Audio/Effects/falling.ogg + - type: MeleeWeapon + wideAnimationRotation: 180 + soundHit: + path: /Audio/Effects/falling.ogg + +- type: entity + parent: BaseBinglePlushie + id: PlushieBingle + name: full size bingle plushie + description: A cute stuffed toy that resembles a blue alien. You feel a strange compulsion to say bingle. + components: + - type: Sprite + sprite: Mobs/Bingle/bingle.rsi + state: alive + noRot: true + +- type: entity + parent: BaseBinglePlushie + id: PlushieBingleSmall + name: bingle plushie + description: A cute stuffed toy that resembles a blue alien. You feel a strange compulsion to say bingle. + components: + - type: Sprite + sprite: Objects/Fun/toys.rsi + state: bingleing + noRot: true + +- type: entity + parent: BaseBinglePlushie + id: PlushieBingleYakub + name: yakub bingle plushie + description: A cute stuffed toy that resembles a blue alien. You feel a strange compulsion to say bingle. + components: + - type: Sprite + sprite: Objects/Fun/yakub_bingle.rsi + state: yakubbingle + noRot: true + +- type: entity + parent: BasePlushie + id: PlushieBongle + name: bongle plushie + description: A cute stuffed toy that resembles a red alien. You feel a strange compulsion to say bongle + components: + - type: Sprite + noRot: true + sprite: Objects/Fun/toys.rsi + state: bongle + +- type: entity + parent: BaseBinglePlushie + id: PlushieBinglePony + name: bingle pony plushie + description: A cute stuffed toy that resembles a blue alien. You feel a strange compulsion to say bingle. + components: + - type: Sprite + noRot: true + sprite: Objects/Fun/toys.rsi + state: bingle_pony diff --git a/Modules/GoobStation/Resources/Prototypes/Entities/Objects/Weapons/Melee/lollychop.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Melee/lollychop.yml similarity index 94% rename from Modules/GoobStation/Resources/Prototypes/Entities/Objects/Weapons/Melee/lollychop.yml rename to Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Melee/lollychop.yml index 79ef749308f..4a5bf5bcc72 100644 --- a/Modules/GoobStation/Resources/Prototypes/Entities/Objects/Weapons/Melee/lollychop.yml +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Objects/Weapons/Melee/lollychop.yml @@ -37,7 +37,7 @@ - type: Item size: Huge - type: Clothing - sprite: _Goobstation/Objects/Weapons/Melee/lollychop.rsi + sprite: Objects/Weapons/Melee/lollychop.rsi quickEquip: false slots: - back diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Structures/Specific/bingle_pit.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Structures/Specific/bingle_pit.yml new file mode 100644 index 00000000000..02ad2bd0532 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Structures/Specific/bingle_pit.yml @@ -0,0 +1,184 @@ +- type: entity + id: BinglePit + categories: [ Spawner ] # needed so tests don't sus + name: bingle pit + description: Looks Hungry + placement: + mode: SnapgridCenter + components: + - type: Transform + anchored: true + - type: Physics + bodyType: Static + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.5,0.5,0.5" + layer: + - WallLayer + mask: + - ItemMask + density: 1000 + hard: false + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Mobs/Bingle/bingle_pit.rsi + state: pit + - type: Appearance + - type: InteractionOutline + - type: Clickable + - type: Damageable + damageModifierSet: Metallic + - type: Injurable + damageContainer: StructuralInorganic + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 600 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:EmptyContainersBehaviour + containers: + - chasm + - !type:SpawnEntitiesBehavior + spawn: + CrateFunBingleLoot: + min: 1 + max: 1 + - type: PassiveDamage #passive Healing + damage: + types: + Blunt: -1 + Slash: -1 + Piercing: -1 + Heat: -1 + Shock: -1 + Structural: -1 + - type: Drain # remove liquids around pit + unitsPerSecond: 10 + unitsDestroyedPerSecond: 10 + - type: SolutionContainerManager + solutions: + drainBuffer: + maxVol: 1000 + - type: ExplosionResistance + damageCoefficient: 0.9 + - type: RequireProjectileTarget + - type: StepTrigger + requiredTriggeredSpeed: 0 + intersectRatio: 0.4 + - type: ContainerContainer + containers: + chasm: !type:Container + - type: Chasm + - type: ChasmContainer + containerId: chasm + - type: ContainerComponentGrant + components: + - type: Stunned # Prevents anyone from destroying the bingle pit from the inside + - type: AntiRottingContainer + - type: TriggerOnInsertedIntoContainer + containerId: chasm + - type: TriggerCounter + keysIn: + - trigger + countKeys: + - trigger + - spawn + - growth + - type: TriggerOnCondition + keysIn: # Triggers the checks + - trigger + triggers: + # Triggers 10 times -> spawns a bingle and resets "spawn" + spawn: + - !type:TriggerCountCondition + key: spawn + count: + min: 10 + max: 10 + # Triggers 100 times -> grows in size and resets "growth" + growth: + - !type:TriggerCountCondition + key: growth + count: + min: 100 + max: 100 + # Triggers 200 times -> upgrade all bingles + upgrade: + - !type:TriggerCountCondition + key: trigger # Triggers only once, so tracks the default key + count: + min: 200 + max: 200 + # Triggers 500 times -> ascension announcement + announce: + - !type:TriggerCountCondition + key: trigger # Triggers only once, so tracks the default key + count: + min: 500 + max: 500 + - type: ResetCounterOnTrigger + keysIn: + - spawn + - growth + reset: + spawn: + - spawn + growth: + - growth + - type: SpawnOnTrigger + keysIn: + - spawn + proto: SpawnPointGhostBingle + - type: SpawnerLink + - type: AnnounceOnTrigger + keysIn: + - announce + message: bingle-pit-ascension + sender: bingle-pit-ascension-sender + sound: + path: /Audio/Ambience/Antag/Heretic/ascend_flesh.ogg + color: Pink + - type: EntityEffectOnTrigger + keysIn: + - growth + effects: + - !type:ScaleSprite + scale: 1.25, 1.25 + - type: LinkedEntityEffectOnTrigger + keysIn: + - upgrade + effects: + - !type:Polymorph + prototype: BingleUpgraded + conditions: + - !type:MobStateCondition + - !type:TagCondition + tag: Bingle + - !type:Polymorph + prototype: TurkleUpgraded + conditions: + - !type:MobStateCondition + - !type:TagCondition + tag: Turkle + - type: TileReplaceOnTrigger + keysIn: + - trigger + tile: FloorBingle + radiusCounterScaling: true + radiusCounterModifier: 0.05 + prob: 0.02 + - type: EmitSoundOnSpawn + sound: + path: /Audio/Weapons/Guns/Gunshots/rocket_launcher.ogg + - type: WarpPoint + location: bingle pit + - type: Tag + tags: + - BinglePit diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Structures/Storage/Crates/bingle.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Structures/Storage/Crates/bingle.yml new file mode 100644 index 00000000000..f226ec4e5a0 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Entities/Structures/Storage/Crates/bingle.yml @@ -0,0 +1,9 @@ +- type: entity + parent: CrateBaseWeldable + id: CrateBingle + name: bingle crate + components: + - type: Icon + sprite: Objects/Storage/binglecrate.rsi + - type: Sprite + sprite: Objects/Storage/binglecrate.rsi diff --git a/Modules/GoobStation/Resources/Prototypes/Particles/particle_effects.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Particles/particle_effects.yml similarity index 100% rename from Modules/GoobStation/Resources/Prototypes/Particles/particle_effects.yml rename to Modules/GoobStation/Resources/Prototypes/_Goobstation/Particles/particle_effects.yml diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Tiles/bingle.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Tiles/bingle.yml new file mode 100644 index 00000000000..8a73a496fde --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Tiles/bingle.yml @@ -0,0 +1,39 @@ +- type: tile + id: FloorBingle + name: tiles-bingle-floor + sprite: /Textures/Tiles/binglefloortile.png + variants: 4 + placementVariants: + - 1.0 + - 1.0 + - 1.0 + - 1.0 + baseTurf: Plating + isSubfloor: false + deconstructTools: [ Prying ] + footstepSounds: + collection: FootstepBlood + itemDrop: FloorTileItemBingle + friction: 1 #No longer slippy + heatCapacity: 10000 + +- type: entity + id: FloorTileItemBingle + parent: FloorTileItemBase + name: bingle floor + components: + - type: Sprite + sprite: Objects/Tiles/bingle.rsi + state: bingletile + - type: FloorTile + outputs: + - Plating + - FloorBingle + - type: Stack + stackType: FloorTileBingle + +- type: stack + id: FloorTileBingle + name: stack-bingle-tile + spawn: FloorTileItemBingle + maxCount: 30 diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml new file mode 100644 index 00000000000..9a2f4baea90 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/Voice/speech_verbs.yml @@ -0,0 +1,8 @@ +- type: speechVerb + id: Bingle + name: chat-speech-verb-name-bingle + speechVerbStrings: + - bingle-verb-1 + - bingle-verb-2 + - bingle-verb-3 + - bingle-verb-4 diff --git a/Modules/GoobStation/Resources/Prototypes/_Goobstation/tags.yml b/Modules/GoobStation/Resources/Prototypes/_Goobstation/tags.yml new file mode 100644 index 00000000000..6dac49dd960 --- /dev/null +++ b/Modules/GoobStation/Resources/Prototypes/_Goobstation/tags.yml @@ -0,0 +1,8 @@ +- type: Tag + id: Bingle + +- type: Tag + id: BinglePit + +- type: Tag + id: Turkle diff --git a/Modules/GoobStation/Resources/Textures/Interface/Emotes/attributions.yml b/Modules/GoobStation/Resources/Textures/Interface/Emotes/attributions.yml index d92bfef1e24..563a2e1f0d4 100644 --- a/Modules/GoobStation/Resources/Textures/Interface/Emotes/attributions.yml +++ b/Modules/GoobStation/Resources/Textures/Interface/Emotes/attributions.yml @@ -1,12 +1,3 @@ -# SPDX-FileCopyrightText: 2024 BombasterDS <115770678+BombasterDS@users.noreply.github.com> -# SPDX-FileCopyrightText: 2024 Piras314 -# SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com> -# SPDX-FileCopyrightText: 2025 GoobBot -# SPDX-FileCopyrightText: 2025 SX-7 -# SPDX-FileCopyrightText: 2025 loltart -# -# SPDX-License-Identifier: AGPL-3.0-or-later - # Attempted to keep the files in alphabetical order so its easier to audit. # Finding individual authors is an unfeasible task. If you can reference the author please do so. diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/Upgraded.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/Upgraded.png new file mode 100644 index 00000000000..6877c80670a Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/Upgraded.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/alive.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/alive.png new file mode 100644 index 00000000000..20e686d2a40 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/alive.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/combat.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/combat.png new file mode 100644 index 00000000000..df537641181 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/combat.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/dead.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/dead.png new file mode 100644 index 00000000000..82d1c47d3f6 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/dead.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/dead_upgraded.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/dead_upgraded.png new file mode 100644 index 00000000000..968b282b8b7 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/dead_upgraded.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/icon.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/icon.png new file mode 100644 index 00000000000..a5517572247 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/icon.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/meta.json new file mode 100644 index 00000000000..00be1e4b478 --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Brainrot HQ", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "alive", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "dead" + }, + { + "name": "dead_upgraded" + }, + { + "name": "Upgraded", + "directions": 4 + }, + { + "name": "combat", + "directions": 4 + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle_pit.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle_pit.rsi/meta.json new file mode 100644 index 00000000000..e1615518804 --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle_pit.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Brainrot HQ", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "pit", + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle_pit.rsi/pit.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle_pit.rsi/pit.png new file mode 100644 index 00000000000..8c9e88cc449 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/bingle_pit.rsi/pit.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/alive.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/alive.png new file mode 100644 index 00000000000..8ea35e49427 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/alive.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/combat.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/combat.png new file mode 100644 index 00000000000..df537641181 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/combat.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/dead.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/dead.png new file mode 100644 index 00000000000..788e4316082 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/dead.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/icon.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/icon.png new file mode 100644 index 00000000000..62efc483d45 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/icon.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/meta.json new file mode 100644 index 00000000000..9b2648db191 --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/cargo-bingle.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Brainrot HQ + modified by @LuciferEOS", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "alive", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "dead" + }, + { + "name": "combat", + "directions": 4 + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/Upgraded.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/Upgraded.png new file mode 100644 index 00000000000..04d5eaef672 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/Upgraded.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/alive.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/alive.png new file mode 100644 index 00000000000..05b5ec774da Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/alive.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/combat.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/combat.png new file mode 100644 index 00000000000..df537641181 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/combat.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/dead.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/dead.png new file mode 100644 index 00000000000..dad663b6598 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/dead.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/dead_upgraded.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/dead_upgraded.png new file mode 100644 index 00000000000..b6efc716004 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/dead_upgraded.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/icon.png b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/icon.png new file mode 100644 index 00000000000..2498baebcaf Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/icon.png differ diff --git a/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/meta.json new file mode 100644 index 00000000000..b359533b0cc --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Mobs/Bingle/turkle.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Brainrot HQ, edited by catdotjs", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "alive", + "directions": 4 + }, + { + "name": "icon" + }, + { + "name": "dead" + }, + { + "name": "dead_upgraded" + }, + { + "name": "Upgraded", + "directions": 4 + }, + { + "name": "combat", + "directions": 4 + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bingle_pony.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bingle_pony.png new file mode 100644 index 00000000000..f52cb46fc9a Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bingle_pony.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bingleing.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bingleing.png new file mode 100644 index 00000000000..20e985ef085 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bingleing.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bongle.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bongle.png new file mode 100644 index 00000000000..b7cbd0d8231 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/bongle.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/meta.json new file mode 100644 index 00000000000..b6c64ea37d4 --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/meta.json @@ -0,0 +1,192 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "BeeRobynn, George Gimme, and Ahti, Abductor by Shy Bandit, plushie_jvne by Jvne, plushie_samantha by SolsticeOfTheWinter, fern by Bobbble, plushie_nigel by SS14:gorgan_freemen/Discord:Dummy, plushie_mnwaar by ShieldAcrados based on the Einstein Engines shadowkin plushie, plushiemnwaar-inhand-left and plushiemnwaar-inhand-right by MarkerWicker, plushie_brizby and plushie_baldzby by Zethine, plushie_boggle and plushie_lehmin by KipperSkipp, plushie xeve by Yonsim, plushie holy by SDPowerStroke, TwoFish by Yero", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "plushie_louie" + }, + { + "name": "plushie_durk" + }, + { + "name": "plushie_jvne" + }, + { + "name": "plushie_fern" + }, + { + "name": "plushie_nigel" + }, + { + "name": "plushie_mnwaar" + }, + { + "name": "plushie_xeve" + }, + { + "name": "plushie_holy" + }, + { + "name": "plushieholy-equipped-HELMET", + "directions": 4 + }, + { + "name": "plushiejvne-inhand-left", + "directions": 4 + }, + { + "name": "plushiejvne-inhand-right", + "directions": 4 + }, + { + "name": "plushie_samantha" + }, + { + "name": "plushiesamantha-equipped-HELMET", + "directions": 4 + }, + { + "name": "plushiesamantha-inhand-left", + "directions": 4 + }, + { + "name": "plushiesamantha-inhand-right", + "directions": 4 + }, + { + "name": "plushie_abductor" + }, + { + "name": "bingleing" + }, + { + "name": "bongle", + "directions": 4 + }, + { + "name": "plushie_brizby" + }, + { + "name": "plushiebrizby-inhand-left", + "directions": 4 + }, + { + "name": "plushiebrizby-inhand-right", + "directions": 4 + }, + { + "name": "plushie_baldzby" + }, + { + "name": "plushiebaldzby-inhand-left", + "directions": 4 + }, + { + "name": "plushiebaldzby-inhand-right", + "directions": 4 + }, + { + "name": "bingle_pony", + "directions": 4 + }, + { + "name": "plushiemnwaar-inhand-left", + "directions": 4 + }, + { + "name": "plushiemnwaar-inhand-right", + "directions": 4 + }, + { + "name": "plushie_boggle" + }, + { + "name": "plushie_lehmin" + }, + { + "name": "plushieboggle-inhand-left", + "directions": 4 + }, + { + "name": "plushieboggle-inhand-right", + "directions": 4 + }, + { + "name": "plushielehmin-inhand-left", + "directions": 4 + }, + { + "name": "plushielehmin-inhand-right", + "directions": 4 + }, + { + "name": "plushie_pasha" + }, + { + "name": "plushiepasha-equipped-HELMET", + "directions": 4 + }, + { + "name": "plushiepasha-equipped-HELMET-vox", + "directions": 4 + }, + { + "name": "plushiepasha-inhand-left", + "directions": 4 + }, + { + "name": "plushiepasha-inhand-right", + "directions": 4 + }, + { + "name": "plushie_leguia" + }, + { + "name": "plushieleguia-equipped-HELMET", + "directions": 4 + }, + { + "name": "plushieleguia-inhand-left", + "directions": 4 + }, + { + "name": "plushieleguia-inhand-right", + "directions": 4 + }, + { + "name": "plushie_grug" + }, + { + "name": "plushiegrug-equipped-HELMET", + "directions": 4 + }, + { + "name": "plushiegrug-inhand-left", + "directions": 4 + }, + { + "name": "plushiegrug-inhand-right", + "directions": 4 + }, + { + "name": "plushie_twofish" + }, + { + "name": "plushietwofish-equipped-HELMET", + "directions": 4 + }, + { + "name": "plushietwofish-inhand-left", + "directions": 4 + }, + { + "name": "plushietwofish-inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_abductor.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_abductor.png new file mode 100644 index 00000000000..1855b8a4287 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_abductor.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_baldzby.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_baldzby.png new file mode 100644 index 00000000000..9f7cdc90d62 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_baldzby.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_boggle.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_boggle.png new file mode 100644 index 00000000000..32f7221d79a Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_boggle.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_brizby.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_brizby.png new file mode 100644 index 00000000000..896976686e8 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_brizby.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_durk.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_durk.png new file mode 100644 index 00000000000..51de9441fd9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_durk.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_fern.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_fern.png new file mode 100644 index 00000000000..27fc7408abc Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_fern.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_grug.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_grug.png new file mode 100644 index 00000000000..ade8024e918 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_grug.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_holy.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_holy.png new file mode 100644 index 00000000000..8353ad1faf9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_holy.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_jvne.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_jvne.png new file mode 100644 index 00000000000..2ac58602264 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_jvne.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_leguia.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_leguia.png new file mode 100644 index 00000000000..5ce38ca31b9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_leguia.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_lehmin.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_lehmin.png new file mode 100644 index 00000000000..bee356dc066 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_lehmin.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_louie.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_louie.png new file mode 100644 index 00000000000..8ff828f1171 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_louie.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_mnwaar.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_mnwaar.png new file mode 100644 index 00000000000..955320c73b9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_mnwaar.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_nigel.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_nigel.png new file mode 100644 index 00000000000..b796cfd676d Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_nigel.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_pasha.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_pasha.png new file mode 100644 index 00000000000..93b5bc0eb40 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_pasha.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_samantha.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_samantha.png new file mode 100644 index 00000000000..8e4e0ea189e Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_samantha.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_twofish.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_twofish.png new file mode 100644 index 00000000000..71531a07282 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_twofish.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_xeve.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_xeve.png new file mode 100644 index 00000000000..5b4ccc70c0f Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushie_xeve.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebaldzby-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebaldzby-inhand-left.png new file mode 100644 index 00000000000..a06ae96c5fb Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebaldzby-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebaldzby-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebaldzby-inhand-right.png new file mode 100644 index 00000000000..39db28eb190 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebaldzby-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieboggle-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieboggle-inhand-left.png new file mode 100644 index 00000000000..b43d5019982 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieboggle-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieboggle-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieboggle-inhand-right.png new file mode 100644 index 00000000000..698836efee5 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieboggle-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebrizby-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebrizby-inhand-left.png new file mode 100644 index 00000000000..0c8b5ba55c9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebrizby-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebrizby-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebrizby-inhand-right.png new file mode 100644 index 00000000000..453bd561e75 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiebrizby-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-equipped-HELMET.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-equipped-HELMET.png new file mode 100644 index 00000000000..567f21c9330 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-equipped-HELMET.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-inhand-left.png new file mode 100644 index 00000000000..5e6109bf150 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-inhand-right.png new file mode 100644 index 00000000000..79db4c4b254 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiegrug-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieholy-equipped-HELMET.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieholy-equipped-HELMET.png new file mode 100644 index 00000000000..6ce52925580 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieholy-equipped-HELMET.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiejvne-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiejvne-inhand-left.png new file mode 100644 index 00000000000..4f61171e133 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiejvne-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiejvne-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiejvne-inhand-right.png new file mode 100644 index 00000000000..72af16ec4a7 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiejvne-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-equipped-HELMET.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-equipped-HELMET.png new file mode 100644 index 00000000000..75a044ffe20 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-equipped-HELMET.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-inhand-left.png new file mode 100644 index 00000000000..f98dc40aeb0 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-inhand-right.png new file mode 100644 index 00000000000..5747c45e87d Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushieleguia-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushielehmin-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushielehmin-inhand-left.png new file mode 100644 index 00000000000..dc79238e7ad Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushielehmin-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushielehmin-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushielehmin-inhand-right.png new file mode 100644 index 00000000000..feb5663c1ed Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushielehmin-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiemnwaar-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiemnwaar-inhand-left.png new file mode 100644 index 00000000000..afad22a1213 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiemnwaar-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiemnwaar-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiemnwaar-inhand-right.png new file mode 100644 index 00000000000..709e3e86998 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiemnwaar-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-equipped-HELMET-vox.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-equipped-HELMET-vox.png new file mode 100644 index 00000000000..b8670b49ea7 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-equipped-HELMET-vox.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-equipped-HELMET.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-equipped-HELMET.png new file mode 100644 index 00000000000..af064a6c085 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-equipped-HELMET.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-inhand-left.png new file mode 100644 index 00000000000..87cd3d52f8b Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-inhand-right.png new file mode 100644 index 00000000000..4612ee9b7d8 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiepasha-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-equipped-HELMET.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-equipped-HELMET.png new file mode 100644 index 00000000000..83c1ffde631 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-equipped-HELMET.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-inhand-left.png new file mode 100644 index 00000000000..f06a0992214 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-inhand-right.png new file mode 100644 index 00000000000..8b5cb9b40ef Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushiesamantha-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-equipped-HELMET.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-equipped-HELMET.png new file mode 100644 index 00000000000..503f19dbd63 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-equipped-HELMET.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-inhand-left.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-inhand-left.png new file mode 100644 index 00000000000..fa0cda20cf4 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-inhand-left.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-inhand-right.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-inhand-right.png new file mode 100644 index 00000000000..1e5dd777af6 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/toys.rsi/plushietwofish-inhand-right.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/yakub_bingle.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Objects/Fun/yakub_bingle.rsi/meta.json new file mode 100644 index 00000000000..c2ce2832cdd --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Objects/Fun/yakub_bingle.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Ahti", + "size": { + "x": 32, + "y": 36 + }, + "states": [ + { + "name": "yakubbingle", + "directions": 4 + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Objects/Fun/yakub_bingle.rsi/yakubbingle.png b/Modules/GoobStation/Resources/Textures/Objects/Fun/yakub_bingle.rsi/yakubbingle.png new file mode 100644 index 00000000000..40a0f1ae907 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Fun/yakub_bingle.rsi/yakubbingle.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/base.png b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/base.png new file mode 100644 index 00000000000..2577730d5a9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/base.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/closed.png b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/closed.png new file mode 100644 index 00000000000..4ad2eef40a3 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/closed.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/icon.png b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/icon.png new file mode 100644 index 00000000000..9acbc1920e8 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/icon.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/meta.json new file mode 100644 index 00000000000..a701c2a2d4f --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/meta.json @@ -0,0 +1,39 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by Sarahon (github) for Goobstation.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "closed" + }, + { + "name": "open" + }, + { + "name": "welded" + }, + { + "name": "sparking", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/open.png b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/open.png new file mode 100644 index 00000000000..3fa494877c8 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/open.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/sparking.png b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/sparking.png new file mode 100644 index 00000000000..87b78b9b465 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/sparking.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/welded.png b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/welded.png new file mode 100644 index 00000000000..9f521b5f691 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Storage/binglecrate.rsi/welded.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Tiles/bingle.rsi/bingletile.png b/Modules/GoobStation/Resources/Textures/Objects/Tiles/bingle.rsi/bingletile.png new file mode 100644 index 00000000000..b2fb3964e1b Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Objects/Tiles/bingle.rsi/bingletile.png differ diff --git a/Modules/GoobStation/Resources/Textures/Objects/Tiles/bingle.rsi/meta.json b/Modules/GoobStation/Resources/Textures/Objects/Tiles/bingle.rsi/meta.json new file mode 100644 index 00000000000..f7be8a853ae --- /dev/null +++ b/Modules/GoobStation/Resources/Textures/Objects/Tiles/bingle.rsi/meta.json @@ -0,0 +1,17 @@ + +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "george gimmi self antag extrodinare", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "bingletile" + } + ] +} + + diff --git a/Modules/GoobStation/Resources/Textures/Tiles/binglefloortile.png b/Modules/GoobStation/Resources/Textures/Tiles/binglefloortile.png new file mode 100644 index 00000000000..b0b6c023ae6 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/binglefloortile.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/bluespace.png b/Modules/GoobStation/Resources/Textures/Tiles/bluespace.png new file mode 100644 index 00000000000..2e93ef2126f Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/bluespace.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/canvas.png b/Modules/GoobStation/Resources/Textures/Tiles/canvas.png new file mode 100644 index 00000000000..94a2ca7b2a9 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/canvas.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalNE.png b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalNE.png new file mode 100644 index 00000000000..f9b763a2c55 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalNE.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalNW.png b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalNW.png new file mode 100644 index 00000000000..fb57f273ff3 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalNW.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalSE.png b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalSE.png new file mode 100644 index 00000000000..3433610f229 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalSE.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalSW.png b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalSW.png new file mode 100644 index 00000000000..385b8825d89 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/latticeDiagonalSW.png differ diff --git a/Modules/GoobStation/Resources/Textures/Tiles/sepia.png b/Modules/GoobStation/Resources/Textures/Tiles/sepia.png new file mode 100644 index 00000000000..ab5a4456673 Binary files /dev/null and b/Modules/GoobStation/Resources/Textures/Tiles/sepia.png differ