diff --git a/Content.Client/Nyanotrasen/Abilities/Psionics/TelegnosisPowerSystem.cs b/Content.Client/Nyanotrasen/Abilities/Psionics/TelegnosisPowerSystem.cs new file mode 100644 index 0000000000..8ddc15347c --- /dev/null +++ b/Content.Client/Nyanotrasen/Abilities/Psionics/TelegnosisPowerSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Abilities.Psionics; + +namespace Content.Client.Abilities.Psionics; + +public sealed class TelegnosisPowerSystem : SharedTelegnosisPowerSystem; diff --git a/Content.IntegrationTests/Tests/Nyanotrasen/Metempsychosis/MetempsychosisTest.cs b/Content.IntegrationTests/Tests/DeltaV/MetempsychosisTest.cs similarity index 62% rename from Content.IntegrationTests/Tests/Nyanotrasen/Metempsychosis/MetempsychosisTest.cs rename to Content.IntegrationTests/Tests/DeltaV/MetempsychosisTest.cs index cd6a4b4c2b..6b68ac3602 100644 --- a/Content.IntegrationTests/Tests/Nyanotrasen/Metempsychosis/MetempsychosisTest.cs +++ b/Content.IntegrationTests/Tests/DeltaV/MetempsychosisTest.cs @@ -1,12 +1,10 @@ -using Content.Server.Nyanotrasen.Cloning; +using Content.Server.DeltaV.Cloning; using Content.Shared.Humanoid.Prototypes; -using Content.Shared.Random; using Robust.Shared.Prototypes; namespace Content.IntegrationTests.Tests.DeltaV; [TestFixture] -[TestOf(typeof(MetempsychoticMachineSystem))] public sealed class MetempsychosisTest { [Test] @@ -23,18 +21,22 @@ public sealed class MetempsychosisTest await server.WaitAssertion(() => { - prototypeManager.TryIndex(metemComponent.MetempsychoticHumanoidPool, + prototypeManager.TryIndex(metemComponent.MetempsychoticHumanoidPool, out var humanoidPool); - prototypeManager.TryIndex(metemComponent.MetempsychoticNonHumanoidPool, + prototypeManager.TryIndex(metemComponent.MetempsychoticNonHumanoidPool, out var nonHumanoidPool); - Assert.That(humanoidPool, Is.Not.Null, "MetempsychoticHumanoidPool is null!"); - Assert.That(nonHumanoidPool, Is.Not.Null, "MetempsychoticNonHumanoidPool is null!"); - - Assert.That(humanoidPool.Weights, Is.Not.Empty, - "MetempsychoticHumanoidPool has no valid prototypes!"); - Assert.That(nonHumanoidPool.Weights, Is.Not.Empty, - "MetempsychoticNonHumanoidPool has no valid prototypes!"); + Assert.Multiple(() => + { + Assert.That(humanoidPool, Is.Not.Null, "MetempsychoticHumanoidPool is null!"); + Assert.That(nonHumanoidPool, Is.Not.Null, "MetempsychoticNonHumanoidPool is null!"); + Assert.That(humanoidPool.Weights, + Is.Not.Empty, + "MetempsychoticHumanoidPool has no valid prototypes!"); + Assert.That(nonHumanoidPool.Weights, + Is.Not.Empty, + "MetempsychoticNonHumanoidPool has no valid prototypes!"); + }); foreach (var key in humanoidPool.Weights.Keys) { diff --git a/Content.Server/Cloning/CloningSystem.cs b/Content.Server/Cloning/CloningSystem.cs index 0eafad3586..ab593b607c 100644 --- a/Content.Server/Cloning/CloningSystem.cs +++ b/Content.Server/Cloning/CloningSystem.cs @@ -9,6 +9,8 @@ using Content.Server.Jobs; using Content.Server.Materials; using Content.Server.Popups; using Content.Server.Power.EntitySystems; +using Content.Server.Psionics; // DeltaV +using Content.Server.Traits.Assorted; // DeltaV using Content.Shared.Atmos; using Content.Shared.CCVar; using Content.Shared.Chemistry.Components; @@ -33,26 +35,10 @@ using Robust.Shared.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Content.Server.Traits.Assorted; //Nyano - Summary: allows the potential psionic ability to be written to the character. -using Content.Server.Psionics; //DeltaV needed for Psionic Systems -using Content.Shared.Speech; //DeltaV Start Metem Usings -using Content.Shared.Tag; -using Content.Shared.Preferences; -using Content.Shared.Emoting; -using Content.Server.Speech.Components; -using Content.Server.StationEvents.Components; -using Content.Server.Ghost.Roles.Components; -using Content.Server.Nyanotrasen.Cloning; -using Content.Shared.Humanoid.Prototypes; -using Robust.Shared.GameObjects.Components.Localization; //DeltaV End Metem Usings -using Content.Server.EntityList; -using Content.Shared.SSDIndicator; -using Content.Shared.Damage.ForceSay; -using Content.Server.Polymorph.Components; namespace Content.Server.Cloning { - public sealed class CloningSystem : EntitySystem + public sealed partial class CloningSystem : EntitySystem // DeltaV - Set to partial, see CloningSystem.Metempsychosis.cs { [Dependency] private readonly DeviceLinkSystem _signalSystem = default!; [Dependency] private readonly IPlayerManager _playerManager = null!; @@ -76,8 +62,6 @@ namespace Content.Server.Cloning [Dependency] private readonly SharedMindSystem _mindSystem = default!; [Dependency] private readonly MetaDataSystem _metaSystem = default!; [Dependency] private readonly SharedJobSystem _jobs = default!; - [Dependency] private readonly MetempsychoticMachineSystem _metem = default!; //DeltaV - [Dependency] private readonly TagSystem _tag = default!; //DeltaV public readonly Dictionary ClonesWaitingForMind = new(); public const float EasyModeCloningCost = 0.7f; @@ -158,6 +142,10 @@ namespace Content.Server.Cloning if (!Resolve(uid, ref clonePod)) return false; + // DeltaV - This method should use Entity pod instead + // But I don't want to completely mangle it so we do this here + var podEnt = new Entity(uid, clonePod); + if (HasComp(uid)) return false; @@ -244,13 +232,13 @@ namespace Content.Server.Cloning AddComp(uid); return true; } - // End Nyano-code. } // end of genetic damage checks - var mob = FetchAndSpawnMob(clonePod, pref, speciesPrototype, humanoid, bodyToClone, karmaBonus); //DeltaV Replaces CloneAppearance with Metem/Clone via FetchAndSpawnMob + // DeltaV - Replaces CloneAppearance with Metem/Clone via FetchAndSpawnMob + var mob = FetchAndSpawnMob(podEnt, pref, speciesPrototype, humanoid, bodyToClone, karmaBonus); - ///Nyano - Summary: adds the potential psionic trait to the reanimated mob. + // Nyano - Summary: adds the potential psionic trait to the reanimated mob. EnsureComp(mob); var ev = new CloningEvent(bodyToClone, mob); @@ -348,6 +336,7 @@ namespace Content.Server.Cloning var transform = Transform(uid); var indices = _transformSystem.GetGridTilePositionOrDefault((uid, transform)); var tileMix = _atmosphereSystem.GetTileMixture(transform.GridUid, null, indices, true); + if (HasComp(uid)) { _audio.PlayPvs(clonePod.ScreamSound, uid); @@ -375,84 +364,6 @@ namespace Content.Server.Cloning RemCompDeferred(uid); } - /// - /// Start Nyano Code: Handles fetching the mob and any appearance stuff... - /// - private EntityUid FetchAndSpawnMob(CloningPodComponent clonePod, HumanoidCharacterProfile pref, SpeciesPrototype speciesPrototype, HumanoidAppearanceComponent humanoid, EntityUid bodyToClone, float karmaBonus) - { - List sexes = new(); - bool switchingSpecies = false; - bool applyKarma = false; - var toSpawn = speciesPrototype.Prototype; - TryComp(bodyToClone, out var oldKarma); - - if (TryComp(clonePod.Owner, out var metem)) - { - toSpawn = _metem.GetSpawnEntity(clonePod.Owner, karmaBonus, metem, speciesPrototype, out var newSpecies, oldKarma?.Score); - applyKarma = true; - - if (newSpecies != null) - { - sexes = newSpecies.Sexes; - - if (speciesPrototype.ID != newSpecies.ID) - switchingSpecies = true; - - speciesPrototype = newSpecies; - } - } - - var mob = Spawn(toSpawn, _transformSystem.GetMapCoordinates(clonePod.Owner)); - if (TryComp(mob, out var newHumanoid)) - { - if (switchingSpecies || HasComp(bodyToClone)) - { - pref = HumanoidCharacterProfile.RandomWithSpecies(newHumanoid.Species); - if (sexes.Contains(humanoid.Sex)) - pref = pref.WithSex(humanoid.Sex); - - pref = pref.WithGender(humanoid.Gender); - pref = pref.WithAge(humanoid.Age); - - } - _humanoidSystem.LoadProfile(mob, pref); - } - - if (applyKarma) - { - var karma = EnsureComp(mob); - karma.Score++; - if (oldKarma != null) - karma.Score += oldKarma.Score; - } - - var ev = new CloningEvent(bodyToClone, mob); - RaiseLocalEvent(bodyToClone, ref ev); - - if (!ev.NameHandled) - _metaSystem.SetEntityName(mob, MetaData(bodyToClone).EntityName); - - var grammar = EnsureComp(mob); - grammar.ProperNoun = true; - grammar.Gender = humanoid.Gender; - Dirty(mob, grammar); - - EnsureComp(mob); - EnsureComp(mob); - EnsureComp(mob); - EnsureComp(mob); - EnsureComp(mob); - EnsureComp(mob); - RemComp(mob); - RemComp(mob); - RemComp(mob); - RemComp(mob); - - _tag.AddTag(mob, "DoorBumpOpener"); - - return mob; - } - //End Nyano Code public void Reset(RoundRestartCleanupEvent ev) { ClonesWaitingForMind.Clear(); diff --git a/Content.Server/DeltaV/Administration/Commands/AnnounceCustomCommand.cs b/Content.Server/DeltaV/Administration/Commands/AnnounceCustomCommand.cs new file mode 100644 index 0000000000..f0429105b1 --- /dev/null +++ b/Content.Server/DeltaV/Administration/Commands/AnnounceCustomCommand.cs @@ -0,0 +1,79 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Administration; +using Robust.Shared.Audio; +using Robust.Shared.Console; +using Robust.Shared.ContentPack; +using Robust.Shared.Prototypes; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Fun)] +public sealed class AnnounceCustomCommand : IConsoleCommand +{ + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly IResourceManager _res = default!; + + public string Command => "announcecustom"; + public string Description => Loc.GetString("cmd-announcecustom-desc"); + public string Help => Loc.GetString("cmd-announcecustom-help", ("command", Command)); + + public void Execute(IConsoleShell shell, string argStr, string[] args) + { + var chat = IoCManager.Resolve().GetEntitySystem(); + + switch (args.Length) + { + case 0: + shell.WriteError(Loc.GetString("shell-need-minimum-one-argument")); + return; + case > 4: + shell.WriteError(Loc.GetString("shell-wrong-arguments-number")); + return; + } + + var message = args[0]; + var sender = "Central Command"; + var color = Color.Gold; + var sound = new SoundPathSpecifier("/Audio/Announcements/announce.ogg"); + + // Optional sender argument + if (args.Length >= 2) + sender = args[1]; + + // Optional color argument + if (args.Length >= 3) + { + try + { + color = Color.FromHex(args[2]); + } + catch + { + shell.WriteError(Loc.GetString("shell-invalid-color-hex")); + return; + } + } + + // Optional sound argument + if (args.Length >= 4) + sound = new SoundPathSpecifier(args[3]); + + chat.DispatchGlobalAnnouncement(message, sender, true, sound, color); + shell.WriteLine(Loc.GetString("shell-command-success")); + } + + public CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + return args.Length switch + { + 1 => CompletionResult.FromHint(Loc.GetString("cmd-announcecustom-arg-message")), + 2 => CompletionResult.FromHint(Loc.GetString("shell-argument-username-optional-hint")), + 3 => CompletionResult.FromHint(Loc.GetString("cmd-announcecustom-arg-color")), + 4 => CompletionResult.FromHintOptions( + CompletionHelper.AudioFilePath(args[3], _protoManager, _res), + Loc.GetString("cmd-announcecustom-arg-sound") + ), + _ => CompletionResult.Empty + }; + } +} diff --git a/Content.Server/DeltaV/Chapel/SacrificialAltarSystem.cs b/Content.Server/DeltaV/Chapel/SacrificialAltarSystem.cs index a903d4124d..8d28297cf6 100644 --- a/Content.Server/DeltaV/Chapel/SacrificialAltarSystem.cs +++ b/Content.Server/DeltaV/Chapel/SacrificialAltarSystem.cs @@ -1,5 +1,5 @@ using Content.Server.Bible.Components; -using Content.Server.Nyanotrasen.Cloning; +using Content.Server.DeltaV.Cloning; using Content.Shared.Abilities.Psionics; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; diff --git a/Content.Server/DeltaV/Cloning/CloningSystem.Metempsychosis.cs b/Content.Server/DeltaV/Cloning/CloningSystem.Metempsychosis.cs new file mode 100644 index 0000000000..d69d4d9ef9 --- /dev/null +++ b/Content.Server/DeltaV/Cloning/CloningSystem.Metempsychosis.cs @@ -0,0 +1,172 @@ +using Content.Server.DeltaV.Cloning; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; +using Content.Shared.Speech; +using Content.Shared.Emoting; +using Content.Shared.Damage.ForceSay; +using Content.Shared.SSDIndicator; +using Content.Server.Speech.Components; +using Content.Server.Ghost.Roles.Components; +using Content.Server.StationEvents.Components; +using Content.Server.Psionics; +using Robust.Shared.Random; +using Content.Shared.Mind.Components; +using Content.Shared.Tag; +using Content.Shared.Cloning; +using Content.Shared.Random.Helpers; +using Robust.Shared.GameObjects.Components.Localization; + +namespace Content.Server.Cloning; + +public sealed partial class CloningSystem +{ + [Dependency] private readonly TagSystem _tag = default!; + [Dependency] private readonly GrammarSystem _grammar = default!; + + /// + /// Gets the entity prototype to spawn for a clone based on karma and chance calculations. + /// + private string GetSpawnEntity(Entity ent, float karmaBonus, SpeciesPrototype oldSpecies, out SpeciesPrototype? species, int karma = 0) + { + // First time being cloned - return original species + if (karma == 0) + { + species = oldSpecies; + return oldSpecies.Prototype; + } + + var chance = ent.Comp.HumanoidBaseChance + karmaBonus; + chance -= (1 - ent.Comp.HumanoidBaseChance) * karma; + + // Perfect clone chance + if (chance > 1 && _robustRandom.Prob(chance - 1)) + { + species = oldSpecies; + return oldSpecies.Prototype; + } + + // Roll for humanoid vs non-humanoid + chance = Math.Clamp(chance, 0, 1); + if (_robustRandom.Prob(chance)) + { + if (_prototype.TryIndex(ent.Comp.MetempsychoticHumanoidPool, out var humanoidPool)) + { + var protoId = humanoidPool.Pick(); + if (_prototype.TryIndex(protoId, out var speciesPrototype)) + { + species = speciesPrototype; + return speciesPrototype.Prototype; + } + } + } + else if (_prototype.TryIndex(ent.Comp.MetempsychoticNonHumanoidPool, out var nonHumanoidPool)) + { + // For non-humanoids, return the entity prototype directly + species = null; + return nonHumanoidPool.Pick(); + } + + // Fallback to original species if prototype indexing fails + Log.Error("Failed to get valid clone type - falling back to original species"); + species = oldSpecies; + return oldSpecies.Prototype; + } + + /// + /// Handles fetching the mob and managing appearance for cloning with metempsychosis mechanics + /// + private EntityUid FetchAndSpawnMob( + Entity pod, + HumanoidCharacterProfile pref, + SpeciesPrototype speciesPrototype, + HumanoidAppearanceComponent humanoid, + EntityUid bodyToClone, + float karmaBonus) + { + List sexes = []; + var switchingSpecies = false; + var applyKarma = false; + var toSpawn = speciesPrototype.Prototype; + + // Get existing karma score or start at 0 + var karmaScore = 0; + if (TryComp(bodyToClone, out var oldKarma)) + { + karmaScore = oldKarma.Score; + } + + if (TryComp(pod.Owner, out var metem)) + { + var metemEntity = new Entity(pod.Owner, metem); + toSpawn = GetSpawnEntity(metemEntity, karmaBonus, speciesPrototype, out var newSpecies, karmaScore); + applyKarma = true; + + if (newSpecies != null) + { + sexes = newSpecies.Sexes; + speciesPrototype = newSpecies; + + if (speciesPrototype.ID != newSpecies.ID) + switchingSpecies = true; + } + } + + var mob = Spawn(toSpawn, _transformSystem.GetMapCoordinates(pod.Owner)); + + // Only try to handle humanoid appearance if we have a humanoid component + if (TryComp(mob, out var newHumanoid)) + { + if (switchingSpecies || HasComp(bodyToClone)) + { + pref = HumanoidCharacterProfile.RandomWithSpecies(newHumanoid.Species); + if (sexes.Contains(humanoid.Sex)) + pref = pref.WithSex(humanoid.Sex); + + pref = pref.WithGender(humanoid.Gender); + pref = pref.WithAge(humanoid.Age); + } + + _humanoidSystem.LoadProfile(mob, pref); + } + + if (applyKarma) + { + var karma = EnsureComp(mob); + karma.Score = karmaScore + 1; // Increment karma score + } + + var ev = new CloningEvent(bodyToClone, mob); + RaiseLocalEvent(bodyToClone, ref ev); + + if (!ev.NameHandled) + _metaSystem.SetEntityName(mob, MetaData(bodyToClone).EntityName); + + var grammar = EnsureComp(mob); + var grammarEnt = new Entity(mob, grammar); + _grammar.SetProperNoun(grammarEnt, true); + _grammar.SetGender(grammarEnt, humanoid.Gender); + Dirty(mob, grammar); + + SetupBasicComponents(mob); + + return mob; + } + + // I hate this + private void SetupBasicComponents(EntityUid mob) + { + EnsureComp(mob); + EnsureComp(mob); + EnsureComp(mob); + EnsureComp(mob); + EnsureComp(mob); + EnsureComp(mob); + RemComp(mob); + RemComp(mob); + RemComp(mob); + RemComp(mob); + + _tag.AddTag(mob, "DoorBumpOpener"); + } +} diff --git a/Content.Server/DeltaV/Cloning/MetempsychosisKarmaComponent.cs b/Content.Server/DeltaV/Cloning/MetempsychosisKarmaComponent.cs new file mode 100644 index 0000000000..a9e7ff8244 --- /dev/null +++ b/Content.Server/DeltaV/Cloning/MetempsychosisKarmaComponent.cs @@ -0,0 +1,11 @@ +namespace Content.Server.DeltaV.Cloning; + +/// +/// This tracks how many times you have already been cloned and lowers your chance of getting a humanoid each time. +/// +[RegisterComponent] +public sealed partial class MetempsychosisKarmaComponent : Component +{ + [DataField] + public int Score; +} diff --git a/Content.Server/DeltaV/Cloning/MetempsychoticMachineComponent.cs b/Content.Server/DeltaV/Cloning/MetempsychoticMachineComponent.cs new file mode 100644 index 0000000000..d913f2d209 --- /dev/null +++ b/Content.Server/DeltaV/Cloning/MetempsychoticMachineComponent.cs @@ -0,0 +1,27 @@ +using Content.Shared.Random; +using Robust.Shared.Prototypes; + +namespace Content.Server.DeltaV.Cloning; + +[RegisterComponent] +public sealed partial class MetempsychoticMachineComponent : Component +{ + /// + /// Base probability of remaining humanoid during cloning. Higher karma reduces this chance. + /// + [DataField] + public float HumanoidBaseChance = 0.75f; + + /// + /// Species prototypes pool to use for humanoids. + /// + [DataField] + public ProtoId MetempsychoticHumanoidPool = "MetempsychoticHumanoidPool"; + + /// + /// Entitiy prototypes pool to use for non-humanoids. + /// + [DataField] + public ProtoId MetempsychoticNonHumanoidPool = "MetempsychoticNonhumanoidPool"; +} + diff --git a/Content.Server/Destructible/Thresholds/Behaviors/SpillBehavior.cs b/Content.Server/Destructible/Thresholds/Behaviors/SpillBehavior.cs index ff050ce2cd..d45fe707ab 100644 --- a/Content.Server/Destructible/Thresholds/Behaviors/SpillBehavior.cs +++ b/Content.Server/Destructible/Thresholds/Behaviors/SpillBehavior.cs @@ -1,42 +1,60 @@ -using Content.Shared.Chemistry.EntitySystems; using Content.Server.Fluids.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Fluids.Components; using JetBrains.Annotations; -namespace Content.Server.Destructible.Thresholds.Behaviors +namespace Content.Server.Destructible.Thresholds.Behaviors; + +[UsedImplicitly] +[DataDefinition] +public sealed partial class SpillBehavior : IThresholdBehavior { - [UsedImplicitly] - [DataDefinition] - public sealed partial class SpillBehavior : IThresholdBehavior + /// + /// Optional fallback solution name if SpillableComponent is not present. + /// + [DataField] + public string? Solution; + + /// + /// When triggered, spills the entity's solution onto the ground. + /// Will first try to use the solution from a SpillableComponent if present, + /// otherwise falls back to the solution specified in the behavior's data fields. + /// The solution is properly drained/split before spilling to prevent double-spilling with other behaviors. + /// + /// Entity whose solution will be spilled + /// System calling this behavior + /// Optional entity that caused this behavior to trigger + public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null) { - [DataField] - public string? Solution; + var solutionContainerSystem = system.EntityManager.System(); + var spillableSystem = system.EntityManager.System(); + var coordinates = system.EntityManager.GetComponent(owner).Coordinates; - /// - /// If there is a SpillableComponent on EntityUidowner use it to create a puddle/smear. - /// Or whatever solution is specified in the behavior itself. - /// If none are available do nothing. - /// - /// Entity on which behavior is executed - /// system calling the behavior - /// - public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null) + Solution targetSolution; + + // First try to get solution from SpillableComponent + if (system.EntityManager.TryGetComponent(owner, out SpillableComponent? spillableComponent) && + solutionContainerSystem.TryGetSolution(owner, spillableComponent.SolutionName, out var solution, out var compSolution)) { - var solutionContainerSystem = system.EntityManager.System(); - var spillableSystem = system.EntityManager.System(); - - var coordinates = system.EntityManager.GetComponent(owner).Coordinates; - - if (system.EntityManager.TryGetComponent(owner, out SpillableComponent? spillableComponent) && - solutionContainerSystem.TryGetSolution(owner, spillableComponent.SolutionName, out _, out var compSolution)) - { - spillableSystem.TrySplashSpillAt(owner, coordinates, compSolution, out _, false, user: cause); - } - else if (Solution != null && - solutionContainerSystem.TryGetSolution(owner, Solution, out _, out var behaviorSolution)) - { - spillableSystem.TrySplashSpillAt(owner, coordinates, behaviorSolution, out _, user: cause); - } + // If entity is drainable, drain the solution. Otherwise just split it. + // Both methods ensure the solution is properly removed. + targetSolution = system.EntityManager.HasComponent(owner) + ? solutionContainerSystem.Drain((owner, system.EntityManager.GetComponent(owner)), solution.Value, compSolution.Volume) + : compSolution.SplitSolution(compSolution.Volume); } + // Fallback to solution specified in behavior data + else if (Solution != null && + solutionContainerSystem.TryGetSolution(owner, Solution, out var solutionEnt, out var behaviorSolution)) + { + targetSolution = system.EntityManager.HasComponent(owner) + ? solutionContainerSystem.Drain((owner, system.EntityManager.GetComponent(owner)), solutionEnt.Value, behaviorSolution.Volume) + : behaviorSolution.SplitSolution(behaviorSolution.Volume); + } + else + return; + + // Spill the solution that was drained/split + spillableSystem.TrySplashSpillAt(owner, coordinates, targetSolution, out _, false, cause); } } diff --git a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs index fec65430c1..679656b54f 100644 --- a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs @@ -3,6 +3,7 @@ using Content.Server.Body.Systems; using Content.Server.Kitchen.Components; using Content.Server.Popups; using Content.Shared.Chat; +using Content.Shared.Body.Part; // DeltaV using Content.Shared.Damage; using Content.Shared.Database; using Content.Shared.DoAfter; @@ -160,9 +161,12 @@ namespace Content.Server.Kitchen.EntitySystems _transform.SetCoordinates(victimUid, Transform(uid).Coordinates); // THE WHAT? // TODO: Need to be able to leave them on the spike to do DoT, see ss13. - var gibs = _bodySystem.GibBody(victimUid); + var gibs = _bodySystem.GibBody(victimUid, gibOrgans: true); // DeltaV: spawn organs foreach (var gib in gibs) { - QueueDel(gib); + // Begin DeltaV changes: Only delete limbs instead of organs + if (HasComp(gib)) + QueueDel(gib); + // End DeltaV changes } _audio.PlayEntity(component.SpikeSound, Filter.Pvs(uid), uid, true); diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs index f7ae04b61e..a1831fef34 100644 --- a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs @@ -9,7 +9,7 @@ using Content.Shared.Actions.Events; namespace Content.Server.Abilities.Psionics { - public sealed class TelegnosisPowerSystem : EntitySystem + public sealed class TelegnosisPowerSystem : SharedTelegnosisPowerSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffects = default!; diff --git a/Content.Server/Nyanotrasen/Cloning/MetempsychosisKarmaComponent.cs b/Content.Server/Nyanotrasen/Cloning/MetempsychosisKarmaComponent.cs deleted file mode 100644 index 246495cee0..0000000000 --- a/Content.Server/Nyanotrasen/Cloning/MetempsychosisKarmaComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Content.Server.Nyanotrasen.Cloning -{ - /// - /// This tracks how many times you have already been cloned and lowers your chance of getting a humanoid each time. - /// - [RegisterComponent] - public sealed partial class MetempsychosisKarmaComponent : Component - { - [DataField("score")] - public int Score = 0; - } -} diff --git a/Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineComponent.cs b/Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineComponent.cs deleted file mode 100644 index 0adcc9b5b2..0000000000 --- a/Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineComponent.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Content.Shared.Random; - -namespace Content.Server.Nyanotrasen.Cloning -{ - [RegisterComponent] - public sealed partial class MetempsychoticMachineComponent : Component - { - /// - /// Chance you will spawn as a humanoid instead of a non humanoid. - /// - [DataField("humanoidBaseChance")] - public float HumanoidBaseChance = 0.75f; - - [ValidatePrototypeId] - [DataField("metempsychoticHumanoidPool")] - public string MetempsychoticHumanoidPool = "MetempsychoticHumanoidPool"; - - [ValidatePrototypeId] - [DataField("metempsychoticNonHumanoidPool")] - public string MetempsychoticNonHumanoidPool = "MetempsychoticNonhumanoidPool"; - } -} diff --git a/Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs b/Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs deleted file mode 100644 index 62dc1b078e..0000000000 --- a/Content.Server/Nyanotrasen/Cloning/MetempsychoticMachineSystem.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Content.Shared.Humanoid.Prototypes; -using Content.Shared.Random; -using Content.Shared.Random.Helpers; -using Robust.Shared.Random; -using Robust.Shared.Prototypes; - -namespace Content.Server.Nyanotrasen.Cloning -{ - public sealed class MetempsychoticMachineSystem : EntitySystem - { - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - - private ISawmill _sawmill = default!; - - public string GetSpawnEntity(EntityUid uid, float karmaBonus, MetempsychoticMachineComponent component, SpeciesPrototype oldSpecies, out SpeciesPrototype? species, int? karma = null) - { - var chance = component.HumanoidBaseChance + karmaBonus; - - if (karma != null) - chance -= ((1 - component.HumanoidBaseChance) * (float) karma); - - if (chance > 1 && _random.Prob(chance - 1)) - { - species = oldSpecies; - return oldSpecies.Prototype; - } - else - chance = 1; - - chance = Math.Clamp(chance, 0, 1); - if (_random.Prob(chance) && - _prototypeManager.TryIndex(component.MetempsychoticHumanoidPool, out var humanoidPool) && - _prototypeManager.TryIndex(humanoidPool.Pick(), out var speciesPrototype)) - { - species = speciesPrototype; - return speciesPrototype.Prototype; - } - else - { - species = null; - _sawmill.Error("Could not index species for metempsychotic machine..."); - return "MobHuman"; - } - } - } -} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/SharedTelegnosisPowerSystem.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/SharedTelegnosisPowerSystem.cs new file mode 100644 index 0000000000..5fec9cc931 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/SharedTelegnosisPowerSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Interaction.Events; + +namespace Content.Shared.Abilities.Psionics; + +public abstract class SharedTelegnosisPowerSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteractionAttempt); + } + + private void OnInteractionAttempt(Entity ent, ref InteractionAttemptEvent args) + { + // no astrally stealing someones shoes + args.Cancelled = true; + } +} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs index 51958822a4..d794f2e00c 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs @@ -5,7 +5,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy namespace Content.Shared.Abilities.Psionics { - [RegisterComponent] + [RegisterComponent, Access(typeof(SharedTelegnosisPowerSystem))] public sealed partial class TelegnosisPowerComponent : Component { [DataField("prototype")] @@ -20,4 +20,4 @@ namespace Content.Shared.Abilities.Psionics [DataField("telegnosisActionEntity")] public EntityUid? TelegnosisActionEntity; } -} \ No newline at end of file +} diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs index 9d627cb42d..8de2b046d8 100644 --- a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs +++ b/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs @@ -1,6 +1,4 @@ -namespace Content.Shared.Abilities.Psionics -{ - [RegisterComponent] - public sealed partial class TelegnosticProjectionComponent : Component - {} -} \ No newline at end of file +namespace Content.Shared.Abilities.Psionics; + +[RegisterComponent, Access(typeof(SharedTelegnosisPowerSystem))] +public sealed partial class TelegnosticProjectionComponent : Component; diff --git a/Resources/Changelog/DeltaVChangelog.yml b/Resources/Changelog/DeltaVChangelog.yml index 96d417e75f..bdbaa3da1a 100644 --- a/Resources/Changelog/DeltaVChangelog.yml +++ b/Resources/Changelog/DeltaVChangelog.yml @@ -1,74 +1,4 @@ Entries: -- author: Ygg01 - changes: - - message: Digging dirt. - type: Add - id: 158 - time: '2023-12-06T15:58:00.0000000+00:00' -- author: Velcroboy - changes: - - message: Buffed Food Cart storage. Get out there and slang some burgers, chefs! - type: Tweak - id: 159 - time: '2023-12-06T15:58:43.0000000+00:00' -- author: ps3moira - changes: - - message: Added mouse operative reinforcements, which can be bought from the Syndicate - uplink - type: Add - id: 160 - time: '2023-12-06T16:03:07.0000000+00:00' -- author: evilexecutive - changes: - - message: Harpies now have a visual indication when they're playing a Midi. - type: Add - - message: Harpies have been re-balanced so that they now actually have a numerical - positive. - type: Tweak - id: 161 - time: '2023-12-06T20:10:49.0000000+00:00' -- author: DebugOk - changes: - - message: Due to abuse, prisoners now require whitelist to play. - type: Tweak - id: 162 - time: '2023-12-07T13:22:03.0000000+00:00' -- author: ps3moira - changes: - - message: Removed bionic syrinx implanter from surplus crate. - type: Remove - id: 163 - time: '2023-12-11T23:11:41.0000000+00:00' -- author: ps3moira - changes: - - message: Removed Carpotoxin from Sashimi, now they are sushi-grade! - type: Remove - id: 164 - time: '2023-12-13T20:12:46.0000000+00:00' -- author: Adrian16199 - changes: - - message: Crew has learned how to make a straw hat out of wheat bushels! - type: Add - id: 165 - time: '2023-12-13T20:13:45.0000000+00:00' -- author: IamVelcroboy - changes: - - message: Added Yule! Happy Holidays! - type: Add - id: 166 - time: '2023-12-13T20:21:34.0000000+00:00' -- author: ps3moira - changes: - - message: Added Fish n' Chips. Thank the British! - type: Add - id: 167 - time: '2023-12-13T20:32:51.0000000+00:00' -- author: Adrian16199 - changes: - - message: Felinids now meow out their words. They can also sigh now. - type: Tweak - id: 168 - time: '2023-12-13T21:28:39.0000000+00:00' - author: VMSolidus changes: - message: Harpies no longer choke on completely breathable air @@ -3714,3 +3644,84 @@ id: 657 time: '2024-11-08T13:38:47.0000000+00:00' url: https://github.com/DeltaV-Station/Delta-v/pull/2148 +- author: Aikakakah + changes: + - message: Added a black turtleneck! + type: Add + id: 658 + time: '2024-11-08T20:50:40.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/1905 +- author: deltanedas + changes: + - message: Butchering people now drops organs. + type: Tweak + id: 659 + time: '2024-11-09T04:40:16.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2154 +- author: MilonPL + changes: + - message: The metempsychosis will always use your player character on the first + cloning attempt. + type: Tweak + - message: Fixed metempsychosis never selecting non-humanoid characters. + type: Fix + id: 660 + time: '2024-11-09T10:47:17.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2156 +- author: MilonPL + changes: + - message: Fixed beaker solutions duplicating whenever it's thrown. + type: Fix + id: 661 + time: '2024-11-09T12:46:34.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2157 +- author: deltanedas + changes: + - message: The Synthesis Specialist's vendor can now be restocked. + type: Tweak + id: 662 + time: '2024-11-09T13:16:44.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2143 +- author: deltanedas + changes: + - message: Fixed telegnostic projections being able to interact with things. + type: Tweak + id: 663 + time: '2024-11-09T19:27:59.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2117 +- author: Unkn0wnGh0st333 + changes: + - message: Synthesis Specialist ghost rules have been slightly adjusted. + type: Tweak + id: 664 + time: '2024-11-09T19:44:28.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2152 +- author: Colin-Tel + changes: + - message: Removed the "Raise Glimmer" objective for traitors. + type: Remove + id: 665 + time: '2024-11-10T20:18:53.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2107 +- author: Colin-Tel + changes: + - message: Adjusted antagonist rule C3 and the line about bribery in C1. + type: Tweak + id: 666 + time: '2024-11-10T20:20:26.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2164 +- author: Stop-Signs + changes: + - message: Removed the T3 Lockout on epi techs + type: Remove + id: 667 + time: '2024-11-11T02:57:13.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2144 +- author: Radezolid + changes: + - message: The syringe gun is now a researcheable technology in the T2 civilian + category. Get it from the medical techfab once it's researched. + type: Tweak + id: 668 + time: '2024-11-11T15:41:44.0000000+00:00' + url: https://github.com/DeltaV-Station/Delta-v/pull/2169 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index cf6e514070..da92036192 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 12rabbits, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 2digitman, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, Agoichi, Ahion, aiden, Aikakakah, aitorlogedo, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, Alpha-Two, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, AndreyCamper, angelofallars, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, Avalon-Proto, avghdev, Awlod, azzy, AzzyIsNotHere, BackeTako, BananaFlambe, Baptr0b0t, BasedPugilist, BasedUser, Batuh1n, beck-thompson, BellwetherLogic, benev0, benjamin-burges, BGare, bhespiritu, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, Catofquestionableethics, CatTheSystem, Centronias, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, cheesePizza2, cheeseplated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbygummibear, Ciac32, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, CodedCrow, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, corentt, CormosLemming, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, d4kii, dabigoose, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, DarkenedSynergy, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DefinitelyNotFurryXD, degradka, Delete69, deltanedas, DeltaV-Bot, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, dge21, DieselMohawk, digitalic, Dimastra, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, dootythefrooty, Dorragon, Doru991, DoubleRiceEddiedd, DoutorWhite, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, Dynexust, Easypoller, eclips_e, eden077, EEASAS, Efruit, efzapa, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, esguard, estacaoespacialpirata, eugene, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, flyingkarii, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FryOfDestiny, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, greggthefather, GreyMario, GTRsound, Guess-My-Name, gusxyz, Gyrandola, h3half, Haltell, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Henry, HerCoyote23, hitomishirichan, hiucko, Hmeister-fake, Hmeister-real, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, htmlsystem, hubismal, Hugal31, Huxellberger, Hyenh, hyphenationc, i-justuser-i, iacore, IamVelcroboy, ian, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JoeHammad1844, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, Kurzaen, kxvvv, kyupolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, LittleNyanCat, lizelive, lleftTheDragon, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, memoblob, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, MilenVolf, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, mnemotechnician, moderatelyaware, modern-nm, mokiros, Moneyl, Monotheonist, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, NullWanderer, nyeogmi, Nylux, Nyranu, och-och, ocotheomega, OctoRocket, OldDanceJacket, onoira, OnyxTheBrave, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, PHCodes, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, Pireax, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, pofitlo, pointer-to-null, pok27, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PPooch, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, Renlou, retequizzle, RiceMar1244, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samsterious, SaphireLattice, SapphicOverload, sarahon, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, sh18rw, ShadeAware, ShadowCommander, Shadowtheprotogen546, shadowwailker, shaeone, shampunj, shariathotpatrol, ShatteredSwords, SignalWalker, siigiil, SimpleStation14, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Slyfox333, snebl, sniperchance, Snowni, snowsignal, solaris7518, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, Soydium, SpaceLizardSky, SpaceManiac, SpaceyLady, spartak, SpartanKadence, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, Squishy77, SsalamethVersaach, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, TadJohnson00, Tainakov, takemysoult, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGRCdev, tgrkzus, ThataKat, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, theashtronaut, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TheOneWhoIsManyFrame, theOperand, TherapyGoth, therealDLondon, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, Timemaster99, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, Titian3, tk-a369, tkdrg, tmtmtl30, toasterpm87, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, Uriende, UristMcDorf, user424242420, Vaaankas, valentfingerov, Varen, Vasilis, VasilisThePikachu, Velcroboy, veliebm, VelonacepsCalyxEggs, venn, veprolet, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, vitalvitriol, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, wtcwr68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, zonespace27, ZweiHawke, Zylofan, Zymem, zzylex +0x6273, 12rabbits, 13spacemen, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 2digitman, 3nderall, 4310v343k, 4dplanner, 612git, 778b, Ablankmann, abregado, Absolute-Potato, Acruid, actioninja, actually-reb, ada-please, adamsong, Adeinitas, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, Agoichi, Ahion, aiden, Aikakakah, aitorlogedo, AJCM-git, AjexRose, Alekshhh, alexkar598, AlexMorgan3817, alexumandxgabriel08x, Alithsko, ALMv1, Alpha-Two, AlphaQwerty, Altoids1, amylizzle, ancientpower, Andre19926, AndrewEyeke, AndreyCamper, angelofallars, Anzarot121, Appiah, ar4ill, ArchPigeon, ArchRBX, areitpog, Arendian, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, AruMoon, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, august-sun, AutoOtter, Avalon-Proto, avghdev, Awlod, azzy, AzzyIsNotHere, BackeTako, BananaFlambe, Baptr0b0t, BasedPugilist, BasedUser, Batuh1n, beck-thompson, BellwetherLogic, benev0, benjamin-burges, BGare, bhespiritu, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, BlitzTheSquishy, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, BombasterDS, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, capnsockless, CaptainSqrBeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, Catofquestionableethics, CatTheSystem, Centronias, chairbender, Charlese2, charlie, ChaseFlorom, chavonadelal, Cheackraze, cheesePizza2, cheeseplated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbygummibear, Ciac32, civilCornball, Clement-O, clyf, Clyybber, CMDR-Piboy314, CodedCrow, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, CookieMasterT, coolboy911, coolmankid12345, Coolsurf6, corentt, CormosLemming, crazybrain23, creadth, CrigCrag, croilbird, Crotalus, CrudeWax, CrzyPotato, cutemoongod, Cyberboss, d34d10cc, dabigoose, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, DangerRevolution, daniel-cr, DanSAussieITS, Daracke, DarkenedSynergy, Darkenson, DawBla, Daxxi3, dch-GH, de0rix, Deahaka, dean, DEATHB4DEFEAT, DeathCamel58, Deatherd, deathride58, DebugOk, Decappi, Decortex, Deeeeja, deepdarkdepths, DefinitelyNotFurryXD, degradka, Delete69, deltanedas, DeltaV-Bot, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, dexlerxd, dffdff2423, dge21, DieselMohawk, digitalic, Dimastra, DinoWattz, DisposableCrewmember42, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DoctorBeard, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, dootythefrooty, Dorragon, Doru991, DoubleRiceEddiedd, DoutorWhite, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, Dynexust, Easypoller, eclips_e, eden077, EEASAS, Efruit, efzapa, ElectroSR, elsie, elthundercloud, Elysium206, Emisse, emmafornash, EmoGarbage404, Endecc, eoineoineoin, eris, erohrs2, ERORR404V1, Errant-4, esguard, estacaoespacialpirata, eternally-confused, eugene, ewokswagger, exincore, exp111, f0x-n3rd, FacePluslll, Fahasor, FairlySadPanda, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, FillerVK, FinnishPaladin, FirinMaLazors, Fishfish458, FL-OZ, Flareguy, flashgnash, FluffiestFloof, FluffMe, FluidRock, flyingkarii, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, Fouin, foxhorn, freeman2651, freeze2222, Froffy025, Fromoriss, froozigiusz, FrostMando, FryOfDestiny, FungiFellow, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gaxeer, gbasood, Geekyhobo, genderGeometries, GeneralGaws, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, gituhabu, GlassEclipse, GNF54, godisdeadLOL, goet, Goldminermac, Golinth, GoodWheatley, Gorox221, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, greggthefather, GreyMario, GTRsound, Guess-My-Name, gusxyz, Gyrandola, h3half, Haltell, Hanzdegloker, HappyRoach, Hardly3D, harikattar, he1acdvv, Hebi, Henry, HerCoyote23, HighTechPuddle, hitomishirichan, hiucko, Hmeister-fake, Hmeister-real, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, Hreno, htmlsystem, hubismal, Hugal31, Huxellberger, Hyenh, hyphenationc, i-justuser-i, iacore, IamVelcroboy, ian, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imrenq, imweax, indeano, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, jacksonzck, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jaskanbe, JasperJRoth, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jmcb, JoeHammad1844, JohnGinnane, johnku1, Jophire, joshepvodka, Jrpl, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, KaiShibaa, kalane15, kalanosh, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, Kimpes, KingFroozy, kira-er, Kirillcas, Kirus59, Kistras, Kit0vras, KittenColony, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kosticia, koteq, KrasnoshchekovPavel, Krunklehorn, Kupie, Kurzaen, kxvvv, kyupolaris, kzhanik, lajolico, Lamrr, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leander-0, leonardo-dabepis, leonsfriedrich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, Lgibb18, lgruthes, LightVillet, liltenhead, LinkUyx, LittleBuilderJane, LittleNyanCat, lizelive, lleftTheDragon, localcc, lokachop, Lomcastar, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luizwritescode, Lukasz825700516, luminight, lunarcomets, luringens, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M3739, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, MagnusCrowe, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, Matz05, max, MaxNox7, maylokana, MehimoNemo, MeltedPixel, MemeProof, memoblob, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, MilenVolf, MilonPL, Minemoder5000, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterMecky, Mith-randalf, MjrLandWhale, mkanke-real, MLGTASTICa, mnemotechnician, moderatelyaware, modern-nm, mokiros, Moneyl, Monotheonist, Moomoobeef, moony, Morb0, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, muburu, MureixloI, musicmanvr, MWKane, Myakot, Myctai, N3X15, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, NIXC, NkoKirkto, nmajask, noctyrnal, noelkathegod, nok-ko, NonchalantNoob, NoobyLegion, Nopey, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, NullWanderer, nyeogmi, Nylux, Nyranu, och-och, ocotheomega, OctoRocket, OldDanceJacket, OnyxTheBrave, OrangeMoronage9622, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paigemaeforrest, pali6, Pangogie, panzer-iv1, paolordls, partyaddict, patrikturi, PaulRitter, peccneck, Peptide90, peptron1, PeterFuto, PetMudstone, pewter-wiz, Pgriha, Phantom-Lily, PHCodes, pheenty, Phill101, phunnyguy, PilgrimViis, Pill-U, Pireax, pissdemon, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, pofitlo, pointer-to-null, pok27, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PPooch, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuceTint, PuroSlavKing, PursuitInAshes, Putnam3145, qrtDaniil, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, Raitononai, Ramlik, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, RemberBM, RemieRichards, RemTim, Remuchi, rene-descartes2021, Renlou, retequizzle, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, RobbyTheFish, Rockdtben, Rohesie, rok-povsic, rolfero, RomanNovo, rosieposieeee, Roudenn, router, RumiTiger, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, Salex08, sam, samgithubaccount, Samsterious, SaphireLattice, SapphicOverload, sarahon, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, Segonist, sephtasm, Serkket, sewerpig, sh18rw, ShadeAware, ShadowCommander, Shadowtheprotogen546, shadowwailker, shaeone, shampunj, shariathotpatrol, ShatteredSwords, SignalWalker, siigiil, SimpleStation14, Simyon264, sirdragooon, Sirionaut, Sk1tch, SkaldetSkaeg, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Slyfox333, snebl, sniperchance, Snowni, snowsignal, solaris7518, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, southbridge-fur, Soydium, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, spartak, SpartanKadence, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, Squishy77, SsalamethVersaach, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, Stealthbomber16, stellar-novas, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, superjj18, Supernorn, SweptWasTaken, Sybil, SYNCHRONIC, Szunti, TadJohnson00, Tainakov, takemysoult, TaralGit, Taran, taurie, Tayrtahn, tday93, teamaki, TekuNut, telyonok, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, TGRCdev, tgrkzus, ThataKat, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, theashtronaut, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, TheIntoxicatedCat, thekilk, themias, theomund, TheOneWhoIsManyFrame, theOperand, TherapyGoth, therealDLondon, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, Timemaster99, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, Titian3, tk-a369, tkdrg, tmtmtl30, toasterpm87, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, Tornado-Technology, tosatur, TotallyLemon, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, Tyzemol, UbaserB, ubis1, UBlueberry, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, Uriende, UristMcDorf, user424242420, Vaaankas, valentfingerov, Varen, Vasilis, VasilisThePikachu, Velcroboy, veliebm, VelonacepsCalyxEggs, venn, veprolet, veritable-calamity, Veritius, Vermidia, vero5123, Verslebas, VigersRay, violet754, Visne, vitalvitriol, VMSolidus, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, vulppine, wafehling, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xkreksx, xprospero, xRiriq, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, Yousifb26, youtissoum, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, zamp, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zero, ZeroDiamond, ZeWaka, zionnBE, ZNixian, ZoldorfTheWizard, zonespace27, ZweiHawke, Zylofan, Zymem, zzylex diff --git a/Resources/Locale/en-US/deltav/administration/commands/announce-custom.ftl b/Resources/Locale/en-US/deltav/administration/commands/announce-custom.ftl new file mode 100644 index 0000000000..5ee04d2cd4 --- /dev/null +++ b/Resources/Locale/en-US/deltav/administration/commands/announce-custom.ftl @@ -0,0 +1,8 @@ +## AnnounceCustomCommand +cmd-announcecustom-desc = Send an in-game announcement with custom color and sound. +cmd-announcecustom-help = {$command} [sender] [color] [sound] - Send announcement. Sender defaults to CentCom, color to Gold, sound to announce.ogg + +# Completion hints +cmd-announcecustom-arg-message = message +cmd-announcecustom-arg-color = color in #RRGGBB format (optional) +cmd-announcecustom-arg-sound = sound path (optional) diff --git a/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl index 6923ae4105..232f4ed6ba 100644 --- a/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/deltav/ghost/roles/ghost-role-component.ftl @@ -30,12 +30,13 @@ ghost-role-information-silvia-rules = Keep the medical team company and help out ghost-role-information-synthesis-name = Synthesis Specialist ghost-role-information-synthesis-description = You are a member of Interdyne Pharmaceutics! You are provided all the tools to manufacture a variety of medical cocktails. Establish your craft, peddle your poisons, and make profit. ghost-role-information-synthesis-rules = - Brew deadly poisons, marvelous medicines, and anything in between. - Sell your concoctions to local agents, crew, and anyone with supplies. - Stay on your ship, it is your lifeblood! - + You are a [color=yellow][bold]Free-Agent[/bold][/color]. You are free to act as either an antagonist or a non-antagonist. You are just a chemist so do not act like a full-on antagonist, i.e. no killing people yourself unless your ship is in danger. + Brew deadly poisons, marvelous medicines, and anything in between. + Sell your concoctions to [color=red]local agents[/color], crew, and anyone with supplies. + Stay on your ship; it is your job, home, and lifeblood. + ghost-role-information-closet-skeleton-rules = You are a old member of the station, try to get your previous job back or dwell in the maintenance tunnels!. You are a [color=green][bold]Non-antagonist[/bold][/color]. You should generally not seek to harm the station and its crew. You're allowed some minor mischief. diff --git a/Resources/Locale/en-US/deltav/research/technologies.ftl b/Resources/Locale/en-US/deltav/research/technologies.ftl index 25377b155f..ae1a8fe69a 100644 --- a/Resources/Locale/en-US/deltav/research/technologies.ftl +++ b/Resources/Locale/en-US/deltav/research/technologies.ftl @@ -5,3 +5,4 @@ research-technology-energy-gun = Energy Guns research-technology-energy-gun-advance = Advanced Energy Manipulation research-technology-advance-laser = Advanced Laser Manipulation research-technology-robust-melee = Robust Melee +research-technology-syringe-gun = Syringe Gun diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index a4750e1059..1e2683e7e8 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -16,6 +16,7 @@ ClothingOuterPonchoClassic: 2 ClothingUniformJumpsuitKilt: 3 # DeltaV - SCOTTTTLANDDDDD FURREVERRRRR!! ClothingEyesEyepatch: 2 # Delta-V Yarrr + ClothingUniformBlackTurtleneck : 2 # DeltaV - Clothing addition ClothingHeadHatPwig: 2 ClothingOuterRobesJudge: 2 ClothingOuterPoncho: 2 diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/engine.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/engine.yml new file mode 100644 index 0000000000..252d5762ff --- /dev/null +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Crates/engine.yml @@ -0,0 +1,45 @@ +- type: entity + parent: CrateEngineering + id: CrateEngineEssentials + name: engine essentials crate + description: Everything you need to power the station, in a superposition of containing both a singularity and a tesla. + suffix: 1 per map MAX + components: + - type: EntityTableContainerFill + containers: + entity_storage: !type:GroupSelector + children: + - !type:NestedSelector + tableId: TeslaEssentials + - !type:NestedSelector + tableId: SingularityEssentials + +- type: entityTable + id: TeslaEssentials + table: !type:AllSelector + children: + - id: TeslaGeneratorFlatpack + - id: TeslaGeneratorFlatpack + prob: 0.3 # Small chance of a free backup + - id: TeslaCoilFlatpack + amount: !type:RangeNumberSelector + range: 4, 6 + - id: TeslaGroundingRodFlatpack + amount: !type:ConstantNumberSelector + value: 4 + +- type: entityTable + id: SingularityEssentials + table: !type:AllSelector + children: + - id: SingularityGeneratorFlatpack + - id: SingularityGeneratorFlatpack + prob: 0.3 # Small chance of a free backup + # intentionally separate rolls so they are probably mismatched + # you might get spare tanks you might have to get more from the tank dispenser + - id: RadiationCollectorFlatpack + amount: !type:RangeNumberSelector + range: 8, 12 + - id: PlasmaTankFilled + amount: !type:RangeNumberSelector + range: 8, 12 diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml index b4f9cd73c7..5d950e6e42 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml @@ -397,3 +397,13 @@ - type: Clothing sprite: DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi +- type: entity + parent: ClothingUniformFoldableBase + id: ClothingUniformBlackTurtleneck + name: black turtleneck + description: A simple black turtleneck. Perfect for any wannabe spy. + components: + - type: Sprite + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi + - type: Clothing + sprite: DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi diff --git a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml index 3b5329e230..db571aa635 100644 --- a/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml +++ b/Resources/Prototypes/DeltaV/Entities/Structures/Wallmounts/Signs/signs.yml @@ -38,4 +38,12 @@ sprite: DeltaV/Structures/Wallmounts/signs.rsi state: direction_court - +- type: entity + parent: BaseSignDirectional + id: SignDirectionaAI + name: AI sign + description: A direction sign, pointing out which way the AI core is. + components: + - type: Sprite + sprite: DeltaV/Structures/Wallmounts/signs.rsi + state: direction_aicore diff --git a/Resources/Prototypes/DeltaV/Recipes/Lathes/medical.yml b/Resources/Prototypes/DeltaV/Recipes/Lathes/medical.yml index 7de2021c79..945829974e 100644 --- a/Resources/Prototypes/DeltaV/Recipes/Lathes/medical.yml +++ b/Resources/Prototypes/DeltaV/Recipes/Lathes/medical.yml @@ -5,3 +5,20 @@ materials: Steel: 300 Glass: 100 + +- type: latheRecipe + id: LauncherSyringe + result: LauncherSyringe + completetime: 3 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + +- type: latheRecipe + id: MiniSyringe + result: MiniSyringe + completetime: 1 + materials: + Plastic: 150 + Steel: 50 diff --git a/Resources/Prototypes/DeltaV/Research/civilianservices.yml b/Resources/Prototypes/DeltaV/Research/civilianservices.yml new file mode 100644 index 0000000000..73be7fb5a9 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Research/civilianservices.yml @@ -0,0 +1,12 @@ +- type: technology + id: SyringeGun + name: research-technology-syringe-gun + icon: + sprite: Objects/Weapons/Guns/Cannons/syringe_gun.rsi + state: syringe_gun + discipline: CivilianServices + tier: 2 + cost: 10000 + recipeUnlocks: + - LauncherSyringe + - MiniSyringe diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml index 3e91218e40..c7851aff88 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/vending_machine_restock.yml @@ -482,6 +482,7 @@ - type: VendingMachineRestock canRestock: - ChemVendInventory + - ChemVendInventorySyndicate # DeltaV: Let it restock synthesis/nukie vendor - type: Sprite layers: - state: base diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index f6f58803ed..6761b7f181 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -436,6 +436,8 @@ - MagazineBoxSpecialHoly - MagazineBoxSpecialMindbreaker - AdvancedTruncheon + - LauncherSyringe + - MiniSyringe # End DeltaV additions - type: entity @@ -1066,6 +1068,10 @@ - WhiteCane - AACTablet # DeltaV dynamicRecipes: + # Begin DeltaV additions + - LauncherSyringe + - MiniSyringe + # End DeltaV additions - ChemicalPayload - CryostasisBeaker - BluespaceBeaker diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 90a7d71195..525c3ffebd 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -2160,7 +2160,7 @@ parent: VendingMachineChemicals id: VendingMachineChemicalsSyndicate name: SyndieJuice - description: Not made with freshly squeezed syndies I hope. + description: Not made with freshly squeezed syndies I hope. Backwards compatible with standard ChemVend restocks. # DeltaV: Add chemvend part components: - type: VendingMachine pack: ChemVendInventorySyndicate diff --git a/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml b/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml index eee0f05e36..19832813f0 100644 --- a/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml +++ b/Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml @@ -50,18 +50,3 @@ # components: # - BecomePsionicCondition # - type: BecomeGolemCondition - -- type: entity - id: RaiseGlimmerObjective - parent: BaseTraitorObjective - name: Raise Glimmer. - description: Get the glimmer above the specified amount. - components: - - type: Objective - difficulty: 2.5 - #unique: false - icon: - sprite: Nyanotrasen/Icons/psi.rsi - state: psi - - type: RaiseGlimmerCondition - target: 500 diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index 05f563c297..d870db5d36 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -49,8 +49,6 @@ weights: RandomTraitorAliveObjective: 1 RandomTraitorProgressObjective: 1 - RaiseGlimmerObjective: 0.5 # Nyanotrasen - Raise glimmer to a target amount, see Resources/Prototypes/Nyanotrasen/Objectives/traitor.yml - #Thief groups - type: weightedRandom diff --git a/Resources/Prototypes/Research/disciplines.yml b/Resources/Prototypes/Research/disciplines.yml index 7a661da1a3..b154785327 100644 --- a/Resources/Prototypes/Research/disciplines.yml +++ b/Resources/Prototypes/Research/disciplines.yml @@ -5,10 +5,11 @@ icon: sprite: Interface/Misc/research_disciplines.rsi state: industrial + lockoutTier: 4 # DeltaV: Lockout occurs at t4 tierPrerequisites: 1: 0 - 2: 0.75 - 3: 0.75 + 2: 1 # DeltaV: raised to 1 + 3: 1 # DeltaV: raised to 1 - type: techDiscipline id: Arsenal @@ -17,10 +18,11 @@ icon: sprite: Interface/Misc/research_disciplines.rsi state: arsenal + lockoutTier: 4 # DeltaV: Lockout occurs at t4 tierPrerequisites: 1: 0 - 2: 0.75 - 3: 0.75 + 2: 1 # DeltaV: raised to 1 + 3: 1 # DeltaV: raised to 1 - type: techDiscipline id: Experimental @@ -29,10 +31,11 @@ icon: sprite: Interface/Misc/research_disciplines.rsi state: experimental + lockoutTier: 4 # DeltaV: Lockout occurs at t4 tierPrerequisites: 1: 0 - 2: 0.75 - 3: 0.75 + 2: 1 # DeltaV: raised to 1 + 3: 1 # DeltaV: raised to 1 - type: techDiscipline id: CivilianServices @@ -41,7 +44,8 @@ icon: sprite: Interface/Misc/research_disciplines.rsi state: civilianservices + lockoutTier: 4 # DeltaV: Lockout occurs at t4 tierPrerequisites: 1: 0 - 2: 0.75 - 3: 0.75 + 2: 1 # DeltaV: raised to 1 + 3: 1 # DeltaV: raised to 1 diff --git a/Resources/ServerInfo/Guidebook/DeltaV/Rules/GameRules/2_Metagaming.xml b/Resources/ServerInfo/Guidebook/DeltaV/Rules/GameRules/2_Metagaming.xml index bc7d7d93f7..7047855e82 100644 --- a/Resources/ServerInfo/Guidebook/DeltaV/Rules/GameRules/2_Metagaming.xml +++ b/Resources/ServerInfo/Guidebook/DeltaV/Rules/GameRules/2_Metagaming.xml @@ -116,7 +116,6 @@ - Giving a character additional access or a job because you are friends with the player who is playing that character. - Trusting a character because you are friends with the player who is playing that character. - Not fighting a character because you are friends with the player who is playing that character. - - Ignoring your objective to kill a character because your character and theirs became friends in a previous round. ## Metagrudging Examples These are all examples of things that are prohibited by at least one metashield item that is never revealed IC. diff --git a/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C1_CommandSecurityJustice.xml b/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C1_CommandSecurityJustice.xml index 73cad37635..98ad2308a0 100644 --- a/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C1_CommandSecurityJustice.xml +++ b/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C1_CommandSecurityJustice.xml @@ -4,7 +4,7 @@ Security, Justice, and Command roles are held to a higher standard of roleplay, - Your character must act in a manner that NanoTrasen would reasonably hire them to this position. - Your character is presumed to be sane, competent in their duties, and able to make decisions to the benefit of the station. - Giving away Traitor objective items and sensitive equipment should be avoided in these roles. Your character should value them deeply. - - Leeway is given to making deals with criminals if the deal benefits the safety or situation of the crew and station. + - Leeway is given to making deals with criminals if the deal benefits the safety or situation of the crew and station OR if the deal involves items of a primarily sentimental value (e.g. HoP's Ian scrapbook, LO's lucky dollar). - Leeway can be given in [color=#ff0000]extreme circumstances[/color] of emergency/crisis. - The three departments are required to read and follow Delta-V Space Law, Standard Operating Procedure, Alert Procedure, and Company Policy to the best of their ability. - [color=#ff0000]Circumstances and context may permit you to break these laws. However, the fact that this rule is malleable is not an excuse to ignore it entirely.[/color] diff --git a/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C3_Antags.xml b/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C3_Antags.xml index 7da8c25517..cb76f7da9e 100644 --- a/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C3_Antags.xml +++ b/Resources/ServerInfo/Guidebook/DeltaV/Rules/RoleRules/C3_Antags.xml @@ -1,9 +1,12 @@ # Rule C3: Antagonist Guidelines +[color=#ffff00]Being an antagonist does not allow you to stop playing a character. Determine how your character would react to being given these objectives, and work through it appropriately.[/color] + Through engaging in antagonistic activity, you should seek to make the round more engaging and fun as the primary driver of the narrative of a round. Succeeding as an antagonist should not be your goal, but rather telling the most interesting story for everyone involved. - [color=#ff0000]Antagonists are free to complete their objectives through committing proportional damage. Through roleplay, damage becomes more proportional.[/color] Example: Holding the singulo hostage for a theft objective is acceptable, while simply singuloosing and using that chaos is unacceptable. - Killing players unrelated to your immediate objective in a manner that results in their round removal should be avoided. Crew that do not make an attempt at self preservation, or engage in valid-hunting, are exempt from this. - If you are concerned as to whether or not what you're about to do is allowed, feel free to AHelp and ask an admin for clarification. [color=#ff0000]Lack of administrator response does not constitute approval.[/color] + - While antagonists are [color=#ffff00]not required[/color] to complete their objectives, they are still encouraged to act as an antagonist in the round while roleplaying. - Other antagonists are not necessarily your friends. Other antagonists are often free agents that you may negotiate with at your own risk. - If you are a team antagonist, you must work with your partners to complete any shared objectives. - Excessively lame tactics are strictly forbidden for all antags except for station-destroying antags, such as nuclear operatives or space dragons. Examples include: diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..9ce3bbaaef Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/icon.png new file mode 100644 index 0000000000..30dfe73d01 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/icon.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/inhand-left.png new file mode 100644 index 0000000000..8abe548a25 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/inhand-left.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/inhand-right.png new file mode 100644 index 0000000000..9df7254090 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/inhand-right.png differ diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/meta.json new file mode 100644 index 0000000000..4c65091e30 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-4.0", + "copyright": "Created by Aikakakah (github) for Delta-V", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "rolled-equipped-INNERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/rolled-equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/rolled-equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..5d4a55d013 Binary files /dev/null and b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/black_turtleneck.rsi/rolled-equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_aicore.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_aicore.png new file mode 100644 index 0000000000..226a799578 Binary files /dev/null and b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_aicore.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 13aab65cbc..08393f464a 100644 --- a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json +++ b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/meta.json @@ -23,6 +23,10 @@ "name": "direction_justice", "directions": 4 }, + { + "name": "direction_aicore", + "directions": 4 + }, { "name": "chapel" }