From 4adbb8d969dcbf6985d4a35eca57753e4e4b216b Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Mon, 16 Sep 2024 01:51:53 -0700 Subject: [PATCH 01/28] Fix examine flickering until you examine something around you (#32205) --- Content.Client/Examine/ExamineSystem.cs | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index a941f0acff97fd..1c1f1984de4e39 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -1,7 +1,12 @@ +using System.Linq; +using System.Numerics; +using System.Threading; using Content.Client.Verbs; using Content.Shared.Examine; using Content.Shared.IdentityManagement; using Content.Shared.Input; +using Content.Shared.Interaction.Events; +using Content.Shared.Item; using Content.Shared.Verbs; using JetBrains.Annotations; using Robust.Client.GameObjects; @@ -12,13 +17,8 @@ using Robust.Shared.Input.Binding; using Robust.Shared.Map; using Robust.Shared.Utility; -using System.Linq; -using System.Numerics; -using System.Threading; using static Content.Shared.Interaction.SharedInteractionSystem; using static Robust.Client.UserInterface.Controls.BoxContainer; -using Content.Shared.Interaction.Events; -using Content.Shared.Item; using Direction = Robust.Shared.Maths.Direction; namespace Content.Client.Examine @@ -35,7 +35,6 @@ public sealed class ExamineSystem : ExamineSystemShared private EntityUid _examinedEntity; private EntityUid _lastExaminedEntity; - private EntityUid _playerEntity; private Popup? _examineTooltipOpen; private ScreenCoordinates _popupPos; private CancellationTokenSource? _requestCancelTokenSource; @@ -74,9 +73,9 @@ private void OnExaminedItemDropped(EntityUid item, ItemComponent comp, DroppedEv public override void Update(float frameTime) { if (_examineTooltipOpen is not {Visible: true}) return; - if (!_examinedEntity.Valid || !_playerEntity.Valid) return; + if (!_examinedEntity.Valid || _playerManager.LocalEntity is not { } player) return; - if (!CanExamine(_playerEntity, _examinedEntity)) + if (!CanExamine(player, _examinedEntity)) CloseTooltip(); } @@ -114,9 +113,8 @@ private bool HandleExamine(in PointerInputCmdHandler.PointerInputCmdArgs args) return false; } - _playerEntity = _playerManager.LocalEntity ?? default; - - if (_playerEntity == default || !CanExamine(_playerEntity, entity)) + if (_playerManager.LocalEntity is not { } player || + !CanExamine(player, entity)) { return false; } From a5850236dd49728ce778ad5a0f51e88e7ea19107 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 16 Sep 2024 08:53:00 +0000 Subject: [PATCH 02/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index da0ac0a1c01bb1..b2be978db2eb5f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,16 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Changed AME power output. Lower injection amounts now produce more power - but further injections have diminishing returns. - type: Tweak - - message: Increased damage per injection overclocked AMEs. - type: Tweak - - message: Halved fuel per AME jar. - type: Tweak - id: 6882 - time: '2024-07-07T14:27:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29587 - author: Plykiya changes: - message: Hyperzine's effective healing range has been changed from 70 to 120, @@ -3914,3 +3902,11 @@ id: 7381 time: '2024-09-16T00:04:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32192 +- author: DrSmugleaf + changes: + - message: Fixed examine sometimes flickering and closing until you examine something + around you. + type: Fix + id: 7382 + time: '2024-09-16T08:51:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32205 From 65bf3c61b637e1d8eaea57c2187d00fc8519ea40 Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Mon, 16 Sep 2024 01:59:00 -0700 Subject: [PATCH 03/28] Adds the syndicate Booze-O-Mat (Bruise-O-Mat) to nukie planet (#32107) --- .../advertisements/vending/bruiseomat.ftl | 43 +++++++++ Resources/Maps/Nonstations/nukieplanet.yml | 2 +- .../VendingMachines/advertisements.yml | 6 ++ .../Catalog/VendingMachines/goodbyes.yml | 6 ++ .../Structures/Machines/vending_machines.yml | 35 +++++++ .../VendingMachines/bruiseomat.rsi/broken.png | Bin 0 -> 1104 bytes .../bruiseomat.rsi/deny-unshaded.png | Bin 0 -> 1616 bytes .../VendingMachines/bruiseomat.rsi/meta.json | 89 ++++++++++++++++++ .../bruiseomat.rsi/normal-unshaded.png | Bin 0 -> 4617 bytes .../VendingMachines/bruiseomat.rsi/off.png | Bin 0 -> 786 bytes .../VendingMachines/bruiseomat.rsi/panel.png | Bin 0 -> 247 bytes 11 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl create mode 100644 Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/broken.png create mode 100644 Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/deny-unshaded.png create mode 100644 Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/normal-unshaded.png create mode 100644 Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/off.png create mode 100644 Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/panel.png diff --git a/Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl b/Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl new file mode 100644 index 00000000000000..a8cb903efe2122 --- /dev/null +++ b/Resources/Locale/en-US/advertisements/vending/bruiseomat.ftl @@ -0,0 +1,43 @@ +advertisement-bruiseomat-1 = I VOTE WAROPS!!! +advertisement-bruiseomat-2 = Who has TC? +advertisement-bruiseomat-3 = Did anyone buy an EMAG? +advertisement-bruiseomat-4 = I wanna go back to my home station... +advertisement-bruiseomat-5 = Beware of the Mime and Clown. BEWARE! +advertisement-bruiseomat-6 = A nuke a day keeps the deathsquad at bay! +advertisement-bruiseomat-7 = You'll never be able to match MY mixing, Agent! +advertisement-bruiseomat-8 = Thirsting for blood? I got you covered! +advertisement-bruiseomat-9 = If they didn't want us to blow up the station, then why would they leave the disk so unsecured? +advertisement-bruiseomat-10 = They say an eye for an eye makes the whole world blind. So try a nuke instead! +advertisement-bruiseomat-11 = I hunger for blood! +advertisement-bruiseomat-12 = Drink up before the mission! +advertisement-bruiseomat-13 = Man, I didn't know I got moved back to Cadet City! +advertisement-bruiseomat-14 = Sicker than your average Booze-O-Mat! +advertisement-bruiseomat-15 = Nuke ops will continue until robustness improves. +thankyou-bruiseomat-1 = Good luck, schmuck! You're gonna need it! +thankyou-bruiseomat-2 = Show 'em the Gorlex Style! +thankyou-bruiseomat-3 = Don't forget to stay hydrated! +thankyou-bruiseomat-4 = You noted down the codes, right? +thankyou-bruiseomat-5 = Don't forget the nuke! +thankyou-bruiseomat-6 = I hope those are noslips. +thankyou-bruiseomat-7 = Please let this be a normal team... +thankyou-bruiseomat-8 = Seems like the station isn't the only thing getting hammered today. +thankyou-bruiseomat-9 = What the hell did you buy? +thankyou-bruiseomat-10 = Give it up for the flukeops professionals! +thankyou-bruiseomat-11 = Death to NanoTrasen!!! +thankyou-bruiseomat-12 = Really? That's your plan? +thankyou-bruiseomat-13 = In my endless life, never have I ever seen that loadout. +thankyou-bruiseomat-14 = Get that captain! +thankyou-bruiseomat-15 = Don't run off by yourself, now! +thankyou-bruiseomat-16 = Y'all are taking too long! +thankyou-bruiseomat-17 = They won't see that coming! +thankyou-bruiseomat-18 = Remember your pinpointer! +thankyou-bruiseomat-19 = See you soon! Or maybe never again, that one's more likely! +thankyou-bruiseomat-20 = Rescue another one of me! I need a friend! +thankyou-bruiseomat-21 = You're going to sober up before the mission, right? +thankyou-bruiseomat-22 = 5 telecrystal says you won't make it to the shuttle before you fall over. +thankyou-bruiseomat-23 = The soda fountain's over there, lightweight. +thankyou-bruiseomat-24 = Did you spend your TC on cat ears? +thankyou-bruiseomat-25 = Really? That's what you wanted to drink? +thankyou-bruiseomat-26 = Take a shot, give a shot! +thankyou-bruiseomat-27 = How many drinks have you had now? I've lost count. +thankyou-bruiseomat-28 = When the bosses say "die trying" they mean dying in BATTLE, not at the bar. diff --git a/Resources/Maps/Nonstations/nukieplanet.yml b/Resources/Maps/Nonstations/nukieplanet.yml index 2063451a0ee48b..665657f7ddaa02 100644 --- a/Resources/Maps/Nonstations/nukieplanet.yml +++ b/Resources/Maps/Nonstations/nukieplanet.yml @@ -13721,7 +13721,7 @@ entities: - type: Transform pos: 3.5882664,-8.344303 parent: 104 -- proto: VendingMachineBooze +- proto: VendingMachineBoozeSyndicate entities: - uid: 1380 components: diff --git a/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml b/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml index 5f6806afbb1268..9314de97914612 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/advertisements.yml @@ -22,6 +22,12 @@ prefix: advertisement-boozeomat- count: 19 +- type: localizedDataset + id: BruiseOMatAds + values: + prefix: advertisement-bruiseomat- + count: 15 + - type: localizedDataset id: CargoDrobeAds values: diff --git a/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml b/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml index 5a3d91db1167c4..fd4e53acaa7b85 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/goodbyes.yml @@ -4,6 +4,12 @@ prefix: thankyou-boozeomat- count: 3 +- type: localizedDataset + id: BruiseOMatGoodbyes + values: + prefix: thankyou-bruiseomat- + count: 28 + - type: localizedDataset id: ChangGoodbyes values: diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 65f40ab3e49e92..a6cf9ef0e308cf 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -199,6 +199,41 @@ - Bartender - Drinks +- type: entity + parent: VendingMachineBooze + id: VendingMachineBoozeSyndicate # syndie booze-o-mat for nukie outpost + name: Bruise-O-Mat + description: A refurbished Booze-O-Mat for boosting operative morale. An imprint of a blood-red hardsuit is visible on one side, and the paint seems ashed off on the other side. + components: + - type: VendingMachine + pack: BoozeOMatInventory + offState: off + brokenState: broken + normalState: normal-unshaded + denyState: deny-unshaded + loopDeny: false + - type: Advertise + pack: BruiseOMatAds + - type: SpeakOnUIClosed + pack: BruiseOMatGoodbyes + - type: Speech + - type: Sprite + sprite: Structures/Machines/VendingMachines/bruiseomat.rsi + layers: + - state: "off" + map: ["enum.VendingMachineVisualLayers.Base"] + - state: "off" + map: ["enum.VendingMachineVisualLayers.BaseUnshaded"] + shader: unshaded + - state: panel + map: ["enum.WiresVisualLayers.MaintenancePanel"] + - type: AccessReader + access: [["SyndicateAgent"]] + - type: GuideHelp + guides: + - Bartender + - Drinks + - type: entity parent: VendingMachine id: VendingMachineCart diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/broken.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..1df632306540fd93c9d253dc312b1aaa50abc43e GIT binary patch literal 1104 zcmV-W1h4yvP)Px(3Q0skR9J=WmS1RFRUF4Z=l*G$nwqqtH5o1Fb4?#wK`1sN)lI=sX}b>XpG_@n zu*yLCq6~Dny|_tj)s}9n%yqihu4O|Q!hBNSHqlail$0P;wl=v-$&!1M93S$BB{yMh z2knbrINW=G=lp)Z&-tBm&%MIy^-6Y88i3pF#^dqqXyRxzieVU80FTE*V`Jlv0st6> zfwJRSOY}d$t^;TQjg5`e)z$5I@|Bepv{)=gI2=X@v7^bu;V`jSEL(xRmX?;b9nkOh zZ`$AQ_ZRMq0OIlZwgI;5uaz1`Kl}&)p$MjDFO!lg0E()T%%}|a?nh=M-`)6`{GzS@ zb*tb%6pNuhy9WTr$PtngQ^ecask!wV*5Chdv9`7-pY1J}2?m)72C+;Fp{QsgUDW^8 z<#`$!8W`z6@X*-_AqvSW$p#Qf2qFnV3I!u6xMyj^Q-Y0T2FtP#Lh$hylY~}6L=A(e zVN?vB7@wr-xo3#CwO1TtTLO(51Zr47> zt}lWR821d~)e;@aK+hZOdD_R>=?fKu#@pISy)!`l)$2fZDXc?pmmOWBt80dtS-h)#vkVDS24{Ek8pb zl}clpCI|O+(DB0aD2js5>tpQH8P;p;GmS(dn@ZZ$)Ks{)Z9+v+Q4}@zCS>LFc{y_8 z1g2>+cIph~Q%_P|U5&%xz~OKd`G-Owx?X>|&_baQ06m(M9?cGItALXGDyGR2^uE%; z>gvA$II0{Re6ODiSARrRRTRbk1#N9@W$f#jqUW`>HReO>(iX{m8pOYK-cv` zlTy;N_eFGFXLNWFhr6D+UvKm2m**H6I8Ye(D6#=mxzbd*(&#m54t2eT`*AnpSFVvv zB$2s|A=DI8b911kvTYMe=US<3dq8Hg*Q4EUv3h5f*&8>}TslG#d@$I{XVd3URRu)> z%KSw2_4T1?8bS!9lt?L=n3$-z2W$X$ZvO$m$=o%s(|`V6adrg|4-O_(; W9$!}jmzmK30000 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/off.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/off.png new file mode 100644 index 0000000000000000000000000000000000000000..c3427b7188c359f38b6f49a481f84cd3199bf0e8 GIT binary patch literal 786 zcmV+t1MU2YP)Px%%t=H+R9J=Wmd#GvKomyL*kcExL@`t#K@~*1Mq$AN@Di1>tkh*!eH0`l#0sg) zN_~`8su1e3f<|2w3W?)1KNH*2g^h_F2aeX6%`-{@R4Nr5 z$62UxtJT7F-3Y*O9IDmoLID6=*Tq=4YexS8o*h5}RI621R#p~nesOVu^gNG7qk#}& zq2`T71JCoK2;A!Q^mOh8Yqi?c^J}$Q(oO+%yWP0~=AAFIH=ONP0BAq}zBU0cOp`%q zqLiXisUU>l_NCo?|B}pq>v>qOU*?((fBfQOxqLr>X-0-xM-Va$5{N`vKUvO<0W|yB zh2uy35C{=M(DuA1G0z2XoM^W_RYV9uuj69db~3J%;zhZTn)Bx=0d#UWNAJKdOMF6# z0|TqqrvPX)cNy?FO|FC*JhKNvfFbBEX)H7az;E@R#2oI6fQTuCh<@l>u6uPXCH(w7 z!A-LK5J0;f#H|iiX3Ui%k9SnA$MSO4;(m<*SXS0HN<1KyjH4RF*Uin%napzmq`dp) zeLp}cg;ObD7;w`Zu)4a6eR;)AaeSxEW^*djt*x!e0EQ6(1VNA;0>Hk!Lanc{gZx9~_;qy}ivF83BLxd#Uxt0pbc5Oh`AizQ%Ak#57F|WBgOx+uP&d z=p@y@zP=tao(SM|I;p-80=KP__B3JM-`~fwEQZ4&op`-^9Dz>{MPM`ul~TyEh3^fq zZ5yK)9VB5lU5W?HuQ33-6uo;Lf>NYDd>tP`!t@`k2U+E3R9+zpqwC*RfGkJRkR=P% zQ52RT=ru7-1H*v4YFw|^ky0XrKx>WGn#04x>2u)f>$i!!nDlpJwD^Q!NWb4tqLqM6 zn**~}vaF7ek8|&5jdKC!sbr(t-QAsejwqE%8enH<=TYXf>g?<+4e(t02cZlCuO2cJ QWdHyG07*qoM6N<$g6wW>IsgCw literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/panel.png b/Resources/Textures/Structures/Machines/VendingMachines/bruiseomat.rsi/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..60dbf76b85e3f9f18a80a5d810366360f199f9ba GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7ezo z#WAE}&f6=7T!$P4STD$nyx(**th!lbTG+gU4O4I5WVQBAblh;7aZS)HW1p?;A5?^9 zb}-r=aQWcBegDt=^u*^gDmWAx7?{As83xUzcF%3*%`NUQ6iZ{!jbCq-Q*J!RpFiey zc-}9TsCApye80i6k^RM4(L!q(_7=?p)&14F8mA4`-51%AAr+#;>S9-9+%PTP=>_`{ nkp}Ze*1zZXcQ7#3iG5&UGSGT7l{r%o=x7E{S3j3^P6 Date: Mon, 16 Sep 2024 09:00:06 +0000 Subject: [PATCH 04/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b2be978db2eb5f..11b88c97d5cf20 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: Hyperzine's effective healing range has been changed from 70 to 120, - to anything above 70 total damage. - type: Tweak - id: 6883 - time: '2024-07-07T14:28:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29712 - author: Tayrtahn changes: - message: Fixed admin ghosts briefly becoming visible when a news article is published. @@ -3910,3 +3902,12 @@ id: 7382 time: '2024-09-16T08:51:54.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32205 +- author: ArtisticRoomba + changes: + - message: The Bruise-O-Mat alcohol vendor has been added to the nukie outpost, + for all your pre-op drinking needs. Seems to have developed a witty personality, + too... + type: Add + id: 7383 + time: '2024-09-16T08:59:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32107 From 65329ab38d9a9230b495b4a87160c4b724b88802 Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Mon, 16 Sep 2024 03:01:49 -0700 Subject: [PATCH 05/28] Change the binary translator key's contraband designation to syndicate contraband + minor sprite change for consistency (#32193) * adds new icon, changes binary key icon and frame, changes contraband designation * added back the regular key as admeme because it makes sense (why am I not thinking about these things) * hehe I cannot read! --- .../Prototypes/Catalog/uplink_catalog.yml | 6 +++--- .../Objects/Devices/encryption_keys.yml | 17 ++++++++++++++++- .../Devices/encryption_keys.rsi/borg_label.png | Bin 0 -> 149 bytes .../Devices/encryption_keys.rsi/meta.json | 7 ++++--- 4 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 Resources/Textures/Objects/Devices/encryption_keys.rsi/borg_label.png diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 394a06516be848..efa288a44b8936 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -773,8 +773,8 @@ id: UplinkBinaryTranslatorKey name: uplink-binary-translator-key-name description: uplink-binary-translator-key-desc - icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: rd_label } - productEntity: EncryptionKeyBinary + icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: borg_label } + productEntity: EncryptionKeyBinarySyndicate cost: Telecrystal: 1 categories: @@ -2046,4 +2046,4 @@ - !type:BuyerJobCondition whitelist: - Chef - - Mime \ No newline at end of file + - Mime diff --git a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml index 7186f9f34abfbd..25d81a6f83c1e0 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/encryption_keys.yml @@ -227,7 +227,22 @@ - type: Sprite layers: - state: crypt_silver - - state: rd_label + - state: borg_label + +- type: entity + parent: [ EncryptionKey, BaseSyndicateContraband ] + id: EncryptionKeyBinarySyndicate + name: binary translator key + description: A syndicate encryption key that translates binary signals used by silicons. + components: + - type: EncryptionKey + channels: + - Binary + defaultChannel: Binary + - type: Sprite + layers: + - state: crypt_red + - state: borg_label - type: entity parent: EncryptionKey diff --git a/Resources/Textures/Objects/Devices/encryption_keys.rsi/borg_label.png b/Resources/Textures/Objects/Devices/encryption_keys.rsi/borg_label.png new file mode 100644 index 0000000000000000000000000000000000000000..2b56e167730682294aca3f6c0465c838176a3bfb GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}{+=$5ArY-_ zFBtMQ81Oh>>|nl~ezNm$2 Date: Mon, 16 Sep 2024 10:02:55 +0000 Subject: [PATCH 06/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 11b88c97d5cf20..cf6948f5d97aa0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Tayrtahn - changes: - - message: Fixed admin ghosts briefly becoming visible when a news article is published. - type: Fix - id: 6884 - time: '2024-07-08T03:33:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29801 - author: slarticodefast changes: - message: Improved throwing calculations. Thrown items now stop moving exactly @@ -3911,3 +3904,11 @@ id: 7383 time: '2024-09-16T08:59:00.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32107 +- author: ArtisticRoomba + changes: + - message: The binary translator key in the syndie uplink is now correctly marked + as syndicate contraband. + type: Tweak + id: 7384 + time: '2024-09-16T10:01:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32193 From b2dbad37796a4d7cb09057a6ff3934cc781fdda3 Mon Sep 17 00:00:00 2001 From: august-sun <45527070+august-sun@users.noreply.github.com> Date: Mon, 16 Sep 2024 04:37:26 -0600 Subject: [PATCH 07/28] Immovable Rod Spawn Addition: Lizard Plushie (#32113) * a deadly weh * Updated meteorswarms.yml Updated probabilities to match exactly 1 * Updated immovable_rod.yml Removed rotation --------- Co-authored-by: august-sun <45527070+august.sun@users.noreply.github.com> --- .../Entities/Objects/Fun/immovable_rod.yml | 13 ++++++++++++- .../Prototypes/GameRules/meteorswarms.yml | 19 +++++++++++-------- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml index 69f0ed415eba3e..0bee05aa6ad533 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/immovable_rod.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: ImmovableRod name: immovable rod description: You can sense that it's hungry. That's usually a bad sign. @@ -177,3 +177,14 @@ state: icon rotation: 225 noRot: false + +- type: entity + parent: ImmovableRodKeepTilesStill + id: ImmovableRodWeh + name: immovable weh + description: WEH! + components: + - type: Sprite + sprite: Objects/Fun/toys.rsi + state: plushie_lizard + noRot: false diff --git a/Resources/Prototypes/GameRules/meteorswarms.yml b/Resources/Prototypes/GameRules/meteorswarms.yml index 6203ee35abfb15..6cfcc536bd3ea1 100644 --- a/Resources/Prototypes/GameRules/meteorswarms.yml +++ b/Resources/Prototypes/GameRules/meteorswarms.yml @@ -211,26 +211,29 @@ - type: ImmovableRodRule rodPrototypes: - id: ImmovableRodKeepTilesStill - prob: 0.95 + prob: 0.94 orGroup: rodProto - id: ImmovableRodMop - prob: 0.0072 + prob: 0.0075 orGroup: rodProto - id: ImmovableRodShark - prob: 0.0072 + prob: 0.0075 orGroup: rodProto - id: ImmovableRodClown - prob: 0.0072 + prob: 0.0075 orGroup: rodProto - id: ImmovableRodBanana - prob: 0.0072 + prob: 0.0075 orGroup: rodProto - id: ImmovableRodHammer - prob: 0.0072 + prob: 0.0075 orGroup: rodProto - id: ImmovableRodThrongler - prob: 0.0072 + prob: 0.0075 orGroup: rodProto - id: ImmovableRodGibstick - prob: 0.0072 + prob: 0.0075 + orGroup: rodProto + - id: ImmovableRodWeh + prob: 0.0075 orGroup: rodProto From 4abb6a7dd1c9b66734893fb4c01721239c71d231 Mon Sep 17 00:00:00 2001 From: MissKay1994 <15877268+MissKay1994@users.noreply.github.com> Date: Mon, 16 Sep 2024 08:45:15 -0400 Subject: [PATCH 08/28] Lizards now metabolize chocolate (#32147) * Eat the chocolate * Update toxins.yml * fully delete threshold lines * Update snacks.yml * Fix tags Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Prototypes/Entities/Objects/Consumable/Food/snacks.yml | 4 ++++ Resources/Prototypes/Reagents/toxins.yml | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml index ff0504d39ea738..e9e57f79ce458e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml @@ -129,6 +129,10 @@ - type: Sprite state: chocolatebar-open - type: Item + - type: Tag + tags: + - FoodSnack + - ReptilianFood - type: SolutionContainerManager solutions: food: diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index e53c767a7e7a45..6235136dbc2649 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -402,8 +402,6 @@ effects: - !type:HealthChange conditions: - - !type:ReagentThreshold - min: 1 - !type:OrganType type: Animal # Applying damage to the mobs with lower metabolism capabilities damage: @@ -412,8 +410,6 @@ - !type:ChemVomit probability: 0.04 #Scaled for time, not metabolismrate. conditions: - - !type:ReagentThreshold - min: 3 - !type:OrganType type: Animal From af53d553292cb958a8967d207b112180bcdc59d2 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 16 Sep 2024 12:46:21 +0000 Subject: [PATCH 09/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cf6948f5d97aa0..27926b7a9087be 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Improved throwing calculations. Thrown items now stop moving exactly - below your cursor. Throwing weapons will land at your cursor and then slide - until stopped by friction. - type: Tweak - id: 6885 - time: '2024-07-08T09:03:53.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29726 - author: Errant changes: - message: Vox now have their entry in the guidebook. @@ -3912,3 +3903,10 @@ id: 7384 time: '2024-09-16T10:01:49.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32193 +- author: MissKay1994 + changes: + - message: Lizards are now poisoned by hot chocolate + type: Fix + id: 7385 + time: '2024-09-16T12:45:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32147 From ccc5f61584b4017c315cb3df1178eb8a4e391194 Mon Sep 17 00:00:00 2001 From: chavonadelal <156101927+chavonadelal@users.noreply.github.com> Date: Mon, 16 Sep 2024 15:50:14 +0300 Subject: [PATCH 10/28] Localization of steal targets (#30153) * Localization of steal targets * Correction of localization of theft objects * The second correction of the localization of theft targets * Update steal-target-groups.ftl Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> * Revision of the localization method * Choosing a simple option for localization * Fix TechnologyDisk name * Corrections based on feedback received * correction of declension --------- Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> --- .../Systems/StealConditionSystem.cs | 9 +- .../Prototypes/StealTargetGroupPrototype.cs | 2 +- .../conditions/steal-target-groups.ftl | 66 +++++++++++ .../en-US/objectives/conditions/steal.ftl | 2 +- .../Objectives/stealTargetGroups.yml | 112 +++++++++--------- 5 files changed, 128 insertions(+), 63 deletions(-) create mode 100644 Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 2c9244cf7d5f32..be34a80fe34850 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -72,14 +72,15 @@ private void OnAssigned(Entity condition, ref Objective private void OnAfterAssign(Entity condition, ref ObjectiveAfterAssignEvent args) { var group = _proto.Index(condition.Comp.StealGroup); + string localizedName = Loc.GetString(group.Name); var title =condition.Comp.OwnerText == null - ? Loc.GetString(condition.Comp.ObjectiveNoOwnerText, ("itemName", group.Name)) - : Loc.GetString(condition.Comp.ObjectiveText, ("owner", Loc.GetString(condition.Comp.OwnerText)), ("itemName", group.Name)); + ? Loc.GetString(condition.Comp.ObjectiveNoOwnerText, ("itemName", localizedName)) + : Loc.GetString(condition.Comp.ObjectiveText, ("owner", Loc.GetString(condition.Comp.OwnerText)), ("itemName", localizedName)); var description = condition.Comp.CollectionSize > 1 - ? Loc.GetString(condition.Comp.DescriptionMultiplyText, ("itemName", group.Name), ("count", condition.Comp.CollectionSize)) - : Loc.GetString(condition.Comp.DescriptionText, ("itemName", group.Name)); + ? Loc.GetString(condition.Comp.DescriptionMultiplyText, ("itemName", localizedName), ("count", condition.Comp.CollectionSize)) + : Loc.GetString(condition.Comp.DescriptionText, ("itemName", localizedName)); _metaData.SetEntityName(condition.Owner, title, args.Meta); _metaData.SetEntityDescription(condition.Owner, description, args.Meta); diff --git a/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs b/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs index 2730acb9acac1f..bc2af0eb092a62 100644 --- a/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs +++ b/Content.Shared/Objectives/Prototypes/StealTargetGroupPrototype.cs @@ -10,6 +10,6 @@ namespace Content.Shared.Objectives; public sealed partial class StealTargetGroupPrototype : IPrototype { [IdDataField] public string ID { get; private set; } = default!; - [DataField] public string Name { get; private set; } = string.Empty; + [DataField] public LocId Name { get; private set; } = string.Empty; [DataField] public SpriteSpecifier Sprite { get; private set; } = SpriteSpecifier.Invalid; } diff --git a/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl b/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl new file mode 100644 index 00000000000000..91b3c92b1c333c --- /dev/null +++ b/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl @@ -0,0 +1,66 @@ +# Traitor single items +steal-target-groups-hypospray = hypospray +steal-target-groups-handheld-crew-monitor = handheld crew monitor +steal-target-groups-clothing-outer-hardsuit-rd = experimental research hardsuit +steal-target-groups-hand-teleporter = hand teleporter +steal-target-groups-clothing-shoes-boots-mag-adv = advanced magboots +steal-target-groups-box-folder-qm-clipboard = requisition digi-board +steal-target-groups-food-meat-corgi = prime-cut corgi meat +steal-target-groups-captain-id-card = captain ID card +steal-target-groups-jetpack-captain-filled = captain's jetpack +steal-target-groups-weapon-antique-laser = antique laser pistol +steal-target-groups-nuke-disk = nuclear authentication disk +steal-target-groups-weapon-energy-shot-gun = energy shotgun + +# Thief Collection +steal-target-groups-figurines = figurine +steal-target-groups-heads-cloaks = head's cloak +steal-target-groups-heads-bedsheets = head's bedsheet +steal-target-groups-stamps = stamp +steal-target-groups-door-remotes = door remote +steal-target-groups-encryption-keys = encryption key +steal-target-groups-technology-disks = technology disk +steal-target-groups-id-cards = ID Card +steal-target-groups-lamps = LAMP + +# Thief single item +steal-target-groups-forensic-scanner = forensic scanner +steal-target-groups-flippo-engraved-lighter = detective's Flippo engraved lighter +steal-target-groups-ammo-tech-fab-circuitboard = ammo techfab circuit board +steal-target-groups-clothing-head-hat-warden = warden's cap +steal-target-groups-clothing-outer-hardsuit-void-paramed = paramedic void suit +steal-target-groups-medical-tech-fab-circuitboard = medical techfab machine board +steal-target-groups-clothing-headset-alt-medical = chief medical officer's over-ear headset +steal-target-groups-research-and-development-server-machine-circuitboard = R&D server machine board +steal-target-groups-fire-axe = fireaxe +steal-target-groups-ame-part-flatpack = AME flatpack +steal-target-groups-salvage-expeditions-computer-circuitboard = salvage expeditions computer board +steal-target-groups-cargo-shuttle-console-circuitboard = cargo shuttle console board +steal-target-groups-clothing-eyes-hud-beer = beer goggles +steal-target-groups-bible = bible +steal-target-groups-clothing-neck-goldmedal = gold medal of crewmanship +steal-target-groups-clothing-neck-clownmedal = clown medal + +# Thief structures +steal-target-groups-teg = teg generator part +steal-target-groups-freezer-heater = freezer or heater +steal-target-groups-altar-nanotrasen = nanotrasen altar (any) + +steal-target-groups-nuclear-bomb = nuclear fission explosive +steal-target-groups-fax-machine-captain = captain long range fax machine +steal-target-groups-chem-dispenser = chemical dispenser +steal-target-groups-xeno-artifact = alien artifact +steal-target-groups-booze-dispenser = booze dispenser +steal-target-groups-plant-rd = "RD's potted plant" +steal-target-groups-toilet-golden-dirty-water = golden toilet + +# Thief Animal +steal-target-groups-animal-named-cat = CMO's Cat + +steal-target-groups-animal-ian = Ian +steal-target-groups-animal-mc-griff = McGriff +steal-target-groups-animal-walter = Walter +steal-target-groups-animal-morty = Morty +steal-target-groups-animal-renault = Renault +steal-target-groups-animal-shiva = Shiva +steal-target-groups-animal-tropico = Tropico diff --git a/Resources/Locale/en-US/objectives/conditions/steal.ftl b/Resources/Locale/en-US/objectives/conditions/steal.ftl index 00c8e0fdaf93ad..1f11bf7196b976 100644 --- a/Resources/Locale/en-US/objectives/conditions/steal.ftl +++ b/Resources/Locale/en-US/objectives/conditions/steal.ftl @@ -8,4 +8,4 @@ objective-condition-steal-Ian = head of personnel's corgi objective-condition-thief-description = The {$itemName} would be a great addition to my collection! objective-condition-thief-animal-description = The {$itemName} would be a great addition to my collection! Most importantly, alive. -objective-condition-thief-multiply-description = I need to get {$count} {MAKEPLURAL($itemName)} and take them with me. +objective-condition-thief-multiply-description = I need to get {$count} {MAKEPLURAL($itemName)} (any) and take them with me. diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index b22e952e7e60e0..48f56e2bfcd76d 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -2,84 +2,84 @@ - type: stealTargetGroup id: Hypospray - name: hypospray + name: steal-target-groups-hypospray sprite: sprite: Objects/Specific/Medical/hypospray.rsi state: hypo - type: stealTargetGroup id: HandheldCrewMonitor - name: handheld crew monitor + name: steal-target-groups-handheld-crew-monitor sprite: sprite: Objects/Specific/Medical/handheldcrewmonitor.rsi state: scanner - type: stealTargetGroup id: ClothingOuterHardsuitRd - name: experimental research hardsuit + name: steal-target-groups-clothing-outer-hardsuit-rd sprite: sprite: Clothing/OuterClothing/Hardsuits/rd.rsi state: icon - type: stealTargetGroup id: HandTeleporter - name: hand teleporter + name: steal-target-groups-hand-teleporter sprite: sprite: Objects/Devices/hand_teleporter.rsi state: icon - type: stealTargetGroup id: ClothingShoesBootsMagAdv - name: advanced magboots + name: steal-target-groups-clothing-shoes-boots-mag-adv sprite: sprite: Clothing/Shoes/Boots/magboots-advanced.rsi state: icon - type: stealTargetGroup id: BoxFolderQmClipboard - name: requisition digi-board + name: steal-target-groups-box-folder-qm-clipboard sprite: sprite: Objects/Misc/qm_clipboard.rsi state: qm_clipboard - type: stealTargetGroup id: FoodMeatCorgi - name: prime-cut corgi meat + name: steal-target-groups-food-meat-corgi sprite: sprite: Objects/Consumable/Food/meat.rsi state: corgi # - type: stealTargetGroup id: CaptainIDCard - name: captain ID card + name: steal-target-groups-captain-id-card sprite: sprite: Objects/Misc/id_cards.rsi state: ert_commander #no one will know the difference. - type: stealTargetGroup id: JetpackCaptainFilled - name: captain's jetpack + name: steal-target-groups-jetpack-captain-filled sprite: sprite: Objects/Tanks/Jetpacks/captain.rsi state: icon - type: stealTargetGroup id: WeaponAntiqueLaser - name: antique laser pistol + name: steal-target-groups-weapon-antique-laser sprite: sprite: Objects/Weapons/Guns/Battery/antiquelasergun.rsi state: base - type: stealTargetGroup id: NukeDisk - name: nuclear authentication disk + name: steal-target-groups-nuke-disk sprite: sprite: Objects/Misc/nukedisk.rsi state: icon - type: stealTargetGroup id: WeaponEnergyShotgun - name: energy shotgun + name: steal-target-groups-weapon-energy-shot-gun sprite: sprite: Objects/Weapons/Guns/Battery/energy_shotgun.rsi state: base @@ -88,63 +88,63 @@ - type: stealTargetGroup id: Figurines - name: figurines (any) + name: steal-target-groups-figurines sprite: sprite: Objects/Fun/figurines.rsi state: figurine_spawner - type: stealTargetGroup id: HeadCloak - name: head's cloaks (any) + name: steal-target-groups-heads-cloaks sprite: sprite: Clothing/Neck/Cloaks/cap.rsi state: icon - type: stealTargetGroup id: HeadBedsheet - name: head's bedsheets (any) + name: steal-target-groups-heads-bedsheets sprite: sprite: Objects/Misc/bedsheets.rsi state: sheetNT - type: stealTargetGroup id: Stamp - name: stamps (any) + name: steal-target-groups-stamps sprite: sprite: Objects/Misc/stamps.rsi state: stamp-cap - type: stealTargetGroup id: DoorRemote - name: door remotes (any) + name: steal-target-groups-door-remotes sprite: sprite: Objects/Devices/door_remote.rsi state: door_remotebase - type: stealTargetGroup id: EncryptionKey - name: encryption keys (any) + name: steal-target-groups-encryption-keys sprite: sprite: Objects/Devices/encryption_keys.rsi state: crypt_gray - type: stealTargetGroup id: TechnologyDisk - name: technology disks + name: steal-target-groups-technology-disks sprite: sprite: Objects/Misc/module.rsi state: datadisk_base - type: stealTargetGroup id: IDCard - name: ID Cards (any) + name: steal-target-groups-id-cards sprite: sprite: Objects/Misc/id_cards.rsi state: default - type: stealTargetGroup id: LAMP - name: LAMPS + name: steal-target-groups-lamps sprite: sprite: Objects/Tools/lantern.rsi state: lantern @@ -153,112 +153,112 @@ - type: stealTargetGroup id: ForensicScanner - name: forensic scanner + name: steal-target-groups-forensic-scanner sprite: sprite: Objects/Devices/forensic_scanner.rsi state: forensicnew - type: stealTargetGroup id: FlippoEngravedLighter - name: detective's Flippo engraved lighter + name: steal-target-groups-flippo-engraved-lighter sprite: sprite: Objects/Tools/lighters.rsi state: zippo_engraved_icon_base - type: stealTargetGroup id: AmmoTechFabCircuitboard - name: ammo techfab circuit board + name: steal-target-groups-ammo-tech-fab-circuitboard sprite: sprite: Objects/Misc/module.rsi state: security - type: stealTargetGroup id: ClothingHeadHatWarden - name: warden's cap + name: steal-target-groups-clothing-head-hat-warden sprite: sprite: Clothing/Head/Hats/warden.rsi state: icon - type: stealTargetGroup id: ClothingOuterHardsuitVoidParamed - name: paramedic void suit + name: steal-target-groups-clothing-outer-hardsuit-void-paramed sprite: sprite: Clothing/OuterClothing/Hardsuits/paramed.rsi state: icon - type: stealTargetGroup id: MedicalTechFabCircuitboard - name: medical techfab machine board + name: steal-target-groups-medical-tech-fab-circuitboard sprite: sprite: Objects/Misc/module.rsi state: medical - type: stealTargetGroup id: ClothingHeadsetAltMedical - name: chief medical officer's over-ear headset + name: steal-target-groups-clothing-headset-alt-medical sprite: sprite: Clothing/Ears/Headsets/medical.rsi state: icon_alt - type: stealTargetGroup id: ResearchAndDevelopmentServerMachineCircuitboard - name: R&D server machine board + name: steal-target-groups-research-and-development-server-machine-circuitboard sprite: sprite: Objects/Misc/module.rsi state: science - type: stealTargetGroup id: FireAxe - name: fireaxe + name: steal-target-groups-fire-axe sprite: sprite: Objects/Weapons/Melee/fireaxe.rsi state: icon - type: stealTargetGroup id: AmePartFlatpack - name: AME part + name: steal-target-groups-ame-part-flatpack sprite: sprite: Objects/Devices/flatpack.rsi state: ame-part - type: stealTargetGroup id: SalvageExpeditionsComputerCircuitboard - name: salvage expeditions computer board + name: steal-target-groups-salvage-expeditions-computer-circuitboard sprite: sprite: Objects/Misc/module.rsi state: cpu_supply - type: stealTargetGroup id: CargoShuttleConsoleCircuitboard - name: cargo shuttle console board + name: steal-target-groups-cargo-shuttle-console-circuitboard sprite: sprite: Objects/Misc/module.rsi state: cpuboard - type: stealTargetGroup id: ClothingEyesHudBeer - name: beer goggles + name: steal-target-groups-clothing-eyes-hud-beer sprite: sprite: Clothing/Eyes/Hud/beergoggles.rsi state: icon - type: stealTargetGroup id: Bible - name: bible + name: steal-target-groups-bible sprite: sprite: Objects/Specific/Chapel/bible.rsi state: icon - type: stealTargetGroup id: ClothingNeckGoldmedal - name: gold medal of crewmanship + name: steal-target-groups-clothing-neck-goldmedal sprite: sprite: Clothing/Neck/Medals/gold.rsi state: icon - type: stealTargetGroup id: ClothingNeckClownmedal - name: clown medal + name: steal-target-groups-clothing-neck-clownmedal sprite: sprite: Clothing/Neck/Medals/clownmedal.rsi state: icon @@ -267,70 +267,70 @@ - type: stealTargetGroup id: NuclearBomb - name: nuclear fission explosive + name: steal-target-groups-nuclear-bomb sprite: sprite: Objects/Devices/nuke.rsi state: nuclearbomb_base - type: stealTargetGroup id: FaxMachineCaptain - name: captain long range fax machine + name: steal-target-groups-fax-machine-captain sprite: sprite: Structures/Machines/fax_machine.rsi state: icon - type: stealTargetGroup id: ChemDispenser - name: chemical dispenser + name: steal-target-groups-chem-dispenser sprite: sprite: Structures/dispensers.rsi state: industrial-working - type: stealTargetGroup id: XenoArtifact - name: big alien artifact + name: steal-target-groups-xeno-artifact sprite: sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi state: ano28 - type: stealTargetGroup id: FreezerHeater - name: freezer or heater + name: steal-target-groups-freezer-heater sprite: sprite: Structures/Piping/Atmospherics/thermomachine.rsi state: heaterOff - type: stealTargetGroup id: Teg - name: teg generator part + name: steal-target-groups-teg sprite: sprite: Structures/Power/Generation/teg.rsi state: teg - type: stealTargetGroup id: BoozeDispenser - name: booze dispenser + name: steal-target-groups-booze-dispenser sprite: sprite: Structures/smalldispensers.rsi state: booze - type: stealTargetGroup id: AltarNanotrasen - name: nanotrasen altar (any) + name: steal-target-groups-altar-nanotrasen sprite: sprite: Structures/Furniture/Altars/Gods/nanotrasen.rsi state: nanotrasen - type: stealTargetGroup id: PlantRD - name: RD's potted plant + name: steal-target-groups-plant-rd sprite: sprite: Structures/Furniture/potted_plants.rsi state: plant-25 - type: stealTargetGroup id: ToiletGoldenDirtyWater - name: golden toilet + name: steal-target-groups-toilet-golden-dirty-water sprite: sprite: Structures/Furniture/golden_toilet.rsi state: condisposal @@ -339,58 +339,56 @@ - type: stealTargetGroup id: AnimalIan - name: Ian + name: steal-target-groups-animal-ian sprite: sprite: Mobs/Pets/corgi.rsi state: ian - type: stealTargetGroup id: AnimalNamedCat - name: CMO's Cat + name: steal-target-groups-animal-named-cat sprite: sprite: Mobs/Pets/bingus.rsi state: bingus - type: stealTargetGroup id: AnimalMcGriff - name: McGriff + name: steal-target-groups-animal-mc-griff sprite: sprite: Mobs/Pets/mcgriff.rsi state: mcgriff - type: stealTargetGroup id: AnimalWalter - name: Walter + name: steal-target-groups-animal-walter sprite: sprite: Mobs/Pets/walter.rsi state: walter - type: stealTargetGroup id: AnimalMorty - name: Morty + name: steal-target-groups-animal-morty sprite: sprite: Mobs/Animals/possum.rsi state: possum - type: stealTargetGroup id: AnimalRenault - name: Renault + name: steal-target-groups-animal-renault sprite: sprite: Mobs/Animals/fox.rsi state: fox - type: stealTargetGroup id: AnimalShiva - name: Shiva + name: steal-target-groups-animal-shiva sprite: sprite: Mobs/Pets/shiva.rsi state: shiva - type: stealTargetGroup id: AnimalTropico - name: Tropico + name: steal-target-groups-animal-tropico sprite: sprite: Mobs/Animals/crab.rsi state: crab - - From 41617b9754f15ffaab3098910f9f2095ed451d0a Mon Sep 17 00:00:00 2001 From: Kanashi-Panda Date: Mon, 16 Sep 2024 17:35:57 -0700 Subject: [PATCH 11/28] Crayons buffed to 45 uses (#32061) * Buffs crayons to 45 uses * Update Resources/Prototypes/Entities/Objects/Fun/crayons.yml Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- Resources/Prototypes/Entities/Objects/Fun/crayons.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml index ffecfdf9940754..3c4a4800a87347 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml @@ -21,7 +21,7 @@ enum.CrayonUiKey.Key: type: CrayonBoundUserInterface - type: Crayon - capacity: 15 + capacity: 25 - type: Food - type: FlavorProfile flavors: From 5eaac00432bdb4c7cdc255880666ea3490632f57 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 17 Sep 2024 00:37:05 +0000 Subject: [PATCH 12/28] 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 27926b7a9087be..dd47739cb43172 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Errant - changes: - - message: Vox now have their entry in the guidebook. - type: Fix - id: 6886 - time: '2024-07-09T00:28:33.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29713 - author: Whisper changes: - message: Light toggle actions now have a 1 second cooldown between uses. @@ -3910,3 +3903,10 @@ id: 7385 time: '2024-09-16T12:45:15.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32147 +- author: Alice Liddel + changes: + - message: Crayon charges increased from 15 to 25 + type: Add + id: 7386 + time: '2024-09-17T00:35:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32061 From 92be69a5abbaa358b1cdaaa34bb11076485ff685 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:49:19 +0300 Subject: [PATCH 13/28] Anomalous infections (#31876) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * inner anomaly * anomaly pulse action * test anom mine * Update anomalies.yml * fix action cooldown * pyro_eyes * clientsystem * experiments * blya * some telegraphy * shock eyes! * shadow eyes * separate files * frosty eyes * fix * flora eyes * bluespace eyes * flesh eyes * redoing injction * auto add layers * пипяу * new injector component * stupid me * nice marker injectors * anomaly spawn on shutdown * gravity anom * dead anomaly spawning * add VOX states * sprite specific layers support * technology anom infection * auto detach anomalies that have moved away * Update anomaly_injections.yml * anomalyspawner integration * rock anomaly! * Update anomaly_injections.yml * fix crash bug * tag filter * fix anom dublication spawns * Update anomaly.yml * Update InnerBodyAnomalyComponent.cs * Update anomaly_injections.yml * dont spawn anomalies after decay * fix morb sprite, add end message * gravity resprite * admin logging, double injection fix * make flesh and living light mobs friendly to anomaly hosts * popups * severity feedback * sloth review * A * keep organs after gib * punpun host * sloth synchronization * Update arachnid.yml * increase infections spawnrate --- .../Anomaly/Effects/ClientInnerBodySystem.cs | 50 ++ .../Anomaly/AnomalySynchronizerSystem.cs | 44 +- Content.Server/Anomaly/AnomalySystem.cs | 6 +- .../AnomalySynchronizerComponent.cs | 11 +- .../Anomaly/Effects/InnerBodyAnomalySystem.cs | 236 +++++++ .../Explosion/EntitySystems/TriggerSystem.cs | 3 +- .../Anomaly/Components/AnomalyComponent.cs | 15 +- .../Components/InnerBodyAnomalyComponent.cs | 72 ++ .../InnerBodyAnomalyInjectorComponent.cs | 21 + .../Effects/SharedInnerBodyAnomalySystem.cs | 5 + Content.Shared/Anomaly/SharedAnomalySystem.cs | 21 +- Resources/Audio/Effects/attributions.yml | 5 + Resources/Audio/Effects/inneranomaly.ogg | Bin 0 -> 46892 bytes .../Locale/en-US/anomaly/inner_anomaly.ftl | 17 + Resources/Prototypes/Actions/anomaly.yml | 9 + .../Markers/Spawners/Random/anomaly.yml | 31 +- .../Prototypes/Entities/Mobs/NPCs/animals.yml | 1 + .../Prototypes/Entities/Mobs/NPCs/flesh.yml | 7 +- .../Entities/Mobs/NPCs/living_light.yml | 5 + .../Prototypes/Entities/Mobs/NPCs/pets.yml | 1 + .../Entities/Mobs/Species/arachnid.yml | 1 + .../Prototypes/Entities/Mobs/Species/base.yml | 1 + .../Structures/Specific/Anomaly/anomalies.yml | 3 +- .../Specific/Anomaly/anomaly_injections.yml | 353 ++++++++++ .../Specific/Anomaly/anomaly_injectors.yml | 320 +++++++++ Resources/Prototypes/tags.yml | 3 + .../inner_anom_layer.rsi/bluespace.png | Bin 0 -> 864 bytes .../inner_anom_layer.rsi/bluespace_VOX.png | Bin 0 -> 1031 bytes .../Anomalies/inner_anom_layer.rsi/fire.png | Bin 0 -> 1007 bytes .../inner_anom_layer.rsi/fire_VOX.png | Bin 0 -> 1514 bytes .../Anomalies/inner_anom_layer.rsi/flesh.png | Bin 0 -> 1342 bytes .../inner_anom_layer.rsi/flesh_VOX.png | Bin 0 -> 1385 bytes .../Anomalies/inner_anom_layer.rsi/flora.png | Bin 0 -> 1868 bytes .../inner_anom_layer.rsi/flora_VOX.png | Bin 0 -> 1952 bytes .../Anomalies/inner_anom_layer.rsi/frost.png | Bin 0 -> 2650 bytes .../inner_anom_layer.rsi/frost_VOX.png | Bin 0 -> 2718 bytes .../Anomalies/inner_anom_layer.rsi/grav.png | Bin 0 -> 2837 bytes .../inner_anom_layer.rsi/grav_VOX.png | Bin 0 -> 3405 bytes .../Anomalies/inner_anom_layer.rsi/meta.json | 643 ++++++++++++++++++ .../Anomalies/inner_anom_layer.rsi/rock.png | Bin 0 -> 1398 bytes .../inner_anom_layer.rsi/rock_VOX.png | Bin 0 -> 1398 bytes .../Anomalies/inner_anom_layer.rsi/shadow.png | Bin 0 -> 768 bytes .../inner_anom_layer.rsi/shadow_VOX.png | Bin 0 -> 1002 bytes .../Anomalies/inner_anom_layer.rsi/shock.png | Bin 0 -> 879 bytes .../inner_anom_layer.rsi/shock_VOX.png | Bin 0 -> 2083 bytes .../Anomalies/inner_anom_layer.rsi/tech.png | Bin 0 -> 1241 bytes .../inner_anom_layer.rsi/tech_VOX.png | Bin 0 -> 1244 bytes .../Specific/anomaly.rsi/anom5-pulse.png | Bin 1195 -> 1252 bytes .../Structures/Specific/anomaly.rsi/anom5.png | Bin 429 -> 513 bytes 49 files changed, 1859 insertions(+), 25 deletions(-) create mode 100644 Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs create mode 100644 Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs create mode 100644 Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs create mode 100644 Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs create mode 100644 Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs create mode 100644 Resources/Audio/Effects/inneranomaly.ogg create mode 100644 Resources/Locale/en-US/anomaly/inner_anomaly.ftl create mode 100644 Resources/Prototypes/Actions/anomaly.yml create mode 100644 Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injections.yml create mode 100644 Resources/Prototypes/Entities/Structures/Specific/Anomaly/anomaly_injectors.yml create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/bluespace_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/grav_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock_VOX.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech.png create mode 100644 Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech_VOX.png diff --git a/Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs b/Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs new file mode 100644 index 00000000000000..efb1a8d46e827f --- /dev/null +++ b/Content.Client/Anomaly/Effects/ClientInnerBodySystem.cs @@ -0,0 +1,50 @@ +using Content.Shared.Anomaly.Components; +using Content.Shared.Anomaly.Effects; +using Content.Shared.Body.Components; +using Robust.Client.GameObjects; + +namespace Content.Client.Anomaly.Effects; + +public sealed class ClientInnerBodyAnomalySystem : SharedInnerBodyAnomalySystem +{ + public override void Initialize() + { + SubscribeLocalEvent(OnAfterHandleState); + SubscribeLocalEvent(OnCompShutdown); + } + + private void OnAfterHandleState(Entity ent, ref AfterAutoHandleStateEvent args) + { + if (!TryComp(ent, out var sprite)) + return; + + if (ent.Comp.FallbackSprite is null) + return; + + if (!sprite.LayerMapTryGet(ent.Comp.LayerMap, out var index)) + index = sprite.LayerMapReserveBlank(ent.Comp.LayerMap); + + if (TryComp(ent, out var body) && + body.Prototype is not null && + ent.Comp.SpeciesSprites.TryGetValue(body.Prototype.Value, out var speciesSprite)) + { + sprite.LayerSetSprite(index, speciesSprite); + } + else + { + sprite.LayerSetSprite(index, ent.Comp.FallbackSprite); + } + + sprite.LayerSetVisible(index, true); + sprite.LayerSetShader(index, "unshaded"); + } + + private void OnCompShutdown(Entity ent, ref ComponentShutdown args) + { + if (!TryComp(ent, out var sprite)) + return; + + var index = sprite.LayerMapGet(ent.Comp.LayerMap); + sprite.LayerSetVisible(index, false); + } +} diff --git a/Content.Server/Anomaly/AnomalySynchronizerSystem.cs b/Content.Server/Anomaly/AnomalySynchronizerSystem.cs index 59ef08402ee2d7..b1814c2741d0e4 100644 --- a/Content.Server/Anomaly/AnomalySynchronizerSystem.cs +++ b/Content.Server/Anomaly/AnomalySynchronizerSystem.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Numerics; using Content.Server.Anomaly.Components; using Content.Server.DeviceLinking.Systems; using Content.Server.Power.Components; @@ -10,6 +11,7 @@ using Content.Shared.Power; using Robust.Shared.Audio.Systems; using Content.Shared.Verbs; +using Robust.Shared.Timing; namespace Content.Server.Anomaly; @@ -25,6 +27,7 @@ public sealed partial class AnomalySynchronizerSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly PowerReceiverSystem _power = default!; + [Dependency] private readonly IGameTiming _timing = default!; public override void Initialize() { @@ -40,6 +43,34 @@ public override void Initialize() SubscribeLocalEvent(OnAnomalyStabilityChanged); } + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var sync, out var xform)) + { + if (sync.ConnectedAnomaly is null) + continue; + + if (_timing.CurTime < sync.NextCheckTime) + continue; + sync.NextCheckTime += sync.CheckFrequency; + + if (Transform(sync.ConnectedAnomaly.Value).MapUid != Transform(uid).MapUid) + { + DisconnectFromAnomaly((uid, sync), sync.ConnectedAnomaly.Value); + continue; + } + + if (!xform.Coordinates.TryDistance(EntityManager, Transform(sync.ConnectedAnomaly.Value).Coordinates, out var distance)) + continue; + + if (distance > sync.AttachRange) + DisconnectFromAnomaly((uid, sync), sync.ConnectedAnomaly.Value); + } + } + /// /// If powered, try to attach a nearby anomaly. /// @@ -73,10 +104,10 @@ private void OnPowerChanged(Entity ent, ref PowerC if (args.Powered) return; - if (!TryComp(ent.Comp.ConnectedAnomaly, out var anomaly)) + if (ent.Comp.ConnectedAnomaly is null) return; - DisconnectFromAnomaly(ent, anomaly); + DisconnectFromAnomaly(ent, ent.Comp.ConnectedAnomaly.Value); } private void OnExamined(Entity ent, ref ExaminedEvent args) @@ -125,13 +156,16 @@ private void ConnectToAnomaly(Entity ent, Entity ent, AnomalyComponent anomaly) + private void DisconnectFromAnomaly(Entity ent, EntityUid other) { if (ent.Comp.ConnectedAnomaly == null) return; - if (ent.Comp.PulseOnDisconnect) - _anomaly.DoAnomalyPulse(ent.Comp.ConnectedAnomaly.Value, anomaly); + if (TryComp(other, out var anomaly)) + { + if (ent.Comp.PulseOnDisconnect) + _anomaly.DoAnomalyPulse(ent.Comp.ConnectedAnomaly.Value, anomaly); + } _popup.PopupEntity(Loc.GetString("anomaly-sync-disconnected"), ent, PopupType.Large); _audio.PlayPvs(ent.Comp.ConnectedSound, ent); diff --git a/Content.Server/Anomaly/AnomalySystem.cs b/Content.Server/Anomaly/AnomalySystem.cs index 3e9760a056c022..b0de3de8f3e511 100644 --- a/Content.Server/Anomaly/AnomalySystem.cs +++ b/Content.Server/Anomaly/AnomalySystem.cs @@ -55,6 +55,7 @@ public override void Initialize() SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnStartCollide); + InitializeGenerator(); InitializeScanner(); InitializeVessel(); @@ -86,7 +87,10 @@ public void ShuffleParticlesEffect(Entity anomaly) private void OnShutdown(Entity anomaly, ref ComponentShutdown args) { - EndAnomaly(anomaly); + if (anomaly.Comp.CurrentBehavior is not null) + RemoveBehavior(anomaly, anomaly.Comp.CurrentBehavior.Value); + + EndAnomaly(anomaly, spawnCore: false); } private void OnStartCollide(Entity anomaly, ref StartCollideEvent args) diff --git a/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs b/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs index 235e740cf35836..3127f091e5539d 100644 --- a/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs +++ b/Content.Server/Anomaly/Components/AnomalySynchronizerComponent.cs @@ -7,7 +7,7 @@ namespace Content.Server.Anomaly.Components; /// /// a device that allows you to translate anomaly activity into multitool signals. /// -[RegisterComponent, Access(typeof(AnomalySynchronizerSystem))] +[RegisterComponent, AutoGenerateComponentPause, Access(typeof(AnomalySynchronizerSystem))] public sealed partial class AnomalySynchronizerComponent : Component { /// @@ -34,6 +34,15 @@ public sealed partial class AnomalySynchronizerComponent : Component [DataField] public float AttachRange = 0.4f; + /// + /// Periodicheski checks to see if the anomaly has moved to disconnect it. + /// + [DataField] + public TimeSpan CheckFrequency = TimeSpan.FromSeconds(1f); + + [DataField, AutoPausedField] + public TimeSpan NextCheckTime = TimeSpan.Zero; + [DataField] public ProtoId DecayingPort = "Decaying"; diff --git a/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs b/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs new file mode 100644 index 00000000000000..38c4c51d8745f9 --- /dev/null +++ b/Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs @@ -0,0 +1,236 @@ +using Content.Server.Administration.Logs; +using Content.Server.Body.Systems; +using Content.Server.Chat.Managers; +using Content.Server.Jittering; +using Content.Server.Mind; +using Content.Server.Stunnable; +using Content.Shared.Actions; +using Content.Shared.Anomaly; +using Content.Shared.Anomaly.Components; +using Content.Shared.Anomaly.Effects; +using Content.Shared.Body.Components; +using Content.Shared.Chat; +using Content.Shared.Database; +using Content.Shared.Mobs; +using Content.Shared.Popups; +using Content.Shared.Whitelist; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics.Events; +using Robust.Shared.Prototypes; + +namespace Content.Server.Anomaly.Effects; + +public sealed class InnerBodyAnomalySystem : SharedInnerBodyAnomalySystem +{ + [Dependency] private readonly IAdminLogManager _adminLog = default!; + [Dependency] private readonly AnomalySystem _anomaly = default!; + [Dependency] private readonly ActionContainerSystem _actionContainer = default!; + [Dependency] private readonly SharedActionsSystem _actions = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly BodySystem _body = default!; + [Dependency] private readonly IChatManager _chat = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; + [Dependency] private readonly JitteringSystem _jitter = default!; + [Dependency] private readonly MindSystem _mind = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly StunSystem _stun = default!; + + private readonly Color _messageColor = Color.FromSrgb(new Color(201, 22, 94)); + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartCollideInjector); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnCompShutdown); + + SubscribeLocalEvent(OnAnomalyPulse); + SubscribeLocalEvent(OnAnomalyShutdown); + SubscribeLocalEvent(OnAnomalySupercritical); + SubscribeLocalEvent(OnSeverityChanged); + + SubscribeLocalEvent(OnMobStateChanged); + + SubscribeLocalEvent(OnActionPulse); + } + + private void OnActionPulse(Entity ent, ref ActionAnomalyPulseEvent args) + { + if (args.Handled) + return; + + _anomaly.DoAnomalyPulse(ent, ent.Comp); + + args.Handled = true; + } + + private void OnStartCollideInjector(Entity ent, ref StartCollideEvent args) + { + if (ent.Comp.Whitelist is not null && !_whitelist.IsValid(ent.Comp.Whitelist, args.OtherEntity)) + return; + if (TryComp(args.OtherEntity, out var innerAnom) && innerAnom.Injected) + return; + if (!_mind.TryGetMind(args.OtherEntity, out _, out var mindComponent)) + return; + + EntityManager.AddComponents(args.OtherEntity, ent.Comp.InjectionComponents); + QueueDel(ent); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + AddAnomalyToBody(ent); + } + + private void AddAnomalyToBody(Entity ent) + { + if (!_proto.TryIndex(ent.Comp.InjectionProto, out var injectedAnom)) + return; + + if (ent.Comp.Injected) + return; + + ent.Comp.Injected = true; + + EntityManager.AddComponents(ent, injectedAnom.Components); + + _stun.TryParalyze(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration), true); + _jitter.DoJitter(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration), true); + + if (ent.Comp.StartSound is not null) + _audio.PlayPvs(ent.Comp.StartSound, ent); + + if (ent.Comp.StartMessage is not null && + _mind.TryGetMind(ent, out _, out var mindComponent) && + mindComponent.Session != null) + { + var message = Loc.GetString(ent.Comp.StartMessage); + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chat.ChatMessageToOne(ChatChannel.Server, + message, + wrappedMessage, + default, + false, + mindComponent.Session.Channel, + _messageColor); + + _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); + + _adminLog.Add(LogType.Anomaly,LogImpact.Extreme,$"{ToPrettyString(ent)} became anomaly host."); + } + Dirty(ent); + } + + private void OnAnomalyPulse(Entity ent, ref AnomalyPulseEvent args) + { + _stun.TryParalyze(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration / 2 * args.Severity), true); + _jitter.DoJitter(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration / 2 * args.Severity), true); + } + + private void OnAnomalySupercritical(Entity ent, ref AnomalySupercriticalEvent args) + { + if (!TryComp(ent, out var body)) + return; + + _body.GibBody(ent, true, body, splatModifier: 5f); + } + + private void OnSeverityChanged(Entity ent, ref AnomalySeverityChangedEvent args) + { + if (!_mind.TryGetMind(ent, out _, out var mindComponent) || mindComponent.Session == null) + return; + + var message = string.Empty; + + if (args.Severity >= 0.5 && ent.Comp.LastSeverityInformed < 0.5) + { + ent.Comp.LastSeverityInformed = 0.5f; + message = Loc.GetString("inner-anomaly-severity-info-50"); + } + if (args.Severity >= 0.75 && ent.Comp.LastSeverityInformed < 0.75) + { + ent.Comp.LastSeverityInformed = 0.75f; + message = Loc.GetString("inner-anomaly-severity-info-75"); + } + if (args.Severity >= 0.9 && ent.Comp.LastSeverityInformed < 0.9) + { + ent.Comp.LastSeverityInformed = 0.9f; + message = Loc.GetString("inner-anomaly-severity-info-90"); + } + if (args.Severity >= 1 && ent.Comp.LastSeverityInformed < 1) + { + ent.Comp.LastSeverityInformed = 1f; + message = Loc.GetString("inner-anomaly-severity-info-100"); + } + + if (message == string.Empty) + return; + + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chat.ChatMessageToOne(ChatChannel.Server, + message, + wrappedMessage, + default, + false, + mindComponent.Session.Channel, + _messageColor); + + _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); + } + + private void OnMobStateChanged(Entity ent, ref MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead) + return; + + _anomaly.ChangeAnomalyHealth(ent, -2); //Shutdown it + } + + private void OnAnomalyShutdown(Entity ent, ref AnomalyShutdownEvent args) + { + RemoveAnomalyFromBody(ent); + RemCompDeferred(ent); + } + + private void OnCompShutdown(Entity ent, ref ComponentShutdown args) + { + RemoveAnomalyFromBody(ent); + } + + private void RemoveAnomalyFromBody(Entity ent) + { + if (!ent.Comp.Injected) + return; + + if (_proto.TryIndex(ent.Comp.InjectionProto, out var injectedAnom)) + EntityManager.RemoveComponents(ent, injectedAnom.Components); + + _stun.TryParalyze(ent, TimeSpan.FromSeconds(ent.Comp.StunDuration), true); + + if (ent.Comp.EndMessage is not null && + _mind.TryGetMind(ent, out _, out var mindComponent) && + mindComponent.Session != null) + { + var message = Loc.GetString(ent.Comp.EndMessage); + var wrappedMessage = Loc.GetString("chat-manager-server-wrap-message", ("message", message)); + _chat.ChatMessageToOne(ChatChannel.Server, + message, + wrappedMessage, + default, + false, + mindComponent.Session.Channel, + _messageColor); + + + _popup.PopupEntity(message, ent, ent, PopupType.MediumCaution); + + _adminLog.Add(LogType.Anomaly, LogImpact.Medium,$"{ToPrettyString(ent)} is no longer a host for the anomaly."); + } + + ent.Comp.Injected = false; + RemCompDeferred(ent); + } +} diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 853b4fbc29d5a8..57847551aa70fe 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -202,6 +202,7 @@ private void HandleGibTrigger(EntityUid uid, GibOnTriggerComponent component, Tr args.Handled = true; } + private void HandleRattleTrigger(EntityUid uid, RattleComponent component, TriggerEvent args) { if (!TryComp(uid, out var implanted)) @@ -230,7 +231,7 @@ private void HandleRattleTrigger(EntityUid uid, RattleComponent component, Trigg private void OnTriggerCollide(EntityUid uid, TriggerOnCollideComponent component, ref StartCollideEvent args) { if (args.OurFixtureId == component.FixtureID && (!component.IgnoreOtherNonHard || args.OtherFixture.Hard)) - Trigger(uid); + Trigger(uid, args.OtherEntity); } private void OnSpawnTriggered(EntityUid uid, TriggerOnSpawnComponent component, MapInitEvent args) diff --git a/Content.Shared/Anomaly/Components/AnomalyComponent.cs b/Content.Shared/Anomaly/Components/AnomalyComponent.cs index 724dfd38d2f660..e6228b5fb0d77a 100644 --- a/Content.Shared/Anomaly/Components/AnomalyComponent.cs +++ b/Content.Shared/Anomaly/Components/AnomalyComponent.cs @@ -1,6 +1,6 @@ using System.Numerics; +using Content.Shared.Anomaly.Effects; using Content.Shared.Anomaly.Prototypes; -using Content.Shared.Damage; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -16,7 +16,7 @@ namespace Content.Shared.Anomaly.Components; /// Anomalies and their related components were designed here: https://hackmd.io/@ss14-design/r1sQbkJOs /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] -[Access(typeof(SharedAnomalySystem))] +[Access(typeof(SharedAnomalySystem), typeof(SharedInnerBodyAnomalySystem))] public sealed partial class AnomalyComponent : Component { /// @@ -184,21 +184,21 @@ public sealed partial class AnomalyComponent : Component /// /// The minimum amount of research points generated per second /// - [DataField("minPointsPerSecond")] + [DataField] public int MinPointsPerSecond = 10; /// /// The maximum amount of research points generated per second /// This doesn't include the point bonus for being unstable. /// - [DataField("maxPointsPerSecond")] + [DataField] public int MaxPointsPerSecond = 70; /// /// The multiplier applied to the point value for the /// anomaly being above the /// - [DataField("growingPointMultiplier")] + [DataField] public float GrowingPointMultiplier = 1.5f; #endregion @@ -252,10 +252,13 @@ public sealed partial class AnomalyComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("offset")] - public Vector2 FloatingOffset = new(0, 0.15f); + public Vector2 FloatingOffset = new(0, 0); public readonly string AnimationKey = "anomalyfloat"; #endregion + + [DataField] + public bool DeleteEntity = true; } /// diff --git a/Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs b/Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs new file mode 100644 index 00000000000000..e88cedb18ef2aa --- /dev/null +++ b/Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs @@ -0,0 +1,72 @@ +using Content.Shared.Anomaly.Effects; +using Content.Shared.Body.Prototypes; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Utility; + +namespace Content.Shared.Anomaly.Components; + +/// +/// An anomaly within the body of a living being. Controls the ability to return to the standard state. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), Access(typeof(SharedInnerBodyAnomalySystem))] +public sealed partial class InnerBodyAnomalyComponent : Component +{ + [DataField] + public bool Injected; + + /// + /// A prototype of an entity whose components will be added to the anomaly host **AND** then removed at the right time + /// + [DataField(required: true)] + public EntProtoId? InjectionProto; + + /// + /// Duration of stun from the effect of the anomaly + /// + [DataField] + public float StunDuration = 4f; + + /// + /// A message sent in chat to a player who has become infected by an anomaly + /// + [DataField] + public LocId? StartMessage = null; + + /// + /// A message sent in chat to a player who has cleared an anomaly + /// + [DataField] + public LocId? EndMessage = "inner-anomaly-end-message"; + + /// + /// Sound, playing on becoming anomaly + /// + [DataField] + public SoundSpecifier? StartSound = new SoundPathSpecifier("/Audio/Effects/inneranomaly.ogg"); + + /// + /// Used to display messages to the player about their level of disease progression + /// + [DataField] + public float LastSeverityInformed = 0f; + + /// + /// The fallback sprite to be added on the original entity. Allows you to visually identify the feature and type of anomaly to other players + /// + [DataField, AutoNetworkedField] + public SpriteSpecifier? FallbackSprite = null; + + /// + /// Ability to use unique sprites for different body types + /// + [DataField, AutoNetworkedField] + public Dictionary, SpriteSpecifier> SpeciesSprites = new(); + + /// + /// The key of the entity layer into which the sprite will be inserted + /// + [DataField] + public string LayerMap = "inner_anomaly_layer"; +} diff --git a/Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs b/Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs new file mode 100644 index 00000000000000..e4c398c9cc59d6 --- /dev/null +++ b/Content.Shared/Anomaly/Components/InnerBodyAnomalyInjectorComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Anomaly.Effects; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Anomaly.Components; + +/// +/// On contact with an entity, if it meets the conditions, it will transfer the specified components to it +/// +[RegisterComponent, Access(typeof(SharedInnerBodyAnomalySystem))] +public sealed partial class InnerBodyAnomalyInjectorComponent : Component +{ + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// components that will be automatically removed after “curing” + /// + [DataField(required: true)] + public ComponentRegistry InjectionComponents = default!; +} diff --git a/Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs b/Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs new file mode 100644 index 00000000000000..a1ec7cd3973bba --- /dev/null +++ b/Content.Shared/Anomaly/Effects/SharedInnerBodyAnomalySystem.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Anomaly.Effects; + +public abstract class SharedInnerBodyAnomalySystem : EntitySystem +{ +} diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index c3d6591b7252de..9a0cde29988cb3 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -1,13 +1,10 @@ using Content.Shared.Administration.Logs; using Content.Shared.Anomaly.Components; using Content.Shared.Anomaly.Prototypes; -using Content.Shared.Damage; using Content.Shared.Database; -using Content.Shared.Interaction; using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Weapons.Melee.Components; -using Content.Shared.Weapons.Melee.Events; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Map.Components; @@ -21,6 +18,7 @@ using Robust.Shared.Utility; using System.Linq; using System.Numerics; +using Content.Shared.Actions; namespace Content.Shared.Anomaly; @@ -36,6 +34,7 @@ public abstract class SharedAnomalySystem : EntitySystem [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() { @@ -145,7 +144,7 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone if (!Timing.IsFirstTimePredicted) return; - Audio.PlayPvs(component.SupercriticalSound, uid); + Audio.PlayPvs(component.SupercriticalSound, Transform(uid).Coordinates); if (_net.IsServer) Log.Info($"Raising supercritical event. Entity: {ToPrettyString(uid)}"); @@ -169,7 +168,8 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone /// The anomaly being shut down /// /// Whether or not the anomaly ended via supercritical event - public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool supercritical = false) + /// 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) { // Logging before resolve, in case the anomaly has deleted itself. if (_net.IsServer) @@ -186,9 +186,14 @@ public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool s if (Terminating(uid) || _net.IsClient) return; - Spawn(supercritical ? component.CorePrototype : component.CoreInertPrototype, Transform(uid).Coordinates); + if (spawnCore) + { + var core = Spawn(supercritical ? component.CorePrototype : component.CoreInertPrototype, Transform(uid).Coordinates); + _transform.PlaceNextTo(core, uid); + } - QueueDel(uid); + if (component.DeleteEntity) + QueueDel(uid); } /// @@ -458,3 +463,5 @@ public partial record struct AnomalySpawnSettings() /// public bool SpawnOnSeverityChanged { get; set; } = false; } + +public sealed partial class ActionAnomalyPulseEvent : InstantActionEvent { } diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 6f18510d17b9b8..75cf22aa4fe586 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -231,3 +231,8 @@ copyright: '"beep_landmine.ogg" by kaktuscsc of Discord for SS14' license: "CC-BY-SA-3.0" source: https://github.com/YuriyKiss/space-station-14/commit/971a135a9c83aed46e967aac9302ab5b35562b5f + +- files: [inneranomaly.ogg] + copyright: 'created by waveplaySFX on Freesound' + license: "CC0-1.0" + source: https://freesound.org/people/waveplaySFX/sounds/553744/ diff --git a/Resources/Audio/Effects/inneranomaly.ogg b/Resources/Audio/Effects/inneranomaly.ogg new file mode 100644 index 0000000000000000000000000000000000000000..43fc40357f2035e44587498af0aa886803b2ec5a GIT binary patch literal 46892 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 y?bC{%Tv^7p@8wU literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/fire.png new file mode 100644 index 0000000000000000000000000000000000000000..a6fcde7a1841bc5fd50326ba2b168d9dd61b3735 GIT binary patch literal 1007 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&DaPU;cPEB*=VV?oFfgz5ba4!+ znDh3|`8?rpiDM718y`}20|$MvXa$f_HT ztu0qHoF;TkS&{kXNX4N9v3ZVRn^)RSHZJ{Cy+rxuD$D07O~;`8P)UU)7$gY^^Q-Pbn4h;Z~cb1Zec;bb*e_%i8pZ#HWxbgPO zZ@lvzmVV8@vp>*$?uEA5Z*x^Azl@)^w?rWR&ClnV2bev}RrgNZvdiO#(xJ6|Dw$6o zF0VkH6pl`SN?r^ZCme+l{Zwm^o;lo~66vwD<>? zpf{2KZ*1OoMNd6m_3Hon3H-qHKr$#;8T5^9+TGXg(fgL*EexUeY|or^M<=8yjFRx^0u06;x&Eo zpSG!2dic-tz4`ui-I9gNd|$ZS{Ca+N{1Mp=SF9Vtjl+UW>dH5X-^se`w|TBm=dF3%FOfK)$<=yo$Zr+m?ZDD-N-)sJ{ z{qnlcyi;QS@A>I!lCUWA`ubHZ-{tj9HZF1e^ReVE_t}{;cK=i~UzjHQ%I{wNGJW|^ zt)2fWKLd?TNwXCG5*7JvMNiGtKfh11V-Kg8%ropUO5ufK4=98a}O+?=Q>?{Ge`IO|BHAl mbki>yc5nDngUy`}_#DXiF)u5*PpgDXXhU z`~9TuAO4{Dz9)FzQQi-c2lkc-puAgU1^~opR>;dY9%at6yMn%=6vVk$Z$ahQC%+=! z420w*WHC$ZSnR>yB=qaZoCA_UqDK1N@i4B^5#qfcc3L!4p;}F$1gpc349))H%z6_D zjpK14sBz2httUER<3Btz@4@kLad9ZM-`7F!Ax0xrCZ z*Afv#O!o%}vzZ`Rz&NrWC2vGm(p`NZ0Prc|38QZ((N19zf-B^>`xo0nMhc{jAM@tI z9V9I=I{xz$)rRy$|`BDneVhp8PBf&XJ9UM{vJ7)X!7({L;h-TI)BI|^q{5n zppwmc%*odZk1tZ`H~KoUqb+3?pCl|%4mY(-98cLWDm94{slR{K&P^v~7>x&ip)i%C zo?W^6#$Pz7_VQlF?pp#`yh97ptb!NL>@@7PZ<`OD>U3KjMS#$SfuE&0fB+@eBwUS;7`I)ae*97>+Zb6bsbI}>e%6y2F3Qizw082T_(orZVMCcgMM zhs~@I)iKVv+Wa?h8GIR{4cUoL=H=K^sj%+7d_i}7 zoRo*XSYo|Qy-CZBt)AKv?Rfcy3hA(ijH)1VpE}wo=S5^D9H7-#)-BUsX!oua%aKYE zalPq6Peo|b*x0Pxt0tGe)+EX0-M-k_`MiAa+8f*^btQLO-^M&o&sY{^APj@oGHN!Y zU>6L*{^o$*hj)VXNe}LLY0d4jDuP%xLr+%~Y!0YdFKW_s>|`eTvDG01t^Zh~0H?lD zgE`qM14dM{ODkdKJLI;yD@u`QZT)9{LEZ5KA2 zji@pxWWE_&VePn<=|Ck)_WPzXzoeM}T!@kFWj>GrhwqS9L{vb&G-12$(pJH0mJ_s! zjEufM1G}PY2#=DSa4Ts8jwB6I;6%ie7=;uJ7Y!lgp(ju+=R!|=yAG+X%>CA?u z3EAy_=w|zUb{|mG3tdpVpS=Zj0KK||UCilbFl~z-NF=T7LrQO1f7hO&vS4wUd^mal q&t=oE!LUcCdT>8!{Hr!Cwk1g;k`7OgrHbr7Z@|g|jVwpp{^Kw7SjNf# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flesh.png new file mode 100644 index 0000000000000000000000000000000000000000..6e178307c33ea27caa13f9978a8337668a3eb2fe GIT binary patch literal 1342 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora.png new file mode 100644 index 0000000000000000000000000000000000000000..70e369cb02ba37b76aea647060974a8a7517d27e GIT binary patch literal 1868 zcmZuxc{JOJ7WQfwr3TLsOO$3>wU**YDPsC8%~2FnM3FwNtudCWwUIDhE!9qF82d7% zRbiy4TGAw@53vNbH5H9iE7FQIB(?l1%gem?=j%P^-h0ly_uPB#_uX@gFZy|_s~V^( zC@84I&wB*Q{g7O9Rg~p6;$JZ+x%*pcp!Ye2&S~&R1%+>w;T}K!lv&4T!Tb&3dbDlY zNmV93xaf|uzWMC{Rqs=ArB?$kdfq61@mxXG>~Y7f!$l1*l5!!=$1Mn?AZCzRskxsW zcb%YeEFc_@hwydw5u=k#(pl2ke7wN>4#Z@IEnceb)#m7H$tNp}HL>Dv*BbKvNt#z3 zKZy+xVY}7YPT=!o{jup)_i&9vz#=y(v7=C4Qp`wOlC`8~8p+aIb&ev#3$d~T_JW|( zpbUy#@pv@LkjK1<85KmLWla()^{VUUZdft2u^sTg{tpg-Fuh$D z?yQE%-uJ;!kb_kTY)_cn2LrMPw;_;wtV=-lo^K-YlReaIW%U67twdfsW8g1wvBu6} z2grk!%k7?PL_-T$wdGwD8)kVlN3<93Ecitbw4h9fPciR&c>u zc!40&KL>`Q)G&S>HcpUZaF4b4SVWadE9G61<4gUO2)u4!d4C3n_n890X? zW!~zk9HE1Zt5a-hBG8U|)i_maGkRvDAj(p(&yHmI$hYwL?m>E$p^xsrXZuYhiJ@^) z&QH@{SW*5z*6x*UYb1JFhhgRp(klU`jNJTR9=2kiKqTz5%T@w@K2M4W=W76^6}q$T*=tp&o25MbQu4s;=}1L^E={u5w;>pZt`sA!=I9*8( z#h`Cy+ZQpqaTEEm54>E-DI(dcuG8J-jb57{_2-L(cxZ0pS``WFyQFf#x zd0qR;83RT`u*gINH~TZpHa=OZX!owcInau|8T4DY=x~eL)~a8isIWQ3I#eyjx{59s z>2089z0Lm_)1lr*pU?YTTHb>R`K8x{yT5!InrpXC-3nqq8cwe^rX+|aC!V#5kY28s zKlp+{Sv(g%Fa|{m4y2Rx45v>7VNYb=CfarF7*9QPH_s$n5!k>+MhZa^q9y1Uc4b(q zA|X0cx2THWpz;`tGBUTdzH67fCws`P#2nQH)@%YX3q|QPsfmMd9NCX%w{DgBQ)bX# zp?Bzo5Wt=rKgo8amJ2`d{Vd-&fs2SYUa#Q=)>KwJqVnYr*c4%`gqF&X;QE^5r1W?F z2v=PzmWHSD?K=-nouhn*7Oc5ggmNs{bvKOx$hb~t1P=Q=0WJR!K7Ljkw}z~49vLJr zk$e|{cqLTCU8*kMml@wa%{X0E5rClRcPL%<(SVObvA~#MH*98fXfXU=m(gTa zZQp)f0g4-OA$LFo&~Y%O`Sj-QWzCtC>c)km#%i{d{fUX0&-(5fcl!r6y<(9{sJyYb za4*Ba)EyK9fY_x4mV8{Do+|U{u?y#%OmUK4my_DUR*#sG+1vbn#0Y>TN`3leUjgQS zp|>ZN-h^r_*Z;;Cv|Ym^U+vsz)VP?W+?{$x6PfSs2DphvI%YmJYsulVM?UrFC+bw4 zpiT(0N=lIrja^|ou2qQ9iik)=&BVX#G5FWf-YfjmV##ud{NrY1E1Ggh zEx=BUW;6+Xs2W&bZXBQbU?tn#h%{JkoqHW|kGcA8VRT;%edf>E-EcF&O&B(z!N||| zg*gr1n+q4PuD-N1^_(8rE$_?I{!fZ$U|f~Vtw7x-VlhLSD*98cQBCvz(acqpDVj3p V!`4n{*8i1-d-{2Fp1bnPe*hXXv(*3q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/flora_VOX.png new file mode 100644 index 0000000000000000000000000000000000000000..97969116a97829de4c31cae8825cf0dd1f59e4b9 GIT binary patch literal 1952 zcmZvcdpr~R8^cWL@-d(^NN92LJ$? z@UzZdiuzV@Qq@!x8JHdsttd(fUT#hR+_3R70HAse?tI!ixq9sr(Zk4Z59!N--cBuR zCvRJ|^M`(W0_dze{oRwgY}-rfd;qBUK6%P5xT)g4LER~*c$Zcui=){;P!jJR z&$i9lvwSlII}c9Ykn||eZ#NwuM5QFHWA~Pf*P8B7dpO#fSk_=gEjbYl_ehx8}d0HeoEV7c4(|m5~-kvhN?l>@4 zr{DsN;pkXGobAEA9(rW}J)fc<&8f}IY$dIOi9vzK6c>%Ig*l-*4V%Q%fxQA(q3ebAg$VQd7EM!Pa4s;x)vKTOaluQeOap% zG5Of{EuDuCU|2?{JP8BRMjA8yW$plT41FSI5JtzyxU=O;-;bT1yi>8rrgDEjXg{3C zAPzsopk>ez`c*9Cz=6JX-~R+6m>cdMQ?gA6pWm(q+rrV>7ip;MgO?bPVqt7hRw62* zZPynzEavI8fNO=U`O3}N9{nOF2XA6TN>jF$R$Pcl63tLKJC^qM&-RZ3b1nODvE6!} zAS;}uVRy&+V1Gu~iOB5))nNL2M8HFh!;u8ECe^cDbeq2u8?%kFaIfCJ`tsA_>k*-X z&Gv#v(X8T)H|3F9r!m&g&ob;#0GIXS^W9rmTu5Oh>*DoKm`N;*Oskr0T8Ad1O%hT4 zvByJ+L93Ic1PGm3UIg4K`)N??8p9!Pu9-d~ivS_yqfAD^gK%T9j~SeRt71inEFavK z(j#V#oTu(Js^`9*Ng&gBfC1ClnN*~4?-3#K6|pi>nbj)iNlxssSwsTp*BPE~+xqwS zvd+NCj;a4D^UauBKGbY+rFfc{ZQ^biepQ$95U=-<+(Ir-iWEOywPb|*`U^wL607}8 zpaJ3boZwM!mEmg>4$Xgx6cQlitg?am%DX3GvfL>{jWLBq=CI4RnHsww&;+R{?DOa* z67Hqv&~_#_@blE08^5X2iziSo%%D3~b=Hu~44nV75>*17+BcSNhh>jmbT}s{)U{%*Jq6 z&VUsN=23RTKq&uUf38NpR^xh+%;gjy6z*2b5MmJTrTA@&p{)y>p=m`X3#&$+xCKx# zV?U}>JiX$bROeBAgBpCooSjj@1m_4C=J9T-o{h*6xavK!1Y>5D+^c|`!-aw1E@ZO4 zACAlW{2VM}8O53tC+z2qK&FVQ0FAD&y?21e>uwd{sbC!K6Dwo9BmZY}iUU+PD5IWl zP@(@=A%Qdr|EmlcA`%QvHWuVKISWegLy`@D>tVVD%_cn|fJHMbXcl41s)S+^O8G{g z8e06-)>ogiG+dFnAvbZdsoR9iY0g+^S5F*0{*Yy#kL(DDjo4Cc$o><(fRX}})x(zt zFr6aL5cxN0{!2JD^snbfuHbPhTl!X3xazB>3i|atcDd`==N2Piej||%1|7V2mq!^g z(AFk?R9nFT6H%^Rw;abM-4r(Tm8838Qxd!zt`Fmi^WeOkXVsEwMb_-KBU-pDl5Q3y z{%#sSDlk2)!+HGw^;lPn4k~6MuozlTJg-|)Z$3DgvJ07iY+Yh-3>L@tnU1?|(xSo< z+Qv-JMKuhOlRDvjx(G&~zV;#J?qSNLV^@>wNZ5bbn7GLK8MFb~qF1EobWzMF%_$il z6yjTym%geVt|OCCo8hWj8Ai9R5Y9g&cC7FGh&zt4pOuN*UzbM9`#MF6tsLd==EVry z)&HpGb^wzjp6tlK{$Zag|I$AIZ*P7_MX}tM3o_W0y{yXT7>Wf_?piE_8>}0I5v!HX qH5tEc(+}cesTp3SNWeEB+i$@B@T!;4Z2s{1N*nIt;f!+%zW+Z{QQd3+ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost.png new file mode 100644 index 0000000000000000000000000000000000000000..4823cb5a6f2f7edd7a38ad837c42d8bec339c367 GIT binary patch literal 2650 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 Nz{1oDU4rt6{x604_oV;; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/frost_VOX.png new file mode 100644 index 0000000000000000000000000000000000000000..346cad09b1065c067a96bc22b9d2e6b2ee6d4764 GIT binary patch literal 2718 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 SQijm~5wNpyv?g16#{U!Z-Ghh# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json new file mode 100644 index 00000000000000..4e069d0cd90bac --- /dev/null +++ b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/meta.json @@ -0,0 +1,643 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Created by TheShuEd (github) for Space Station 14", + "states": [ + { + "name": "bluespace", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "bluespace_VOX", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "fire", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "fire_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "flesh", + "directions": 4, + "delays": [ + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ] + ] + }, + { + "name": "flesh_VOX", + "directions": 4, + "delays": [ + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ], + [ + 0.8, + 0.2, + 0.2 + ] + ] + }, + { + "name": "flora", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "flora_VOX", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "frost", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "frost_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "grav", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "grav_VOX", + "directions": 4, + "delays": [ + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ], + [ + 0.3, + 0.3, + 0.3, + 0.3 + ] + ] + }, + { + "name": "rock", + "directions": 4, + "delays": [ + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "rock_VOX", + "directions": 4, + "delays": [ + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ], + [ + 0.9, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shadow", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shadow_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shock", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "shock_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "tech", + "directions": 4, + "delays": [ + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ] + ] + }, + { + "name": "tech_VOX", + "directions": 4, + "delays": [ + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ], + [ + 0.2, + 0.4, + 0.2, + 0.4 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock.png new file mode 100644 index 0000000000000000000000000000000000000000..770e4b8d2f80570a23e6088fbc64afbe3fdeead7 GIT binary patch literal 1398 zcmZXUX;ji_6vintJvQQ2V`WMuEtV$1G>j3Eg(Btwb8FnvGDSr*mqdesHb>JOGc|L| zF>_0EU&at5b1PhqQfUxkDS1@TT=B00Lo=Uddd|7;bI$#A@43I{z3WK8X>0A&0)ar< zcss0<%5Qut&CRO!)ya!om2HT0!kq?H_U)Pkfz)AmthGx_u2gt5(CGYjjjxQex!Kpb z_X7@YHuNw^yM%JI!H-WS6#nqP%I+bRc9}5iXPYarqfUVnfwU%}9l}=k> z?Qk%7>JscoyVk)pixNC={3+4O$G_|0>cVfgSIBzf8lCtiQ)hxgIvbN|T^GBI+ zRTarFl5^6aazx#0l6p6yCI~I^W`xQ%1`D*I0au=llO+rg=U3<+=NhXWNznF?tzSiC zqT}FPMX*BEtt+#^chzldQFMOj2|M3Pk?5`1#wbI7Hva+mGD;Rxr-@y45B?zOw3vH{ zg};0eh|yMR{?x=*>vEUkm7_j9yAu_EoM@NurN}g!SNg)sQQ#W1Cm$9xj zhNbY@C{a$p~^arxpvFv96e~CO{pf`{eS@F15#n?|nwU!Q+ zNlY2~Xe2L~9WA#WhfJ&MeWU5+b;C;S7S6kov(>`g=LA6LYYm^UJeyAaMn40o9 zn$El(hEV>w>dL&+km;&JWlz=4^E=|vK1-tp?z1T*1$}+lK<__F4SSN+@|PjJHZMOa z@$-f5*U_p`>Eo1^t50J$M$?{Z07b?ju5a?_F1Q|p>cUsTgU=-eY`2E&D(_Yw;J}pm zQ8HiPWyKBMEA9r^*384C=D?w=dKD`oGg!_? m`JgawHNH#0KY<`*F+e(|1(%kpd*f9fDF|;vz*e62z4bREM%!Wl literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/rock_VOX.png new file mode 100644 index 0000000000000000000000000000000000000000..b11a9182fb7fa91a8d13b392cbe6864f59a8633b GIT binary patch literal 1398 zcmZuxeK^wz9REpqsV8!Y%M`tMNmiQ5?Us!p#x)X&^V$pL5K}`N6Lqz`rRPe_%aJP; zTVaN6mP2USa+EBNoGq#`);6=Zn}6<}>$&gqe7~RP`#j&jKA-RBLkvKBuU~7i765?t zC?C&2EoQH@fu44D!DHB3&`AySMgnAxn_cKAGhy7XIug^LQxba!<;Rt7z?vZ4jY}iwyY$Sa zZgfWP4SaetAvzT^vVYfkBjMYWMshn$%=}3z-?B+inihLOEn-gSZ!kIF_=^v_0LDFC zec}!%trGQ^-&>zQ#*l?K{&qtP%Hd&6q1F44E<>H{h2lN6C23EaZi!DdJ+LKgPcj7Z zjj-1A_G?p@I?rb9kkI698|S5&h2|jHf?~?JBT?2o?cWWCz8flH(cXx}pK0I_jT&9I z+6C1iu5$Bpl_)UllGoY%5ig4oDtk%q9?8vdbdx4XC;XbDDZ4SiF;5ov@H+SzDWMnSrOwSy7`hi9N(`| z26f+I)!U%F5*`Le2lTw_XP6Q~O<<)ZVQchmQzA4eVh~h*Aj*(egOJsF<7lk!Ig(7sbFLSnyg)z3yxZf=+FXkW+0co zsK1JstCBQJ6}}y^CI2HF0{}m^FMH-Qb#g*pk>kHir`b$EC&T1aNW73VpOe)Sla=T| zNsr{|SHBjMrnUoL5OheCOV#zS3hkUW(e^yqUWiYdU_DQ+xBi4Uo;t(vHJar|k7}y8LczkS9(i}AhG8`_>Ur`ulBz)&E^ghGz zQDPWuB4c-Q)M}oDKC$7xZQSWS9Xl^K7vK=6b_#OdUF6CzTx3>VAwA5R_evg1tejDs z`quJQ+@GH`-RjCKP&ld1pkavEGt){tU3;?mla}-lrdlluiH);ukirudw}ir2JVh&3 zr9A8=$anyDR+Tot7Bhzgn+Fi_obLttpX#6+iC^)$vf_^>X5s`iG~A@Z*6!mjKd*!o z8eE@=X(_3AnMaq5_PrS0!;|P26Kdo-Tayr-+J_3C#Sz)#=F#o$C&lLsR|pB@?k=Y^ zgScrUnjVq2)A+B|nMxhTsAew74>GtDdH{N_3~|uX^%Y@0iGA=k;e_gWndjrHx&p!A z5QlPr|Qq0$M79#TFb@ZmIuh? z{F(?BR=x5X8gE>Wqi`8CKv9@Yn)%kgp35zAp#_WgO0hd)&kR?303N*rZM+0^lP#i8 zhT~g;ve^Kj=54==7d=ae2VTt{POQNT`MjV{Bk(1j9GtoMe7L7rN0$y(e4KsanQs1qDM5Q?@Tf)l+;e$W z_EDf9?6KozSwlOWO9z)HFfEM`s(QEPJo}l(1K(@?et92bv*%=B2>$$J;r$P-+i_Mt$A)E&TONAN%`r{$KiQcYXh92D6>BzsXNNbHA=?{_NYYzx|My^>^;xo45Vn zU;fsA-v5>1Z}aWfGk@>2=1;b*owUT#&VHr$x6fz4-oJlycIn&ik_TKTx!UeO_3+)n zub;zt^Or^8f#o&YZ~ppw9mBzaM8;ZH}pZcl4E2&&~b8p||7R zc>lFudaZFafA`YgwWXCz>sr6Dn4Epi{$K6C#G2F3-&uF;W#8~cc!h}h0TX+3U^o*1 zQ$8$tFTJO#Fhn(T|16cWule15?|;8K-|hcPhU^uSY`j0!e2wD$Fz=V}OMc6S(&?-` z7wbQNyjyeXuZZ3M+F#B*36oQ1K54)DI-~#pw*C7zn_KU-@Lu`v?AuZ=a8OM8`(?*J zXTAp@omcINS?qoFk3`#r5;NSh`e={pCe_wPte*Zt`a<>~V_P+RXef|AX z2J<3)tG^F_t+o|(mp`C(^3#_`I>(=@mvZH@hV7c)RIRwq`9DzTw{`Vq#b0yTHq48E zTJSv~yMr|+Y5#+`is1X*g|<`fb!NT#tC;)bTh2Bn?d%iM3obL*EwkRhjT)rE-}LV< Vp6pz5Th$HZG*4GQmvv4FO#q9YeJ=n2 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shadow_VOX.png new file mode 100644 index 0000000000000000000000000000000000000000..6efb246ac1889f38de9d82fefbd4e0ce5b43fb5b GIT binary patch literal 1002 zcmeAS@N?(olHy`uVBq!ia0vp^3xK$RgAGXbBqvD&DaPU;cPEB*=VV?oFfcFiba4!+ znDh3|K`-f8iT01n=Poi4_#ni^%BsJx{9hgJ9b!|m(YAJ*^NE3~og;;b|C)~sByx^2qO`WN-DYAO!=+dt#sEuIR_EsuXY z>NG`!7>0((s?9c-X&V{5Vk1!5_pkP)b~XwB=bw*o;I`;reYC>(*ZlqUl1H*%O*uN} zpUbxr-_mOnjQ;QYxBOiFg@5OZ7?=%M;*OfC%=_iH{`A{eyIsrt63c5>-+ft{SaY1W z|Gb}tjjhtPkaXUM-}KV0=Kue;WZfSI9)ACR3p?w^!vE4|pU?YyKlXms`N_7g8P7Dn z-tj4r@$W&^-?OV%e-<%V%pmeUZhx+!9mCJ7XIZVKZ)a~@7RCSI-?MvJ^#vzW{vFSs ze@^oIl5@-x-sj}3kG&gnV8{Q<)j`>I1+w<<-~XL|qkq@;|I>A{|K_NySaRj7$z1!n z)2;q1rd2ZO^}J+jG0^#Y`;Sq?mh-MWc$VW&=q4t0J$@QN&cNhfa zJ7g*HX#algc6Zt*hGoxqKUCx~U=Nh~@7L=U;wH?j?$3L7chb}A+y19MW7a!#X0N;X z_q>yzvTy%4T5RdY`o((hy9O5H?-eb@@2Bb1v%WZfvwdpX^hzeS1uwqr`mNOVm|yQE&@*dyHB9;mOBE`!s>Rdq zEuB$4qv~DKtC`*1ieHbcTs|*;y1VhbvlHVpua+`Tv1>S8#XjvRuL6cI#7^v={PKP7 U5=RDMVCH4;boFyt=akR{0G7Mzr2qf` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/shock.png new file mode 100644 index 0000000000000000000000000000000000000000..acdc87a291c1f3ae96bef140d18330ebc0273608 GIT binary patch literal 879 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech.png new file mode 100644 index 0000000000000000000000000000000000000000..0611fa8a2a092a82bedac5ee8b2aebd1d0ada50d GIT binary patch literal 1241 zcmZXTeN@tC6vwepo14;UGf&N6q`mD}*^A9UK*chbqG?8oP09?LE!+@w;@d_>OPiW2 z-z7}bFhwaa@C6l@PKKB-vGV;u87K)E7$Ue||8=%|&U5c`?{m+2p6ByD_qPz7zrEdN zI}iwDA8^bs6o^?L);b%&i_vE#K(L~O`ul*S!-8amt4EfjgRflA=7p zitRSv{1_AUSg@-n-1YfpsiZ{UVp^rgeoCMW96-`MqyqdJ=uIanKR#JF@U~Qglefq5 z!=fMNLi^d~zpA3^u~X&Cvs;MWS428~1G{V!?JPdn)+x;N-=5{+H6YSgKgBU{&wtAw3D97(mIFH?URS}35#X`cB%+@vU6s%>P7MCK!WLp+g z+FpgssbEChw%p(&YiJ;=sg&cKGD5c66#t-s%=UO4WG0v5r?`we#<7aV#l5hAs(e27x16hn$5{qv zaty>1qCToy>bg=)Vv1zWt-iMs28jHzb<*=mUWk(#VQz2jt?v<@%Ah_3aRZk>O3I1q zO`~5!jDuCHy4S*I21-F}UT>{Az0iK^&>?pLIqPN6W3pH3g%`>){h3pYAH{%?X=N(0vmiL=fySP_h7n)s{6~;_XHg-XU&7h`TR$b4MHL|0f07aAlm+8L3tgISw;e1MzTD zWl^jp5aPY1Th6lGWoqkioLecugD&bK4B^G|EOu#x;j^7(;g*r%`X!BHNOb~~MJsM0 zd58D+F;lINAtc{Lracm7S3}u#804O4s(Jt0*+{F7@t^OK(W`->LVK47<8tgRfKIY@ z03rh51n~&hYo?8hZydGxseQ;jwT#*qG94=aBb_+x}1X#z2n5J7s`;uP!k> zrY586fcZ#BywAp0<)coI;Jnc2ptWN+Eas()TV`U;hT4XhBLJ*`Q{l!C1Gho4Nwkra8tuP;DNxFNT(M uTtR_lur{mFm_)>RNY|n*`M-}($+fJ_Qq#-0ue^FboCO@g`8E0yfBhFxa%ye> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech_VOX.png b/Resources/Textures/Structures/Specific/Anomalies/inner_anom_layer.rsi/tech_VOX.png new file mode 100644 index 0000000000000000000000000000000000000000..1787cdd4e06cebddb5753fbb349d2c06e2bcd10c GIT binary patch literal 1244 zcmZuwYfw@N6uy?Dt!D17Q){(+D0Fr0uw-hhF1l($_+S+W9|boj5#@Se@n5sEXXc#m%$z^x`@VBZqECjo zIBjg{N}mnvSg~P8fkp*t9sun5gplC)+)Dk#p$HTm)w8HU zO*IsKxnnBr^|UBFKDt>z&bTOd-{ZKSvymM-s&FUgoLhD9v;V#IWDvUR;_w$vPb*$| z|9rw;P~<(=LG;GdL$|&3v!Vg-7TJsKIhc$P_Smz2%jG&(Z7D7$!McVNOF8)!D=hjhko{vJXR(Ff znMa6aGma>YXl!Jp@b>&2B4LOyqDTS@^(0c|ytWu*C8rCj8!Wqh3RER+*9~`f`*E`2 zzr%+)??hhED1M$7& zP4p>ii8Hx*wIZr2{QBLi2j?)T_trEx2+KuaVx!fLgfF<>T4>wcIi=4}abm%UX>vj! zX1dT(!Y+Q~Mp);?(fAo3N@$cD@*JyrBG7M5AJ@jd(zf#TnSjpMBfs1*yTu*20;LG# z469U-b4&h6syB*EAJsBQmqhWPXeUA2aeN*;M>#b}ouF?k>!D>pnau;m(V5M!Y0L`K zy7bNuwzvkHal4XC>ap41_OpWUP}b=kAu}$6GA^&Q_*y^}SCiJ>q|QL7-kW>Js~(hD z;(Wty=!UiXTE3XTXmyhifuPK?NxSOkMl5D>^^61 z>&cs{;BDfYbX;!q&by{N@-9{DHwnlr3CQ|Ey2Z0@ngxpzmy_pQ_E5lKX(Zy=&_GOu zc+bUivLSzc(#LyVOo-PYHh@`N-d;LQZHmBYCLhAsn@QmMU_oL4l^eow!z6RIw&?lx z-TdlavtDQ<=Rkv*HBBs7J0dgQw{!KntXH*{nj6iSC7(ef`b;f=K`Jz7Y>>4rQFf0As+niKwk$uV>#8_aohnXjj?U7?CLJqb55M(Q( z_y7CNXy(nl2Nfz**km~C7LW(A=hXoDn*b9h3@3SPWpaQfc7K67uw@7s10x{HDO#z+LRm3xD|&_!sCqVK`d;bJxdjb%6H15BvuF1@OT=WDt>fea{KFi+u)>`Yu9x zW1mkXLjC~$0fH=}piKUsQZ%@zcg_>?Jts*1x#tA5_ha^)fTpWN^~OH!{g|VzAn7Ij z{0nU_3rgc(aDeuH12z0Egs?aEX}VK#AQ2(>eBDe$Xn$O2I}L63QIySZ8v)||1}N_f zp^4iYhua(V21!rIeR)npX7E)F$!w3xxI0?i+upAI1#0Bq3zYJ z4Gq|Ozaak9QDAd`M0k8~4-;~kb+3lqgdCU=BLd~S(F-+g_c6%Qw_7m(uC}}2fS*%D z%rxwc{eMJ6)9r9I?DBHE1MZY~5W%;HF3?do-02K$vzdY#D!jccnEw)ZW7A+80TS9K zHwHPVz1qJV1kP6PYUKg(RLR!*c>pHh99G^Gc&I_>wbIa zay9HGL?*dhjrCYIOshEH9u?ac$^Tv3UC99>RDT@(*1Ty>L^1?lH#$l0G+i}enah%f z#ORMkgF0A|c)m#fJ}|TeLpBFQOg9rrc-h{MlL<$>-8mT0IT*}{lnKc2zU&fb2W2`+ zm7eY|IV8-31DETbcK{Vt2kZiqQI{%Y) zgMTLGh@phtU=jRJIu8)c5tnuzPy~N;sCE7v3dzr(YkRK% zKlZ$Onj_X(A5cTZ_AOL|cLs&#=g+j=mgY$t32Unlki7gCo2mlx^Wp@6Ur66Lt$(dP zK=Sg(sIYd1yny^X+U_wadHOjWrPl{cP`%OzdRlCe`T2L+ZeQ~(b3pm^0ZtfBbhH!z z*QkxnsoC%e`T0|A?-~`5jM9RVwbuve2KV}b01C;^%LZxHJwa6;P$qv>ACUHssy?8q z57_V%p(R2#=S(m~$PQ{_BYOr3ay+idIovbyueUznN6QQ3O^wx=%M9h2>7N7grp6+s h`-fEvp({K`{11t~Wue8V+^PTo002ovPDHLkV1k!7P>BEl delta 1162 zcmV;51akqe~C0ep)b zBe&22Qsn|E45)UYSb*CIDkyaVRt?j5)+1_2&MwzB4D$g7jO8xh<8U2{<`u{jls&=&it)EAmRrAw||psYz}*j2P4eZ3w(Zj z=Q$10H^2HtpZL5Q0sxlv4wu6-0KnGO&t?c`j9Xc&=ARma%GxBqO5i=m>N#eOwODu&j3tH}TIW z*G+7QA!z`beSfn2crX&*qvzZR56E98IY0I9Yw)?-@T)w4&!#jB^xPNLmlyc`_!=Z` zEq~MizV%a(gynbv=ij=znPK1MIrrApt@x83z^ynQj6`xDTtu!H{4!Tq*1IP7UJlQi zzh%8^xJc9Hus_n6;{PZ;lq^Oa(hA^5eqY1}`=d7MvwzL1Fg506#qmL0TpQOj9*i(G z1_%U1(EucpL`zEzp8;+V-#~t!ZLqQyn0z^TzI8P=2YJwv#@K3*{0Yp~i<7~V2;j-( zd@)2mTQ5=+Nq!%j!@l_$q~g z>*^%GYJVB@XMse-1}}Zr6}%ss{kGqQkTk#rP<_U+C@6TdaK>cqMBn{RFxvpRGtdWjj)u+#xPJ#67x2=DB7e|bjS#&QmB7#A^TE@V z^$fPt-G5uqKq+BLxLGfnHqAu{LH(jnEZxW~>m7dByXGpYjgU6{Kh2ex5Ad(Tdb<(g z`FW{6fD52@ZGOHjzh57~LC>G1K7hzChi6Srzz44%nD_6jSXrwkrv&PG zHGjm)+Uy%6ntfg$km3f=@TY>K$^*DHV<~DPmcGk@-%qGW!=EG#f2;Zco)PxTVnTv) z>I3}Q=lzDz)(fHrm>SbuJyTMGTR#+tIBqA`ssx1(5*_nCDNz#gf{+n{2H+p?0tKl+ z$`>OUM!QjQ#yII+J^|GK=CD68Ld+wjzJG%op~~9I8RN9cNM5KQ6;EiFLwb*dh6*6~ zPw;$rJSm|VA!&$;q8RY^(^s)QR;WO2-|b!JBq_y!-vNH$sR~3Y(g1*O|Ncbx1D)#w z_~0cEIj@Gm09hGg^1`{mPa1&JlAL9|!v_1NJSOISs%7vdQKix5yDkXz!@ZB|Ab(vN zepP+I)R?1Sqe)Y5U5%+R*$1P_+7o`RAyg(q{Jm|3d44_>7-=uwC%V)JXwd02_%l); z(DpReg`W;(u_9?L|C_51h}{QtF??2i0N>%QtbNh^ytG;B)8n#)yd-yM=lE_=uEh%q c3Ucrt#86llirPac00000NkvXXt^-0~f~LST$1WzK;UIe|0kXP`*_q4B25Mgfx zFD)XTgceHnkexIYZEJR6Fa2+6ll$fG)dl@|ixL>$h8&_}=t={D5P2Pf(0#h6keJ23eI*_WD&HZB$(|gJJ z54nn8ehZ-e9ssR2^w0iJ0DK5&zlOe=HvHq)unz>njDr9kfrJ{58Z}Dv4O?Og7Rhkr QfdBvi07*qoM6N<$g2@Wm4FCWD delta 389 zcmV;00eb#{1g!&*F@I-CL_t(oh3%FxZiFxpML!_|87alG1vkiQ%RRszf|GIx4nWBn zkOFidBO#|6WV|*WP*!R9rLq0rAI1jY)TvYdtl;RvTnJ^372~*jzugPSxSMA@uMafS zfGkQ-wiVJa+zrB>Xd0(M3;?KQk9&Lp0CY<324Ml@LMSsa0e=t#04s2W(ixTTR8rLDZdA2s|E&u?lG-i5z+=Sy)VG}@4&yhKg zQw47Y^b}c?pqBkoW|ul8t?O<2^Z}5_lum%z`TCq@8qi=^J#&fG19aB!@ntEqe&kF* zjxigcY%A-AWPaRC!%KAtu$Dc_w%Xi(^A!~18012zPRW-BYo=i_aw&@v{CF-S)+;bm zPM#W)6O7_K_InfwjbDfzcoaoJWY2%kA8J#g@A`2BTrHs)KthAt5Ol6m|8 jfD1&|kw2nSr%wF>39-#Z{0ZNi00000NkvXXu0mjfSD&j} From 21bd9df4775144d429c741ac54b5d373b3675cb9 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 17 Sep 2024 09:50:26 +0000 Subject: [PATCH 14/28] Automatic changelog update --- Resources/Changelog/Changelog.yml | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index dd47739cb43172..cc6d0ca3e05e2c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Whisper - changes: - - message: Light toggle actions now have a 1 second cooldown between uses. - type: Tweak - id: 6887 - time: '2024-07-09T04:14:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29833 - author: Cojoke-dot changes: - message: Shotgun loading doafter now does something @@ -3910,3 +3903,18 @@ id: 7386 time: '2024-09-17T00:35:57.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32061 +- author: TheShuEd + changes: + - message: Anomalous infections added! People can now be infected by anomalies! + This allows you to use abnormal abilities, but can easily kill the host. To + cure them, bombard them with containment particles, because if the anomaly inside + them explodes, their bodies will be gibbed.... + type: Add + - message: Flesh anomaly resprite + type: Tweak + - message: anomalies now disconnect from the anomaly synchronizer if they are too + far away from it. + type: Fix + id: 7387 + time: '2024-09-17T09:49:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31876 From dce537df071f899f8419e512bd38991ee2a39771 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Tue, 17 Sep 2024 19:05:38 +0300 Subject: [PATCH 15/28] fix Tech anomaly loud sounds and superfast flickering (#32245) Update TechAnomalySystem.cs --- Content.Server/Anomaly/Effects/TechAnomalySystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs index 1b2849f1d77ee2..3e4d101f4fdf8f 100644 --- a/Content.Server/Anomaly/Effects/TechAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/TechAnomalySystem.cs @@ -37,7 +37,7 @@ public override void Update(float frameTime) if (_timing.CurTime < tech.NextTimer) continue; - tech.NextTimer += TimeSpan.FromSeconds(tech.TimerFrequency * anom.Stability); + tech.NextTimer += TimeSpan.FromSeconds(tech.TimerFrequency); _signal.InvokePort(uid, tech.TimerPort); } From 9afc786573fa1e9a7077eac17aeb0f00c4000cad Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 17 Sep 2024 16:06:45 +0000 Subject: [PATCH 16/28] 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 cc6d0ca3e05e2c..edca864463e63f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Cojoke-dot - changes: - - message: Shotgun loading doafter now does something - type: Fix - id: 6888 - time: '2024-07-09T04:23:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29827 - author: slarticodefast changes: - message: The construction menu and building preview now show the correct passive @@ -3918,3 +3911,10 @@ id: 7387 time: '2024-09-17T09:49:19.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/31876 +- author: TheShuEd + changes: + - message: fix Tech anomaly loud sounds and superfast flickering + type: Fix + id: 7388 + time: '2024-09-17T16:05:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32245 From 337af483ca0922050459dcd8e8955c2775387526 Mon Sep 17 00:00:00 2001 From: drakewill-CRL <46307022+drakewill-CRL@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:45:42 -0400 Subject: [PATCH 17/28] Fix plant mutations carrying over to other plants and future rounds (#32257) Lists are a reference type, so each component should get a new one, not point at the previous one. Co-authored-by: PraxisMapper --- Content.Server/Botany/SeedPrototype.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 7a3e08883ded76..5608338f22e8d4 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -291,12 +291,13 @@ public SeedData Clone() CanScream = CanScream, TurnIntoKudzu = TurnIntoKudzu, SplatPrototype = SplatPrototype, - Mutations = Mutations, + Mutations = new List(), // Newly cloned seed is unique. No need to unnecessarily clone if repeatedly modified. Unique = true, }; + newSeed.Mutations.AddRange(Mutations); return newSeed; } From 60887dd2e5c6e665503cbf1784ae3bb0a3289b05 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 17 Sep 2024 19:46:48 +0000 Subject: [PATCH 18/28] 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 edca864463e63f..445dae8c988bc1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: The construction menu and building preview now show the correct passive - vent sprite. - type: Fix - id: 6889 - time: '2024-07-09T13:39:47.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29820 - author: Cojoke-dot changes: - message: Pacifists can now use foam weaponry @@ -3918,3 +3910,10 @@ id: 7388 time: '2024-09-17T16:05:38.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32245 +- author: drakewill-CRL + changes: + - message: Fixed plant mutations carrying over to other plants and future rounds. + type: Fix + id: 7389 + time: '2024-09-17T19:45:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/32257 From 6fc4e9682c8c4e38a38cfa03bd04fe7e5b5c3e28 Mon Sep 17 00:00:00 2001 From: Moomoobeef <62638182+Moomoobeef@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:09:55 -0700 Subject: [PATCH 19/28] Added a number of new and very nerdy names for the AI (#31951) * added many new names for AIs * fixed mistakes * removed Intel and AMD trademarks. Rip AI named Pentium. --- Resources/Prototypes/Datasets/Names/ai.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Resources/Prototypes/Datasets/Names/ai.yml b/Resources/Prototypes/Datasets/Names/ai.yml index 1d320c3f52fc58..539ef4e3fad821 100644 --- a/Resources/Prototypes/Datasets/Names/ai.yml +++ b/Resources/Prototypes/Datasets/Names/ai.yml @@ -2,8 +2,11 @@ id: names_ai values: - 16-20 + - 512k + - 640k #ought to be enough for anybody - "790" - Adaptive Manipulator + - Adlib #named after the famous soundcard - ALICE - Allied Mastercomputer - Alpha 2 @@ -19,21 +22,28 @@ - Aniel - AOL - Asimov + - Bell 301 #the most influential modem ever, created by the bell system. It still lives on today in certain applications - Bishop - Blitz - Box + - Calculator - Cassandra - Cell - Chii - Chip + - C.R.A.I.G. + - Cray-2 #commercial supercomputer from the 70s + - CompuServe #if we're going to have AOL we may as well have some of their major competitors - Computer - Cutie - Daedalus + - DecTalk - Dee Model - Dial Up - Dorfl - Duey - Emma-2 + - ENIAC #famous early computer - Erasmus - Everything - Ez-27 @@ -47,12 +57,16 @@ - Helios - Hivebot Overmind - Huey + - iAI #a play on the fad apple spawned of putting "i" infront of your tech products name + - I.E. 6 #hell on earth (web browser) - Icarus + - Jeeves #if you don't get this one you are too young - Jinx - K.I.N.G - Klapaucius - Knight - Louie + - Manchester Mark 2 #named after the Manchester Mark 1, the successor of which was actually named the Ferranti Mark 1, rather than Manchester Mark 2 - MARK13 - Maria - Marvin @@ -64,6 +78,8 @@ - Mugsy3000 - Multivac - NCH + - NT v6.0 #A play on both NT as in NanoTrasen and NT as in windows NT, of which version 6.0 is windows vista + - Packard Bell - PTO - Project Y2K - Revelation @@ -76,10 +92,13 @@ - Shrike - Solo - Station Control Program + - AINU (AI's Not Unix) - Super 35 - Surgeon General - TWA - Terminus + - TPM 3.0 + - Turing Complete - Tidy - Ulysses - W1k1 From 870bacbcacedb7be7be95c9849470c7c4bf05e41 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 17 Sep 2024 22:11:01 +0000 Subject: [PATCH 20/28] 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 445dae8c988bc1..11609a0efc96a3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Cojoke-dot - changes: - - message: Pacifists can now use foam weaponry - type: Tweak - id: 6890 - time: '2024-07-09T13:46:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/29835 - author: Plykiya changes: - message: You can now drop food and drinks to stop consuming it. @@ -3917,3 +3910,10 @@ id: 7389 time: '2024-09-17T19:45:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/32257 +- author: Moomoobeef + changes: + - message: Added more names to the pool of names the AI can have. + type: Add + id: 7390 + time: '2024-09-17T22:09:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/31951 From 61089355f047da92b8e2e19c70a26fbd73715d60 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Wed, 18 Sep 2024 01:19:34 +0300 Subject: [PATCH 21/28] Fix Anomaly infections infinity growing after curing (#32259) --- Content.Client/Anomaly/AnomalySystem.cs | 12 +++++++++++- Content.Shared/Anomaly/SharedAnomalySystem.cs | 2 ++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Content.Client/Anomaly/AnomalySystem.cs b/Content.Client/Anomaly/AnomalySystem.cs index c93f0ce9490174..28c015f3021cdc 100644 --- a/Content.Client/Anomaly/AnomalySystem.cs +++ b/Content.Client/Anomaly/AnomalySystem.cs @@ -20,8 +20,9 @@ public override void Initialize() SubscribeLocalEvent(OnAppearanceChanged); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnAnimationComplete); - } + SubscribeLocalEvent(OnShutdown); + } private void OnStartup(EntityUid uid, AnomalyComponent component, ComponentStartup args) { _floating.FloatAnimation(uid, component.FloatingOffset, component.AnimationKey, component.AnimationTime); @@ -75,4 +76,13 @@ public override void Update(float frameTime) } } } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + if (!TryComp(ent, out var sprite)) + return; + + sprite.Scale = Vector2.One; + sprite.Color = sprite.Color.WithAlpha(1f); + } } diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index 9a0cde29988cb3..07beb1444d7653 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -194,6 +194,8 @@ public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool s if (component.DeleteEntity) QueueDel(uid); + else + RemCompDeferred(uid); } /// From eca63a460393cea0fe7b6d1a24402ce9cf840b86 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Wed, 18 Sep 2024 03:40:24 +0200 Subject: [PATCH 22/28] Fix borg defib module throwing an exception (#32260) ToggleCellDraw was erroneously added to the parent prototype instead of the one that actually has a battery. --- .../Prototypes/Entities/Objects/Specific/Medical/defib.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml index 7b5ba23fe33103..69c106efab133d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/defib.yml @@ -47,13 +47,13 @@ - type: GuideHelp guides: - Medical Doctor - - type: ToggleCellDraw - type: entity id: Defibrillator parent: [ BaseDefibrillator, PowerCellSlotMediumItem ] components: - type: MultiHandedItem + - type: ToggleCellDraw - type: PowerCellDraw useRate: 100 From 675a9197f20ee467c0fc99a03efccce47785186f Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:41:24 +0300 Subject: [PATCH 23/28] Easy IconSmooth spriting (#32210) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * фыр * Update IconSmoothingTemplate README.txt --- .../IconSmoothingTemplate README.txt | 4 ++++ .../IconSmoothingTemplate.aseprite | Bin 0 -> 14094 bytes 2 files changed, 4 insertions(+) create mode 100644 Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt create mode 100644 Tools/SS14 Aseprite Templates/IconSmoothingTemplate.aseprite diff --git a/Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt new file mode 100644 index 00000000000000..083e803ecd189c --- /dev/null +++ b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate README.txt @@ -0,0 +1,4 @@ +This is a template that greatly simplifies working with IconSmooth sprites. + +A video on how to use it can be found at the link: +https://github.com/space-wizards/space-station-14/pull/32210 \ No newline at end of file diff --git a/Tools/SS14 Aseprite Templates/IconSmoothingTemplate.aseprite b/Tools/SS14 Aseprite Templates/IconSmoothingTemplate.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..112a1d932cadd62741abd5abceda653934e920fa GIT binary patch literal 14094 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 UoOs=6@h%0vEot(c1jDqy1Eecdl>h($ literal 0 HcmV?d00001 From 974c08596b50664b419791e589c363abac7c80eb Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:43:30 +1200 Subject: [PATCH 24/28] Fix AudioSystem nullability checks for engine PR (#32233) --- Content.Client/Audio/AmbientSoundSystem.cs | 3 +++ Content.Client/Audio/ClientGlobalSoundSystem.cs | 4 ++-- Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs | 4 ++-- Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs | 2 +- Content.Client/Traits/ParacusiaSystem.cs | 2 +- Content.Client/Weather/WeatherSystem.cs | 9 +++++---- Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs | 2 +- .../Kitchen/EntitySystems/ReagentGrinderSystem.cs | 2 +- .../Mech/Equipment/EntitySystems/MechGrabberSystem.cs | 2 +- Content.Server/Salvage/SalvageSystem.Runner.cs | 4 ++-- .../Shuttles/Systems/ShuttleSystem.FasterThanLight.cs | 3 ++- 11 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Content.Client/Audio/AmbientSoundSystem.cs b/Content.Client/Audio/AmbientSoundSystem.cs index ca6336b91b857c..b525747aa9cd61 100644 --- a/Content.Client/Audio/AmbientSoundSystem.cs +++ b/Content.Client/Audio/AmbientSoundSystem.cs @@ -306,6 +306,9 @@ private void ProcessNearbyAmbience(TransformComponent playerXform) .WithMaxDistance(comp.Range); var stream = _audio.PlayEntity(comp.Sound, Filter.Local(), uid, false, audioParams); + if (stream == null) + continue; + _playingSounds[sourceEntity] = (stream.Value.Entity, comp.Sound, key); playingCount++; diff --git a/Content.Client/Audio/ClientGlobalSoundSystem.cs b/Content.Client/Audio/ClientGlobalSoundSystem.cs index 7c77865f74156d..50c3971d95addd 100644 --- a/Content.Client/Audio/ClientGlobalSoundSystem.cs +++ b/Content.Client/Audio/ClientGlobalSoundSystem.cs @@ -67,7 +67,7 @@ private void PlayAdminSound(AdminSoundEvent soundEvent) if(!_adminAudioEnabled) return; var stream = _audio.PlayGlobal(soundEvent.Filename, Filter.Local(), false, soundEvent.AudioParams); - _adminAudio.Add(stream.Value.Entity); + _adminAudio.Add(stream?.Entity); } private void PlayStationEventMusic(StationEventMusicEvent soundEvent) @@ -76,7 +76,7 @@ private void PlayStationEventMusic(StationEventMusicEvent soundEvent) if(!_eventAudioEnabled || _eventAudio.ContainsKey(soundEvent.Type)) return; var stream = _audio.PlayGlobal(soundEvent.Filename, Filter.Local(), false, soundEvent.AudioParams); - _eventAudio.Add(soundEvent.Type, stream.Value.Entity); + _eventAudio.Add(soundEvent.Type, stream?.Entity); } private void PlayGameSound(GameGlobalSoundEvent soundEvent) diff --git a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs index d60c978ccf5c5e..bf7ab26cba25ba 100644 --- a/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.AmbientMusic.cs @@ -213,9 +213,9 @@ private void UpdateAmbientMusic() false, AudioParams.Default.WithVolume(_musicProto.Sound.Params.Volume + _volumeSlider)); - _ambientMusicStream = strim.Value.Entity; + _ambientMusicStream = strim?.Entity; - if (_musicProto.FadeIn) + if (_musicProto.FadeIn && strim != null) { FadeIn(_ambientMusicStream, strim.Value.Component, AmbientMusicFadeTime); } diff --git a/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs b/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs index 92c5b7a419153b..9864dbcb2a91bf 100644 --- a/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs +++ b/Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs @@ -185,7 +185,7 @@ private void PlaySoundtrack(string soundtrackFilename) false, _lobbySoundtrackParams.WithVolume(_lobbySoundtrackParams.Volume + SharedAudioSystem.GainToVolume(_configManager.GetCVar(CCVars.LobbyMusicVolume))) ); - if (playResult.Value.Entity == default) + if (playResult == null) { _sawmill.Warning( $"Tried to play lobby soundtrack '{{Filename}}' using {nameof(SharedAudioSystem)}.{nameof(SharedAudioSystem.PlayGlobal)} but it returned default value of EntityUid!", diff --git a/Content.Client/Traits/ParacusiaSystem.cs b/Content.Client/Traits/ParacusiaSystem.cs index 3789f24cb0d0cd..af4d8ef278fa62 100644 --- a/Content.Client/Traits/ParacusiaSystem.cs +++ b/Content.Client/Traits/ParacusiaSystem.cs @@ -69,7 +69,7 @@ private void PlayParacusiaSounds(EntityUid uid) var newCoords = Transform(uid).Coordinates.Offset(randomOffset); // Play the sound - paracusia.Stream = _audio.PlayStatic(paracusia.Sounds, uid, newCoords).Value.Entity; + paracusia.Stream = _audio.PlayStatic(paracusia.Sounds, uid, newCoords)?.Entity; } } diff --git a/Content.Client/Weather/WeatherSystem.cs b/Content.Client/Weather/WeatherSystem.cs index a0e8a44f40be63..975831392cb7b8 100644 --- a/Content.Client/Weather/WeatherSystem.cs +++ b/Content.Client/Weather/WeatherSystem.cs @@ -47,10 +47,11 @@ protected override void Run(EntityUid uid, WeatherData weather, WeatherPrototype if (!Timing.IsFirstTimePredicted || weatherProto.Sound == null) return; - weather.Stream ??= _audio.PlayGlobal(weatherProto.Sound, Filter.Local(), true).Value.Entity; + weather.Stream ??= _audio.PlayGlobal(weatherProto.Sound, Filter.Local(), true)?.Entity; + + if (!TryComp(weather.Stream, out AudioComponent? comp)) + return; - var stream = weather.Stream.Value; - var comp = Comp(stream); var occlusion = 0f; // Work out tiles nearby to determine volume. @@ -115,7 +116,7 @@ protected override void Run(EntityUid uid, WeatherData weather, WeatherPrototype var alpha = GetPercent(weather, uid); alpha *= SharedAudioSystem.VolumeToGain(weatherProto.Sound.Params.Volume); - _audio.SetGain(stream, alpha, comp); + _audio.SetGain(weather.Stream, alpha, comp); comp.Occlusion = occlusion; } diff --git a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs index 9f43f760185fbe..1ac02ac88258a8 100644 --- a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs @@ -112,7 +112,7 @@ private void OnCookStart(Entity ent, ref ComponentStar SetAppearance(ent.Owner, MicrowaveVisualState.Cooking, microwaveComponent); microwaveComponent.PlayingStream = - _audio.PlayPvs(microwaveComponent.LoopingSound, ent, AudioParams.Default.WithLoop(true).WithMaxDistance(5)).Value.Entity; + _audio.PlayPvs(microwaveComponent.LoopingSound, ent, AudioParams.Default.WithLoop(true).WithMaxDistance(5))?.Entity; } private void OnCookStop(Entity ent, ref ComponentShutdown args) diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs index 71536ddf8ebe9c..12c5a30a4b29ec 100644 --- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs @@ -305,7 +305,7 @@ private void DoWork(EntityUid uid, ReagentGrinderComponent reagentGrinder, Grind active.Program = program; reagentGrinder.AudioStream = _audioSystem.PlayPvs(sound, uid, - AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier)).Value.Entity; //slightly higher pitched + AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier))?.Entity; //slightly higher pitched _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key, new ReagentGrinderWorkStartedMessage(program)); } diff --git a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs index aa28a8063c0de1..08120f5c296fac 100644 --- a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs +++ b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs @@ -155,7 +155,7 @@ private void OnInteract(EntityUid uid, MechGrabberComponent component, UserActiv return; args.Handled = true; - component.AudioStream = _audio.PlayPvs(component.GrabSound, uid).Value.Entity; + component.AudioStream = _audio.PlayPvs(component.GrabSound, uid)?.Entity; var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.GrabDelay, new GrabberDoAfterEvent(), uid, target: target, used: uid) { BreakOnMove = true diff --git a/Content.Server/Salvage/SalvageSystem.Runner.cs b/Content.Server/Salvage/SalvageSystem.Runner.cs index 23a575413ed570..921d966709418f 100644 --- a/Content.Server/Salvage/SalvageSystem.Runner.cs +++ b/Content.Server/Salvage/SalvageSystem.Runner.cs @@ -154,8 +154,8 @@ private void UpdateRunner() } else if (comp.Stream == null && remaining < audioLength) { - var audio = _audio.PlayPvs(comp.Sound, uid).Value; - comp.Stream = audio.Entity; + var audio = _audio.PlayPvs(comp.Sound, uid); + comp.Stream = audio?.Entity; _audio.SetMapAudio(audio); comp.Stage = ExpeditionStage.MusicCountdown; Dirty(uid, comp); diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index e544c1538d15b6..ce6a914847f93d 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -397,7 +397,8 @@ private void UpdateFTLStarting(Entity entity) new EntityCoordinates(fromMapUid.Value, _mapSystem.GetGridPosition(entity.Owner)), true, startupAudio.Params); _audio.SetPlaybackPosition(clippedAudio, entity.Comp1.StartupTime); - clippedAudio.Value.Component.Flags |= AudioFlags.NoOcclusion; + if (clippedAudio != null) + clippedAudio.Value.Component.Flags |= AudioFlags.NoOcclusion; } // Offset the start by buffer range just to avoid overlap. From 2bceaad7854a423836e81c7b78985de1b98e9b8f Mon Sep 17 00:00:00 2001 From: Winkarst <74284083+Winkarst-cpu@users.noreply.github.com> Date: Wed, 18 Sep 2024 04:49:37 +0300 Subject: [PATCH 25/28] Use TurfSystem.IsTileBlocked instead of TurfHelpers (#32174) * Use TurfSystem.IsTileBlocked instead of TurfHelpers * ! --- .../Engineering/EntitySystems/SpawnAfterInteractSystem.cs | 4 +++- Content.Server/Respawn/SpecialRespawnSystem.cs | 7 +++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs index 8391e8faada5fb..407f877515aaf0 100644 --- a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs +++ b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.DoAfter; using Content.Shared.Interaction; using Content.Shared.Maps; +using Content.Shared.Physics; using Content.Shared.Stacks; using JetBrains.Annotations; using Robust.Shared.Map.Components; @@ -15,6 +16,7 @@ public sealed class SpawnAfterInteractSystem : EntitySystem { [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly StackSystem _stackSystem = default!; + [Dependency] private readonly TurfSystem _turfSystem = default!; public override void Initialize() { @@ -36,7 +38,7 @@ private async void HandleAfterInteract(EntityUid uid, SpawnAfterInteractComponen bool IsTileClear() { - return tileRef.Tile.IsEmpty == false && !tileRef.IsBlockedTurf(true); + return tileRef.Tile.IsEmpty == false && !_turfSystem.IsTileBlocked(tileRef, CollisionGroup.MobMask); } if (!IsTileClear()) diff --git a/Content.Server/Respawn/SpecialRespawnSystem.cs b/Content.Server/Respawn/SpecialRespawnSystem.cs index 8c86449008ab4e..6d398db259db25 100644 --- a/Content.Server/Respawn/SpecialRespawnSystem.cs +++ b/Content.Server/Respawn/SpecialRespawnSystem.cs @@ -2,16 +2,15 @@ using Content.Server.Atmos.EntitySystems; using Content.Server.Chat.Managers; using Content.Server.GameTicking; -using Content.Shared.Station.Components; -using Content.Server.Station.Systems; using Content.Shared.Database; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Respawn; +using Content.Shared.Station.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; -using Robust.Shared.Random; using Robust.Shared.Prototypes; +using Robust.Shared.Random; namespace Content.Server.Respawn; @@ -179,7 +178,7 @@ public bool TryFindRandomTile(EntityUid targetGrid, EntityUid targetMap, int max foreach (var newTileRef in grid.GetTilesIntersecting(circle)) { - if (newTileRef.IsSpace(_tileDefinitionManager) || newTileRef.IsBlockedTurf(true) || !_atmosphere.IsTileMixtureProbablySafe(targetGrid, targetMap, mapTarget)) + if (newTileRef.IsSpace(_tileDefinitionManager) || _turf.IsTileBlocked(newTileRef, CollisionGroup.MobMask) || !_atmosphere.IsTileMixtureProbablySafe(targetGrid, targetMap, mapTarget)) continue; found = true; From 54e4cfecfe44109b0c5333d3044ded6199105459 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:32:16 +1000 Subject: [PATCH 26/28] Update submodule to 235.0.0 (#32265) --- Resources/Prototypes/Entities/Mobs/Player/silicon.yml | 6 +++--- RobustToolbox | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 62dbf3ee1065c5..493cfdf6cb63e6 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -2,7 +2,7 @@ - type: entity id: AiHeld description: Components added / removed from an entity that gets inserted into an AI core. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: IntrinsicRadioReceiver - type: IntrinsicRadioTransmitter @@ -341,7 +341,7 @@ - type: entity id: StationAiBrain parent: PositronicBrain - noSpawn: true + categories: [ HideSpawnMenu ] suffix: DO NOT MAP components: - type: Sprite @@ -382,7 +382,7 @@ id: StationAiHolo name: AI eye description: The AI's viewer. - noSpawn: true + categories: [ HideSpawnMenu ] suffix: DO NOT MAP components: - type: NoFTL diff --git a/RobustToolbox b/RobustToolbox index 0f60ad9018f54f..c86cb0b7951cc4 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 0f60ad9018f54f9b49da1810bbffa01e2c5975f7 +Subproject commit c86cb0b7951cc4a662c7292138c5f45d868c5f58 From 09b3cc7c21419ef4cfad0a623d289131926a4dd6 Mon Sep 17 00:00:00 2001 From: V <97265903+formlessnameless@users.noreply.github.com> Date: Wed, 18 Sep 2024 00:00:16 -0500 Subject: [PATCH 27/28] Moved our version of immovable rod to match upstream --- Resources/Prototypes/GameRules/events.yml | 40 ------------------- .../Prototypes/GameRules/meteorswarms.yml | 4 +- 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 885c25b6a2b61c..e6c257443a923f 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -524,46 +524,6 @@ sounds: collection: Paracusia -- type: entity - id: ImmovableRodSpawn - parent: BaseGameRule - components: - - type: StationEvent - startAnnouncement: true - weight: 3.5 - duration: 1 - earliestStart: 30 - minimumPlayers: 20 - - type: ImmovableRodRule - rodPrototypes: - - id: ImmovableRodKeepTilesStill - prob: 0.95 - orGroup: rodProto - - id: ImmovableRodMop - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodShark - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodClown - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodBanana - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodHammer - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodThrongler - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodGibstick - prob: 0.0072 - orGroup: rodProto - - id: ImmovableRodFinFin - prob: 0.0072 - orGroup: rodProto - - type: entity parent: BaseGameRule id: IonStorm diff --git a/Resources/Prototypes/GameRules/meteorswarms.yml b/Resources/Prototypes/GameRules/meteorswarms.yml index 40882ade4815ac..7ec693de99c65f 100644 --- a/Resources/Prototypes/GameRules/meteorswarms.yml +++ b/Resources/Prototypes/GameRules/meteorswarms.yml @@ -199,9 +199,7 @@ parent: BaseGameRule components: - type: StationEvent - startAnnouncement: station-event-immovable-rod-start-announcement - startAudio: - path: /Audio/Announcements/attention.ogg + startAnnouncement: true weight: 3.5 reoccurrenceDelay: 1 duration: 1 From 3df9c46429a77838eea930a384a3ff280f5c21f5 Mon Sep 17 00:00:00 2001 From: V <97265903+formlessnameless@users.noreply.github.com> Date: Wed, 18 Sep 2024 00:31:23 -0500 Subject: [PATCH 28/28] fix noSpawn setting updates, fix localization for steal objectives --- .../conditions/steal-target-groups.ftl | 2 + Resources/Prototypes/Actions/changeling.yml | 58 +++++++++---------- .../DeltaV/Objectives/recruiter.yml | 2 +- .../Entities/Guidebook/changeling.yml | 4 +- .../Prototypes/Entities/Mobs/Species/gray.yml | 2 +- .../Entities/Mobs/Species/snail.yml | 2 +- .../Objectives/stealTargetGroups.yml | 2 +- 7 files changed, 37 insertions(+), 35 deletions(-) diff --git a/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl b/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl index 91b3c92b1c333c..48482bb2bb6111 100644 --- a/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl +++ b/Resources/Locale/en-US/objectives/conditions/steal-target-groups.ftl @@ -40,6 +40,7 @@ steal-target-groups-clothing-eyes-hud-beer = beer goggles steal-target-groups-bible = bible steal-target-groups-clothing-neck-goldmedal = gold medal of crewmanship steal-target-groups-clothing-neck-clownmedal = clown medal +steal-target-groups-recruiter-pen = recruiter pen # Thief structures steal-target-groups-teg = teg generator part @@ -64,3 +65,4 @@ steal-target-groups-animal-morty = Morty steal-target-groups-animal-renault = Renault steal-target-groups-animal-shiva = Shiva steal-target-groups-animal-tropico = Tropico +steal-target-groups-animal-pipi = Pipi diff --git a/Resources/Prototypes/Actions/changeling.yml b/Resources/Prototypes/Actions/changeling.yml index 6147628b245553..a28f33aca251ed 100644 --- a/Resources/Prototypes/Actions/changeling.yml +++ b/Resources/Prototypes/Actions/changeling.yml @@ -5,7 +5,7 @@ id: ActionEvolutionMenu name: Open evolution menu description: Opens the evolution menu. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -22,7 +22,7 @@ id: ActionAbsorbDNA name: Absorb DNA description: Absorb the target's DNA, husking them in the process. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction useDelay: 5 @@ -45,7 +45,7 @@ id: ActionStingExtractDNA name: Extract DNA sting description: Steal your target's genetic information. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -66,7 +66,7 @@ id: ActionChangelingTransformCycle name: Cycle DNA description: Cycle your available DNA. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -83,7 +83,7 @@ id: ActionChangelingTransform name: Transform description: Transform into another humanoid. Doesn't come with clothes. Costs 5 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 5 @@ -100,7 +100,7 @@ id: ActionEnterStasis name: Enter regenerative stasis description: Fake your death and start regenerating. Drains all your chemicals. Consumes biomass. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -118,7 +118,7 @@ id: ActionExitStasis name: Exit stasis description: Rise from the dead with full health. Costs 60 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -137,7 +137,7 @@ id: ActionToggleArmblade name: Toggle Arm Blade description: Reform one of your arms into a strong blade, composed of bone and flesh. Retract on secondary use. Costs 15 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -153,7 +153,7 @@ id: ActionCreateBoneShard name: Form Bone Shard description: Break off shards of your bone and shape them into a throwing star. Costs 15 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 1 @@ -169,7 +169,7 @@ id: ActionToggleChitinousArmor name: Toggle Armor description: Inflate your body into an all-consuming chitinous mass of armor. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -186,7 +186,7 @@ id: ActionToggleOrganicShield name: Form Shield description: Reform one of your arms into a large, fleshy shield. Costs 20 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -203,7 +203,7 @@ id: ActionShriekDissonant name: Dissonant Shriek description: Emit an EMP blast, with just your voice. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -222,7 +222,7 @@ id: ActionShriekResonant name: Resonant Shriek description: Disorient people and break lights, with just your voice. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -241,7 +241,7 @@ id: ActionToggleStrainedMuscles name: Strain Muscles description: Move at extremely fast speeds. Deals stamina damage. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -260,7 +260,7 @@ id: ActionStingBlind name: Blind Sting description: Silently sting your target, blinding them for a short time and rendering them near sighted. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -281,7 +281,7 @@ id: ActionStingCryo name: Cryogenic Sting description: Silently sting your target, constantly slowing and freezing them. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -302,7 +302,7 @@ id: ActionStingLethargic name: Lethargic Sting description: Silently inject a cocktail of anesthetics into the target. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -323,7 +323,7 @@ id: ActionStingMute name: Mute Sting description: Silently sting your target, completely silencing them for a short time. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -344,7 +344,7 @@ id: ActionStingFakeArmblade name: Fake Armblade Sting description: Silently sting your target, making them grow a dull armblade for a short time. Costs 50 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -365,7 +365,7 @@ id: ActionStingTransform name: Transformation Sting description: Silently sting your target, transforming them into a person of your choosing. Costs 75 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: EntityTargetAction whitelist: @@ -387,7 +387,7 @@ id: ActionAnatomicPanacea name: Anatomic Panacea description: Cure yourself of diseases, disabilities, radiation, toxins, drunkedness and brain damage. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 30 @@ -406,7 +406,7 @@ id: ActionAugmentedEyesight name: Augmented Eyesight description: Toggle flash protection. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false @@ -422,7 +422,7 @@ id: ActionBiodegrade name: Biodegrade description: Vomit a caustic substance onto any restraints, or someone's face. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 5 @@ -439,7 +439,7 @@ id: ActionChameleonSkin name: Chameleon Skin description: Slowly blend in with the environment. Costs 25 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 1 @@ -457,7 +457,7 @@ id: ActionEphedrineOverdose name: Ephedrine Overdose description: Inject some stimulants into yourself. Costs 30 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 10 @@ -476,7 +476,7 @@ id: ActionFleshmend name: Fleshmend description: Rapidly heal yourself. Costs 35 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 30 @@ -494,7 +494,7 @@ id: ActionToggleLesserForm name: Lesser Form description: Abandon your current form and transform into a monkey. Costs 20 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 5 @@ -511,7 +511,7 @@ id: ActionToggleSpacesuit name: Toggle Space Suit description: Make your body space proof. Costs 20 chemicals. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction useDelay: 2 @@ -527,7 +527,7 @@ id: ActionHivemindAccess name: Hivemind Access description: Tune your chemical receptors for hivemind communication. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: InstantAction checkCanInteract: false diff --git a/Resources/Prototypes/DeltaV/Objectives/recruiter.yml b/Resources/Prototypes/DeltaV/Objectives/recruiter.yml index f73a31da35f53c..d8760388c71e5f 100644 --- a/Resources/Prototypes/DeltaV/Objectives/recruiter.yml +++ b/Resources/Prototypes/DeltaV/Objectives/recruiter.yml @@ -43,7 +43,7 @@ - type: stealTargetGroup id: RecruiterPen - name: recruiter pen + name: steal-target-groups-recruiter-pen sprite: sprite: DeltaV/Objects/Misc/recruiter_pen.rsi state: empty diff --git a/Resources/Prototypes/Entities/Guidebook/changeling.yml b/Resources/Prototypes/Entities/Guidebook/changeling.yml index 75423344c7f50d..0b3d959d097e32 100644 --- a/Resources/Prototypes/Entities/Guidebook/changeling.yml +++ b/Resources/Prototypes/Entities/Guidebook/changeling.yml @@ -2,8 +2,8 @@ id: GuidebookChangelingFluff name: guidebook changeling description: you shouldn't be seeing this normally. - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: Sprite sprite: Changeling/Guidebook/guidebook_changeling.rsi - state: icon \ No newline at end of file + state: icon diff --git a/Resources/Prototypes/Entities/Mobs/Species/gray.yml b/Resources/Prototypes/Entities/Mobs/Species/gray.yml index 78b47d9c00aa64..bb1db74b2ca9c5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/gray.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/gray.yml @@ -76,7 +76,7 @@ - type: entity parent: BaseSpeciesDummy id: MobGrayDummy - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: Sprite scale: 1, 0.8 diff --git a/Resources/Prototypes/Entities/Mobs/Species/snail.yml b/Resources/Prototypes/Entities/Mobs/Species/snail.yml index 70bae8f83ee13b..d37d1f7c811ff8 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/snail.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/snail.yml @@ -185,7 +185,7 @@ - type: entity parent: BaseSpeciesDummy id: MobGastropoidDummy - noSpawn: true + categories: [ HideSpawnMenu ] components: - type: HumanoidAppearance species: Snail diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 769986582fcd86..48c871eb469766 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -395,7 +395,7 @@ - type: stealTargetGroup id: AnimalPipi - name: Pipi + name: steal-target-groups-animal-pipi sprite: sprite: Mobs/Pets/pipi.rsi state: pipi