From 2ff59f153ef965ba4e243a067baebd6f8a0c40f7 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Wed, 12 Mar 2025 16:48:39 +0100 Subject: [PATCH 01/27] Add support for antag-before-job selection (#35789) * Add support for antag-before-job selection * Include logging --- .../Antag/AntagSelectionSystem.API.cs | 72 +++++++++++- Content.Server/Antag/AntagSelectionSystem.cs | 110 +++++++++++++----- .../Components/AntagSelectionComponent.cs | 21 +++- .../Rules/GameRuleSystem.Utility.cs | 5 + .../Systems/StationJobsSystem.Roundstart.cs | 8 ++ Content.Shared/Antag/AntagAcceptability.cs | 10 +- 6 files changed, 186 insertions(+), 40 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.API.cs b/Content.Server/Antag/AntagSelectionSystem.API.cs index a4cb6fd0e5975..c89e4df312ac5 100644 --- a/Content.Server/Antag/AntagSelectionSystem.API.cs +++ b/Content.Server/Antag/AntagSelectionSystem.API.cs @@ -3,7 +3,9 @@ using Content.Server.Antag.Components; using Content.Server.GameTicking.Rules.Components; using Content.Server.Objectives; +using Content.Shared.Antag; using Content.Shared.Chat; +using Content.Shared.GameTicking.Components; using Content.Shared.Mind; using Content.Shared.Preferences; using JetBrains.Annotations; @@ -25,7 +27,7 @@ public bool TryGetNextAvailableDefinition(Entity ent, definition = null; var totalTargetCount = GetTargetAntagCount(ent, players); - var mindCount = ent.Comp.SelectedMinds.Count; + var mindCount = ent.Comp.AssignedMinds.Count; if (mindCount >= totalTargetCount) return false; @@ -115,7 +117,7 @@ public int GetTargetAntagCount(Entity ent, int? playerC return new List<(EntityUid, SessionData, string)>(); var output = new List<(EntityUid, SessionData, string)>(); - foreach (var (mind, name) in ent.Comp.SelectedMinds) + foreach (var (mind, name) in ent.Comp.AssignedMinds) { if (!TryComp(mind, out var mindComp) || mindComp.OriginalOwnerUserId == null) continue; @@ -137,7 +139,7 @@ public List> GetAntagMinds(Entity>(); - foreach (var (mind, _) in ent.Comp.SelectedMinds) + foreach (var (mind, _) in ent.Comp.AssignedMinds) { if (!TryComp(mind, out var mindComp) || mindComp.OriginalOwnerUserId == null) continue; @@ -155,7 +157,7 @@ public List GetAntagMindEntityUids(Entity e if (!Resolve(ent, ref ent.Comp, false)) return new(); - return ent.Comp.SelectedMinds.Select(p => p.Item1).ToList(); + return ent.Comp.AssignedMinds.Select(p => p.Item1).ToList(); } /// @@ -247,7 +249,7 @@ public bool AllAntagsAlive(Entity ent) if (!Resolve(ent, ref ent.Comp, false)) return false; - return GetAliveAntagCount(ent) == ent.Comp.SelectedMinds.Count; + return GetAliveAntagCount(ent) == ent.Comp.AssignedMinds.Count; } /// @@ -352,8 +354,66 @@ public Entity ForceGetGameRuleEnt(string id) where T var ruleEnt = GameTicker.AddGameRule(id); RemComp(ruleEnt); var antag = Comp(ruleEnt); - antag.SelectionsComplete = true; // don't do normal selection. + antag.AssignmentComplete = true; // don't do normal selection. GameTicker.StartGameRule(ruleEnt); return (ruleEnt, antag); } + + /// + /// Get all sessions that have been preselected for antag. + /// + public HashSet GetPreSelectedAntagSessions(AntagSelectionComponent? except = null) + { + var result = new HashSet(); + var query = QueryAllRules(); + while (query.MoveNext(out var uid, out var comp, out _)) + { + if (HasComp(uid)) + continue; + + if (comp == except) + continue; + + if (!comp.PreSelectionsComplete) + continue; + + foreach (var def in comp.Definitions) + { + result.UnionWith(comp.PreSelectedSessions); + } + } + + return result; + } + + /// + /// Get all sessions that have been preselected for antag and are exclusive, i.e. should not be paired with other antags. + /// + public HashSet GetPreSelectedExclusiveAntagSessions(AntagSelectionComponent? except = null) + { + var result = new HashSet(); + var query = QueryAllRules(); + while (query.MoveNext(out var uid, out var comp, out _)) + { + if (HasComp(uid)) + continue; + + if (comp == except) + continue; + + if (!comp.PreSelectionsComplete) + continue; + + foreach (var def in comp.Definitions) + { + if (def.MultiAntagSetting == AntagAcceptability.None) + { + result.UnionWith(comp.PreSelectedSessions); + break; + } + } + } + + return result; + } } diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index ce7f3fec4c628..298fa61a67215 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -11,6 +11,7 @@ using Content.Server.Roles; using Content.Server.Roles.Jobs; using Content.Server.Shuttles.Components; +using Content.Server.Station.Events; using Content.Shared.Antag; using Content.Shared.Clothing; using Content.Shared.GameTicking; @@ -89,20 +90,34 @@ private void OnPlayerSpawning(RulePlayerSpawningEvent args) var query = QueryActiveRules(); while (query.MoveNext(out var uid, out _, out var comp, out _)) { - if (comp.SelectionTime != AntagSelectionTime.PrePlayerSpawn) + if (comp.SelectionTime != AntagSelectionTime.PrePlayerSpawn && comp.SelectionTime != AntagSelectionTime.IntraPlayerSpawn) continue; - if (comp.SelectionsComplete) + if (comp.AssignmentComplete) continue; - ChooseAntags((uid, comp), pool); + ChooseAntags((uid, comp), pool); // We choose the antags here... - foreach (var session in comp.SelectedSessions) + if (comp.SelectionTime == AntagSelectionTime.PrePlayerSpawn) { - args.PlayerPool.Remove(session); - GameTicker.PlayerJoinGame(session); + AssignPreSelectedSessions((uid, comp)); // ...But only assign them if PrePlayerSpawn + foreach (var session in comp.AssignedSessions) + { + args.PlayerPool.Remove(session); + GameTicker.PlayerJoinGame(session); + } } } + + // If IntraPlayerSpawn is selected, delayed rules should choose at this point too. + var queryDelayed = QueryDelayedRules(); + while (queryDelayed.MoveNext(out var uid, out _, out var comp, out _)) + { + if (comp.SelectionTime != AntagSelectionTime.IntraPlayerSpawn) + continue; + + ChooseAntags((uid, comp), pool); + } } private void OnJobsAssigned(RulePlayerJobsAssignedEvent args) @@ -110,10 +125,11 @@ private void OnJobsAssigned(RulePlayerJobsAssignedEvent args) var query = QueryActiveRules(); while (query.MoveNext(out var uid, out _, out var comp, out _)) { - if (comp.SelectionTime != AntagSelectionTime.PostPlayerSpawn) + if (comp.SelectionTime != AntagSelectionTime.PostPlayerSpawn && comp.SelectionTime != AntagSelectionTime.IntraPlayerSpawn) continue; ChooseAntags((uid, comp), args.Players); + AssignPreSelectedSessions((uid, comp)); } } @@ -183,14 +199,20 @@ protected override void Started(EntityUid uid, AntagSelectionComponent component if (GameTicker.RunLevel != GameRunLevel.InRound) return; - if (component.SelectionsComplete) + if (component.AssignmentComplete) return; - var players = _playerManager.Sessions - .Where(x => GameTicker.PlayerGameStatuses.TryGetValue(x.UserId, out var status) && status == PlayerGameStatus.JoinedGame) - .ToList(); + if (!component.PreSelectionsComplete) + { + var players = _playerManager.Sessions + .Where(x => GameTicker.PlayerGameStatuses.TryGetValue(x.UserId, out var status) && + status == PlayerGameStatus.JoinedGame) + .ToList(); - ChooseAntags((uid, component), players, midround: true); + ChooseAntags((uid, component), players, midround: true); + } + + AssignPreSelectedSessions((uid, component)); } /// @@ -201,7 +223,7 @@ protected override void Started(EntityUid uid, AntagSelectionComponent component /// Disable picking players for pre-spawn antags in the middle of a round public void ChooseAntags(Entity ent, IList pool, bool midround = false) { - if (ent.Comp.SelectionsComplete) + if (ent.Comp.PreSelectionsComplete) return; foreach (var def in ent.Comp.Definitions) @@ -209,7 +231,7 @@ public void ChooseAntags(Entity ent, IList @@ -250,15 +272,41 @@ public void ChooseAntags(Entity ent, break; } - if (session != null && ent.Comp.SelectedSessions.Contains(session)) + if (session != null && ent.Comp.PreSelectedSessions.Contains(session)) { Log.Warning($"Somehow picked {session} for an antag when this rule already selected them previously"); continue; } } - MakeAntag(ent, session, def); + if (session == null) + MakeAntag(ent, null, def); // This is for spawner antags + else + { + ent.Comp.PreSelectedSessions.Add(session); // Selection done! + Log.Debug($"Selected {session.Name} as antagonist: {ToPrettyString(ent)}"); + } + } + } + + /// + /// Assigns antag roles to sessions selected for it. + /// + public void AssignPreSelectedSessions(Entity ent) + { + // Only assign if there's been a pre-selection, and the selection hasn't already been made + if (!ent.Comp.PreSelectionsComplete || ent.Comp.AssignmentComplete) + return; + + foreach (var def in ent.Comp.Definitions) + { + foreach (var session in ent.Comp.PreSelectedSessions) + { + TryMakeAntag(ent, session, def); + } } + + ent.Comp.AssignmentComplete = true; } /// @@ -286,7 +334,7 @@ public void MakeAntag(Entity ent, ICommonSession? sessi if (session != null) { - ent.Comp.SelectedSessions.Add(session); + ent.Comp.AssignedSessions.Add(session); // we shouldn't be blocking the entity if they're just a ghost or smth. if (!HasComp(session.AttachedEntity)) @@ -309,7 +357,11 @@ public void MakeAntag(Entity ent, ICommonSession? sessi { Log.Error($"Attempted to make {session} antagonist in gamerule {ToPrettyString(ent)} but there was no valid entity for player."); if (session != null) - ent.Comp.SelectedSessions.Remove(session); + { + ent.Comp.AssignedSessions.Remove(session); + ent.Comp.PreSelectedSessions.Remove(session); + } + return; } @@ -330,7 +382,11 @@ public void MakeAntag(Entity ent, ICommonSession? sessi { Log.Error($"Antag spawner {player} does not have a GhostRoleAntagSpawnerComponent."); if (session != null) - ent.Comp.SelectedSessions.Remove(session); + { + ent.Comp.AssignedSessions.Remove(session); + ent.Comp.PreSelectedSessions.Remove(session); + } + return; } @@ -363,10 +419,10 @@ public void MakeAntag(Entity ent, ICommonSession? sessi _mind.TransferTo(curMind.Value, antagEnt, ghostCheckOverride: true); _role.MindAddRoles(curMind.Value, def.MindRoles, null, true); - ent.Comp.SelectedMinds.Add((curMind.Value, Name(player))); + ent.Comp.AssignedMinds.Add((curMind.Value, Name(player))); SendBriefing(session, def.Briefing); - Log.Debug($"Selected {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); + Log.Debug($"Assigned {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); } var afterEv = new AfterAntagEntitySelectedEvent(session, player, ent, def); @@ -412,15 +468,11 @@ public bool IsSessionValid(Entity ent, ICommonSession? if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) return false; - if (ent.Comp.SelectedSessions.Contains(session)) + if (ent.Comp.AssignedSessions.Contains(session)) return false; mind ??= session.GetMind(); - // If the player has not spawned in as any entity (e.g., in the lobby), they can be given an antag role/entity. - if (mind == null) - return true; - //todo: we need some way to check that we're not getting the same role twice. (double picking thieves or zombies through midrounds) switch (def.MultiAntagSetting) @@ -429,12 +481,16 @@ public bool IsSessionValid(Entity ent, ICommonSession? { if (_role.MindIsAntagonist(mind)) return false; + if (GetPreSelectedAntagSessions(ent.Comp).Contains(session)) // Used for rules where the antag has been selected, but not started yet + return false; break; } case AntagAcceptability.NotExclusive: { if (_role.MindIsExclusiveAntagonist(mind)) return false; + if (GetPreSelectedExclusiveAntagSessions(ent.Comp).Contains(session)) + return false; break; } } @@ -481,7 +537,7 @@ private void OnObjectivesTextGetInfo(Entity ent, ref Ob if (ent.Comp.AgentName is not { } name) return; - args.Minds = ent.Comp.SelectedMinds; + args.Minds = ent.Comp.AssignedMinds; args.AgentName = Loc.GetString(name); } } diff --git a/Content.Server/Antag/Components/AntagSelectionComponent.cs b/Content.Server/Antag/Components/AntagSelectionComponent.cs index 35c6f8bc3a409..c1e60e8068ede 100644 --- a/Content.Server/Antag/Components/AntagSelectionComponent.cs +++ b/Content.Server/Antag/Components/AntagSelectionComponent.cs @@ -14,10 +14,16 @@ namespace Content.Server.Antag.Components; public sealed partial class AntagSelectionComponent : Component { /// - /// Has the primary selection of antagonists finished yet? + /// Has the primary assignment of antagonists finished yet? /// [DataField] - public bool SelectionsComplete; + public bool AssignmentComplete; + + /// + /// Has the antagonists been preselected but yet to be fully assigned? + /// + [DataField] + public bool PreSelectionsComplete; /// /// The definitions for the antagonists @@ -26,10 +32,10 @@ public sealed partial class AntagSelectionComponent : Component public List Definitions = new(); /// - /// The minds and original names of the players selected to be antagonists. + /// The minds and original names of the players assigned to be antagonists. /// [DataField] - public List<(EntityUid, string)> SelectedMinds = new(); + public List<(EntityUid, string)> AssignedMinds = new(); /// /// When the antag selection will occur. @@ -37,11 +43,16 @@ public sealed partial class AntagSelectionComponent : Component [DataField] public AntagSelectionTime SelectionTime = AntagSelectionTime.PostPlayerSpawn; + /// + /// Cached sessions of players who are chosen yet not given the role yet. + /// + public HashSet PreSelectedSessions = new(); + /// /// Cached sessions of players who are chosen. Used so we don't have to rebuild the pool multiple times in a tick. /// Is not serialized. /// - public HashSet SelectedSessions = new(); + public HashSet AssignedSessions = new(); /// /// Locale id for the name of the antag. diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs index 5a5eb720cfb70..33ee91f8a5a5b 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs @@ -19,6 +19,11 @@ protected EntityQueryEnumerator Q return EntityQueryEnumerator(); } + protected EntityQueryEnumerator QueryDelayedRules() + { + return EntityQueryEnumerator(); + } + /// /// Queries all gamerules, regardless of if they're active or not. /// diff --git a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs index 8a918bd2fd045..8045cfed462aa 100644 --- a/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs +++ b/Content.Server/Station/Systems/StationJobsSystem.Roundstart.cs @@ -1,10 +1,12 @@ using System.Linq; using Content.Server.Administration.Managers; +using Content.Server.Antag; using Content.Server.Players.PlayTimeTracking; using Content.Server.Station.Components; using Content.Server.Station.Events; using Content.Shared.Preferences; using Content.Shared.Roles; +using Robust.Server.Player; using Robust.Shared.Network; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -17,6 +19,8 @@ public sealed partial class StationJobsSystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IBanManager _banManager = default!; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly AntagSelectionSystem _antag = default!; private Dictionary> _jobsByWeight = default!; private List _orderedWeights = default!; @@ -345,6 +349,7 @@ private Dictionary> GetPlayersJobCandidates(int? weight, foreach (var (player, profile) in profiles) { var roleBans = _banManager.GetJobBans(player); + var antagBlocked = _antag.GetPreSelectedAntagSessions(); var profileJobs = profile.JobPriorities.Keys.Select(k => new ProtoId(k)).ToList(); var ev = new StationJobsGetCandidatesEvent(player, profileJobs); RaiseLocalEvent(ref ev); @@ -361,6 +366,9 @@ private Dictionary> GetPlayersJobCandidates(int? weight, if (!_prototypeManager.TryIndex(jobId, out var job)) continue; + if (!job.CanBeAntag && (!_playerManager.TryGetSessionById(player, out var session) || antagBlocked.Contains(session))) + continue; + if (weight is not null && job.Weight != weight.Value) continue; diff --git a/Content.Shared/Antag/AntagAcceptability.cs b/Content.Shared/Antag/AntagAcceptability.cs index f56be97503353..33323aacf37c2 100644 --- a/Content.Shared/Antag/AntagAcceptability.cs +++ b/Content.Shared/Antag/AntagAcceptability.cs @@ -17,7 +17,7 @@ public enum AntagAcceptability /// /// Choose anyone /// - All + All, } public enum AntagSelectionTime : byte @@ -28,8 +28,14 @@ public enum AntagSelectionTime : byte /// PrePlayerSpawn, + /// + /// Antag roles are selected to the player session before job assignment and spawning. + /// Unlike PrePlayerSpawn, this does not remove you from the job spawn pool. + /// + IntraPlayerSpawn, + /// /// Antag roles get assigned after players have been assigned jobs and have spawned in. /// - PostPlayerSpawn + PostPlayerSpawn, } From 45e5fbfcdf824de5b0416895b475a7c6ad386f0f Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:57:06 +0100 Subject: [PATCH 02/27] forensics cleanup (#35795) --- Content.Server/Forensics/Systems/ForensicsSystem.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a52b06039135b..27df086ae1b91 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -73,7 +73,6 @@ private void OnFingerprintInit(Entity ent, ref MapInitEven private void OnDNAInit(Entity ent, ref MapInitEvent args) { - Log.Debug($"Init DNA {Name(ent.Owner)} {ent.Comp.DNA}"); if (ent.Comp.DNA == null) RandomizeDNA((ent.Owner, ent.Comp)); else @@ -327,7 +326,6 @@ public void RandomizeDNA(Entity ent) ent.Comp.DNA = GenerateDNA(); Dirty(ent); - Log.Debug($"Randomize DNA {Name(ent.Owner)} {ent.Comp.DNA}"); var ev = new GenerateDnaEvent { Owner = ent.Owner, DNA = ent.Comp.DNA }; RaiseLocalEvent(ent.Owner, ref ev); } From d8ac1524efee1e20d6fcfe22052c8645eaec0ad8 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 12 Mar 2025 19:48:45 +0100 Subject: [PATCH 03/27] polymorph popup fixes (#35796) polymorph fixes --- Content.Server/Polymorph/Systems/PolymorphSystem.cs | 11 +++++++++-- Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs | 2 +- Content.Shared/Polymorph/PolymorphPrototype.cs | 12 ++++++++++++ Resources/Locale/en-US/polymorph/polymorph.ftl | 4 ++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index 8adab1e00db41..e305109ad54e2 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -204,6 +204,12 @@ private void OnDestruction(Entity ent, ref Destructi var child = Spawn(configuration.Entity, _transform.GetMapCoordinates(uid, targetTransformComp), rotation: _transform.GetWorldRotation(uid)); + if (configuration.PolymorphPopup != null) + _popup.PopupEntity(Loc.GetString(configuration.PolymorphPopup, + ("parent", Identity.Entity(uid, EntityManager)), + ("child", Identity.Entity(child, EntityManager))), + child); + MakeSentientCommand.MakeSentient(child, EntityManager); var polymorphedComp = _compFact.GetComponent(); @@ -347,10 +353,11 @@ private void OnDestruction(Entity ent, ref Destructi var ev = new PolymorphedEvent(uid, parent, true); RaiseLocalEvent(uid, ref ev); - _popup.PopupEntity(Loc.GetString("polymorph-revert-popup-generic", + if (component.Configuration.ExitPolymorphPopup != null) + _popup.PopupEntity(Loc.GetString(component.Configuration.ExitPolymorphPopup, ("parent", Identity.Entity(uid, EntityManager)), ("child", Identity.Entity(parent, EntityManager))), - parent); + parent); QueueDel(uid); return parent; diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 1745730647d0f..3d2d263652a4b 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -416,7 +416,7 @@ public bool TryUnbuckle(EntityUid buckleUid, public bool TryUnbuckle(Entity buckle, EntityUid? user, bool popup) { - if (!Resolve(buckle.Owner, ref buckle.Comp)) + if (!Resolve(buckle.Owner, ref buckle.Comp, false)) return false; if (!CanUnbuckle(buckle, user, popup, out var strap)) diff --git a/Content.Shared/Polymorph/PolymorphPrototype.cs b/Content.Shared/Polymorph/PolymorphPrototype.cs index c05766940840a..07901b1857f0a 100644 --- a/Content.Shared/Polymorph/PolymorphPrototype.cs +++ b/Content.Shared/Polymorph/PolymorphPrototype.cs @@ -128,6 +128,18 @@ public sealed partial record PolymorphConfiguration /// [DataField] public SoundSpecifier? ExitPolymorphSound; + + /// + /// If not null, this popup will be displayed when being polymorphed into something. + /// + [DataField] + public LocId? PolymorphPopup = "polymorph-popup-generic"; + + /// + /// If not null, this popup will be displayed when when being reverted from a polymorph. + /// + [DataField] + public LocId? ExitPolymorphPopup = "polymorph-revert-popup-generic"; } public enum PolymorphInventoryChange : byte diff --git a/Resources/Locale/en-US/polymorph/polymorph.ftl b/Resources/Locale/en-US/polymorph/polymorph.ftl index 0066196b031c4..ac78eb6bb4761 100644 --- a/Resources/Locale/en-US/polymorph/polymorph.ftl +++ b/Resources/Locale/en-US/polymorph/polymorph.ftl @@ -1,5 +1,5 @@ polymorph-self-action-name = Polymorph ({CAPITALIZE($target)}) polymorph-self-action-description = Instantly polymorph yourself into {$target}. -polymorph-popup-generic = {CAPITALIZE($parent)} turned into {$child}. -polymorph-revert-popup-generic = {CAPITALIZE($parent)} reverted back into {$child}. +polymorph-popup-generic = {CAPITALIZE(THE($parent))} turned into {$child}. +polymorph-revert-popup-generic = {CAPITALIZE(THE($parent))} reverted back into {$child}. From ccc8837b6952394eb5ad235610224c298116c583 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 12 Mar 2025 20:16:16 +0100 Subject: [PATCH 04/27] fix more syndicate names (#35788) --- Resources/Prototypes/Entities/Mobs/Player/human.yml | 2 +- Resources/Prototypes/Entities/Objects/Tools/decoys.yml | 2 +- Resources/Prototypes/GameRules/events.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/human.yml b/Resources/Prototypes/Entities/Mobs/Player/human.yml index 2355c0ffb4049..5ed2c52427257 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/human.yml @@ -97,7 +97,7 @@ roleLoadout: [ RoleSurvivalSyndicate ] - type: RandomMetadata nameSegments: - - SyndicateNamesPrefix + - NamesSyndicatePrefix - NamesSyndicateNormal - type: NpcFactionMember factions: diff --git a/Resources/Prototypes/Entities/Objects/Tools/decoys.yml b/Resources/Prototypes/Entities/Objects/Tools/decoys.yml index a8346675e2ae8..8bacfe96af0cb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/decoys.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/decoys.yml @@ -31,7 +31,7 @@ size: Normal - type: RandomMetadata # No metagaming these, jimbo. nameSegments: - - SyndicateNamesPrefix + - NamesSyndicatePrefix - NamesSyndicateNormal - type: Damageable damageContainer: Inorganic diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 6ce47543b4807..cda13e45268eb 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -509,7 +509,7 @@ - type: NukeOperative - type: RandomMetadata nameSegments: - - SyndicateNamesPrefix + - NamesSyndicatePrefix - NamesSyndicateNormal - type: NpcFactionMember factions: From 0d16bd5d2b030182e2ca71eb4ffcd866b38d523a Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Thu, 13 Mar 2025 01:36:41 +0300 Subject: [PATCH 05/27] New Feature: Warden job rolls before security officer/cadet/detective (#35313) Commit --- Resources/Prototypes/Roles/Jobs/Security/warden.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 6d79d74804900..856c8660382c4 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -7,6 +7,7 @@ - !type:RoleTimeRequirement role: JobSecurityOfficer time: 36000 #10 hrs + weight: 5 startingGear: WardenGear icon: "JobIconWarden" supervisors: job-supervisors-hos From 28ff4eddf5647660ac73ec95b846dba884f26cb8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Mar 2025 22:37:50 +0000 Subject: [PATCH 06/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c4c465cdabc10..524800e82d4ec 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: BramvanZijp - changes: - - message: Fixed the Lone Nuclear Operative mid-round antagonist being extremely - rare. - type: Fix - id: 7553 - time: '2024-10-26T02:16:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32942 - author: Moomoobeef changes: - message: Bowls no longer make an eating sound when drinking from them. @@ -3890,3 +3882,10 @@ id: 8052 time: '2025-03-12T01:21:59.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35751 +- author: Winkarst-cpu + changes: + - message: The warden job now rolls before security officer/cadet/detective. + type: Tweak + id: 8053 + time: '2025-03-12T22:36:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35313 From b7759cccbda67c35bc42b9488fe5118501000c3c Mon Sep 17 00:00:00 2001 From: ninruB Date: Thu, 13 Mar 2025 00:39:42 +0200 Subject: [PATCH 07/27] Fix anomaly doublelogging (#34297) cull doublelogging --- Content.Shared/Anomaly/SharedAnomalySystem.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index 3f8da9e3c8bec..0d7c926f76397 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -163,7 +163,7 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone var ev = new AnomalySupercriticalEvent(uid, powerMod); RaiseLocalEvent(uid, ref ev, true); - EndAnomaly(uid, component, true); + EndAnomaly(uid, component, true, logged: true); } /// @@ -173,13 +173,17 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone /// /// Whether or not the anomaly ended via supercritical event /// Create anomaly cores based on the result of completing an anomaly? - public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool supercritical = false, bool spawnCore = true) + /// Whether or not the anomaly decaying/going supercritical is logged + public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool supercritical = false, bool spawnCore = true, bool logged = false) { - // Logging before resolve, in case the anomaly has deleted itself. - if (_net.IsServer) - Log.Info($"Ending anomaly. Entity: {ToPrettyString(uid)}"); - AdminLog.Add(LogType.Anomaly, supercritical ? LogImpact.High : LogImpact.Low, - $"Anomaly {ToPrettyString(uid)} {(supercritical ? "went supercritical" : "decayed")}."); + if (logged) + { + // Logging before resolve, in case the anomaly has deleted itself. + if (_net.IsServer) + Log.Info($"Ending anomaly. Entity: {ToPrettyString(uid)}"); + AdminLog.Add(LogType.Anomaly, supercritical ? LogImpact.High : LogImpact.Low, + $"Anomaly {ToPrettyString(uid)} {(supercritical ? "went supercritical" : "decayed")}."); + } if (!Resolve(uid, ref component)) return; @@ -260,7 +264,7 @@ public void ChangeAnomalyHealth(EntityUid uid, float change, AnomalyComponent? c if (newVal < 0) { - EndAnomaly(uid, component); + EndAnomaly(uid, component, logged: true); return; } From 9005183e6e56804e42e075745b4533d3d8f89c67 Mon Sep 17 00:00:00 2001 From: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:42:15 -0500 Subject: [PATCH 08/27] Add wallmount N2 closets, Revived (#34042) * Add standard, wallmount and improvised N2 closets, Revived * remove improvised locker * Parent>ID * Undo sprite replacement * Update meta.json --------- Co-authored-by: Velcroboy Co-authored-by: Milon --- .../Prototypes/Catalog/Fills/Lockers/misc.yml | 36 ++++++++++++++---- .../Storage/Closets/wall_lockers.yml | 14 ++++++- .../Storage/wall_locker.rsi/meta.json | 5 ++- .../Structures/Storage/wall_locker.rsi/n2.png | Bin 0 -> 262 bytes .../Storage/wall_locker.rsi/n2_door.png | Bin 0 -> 498 bytes .../Storage/wall_locker.rsi/n2_open.png | Bin 0 -> 310 bytes 6 files changed, 45 insertions(+), 10 deletions(-) create mode 100644 Resources/Textures/Structures/Storage/wall_locker.rsi/n2.png create mode 100644 Resources/Textures/Structures/Storage/wall_locker.rsi/n2_door.png create mode 100644 Resources/Textures/Structures/Storage/wall_locker.rsi/n2_open.png diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index 340083f40416c..33b0ab1a509e2 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -54,6 +54,22 @@ entity_storage: !type:NestedSelector tableId: FillLockerEmergencyStandard +- type: entityTable + id: FillLockerEmergencyN2Standard + table: !type:AllSelector + children: + - id: ClothingMaskBreath + - id: ClothingOuterSuitEmergency + - id: BoxMRE + prob: 0.1 + - id: ToolboxEmergencyFilled + prob: 0.05 + - !type:GroupSelector + children: + - id: EmergencyNitrogenTankFilled + weight: 4 + - id: NitrogenTankFilled + - type: entity id: ClosetEmergencyN2FilledRandom parent: ClosetEmergencyN2 @@ -61,14 +77,18 @@ components: - type: EntityTableContainerFill containers: - entity_storage: !type:AllSelector - children: - - id: ClothingMaskBreath - - id: ClothingOuterSuitEmergency - - !type:GroupSelector - children: - - id: EmergencyNitrogenTankFilled - - id: NitrogenTankFilled + entity_storage: !type:NestedSelector + tableId: FillLockerEmergencyN2Standard + +- type: entity + parent: ClosetWallEmergencyN2 + id: ClosetWallEmergencyN2FilledRandom + suffix: Filled, Random + components: + - type: EntityTableContainerFill + containers: + entity_storage: !type:NestedSelector + tableId: FillLockerEmergencyN2Standard - type: entityTable id: FillLockerFireStandard diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml index 4280b960b4c38..02b9fa8271de2 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/wall_lockers.yml @@ -22,6 +22,18 @@ stateDoorOpen: emergency_open stateDoorClosed: emergency_door +- type: entity + parent: BaseWallCloset + id: ClosetWallEmergencyN2 + name: emergency nitrogen wall closet + description: It's full of life-saving equipment. Assuming, that is, that you breathe nitrogen. + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: n2 + stateDoorOpen: n2_open + stateDoorClosed: n2_door + - type: entity id: ClosetWallFire name: fire-safety wall closet @@ -163,4 +175,4 @@ stateDoorOpen: med_open stateDoorClosed: med_door - type: AccessReader - access: [["Medical"]] \ No newline at end of file + access: [["Medical"]] diff --git a/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json b/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json index b6ed63c7a3ed3..2466cc53d744c 100644 --- a/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from shiptest at commmit https://github.com/shiptest-ss13/Shiptest/commit/440a15fb476a20d77ba28c1fe315c1b659032ce8, edited by Alekshhh", + "copyright": "Taken from shiptest at commmit https://github.com/shiptest-ss13/Shiptest/commit/440a15fb476a20d77ba28c1fe315c1b659032ce8, edited by Alekshhh, N2 lockers edited by Lamrr", "size": { "x": 32, "y": 32 @@ -27,6 +27,9 @@ { "name": "med_door" }, { "name": "med_open" }, { "name": "mixed_door" }, + { "name": "n2" }, + { "name": "n2_door" }, + { "name": "n2_open" }, { "name": "orange_door" }, { "name": "pink_door" }, { "name": "red_door" }, diff --git a/Resources/Textures/Structures/Storage/wall_locker.rsi/n2.png b/Resources/Textures/Structures/Storage/wall_locker.rsi/n2.png new file mode 100644 index 0000000000000000000000000000000000000000..34d71d0586e52fb2317fccc8f3fd43f8a6a095c6 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7lsoIx(vFZITIHHMK}vQ zB8wRqxP?KOkzv*x383IIPZ!6Kh{JEg4EY)q1e~27Et)L-FxT$fcELjr(&qSFn7iQ4 z!iHI|@5Ibz_L5W<&|2I$!ENccDGw)KyZDnyX`e;A*n3O%k1Q^CB$|b$2Q}^7^G#Mj z;L?PP2h7bbD7NRt-#TEgzp(a}gVrAwURC822Udyr-L!nR{CT8N6VI8b`?p-GC-!{d z+QcHLHsb|H*Ppg;XQeyJwq5ZOTa~d;{2F+mVp2w9n`YLg{1h#?E2A(S?uQ*?y@ zeecn!^{CgE`|dqG@1ENNDN_7*2(*FUjYdElJJ&Rv8U|JFBiiEKW)rd`#m1Vh3#C>A z412$+qS&}f(uDt9+Hqf$jTDN%NUZvNnt+-UU{YTm%4MAYX6Y zub9I%64Al6Z!pCY=sQkm!@lF}Y?^4C?fXEx9S)|%6p$qe=CB9mGkZwH5*QHzc_SeW zo^1QqF}WPS3qA&epm=tU@nped(fi8_JbM8ibH|WdEnHP9LZWjZDa2kuPgRkfP7f;5 zQ&oNfp049YWEbiaz%3E*KAWMS>xa3(bY1G^Tj4IB57#ftCI7deZdt;JkXS$OBcI4G o*+Z!m9MT7M%My?xMT#x>0r%RLDUz!cD*ylh07*qoM6N<$g6p!*pa1{> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/wall_locker.rsi/n2_open.png b/Resources/Textures/Structures/Storage/wall_locker.rsi/n2_open.png new file mode 100644 index 0000000000000000000000000000000000000000..5d3050e30c73248849d06ae3cc4b4e9fd2bdf5ea GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7lsoIx(vFZITIHHMK}vQ zB8wRqxP?KOkzv*x383ILPZ!6Kh{JEE8FDonNVLXxr%dDtDmZav?*qnNJ9d_QGP<`c zJfnQO-rmN=4^$jAB=5w$5y`mNw{OXW^2Yb4=Rf(#tf;8CZ&^r|-qcy!pSffwFziT^ zWO#7zyG>)z%9~C3x!yCsBr&Z|JdiAt8NRpt@3lW-Czh6|Pw?*a$~I@x`QhK_l|85X z&|hf_RZjl{(=I6bGBTXsb*ylfg=@;gZGUIvO4OPy;9cGJS4-*I_TTHZ-nBg7jCu5f z`wnO0F^QbLqORG?b9*-4zR Date: Wed, 12 Mar 2025 23:44:05 +0100 Subject: [PATCH 09/27] Cryo and grinder cleanup (#34842) * cryopod and grinder cleanup * lower case name * 4 spaces * prototype clean * looks like there is some kind of test that prevents removing this * grinder too * both should be empty * cleanup --- .../Medical/Cryogenics/CryoPodComponent.cs | 4 ++-- .../Prototypes/Chemistry/mixing_types.yml | 8 ++++---- .../Structures/Machines/Medical/cryo_pod.yml | 4 ++-- .../Structures/Machines/reagent_grinder.yml | 10 ++++------ .../cryopod.rsi}/cover-off.png | Bin .../cryopod.rsi}/cover-on.png | Bin .../cryopod.rsi}/meta.json | 0 .../cryopod.rsi}/pod-off.png | Bin .../cryopod.rsi}/pod-on.png | Bin .../cryopod.rsi}/pod-open.png | Bin .../cryopod.rsi}/pod-panel.png | Bin .../grinder_beaker_attached.png} | Bin .../grinder_empty.png} | Bin .../Structures/Machines/grinder.rsi/meta.json | 17 +++++++++++++++++ .../Structures/Machines/juicer.rsi/meta.json | 1 - 15 files changed, 29 insertions(+), 15 deletions(-) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/cover-off.png (100%) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/cover-on.png (100%) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/meta.json (100%) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/pod-off.png (100%) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/pod-on.png (100%) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/pod-open.png (100%) rename Resources/Textures/Structures/Machines/{cryogenics.rsi => Medical/cryopod.rsi}/pod-panel.png (100%) rename Resources/Textures/Structures/Machines/{juicer.rsi/juicer1.png => grinder.rsi/grinder_beaker_attached.png} (100%) rename Resources/Textures/Structures/Machines/{juicer.rsi/juicer0.png => grinder.rsi/grinder_empty.png} (100%) create mode 100644 Resources/Textures/Structures/Machines/grinder.rsi/meta.json delete mode 100644 Resources/Textures/Structures/Machines/juicer.rsi/meta.json diff --git a/Content.Shared/Medical/Cryogenics/CryoPodComponent.cs b/Content.Shared/Medical/Cryogenics/CryoPodComponent.cs index a736a63cb227d..43244a5f0df33 100644 --- a/Content.Shared/Medical/Cryogenics/CryoPodComponent.cs +++ b/Content.Shared/Medical/Cryogenics/CryoPodComponent.cs @@ -1,4 +1,4 @@ -using Robust.Shared.Containers; +using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -16,7 +16,7 @@ public sealed partial class CryoPodComponent : Component public string PortName { get; set; } = "port"; /// - /// Specifies the name of the atmospherics port to draw gas from. + /// Specifies the name of the slot that holds beaker with medicine. /// [ViewVariables(VVAccess.ReadWrite)] [DataField("solutionContainerName")] diff --git a/Resources/Prototypes/Chemistry/mixing_types.yml b/Resources/Prototypes/Chemistry/mixing_types.yml index fd73256410830..86239fce069cf 100644 --- a/Resources/Prototypes/Chemistry/mixing_types.yml +++ b/Resources/Prototypes/Chemistry/mixing_types.yml @@ -12,15 +12,15 @@ id: DummyGrind verbText: mixing-verb-default-grind icon: - sprite: Structures/Machines/juicer.rsi - state: juicer0 + sprite: Structures/Machines/grinder.rsi + state: grinder_empty - type: mixingCategory id: DummyJuice verbText: mixing-verb-default-juice icon: - sprite: Structures/Machines/juicer.rsi - state: juicer0 + sprite: Structures/Machines/grinder.rsi + state: grinder_empty - type: mixingCategory id: DummyCondense diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml index 3bc00fb1b61f1..00b60c56ba71b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml @@ -1,11 +1,11 @@ -- type: entity +- type: entity parent: [BaseStructure, ConstructibleMachine] # Not a BaseMachinePowered since we don't want the anchorable component id: CryoPod name: cryo pod description: A special machine intended to create a safe environment for the use of chemicals that react in cold environments. components: - type: Sprite - sprite: Structures/Machines/cryogenics.rsi + sprite: Structures/Machines/Medical/cryopod.rsi drawdepth: Mobs noRot: true offset: 0, 0.5 diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index 72d6b28efa025..6456e043b8cc9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -5,8 +5,6 @@ description: From BlenderTech. Will It Blend? Let's find out! suffix: grinder/juicer components: - - type: Transform - anchored: true - type: ReagentGrinder - type: ActivatableUI key: enum.ReagentGrinderUiKey.Key @@ -19,8 +17,8 @@ visuals: enum.ReagentGrinderVisualState.BeakerAttached: grinder: - True: {state: "juicer1"} - False: {state: "juicer0"} + True: {state: "grinder_beaker_attached"} + False: {state: "grinder_empty"} - type: Physics - type: Fixtures fixtures: @@ -33,13 +31,13 @@ layer: - TabletopMachineLayer - type: Sprite - sprite: Structures/Machines/juicer.rsi + sprite: Structures/Machines/grinder.rsi drawdepth: SmallObjects snapCardinals: true offset: "0.0,0.4" layers: - map: [ "grinder" ] - state: "juicer0" + state: "grinder_empty" - type: ApcPowerReceiver powerLoad: 300 - type: ItemSlots diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/cover-off.png b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/cover-off.png similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/cover-off.png rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/cover-off.png diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/cover-on.png b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/cover-on.png similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/cover-on.png rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/cover-on.png diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/meta.json b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/meta.json similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/meta.json rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/meta.json diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-off.png b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-off.png similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/pod-off.png rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-off.png diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-on.png b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-on.png similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/pod-on.png rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-on.png diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-open.png b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-open.png similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/pod-open.png rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-open.png diff --git a/Resources/Textures/Structures/Machines/cryogenics.rsi/pod-panel.png b/Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-panel.png similarity index 100% rename from Resources/Textures/Structures/Machines/cryogenics.rsi/pod-panel.png rename to Resources/Textures/Structures/Machines/Medical/cryopod.rsi/pod-panel.png diff --git a/Resources/Textures/Structures/Machines/juicer.rsi/juicer1.png b/Resources/Textures/Structures/Machines/grinder.rsi/grinder_beaker_attached.png similarity index 100% rename from Resources/Textures/Structures/Machines/juicer.rsi/juicer1.png rename to Resources/Textures/Structures/Machines/grinder.rsi/grinder_beaker_attached.png diff --git a/Resources/Textures/Structures/Machines/juicer.rsi/juicer0.png b/Resources/Textures/Structures/Machines/grinder.rsi/grinder_empty.png similarity index 100% rename from Resources/Textures/Structures/Machines/juicer.rsi/juicer0.png rename to Resources/Textures/Structures/Machines/grinder.rsi/grinder_empty.png diff --git a/Resources/Textures/Structures/Machines/grinder.rsi/meta.json b/Resources/Textures/Structures/Machines/grinder.rsi/meta.json new file mode 100644 index 0000000000000..9b9ed1dbe9e9d --- /dev/null +++ b/Resources/Textures/Structures/Machines/grinder.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "license":"CC-BY-SA-3.0", + "copyright":"https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d", + "version":1, + "size":{ + "x":32, + "y":32 + }, + "states":[ + { + "name":"grinder_empty" + }, + { + "name":"grinder_beaker_attached" + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Structures/Machines/juicer.rsi/meta.json b/Resources/Textures/Structures/Machines/juicer.rsi/meta.json deleted file mode 100644 index 6048f25646ef5..0000000000000 --- a/Resources/Textures/Structures/Machines/juicer.rsi/meta.json +++ /dev/null @@ -1 +0,0 @@ -{"license": "CC-BY-SA-3.0", "copyright": "https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d","version": 1, "size": {"x": 32, "y": 32}, "states": [{"name": "juicer0", "delays": [[1.0]]}, {"name": "juicer1", "delays": [[1.0]]}]} From 212bf99688c7cabd0c23907e286179a101fa95b4 Mon Sep 17 00:00:00 2001 From: Firewars763 <35506916+Firewars763@users.noreply.github.com> Date: Wed, 12 Mar 2025 18:45:22 -0400 Subject: [PATCH 10/27] Add Gold and Coal Rock Anomalies (#34809) * This commit adds 2 new Rock Anomaly types, Coal and Gold. It also adds Resource Crabs, colored crystals, and lights for both. * Added crafting recipes for yellow and black light tubes. Somehow I forgot that the first time. * Sorted tags.yml alphabetically this time instead of not doing that. * Updated Texture Copyright information * Attempted to fix Merge Conflict * Added bulb light variants for both yellow and black crystals. --- .../Prototypes/Entities/Effects/mobspawn.yml | 24 +++++ .../Prototypes/Entities/Effects/wallspawn.yml | 34 +++++- .../Markers/Spawners/Random/anomaly.yml | 6 +- .../Markers/Spawners/Random/crystal.yml | 2 + .../Entities/Mobs/NPCs/elemental.yml | 60 +++++++++++ .../Objects/Materials/crystal_shard.yml | 32 ++++++ .../Entities/Objects/Power/lights.yml | 66 ++++++++++++ .../Structures/Decoration/crystals.yml | 56 ++++++++++ .../Structures/Lighting/base_lighting.yml | 59 +++++++++++ .../Structures/Specific/Anomaly/anomalies.yml | 100 ++++++++++++++++++ .../Entities/Structures/Walls/asteroid.yml | 46 ++++++++ .../Prototypes/Procedural/biome_templates.yml | 4 + .../Graphs/utilities/lighting.yml | 80 ++++++++++++++ .../Recipes/Construction/lighting.yml | 44 ++++++++ Resources/Prototypes/ore.yml | 8 ++ Resources/Prototypes/tags.yml | 6 ++ .../Effects/mobspawn.rsi/crab_coal.png | Bin 0 -> 2296 bytes .../Effects/mobspawn.rsi/crab_gold.png | Bin 0 -> 2361 bytes .../Textures/Effects/mobspawn.rsi/meta.json | 30 +++++- .../Mobs/Elemental/orecrab.rsi/coal_crab.png | Bin 0 -> 2631 bytes .../Mobs/Elemental/orecrab.rsi/gold_crab.png | Bin 0 -> 2711 bytes .../Mobs/Elemental/orecrab.rsi/meta.json | 10 +- 22 files changed, 662 insertions(+), 5 deletions(-) create mode 100644 Resources/Textures/Effects/mobspawn.rsi/crab_coal.png create mode 100644 Resources/Textures/Effects/mobspawn.rsi/crab_gold.png create mode 100644 Resources/Textures/Mobs/Elemental/orecrab.rsi/coal_crab.png create mode 100644 Resources/Textures/Mobs/Elemental/orecrab.rsi/gold_crab.png diff --git a/Resources/Prototypes/Entities/Effects/mobspawn.yml b/Resources/Prototypes/Entities/Effects/mobspawn.yml index 1489c26493abd..a043fe97d6561 100644 --- a/Resources/Prototypes/Entities/Effects/mobspawn.yml +++ b/Resources/Prototypes/Entities/Effects/mobspawn.yml @@ -39,6 +39,18 @@ - type: SpawnOnDespawn prototype: MobIronCrab +- type: entity + id: MobSpawnCrabCoal + parent: MobSpawnCrabQuartz + name: mobspawner coalcrab + categories: [ HideSpawnMenu, Spawner ] + components: + - type: Sprite + sprite: /Textures/Effects/mobspawn.rsi + state: crab_coal + - type: SpawnOnDespawn + prototype: MobCoalCrab + - type: entity id: MobSpawnCrabSilver parent: MobSpawnCrabQuartz @@ -51,6 +63,18 @@ - type: SpawnOnDespawn prototype: MobSilverCrab +- type: entity + id: MobSpawnCrabGold + parent: MobSpawnCrabQuartz + name: mobspawner goldcrab + categories: [ HideSpawnMenu, Spawner ] + components: + - type: Sprite + sprite: /Textures/Effects/mobspawn.rsi + state: crab_gold + - type: SpawnOnDespawn + prototype: MobGoldCrab + - type: entity id: MobSpawnCrabUranium parent: MobSpawnCrabQuartz diff --git a/Resources/Prototypes/Entities/Effects/wallspawn.yml b/Resources/Prototypes/Entities/Effects/wallspawn.yml index 44afe80e978ac..155ef10bb5e50 100644 --- a/Resources/Prototypes/Entities/Effects/wallspawn.yml +++ b/Resources/Prototypes/Entities/Effects/wallspawn.yml @@ -74,6 +74,22 @@ - type: SpawnOnDespawn prototype: AsteroidRockSilver +- type: entity + id: WallSpawnAsteroidGoldCrab + parent: WallSpawnAsteroid + categories: [ HideSpawnMenu ] + components: + - type: SpawnOnDespawn + prototype: AsteroidRockGoldCrab + +- type: entity + id: WallSpawnAsteroidGold + parent: WallSpawnAsteroid + categories: [ HideSpawnMenu ] + components: + - type: SpawnOnDespawn + prototype: AsteroidRockGold + - type: entity id: WallSpawnAsteroidIronCrab parent: WallSpawnAsteroid @@ -88,4 +104,20 @@ categories: [ HideSpawnMenu ] components: - type: SpawnOnDespawn - prototype: AsteroidRockTin \ No newline at end of file + prototype: AsteroidRockTin + +- type: entity + id: WallSpawnAsteroidCoalCrab + parent: WallSpawnAsteroid + categories: [ HideSpawnMenu ] + components: + - type: SpawnOnDespawn + prototype: AsteroidRockCoalCrab + +- type: entity + id: WallSpawnAsteroidCoal + parent: WallSpawnAsteroid + categories: [ HideSpawnMenu ] + components: + - type: SpawnOnDespawn + prototype: AsteroidRockCoal diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml index d12709341243d..40f37c737fe52 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/anomaly.yml @@ -22,7 +22,7 @@ - AnomalyFlora - AnomalyShadow - AnomalyTech - #- AnomalySanta + #- AnomalySanta rareChance: 0.3 rarePrototypes: - RandomAnomalyInjectorSpawner @@ -40,7 +40,9 @@ - type: RandomSpawner prototypes: - AnomalyRockIron + - AnomalyRockCoal - AnomalyRockSilver + - AnomalyRockGold - AnomalyRockQuartz - AnomalyRockUranium chance: 1 @@ -69,4 +71,4 @@ - AnomalyTrapRock #- AnomalyTrapSanta chance: 1 - + diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/crystal.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/crystal.yml index 84adf28e2d9f8..fccc04b495771 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/crystal.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/crystal.yml @@ -16,5 +16,7 @@ - CrystalOrange - CrystalBlue - CrystalCyan + - CrystalYellow + - CrystalBlack - CrystalGrey chance: 0.7 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index a26b1511dd6ee..1a2c13460769a 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -157,6 +157,37 @@ - !type:DoActsBehavior acts: [ "Destruction" ] +- type: entity + parent: MobOreCrab + id: MobCoalCrab + description: An ore crab made from coal. + components: + - type: Sprite + state: coal_crab + - type: MeleeWeapon + damage: + types: + Blunt: 2.5 + - type: MovementSpeedModifier + baseWalkSpeed : 1.0 + baseSprintSpeed : 1.5 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 100 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: GlassBreak + - !type:SpawnEntitiesBehavior + spawn: + Coal1: + min: 2 + max: 4 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: entity parent: MobOreCrab id: MobUraniumCrab @@ -221,6 +252,35 @@ - !type:DoActsBehavior acts: [ "Destruction" ] +- type: entity + parent: MobOreCrab + id: MobGoldCrab + name: ore crab + description: An ore crab made from gold. + components: + - type: Sprite + state: gold_crab + - type: MeleeWeapon + damage: + types: + Blunt: 5 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 70 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: GlassBreak + - !type:SpawnEntitiesBehavior + spawn: + GoldOre1: + min: 1 + max: 3 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: entity name: reagent slime id: ReagentSlime diff --git a/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml b/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml index 47828ed8f5881..3b2b441aabedc 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/crystal_shard.yml @@ -73,6 +73,22 @@ - Trash - CrystalBlue +- type: entity + parent: ShardCrystalBase + name: yellow crystal shard + id: ShardCrystalYellow + components: + - type: Sprite + color: "#ffde46" + - type: PointLight + radius: 2 + energy: 2.5 + color: "#ffde46" + - type: Tag + tags: + - Trash + - CrystalYellow + - type: entity parent: ShardCrystalBase id: ShardCrystalOrange @@ -89,6 +105,22 @@ - Trash - CrystalOrange +- type: entity + parent: ShardCrystalBase + name: black crystal shard + id: ShardCrystalBlack + components: + - type: Sprite + color: "#363636" + - type: PointLight + radius: 2 + energy: 2.5 + color: "#363636" + - type: Tag + tags: + - Trash + - CrystalBlack + - type: entity parent: ShardCrystalBase id: ShardCrystalPink diff --git a/Resources/Prototypes/Entities/Objects/Power/lights.yml b/Resources/Prototypes/Entities/Objects/Power/lights.yml index 66fec56eeb70e..29f6b7142c98f 100644 --- a/Resources/Prototypes/Entities/Objects/Power/lights.yml +++ b/Resources/Prototypes/Entities/Objects/Power/lights.yml @@ -347,6 +347,21 @@ - id: SheetGlass1 - id: ShardCrystalBlue +- type: entity + parent: BaseLightTubeCrystal + name: yellow crystal light tube + id: LightTubeCrystalYellow + components: + - type: LightBulb + color: "#ffde46" + - type: Construction + graph: YellowLight + node: icon + - type: ToolRefinable + refineResult: + - id: SheetGlass1 + - id: ShardCrystalYellow + - type: entity parent: BaseLightTubeCrystal name: pink crystal light tube @@ -377,6 +392,24 @@ - id: SheetGlass1 - id: ShardCrystalOrange +- type: entity + parent: BaseLightTubeCrystal + name: black crystal light tube + description: A high power high energy bulb which has a small colored crystal inside. It isn't very bright. + id: LightTubeCrystalBlack + components: + - type: LightBulb + color: "#363636" + lightEnergy: 1 + lightRadius: 8 + - type: Construction + graph: BlackLight + node: icon + - type: ToolRefinable + refineResult: + - id: SheetGlass1 + - id: ShardCrystalBlack + - type: entity parent: BaseLightTubeCrystal name: red crystal light tube @@ -454,6 +487,21 @@ - id: SheetGlass1 - id: ShardCrystalBlue +- type: entity + parent: BaseLightbulbCrystal + name: yellow crystal light bulb + id: LightBulbCrystalYellow + components: + - type: LightBulb + color: "#ffde46" + - type: Construction + graph: YellowLightBulb + node: icon + - type: ToolRefinable + refineResult: + - id: SheetGlass1 + - id: ShardCrystalYellow + - type: entity parent: BaseLightbulbCrystal name: pink crystal light bulb @@ -484,6 +532,24 @@ - id: SheetGlass1 - id: ShardCrystalOrange +- type: entity + parent: BaseLightbulbCrystal + name: black crystal light bulb + description: A high power high energy bulb which has a small colored crystal inside. It isn't very bright. + id: LightBulbCrystalBlack + components: + - type: LightBulb + color: "#363636" + lightEnergy: 1 + lightRadius: 8 + - type: Construction + graph: BlackLightBulb + node: icon + - type: ToolRefinable + refineResult: + - id: SheetGlass1 + - id: ShardCrystalBlack + - type: entity parent: BaseLightbulbCrystal name: red crystal light bulb diff --git a/Resources/Prototypes/Entities/Structures/Decoration/crystals.yml b/Resources/Prototypes/Entities/Structures/Decoration/crystals.yml index 3e5f9ca18a9be..d68d163b5ebf1 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/crystals.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/crystals.yml @@ -140,6 +140,34 @@ min: 1 max: 2 +- type: entity + id: CrystalBlack + parent: CrystalGreen + suffix: black + components: + - type: Sprite + color: "#363636" + - type: PointLight + radius: 3 + energy: 3 + color: "#363636" + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + collection: GlassBreak + - !type:SpawnEntitiesBehavior + spawn: + ShardCrystalBlack: + min: 1 + max: 2 + - type: entity id: CrystalBlue parent: CrystalGreen @@ -168,6 +196,34 @@ min: 1 max: 2 +- type: entity + id: CrystalYellow + parent: CrystalGreen + suffix: yellow + components: + - type: Sprite + color: "#ffde46" + - type: PointLight + radius: 3 + energy: 3 + color: "#ffde46" + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 20 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + collection: GlassBreak + - !type:SpawnEntitiesBehavior + spawn: + ShardCrystalYellow: + min: 1 + max: 2 + - type: entity id: CrystalCyan parent: CrystalGreen diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index baa90189cfc5f..0cfb57dca12ce 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -564,6 +564,35 @@ softness: 0.5 color: "#39a1ff" +- type: entity + id: PoweredlightYellow + suffix: Yellow + parent: Poweredlight + components: + - type: PoweredLight + hasLampOnSpawn: LightTubeCrystalYellow + - type: PointLight + radius: 8 + energy: 3 + softness: 0.5 + color: "#ffde46" + - type: DamageOnInteract + damage: + types: + Heat: 2 + popupText: powered-light-component-burn-hand + +- type: entity + id: AlwaysPoweredlightYellow + suffix: Always Powered, Yellow + parent: AlwaysPoweredWallLight + components: + - type: PointLight + radius: 8 + energy: 3 + softness: 0.5 + color: "#ffde46" + - type: entity id: PoweredlightPink suffix: Pink @@ -622,6 +651,36 @@ softness: 0.5 color: "#ff8227" +- type: entity + id: PoweredlightBlack + suffix: Black + parent: Poweredlight + description: + components: + - type: PoweredLight + hasLampOnSpawn: LightTubeCrystalBlack + - type: PointLight + radius: 8 + energy: 1 + softness: 0.5 + color: "#363636" + - type: DamageOnInteract + damage: + types: + Heat: 2 + popupText: powered-light-component-burn-hand + +- type: entity + id: AlwaysPoweredlightBlack + suffix: Always Powered, Black + parent: AlwaysPoweredWallLight + components: + - type: PointLight + radius: 8 + energy: 1 + softness: 0.5 + color: "#363636" + - type: entity id: PoweredlightRed suffix: Red diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml index 60980cb6fcf2b..09bf879ca85af 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomalies.yml @@ -553,6 +553,56 @@ spawns: - MobSpawnCrabSilver +- type: entity + id: AnomalyRockGold + parent: AnomalyRockBase + suffix: Rock, Gold + components: + - type: Sprite + color: "#e3ba70" + - type: PointLight + radius: 2.0 + energy: 7.5 + color: "#e3ba70" + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 8 + maxAmount: 15 + minRange: 4.5 + maxRange: 7.5 + spawns: + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroidGold + - WallSpawnAsteroidGoldCrab + - settings: + spawnOnPulse: true + maxAmount: 3 + minRange: 2.5 + maxRange: 4.5 + spawns: + - CrystalYellow + - settings: + spawnOnSuperCritical: true + minAmount: 30 + maxAmount: 40 + minRange: 5 + maxRange: 15 + spawns: + - CrystalYellow + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroidGoldCrab + - settings: + spawnOnSuperCritical: true + minAmount: 6 + maxAmount: 10 + maxRange: 5 + spawns: + - MobSpawnCrabGold + - type: entity id: AnomalyRockIron parent: AnomalyRockBase @@ -603,6 +653,56 @@ spawns: - MobSpawnCrabIron +- type: entity + id: AnomalyRockCoal + parent: AnomalyRockBase + suffix: Rock, Coal + components: + - type: Sprite + color: "#484848" + - type: PointLight + radius: 2.0 + energy: 7.5 + color: "#484848" + - type: EntitySpawnAnomaly + entries: + - settings: + spawnOnPulse: true + minAmount: 8 + maxAmount: 15 + minRange: 4.5 + maxRange: 7.5 + spawns: + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroidCoal + - WallSpawnAsteroidCoalCrab + - settings: + spawnOnPulse: true + maxAmount: 3 + minRange: 2.5 + maxRange: 4.5 + spawns: + - CrystalBlack + - settings: + spawnOnSuperCritical: true + minAmount: 30 + maxAmount: 40 + minRange: 5 + maxRange: 15 + spawns: + - CrystalBlack + - WallSpawnAsteroid + - WallSpawnAsteroid + - WallSpawnAsteroidCoalCrab + - settings: + spawnOnSuperCritical: true + minAmount: 6 + maxAmount: 10 + maxRange: 5 + spawns: + - MobSpawnCrabCoal + - type: entity id: AnomalyFlora parent: BaseAnomaly diff --git a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml index 54f553ab9cd70..e83b4c5f071be 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/asteroid.yml @@ -73,6 +73,29 @@ - state: rock_coal map: [ "enum.MiningScannerVisualLayers.Overlay" ] +- type: entity + id: AsteroidRockCoalCrab + parent: AsteroidRock + description: An ore vein rich with coal. + suffix: Coal Crab + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreCoalCrab + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_coal + map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: entity id: AsteroidRockGold parent: AsteroidRock @@ -96,6 +119,29 @@ - state: rock_gold map: [ "enum.MiningScannerVisualLayers.Overlay" ] +- type: entity + id: AsteroidRockGoldCrab + parent: AsteroidRock + description: An ore vein rich with gold. + suffix: Gold Crab + components: + - type: OreVein + oreChance: 1.0 + currentOre: OreGoldCrab + - type: Sprite + layers: + - state: rock_asteroid + - map: [ "enum.EdgeLayer.South" ] + state: rock_asteroid_south + - map: [ "enum.EdgeLayer.East" ] + state: rock_asteroid_east + - map: [ "enum.EdgeLayer.North" ] + state: rock_asteroid_north + - map: [ "enum.EdgeLayer.West" ] + state: rock_asteroid_west + - state: rock_gold + map: [ "enum.MiningScannerVisualLayers.Overlay" ] + - type: entity id: AsteroidRockDiamond parent: AsteroidRock diff --git a/Resources/Prototypes/Procedural/biome_templates.yml b/Resources/Prototypes/Procedural/biome_templates.yml index 588d95f40da5d..d630ebad489fb 100644 --- a/Resources/Prototypes/Procedural/biome_templates.yml +++ b/Resources/Prototypes/Procedural/biome_templates.yml @@ -513,7 +513,9 @@ - CrystalGreen - CrystalPink - CrystalOrange + - CrystalBlack - CrystalBlue + - CrystalYellow - CrystalCyan - !type:BiomeEntityLayer threshold: 0.95 @@ -561,7 +563,9 @@ - CrystalGreen - CrystalPink - CrystalOrange + - CrystalBlack - CrystalBlue + - CrystalYellow - CrystalCyan - !type:BiomeEntityLayer threshold: 0.95 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/lighting.yml b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/lighting.yml index d7e48b664669d..ef461eda9b64f 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/utilities/lighting.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/utilities/lighting.yml @@ -39,6 +39,26 @@ - node: icon entity: LightTubeCrystalBlue +- type: constructionGraph + id: YellowLight + start: start + graph: + - node: start + edges: + - to: icon + steps: + - material: Glass + amount: 1 + doAfter: 1 + - tag: CrystalYellow + name: yellow crystal shard + icon: + sprite: Objects/Materials/Shards/crystal.rsi + state: shard1 + doAfter: 1 + - node: icon + entity: LightTubeCrystalYellow + - type: constructionGraph id: PinkLight start: start @@ -79,6 +99,26 @@ - node: icon entity: LightTubeCrystalOrange +- type: constructionGraph + id: BlackLight + start: start + graph: + - node: start + edges: + - to: icon + steps: + - material: Glass + amount: 1 + doAfter: 1 + - tag: CrystalBlack + name: black crystal shard + icon: + sprite: Objects/Materials/Shards/crystal.rsi + state: shard1 + doAfter: 1 + - node: icon + entity: LightTubeCrystalBlack + - type: constructionGraph id: RedLight start: start @@ -160,6 +200,26 @@ - node: icon entity: LightBulbCrystalBlue +- type: constructionGraph + id: YellowLightBulb + start: start + graph: + - node: start + edges: + - to: icon + steps: + - material: Glass + amount: 1 + doAfter: 1 + - tag: CrystalYellow + name: yellow crystal shard + icon: + sprite: Objects/Materials/Shards/crystal.rsi + state: shard1 + doAfter: 1 + - node: icon + entity: LightBulbCrystalYellow + - type: constructionGraph id: PinkLightBulb start: start @@ -200,6 +260,26 @@ - node: icon entity: LightBulbCrystalOrange +- type: constructionGraph + id: BlackLightBulb + start: start + graph: + - node: start + edges: + - to: icon + steps: + - material: Glass + amount: 1 + doAfter: 1 + - tag: CrystalBlack + name: black crystal shard + icon: + sprite: Objects/Materials/Shards/crystal.rsi + state: shard1 + doAfter: 1 + - node: icon + entity: LightBulbCrystalBlack + - type: constructionGraph id: RedLightBulb start: start diff --git a/Resources/Prototypes/Recipes/Construction/lighting.yml b/Resources/Prototypes/Recipes/Construction/lighting.yml index d6aeddc7e8f45..0651fc4572b1b 100644 --- a/Resources/Prototypes/Recipes/Construction/lighting.yml +++ b/Resources/Prototypes/Recipes/Construction/lighting.yml @@ -20,6 +20,17 @@ icon: { sprite: Objects/Power/light_tube.rsi, state: normal } objectType: Item +- type: construction + name: yellow light tube + id: YellowLight + graph: YellowLight + startNode: start + targetNode: icon + category: construction-category-utilities + description: A high powered light tube containing a yellow crystal + icon: { sprite: Objects/Power/light_tube.rsi, state: normal } + objectType: Item + - type: construction name: pink light tube id: PinkLight @@ -42,6 +53,17 @@ icon: { sprite: Objects/Power/light_tube.rsi, state: normal } objectType: Item +- type: construction + name: black light tube + id: BlackLight + graph: BlackLight + startNode: start + targetNode: icon + category: construction-category-utilities + description: A high powered light tube containing a black crystal. It won't be very bright. + icon: { sprite: Objects/Power/light_tube.rsi, state: normal } + objectType: Item + - type: construction name: red light tube id: RedLight @@ -86,6 +108,17 @@ icon: { sprite: Objects/Power/light_bulb.rsi, state: normal } objectType: Item +- type: construction + name: yellow light bulb + id: YellowLightBulb + graph: YellowLightBulb + startNode: start + targetNode: icon + category: construction-category-utilities + description: A high powered light bulb containing a yellow crystal. + icon: { sprite: Objects/Power/light_bulb.rsi, state: normal } + objectType: Item + - type: construction name: pink light bulb id: PinkLightBulb @@ -108,6 +141,17 @@ icon: { sprite: Objects/Power/light_bulb.rsi, state: normal } objectType: Item +- type: construction + name: black light bulb + id: BlackLightBulb + graph: BlackLightBulb + startNode: start + targetNode: icon + category: construction-category-utilities + description: A high powered light bulb containing a black crystal. It won't be very bright. + icon: { sprite: Objects/Power/light_bulb.rsi, state: normal } + objectType: Item + - type: construction name: red light bulb id: RedLightBulb diff --git a/Resources/Prototypes/ore.yml b/Resources/Prototypes/ore.yml index 30ac6a537342a..a7f4ef11e5526 100644 --- a/Resources/Prototypes/ore.yml +++ b/Resources/Prototypes/ore.yml @@ -72,10 +72,18 @@ id: OreIronCrab oreEntity: MobSpawnCrabIron +- type: ore + id: OreCoalCrab + oreEntity: MobSpawnCrabCoal + - type: ore id: OreSilverCrab oreEntity: MobSpawnCrabSilver +- type: ore + id: OreGoldCrab + oreEntity: MobSpawnCrabGold + - type: ore id: OreUraniumCrab oreEntity: MobSpawnCrabUranium diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 0a25304c2c0cf..179651a1132a3 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -419,6 +419,9 @@ - type: Tag id: Cryobeaker +- type: Tag + id: CrystalBlack + - type: Tag id: CrystalBlue @@ -437,6 +440,9 @@ - type: Tag id: CrystalRed +- type: Tag + id: CrystalYellow + - type: Tag id: CubanCarp diff --git a/Resources/Textures/Effects/mobspawn.rsi/crab_coal.png b/Resources/Textures/Effects/mobspawn.rsi/crab_coal.png new file mode 100644 index 0000000000000000000000000000000000000000..660de649085590f23b622cd9a9f8dd093cc88ac6 GIT binary patch literal 2296 zcmV+4>d3-Z_3*B!>j#)kWTe0;3iWD!F*aA5=h`7oY_(-06)T`N{rR*LGo{QCOpMF^6w z@ppH3T~prP-ir74_fe_{CIPOlu4>_)o}R|MaA#*{tQ(%3oMiJxiC+;uRxgEt7?ltu z%ICxfAcO@Dhz=bPrV=38=KoUe0QqRd>guX%4Ae)%LZYP9Yb{FyfscduINwH$wQg%U zV9C$-_jiF0@WDmuVd?>>6eQE|t*xyF4#c1cq27?%sJ8OJUtV4w3q!!4#QRd)_5A!? z92^`pZex!`yKo>>rGz1~0H~bC)7#MP5PR{B56(k~zC^I#BMw(hjm}I`$%mbA0NvB* zl&BBlq>cq90UjP6MpT{+V7EgUkb$#05a4T)v}*ws+66av5D zjW{3%eorzO#RN#fXI(kh1;j@v!ohKee1teyTU(2nRhVZ%@OG$=P(U#JMgwr|^Yb$b zHc0_2uy9O*&wD4q)%QqzhC_Ul1K1zppbB4|@a7%>@;5g(otNubko1V0-tP$y5CH>{ocp3zuo1fa6ds6$ zm78hFBZiN79J(*H9U!o+9@$}ysr{2^!TK1ib(+7aDZ{%3u8Gj;X5Pw4wl_q zwxJ6j?ZHF$Sx(QPpc0AgQXU+eoh4&WONz_r}u0}Qhd ze2BpYgz)uD1Z3dR#54lL@KHC~0{ih{8@M)#VVlPQR0M*tCJ0s92l>E}3mw_pbQ>@} z$eD=u#B$n46cQiatf!%D2kI{V>l)OVwLoGz2qRq84$2Qe)V^GcXwB>&~ctIA7o+n zQC*+<(KH2=_@P;##D@?u&nIW|E`TEvBFOQl^86BBh;N9X9bnqH&-$u`RO#pO4Ge}D z_6|O(W(b5MPyp1?<)CvdfLO_P88Oq4C_|c_{eWon6qbpRkMeUZK#!r#R5e$z?1i`q zzxVg|i~IX~5Y3)Z9v&X@oSO+jgxD&05FjFhdX^OGX;b$;^E$xfGDD$c1_l9=Da(7q zAV6L|lWQ9UNTw|B4TAuA`An{D5FnYdyf+L2(IIK^4cu$f!EcBHhP&Ltn*-X7GP>paMHuLKJw#J{OLFGK`c|` z(dN+pfNGyY^0Ohc0Da}hTLt)S{I>lGGG)?lAaNT;tcO{EzVhR(4gIV5W&uc)&UxfN zt(hNVNyoF29x6BQ_^~t;ZBvo}edNcdh_MLxl|4!6@n!+~%8$1Sut@kA3#juk zvCS+1^W$YU8pD#@Iw~{S&;X`)mMxR90 zxmxTSKjs9Quxjw1cz*!uVzxF!fc@3Evh`I3+>A!Wa0Bz)b*dfnBT*LD7$TSzCg;N( zoMT<`xA8%k+=j}mJJ`~f{lO3yUURu?;lSjJt?FJ8S!HguyH*nepjY+ z>nzA;29NsAkJqfQ`}cs)OzNN`F#Z#t`Jg%M$IPc~$7VwSA0shcta-_qA1||sTins5 zqRW{|PW%cp+6%d}hGSk%{LpTlh5)(%y)fjZa-*CjKOUkQ$AOxp-1xC<@54;krC0%46Y0F@rO~;2=!H z`T7+dItV6-=Q*JHJz9-X5=UaNJ47Gqoa@d?IPSOV3^8&w3~%&d(Zx+GzF&7Zd^!miVFo8?yqd??;qYM- z?Bs438lul}1{K2BBD76I<>t4>pdl+I!8B45E=21jyzQbUpXE~Vxt`H4+lw`d_>9}M zP1-2!_gj`+wG<7Q==oiRJe0?gzD6d@J}i+YjM3mkzNxih%e92&oRfZ#|q+CWlXF8h5!i(OL{&XonI#^ zQr8FJIXR%XI*dq1=}_wNhXpvb#cpd zH3h`50MymFP2OFHo|ts4ak^fYFqZ=O@Z#*3Vt7)5gE@MN@G!ZU<3Ju=;{cEUFhN~% z0LC>C=^t0Skb|=PRDZg#CCTQyicnA6`l1}(9Ub;_kQbO-)c;_iGjP2iXN@GAAxPGP za|`?K=#;RNqii6ogr?UHiXlsSI>!^%6MBbTqX*<@^iW3{19LkDq?xg}rT+o)18g_H S?Eql_0000>;n-^KI-y~P3?rg2l5``hPMwom zTSchMC01glVls{q3Auz}%k=gAAHF}lpXc@b`n;YWp3BF)+%;6UsR96?;c>+E#HN!s zIkZK2Qz!PtYHk{Ya>PFl0MxYq2MD-b3I~8KGajy(lZmHiiB35rH=VnN?LoR~X^RB- z^L*7^fl5(94@^CEbie0;@na6aD@jKDc+XOWw38ujfmJ>dK0Qf+-Nnb#^v3UVh{9Y*b=t>Z=YiJ|)Z|>oJVh1^c4hwak> z#82YP1rtQ(T8c*Mk-C2EKb(t?IfT^1x6kGM$kaB-1sERXHyf`7*rRuNt`k+)jMNs; z^0EKOADdlt(8Lv^!=+=ltFp!lSk9De%M~wJQ_3$mb;}xD4Z2(9X`1YtZm(x>v)%N# zk!TN;A5EC%KER(8TrZKFaL zmaW&IciG+pv?Em%R7XbaR?wi#7NpTscQ_@^9=PMVqHx44TmOh(bOTTP7D0|sF zdB~W}iOQEweL`Vj>sf&Ac^B5V$-#OWdYp>iCE*H$!*b`8jLe z;=DE&FT{_hCSC-%q4NIw!6oH`62YRa{)}=_9LA8S!$3jW`fR9nfS$0I-`BkV&xNG? z3umQp?dcvE%m30r5R{_Ej?O5Lb;l_oM70C_tRBUi0jkS__^Dqn_oQ+9oLmj!=uM&W zg$Wh=x`%9Q-;RgRc=!LrIu!2&`qdoR4%?ZT#jbWOud`PCHN7PG*)NtXoZzgJ#t z6R}7=e|fjs%1Ph|@hnm45WMh!!()dMZt43PI&t(b0;%se=3hqc z7%U-yf^k)f9awUe*(e7k_{t^#XQvfWG%OpuUDXEOR~xO6~kQBFE!^hn*nVkhU#&^EWvPw=AQtf8W)1vQgwV{sfUixxX^tS3u*m_Z+9}O;Q zwZ${t7K{3WfA09~{#FP%ZgDS-HZs%ES9lqN$Dzv=3xA&^%nu?(RpP)~`8`|aItzGy zjd$6vcoV$b#5>47n|bZI+~}i|lUg2g?!QcZx@|0^w6my++)a80Ge1{QEc!yFaRXqpcyEl zGz)WVgvK>U%a89Scz<_9JSAy-=|6HVf(T)LzXHcg>R?AlPqT{cp8Ur>U~S=1M`uw2O1*0# z96Tm*Y zL3cYAX&HdVF(Rv7%WzZwR9N~$Jkr{jn!Ujwk zfzlZlD>Og7kohWCL{GDveBI+FgS|h;b|--l4wQF3WvFI-DK(}(X{F6iuQC7L2=$xL zu60Mpp@rOKk(Z2gqek8Qll7lPPaX`r6qVap;7;}uEpq%5KG{Gkn;N~BRra=ygp(PX zX@9pkx#2z+JZs!4_q)oUke1&(E=2VUSPH=mx6b~34@S7!9~mxsPKqR};kfM7-dpR3 zyV4zlc2>Lze?HqH{9{$uney-y!-{gQee2JvbYnPX@?-t8PbH~MUkjV+{BAq&uPb5W ztJ(dJaqa|J++6WQwLq%}BNW{`^R--#ebg3Z89)f~d3UXW7Uie{y&!r|d%cHtYL54z zku;(ggV`Mk*LtN6%~^GKEKcoQp&p66`zJGObB-bp@DS8|rPV(~8Y1EC!S{RfQy zyw4nTow0j|O{gSZ>7>G=yyoIQp{`A+!iHiB{fi2tb=-gR3jrQ(UamD*a>joFV25`! literal 0 HcmV?d00001 diff --git a/Resources/Textures/Effects/mobspawn.rsi/meta.json b/Resources/Textures/Effects/mobspawn.rsi/meta.json index 720bc8a32124b..ca0d1fe0fc089 100644 --- a/Resources/Textures/Effects/mobspawn.rsi/meta.json +++ b/Resources/Textures/Effects/mobspawn.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Made by brainfood1183 (github)", + "copyright": "Made by brainfood1183 (github), Gold and Coal Crab pallet swapped by Firewars763 (github)", "size": { "x": 32, "y": 32 @@ -35,6 +35,20 @@ ] ] }, + { + "name": "crab_gold", + "directions": 1, + "delays": [ + [ + 0.6, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, { "name": "crab_uranium", "directions": 1, @@ -62,6 +76,20 @@ 0.3 ] ] + }, + { + "name": "crab_coal", + "directions": 1, + "delays": [ + [ + 0.6, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] } ] } diff --git a/Resources/Textures/Mobs/Elemental/orecrab.rsi/coal_crab.png b/Resources/Textures/Mobs/Elemental/orecrab.rsi/coal_crab.png new file mode 100644 index 0000000000000000000000000000000000000000..a1e877ee1ea0dae772823f05c506af06302532b9 GIT binary patch literal 2631 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 R)Y Date: Wed, 12 Mar 2025 22:46:29 +0000 Subject: [PATCH 11/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 524800e82d4ec..d97ded631bf40 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Moomoobeef - changes: - - message: Bowls no longer make an eating sound when drinking from them. - type: Fix - id: 7554 - time: '2024-10-26T04:00:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32819 - author: SaphireLattice changes: - message: Added a warning about unrevivability in the health analyzer UI. @@ -3889,3 +3882,12 @@ id: 8053 time: '2025-03-12T22:36:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35313 +- author: Firewars763 + changes: + - message: Added gold and coal rock anomalies and ore crab enemies. + type: Add + - message: Added yellow and black crystals, crystal shards, and light tubes. + type: Add + id: 8054 + time: '2025-03-12T22:45:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34809 From b3482fd73711a2be29b06ceb2281b0f1d8352cf5 Mon Sep 17 00:00:00 2001 From: onesch <118821520+onesch@users.noreply.github.com> Date: Thu, 13 Mar 2025 02:46:58 +0400 Subject: [PATCH 12/27] Tools/Devices: In-hand Sprites (#33689) * Adds in-hand sprites to the barber scissors. * adds in-hand sprites to the floodlight. * adds in-hand sprites to the gas analyzer. * adds in-hand sprites to the gps. * Update copyright wording, linting * resprite gps inhand sprites. * adds in-hand sprites to the mass scanner. * adds in-hand sprites to the spray_painter. * resprite in-hand sprites to the mass_scanner. * fix in-hand sprites to the mass_scanner. * Resprite mass_scanner in-hand sprites. --- .../Entities/Objects/Misc/fluff_lights.yml | 10 ++++-- .../Objects/Tools/handheld_mass_scanner.yml | 5 +++ .../Objects/Devices/gps.rsi/inhand-left.png | Bin 0 -> 306 bytes .../Objects/Devices/gps.rsi/inhand-right.png | Bin 0 -> 300 bytes .../Objects/Devices/gps.rsi/meta.json | 10 +++++- .../floodlight-broken-inhand-left.png | Bin 0 -> 377 bytes .../floodlight-broken-inhand-right.png | Bin 0 -> 378 bytes ...light_broken.png => floodlight-broken.png} | Bin .../{floodlight_on.png => floodlight-on.png} | Bin .../Objects/Misc/Lights/lights.rsi/meta.json | 30 ++++++++++++++++-- .../Lights/lights.rsi/off-inhand-left.png | Bin 0 -> 362 bytes .../Lights/lights.rsi/off-inhand-right.png | Bin 0 -> 366 bytes .../Misc/Lights/lights.rsi/on-inhand-left.png | Bin 0 -> 362 bytes .../Lights/lights.rsi/on-inhand-right.png | Bin 0 -> 366 bytes .../Atmos/gasanalyzer.rsi/inhand-left.png | Bin 0 -> 296 bytes .../Atmos/gasanalyzer.rsi/inhand-right.png | Bin 0 -> 298 bytes .../Specific/Atmos/gasanalyzer.rsi/meta.json | 10 +++++- .../handheld_mass_scanner.rsi/inhand-left.png | Bin 0 -> 370 bytes .../inhand-right.png | Bin 0 -> 365 bytes .../Tools/handheld_mass_scanner.rsi/meta.json | 10 +++++- .../Tools/scissors.rsi/inhand-left.png | Bin 0 -> 353 bytes .../Tools/scissors.rsi/inhand-right.png | Bin 0 -> 357 bytes .../Objects/Tools/scissors.rsi/meta.json | 10 +++++- .../Tools/spray_painter.rsi/inhand-left.png | Bin 0 -> 462 bytes .../Tools/spray_painter.rsi/inhand-right.png | Bin 0 -> 480 bytes .../Objects/Tools/spray_painter.rsi/meta.json | 10 +++++- 26 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 Resources/Textures/Objects/Devices/gps.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Devices/gps.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken-inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken-inhand-right.png rename Resources/Textures/Objects/Misc/Lights/lights.rsi/{floodlight_broken.png => floodlight-broken.png} (100%) rename Resources/Textures/Objects/Misc/Lights/lights.rsi/{floodlight_on.png => floodlight-on.png} (100%) create mode 100644 Resources/Textures/Objects/Misc/Lights/lights.rsi/off-inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/Lights/lights.rsi/off-inhand-right.png create mode 100644 Resources/Textures/Objects/Misc/Lights/lights.rsi/on-inhand-left.png create mode 100644 Resources/Textures/Objects/Misc/Lights/lights.rsi/on-inhand-right.png create mode 100644 Resources/Textures/Objects/Specific/Atmos/gasanalyzer.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Specific/Atmos/gasanalyzer.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Tools/scissors.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Tools/scissors.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Tools/spray_painter.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Tools/spray_painter.rsi/inhand-right.png diff --git a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml index 34263ccdc006f..9b27ad0bc6596 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fluff_lights.yml @@ -191,9 +191,11 @@ - type: Item size: Normal - type: Sprite + sprite: Objects/Misc/Lights/lights.rsi layers: - state: floodlight - - state: floodlight_on + map: [ "base" ] + - state: floodlight-on shader: unshaded visible: false map: [ "light" ] @@ -244,9 +246,13 @@ parent: BaseItem description: A pole with powerful mounted lights on it. It's broken. components: + - type: Item + size: Normal + sprite: Objects/Misc/Lights/lights.rsi + heldPrefix: floodlight-broken - type: Sprite sprite: Objects/Misc/Lights/lights.rsi - state: floodlight_broken + state: floodlight-broken - type: Anchorable - type: Damageable damageContainer: StructuralInorganic diff --git a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml index e10c5b84af5f2..31e5f99752bd9 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml @@ -5,6 +5,8 @@ description: A hand-held mass scanner. components: - type: Item + size: Normal + sprite: Objects/Tools/handheld_mass_scanner.rsi - type: Sprite sprite: Objects/Tools/handheld_mass_scanner.rsi state: icon @@ -47,6 +49,9 @@ slots: cell_slot: name: power-cell-slot-component-slot-name-default + - type: Item + size: Normal + sprite: Objects/Tools/handheld_mass_scanner.rsi - type: Sprite sprite: Objects/Tools/handheld_mass_scanner.rsi state: icon diff --git a/Resources/Textures/Objects/Devices/gps.rsi/inhand-left.png b/Resources/Textures/Objects/Devices/gps.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d8c3974f7ec6fa5a5636cff3952b92db8dc48f GIT binary patch literal 306 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`031o(uwN+{_IN+_vI@-YOpb}c&Wq$PZ_-3%zXUD@aykm4u_@(cbC0Sxz= z_eKK6I14-?iy0XB_Jc5^1#7ShP_W$k~iAK&AYyFXY0pL46=4KY1=6xVC}V^mHCLDcUi>04LkNt zmU5ncHCMrY!?X1hnLJoHDj-O~;C>(Dk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`031o(uwN+{_IN+>Y|wW>?0km4u_@(cbC0Sxz= z_eKK6I14-?iy0XB_Jc5^1#7ShP_Wa}#W5tp{q41ld<_abEElE){rqol=BwZ+t*qXC z_->Q)`>DK3bK4jiIU4O5=P!&CaczB_b}?yzf!R0bwN`2w_U_()BgBsUc2Cion!3Q} zP>9s@s(!!4tE1(e8ys4I+8CK8@-(DKx&Ie=cR7hw_)@{vukL1(7>@svWcbbL@cSoQ g28TdL4%6DXQn&MdzSzA~3+N~YPgg&ebxsLQ03(rR;{X5v literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Devices/gps.rsi/meta.json b/Resources/Textures/Objects/Devices/gps.rsi/meta.json index a59c0b00129f6..72a8e19a4ece4 100644 --- a/Resources/Textures/Objects/Devices/gps.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/gps.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "tgstation at 3ddd840268e33bbcf316f242e6a972b84e6b773c", + "copyright": "tgstation at 3ddd840268e33bbcf316f242e6a972b84e6b773c, Inhand sprites by onesch", "size": { "x": 32, "y": 32 @@ -10,6 +10,14 @@ { "name": "icon" }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, { "name": "active", "delays": [ diff --git a/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken-inhand-left.png b/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b31b949eee2963fba47069cc7ebbc9ae33bb17c9 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`031o(uwhK7c!si|$-w(ZHw-ud(Ar>Cc%I3fp>bP*5<08$(!L4LviA%Njt z^WI3H7-xY;WHAE+-vJP2%(~Xe2^75M>Eaj?;r{m8LB7KZ9Bc_IqVE6iW#?`WTi9H9 z>rnm5%tzu!-MEZrGI2flW6q$_eEbH3oZdk;sV|C$m(OsJPS4`zIBR;JDPv!coh$o= zawZv3jx*OA57Z>He%jL#_cGM5tAbxa=Gw|#4C}niw>@Ra;5CYR%yMPdp2uvLv^NAf zFwSAB<2-TCqh$57cSkO+jeCCYkfl&m*%`Kmu1^d&kRKp!%A My85}Sb4q9e021hs761SM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken-inhand-right.png b/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken-inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..c03d65a422543048b510442545f20a532df3b75d GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`031o(uws;Q}khK6q2wkJaa?>q=%y<$S?Rm1Tfrd z-Wv%N<1FxqEM{QfI{?CrS=Tx_fr8gPT^vIq+}}>S&DWy9;}X5|?|*syO`#$N+YX;j zJG_U%^SObja?q?ROgabF*)s~%Kc8UKP%-<&#I@&&Cx|Y%KnJRG2Ax2eO+q(%XK$?t-cs) zJ-dE_gWFoYhN48b$Q7mD4sUvSO&Y2)UtfKb!FR!GnK01Q%MDZP9tGwxtyc)G0(z0b M)78&qol`;+03*7XOaK4? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight_broken.png b/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken.png similarity index 100% rename from Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight_broken.png rename to Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-broken.png diff --git a/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight_on.png b/Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-on.png similarity index 100% rename from Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight_on.png rename to Resources/Textures/Objects/Misc/Lights/lights.rsi/floodlight-on.png diff --git a/Resources/Textures/Objects/Misc/Lights/lights.rsi/meta.json b/Resources/Textures/Objects/Misc/Lights/lights.rsi/meta.json index 38b29d5d407d1..04005a4a79807 100644 --- a/Resources/Textures/Objects/Misc/Lights/lights.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/Lights/lights.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", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, Floodlight inhand sprites by onesch", "size": { "x": 32, "y": 32 @@ -19,13 +19,37 @@ "name": "floodlight" }, { - "name": "floodlight_on" + "name": "off-inhand-left", + "directions": 4 + }, + { + "name": "off-inhand-right", + "directions": 4 + }, + { + "name": "floodlight-on" + }, + { + "name": "on-inhand-left", + "directions": 4 + }, + { + "name": "on-inhand-right", + "directions": 4 }, { "name": "floodlight_burned" }, { - "name": "floodlight_broken" + "name": "floodlight-broken" + }, + { + "name": "floodlight-broken-inhand-left", + "directions": 4 + }, + { + "name": "floodlight-broken-inhand-right", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Misc/Lights/lights.rsi/off-inhand-left.png b/Resources/Textures/Objects/Misc/Lights/lights.rsi/off-inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..b23c998256c1ec79da3d150427c88ab8a5eddcdd GIT binary patch literal 362 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yhK7c!si|$-w(Z0bx%uCa_WxRLw`2i{Rk|4j}|6sr%<<0B{ z6yhxKh%9Dc;5z`qj9J$@Ie~(wJzX3_BHZ6zJI!@Ofrs_N61#u@C%b!Vt?)cKcTL)d zJf2pWB<`qH2W1{G*#74g@ct+z{ou6f36kYILx?z7jdqbTp!>>|? z7v^d=e&3#~@>J%p?1^73GxV~xL~k6P(i>~pXx1E(J?Fr_wd#2aHjPu6WfnYV*w5nP zzocx{v2#ZzX_jf--ac2{fYm&Kv+jTZgM+xh1Fk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=ys;Q}khK6q2wkd1FQfx~rS===I7j@?(o)PEHk&-`J& z>49zLC63mkIS0j#{ON4?vC3DF@#98=_65t6^Uas|e^`EZ!U564M|CAcHcK0c@Er|GD7O6NPNKO%vXmb91H5b@1Q3AccFILK=5n zWPyF;;+mJrl_pzdmfUxnclXJx7hDruufJ{k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yhK7c!si|$-w(bA_o%836kYILx?z7jdqbTp!>>|? z7v^d=e&3#~@>J%p?1^73GxV~xL~k6P(i>~pXx1E(J?Fr_wd#2aHjPu6WfnYV*w5nP zzocx{v2#ZzX_jf--ac2{fYm&Kv+jTZgM+xh1Fk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=ys;Q}khK6q2wk<&8?( zxn8t6EaKE16Z^)JY29C^ggjL+dVBEK|8v2mCkoken)^k6K??Uag*5KE z$O8Mw#WgRLD^0e_EV=JC@9vXXFSsVSUVq&zmbzTvQE@4*m~n)6@@aWk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=y8o9bEYw1RIO*wY@OvBD2NhNhanbuz?<^n19k|4j}|6sr%<<0B{ z6yhxKh%9Dc;5z`qj9J$@Ie~(mo-U3d5$5R7Sy+IpFbA@g2EoH-GlcihY)( zSo7ua{72V+>=t5VSO7t_ylb+Z_&Bb$sBBorY3XpCWq0qS1HL;<6?uP{D)R4OV7S27 bcu&7&Z@i*!+LM1kM=^N1`njxgN@xNAq%&%# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Atmos/gasanalyzer.rsi/inhand-right.png b/Resources/Textures/Objects/Specific/Atmos/gasanalyzer.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..917c22422c7a2585ee4919ffb5f0dbd69b2ff731 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yDr@N)xw;-ZeI~MNO2f`0NhNha8J$&)JwS@RB*-uLKNv7bc{95K zg*Xd5B8wRq_zr+DW7f4!PM~17r;B4qg!|iRj(iOYJS@?I|Nf`s25r42A^tI?Oz+J? zYn7O;Esh!s4lH;O&J@Tmu`B+Kk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1k1^9%x3Q8zRDCu`CI?NE%db8bZQ@)Oqmaw`cpQ4^UP)Yx;J;p$at0c%T z_&*FVY&xTJ9w^FL;1OBOz`%C^gc-B0b#ej)k9)c}hD5l(oqC$D#el<=+rsMKe|~<6 zBp1D7M`oO9+N}AlaE<9p+1Jid7nl~a>KgnDH8|1Dd?e0gLPN@<6a}&MN*)Hw`c<0C zsze*D6K0B=vb5)&Ud>_CeDJi6R!7^T9ea9tu6>QK-@(THApd|!)9)<{Slzgz685NQ z=x?!MVEt%iH_5%rUn4K&!ryazI-&|JO6PAMnC8tOG_lytxlv8|&GiFbg1qWnar-6r z+-fvl{Wa}F61(qSu47X!KHdH9Qj?ejKkMsX%r~ohlfIM+?E!j;!PC{xWt~$(69A&u Bi5>s| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/inhand-right.png b/Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..e727b4e7a13a4b0b96d1afd3a2758362ea5d7fec GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`1k1^9%xN+{_IN+@+LI()O;j3KCXQ@)P6B%hO(u%ezlP>I_8)9gTst0c%T z_&*FVY&xTJ9w^FL;1OBOz`%C^gc-B0b#ej)4|%#chD5l(oqCb4*?_|}Gd1h~|8{n6 zwF_eH#opfzRDN7`EqGC<_$}X{2~29NnhF0r7+jqiR`uB`U12?Zd4Z8fQ&+#LP4m4| zObec0_szb)pnWNe%7NUqAEyUg30%Kp^20-)+YXmLRhGD7Fn?l`h=HaD<7ei^)pPDk zguRr1Yp~xq^3Ky+4|VEmnO<2Ocetu}^1}Od9mUMkr@I{9AUU^BD`dV9@8ScmcLW7a yN)-4Z8|n1kK|KHb7JL71$2}amX3TE7Hm^p%H+H4xr#hf-7(8A5T-G@yGywqKUXURG literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/meta.json b/Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/meta.json index edae9c38c4147..24fdcb71cc2a4 100644 --- a/Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/handheld_mass_scanner.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from Frontier Station, created by Tem Armoff https://github.com/new-frontiers-14/frontier-station-14/pull/484/files", + "copyright": "Taken from Frontier Station, created by Tem Armoff https://github.com/new-frontiers-14/frontier-station-14/pull/484/files, Inhand sprites by onesch", "states": [ { "name": "scanner", @@ -20,6 +20,14 @@ { "name": "icon", "directions": 1 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Tools/scissors.rsi/inhand-left.png b/Resources/Textures/Objects/Tools/scissors.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..3d078c811dfd8fc671e99995625788d4d74b3d56 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`032l#}zPMf!2+3Gc0wrxww%*!vUS*E11Q&WGklon9Fo|Cy5NO6_~`33)n z0)}A!3L%hSfk$L90|Vay5N6D}*2xJJ+~w)w7!u+BcA7WeVFL~q#UF?N`o{!Ydd2dG z23&Pjb@O66W+S}5?Tfdn0^>54KVk(_?dCqZUQy?}{^RVJ1BP;yZr`@?oMx6;5|kF> za#Gd7Ay*~l+&@PRohz@-gef{)U$sZ9<9O8klS&qj`CHF^xDwI$_nhnvp4D?c+cMmE z`=z?!x0eHx52r_iCgXp$hH7VFh1mu24{o#^V7Z~@Qpb3!<$|ojYyoD5*#azY%oI6p j7{Rl%f&=(Azu6{1-oD!Mk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`032l#}zPMf!2+3Gb(nR#2bZObpK*{P|&Oi5$1lon8aS5?YeAjMe{S|=w^aG$4(V@QPi+i9oyS`>I(xtZ?$|DU9}USX2Y z>oZAWw%ltx-!tA7IW&F70hS)lI@OBwl`D7c+Vm=8rp||-g;&g3=R8oEuTU}JT7f{# zgGDt?9Or_4V!Avg?%`Iw|Bvy6;=?sx-Ot^59kqd5Ab85N&5GsQi#VSAHm+%N6JPPE z_`ATKqbzC(J_$_6Sn9PeM3nDcb^DOp1@-+s%M*O+B)b#l{V{siboMTitar`x4M644$rjF6*2UngBZQk)Hqn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/scissors.rsi/meta.json b/Resources/Textures/Objects/Tools/scissors.rsi/meta.json index b544b3bc1568f..c431ad7f01d27 100644 --- a/Resources/Textures/Objects/Tools/scissors.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/scissors.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC0-1.0", - "copyright": "Created by TheShuEd(github) for Space Station 14", + "copyright": "Created by TheShuEd(github) for Space Station 14, Inhand sprites by onesch", "size": { "x": 32, "y": 32 @@ -9,6 +9,14 @@ "states": [ { "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Tools/spray_painter.rsi/inhand-left.png b/Resources/Textures/Objects/Tools/spray_painter.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..34787a11f5f0931afe316d680375fefbfbdd15e9 GIT binary patch literal 462 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~e2l#}zPPAf>lau?O#h|OJ%kW>(*4CCGkW*Jp&d0$xJIdYGn8C-#hl`7A zW<5ig2ZN-fBv79Xmm0`Y!IB`q;QwfVL3QoSB%mZ`fk$L90|Vay5N6D}*2xKU47;a` zV@QPi+i9nTniY6lJ3FG}r~dzcOD)UvMd^{3CAVD9F*Pc(7aT7A=Y^#>Evgxe2x!|0`(&_&D7UaqO;tBaFkR1G+TS_nW zu+|4hwOP{P2~k{ka~9|YXwR*2JoxpmgNfvhr3=%U*BoaG|8hR@$*s&IZ!K)9W9o}o zpC5a9LHq5C52rrYPw3|KQJ8UnrHON&>Wur$XY4E;4(iEdOlz-V=DJj{V5WRlEGw(0 z#f1<5J_W>cePevu`^NrkJZFi;g)@$gJ4JFHIxsggfvDzYCIOX)4u_48FJNG4FIZs7 j!m6;NowH8A<0I>|$=|kjuy36N3?~LpS3j3^P6k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~e2l#}z%E`%1v|?cRuc)i5`#+0;A&}G7)>cO>_%)r2R0E8K{u61$(9V6-K z;usR){&w2ibx&JHITK(OJ;^PF~S_e!oSII?DxoqYmi5Y|=~E^}wE! z!AHh)Lc1Fyk64VvzT*W?=2_m!zh*A)cI~n5(rLFHUb|Q3DR8_IDE@r(XZ^CU=EBD< zFLG}*bEN!t*z7A|UbthsCqp^^<~>=;GKp;U)8A~7ONcyK@KXECYo;wmZx{-r&}_%+Qs!;<8)Ly{iG@i0`Z)ydrADeU{CNW^S_xNck8O8FY57 zgQ-oQNNYpZyOVM|+B=+G6%(9G`Ip=JXx?~T=lDWV>j_inchl##E^@11?Mr&E*tg=s zo_E<9ZdDyWW-LtJysLi6J!hH8u}irB#Wnn3iCg$>{Ry$V9Keuc@O1TaS?83{1OQop BzwiJ6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json b/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json index 056ba0a8563e6..8a19107208efa 100644 --- a/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json +++ b/Resources/Textures/Objects/Tools/spray_painter.rsi/meta.json @@ -1,5 +1,5 @@ { - "copyright" : "Taken from https://github.com/tgstation/tgstation at commit a21274e56ae84b2c96e8b6beeca805df3d5402e8.", + "copyright" : "Taken from https://github.com/tgstation/tgstation at commit a21274e56ae84b2c96e8b6beeca805df3d5402e8, Inhand sprites by onesch", "license" : "CC-BY-SA-3.0", "size" : { "x" : 32, @@ -8,6 +8,14 @@ "states" : [ { "name" : "spray_painter" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 } ], "version" : 1 From f9a48463ba7947848f5f770855cd3d0fe5f7685e Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Mar 2025 22:48:05 +0000 Subject: [PATCH 13/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d97ded631bf40..26625e57bde22 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SaphireLattice - changes: - - message: Added a warning about unrevivability in the health analyzer UI. - type: Add - id: 7555 - time: '2024-10-26T17:22:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32636 - author: slarticodefast changes: - message: Fixed pie throwing sound not playing. @@ -3891,3 +3884,10 @@ id: 8054 time: '2025-03-12T22:45:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34809 +- author: onesch + changes: + - message: Added handheld sprites to some items + type: Add + id: 8055 + time: '2025-03-12T22:46:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/33689 From 63ecf4241a4e6f8e7070220941d6bde9e7589e73 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Thu, 13 Mar 2025 02:51:48 +0300 Subject: [PATCH 14/27] IconSmooth additional smoothing keys (#35790) * additionalKeys * Update lava.yml * Update Content.Client/IconSmoothing/IconSmoothComponent.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Client/IconSmoothing/IconSmoothComponent.cs | 6 ++++++ Content.Client/IconSmoothing/IconSmoothSystem.cs | 3 ++- Resources/Prototypes/Entities/Structures/Walls/walls.yml | 2 +- Resources/Prototypes/Entities/Tiles/chasm.yml | 2 ++ Resources/Prototypes/Entities/Tiles/lava.yml | 2 ++ 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/Content.Client/IconSmoothing/IconSmoothComponent.cs b/Content.Client/IconSmoothing/IconSmoothComponent.cs index 040198529c751..7898e9dc1ebc6 100644 --- a/Content.Client/IconSmoothing/IconSmoothComponent.cs +++ b/Content.Client/IconSmoothing/IconSmoothComponent.cs @@ -26,6 +26,12 @@ public sealed partial class IconSmoothComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("key")] public string? SmoothKey { get; private set; } + /// + /// Additional keys to smooth with. + /// + [DataField] + public List AdditionalKeys = new(); + /// /// Prepended to the RSI state. /// diff --git a/Content.Client/IconSmoothing/IconSmoothSystem.cs b/Content.Client/IconSmoothing/IconSmoothSystem.cs index 2654f1ab574f1..45aafb528875f 100644 --- a/Content.Client/IconSmoothing/IconSmoothSystem.cs +++ b/Content.Client/IconSmoothing/IconSmoothSystem.cs @@ -376,7 +376,8 @@ private bool MatchingEntity(IconSmoothComponent smooth, AnchoredEntitiesEnumerat while (candidates.MoveNext(out var entity)) { if (smoothQuery.TryGetComponent(entity, out var other) && - other.SmoothKey == smooth.SmoothKey && + other.SmoothKey != null && + (other.SmoothKey == smooth.SmoothKey || smooth.AdditionalKeys.Contains(other.SmoothKey)) && other.Enabled) { return true; diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 57b8aa915e72d..97823cec28777 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -81,7 +81,7 @@ acts: [ "Destruction" ] - type: IconSmooth - key: bricks + key: walls base: brick - type: entity diff --git a/Resources/Prototypes/Entities/Tiles/chasm.yml b/Resources/Prototypes/Entities/Tiles/chasm.yml index 23f3ad8395002..a0dc308d17efc 100644 --- a/Resources/Prototypes/Entities/Tiles/chasm.yml +++ b/Resources/Prototypes/Entities/Tiles/chasm.yml @@ -27,6 +27,8 @@ state: full - type: IconSmooth key: chasm + additionalKeys: + - walls base: chasm - type: Physics bodyType: Static diff --git a/Resources/Prototypes/Entities/Tiles/lava.yml b/Resources/Prototypes/Entities/Tiles/lava.yml index 68dd5671a06dc..10a09116ade4f 100644 --- a/Resources/Prototypes/Entities/Tiles/lava.yml +++ b/Resources/Prototypes/Entities/Tiles/lava.yml @@ -36,6 +36,8 @@ state: full - type: IconSmooth key: floor + additionalKeys: + - walls base: lava - type: Physics bodyType: Static From e1762d91faab61eb1b2c8fc0e2d8c0c584517f8b Mon Sep 17 00:00:00 2001 From: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Date: Thu, 13 Mar 2025 12:30:16 +1200 Subject: [PATCH 15/27] Locks nitrous oxide canisters (#35785) lock nitrous oxide canisters --- .../Entities/Structures/Storage/Canisters/gas_canisters.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index b76791cba69ce..33c4dfbe178eb 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -592,6 +592,8 @@ - !type:DoActsBehavior acts: [ "Destruction" ] - !type:DumpCanisterBehavior + - type: Lock + locked: true - type: entity parent: GasCanister From 3f8be60a8d2826eda5be76f909425b0ca8bef01e Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Mar 2025 00:31:24 +0000 Subject: [PATCH 16/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 26625e57bde22..b735c859f1b53 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed pie throwing sound not playing. - type: Fix - id: 7556 - time: '2024-10-27T04:25:55.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33017 - author: stalengd changes: - message: Fixed playtime labels not being able to correctly display time greater @@ -3891,3 +3884,10 @@ id: 8055 time: '2025-03-12T22:46:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/33689 +- author: K-Dynamic + changes: + - message: Nitrous oxide canisters now begin locked like other dangerous gas canisters. + type: Fix + id: 8056 + time: '2025-03-13T00:30:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35785 From 48a4aa39292e8a6b0ca461396e75e0227367e941 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 13 Mar 2025 01:41:50 +0100 Subject: [PATCH 17/27] Cleanup Objective files, add PickSpecificPersonComponent (#35802) * cleanup objectives * remove unrelated access restriction * review --- .../Components/PickRandomHeadComponent.cs | 8 +- .../Components/PickRandomPersonComponent.cs | 8 +- .../Components/PickSpecificPersonComponent.cs | 8 + .../Components/RandomTraitorAliveComponent.cs | 8 +- .../RandomTraitorProgressComponent.cs | 8 +- .../Components/TargetOverrideComponent.cs | 16 ++ .../Systems/HelpProgressConditionSystem.cs | 59 +---- .../Objectives/Systems/KeepAliveCondition.cs | 43 +--- .../Systems/KillPersonConditionSystem.cs | 76 ------- .../Systems/PickObjectiveTargetSystem.cs | 212 ++++++++++++++++++ 10 files changed, 246 insertions(+), 200 deletions(-) create mode 100644 Content.Server/Objectives/Components/PickSpecificPersonComponent.cs create mode 100644 Content.Server/Objectives/Components/TargetOverrideComponent.cs create mode 100644 Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs diff --git a/Content.Server/Objectives/Components/PickRandomHeadComponent.cs b/Content.Server/Objectives/Components/PickRandomHeadComponent.cs index c2f82fb6c5945..38ed2522646f5 100644 --- a/Content.Server/Objectives/Components/PickRandomHeadComponent.cs +++ b/Content.Server/Objectives/Components/PickRandomHeadComponent.cs @@ -1,12 +1,8 @@ -using Content.Server.Objectives.Systems; - namespace Content.Server.Objectives.Components; /// /// Sets the target for to a random head. /// If there are no heads it will fallback to any person. /// -[RegisterComponent, Access(typeof(KillPersonConditionSystem))] -public sealed partial class PickRandomHeadComponent : Component -{ -} +[RegisterComponent] +public sealed partial class PickRandomHeadComponent : Component; diff --git a/Content.Server/Objectives/Components/PickRandomPersonComponent.cs b/Content.Server/Objectives/Components/PickRandomPersonComponent.cs index 4188b1da3d250..bf4135e2a9b34 100644 --- a/Content.Server/Objectives/Components/PickRandomPersonComponent.cs +++ b/Content.Server/Objectives/Components/PickRandomPersonComponent.cs @@ -1,11 +1,7 @@ -using Content.Server.Objectives.Systems; - namespace Content.Server.Objectives.Components; /// /// Sets the target for to a random person. /// -[RegisterComponent, Access(typeof(KillPersonConditionSystem))] -public sealed partial class PickRandomPersonComponent : Component -{ -} +[RegisterComponent] +public sealed partial class PickRandomPersonComponent : Component; diff --git a/Content.Server/Objectives/Components/PickSpecificPersonComponent.cs b/Content.Server/Objectives/Components/PickSpecificPersonComponent.cs new file mode 100644 index 0000000000000..03a482fc7b1e5 --- /dev/null +++ b/Content.Server/Objectives/Components/PickSpecificPersonComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.Objectives.Components; + +/// +/// Sets this objective's target to the one given in , if the entity has it. +/// This component needs to be added to objective entity itself. +/// +[RegisterComponent] +public sealed partial class PickSpecificPersonComponent : Component; diff --git a/Content.Server/Objectives/Components/RandomTraitorAliveComponent.cs b/Content.Server/Objectives/Components/RandomTraitorAliveComponent.cs index fd37d0d2c849a..1c45cb45d5abb 100644 --- a/Content.Server/Objectives/Components/RandomTraitorAliveComponent.cs +++ b/Content.Server/Objectives/Components/RandomTraitorAliveComponent.cs @@ -1,11 +1,7 @@ -using Content.Server.Objectives.Systems; - namespace Content.Server.Objectives.Components; /// /// Sets the target for to a random traitor. /// -[RegisterComponent, Access(typeof(KeepAliveConditionSystem))] -public sealed partial class RandomTraitorAliveComponent : Component -{ -} +[RegisterComponent] +public sealed partial class RandomTraitorAliveComponent : Component; diff --git a/Content.Server/Objectives/Components/RandomTraitorProgressComponent.cs b/Content.Server/Objectives/Components/RandomTraitorProgressComponent.cs index c05ac0d3efee2..f2da9778eb74b 100644 --- a/Content.Server/Objectives/Components/RandomTraitorProgressComponent.cs +++ b/Content.Server/Objectives/Components/RandomTraitorProgressComponent.cs @@ -1,11 +1,7 @@ -using Content.Server.Objectives.Systems; - namespace Content.Server.Objectives.Components; /// /// Sets the target for to a random traitor. /// -[RegisterComponent, Access(typeof(HelpProgressConditionSystem))] -public sealed partial class RandomTraitorProgressComponent : Component -{ -} +[RegisterComponent] +public sealed partial class RandomTraitorProgressComponent : Component; diff --git a/Content.Server/Objectives/Components/TargetOverrideComponent.cs b/Content.Server/Objectives/Components/TargetOverrideComponent.cs new file mode 100644 index 0000000000000..faa402012c20b --- /dev/null +++ b/Content.Server/Objectives/Components/TargetOverrideComponent.cs @@ -0,0 +1,16 @@ +namespace Content.Server.Objectives.Components; + +/// +/// Sets a target objective to a specific target when receiving it. +/// The objective entity needs to have . +/// This component needs to be added to entity receiving the objective. +/// +[RegisterComponent] +public sealed partial class TargetOverrideComponent : Component +{ + /// + /// The entity that should be targeted. + /// + [DataField] + public EntityUid? Target; +} diff --git a/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs b/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs index 7639e69bfdaa3..1816896ecc9b5 100644 --- a/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs +++ b/Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs @@ -1,31 +1,23 @@ -using Content.Server.GameTicking.Rules; using Content.Server.Objectives.Components; using Content.Shared.Mind; using Content.Shared.Objectives.Components; using Content.Shared.Objectives.Systems; -using Content.Shared.Roles.Jobs; -using Robust.Shared.Random; -using System.Linq; namespace Content.Server.Objectives.Systems; /// -/// Handles help progress condition logic and picking random help targets. +/// Handles help progress condition logic. /// public sealed class HelpProgressConditionSystem : EntitySystem { - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedObjectivesSystem _objectives = default!; [Dependency] private readonly TargetObjectiveSystem _target = default!; - [Dependency] private readonly TraitorRuleSystem _traitorRule = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnGetProgress); - - SubscribeLocalEvent(OnTraitorAssigned); } private void OnGetProgress(EntityUid uid, HelpProgressConditionComponent comp, ref ObjectiveGetProgressEvent args) @@ -36,55 +28,6 @@ private void OnGetProgress(EntityUid uid, HelpProgressConditionComponent comp, r args.Progress = GetProgress(target.Value); } - private void OnTraitorAssigned(EntityUid uid, RandomTraitorProgressComponent comp, ref ObjectiveAssignedEvent args) - { - // invalid prototype - if (!TryComp(uid, out var target)) - { - args.Cancelled = true; - return; - } - - var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet(); - - // cant help anyone who is tasked with helping: - // 1. thats boring - // 2. no cyclic progress dependencies!!! - foreach (var traitor in traitors) - { - // TODO: replace this with TryComp(traitor) or something when objectives are moved out of mind - if (!TryComp(traitor.Id, out var mind)) - continue; - - foreach (var objective in mind.Objectives) - { - if (HasComp(objective)) - traitors.RemoveWhere(x => x.Mind == mind); - } - } - - // Can't have multiple objectives to help/save the same person - foreach (var objective in args.Mind.Objectives) - { - if (HasComp(objective) || HasComp(objective)) - { - if (TryComp(objective, out var help)) - { - traitors.RemoveWhere(x => x.Id == help.Target); - } - } - } - - // no more helpable traitors - if (traitors.Count == 0) - { - args.Cancelled = true; - return; - } - - _target.SetTarget(uid, _random.Pick(traitors).Id, target); - } - private float GetProgress(EntityUid target) { var total = 0f; // how much progress they have diff --git a/Content.Server/Objectives/Systems/KeepAliveCondition.cs b/Content.Server/Objectives/Systems/KeepAliveCondition.cs index fad8aa6d18e15..f68227e861a76 100644 --- a/Content.Server/Objectives/Systems/KeepAliveCondition.cs +++ b/Content.Server/Objectives/Systems/KeepAliveCondition.cs @@ -1,30 +1,22 @@ using Content.Server.Objectives.Components; -using Content.Server.GameTicking.Rules; using Content.Shared.Mind; using Content.Shared.Objectives.Components; -using Content.Shared.Roles.Jobs; -using Robust.Shared.Random; -using System.Linq; namespace Content.Server.Objectives.Systems; /// -/// Handles keep alive condition logic and picking random traitors to keep alive. +/// Handles keep alive condition logic. /// public sealed class KeepAliveConditionSystem : EntitySystem { - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly TargetObjectiveSystem _target = default!; - [Dependency] private readonly TraitorRuleSystem _traitorRule = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnGetProgress); - - SubscribeLocalEvent(OnAssigned); } private void OnGetProgress(EntityUid uid, KeepAliveConditionComponent comp, ref ObjectiveGetProgressEvent args) @@ -35,39 +27,6 @@ private void OnGetProgress(EntityUid uid, KeepAliveConditionComponent comp, ref args.Progress = GetProgress(target.Value); } - private void OnAssigned(EntityUid uid, RandomTraitorAliveComponent comp, ref ObjectiveAssignedEvent args) - { - // invalid prototype - if (!TryComp(uid, out var target)) - { - args.Cancelled = true; - return; - } - - var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet(); - - // Can't have multiple objectives to help/save the same person - foreach (var objective in args.Mind.Objectives) - { - if (HasComp(objective) || HasComp(objective)) - { - if (TryComp(objective, out var help)) - { - traitors.RemoveWhere(x => x.Id == help.Target); - } - } - } - - // You are the first/only traitor. - if (traitors.Count == 0) - { - args.Cancelled = true; - return; - } - - _target.SetTarget(uid, _random.Pick(traitors).Id, target); - } - private float GetProgress(EntityUid target) { if (!TryComp(target, out var mind)) diff --git a/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs b/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs index 3aa4d606fc3bd..45ad68e28b6c1 100644 --- a/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs +++ b/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs @@ -1,12 +1,9 @@ using Content.Server.Objectives.Components; -using Content.Server.Revolutionary.Components; using Content.Server.Shuttles.Systems; using Content.Shared.CCVar; using Content.Shared.Mind; using Content.Shared.Objectives.Components; using Robust.Shared.Configuration; -using Robust.Shared.Random; -using System.Linq; namespace Content.Server.Objectives.Systems; @@ -17,7 +14,6 @@ public sealed class KillPersonConditionSystem : EntitySystem { [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; [Dependency] private readonly IConfigurationManager _config = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly TargetObjectiveSystem _target = default!; @@ -26,10 +22,6 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnGetProgress); - - SubscribeLocalEvent(OnPersonAssigned); - - SubscribeLocalEvent(OnHeadAssigned); } private void OnGetProgress(EntityUid uid, KillPersonConditionComponent comp, ref ObjectiveGetProgressEvent args) @@ -40,74 +32,6 @@ private void OnGetProgress(EntityUid uid, KillPersonConditionComponent comp, ref args.Progress = GetProgress(target.Value, comp.RequireDead); } - private void OnPersonAssigned(EntityUid uid, PickRandomPersonComponent comp, ref ObjectiveAssignedEvent args) - { - // invalid objective prototype - if (!TryComp(uid, out var target)) - { - args.Cancelled = true; - return; - } - - // target already assigned - if (target.Target != null) - return; - - var allHumans = _mind.GetAliveHumans(args.MindId); - - // Can't have multiple objectives to kill the same person - foreach (var objective in args.Mind.Objectives) - { - if (HasComp(objective) && TryComp(objective, out var kill)) - { - allHumans.RemoveWhere(x => x.Owner == kill.Target); - } - } - - // no other humans to kill - if (allHumans.Count == 0) - { - args.Cancelled = true; - return; - } - - _target.SetTarget(uid, _random.Pick(allHumans), target); - } - - private void OnHeadAssigned(EntityUid uid, PickRandomHeadComponent comp, ref ObjectiveAssignedEvent args) - { - // invalid prototype - if (!TryComp(uid, out var target)) - { - args.Cancelled = true; - return; - } - - // target already assigned - if (target.Target != null) - return; - - // no other humans to kill - var allHumans = _mind.GetAliveHumans(args.MindId); - if (allHumans.Count == 0) - { - args.Cancelled = true; - return; - } - - var allHeads = new HashSet>(); - foreach (var person in allHumans) - { - if (TryComp(person, out var mind) && mind.OwnedEntity is { } ent && HasComp(ent)) - allHeads.Add(person); - } - - if (allHeads.Count == 0) - allHeads = allHumans; // fallback to non-head target - - _target.SetTarget(uid, _random.Pick(allHeads), target); - } - private float GetProgress(EntityUid target, bool requireDead) { // deleted or gibbed or something, counts as dead diff --git a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs new file mode 100644 index 0000000000000..2977e10569d31 --- /dev/null +++ b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs @@ -0,0 +1,212 @@ +using Content.Server.Objectives.Components; +using Content.Shared.Mind; +using Content.Shared.Objectives.Components; +using Content.Server.GameTicking.Rules; +using Content.Server.Revolutionary.Components; +using Robust.Shared.Random; +using System.Linq; + +namespace Content.Server.Objectives.Systems; + +/// +/// Handles assinging a target to an objective entity with using different components. +/// These can be combined with condition components for objective completions in order to create a variety of objectives. +/// +public sealed class PickObjectiveTargetSystem : EntitySystem +{ + [Dependency] private readonly TargetObjectiveSystem _target = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly TraitorRuleSystem _traitorRule = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSpecificPersonAssigned); + SubscribeLocalEvent(OnRandomPersonAssigned); + SubscribeLocalEvent(OnRandomHeadAssigned); + + SubscribeLocalEvent(OnRandomTraitorProgressAssigned); + SubscribeLocalEvent(OnRandomTraitorAliveAssigned); + } + + private void OnSpecificPersonAssigned(Entity ent, ref ObjectiveAssignedEvent args) + { + // invalid objective prototype + if (!TryComp(ent.Owner, out var target)) + { + args.Cancelled = true; + return; + } + + // target already assigned + if (target.Target != null) + return; + + if (args.Mind.OwnedEntity == null) + { + args.Cancelled = true; + return; + } + + var user = args.Mind.OwnedEntity.Value; + if (!TryComp(user, out var targetComp) || targetComp.Target == null) + { + args.Cancelled = true; + return; + } + + _target.SetTarget(ent.Owner, targetComp.Target.Value); + } + + private void OnRandomPersonAssigned(Entity ent, ref ObjectiveAssignedEvent args) + { + // invalid objective prototype + if (!TryComp(ent.Owner, out var target)) + { + args.Cancelled = true; + return; + } + + // target already assigned + if (target.Target != null) + return; + + var allHumans = _mind.GetAliveHumans(args.MindId); + + // Can't have multiple objectives to kill the same person + foreach (var objective in args.Mind.Objectives) + { + if (HasComp(objective) && TryComp(objective, out var kill)) + { + allHumans.RemoveWhere(x => x.Owner == kill.Target); + } + } + + // no other humans to kill + if (allHumans.Count == 0) + { + args.Cancelled = true; + return; + } + + _target.SetTarget(ent.Owner, _random.Pick(allHumans), target); + } + + private void OnRandomHeadAssigned(Entity ent, ref ObjectiveAssignedEvent args) + { + // invalid prototype + if (!TryComp(ent.Owner, out var target)) + { + args.Cancelled = true; + return; + } + + // target already assigned + if (target.Target != null) + return; + + // no other humans to kill + var allHumans = _mind.GetAliveHumans(args.MindId); + if (allHumans.Count == 0) + { + args.Cancelled = true; + return; + } + + var allHeads = new HashSet>(); + foreach (var person in allHumans) + { + if (TryComp(person, out var mind) && mind.OwnedEntity is { } owned && HasComp(owned)) + allHeads.Add(person); + } + + if (allHeads.Count == 0) + allHeads = allHumans; // fallback to non-head target + + _target.SetTarget(ent.Owner, _random.Pick(allHeads), target); + } + + private void OnRandomTraitorProgressAssigned(Entity ent, ref ObjectiveAssignedEvent args) + { + // invalid prototype + if (!TryComp(ent.Owner, out var target)) + { + args.Cancelled = true; + return; + } + + var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet(); + + // cant help anyone who is tasked with helping: + // 1. thats boring + // 2. no cyclic progress dependencies!!! + foreach (var traitor in traitors) + { + // TODO: replace this with TryComp(traitor) or something when objectives are moved out of mind + if (!TryComp(traitor.Id, out var mind)) + continue; + + foreach (var objective in mind.Objectives) + { + if (HasComp(objective)) + traitors.RemoveWhere(x => x.Mind == mind); + } + } + + // Can't have multiple objectives to help/save the same person + foreach (var objective in args.Mind.Objectives) + { + if (HasComp(objective) || HasComp(objective)) + { + if (TryComp(objective, out var help)) + { + traitors.RemoveWhere(x => x.Id == help.Target); + } + } + } + + // no more helpable traitors + if (traitors.Count == 0) + { + args.Cancelled = true; + return; + } + + _target.SetTarget(ent.Owner, _random.Pick(traitors).Id, target); + } + + private void OnRandomTraitorAliveAssigned(Entity ent, ref ObjectiveAssignedEvent args) + { + // invalid prototype + if (!TryComp(ent.Owner, out var target)) + { + args.Cancelled = true; + return; + } + + var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet(); + + // Can't have multiple objectives to help/save the same person + foreach (var objective in args.Mind.Objectives) + { + if (HasComp(objective) || HasComp(objective)) + { + if (TryComp(objective, out var help)) + { + traitors.RemoveWhere(x => x.Id == help.Target); + } + } + } + + // You are the first/only traitor. + if (traitors.Count == 0) + { + args.Cancelled = true; + return; + } + + _target.SetTarget(ent.Owner, _random.Pick(traitors).Id, target); + } +} From 96501f4966bac690e2b845afdbf53a11fe812111 Mon Sep 17 00:00:00 2001 From: Plykiya <58439124+Plykiya@users.noreply.github.com> Date: Thu, 13 Mar 2025 00:21:24 -0700 Subject: [PATCH 18/27] Adds popup when firing gun while gun has no ammo (#34816) * Adds popup when firing gun while gun has no ammo * simplify --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs | 5 +---- Resources/Locale/en-US/weapons/ranged/gun.ftl | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 231bac8302fe3..ac6f27f7e9a5f 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -350,10 +350,7 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) // If they're firing an existing clip then don't play anything. if (shots > 0) { - if (ev.Reason != null && Timing.IsFirstTimePredicted) - { - PopupSystem.PopupCursor(ev.Reason); - } + PopupSystem.PopupCursor(ev.Reason ?? Loc.GetString("gun-magazine-fired-empty")); // Don't spam safety sounds at gun fire rate, play it at a reduced rate. // May cause prediction issues? Needs more tweaking diff --git a/Resources/Locale/en-US/weapons/ranged/gun.ftl b/Resources/Locale/en-US/weapons/ranged/gun.ftl index 31ac7d5bf23b9..10bc9e6c78f02 100644 --- a/Resources/Locale/en-US/weapons/ranged/gun.ftl +++ b/Resources/Locale/en-US/weapons/ranged/gun.ftl @@ -7,6 +7,7 @@ gun-disabled = You can't use guns! gun-clumsy = The gun blows up in your face! gun-set-fire-mode = Set to {$mode} gun-magazine-whitelist-fail = That won't fit into the gun! +gun-magazine-fired-empty = No ammo left! # SelectiveFire gun-SemiAuto = semi-auto From 0b1e25b68ee5f288ef0996a14466bc1cf3b3c953 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Mar 2025 07:22:33 +0000 Subject: [PATCH 19/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b735c859f1b53..a2820ba3f9bc0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: stalengd - changes: - - message: Fixed playtime labels not being able to correctly display time greater - than 24 hours - type: Fix - id: 7557 - time: '2024-10-28T18:00:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32974 - author: august-sun changes: - message: Extended the minimum round time for meteor swarm events. @@ -3891,3 +3883,10 @@ id: 8056 time: '2025-03-13T00:30:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35785 +- author: Plykiya + changes: + - message: A message now pops up when attempting to fire a gun with no ammo. + type: Add + id: 8057 + time: '2025-03-13T07:21:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34816 From 90dc674c961bca978a1b92ca8bc3bc22c067dff0 Mon Sep 17 00:00:00 2001 From: Crude Oil <124208219+CroilBird@users.noreply.github.com> Date: Thu, 13 Mar 2025 13:49:24 +0100 Subject: [PATCH 20/27] Add the ability to pet the mail teleporter (#35819) good mailbox --- .../Locale/en-US/interaction/interaction-popup-component.ftl | 3 +++ .../Entities/Structures/Machines/mail_teleporter.yml | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index 7996db570be07..fa0a1fb655d5d 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -103,3 +103,6 @@ hugging-success-generic-target = { CAPITALIZE(THE($user)) } hugs you. petting-success-tesla = You pet {THE($target)}, violating the laws of nature and physics. petting-failure-tesla = You reach out towards {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BASIC($target, "zap", "zaps")} your hand away. + +petting-success-mail-teleporter = You pet {THE($target)} on {POSS-ADJ($target)} dutiful, cold exterior. +petting-failure-mail-teleporter = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} busy sorting mail! diff --git a/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml b/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml index 4356921ed6603..a03f166bbed59 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/mail_teleporter.yml @@ -39,6 +39,9 @@ - type: Machine board: MailTeleporterMachineCircuitboard - type: PowerSwitch + - type: InteractionPopup + interactSuccessString: petting-success-mail-teleporter + interactFailureString: petting-failure-mail-teleporter - type: DeliverySpawner table: !type:NestedSelector tableId: RandomDeliveryBasic From 66a02010f280749ff5bfc0036539064bd3e16e68 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Mar 2025 12:50:33 +0000 Subject: [PATCH 21/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a2820ba3f9bc0..fd34b1ac2cd0d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: august-sun - changes: - - message: Extended the minimum round time for meteor swarm events. - type: Tweak - id: 7558 - time: '2024-10-28T21:25:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/32876 - author: deltanedas changes: - message: Fixed lava planet expeditions not working. @@ -3890,3 +3883,10 @@ id: 8057 time: '2025-03-13T07:21:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34816 +- author: Crude Oil + changes: + - message: You can now pet the mail teleporter + type: Add + id: 8058 + time: '2025-03-13T12:49:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35819 From d4b7a6d5822c0f23dfc9cd5c9ec3b94f8035058f Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:12:27 +0100 Subject: [PATCH 22/27] Whitehole/Singularity grenade price adjustments + whitehole grenade fix (#35821) * prices + adjustments * teehee --- Resources/Prototypes/Catalog/uplink_catalog.yml | 10 +++++----- .../Entities/Objects/Weapons/Throwable/grenades.yml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 61f9a009ce858..d3338a2acdc4c 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -269,11 +269,11 @@ productEntity: SingularityGrenade discountCategory: usualDiscounts discountDownTo: - Telecrystal: 3 + Telecrystal: 1 cost: - Telecrystal: 6 + Telecrystal: 2 categories: - - UplinkExplosives + - UplinkDisruption - type: listing id: UplinkWhiteholeGrenade @@ -284,9 +284,9 @@ discountDownTo: Telecrystal: 1 cost: - Telecrystal: 3 + Telecrystal: 2 categories: - - UplinkExplosives + - UplinkDisruption - type: listing id: UplinkGrenadePenguin diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 041aa0edc2097..8be5b5f8aa061 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -201,7 +201,7 @@ sound: path: /Audio/Effects/Grenades/Supermatter/supermatter_loop.ogg - type: GravityWell - maxRange: 10 + maxRange: 7 baseRadialAcceleration: 5 baseTangentialAcceleration: .5 gravPulsePeriod: 0.03 @@ -248,10 +248,10 @@ sound: path: /Audio/Effects/Grenades/Supermatter/whitehole_loop.ogg - type: GravityWell - maxRange: 10 - baseRadialAcceleration: -180 - baseTangentialAcceleration: -5 - gravPulsePeriod: 0.01 + maxRange: 7 + baseRadialAcceleration: -10 + baseTangentialAcceleration: -1 + gravPulsePeriod: 0.03 - type: SingularityDistortion intensity: -200 falloffPower: 1.5 From 4a4d3d6a07dea78949383613e14e86158255d1ec Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Mar 2025 13:13:34 +0000 Subject: [PATCH 23/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fd34b1ac2cd0d..ebf43c5f3b7fd 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: deltanedas - changes: - - message: Fixed lava planet expeditions not working. - type: Fix - id: 7559 - time: '2024-10-29T05:00:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33042 - author: metalgearsloth changes: - message: Fix separated game screen bumping slightly. @@ -3890,3 +3883,16 @@ id: 8058 time: '2025-03-13T12:49:25.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35819 +- author: ScarKy0 + changes: + - message: Singularity and Whitehole grenades are now in the Disruption category + of uplinks. + type: Tweak + - message: Singularity and Whitehole grenades have had their prices reduced to 2TC + each. + type: Tweak + - message: Whitehole grenade no longer has extremely overtuned strength. + type: Fix + id: 8059 + time: '2025-03-13T13:12:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35821 From 1b2d3d6ab9104660d04023840bba3ee24b0a32cc Mon Sep 17 00:00:00 2001 From: Lusatia Date: Thu, 13 Mar 2025 07:00:23 -0700 Subject: [PATCH 24/27] Update Lobby Music Attribtions (#35817) Biggest change is updating the attributions and links for Sunbeamstress' to reflect the changes in their online profile as the previous link is now a dead link. Updated Comet Haley's link to go directly to Stellardrone's Bandcamp instead of diverting to Free Music Archive Fixed a double the in the comment for Space Asshole --- Resources/Audio/Lobby/attributions.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Audio/Lobby/attributions.yml b/Resources/Audio/Lobby/attributions.yml index 722f70731afb3..ab96eb41a1b2c 100644 --- a/Resources/Audio/Lobby/attributions.yml +++ b/Resources/Audio/Lobby/attributions.yml @@ -12,7 +12,7 @@ license: "Custom" copyright: "Space Asshole by Chris Remo is used with special permission from the author, under the condition that the project remains non-commercial and open source. The author also requested that a link to his bandcamp be included: https://chrisremo.bandcamp.com/" source: "https://idlethumbs.bandcamp.com/track/space-asshole" - # The source is a direct link the the track, but not the "main" bandcamp of the author. Hence the link is also included separately in the copyright. + # The source is a direct link to the track, but not the "main" bandcamp of the author. Hence the link is also included separately in the copyright. - files: ["the_wizard.ogg"] license: "Custom" @@ -49,7 +49,7 @@ - files: ["comet_haley.ogg"] license: "CC-BY-NC-SA-3.0" copyright: "Comet Haley by Stellardrone. Converted from MP3 to OGG." - source: "https://freemusicarchive.org/music/Stellardrone/Light_Years_1227/07_Comet_Halley" + source: "https://stellardrone.bandcamp.com/track/comet-halley" - files: ["mod.flip-flap.ogg"] license: "Custom" @@ -63,15 +63,15 @@ - files: ["pwmur.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "phoron will make us rich by Alexander Divine." - source: "https://soundcloud.com/alexanderdivine/phoron-will-make-us-rich" + copyright: "phoron will make us rich by Sunbeamstress/Lauren Loveless." + source: "https://soundcloud.com/sunbeamstress/phoron-will-make-us-rich" - files: ["lasers_rip_apart_the_bulkhead.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "lasers rip apart the bulkhead by Alexander Divine." - source: "https://soundcloud.com/alexanderdivine/lasers-rip-apart-the-bulkhead" + copyright: "lasers rip apart the bulkhead by Sunbeamstress/Lauren Loveless." + source: "https://soundcloud.com/sunbeamstress/lasers-rip-apart-the-bulkhead" - files: ["every_light_is_blinking_at_once.ogg"] license: "CC-BY-NC-SA-3.0" - copyright: "every light is blinking at once by Alexander Divine." - source: "https://soundcloud.com/alexanderdivine/every-light-is-blinking-at-once" + copyright: "every light is blinking at once by Sunbeamstress/Lauren Loveless." + source: "https://soundcloud.com/sunbeamstress/every-light-is-blinking-at-once" From bce9b4b05be3ef9e4044fd939fde50d4192b54df Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 13 Mar 2025 18:09:07 +0100 Subject: [PATCH 25/27] Paradox Clone (#35794) * polymorph fixes * paradox clone * forensics cleanup * bump doors * 4 * attribution * polymorphn't * clean up objectives * Update Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml * review * add virtual items to blacklist * allow them to roll sleeper agent --- .../Components/ParadoxCloneRuleComponent.cs | 23 ++++ .../Rules/ParadoxCloneRuleSystem.cs | 83 ++++++++++++++ .../Gibbing/Systems/GibOnRoundEndSystem.cs | 55 +++++++++ .../Roles/ParadoxCloneRoleComponent.cs | 9 ++ .../Components/GibOnRoundEndComponent.cs | 22 ++++ Resources/Audio/Misc/attributions.yml | 5 + .../Audio/Misc/paradox_clone_greeting.ogg | Bin 0 -> 183353 bytes .../ghost/roles/ghost-role-component.ftl | 3 + Resources/Locale/en-US/paradox-clone/role.ftl | 5 + .../Locale/en-US/prototypes/roles/antags.ftl | 3 + .../Catalog/Fills/Items/toolboxes.yml | 19 ++- .../Entities/Markers/Spawners/ghost_roles.yml | 20 ++++ .../Prototypes/Entities/Mobs/Player/clone.yml | 3 +- .../Entities/Mobs/Player/paradox_clone.yml | 37 ++++++ Resources/Prototypes/GameRules/events.yml | 33 ++++++ .../Prototypes/Objectives/paradoxClone.yml | 38 ++++++ .../Prototypes/Roles/Antags/paradoxClone.yml | 16 +++ .../Prototypes/Roles/MindRoles/mind_roles.yml | 11 ++ .../Guidebook/Antagonist/MinorAntagonists.xml | 8 ++ .../Markers/paradox_clone.rsi/meta.json | 14 --- .../Mobs/Aliens/paradox_clone.rsi/meta.json | 108 ++++++++++++++++++ .../Mobs/Aliens/paradox_clone.rsi/paradox.png | Bin 0 -> 47427 bytes .../Aliens}/paradox_clone.rsi/preview.png | Bin 23 files changed, 498 insertions(+), 17 deletions(-) create mode 100644 Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs create mode 100644 Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs create mode 100644 Content.Server/Gibbing/Systems/GibOnRoundEndSystem.cs create mode 100644 Content.Server/Roles/ParadoxCloneRoleComponent.cs create mode 100644 Content.Shared/Gibbing/Components/GibOnRoundEndComponent.cs create mode 100644 Resources/Audio/Misc/paradox_clone_greeting.ogg create mode 100644 Resources/Locale/en-US/paradox-clone/role.ftl create mode 100644 Resources/Prototypes/Entities/Mobs/Player/paradox_clone.yml create mode 100644 Resources/Prototypes/Objectives/paradoxClone.yml create mode 100644 Resources/Prototypes/Roles/Antags/paradoxClone.yml delete mode 100644 Resources/Textures/Markers/paradox_clone.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/paradox_clone.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Aliens/paradox_clone.rsi/paradox.png rename Resources/Textures/{Markers => Mobs/Aliens}/paradox_clone.rsi/preview.png (100%) diff --git a/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs new file mode 100644 index 0000000000000..a6ffb4e66993b --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/ParadoxCloneRuleComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Cloning; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules.Components; + +/// +/// Gamerule component for spawning a paradox clone antagonist. +/// +[RegisterComponent] +public sealed partial class ParadoxCloneRuleComponent : Component +{ + /// + /// Cloning settings to be used. + /// + [DataField] + public ProtoId Settings = "BaseClone"; + + /// + /// Visual effect spawned when gibbing at round end. + /// + [DataField] + public EntProtoId GibProto = "MobParadoxTimed"; +} diff --git a/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs b/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs new file mode 100644 index 0000000000000..80fad7d2ef379 --- /dev/null +++ b/Content.Server/GameTicking/Rules/ParadoxCloneRuleSystem.cs @@ -0,0 +1,83 @@ +using Content.Server.Antag; +using Content.Server.Cloning; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Objectives.Components; +using Content.Shared.GameTicking.Components; +using Content.Shared.Gibbing.Components; +using Content.Shared.Mind; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; + +namespace Content.Server.GameTicking.Rules; + +public sealed class ParadoxCloneRuleSystem : GameRuleSystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly CloningSystem _cloning = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAntagSelectEntity); + } + + protected override void Started(EntityUid uid, ParadoxCloneRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + + // check if we got enough potential cloning targets, otherwise cancel the gamerule so that the ghost role does not show up + var allHumans = _mind.GetAliveHumans(); + + if (allHumans.Count == 0) + { + Log.Info("Could not find any alive players to create a paradox clone from! Ending gamerule."); + ForceEndSelf(uid, gameRule); + } + } + + // we have to do the spawning here so we can transfer the mind to the correct entity and can assign the objectives correctly + private void OnAntagSelectEntity(Entity ent, ref AntagSelectEntityEvent args) + { + if (args.Session?.AttachedEntity is not { } spawner) + return; + + if (!_prototypeManager.TryIndex(ent.Comp.Settings, out var settings)) + { + Log.Error($"Used invalid cloning settings {ent.Comp.Settings} for ParadoxCloneRule"); + return; + } + + // get possible targets + var allHumans = _mind.GetAliveHumans(); + + // we already checked when starting the gamerule, but someone might have died since then. + if (allHumans.Count == 0) + { + Log.Warning("Could not find any alive players to create a paradox clone from!"); + return; + } + + // pick a random player + var playerToClone = _random.Pick(allHumans); + var bodyToClone = playerToClone.Comp.OwnedEntity; + + if (bodyToClone == null || !_cloning.TryCloning(bodyToClone.Value, _transform.GetMapCoordinates(spawner), settings, out var clone)) + { + Log.Error($"Unable to make a paradox clone of entity {ToPrettyString(bodyToClone)}"); + return; + } + + var targetComp = EnsureComp(clone.Value); + targetComp.Target = playerToClone.Owner; // set the kill target + + var gibComp = EnsureComp(clone.Value); + gibComp.SpawnProto = ent.Comp.GibProto; + gibComp.PreventGibbingObjectives = new() { "ParadoxCloneKillObjective" }; // don't gib them if they killed the original. + + args.Entity = clone; + } +} diff --git a/Content.Server/Gibbing/Systems/GibOnRoundEndSystem.cs b/Content.Server/Gibbing/Systems/GibOnRoundEndSystem.cs new file mode 100644 index 0000000000000..d23832984f806 --- /dev/null +++ b/Content.Server/Gibbing/Systems/GibOnRoundEndSystem.cs @@ -0,0 +1,55 @@ +using Content.Shared.GameTicking; +using Content.Shared.Gibbing.Components; +using Content.Shared.Mind; +using Content.Shared.Objectives.Systems; +using Content.Server.Body.Systems; + +namespace Content.Server.Gibbing.Systems; +public sealed class GibOnRoundEndSystem : EntitySystem +{ + [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedObjectivesSystem _objectives = default!; + + public override void Initialize() + { + base.Initialize(); + + // this is raised after RoundEndTextAppendEvent, so they can successfully greentext before we gib them + SubscribeLocalEvent(OnRoundEnd); + } + + private void OnRoundEnd(RoundEndMessageEvent args) + { + var gibQuery = EntityQueryEnumerator(); + + // gib everyone with the component + while (gibQuery.MoveNext(out var uid, out var gibComp)) + { + var gib = false; + // if they fulfill all objectives given in the component they are not gibbed + if (_mind.TryGetMind(uid, out var mindId, out var mindComp)) + { + foreach (var objectiveId in gibComp.PreventGibbingObjectives) + { + if (!_mind.TryFindObjective((mindId, mindComp), objectiveId, out var objective) + || !_objectives.IsCompleted(objective.Value, (mindId, mindComp))) + { + gib = true; + break; + } + } + } + else + gib = true; + + if (!gib) + continue; + + if (gibComp.SpawnProto != null) + SpawnAtPosition(gibComp.SpawnProto, Transform(uid).Coordinates); + + _body.GibBody(uid, splatModifier: 5f); + } + } +} diff --git a/Content.Server/Roles/ParadoxCloneRoleComponent.cs b/Content.Server/Roles/ParadoxCloneRoleComponent.cs new file mode 100644 index 0000000000000..d55cd34da4e35 --- /dev/null +++ b/Content.Server/Roles/ParadoxCloneRoleComponent.cs @@ -0,0 +1,9 @@ +using Content.Shared.Roles; + +namespace Content.Server.Roles; + +/// +/// Added to mind role entities to tag that they are a paradox clone. +/// +[RegisterComponent] +public sealed partial class ParadoxCloneRoleComponent : BaseMindRoleComponent; diff --git a/Content.Shared/Gibbing/Components/GibOnRoundEndComponent.cs b/Content.Shared/Gibbing/Components/GibOnRoundEndComponent.cs new file mode 100644 index 0000000000000..5ce8edbd25dc6 --- /dev/null +++ b/Content.Shared/Gibbing/Components/GibOnRoundEndComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Gibbing.Components; + +/// +/// Gibs an entity on round end. +/// +[RegisterComponent] +public sealed partial class GibOnRoundEndComponent : Component +{ + /// + /// If the entity has all these objectives fulfilled they won't be gibbed. + /// + [DataField] + public HashSet PreventGibbingObjectives = new(); + + /// + /// Entity to spawn when gibbed. Can be used for effects. + /// + [DataField] + public EntProtoId? SpawnProto; +} diff --git a/Resources/Audio/Misc/attributions.yml b/Resources/Audio/Misc/attributions.yml index a7349a445be63..67daaff404203 100644 --- a/Resources/Audio/Misc/attributions.yml +++ b/Resources/Audio/Misc/attributions.yml @@ -8,6 +8,11 @@ copyright: "Created by Chillyconmor" source: "https://github.com/space-wizards/space-station-14/blob/master/Resources/Audio/Misc/ninja_greeting.ogg" +- files: ["nparadox_clone_greeting.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Created by ps3moira" + source: "https://github.com/space-wizards/space-station-14/blob/master/Resources/Audio/Misc/ninja_greeting.ogg" + - files: ["thief_greeting.ogg"] license: "CC-BY-NC-4.0" copyright: "Taken from SergeQuadrado via freesound.org, edit and mono by TheShuEd" diff --git a/Resources/Audio/Misc/paradox_clone_greeting.ogg b/Resources/Audio/Misc/paradox_clone_greeting.ogg new file mode 100644 index 0000000000000000000000000000000000000000..deffca12e6d09951bea329a3b0fae6d8d673b6e1 GIT binary patch literal 183353 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

i6IC*vO9k! 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

-XzsTNme@^@D?wahtWej#b~G{g2C$!#J5#+7MWV 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 E0BT=TYybcN literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index b2f0932787676..3e89f912a9971 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -211,6 +211,9 @@ ghost-role-information-BreadDog-description = You are the chef's favorite child. ghost-role-information-space-ninja-name = Space Ninja ghost-role-information-space-ninja-description = Use stealth and deception to sabotage the station. +ghost-role-information-paradox-clone-name = Paradox Clone +ghost-role-information-paradox-clone-description = A freak space-time anomaly has teleported you into another reality! Now you have to find your counterpart and kill and replace them. + ghost-role-information-syndicate-reinforcement-name = Syndicate Agent ghost-role-information-syndicate-reinforcement-description = Someone needs reinforcements. You, the first person the syndicate could find, will help them. ghost-role-information-syndicate-reinforcement-rules = You are a [color=red][bold]Team Antagonist[/bold][/color] with the agent who summoned you. diff --git a/Resources/Locale/en-US/paradox-clone/role.ftl b/Resources/Locale/en-US/paradox-clone/role.ftl new file mode 100644 index 0000000000000..0a73ab4c3bacb --- /dev/null +++ b/Resources/Locale/en-US/paradox-clone/role.ftl @@ -0,0 +1,5 @@ +paradox-clone-round-end-agent-name = paradox clone + +objective-issuer-paradox = [color=lightblue]Paradox[/color] + +paradox-clone-role-greeting = A freak space-time anomaly has teleported you into another reality! Now you have to find your counterpart and kill and replace them. Only one of you two can survive. diff --git a/Resources/Locale/en-US/prototypes/roles/antags.ftl b/Resources/Locale/en-US/prototypes/roles/antags.ftl index ba43d4ff85bc5..ada25a4a0ac57 100644 --- a/Resources/Locale/en-US/prototypes/roles/antags.ftl +++ b/Resources/Locale/en-US/prototypes/roles/antags.ftl @@ -31,6 +31,9 @@ roles-antag-subverted-silicon-objective = Follow your new laws and do bad unto t roles-antag-space-ninja-name = Space Ninja roles-antag-space-ninja-objective = Use your stealth to sabotage the station, nom on electrical wires. +roles-antag-paradox-clone-name = Paradox Clone +roles-antag-paradox-clone-objective = A freak space-time anomaly has teleported you into another reality! Now you have to find your counterpart and kill and replace them. + roles-antag-thief-name = Thief roles-antag-thief-objective = Add some NT property to your personal collection without using violence. diff --git a/Resources/Prototypes/Catalog/Fills/Items/toolboxes.yml b/Resources/Prototypes/Catalog/Fills/Items/toolboxes.yml index ac9ab4deaa615..a4813fe41a4a8 100644 --- a/Resources/Prototypes/Catalog/Fills/Items/toolboxes.yml +++ b/Resources/Prototypes/Catalog/Fills/Items/toolboxes.yml @@ -22,7 +22,7 @@ prob: 0.15 - id: HarmonicaInstrument prob: 0.15 - + - type: entity id: ToolboxElectricalFilled name: electrical toolbox @@ -82,7 +82,7 @@ - id: MysteryFigureBox prob: 0.5 - id: BookRandom - amount: 2 + amount: 2 - id: CrayonMime - id: CrayonRainbow @@ -105,6 +105,21 @@ - id: ClothingHeadHatHardhatBlue prob: 0.5 +- type: entity + id: ToolboxMechanicalFilledAllTools + name: mechanical toolbox + suffix: Filled, all tools + parent: ToolboxMechanical + components: + - type: StorageFill + contents: + - id: Crowbar + - id: Wrench + - id: Screwdriver + - id: Wirecutter + - id: Welder + - id: Multitool + - type: entity parent: ToolboxSyndicate id: ToolboxSyndicateFilled diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index bd3c76cd84c5e..c78686f5efe11 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -191,6 +191,26 @@ - sprite: Objects/Weapons/Melee/energykatana.rsi state: icon +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostParadoxClone + components: + - type: GhostRole + name: ghost-role-information-paradox-clone-name + description: ghost-role-information-paradox-clone-description + rules: ghost-role-information-antagonist-rules + mindRoles: + - MindRoleGhostRoleSoloAntagonist + raffle: + settings: default + - type: Sprite + layers: + - sprite: Markers/jobs.rsi + state: green + - sprite: Mobs/Aliens/paradox_clone.rsi + state: preview + - type: entity categories: [ HideSpawnMenu, Spawner ] parent: BaseAntagSpawner diff --git a/Resources/Prototypes/Entities/Mobs/Player/clone.yml b/Resources/Prototypes/Entities/Mobs/Player/clone.yml index 64ae4f9ad8109..b7bd8a0d549ac 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/clone.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/clone.yml @@ -56,6 +56,7 @@ blacklist: components: - AttachedClothing # helmets, which are part of the suit + - VirtualItem - type: cloningSettings id: Antag @@ -78,7 +79,7 @@ suffix: Non-Antag components: - type: Sprite - sprite: Markers/paradox_clone.rsi + sprite: Mobs/Aliens/paradox_clone.rsi state: preview - type: RandomCloneSpawner settings: BaseClone diff --git a/Resources/Prototypes/Entities/Mobs/Player/paradox_clone.yml b/Resources/Prototypes/Entities/Mobs/Player/paradox_clone.yml new file mode 100644 index 0000000000000..1516843379050 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/paradox_clone.yml @@ -0,0 +1,37 @@ +# Mob +- type: entity + parent: BaseMob + id: MobParadox + name: space-time paradox + description: A big ball of wibbly wobbly, timey wimey stuff. + components: + - type: Sprite + drawdepth: Mobs + layers: + - sprite: Mobs/Aliens/paradox_clone.rsi + state: paradox + shader: unshaded + - type: RotationVisuals + horizontalRotation: 90 + - type: Pullable + - type: Tag + tags: + - DoorBumpOpener + +- type: entity + parent: MobParadox + id: MobParadoxTimed # visual effect when gibbing on round end + components: + - type: TimedDespawn + lifetime: 10 + +# guidebook dummy + +- type: entity + id: ParadoxCloneDummy + categories: [ HideSpawnMenu ] + name: Paradox Clone + components: + - type: Sprite + sprite: Mobs/Aliens/paradox_clone.rsi + state: preview diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index cda13e45268eb..953a7ad1beca8 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -232,6 +232,39 @@ mindRoles: - MindRoleNinja +- type: entity + parent: BaseGameRule + id: ParadoxCloneSpawn + components: + - type: StationEvent + weight: 4 # should not happen every round + duration: null + earliestStart: 30 + reoccurrenceDelay: 20 + minimumPlayers: 15 + - type: ParadoxCloneRule + - type: AntagObjectives + objectives: + - ParadoxCloneKillObjective + - ParadoxCloneLivingObjective + - type: AntagRandomSpawn # TODO: improve spawning so they only start in maints + - type: AntagSelection + agentName: paradox-clone-round-end-agent-name + definitions: + - spawnerPrototype: SpawnPointGhostParadoxClone + min: 1 + max: 1 + pickPlayer: false + startingGear: ParadoxCloneGear + roleLoadout: + - RoleSurvivalStandard # give vox something to breath in case they don't get a copy + briefing: + text: paradox-clone-role-greeting + color: lightblue + sound: /Audio/Misc/paradox_clone_greeting.ogg + mindRoles: + - MindRoleParadoxClone + - type: entity parent: BaseGameRule id: RevenantSpawn diff --git a/Resources/Prototypes/Objectives/paradoxClone.yml b/Resources/Prototypes/Objectives/paradoxClone.yml new file mode 100644 index 0000000000000..80aa4f15df370 --- /dev/null +++ b/Resources/Prototypes/Objectives/paradoxClone.yml @@ -0,0 +1,38 @@ +- type: entity + abstract: true + parent: BaseObjective + id: BaseParadoxCloneObjective + components: + - type: Objective + # required but not used + difficulty: 1 + issuer: objective-issuer-paradox + - type: RoleRequirement + roles: + mindRoles: + - ParadoxCloneRole + +- type: entity + parent: [BaseParadoxCloneObjective, BaseLivingObjective] + id: ParadoxCloneLivingObjective + name: Escape to centcomm alive and unrestrained. + description: Return to your old life. + components: + - type: Objective + icon: + sprite: Structures/Furniture/chairs.rsi + state: shuttle + - type: EscapeShuttleCondition + +- type: entity + parent: [BaseParadoxCloneObjective, BaseKillObjective] + id: ParadoxCloneKillObjective + name: Fix the space-time paradox. + description: Replace your original to fix the paradox. Remember, your mission is to blend in, do not kill anyone else unless you have to! + components: + - type: PickSpecificPerson + - type: KillPersonCondition + requireDead: true # don't count missing evac as killing + - type: TargetObjective + title: objective-condition-kill-head-title # kill , + diff --git a/Resources/Prototypes/Roles/Antags/paradoxClone.yml b/Resources/Prototypes/Roles/Antags/paradoxClone.yml new file mode 100644 index 0000000000000..6e8daf16b4467 --- /dev/null +++ b/Resources/Prototypes/Roles/Antags/paradoxClone.yml @@ -0,0 +1,16 @@ +- type: antag + id: ParadoxClone + name: roles-antag-paradox-clone-name + antagonist: true + objective: roles-antag-paradox-clone-objective + setPreference: false + +# they need to be able to espace when spawning inside a locked room +# TODO: remove this once we got a better spawning loacation selection +- type: startingGear + id: ParadoxCloneGear + inhand: + - ToolboxMechanicalFilledAllTools + storage: + back: + - ClothingHandsGlovesColorYellow diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml index ea6780eb50742..a690ab0c0db3e 100644 --- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml @@ -143,6 +143,17 @@ exclusiveAntag: true - type: NinjaRole +# Paradox Clone +- type: entity + parent: BaseMindRoleAntag + id: MindRoleParadoxClone + name: Paradox Clone Role + components: + - type: MindRole + antagPrototype: ParadoxClone + roleType: SoloAntagonist + - type: ParadoxCloneRole + # Nukies - type: entity parent: BaseMindRoleAntag diff --git a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml index 97574c4021538..a938cc4040c36 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml @@ -3,6 +3,14 @@ Most if not all Minor Antagonists are ghost-controlled roles that gives dead people new ways to cause chaos around the station. They are spawned by random events. + # Paradox Clone + + + + + + A perfect copy of a random crewmember that was thrown into our universe by a space-time anomaly. To fix the paradox and survive they have to find and kill their original counterpart. They have no special abilities, but are have identical appearance, DNA, fingerprints, clothing, equipment and IDs, making it hard to figure out who is the orginal and who is the clone, unless you know your fellow crewmembers well. + # Revenant diff --git a/Resources/Textures/Markers/paradox_clone.rsi/meta.json b/Resources/Textures/Markers/paradox_clone.rsi/meta.json deleted file mode 100644 index e58634703115c..0000000000000 --- a/Resources/Textures/Markers/paradox_clone.rsi/meta.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "preview combined from Mobs/Species/Human/parts.rsi, Clothing/Uniforms/Jumpsuit/janitor.rsi, Clothing/Shoes/Specific/galoshes.rsi, Clothing/Belt/janitor.rsi, Clothing/Hands/Gloves/janitor.rsi and Clothing/Head/Soft/purplesoft.rsi by slarticodefast", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "preview" - } - ] -} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Aliens/paradox_clone.rsi/meta.json b/Resources/Textures/Mobs/Aliens/paradox_clone.rsi/meta.json new file mode 100644 index 0000000000000..942900ec3ea07 --- /dev/null +++ b/Resources/Textures/Mobs/Aliens/paradox_clone.rsi/meta.json @@ -0,0 +1,108 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "preview combined from Mobs/Species/Human/parts.rsi, Clothing/Uniforms/Jumpsuit/janitor.rsi, Clothing/Shoes/Specific/galoshes.rsi, Clothing/Belt/janitor.rsi, Clothing/Hands/Gloves/janitor.rsi and Clothing/Head/Soft/purplesoft.rsi by slarticodefast, paradox made by ps3moira (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "preview" + }, + { + "name": "paradox", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Mobs/Aliens/paradox_clone.rsi/paradox.png b/Resources/Textures/Mobs/Aliens/paradox_clone.rsi/paradox.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cb35df5988b01949cac2994e42653a7f30cd08 GIT binary patch literal 47427 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 SZTRuu9}QIS*q*A!O( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Markers/paradox_clone.rsi/preview.png b/Resources/Textures/Mobs/Aliens/paradox_clone.rsi/preview.png similarity index 100% rename from Resources/Textures/Markers/paradox_clone.rsi/preview.png rename to Resources/Textures/Mobs/Aliens/paradox_clone.rsi/preview.png From 33edf9692b8a166057b036af569040a20d89da6b Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Mar 2025 17:10:14 +0000 Subject: [PATCH 26/27] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ebf43c5f3b7fd..8e88fefc1209b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix separated game screen bumping slightly. - type: Fix - id: 7560 - time: '2024-10-29T05:07:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/33046 - author: Blackern5000 changes: - message: Proto-kitentic crushers, glaives, and daggers now have more accurate @@ -3896,3 +3889,10 @@ id: 8059 time: '2025-03-13T13:12:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/35821 +- author: slarticodefast, ps3moira + changes: + - message: Added the paradox clone as a ghostrole antagonist. + type: Add + id: 8060 + time: '2025-03-13T17:09:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/35794 From 1945c7d7c6ddb1eaa7bbcf81ecb716834910df01 Mon Sep 17 00:00:00 2001 From: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Date: Thu, 13 Mar 2025 19:07:52 +0100 Subject: [PATCH 27/27] Improvements to antag-before-job selection system (#35822) * Fix the latejoin-antag-deficit bug, add datafield, add logging * Fix multiple roles being made for single-role defs, --- .../Antag/AntagSelectionSystem.API.cs | 36 +++++------ Content.Server/Antag/AntagSelectionSystem.cs | 59 ++++++++++++++----- .../Components/AntagSelectionComponent.cs | 5 +- Content.Shared.Database/LogType.cs | 7 ++- 4 files changed, 71 insertions(+), 36 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.API.cs b/Content.Server/Antag/AntagSelectionSystem.API.cs index c89e4df312ac5..93b5fa6136516 100644 --- a/Content.Server/Antag/AntagSelectionSystem.API.cs +++ b/Content.Server/Antag/AntagSelectionSystem.API.cs @@ -97,7 +97,7 @@ public int GetTargetAntagCount(Entity ent, int? playerC var countOffset = 0; foreach (var otherDef in ent.Comp.Definitions) { - countOffset += Math.Clamp((poolSize - countOffset) / otherDef.PlayerRatio, otherDef.Min, otherDef.Max) * otherDef.PlayerRatio; + countOffset += Math.Clamp((poolSize - countOffset) / otherDef.PlayerRatio, otherDef.Min, otherDef.Max) * otherDef.PlayerRatio; // Note: Is the PlayerRatio necessary here? Seems like it can cause issues for defs with varied PlayerRatio. } // make sure we don't double-count the current selection countOffset -= Math.Clamp(poolSize / def.PlayerRatio, def.Min, def.Max) * def.PlayerRatio; @@ -362,7 +362,8 @@ public Entity ForceGetGameRuleEnt(string id) where T ///

/// Get all sessions that have been preselected for antag. /// - public HashSet GetPreSelectedAntagSessions(AntagSelectionComponent? except = null) + /// A specific definition to be excluded from the check. + public HashSet GetPreSelectedAntagSessions(AntagSelectionDefinition? except = null) { var result = new HashSet(); var query = QueryAllRules(); @@ -371,15 +372,13 @@ public HashSet GetPreSelectedAntagSessions(AntagSelectionCompone if (HasComp(uid)) continue; - if (comp == except) - continue; - - if (!comp.PreSelectionsComplete) - continue; - foreach (var def in comp.Definitions) { - result.UnionWith(comp.PreSelectedSessions); + if (def.Equals(except)) + continue; + + if (comp.PreSelectedSessions.TryGetValue(def, out var set)) + result.UnionWith(set); } } @@ -389,7 +388,11 @@ public HashSet GetPreSelectedAntagSessions(AntagSelectionCompone /// /// Get all sessions that have been preselected for antag and are exclusive, i.e. should not be paired with other antags. /// - public HashSet GetPreSelectedExclusiveAntagSessions(AntagSelectionComponent? except = null) + /// A specific definition to be excluded from the check. + // Note: This is a bit iffy since technically this exclusive definition is defined via the MultiAntagSetting, while there's a separately tracked antagExclusive variable in the mindrole. + // We can't query that however since there's no guarantee the mindrole has been given out yet when checking pre-selected antags. + // I don't think there's any instance where they differ, but it's something to be aware of for a potential future refactor. + public HashSet GetPreSelectedExclusiveAntagSessions(AntagSelectionDefinition? except = null) { var result = new HashSet(); var query = QueryAllRules(); @@ -398,17 +401,14 @@ public HashSet GetPreSelectedExclusiveAntagSessions(AntagSelecti if (HasComp(uid)) continue; - if (comp == except) - continue; - - if (!comp.PreSelectionsComplete) - continue; - foreach (var def in comp.Definitions) { - if (def.MultiAntagSetting == AntagAcceptability.None) + if (def.Equals(except)) + continue; + + if (def.MultiAntagSetting == AntagAcceptability.None && comp.PreSelectedSessions.TryGetValue(def, out var set)) { - result.UnionWith(comp.PreSelectedSessions); + result.UnionWith(set); break; } } diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 298fa61a67215..c8b2a7d4bb6c8 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -12,8 +12,10 @@ using Content.Server.Roles.Jobs; using Content.Server.Shuttles.Components; using Content.Server.Station.Events; +using Content.Shared.Administration.Logs; using Content.Shared.Antag; using Content.Shared.Clothing; +using Content.Shared.Database; using Content.Shared.GameTicking; using Content.Shared.GameTicking.Components; using Content.Shared.Ghost; @@ -47,6 +49,7 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem(); - while (query.MoveNext(out var uid, out _, out var antag, out _)) + while (query.MoveNext(out var uid, out var antag, out _)) { - rules.Add((uid, antag)); + if (HasComp(uid) || + (HasComp(uid) && antag.SelectionTime == AntagSelectionTime.IntraPlayerSpawn)) //IntraPlayerSpawn selects antags before spawning, but doesn't activate until after. + rules.Add((uid, antag)); } RobustRandom.Shuffle(rules); @@ -158,7 +163,7 @@ private void OnSpawnComplete(PlayerSpawnCompleteEvent args) if (!antag.Definitions.Any(p => p.LateJoinAdditional)) continue; - DebugTools.AssertEqual(antag.SelectionTime, AntagSelectionTime.PostPlayerSpawn); + DebugTools.AssertNotEqual(antag.SelectionTime, AntagSelectionTime.PrePlayerSpawn); // do not count players in the lobby for the antag ratio var players = _playerManager.NetworkedSessions.Count(x => x.AttachedEntity != null); @@ -166,7 +171,9 @@ private void OnSpawnComplete(PlayerSpawnCompleteEvent args) if (!TryGetNextAvailableDefinition((uid, antag), out var def, players)) continue; - if (TryMakeAntag((uid, antag), args.Player, def.Value)) + var onlyPreSelect = (antag.SelectionTime == AntagSelectionTime.IntraPlayerSpawn && !antag.AssignmentComplete); // Don't wanna give them antag status if the rule hasn't assigned its existing ones yet + + if (TryMakeAntag((uid, antag), args.Player, def.Value, onlyPreSelect: onlyPreSelect)) break; } } @@ -272,7 +279,7 @@ public void ChooseAntags(Entity ent, break; } - if (session != null && ent.Comp.PreSelectedSessions.Contains(session)) + if (session != null && ent.Comp.PreSelectedSessions.Values.Any(x => x.Contains(session))) { Log.Warning($"Somehow picked {session} for an antag when this rule already selected them previously"); continue; @@ -283,8 +290,11 @@ public void ChooseAntags(Entity ent, MakeAntag(ent, null, def); // This is for spawner antags else { - ent.Comp.PreSelectedSessions.Add(session); // Selection done! - Log.Debug($"Selected {session.Name} as antagonist: {ToPrettyString(ent)}"); + if (!ent.Comp.PreSelectedSessions.TryGetValue(def, out var set)) + ent.Comp.PreSelectedSessions.Add(def, set = new HashSet()); + set.Add(session); // Selection done! + Log.Debug($"Pre-selected {session.Name} as antagonist: {ToPrettyString(ent)}"); + _adminLogger.Add(LogType.AntagSelection, $"Pre-selected {session.Name} as antagonist: {ToPrettyString(ent)}"); } } } @@ -300,7 +310,10 @@ public void AssignPreSelectedSessions(Entity ent) foreach (var def in ent.Comp.Definitions) { - foreach (var session in ent.Comp.PreSelectedSessions) + if (!ent.Comp.PreSelectedSessions.TryGetValue(def, out var set)) + continue; + + foreach (var session in set) { TryMakeAntag(ent, session, def); } @@ -312,7 +325,7 @@ public void AssignPreSelectedSessions(Entity ent) /// /// Tries to makes a given player into the specified antagonist. /// - public bool TryMakeAntag(Entity ent, ICommonSession? session, AntagSelectionDefinition def, bool ignoreSpawner = false, bool checkPref = true) + public bool TryMakeAntag(Entity ent, ICommonSession? session, AntagSelectionDefinition def, bool ignoreSpawner = false, bool checkPref = true, bool onlyPreSelect = false) { if (checkPref && !HasPrimaryAntagPreference(session, def)) return false; @@ -320,7 +333,19 @@ public bool TryMakeAntag(Entity ent, ICommonSession? se if (!IsSessionValid(ent, session, def) || !IsEntityValid(session?.AttachedEntity, def)) return false; - MakeAntag(ent, session, def, ignoreSpawner); + if (onlyPreSelect && session != null) + { + if (!ent.Comp.PreSelectedSessions.TryGetValue(def, out var set)) + ent.Comp.PreSelectedSessions.Add(def, set = new HashSet()); + set.Add(session); + Log.Debug($"Pre-selected {session!.Name} as antagonist: {ToPrettyString(ent)}"); + _adminLogger.Add(LogType.AntagSelection, $"Pre-selected {session.Name} as antagonist: {ToPrettyString(ent)}"); + } + else + { + MakeAntag(ent, session, def, ignoreSpawner); + } + return true; } @@ -334,6 +359,9 @@ public void MakeAntag(Entity ent, ICommonSession? sessi if (session != null) { + if (!ent.Comp.PreSelectedSessions.TryGetValue(def, out var set)) + ent.Comp.PreSelectedSessions.Add(def, set = new HashSet()); + set.Add(session); ent.Comp.AssignedSessions.Add(session); // we shouldn't be blocking the entity if they're just a ghost or smth. @@ -359,7 +387,7 @@ public void MakeAntag(Entity ent, ICommonSession? sessi if (session != null) { ent.Comp.AssignedSessions.Remove(session); - ent.Comp.PreSelectedSessions.Remove(session); + ent.Comp.PreSelectedSessions[def].Remove(session); } return; @@ -384,7 +412,7 @@ public void MakeAntag(Entity ent, ICommonSession? sessi if (session != null) { ent.Comp.AssignedSessions.Remove(session); - ent.Comp.PreSelectedSessions.Remove(session); + ent.Comp.PreSelectedSessions[def].Remove(session); } return; @@ -423,6 +451,7 @@ public void MakeAntag(Entity ent, ICommonSession? sessi SendBriefing(session, def.Briefing); Log.Debug($"Assigned {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); + _adminLogger.Add(LogType.AntagSelection, $"Assigned {ToPrettyString(curMind)} as antagonist: {ToPrettyString(ent)}"); } var afterEv = new AfterAntagEntitySelectedEvent(session, player, ent, def); @@ -481,7 +510,7 @@ public bool IsSessionValid(Entity ent, ICommonSession? { if (_role.MindIsAntagonist(mind)) return false; - if (GetPreSelectedAntagSessions(ent.Comp).Contains(session)) // Used for rules where the antag has been selected, but not started yet + if (GetPreSelectedAntagSessions(def).Contains(session)) // Used for rules where the antag has been selected, but not started yet return false; break; } @@ -489,7 +518,7 @@ public bool IsSessionValid(Entity ent, ICommonSession? { if (_role.MindIsExclusiveAntagonist(mind)) return false; - if (GetPreSelectedExclusiveAntagSessions(ent.Comp).Contains(session)) + if (GetPreSelectedExclusiveAntagSessions(def).Contains(session)) return false; break; } diff --git a/Content.Server/Antag/Components/AntagSelectionComponent.cs b/Content.Server/Antag/Components/AntagSelectionComponent.cs index c1e60e8068ede..5c752ddff79fd 100644 --- a/Content.Server/Antag/Components/AntagSelectionComponent.cs +++ b/Content.Server/Antag/Components/AntagSelectionComponent.cs @@ -44,9 +44,10 @@ public sealed partial class AntagSelectionComponent : Component public AntagSelectionTime SelectionTime = AntagSelectionTime.PostPlayerSpawn; /// - /// Cached sessions of players who are chosen yet not given the role yet. + /// Cached sessions of antag definitions and selected players. Players in this dict are not guaranteed to have been assigned the role yet. /// - public HashSet PreSelectedSessions = new(); + [DataField] + public Dictionary>PreSelectedSessions = new(); /// /// Cached sessions of players who are chosen. Used so we don't have to rebuild the pool multiple times in a tick. diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index 5ebb100dafd24..a868d0e384269 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -449,9 +449,14 @@ public enum LogType /// An atmos networked device (such as a vent or pump) has had its settings changed, usually through an air alarm /// AtmosDeviceSetting = 97, - + /// /// Commands related to admemes. Stuff like config changes, etc. /// AdminCommands = 98, + + /// + /// A player was selected or assigned antag status + /// + AntagSelection = 99, }