B;Jb)HfmKdk00000NkvXXu0mjfR|3P^
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Tiles/tile.rsi/grassdark.png b/Resources/Textures/Objects/Tiles/tile.rsi/grassdark.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ffe2c575fb52c718ba9e10899f4eb3495c817e8
GIT binary patch
literal 405
zcmV;G0c!qPx$PDw;TR9Hvtma&S$Komt^$`vdu78?;P#9vsp%`fBUznQ0tj%)N8ooi{10=TY>mZ`nX5kO?#r7|e!$UAOA>P&GdP=?xH{epNP~
znC(wym)+RD%X2-)z;%qx`hJ~r8vgycT9b*F3{Xr>;2Mp<*yrM08&Wgt)$n}-<+7@U
zxLTTkAO^)bS3<{apaJ6N%JCh;8_{xwlmG;P6+*gN3K2U?pk)a$@G%-Z1dk+WO6$&2
z@wbo?z<^>#jaA%>Y9K>H=mV!ENNrKvA4Wivt-XNwAx1Ks<1>VSX26Hgm%>vDBft!#
zuxt7~oiG9_qWe6x^)#^mvJKhi{kf3ph#>^D5wXS$nl>E
z0j#vw_kpf2B5nTH_{P%aVO{Rc1~P%(3ETkOa!@b?-vV*~0000`WozLkLcGd|qSSl1VNj09~U7)%`@B&AQpM&y*os3_!7eF}$
zn#?@$ZeKOazs9jO`~9tpjy>4A)$`3!{^R`Le#P8Kv)&ZJu+s9@m0Ok!;`^hfZM*HC
z^DW}Wb$1(v^PhiafBS2^@zn=$Rw2h791Y7|f5w++F`R$w|DIt-Y3!exEKlVNtS4q$
zEckiphU^8`d8?Tn^!IG9cy9gR9?POC76!qj{?m+aWZix}VQ}fN)nngKF7a|Qvw-5a
z9Wn>*B`)#jb7;BoxQL;;eWINuZp9VvWgmR!cwWEH%ziOj5MxDjv~1NxC&mXQUXQP<
zEELx?Vfdq<{A^MSlfx-pLDq(6i@0}sytHN5@-#4p0dALmHMPx$g-Jv~RCr$PnlX#QP!NPSO~B6L8VeDuw7&M>et?bs6o1xLXX6hLY^}8tjw{kw
zq!VnERRR+5nFkZd@Ww6}hI!x4Zi=^=CH~72Kfeip5|B6nwLszl&=6D$s09)ypcY6x
z0Qw531=IqG6Hp7h3PAqdzgGWUHYFXXrv6_Z%mwm~p3S}r`(5>o2||qbAb`cZwEe%?
z@o!+4)0qN-AKrbhw*woG3Onq=#R~$Me3thvU<2U3-7^G0Q=zVWOse?%;ip4;+rGgB
z)DOil2cCytlOaww-O))C05nlHJtcsxVraig0GcS9o)W-TF|=PL08NxlPYGbF7}~EA
zfF{bOrv$K74DDA5Koe!tQv%p3hW4ujpoy~SDFJL1L;F<%&_vnvlz^Cu`NiY&1!?^`
zMyo6DMkSzHKKNNa_6w5);L8Vo@9rBIEL$U?v_&Vt_lA7=fN5)_6#z}PFS^p_Pylr?
zhOH480EUXjdW@O@vEmHx3jjlv+VrRdv`Lpi`vwK3h(YmAbDRJG002ovPDHLkV1lU?
B!|nh8
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Tiles/tile.rsi/grasslight.png b/Resources/Textures/Objects/Tiles/tile.rsi/grasslight.png
new file mode 100644
index 0000000000000000000000000000000000000000..6dc00a21978f93072681afc8fabe7e952e5978a7
GIT binary patch
literal 408
zcmV;J0cZY+P)Px$P)S5VR9HvtmN9DrK@^0a&4HbTjfDuQk~(d`ACN|WsW$!qA+5Ek0+QmI6xRi8
zlsOp~A4^Wp7q;1LT+j1n_ItB$Z(y0nAhW&|1BE~#&`F@0k4}BJ>T%n2KL5`fApZQ?
z*vr&x|84elnArPU-Oe#^9b@xxxz0HaAAf$W%fw9vD5fTGjYeSXX;!y})XZuKbElofWgW{Ykq0e2Q0pjP%@g2h((Q<{900e*)Lb_TC5j#tuWeG7*jfYpkBMF+)
zy0cXLEu;i6pqNo(75AbV$j}h_z-b9mTNL+)5zu67FCc!1kqqbf3?ZNy@FDc2@RY&`
zFas&
Date: Mon, 15 Sep 2025 01:31:19 +0000
Subject: [PATCH 036/143] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 1475a2126b..7f7c1d6454 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,14 +1,4 @@
Entries:
-- author: PotentiallyTom
- changes:
- - message: Changed the gold requirement for the recipies of the Laser Cannon, X-Ray
- Cannon, and Advanced Laser Pistol.
- type: Tweak
- - message: The Advanced Laser Pistol now requires uranium to make.
- type: Tweak
- id: 8452
- time: '2025-05-10T09:58:03.0000000+00:00'
- url: https://github.com/space-wizards/space-station-14/pull/37308
- author: EmoGarbage404
changes:
- message: Omnizine no longer "wastes" healing when administered to patients without
@@ -3945,3 +3935,10 @@
id: 8963
time: '2025-09-14T19:26:42.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/40347
+- author: SharkSnake98
+ changes:
+ - message: Added 3 new Astrotiles for dark grass, light grass, and desert sand.
+ type: Add
+ id: 8964
+ time: '2025-09-15T01:30:12.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/37867
From ff94d3e7ad1ba0fcf105f9a040f154a583a7331f Mon Sep 17 00:00:00 2001
From: ToastEnjoyer
Date: Sun, 14 Sep 2025 20:42:46 -0500
Subject: [PATCH 037/143] Added spanky to mapping codeowners (#40362)
---
.github/CODEOWNERS | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index f099682b6a..14f591ec87 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -8,8 +8,8 @@
/Resources/ServerInfo/ @crazybrain23
/Resources/ServerInfo/Guidebook/ServerRules/ @crazybrain23
-/Resources/Prototypes/Maps/** @Emisse @ArtisticRoomba
-/Resources/Maps/** @Emisse @ArtisticRoomba
+/Resources/Prototypes/Maps/** @Emisse @ArtisticRoomba @spanky-spanky
+/Resources/Maps/** @Emisse @ArtisticRoomba @spanky-spanky
/Resources/Prototypes/Body/ @DrSmugleaf # suffering
/Resources/Prototypes/Entities/Mobs/Player/ @DrSmugleaf
From 02061592ddb4993812d0c53ead0ee540731026c5 Mon Sep 17 00:00:00 2001
From: chromiumboy <50505512+chromiumboy@users.noreply.github.com>
Date: Mon, 15 Sep 2025 02:19:25 -0500
Subject: [PATCH 038/143] Devices with access restrictions list those
restrictions in their examination description (#37712)
---
.../Tests/Access/AccessReaderTest.cs | 16 +-
.../Access/Systems/AccessOverriderSystem.cs | 2 +-
.../Systems/DoorElectronicsSystem.cs | 2 +-
.../Components/AccessReaderComponent.cs | 38 ++-
.../ShowAccessReaderSettingsComponent.cs | 16 ++
.../Access/Systems/AccessReaderSystem.cs | 262 +++++++++++++++++-
.../ContentLocalizationManager.cs | 2 +-
.../access/systems/access-reader-system.ftl | 5 +
Resources/Locale/en-US/generic.ftl | 3 +
.../Prototypes/Entities/Clothing/Eyes/hud.yml | 1 +
.../Structures/Doors/Firelocks/firelock.yml | 1 +
.../Entities/Structures/Machines/holopad.yml | 1 +
.../Storage/Closets/Lockers/lockers.yml | 1 +
.../Structures/cryogenic_sleep_unit.yml | 1 +
14 files changed, 324 insertions(+), 27 deletions(-)
create mode 100644 Content.Shared/Access/Components/ShowAccessReaderSettingsComponent.cs
diff --git a/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs b/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs
index b98f030b06..a0c8c775b1 100644
--- a/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs
+++ b/Content.IntegrationTests/Tests/Access/AccessReaderTest.cs
@@ -54,7 +54,7 @@ namespace Content.IntegrationTests.Tests.Access
system.ClearDenyTags(reader);
// test one list
- system.AddAccess(reader, "A");
+ system.TryAddAccess(reader, "A");
Assert.Multiple(() =>
{
Assert.That(system.AreAccessTagsAllowed(new List> { "A" }, reader), Is.True);
@@ -62,10 +62,10 @@ namespace Content.IntegrationTests.Tests.Access
Assert.That(system.AreAccessTagsAllowed(new List> { "A", "B" }, reader), Is.True);
Assert.That(system.AreAccessTagsAllowed(Array.Empty>(), reader), Is.False);
});
- system.ClearAccesses(reader);
+ system.TryClearAccesses(reader);
// test one list - two items
- system.AddAccess(reader, new HashSet> { "A", "B" });
+ system.TryAddAccess(reader, new HashSet> { "A", "B" });
Assert.Multiple(() =>
{
Assert.That(system.AreAccessTagsAllowed(new List> { "A" }, reader), Is.False);
@@ -73,14 +73,14 @@ namespace Content.IntegrationTests.Tests.Access
Assert.That(system.AreAccessTagsAllowed(new List> { "A", "B" }, reader), Is.True);
Assert.That(system.AreAccessTagsAllowed(Array.Empty>(), reader), Is.False);
});
- system.ClearAccesses(reader);
+ system.TryClearAccesses(reader);
// test two list
var accesses = new List>>() {
new HashSet> () { "A" },
new HashSet> () { "B", "C" }
};
- system.AddAccesses(reader, accesses);
+ system.TryAddAccesses(reader, accesses);
Assert.Multiple(() =>
{
Assert.That(system.AreAccessTagsAllowed(new List> { "A" }, reader), Is.True);
@@ -90,10 +90,10 @@ namespace Content.IntegrationTests.Tests.Access
Assert.That(system.AreAccessTagsAllowed(new List> { "C", "B", "A" }, reader), Is.True);
Assert.That(system.AreAccessTagsAllowed(Array.Empty>(), reader), Is.False);
});
- system.ClearAccesses(reader);
+ system.TryClearAccesses(reader);
// test deny list
- system.AddAccess(reader, new HashSet> { "A" });
+ system.TryAddAccess(reader, new HashSet> { "A" });
system.AddDenyTag(reader, "B");
Assert.Multiple(() =>
{
@@ -102,7 +102,7 @@ namespace Content.IntegrationTests.Tests.Access
Assert.That(system.AreAccessTagsAllowed(new List> { "A", "B" }, reader), Is.False);
Assert.That(system.AreAccessTagsAllowed(Array.Empty>(), reader), Is.False);
});
- system.ClearAccesses(reader);
+ system.TryClearAccesses(reader);
system.ClearDenyTags(reader);
});
await pair.CleanReturnAsync();
diff --git a/Content.Server/Access/Systems/AccessOverriderSystem.cs b/Content.Server/Access/Systems/AccessOverriderSystem.cs
index 68bdd6b9a9..4eaf3c0419 100644
--- a/Content.Server/Access/Systems/AccessOverriderSystem.cs
+++ b/Content.Server/Access/Systems/AccessOverriderSystem.cs
@@ -229,7 +229,7 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
_adminLogger.Add(LogType.Action, LogImpact.High,
$"{ToPrettyString(player):player} has modified {ToPrettyString(accessReaderEnt.Value):entity} with the following allowed access level holders: [{string.Join(", ", addedTags.Union(removedTags))}] [{string.Join(", ", newAccessList)}]");
- _accessReader.SetAccesses(accessReaderEnt.Value, newAccessList);
+ _accessReader.TrySetAccesses(accessReaderEnt.Value, newAccessList);
var ev = new OnAccessOverriderAccessUpdatedEvent(player);
RaiseLocalEvent(component.TargetAccessReaderId, ref ev);
diff --git a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs
index af2738d105..5579bc5988 100644
--- a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs
+++ b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs
@@ -48,7 +48,7 @@ public sealed class DoorElectronicsSystem : EntitySystem
DoorElectronicsUpdateConfigurationMessage args)
{
var accessReader = EnsureComp(uid);
- _accessReader.SetAccesses((uid, accessReader), args.AccessList);
+ _accessReader.TrySetAccesses((uid, accessReader), args.AccessList);
}
private void OnAccessReaderChanged(
diff --git a/Content.Shared/Access/Components/AccessReaderComponent.cs b/Content.Shared/Access/Components/AccessReaderComponent.cs
index 6c2416fdf4..c261c7deca 100644
--- a/Content.Shared/Access/Components/AccessReaderComponent.cs
+++ b/Content.Shared/Access/Components/AccessReaderComponent.cs
@@ -34,6 +34,15 @@ public sealed partial class AccessReaderComponent : Component
[DataField("access")]
public List>> AccessLists = new();
+ ///
+ /// An unmodified copy of the original list of the access groups that grant access to this reader.
+ ///
+ ///
+ /// If null, the access lists of this entity have not been modified yet.
+ ///
+ [DataField]
+ public List>>? AccessListsOriginal = null;
+
///
/// A list of s that grant access. Only a single matching key is required to gain access.
///
@@ -76,6 +85,16 @@ public sealed partial class AccessReaderComponent : Component
///
[DataField]
public bool BreakOnAccessBreaker = true;
+
+ ///
+ /// The examination text associated with this component.
+ ///
+ ///
+ /// The text can be supplied with the 'access' variable to populate it
+ /// with a comma separated list of the access levels contained in .
+ ///
+ [DataField]
+ public LocId ExaminationText = "access-reader-examination";
}
[DataDefinition, Serializable, NetSerializable]
@@ -96,19 +115,36 @@ public sealed class AccessReaderComponentState : ComponentState
public bool Enabled;
public HashSet> DenyTags;
public List>> AccessLists;
+ public List>>? AccessListsOriginal;
public List<(NetEntity, uint)> AccessKeys;
public Queue AccessLog;
public int AccessLogLimit;
- public AccessReaderComponentState(bool enabled, HashSet> denyTags, List>> accessLists, List<(NetEntity, uint)> accessKeys, Queue accessLog, int accessLogLimit)
+ public AccessReaderComponentState(
+ bool enabled,
+ HashSet> denyTags,
+ List