diff --git a/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs new file mode 100644 index 00000000000..c4887531151 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs @@ -0,0 +1,47 @@ +using Content.Shared.Medical; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Eye.PenLight.UI +{ + [UsedImplicitly] + public sealed class PenLightBoundUserInterface : BoundUserInterface + { + [ViewVariables] + private PenLightWindow? _window; + + public PenLightBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } + + protected override void Open() + { + base.Open(); + _window = new PenLightWindow + { + Title = EntMan.GetComponent(Owner).EntityName, + }; + _window.OnClose += Close; + _window.OpenCentered(); + } + + protected override void ReceiveMessage(BoundUserInterfaceMessage message) + { + if (_window == null + || message is not PenLightUserMessage cast) + return; + + _window.Diagnose(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_window != null) + _window.OnClose -= Close; + + _window?.Dispose(); + } + } +} diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml new file mode 100644 index 00000000000..149b8a13828 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs new file mode 100644 index 00000000000..809a569fa47 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs @@ -0,0 +1,78 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared.Damage; +using Content.Shared.IdentityManagement; +using Content.Shared.Medical; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using System.Text; + + +namespace Content.Client.Eye.PenLight.UI +{ + [GenerateTypedNameReferences] + public sealed partial class PenLightWindow : FancyWindow + { + private readonly IEntityManager _entityManager; + private const int LightHeight = 150; + private const int LightWidth = 900; + + public PenLightWindow() + { + RobustXamlLoader.Load(this); + + var dependencies = IoCManager.Instance!; + _entityManager = dependencies.Resolve(); + } + public void Diagnose(PenLightUserMessage msg) + { + var target = _entityManager.GetEntity(msg.TargetEntity); + + if (target == null || !_entityManager.TryGetComponent(target, out var damageable)) + { + NoPatientDataText.Visible = true; + ExamDataLabel.Text = string.Empty; + return; + } + + NoPatientDataText.Visible = false; + + + string entityName = Loc.GetString("pen-light-window-entity-unknown-text"); + if (_entityManager.HasComponent(target.Value)) + entityName = Identity.Name(target.Value, _entityManager); + + var sb = new StringBuilder(); + sb.AppendLine(Loc.GetString("pen-light-window-entity-eyes-text", ("entityName", entityName))); + + // Check if Blind and return early if true + if (msg.Blind == true) + { + sb.AppendLine(Loc.GetString("pen-light-exam-blind-text")); + ExamDataLabel.Text = sb.ToString(); + SetHeight = LightHeight; + SetWidth = LightWidth; + return; + } + // EyeDamage + if (msg.EyeDamage == true) + sb.AppendLine(Loc.GetString("pen-light-exam-eyedamage-text")); + + // Drunk + if (msg.Drunk == true) + sb.AppendLine(Loc.GetString("pen-light-exam-drunk-text")); + + // Hallucinating + if (msg.SeeingRainbows == true) + sb.AppendLine(Loc.GetString("pen-light-exam-hallucinating-text")); + + // Healthy + if (msg.Healthy == true) + sb.AppendLine(Loc.GetString("pen-light-exam-healthy-text")); + + ExamDataLabel.Text = sb.ToString(); + + SetHeight = LightHeight; + SetWidth = LightWidth; + } + } +} \ No newline at end of file diff --git a/Content.Server/Arachne/ArachneSystem.cs b/Content.Server/Arachne/ArachneSystem.cs new file mode 100644 index 00000000000..9cdefb441be --- /dev/null +++ b/Content.Server/Arachne/ArachneSystem.cs @@ -0,0 +1,231 @@ +using Content.Shared.Arachne; +using Content.Shared.Actions; +using Content.Shared.IdentityManagement; +using Content.Shared.Verbs; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Stunnable; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.Inventory; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; +using Content.Shared.Humanoid; +using Content.Shared.Nutrition.EntitySystems; +using Content.Server.Buckle.Systems; +using Content.Server.Popups; +using Content.Server.DoAfter; +using Content.Server.Body.Components; +using Content.Server.Vampiric; +using Content.Server.Speech.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Containers; +using Robust.Shared.Map; +using Robust.Shared.Utility; +using Robust.Server.Console; + +namespace Content.Server.Arachne +{ + public sealed class ArachneSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly BuckleSystem _buckleSystem = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + + [Dependency] private readonly IServerConsoleHost _host = default!; + [Dependency] private readonly BloodSuckerSystem _bloodSuckerSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + private const string BodySlot = "body_slot"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddCocoonVerb); + + SubscribeLocalEvent(OnCocEntInserted); + SubscribeLocalEvent(OnCocEntRemoved); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent>(AddSuccVerb); + SubscribeLocalEvent(OnCocoonDoAfter); + } + + private void AddCocoonVerb(EntityUid uid, ArachneComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (args.Target == uid) + return; + + if (!TryComp(args.Target, out var bloodstream)) + return; + + if (bloodstream.BloodReagent != component.WebBloodReagent) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCocooning(uid, component, args.Target); + }, + Text = Loc.GetString("cocoon"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnCocEntInserted(EntityUid uid, CocoonComponent component, EntInsertedIntoContainerMessage args) + { + _blindableSystem.UpdateIsBlind(args.Entity); + EnsureComp(args.Entity); + + if (TryComp(args.Entity, out var currentAccent)) + { + component.WasReplacementAccent = true; + component.OldAccent = currentAccent.Accent; + currentAccent.Accent = "mumble"; + } else + { + component.WasReplacementAccent = false; + var replacement = EnsureComp(args.Entity); + replacement.Accent = "mumble"; + } + } + + private void OnCocEntRemoved(EntityUid uid, CocoonComponent component, EntRemovedFromContainerMessage args) + { + if (component.WasReplacementAccent && TryComp(args.Entity, out var replacement)) + { + replacement.Accent = component.OldAccent; + } else + { + RemComp(args.Entity); + } + + RemComp(args.Entity); + _blindableSystem.UpdateIsBlind(args.Entity); + } + + private void OnDamageChanged(EntityUid uid, CocoonComponent component, DamageChangedEvent args) + { + if (!args.DamageIncreased) + return; + + if (args.DamageDelta == null) + return; + + var body = _itemSlots.GetItemOrNull(uid, BodySlot); + + if (body == null) + return; + + var damage = args.DamageDelta * component.DamagePassthrough; + _damageableSystem.TryChangeDamage(body, damage); + } + + private void AddSuccVerb(EntityUid uid, CocoonComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (!TryComp(args.User, out var sucker)) + return; + + if (!sucker.WebRequired) + return; + + var victim = _itemSlots.GetItemOrNull(uid, BodySlot); + + if (victim == null) + return; + + if (!TryComp(victim, out var stream)) + return; + + AlternativeVerb verb = new() + { + Act = () => + { + _bloodSuckerSystem.StartSuccDoAfter(args.User, victim.Value, sucker, stream, false); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnEntRemoved(EntityUid uid, WebComponent web, EntRemovedFromContainerMessage args) + { + if (!TryComp(uid, out var strap)) + return; + + if (HasComp(args.Entity)) + _buckleSystem.StrapSetEnabled(uid, false, strap); + } + + private void StartCocooning(EntityUid uid, ArachneComponent component, EntityUid target) + { + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-third-person", ("target", Identity.Entity(target, EntityManager)), ("spider", Identity.Entity(uid, EntityManager))), uid, + Shared.Popups.PopupType.MediumCaution); + + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-second-person", ("target", Identity.Entity(target, EntityManager))), uid, uid, Shared.Popups.PopupType.Medium); + + var delay = component.CocoonDelay; + + if (HasComp(target)) + delay *= component.CocoonKnockdownMultiplier; + + // Is it good practice to use empty data just to disambiguate doafters + // Who knows, there's no docs! + var ev = new ArachneCocoonDoAfterEvent(); + + var args = new DoAfterArgs(EntityManager, uid, delay, ev, uid, target: target) + { + BreakOnUserMove = true, + BreakOnTargetMove = true, + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnCocoonDoAfter(EntityUid uid, ArachneComponent component, ArachneCocoonDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Target == null) + return; + + var spawnProto = HasComp(args.Args.Target) ? "CocoonedHumanoid" : "CocoonSmall"; + Transform(args.Args.Target.Value).AttachToGridOrMap(); + var cocoon = Spawn(spawnProto, Transform(args.Args.Target.Value).Coordinates); + + if (!TryComp(cocoon, out var slots)) + return; + + // todo: our species should use scale visuals probably... + // TODO: We need a client-accessible notion of scale influence here. + /* if (spawnProto == "CocoonedHumanoid" && TryComp(args.Args.Target.Value, out var sprite)) */ + /* { */ + /* // why the fuck is this only available as a console command. */ + /* _host.ExecuteCommand(null, "scale " + cocoon + " " + sprite.Scale.Y); */ + if (TryComp(args.Args.Target.Value, out var physics)) + { + var scale = Math.Clamp(1 / (35 / physics.FixturesMass), 0.35, 2.5); + _host.ExecuteCommand(null, "scale " + cocoon + " " + scale); + } + _itemSlots.SetLock(cocoon, BodySlot, false, slots); + _itemSlots.TryInsert(cocoon, BodySlot, args.Args.Target.Value, args.Args.User); + _itemSlots.SetLock(cocoon, BodySlot, true, slots); + + var impact = (spawnProto == "CocoonedHumanoid") ? LogImpact.High : LogImpact.Medium; + + _adminLogger.Add(LogType.Action, impact, $"{ToPrettyString(args.Args.User):player} cocooned {ToPrettyString(args.Args.Target.Value):target}"); + args.Handled = true; + } + } +} diff --git a/Content.Server/Arachne/CocoonComponent.cs b/Content.Server/Arachne/CocoonComponent.cs new file mode 100644 index 00000000000..42ecf27971a --- /dev/null +++ b/Content.Server/Arachne/CocoonComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.Arachne +{ + [RegisterComponent] + public sealed partial class CocoonComponent : Component + { + public bool WasReplacementAccent = false; + + public string OldAccent = ""; + + [DataField("damagePassthrough")] + public float DamagePassthrough = 0.5f; + } +} diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index d55ef355f02..948373940e4 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -247,7 +247,11 @@ public override void Update(float frameTime) var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); - + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); + } _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); } else @@ -258,11 +262,6 @@ public override void Update(float frameTime) barotrauma.TakingDamage = false; _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); } - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); - } // Set correct alert. switch (pressure) { diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 3e4340bf1db..d53e29c9499 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Database; using Content.Shared.Interaction; using Content.Shared.Lock; +using Content.Server.Silicons.Borgs.Components; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -91,6 +92,10 @@ private void DirtyUI(EntityUid uid, if (canister.GasTankSlot.Item != null) { var tank = canister.GasTankSlot.Item.Value; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } var tankComponent = Comp(tank); tankLabel = Name(tank); tankPressure = tankComponent.Air.Pressure; @@ -163,7 +168,12 @@ private void OnCanisterUpdated(EntityUid uid, GasCanisterComponent canister, ref { if (canister.GasTankSlot.Item != null) { - var gasTank = Comp(canister.GasTankSlot.Item.Value); + var tank = canister.GasTankSlot.Item; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } + var gasTank = Comp(tank.Value); _atmos.ReleaseGasTo(canister.Air, gasTank.Air, canister.ReleasePressure); } else @@ -233,7 +243,19 @@ private void OnCanisterInsertAttempt(EntityUid uid, GasCanisterComponent compone if (args.Slot.ID != component.ContainerName || args.User == null) return; - if (!TryComp(args.Item, out var gasTank) || gasTank.IsValveOpen) + var tank = args.Item; + + if (TryComp(tank, out var jetpack)) + { + if (!jetpack.JetpackUid.HasValue) + { + args.Cancelled = true; + return; + } + tank = jetpack.JetpackUid.Value; + } + + if (!TryComp(tank, out var gasTank) || gasTank.IsValveOpen) { args.Cancelled = true; return; diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 9b61044f03e..720fd5b5b91 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -143,7 +143,7 @@ private bool IsHeater(GasThermoMachineComponent comp) private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { - var powerState = _power.TogglePower(uid); + var powerState = _power.TryTogglePower(uid); _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); DirtyUI(uid, thermoMachine); } diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs index fff15f696c4..8094b0e1a66 100644 --- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs +++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs @@ -98,7 +98,7 @@ private void OnToggle(EntityUid uid, SpaceHeaterComponent spaceHeater, SpaceHeat if (!Resolve(uid, ref powerReceiver)) return; - _power.TogglePower(uid); + _power.TryTogglePower(uid); UpdateAppearance(uid); DirtyUI(uid, spaceHeater); diff --git a/Content.Server/Atmos/Rotting/RottingSystem.cs b/Content.Server/Atmos/Rotting/RottingSystem.cs index 47bac84e0ca..5070b3f197f 100644 --- a/Content.Server/Atmos/Rotting/RottingSystem.cs +++ b/Content.Server/Atmos/Rotting/RottingSystem.cs @@ -1,15 +1,9 @@ -using Content.Shared.Damage; -using Content.Shared.Atmos; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; using Content.Server.Temperature.Components; +using Content.Shared.Atmos; using Content.Shared.Atmos.Rotting; -using Content.Shared.Examine; -using Content.Shared.IdentityManagement; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Rejuvenate; +using Content.Shared.Damage; using Robust.Server.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -22,83 +16,16 @@ public sealed class RottingSystem : SharedRottingSystem [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPerishableMapInit); - SubscribeLocalEvent(OnMobStateChanged); - SubscribeLocalEvent(OnPerishableExamined); - - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnRottingMobStateChanged); SubscribeLocalEvent(OnGibbed); - SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnTempIsRotting); } - private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) - { - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) - { - if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) - return; - - if (HasComp(uid)) - return; - - component.RotAccumulator = TimeSpan.Zero; - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) - { - if (TryComp(uid, out var perishable)) - { - perishable.RotNextUpdate = TimeSpan.Zero; - } - } - - private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) - { - if (args.NewMobState == MobState.Dead) - return; - RemCompDeferred(uid, component); - } - - public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) - { - // things don't perish by default. - if (!Resolve(uid, ref perishable, false)) - return false; - - // only dead things or inanimate objects can rot - if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) - return false; - - if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && - HasComp(container.Owner)) - { - return false; - } - - var ev = new IsRottingEvent(); - RaiseLocalEvent(uid, ref ev); - - return !ev.Handled; - } - - public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) - { - return Resolve(uid, ref rotting, false); - } - private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEvent args) { if (!TryComp(uid, out var physics)) @@ -112,36 +39,6 @@ private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEven tileMix?.AdjustMoles(Gas.Ammonia, molsToDump); } - private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) - { - int stage = PerishStage(perishable, MaxStages); - if (stage < 1 || stage > MaxStages) - { - // We dont push an examined string if it hasen't started "perishing" or it's already rotting - return; - } - - var isMob = HasComp(perishable); - var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); - args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); - } - - /// - /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to - /// generate examine messages for items that are starting to rot. - /// - public int PerishStage(Entity perishable, int maxStages) - { - if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) - return 0; - return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); - } - - private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) - { - RemCompDeferred(uid); - } - private void OnTempIsRotting(EntityUid uid, TemperatureComponent component, ref IsRottingEvent args) { if (args.Handled) diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3d..76eadb99fd8 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Server.Traits.Assorted; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -11,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; @@ -171,5 +172,18 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + /// + /// If this is true, the entity will not passively regenerate blood, + /// and instead will slowly lose blood. + /// + [DataField] + public bool HasBloodDeficiency = false; + + /// + /// How much reagent of blood should be removed with blood deficiency in each update interval? + /// + [DataField] + public FixedPoint2 BloodDeficiencyLossAmount; } } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 9e29fdf7568..b37ac5efeb4 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -118,8 +118,14 @@ public override void Update(float frameTime) if (!_solutionContainerSystem.ResolveSolution(uid, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) continue; - // Adds blood to their blood level if it is below the maximum; Blood regeneration. Must be alive. - if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) + // Removes blood for Blood Deficiency constantly. + if (bloodstream.HasBloodDeficiency) + { + if (!_mobStateSystem.IsDead(uid)) + RemoveBlood(uid, bloodstream.BloodDeficiencyLossAmount, bloodstream); + } + // Adds blood to their blood level if it is below the maximum. + else if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) { TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); } @@ -242,20 +248,29 @@ private void OnHealthBeingExamined(Entity ent, ref HealthB if (ent.Comp.BleedAmount > ent.Comp.MaxBleedAmount / 2) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-profusely-bleeding")); } // Shows bleeding message when bleeding, but less than profusely. else if (ent.Comp.BleedAmount > 0) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-bleeding")); } // If the mob's blood level is below the damage threshhold, the pale message is added. if (GetBloodLevelPercentage(ent, ent) < ent.Comp.BloodlossThreshold) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-looks-pale")); } } @@ -463,4 +478,16 @@ public void ChangeBloodReagent(EntityUid uid, string reagent, BloodstreamCompone if (currentVolume > 0) _solutionContainerSystem.TryAddReagent(component.BloodSolution.Value, component.BloodReagent, currentVolume, out _); } + + /// + /// Remove blood from an entity, without spilling it. + /// + private void RemoveBlood(EntityUid uid, FixedPoint2 amount, BloodstreamComponent? component = null) + { + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + return; + + bloodSolution.RemoveReagent(component.BloodReagent, amount); + } } diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index f9403f33b9d..d6647bbf2eb 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -235,7 +235,7 @@ private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent compon _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); break; case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Session.AttachedEntity); + _power.TryTogglePower(uid, user: args.Session.AttachedEntity); break; default: throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); diff --git a/Content.Server/Emp/EmpSystem.cs b/Content.Server/Emp/EmpSystem.cs index 7c1a6f9b5db..3a1d2d28196 100644 --- a/Content.Server/Emp/EmpSystem.cs +++ b/Content.Server/Emp/EmpSystem.cs @@ -1,7 +1,7 @@ using Content.Server.Explosion.EntitySystems; +using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Radio; -using Content.Server.SurveillanceCamera; using Content.Shared.Emp; using Content.Shared.Examine; using Robust.Shared.Map; @@ -22,8 +22,6 @@ public override void Initialize() SubscribeLocalEvent(OnRadioSendAttempt); SubscribeLocalEvent(OnRadioReceiveAttempt); - SubscribeLocalEvent(OnApcToggleMainBreaker); - SubscribeLocalEvent(OnCameraSetActive); } /// @@ -75,7 +73,19 @@ public void DoEmpEffects(EntityUid uid, float energyConsumption, float duration) if (ev.Disabled) { var disabled = EnsureComp(uid); - disabled.DisabledUntil = Timing.CurTime + TimeSpan.FromSeconds(duration); + // couldnt use null-coalescing operator here sadge + if (disabled.DisabledUntil == TimeSpan.Zero) + { + disabled.DisabledUntil = Timing.CurTime; + } + disabled.DisabledUntil = disabled.DisabledUntil + TimeSpan.FromSeconds(duration); + + /// i tried my best to go through the Pow3r server code but i literally couldn't find in relation to PowerNetworkBatteryComponent that uses the event system + /// the code is otherwise too esoteric for my innocent eyes + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = false; + } } } @@ -91,6 +101,11 @@ public override void Update(float frameTime) RemComp(uid); var ev = new EmpDisabledRemoved(); RaiseLocalEvent(uid, ref ev); + + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = true; + } } } } @@ -115,16 +130,6 @@ private void OnRadioReceiveAttempt(EntityUid uid, EmpDisabledComponent component { args.Cancelled = true; } - - private void OnApcToggleMainBreaker(EntityUid uid, EmpDisabledComponent component, ref ApcToggleMainBreakerAttemptEvent args) - { - args.Cancelled = true; - } - - private void OnCameraSetActive(EntityUid uid, EmpDisabledComponent component, ref SurveillanceCameraSetActiveAttemptEvent args) - { - args.Cancelled = true; - } } /// diff --git a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs index 2d54c03b51b..744483cfb82 100644 --- a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs +++ b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs @@ -11,7 +11,7 @@ public sealed class EyeProtectionSystem : EntitySystem { [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BlindableSystem _blindingSystem = default!; - + public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Forensics/Components/FiberComponent.cs b/Content.Server/Forensics/Components/FiberComponent.cs index 2086c958702..4cbb1e7be7f 100644 --- a/Content.Server/Forensics/Components/FiberComponent.cs +++ b/Content.Server/Forensics/Components/FiberComponent.cs @@ -12,5 +12,8 @@ public sealed partial class FiberComponent : Component [DataField] public string? FiberColor; + + [DataField] + public string? Fiberprint; } } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a081429fd3a..1663c20fedb 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -23,6 +23,7 @@ public sealed class ForensicsSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnFiberInit); SubscribeLocalEvent(OnFingerprintInit); SubscribeLocalEvent(OnDNAInit); @@ -39,6 +40,11 @@ private void OnInteract(EntityUid uid, FingerprintComponent component, ContactIn ApplyEvidence(uid, args.Other); } + private void OnFiberInit(EntityUid uid, FiberComponent component, MapInitEvent args) + { + component.Fiberprint = GenerateFingerprint(length: 7); + } + private void OnFingerprintInit(EntityUid uid, FingerprintComponent component, MapInitEvent args) { component.Fingerprint = GenerateFingerprint(); @@ -150,9 +156,9 @@ private void OnCleanForensicsDoAfter(EntityUid uid, ForensicsComponent component targetComp.Residues.Add(string.IsNullOrEmpty(residue.ResidueColor) ? Loc.GetString("forensic-residue", ("adjective", residue.ResidueAdjective)) : Loc.GetString("forensic-residue-colored", ("color", residue.ResidueColor), ("adjective", residue.ResidueAdjective))); } - public string GenerateFingerprint() + public string GenerateFingerprint(int length = 16) { - var fingerprint = new byte[16]; + var fingerprint = new byte[Math.Clamp(length, 0, 255)]; _random.NextBytes(fingerprint); return Convert.ToHexString(fingerprint); } @@ -179,7 +185,12 @@ private void ApplyEvidence(EntityUid user, EntityUid target) if (_inventory.TryGetSlotEntity(user, "gloves", out var gloves)) { if (TryComp(gloves, out var fiber) && !string.IsNullOrEmpty(fiber.FiberMaterial)) - component.Fibers.Add(string.IsNullOrEmpty(fiber.FiberColor) ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial))); + { + var fiberLocale = string.IsNullOrEmpty(fiber.FiberColor) + ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) + : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial)); + component.Fibers.Add(fiberLocale + " ; " + fiber.Fiberprint); + } if (HasComp(gloves)) return; diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index b0c4bb56ff3..ec5646457e2 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Audio; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Interaction; @@ -28,6 +29,8 @@ public override void Initialize() SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent( OnSwitchGenerator); + + SubscribeLocalEvent(OnEmpPulse); } private void OnParentChanged(EntityUid uid, GravityGeneratorComponent component, ref EntParentChangedMessage args) @@ -289,5 +292,28 @@ private void OnSwitchGenerator( { SetSwitchedOn(uid, component, args.On, session:args.Session); } + + private void OnEmpPulse(EntityUid uid, GravityGeneratorComponent component, EmpPulseEvent args) + { + /// i really don't think that the gravity generator should use normalised 0-1 charge + /// as opposed to watts charge that every other battery uses + + ApcPowerReceiverComponent? powerReceiver = null; + if (!Resolve(uid, ref powerReceiver, false)) + return; + + var ent = (uid, component, powerReceiver); + + // convert from normalised energy to watts and subtract + float maxEnergy = component.ActivePowerUse / component.ChargeRate; + float currentEnergy = maxEnergy * component.Charge; + currentEnergy = Math.Max(0, currentEnergy - args.EnergyConsumption); + + // apply renormalised energy to charge variable + component.Charge = currentEnergy / maxEnergy; + + // update power state + UpdateState(ent); + } } } diff --git a/Content.Server/HealthExaminable/HealthExaminableComponent.cs b/Content.Server/HealthExaminable/HealthExaminableComponent.cs index 3f434a93cfe..04053aed70e 100644 --- a/Content.Server/HealthExaminable/HealthExaminableComponent.cs +++ b/Content.Server/HealthExaminable/HealthExaminableComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Damage.Prototypes; +using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; @@ -7,8 +7,12 @@ namespace Content.Server.HealthExaminable; [RegisterComponent, Access(typeof(HealthExaminableSystem))] public sealed partial class HealthExaminableComponent : Component { + // + // The thresholds for determining the examine text for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // public List Thresholds = new() - { FixedPoint2.New(10), FixedPoint2.New(25), FixedPoint2.New(50), FixedPoint2.New(75) }; + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.50), FixedPoint2.New(0.75) }; [DataField("examinableTypes", required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] public HashSet ExaminableTypes = default!; diff --git a/Content.Server/HealthExaminable/HealthExaminableSystem.cs b/Content.Server/HealthExaminable/HealthExaminableSystem.cs index ed69a1c096a..89291726fbe 100644 --- a/Content.Server/HealthExaminable/HealthExaminableSystem.cs +++ b/Content.Server/HealthExaminable/HealthExaminableSystem.cs @@ -1,15 +1,20 @@ -using Content.Shared.Damage; +using Content.Server.Traits.Assorted; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Verbs; using Robust.Shared.Utility; +using System.Linq; namespace Content.Server.HealthExaminable; public sealed class HealthExaminableSystem : EntitySystem { [Dependency] private readonly ExamineSystemShared _examineSystem = default!; + [Dependency] private readonly MobThresholdSystem _threshold = default!; public override void Initialize() { @@ -29,7 +34,13 @@ private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent componen { Act = () => { - var markup = CreateMarkup(uid, component, damage); + FormattedMessage markup; + if (uid == args.User + && TryComp(uid, out var selfAware)) + markup = CreateMarkupSelfAware(uid, selfAware, component, damage); + else + markup = CreateMarkup(uid, component, damage); + _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("health-examinable-verb-text"), @@ -47,6 +58,9 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c var msg = new FormattedMessage(); var first = true; + + var adjustedThresholds = GetAdjustedThresholds(uid, component.Thresholds); + foreach (var type in component.ExaminableTypes) { if (!damage.Damage.DamageDict.TryGetValue(type, out var dmg)) @@ -58,7 +72,7 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c FixedPoint2 closest = FixedPoint2.Zero; string chosenLocStr = string.Empty; - foreach (var threshold in component.Thresholds) + foreach (var threshold in adjustedThresholds) { var str = $"health-examinable-{component.LocPrefix}-{type}-{threshold}"; var tempLocStr = Loc.GetString($"health-examinable-{component.LocPrefix}-{type}-{threshold}", ("target", Identity.Entity(uid, EntityManager))); @@ -94,10 +108,100 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c } // Anything else want to add on to this? - RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true); + RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg, false), true); return msg; } + + private FormattedMessage CreateMarkupSelfAware(EntityUid target, SelfAwareComponent selfAware, HealthExaminableComponent component, DamageableComponent damage) + { + var msg = new FormattedMessage(); + + var first = true; + + foreach (var type in selfAware.AnalyzableTypes) + { + if (!damage.Damage.DamageDict.TryGetValue(type, out var typeDmgUnrounded)) + continue; + + var typeDmg = (int) Math.Round(typeDmgUnrounded.Float(), 0); + if (typeDmg <= 0) + continue; + + var damageString = Loc.GetString( + "health-examinable-selfaware-type-text", + ("damageType", Loc.GetString($"health-examinable-selfaware-type-{type}")), + ("amount", typeDmg) + ); + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(damageString); + } + + var adjustedThresholds = GetAdjustedThresholds(target, selfAware.Thresholds); + + foreach (var group in selfAware.DetectableGroups) + { + if (!damage.DamagePerGroup.TryGetValue(group, out var groupDmg) + || groupDmg == FixedPoint2.Zero) + continue; + + FixedPoint2 closest = FixedPoint2.Zero; + + string chosenLocStr = string.Empty; + foreach (var threshold in adjustedThresholds) + { + var locName = $"health-examinable-selfaware-group-{group}-{threshold}"; + var locStr = Loc.GetString(locName); + + var locDoesNotExist = locStr == locName; + if (locDoesNotExist) + continue; + + if (groupDmg > threshold && threshold > closest) + { + chosenLocStr = locStr; + closest = threshold; + } + } + + if (closest == FixedPoint2.Zero) + continue; + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(chosenLocStr); + } + + if (msg.IsEmpty) + msg.AddMarkup(Loc.GetString($"health-examinable-selfaware-none")); + + // Event listeners can know if the examination is Self-Aware. + RaiseLocalEvent(target, new HealthBeingExaminedEvent(msg, true), true); + + return msg; + } + + /// + /// Return thresholds as percentages of an entity's critical threshold. + /// + private List GetAdjustedThresholds(EntityUid uid, List thresholdPercentages) + { + FixedPoint2 critThreshold = 0; + if (TryComp(uid, out var threshold)) + critThreshold = _threshold.GetThresholdForState(uid, Shared.Mobs.MobState.Critical, threshold); + + // Fallback to 100 crit threshold if none found + if (critThreshold == 0) + critThreshold = 100; + + return thresholdPercentages.Select(percentage => critThreshold * percentage).ToList(); + } } /// @@ -108,9 +212,11 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c public sealed class HealthBeingExaminedEvent { public FormattedMessage Message; + public bool IsSelfAware; - public HealthBeingExaminedEvent(FormattedMessage message) + public HealthBeingExaminedEvent(FormattedMessage message, bool isSelfAware) { Message = message; + IsSelfAware = isSelfAware; } } diff --git a/Content.Server/Language/Commands/AdminLanguageCommand.cs b/Content.Server/Language/Commands/AdminLanguageCommand.cs new file mode 100644 index 00000000000..f02d9c7f401 --- /dev/null +++ b/Content.Server/Language/Commands/AdminLanguageCommand.cs @@ -0,0 +1,75 @@ +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Systems; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "language"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminLanguageCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("add")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool canSpeak = true, + [CommandArgument] bool canUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + + if (language == SharedLanguageSystem.UniversalPrototype) + { + EnsureComp(input); + Languages.UpdateEntityLanguages(input); + } + else + { + EnsureComp(input); + Languages.AddLanguage(input, language, canSpeak, canUnderstand); + } + + return input; + } + + [CommandImplementation("rm")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (language == SharedLanguageSystem.UniversalPrototype && HasComp(input)) + { + RemComp(input); + EnsureComp(input); + } + // We execute this branch even in case of universal so that it gets removed if it was added manually to the LanguageKnowledge + Languages.RemoveLanguage(input, language, removeSpeak, removeUnderstand); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + return Languages.GetSpokenLanguages(input); + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + return Languages.GetUnderstoodLanguages(input); + } +} diff --git a/Content.Server/Language/Commands/AdminTranslatorCommand.cs b/Content.Server/Language/Commands/AdminTranslatorCommand.cs new file mode 100644 index 00000000000..8a7984bc36b --- /dev/null +++ b/Content.Server/Language/Commands/AdminTranslatorCommand.cs @@ -0,0 +1,155 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Components.Translators; +using Content.Shared.Language.Systems; +using Robust.Server.Containers; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "translator"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminTranslatorCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private ContainerSystem? _containersField; + + private ContainerSystem Containers => _containersField ??= GetSys(); + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("addlang")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool addSpeak = true, + [CommandArgument] bool addUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + // noob trap - needs a universallanguagespeakercomponent + if (language == SharedLanguageSystem.UniversalPrototype) + throw new ArgumentException(Loc.GetString("command-language-error-this-will-not-work")); + + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (addSpeak && !translator.SpokenLanguages.Contains(language)) + translator.SpokenLanguages.Add(language); + if (addUnderstand && !translator.UnderstoodLanguages.Contains(language)) + translator.UnderstoodLanguages.Add(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("rmlang")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (removeSpeak) + translator.SpokenLanguages.Remove(language); + if (removeUnderstand) + translator.UnderstoodLanguages.Remove(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("addrequired")] + public EntityUid AddRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (!translator.RequiredLanguages.Contains(language)) + { + translator.RequiredLanguages.Add(language); + UpdateTranslatorHolder(input); + } + + return input; + } + + [CommandImplementation("rmrequired")] + public EntityUid RemoveRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (translator.RequiredLanguages.Remove(language)) + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.SpokenLanguages; + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.UnderstoodLanguages; + } + + [CommandImplementation("lsrequired")] + public IEnumerable ListRequired([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.RequiredLanguages; + } + + private bool TryGetTranslatorComp(EntityUid uid, [NotNullWhen(true)] out BaseTranslatorComponent? translator) + { + if (TryComp(uid, out var handheld)) + translator = handheld; + else if (TryComp(uid, out var implant)) + translator = implant; + else if (TryComp(uid, out var intrinsic)) + translator = intrinsic; + else + translator = null; + + return translator != null; + } + + private void UpdateTranslatorHolder(EntityUid translator) + { + if (!Containers.TryGetContainingContainer(translator, out var cont) + || cont.Owner is not { Valid: true } holder) + return; + + Languages.UpdateEntityLanguages(holder); + } +} diff --git a/Content.Server/Medical/PenLightSystem.cs b/Content.Server/Medical/PenLightSystem.cs new file mode 100644 index 00000000000..f48a84d0476 --- /dev/null +++ b/Content.Server/Medical/PenLightSystem.cs @@ -0,0 +1,118 @@ +using Content.Server.DoAfter; +using Content.Server.PowerCell; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Drugs; +using Content.Shared.Drunk; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Interaction; +using Content.Shared.Medical; +using Content.Shared.Mobs.Systems; +using Content.Shared.Traits.Assorted.Components; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Medical; +/// +/// This stores the eye exam system for +/// +public sealed class PenLightSystem : EntitySystem +{ + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnAfterInteract(EntityUid uid, PenLightComponent component, AfterInteractEvent args) + { + if (args.Handled + || args.Target is not { } target) + return; + + args.Handled = TryStartExam(uid, target, args.User, component); + } + + private void OnDoAfter(Entity uid, ref PenLightDoAfterEvent args) + { + if (args.Handled + || args.Cancelled + || args.Target == null + || !_powerCell.HasDrawCharge(uid, user: args.User)) + return; + + OpenUserInterface(args.User, uid); + Diagnose(uid, args.Target.Value); + args.Handled = true; + } + + + /// + /// Actually handles the exam interaction. + /// + public bool TryStartExam(EntityUid uid, EntityUid target, EntityUid user, PenLightComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + return _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ExamSpeed, new PenLightDoAfterEvent(), + uid, target, uid) + { + BlockDuplicate = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + BreakOnHandChange = true, + NeedHand = true + }); + } + private void OpenUserInterface(EntityUid user, EntityUid penlight) + { + if (!TryComp(user, out var actor) + || !_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui)) + return; + + _uiSystem.OpenUi(ui, actor.PlayerSession); + } + + /// + /// Runs the checks for the different types of eye damage + /// + private void Diagnose(EntityUid penlight, EntityUid target) + { + if (!_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui) + || !HasComp(target)) + return; + // Blind + var blind = _entityManager.HasComponent(target); + + // Drunk + var drunk = _entityManager.HasComponent(target); + + // EyeDamage + var eyeDamage = false; + if (TryComp(target, out var eyeDam)) + { + eyeDamage = eyeDam.EyeDamage > 0 && eyeDam.EyeDamage < 6; //6 means perma-blind + } + + // Hallucinating + var seeingRainbows = _entityManager.HasComponent(target); + + // Healthy + var healthy = !(blind || drunk || eyeDamage || seeingRainbows); + + _uiSystem.SendUiMessage(ui, new PenLightUserMessage(GetNetEntity(target), + blind, + drunk, + eyeDamage, + healthy, + seeingRainbows + )); + } +} diff --git a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs index 8bb68cb6f55..6f533c34199 100644 --- a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs @@ -14,7 +14,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnInit(EntityUid uid, BoxerComponent component, ComponentInit args) @@ -27,7 +27,7 @@ private void OnMeleeHit(EntityUid uid, BoxerComponent component, MeleeHitEvent a args.ModifiersList.Add(component.UnarmedModifiers); } - private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, TakeStaminaDamageEvent args) { if (!_containerSystem.TryGetContainingContainer(uid, out var equipee)) return; diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index 6fdb27097e9..4fc078e85bc 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -21,7 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnEntRemoved); SubscribeLocalEvent(OnOniMeleeHit); SubscribeLocalEvent(OnHeldMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedIntoContainerMessage args) @@ -68,7 +68,7 @@ private void OnHeldMeleeHit(EntityUid uid, HeldByOniComponent component, MeleeHi args.ModifiersList.Add(oni.MeleeModifiers); } - private void OnStamHit(EntityUid uid, HeldByOniComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, HeldByOniComponent component, TakeStaminaDamageEvent args) { if (!TryComp(component.Holder, out var oni)) return; diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs index 5a96af2e96b..33505e3f6fc 100644 --- a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs @@ -51,7 +51,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); @@ -110,14 +110,12 @@ private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); } - private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { var bonus = false; - foreach (var stam in args.HitList) - { - if (HasComp(stam.Entity)) - bonus = true; - } + + if (HasComp(args.Target)) + bonus = true; if (!bonus) return; diff --git a/Content.Server/Power/Components/ActiveChargerComponent.cs b/Content.Server/Power/Components/ActiveChargerComponent.cs deleted file mode 100644 index f3d863c9e43..00000000000 --- a/Content.Server/Power/Components/ActiveChargerComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Content.Shared.Containers.ItemSlots; -using Content.Shared.Power; - -namespace Content.Server.Power.Components -{ - [RegisterComponent] - public sealed partial class ActiveChargerComponent : Component - { - } -} diff --git a/Content.Server/Power/Components/ChargingComponent.cs b/Content.Server/Power/Components/ChargingComponent.cs new file mode 100644 index 00000000000..db7c14f7082 --- /dev/null +++ b/Content.Server/Power/Components/ChargingComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Power; + +namespace Content.Server.Power.Components +{ + [RegisterComponent] + public sealed partial class ChargingComponent : Component + { + /// + ///References the entity of the charger that is currently powering this battery + /// + public EntityUid ChargerUid; + + /// + ///References the component of the charger that is currently powering this battery + /// + public ChargerComponent ChargerComponent; + } +} diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 95b5d74a945..f345c9e88ea 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.APC; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; +using Content.Shared.Emp; using Content.Shared.Popups; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -37,6 +38,7 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } public override void Update(float deltaTime) @@ -163,7 +165,7 @@ public void UpdateUIState(EntityUid uid, private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery) { - if (HasComp(uid)) + if (HasComp(uid) || HasComp(uid)) return ApcChargeState.Emag; if (battery.CurrentStorage / battery.Capacity > ApcComponent.HighPowerThreshold) @@ -190,15 +192,16 @@ private ApcExternalPowerState CalcExtPowerState(EntityUid uid, PowerState.Batter return ApcExternalPowerState.Good; } - + private void OnEmpPulse(EntityUid uid, ApcComponent component, ref EmpPulseEvent args) { - if (component.MainBreakerEnabled) - { - args.Affected = true; - args.Disabled = true; - ApcToggleBreaker(uid, component); - } + EnsureComp(uid, out var emp); //event calls before EmpDisabledComponent is added, ensure it to force sprite update + UpdateApcState(uid); + } + + private void OnEmpDisabledRemoved(EntityUid uid, ApcComponent component, ref EmpDisabledRemoved args) + { + UpdateApcState(uid); } } diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index 0a0f2068b58..1c5d83b094d 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -1,5 +1,6 @@ using Content.Server.Cargo.Systems; using Content.Server.Emp; +using Content.Shared.Emp; using Content.Server.Power.Components; using Content.Shared.Examine; using Content.Shared.Rejuvenate; @@ -20,6 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnBatteryRejuvenate); SubscribeLocalEvent(CalculateBatteryPrice); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); SubscribeLocalEvent(PreSync); SubscribeLocalEvent(PostSync); @@ -85,7 +87,7 @@ public override void Update(float frameTime) { if (!comp.AutoRecharge) continue; if (batt.IsFullyCharged) continue; - SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); + TrySetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); } } @@ -100,9 +102,21 @@ private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, re private void OnEmpPulse(EntityUid uid, BatteryComponent component, ref EmpPulseEvent args) { args.Affected = true; + args.Disabled = true; UseCharge(uid, args.EnergyConsumption, component); } + // if a disabled battery is put into a recharged, + // allow the recharger to start recharging again after the disable ends + private void OnEmpDisabledRemoved(EntityUid uid, BatteryComponent component, ref EmpDisabledRemoved args) + { + if (!TryComp(uid, out var charging)) + return; + + var ev = new ChargerUpdateStatusEvent(); + RaiseLocalEvent(charging.ChargerUid, ref ev); + } + public float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) { if (value <= 0 || !Resolve(uid, ref battery) || battery.CurrentCharge == 0) @@ -157,6 +171,18 @@ public bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = return true; } + /// + /// Like SetCharge, but checks for conditions like EmpDisabled before executing + /// + public bool TrySetCharge(EntityUid uid, float value, BatteryComponent? battery = null) + { + if (!Resolve(uid, ref battery, false) || TryComp(uid, out var emp)) + return false; + + SetCharge(uid, value, battery); + return true; + } + /// /// Returns whether the battery is at least 99% charged, basically full. /// @@ -165,6 +191,10 @@ public bool IsFull(EntityUid uid, BatteryComponent? battery = null) if (!Resolve(uid, ref battery)) return false; + // If the battery is full, remove its charging component. + if (TryComp(uid, out _)) + RemComp(uid); + return battery.CurrentCharge / battery.MaxCharge >= 0.99f; } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index db16dfa008e..ae6b024162e 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -1,13 +1,16 @@ using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Server.PowerCell; using Content.Shared.Examine; using Content.Shared.Power; using Content.Shared.PowerCell.Components; +using Content.Shared.Emp; using JetBrains.Annotations; using Robust.Shared.Containers; using System.Diagnostics.CodeAnalysis; using Content.Shared.Storage.Components; using Robust.Server.Containers; +using Content.Shared.Whitelist; namespace Content.Server.Power.EntitySystems; @@ -28,6 +31,11 @@ public override void Initialize() SubscribeLocalEvent(OnInsertAttempt); SubscribeLocalEvent(OnEntityStorageInsertAttempt); SubscribeLocalEvent(OnChargerExamine); + + SubscribeLocalEvent(OnUpdateStatus); + + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnStartup(EntityUid uid, ChargerComponent component, ComponentStartup args) @@ -40,21 +48,58 @@ private void OnChargerExamine(EntityUid uid, ChargerComponent component, Examine args.PushMarkup(Loc.GetString("charger-examine", ("color", "yellow"), ("chargeRate", (int) component.ChargeRate))); } + private void StartChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + bool charge = true; + + if (HasComp(uid)) + charge = false; + else + if (!TryComp(target, out var battery)) + charge = false; + else + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + charge = false; + + // wrap functionality in an if statement instead of returning... + if (charge) + { + var charging = EnsureComp(target); + charging.ChargerUid = uid; + charging.ChargerComponent = component; + } + + // ...so the status always updates (for insertin a power cell) + UpdateStatus(uid, component); + } + + private void StopChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + if (HasComp(target)) + RemComp(target); + UpdateStatus(uid, component); + } + public override void Update(float frameTime) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out _, out var charger, out var containerComp)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var charging)) { - if (!_container.TryGetContainer(uid, charger.SlotId, out var container, containerComp)) + if (!TryComp(charging.ChargerUid, out var chargerComponent)) continue; - if (charger.Status == CellChargerStatus.Empty || charger.Status == CellChargerStatus.Charged || container.ContainedEntities.Count == 0) + if (charging.ChargerComponent.Status == CellChargerStatus.Off || charging.ChargerComponent.Status == CellChargerStatus.Empty) continue; - foreach (var contained in container.ContainedEntities) - { - TransferPower(uid, contained, charger, frameTime); - } + if (HasComp(charging.ChargerUid)) + continue; + + if (!TryComp(uid, out var battery)) + continue; + + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + StopChargingBattery(charging.ChargerUid, charging.ChargerComponent, uid); + TransferPower(charging.ChargerUid, uid, charging.ChargerComponent, frameTime); } } @@ -71,7 +116,7 @@ private void OnInserted(EntityUid uid, ChargerComponent component, EntInsertedIn if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StartChargingBattery(uid, component, args.Entity); } private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFromContainerMessage args) @@ -79,7 +124,7 @@ private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFrom if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StopChargingBattery(uid, component, args.Entity); } /// @@ -112,6 +157,11 @@ private void OnEntityStorageInsertAttempt(EntityUid uid, ChargerComponent compon args.Cancelled = true; } + private void OnUpdateStatus(EntityUid uid, ChargerComponent component, ref ChargerUpdateStatusEvent args) + { + UpdateStatus(uid, component); + } + private void UpdateStatus(EntityUid uid, ChargerComponent component) { var status = GetStatus(uid, component); @@ -126,15 +176,6 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) component.Status = status; - if (component.Status == CellChargerStatus.Charging) - { - AddComp(uid); - } - else - { - RemComp(uid); - } - switch (component.Status) { case CellChargerStatus.Off: @@ -146,7 +187,7 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Empty, appearance); break; case CellChargerStatus.Charging: - receiver.Load = component.ChargeRate; + receiver.Load = component.ChargeRate; //does not scale with multiple slotted batteries _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Charging, appearance); break; case CellChargerStatus.Charged: @@ -157,6 +198,42 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) throw new ArgumentOutOfRangeException(); } } + + private void OnEmpPulse(EntityUid uid, ChargerComponent component, ref EmpPulseEvent args) + { + // we don't care if we haven't been disabled + if (!args.Disabled) + return; + + // if the recharger is hit by an emp pulse, + // stop recharging contained batteries to save resources + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StopChargingBattery(uid, component, containedEntity); + } + } + + private void OnEmpDisabledRemoved(EntityUid uid, ChargerComponent component, ref EmpDisabledRemoved args) + { + // if an emp disable subsides, + // attempt to start charging all batteries + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StartChargingBattery(uid, component, containedEntity); + } + } private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) { @@ -178,13 +255,28 @@ private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) if (container.ContainedEntities.Count == 0) return CellChargerStatus.Empty; - if (!SearchForBattery(container.ContainedEntities[0], out _, out var heldBattery)) - return CellChargerStatus.Off; + var statusOut = CellChargerStatus.Off; - if (Math.Abs(heldBattery.MaxCharge - heldBattery.CurrentCharge) < 0.01) - return CellChargerStatus.Charged; + foreach (var containedEntity in container.ContainedEntities) + { + // if none of the slotted items are actually batteries, represent the charger as off + if (!SearchForBattery(containedEntity, out _, out _)) + continue; - return CellChargerStatus.Charging; + // if all batteries are either EMP'd or fully charged, represent the charger as fully charged + statusOut = CellChargerStatus.Charged; + if (HasComp(containedEntity)) + continue; + + if (!HasComp(containedEntity)) + continue; + + // if we have atleast one battery being charged, represent the charger as charging; + statusOut = CellChargerStatus.Charging; + break; + } + + return statusOut; } private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerComponent component, float frameTime) @@ -201,11 +293,11 @@ private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerCompone if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); // Just so the sprite won't be set to 99.99999% visibility if (heldBattery.MaxCharge - heldBattery.CurrentCharge < 0.01) { - _battery.SetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); } UpdateStatus(uid, component); @@ -223,3 +315,6 @@ private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out EntityUid? return true; } } + +[ByRefEvent] +public record struct ChargerUpdateStatusEvent(); \ No newline at end of file diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 048fda23553..2157a53a53d 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Examine; @@ -11,6 +12,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Utility; +using Content.Shared.Emp; namespace Content.Server.Power.EntitySystems { @@ -38,6 +40,9 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpEnd); + _recQuery = GetEntityQuery(); _provQuery = GetEntityQuery(); } @@ -131,7 +136,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G { Act = () => { - TogglePower(uid, user: args.User); + TryTogglePower(uid, user: args.User); }, Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), Text = Loc.GetString("power-switch-component-toggle-verb"), @@ -192,5 +197,36 @@ public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerRece return !receiver.PowerDisabled; // i.e. PowerEnabled } + + public bool TryTogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) + { + if (HasComp(uid)) + return false; + + return TogglePower(uid, playSwitchSound, receiver, user); + } + + public void SetLoad(ApcPowerReceiverComponent comp, float load) + { + comp.Load = load; + } + + private void OnEmpPulse(EntityUid uid, ApcPowerReceiverComponent component, ref EmpPulseEvent args) + { + if (!component.PowerDisabled) + { + args.Affected = true; + args.Disabled = true; + TogglePower(uid, false); + } + } + + private void OnEmpEnd(EntityUid uid, ApcPowerReceiverComponent component, ref EmpDisabledRemoved args) + { + if (component.PowerDisabled) + { + TogglePower(uid, false); + } + } } } diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs index 785eac91dba..374c1c41acb 100644 --- a/Content.Server/Power/PowerWireAction.cs +++ b/Content.Server/Power/PowerWireAction.cs @@ -1,6 +1,7 @@ using Content.Server.Electrocution; using Content.Server.Power.Components; using Content.Server.Wires; +using Content.Shared.Emp; using Content.Shared.Power; using Content.Shared.Wires; @@ -78,6 +79,9 @@ private void SetPower(EntityUid owner, bool pulsed) return; } + if (EntityManager.TryGetComponent(owner, out var emp)) + return; + power.PowerDisabled = false; } } diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index cc57c34c475..7ede2342428 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -2,6 +2,7 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction.Components; using Content.Shared.Silicons.Borgs.Components; +using Content.Server.Silicons.Borgs.Components; using Robust.Shared.Containers; namespace Content.Server.Silicons.Borgs; @@ -190,6 +191,10 @@ private void ProvideItems(EntityUid chassis, EntityUid uid, BorgChassisComponent if (!component.ItemsCreated) { item = Spawn(itemProto, xform.Coordinates); + if (TryComp(uid, out var module)) + { + module.JetpackUid = item; + } } else { diff --git a/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs new file mode 100644 index 00000000000..3a71dd3a501 --- /dev/null +++ b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Silicons.Borgs.Components; + +/// +/// Server side indicator for a jetpack module. Used as conditional for inserting in canisters. +/// +[RegisterComponent] +public sealed partial class BorgJetpackComponent : Component +{ + public EntityUid? JetpackUid = null; +} \ No newline at end of file diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index 410ba9f7540..ec3d33157ab 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -1,7 +1,6 @@ using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Emp; using Content.Server.Power.Components; using Content.Shared.ActionBlocker; using Content.Shared.DeviceNetwork; @@ -59,9 +58,6 @@ public override void Initialize() SubscribeLocalEvent(OnSetName); SubscribeLocalEvent(OnSetNetwork); SubscribeLocalEvent>(AddVerbs); - - SubscribeLocalEvent(OnEmpPulse); - SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnPacketReceived(EntityUid uid, SurveillanceCameraComponent component, DeviceNetworkPacketEvent args) @@ -400,21 +396,6 @@ private void UpdateVisuals(EntityUid uid, SurveillanceCameraComponent? component _appearance.SetData(uid, SurveillanceCameraVisualsKey.Key, key, appearance); } - - private void OnEmpPulse(EntityUid uid, SurveillanceCameraComponent component, ref EmpPulseEvent args) - { - if (component.Active) - { - args.Affected = true; - args.Disabled = true; - SetActive(uid, false); - } - } - - private void OnEmpDisabledRemoved(EntityUid uid, SurveillanceCameraComponent component, ref EmpDisabledRemoved args) - { - SetActive(uid, true); - } } public sealed class OnSurveillanceCameraViewerAddEvent : EntityEventArgs diff --git a/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs new file mode 100644 index 00000000000..22660ff4487 --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify values related to the Laying Down system. +/// +[RegisterComponent] +public sealed partial class LayingDownModifierComponent : Component +{ + /// + /// What to multiply the cooldown of laying down and standing up by. + /// + [DataField] + public float LayingDownCooldownMultiplier = 1f; + + /// + /// What to multiply the speed multiplier when lying down by. + /// + [DataField] + public float DownedSpeedMultiplierMultiplier = 1f; +} diff --git a/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs new file mode 100644 index 00000000000..dc6dcd2de3b --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs @@ -0,0 +1,22 @@ +using Content.Server.Traits.Assorted; +using Content.Server.Standing; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class LayingDownModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, LayingDownModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var layingDown)) + return; + + layingDown.Cooldown *= component.LayingDownCooldownMultiplier; + layingDown.DownedSpeedMultiplier *= component.DownedSpeedMultiplierMultiplier; + } +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs new file mode 100644 index 00000000000..d6cf032aabd --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify Oni damage modifiers. +/// +[RegisterComponent] +public sealed partial class OniDamageModifierComponent : Component +{ + /// + /// Which damage modifiers to override. + /// + [DataField("modifiers", required: true)] + public DamageModifierSet MeleeModifierReplacers = default!; +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs new file mode 100644 index 00000000000..9d701053769 --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Server.Abilities.Oni; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class OniDamageModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, OniDamageModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var oni)) + return; + + foreach (var (key, value) in component.MeleeModifierReplacers.Coefficients) + { + oni.MeleeModifiers.Coefficients[key] = value; + + } + + foreach (var (key, value) in component.MeleeModifierReplacers.FlatReduction) + { + oni.MeleeModifiers.FlatReduction[key] = value; + + } + } +} diff --git a/Content.Server/Traits/Assorted/SelfAwareComponent.cs b/Content.Server/Traits/Assorted/SelfAwareComponent.cs new file mode 100644 index 00000000000..03f5cd15502 --- /dev/null +++ b/Content.Server/Traits/Assorted/SelfAwareComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Self-Aware trait to enhance the information received from HealthExaminableSystem. +/// +[RegisterComponent] +public sealed partial class SelfAwareComponent : Component +{ + // + // Damage types that an entity is able to precisely analyze like a health analyzer when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet AnalyzableTypes = default!; + + // + // Damage groups that an entity is able to detect the presence of when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet DetectableGroups = default!; + + // + // The thresholds for determining the examine text of DetectableGroups for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // + public List Thresholds = new() + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.40), FixedPoint2.New(0.60) }; +} diff --git a/Content.Server/Traits/BloodDeficiencyComponent.cs b/Content.Server/Traits/BloodDeficiencyComponent.cs new file mode 100644 index 00000000000..616f60cd834 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencyComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Blood Deficiency trait. +/// +[RegisterComponent] +public sealed partial class BloodDeficiencyComponent : Component +{ + // + // How much reagent of blood should be removed in each update interval? + // + [DataField(required: true)] + public float BloodLossAmount; +} diff --git a/Content.Server/Traits/BloodDeficiencySystem.cs b/Content.Server/Traits/BloodDeficiencySystem.cs new file mode 100644 index 00000000000..f1ae4909956 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencySystem.cs @@ -0,0 +1,23 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class BloodDeficiencySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, BloodDeficiencyComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.HasBloodDeficiency = true; + bloodstream.BloodDeficiencyLossAmount = component.BloodLossAmount; + } +} diff --git a/Content.Server/Vampire/BloodSuckedComponent.cs b/Content.Server/Vampire/BloodSuckedComponent.cs new file mode 100644 index 00000000000..d7e402cd98a --- /dev/null +++ b/Content.Server/Vampire/BloodSuckedComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Vampiric +{ + /// + /// For entities who have been succed. + /// + [RegisterComponent] + public sealed partial class BloodSuckedComponent : Component + {} +} diff --git a/Content.Server/Vampire/BloodSuckerComponent.cs b/Content.Server/Vampire/BloodSuckerComponent.cs new file mode 100644 index 00000000000..f5619d1cb49 --- /dev/null +++ b/Content.Server/Vampire/BloodSuckerComponent.cs @@ -0,0 +1,44 @@ +namespace Content.Server.Vampiric +{ + [RegisterComponent] + public sealed partial class BloodSuckerComponent : Component + { + /// + /// How much to succ each time we succ. + /// + [DataField("unitsToSucc")] + public float UnitsToSucc = 20f; + + /// + /// The time (in seconds) that it takes to succ an entity. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Delay = TimeSpan.FromSeconds(4); + + // ***INJECT WHEN SUCC*** + + /// + /// Whether to inject chems into a chemstream when we suck something. + /// + [DataField("injectWhenSucc")] + public bool InjectWhenSucc = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + + /// + /// Whether we need to web the thing up first... + /// + [DataField("webRequired")] + public bool WebRequired = false; + } +} diff --git a/Content.Server/Vampire/BloodSuckerSystem.cs b/Content.Server/Vampire/BloodSuckerSystem.cs new file mode 100644 index 00000000000..a63334a8943 --- /dev/null +++ b/Content.Server/Vampire/BloodSuckerSystem.cs @@ -0,0 +1,213 @@ +using Content.Shared.Verbs; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Administration.Logs; +using Content.Shared.Vampiric; +using Content.Server.Atmos.Components; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Chemistry.EntitySystems; +using Content.Server.Popups; +using Content.Server.HealthExaminable; +using Content.Server.DoAfter; +using Content.Server.Nutrition.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Utility; + +namespace Content.Server.Vampiric +{ + public sealed class BloodSuckerSystem : EntitySystem + { + [Dependency] private readonly BodySystem _bodySystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly PopupSystem _popups = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly StomachSystem _stomachSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddSuccVerb); + SubscribeLocalEvent(OnHealthExamined); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnDoAfter); + } + + private void AddSuccVerb(EntityUid uid, BloodSuckerComponent component, GetVerbsEvent args) + { + if (args.User == args.Target) + return; + if (component.WebRequired) + return; // handled elsewhere + if (!TryComp(args.Target, out var bloodstream)) + return; + if (!args.CanAccess) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartSuccDoAfter(uid, args.Target, component, bloodstream); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnHealthExamined(EntityUid uid, BloodSuckedComponent component, HealthBeingExaminedEvent args) + { + args.Message.PushNewline(); + args.Message.AddMarkup(Loc.GetString("bloodsucked-health-examine", ("target", uid))); + } + + private void OnDamageChanged(EntityUid uid, BloodSuckedComponent component, DamageChangedEvent args) + { + if (args.DamageIncreased) + return; + + if (_prototypeManager.TryIndex("Brute", out var brute) && args.Damageable.Damage.TryGetDamageInGroup(brute, out var bruteTotal) + && _prototypeManager.TryIndex("Airloss", out var airloss) && args.Damageable.Damage.TryGetDamageInGroup(airloss, out var airlossTotal)) + { + if (bruteTotal == 0 && airlossTotal == 0) + RemComp(uid); + } + } + + private void OnDoAfter(EntityUid uid, BloodSuckerComponent component, BloodSuckDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Target == null) + return; + + args.Handled = TrySucc(uid, args.Args.Target.Value); + } + + public void StartSuccDoAfter(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodSuckerComponent = null, BloodstreamComponent? stream = null, bool doChecks = true) + { + if (!Resolve(bloodsucker, ref bloodSuckerComponent)) + return; + + if (!Resolve(victim, ref stream)) + return; + + if (doChecks) + { + if (!_interactionSystem.InRangeUnobstructed(bloodsucker, victim)) + { + return; + } + + if (_inventorySystem.TryGetSlotEntity(victim, "head", out var headUid) && HasComp(headUid)) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-helmet", ("helmet", headUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_inventorySystem.TryGetSlotEntity(bloodsucker, "mask", out var maskUid) && + EntityManager.TryGetComponent(maskUid, out var blocker) && + blocker.Enabled) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-mask", ("mask", maskUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + } + + if (stream.BloodReagent != "Blood") + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-not-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_solutionSystem.PercentFull(stream.Owner) != 0) + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-no-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + var ev = new BloodSuckDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, bloodsucker, bloodSuckerComponent.Delay, ev, bloodsucker, target: victim) + { + BreakOnTargetMove = true, + BreakOnUserMove = false, + DistanceThreshold = 2f, + NeedHand = false + }; + + _doAfter.TryStartDoAfter(args); + } + + public bool TrySucc(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodsuckerComp = null) + { + // Is bloodsucker a bloodsucker? + if (!Resolve(bloodsucker, ref bloodsuckerComp)) + return false; + + // Does victim have a bloodstream? + if (!TryComp(victim, out var bloodstream)) + return false; + + // No blood left, yikes. + if (_bloodstreamSystem.GetBloodLevelPercentage(victim, bloodstream) == 0.0f) + return false; + + // Does bloodsucker have a stomach? + var stomachList = _bodySystem.GetBodyOrganComponents(bloodsucker); + if (stomachList.Count == 0) + return false; + + if (!_solutionSystem.TryGetSolution(stomachList[0].Comp.Owner, StomachSystem.DefaultSolutionName, out var stomachSolution)) + return false; + + // Are we too full? + + if (_solutionSystem.PercentFull(bloodsucker) >= 1) + { + _popups.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), bloodsucker, bloodsucker, Shared.Popups.PopupType.MediumCaution); + return false; + } + + _adminLogger.Add(Shared.Database.LogType.MeleeHit, Shared.Database.LogImpact.Medium, $"{ToPrettyString(bloodsucker):player} sucked blood from {ToPrettyString(victim):target}"); + + // All good, succ time. + _audio.PlayPvs("/Audio/Items/drink.ogg", bloodsucker); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked", ("target", victim)), bloodsucker, bloodsucker, Shared.Popups.PopupType.Medium); + EnsureComp(victim); + + // Make everything actually ingest. + if (bloodstream.BloodSolution == null) + return false; + + var temp = _solutionSystem.SplitSolution(bloodstream.BloodSolution.Value, bloodsuckerComp.UnitsToSucc); + _stomachSystem.TryTransferSolution(stomachList[0].Comp.Owner, temp, stomachList[0].Comp); + + // Add a little pierce + DamageSpecifier damage = new(); + damage.DamageDict.Add("Piercing", 1); // Slowly accumulate enough to gib after like half an hour + + _damageableSystem.TryChangeDamage(victim, damage, true, true); + + //I'm not porting the nocturine gland, this code is deprecated, and will be reworked at a later date. + //if (bloodsuckerComp.InjectWhenSucc && _solutionSystem.TryGetInjectableSolution(victim, out var injectable)) + //{ + // _solutionSystem.TryAddReagent(victim, injectable, bloodsuckerComp.InjectReagent, bloodsuckerComp.UnitsToInject, out var acceptedQuantity); + //} + return true; + } + + private record struct BloodSuckData() + {} + } +} diff --git a/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs new file mode 100644 index 00000000000..1a3c9b1588a --- /dev/null +++ b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs @@ -0,0 +1,23 @@ +namespace Content.Server.Vampiric +{ + [RegisterComponent] + /// + /// Item that gives a bloodsucker injection glands (for poison, usually) + /// + public sealed partial class BloodSuckerGlandInjectorComponent : Component + { + public bool Used = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + } +} diff --git a/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs new file mode 100644 index 00000000000..d2a92f24be6 --- /dev/null +++ b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Popups; +using Content.Shared.Interaction; + +namespace Content.Server.Vampiric +{ + public sealed class BloodSuckerGlandInjectorSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAfterInteract); + } + + private void OnAfterInteract(EntityUid uid, BloodSuckerGlandInjectorComponent component, AfterInteractEvent args) + { + if (component.Used) + return; + + if (!args.CanReach) + return; + + if (!TryComp(args.Target, out var bloodSuckerComponent)) + return; + + // They already have one. + if (bloodSuckerComponent.InjectWhenSucc) + return; + + bloodSuckerComponent.InjectWhenSucc = true; + bloodSuckerComponent.InjectReagent = component.InjectReagent; + bloodSuckerComponent.UnitsToInject = component.UnitsToInject; + component.Used = true; + QueueDel(uid); + + _popupSystem.PopupEntity(Loc.GetString("bloodsucker-glands-throb"), args.Target.Value, args.Target.Value); + } + } +} diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 7c9aed188fe..36fa69313e3 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -49,7 +49,6 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDamage); SubscribeLocalEvent(OnVendingPrice); - SubscribeLocalEvent(OnEmpPulse); SubscribeLocalEvent(OnActivatableUIOpenAttempt); @@ -496,15 +495,5 @@ private void OnPriceCalculation(EntityUid uid, VendingMachineRestockComponent co args.Price += priceSets.Max(); } - - private void OnEmpPulse(EntityUid uid, VendingMachineComponent component, ref EmpPulseEvent args) - { - if (!component.Broken && this.IsPowered(uid, EntityManager)) - { - args.Affected = true; - args.Disabled = true; - component.NextEmpEject = _timing.CurTime; - } - } } } diff --git a/Content.Shared/Access/Components/IdCardConsoleComponent.cs b/Content.Shared/Access/Components/IdCardConsoleComponent.cs index 417b77855cc..c994d83d9c5 100644 --- a/Content.Shared/Access/Components/IdCardConsoleComponent.cs +++ b/Content.Shared/Access/Components/IdCardConsoleComponent.cs @@ -89,6 +89,9 @@ public WriteToTargetIdMessage(string fullName, string jobTitle, List + /// Blood reagent required to web up a mob. + /// + + [DataField("webBloodReagent")] + public string WebBloodReagent = "Blood"; + } +} diff --git a/Content.Shared/Arachne/Events.cs b/Content.Shared/Arachne/Events.cs new file mode 100644 index 00000000000..02001286ac6 --- /dev/null +++ b/Content.Shared/Arachne/Events.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Map; +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Arachne +{ + [Serializable, NetSerializable] + public sealed partial class ArachneCocoonDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/Arachne/WebComponent.cs b/Content.Shared/Arachne/WebComponent.cs new file mode 100644 index 00000000000..c8284f39434 --- /dev/null +++ b/Content.Shared/Arachne/WebComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Arachne +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class WebComponent : Component + {} +} diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 5e1758203a8..840818dee59 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -1,29 +1,85 @@ using Content.Shared.Examine; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs; using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Rejuvenate; +using Robust.Shared.Containers; +using Robust.Shared.Timing; namespace Content.Shared.Atmos.Rotting; public abstract class SharedRottingSystem : EntitySystem { + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + public const int MaxStages = 3; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnPerishableMapInit); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnPerishableExamined); + + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnRottingMobStateChanged); + SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnExamined); } - /// - /// Return the rot stage, usually from 0 to 2 inclusive. - /// - public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) { - if (!Resolve(uid, ref comp, ref perishable)) - return 0; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } - return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) + return; + + if (HasComp(uid)) + return; + + component.RotAccumulator = TimeSpan.Zero; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } + + private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) + { + int stage = PerishStage(perishable, MaxStages); + if (stage < 1 || stage > MaxStages) + { + // We dont push an examined string if it hasen't started "perishing" or it's already rotting + return; + } + + var isMob = HasComp(perishable); + var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); + args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); + } + + private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) + { + if (TryComp(uid, out var perishable)) + { + perishable.RotNextUpdate = TimeSpan.Zero; + } + } + + private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + return; + RemCompDeferred(uid, component); + } + + private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) + { + RemCompDeferred(uid); } private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args) @@ -41,4 +97,75 @@ private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(uid, EntityManager)))); } + + /// + /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to + /// generate examine messages for items that are starting to rot. + /// + public int PerishStage(Entity perishable, int maxStages) + { + if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) + return 0; + return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); + } + + public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) + { + // things don't perish by default. + if (!Resolve(uid, ref perishable, false)) + return false; + + // only dead things or inanimate objects can rot + if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) + return false; + + if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && + HasComp(container.Owner)) + { + return false; + } + + var ev = new IsRottingEvent(); + RaiseLocalEvent(uid, ref ev); + + return !ev.Handled; + } + + public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) + { + return Resolve(uid, ref rotting, false); + } + + public void ReduceAccumulator(EntityUid uid, TimeSpan time) + { + if (!TryComp(uid, out var perishable)) + return; + + if (!TryComp(uid, out var rotting)) + { + perishable.RotAccumulator -= time; + return; + } + var total = (rotting.TotalRotTime + perishable.RotAccumulator) - time; + + if (total < perishable.RotAfter) + { + RemCompDeferred(uid, rotting); + perishable.RotAccumulator = total; + } + + else + rotting.TotalRotTime = total - perishable.RotAfter; + } + + /// + /// Return the rot stage, usually from 0 to 2 inclusive. + /// + public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + { + if (!Resolve(uid, ref comp, ref perishable)) + return 0; + + return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index facbd1d71b6..3fc7e7247e6 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2291,6 +2291,55 @@ public static readonly CVarDef /// public static readonly CVarDef StationGoalsChance = CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); + + + #region CPR System + /// + /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too + /// if you are wishing to permanently disable the system on your server. + /// + public static readonly CVarDef EnableCPR = + CVarDef.Create("cpr.enable", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) + /// + public static readonly CVarDef CPRReducesRot = + CVarDef.Create("cpr.reduces_rot", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR heals airloss, included for completeness sake. I'm not going to stop you if your intention is to make CPR do nothing. + /// I guess it might be funny to troll your players with? I won't judge. + /// + public static readonly CVarDef CPRHealsAirloss = + CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// The chance for a patient to be resuscitated when CPR is successfully performed. + /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. + /// + public static readonly CVarDef CPRResuscitationChance = + CVarDef.Create("cpr.resuscitation_chance", 0.05f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount + /// of rot reduction. Set it to 2 for if you want 3 seconds of CPR to reduce 6 seconds of rot. + /// + /// + /// If you're wondering why there isn't a CVar for setting the duration of the doafter, that's because it's not actually possible to have a timespan in cvar form + /// Curiously, it's also not possible for **shared** systems to set variable timespans. Which is where this system lives. + /// + public static readonly CVarDef CPRRotReductionMultiplier = + CVarDef.Create("cpr.rot_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR heals airloss by 1 point for every second spent performing CPR. Just like above, this directly multiplies the healing amount. + /// Set it to 2 to get 6 points of airloss healing for every 3 seconds of CPR. + /// + public static readonly CVarDef CPRAirlossReductionMultiplier = + CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + #endregion #region Contests System diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 8f6e8046aa4..521f5ace99d 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -13,6 +13,7 @@ using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Stunnable; +using Content.Shared.Traits.Assorted.Components; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics; @@ -216,7 +217,11 @@ public bool TryClimb( if (ev.Cancelled) return false; - var args = new DoAfterArgs(EntityManager, user, comp.ClimbDelay, new ClimbDoAfterEvent(), + var climbDelay = comp.ClimbDelay; + if (user == entityToMove && TryComp(user, out var delayModifier)) + climbDelay *= delayModifier.ClimbDelayMultiplier; + + var args = new DoAfterArgs(EntityManager, user, climbDelay, new ClimbDoAfterEvent(), entityToMove, target: climbable, used: entityToMove) diff --git a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs similarity index 67% rename from Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs rename to Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs index c5ed0ddb602..6fca9dc2ef3 100644 --- a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs +++ b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs @@ -1,5 +1,5 @@ using Content.Shared.Damage.Components; -using Robust.Shared.Collections; +using Content.Shared.Inventory; namespace Content.Shared.Damage.Events; @@ -7,12 +7,14 @@ namespace Content.Shared.Damage.Events; /// The components in the list are going to be hit, /// give opportunities to change the damage or other stuff. /// -public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs +public sealed class TakeStaminaDamageEvent : HandledEntityEventArgs, IInventoryRelayEvent { + public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET; + /// /// List of hit stamina components. /// - public List<(EntityUid Entity, StaminaComponent Component)> HitList; + public EntityUid Target; /// /// The multiplier. Generally, try to use *= or /= instead of overwriting. @@ -24,8 +26,8 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs /// public float FlatModifier = 0; - public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList) + public TakeStaminaDamageEvent(EntityUid target) { - HitList = hitList; + Target = target; } } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index de5338615ee..5c46e6055d1 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -166,20 +166,20 @@ private void OnMeleeHit(EntityUid uid, StaminaDamageOnHitComponent component, Me toHit.Add((ent, stam)); } - var hitEvent = new StaminaMeleeHitEvent(toHit); - RaiseLocalEvent(uid, hitEvent); + foreach (var (ent, comp) in toHit) + { + var hitEvent = new TakeStaminaDamageEvent(ent); + RaiseLocalEvent(uid, hitEvent); - if (hitEvent.Handled) - return; + if (hitEvent.Handled) + return; - var damage = component.Damage; + var damage = component.Damage; - damage *= hitEvent.Multiplier; + damage *= hitEvent.Multiplier; - damage += hitEvent.FlatModifier; + damage += hitEvent.FlatModifier; - foreach (var (ent, comp) in toHit) - { TakeStaminaDamage(ent, damage / toHit.Count, comp, source: args.User, with: args.Weapon, sound: component.Sound); } } @@ -204,12 +204,27 @@ private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, EntityUid target) { + if (!TryComp(target, out var stamComp)) + return; + var ev = new StaminaDamageOnHitAttemptEvent(); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) return; - TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound); + var hitEvent = new TakeStaminaDamageEvent(target); + RaiseLocalEvent(target, hitEvent); + + if (hitEvent.Handled) + return; + + var damage = component.Damage; + + damage *= hitEvent.Multiplier; + + damage += hitEvent.FlatModifier; + + TakeStaminaDamage(target, damage, source: uid, sound: component.Sound); } private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index c43a5885077..3308e881c52 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,5 +1,6 @@ using Content.Shared.Chemistry; using Content.Shared.Damage; +using Content.Shared.Damage.Events; using Content.Shared.Electrocution; using Content.Shared.Explosion; using Content.Shared.Eye.Blinding.Systems; @@ -20,6 +21,7 @@ public partial class InventorySystem public void InitializeRelay() { SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs new file mode 100644 index 00000000000..e01250858a1 --- /dev/null +++ b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs @@ -0,0 +1,33 @@ +using Robust.Shared.GameStates; +using Content.Shared.DoAfter; +using Robust.Shared.Audio; +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical.CPR +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class CPRTrainingComponent : Component + { + [DataField] + public SoundSpecifier CPRSound = new SoundPathSpecifier("/Audio/Effects/CPR.ogg"); + + /// + /// How long the doafter for CPR takes + /// + [DataField] + public TimeSpan DoAfterDuration = TimeSpan.FromSeconds(3); + + [DataField] + public int AirlossHeal = 6; + + [DataField] + public float CrackRibsModifier = 1f; + public EntityUid? CPRPlayingStream; + } + + [Serializable, NetSerializable] + public sealed partial class CPRDoAfterEvent : SimpleDoAfterEvent + { + + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs new file mode 100644 index 00000000000..9840b8ffbd4 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs @@ -0,0 +1,27 @@ +using Content.Shared.CCVar; +using Robust.Shared.Configuration; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem + { + [Dependency] private readonly IConfigurationManager _cfg = default!; + + public bool EnableCPR { get; private set; } + public bool HealsAirloss { get; private set; } + public bool ReducesRot { get; private set; } + public float ResuscitationChance { get; private set; } + public float RotReductionMultiplier { get; private set; } + public float AirlossReductionMultiplier { get; private set; } + + private void InitializeCVars() + { + Subs.CVar(_cfg, CCVars.EnableCPR, value => EnableCPR = value, true); + Subs.CVar(_cfg, CCVars.CPRHealsAirloss, value => HealsAirloss = value, true); + Subs.CVar(_cfg, CCVars.CPRReducesRot, value => ReducesRot = value, true); + Subs.CVar(_cfg, CCVars.CPRResuscitationChance, value => ResuscitationChance = value, true); + Subs.CVar(_cfg, CCVars.CPRRotReductionMultiplier, value => RotReductionMultiplier = value, true); + Subs.CVar(_cfg, CCVars.CPRAirlossReductionMultiplier, value => AirlossReductionMultiplier = value, true); + } + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs new file mode 100644 index 00000000000..799c0664a66 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs @@ -0,0 +1,132 @@ +using Content.Shared.Popups; +using Content.Shared.Atmos.Rotting; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Inventory; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Verbs; +using Robust.Shared.Network; +using Robust.Shared.Utility; +using Robust.Shared.Random; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem : EntitySystem + { + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedRottingSystem _rottingSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly INetManager _net = default!; + public override void Initialize() + { + base.Initialize(); + InitializeCVars(); + SubscribeLocalEvent>(AddCPRVerb); + SubscribeLocalEvent(OnCPRDoAfter); + } + + private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsEvent args) + { + if (!EnableCPR || !args.CanInteract || !args.CanAccess + || !TryComp(args.Target, out var targetState) + || targetState.CurrentState == MobState.Alive) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCPR(uid, args.Target, component); + }, + Text = Loc.GetString("cpr-verb"), + Icon = new SpriteSpecifier.Rsi(new("Interface/Alerts/human_alive.rsi"), "health4"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void StartCPR(EntityUid performer, EntityUid target, CPRTrainingComponent cprComponent) + { + if (HasComp(target)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-target-rotting", ("entity", target)), performer, performer); + return; + } + + if (_inventory.TryGetSlotEntity(target, "outerClothing", out var outer)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", outer)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(target, "mask", out var mask)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", mask)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(performer, "mask", out var maskSelf)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove-own-mask", ("clothing", maskSelf)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_net.IsServer) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person", ("target", target)), target, performer, PopupType.Medium); + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person-patient", ("user", performer)), target, target, PopupType.Medium); + cprComponent.CPRPlayingStream = _audio.PlayPvs(cprComponent.CPRSound, performer).Value.Entity; + } + + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, performer, cprComponent.DoAfterDuration, new CPRDoAfterEvent(), performer, target, performer) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true, + BlockDuplicate = true + }); + } + + private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, CPRDoAfterEvent args) + { + component.CPRPlayingStream = _audio.Stop(component.CPRPlayingStream); + + if (args.Target == null) + return; + + if (HealsAirloss) + { + // There is PROBABLY a better way to do this, by all means let me know + var healing = new DamageSpecifier() + { + DamageDict = new() + { + { "Asphyxiation", -component.AirlossHeal * AirlossReductionMultiplier} + } + }; + _damageable.TryChangeDamage(args.Target, healing, true, origin: performer); + } + + if (ReducesRot) + _rottingSystem.ReduceAccumulator((EntityUid) args.Target, component.DoAfterDuration * RotReductionMultiplier); + + if (_robustRandom.Prob(ResuscitationChance) + && _mobThreshold.TryGetThresholdForState((EntityUid) args.Target, MobState.Dead, out var threshold) + && TryComp(args.Target, out var damageableComponent) + && TryComp(args.Target, out var state) + && damageableComponent.TotalDamage < threshold) + { + _mobStateSystem.ChangeMobState(args.Target.Value, MobState.Critical, state, performer); + } + } + } +} diff --git a/Content.Shared/Medical/PenLightComponent.cs b/Content.Shared/Medical/PenLightComponent.cs new file mode 100644 index 00000000000..50dacae3dc8 --- /dev/null +++ b/Content.Shared/Medical/PenLightComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.DoAfter; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +namespace Content.Shared.Medical; + +/// +/// This for penlights; a tool used to check for eye damage. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentPause] +public sealed partial class PenLightComponent : Component +{ + /// + /// Cooldown Time, exams take a bit + /// + [AutoPausedField] + public TimeSpan? NextExamTime; + + /// + /// The min time between exams + /// + [DataField] + public TimeSpan ExamDelay = TimeSpan.FromSeconds(3); + + /// + /// How long the doafter for the exam takes + /// + [DataField(required: true)] + public float ExamSpeed { get; set; } + +} + +[Serializable, NetSerializable] +public sealed partial class PenLightDoAfterEvent : SimpleDoAfterEvent { } \ No newline at end of file diff --git a/Content.Shared/Medical/PenLightUiKey.cs b/Content.Shared/Medical/PenLightUiKey.cs new file mode 100644 index 00000000000..52fc6ce3401 --- /dev/null +++ b/Content.Shared/Medical/PenLightUiKey.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; + +[Serializable, NetSerializable] +public enum PenLightUiKey : byte +{ + Key +} diff --git a/Content.Shared/Medical/PenLightUserMessage.cs b/Content.Shared/Medical/PenLightUserMessage.cs new file mode 100644 index 00000000000..42502b2171b --- /dev/null +++ b/Content.Shared/Medical/PenLightUserMessage.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; +[Serializable, NetSerializable] +public sealed class PenLightUserMessage : BoundUserInterfaceMessage +{ + public readonly NetEntity? TargetEntity; + public bool? Blind; + public bool? Drunk; + public bool? EyeDamage; + public bool? Healthy; + public bool? SeeingRainbows; + + public PenLightUserMessage(NetEntity? targetEntity, bool? blind, bool? drunk, bool? eyeDamage, bool? healthy, bool? seeingRainbows) + { + TargetEntity = targetEntity; + Blind = blind; + Drunk = drunk; + EyeDamage = eyeDamage; + Healthy = healthy; + SeeingRainbows = seeingRainbows; + } +} + diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs new file mode 100644 index 00000000000..dc291bbe8ba --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Stunnable; + +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaDamageResistanceComponent : Component +{ + /// + /// 1 - no reduction, 0 - full reduction + /// + [DataField] public float Coefficient = 1; +} diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs new file mode 100644 index 00000000000..7632eed504d --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Examine; +using Content.Shared.Inventory; + +namespace Content.Shared.Stunnable; + +public sealed partial class StaminaDamageResistanceSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnStaminaMeleeHit); + SubscribeLocalEvent(OnExamine); + } + + private void OnStaminaMeleeHit(Entity ent, ref InventoryRelayedEvent args) + { + args.Args.Multiplier *= ent.Comp.Coefficient; + } + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + var percentage = (1 - ent.Comp.Coefficient) * 100; + args.PushMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); + } +} diff --git a/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs new file mode 100644 index 00000000000..c04657a4875 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies climbing speed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ClimbDelayModifierComponent : Component +{ + /// + /// What to multiply the climbing delay by. + /// + [DataField, AutoNetworkedField] + public float ClimbDelayMultiplier = 1f; +} diff --git a/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs b/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs new file mode 100644 index 00000000000..6aadc258d73 --- /dev/null +++ b/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Vampiric +{ + [Serializable, NetSerializable] + public sealed partial class BloodSuckDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Resources/Audio/DeltaV/Items/gavel.ogg b/Resources/Audio/DeltaV/Items/gavel.ogg new file mode 100644 index 00000000000..c6061cbb3dd Binary files /dev/null and b/Resources/Audio/DeltaV/Items/gavel.ogg differ diff --git a/Resources/Audio/Effects/CPR.ogg b/Resources/Audio/Effects/CPR.ogg new file mode 100644 index 00000000000..2c7cedd2033 Binary files /dev/null and b/Resources/Audio/Effects/CPR.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a0631c5f9d8..5aca84c9f32 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4934,3 +4934,122 @@ Entries: message: Lamiae should now be rendered much better. id: 6217 time: '2024-08-05T17:15:51.0000000+00:00' +- author: gluesniffler + changes: + - type: Add + message: Added an unlockable PKA and Jetpack module to Salvage Cyborgs + id: 6218 + time: '2024-08-06T01:14:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Arachne have been reimplemented! + - type: Add + message: Oneirophages are back! + id: 6219 + time: '2024-08-06T04:52:32.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + CPR has been added to the game. People with CPR training can now perform + CPR on anyone who is in either crit or dead states. + - type: Add + message: >- + CPR Training has been added to the game as a new positive trait. All + medical staff start with this trait for free. + id: 6220 + time: '2024-08-06T05:28:54.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Self-Aware trait, a 2-point trait that allows you to examine + your Brute/Burn damage numbers like a health analyzer, and estimate your + toxin/airloss damage. + id: 6221 + time: '2024-08-06T08:05:59.0000000+00:00' +- author: TJohnson + changes: + - type: Tweak + message: >- + Removed overlay restriction for vulps, you can now have as many overlay + markings as you want! + id: 6222 + time: '2024-08-06T19:05:46.0000000+00:00' +- author: whateverusername0 + changes: + - type: Add + message: Added different stamina damage resistance to hardsuits. + id: 6223 + time: '2024-08-06T19:08:48.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Blood Deficiency trait, a new negative trait that makes you + slowly lose blood over time. You must routinely receive blood loss + treatment to live, and even normally non-lethal bleeding can make you + start dying slowly. + id: 6224 + time: '2024-08-06T19:12:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add three new 1-point traits for Onis that allow you to specialize in + Slash or Piercing damage or be a melee weapons generalist. + id: 6225 + time: '2024-08-06T19:50:20.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add Parkour Training, a 3-point trait that makes you faster with + climbing tables and crawling. + id: 6226 + time: '2024-08-06T20:37:00.0000000+00:00' +- author: WarMechanic + changes: + - type: Tweak + message: >- + EMP Grenades can now disable basically any electrical device, and stack + in disable duration. + id: 6227 + time: '2024-08-06T20:47:49.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: >- + Admin tooling: added several admin commands to help manipulate entities' + languages. + id: 6228 + time: '2024-08-06T21:22:11.0000000+00:00' +- author: Tilkku + changes: + - type: Add + message: Added Pen Lights + - type: Add + message: Eye Examination + id: 6229 + time: '2024-08-06T21:51:21.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: >- + Gloves now have unique fingerprints. Items can be traced back to gloves, + which can then be traced back to people. + id: 6230 + time: '2024-08-06T22:03:36.0000000+00:00' +- author: Skubman + changes: + - type: Fix + message: Passive blood regeneration now works again. + id: 6231 + time: '2024-08-07T06:07:35.0000000+00:00' +- author: Fansana + changes: + - type: Fix + message: Barotrauma admin log spam + id: 6232 + time: '2024-08-07T17:31:55.0000000+00:00' diff --git a/Resources/Locale/en-US/abilities/arachne.ftl b/Resources/Locale/en-US/abilities/arachne.ftl new file mode 100644 index 00000000000..6f6348d7212 --- /dev/null +++ b/Resources/Locale/en-US/abilities/arachne.ftl @@ -0,0 +1,13 @@ +action-name-spin-web = Spin Web +action-desc-spin-web = Use your spinnerets to make a spider web in the current tile. Makes you hungrier and thirstier. +action-name-spin-web-space = You can't spin a web in space! +action-name-spin-web-blocked = There's no room for a web here. +spin-web-action-hungry = You're too hungry to spin a web! +spin-web-action-thirsty = You're too thirsty to spin a web! +spin-web-start-second-person = You start spinning a web. +spin-web-start-third-person = {CAPITALIZE(THE($spider))} starts spinning a web! +cocoon-start-second-person = You start cocooning {THE($target)}. +cocoon-start-third-person = {CAPITALIZE(THE($spider))} starts cocooning {THE($target)}. +spun-web-second-person = You spin up a web. +spun-web-third-person = {CAPITALIZE(THE($spider))} spins up a web! +cocoon = Cocoon diff --git a/Resources/Locale/en-US/abilities/bloodsucker.ftl b/Resources/Locale/en-US/abilities/bloodsucker.ftl new file mode 100644 index 00000000000..d956eaff84e --- /dev/null +++ b/Resources/Locale/en-US/abilities/bloodsucker.ftl @@ -0,0 +1,19 @@ +action-name-suck-blood = Suck Blood +action-description-suck-blood = Suck the blood of the victim in your hand. + +bloodsucker-fail-helmet = You'd need to remove {THE($helmet)}. +bloodsucker-fail-mask = You'd need to remove your mask! + +bloodsucker-fail-not-blood = { CAPITALIZE(SUBJECT($target)) } doesn't have delicious, nourishing mortal blood. +bloodsucker-fail-no-blood = { CAPITALIZE(SUBJECT($target)) } has no blood in { POSS-ADJ($target) } body. +bloodsucker-fail-no-blood-bloodsucked = { CAPITALIZE(SUBJECT($target)) } has been sucked dry. + +bloodsucker-blood-sucked = You suck some blood from {$target}. +bloodsucker-doafter-start = You try to suck blood from {$target}. + +bloodsucker-doafter-start-victim = {CAPITALIZE(THE($sucker))} is trying to bite your neck! +bloodsucker-blood-sucked-victim = {CAPITALIZE(THE($sucker))} sucks some of your blood! + +bloodsucked-health-examine = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } bite marks on { POSS-ADJ($target) } neck.[/color] + +bloodsucker-glands-throb = The glands behind your fangs feel a bit sore. diff --git a/Resources/Locale/en-US/armor/armor-examine.ftl b/Resources/Locale/en-US/armor/armor-examine.ftl index d49a1373f28..6dc511e66e5 100644 --- a/Resources/Locale/en-US/armor/armor-examine.ftl +++ b/Resources/Locale/en-US/armor/armor-examine.ftl @@ -17,3 +17,4 @@ armor-damage-type-cold = Cold armor-damage-type-poison = Poison armor-damage-type-shock = Shock armor-damage-type-structural = Structural +armor-examine-stamina = Reduces your stamina damage by [color=cyan]{$num}%[/color]. \ No newline at end of file diff --git a/Resources/Locale/en-US/bloodstream/bloodstream.ftl b/Resources/Locale/en-US/bloodstream/bloodstream.ftl index 7d8f98c3087..65e475f1ab4 100644 --- a/Resources/Locale/en-US/bloodstream/bloodstream.ftl +++ b/Resources/Locale/en-US/bloodstream/bloodstream.ftl @@ -3,3 +3,7 @@ bloodstream-component-bleeding = [color=red]{CAPITALIZE(SUBJECT($target))} {CONJ bloodstream-component-profusely-bleeding = [color=crimson]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($target)} profusely bleeding![/color] bloodstream-component-wounds-cauterized = You feel your wounds painfully close! + +bloodstream-component-selfaware-looks-pale = [color=bisque]You feel dizzy from blood loss.[/color] +bloodstream-component-selfaware-bleeding = [color=red]You are bleeding.[/color] +bloodstream-component-selfaware-profusely-bleeding = [color=crimson]You are profusely bleeding![/color] diff --git a/Resources/Locale/en-US/deltav/devices/device-network.ftl b/Resources/Locale/en-US/deltav/devices/device-network.ftl new file mode 100644 index 00000000000..644d2e240a8 --- /dev/null +++ b/Resources/Locale/en-US/deltav/devices/device-network.ftl @@ -0,0 +1,2 @@ +device-frequency-prototype-name-surveillance-camera-justice = Justice Cameras + diff --git a/Resources/Locale/en-US/deltav/headset/headset-component.ftl b/Resources/Locale/en-US/deltav/headset/headset-component.ftl index d3c3f2e7356..9801bce3ab2 100644 --- a/Resources/Locale/en-US/deltav/headset/headset-component.ftl +++ b/Resources/Locale/en-US/deltav/headset/headset-component.ftl @@ -1 +1,3 @@ +chat-radio-justice = Justice chat-radio-prison = Prison + diff --git a/Resources/Locale/en-US/deltav/job/department-desc.ftl b/Resources/Locale/en-US/deltav/job/department-desc.ftl new file mode 100644 index 00000000000..530a1b0a5ae --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/department-desc.ftl @@ -0,0 +1,2 @@ +department-Justice-description = Uphold justice on the station. + diff --git a/Resources/Locale/en-US/deltav/job/department.ftl b/Resources/Locale/en-US/deltav/job/department.ftl index fc6d81e938c..2653e8f46cc 100644 --- a/Resources/Locale/en-US/deltav/job/department.ftl +++ b/Resources/Locale/en-US/deltav/job/department.ftl @@ -1,2 +1,4 @@ department-Epistemics = Epistemics department-Logistics = Logistics +department-Justice = Justice + diff --git a/Resources/Locale/en-US/deltav/job/job-description.ftl b/Resources/Locale/en-US/deltav/job/job-description.ftl index 5bc7be83118..9e99f5838e9 100644 --- a/Resources/Locale/en-US/deltav/job/job-description.ftl +++ b/Resources/Locale/en-US/deltav/job/job-description.ftl @@ -1 +1,5 @@ job-description-medical-borg = Half-human, Half-machine. Follow your laws, serve the crew, and assist the medical department. +job-description-chief-justice = Manage the justice department, act as a judge, and ensure everyone recieves fair and just treatment. +job-description-clerk = Organize trials, notarize documents, review charges, and act as a judge if needed. +job-description-prosecutor = Take statements from security and prepare cases against those accused of commiting crimes. +job-description-courier = Deliver mail and other packages from and to logistics. Avoid dogs. diff --git a/Resources/Locale/en-US/deltav/job/job-names.ftl b/Resources/Locale/en-US/deltav/job/job-names.ftl index dc7940ba983..175da8ba693 100644 --- a/Resources/Locale/en-US/deltav/job/job-names.ftl +++ b/Resources/Locale/en-US/deltav/job/job-names.ftl @@ -1 +1,6 @@ job-name-medical-borg = Medical Cyborg +job-name-chief-justice = Chief Justice +job-name-clerk = Clerk +job-name-prosecutor = Prosecutor +job-name-lawyer = Attorney +job-name-courier = Courier diff --git a/Resources/Locale/en-US/deltav/job/job-supervisors.ftl b/Resources/Locale/en-US/deltav/job/job-supervisors.ftl new file mode 100644 index 00000000000..f1c0ade32a5 --- /dev/null +++ b/Resources/Locale/en-US/deltav/job/job-supervisors.ftl @@ -0,0 +1,2 @@ +job-supervisors-cj = the chief justice + diff --git a/Resources/Locale/en-US/deltav/misc/pda.ftl b/Resources/Locale/en-US/deltav/misc/pda.ftl new file mode 100644 index 00000000000..a64a4e34231 --- /dev/null +++ b/Resources/Locale/en-US/deltav/misc/pda.ftl @@ -0,0 +1,4 @@ +ent-HoSPDA = head of security pda + .desc = Smells like donuts and gunpowder residue. +ent-LawyerPDA = attorney pda + .desc = For attornies to poach dubious clients. diff --git a/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl b/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl index 7b2d06a04e7..8d2571920ff 100644 --- a/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl +++ b/Resources/Locale/en-US/deltav/navmap-beacons/station-beacons.ftl @@ -30,3 +30,7 @@ station-beacon-boxing-ring = Boxing station-beacon-park = Park station-beacon-corpsman = Corpsman + +station-beacon-justice = Justice +station-beacon-chiefjustice = Chief Justice +station-beacon-prosecutor = Prosecutor diff --git a/Resources/Locale/en-US/deltav/paper/stamp-component.ftl b/Resources/Locale/en-US/deltav/paper/stamp-component.ftl index 8c591e771f1..cfa5279baa0 100644 --- a/Resources/Locale/en-US/deltav/paper/stamp-component.ftl +++ b/Resources/Locale/en-US/deltav/paper/stamp-component.ftl @@ -1,2 +1,5 @@ stamp-component-stamped-name-lawyer = Lawyer -stamp-component-stamped-name-psychologist = Psychologist \ No newline at end of file +stamp-component-stamped-name-psychologist = Psychologist +stamp-component-stamped-name-notary = NOTARY +stamp-component-stamped-name-chiefjustice = Chief Justice + diff --git a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl index 84245872f54..2c5a3c871c0 100644 --- a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl @@ -1,3 +1,6 @@ -id-card-access-level-orders = Orders +id-card-access-level-orders = Orders id-card-access-level-mantis = Psionic Mantis +id-card-access-level-chief-justice = Chief Justice +id-card-access-level-prosecutor = Prosecutor +id-card-access-level-justice = Justice id-card-access-level-corpsman = Corpsman diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl new file mode 100644 index 00000000000..897c3f718de --- /dev/null +++ b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl @@ -0,0 +1,22 @@ +health-examinable-selfaware-none = You feel healthy and well. + +health-examinable-selfaware-type-text = You have {$damageType}, around [bold]{$amount}[/bold]. + +health-examinable-selfaware-type-Blunt = [color=red]Blunt[/color] trauma +health-examinable-selfaware-type-Slash = [color=red]Slash[/color] wounds +health-examinable-selfaware-type-Piercing = [color=red]Piercing[/color] wounds + +health-examinable-selfaware-type-Heat = [color=orange]Heat[/color] burns +health-examinable-selfaware-type-Shock = [color=lightgoldenrodyellow]Shock[/color] burns +health-examinable-selfaware-type-Cold = [color=lightblue]Cold[/color] burns +health-examinable-selfaware-type-Caustic = [color=yellowgreen]Caustic[/color] burns + +health-examinable-selfaware-group-Toxin-10 = [color=green]You feel sick.[/color] +health-examinable-selfaware-group-Toxin-25 = [color=green]You feel nauseated.[/color] +health-examinable-selfaware-group-Toxin-40 = [color=green]You feel very unwell![/color] +health-examinable-selfaware-group-Toxin-60 = [color=green]You feel gravely ill![/color] + +health-examinable-selfaware-group-Airloss-10 = [color=lightblue]You feel lightheaded.[/color] +health-examinable-selfaware-group-Airloss-25 = [color=lightblue]You feel faint and woozy.[/color] +health-examinable-selfaware-group-Airloss-40 = [color=lightblue]You're struggling to breathe![/color] +health-examinable-selfaware-group-Airloss-60 = [color=lightblue]You're suffocating badly![/color] diff --git a/Resources/Locale/en-US/job/job-names.ftl b/Resources/Locale/en-US/job/job-names.ftl index bcfdc9205de..19d2db94518 100644 --- a/Resources/Locale/en-US/job/job-names.ftl +++ b/Resources/Locale/en-US/job/job-names.ftl @@ -24,7 +24,8 @@ job-name-centcomoff = CentCom Official job-name-reporter = Reporter job-name-musician = Musician job-name-librarian = Librarian -job-name-lawyer = Lawyer +# DeltaV - Changed Lawyer to Attorney +# job-name-lawyer = Lawyer job-name-mime = Mime job-name-ce = Chief Engineer job-name-janitor = Janitor diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl index ba2b3160094..65959e3f28f 100644 --- a/Resources/Locale/en-US/language/commands.ftl +++ b/Resources/Locale/en-US/language/commands.ftl @@ -14,3 +14,21 @@ command-language-entry = {$id}. {$language} - {$name} command-language-invalid-number = The language number must be between 0 and {$total}. Alternatively, use the language name. command-language-invalid-language = The language {$id} does not exist or you cannot speak it. + +# toolshed + +command-description-language-add = Adds a new language to the piped entity. The two last arguments indicate whether it should be spoken/understood. Example: 'self language:add "Canilunzt" true true' +command-description-language-rm = Removes a language from the piped entity. Works similarly to language:add. Example: 'self language:rm "GalacticCommon" true true'. +command-description-language-lsspoken = Lists all languages the entity can speak. Example: 'self language:lsspoken' +command-description-language-lsunderstood = Lists all languages the entity can understand. Example: 'self language:lssunderstood' + +command-description-translator-addlang = Adds a new target language to the piped translator entity. See language:add for details. +command-description-translator-rmlang = Removes a target language from the piped translator entity. See language:rm for details. +command-description-translator-addrequired = Adds a new required language to the piped translator entity. Example: 'ent 1234 translator:addrequired "GalacticCommon"' +command-description-translator-rmrequired = Removes a required language from the piped translator entity. Example: 'ent 1234 translator:rmrequired "GalacticCommon"' +command-description-translator-lsspoken = Lists all spoken languages for the piped translator entity. Example: 'ent 1234 translator:lsspoken' +command-description-translator-lsunderstood = Lists all understood languages for the piped translator entity. Example: 'ent 1234 translator:lssunderstood' +command-description-translator-lsrequired = Lists all required languages for the piped translator entity. Example: 'ent 1234 translator:lsrequired' + +command-language-error-this-will-not-work = This will not work. +command-language-error-not-a-translator = Entity {$entity} is not a translator. diff --git a/Resources/Locale/en-US/medical/components/cpr-training-component.ftl b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl new file mode 100644 index 00000000000..7ed824a369f --- /dev/null +++ b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl @@ -0,0 +1,6 @@ +cpr-start-second-person = You start performing CPR on {CAPITALIZE($target)}. +cpr-start-second-person-patient = {CAPITALIZE(THE($user))} starts performing CPR on you. +cpr-must-remove = You must remove {THE($clothing)} from the patient. +cpr-must-remove-own-mask = You must remove your {THE($clothing)}. +cpr-target-rotting = {CAPITALIZE($entity)} is too far gone... +cpr-verb = Perform CPR diff --git a/Resources/Locale/en-US/medical/components/penlight.ftl b/Resources/Locale/en-US/medical/components/penlight.ftl new file mode 100644 index 00000000000..f0639ad7381 --- /dev/null +++ b/Resources/Locale/en-US/medical/components/penlight.ftl @@ -0,0 +1,11 @@ +penlight-off = The pen light is off. +pen-light-exam-title = Pen Light +pen-light-window-entity-eyes-text = {$entityName}'s conditions: +pen-light-window-no-patient-data-text = No patient data. +pen-light-window-entity-unknown-text = unknown + +pen-light-exam-blind-text = The patient's eyes are glassy and unfocused. They can't follow the light at all. +pen-light-exam-drunk-text = The patient's eyes are slow to follow the light, droopy. +pen-light-exam-eyedamage-text = The patient's eyes are partially focused, though they struggle to look at the light for too long. +pen-light-exam-hallucinating-text = The patient's eyes are wandering around, with dilated pupils. They don't focus on the light. +pen-light-exam-healthy-text = The patient follows the light perfectly with no stuttering. \ No newline at end of file diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl index 50ea5f590c7..064b21eaa9c 100644 --- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl +++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl @@ -1,101 +1,101 @@ -reagent-physical-desc-skunky = skunky -reagent-physical-desc-soapy = soapy -reagent-physical-desc-ferrous = ferrous -reagent-physical-desc-nothing = nothing +reagent-physical-desc-abrasive = abrasive +reagent-physical-desc-acidic = acidic reagent-physical-desc-acrid = acrid -reagent-physical-desc-thick-and-grainy = thick and grainy -reagent-physical-desc-necrotic = necrotic -reagent-physical-desc-oily = oily -reagent-physical-desc-glowing = glowing -reagent-physical-desc-heterogeneous = heterogeneous -reagent-physical-desc-mucus-like = mucus-like -reagent-physical-desc-cold = cold +reagent-physical-desc-alkaline = alkaline +reagent-physical-desc-aromatic = aromatic reagent-physical-desc-bee-guts = bee guts -reagent-physical-desc-tangy = tangy -reagent-physical-desc-fizzy = fizzy -reagent-physical-desc-fuzzy = fuzzy -reagent-physical-desc-spicy = spicy -reagent-physical-desc-abrasive = abrasive -reagent-physical-desc-chalky = chalky -reagent-physical-desc-roaring = roaring -reagent-physical-desc-robust = robust -reagent-physical-desc-sickly = sickly -reagent-physical-desc-murky = murky -reagent-physical-desc-bubbling = bubbling -reagent-physical-desc-wormy = wormy -reagent-physical-desc-frosty = frosty reagent-physical-desc-blazing = blazing -reagent-physical-desc-translucent = translucent -reagent-physical-desc-sugary = sugary -reagent-physical-desc-putrid = putrid -reagent-physical-desc-saucey = saucey -reagent-physical-desc-salty = salty -reagent-physical-desc-milky = milky -reagent-physical-desc-refreshing = refreshing -reagent-physical-desc-soothing = soothing -reagent-physical-desc-starchy = starchy -reagent-physical-desc-starry = starry -reagent-physical-desc-tart = tart -reagent-physical-desc-aromatic = aromatic -reagent-physical-desc-thick = thick -reagent-physical-desc-syrupy = syrupy -reagent-physical-desc-grainy = grainy -reagent-physical-desc-foamy = foamy -reagent-physical-desc-tropical = tropical +reagent-physical-desc-bubbling = bubbling +reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-burning = burning +reagent-physical-desc-buzzy = buzzy +reagent-physical-desc-chalky = chalky +reagent-physical-desc-chewy = chewy +reagent-physical-desc-citric = citric +reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-clumpy = clumpy reagent-physical-desc-coarse = coarse -reagent-physical-desc-opaque = opaque -reagent-physical-desc-pulpy = pulpy -reagent-physical-desc-reasonably-metallic = reasonably metallic -reagent-physical-desc-metallic = metallic -reagent-physical-desc-gaseous = gaseous -reagent-physical-desc-ground-brass = ground brass -reagent-physical-desc-dark-brown = dark brown +reagent-physical-desc-cold = cold +reagent-physical-desc-creamy = creamy +reagent-physical-desc-crisp = crisp reagent-physical-desc-crystalline = crystalline -reagent-physical-desc-viscous = viscous -reagent-physical-desc-shiny = shiny +reagent-physical-desc-dark-brown = dark brown reagent-physical-desc-dark-red = dark-red +reagent-physical-desc-electric = electric +reagent-physical-desc-energizing = energizing +reagent-physical-desc-enigmatic = enigmatic +reagent-physical-desc-ethereal = ethereal +reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-exotic-smelling = exotic smelling +reagent-physical-desc-ferrous = ferrous +reagent-physical-desc-fibrous = fibrous +reagent-physical-desc-fizzy = fizzy +reagent-physical-desc-fizzy-and-creamy = fizzy and creamy +reagent-physical-desc-fluffy = fluffy +reagent-physical-desc-foamy = foamy +reagent-physical-desc-frosty = frosty +reagent-physical-desc-funny = funny +reagent-physical-desc-fuzzy = fuzzy +reagent-physical-desc-gaseous = gaseous +reagent-physical-desc-glittery = glittery +reagent-physical-desc-gloopy = gloopy +reagent-physical-desc-glowing = glowing +reagent-physical-desc-grainy = grainy +reagent-physical-desc-ground-brass = ground brass +reagent-physical-desc-heterogeneous = heterogeneous +reagent-physical-desc-holy = holy +reagent-physical-desc-inky = inky reagent-physical-desc-ionizing = ionizing +reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-metallic = metallic +reagent-physical-desc-milky = milky +reagent-physical-desc-mucus-like = mucus-like +reagent-physical-desc-murky = murky +reagent-physical-desc-necrotic = necrotic +reagent-physical-desc-neural = neural reagent-physical-desc-nondescript = nondescript -reagent-physical-desc-burning = burning +reagent-physical-desc-nothing = nothing +reagent-physical-desc-odorless = odorless +reagent-physical-desc-oily = oily +reagent-physical-desc-opaque = opaque +reagent-physical-desc-overpowering = overpowering reagent-physical-desc-porous = porous reagent-physical-desc-powdery = powdery -reagent-physical-desc-creamy = creamy -reagent-physical-desc-sticky = sticky -reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-pulpy = pulpy +reagent-physical-desc-pungent = pungent +reagent-physical-desc-putrid = putrid +reagent-physical-desc-reasonably-metallic = reasonably metallic +reagent-physical-desc-reflective = reflective +reagent-physical-desc-refreshing = refreshing +reagent-physical-desc-roaring = roaring +reagent-physical-desc-robust = robust reagent-physical-desc-rocky = rocky -reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-salty = salty +reagent-physical-desc-saucey = saucey +reagent-physical-desc-shiny = shiny +reagent-physical-desc-sickly = sickly +reagent-physical-desc-skunky = skunky +reagent-physical-desc-slimy = slimy reagent-physical-desc-soapy = soapy -reagent-physical-desc-crisp = crisp -reagent-physical-desc-citric = citric -reagent-physical-desc-acidic = acidic -reagent-physical-desc-buzzy = buzzy -reagent-physical-desc-fibrous = fibrous -reagent-physical-desc-strong-smelling = strong smelling -reagent-physical-desc-fizzy-and-creamy = fizzy and creamy -reagent-physical-desc-overpowering = overpowering +reagent-physical-desc-soapy = soapy +reagent-physical-desc-soothing = soothing reagent-physical-desc-sour = sour -reagent-physical-desc-pungent = pungent -reagent-physical-desc-clumpy = clumpy +reagent-physical-desc-spicy = spicy +reagent-physical-desc-starchy = starchy +reagent-physical-desc-starry = starry +reagent-physical-desc-sticky = sticky +reagent-physical-desc-strong-smelling = strong smelling reagent-physical-desc-strong-smelling = strong-smelling -reagent-physical-desc-odorless = odorless -reagent-physical-desc-gloopy = gloopy -reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-sugary = sugary reagent-physical-desc-sweet = sweet -reagent-physical-desc-electric = electric -reagent-physical-desc-chewy = chewy -reagent-physical-desc-volatile = volatile -reagent-physical-desc-inky = inky -reagent-physical-desc-enigmatic = enigmatic -reagent-physical-desc-exotic-smelling = exotic smelling -reagent-physical-desc-ethereal = ethereal -reagent-physical-desc-glittery = glittery -reagent-physical-desc-energizing = energizing -reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-syrupy = syrupy +reagent-physical-desc-tangy = tangy +reagent-physical-desc-tart = tart +reagent-physical-desc-thick = thick +reagent-physical-desc-thick-and-grainy = thick and grainy +reagent-physical-desc-translucent = translucent +reagent-physical-desc-tropical = tropical reagent-physical-desc-vibrant = vibrant -reagent-physical-desc-fluffy = fluffy -reagent-physical-desc-funny = funny -reagent-physical-desc-alkaline = alkaline -reagent-physical-desc-reflective = reflective -reagent-physical-desc-holy = holy -reagent-physical-desc-slimy = slimy -reagent-physical-desc-neural = neural +reagent-physical-desc-viscous = viscous +reagent-physical-desc-volatile = volatile +reagent-physical-desc-wormy = wormy diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index a68f9e80b4e..96cb2039116 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -16,6 +16,7 @@ research-technology-shuttlecraft = Shuttlecraft research-technology-ripley-aplu = Ripley APLU research-technology-advanced-atmospherics = Advanced Atmospherics research-technology-advanced-tools = Advanced Tools +research-technology-mechanized-salvaging = Mechanized Salvaging research-technology-super-powercells = Super Powercells research-technology-bluespace-storage = Bluespace Storage research-technology-portable-fission = Portable Fission diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl index f31b1fa0f00..79ce7fea6a1 100644 --- a/Resources/Locale/en-US/species/species.ftl +++ b/Resources/Locale/en-US/species/species.ftl @@ -6,6 +6,7 @@ species-name-reptilian = Reptilian species-name-slime = Slime Person species-name-diona = Diona species-name-arachnid = Arachnid +species-name-arachne = Arachne species-name-moth = Moth Person species-name-skeleton = Skeleton species-name-vox = Vox diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 600a9834fd4..3439ffcdc97 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -8,6 +8,12 @@ trait-description-Narcolepsy = You fall asleep randomly trait-name-Pacifist = Pacifist trait-description-Pacifist = You cannot attack or hurt any living beings. +trait-name-SelfAware = Self-Aware +trait-description-SelfAware = + You possess a keen intuition of your body and senses. + You can accurately examine the severity of your wounds and burns like a health analyzer, + and can gauge if you have toxin or airloss damage. + trait-name-LightweightDrunk = Lightweight Drunk trait-description-LightweightDrunk = Alcohol has a stronger effect on you @@ -17,6 +23,11 @@ trait-description-HeavyweightDrunk = Alcohol is afraid of you. trait-name-Muted = Muted trait-description-Muted = You can't speak +trait-name-BloodDeficiency = Blood Deficiency +trait-description-BloodDeficiency = + Your body loses more blood than it can replenish. + You lose blood over time, and when left untreated you will eventually die from blood loss. + trait-name-Paracusia = Paracusia trait-description-Paracusia = You hear sounds that aren't really there @@ -35,6 +46,13 @@ trait-description-Stutter = You t-t-talk with a bit of a s-s-stutter... trait-name-Snoring = Snoring trait-description-Snoring = You will snore while sleeping. +trait-name-CPRTraining = CPR Training +trait-description-CPRTraining = At some point in your life, you have received training in how to perform CPR. + This trait is automatically given for free to medical doctors, and is intended for non-medical characters + +trait-name-NormalVisionHarpy = Trichromat Modification +trait-description-NormalVisionHarpy = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + trait-name-Southern = Southern Drawl trait-description-Southern = You have a different way of speakin'. @@ -66,6 +84,26 @@ trait-description-Voracious = Nothing gets between you and your food. Your endless consumption of food and drinks is twice as fast. +trait-name-ParkourTraining = Parkour Training +trait-description-ParkourTraining = + Whether as a hobby, lifestyle, or professional training, you are trained in the discipline of parkour. + You're faster with climbing, crawling, lying down, and getting up. + trait-name-LightStep = Light Step trait-description-LightStep = You move with a gentle step, making your footsteps quieter. + +trait-name-Swashbuckler = Swashbuckler +trait-description-Swashbuckler = + You are an expert in swordsmanship, wielding swords, knives, and other blades with unrivaled finesse. + Your melee Slash bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-Spearmaster = Spearmaster +trait-description-Spearmaster = + You have an outstanding proficiency with spears, wielding them as an extension of your body. + Your melee Piercing bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-WeaponsGeneralist = Weapons Generalist +trait-description-WeaponsGeneralist = + You are a jack of all trades with melee weapons, enabling you to be versatile with your weapon arsenal. + Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. \ No newline at end of file diff --git a/Resources/Prototypes/Access/misc.yml b/Resources/Prototypes/Access/misc.yml index 99ad59700e0..f717c57a000 100644 --- a/Resources/Prototypes/Access/misc.yml +++ b/Resources/Prototypes/Access/misc.yml @@ -44,4 +44,7 @@ - Musician # DeltaV - Add Musician access - Reporter # DeltaV - Add Reporter access - Zookeeper # DeltaV - Add Zookeeper access + - Justice # DeltaV - Add Justice dept access + - ChiefJustice # DeltaV - Add Chief Justice access + - Prosecutor # DeltaV - Add Prosecutor access - Corpsman # DeltaV - Add Corpsman access diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 259387b6d5c..4d48dab9925 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -1,4 +1,4 @@ -# If your species wants to metabolize stuff differently, +# If your species wants to metabolize stuff differently, # you'll likely have to tag its metabolizers with something other than Human. - type: metabolizerType @@ -44,3 +44,7 @@ - type: metabolizerType id: Arachnid name: arachnid + +- type: metabolizerType + id: Vampiric + name: vampiric diff --git a/Resources/Prototypes/Damage/containers.yml b/Resources/Prototypes/Damage/containers.yml index fb40e9b658f..b01d22df3b7 100644 --- a/Resources/Prototypes/Damage/containers.yml +++ b/Resources/Prototypes/Damage/containers.yml @@ -52,3 +52,13 @@ id: ShadowHaze supportedTypes: - Heat + +- type: damageContainer + id: HalfSpirit + supportedGroups: + - Burn + - Brute + - Airloss + - Immaterial + supportedTypes: + - Poison diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 31dd47a9e16..a6798e39cfe 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -336,3 +336,16 @@ flatReductions: # can't punch the endoskeleton to death Blunt: 5 + +- type: damageModifierSet + id: HalfSpirit + coefficients: + Cold: 0.5 + Shock: 0.75 + Blunt: 0.75 + Slash: 0.75 + Piercing: 0.75 + Heat: 1.25 + Holy: 1.5 + flatReductions: + Cold: 3 diff --git a/Resources/Prototypes/DeltaV/Access/justice.yml b/Resources/Prototypes/DeltaV/Access/justice.yml new file mode 100644 index 00000000000..33a2844ed20 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Access/justice.yml @@ -0,0 +1,20 @@ +- type: accessLevel + id: ChiefJustice + name: id-card-access-level-cj + +- type: accessLevel + id: Justice + name: id-card-access-level-justice + +- type: accessLevel + id: Prosecutor + name: id-card-access-level-prosecutor + +- type: accessGroup + id: Justice + tags: + - Justice + - Prosecutor + - ChiefJustice + - Lawyer + diff --git a/Resources/Prototypes/DeltaV/Access/misc.yml b/Resources/Prototypes/DeltaV/Access/misc.yml index df3f60a4f88..ad42935662b 100644 --- a/Resources/Prototypes/DeltaV/Access/misc.yml +++ b/Resources/Prototypes/DeltaV/Access/misc.yml @@ -47,3 +47,6 @@ - Musician - Reporter - Zookeeper + - Justice + - Prosecutor + diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml index 804a4727ee3..0fa57aa8803 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/general.yml @@ -16,3 +16,29 @@ whitelist: components: - EncryptionKey + +- type: entity + name: justice encryption key box + parent: BoxEncryptionKeyPassenger + id: BoxEncryptionKeyJustice + description: A box of spare encryption keys. + components: + - type: StorageFill + contents: + - id: EncryptionKeyJustice + amount: 4 + +#- type: entity +# name: syndicate radio implanter box +# parent: BoxCardboard +# id: BoxSyndicateRadioImplanter +# description: Contains cranial radio implants favored by Syndicate agents. +# components: +# - type: Sprite +# layers: +# - state: box_of_doom +# - state: implant +# - type: StorageFill +# contents: +# - id: SyndicateRadioImplanter +# amount: 2 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml index b6140daae59..b8aff63ece5 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Boxes/pda.yml @@ -74,3 +74,16 @@ amount: 1 - id: MailCarrierPDA amount: 1 + +- type: entity + name: justice PDA box + parent: BoxPDA + id: BoxPDAJustice + description: A box of spare PDA microcomputers for the justice department. + components: + - type: StorageFill + contents: + - id: LawyerPDA + amount: 2 + - id: ProsecutorPDA + - id: ClerkPDA diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml new file mode 100644 index 00000000000..0f7eb99d45d --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml @@ -0,0 +1,21 @@ +- type: entity + parent: LockerChiefJustice + id: LockerChiefJusticeFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: ClothingHeadsetAltJustice + - id: ClothingNeckCloakCJ + - id: ClothingUniformJumpsuitChiefJusticeFormal + - id: ClothingUniformJumpsuitChiefJusticeWhite + - id: PaperStationWarrant + amount: 10 + - id: BoxPDAJustice + - id: BoxEncryptionKeyJustice + - id: ChiefJusticeIDCard + - id: DoorRemoteJustice + - id: Gavel + - id: RubberStampChiefJustice + - id: LunchboxCommandFilledRandom # Delta-V Lunchboxes! + prob: 0.3 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml new file mode 100644 index 00000000000..9e48c28c706 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml @@ -0,0 +1,14 @@ +- type: entity + parent: LockerClerk + id: LockerClerkFilled + suffix: Filled + components: + - type: StorageFill + contents: + - id: ClothingOuterClerkVest + - id: PaperStationWarrant + amount: 10 + - id: BoxEncryptionKeyJustice + - id: ClerkIDCard + - id: RubberStampNotary + diff --git a/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml b/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml new file mode 100644 index 00000000000..34f213077c7 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml @@ -0,0 +1,5 @@ +- type: deviceFrequency + id: SurveillanceCameraJustice + name: device-frequency-prototype-name-surveillance-camera-justice + frequency: 1420 + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml index c65dd62312f..b32cab7b21a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Ears/headsets.yml @@ -42,6 +42,45 @@ sprite: DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi - type: Clothing sprite: DeltaV/Clothing/Ears/Headsets/syndicate_listening.rsi + +- type: entity + parent: ClothingHeadset + id: ClothingHeadsetJustice + name: justice headset + description: This is used by the justice department. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyJustice + - EncryptionKeyPrison + - EncryptionKeySecurity + - EncryptionKeyCommon + - type: Sprite + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + state: icon + - type: Clothing + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + +- type: entity + parent: ClothingHeadset + id: ClothingHeadsetAltJustice + name: chief justice's headset + description: The headset used by the chief justice. + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyJustice + - EncryptionKeyPrison + - EncryptionKeySecurity + - EncryptionKeyCommon + - EncryptionKeyCommand + - type: Sprite + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi + state: icon_alt + - type: Clothing + sprite: DeltaV/Clothing/Ears/Headsets/justice.rsi - type: entity parent: ClothingHeadset @@ -75,3 +114,4 @@ sprite: Clothing/Ears/Headsets/security.rsi - type: Clothing sprite: Clothing/Ears/Headsets/security.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml index 1c5cef39af1..bdb5ad85d9a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Head/hats.yml @@ -192,3 +192,15 @@ sprite: DeltaV/Clothing/Head/Hats/beret_corpsman.rsi - type: Clothing sprite: DeltaV/Clothing/Head/Hats/beret_corpsman.rsi + +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatCJToque + name: chief justice's toque + description: A standard-issue judicial hat. Wigs are old-fashioned anyway. + components: + - type: Sprite + sprite: DeltaV/Clothing/Head/Hats/cj_toque.rsi + - type: Clothing + sprite: DeltaV/Clothing/Head/Hats/cj_toque.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml index 5ff195cfda8..a5a9200b569 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/cloaks.yml @@ -31,3 +31,15 @@ sprite: DeltaV/Clothing/Neck/Cloaks/salvage.rsi - type: Clothing sprite: DeltaV/Clothing/Neck/Cloaks/salvage.rsi + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckCloakCJ + name: chief justice's cloak + description: A hefty cloak adorned with a modest insignia and grand fur trim. + components: + - type: Sprite + sprite: DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi + - type: StealTarget + stealGroup: HeadCloak + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml new file mode 100644 index 00000000000..7ec38bb1441 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml @@ -0,0 +1,13 @@ +- type: entity + parent: ClothingNeckBase + id: ClothingNeckProsecutorbadge + name: prosecutor badge + description: A badge to show that the owner is a 'legitimate' prosecutor who passed the NT bar exam required to practice law. + components: + - type: Sprite + sprite: DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi + - type: Clothing + sprite: DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi + - type: TypingIndicatorClothing + proto: lawyer + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml index e0a38b169f0..e0f3e7f298f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/coats.yml @@ -123,3 +123,17 @@ sprite: DeltaV/Clothing/OuterClothing/Coats/repcoat.rsi - type: TemperatureProtection coefficient: 0.1 + +- type: entity + parent: ClothingOuterStorageBase + id: ClothingOuterChiefJustice + name: chief justice's robes + description: Heavy black robes with magenta and gold trim. It smells old. + components: + - type: Sprite + sprite: DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi + - type: Clothing + sprite: DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi + - type: TemperatureProtection + coefficient: 0.1 + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml index cdc79584076..445158f89b8 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/OuterClothing/vests.yml @@ -37,3 +37,15 @@ Heat: 0.9 - type: ExplosionResistance damageCoefficient: 0.9 + +- type: entity + parent: ClothingOuterBase + id: ClothingOuterClerkVest + name: clerk's vest + description: a silken magenta vest with a pocket to put your notary stamp. + components: + - type: Sprite + sprite: DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi + - type: Clothing + sprite: DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml index 4c027637645..9e80bc4ff2f 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpskirts.yml @@ -93,3 +93,37 @@ sprite: DeltaV/Clothing/Uniforms/Jumpskirt/centcom_officer.rsi - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpskirt/centcom_officer.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtChiefJustice + name: chief justice's jumpskirt + description: A fancy black jumpskirt with a lace cravat to make it even more fancy. Proper judicial attire. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniform/Jumpskirt/cj.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtClerk + name: clerk's dress skirt + description: A modest dress skirt for the person with the power to notarize anything. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpskirtProsecutor + name: prosecutor's dress skirt + description: A red suit and skirt with a fancy cravat. Perfect for a prosecutor. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml index 8a0a500e6fa..9382502e740 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml @@ -244,6 +244,50 @@ - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/kilt.rsi +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJustice + name: chief justice's jumpsuit + description: A fancy black jumpsuit with a lace cravat to make it even more fancy. Proper judicial attire. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJusticeFormal + name: chief justice's formal jumpsuit + description: A fancy double-breasted suit with golden accoutrements. Sharp and authoritative. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitChiefJusticeWhite + name: chief justice's white jumpsuit + description: A modest, white office shirt with hard-earned rank epaulets. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitClerk + name: clerk's suit + description: A modest suit for the person with the power to notarize anything. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi + - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitChemShirt @@ -254,3 +298,15 @@ sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/chemshirtsuit.rsi + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformJumpsuitProsecutor + name: prosecutor's suit + description: A red suit with a fancy cravat. Perfect for a prosecutor. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi + diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml index e662ecca743..12747abbcfb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/jobs.yml @@ -13,3 +13,55 @@ state: medical - sprite: Mobs/Silicon/chassis.rsi state: medical_e + +- type: entity + id: SpawnPointChiefJustice + parent: SpawnPointJobBase + name: chiefjustice + components: + - type: SpawnPoint + job_id: ChiefJustice + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: chiefjustice + +- type: entity + id: SpawnPointClerk + parent: SpawnPointJobBase + name: clerk + components: + - type: SpawnPoint + job_id: Clerk + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: clerk + +- type: entity + id: SpawnPointProsecutor + parent: SpawnPointJobBase + name: prosecutor + components: + - type: SpawnPoint + job_id: Prosecutor + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: prosecutor + +- type: entity + id: SpawnPointCourier + parent: SpawnPointJobBase + name: courier + components: + - type: SpawnPoint + job_id: Courier + - type: Sprite + layers: + - state: green + - sprite: DeltaV/Markers/jobs.rsi + state: courier diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml new file mode 100644 index 00000000000..27fa0a36530 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml @@ -0,0 +1,15 @@ +- type: entity + parent: DoorRemoteDefault + id: DoorRemoteJustice + name: justice door remote + components: + - type: Sprite + layers: + - state: door_remotebase + - state: door_remotelightscolour + color: "#6b2833" + - state: door_remotescreencolour + color: "#6b2833" + - type: Access + groups: + - Justice diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml index c41c235c136..67b723e4310 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/encryption_keys.yml @@ -1,3 +1,19 @@ +- type: entity + parent: EncryptionKey + id: EncryptionKeyJustice + name: justice encryption key + description: An encryption key used by the justice department. + components: + - type: EncryptionKey + channels: + - Justice + defaultChannel: Justice + - type: Sprite + layers: + - state: crypt_gray + - sprite: DeltaV/Objects/Devices/encryption_keys.rsi + state: justice_label + - type: entity parent: EncryptionKey id: EncryptionKeyPrison diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml index d9607390cd7..d5f121bb0be 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/pda.yml @@ -41,6 +41,123 @@ scanningEndSound: path: "/Audio/Items/Medical/healthscanner.ogg" +- type: entity + parent: BasePDA + id: ChiefJusticePDA + name: chief justice PDA + description: Whosoever bears this PDA is the law. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ChiefJusticeIDCard + state: pda-chiefjustice + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#470823" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-chiefjustice + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + +- type: entity + parent: BasePDA + id: ClerkPDA + name: clerk PDA + description: It has the stamp to prove it's been officially notarized! + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ClerkIDCard + state: pda-clerk + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#611528" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-clerk + - type: CartridgeLoader + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + +- type: entity + parent: BasePDA + id: ProsecutorPDA + name: prosecutor PDA + description: Sharp. Looks like it could prosecute you all on its own. + components: + - type: Sprite + sprite: DeltaV/Objects/Devices/pda.rsi + layers: + - map: [ "enum.PdaVisualLayers.Base" ] + - state: "light_overlay" + map: [ "enum.PdaVisualLayers.Flashlight" ] + shader: "unshaded" + visible: false + - state: "id_overlay" + map: [ "enum.PdaVisualLayers.IdLight" ] + shader: "unshaded" + visible: false + - type: Pda + id: ProsecutorIDCard + state: pda-prosecutor + penSlot: + startingItem: LuxuryPen + priority: -1 + whitelist: + tags: + - Write + - type: PdaBorderColor + borderColor: "#6f6192" + - type: Icon + sprite: DeltaV/Objects/Devices/pda.rsi + state: pda-prosecutor + - type: CartridgeLoader # DeltaV - Crime Assist + preinstalled: + - CrewManifestCartridge + - NotekeeperCartridge + - NewsReaderCartridge + - CrimeAssistCartridge + - type: entity parent: SyndiPDA id: SyndiListeningPostPDA diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml index d1e26bf27fb..bd3975767ba 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Devices/station_beacon.yml @@ -134,3 +134,28 @@ components: - type: NavMapBeacon text: station-beacon-corpsman + +#Justice +- type: entity + parent: DefaultStationBeacon + id: DefaultStationBeaconJustice + suffix: Justice + components: + - type: NavMapBeacon + text: station-beacon-justice + +- type: entity + parent: DefaultStationBeaconJustice + id: DefaultStationBeaconChiefJustice + suffix: Chief Justice + components: + - type: NavMapBeacon + text: station-beacon-chiefjustice + +- type: entity + parent: DefaultStationBeaconJustice + id: DefaultStationBeaconProsecutor + suffix: Prosecutor + components: + - type: NavMapBeacon + text: station-beacon-prosecutor diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml new file mode 100644 index 00000000000..53f4d188d40 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml @@ -0,0 +1,25 @@ +- type: entity + name: station warrant + parent: Paper + id: PaperStationWarrant + description: 'A paper warrant issued by the justice department.' + components: + - type: Sprite + sprite: Objects/Misc/bureaucracy.rsi + layers: + - state: paper + color: "#e0bc99" + - state: paper_words + map: ["enum.PaperVisualLayers.Writing"] + color: "#e0bc99" + visible: false + - state: paper_stamp-generic + map: ["enum.PaperVisualLayers.Stamp"] + visible: false + - type: PaperVisuals + headerImagePath: "/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png" + headerMargin: 0.0, 0.0, 10.0, 16.0 + backgroundImagePath: "/Textures/Interface/Paper/paper_background_default.svg.96dpi.png" + backgroundModulate: "#e0bc99" + backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0 + contentMargin: 32.0, 16.0, 32.0, 0.0 diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml index 2494de534e4..764d053393e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Misc/rubber_stamp.yml @@ -25,3 +25,33 @@ - type: Sprite sprite: DeltaV/Objects/Misc/stamps.rsi state: stamp-lawyer + +- type: entity + name: notary stamp + parent: RubberStampBase + id: RubberStampNotary + description: An old-fashioned seal for marking important documents, made of polished bronze. + components: + - type: Stamp + stampedName: stamp-component-stamped-name-notary + stampedColor: "#a81f3d" + stampState: "paper_stamp-notary" + - type: Sprite + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-notary + - type: StealTarget + stealGroup: RubberStampNotary + +- type: entity + name: chief justice stamp + parent: RubberStampBase + id: RubberStampChiefJustice + components: + - type: Stamp + stampedName: stamp-component-stamped-name-chiefjustice + stampedColor: "#6b2833" + stampState: "paper_stamp-notary" + - type: Sprite + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-cj + diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml new file mode 100644 index 00000000000..52f5286e34a --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml @@ -0,0 +1,21 @@ +- type: entity + parent: BaseItem + id: Gavel + name: gavel + description: A hardwood mallet made to keep order in the court. + components: + - type: Sprite + sprite: DeltaV/Objects/Specific/Justice/gavel.rsi + layers: + - state: icon + - type: MeleeWeapon + wideAnimationRotation: -90 + damage: + types: + Blunt: 2 + - type: Item + size: Small + sprite: DeltaV/Objects/Specific/Justice/gavel.rsi + - type: Tag + tags: + - Gavel diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml new file mode 100644 index 00000000000..a74ae7a9ff7 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml @@ -0,0 +1,19 @@ +- type: entity + parent: BaseItem + id: GavelBlock + name: gavel block + description: A hardwood block that, when hit with a gavel, emits an aura of authority. + components: + - type: Sprite + sprite: DeltaV/Objects/Specific/Justice/gavelblock.rsi + layers: + - state: icon + - type: Item + size: Small + - type: Clickable + - type: EmitSoundOnInteractUsing + sound: + path: /Audio/DeltaV/Items/gavel.ogg + whitelist: + tags: + - Gavel diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml new file mode 100644 index 00000000000..3e847b3a843 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml @@ -0,0 +1,24 @@ +- type: entity + id: TrialTimer + parent: SignalTimer + name: trial timer + description: A fancy timer with a screen, designed to keep trials within their time limit. + components: + - type: SignalTimer + canEditLabel: true + - type: TextScreenVisuals + color: "#b03060" + textOffset: 1,8 + timerOffset: 1,8 + textLength: 5 + rows: 1 + - type: Sprite + drawdepth: SmallObjects + sprite: DeltaV/Objects/Specific/Justice/trialtimer.rsi + state: trialtimer + noRot: true + - type: Construction + graph: Timer + node: screen + + diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml index fc9f2902ad0..f6e7bcf2577 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/access.yml @@ -15,6 +15,88 @@ - type: AccessReader access: [["Mantis"]] +- type: entity + parent: AirlockCommand + id: AirlockChiefJusticeLocked + suffix: Chief Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockCommandGlass + id: AirlockChiefJusticeGlassLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockJustice + id: AirlockJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockJusticeGlass + id: AirlockJusticeGlassLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockJustice + id: AirlockProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +- type: entity + parent: AirlockJusticeGlass + id: AirlockProsecutorGlassLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +# Maintenance +- type: entity + parent: AirlockMaint + id: AirlockMaintChiefJusticeLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: AirlockMaint + id: AirlockMaintJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: AirlockMaint + id: AirlockMaintProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + - type: entity parent: AirlockSecurity id: AirlockCorpsmanLocked diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml new file mode 100644 index 00000000000..93a8cec851a --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -0,0 +1,22 @@ +- type: entity + parent: Airlock + id: AirlockJustice + suffix: Justice + components: + - type: Sprite + sprite: DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi + - type: PaintableAirlock + department: Justice + +# Glass + +- type: entity + parent: AirlockGlass + id: AirlockJusticeGlass + suffix: Justice + components: + - type: Sprite + sprite: DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi + - type: PaintableAirlock + department: Justice + diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml index d27a8d8e70e..07938a3bf3c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Doors/Windoors/windoor.yml @@ -21,3 +21,39 @@ components: - type: AccessReader access: [["Paramedic"]] + +- type: entity + parent: WindoorSecure + id: WindoorSecureChiefJusticeLocked + suffix: ChiefJustice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsChiefJustice ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureJusticeLocked + suffix: Justice, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsJustice ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureProsecutorLocked + suffix: Prosecutor, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsProsecutor ] + +- type: entity + parent: WindoorSecure + id: WindoorSecureLawyerLocked + suffix: Lawyer, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsLawyer ] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml new file mode 100644 index 00000000000..b49002ab22b --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -0,0 +1,25 @@ +- type: entity + id: LockerChiefJustice + parent: LockerBaseSecure + name: chief justice's locker + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: cj + stateDoorOpen: cj_open + stateDoorClosed: cj_door + - type: AccessReader + access: [["ChiefJustice"]] + +- type: entity + id: LockerClerk + parent: LockerBaseSecure + name: clerk's locker + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: clerk + stateDoorOpen: clerk_open + stateDoorClosed: clerk_door + - type: AccessReader + access: [["Justice"]] diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml index 6129ff6c413..3b5329e230c 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml @@ -17,3 +17,25 @@ - type: Sprite sprite: DeltaV/Structures/Wallmounts/signs.rsi state: direction_mail + +- type: entity + parent: BaseSignDirectional + id: SignDirectionalJustice + name: justice department sign + description: A direction sign, pointing out which way the Justice department is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_justice + +- type: entity + parent: BaseSignDirectional + id: SignDirectionaCourt + name: court room sign + description: A direction sign, pointing out which way the court room is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_court + + diff --git a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml index cf7d4f90d68..b3113308735 100644 --- a/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/DeltaV/Objectives/stealTargetGroups.yml @@ -18,3 +18,12 @@ sprite: sprite: DeltaV/Objects/Weapons/Guns/Battery/multiphase_energygun.rsi state: base + +- type: stealTargetGroup + id: RubberStampNotary + name: notary stamp + sprite: + sprite: DeltaV/Objects/Misc/stamps.rsi + state: stamp-notary + + diff --git a/Resources/Prototypes/DeltaV/Objectives/traitor.yml b/Resources/Prototypes/DeltaV/Objectives/traitor.yml index 4fa25f26987..d27ec220fa4 100644 --- a/Resources/Prototypes/DeltaV/Objectives/traitor.yml +++ b/Resources/Prototypes/DeltaV/Objectives/traitor.yml @@ -32,3 +32,16 @@ - type: StealCondition stealGroup: WeaponEnergyGunMultiphase owner: job-name-hos + +- type: entity # Clerk steal objective. + noSpawn: true + parent: BaseTraitorStealObjective + id: ClerkNotaryStealObjective + components: + - type: NotJobRequirement + job: Clerk + - type: StealCondition + stealGroup: RubberStampNotary + owner: job-name-clerk + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml new file mode 100644 index 00000000000..2a879472e8c --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml @@ -0,0 +1,59 @@ +- type: job + id: ChiefJustice + name: job-name-chief-justice + description: job-description-chief-justice + playTimeTracker: JobChiefJustice + requirements: + - !type:CharacterPlaytimeRequirement + tracker: JobClerk + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobLawyer + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobProsecutor + min: 36000 # 10 hours + - !type:CharacterOverallTimeRequirement + min: 90000 # 25 hours + - !type:WhitelistRequirement # whitelist requirement because I don't want any dingus judges + weight: 20 + startingGear: CJGear + icon: "JobIconChiefJustice" + requireAdminNotify: true + supervisors: job-supervisors-captain + canBeAntag: false + access: + - Command + - ChiefJustice + - Justice + - Security + - Maintenance + - External + special: + - !type:AddImplantSpecial + implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CommandStaff + - !type:AddComponentSpecial + components: + - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. + flatBonus: 0.025 + +- type: startingGear + id: CJGear + equipment: + jumpsuit: ClothingUniformJumpsuitChiefJustice + back: ClothingBackpackFilled # TODO- make Justice department bags + shoes: ClothingShoesLeather + head: ClothingHeadHatCJToque + outerClothing: ClothingOuterChiefJustice + id: ChiefJusticePDA + ears: ClothingHeadsetAltJustice + gloves: ClothingHandsGlovesColorWhite + # Todo - pocket1: Gavel + innerClothingSkirt: ClothingUniformJumpskirtChiefJustice + satchel: ClothingBackpackSatchelFilled # TODO- make Justice departmebt bags + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml new file mode 100644 index 00000000000..c2032b67ebe --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml @@ -0,0 +1,41 @@ +- type: job + id: Clerk + name: job-name-clerk + description: job-description-clerk + playTimeTracker: JobClerk + antagAdvantage: 2 + requirements: + - !type:CharacterDepartmentTimeRequirement + department: Security + min: 36000 # 10 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobLawyer + min: 36000 # 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobProsecutor + min: 36000 # 10 hours + + + startingGear: ClerkGear + icon: "JobIconClerk" + requireAdminNotify: true + supervisors: job-supervisors-cj + canBeAntag: false + access: + - Justice + - Security + - Maintenance + +- type: startingGear + id: ClerkGear + equipment: + jumpsuit: ClothingUniformJumpsuitClerk + back: ClothingBackpackFilled + shoes: ClothingShoesBootsLaceup + id: ClerkPDA + ears: ClothingHeadsetJustice + innerClothingSkirt: ClothingUniformJumpskirtClerk + satchel: ClothingBackpackSatchelFilled + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml new file mode 100644 index 00000000000..e0cebc4417a --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml @@ -0,0 +1,34 @@ +- type: job + id: Prosecutor + name: job-name-prosecutor + description: job-description-prosecutor + playTimeTracker: JobProsecutor + requirements: + - !type:CharacterOverallTimeRequirement + min: 36000 # 10 hrs + startingGear: ProsecutorGear + icon: "JobIconProsecutor" + supervisors: job-supervisors-cj + access: + - Prosecutor + - Justice + - Security + - Maintenance + +- type: startingGear + id: ProsecutorGear + equipment: + jumpsuit: ClothingUniformJumpsuitProsecutor + neck: ClothingNeckProsecutorbadge + back: ClothingBackpackLawyerFilled + shoes: ClothingShoesBootsLaceup + id: ProsecutorPDA + ears: ClothingHeadsetSecurity + # TODO add copy of space law + inhand: + - BriefcaseBrownFilled + innerClothingSkirt: ClothingUniformJumpskirtProsecutor + satchel: ClothingBackpackSatchelFilled + duffelbag: ClothingBackpackDuffelFilled + + diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml index 66709f62766..681cb95be71 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml @@ -26,6 +26,9 @@ special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: CorpsmanGear # see Prototypes/Roles/Jobs/Fun/misc_startinggear.yml for "BrigmedicGear" diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml new file mode 100644 index 00000000000..c4d5fbfe20d --- /dev/null +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml @@ -0,0 +1,11 @@ +- type: department + id: Justice + description: department-justice-description + color: "#701442" + roles: + - ChiefJustice + - Clerk + - Prosecutor + - Lawyer + + diff --git a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml index d3b983f01cd..4ab6f3eed45 100644 --- a/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/DeltaV/Roles/play_time_trackers.yml @@ -3,3 +3,6 @@ - type: playTimeTracker id: JobMedicalBorg + +- type: playTimeTracker + id: JobCourier diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml index 8a3cd4c47ce..e139279dd5c 100644 --- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml @@ -62,9 +62,6 @@ points: 1 required: true defaultMarkings: [ VulpEar ] - Overlay: - points: 2 - required: false - type: humanoidBaseSprite id: MobVulpkaninHead diff --git a/Resources/Prototypes/DeltaV/StatusEffects/job.yml b/Resources/Prototypes/DeltaV/StatusEffects/job.yml index 949ac6a99e3..894e1586b40 100644 --- a/Resources/Prototypes/DeltaV/StatusEffects/job.yml +++ b/Resources/Prototypes/DeltaV/StatusEffects/job.yml @@ -4,3 +4,24 @@ icon: sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi state: MedicalBorg + +- type: statusIcon + parent: JobIcon + id: JobIconChiefJustice + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: ChiefJustice + +- type: statusIcon + parent: JobIcon + id: JobIconClerk + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: Clerk + +- type: statusIcon + parent: JobIcon + id: JobIconProsecutor + icon: + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi + state: Prosecutor #need prosecutor diff --git a/Resources/Prototypes/DeltaV/radio_channels.yml b/Resources/Prototypes/DeltaV/radio_channels.yml index 639eea09b3a..53490d90fac 100644 --- a/Resources/Prototypes/DeltaV/radio_channels.yml +++ b/Resources/Prototypes/DeltaV/radio_channels.yml @@ -1,6 +1,15 @@ +- type: radioChannel + id: Justice + name: chat-radio-justice + keycode: "j" + frequency: 1420 + color: "#701442" + - type: radioChannel id: Prison name: chat-radio-prison keycode: 'p' frequency: 1601 - color: "#FFA500" \ No newline at end of file + color: "#FFA500" + + diff --git a/Resources/Prototypes/DeltaV/tags.yml b/Resources/Prototypes/DeltaV/tags.yml index 6a1efcfa695..36ea3e56a4e 100644 --- a/Resources/Prototypes/DeltaV/tags.yml +++ b/Resources/Prototypes/DeltaV/tags.yml @@ -15,6 +15,12 @@ - type: Tag id: ForensicBeltEquip +- type: Tag + id: Gavel + +- type: Tag + id: GasPipeHalf #Craftable Musket + - type: Tag id: HandLabeler diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index a1a77f447db..a48082b9c15 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -146,6 +146,9 @@ Radiation: 0 Caustic: 0.75 - type: GroupExamine + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterArmorHeavy @@ -242,6 +245,9 @@ - type: ExplosionResistance damageCoefficient: 0.5 - type: GroupExamine + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 8f4312e7711..d6a2cd446be 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -138,9 +138,12 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - FullBodyOuter - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index e0d8e7290da..70ab3016469 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -100,6 +100,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineering + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Spationaut Hardsuit - type: entity @@ -221,6 +223,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurity + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Brigmedic Hardsuit - type: entity @@ -248,6 +252,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Warden's Hardsuit - type: entity @@ -278,6 +284,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWarden + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Captain's Hardsuit - type: entity @@ -310,6 +318,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCap + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Chief Engineer's Hardsuit - type: entity @@ -345,6 +355,8 @@ - type: ClothingGrantComponent component: - type: SupermatterImmune + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Chief Medical Officer's Hardsuit - type: entity @@ -412,6 +424,8 @@ price: 750 - type: StealTarget stealGroup: ClothingOuterHardsuitRd + - type: StaminaDamageResistance + coefficient: 0.75 # 25% as in "shock resistance" :trollface: #Head of Security's Hardsuit - type: entity @@ -443,6 +457,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Luxury Mining Hardsuit - type: entity @@ -520,6 +536,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% # Syndicate Medic Hardsuit - type: entity @@ -539,6 +557,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Elite Hardsuit - type: entity @@ -575,6 +595,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Commander Hardsuit - type: entity @@ -607,6 +629,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Cybersun Juggernaut Hardsuit - type: entity @@ -639,6 +663,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCybersun + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Wizard Hardsuit - type: entity @@ -671,6 +697,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWizard + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Ling Space Suit - type: entity @@ -766,6 +794,8 @@ clothingPrototype: ClothingHeadHelmetHardsuitPirateCap - type: StaticPrice price: 0 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #CENTCOMM / ERT HARDSUITS #ERT Leader Hardsuit @@ -781,6 +811,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTLeader + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Chaplain Hardsuit - type: entity @@ -795,6 +827,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertchaplain.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTChaplain + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Engineer Hardsuit - type: entity @@ -809,6 +843,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Medic Hardsuit - type: entity @@ -823,6 +859,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTMedical + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Security Hardsuit - type: entity @@ -841,6 +879,8 @@ tags: - Hardsuit - WhitelistChameleon + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Janitor Hardsuit - type: entity @@ -855,6 +895,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTJanitor + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Deathsquad - type: entity @@ -889,6 +931,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad + - type: StaminaDamageResistance + coefficient: 0.1 # 90% #CBURN Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index d6cd5295731..9f0a01cc481 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -25,6 +25,7 @@ tags: - Hardsuit - WhitelistChameleon + - FullBodyOuter - HidesHarpyWings - type: entity @@ -38,6 +39,17 @@ sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi + - type: ClothingSpeedModifier + walkModifier: 0.8 + sprintModifier: 0.8 + - type: ExplosionResistance + damageCoefficient: 0.15 + - type: GroupExamine + - type: Tag + tags: + - Hardsuit + - WhitelistChameleon + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge @@ -97,6 +109,7 @@ - type: GroupExamine - type: Tag tags: + - FullBodyOuter - WhitelistChameleon - HidesHarpyWings @@ -124,6 +137,7 @@ toggleable-clothing: !type:ContainerSlot {} - type: Tag tags: + - FullBodyOuter - WhitelistChameleon - HidesHarpyWings @@ -177,6 +191,9 @@ sprite: Clothing/OuterClothing/Suits/chicken.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/chicken.rsi + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBase @@ -202,6 +219,9 @@ - type: ContainerContainer containers: toggleable-clothing: !type:ContainerSlot {} + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBase diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml new file mode 100644 index 00000000000..bebf42f31ba --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml @@ -0,0 +1,35 @@ +- type: entity + save: false + name: Urist McArachne + parent: MobArachneBase + id: MobArachne + components: + - type: CombatMode + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: MindContainer + showExamineInfo: true + - type: Input + context: "human" + - type: MobMover + - type: InputMover + - type: Respirator + damage: + types: + Asphyxiation: 1.0 + damageRecovery: + types: + Asphyxiation: -1.0 + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen + - type: PotentialPsionic diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml new file mode 100644 index 00000000000..2f6437dc14e --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml @@ -0,0 +1,220 @@ +- type: entity + save: false + name: Urist McArachne + parent: BaseMobHuman + id: MobArachneBase + abstract: true + components: + - type: Sprite + # Arachne are one of the species that needs a manual visual layers setup. + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - map: [ "clownedon" ] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false + - type: HumanoidAppearance + species: Arachne + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.40 + density: 140 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Body + prototype: Arachne + requiredLegs: 8 + - type: Speech + speechSounds: Alto + - type: Inventory + templateId: anytaur + - type: Tag + tags: + - CanPilot + - ShoesRequiredStepTriggerImmune + - DoorBumpOpener + - type: Bloodstream + bloodReagent: DemonsBlood + - type: BloodSucker + webRequired: true + - type: Arachne + - type: DamageVisuals + thresholds: [ 20, 40, 100 ] + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.RArm" + - type: MovedByPressure + pressureResistance: 4 + - type: Barotrauma + damage: + types: + Blunt: 0.05 #per second, scales with pressure and other constants. Reduced Damage. This allows medicine to heal faster than damage. + - type: MovementAlwaysTouching + - type: MovementSpeedModifier + baseWalkSpeed : 3.0 + baseSprintSpeed : 5.0 + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Generic_mob_burning + alternateState: arachne_standing + fireStackAlternateState: 3 + - type: Spider + - type: IgnoreSpiderWeb + +- type: entity + save: false + name: Urist McHands + parent: MobHumanDummy + id: MobArachneDummy + noSpawn: true + description: A dummy arachne meant to be used in character setup. + components: + - type: Sprite + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - type: Inventory + templateId: anytaur + - type: HumanoidAppearance + species: Arachne diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index e3944296ea7..b7934160641 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -294,3 +294,27 @@ components: - type: AccessReader access: [["Research"], ["Medical"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsChiefJustice + suffix: ChiefJustice, Locked + components: + - type: AccessReader + access: [["ChiefJustice"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsJustice + suffix: Justice, Locked + components: + - type: AccessReader + access: [["Justice"]] + +- type: entity + parent: DoorElectronics + id: DoorElectronicsProsecutor + suffix: Prosecutor, Locked + components: + - type: AccessReader + access: [["Prosecutor"]] \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index d270c93e50a..49ef98d7690 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -67,6 +67,7 @@ - Common - Command - Engineering + - Justice # Delta V- adds Justice department - Medical - Science - Security diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 0f68afefe69..2c28f60da58 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -151,6 +151,12 @@ - type: Pda id: MedicalInternIDCard state: pda-internmed + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#717059" accentVColor: "#447987" @@ -534,6 +540,12 @@ - type: Pda id: CMOIDCard state: pda-cmo + penSlot: # Fancy Pen Light + startingItem: CMOPenLight + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -550,6 +562,12 @@ - type: Pda id: MedicalIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -568,6 +586,12 @@ - type: Pda id: ParamedicIDCard state: pda-paramedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#2a4b5b" @@ -583,6 +607,12 @@ - type: Pda id: ChemistIDCard state: pda-chemistry + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#B34200" @@ -917,6 +947,12 @@ - type: Pda id: PsychologistIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -1002,6 +1038,12 @@ - type: Pda id: BrigmedicIDCard state: pda-brigmedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#A32D26" accentHColor: "#d7d7d0" @@ -1079,6 +1121,12 @@ - type: Pda id: SeniorPhysicianIDCard state: pda-seniorphysician + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -1129,6 +1177,12 @@ - type: Pda id: SyndicateIDCard state: pda-syndi-agent + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#891417" - type: Icon diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index f797ad5cead..7041be7b206 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -449,7 +449,7 @@ - type: entity parent: IDCardStandard id: LawyerIDCard - name: lawyer ID card + name: attorney ID card # DeltaV - Changed Lawyer to Attorney components: - type: Sprite layers: @@ -462,6 +462,55 @@ - type: PresetIdCard job: Lawyer +- type: entity + parent: IDCardStandard + id: ChiefJusticeIDCard + name: chief justice ID card + components: + - type: PresetIdCard + job: ChiefJustice + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + + +- type: entity + parent: IDCardStandard + id: ClerkIDCard + name: clerk ID card + components: + - type: PresetIdCard + job: Clerk + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + +- type: entity + parent: IDCardStandard + id: ProsecutorIDCard + name: presecutor ID card + components: + - type: PresetIdCard + job: Prosecutor + - type: Sprite + layers: + - state: default + - state: department + color: "#878787" + - state: subdepartment + color: "#CB0000" + - state: lawyer + - type: entity parent: IDCardStandard id: HoPIDCard @@ -822,6 +871,9 @@ - JobIconMartialArtist # Nyanotrasen - MartialArtist, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml - JobIconGladiator # Nyanotrasen - Gladiator, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml - JobIconForensicMantis # Nyanotrasen - ForensicMantis, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml + - JobIconClerk # Delta V - Added justice dept + - JobIconChiefJustice # Delta V - Added justice dept + - JobIconProsecutor # Delta V - Added justice dept - JobIconVisitor - type: ActivatableUI key: enum.AgentIDCardUiKey.Key @@ -1084,3 +1136,4 @@ - state: senior - type: PresetIdCard job: SeniorOfficer + diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index d37523bd735..a7cf7ad5c80 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -210,6 +210,34 @@ - Crowbar - RadioHandheld +- type: entity + id: BorgModuleJetpack + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: jetpack cyborg module + description: A piece of tech that gives cyborgs new abilities. Needs to be loaded by a cyborg before you can refill the jetpack. + components: + - type: Sprite + layers: + - state: cargo + - state: icon-jetpack + - type: BorgJetpack + - type: ItemBorgModule + items: + - JetpackMicroFilled + +- type: entity + id: BorgModulePka + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: proto kinetic accelerator cyborg module + components: + - type: Sprite + layers: + - state: cargo + - state: icon-pka + - type: ItemBorgModule + items: + - WeaponProtoKineticAccelerator + - type: entity id: BorgModuleGrapplingGun parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 16be537891f..9504ec144a8 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -58,6 +58,9 @@ - Service - Theatre - Zookeeper #Delta V: Add Zookeeper Access + - ChiefJustice #Delta V: Add Chief Justice Access + - Prosecutor #Delta V: Add Prosecutor Access + - Justice #Delta V: Add Justice Access privilegedIdSlot: name: id-card-console-privileged-id ejectSound: /Audio/Machines/id_swipe.ogg diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index d0ac9c7a78a..a4c103847fe 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -295,3 +295,43 @@ moles: - 1.025689525 # oxygen - 1.025689525 # nitrogen + +#Empty micro - Used in the Cyborg module, visually the same as mini jetpack. +- type: entity + id: JetpackMicro + parent: BaseJetpack + name: micro jetpack + suffix: Empty + components: + - type: Item + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Sprite + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Clothing + sprite: Objects/Tanks/Jetpacks/mini.rsi + slots: + - Back + - suitStorage + - Belt + - type: GasTank + outputPressure: 42.6 + air: + volume: 0.75 + + +# Filled micro +- type: entity + id: JetpackMicroFilled + parent: JetpackMicro + name: micro jetpack + suffix: Filled + components: + - type: GasTank + outputPressure: 42.6 + air: + # 2 minutes of thrust + volume: 0.75 + temperature: 293.15 + moles: + - 0.153853429 # oxygen + - 0.153853429 # nitrogen diff --git a/Resources/Prototypes/Entities/Objects/Tools/penlight.yml b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml new file mode 100644 index 00000000000..7f8a9b262c0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml @@ -0,0 +1,90 @@ +- type: entity + name: Pen Light + parent: Pen + id: PenLightBase + description: A pen-sized light, used by medical staff. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/penlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/penlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 3 #time in seconds + - type: Appearance + - type: UserInterface + interfaces: + - key: enum.PenLightUiKey.Key + type: PenLightBoundUserInterface + - type: ToggleableLightVisuals + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot {} + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen + +- type: entity + name: Chief Medical Officer's Pen Light + parent: PenLightBase + id: CMOPenLight + description: A pen-sized light, this one belonging to the Chief Medical Officer. When you get promoted you get a better pen. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/cmopenlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/cmopenlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 1.5 #time in seconds + - type: Appearance + - type: ToggleableLightVisuals + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 1cad73e30ea..f25023b4541 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -314,7 +314,7 @@ sprite: Objects/Weapons/Grenades/empgrenade.rsi - type: EmpOnTrigger range: 4 - energyConsumption: 50000 + energyConsumption: 2700000 - type: DeleteOnTrigger - type: Appearance - type: TimerTriggerVisuals diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 23943307ad9..f12bd2b553e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -11,7 +11,7 @@ layoutId: AirlockService - type: entity - parent: AirlockServiceLocked + parent: AirlockJustice # DeltaV - Lawyer is in Justice Dept id: AirlockLawyerLocked suffix: Lawyer, Locked components: @@ -421,8 +421,8 @@ layoutId: AirlockService - type: entity - parent: AirlockServiceGlassLocked - id: AirlockLawyerGlassLocked + parent: AirlockJusticeGlass + id: AirlockLawyerGlassLocked # DeltaV - Lawyer is in Justice Dept suffix: Lawyer, Locked components: - type: ContainerFill diff --git a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml index dfb37f49869..2cb30277d20 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/airlock_groups.yml @@ -13,6 +13,7 @@ science: Structures/Doors/Airlocks/Standard/science.rsi security: Structures/Doors/Airlocks/Standard/security.rsi virology: Structures/Doors/Airlocks/Standard/virology.rsi + justice: DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi # Delta V - Add Justice Dept - type: AirlockGroup id: Glass @@ -28,6 +29,7 @@ medical: Structures/Doors/Airlocks/Glass/medical.rsi security: Structures/Doors/Airlocks/Glass/security.rsi virology: Structures/Doors/Airlocks/Glass/virology.rsi + justice: DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi # Delta V - Add Justice Dept - type: AirlockGroup id: Windoor diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 5d727207fe6..7e861db0d5a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -594,6 +594,8 @@ - BorgModuleAdvancedTool - BorgModuleGPS - BorgModuleRCD + - BorgModuleJetpack + - BorgModulePka - BorgModuleArtifact - BorgModuleAnomaly - BorgModuleGardening diff --git a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml index 6cc1fc79814..2a7d827522e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml @@ -80,3 +80,85 @@ - EncryptionKeySecurity - EncryptionKeyService - EncryptionKeyCommand + - EncryptionKeyJustice #DeltaV - Justice dept + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCommon + suffix: Common + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCommon + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCargo + suffix: Cargo + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCargo + +- type: entity + parent: TelecomServer + id: TelecomServerFilledEngineering + suffix: Engineering + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyEngineering + +- type: entity + parent: TelecomServer + id: TelecomServerFilledMedical + suffix: Medical + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyMedical + +- type: entity + parent: TelecomServer + id: TelecomServerFilledScience + suffix: Science + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyScience + +- type: entity + parent: TelecomServer + id: TelecomServerFilledSecurity + suffix: Security + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeySecurity + - EncryptionKeyJustice #DeltaV - Justice dept + +- type: entity + parent: TelecomServer + id: TelecomServerFilledService + suffix: Service + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyService + +- type: entity + parent: TelecomServer + id: TelecomServerFilledCommand + suffix: Command + components: + - type: ContainerFill + containers: + key_slots: + - EncryptionKeyCommand diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index cd44f5f585a..52b008c7f2c 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -98,6 +98,7 @@ whitelist: components: - GasTank + - BorgJetpack - type: StaticPrice price: 1000 - type: AccessReader diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 7863224436c..ca885117449 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -413,6 +413,22 @@ # - id: MobClownSpider # prob: 0.05 +- type: entity + id: OneirophageSpawn + parent: BaseGameRule + noSpawn: true + components: + - type: StationEvent + id: VentCritters + earliestStart: 15 + minimumPlayers: 15 + weight: 4 + duration: 60 + - type: VentCrittersRule + entries: + - id: MobGiantSpiderVampireAngry + prob: 0.01 + - type: entity id: ZombieOutbreak parent: BaseGameRule diff --git a/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml new file mode 100644 index 00000000000..0dd5961aef3 --- /dev/null +++ b/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml @@ -0,0 +1,112 @@ +- type: inventoryTemplate + id: anytaur + slots: + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 5 + uiWindowPos: 0,2 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + slotGroup: MainHotbar + stripTime: 6 + uiWindowPos: 1,2 + strippingWindowPos: 1,2 + displayName: Suit + blacklist: + tags: + - FullBodyOuter + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,2 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,1 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,1 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 2 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 2 + uiWindowPos: 2,0 + strippingWindowPos: 2,1 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,0 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 2 + uiWindowPos: 0,3 + strippingWindowPos: 0,3 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 2 + uiWindowPos: 2,3 + strippingWindowPos: 2,3 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + stripTime: 2 + uiWindowPos: 2,0 + strippingWindowPos: 2,0 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 5 + uiWindowPos: 3,1 + strippingWindowPos: 1,3 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 5 + uiWindowPos: 3,0 + strippingWindowPos: 0,4 + displayName: Back diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml new file mode 100644 index 00000000000..23934b3ebcc --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml @@ -0,0 +1,22 @@ +- type: entity + id: OrganVampiricHumanoidStomach + parent: OrganHumanStomach + components: + - type: Metabolizer + # mm yummy + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganVampiricStomach + parent: OrganAnimalStomach + components: + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml index a900f7524e7..7e71227dbcb 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml @@ -24,13 +24,33 @@ - ReagentId: DemonsBlood Quantity: 10 +- type: entity + id: ThoraxSpider + name: "spider thorax" #for arachne, actual spiders should get a cephalothorax that combines with head. + parent: PartSpider + components: + - type: Sprite + sprite: Mobs/Species/Moth/parts.rsi # placeholder sprite + state: "torso_m" + - type: Icon + sprite: Mobs/Species/Moth/parts.rsi + state: "torso_m" + - type: BodyPart #"Other" type + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: DemonsBlood + Quantity: 20 + - type: entity id: RightLegSpider name: "right spider leg" parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi @@ -48,7 +68,7 @@ parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml new file mode 100644 index 00000000000..553391484e2 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml @@ -0,0 +1,63 @@ +- type: body + id: Arachne + name: "arachne" + root: torso + slots: + head: + part: HeadHuman + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes + torso: + part: TorsoHuman + connections: + - left arm + - right arm + - thorax + organs: + heart: OrganHumanHeart + lungs: OrganHumanLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganHumanLiver + kidneys: OrganHumanKidneys + right arm: + part: RightArmHuman + connections: + - right hand + left arm: + part: LeftArmHuman + connections: + - left hand + right hand: + part: RightHandHuman + left hand: + part: LeftHandHuman + thorax: + part: ThoraxSpider + connections: + - left foreleg + - left second leg + - left third leg + - left hind leg + - right foreleg + - right second leg + - right third leg + - right hind leg + left foreleg: + part: LeftLegSpider + left second leg: + part: LeftLegSpider + left third leg: + part: LeftLegSpider + left hind leg: + part: LeftLegSpider + right foreleg: + part: RightLegSpider + right second leg: + part: RightLegSpider + right third leg: + part: RightLegSpider + right hind leg: + part: RightLegSpider diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml new file mode 100644 index 00000000000..3f4cdb06de1 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml @@ -0,0 +1,43 @@ +- type: body + id: VampiricAnimal + name: "vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal + +- type: body + id: VampiricAnimalLarge + name: "large vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml index 2652a89127e..046a324e6f6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml @@ -51,23 +51,23 @@ - state: prisoner # - type: MidRoundAntagSpawnLocation # When MidRoundAntag? -# - type: entity -# id: SpawnPointGhostVampSpider -# name: ghost role spawn point -# suffix: Vampire spider -# parent: MarkerBase -# noSpawn: true -# components: -# - type: GhostRoleMobSpawner -# prototype: MobGiantSpiderVampireAngry -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: Sprite -# sprite: Markers/jobs.rsi -# layers: -# - state: green -# - sprite: Mobs/Animals/bat.rsi -# state: bat +- type: entity + id: SpawnPointGhostVampSpider + name: ghost role spawn point + suffix: Vampire spider + parent: MarkerBase + noSpawn: true + components: + - type: GhostRoleMobSpawner + prototype: MobGiantSpiderVampireAngry + - type: GhostRole + makeSentient: true + name: ghost-role-information-giant-spider-vampire-name + description: ghost-role-information-giant-spider-vampire-description + rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Animals/bat.rsi + state: bat diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index 5daf2e15e56..462b3254f1e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -70,143 +70,130 @@ - type: Produce - type: NoSlip -# - type: entity -# name: oneirophage -# parent: SimpleMobBase -# id: MobGiantSpiderVampire -# description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. -# components: -# - type: Sprite -# drawdepth: Mobs -# layers: -# - map: ["enum.DamageStateVisualLayers.Base"] -# state: viper -# sprite: Mobs/Animals/spider.rsi -# - type: Physics -# - type: Fixtures -# fixtures: -# fix1: -# shape: -# !type:PhysShapeCircle -# radius: 0.35 -# density: 130 -# mask: -# - SmallMobMask -# layer: -# - SmallMobLayer -# - type: Appearance -# - type: DamageStateVisuals -# states: -# Alive: -# Base: viper -# Critical: -# Base: viper_dead -# Dead: -# Base: viper_dead -# - type: Butcherable -# spawned: -# - id: FoodMeatSpider -# amount: 2 -# - type: CombatMode -# - type: ReplacementAccent -# accent: xeno -# - type: InteractionPopup -# successChance: 0.5 -# interactSuccessString: petting-success-tarantula -# interactFailureString: petting-failure-generic -# - type: Puller -# needsHands: false -# - type: Arachne -# cocoonDelay: 8 -# - type: SolutionContainerManager -# solutions: -# melee: -# reagents: -# - ReagentId: Nocturine -# Quantity: 20 -# - type: MeleeChemicalInjector -# solution: melee -# transferAmount: 3.5 -# - type: SolutionRegeneration -# solution: melee -# generated: -# reagents: -# - ReagentId: Nocturine -# Quantity: 0.15 -# - type: BloodSucker -# unitsToSucc: 35 -# injectWhenSucc: true -# injectReagent: Cryptobiolin -# unitsToInject: 10 -# webRequired: true -# - type: Bloodstream -# bloodReagent: DemonsBlood -# - type: Body -# prototype: VampiricAnimalLarge -# - type: PotentialPsionic -# - type: Psionic -# removable: false -# - type: MetapsionicPower -# - type: MeleeWeapon -# hidden: true -# angle: 0 -# animation: WeaponArcBite -# damage: -# types: -# Piercing: 8 -# - type: AntiPsionicWeapon -# punish: false -# modifiers: -# coefficients: -# Piercing: 2.25 -# - type: Damageable -# damageContainer: HalfSpirit -# damageModifierSet: HalfSpirit -# - type: StatusEffects -# allowed: -# - Stun -# - KnockedDown -# - SlowedDown -# - Stutter -# - SeeingRainbows -# - Electrocution -# - Drunk -# - SlurredSpeech -# - PressureImmunity -# - Muted -# - ForcedSleep -# - TemporaryBlindness -# - Pacified -# - PsionicsDisabled -# - PsionicallyInsulated -# - type: Tag -# tags: -# - Oneirophage -# - type: MovementAlwaysTouching -# - type: PsionicInvisibleContacts -# whitelist: -# tags: -# - ArachneWeb +- type: entity + name: oneirophage + parent: MobGiantSpider + id: MobGiantSpiderVampire + description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. + components: + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: viper + sprite: Mobs/Animals/spider.rsi + - type: SpriteMovement + movementLayers: + movement: + state: viper-moving + noMovementLayers: + movement: + state: viper + - type: Appearance + - type: DamageStateVisuals + states: + Alive: + Base: viper + Critical: + Base: viper_dead + Dead: + Base: viper_dead + - type: ReplacementAccent + accent: xeno + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-tarantula + interactFailureString: petting-failure-generic + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Animals/snake_hiss.ogg + - type: Puller + needsHands: false + - type: Arachne + cocoonDelay: 8 + - type: SolutionContainerManager + solutions: + melee: + reagents: + - ReagentId: Nocturine + Quantity: 20 + - type: MeleeChemicalInjector + solution: melee + transferAmount: 3.5 + - type: SolutionRegeneration + solution: melee + generated: + reagents: + - ReagentId: Nocturine + Quantity: 0.15 + - type: BloodSucker + unitsToSucc: 35 + injectWhenSucc: true + injectReagent: Cryptobiolin + unitsToInject: 10 + webRequired: true + - type: Bloodstream + bloodReagent: DemonsBlood + - type: Body + prototype: VampiricAnimalLarge + - type: PotentialPsionic + - type: Psionic + removable: false + - type: MetapsionicPower + - type: AntiPsionicWeapon + punish: false + modifiers: + coefficients: + Piercing: 2.25 + - type: Damageable + damageContainer: HalfSpirit + damageModifierSet: HalfSpirit + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + - Drunk + - SlurredSpeech + - PressureImmunity + - Muted + - ForcedSleep + - TemporaryBlindness + - Pacified + - PsionicsDisabled + - PsionicallyInsulated + - type: Tag + tags: + - Oneirophage + - type: MovementAlwaysTouching + - type: PsionicInvisibleContacts + whitelist: + tags: + - ArachneWeb -# - type: entity -# name: oneirophage -# parent: MobGiantSpiderVampire -# id: MobGiantSpiderVampireAngry -# suffix: Angry -# components: -# - type: NpcFactionMember -# factions: -# - SimpleHostile -# - type: InputMover -# - type: MobMover -# - type: HTN -# rootTask: SimpleHostileCompound -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: GhostTakeoverAvailable +- type: entity + name: oneirophage + parent: MobGiantSpiderVampire + id: MobGiantSpiderVampireAngry + suffix: Angry + components: + - type: NpcFactionMember + factions: + - SimpleHostile + - type: InputMover + - type: MobMover + - type: HTN + rootTask: + task: SimpleHostileCompound + - type: GhostRole + makeSentient: true + name: ghost-role-information-giant-spider-vampire-name + description: ghost-role-information-giant-spider-vampire-description + rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. + - type: GhostTakeoverAvailable - type: entity parent: SimpleMobBase diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml new file mode 100644 index 00000000000..e483ea5da71 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml @@ -0,0 +1,93 @@ +- type: entity + id: CocoonedHumanoid + name: cocooned humanoid + description: Unlucky. + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: Nyanotrasen/Structures/cocoon.rsi + state: cocoon_large1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon_large1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon_large2: "" + - enum.DamageStateVisualLayers.Base: + cocoon_large3: "" + - type: Cocoon + - type: Clickable + - type: InteractionOutline + - type: Transform + noRot: true + - type: Damageable + damageModifierSet: Web + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.4,0.25,0.1" + density: 20 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: Physics + bodyType: Dynamic + - type: Pullable + - type: AntiRottingContainer + - type: ItemSlots + slots: + body_slot: + name: Body + locked: true + ejectOnBreak: true + - type: Butcherable + butcheringType: Knife + butcherDelay: 12 + spawned: + - id: MaterialCloth1 + amount: 1 + prob: 0.5 #This doesn't cost hunger so should at least make it not worth it time-wise + - type: Appearance + - type: ContainerContainer + containers: + body_slot: !type:ContainerSlot + +- type: entity + id: CocoonSmall + parent: CocoonedHumanoid + name: cocoon + description: What could be inside...? + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: Nyanotrasen/Structures/cocoon.rsi + state: cocoon1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon2: "" + - enum.DamageStateVisualLayers.Base: + cocoon3: "" diff --git a/Resources/Prototypes/Palettes/departmental.yml b/Resources/Prototypes/Palettes/departmental.yml index c5e893397a3..ab8ac25a4ad 100644 --- a/Resources/Prototypes/Palettes/departmental.yml +++ b/Resources/Prototypes/Palettes/departmental.yml @@ -1,4 +1,4 @@ -- type: palette +- type: palette id: Departmental name: Departmental colors: @@ -10,6 +10,7 @@ bar: "#79150096" epistemics: "#D381C996" # DeltaV - Epistemics Department replacing Science logistics: "#A4610696" # DeltaV - Logistics Department replacing Cargo + justice: "#6b2833DD" #DeltaV - Added Justice Department janitor: "#8c347f96" chemistry: "#fa750096" virology: "#43990996" diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 0c53ae10fd1..5c0cef314ca 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -23,6 +23,29 @@ - !type:OrganType type: Human shouldHave: false + - !type:SatiateHunger + factor: 0.5 + conditions: + - !type:OrganType + type: Vampiric + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Water + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Protein + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Omnizine + amount: 0.2 Food: effects: - !type:AdjustReagent diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index f42e2851c78..bf6f479703e 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -612,3 +612,27 @@ Steel: 250 Glass: 250 Plastic: 250 + +- type: latheRecipe + id: BorgModulePka + result: BorgModulePka + category: Robotics + completetime: 3 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Silver: 100 + +- type: latheRecipe + id: BorgModuleJetpack + result: BorgModuleJetpack + category: Robotics + completetime: 3 + materials: + Steel: 250 + Glass: 250 + Plastic: 250 + Gold: 100 + Plasma: 1000 + diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index edcc9c66364..33377f52520 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -179,6 +179,19 @@ - BorgModuleAdvancedTool - BorgModuleRCD +- type: technology + id: MechanizedSalvaging + name: research-technology-mechanized-salvaging + icon: + sprite: Mobs/Silicon/chassis.rsi + state: miner + discipline: Industrial + tier: 2 + cost: 10000 + recipeUnlocks: + - BorgModulePka + - BorgModuleJetpack + # Tier 3 - type: technology diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index 838a18d5e5d..67afdf8aff9 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -12,7 +12,7 @@ min: 14400 # 4 hours startingGear: LawyerGear icon: "JobIconLawyer" - supervisors: job-supervisors-hop + supervisors: job-supervisors-cj # Delta V - Change supervisor to chief justice access: - Service - Lawyer diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index 3fe22792092..66466352cbe 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -14,6 +14,10 @@ - Medical - Chemistry - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ChemistGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index 4a65b791283..61b1df7784f 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -44,6 +44,7 @@ components: - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. flatBonus: 0.025 + - type: CPRTraining - type: startingGear id: CMOGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index cc048470f0c..627b0e17dc3 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -16,6 +16,10 @@ extendedAccess: - Chemistry - Paramedic # DeltaV - Add Paramedic access + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: DoctorGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml index 0166a3dfadb..003eab22d25 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml @@ -15,6 +15,10 @@ access: - Medical - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: MedicalInternGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml index 9e3484a8dcf..0937a4627ae 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml @@ -23,6 +23,10 @@ - Paramedic # DeltaV - Add Paramedic access extendedAccess: - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ParamedicGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml index ac6e0620f5a..d13fd18afdd 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml @@ -21,6 +21,10 @@ - Medical - Maintenance - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: SeniorPhysicianGear diff --git a/Resources/Prototypes/Roles/Jobs/departments.yml b/Resources/Prototypes/Roles/Jobs/departments.yml index 83534425097..1609969f7e6 100644 --- a/Resources/Prototypes/Roles/Jobs/departments.yml +++ b/Resources/Prototypes/Roles/Jobs/departments.yml @@ -23,7 +23,7 @@ - Clown - HeadOfPersonnel - Janitor - - Lawyer + # - Lawyer # DeltaV - Move Lawyer into Justice - Librarian - Mime - Musician diff --git a/Resources/Prototypes/Roles/play_time_trackers.yml b/Resources/Prototypes/Roles/play_time_trackers.yml index 35b92357702..27043cfbfe4 100644 --- a/Resources/Prototypes/Roles/play_time_trackers.yml +++ b/Resources/Prototypes/Roles/play_time_trackers.yml @@ -37,12 +37,18 @@ - type: playTimeTracker id: JobChiefEngineer +- type: playTimeTracker + id: JobChiefJustice + - type: playTimeTracker id: JobChiefMedicalOfficer - type: playTimeTracker id: JobClown +- type: playTimeTracker + id: JobClerk + - type: playTimeTracker id: JobDetective @@ -100,6 +106,9 @@ - type: playTimeTracker id: JobPsychologist +- type: playTimeTracker + id: JobProsecutor + - type: playTimeTracker id: JobQuartermaster diff --git a/Resources/Prototypes/Species/arachne.yml b/Resources/Prototypes/Species/arachne.yml new file mode 100644 index 00000000000..ed494c37cc8 --- /dev/null +++ b/Resources/Prototypes/Species/arachne.yml @@ -0,0 +1,50 @@ +- type: species + id: Arachne + name: species-name-arachne + roundStart: true + prototype: MobArachne + sprites: MobArachneSprites + markingLimits: MobArachneMarkingLimits + dollPrototype: MobArachneDummy + skinColoration: HumanToned + sexes: + - Female + minAge: 60 + youngAge: 150 + oldAge: 400 + maxAge: 666 + +- type: markingPoints + id: MobArachneMarkingLimits + points: + Hair: + points: 1 + required: false + Tail: + points: 1 + required: false + Chest: + points: 1 + required: false + Arms: + points: 2 + required: false + + +- type: speciesBaseSprites + id: MobArachneSprites + sprites: + Head: MobHumanHead + Hair: MobHumanoidAnyMarking + Chest: MobHumanTorso + Eyes: MobArachneEyes + LArm: MobHumanLArm + RArm: MobHumanRArm + LHand: MobHumanLHand + RHand: MobHumanRHand + +- type: humanoidBaseSprite + id: MobArachneEyes + baseSprite: + sprite: Mobs/Species/eyes.rsi + state: eyes diff --git a/Resources/Prototypes/StatusEffects/job.yml b/Resources/Prototypes/StatusEffects/job.yml index 30c677dd2c9..96ad930bd51 100644 --- a/Resources/Prototypes/StatusEffects/job.yml +++ b/Resources/Prototypes/StatusEffects/job.yml @@ -121,8 +121,8 @@ parent: JobIcon id: JobIconLawyer icon: - sprite: /Textures/Interface/Misc/job_icons.rsi - state: Lawyer + sprite: /Textures/DeltaV/Interface/Misc/job_icons.rsi # DeltaV - Move Lawyer into Justice + state: Lawyer # DeltaV - Move Lawyer into Justice - type: statusIcon parent: JobIcon diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index eb96d37e01a..afdd27f339d 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -94,3 +94,17 @@ - MedicalBorg components: - type: Snoring + +- type: trait + id: BloodDeficiency + category: Physical + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, + bloodLossAmount: 0.07 # then become crit ~10 minutes later diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 16b628a56d8..1a4242aff80 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -1,3 +1,38 @@ +- type: trait + id: CPRTraining + category: Mental + points: -2 + components: + - type: CPRTraining + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - MedicalDoctor + - Chemist + - MedicalIntern + - Paramedic + - ChiefMedicalOfficer + - Brigmedic + +- type: trait + id: SelfAware + category: Mental + points: -2 + components: + - type: SelfAware + analyzableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - Cold + - Caustic + detectableGroups: + - Airloss + - Toxin + - type: trait id: HeavyweightDrunk category: Physical @@ -52,6 +87,17 @@ foodDelayMultiplier: 0.5 drinkDelayMultiplier: 0.5 +- type: trait + id: ParkourTraining + category: Physical + points: -3 + components: + - type: ClimbDelayModifier + climbDelayMultiplier: 0.70 + - type: LayingDownModifier + layingDownCooldownMultiplier: 0.8 + downedSpeedMultiplierMultiplier: 1.25 + - type: trait id: LightStep category: Auditory diff --git a/Resources/Prototypes/Traits/species.yml b/Resources/Prototypes/Traits/species.yml new file mode 100644 index 00000000000..2c298252289 --- /dev/null +++ b/Resources/Prototypes/Traits/species.yml @@ -0,0 +1,62 @@ +- type: trait + id: Swashbuckler + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.35 + Piercing: 1.2 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Spearmaster + - WeaponsGeneralist + +- type: trait + id: Spearmaster + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.2 + Piercing: 1.35 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - WeaponsGeneralist + +- type: trait + id: WeaponsGeneralist + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.25 + Slash: 1.25 + Piercing: 1.25 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - Spearmaster diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 9b0ad51cfb6..786f641ddd1 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -16,6 +16,9 @@ - type: Tag id: AppraisalTool +- type: Tag + id: ArachneWeb + - type: Tag id: ArtifactFragment @@ -602,6 +605,9 @@ - type: Tag id: Fruit +- type: Tag + id: FullBodyOuter + - type: Tag id: Galaxythistle @@ -919,6 +925,9 @@ - type: Tag id: Ointment +- type: Tag + id: Oneirophage + - type: Tag id: Ore diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png new file mode 100644 index 00000000000..9522966b6c7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png new file mode 100644 index 00000000000..0633bb36441 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png new file mode 100644 index 00000000000..0ce0c363f81 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png new file mode 100644 index 00000000000..2142eee0392 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json new file mode 100644 index 00000000000..116c0e53e70 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428 | Modified by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon_alt" + }, + { + "name": "equipped-EARS", + "directions": 4 + }, + { + "name": "alt-equipped-EARS", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png new file mode 100644 index 00000000000..2fc2172afa7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png new file mode 100644 index 00000000000..3a06285c67c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png new file mode 100644 index 00000000000..60426ff87fd Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png new file mode 100644 index 00000000000..d6ed79e225a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json new file mode 100644 index 00000000000..9d421b646b5 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png new file mode 100644 index 00000000000..49bc499a870 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png new file mode 100644 index 00000000000..ce23046a1fc Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png new file mode 100644 index 00000000000..80531e8b56f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png new file mode 100644 index 00000000000..0bd0f37f115 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json new file mode 100644 index 00000000000..a0670a97c96 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png new file mode 100644 index 00000000000..ce4e527400f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png new file mode 100644 index 00000000000..d3f712e8d76 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json new file mode 100644 index 00000000000..7f12698657f --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png new file mode 100644 index 00000000000..9a881bf0dd0 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png new file mode 100644 index 00000000000..7fd93b7fd5b Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json new file mode 100644 index 00000000000..a04b75dd785 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..7d77d8b53f9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png new file mode 100644 index 00000000000..eb6ff72244d Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png new file mode 100644 index 00000000000..f7b9b21ebdb Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png new file mode 100644 index 00000000000..5d366f23d98 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json new file mode 100644 index 00000000000..11ac46694ce --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..a5575e393cc Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png new file mode 100644 index 00000000000..443dbf1af97 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png new file mode 100644 index 00000000000..cf49f4588a6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png new file mode 100644 index 00000000000..c2e88069f8a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json new file mode 100644 index 00000000000..11ac46694ce --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..24c2af227bb Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png new file mode 100644 index 00000000000..77371a3ba8c Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png new file mode 100644 index 00000000000..9b19bead358 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png new file mode 100644 index 00000000000..571ae1697c9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..64e6927cf64 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png new file mode 100644 index 00000000000..58a60bc768a Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png new file mode 100644 index 00000000000..5dcb8e026ee Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png new file mode 100644 index 00000000000..5e7d3774518 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..a1ae36f2102 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png new file mode 100644 index 00000000000..5130d57e8cf Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png new file mode 100644 index 00000000000..d04680f3ca6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png new file mode 100644 index 00000000000..af7f24e84e4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json new file mode 100644 index 00000000000..322f9da00e0 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..b2e475bdbe1 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png new file mode 100644 index 00000000000..03f703a26cc Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png new file mode 100644 index 00000000000..9b19bead358 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png new file mode 100644 index 00000000000..571ae1697c9 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..e735c5a2b21 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png new file mode 100644 index 00000000000..bf6ed67bc86 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png new file mode 100644 index 00000000000..aa334048316 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png new file mode 100644 index 00000000000..deb205205ab Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json new file mode 100644 index 00000000000..04451512800 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..9caa2e705e7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png new file mode 100644 index 00000000000..0f2a20fa1ab Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png new file mode 100644 index 00000000000..4e73693046f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png new file mode 100644 index 00000000000..567d302dc52 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json new file mode 100644 index 00000000000..04451512800 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..330926db8c1 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png new file mode 100644 index 00000000000..337c3132ca4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png new file mode 100644 index 00000000000..5dcb8e026ee Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png new file mode 100644 index 00000000000..5e7d3774518 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json new file mode 100644 index 00000000000..faf5084407b --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 00000000000..f21dce44e2f Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png new file mode 100644 index 00000000000..0d2266c7ff7 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png new file mode 100644 index 00000000000..d04680f3ca6 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png new file mode 100644 index 00000000000..af7f24e84e4 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json new file mode 100644 index 00000000000..322f9da00e0 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png new file mode 100644 index 00000000000..6cba0e4a93f Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png new file mode 100644 index 00000000000..90e01b97cdf Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png new file mode 100644 index 00000000000..9ef5c305272 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png new file mode 100644 index 00000000000..997b29b2a44 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json index 3f3c6b04e25..09d18e3ab7c 100644 --- a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json +++ b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoPrisonGuard, nyanoMartialArtist, nyanoGladiator made by Floofers", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e | nyanoPrisonGuard, nyanoMartialArtist, nyanoGladiator made by Floofers | ChiefJustice, Clerk by leonardo_dabepis (Discord)", "size": { "x": 8, "y": 8 @@ -27,6 +27,18 @@ }, { "name": "MedicalBorg" + }, + { + "name": "ChiefJustice" + }, + { + "name": "Clerk" + }, + { + "name": "Prosecutor" + }, + { + "name": "Lawyer" } ] } diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg new file mode 100644 index 00000000000..74e0876fb9a --- /dev/null +++ b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg @@ -0,0 +1,127 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png new file mode 100644 index 00000000000..d13d8cf76b7 Binary files /dev/null and b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png differ diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml new file mode 100644 index 00000000000..5c43e233050 --- /dev/null +++ b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png new file mode 100644 index 00000000000..b69ced20cf5 Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png differ diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png new file mode 100644 index 00000000000..5e6ce9fece5 Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png differ diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json b/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json index 7e31fd29114..a7534b9ee5b 100644 --- a/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Markers/jobs.rsi/meta.json @@ -7,12 +7,21 @@ "y": 32 }, "states": [ + { + "name": "chiefjustice" + }, + { + "name": "clerk" + }, { "name": "nyanogladiator" }, { "name": "nyanoprisonguard" }, + { + "name": "prosecutor" + }, { "name": "nyanomailcarrier" }, diff --git a/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png b/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png new file mode 100644 index 00000000000..e384f90fb1b Binary files /dev/null and b/Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png new file mode 100644 index 00000000000..962d09200d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json index 440000d647b..eb55c2b4e71 100644 --- a/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/meta.json @@ -1,13 +1,14 @@ { "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Created by DangerRevolution for Space Station 14.", + "license": "CC0-1.0", + "copyright": "justice_label by leonardo_dabepis (Discord) | prisoner_label, crypt_orange Created by DangerRevolution for Space Station 14.", "size": { "x": 32, "y": 32 }, "states": [ - {"name": "prisoner_label"}, + {"name": "justice_label"}, + {"name": "prisoner_label"}, {"name": "crypt_orange"} ] -} \ No newline at end of file +} diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json index 24d83ed6a04..176af077199 100644 --- a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d | pda-corpsman from yogstation at https://github.com/yogstation13/Yogstation/commit/a75671b22476ed8e117229f38501b9b63f8d6bc1 | pda-martialartist by Floofers", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d | pda-corpsman from yogstation at https://github.com/yogstation13/Yogstation/commit/a75671b22476ed8e117229f38501b9b63f8d6bc1 | pda-martialartist by Floofers | pda-chiefjustice and pda-clerk by leonardo_dabepis (Discord) | pda-prosecutor by Timemaster99 (Discord)", "size": { "x": 32, "y": 32 @@ -31,6 +31,15 @@ }, { "name": "pda-corpsman" + }, + { + "name": "pda-chiefjustice" + }, + { + "name": "pda-clerk" + }, + { + "name": "pda-prosecutor" } ] } diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png new file mode 100644 index 00000000000..ec2543a97c4 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png new file mode 100644 index 00000000000..6f690e235d8 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png differ diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png new file mode 100644 index 00000000000..e44dcea1b57 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json index 75c5548e647..5e2c34d5304 100644 --- a/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Misc/bureaucracy.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432 | modified by Floofers", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432 | modified by Floofers. Stamp icon taken from tgstation at https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by leonardo_dabepis (Discord)", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json index 31a3b1bee37..d17e01e8bd9 100644 --- a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json +++ b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Stamp sprites taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by Guess-My-Name.", + "copyright": "Stamp sprites taken from tgstation at commit https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93, modified by Guess-My-Name. CJ stamp modified by Timemaster99 (Discord)", "size": { "x": 32, "y": 32 @@ -10,8 +10,14 @@ { "name": "stamp-lawyer" }, + { + "name": "stamp-notary" + }, { "name": "stamp-psychologist" + }, + { + "name": "stamp-cj" } ] } diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png new file mode 100644 index 00000000000..3ca58c4bc60 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png differ diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png new file mode 100644 index 00000000000..b726cab3d3a Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png new file mode 100644 index 00000000000..3cf56d45371 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png new file mode 100644 index 00000000000..a41d27bcc71 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png new file mode 100644 index 00000000000..cbabf3b291a Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json new file mode 100644 index 00000000000..39ff0ed9d9b --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495. In-hand sprites edited by Timemaster99 (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png new file mode 100644 index 00000000000..c1254bb8086 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json new file mode 100644 index 00000000000..5abad9b4225 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json new file mode 100644 index 00000000000..8081065c329 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original screen timer sprite by brainfood1183 (Github) for Space Station 14, modified by Leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "trialtimer" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png new file mode 100644 index 00000000000..34c8f1b90a9 Binary files /dev/null and b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png new file mode 100644 index 00000000000..056fcc5c141 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png new file mode 100644 index 00000000000..6857f2a2415 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png new file mode 100644 index 00000000000..04842eb1c7e Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png new file mode 100644 index 00000000000..c78d01c42d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png new file mode 100644 index 00000000000..fd27f05b3a2 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png new file mode 100644 index 00000000000..2a71f76d5d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png new file mode 100644 index 00000000000..7c56263f839 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png new file mode 100644 index 00000000000..817f2fb3f95 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json new file mode 100644 index 00000000000..e4c020ff61d --- /dev/null +++ b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and recolored by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png new file mode 100644 index 00000000000..10d823bfe8d Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png new file mode 100644 index 00000000000..540ccf3de45 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png new file mode 100644 index 00000000000..84933bd5ed9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png new file mode 100644 index 00000000000..db7be0bc4a0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png new file mode 100644 index 00000000000..24eb2aedc22 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png new file mode 100644 index 00000000000..fc90acd637a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png new file mode 100644 index 00000000000..dd67e88a315 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png new file mode 100644 index 00000000000..fb5d774588a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png new file mode 100644 index 00000000000..f16a028dee5 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png new file mode 100644 index 00000000000..630eabb976e Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png new file mode 100644 index 00000000000..a0040dfdc73 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png new file mode 100644 index 00000000000..35efd5f6ddb Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png new file mode 100644 index 00000000000..6857f2a2415 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png new file mode 100644 index 00000000000..64e00a086dc Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png new file mode 100644 index 00000000000..c78d01c42d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png new file mode 100644 index 00000000000..2a33b5d48af Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png new file mode 100644 index 00000000000..2a71f76d5d0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png new file mode 100644 index 00000000000..7c56263f839 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png new file mode 100644 index 00000000000..817f2fb3f95 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json new file mode 100644 index 00000000000..e4c020ff61d --- /dev/null +++ b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json @@ -0,0 +1,195 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and recolored by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "assembly" + }, + { + "name": "bolted_unlit" + }, + { + "name": "closed" + }, + { + "name": "closed_unlit" + }, + { + "name": "closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "closing_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "deny_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "opening_unlit", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_closing", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "panel_open", + "delays": [ + [ + 1 + ] + ] + }, + { + "name": "panel_opening", + "delays": [ + [ + 0.1, + 0.1, + 0.07, + 0.07, + 0.07, + 0.2 + ] + ] + }, + { + "name": "sparks", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_broken", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "sparks_damaged", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 1.7 + ] + ] + }, + { + "name": "sparks_open", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "welded" + }, + { + "name": "emergency_unlit", + "delays": [ + [ + 0.4, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png new file mode 100644 index 00000000000..0c731ca7960 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png new file mode 100644 index 00000000000..e8e146a32d9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png new file mode 100644 index 00000000000..84933bd5ed9 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png new file mode 100644 index 00000000000..db7be0bc4a0 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png new file mode 100644 index 00000000000..24eb2aedc22 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png new file mode 100644 index 00000000000..fc90acd637a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png new file mode 100644 index 00000000000..dd67e88a315 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png new file mode 100644 index 00000000000..fb5d774588a Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png new file mode 100644 index 00000000000..f16a028dee5 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png new file mode 100644 index 00000000000..630eabb976e Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png differ diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png new file mode 100644 index 00000000000..a0040dfdc73 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png new file mode 100644 index 00000000000..dcb76fc2635 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png new file mode 100644 index 00000000000..ef94a9998f3 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json index 0d38f6d8592..ab3feb6715c 100644 --- a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers", + "copyright": "directional sprites taken from https://github.com/space-wizards/space-station-14/commit/c1556214de46d66fe4057500e269b17438dc96ca | direction_mail modified by Hyenh, direction_logi modified by Floofers | direction_court, direction_justice by leonardo_dabepis (Discord)", "size": { "x": 32, "y": 32 @@ -14,6 +14,14 @@ { "name": "direction_mail", "directions": 4 + }, + { + "name": "direction_court", + "directions": 4 + }, + { + "name": "direction_justice", + "directions": 4 } ] } \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png new file mode 100644 index 00000000000..acb96562e73 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png new file mode 100644 index 00000000000..acb96562e73 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json new file mode 100644 index 00000000000..b44be570c4f --- /dev/null +++ b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "copyright": "Rane", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "female_none", + "directions": 4 + }, + { + "name": "female_full", + "directions": 4 + }, + { + "name": "female_top", + "directions": 4 + }, + { + "name": "male_none", + "directions": 4 + }, + { + "name": "male_full", + "directions": 4 + }, + { + "name": "male_top", + "directions": 4 + }, + { + "name": "full", + "directions": 4 + }, + { + "name": "none", + "directions": 4 + }, + { + "name": "top", + "directions": 4 + }, + { + "name": "unisex_full", + "directions": 4 + }, + { + "name": "unisex_none", + "directions": 4 + }, + { + "name": "unisex_top", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png differ diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png new file mode 100644 index 00000000000..20ccfaa8db4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png differ diff --git a/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png b/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png new file mode 100644 index 00000000000..0f253476944 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json b/Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json new file mode 100644 index 00000000000..0eb61ec1dde --- /dev/null +++ b/Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "copyright" : "@Rane#7518", + "license" : "CC-BY-SA-3.0", + "size" : { + "x" : 32, + "y" : 32 + }, + "states" : [ + { + "directions" : 4, + "name" : "eyes" + } + ], + "version" : 1 +} diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/meta.json b/Resources/Textures/Mobs/Species/arachne.rsi/meta.json new file mode 100644 index 00000000000..a985b24cca3 --- /dev/null +++ b/Resources/Textures/Mobs/Species/arachne.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "license": "CC-BY-4.0", + "copyright": "Created by @kes#0001, colored by Woods#1999", + "size": { + "x": 64, + "y": 64 + }, + "states": [ + { + "name": "spider_body", + "directions": 4 + }, + { + "name": "spider_body_front", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png new file mode 100644 index 00000000000..d1432cc3fd6 Binary files /dev/null and b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png differ diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png new file mode 100644 index 00000000000..0171f16fe38 Binary files /dev/null and b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png differ diff --git a/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png b/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png new file mode 100644 index 00000000000..b6250e22b38 Binary files /dev/null and b/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Species/eyes.rsi/meta.json b/Resources/Textures/Mobs/Species/eyes.rsi/meta.json new file mode 100644 index 00000000000..a98aba406f1 --- /dev/null +++ b/Resources/Textures/Mobs/Species/eyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by @Rane#7518", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png new file mode 100644 index 00000000000..27741fdf314 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png new file mode 100644 index 00000000000..252be2398af Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png new file mode 100644 index 00000000000..ca9cbb79bbe Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png new file mode 100644 index 00000000000..f9431f64285 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png new file mode 100644 index 00000000000..885bb7b3c93 Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png new file mode 100644 index 00000000000..9a033961ffa Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png differ diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json new file mode 100644 index 00000000000..08cfb264df9 --- /dev/null +++ b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "copyright" : "Taken from https://github.com/tgstation/tgstation", + "license" : "CC-BY-SA-3.0", + "size" : { + "x" : 32, + "y" : 32 + }, + "states" : [ + { + "directions" : 1, + "name" : "cocoon1" + }, + { + "directions" : 1, + "name" : "cocoon2" + }, + { + "directions" : 1, + "name" : "cocoon3" + }, + { + "directions" : 1, + "name" : "cocoon_large1" + }, + { + "directions" : 1, + "name" : "cocoon_large2" + }, + { + "directions" : 1, + "name" : "cocoon_large3" + } + ], + "version" : 1 +} diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index b57f9844bc7..dc7906e8590 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json @@ -260,6 +260,9 @@ { "name": "paper_stamp-psychologist" }, + { + "name": "paper_stamp-notary" + }, { "name": "paper_stamp-signature" } diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png new file mode 100644 index 00000000000..603351ace58 Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png new file mode 100644 index 00000000000..ec7033ec2fe Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png new file mode 100644 index 00000000000..db086b229e9 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png differ diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json index 24992441359..ce8f8187b7d 100644 --- a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/meta.json @@ -61,6 +61,9 @@ { "name": "icon-harvesting" }, + { + "name": "icon-jetpack" + }, { "name": "icon-light-replacer" }, @@ -79,6 +82,9 @@ { "name": "icon-pen" }, + { + "name": "icon-pka" + }, { "name": "icon-radiation" }, diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json new file mode 100644 index 00000000000..8f4b8ba253f --- /dev/null +++ b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png new file mode 100644 index 00000000000..fbd87cad203 Binary files /dev/null and b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png differ diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png new file mode 100644 index 00000000000..40edaedd9e5 Binary files /dev/null and b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png differ diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/meta.json b/Resources/Textures/Objects/Tools/penlight.rsi/meta.json new file mode 100644 index 00000000000..8f4b8ba253f --- /dev/null +++ b/Resources/Textures/Objects/Tools/penlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png new file mode 100644 index 00000000000..afb10cdad4e Binary files /dev/null and b/Resources/Textures/Objects/Tools/penlight.rsi/world-on.png differ diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world.png b/Resources/Textures/Objects/Tools/penlight.rsi/world.png new file mode 100644 index 00000000000..4cf616bf959 Binary files /dev/null and b/Resources/Textures/Objects/Tools/penlight.rsi/world.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj.png b/Resources/Textures/Structures/Storage/closet.rsi/cj.png new file mode 100644 index 00000000000..c57b4b88990 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png new file mode 100644 index 00000000000..f406e398073 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png new file mode 100644 index 00000000000..8ba72a5bccf Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk.png new file mode 100644 index 00000000000..d941ab4bf54 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png new file mode 100644 index 00000000000..e31a6468b9a Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png new file mode 100644 index 00000000000..ab865e6cbe5 Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/closet.rsi/meta.json index c52bc13540e..d3802637c05 100644 --- a/Resources/Textures/Structures/Storage/closet.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/closet.rsi/meta.json @@ -4,7 +4,7 @@ "x": 32, "y": 32 }, - "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", + "copyright": "Taken from tgstation, brigmedic locker is a resprited CMO locker by PuroSlavKing (Github), CJ and Clerk lockers edited by Timemaster99 (Discord), n2_door state modified by Flareguy from fire_door, using sprites from /vg/station at https://github.com/vgstation-coders/vgstation13/commit/02b9f6894af4419c9f7e699a22c402b086d8067e", "license": "CC-BY-SA-3.0", "states": [ { @@ -163,6 +163,24 @@ { "name": "chemical_door" }, + { + "name": "cj" + }, + { + "name": "cj_door" + }, + { + "name": "cj_open" + }, + { + "name": "clerk" + }, + { + "name": "clerk_door" + }, + { + "name": "clerk_open" + }, { "name": "cmo" },