From a0d7f7d36884b02f38af99a2c3a278f476b86151 Mon Sep 17 00:00:00 2001 From: Miller <151492849+CilliePaint@users.noreply.github.com> Date: Mon, 29 Jul 2024 01:50:43 -0400 Subject: [PATCH 001/143] Box Retexture (#597) # Description Retextures Boxes slightly. Description. ---

Media

![Science](https://file.garden/Yy0ydNX23DJlLOUl/Sharing/BoxRetexture/Screenshot_20240726_160131.png) ![Standard](https://file.garden/Yy0ydNX23DJlLOUl/Sharing/BoxRetexture/Screenshot_20240726_160028.png) ![Olive](https://file.garden/Yy0ydNX23DJlLOUl/Sharing/BoxRetexture/Screenshot_20240726_160125.png) ![Doom](https://file.garden/Yy0ydNX23DJlLOUl/Sharing/BoxRetexture/Screenshot_20240726_160110.png)

--- # Changelog :CL: - tweak: New Box Textures! --------- Signed-off-by: Miller <151492849+CilliePaint@users.noreply.github.com> --- .../Objects/Storage/boxes.rsi/box.png | Bin 305 -> 369 bytes .../Objects/Storage/boxes.rsi/box_hug.png | Bin 207 -> 230 bytes .../Objects/Storage/boxes.rsi/box_of_doom.png | Bin 291 -> 371 bytes .../Storage/boxes.rsi/box_of_doom_big.png | Bin 300 -> 364 bytes .../Objects/Storage/boxes.rsi/box_olive.png | Bin 5494 -> 756 bytes .../Objects/Storage/boxes.rsi/box_science.png | Bin 17958 -> 2970 bytes .../Objects/Storage/boxes.rsi/meta.json | 2 +- 7 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box.png b/Resources/Textures/Objects/Storage/boxes.rsi/box.png index e62e0f699fb4970c743ebe5ddfbf10f47a0f6318..08c3cc3129b1400a51a1a83863ef262dea0f1561 100644 GIT binary patch delta 342 zcmV-c0jd760`UTnB!2;OQb$4nuFf3k0003iNklC|tq({E7lX9Txf&{k_dL+w(y!9@Zth{6ss1X8b!Gic+yfeAs(slv?7eJ5lH z0eX7=J1d;f{=wdIFj)60*1E?1-Gj4#jWhh{_z>@JA6^1m$$tg_EL{?-t|H$j_r2FC z&^Db5IM0CL>z#HZkR+R}3}*}6T;FypAVdxTD9b72_KscO9S#8ikMp@*D_&oI_gZz4T_>*XM+kTwSW*gF2?5|BIj@+awxS3BcOGSIF4;$ o6h%$}lhwL*3UvNU*3;AT3H9b+J@KXgR{#J207*qoM6N<$g7b2lBme*a delta 278 zcmV+x0qOqn0Oh*2;K cMm7KdhtfX9{12)|6aWAK07*qoM6N<$g4T<93;+NC diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_hug.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_hug.png index f9f0e4dbf3d4554746911228558ef46807683909..d00717065f9c2275d5cd17b1286d540265f8ae03 100644 GIT binary patch delta 173 zcmX@l_>6Iagct`i0|SH0lCEPwim^Dz-HBn{IhmIe6?N;mN`m}?8UDjSU8hJGP)&lT zi(`mI@7oLRdA0lhwrPrJ_nx)(Tc^akFwVICcImmJQjQEvd=3sL z-8)`cv{t@ZucaWcGpzf;fi<#c3LKvA5pQWO`z@8?t}^}0za8v9MMU_Y{XA8+uaf0! V)BVd;JV47BJYD@<);T3K0RUroO8Ni* delta 150 zcmaFHc%E^B1SbnK0|P^2Nc!=Kdb;(DB|(0{3=Yq3qyYuvJzX3_G$tk|NVqfv3h=Nz zU~)Q^u)rghQPseKqhm)yqjHRc0M`Si#7-|QKd+>f9E|}JYBVM}RJgjkS8Gmcs9+Zm zQR4JyV3GRBnULXVUXr9C;c0`mfpB!2;OQb$4nuFf3k0003kNkl)&jbDqTLs&eqQm?6T#^Y%$=#7RnZ;$i`%gIB%8>65?%y$MMclbQD;#=D+8G z0};^}hM`ljQVLpYYrhpBqA|-dXsw+DhzM0xStTBAMXp!wdVj7};J355z=jJF(Q*Q5 zn%-1i*R_?gz6D8=j5n=*Nz*j5Yq0J>9LE3vDJ5Rd=V|`5+W`RH4u@&B_q;3K7WOkB zrGyXy&q90+kH?SWb~}y4h5eMcn}84kd7iV_vMjl^d;tLPeIG#(%rafqxm5D^fhdaD zr7rB^8`0kpXi?jiUFyQJAHrc6V2pt=hQ;1pfQV2O1;qD#;D^Osz8h8nrPNj7%jq=B q?>!Fy(Dyx*QdWV*f63OYS@RCc+g$U))*ToC0000dR}nly zM!|rC!J!>mOG_bnsTL{CKRJBO0HqYp(|=@TOCer(SJ*qClmZdq zNMz;c&dw662@nyAqF}LgU2|*s0ss(25#l(uGJW6sRBnF`1cA*3*h^@Pfz}#YYZkk@ zfRqwdRe>DmfHB7FyTK9|$MJD}8U`y{3h{Q&Vu9zsp?Lt84+#lzne O002ovPDHLkU;%U6htShMQ$R2^cy6~ zY)8cha3?k~&Gz9<%Ayx?|A^<>HmIlPvxOnX=pMUCY0DM}T1AIRld_234 z10+fEmawX-4A0mFaUAz=Nx!SE>p`aV4n$EjIB%K;C#~^wI1K#1^BDlF{?YTSea3pa z1|E|bWB6qZxLk&V`~B@`@!5Uu7-BI1V+>iAO_fi|TAJkJ5#w&arVIo}ckfOBr0c+wisdN#n(^8f%{ j*A04)wfQfZlatdGmHu7m>X6~w00000NkvXXu0mjfQVNu= delta 273 zcmV+s0q*|n0;~d%B!BZsL_t(|ob8q|3WG2dhX0m^H!5WG2!h~Ayp3Bg;8EPXir^6( z1+y6(+M&&$rqzd9OPg;qChz~iml(j|_;*g@fiMhjdj?ijHORc!CPh&M0BD+KlTaxo z0H7?($-DC=2`g{{)*djJZ})M5IF5G-vo+y&Zo?o52G4a}BY*3AR!}O0wa%EgJzy3Q z5w1im0eY?-ORxoq2uYH#!VN`H%+8q=007VP;QKx+ylvY>^A0};oWS7%vrVYAhEfVj zDRyzK^?Cs*CGtE6@Ys@^@Fo8et3cOvld-Jt0mf;V3h}bmtbpw%WD0WF>PF>o{5E$3 XuSnN1*7D~7015yANkvXXu0mjfPq=)2 diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/box_olive.png b/Resources/Textures/Objects/Storage/boxes.rsi/box_olive.png index 4ddd8ac4fbfd7d62c1fb8439345a4499e7cd8d7d..db0d3b1ffd1792ee26ef0e1d9b49034a675ce34c 100644 GIT binary patch delta 363 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 literal 17958 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 diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json index 53ac39b639b..b30927da33c 100644 --- a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef.", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/cc65477c04f7403ca8a457bd5bae69a01abadbf0, encryptokey was taken from Baystation12 at https://github.com/infinitystation/Baystation12/blob/073f678cdce92edb8fcd55f9ffc9f0523bf31506/icons/obj/radio.dmi and modified by lapatison. boxwidetoy, shelltoy, swab, flare, inflatable, trashbag, magazine, holo and forensic created by potato1234x (github) for ss14 based on toys.rsi, mouth_swab.rsi, flare.rsi, inflatable_wall.rsi, trashbag.rsi, caseless_pistol_mag.rsi, guardians.rsi and bureaucracy.rsi respectively, candle and darts created by TheShuEd for ss14, throwing_knives and vials was drawn by Ubaser, evidence_markers by moomoobeef, Boxes by mefinks.", "size": { "x": 32, "y": 32 From 4b9c59820dda8e11bf546da601fdaebaad5ff663 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 29 Jul 2024 05:51:07 +0000 Subject: [PATCH 002/143] Automatic Changelog Update (#597) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d019ca79758..af8ccbba92d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4658,3 +4658,9 @@ Entries: message: Long Survival has been added as a new Game mode. id: 6185 time: '2024-07-27T06:00:24.0000000+00:00' +- author: CilliePaint + changes: + - type: Tweak + message: New Box Textures! + id: 6186 + time: '2024-07-29T05:50:43.0000000+00:00' From faa239a6e5bf7921351c17672503eb405df4f6e2 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Mon, 29 Jul 2024 08:54:01 +0300 Subject: [PATCH 003/143] Fix 125 Toolshed Commands Being Unusable for Anyone without +HOST (#572) # Description For reasons unknown, AdminManager has two command permission managers: _commandPermissions and _toolshedCommandPermissions. It used to load normal command permissions into the former, and toolshed command permissions into the latter. Since _toolshedCommandPermissions is NEVER actually used in checking whether a player can execute a command, all toolshed commands remained unavailable to anyone without +HOST. This PR provides a bandaid fix for that: it makes it so that the same permissions are loaded into both managers at the same time. It's necessary to load them into _commandPermissions in order to allow regular players to execute them, and it's also necessary to load them into _toolshedCommandPermissions because otherwise the ToolshedManager will complain about those commands lacking permission flags. This should also fixes some commands such as `spawn`, `pos`, `comp` being inaccessible to admins with +DEBUG and more.

Media

![image](https://github.com/user-attachments/assets/12afedef-0db3-43f2-8335-e95582a4a3f9) ![image](https://github.com/user-attachments/assets/f23ae98a-1e1b-4d28-8446-ca60e8239a03) Admin-only commands are unaffected: ![image](https://github.com/user-attachments/assets/d64a5a8d-f184-4a9d-bc71-ae80635df626)

--- # Changelog :cl: - fix: Fixed toolshed command permissions. This will mostly affect admins who don't have full host access. --- Content.Server/Administration/Managers/AdminManager.cs | 8 +++++++- Resources/toolshedEngineCommandPerms.yml | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/Content.Server/Administration/Managers/AdminManager.cs b/Content.Server/Administration/Managers/AdminManager.cs index 19c56282937..ec284fcadce 100644 --- a/Content.Server/Administration/Managers/AdminManager.cs +++ b/Content.Server/Administration/Managers/AdminManager.cs @@ -279,7 +279,13 @@ public void Initialize() _commandPermissions.LoadPermissionsFromStream(efs); } - if (_res.TryContentFileRead(new ResPath("/toolshedEngineCommandPerms.yml"), out var toolshedPerms)) + var toolshedPermsPath = new ResPath("/toolshedEngineCommandPerms.yml"); + if (_res.TryContentFileRead(toolshedPermsPath, out var toolshedPerms)) + { + _commandPermissions.LoadPermissionsFromStream(toolshedPerms); + } + // This may or may not be necessary. We read the same file again and load the same permissions into a different manager. + if (_res.TryContentFileRead(toolshedPermsPath, out toolshedPerms)) { _toolshedCommandPermissions.LoadPermissionsFromStream(toolshedPerms); } diff --git a/Resources/toolshedEngineCommandPerms.yml b/Resources/toolshedEngineCommandPerms.yml index ac7ffddd5f9..97de43e0b1f 100644 --- a/Resources/toolshedEngineCommandPerms.yml +++ b/Resources/toolshedEngineCommandPerms.yml @@ -50,7 +50,8 @@ - methods - ioc -- Commands: +- Flags: ADMIN + Commands: - fuck - ent - as From 41a5e8e7aa3163f484a2c62c49c8177e525ed5ee Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 29 Jul 2024 05:54:25 +0000 Subject: [PATCH 004/143] Automatic Changelog Update (#572) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index af8ccbba92d..304fb04dc14 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4664,3 +4664,11 @@ Entries: message: New Box Textures! id: 6186 time: '2024-07-29T05:50:43.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: >- + Fixed toolshed command permissions. This will mostly affect admins who + don't have full host access. + id: 6187 + time: '2024-07-29T05:54:01.0000000+00:00' From a9e28ee3b6da46b2ef1ca11996cf86324cb9eef0 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 29 Jul 2024 02:00:25 -0400 Subject: [PATCH 005/143] Radiation Doesn't Prevent DoAfters (#606) # Description I got so pissed off that being near a singularity means you can't crowbar doors, that shortly after dying to a singularity because of said bullshit, I had written this before an emergency shuttle even arrived to pick up the crew. # Changelog :cl: - fix: Radiation damage no longer interrupts DoAfters. --- Content.Shared/DoAfter/SharedDoAfterSystem.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.cs index 9e81c91550f..3b0ba58f55a 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.cs @@ -65,7 +65,8 @@ private void OnDamage(EntityUid uid, DoAfterComponent component, DamageChangedEv { // If we're applying state then let the server state handle the do_after prediction. // This is to avoid scenarios where a do_after is erroneously cancelled on the final tick. - if (!args.InterruptsDoAfters || !args.DamageIncreased || args.DamageDelta == null || GameTiming.ApplyingState) + if (!args.InterruptsDoAfters || !args.DamageIncreased || args.DamageDelta == null || GameTiming.ApplyingState + || args.DamageDelta.DamageDict.ContainsKey("Radiation")) //Sanity check so people can crowbar doors open to flee from Lord Singuloth return; var delta = args.DamageDelta.GetTotal(); From 7c5625beb7c5f0895ba4db95f8014321b2e17342 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 29 Jul 2024 06:00:52 +0000 Subject: [PATCH 006/143] Automatic Changelog Update (#606) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 304fb04dc14..56389a65d6f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4672,3 +4672,9 @@ Entries: don't have full host access. id: 6187 time: '2024-07-29T05:54:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: Radiation damage no longer interrupts DoAfters. + id: 6188 + time: '2024-07-29T06:00:26.0000000+00:00' From 54c119ecfd06f727c8847a14d33eae9d69a69737 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Mon, 29 Jul 2024 15:17:34 -0700 Subject: [PATCH 007/143] Make Jobs & Antags Use CharacterRequirements (#596) # Description - Makes jobs use CharacterRequirements - Makes antags use CharReqs - Splits CharReqs into multiple files - Adds a Whitelist CharReq - Prays the tests pass --- --------- Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: VMSolidus --- Content.Client/LateJoin/LateJoinGui.cs | 23 +- Content.Client/Lobby/LobbyUIController.cs | 12 +- .../JobRequirementsManager.cs | 47 +- .../Preferences/UI/AntagPreferenceSelector.cs | 26 +- .../UI/HumanoidProfileEditor.xaml.cs | 53 ++- .../Preferences/UI/JobPrioritySelector.cs | 3 +- .../UI/LoadoutPreferenceSelector.cs | 9 +- .../Preferences/UI/RequirementsSelector.cs | 5 +- .../Preferences/UI/TraitPreferenceSelector.cs | 9 +- .../Ghost/Controls/Roles/GhostRolesEui.cs | 28 +- .../Clothing/Systems/LoadoutSystem.cs | 4 +- .../Roles/Components/GhostRoleComponent.cs | 3 +- .../PlayTimeTrackingSystem.cs | 51 +- Content.Server/Traits/TraitSystem.cs | 6 +- Content.Shared/CCVar/CCVars.cs | 2 +- .../Loadouts/Systems/LoadoutSystem.cs | 16 +- .../Systems/CharacterRequirements.Job.cs | 299 ++++++++++++ .../Systems/CharacterRequirements.Profile.cs | 157 ++++++ .../CharacterRequirements.Whitelist.cs | 28 ++ .../Systems/CharacterRequirements.cs | 449 +----------------- .../Systems/CharacterRequirementsSystem.cs | 32 +- .../DeltaV/Roles/JobRequirements.Whitelist.cs | 11 - .../Ghost/Roles/GhostRolesEuiMessages.cs | 3 +- Content.Shared/Roles/AntagPrototype.cs | 3 +- Content.Shared/Roles/JobPrototype.cs | 3 +- Content.Shared/Roles/JobRequirements.cs | 232 --------- .../customization/character-requirements.ftl | 36 +- .../Entities/Markers/Spawners/ghost_roles.yml | 4 +- .../Roles/Jobs/Medical/medical_borg.yml | 6 +- .../DeltaV/Roles/Jobs/Security/brigmedic.yml | 4 +- .../Entities/Markers/Spawners/ghost_roles.yml | 4 +- .../Roles/Jobs/Epistemics/forensicmantis.yml | 6 +- .../Roles/Jobs/Security/prisonguard.yml | 6 +- .../Roles/Jobs/Wildcards/gladiator.yml | 2 +- .../Roles/Jobs/Wildcards/martialartist.yml | 4 +- .../Roles/Jobs/Wildcards/prisoner.yml | 2 +- Resources/Prototypes/Roles/Antags/ninja.yml | 4 +- Resources/Prototypes/Roles/Antags/nukeops.yml | 28 +- .../Prototypes/Roles/Antags/revolutionary.yml | 8 +- Resources/Prototypes/Roles/Antags/traitor.yml | 4 +- Resources/Prototypes/Roles/Antags/zombie.yml | 4 +- .../Roles/Jobs/Cargo/quartermaster.yml | 20 +- .../Roles/Jobs/Cargo/salvage_specialist.yml | 4 +- .../Roles/Jobs/Civilian/bartender.yml | 4 +- .../Roles/Jobs/Civilian/chaplain.yml | 4 +- .../Prototypes/Roles/Jobs/Civilian/chef.yml | 8 +- .../Prototypes/Roles/Jobs/Civilian/clown.yml | 4 +- .../Prototypes/Roles/Jobs/Civilian/lawyer.yml | 8 +- .../Roles/Jobs/Civilian/librarian.yml | 4 +- .../Prototypes/Roles/Jobs/Civilian/mime.yml | 4 +- .../Roles/Jobs/Civilian/musician.yml | 4 +- .../Roles/Jobs/Civilian/service_worker.yml | 4 +- .../Prototypes/Roles/Jobs/Command/captain.yml | 28 +- .../Roles/Jobs/Command/head_of_personnel.yml | 26 +- .../Engineering/atmospheric_technician.yml | 4 +- .../Roles/Jobs/Engineering/chief_engineer.yml | 10 +- .../Jobs/Engineering/senior_engineer.yml | 16 +- .../Jobs/Engineering/station_engineer.yml | 4 +- .../Jobs/Engineering/technical_assistant.yml | 4 +- .../Prototypes/Roles/Jobs/Medical/chemist.yml | 4 +- .../Jobs/Medical/chief_medical_officer.yml | 14 +- .../Roles/Jobs/Medical/medical_doctor.yml | 4 +- .../Roles/Jobs/Medical/paramedic.yml | 4 +- .../Roles/Jobs/Medical/senior_physician.yml | 16 +- .../Prototypes/Roles/Jobs/Science/borg.yml | 4 +- .../Roles/Jobs/Science/research_director.yml | 8 +- .../Roles/Jobs/Science/scientist.yml | 4 +- .../Roles/Jobs/Science/senior_researcher.yml | 4 +- .../Roles/Jobs/Security/detective.yml | 4 +- .../Roles/Jobs/Security/head_of_security.yml | 14 +- .../Roles/Jobs/Security/security_cadet.yml | 4 +- .../Roles/Jobs/Security/security_officer.yml | 4 +- .../Roles/Jobs/Security/senior_officer.yml | 22 +- .../Prototypes/Roles/Jobs/Security/warden.yml | 12 +- .../Prototypes/Roles/Jobs/Wildcards/boxer.yml | 4 +- .../Roles/Jobs/Wildcards/psychologist.yml | 8 +- .../Roles/Jobs/Wildcards/reporter.yml | 4 +- .../Roles/Jobs/Wildcards/zookeeper.yml | 4 +- 78 files changed, 925 insertions(+), 1013 deletions(-) create mode 100644 Content.Shared/Customization/Systems/CharacterRequirements.Job.cs create mode 100644 Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs create mode 100644 Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs delete mode 100644 Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs delete mode 100644 Content.Shared/Roles/JobRequirements.cs diff --git a/Content.Client/LateJoin/LateJoinGui.cs b/Content.Client/LateJoin/LateJoinGui.cs index ba9351d6746..c9737e09b13 100644 --- a/Content.Client/LateJoin/LateJoinGui.cs +++ b/Content.Client/LateJoin/LateJoinGui.cs @@ -4,9 +4,13 @@ using Content.Client.GameTicking.Managers; using Content.Client.UserInterface.Controls; using Content.Client.Players.PlayTimeTracking; +using Content.Client.Preferences; using Content.Shared.CCVar; +using Content.Shared.Customization.Systems; +using Content.Shared.Preferences; using Content.Shared.Roles; using Content.Shared.StatusIcon; +using Microsoft.Win32.SafeHandles; using Robust.Client.Console; using Robust.Client.GameObjects; using Robust.Client.UserInterface; @@ -26,6 +30,9 @@ public sealed class LateJoinGui : DefaultWindow [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IEntitySystemManager _entitySystem = default!; [Dependency] private readonly JobRequirementsManager _jobRequirements = default!; + [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IClientPreferencesManager _prefs = default!; public event Action<(NetEntity, string)> SelectedId; @@ -254,14 +261,24 @@ private void RebuildUI() jobButton.OnPressed += _ => SelectedId.Invoke((id, jobButton.JobId)); - if (!_jobRequirements.IsAllowed(prototype, out var reason)) + if (!_characterRequirements.CheckRequirementsValid( + prototype.Requirements ?? new(), + prototype, + (HumanoidCharacterProfile) (_prefs.Preferences?.SelectedCharacter + ?? HumanoidCharacterProfile.DefaultWithSpecies()), + _jobRequirements.GetPlayTimes(), + _jobRequirements.IsWhitelisted(), + _entityManager, + _prototypeManager, + _configManager, + out var reasons)) { jobButton.Disabled = true; - if (!reason.IsEmpty) + if (reasons.Count > 0) { var tooltip = new Tooltip(); - tooltip.SetMessage(reason); + tooltip.SetMessage(_characterRequirements.GetRequirementsText(reasons)); jobButton.TooltipSupplier = _ => tooltip; } diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs index 36f43d6f4aa..3e7eb84b998 100644 --- a/Content.Client/Lobby/LobbyUIController.cs +++ b/Content.Client/Lobby/LobbyUIController.cs @@ -2,6 +2,7 @@ using Content.Client.Humanoid; using Content.Client.Inventory; using Content.Client.Lobby.UI; +using Content.Client.Players.PlayTimeTracking; using Content.Client.Preferences; using Content.Client.Preferences.UI; using Content.Shared.Clothing.Loadouts.Systems; @@ -23,6 +24,7 @@ public sealed class LobbyUIController : UIController, IOnStateEntered diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index df73f5ff3f4..a38d4e2f308 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.CCVar; +using Content.Shared.Customization.Systems; using Content.Shared.Players; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Roles; @@ -17,9 +18,6 @@ public sealed partial class JobRequirementsManager : ISharedPlaytimeManager { [Dependency] private readonly IBaseClient _client = default!; [Dependency] private readonly IClientNetManager _net = default!; - [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly IEntityManager _entManager = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypes = default!; private readonly Dictionary _roles = new(); @@ -80,43 +78,6 @@ private void RxPlayTime(MsgPlayTime message) Updated?.Invoke(); } - public bool IsAllowed(JobPrototype job, [NotNullWhen(false)] out FormattedMessage? reason) - { - reason = null; - - if (_roleBans.Contains($"Job:{job.ID}")) - { - reason = FormattedMessage.FromUnformatted(Loc.GetString("role-ban")); - return false; - } - - var player = _playerManager.LocalSession; - if (player == null) - return true; - - return CheckRoleTime(job.Requirements, out reason); - } - - public bool CheckRoleTime(HashSet? requirements, [NotNullWhen(false)] out FormattedMessage? reason, string? localePrefix = "role-timer-") - { - reason = null; - - if (requirements == null || !_cfg.GetCVar(CCVars.GameRoleTimers)) - return true; - - var reasons = new List(); - foreach (var requirement in requirements) - { - if (JobRequirements.TryRequirementMet(requirement, _roles, out var jobReason, _entManager, _prototypes, _whitelisted, localePrefix)) - continue; - - reasons.Add(jobReason.ToMarkup()); - } - - reason = reasons.Count == 0 ? null : FormattedMessage.FromMarkup(string.Join('\n', reasons)); - return reason == null; - } - public TimeSpan FetchOverallPlaytime() { return _roles.TryGetValue("Overall", out var overallPlaytime) ? overallPlaytime : TimeSpan.Zero; @@ -137,12 +98,8 @@ public Dictionary FetchPlaytimeByRoles() public Dictionary GetPlayTimes() { - var dict = new Dictionary(); - + var dict = FetchPlaytimeByRoles(); dict.Add(PlayTimeTrackingShared.TrackerOverall, FetchOverallPlaytime()); - foreach (var role in FetchPlaytimeByRoles()) - dict.Add(role.Key, role.Value); - return dict; } } diff --git a/Content.Client/Preferences/UI/AntagPreferenceSelector.cs b/Content.Client/Preferences/UI/AntagPreferenceSelector.cs index 06694f51168..872b783c2f9 100644 --- a/Content.Client/Preferences/UI/AntagPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/AntagPreferenceSelector.cs @@ -1,5 +1,9 @@ using Content.Client.Players.PlayTimeTracking; +using Content.Shared.Customization.Systems; +using Content.Shared.Preferences; using Content.Shared.Roles; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; namespace Content.Client.Preferences.UI; @@ -14,7 +18,7 @@ public bool Preference public event Action? PreferenceChanged; - public AntagPreferenceSelector(AntagPrototype proto) : base(proto) + public AntagPreferenceSelector(AntagPrototype proto, JobPrototype highJob) : base(proto, highJob) { Options.OnItemSelected += _ => PreferenceChanged?.Invoke(Preference); @@ -30,7 +34,23 @@ public AntagPreferenceSelector(AntagPrototype proto) : base(proto) // Immediately lock requirements if they aren't met. // Another function checks Disabled after creating the selector so this has to be done now var requirements = IoCManager.Resolve(); - if (proto.Requirements != null && !requirements.CheckRoleTime(proto.Requirements, out var reason)) - LockRequirements(reason); + var prefs = IoCManager.Resolve(); + var entMan = IoCManager.Resolve(); + var characterReqs = entMan.System(); + var protoMan = IoCManager.Resolve(); + var configMan = IoCManager.Resolve(); + + if (proto.Requirements != null + && !characterReqs.CheckRequirementsValid( + proto.Requirements, + highJob, + (HumanoidCharacterProfile) (prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), + requirements.GetPlayTimes(), + requirements.IsWhitelisted(), + entMan, + protoMan, + configMan, + out var reasons)) + LockRequirements(characterReqs.GetRequirementsText(reasons)); } } diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 771d928ebf9..8d31ea92280 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -115,7 +115,7 @@ public HumanoidProfileEditor(IClientPreferencesManager preferencesManager, IProt _preferencesManager = preferencesManager; _configurationManager = configurationManager; _markingManager = IoCManager.Resolve(); - _characterRequirementsSystem = EntitySystem.Get(); + _characterRequirementsSystem = _entityManager.System(); _controller = UserInterfaceManager.GetUIController(); _controller.SetProfileEditor(this); @@ -642,7 +642,9 @@ private void UpdateAntagRequirements() if (!antag.SetPreference) continue; - var selector = new AntagPreferenceSelector(antag) + var selector = new AntagPreferenceSelector(antag, + _jobPriorities.FirstOrDefault(j => j.Priority == JobPriority.High)?.HighJob + ?? new()) { Margin = new Thickness(3f, 3f, 3f, 0f) }; _antagList.AddChild(selector); _antagPreferences.Add(selector); @@ -723,10 +725,17 @@ private void UpdateRoleRequirements() { var selector = new JobPrioritySelector(job, _prototypeManager); - if (!_requirements.IsAllowed(job, out var reason)) - { - selector.LockRequirements(reason); - } + if (!_characterRequirementsSystem.CheckRequirementsValid( + job.Requirements ?? new(), + job, + Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), + _requirements.GetPlayTimes(), + _requirements.IsWhitelisted(), + _entityManager, + _prototypeManager, + _configurationManager, + out var reasons)) + selector.LockRequirements(_characterRequirementsSystem.GetRequirementsText(reasons)); category.AddChild(selector); _jobPriorities.Add(selector); @@ -770,7 +779,17 @@ private void EnsureJobRequirementsValid() var changed = false; foreach (var selector in _jobPriorities) { - if (_requirements.IsAllowed(selector.Proto, out var _) || selector.Priority == JobPriority.Never) + if (selector.Priority == JobPriority.Never + || _characterRequirementsSystem.CheckRequirementsValid( + selector.Proto.Requirements ?? new(), + selector.Proto, + Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), + _requirements.GetPlayTimes(), + _requirements.IsWhitelisted(), + _entityManager, + _prototypeManager, + _configurationManager, + out _)) continue; selector.Priority = JobPriority.Never; @@ -1412,11 +1431,11 @@ private void UpdateTraits(bool showUnusable) var traits = enumeratedTraits.Where(trait => showUnusable || // Ignore everything if this is true _characterRequirementsSystem.CheckRequirementsValid( - trait, trait.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), _requirements.GetPlayTimes(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1427,11 +1446,11 @@ out _ // Traits to highlight red when showUnusable is true var traitsUnusable = enumeratedTraits.Where(trait => _characterRequirementsSystem.CheckRequirementsValid( - trait, trait.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), _requirements.GetPlayTimes(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1538,7 +1557,8 @@ out _ var selector = new TraitPreferenceSelector(trait, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), traitsUnusable.Contains(trait) ? "" : "ButtonColorRed", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); // Look for an existing trait category BoxContainer? match = null; @@ -1570,7 +1590,8 @@ out _ { var selector = new TraitPreferenceSelector(trait, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), "", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); AddSelector(selector, trait.Points, trait.ID); @@ -1671,11 +1692,11 @@ private void UpdateLoadouts(bool showUnusable) var loadouts = enumeratedLoadouts.Where(loadout => showUnusable || // Ignore everything if this is true _characterRequirementsSystem.CheckRequirementsValid( - loadout, loadout.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), _requirements.GetPlayTimes(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1686,11 +1707,11 @@ out _ // Loadouts to highlight red when showUnusable is true var loadoutsUnusable = enumeratedLoadouts.Where(loadout => _characterRequirementsSystem.CheckRequirementsValid( - loadout, loadout.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), _requirements.GetPlayTimes(), + _requirements.IsWhitelisted(), _entityManager, _prototypeManager, _configurationManager, @@ -1800,7 +1821,8 @@ out _ var selector = new LoadoutPreferenceSelector(loadout, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), loadoutsUnusable.Contains(loadout) ? "" : "ButtonColorRed", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); // Look for an existing loadout category BoxContainer? match = null; @@ -1829,7 +1851,8 @@ out _ { var selector = new LoadoutPreferenceSelector(loadout, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), "", - _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem); + _entityManager, _prototypeManager, _configurationManager, _characterRequirementsSystem, + _requirements); AddSelector(selector, loadout.Cost, loadout.ID); diff --git a/Content.Client/Preferences/UI/JobPrioritySelector.cs b/Content.Client/Preferences/UI/JobPrioritySelector.cs index 2e2c699c3ad..f66102d644f 100644 --- a/Content.Client/Preferences/UI/JobPrioritySelector.cs +++ b/Content.Client/Preferences/UI/JobPrioritySelector.cs @@ -4,6 +4,7 @@ using Content.Shared.StatusIcon; using Robust.Client.UserInterface.Controls; using Robust.Client.Utility; +using Robust.Shared.CPUJob.JobQueues; using Robust.Shared.Prototypes; namespace Content.Client.Preferences.UI; @@ -18,7 +19,7 @@ public JobPriority Priority public event Action? PriorityChanged; - public JobPrioritySelector(JobPrototype proto, IPrototypeManager protoMan) : base(proto) + public JobPrioritySelector(JobPrototype proto, IPrototypeManager protoMan) : base(proto, proto) { Options.OnItemSelected += _ => PriorityChanged?.Invoke(Priority); diff --git a/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs b/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs index a6839dee65f..82d8fd65b33 100644 --- a/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/LoadoutPreferenceSelector.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Numerics; using System.Text; +using Content.Client.Players.PlayTimeTracking; using Content.Client.Stylesheets; using Content.Shared.Clothing.Loadouts.Prototypes; using Content.Shared.Customization.Systems; @@ -32,7 +33,8 @@ public bool Preference public LoadoutPreferenceSelector(LoadoutPrototype loadout, JobPrototype highJob, HumanoidCharacterProfile profile, string style, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem) + IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem, + JobRequirementsManager jobRequirementsManager) { Loadout = loadout; @@ -94,8 +96,9 @@ public LoadoutPreferenceSelector(LoadoutPrototype loadout, JobPrototype highJob, // Get requirement reasons - characterRequirementsSystem.CheckRequirementsValid(loadout, loadout.Requirements, highJob, profile, - new Dictionary(), + characterRequirementsSystem.CheckRequirementsValid( + loadout.Requirements, highJob, profile, new Dictionary(), + jobRequirementsManager.IsWhitelisted(), entityManager, prototypeManager, configManager, out var reasons); diff --git a/Content.Client/Preferences/UI/RequirementsSelector.cs b/Content.Client/Preferences/UI/RequirementsSelector.cs index a4a25536d09..83b96952886 100644 --- a/Content.Client/Preferences/UI/RequirementsSelector.cs +++ b/Content.Client/Preferences/UI/RequirementsSelector.cs @@ -1,6 +1,7 @@ using System.Numerics; using Content.Client.Stylesheets; using Content.Client.UserInterface.Controls; +using Content.Shared.Roles; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Prototypes; @@ -11,14 +12,16 @@ namespace Content.Client.Preferences.UI; public abstract class RequirementsSelector : BoxContainer where T : IPrototype { public T Proto { get; } + public JobPrototype HighJob { get; } public bool Disabled => _lockStripe.Visible; protected readonly RadioOptions Options; private readonly StripeBack _lockStripe; - protected RequirementsSelector(T proto) + protected RequirementsSelector(T proto, JobPrototype highJob) { Proto = proto; + HighJob = highJob; Options = new RadioOptions(RadioOptionsLayout.Horizontal) { diff --git a/Content.Client/Preferences/UI/TraitPreferenceSelector.cs b/Content.Client/Preferences/UI/TraitPreferenceSelector.cs index 0f843ca3a58..e9ce1a5e9be 100644 --- a/Content.Client/Preferences/UI/TraitPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/TraitPreferenceSelector.cs @@ -1,4 +1,5 @@ using System.Text; +using Content.Client.Players.PlayTimeTracking; using Content.Client.Stylesheets; using Content.Shared.Customization.Systems; using Content.Shared.Preferences; @@ -30,7 +31,8 @@ public bool Preference public TraitPreferenceSelector(TraitPrototype trait, JobPrototype highJob, HumanoidCharacterProfile profile, string style, IEntityManager entityManager, IPrototypeManager prototypeManager, - IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem) + IConfigurationManager configManager, CharacterRequirementsSystem characterRequirementsSystem, + JobRequirementsManager jobRequirementsManager) { Trait = trait; @@ -71,8 +73,9 @@ public TraitPreferenceSelector(TraitPrototype trait, JobPrototype highJob, // Get requirement reasons - characterRequirementsSystem.CheckRequirementsValid(trait, trait.Requirements, highJob, profile, - new Dictionary(), + characterRequirementsSystem.CheckRequirementsValid( + trait.Requirements, highJob, profile, new Dictionary(), + jobRequirementsManager.IsWhitelisted(), entityManager, prototypeManager, configManager, out var reasons); diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs index 8e72eafd97c..d0fd3a80c3b 100644 --- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs +++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs @@ -1,10 +1,15 @@ using System.Linq; using Content.Client.Eui; using Content.Client.Players.PlayTimeTracking; +using Content.Client.Preferences; +using Content.Shared.Customization.Systems; using Content.Shared.Eui; using Content.Shared.Ghost.Roles; +using Content.Shared.Preferences; using JetBrains.Annotations; using Robust.Client.GameObjects; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Client.UserInterface.Systems.Ghost.Controls.Roles @@ -71,6 +76,10 @@ public override void HandleState(EuiStateBase state) var sysManager = entityManager.EntitySysManager; var spriteSystem = sysManager.GetEntitySystem(); var requirementsManager = IoCManager.Resolve(); + var characterReqs = entityManager.System(); + var prefs = IoCManager.Resolve(); + var protoMan = IoCManager.Resolve(); + var configManager = IoCManager.Resolve(); var groupedRoles = ghostState.GhostRoles.GroupBy( role => (role.Name, role.Description, role.Requirements)); @@ -78,15 +87,22 @@ public override void HandleState(EuiStateBase state) { var name = group.Key.Name; var description = group.Key.Description; - bool hasAccess = true; - FormattedMessage? reason; + // ReSharper disable once ReplaceWithSingleAssignment.True + var hasAccess = true; - if (!requirementsManager.CheckRoleTime(group.Key.Requirements, out reason)) - { + if (!characterReqs.CheckRequirementsValid( + group.Key.Requirements ?? new(), + new(), + (HumanoidCharacterProfile) (prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), + requirementsManager.GetPlayTimes(), + requirementsManager.IsWhitelisted(), + entityManager, + protoMan, + configManager, + out var reasons)) hasAccess = false; - } - _window.AddEntry(name, description, hasAccess, reason, group, spriteSystem); + _window.AddEntry(name, description, hasAccess, characterReqs.GetRequirementsText(reasons), group, spriteSystem); } var closeRulesWindow = ghostState.GhostRoles.All(role => role.Identifier != _windowRulesId); diff --git a/Content.Server/Clothing/Systems/LoadoutSystem.cs b/Content.Server/Clothing/Systems/LoadoutSystem.cs index c22f7afb598..73d5ae387ab 100644 --- a/Content.Server/Clothing/Systems/LoadoutSystem.cs +++ b/Content.Server/Clothing/Systems/LoadoutSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.CCVar; using Content.Shared.Inventory; using Content.Shared.Item; +using Content.Shared.Players; using Content.Shared.Storage; using Content.Shared.Storage.EntitySystems; using Robust.Shared.Configuration; @@ -31,7 +32,8 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent ev) return; // Spawn the loadout, get a list of items that failed to equip - var failedLoadouts = _loadout.ApplyCharacterLoadout(ev.Mob, ev.JobId, ev.Profile, _playTimeTracking.GetTrackerTimes(ev.Player)); + var failedLoadouts = _loadout.ApplyCharacterLoadout(ev.Mob, ev.JobId, ev.Profile, + _playTimeTracking.GetTrackerTimes(ev.Player), ev.Player.ContentData()?.Whitelisted ?? false); // Try to find back-mounted storage apparatus if (!_inventory.TryGetSlotEntity(ev.Mob, "back", out var item) || diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs index abb26a8c8bc..997961ae675 100644 --- a/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs +++ b/Content.Server/Ghost/Roles/Components/GhostRoleComponent.cs @@ -1,4 +1,5 @@ using Content.Server.Mind.Commands; +using Content.Shared.Customization.Systems; using Content.Shared.Roles; namespace Content.Server.Ghost.Roles.Components @@ -14,7 +15,7 @@ public sealed partial class GhostRoleComponent : Component [DataField("rules")] private string _roleRules = "ghost-role-component-default-rules"; [DataField("requirements")] - public HashSet? Requirements; + public List? Requirements; /// /// Whether the should run on the mob. diff --git a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs index 57c6466ebbb..8368388d81e 100644 --- a/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs +++ b/Content.Server/Players/PlayTimeTracking/PlayTimeTrackingSystem.cs @@ -3,12 +3,15 @@ using Content.Server.Afk.Events; using Content.Server.GameTicking; using Content.Server.Mind; +using Content.Server.Preferences.Managers; using Content.Shared.CCVar; +using Content.Shared.Customization.Systems; using Content.Shared.GameTicking; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Players; using Content.Shared.Players.PlayTimeTracking; +using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Server.GameObjects; using Robust.Server.Player; @@ -31,6 +34,10 @@ public sealed class PlayTimeTrackingSystem : EntitySystem [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly PlayTimeTrackingManager _tracking = default!; + [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; + [Dependency] private readonly IServerPreferencesManager _prefs = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + public override void Initialize() { @@ -173,7 +180,16 @@ public bool IsAllowed(ICommonSession player, string role) var isWhitelisted = player.ContentData()?.Whitelisted ?? false; // DeltaV - Whitelist requirement - return JobRequirements.TryRequirementsMet(job, playTimes, out _, EntityManager, _prototypes, isWhitelisted); + return _characterRequirements.CheckRequirementsValid( + job.Requirements, + job, + (HumanoidCharacterProfile) _prefs.GetPreferences(player.UserId).SelectedCharacter, + playTimes, + isWhitelisted, + EntityManager, + _prototypes, + _config, + out _); } public HashSet GetDisallowedJobs(ICommonSession player) @@ -194,13 +210,19 @@ public HashSet GetDisallowedJobs(ICommonSession player) { if (job.Requirements != null) { - foreach (var requirement in job.Requirements) - { - if (JobRequirements.TryRequirementMet(requirement, playTimes, out _, EntityManager, _prototypes, isWhitelisted)) - continue; + if (_characterRequirements.CheckRequirementsValid( + job.Requirements, + job, + (HumanoidCharacterProfile) _prefs.GetPreferences(player.UserId).SelectedCharacter, + playTimes, + isWhitelisted, + EntityManager, + _prototypes, + _config, + out _)) + continue; - goto NoRole; - } + goto NoRole; } roles.Add(job.ID); @@ -234,14 +256,19 @@ public void RemoveDisallowedJobs(NetUserId userId, ref List jobs) jobber.Requirements.Count == 0) continue; - foreach (var requirement in jobber.Requirements) + if (!_characterRequirements.CheckRequirementsValid( + jobber.Requirements, + jobber, + (HumanoidCharacterProfile) _prefs.GetPreferences(userId).SelectedCharacter, + _tracking.GetPlayTimes(_playerManager.GetSessionById(userId)), + _playerManager.GetSessionById(userId).ContentData()?.Whitelisted ?? false, + EntityManager, + _prototypes, + _config, + out _)) { - if (JobRequirements.TryRequirementMet(requirement, playTimes, out _, EntityManager, _prototypes, isWhitelisted)) - continue; - jobs.RemoveSwap(i); i--; - break; } } } diff --git a/Content.Server/Traits/TraitSystem.cs b/Content.Server/Traits/TraitSystem.cs index be2c3c05039..628cb43b8d2 100644 --- a/Content.Server/Traits/TraitSystem.cs +++ b/Content.Server/Traits/TraitSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Customization.Systems; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; +using Content.Shared.Players; using Content.Shared.Roles; using Content.Shared.Traits; using Pidgin.Configuration; @@ -40,9 +41,10 @@ private void OnPlayerSpawnComplete(PlayerSpawnCompleteEvent args) return; } - if (!_characterRequirements.CheckRequirementsValid(traitPrototype, traitPrototype.Requirements, + if (!_characterRequirements.CheckRequirementsValid( + traitPrototype.Requirements, _prototype.Index(args.JobId ?? _prototype.EnumeratePrototypes().First().ID), - args.Profile, _playTimeTracking.GetTrackerTimes(args.Player), + args.Profile, _playTimeTracking.GetTrackerTimes(args.Player), args.Player.ContentData()?.Whitelisted ?? false, EntityManager, _prototype, _configuration, out _)) continue; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 04e680390ce..3c3bfa8862d 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1432,7 +1432,7 @@ public static readonly CVarDef /// Controls whether the server will deny any players that are not whitelisted in the DB. /// public static readonly CVarDef WhitelistEnabled = - CVarDef.Create("whitelist.enabled", false, CVar.SERVERONLY); + CVarDef.Create("whitelist.enabled", false, CVar.REPLICATED); /// /// The loc string to display as a disconnect reason when someone is not whitelisted. diff --git a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs index 09e3db3793f..e7a0eef80ee 100644 --- a/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs +++ b/Content.Shared/Clothing/Loadouts/Systems/LoadoutSystem.cs @@ -38,12 +38,11 @@ private void OnMapInit(EntityUid uid, LoadoutComponent component, MapInitEvent a } - /// - public List ApplyCharacterLoadout(EntityUid uid, string job, HumanoidCharacterProfile profile, - Dictionary? playTimes = null) + public List ApplyCharacterLoadout(EntityUid uid, ProtoId job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted) { - var jobPrototype = _prototype.Index(job); - return ApplyCharacterLoadout(uid, jobPrototype, profile, playTimes); + var jobPrototype = _prototype.Index(job); + return ApplyCharacterLoadout(uid, jobPrototype, profile, playTimes, whitelisted); } /// @@ -53,9 +52,10 @@ public List ApplyCharacterLoadout(EntityUid uid, string job, Humanoid /// The job to use for loadout whitelist/blacklist (should be the job of the entity) /// The profile to get loadout items from (should be the entity's, or at least have the same species as the entity) /// Playtime for the player for use with playtime requirements + /// If the player is whitelisted /// A list of loadout items that couldn't be equipped but passed checks public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary? playTimes = null) + Dictionary playTimes, bool whitelisted) { var failedLoadouts = new List(); @@ -68,8 +68,8 @@ public List ApplyCharacterLoadout(EntityUid uid, JobPrototype job, Hu continue; - if (!_characterRequirements.CheckRequirementsValid(loadoutProto, loadoutProto.Requirements, job, profile, - playTimes ?? new Dictionary(), + if (!_characterRequirements.CheckRequirementsValid( + loadoutProto.Requirements, job, profile, playTimes, whitelisted, EntityManager, _prototype, _configuration, out _)) continue; diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Job.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Job.cs new file mode 100644 index 00000000000..fe44f2ccc06 --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Job.cs @@ -0,0 +1,299 @@ +using System.Linq; +using Content.Shared.CCVar; +using Content.Shared.Players.PlayTimeTracking; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Roles.Jobs; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +/// +/// Requires the selected job to be one of the specified jobs +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterJobRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Jobs; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var jobs = new List(); + + // Get the job names and department colors + foreach (var j in Jobs) + { + var jobProto = prototypeManager.Index(j); + var color = Color.LightBlue; + + foreach (var dept in prototypeManager.EnumeratePrototypes() + .OrderBy(d => Loc.GetString($"department-{d.ID}"))) + { + if (!dept.Roles.Contains(j)) + continue; + + color = dept.Color; + break; + } + + jobs.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString(jobProto.Name)}[/color]")); + } + + // Join the job names + var jobsList = string.Join(", ", jobs.Select(j => j.ToMarkup())); + var jobsString = Loc.GetString("character-job-requirement", + ("inverted", Inverted), ("jobs", jobsList)); + + reason = FormattedMessage.FromMarkup(jobsString); + return Jobs.Contains(job.ID); + } +} + +/// +/// Requires the selected job to be in one of the specified departments +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterDepartmentRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Departments; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + var departments = new List(); + + // Get the department names and colors + foreach (var d in Departments) + { + var deptProto = prototypeManager.Index(d); + var color = deptProto.Color; + + departments.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString($"department-{deptProto.ID}")}[/color]")); + } + + // Join the department names + var departmentsList = string.Join(", ", departments.Select(d => d.ToMarkup())); + var departmentsString = Loc.GetString("character-department-requirement", + ("inverted", Inverted), ("departments", departmentsList)); + + reason = FormattedMessage.FromMarkup(departmentsString); + return Departments.Any(d => prototypeManager.Index(d).Roles.Contains(job.ID)); + } +} + +/// +/// Requires the playtime for a department to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterDepartmentTimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Department; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + var department = prototypeManager.Index(Department); + + // Combine all of this department's job playtimes + var playtime = TimeSpan.Zero; + foreach (var other in department.Roles) + { + var proto = prototypeManager.Index(other).PlayTimeTracker; + + playTimes.TryGetValue(proto, out var otherTime); + playtime += otherTime; + } + + if (playtime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-too-high", + ("time", playtime.TotalMinutes - Max.TotalMinutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + if (playtime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-insufficient", + ("time", Min.TotalMinutes - playtime.TotalMinutes), + ("department", Loc.GetString($"department-{department.ID}")), + ("departmentColor", department.Color))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the player to have a certain amount of overall job time +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterOverallTimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get the overall time + var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); + + if (overallTime > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-too-high", + ("time", overallTime.TotalMinutes - Max.TotalMinutes))); + return false; + } + + if (overallTime < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-insufficient", + ("time", Min.TotalMinutes - overallTime.TotalMinutes))); + return false; + } + + reason = null; + return true; + } +} + +/// +/// Requires the playtime for a tracker to be within a certain range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterPlaytimeRequirement : CharacterRequirement +{ + [DataField] + public TimeSpan Min = TimeSpan.MinValue; + + [DataField] + public TimeSpan Max = TimeSpan.MaxValue; + + [DataField(required: true)] + public ProtoId Tracker; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + // Disable the requirement if the role timers are disabled + if (!configManager.GetCVar(CCVars.GameRoleTimers)) + { + reason = null; + return !Inverted; + } + + // Get SharedJobSystem + if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) + { + DebugTools.Assert("CharacterRequirements: SharedJobSystem not found"); + reason = null; + return false; + } + + // Get the JobPrototype of the Tracker + var trackerJob = jobSystem.GetJobPrototype(Tracker); + var jobStr = prototypeManager.Index(trackerJob).LocalizedName; + + // Get the primary department of the Tracker + if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && + !jobSystem.TryGetDepartment(trackerJob, out department)) + { + DebugTools.Assert($"CharacterRequirements: Department not found for job {trackerJob}"); + reason = null; + return false; + } + + // Get the time for the tracker + var time = playTimes.GetValueOrDefault(Tracker); + reason = null; + + if (time > Max) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-too-high", + ("time", time.TotalMinutes - Max.TotalMinutes), + ("job", jobStr), + ("departmentColor", department.Color))); + return false; + } + + if (time < Min) + { + // Show the reason if invalid + reason = Inverted + ? null + : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-insufficient", + ("time", Min.TotalMinutes - time.TotalMinutes), + ("job", jobStr), + ("departmentColor", department.Color))); + return false; + } + + return true; + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs new file mode 100644 index 00000000000..aaeae107b9e --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Profile.cs @@ -0,0 +1,157 @@ +using System.Linq; +using Content.Shared.Clothing.Loadouts.Prototypes; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using Content.Shared.Traits; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +/// +/// Requires the profile to be within an age range +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterAgeRequirement : CharacterRequirement +{ + [DataField(required: true)] + public int Min; + + [DataField(required: true)] + public int Max; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-age-requirement", + ("inverted", Inverted), ("min", Min), ("max", Max))); + return profile.Age >= Min && profile.Age <= Max; + } +} + +/// +/// Requires the profile to use either a Backpack, Satchel, or Duffelbag +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterBackpackTypeRequirement : CharacterRequirement +{ + [DataField(required: true)] + public BackpackPreference Preference; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-backpack-type-requirement", + ("inverted", Inverted), + ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Backpack == Preference; + } +} + +/// +/// Requires the profile to use either Jumpsuits or Jumpskirts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterClothingPreferenceRequirement : CharacterRequirement +{ + [DataField(required: true)] + public ClothingPreference Preference; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-clothing-preference-requirement", + ("inverted", Inverted), + ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); + return profile.Clothing == Preference; + } +} + +/// +/// Requires the profile to be a certain species +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterSpeciesRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Species; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + const string color = "green"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", + ("inverted", Inverted), + ("species", $"[color={color}]{string.Join($"[/color], [color={color}]", + Species.Select(s => Loc.GetString(prototypeManager.Index(s).Name)))}[/color]"))); + + return Species.Contains(profile.Species); + } +} + +/// +/// Requires the profile to have one of the specified traits +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterTraitRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Traits; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + const string color = "lightblue"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", + ("inverted", Inverted), + ("traits", $"[color={color}]{string.Join($"[/color], [color={color}]", + Traits.Select(t => Loc.GetString($"trait-name-{t}")))}[/color]"))); + + return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); + } +} + +/// +/// Requires the profile to have one of the specified loadouts +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterLoadoutRequirement : CharacterRequirement +{ + [DataField(required: true)] + public List> Loadouts; + + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + const string color = "lightblue"; + reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", + ("inverted", Inverted), + ("loadouts", $"[color={color}]{string.Join($"[/color], [color={color}]", + Loadouts.Select(l => Loc.GetString($"loadout-name-{l}")))}[/color]"))); + + return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs b/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs new file mode 100644 index 00000000000..56465251cdd --- /dev/null +++ b/Content.Shared/Customization/Systems/CharacterRequirements.Whitelist.cs @@ -0,0 +1,28 @@ +using Content.Shared.CCVar; +using Content.Shared.Preferences; +using Content.Shared.Roles; +using JetBrains.Annotations; +using Robust.Shared.Configuration; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Customization.Systems; + + +/// +/// Requires the player to be whitelisted if whitelists are enabled +/// +[UsedImplicitly] +[Serializable, NetSerializable] +public sealed partial class CharacterWhitelistRequirement : CharacterRequirement +{ + public override bool IsValid(JobPrototype job, HumanoidCharacterProfile profile, + Dictionary playTimes, bool whitelisted, + IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, + out FormattedMessage? reason) + { + reason = FormattedMessage.FromMarkup(Loc.GetString("character-whitelist-requirement", ("inverted", Inverted))); + return !configManager.GetCVar(CCVars.WhitelistEnabled) || whitelisted; + } +} diff --git a/Content.Shared/Customization/Systems/CharacterRequirements.cs b/Content.Shared/Customization/Systems/CharacterRequirements.cs index 4e862aa69e3..b347c9787af 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirements.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirements.cs @@ -1,12 +1,5 @@ -using System.Linq; -using Content.Shared.CCVar; -using Content.Shared.Clothing.Loadouts.Prototypes; -using Content.Shared.Humanoid.Prototypes; -using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Preferences; using Content.Shared.Roles; -using Content.Shared.Roles.Jobs; -using Content.Shared.Traits; using JetBrains.Annotations; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; @@ -22,459 +15,25 @@ public abstract partial class CharacterRequirement { /// /// If true valid requirements will be treated as invalid and vice versa + /// This inversion is done by other systems like , not this one /// [DataField] public bool Inverted; /// /// Checks if this character requirement is valid for the given parameters + ///
+ /// You should probably not be calling this directly, use ///
/// Description for the requirement, shown when not null public abstract bool IsValid( - IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, Dictionary playTimes, + bool whitelisted, IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out FormattedMessage? reason ); } - - -#region HumanoidCharacterProfile - -/// -/// Requires the profile to be within an age range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterAgeRequirement : CharacterRequirement -{ - [DataField(required: true)] - public int Min; - - [DataField(required: true)] - public int Max; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-age-requirement", - ("inverted", Inverted), ("min", Min), ("max", Max))); - return profile.Age >= Min && profile.Age <= Max; - } -} - -/// -/// Requires the profile to use either a Backpack, Satchel, or Duffelbag -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterBackpackTypeRequirement : CharacterRequirement -{ - [DataField(required: true)] - public BackpackPreference Preference; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-backpack-type-requirement", - ("inverted", Inverted), - ("type", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Backpack == Preference; - } -} - -/// -/// Requires the profile to use either Jumpsuits or Jumpskirts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterClothingPreferenceRequirement : CharacterRequirement -{ - [DataField(required: true)] - public ClothingPreference Preference; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - reason = FormattedMessage.FromMarkup(Loc.GetString("character-clothing-preference-requirement", - ("inverted", Inverted), - ("preference", Loc.GetString($"humanoid-profile-editor-preference-{Preference.ToString().ToLower()}")))); - return profile.Clothing == Preference; - } -} - -/// -/// Requires the profile to be a certain species -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterSpeciesRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Species; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - const string color = "green"; - reason = FormattedMessage.FromMarkup(Loc.GetString("character-species-requirement", - ("inverted", Inverted), - ("species", $"[color={color}]{string.Join($"[/color], [color={color}]", - Species.Select(s => Loc.GetString(prototypeManager.Index(s).Name)))}[/color]"))); - - return Species.Contains(profile.Species); - } -} - -/// -/// Requires the profile to have one of the specified traits -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterTraitRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Traits; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - const string color = "lightblue"; - reason = FormattedMessage.FromMarkup(Loc.GetString("character-trait-requirement", - ("inverted", Inverted), - ("traits", $"[color={color}]{string.Join($"[/color], [color={color}]", - Traits.Select(t => Loc.GetString($"trait-name-{t}")))}[/color]"))); - - return Traits.Any(t => profile.TraitPreferences.Contains(t.ToString())); - } -} - -/// -/// Requires the profile to have one of the specified loadouts -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterLoadoutRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Loadouts; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - const string color = "lightblue"; - reason = FormattedMessage.FromMarkup(Loc.GetString("character-loadout-requirement", - ("inverted", Inverted), - ("loadouts", $"[color={color}]{string.Join($"[/color], [color={color}]", - Loadouts.Select(l => Loc.GetString($"loadout-name-{l}")))}[/color]"))); - - return Loadouts.Any(l => profile.LoadoutPreferences.Contains(l.ToString())); - } -} - -#endregion - -#region Jobs - -/// -/// Requires the selected job to be one of the specified jobs -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterJobRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Jobs; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var jobs = new List(); - - // Get the job names and department colors - foreach (var j in Jobs) - { - var jobProto = prototypeManager.Index(j); - var color = Color.LightBlue; - - foreach (var dept in prototypeManager.EnumeratePrototypes() - .OrderBy(d => Loc.GetString($"department-{d.ID}"))) - { - if (!dept.Roles.Contains(j)) - continue; - - color = dept.Color; - break; - } - - jobs.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString(jobProto.Name)}[/color]")); - } - - // Join the job names - var jobsList = string.Join(", ", jobs.Select(j => j.ToMarkup())); - var jobsString = Loc.GetString("character-job-requirement", - ("inverted", Inverted), ("jobs", jobsList)); - - reason = FormattedMessage.FromMarkup(jobsString); - return Jobs.Contains(job.ID); - } -} - -/// -/// Requires the selected job to be in one of the specified departments -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterDepartmentRequirement : CharacterRequirement -{ - [DataField(required: true)] - public List> Departments; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - var departments = new List(); - - // Get the department names and colors - foreach (var d in Departments) - { - var deptProto = prototypeManager.Index(d); - var color = deptProto.Color; - - departments.Add(FormattedMessage.FromMarkup($"[color={color.ToHex()}]{Loc.GetString($"department-{deptProto.ID}")}[/color]")); - } - - // Join the department names - var departmentsList = string.Join(", ", departments.Select(d => d.ToMarkup())); - var departmentsString = Loc.GetString("character-department-requirement", - ("inverted", Inverted), ("departments", departmentsList)); - - reason = FormattedMessage.FromMarkup(departmentsString); - return Departments.Any(d => prototypeManager.Index(d).Roles.Contains(job.ID)); - } -} - -/// -/// Requires the playtime for a department to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterDepartmentTimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Department; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - var department = prototypeManager.Index(Department); - - // Combine all of this department's job playtimes - var playtime = TimeSpan.Zero; - foreach (var other in department.Roles) - { - var proto = prototypeManager.Index(other).PlayTimeTracker; - - playTimes.TryGetValue(proto, out var otherTime); - playtime += otherTime; - } - - if (playtime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-too-high", - ("time", playtime.TotalMinutes - Max.TotalMinutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - if (playtime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-department-insufficient", - ("time", Min.TotalMinutes - playtime.TotalMinutes), - ("department", Loc.GetString($"department-{department.ID}")), - ("departmentColor", department.Color))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the player to have a certain amount of overall job time -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterOverallTimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get the overall time - var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); - - if (overallTime > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-too-high", - ("time", overallTime.TotalMinutes - Max.TotalMinutes))); - return false; - } - - if (overallTime < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-overall-insufficient", - ("time", Min.TotalMinutes - overallTime.TotalMinutes))); - return false; - } - - reason = null; - return true; - } -} - -/// -/// Requires the playtime for a tracker to be within a certain range -/// -[UsedImplicitly] -[Serializable, NetSerializable] -public sealed partial class CharacterPlaytimeRequirement : CharacterRequirement -{ - [DataField] - public TimeSpan Min = TimeSpan.MinValue; - - [DataField] - public TimeSpan Max = TimeSpan.MaxValue; - - [DataField(required: true)] - public ProtoId Tracker; - - public override bool IsValid(IPrototype prototype, JobPrototype job, HumanoidCharacterProfile profile, - Dictionary playTimes, - IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, - out FormattedMessage? reason) - { - // Disable the requirement if the role timers are disabled - if (!configManager.GetCVar(CCVars.GameRoleTimers)) - { - reason = null; - return !Inverted; - } - - // Get SharedJobSystem - if (!entityManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) - { - DebugTools.Assert("CharacterRequirements: SharedJobSystem not found"); - reason = null; - return false; - } - - // Get the JobPrototype of the Tracker - var trackerJob = jobSystem.GetJobPrototype(Tracker); - var jobStr = prototypeManager.Index(trackerJob).LocalizedName; - - // Get the primary department of the Tracker - if (!jobSystem.TryGetPrimaryDepartment(trackerJob, out var department) && - !jobSystem.TryGetDepartment(trackerJob, out department)) - { - DebugTools.Assert($"CharacterRequirements: Department not found for job {trackerJob}"); - reason = null; - return false; - } - - // Get the time for the tracker - var time = playTimes.GetValueOrDefault(Tracker); - reason = null; - - if (time > Max) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-too-high", - ("time", time.TotalMinutes - Max.TotalMinutes), - ("job", jobStr), - ("departmentColor", department.Color))); - return false; - } - - if (time < Min) - { - // Show the reason if invalid - reason = Inverted - ? null - : FormattedMessage.FromMarkup(Loc.GetString("character-timer-role-insufficient", - ("time", Min.TotalMinutes - time.TotalMinutes), - ("job", jobStr), - ("departmentColor", department.Color))); - return false; - } - - return true; - } -} - -#endregion diff --git a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs index f21971b5e68..521c4f186a2 100644 --- a/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs +++ b/Content.Shared/Customization/Systems/CharacterRequirementsSystem.cs @@ -1,3 +1,4 @@ +using System.Text; using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Shared.Configuration; @@ -9,8 +10,8 @@ namespace Content.Shared.Customization.Systems; public sealed class CharacterRequirementsSystem : EntitySystem { - public bool CheckRequirementsValid(IPrototype prototype, List requirements, JobPrototype job, - HumanoidCharacterProfile profile, Dictionary playTimes, + public bool CheckRequirementsValid(List requirements, JobPrototype job, + HumanoidCharacterProfile profile, Dictionary playTimes, bool whitelisted, IEntityManager entityManager, IPrototypeManager prototypeManager, IConfigurationManager configManager, out List reasons) { @@ -21,7 +22,7 @@ public bool CheckRequirementsValid(IPrototype prototype, List + /// Gets the reason text from as a . + ///
+ public FormattedMessage GetRequirementsText(List reasons) + { + var text = new StringBuilder(); + foreach (var reason in reasons) + text.Append($"\n{reason.ToMarkup()}"); + + return FormattedMessage.FromMarkup(text.ToString().Trim()); + } + + /// + /// Gets the reason text from as a markup string. + /// + public string GetRequirementsMarkup(List reasons) + { + var text = new StringBuilder(); + foreach (var reason in reasons) + text.Append($"\n{reason.ToMarkup()}"); + + return text.ToString().Trim(); + } } diff --git a/Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs b/Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs deleted file mode 100644 index a6e352991e9..00000000000 --- a/Content.Shared/DeltaV/Roles/JobRequirements.Whitelist.cs +++ /dev/null @@ -1,11 +0,0 @@ -using JetBrains.Annotations; -using Robust.Shared.Serialization; - -namespace Content.Shared.Roles -{ - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class WhitelistRequirement : JobRequirement - { - } -} diff --git a/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs b/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs index 8fbb931ca95..74af1e89ecc 100644 --- a/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs +++ b/Content.Shared/Ghost/Roles/GhostRolesEuiMessages.cs @@ -1,3 +1,4 @@ +using Content.Shared.Customization.Systems; using Content.Shared.Eui; using Content.Shared.Roles; using Robust.Shared.Serialization; @@ -11,7 +12,7 @@ public struct GhostRoleInfo public string Name { get; set; } public string Description { get; set; } public string Rules { get; set; } - public HashSet? Requirements { get; set; } + public List? Requirements { get; set; } } [NetSerializable, Serializable] diff --git a/Content.Shared/Roles/AntagPrototype.cs b/Content.Shared/Roles/AntagPrototype.cs index c6acb9b7575..824ea4be4e5 100644 --- a/Content.Shared/Roles/AntagPrototype.cs +++ b/Content.Shared/Roles/AntagPrototype.cs @@ -1,3 +1,4 @@ +using Content.Shared.Customization.Systems; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -42,5 +43,5 @@ public sealed partial class AntagPrototype : IPrototype /// Requirements that must be met to opt in to this antag role. ///
[DataField("requirements")] - public HashSet? Requirements; + public List? Requirements; } diff --git a/Content.Shared/Roles/JobPrototype.cs b/Content.Shared/Roles/JobPrototype.cs index 9f158a79e08..15f8233aab8 100644 --- a/Content.Shared/Roles/JobPrototype.cs +++ b/Content.Shared/Roles/JobPrototype.cs @@ -1,4 +1,5 @@ using Content.Shared.Access; +using Content.Shared.Customization.Systems; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Roles; using Content.Shared.StatusIcon; @@ -43,7 +44,7 @@ public sealed partial class JobPrototype : IPrototype public string? LocalizedDescription => Description is null ? null : Loc.GetString(Description); [DataField("requirements")] - public HashSet? Requirements; + public List? Requirements; [DataField("joinNotifyCrew")] public bool JoinNotifyCrew { get; private set; } = false; diff --git a/Content.Shared/Roles/JobRequirements.cs b/Content.Shared/Roles/JobRequirements.cs deleted file mode 100644 index 44607fc44d9..00000000000 --- a/Content.Shared/Roles/JobRequirements.cs +++ /dev/null @@ -1,232 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Players.PlayTimeTracking; -using Content.Shared.Roles.Jobs; -using JetBrains.Annotations; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Utility; - -namespace Content.Shared.Roles -{ - /// - /// Abstract class for playtime and other requirements for role gates. - /// - [ImplicitDataDefinitionForInheritors] - [Serializable, NetSerializable] - public abstract partial class JobRequirement{} - - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class DepartmentTimeRequirement : JobRequirement - { - /// - /// Which department needs the required amount of time. - /// - [DataField("department", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Department = default!; - - /// - /// How long (in seconds) this requirement is. - /// - [DataField("time")] public TimeSpan Time; - - /// - /// If true, requirement will return false if playtime above the specified time. - /// - /// - /// False by default.
- /// True for invert general requirement - ///
- [DataField("inverted")] public bool Inverted; - } - - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class RoleTimeRequirement : JobRequirement - { - /// - /// What particular role they need the time requirement with. - /// - [DataField("role", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Role = default!; - - /// - [DataField("time")] public TimeSpan Time; - - /// - [DataField("inverted")] public bool Inverted; - } - - [UsedImplicitly] - [Serializable, NetSerializable] - public sealed partial class OverallPlaytimeRequirement : JobRequirement - { - /// - [DataField("time")] public TimeSpan Time; - - /// - [DataField("inverted")] public bool Inverted; - } - - public static class JobRequirements - { - public static bool TryRequirementsMet( - JobPrototype job, - IReadOnlyDictionary playTimes, - [NotNullWhen(false)] out FormattedMessage? reason, - IEntityManager entManager, - IPrototypeManager prototypes, - bool isWhitelisted) - { - reason = null; - if (job.Requirements == null) - return true; - - foreach (var requirement in job.Requirements) - { - if (!TryRequirementMet(requirement, playTimes, out reason, entManager, prototypes, isWhitelisted)) - return false; - } - - return true; - } - - /// - /// Returns a string with the reason why a particular requirement may not be met. - /// - public static bool TryRequirementMet( - JobRequirement requirement, - IReadOnlyDictionary playTimes, - [NotNullWhen(false)] out FormattedMessage? reason, - IEntityManager entManager, - IPrototypeManager prototypes, - bool isWhitelisted, - string? localePrefix = "role-timer-") - { - reason = null; - - switch (requirement) - { - case DepartmentTimeRequirement deptRequirement: - var playtime = TimeSpan.Zero; - - // Check all jobs' departments - var department = prototypes.Index(deptRequirement.Department); - var jobs = department.Roles; - string proto; - - // Check all jobs' playtime - foreach (var other in jobs) - { - // The schema is stored on the Job role but we want to explode if the timer isn't found anyway. - proto = prototypes.Index(other).PlayTimeTracker; - - playTimes.TryGetValue(proto, out var otherTime); - playtime += otherTime; - } - - var deptDiff = deptRequirement.Time.TotalMinutes - playtime.TotalMinutes; - - if (!deptRequirement.Inverted) - { - if (deptDiff <= 0) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}department-insufficient", - ("time", Math.Ceiling(deptDiff)), - ("department", Loc.GetString(deptRequirement.Department)), - ("departmentColor", department.Color.ToHex()))); - return false; - } - - if (deptDiff <= 0) - { - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}department-too-high", - ("time", -deptDiff), - ("department", Loc.GetString(deptRequirement.Department)), - ("departmentColor", department.Color.ToHex()))); - return false; - } - - return true; - - case OverallPlaytimeRequirement overallRequirement: - var overallTime = playTimes.GetValueOrDefault(PlayTimeTrackingShared.TrackerOverall); - var overallDiff = overallRequirement.Time.TotalMinutes - overallTime.TotalMinutes; - - if (!overallRequirement.Inverted) - { - if (overallDiff <= 0 || overallTime >= overallRequirement.Time) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}overall-insufficient", - ("time", Math.Ceiling(overallDiff)))); - return false; - } - - if (overallDiff <= 0 || overallTime >= overallRequirement.Time) - { - reason = FormattedMessage.FromMarkup(Loc.GetString($"{localePrefix}overall-too-high", ("time", -overallDiff))); - return false; - } - - return true; - - case RoleTimeRequirement roleRequirement: - proto = roleRequirement.Role; - - playTimes.TryGetValue(proto, out var roleTime); - var roleDiff = roleRequirement.Time.TotalMinutes - roleTime.TotalMinutes; - var departmentColor = Color.Yellow; - - if (entManager.EntitySysManager.TryGetEntitySystem(out SharedJobSystem? jobSystem)) - { - var jobProto = jobSystem.GetJobPrototype(proto); - - if (jobSystem.TryGetDepartment(jobProto, out var departmentProto)) - departmentColor = departmentProto.Color; - } - - if (!roleRequirement.Inverted) - { - if (roleDiff <= 0) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}role-insufficient", - ("time", Math.Ceiling(roleDiff)), - ("job", Loc.GetString(proto)), - ("departmentColor", departmentColor.ToHex()))); - return false; - } - - if (roleDiff <= 0) - { - reason = FormattedMessage.FromMarkup(Loc.GetString( - $"{localePrefix}role-too-high", - ("time", -roleDiff), - ("job", Loc.GetString(proto)), - ("departmentColor", departmentColor.ToHex()))); - return false; - } - - return true; - case WhitelistRequirement _: // DeltaV - Whitelist requirement - if (isWhitelisted == null) - throw new ArgumentNullException(nameof(isWhitelisted), "isWhitelisted cannot be null."); - - if (isWhitelisted) - return true; - - reason = FormattedMessage.FromMarkup(Loc.GetString("playtime-deny-reason-not-whitelisted")); - return false; - default: - throw new NotImplementedException(); - } - } - } -} diff --git a/Resources/Locale/en-US/customization/character-requirements.ftl b/Resources/Locale/en-US/customization/character-requirements.ftl index d0eeb8f9c85..a3f00dea872 100644 --- a/Resources/Locale/en-US/customization/character-requirements.ftl +++ b/Resources/Locale/en-US/customization/character-requirements.ftl @@ -1,3 +1,22 @@ +# Job +character-job-requirement = You must {$inverted -> + [true] not be + *[other] be +} one of these jobs: {$jobs} +character-department-requirement = You must {$inverted -> + [true] not be + *[other] be +} in one of these departments: {$departments} + +character-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime +character-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department +character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime +character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime +character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] +character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] + + +# Profile character-age-requirement = You must {$inverted -> [true] not be *[other] be @@ -23,18 +42,9 @@ character-clothing-preference-requirement = You must {$inverted -> *[other] wear } a [color=white]{$type}[/color] -character-job-requirement = You must {$inverted -> - [true] not be - *[other] be -} one of these jobs: {$jobs} -character-department-requirement = You must {$inverted -> + +# Whitelist +character-whitelist-requirement = You must {$inverted -> [true] not be *[other] be -} in one of these departments: {$departments} - -character-timer-department-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of [color={$departmentColor}]{$department}[/color] department playtime -character-timer-department-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes in [color={$departmentColor}]{$department}[/color] department -character-timer-overall-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes of playtime -character-timer-overall-too-high = You require [color=yellow]{TOSTRING($time, "0")}[/color] fewer minutes of playtime -character-timer-role-insufficient = You require [color=yellow]{TOSTRING($time, "0")}[/color] more minutes with [color={$departmentColor}]{$job}[/color] -character-timer-role-too-high = You require[color=yellow] {TOSTRING($time, "0")}[/color] fewer minutes with [color={$departmentColor}]{$job}[/color] +} whitelisted diff --git a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml index 1e014aab734..8534b737888 100644 --- a/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/DeltaV/Entities/Markers/Spawners/ghost_roles.yml @@ -32,8 +32,8 @@ description: ghost-role-information-listeningop-description rules: ghost-role-information-listeningop-rules requirements: # Worth considering these numbers for the goal of making sure someone willing to MRP takes this. - - !type:OverallPlaytimeRequirement - time: 259200 # 72 hours + - !type:CharacterOverallTimeRequirement + min: 259200 # 72 hours - !type:DepartmentTimeRequirement department: Security time: 40000 # 11.1 hours diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml index e2047d3c200..18a4bbf3152 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Medical/medical_borg.yml @@ -5,11 +5,11 @@ description: job-description-medical-borg playTimeTracker: JobMedicalBorg requirements: - - !type:OverallPlaytimeRequirement - time: 216000 #60 hrs + - !type:CharacterOverallTimeRequirement + min: 216000 #60 hrs - !type:DepartmentTimeRequirement department: Medical - time: 21600 #6 hrs + min: 21600 #6 hrs canBeAntag: false icon: JobIconMedicalBorg supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml index adc6f95dfd4..daf7f1195c0 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml @@ -6,10 +6,10 @@ requirements: - !type:DepartmentTimeRequirement department: Medical - time: 21600 # 6 hrs + min: 21600 # 6 hrs - !type:DepartmentTimeRequirement department: Security - time: 18000 # 4 hrs + min: 18000 # 4 hrs startingGear: CorpsmanGear icon: "JobIconBrigmedic" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index 3da346cdd65..712dfcf3a06 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -85,8 +85,8 @@ description: ghost-role-information-loneop-description rules: ghost-role-information-loneop-rules requirements: - - !type:OverallPlaytimeRequirement - time: 172800 # DeltaV - 48 hours + - !type:CharacterOverallTimeRequirement + min: 172800 # DeltaV - 48 hours - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security time: 36000 # DeltaV - 10 hours diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index c3e682e02a9..31c08140ac7 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -4,11 +4,11 @@ description: job-description-mantis playTimeTracker: JobForensicMantis requirements: - - !type:OverallPlaytimeRequirement - time: 18000 + - !type:CharacterOverallTimeRequirement + min: 18000 - !type:DepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 3600 + min: 3600 startingGear: ForensicMantisGear icon: "JobIconForensicMantis" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml index 55d86d343dc..12c859b7d8c 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml @@ -4,11 +4,11 @@ description: job-description-guard playTimeTracker: JobPrisonGuard requirements: - - !type:OverallPlaytimeRequirement - time: 18000 + - !type:CharacterOverallTimeRequirement + min: 18000 - !type:DepartmentTimeRequirement department: Security - time: 14400 + min: 14400 startingGear: PrisonGuardGear alwaysUseSpawner: true canBeAntag: false diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml index 498477eb229..3651d223d77 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/gladiator.yml @@ -13,7 +13,7 @@ requirements: - !type:DepartmentTimeRequirement department: Security - time: 21600 + min: 21600 special: - !type:AddComponentSpecial components: diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml index 14c277ff7e5..8c3c80c72fd 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/martialartist.yml @@ -4,8 +4,8 @@ description: job-description-martialartist playTimeTracker: JobMartialArtist requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #2 hours startingGear: MartialArtistGear icon: "JobIconMartialArtist" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml index 9df4832a584..00ffdde666f 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Wildcards/prisoner.yml @@ -12,7 +12,7 @@ requirements: - !type:DepartmentTimeRequirement department: Security - time: 21600 + min: 21600 - type: startingGear id: PrisonerGear diff --git a/Resources/Prototypes/Roles/Antags/ninja.yml b/Resources/Prototypes/Roles/Antags/ninja.yml index 23027805a1c..fd8a79ad254 100644 --- a/Resources/Prototypes/Roles/Antags/ninja.yml +++ b/Resources/Prototypes/Roles/Antags/ninja.yml @@ -5,5 +5,5 @@ setPreference: false objective: roles-antag-space-ninja-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 259200 # DeltaV - 72 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 259200 # DeltaV - 72 hours diff --git a/Resources/Prototypes/Roles/Antags/nukeops.yml b/Resources/Prototypes/Roles/Antags/nukeops.yml index 7375c02639c..fe05393b9ca 100644 --- a/Resources/Prototypes/Roles/Antags/nukeops.yml +++ b/Resources/Prototypes/Roles/Antags/nukeops.yml @@ -5,11 +5,11 @@ setPreference: true objective: roles-antag-nuclear-operative-objective requirements: - - !type:OverallPlaytimeRequirement - time: 108000 # DeltaV - 30 hours - - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement + - !type:CharacterOverallTimeRequirement + min: 108000 # DeltaV - 30 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - type: antag id: NukeopsMedic @@ -18,11 +18,11 @@ setPreference: true objective: roles-antag-nuclear-operative-agent-objective requirements: - - !type:OverallPlaytimeRequirement - time: 108000 # DeltaV - 30 hours - - !type:DepartmentTimeRequirement # DeltaV - Medical dept time requirement + - !type:CharacterOverallTimeRequirement + min: 108000 # DeltaV - 30 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Medical dept time requirement department: Medical - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - type: antag id: NukeopsCommander @@ -31,12 +31,12 @@ setPreference: true objective: roles-antag-nuclear-operative-commander-objective requirements: - - !type:OverallPlaytimeRequirement - time: 216000 # DeltaV - 60 hours - - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement + - !type:CharacterOverallTimeRequirement + min: 216000 # DeltaV - 60 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security - time: 36000 # DeltaV - 10 hours - - !type:DepartmentTimeRequirement # DeltaV - Command dept time requirement + min: 36000 # DeltaV - 10 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Command dept time requirement department: Command - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement diff --git a/Resources/Prototypes/Roles/Antags/revolutionary.yml b/Resources/Prototypes/Roles/Antags/revolutionary.yml index 6f22bd1d58a..cc551fc4679 100644 --- a/Resources/Prototypes/Roles/Antags/revolutionary.yml +++ b/Resources/Prototypes/Roles/Antags/revolutionary.yml @@ -5,11 +5,11 @@ setPreference: true objective: roles-antag-rev-head-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 172800 # DeltaV - 48 hours - - !type:DepartmentTimeRequirement # DeltaV - Command dept time requirement + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 172800 # DeltaV - 48 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Command dept time requirement department: Command - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours - type: antag id: Rev diff --git a/Resources/Prototypes/Roles/Antags/traitor.yml b/Resources/Prototypes/Roles/Antags/traitor.yml index 98fdb0ee47d..fec2280ddc8 100644 --- a/Resources/Prototypes/Roles/Antags/traitor.yml +++ b/Resources/Prototypes/Roles/Antags/traitor.yml @@ -5,5 +5,5 @@ setPreference: true objective: roles-antag-syndicate-agent-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 86400 # DeltaV - 24 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 86400 # DeltaV - 24 hours diff --git a/Resources/Prototypes/Roles/Antags/zombie.yml b/Resources/Prototypes/Roles/Antags/zombie.yml index 6ff0f17edc7..5ec90f68162 100644 --- a/Resources/Prototypes/Roles/Antags/zombie.yml +++ b/Resources/Prototypes/Roles/Antags/zombie.yml @@ -5,8 +5,8 @@ setPreference: true objective: roles-antag-initial-infected-objective requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 43200 # DeltaV - 12 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 43200 # DeltaV - 12 hours - type: antag id: Zombie diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml index b7e8744c6ad..ee1a101154a 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/quartermaster.yml @@ -8,17 +8,17 @@ # - !type:RoleTimeRequirement #DeltaV # role: JobCargoTechnician # time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobSalvageSpecialist - time: 10800 #3 hrs - - !type:RoleTimeRequirement # DeltaV - Courier role time requirement - role: JobMailCarrier - time: 7200 # 2 hours - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobSalvageSpecialist + min: 10800 #3 hrs + - !type:CharacterPlaytimeRequirement # DeltaV - Courier role time requirement + tracker: JobMailCarrier + min: 7200 # 2 hours + - !type:CharacterDepartmentTimeRequirement department: Logistics # DeltaV - Logistics Department replacing Cargo - time: 43200 #DeltaV 12 hours - - !type:OverallPlaytimeRequirement - time: 144000 #40 hrs + min: 43200 #DeltaV 12 hours + - !type:CharacterOverallTimeRequirement + min: 144000 #40 hrs weight: 10 startingGear: QuartermasterGear icon: "JobIconQuarterMaster" diff --git a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml index f2f7c016412..8b806009ef8 100644 --- a/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml +++ b/Resources/Prototypes/Roles/Jobs/Cargo/salvage_specialist.yml @@ -5,9 +5,9 @@ playTimeTracker: JobSalvageSpecialist antagAdvantage: 3 # DeltaV - Reduced TC: External Access + Free hardsuit and weapons requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Logistics # DeltaV - Logistics Department replacing Cargo - time: 21600 #DeltaV 6 hrs + min: 21600 #DeltaV 6 hrs # - !type:OverallPlaytimeRequirement #DeltaV # time: 36000 #10 hrs icon: "JobIconShaftMiner" diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml index 8f6f9fc7de2..85a86dabce3 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/bartender.yml @@ -4,9 +4,9 @@ description: job-description-bartender playTimeTracker: JobBartender requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Civilian - time: 3600 #DeltaV + min: 3600 #DeltaV startingGear: BartenderGear icon: "JobIconBartender" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml index 7f16cf16447..9b4f5ea1487 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chaplain.yml @@ -4,9 +4,9 @@ description: job-description-chaplain playTimeTracker: JobChaplain requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 14400 #DeltaV 4 hours + min: 14400 #DeltaV 4 hours startingGear: ChaplainGear icon: "JobIconChaplain" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml index 6ae2310474d..0837f1f3907 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/chef.yml @@ -4,9 +4,9 @@ description: job-description-chef playTimeTracker: JobChef requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Civilian - time: 3600 #DeltaV 1 hour + min: 3600 #DeltaV 1 hour startingGear: ChefGear icon: "JobIconChef" supervisors: job-supervisors-hop @@ -17,10 +17,10 @@ extendedAccess: - Hydroponics - Bar #Nyano - Summary: After this line, Professional Che is a component to be added. Very important. - special: + special: - !type:AddComponentSpecial components: - - type: ProfessionalChef #Nyano - End Summary. + - type: ProfessionalChef #Nyano - End Summary. - type: startingGear id: ChefGear diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml index 43e07d0637c..141f4d39b76 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/clown.yml @@ -4,8 +4,8 @@ description: job-description-clown playTimeTracker: JobClown requirements: - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 7200 #2 hrs + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 7200 #2 hrs startingGear: ClownGear icon: "JobIconClown" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index b67275c9930..838a18d5e5d 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -5,11 +5,11 @@ playTimeTracker: JobLawyer antagAdvantage: 2 # DeltaV - Reduced TC: Security Radio and Access requirements: - - !type:OverallPlaytimeRequirement - time: 36000 # 10 hrs - - !type:DepartmentTimeRequirement # DeltaV - Security dept time requirement + - !type:CharacterOverallTimeRequirement + min: 36000 # 10 hrs + - !type:CharacterDepartmentTimeRequirement # DeltaV - Security dept time requirement department: Security - time: 14400 # 4 hours + min: 14400 # 4 hours startingGear: LawyerGear icon: "JobIconLawyer" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml index 536c8635d1b..7f138c6d7d1 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/librarian.yml @@ -4,8 +4,8 @@ description: job-description-librarian playTimeTracker: JobLibrarian requirements: - - !type:OverallPlaytimeRequirement #DeltaV - time: 3600 # 1 hr + - !type:CharacterOverallTimeRequirement #DeltaV + min: 3600 # 1 hr startingGear: LibrarianGear icon: "JobIconLibrarian" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml index 8da2c34231b..3e04285d601 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml @@ -4,8 +4,8 @@ description: job-description-mime playTimeTracker: JobMime requirements: - - !type:OverallPlaytimeRequirement - time: 7200 # DeltaV - 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 # DeltaV - 2 hours startingGear: MimeGear icon: "JobIconMime" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml index f873ec5fe8c..28f9c597e58 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/musician.yml @@ -4,8 +4,8 @@ description: job-description-musician playTimeTracker: JobMusician requirements: - - !type:OverallPlaytimeRequirement - time: 7200 # DeltaV - 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 # DeltaV - 2 hours startingGear: MusicianGear icon: "JobIconMusician" supervisors: job-supervisors-hire diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml index c21fafbdaa9..8bfd05ad014 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/service_worker.yml @@ -4,8 +4,8 @@ description: job-description-serviceworker playTimeTracker: JobServiceWorker requirements: - - !type:OverallPlaytimeRequirement - time: 7200 # DeltaV - 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 # DeltaV - 2 hours startingGear: ServiceWorkerGear icon: "JobIconServiceWorker" supervisors: job-supervisors-service diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml index 905121dbf8e..12ad83e6e5c 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml @@ -4,26 +4,26 @@ description: job-description-captain playTimeTracker: JobCaptain requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Logistics # DeltaV - Logistics Department replacing Cargo - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement department: Security - time: 18000 # DeltaV - 5 hours - - !type:DepartmentTimeRequirement # DeltaV - Epistemics dept time requirement + min: 18000 # DeltaV - 5 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Epistemics dept time requirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 18000 # 5 hours - - !type:DepartmentTimeRequirement + min: 18000 # 5 hours + - !type:CharacterDepartmentTimeRequirement department: Command - time: 108000 # DeltaV - 30 hours - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 108000 # 30 hours + min: 108000 # DeltaV - 30 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 108000 # 30 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement weight: 20 startingGear: CaptainGear diff --git a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml index f999a4b6c70..6311eb9fee6 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/head_of_personnel.yml @@ -5,20 +5,20 @@ playTimeTracker: JobHeadOfPersonnel antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - - !type:RoleTimeRequirement - role: JobChef - time: 14400 # DeltaV - 4 hours - - !type:RoleTimeRequirement - role: JobBartender - time: 14400 # DeltaV - 4 hours - - !type:RoleTimeRequirement - role: JobJanitor - time: 14400 # DeltaV - 4 hours - - !type:DepartmentTimeRequirement # DeltaV - Civilian dept time requirement + - !type:CharacterPlaytimeRequirement + tracker: JobChef + min: 14400 # DeltaV - 4 hours + - !type:CharacterPlaytimeRequirement + tracker: JobBartender + min: 14400 # DeltaV - 4 hours + - !type:CharacterPlaytimeRequirement + tracker: JobJanitor + min: 14400 # DeltaV - 4 hours + - !type:CharacterDepartmentTimeRequirement # DeltaV - Civilian dept time requirement department: Civilian - time: 72000 # 20 hours - - !type:OverallPlaytimeRequirement # DeltaV - Playtime requirement - time: 90000 # 25 hours + min: 72000 # 20 hours + - !type:CharacterOverallTimeRequirement # DeltaV - Playtime requirement + min: 90000 # 25 hours weight: 10 # DeltaV - Changed HoP weight from 20 to 10 due to them not being more important than other Heads startingGear: HoPGear icon: "JobIconHeadOfPersonnel" diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml index a188e93388d..834a85e7a08 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/atmospheric_technician.yml @@ -5,9 +5,9 @@ playTimeTracker: JobAtmosphericTechnician antagAdvantage: 10 # DeltaV - Reduced TC: External Access + Fireaxe + Free Hardsuit requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours startingGear: AtmosphericTechnicianGear icon: "JobIconAtmosphericTechnician" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml index 644754750a7..eaa66d6f0cc 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/chief_engineer.yml @@ -4,15 +4,15 @@ description: job-description-ce playTimeTracker: JobChiefEngineer requirements: - - !type:RoleTimeRequirement - role: JobAtmosphericTechnician - time: 36000 # DeltaV - 10 hours + - !type:CharacterPlaytimeRequirement + tracker: JobAtmosphericTechnician + min: 36000 # DeltaV - 10 hours # - !type:RoleTimeRequirement # DeltaV - No Station Engineer time requirement # role: JobStationEngineer # time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 90000 # DeltaV - 25 hours + min: 90000 # DeltaV - 25 hours # - !type:OverallPlaytimeRequirement # time: 72000 # DeltaV - 20 hours weight: 10 diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml index ba8a8f6acc8..5106f1129c4 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/senior_engineer.yml @@ -5,15 +5,15 @@ playTimeTracker: JobSeniorEngineer setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:RoleTimeRequirement - role: JobAtmosphericTechnician - time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobStationEngineer - time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobAtmosphericTechnician + min: 21600 #6 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobStationEngineer + min: 21600 #6 hrs + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 216000 # 60 hrs + min: 216000 # 60 hrs startingGear: SeniorEngineerGear icon: "JobIconSeniorEngineer" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml index ab62d69d501..dc590045191 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/station_engineer.yml @@ -5,9 +5,9 @@ playTimeTracker: JobStationEngineer antagAdvantage: 3 # DeltaV - Reduced TC: External Access + Engineering requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Engineering - time: 14400 #4 hrs + min: 14400 #4 hrs startingGear: StationEngineerGear icon: "JobIconStationEngineer" supervisors: job-supervisors-ce diff --git a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml index e0b5a268ca2..668af727519 100644 --- a/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml +++ b/Resources/Prototypes/Roles/Jobs/Engineering/technical_assistant.yml @@ -5,8 +5,8 @@ playTimeTracker: JobTechnicalAssistant antagAdvantage: 3 # DeltaV - Reduced TC: External Access + Engineering requirements: - - !type:OverallPlaytimeRequirement # DeltaV - to prevent griefers from taking the role. - time: 14400 # 4 hours + - !type:CharacterOverallTimeRequirement # DeltaV - to prevent griefers from taking the role. + min: 14400 # 4 hours # - !type:DepartmentTimeRequirement # DeltaV - Removes time limit # department: Engineering # time: 54000 #15 hrs diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index d57fe982c57..3fe22792092 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -4,9 +4,9 @@ description: job-description-chemist playTimeTracker: JobChemist requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 28800 # DeltaV - 8 hours + min: 28800 # DeltaV - 8 hours startingGear: ChemistGear icon: "JobIconChemist" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index aac50c526c9..4a65b791283 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -7,17 +7,17 @@ playTimeTracker: JobChiefMedicalOfficer antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - - !type:RoleTimeRequirement - role: JobChemist - time: 14400 #DeltaV 4 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobChemist + min: 14400 #DeltaV 4 hrs # - !type:RoleTimeRequirement # DeltaV - No Medical Doctor time requirement # role: JobMedicalDoctor # time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 43200 # DeltaV - 12 hours - - !type:OverallPlaytimeRequirement - time: 72000 # DeltaV - 20 hours + min: 43200 # DeltaV - 12 hours + - !type:CharacterOverallTimeRequirement + min: 72000 # DeltaV - 20 hours weight: 10 startingGear: CMOGear icon: "JobIconChiefMedicalOfficer" diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index fbc6116f46b..cc048470f0c 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -4,9 +4,9 @@ description: job-description-doctor playTimeTracker: JobMedicalDoctor requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 14400 #4 hrs + min: 14400 #4 hrs startingGear: DoctorGear icon: "JobIconMedicalDoctor" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml index e4ae7a7dd50..9e3484a8dcf 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml @@ -8,9 +8,9 @@ # - !type:RoleTimeRequirement # DeltaV - No Medical Doctor time requirement # role: JobMedicalDoctor # time: 14400 #4 hrs - - !type:DepartmentTimeRequirement # DeltaV - Medical dept time requirement + - !type:CharacterDepartmentTimeRequirement # DeltaV - Medical dept time requirement department: Medical - time: 28800 # DeltaV - 8 hours + min: 28800 # DeltaV - 8 hours # - !type:OverallPlaytimeRequirement # DeltaV - No playtime requirement # time: 54000 # 15 hrs startingGear: ParamedicGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml index 03473cc7cbc..ac6e0620f5a 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml @@ -5,15 +5,15 @@ playTimeTracker: JobSeniorPhysician setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:RoleTimeRequirement - role: JobChemist - time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobMedicalDoctor - time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobChemist + min: 21600 #6 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobMedicalDoctor + min: 21600 #6 hrs + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 216000 # 60 hrs + min: 216000 # 60 hrs startingGear: SeniorPhysicianGear icon: "JobIconSeniorPhysician" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Science/borg.yml b/Resources/Prototypes/Roles/Jobs/Science/borg.yml index fe829110051..456a761dba7 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/borg.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/borg.yml @@ -4,8 +4,8 @@ description: job-description-borg playTimeTracker: JobBorg requirements: - - !type:OverallPlaytimeRequirement - time: 216000 #60 hrs + - !type:CharacterOverallTimeRequirement + min: 216000 #60 hrs canBeAntag: false icon: JobIconBorg supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 19cf1419111..6f965b31b49 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -5,11 +5,11 @@ playTimeTracker: JobResearchDirector antagAdvantage: 6 # DeltaV - Reduced TC: Head of Staff requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 54000 # DeltaV - 15 hours - - !type:OverallPlaytimeRequirement - time: 72000 # DeltaV - 20 hours + min: 54000 # DeltaV - 15 hours + - !type:CharacterOverallTimeRequirement + min: 72000 # DeltaV - 20 hours weight: 10 startingGear: ResearchDirectorGear icon: "JobIconResearchDirector" diff --git a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml index fe00a72abb1..2d91e0e6ef9 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/scientist.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/scientist.yml @@ -4,9 +4,9 @@ description: job-description-scientist playTimeTracker: JobScientist requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 14400 #4 hrs + min: 14400 #4 hrs startingGear: ScientistGear icon: "JobIconScientist" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml index 5010c7fb26f..90234250302 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/senior_researcher.yml @@ -5,9 +5,9 @@ playTimeTracker: JobSeniorResearcher setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Epistemics # DeltaV - Epistemics Department replacing Science - time: 216000 #60 hrs + min: 216000 #60 hrs startingGear: SeniorResearcherGear icon: "JobIconSeniorResearcher" supervisors: job-supervisors-rd diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index feef023b450..0ed2eba9556 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -4,9 +4,9 @@ description: job-description-detective playTimeTracker: JobDetective requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Security - time: 36000 # DeltaV - 10 hours + min: 36000 # DeltaV - 10 hours startingGear: DetectiveGear icon: "JobIconDetective" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index a8b7013004e..675e7768fa7 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -4,17 +4,17 @@ description: job-description-hos playTimeTracker: JobHeadOfSecurity requirements: - - !type:RoleTimeRequirement - role: JobWarden - time: 14400 #DeltaV 4 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobWarden + min: 14400 #DeltaV 4 hrs # - !type:RoleTimeRequirement # DeltaV - No Security Officer time requirement - REIMPLEMENT WHEN MORE PEOPLE HAVE IT # role: JobDetective # time: 14400 #DeltaV 4 hrs - - !type:DepartmentTimeRequirement # DeltaV - Command dept time requirement + - !type:CharacterDepartmentTimeRequirement # DeltaV - Command dept time requirement department: Command - time: 36000 # 10 hours - - !type:OverallPlaytimeRequirement - time: 90000 # DeltaV - 25 hours + min: 36000 # 10 hours + - !type:CharacterOverallTimeRequirement + min: 90000 # DeltaV - 25 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement weight: 10 startingGear: HoSGear diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml index 324b697baff..0b28af78502 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml @@ -4,8 +4,8 @@ description: job-description-cadet playTimeTracker: JobSecurityCadet requirements: - - !type:OverallPlaytimeRequirement - time: 14400 # DeltaV - 4 hours + - !type:CharacterOverallTimeRequirement + min: 14400 # DeltaV - 4 hours # - !type:DepartmentTimeRequirement # DeltaV - Removes time limit # department: Security # time: 54000 #15 hrs diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index 695464e030f..b81cef667ed 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -4,9 +4,9 @@ description: job-description-security playTimeTracker: JobSecurityOfficer requirements: - - !type:DepartmentTimeRequirement + - !type:CharacterDepartmentTimeRequirement department: Security - time: 14400 # DeltaV - 4 hours + min: 14400 # DeltaV - 4 hours startingGear: SecurityOfficerGear icon: "JobIconSecurityOfficer" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml index 99167b8cd41..2623adf1fd0 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/senior_officer.yml @@ -5,18 +5,18 @@ playTimeTracker: JobSeniorOfficer setPreference: false # DeltaV - Disable Senior Roles round start selection requirements: - - !type:RoleTimeRequirement - role: JobWarden - time: 21600 #6 hrs - - !type:RoleTimeRequirement - role: JobDetective - time: 7200 #2 hrs - - !type:RoleTimeRequirement - role: JobSecurityOfficer - time: 21600 #6 hrs - - !type:DepartmentTimeRequirement + - !type:CharacterPlaytimeRequirement + tracker: JobWarden + min: 21600 #6 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobDetective + min: 7200 #2 hrs + - !type:CharacterPlaytimeRequirement + tracker: JobSecurityOfficer + min: 21600 #6 hrs + - !type:CharacterDepartmentTimeRequirement department: Security - time: 216000 # 60 hrs + min: 216000 # 60 hrs startingGear: SeniorOfficerGear icon: "JobIconSeniorOfficer" supervisors: job-supervisors-hos diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 3b7697cb680..a4c5c5a8fab 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -4,12 +4,12 @@ description: job-description-warden playTimeTracker: JobWarden requirements: - - !type:RoleTimeRequirement # DeltaV - JobSecurityOfficer time requirement. Make them experienced in proper officer work. - role: JobSecurityOfficer - time: 43200 # DeltaV - 12 hrs - - !type:RoleTimeRequirement # DeltaV - JobDetective time requirement. Give them an understanding of basic forensics. - role: JobDetective - time: 14400 # DeltaV - 4 hours + - !type:CharacterPlaytimeRequirement # DeltaV - JobSecurityOfficer time requirement. Make them experienced in proper officer work. + tracker: JobSecurityOfficer + min: 43200 # DeltaV - 12 hrs + - !type:CharacterPlaytimeRequirement # DeltaV - JobDetective time requirement. Give them an understanding of basic forensics. + tracker: JobDetective + min: 14400 # DeltaV - 4 hours - !type:WhitelistRequirement # DeltaV - Whitelist requirement startingGear: WardenGear icon: "JobIconWarden" diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml index ea2faf14467..33def38bb08 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/boxer.yml @@ -4,8 +4,8 @@ description: job-description-boxer playTimeTracker: JobBoxer requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #DeltaV 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #DeltaV 2 hours startingGear: BoxerGear icon: "JobIconBoxer" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml index 7687049b685..a2974c6eb7a 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/psychologist.yml @@ -4,11 +4,11 @@ description: job-description-psychologist playTimeTracker: JobPsychologist requirements: - - !type:OverallPlaytimeRequirement - time: 36000 #DeltaV 10 hours - - !type:DepartmentTimeRequirement + - !type:CharacterOverallTimeRequirement + min: 36000 #DeltaV 10 hours + - !type:CharacterDepartmentTimeRequirement department: Medical - time: 14400 #DeltaV 4 hrs + min: 14400 #DeltaV 4 hrs startingGear: PsychologistGear icon: "JobIconPsychologist" supervisors: job-supervisors-cmo diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml index 6f7093f3ae5..ad810e970e9 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml @@ -4,8 +4,8 @@ description: job-description-reporter playTimeTracker: JobReporter requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #DeltaV 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #DeltaV 2 hours startingGear: ReporterGear icon: "JobIconReporter" supervisors: job-supervisors-hop diff --git a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml index 04d10513331..1686e3290fa 100644 --- a/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml +++ b/Resources/Prototypes/Roles/Jobs/Wildcards/zookeeper.yml @@ -4,8 +4,8 @@ description: job-description-zookeeper playTimeTracker: JobZookeeper requirements: - - !type:OverallPlaytimeRequirement - time: 7200 #DeltaV 2 hours + - !type:CharacterOverallTimeRequirement + min: 7200 #DeltaV 2 hours startingGear: ZookeeperGear icon: "JobIconZookeeper" supervisors: job-supervisors-hop From 56d039c63094d4aec228ad7ed930420ad72a10d3 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 31 Jul 2024 05:33:23 +0800 Subject: [PATCH 008/143] Add Cybernetic Limb Markings (#613) # Description Adds cybernetic limb markings from Hesphiastos Industries and Bishop Cybernetics, originally from Deepstation. Also cherry-picks this [PR](https://github.com/SS14-Classic/deep-station-14/pull/39) by @WarMechanic from Deep that increases arm and leg markings available for suitable species from 2 to 6. This allows players to cover all limbs with cybernetics. ---

Media

![image](https://github.com/user-attachments/assets/49eb49c0-4f0c-4346-8463-524a75613f8a) ![image](https://github.com/user-attachments/assets/1d1698a4-4b7b-4c5e-86f5-1c237db25c19)

--- # Changelog :cl: Skubman - add: Added cybernetic limb markings from Hesphiastos Industries and Bishop Cybernetics. --------- Co-authored-by: WarMechanic <69510347+WarMechanic@users.noreply.github.com> --- .../Locale/en-US/silicons/cyberlimbs.ftl | 77 ++++++++++++ .../Prototypes/DeltaV/Species/vulpkanin.yml | 4 +- .../Mobs/Customization/cyberlimbs/bishop.yml | 110 +++++++++++++++++ .../Customization/cyberlimbs/hesphiastos.yml | 115 ++++++++++++++++++ .../Prototypes/Nyanotrasen/Species/Oni.yml | 4 +- .../Nyanotrasen/Species/felinid.yml | 4 +- Resources/Prototypes/Species/arachnid.yml | 4 +- Resources/Prototypes/Species/human.yml | 4 +- Resources/Prototypes/Species/moth.yml | 4 +- Resources/Prototypes/Species/reptilian.yml | 4 +- .../bishop/bishop_alt1.rsi/head.png | Bin 0 -> 1059 bytes .../bishop/bishop_alt1.rsi/meta.json | 15 +++ .../bishop/bishop_main.rsi/head.png | Bin 0 -> 645 bytes .../bishop/bishop_main.rsi/l_arm-primary.png | Bin 0 -> 456 bytes .../bishop_main.rsi/l_arm-secondary.png | Bin 0 -> 348 bytes .../bishop/bishop_main.rsi/l_arm-tertiary.png | Bin 0 -> 217 bytes .../bishop/bishop_main.rsi/l_foot.png | Bin 0 -> 325 bytes .../bishop/bishop_main.rsi/l_hand.png | Bin 0 -> 385 bytes .../bishop/bishop_main.rsi/l_leg-primary.png | Bin 0 -> 620 bytes .../bishop_main.rsi/l_leg-secondary.png | Bin 0 -> 478 bytes .../bishop/bishop_main.rsi/meta.json | 79 ++++++++++++ .../bishop/bishop_main.rsi/r_arm-primary.png | Bin 0 -> 473 bytes .../bishop_main.rsi/r_arm-secondary.png | Bin 0 -> 353 bytes .../bishop/bishop_main.rsi/r_arm-tertiary.png | Bin 0 -> 219 bytes .../bishop/bishop_main.rsi/r_foot.png | Bin 0 -> 328 bytes .../bishop/bishop_main.rsi/r_hand.png | Bin 0 -> 380 bytes .../bishop/bishop_main.rsi/r_leg-primary.png | Bin 0 -> 611 bytes .../bishop_main.rsi/r_leg-secondary.png | Bin 0 -> 319 bytes .../bishop/bishop_main.rsi/torso-primary.png | Bin 0 -> 1281 bytes .../bishop_main.rsi/torso-secondary.png | Bin 0 -> 481 bytes .../bishop/bishop_monitor.rsi/head-2.png | Bin 0 -> 371 bytes .../bishop/bishop_monitor.rsi/head.png | Bin 0 -> 630 bytes .../bishop/bishop_monitor.rsi/meta.json | 19 +++ .../hesphiastos/hesphiastos_alt1.rsi/head.png | Bin 0 -> 994 bytes .../hesphiastos_alt1.rsi/meta.json | 15 +++ .../hesphiastos_main.rsi/l_arm-1.png | Bin 0 -> 487 bytes .../hesphiastos_main.rsi/l_arm-2.png | Bin 0 -> 258 bytes .../hesphiastos_main.rsi/l_foot-1.png | Bin 0 -> 390 bytes .../hesphiastos_main.rsi/l_foot-2.png | Bin 0 -> 392 bytes .../hesphiastos_main.rsi/l_hand-1.png | Bin 0 -> 379 bytes .../hesphiastos_main.rsi/l_hand-2.png | Bin 0 -> 380 bytes .../hesphiastos_main.rsi/l_leg-1.png | Bin 0 -> 535 bytes .../hesphiastos_main.rsi/l_leg-2.png | Bin 0 -> 538 bytes .../hesphiastos_main.rsi/meta.json | 83 +++++++++++++ .../hesphiastos_main.rsi/r_arm-1.png | Bin 0 -> 491 bytes .../hesphiastos_main.rsi/r_arm-2.png | Bin 0 -> 248 bytes .../hesphiastos_main.rsi/r_foot-1.png | Bin 0 -> 390 bytes .../hesphiastos_main.rsi/r_foot-2.png | Bin 0 -> 391 bytes .../hesphiastos_main.rsi/r_hand-1.png | Bin 0 -> 382 bytes .../hesphiastos_main.rsi/r_hand-2.png | Bin 0 -> 381 bytes .../hesphiastos_main.rsi/r_leg-1.png | Bin 0 -> 536 bytes .../hesphiastos_main.rsi/r_leg-2.png | Bin 0 -> 538 bytes .../hesphiastos_main.rsi/torso-1.png | Bin 0 -> 813 bytes .../hesphiastos_main.rsi/torso-2.png | Bin 0 -> 807 bytes .../hesphiastos_monitor.rsi/head-1.png | Bin 0 -> 330 bytes .../hesphiastos_monitor.rsi/head-2.png | Bin 0 -> 565 bytes .../hesphiastos_monitor.rsi/meta.json | 19 +++ 57 files changed, 546 insertions(+), 14 deletions(-) create mode 100644 Resources/Locale/en-US/silicons/cyberlimbs.ftl create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-primary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-secondary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-tertiary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_foot.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_hand.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-primary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-secondary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-primary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-secondary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-tertiary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_foot.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_hand.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-primary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-secondary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-primary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-secondary.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-1.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-2.png create mode 100644 Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/meta.json diff --git a/Resources/Locale/en-US/silicons/cyberlimbs.ftl b/Resources/Locale/en-US/silicons/cyberlimbs.ftl new file mode 100644 index 00000000000..b7686b0a2dc --- /dev/null +++ b/Resources/Locale/en-US/silicons/cyberlimbs.ftl @@ -0,0 +1,77 @@ +marking-MobIPCHeadDefault = Standard Operational Monitor +marking-MobIPCTorsoDefault = Standard Robotic Chassis +marking-MobIPCTorsoFemaleDefault = Standard Robotic Chassis +marking-MobIPCLArmDefault = Standard Left Robotic Arm +marking-MobIPCLHandDefault = Standard Left Robotic Hand +marking-MobIPCLLegDefault = Standard Left Robotic Leg +marking-MobIPCLFootDefault = Standard Left Robotic Foot +marking-MobIPCRArmDefault = Standard Right Robotic Arm +marking-MobIPCRHandDefault = Standard Right Robotic Hand +marking-MobIPCRLegDefault = Standard Right Robotic Leg +marking-MobIPCRFootDefault = Standard Right Robotic Foot + +marking-CyberLimbsMarkingBishopHead = Operational Monitor from Bishop Cybernetics +marking-CyberLimbsMarkingBishopChest = Robotic Chassis from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLArm = Left Robotic Arm from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLHand = Left Robotic Hand from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLLeg = Left Robotic Leg from Bishop Cybernetics +marking-CyberLimbsMarkingBishopLFoot = Left Robotic Foot from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRArm = Right Robotic Arm from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRHand = Right Robotic Hand from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRLeg = Right Robotic Leg from Bishop Cybernetics +marking-CyberLimbsMarkingBishopRFoot = Right Robotic Foot from Bishop Cybernetics + +marking-CyberLimbsMarkingHesphiastosHead = Operational Monitor from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosChest = Robotic Chassis from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLArm = Left Robotic Arm from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLHand = Left Robotic Hand from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLLeg = Left Robotic Leg from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosLFoot = Left Robotic Foot from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRArm = Right Robotic Arm from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRHand = Right Robotic Hand from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRLeg = Right Robotic Leg from Hesphiastos Industries +marking-CyberLimbsMarkingHesphiastosRFoot = Right Robotic Foot from Hesphiastos Industries + +marking-CyberLimbsMarkingWardtakahashiHead = Operational Monitor from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiChest = Robotic Chassis from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLArm = Left Robotic Arm from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLHand = Left Robotic Hand from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLLeg = Left Robotic Leg from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiLFoot = Left Robotic Foot from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRArm = Right Robotic Arm from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRHand = Right Robotic Hand from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRLeg = Right Robotic Leg from Ward-Takahashi +marking-CyberLimbsMarkingWardtakahashiRFoot = Right Robotic Foot from Ward-Takahashi + +marking-CyberLimbsMarkingXionHead = Operational Monitor from Xion Manufacturing Group +marking-CyberLimbsMarkingXionChest = Robotic Chassis from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLArm = Left Robotic Arm from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLHand = Left Robotic Hand from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLLeg = Left Robotic Leg from Xion Manufacturing Group +marking-CyberLimbsMarkingXionLFoot = Left Robotic Foot from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRArm = Right Robotic Arm from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRHand = Right Robotic Hand from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRLeg = Right Robotic Leg from Xion Manufacturing Group +marking-CyberLimbsMarkingXionRFoot = Right Robotic Foot from Xion Manufacturing Group + +marking-CyberLimbsMarkingShellguardHead = Operational Monitor from Shellguard Munitions +marking-CyberLimbsMarkingShellguardChest = Robotic Chassis from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLArm = Left Robotic Arm from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLHand = Left Robotic Hand from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLLeg = Left Robotic Leg from Shellguard Munitions +marking-CyberLimbsMarkingShellguardLFoot = Left Robotic Foot from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRArm = Right Robotic Arm from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRHand = Right Robotic Hand from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRLeg = Right Robotic Leg from Shellguard Munitions +marking-CyberLimbsMarkingShellguardRFoot = Right Robotic Foot from Shellguard Munitions + +marking-CyberLimbsMarkingMorpheusHead = Operational Monitor from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusChest = Robotic Chassis from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLArm = Left Robotic Arm from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLHand = Left Robotic Hand from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLLeg = Left Robotic Leg from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusLFoot = Left Robotic Foot from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRArm = Right Robotic Arm from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRHand = Right Robotic Hand from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRLeg = Right Robotic Leg from Morpheus Cyberkinetics +marking-CyberLimbsMarkingMorpheusRFoot = Right Robotic Foot from Morpheus Cyberkinetics diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml index 0b4a06af2d6..8a3cd4c47ce 100644 --- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml @@ -50,10 +50,10 @@ points: 1 required: false Legs: - points: 1 + points: 6 required: false Arms: - points: 1 + points: 6 required: false Snout: points: 1 diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml new file mode 100644 index 00000000000..11f4967616b --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/bishop.yml @@ -0,0 +1,110 @@ +- type: marking + id: CyberLimbsMarkingBishopHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi + state: head + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingBishopChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: torso-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: torso-secondary + +- type: marking + id: CyberLimbsMarkingBishopLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_arm-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_arm-secondary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_arm-tertiary + +- type: marking + id: CyberLimbsMarkingBishopLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_hand + +- type: marking + id: CyberLimbsMarkingBishopLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_leg-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_leg-secondary + + +- type: marking + id: CyberLimbsMarkingBishopLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: l_foot + + + +- type: marking + id: CyberLimbsMarkingBishopRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_arm-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_arm-secondary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_arm-tertiary + + +- type: marking + id: CyberLimbsMarkingBishopRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_hand + +- type: marking + id: CyberLimbsMarkingBishopRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_leg-primary + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_leg-secondary + + +- type: marking + id: CyberLimbsMarkingBishopRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi + state: r_foot diff --git a/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml new file mode 100644 index 00000000000..3103c640034 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/cyberlimbs/hesphiastos.yml @@ -0,0 +1,115 @@ +- type: marking + id: CyberLimbsMarkingHesphiastosHead + bodyPart: Head + markingCategory: Head + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi + state: head-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi + state: head-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosChest + bodyPart: Chest + markingCategory: Chest + speciesRestriction: [IPC] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: torso-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: torso-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosLArm + bodyPart: LArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_arm-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_arm-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosLHand + bodyPart: LHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_hand-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_hand-2 + +- type: marking + id: CyberLimbsMarkingHesphiastosLLeg + bodyPart: LLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_leg-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_leg-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosLFoot + bodyPart: LFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_foot-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: l_foot-2 + + + +- type: marking + id: CyberLimbsMarkingHesphiastosRArm + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_arm-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_arm-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosRHand + bodyPart: RHand + markingCategory: Arms + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_hand-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_hand-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosRLeg + bodyPart: RLeg + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_leg-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_leg-2 + + +- type: marking + id: CyberLimbsMarkingHesphiastosRFoot + bodyPart: RFoot + markingCategory: Legs + speciesRestriction: [IPC, Moth, Dwarf, Human, Arachnid, Felinid, Oni, Vulpkanin, HumanoidFoxes, Reptilian] + sprites: + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_foot-1 + - sprite: Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi + state: r_foot-2 diff --git a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml index ee8be0e5892..a6a63b29526 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml @@ -35,8 +35,8 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false diff --git a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml index 4751d581746..5eb26edd518 100644 --- a/Resources/Prototypes/Nyanotrasen/Species/felinid.yml +++ b/Resources/Prototypes/Nyanotrasen/Species/felinid.yml @@ -35,8 +35,8 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false diff --git a/Resources/Prototypes/Species/arachnid.yml b/Resources/Prototypes/Species/arachnid.yml index 07a72cda176..5dedba1b447 100644 --- a/Resources/Prototypes/Species/arachnid.yml +++ b/Resources/Prototypes/Species/arachnid.yml @@ -64,10 +64,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/Species/human.yml b/Resources/Prototypes/Species/human.yml index 94b21ec9620..49f8839cac3 100644 --- a/Resources/Prototypes/Species/human.yml +++ b/Resources/Prototypes/Species/human.yml @@ -56,10 +56,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/Species/moth.yml b/Resources/Prototypes/Species/moth.yml index 724c268a0bb..44bf5e60769 100644 --- a/Resources/Prototypes/Species/moth.yml +++ b/Resources/Prototypes/Species/moth.yml @@ -68,10 +68,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Prototypes/Species/reptilian.yml b/Resources/Prototypes/Species/reptilian.yml index 752918e2f0c..dc5a56534b4 100644 --- a/Resources/Prototypes/Species/reptilian.yml +++ b/Resources/Prototypes/Species/reptilian.yml @@ -65,10 +65,10 @@ points: 1 required: false Legs: - points: 2 + points: 6 required: false Arms: - points: 2 + points: 6 required: false - type: humanoidBaseSprite diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..81c98564b9a008c820c16e2a9b673872975c4d36 GIT binary patch literal 1059 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|WC_ zPZ!6KiaBp*S$e2AinRT|`1PDkfXzoSLjhMoW#;!D29kpP4k9j&HVy}UdRYY31bEo` z9h`k-)(5zV96jP7BBK9+MU?-;in-r!#POKjc(w8Pf>-Sevo%)yzj}TBYUz8wS&uGd zbSRw3_Mm9zkw=e|PMtm-7#Nt?Jl*wQaB%R7_3OW%xG&PMcCD_UoLt|WIWji(_Q}P? z!B3t)ujXa?>FVN=P*O7Gujafxdu)RLU1CsES3mmkqv5%8=N>$M+*PetuzH-M{Pq|Nfo(I4dJ#!nf&61~xW2mo8ua_~S>%jvW?XzJE_HC=gh_ zeEEqJCm#HqH&5=gg2i0FiIXNBk}k85;o#$Y#`EIs+f<3on>QcI+wT3-oAJiYn~oV7 z8jl`7{%Jo``qu5+k1MseZrapz-fG%1h8G0ns?;Omo1w0FO3^~?zGS6 z;N)~nPgiGSV=E{xPyhLB|F7Npi+1mxZSGgt)7v}qoB3C<1tI6po_+f9@87*oSN_+Z zsK508)2B<_U(aAlNMY>VzJ2@NvhQGBTegUtK7Cs5=j?w1Mt;9rTUr0KWL$nX|M=?{ z{)rlTybN95%ngq&F)Y|&!hnlw#JXVFGPi)tI|8C^dt#-3tdm&6IAP=6yyr}sp{aIu zb^!qa4#9__1vJ{OT?@0Zu{m)4y7w4fTX*c}QP%$+AuG?GI`v74 zrK@qziRq_4IdRCy%6^nNswUkm((vX@&a$^9R{y`Tm6VhyXlQWEoH;WiFV8J8abZS& z{&tq8!w&^~eSIUMqm$1sS)%ez$S~>U>(`GZQnlPJ^)r|%m6Vo#+_7{itE#GMM0|Yv z{Q2_bT{~j*B2=SxuU*@_7Z@uye?NWN`dmY;%Qq~Dp{%@IP*jxlmC!)P;Ns%q zX?6TN_@kuvvaVXS>IbhwI%DeH{x9qk_N{jNKY8A-U?GM<@W#p literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json new file mode 100644 index 00000000000..9f87381cd87 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_alt1.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Sprites from Paradise Station (https://github.com/ParadiseSS13/Paradise)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..a89de820f47b7fe179103b15e1ac71035fec8be0 GIT binary patch literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|S$} zr;B4q#hkaZ_Ioiq3LLXPsKu4Z${l}z-9uPcWYP5uxIdq4^6XE=oWo~Ne*U>&ySeE}OY;9Gp6}anM1_s6| zPZ!6KinzD8Hu|+V2ps#kv%7QZ->W8JYHE9$`WyNei0V5(GLG<8XkP`zVi+}@^;BHj$bnBjTUvgj3+3K~gt9l;a z5OMr$a(z#vd}HOj{?y1>iZ7m-`WM%JsZNxgwQS{^GV9AXbWShHjlO)w`NlQ(tUwW? zxpVCNmM{A{YjI`z)-4}r|K0MvU3~k#)qo%2hk1Hs5<-SQ&f$qyf+IJ-;5ye*W2TR8~UtPq|*AX}rT_6Cu}& zN$0LIusAAwzy12`<>z-7&3y2h&c7bNSOdGZB+D74ul|1cjbd>_d85Ak%Jzu- Tua+NyQN!Tr>gTe~DWM4fe1XGS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..de40773897f6704157d83b8086179c8cbe353e66 GIT binary patch literal 348 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_nkx zPZ!6KinzD44hl9Ih_Eh>b;!QrD0;=wScFNmz^#Z~{q+ff{ilCU{Ik9Oc=wVg%8Z;I z4opH58dy{mpv(jN1uJ4gD{jv(lnK87UH-ly&*5vOv01mp=5EySE?k>lD8zQXv^8Jm z`2Ny!Hw`*;GOw8McJ4oW?(-a74ZHPR%%3h?HWB5o6*=?%@~1C{<{LCjTXl%R>Pzg; z({(KGwOrndGN_8_u4lYx=Jh*+Y-U(--GAlM)AvOtNIFXveBI8%vL+JUCo5(i;AUet Vn8)VO1`I6*22WQ%mvv4FO#qHZe9r&? literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-tertiary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_arm-tertiary.png new file mode 100644 index 0000000000000000000000000000000000000000..7b83ecf161b3b2c235fb638276713a2982e673c1 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anMpkTMB zi(^Pd+}m3lc@HS?xH^_4E%%u{m&a?W+SGc-CB^3_mu`_eETG`fz`)4F!hv99a9=T9 zEnCTYY44M~`D=HXA6g@Kr0#zS52`9meF`5=|8D%U-SwT|CGVGl2>F6F2bfL@i3hAZ SbF>HOECx?kKbLh*2~7Y(8$VV6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..534085a97c31ddaa896b6e69d1efdcdeac7bfa07 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1H8_ zi(^Q|oVT|&@-{mNuwLAl63DSu;37Ath?5JWiIaASgNIAf;nrz$e|+=!S1%-_vPNQV z$G1)kc85943g;LFo-=e5GaRvGcqGG6$k%`=yotFa_PdpSTcXGL(pY2P%gqVb=aj}? z{%g^9y=Q`@qI$yp@?ZO&TlAI8jhiUAu0MZP+qT@5tF+E`3kfC6OZSSNw)8~xX67jt z@5;}8@E5>p1%}PPtq;UjGwx4wf6J9Jx8YJX<9(O+Tq&$S?r`7O)_ZB4?V9cuxQT literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_hand.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..771cd025a865b938f010cfe3539816c6bbad58e4 GIT binary patch literal 385 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TS6 zr;B4q#hkad6xTI7h_pVu9N=%Trjd04$LRwbxUL;y+aMvNqwTPffrXRX;ep|v51*ng zZdr8ZjPRV#KkrSm-|l$kj-wx=0}hnKf97+I|0I?`5k(HBBZW2A*4YwmwXxwnk306g z54`^MW#oK|n+>_Q=h@$KxnBCA_J8?2Z9k?npL=vp8~9GXI43o7!ZOWS%Nn(>G0S8} zi5$JRP50C$lc<~f&%dAd+%oci^JHFw+Jf-S_bx^=JP{!V9r$+Oab3ge<}?2HzwhV| z2)%l}eZ}+}4aaL+jMuPp92WS0_K987SB7={o8xERbKh|!{(#CaRi+sM3=@K3=r^O~ XwOIMn{ZWO$FlF#`^>bP0l+XkKAAy`p literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-primary.png new file mode 100644 index 0000000000000000000000000000000000000000..05f568654e6829574e3315245bdc121ee767f18c GIT binary patch literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_mZM zPZ!6KinzD4Y`d5o1zJz18j2bx=P&GB`9k%~)e|8+N0c+(iSmdXJmKPKbHGK|->j2u z)|YqE+YU~>`tn_7`t+xwCQ4V%zh0lcNJ~(Pa{>cy)L`4Fz!9?kdhoZ2&je5OTRjte zIWPaE-b=aJXWi!dEiZBBms`TVj~)%8yHfJOj>8k1THpy1#q<{r9IcOeQ@onz_eq;e?-o z^X{z;TYa)_|MaY_uUZ?Y^Bq|IB=z~{$aU9OZ!fyW@Zr#Qb}zQ(#x1vVTOa%0Y<4;R zI8ds$ZM)GmhPqWf{s}g6)!C=hw;z7G{q|aO1|JtD6$b){pEE)0clgI08Jp$$9(~fd z^0sVggpSwFm}x(2=JgzJKm0ITeR2E~^~s%wI%I+$S@cbge3)ZaTqUl4kRf3G^~sjD zdVTj_mb{vB+Vg9=z&6*C+&@V+?>Ff`xWXuKH^)r)?F{aJZHeNH?8crF3{R47@H6~9 z{BXeq&L8#Fak`K8$(cBCo7{b`HzT8P9$&nk_{n1Z2NzQpFh<3km1?-h;CS)&UWUEK z544V$_+7vFo8!U)#vM7!BbYBZUCgU|$9jkPP#4d>`iz3i+TaIYlpE{)9x%7Rxx!n> SU|9xCJ`A3&elF{r5}E)b{|Q|H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/l_leg-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..a96f9eb3854571d6e9017bc38ff670b71213b2b3 GIT binary patch literal 478 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_s6n zo-U3d6>)E88RoSZ2)MRu#4sM@&B(~KU}rtP;DO8?#?G#623B2O^975RFrDlS@7xll z8TFn=@x)J$kk{{L{(n|2?cBo7;=n)v{o`bGf3-O`TB@z_lTCPOY;d5+Bis5{D>J3M zCbdiny7Jw2X{Og_n{J&womb+M?tjmWy{^2?=vMOm^2McU-S>ROY@;WqN={AvnLT;` z`u(}mJJ)?M^1LVk7Wc1*Zao+J&$#BCzLM1w zj+i6dt9cm`5;uFautb>nOcPaUXg#YWD3ox~ATn$MgP2*ji${a&;gm>6ridFlLW+!H zypvN|Ingyt{E_4mA5s?Uo+uF{;<|i+anM1_s7% zPZ!6KinzD8HhLWn5IOeovXaHl^mmU`IBHqt7uq?^{ba;C|KLp@wntAUXihRMc`-*d z<>jN2vw~cUX3SfbIZOLL_uQ&?C(G-7mlwN6a40k|FhPk6Y8#@~&f#}bKPlO^P`m38 zH^bSLmDRsDZi$?hs^>ZB->h%b-jyo@#ny6&Ptz%s@s6A}?b7D!E`chJ0yBzzZfk{Z z{OK`k*|WA}jVpU*-To!^XKv+B9rNt#&WjTxzdV=~J?qc!u-DQHW}h~nxN6n6uaZ~4 z&k8S&4*MPd;M3K;clPaGzWVEtOF25GK+$&Je~*pM&fSqy7t?S2_TQ+utErRc?Bn~X!%_R1I z@8yT{eZ{(4bIhc@^Yyd%m@5A4n0?28z53>xXSxqZI?1st;H}-GpU`M<{f(aQPImj_ m&z?00b-;rP&t;ucLK6UM!Ovp= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_arm-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf2346bd8402df7b3ab688de95085780abd5250 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_nl9 zPZ!6KinzBoH}W<+2)JC_yqm!>^@3ooL#o1x28rJ~ik1%L&B_w>L1s59t(6p6ALfnjS_SvNM_)EssB`+s9np)=D(|%=a^&7tE3bbxE&jTxdC|%5ukLxyU8G_6 z@ZPMAtkZd_wp{tX@AM{>?|w`@k0n;E+7C_w( z+=^!g^S;=X*Zu$QTn9hKBM)BHm#eF6QfOdc;y@5PIQKB@Hq+NHzT0XJ3^N8#S3j3^ HP6anMpkS}3 zi(^Pd+}m3lc@HS?xH^_4E%%u{cMgZ9C@b&8AD0Xde%@)awvvTIK*6DbfsqNpP;1;( zrMmIW>$jn$>Ae4Svr6{=_3Xavg{lZc+i}h}yAR5n-%`@}ao#~{YaEh+|AZ?TTm;1f UB*It>fevHvboFyt=akR{0JRA`w*UYD literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_foot.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_foot.png new file mode 100644 index 0000000000000000000000000000000000000000..a8fbe8635ea509fb178f489345fd83302fa00872 GIT binary patch literal 328 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAQ1F+h zi(^Q|oVT|Oxta|a+#ZH&$Q@a2Q7JBN+cBB_gHqg4VGFCB5sxD@mUM18^uJ!wxUGU+O!vKl=;dwhGw=-dq!^)#_VUztdKE-!RAcXH59La1Xu@b!z){xc3V^+x2SS aA#M|$=*+@9%C^8zVDNPHb6Mw<&;$VKczSFA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_hand.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_hand.png new file mode 100644 index 0000000000000000000000000000000000000000..db11be34056caa261ef3119fdf034b840280accd GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|TR; zr;B4q#hkad7VE z{r7)!G|OxDHa&Q!u$%!GTE~C9@XqwqgC@QbZH&3M?|pdQwdlrX9cP*29ESxmXIVXe z!xM1b^i9g`Z3orO;(uSfR%&Z=O;VvtNyW2i-RlRFE9XsoZux7UJy38#rc|_DwE#<; zPJQy{HLJ3=ch{f0|MG*{k8_^?&d#)at;tZtMGPwV#{KQzUY*n4-*|4^xG(p9v1o$$ z``hyx!~NKI6rFGA{hPa-Ic8`21M&5*?0<3p*pdD~)Rxu3j}eOc><%z*F$miebYuTK QU~n>cy85}Sb4q9e0O5I)y8r+H literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-primary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-primary.png new file mode 100644 index 0000000000000000000000000000000000000000..d6288eedc3cbc85f196685e9b996b034b9b64a9b GIT binary patch literal 611 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_mZk zPZ!6KinzD4_GU2!3bY;<$T{lg@!WdJg=1mYrf=|Ce0STX)*lR-TQ+{;Wa-vvnyR_w zBjcJJrvz)>jD@Y{^H?1_T8$&?yNnfX-bT&*Z@Y8nA`hGM#fcKjw*2&*-`;mHL1Aai zxsWJR#_pp|YLh!dR)+>}&Q^8wSDS1&HJp(n{$5c0d-;_L94hnA&z4e~%OZREWe8Vm z)5Va&s233hSg@To%{wtS@yn%hYrE_$M8Jn56cI(wU5)oYCUYeYB_KNeS5&=f%t;9-HJ*tx3dCM4TGnvpUXO@ GgeCyqUi{|( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/r_leg-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..7a406c931877e43e809f8b57ded0ca46a6918e63 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anMpx{SO z7srr_xVN`9@*XzeaS2q7_E?>%vVP&sC7dDJ1v5)n8b34sTzOXJZ^g?XE_oIK2L?tQ z!~=hpxQX9olIPs3&RpC2OiA)$`t_)b6W2e#fAQts@{%LJeqK<`UR$QGoZm3lp=jX; ze}$Rp=6nrzJ&$l-WH8(jE5p0Ny0b!2N`Y;A_hQB}bwPa><|7Zv3QZ2YQ+d>y(I9b0 zuaE7pJvq?ljRCr$PnoVe&MHt7QH?b*1F^A9)Fev21Ui4VZCH0^XOu-bP zXdp)wmjnZW-U=a*TOgPch#z;?B1j@6OQ0v?A<|<#1UCuPMpzPZh-jc_eBIyBXFFK} z`#!VX6?F!dcjuj%=l_5H^ZCw4zO};LRu(7dG!2$F}%jM+ohgB(FEL!k0=LH|UGV-|rMB&U@0yXCaU^FLvA7+MJW;1>Tcx#W$0k zoSaOT9=(|?zVg5gMzn;fA766fSi!S8@8<)*wYAlC!TfXYCS$+dN$G;8r>AD;v75OC z_#|+i+TY#Xb*+GSh%@z+!D)5A9y_KMfcgUi1J3DdD}N-HUKCVoM>wk@G z1>l!TrHa2pLqoE;xmk&KcXyldgIa(hG7bF`0mtX&=G=75lXz$_3qYUm>+5rPItml_ zXN6EQS<0Q9oVZ$7Jf6gP9}>(0=oCc1zxDg=RQrGR+#EtCOBryebplIZ0`X9MvjBk3 z&dydA9Lxm7l}r{V>dEu8@iQ-klr#g~`1rV6juL2s6B83sC=}}P%T#t|X66h&tH5S; z!3xolkr6lb>C@yvotgRY(vLF#f1PGy@u)ylASw_Qhzdjnq5@HYs6bR8Di9Tj3Pc5> z0{;&MOy>ef^6RHpTHgEi(y1@c`ue)r&eM>$dN=B;w+~yN|LERd7TaOOKUk5GUp{w7 zW9-dyM$fKnKA#V>XJK5<%Ql!|vPsH*AjjnL#dV`45%Z>~l%0R|=BNx89ynkrzD`FMFwk`hH`S%OAQ@x_Xlf%)6pR6U#*dPT1EHHfzaH3+UAWJZ} z08WFn*;g(jY~4xo^OBU_SxcnB!@<2W#$ov=o`X?6i=Y+2sr2l}7T;Z7TMKw>o+hZx z&quuS&9#P~5?5nr*Hcbb1xx}k@NpWfHLv#r0Bz;h5nhO&#jgnO*aWJ z|MJgg22CH3Gy2dI+N@;B2ZnzipxWtbjT>>cJ(b17`XQ+I4$F+*jUf*f>AP5FnV1f+? zLZ}F)E>IqUF8~gx0#h407h69>thGgc#n8nM@01VR;ApXH{&+d>YY@O@e-WOy><;-F rw1^e+Mg^h*QGuvHR3Iww-%{XjDa=i7S5~3G00000NkvXXu0mjfnxA9f literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-secondary.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_main.rsi/torso-secondary.png new file mode 100644 index 0000000000000000000000000000000000000000..4e61c144a95ad7eedfc9f805a421bce36392ee5e GIT binary patch literal 481 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_s8- zo-U3d6>)E8IrcRh@VH*S_{M_qjiu=G2O@KtZNDe-t0$a&;q96wsbNv*aktJav~%PB z`ExfIocpN6D5L;GKm3@?J#SUc^FFiq_P1L5>8U^U+Y4pmG{h8M0d-+V{G|NA2 z9>R8-r@L`>*+^b#3>SkZB=Kp_tTj}@G z&eKn}DKP}>cBlyHI~70o&mv`$buYIci2EJ$N$kMO?rZ$Et-%KnWt2Rf& zG0izr3g;WHh-yRabRCcE{4qOT@fHZw!Cd{}wUn$Nk$w9}fQan-6%55>MpW_)T?VA`M( zFLLy<4deIk$DSE(a$8fn>B19cM;qCDv)JDDo=sNypC$6%c%@M3fk3C|`>$nem1D2> zDa!RO{OXkc>C%$(xAbqRJpQn+l&9JB!F?o;OXk;vd$@? F2>{%v%)9^q literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ca3cb6e9e36d48f65477bec2129e69b4c19b861b GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_nk| zPZ!6KinzD84)Qe_@H9M3+9NQp;d}e>2gi07JYl--yZT_yQSZot!+*Se=Db|+`eskE@XZFv)`#T0TmH>U zUh;+g&RS0X!wRLb-j_|HCSElvy>@ENJSVTx8+Q~8eSWbkzLb6Mw<&;$UMYm{LC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..a175f4dfcec5179babaf11fdfc901aa32596ec42 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_mY# zPZ!6KinzD4^j9-EiX1(De6`!`t4lm*U-eJeberYic_j|B-6#DMt|;ALIjCkfS>no; z{PTxmul=7l(e>fn#?=_{0wtdkLN<@7-yeUq0==+HSUG zl3|4XR|$n(F?!86bHtu}{`td6{_*w$8#wJ|@&E5Ws?=mZ*Kcw9or}je_y5xueo(i+ ze8;P=yKd*0ZPfg=_@YMD^t9&xck{$OW%$}RTOX_aQh%etfB9wK$<>e7{7?U^`%$Ik z^z(GPN$*$cCv1({8MLxQoZ;T`yVqWCmF_?8xHhc&yUZ8Ecb7F7)C^?!Vi#ZR_LFLzgxDuG;!^O zPrqM17r3U}9HaLHK5Ws^5b7}d{By^hF@52`10PO0_pQ+}NZ9a3h_%hZjKFw? zy5y@_Ur*V;`n*HpVfnLrmz{Io*f}sdTv&6!x^vSuyN#9kVc+e(Z#mCV<25~&=d3s$ fZ#J%1`M{p*A$^ClQ8f~nkQh8&{an^LB{Ts5mMjqA literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json new file mode 100644 index 00000000000..ea5456fea10 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/bishop/bishop_monitor.rsi/meta.json @@ -0,0 +1,19 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "head", + "directions": 4 + }, + { + "name": "head-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_alt1.rsi/head.png new file mode 100644 index 0000000000000000000000000000000000000000..b6446e6a6d2a237fac4840a78eeeec583fce393d GIT binary patch literal 994 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fA0|WCE zPZ!6KiaBp*`Fc!olsP8vTP*0yZ7)>fd|lLK;|dk~11&EUM4o6`<-~fO^>%SdVQEZ} zzhs)dx#^q0+&2mp9SY33NBf&arPoQWo4B-gh4iLrJI~f{E03Pu^z7=!!)N&K{H!RQ z_ut0Y`km2#3ynUr183x?UY){nxoGmk_p{wTtt+XidECA`+k!2-WnumXq1r@dk3Y8r zrDNi_ZDzQYO%qLD&1AvKa{Um?rTbxlM_%U&D_hJ9K9KalH~5zmo5Z>BC%+?3cd31Q zwSm22_OF*aeS|aqq@Vq`=9t>O&;#oJTdwvnn10k~-?483qshs0uWdC-^V8QBew*AP z9De-g=Ej9`Z?f04_;}R+m;Dec&N=gA*(9-pN;b<@8Yd)VaQyGqew}W3xGdIW<@~h5 zXVG0BDxBCZEPTG=E_3+tQ#z9zHn=d*twOoZ#^gDm{! z>;0ngE8p&Nkp)jn1oLcWG_Ow8o)s0J)bKStO@E>ECxyS?;-6i z`;vP;W1{elvg|D0uOFvQwE5{#n_zOMY<+=EaC^d+l+?WHn=kqg1<2$wh`38L9KFcq zP`HH=7dJAn&Os%6rt*eazm|Pseo=Q%u+%X#+vjkj=?OuFzwK*xR{T{ei`=hWlC1N+ z>W)Vr1Cxzo(~bb^^WIz?@7|rgbFuryWH@@01V>Ll$)qx?$lM9>eR<#N4y^Uow6SjxOZk{- zeElRoSopIo>ZQu&+DvB&B~s#@k4h=<-LkFZ|n!U&l-EUUm#1baTRx|Cqt^stPXSExJffXpmup$N{sG|9=rQ> z?z5gRclA-voG%+G?y=zcxruh0qYRGM&2!+7F)sef#Cc#^c3JL3=0Bezl4i?PW|$jq z-v5?$VWIom4_6IqfWB2Nag8WRNi0dVN-jzTQVd20MkcxjX1a#PA%><_CPr4qCfWuD zRt5&T&cRhE8glbfGSez?YlxA1eGI5U18ze}W^QV6Nn&mRLXSy^p{13vk(D9T685l} QnLs@Zp00i_>zopr0DEVu6aWAK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_arm-2.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a529d9ebb60d80e91cb18c0ed73aaa3086c603 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5M?jcysy3fAP;iT< zi(^Pd+}oRuTrCDXtQQ_l-E;ZQ7VG>guE)5VcC7Z3)YezH;p+UU?&-G-^;;peROa89>-v9iUUC7j+S?YFrG4H>#&8X@)mYx^4=eSJ$TglU12KWD` zZ@240=!F}C#87Y4p7>|AK(z8ty^lXuySPWB^MBZ*OcAY&H;Zx%mE!?gb{l zkQH6Z2SZo17e7i=Xf!r*{uIAv@6Nz7?nx@1lT_}$Dg2^P!PweaUiHEwk?Gmvk24c{ z7YG?H6BeAhV50Av{|CYss|iotw&dT&Mv!_>@!OUU&YLht&$T_cOS0l$O$PtPyTWT` zHyU$4scPcic+*`qMQrw0pkq`^Tq8nXaL6h@q*KiIJ7D ziMD}(m4Sh-b8r=khTQy=%(P0}8e-&L9|LO8fZI@#nVVW%l9*e7&|?x}XlZ3^WMv4o UggtC#CQuK9r>mdKI;Vst07Qy^6951J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..6be2024018bd9bac40ed11789decda14a2c67b6f GIT binary patch literal 392 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op=M7P$B>MBZ*OemZ8i{bz34t&bQ4pi z#FfJrTQv6^_7zsi=xJ2yD(R2juYdY(eW!}&Bo$A4Gnv?i@JX7*(+=-mJyElGQhD1u zpX3Nuu9PL_j$8pReYeyiPajJf~v>~E8A+aBB| zx#LsAzIhLrqt^z@2LGG%0_Yso64!{5l*E!$tK_0oAjM#0U}U0eV5Vzm9Aao{WnyGy zY@%&oU}a#S>l|E#q9HdwB{QuOw}u$G*T;YwG~hOrWag$8mn7yEAoQ4o7+P8x8(A4b VEnyFvnF-Xx;OXk;vd$@?2>|UKe>4C9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..87466284b3b0e5d79be803608eff7b55ea7f64bd GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op)yYw$B>MBZ*LsrZBP(!xp=W?1FN%T z&}7?7ha(y}SbTc^&sE>eJtu;bf#HGmp$9R=zjaRQEzi+5@7-|CeQ}Vhmgc!#jn3aL z-)wr5d{6m`$U1LEps5W1QZK}B+fr3#<2pS0pyXF5jM7H$OUuhhf1RriHxX z&L2LqfE=Y-;u=wsl30>zm0Xkxq!^40j7)S5%ybQnLkvx=OpL6IO|%URtPBivor9}T zH00)|WTsW()(|82`WR4y2Hb{{%-q!ClEmBsgdUR+LrW`TBP&CwCG24{Gl6;-JYD@< J);T3K0RTI?cYFW< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..b871a17933379e4aa2af10587051df8f69f64522 GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op>j_b$B>MBZ*N@WZBXE8dHBj=M^mB9 zjFYlAAKqbzYLa^V-!|UsviUh428IXLlb$_0bUxg3?@gnXTAL2N>X!?XS($WPmwm$$ zoznBORZcJDZVCIq^KB{6Tn2{!MlaV}SS`D*&GM@;@NL|~M%FUx>2J^KTlX?DY>EAK zL0jL0+2j~dp=yb1L`h0wNvc(HQ7VvPFfuSQ(KRsBH8c(}G_^7@vNAT&HZZUk0qV`&?3Gy&$!I?Y*q|QWwcv8k3Xw#^VH4t2dB;Qi2ha^rDS^hP_Pmh)R%lu zKVUff{>}3>cWl?3^l@usRK9ss^5BjMXC(F{S3SSO`)A*wT<;61S(`Q|J~#&hEO|a*?TL5nHM<*6exG*WF5~^Yghjds zy?-!esQVpFUF%l?3^3Ia*NBpo#FA92AvZrIGp!Q0h8Vfm$AB6%;5L+G=B5^xB<2<%^q7PgT3Q(!Ss6ktVGo;` Q3Dm>j>FVdQ&MBb@00)}KG5`Po literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/l_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..90b10eb4be5ca5fe2ca3551817781542555569e8 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS@v42+_lE{-7?_uk$xEIQ=C!+K%AWLicM zpLq1!fafZH&JPzpQL$q(J-*-pOWrrJWyi1jJ2p*bstjM4_-ucaP*ks`ih~OfJP~zy z7cqTfvd)SsDiV*UrO6g`=`b!vyU`?m8L4~|SLF>%;t zW1G%&(XuhZr15Id0k-!y6a+)%AE~p~EI3$bSoAS|gKKlkx*{f7A*meg%^*8mT>ib- ze|=TNeu;Y@_sM_f&z6`S_{77gox4VNg7_1MzIm%lgr@SAhHwqt&XLHXepW3}tG zPt@8w(^ZU*sFDdCZ&VYd2Oi?Yn)z zC%kF;2Ub1*in&iuSkDKBnQDn^L`h0wNvc(HQ7VvPFfuSQ(KRsBH8c(}G_^7@vNAT& zHZZUBQ;SOya|;l9OhODTt&EMV455~= Tht13c>S6G7^>bP0l+XkKhFZZt literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json new file mode 100644 index 00000000000..9f4ca1ee51f --- /dev/null +++ b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/meta.json @@ -0,0 +1,83 @@ +{ + "version": 1, + "copyright": "Sprites originally from Paradise Station (https://github.com/ParadiseSS13/Paradise). Monochromatic version made by: DayOS (https://github.com/Day-OS)", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "l_foot-1", + "directions": 4 + }, + { + "name": "l_foot-2", + "directions": 4 + }, + { + "name": "r_foot-1", + "directions": 4 + }, + { + "name": "r_foot-2", + "directions": 4 + }, + { + "name": "l_leg-1", + "directions": 4 + }, + { + "name": "l_leg-2", + "directions": 4 + }, + { + "name": "r_leg-1", + "directions": 4 + }, + { + "name": "r_leg-2", + "directions": 4 + }, + { + "name": "torso-1", + "directions": 4 + }, + { + "name": "torso-2", + "directions": 4 + }, + { + "name": "l_arm-1", + "directions": 4 + }, + { + "name": "l_arm-2", + "directions": 4 + }, + { + "name": "r_arm-1", + "directions": 4 + }, + { + "name": "r_arm-2", + "directions": 4 + }, + { + "name": "l_hand-1", + "directions": 4 + }, + { + "name": "l_hand-2", + "directions": 4 + }, + { + "name": "r_hand-1", + "directions": 4 + }, + { + "name": "r_hand-2", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_arm-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5e770056ed95b2be02fcbb0d7613006849cc9abc GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op=X{hjv*QM-d^9hu_-{H^`ZPRz71ST z$BRq~-$_VEvZ+eUxY4$r`LK8d^Ru+$A*?kv?XJzAQ+3Lx-QBCgotE~k*Q?efePy-- zWBAtT6YSZw&fehpUu$+|#V?bv*DGddTdc}EXOmtU~I|)5%V+OjnqP zOq#WF{wqQ8gC?(MevZ#_yeQ%DSp81$5uS#ozxUfGH9g~R@R<1W>=_`)Nk~1>b;~4^ zf4bKk$Nh@lQT$WIx}t;MKYja9IJ?fG_d?e3j-x>a>C$zqmDjtOKMVe<4?NI%RfDx8 z=)wMplMU VOW4C^W&-svc)I$ztaD0e0syVctYug4O8oM+kA+`2PDW_93>(~krd92yuHnOHak zpo}_}V-iz&imd<7F_u~|x&Cd;4!dZPBgK{5SKZn?Z9iYtGrLdad^v3>df=KNjK=!L z+oi=;8O!thZf^|jU#|N#>)z@zzqM!MkAAd7wkwEb->pM>-Q`-hB7v@E@O1TaS?83{ F1OQqJQR4sr literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..8994994011cfefe211374497fa902ea729f1135b GIT binary patch literal 390 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op+-*^$B>MBZ*OemJ!Bx_dhxVGB$jClkZcu{rMWZkA0Gg=OmTCH*?=_Fxbq{|M#`?A=w#`72oVM zRi<9h5dX8`0>{)P)lo|)ZvV(?H(Bay(|Zq)jxWsdTn)k}>ykI5N2vdPSr9Pa=#KH4 z$$w|E{;FydZ;NwxH$Kk#8R!_*64!{5l*E!$tK_0oAjM#0U}U0eV5Vzm9Aao{WnyGy zY@%&oU}a#S>l|E#q9HdwB{QuOw}u$G*T;YwG~hOrWag$8mn7yEAoQ4o7+P8x8(A4b VEnyFvnF-Xx;OXk;vd$@?2>`20frkJ9 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_foot-2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca884025fd3c36feb1979700a5936c746cf279f GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op(alk$B>MBZ*OemJ!HV(a`Cf7f?}09~V6;u=wsl30>zm0Xkxq!^40j7)S5%ybQnLkvx=OpL6I zO|%URtPBivor9}TH00)|WTsW()(|82`WR4y2Hb{{%-q!ClEmBsgdUR+LrW`TBP&Cw VCG24{Gl6;-JYD@<);T3K0RWh)f^Pr- literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-1.png new file mode 100644 index 0000000000000000000000000000000000000000..13a46c2e09224bbaf474425dc80ec05ae3bd87a6 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op-N8|$B>MBZ*LsrZBXE8eYm_(D(0X; z-$&yv*fY=NQH3Mt7E4?cvRM!1&vSp{I~p zdZGB~ZH29lK&7fBt`Q|Ei6yC4$wjF^iowXh$VAt`OxMsj#L(2r#K_9nMBBi?%D_O^ zIk*Z%LvDUbW?Cg~4KZ@Bj{!Akz-=hW%uOvWNz5%k=rIW~w6rodvND8P!X7p=6R3y5 M)78&qol`;+0O1UHCjbBd literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_hand-2.png new file mode 100644 index 0000000000000000000000000000000000000000..d203e571fca443a39a9168e1ff8fdccc6294f559 GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^Op$bnI$B>MBZ*LsrZBXE8edslZE!?1o z*?4FF;|+&DuRAzlMpOHL>q`M%mZHWC3=RJ~XUzy#3$2_Y5UOe`-2U5Xo>zOmq#*bPbI|3{9;}jI4}Jv<(cb3=DLg zgR4+9|rxAfqED` MUHx3vIVCg!0F;z@p8x;= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb762db0c49173c4d6e14939e3a4a896dde6ceec GIT binary patch literal 536 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS@v42;5_E{-7?_uk$x%xg9fIrh^*Nle8*WvS``a4U;=S;E(m) zKP7ACua$q3zVBUA_Nfog`xp=3wl!=jJU-iSN#D=dS2_P*bKKv~6Pw~Id3(XLV<9Sc z^3Uw?J=$xvOHFFQ(=&EI|1eaa<8ID0InX*UGq|C1o_EPny|9>BZ>QVjNlvofP`d4W z`Dq3JFRW*t`yI`WxRVYHG1U^+h?11Vl2ohYqEsNoU}RuqqHAELYiJx|Xli9*WMyok zZD3$!V4&+9T!o?`H$NpatrE9}7`fNSfEqO5Hk4%MrWThZ<`y9In1mQwS{WNz8A2^# T51W|@)WhKE>gTe~DWM4fT3*sB literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/r_leg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..16f0ee16471f110c804c23e9fd2a66de7521f018 GIT binary patch literal 538 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS@v42+_lE{-7?_uk&HUDxCw!ur7Y*pXwU z0Y0W1>$D%5inUytx`8Eodg4Q_j5P5Z&ZRnkI$L=j8mZ}5KG*)aQzmc04siiNAow{u ztLoY6XOaD3(Y5 z!t&y!ap?hd>ka>EeoWV`3wW@_;s9Ut8-b3A{Dn{SR|o_o?BBz9W3hw7)P<8eK;Vz{ z+2mQD+77o>|%>D8VHrA6a#wK<<#0kpYj6D9Q?bywKZ$;llx2XjtPSp}9IGAuV z-^RuKL(_ykYLW{MF-pI_%*Y@uqsDeQr9nB0r<;i!C8<`)MX5lF!N|bKMAyJf*U&h`(A3Jr$jaD6 z+rYrez(ChIxC%u>ZhlH;S|x4`F>9ZF$poWv@$lbGK5;f T9yT)*sE5JR)z4*}Q$iB}rB=o3 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-1.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_main.rsi/torso-1.png new file mode 100644 index 0000000000000000000000000000000000000000..45fb93052e45ded9eb7fd6f376db6c0cd0306672 GIT binary patch literal 813 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877l!}s{b%+Ad7K3vk;M!Q ze1}1p@p%4<6rdn`iKnkC`wKQcVFf-@hNS^OO&Xpqjv*QM-p<%N@wS0LtNonVmTU&$ zU5p}+I+~gE0tNk69N;a8;GUB`BS6&R^`Cw z0tA0T|J3kDUfz6RaraMd?$fgSye1}o>rL7}zxC8XqXTu~A5HI7*MC&lbMoiC_;;HB zF5j*<&kE&hKKLLabg{s~z=TNAHK&f1Ph{j{wvgd7u$WnQOL}T=)@0@TCJ%Z#)ok3q zx@~DoS6dgl&F7FUONI&e{fG;$g$p8+M4mo=psD`EGH&S$iI?wseoonR|5Nk(n#4m3 ze;k!x_hkyT{NBv+ z{z+D{oo%4L5ZbqZOZN_}Z7JBKH$mV;ZO-K>GX!Kf zgo^x9yf!bE%CKaNJ;-xtm7Cudo&|h%rdpW}i=A?BOnb5KP|INh4{H^J-vP7yR|8a6itk?VZBpSK*pm{6GG`fG;Fbc2Mt)HYG+g!q;7 zgdYdxS~(@&yqJ2MyRxUGBrqt8Z?mnE_+NeF#Mk^!t92xq^^P<)NBn)bN`I2Eq9CjB z*|Sooj3+u7Z^}JXB4hi(ROi23+@e+h@(VvElE#zvu5SG+MQT<)0UKwbR9ii~l_0d152+;re~4no0R7Q>SqE za-9EEIdi|wQ}O8siUc+sa9nfkul9ZO&*k<3a~b2$z6W_02!5z*-23)4>h8+!Rn|{_ zU#QgJ)V#+joOmcPC39DpZqkvrrb*5GKh0LZ<=rz~;rj1F;mV0umSq|$T24^8GH1n< zH1>}^GL1Vk*~~a)W`0n}KWeHWW#F}nce&WzatpzY6}5>)azU9@znH#G+*}7#@-JZT@gTzoZeRASEPi?WfxO2r;Z_X`{>5i@%U_su znw_U{59jH^FO8Qs{I%J$G`?1%yrkrh{SVe((^b}-oms37OhBq7t`Q|Ei6yC4$wjF^ ziowXh$VAt`OxMsj#L(2r#K_9nMBBi?%D_O^Ik*Z%LvDUbW?Cg~4KZ@Bj{!Akz-=hW o%uOvWNz5%k=rIW~w6rodvND8P!X7p=6R3y5)78&qol`;+00Lb~!TanMpx_@* z7srr_xVN`1@-{07G$h^MeTi-LSyuI4nHC@8Z8VM^m$=Pz^eJ2$Uip*tZN7!C}cu6{1-oD!ManM1_s9G zo-U3d6>)E8oi1!K;A!(!V}BRG>KeeIUezFE;l#}o8pwLZLFf3V3A`-cH?KcTKek)q z^slA;$6bxs*f|;)I5;?TPH(#C_}`{NuVArR?aI3Q-xYtF_?pYfh^$?0+*YK&e@kO*ShbxI9tT^p^HZ0YgL|EmrJ9rSMR@f(!4?Fo;@dzOEI(Ey43n8pUWjX zp1#?2<^R;byVf0i^5)N}<8`q-2{Ol>|EFJ9J$U4XP{!;Z(^4Z3H9xy0t-$8sSQeZ9 zCRv{C?EJzlxvx_sm{j-q&%3U=QAH?u)8E&&^Pfk)@n7|Rzis;Mc?;KbNJcv_un<5G zcsW*RX}YIotUG)2)09)`I^63Ru9yDJ_MZ2g|7w|PX1o-)X_cPuZtiU<@BSx$7QFe^ zbk2nL!at^&>1}KO#xdc5uK*txKi8q}d>umFrqA}Z%zh{0KKG$_wTNBv(VKbUll^OE zM!kA;|JyblxtfBNa~R(IW=(Q+VOa4idYWo^V@uwIM2V!Y?~;yJ`Ci^&FW%jI)`nrju%d_Wa;+AT63T{(iV8V$$Y-8ES;5)ylwP(?e3&3>1 N;OXk;vd$@?2>{Pw Date: Tue, 30 Jul 2024 21:33:47 +0000 Subject: [PATCH 009/143] Automatic Changelog Update (#613) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 56389a65d6f..d6c7852d41b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4678,3 +4678,11 @@ Entries: message: Radiation damage no longer interrupts DoAfters. id: 6188 time: '2024-07-29T06:00:26.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Added cybernetic limb markings from Hesphiastos Industries and Bishop + Cybernetics. + id: 6189 + time: '2024-07-30T21:33:23.0000000+00:00' From 08dde0222497488865c900df398594d5c233e930 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 31 Jul 2024 05:34:36 +0800 Subject: [PATCH 010/143] Add Makeup (#614) # Description Adds new markings representing makeup: - Lips - Blush - Nail Polish (Left) - Nail Polish (Right) Availability depends on the species. Cherry-picked from this [pull-request](https://github.com/DeltaV-Station/Delta-v/pull/1191) from Delta-V. ---

Media

Human: ![image](https://github.com/user-attachments/assets/947f0186-297a-4af8-87e4-a14aa08d6100) ![image](https://github.com/user-attachments/assets/fc8b347d-a4fd-49f6-ba8c-2dcd9e5d7ac0) ![image](https://github.com/user-attachments/assets/ae5fc444-b1c2-45bb-969c-d0052c295a9d) ![image](https://github.com/user-attachments/assets/47a1650f-d2a6-4586-a4a1-83398db138b3) Felinid: ![image](https://github.com/user-attachments/assets/fbd12ed4-e7ac-4898-aa01-bfeff23c2818) ![image](https://github.com/user-attachments/assets/3401464d-ba4d-4da0-b378-b0d45424d792) ![image](https://github.com/user-attachments/assets/f0a08c2f-0cb0-4349-976c-15c59723a702) Moth: ![image](https://github.com/user-attachments/assets/e0036568-8860-4daf-b548-3f953f9a2ec4) ![image](https://github.com/user-attachments/assets/68620d38-6365-477d-be90-6b92dfaa32ee)

--- # Changelog :cl: - add: Makeup is finally here: lips, blush, and nail polish! Sashay over to Character Setup in the Markings section, then look at Head/Overlay to give makeovers to your characters! --- Resources/Locale/en-US/markings/makeup.ftl | 17 ++++ .../Mobs/Customization/Markings/makeup.yml | 87 ++++++++++++++++++ .../Mobs/Customization/makeup.rsi/blush.png | Bin 0 -> 151 bytes .../Mobs/Customization/makeup.rsi/lips.png | Bin 0 -> 149 bytes .../Mobs/Customization/makeup.rsi/meta.json | 35 +++++++ .../Customization/makeup.rsi/moth_blush.png | Bin 0 -> 139 bytes .../Customization/makeup.rsi/moth_lips.png | Bin 0 -> 137 bytes .../makeup.rsi/nail_polish_l.png | Bin 0 -> 170 bytes .../makeup.rsi/nail_polish_r.png | Bin 0 -> 167 bytes 9 files changed, 139 insertions(+) create mode 100644 Resources/Locale/en-US/markings/makeup.ftl create mode 100644 Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/blush.png create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/lips.png create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/moth_blush.png create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/moth_lips.png create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_l.png create mode 100644 Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_r.png diff --git a/Resources/Locale/en-US/markings/makeup.ftl b/Resources/Locale/en-US/markings/makeup.ftl new file mode 100644 index 00000000000..24ca3a10b7d --- /dev/null +++ b/Resources/Locale/en-US/markings/makeup.ftl @@ -0,0 +1,17 @@ +marking-MakeupLips-lips = Lips +marking-MakeupLips = Lips + +marking-MakeupBlush-blush = Blush +marking-MakeupBlush = Blush + +marking-MakeupNailPolishLeft-nail_polish_l = Nail Polish (Left) +marking-MakeupNailPolishLeft = Nail Polish (Left) + +marking-MakeupNailPolishRight-nail_polish_r = Nail Polish (Right) +marking-MakeupNailPolishRight = Nail Polish (Right) + +marking-MakeupMothBlush-moth_blush = Moth Blush +marking-MakeupMothBlush = Moth Blush + +marking-MakeupMothLips-moth_lips = Moth Lipstick +marking-MakeupMothLips = Moth Lipstick diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml new file mode 100644 index 00000000000..901bf6e75cf --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/makeup.yml @@ -0,0 +1,87 @@ +- type: marking + id: MakeupLips + bodyPart: Head + markingCategory: Head + speciesRestriction: [Dwarf, Human, SlimePerson, Felinid, Oni, Harpy] # Delta V - Felinid, Oni, Harpy + coloring: + default: + type: + !type:SimpleColoring + color: "#7e2727" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: lips + +- type: marking + id: MakeupBlush + bodyPart: Head + markingCategory: Head + speciesRestriction: [Dwarf, Human, Reptilian, SlimePerson, Felinid, Oni, Vulpkanin, Harpy] # Delta V - Felinid, Oni, Vulpkanin, Harpy + coloring: + default: + type: + !type:SimpleColoring + color: "#d39394" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: blush + +- type: marking + id: MakeupNailPolishRight + bodyPart: RHand + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + coloring: + default: + type: + !type:SimpleColoring + color: "#702020" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: nail_polish_r + +- type: marking + id: MakeupNailPolishLeft + bodyPart: LHand + markingCategory: Overlay + speciesRestriction: [Dwarf, Human, Reptilian, Arachnid, SlimePerson, Felinid, Oni, Vulpkanin] # Delta V - Felinid, Oni, Vulpkanin + coloring: + default: + type: + !type:SimpleColoring + color: "#702020" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: nail_polish_l + +# Moth-specific + +- type: marking + id: MakeupMothLips + bodyPart: Head + markingCategory: Overlay # The marking category is in Overlay instead of Head + # because the Head category for moths only allows 1 + # marking and lips should be usable alongside blush + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#7e2727" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: moth_lips + +- type: marking + id: MakeupMothBlush + bodyPart: Head + markingCategory: Overlay + speciesRestriction: [Moth] + coloring: + default: + type: + !type:SimpleColoring + color: "#d39394" + sprites: + - sprite: Mobs/Customization/makeup.rsi + state: moth_blush diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/blush.png b/Resources/Textures/Mobs/Customization/makeup.rsi/blush.png new file mode 100644 index 0000000000000000000000000000000000000000..9e672df8c31c1bbaa12a2033c023f41f10761734 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)0?k@(cp=>UJ#!if|Tq zL>4nJa0`PlBg3pY5Z3` literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/meta.json b/Resources/Textures/Mobs/Customization/makeup.rsi/meta.json new file mode 100644 index 00000000000..422f1eec834 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/makeup.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites by angelofallars (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "lips", + "directions": 4 + }, + { + "name": "blush", + "directions": 4 + }, + { + "name": "nail_polish_l", + "directions": 4 + }, + { + "name": "nail_polish_r", + "directions": 4 + }, + { + "name": "moth_lips", + "directions": 4 + }, + { + "name": "moth_blush", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/moth_blush.png b/Resources/Textures/Mobs/Customization/makeup.rsi/moth_blush.png new file mode 100644 index 0000000000000000000000000000000000000000..c66a862be017fba40ab00802f73ba1afb1fd671b GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877lxY8c5y4i~sDx>wQ|#u%Dwa< literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/moth_lips.png b/Resources/Textures/Mobs/Customization/makeup.rsi/moth_lips.png new file mode 100644 index 0000000000000000000000000000000000000000..72c6f57c6efc880557a31b5129c8fc959e0f24c8 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I0wfs{c7_5;rX+877lxY8c5P;>Bs|uecwr-J!PZQm3Wkuk4~5S} cF)%d5%REnJ|LNIntp*bIboFyt=akR{0O{Hz?EnA( literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_l.png b/Resources/Textures/Mobs/Customization/makeup.rsi/nail_polish_l.png new file mode 100644 index 0000000000000000000000000000000000000000..73175b4e2c8436ee2c1c5548cbcd51377b9bb489 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)1I)(iv7=-5>V?D8gCb z5n0T@z%2~Ij105pNB{-BJY5_^DsH{KwUL)WfrG{2(Ld|QOlEG20^e(`;{Pe81XRMn zAeNHW_v~`yZSNIPJB+x&LJSRB+hdDvd$-nCyM1?NU^uXcPut)4{F#3rYC!Uyu6{1- HoD!MV?D8gCb z5n0T@z%2~Ij105pNB{-hJzX3_DsH{KsmRBmz{BEr=>Pv3i2{qJ46DUj`YZ1k0+lc@ zY*X2Jcdc3a>Tf%;W;23C7%b{U?*BAel-qReJ|n}5e8w#r#^?8D&Flindb;|#taD0e F0szN&F&h8? literal 0 HcmV?d00001 From b744818e577e976142de959a7c94900eda5986df Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 30 Jul 2024 21:35:00 +0000 Subject: [PATCH 011/143] Automatic Changelog Update (#614) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d6c7852d41b..a8737170b81 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4686,3 +4686,12 @@ Entries: Cybernetics. id: 6189 time: '2024-07-30T21:33:23.0000000+00:00' +- author: angelofallars + changes: + - type: Add + message: >- + Makeup is finally here: lips, blush, and nail polish! Sashay over to + Character Setup in the Markings section, then look at Head/Overlay to + give makeovers to your characters! + id: 6190 + time: '2024-07-30T21:34:37.0000000+00:00' From 29cb1b02e0abf93b6d0d85d055ad9109916926c4 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 31 Jul 2024 08:18:38 -0400 Subject: [PATCH 012/143] Hotfix Late Joins (#612) # Description Last update broke late joins on Release build. This hotfixes latejoins. --- Content.Client/LateJoin/LateJoinGui.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Content.Client/LateJoin/LateJoinGui.cs b/Content.Client/LateJoin/LateJoinGui.cs index c9737e09b13..ff6c8bc3c54 100644 --- a/Content.Client/LateJoin/LateJoinGui.cs +++ b/Content.Client/LateJoin/LateJoinGui.cs @@ -30,7 +30,6 @@ public sealed class LateJoinGui : DefaultWindow [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IEntitySystemManager _entitySystem = default!; [Dependency] private readonly JobRequirementsManager _jobRequirements = default!; - [Dependency] private readonly CharacterRequirementsSystem _characterRequirements = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IClientPreferencesManager _prefs = default!; @@ -39,6 +38,7 @@ public sealed class LateJoinGui : DefaultWindow private readonly ClientGameTicker _gameTicker; private readonly SpriteSystem _sprites; private readonly CrewManifestSystem _crewManifest; + private readonly CharacterRequirementsSystem _characterRequirements; private readonly Dictionary>> _jobButtons = new(); private readonly Dictionary> _jobCategories = new(); @@ -53,6 +53,7 @@ public LateJoinGui() _sprites = _entitySystem.GetEntitySystem(); _crewManifest = _entitySystem.GetEntitySystem(); _gameTicker = _entitySystem.GetEntitySystem(); + _characterRequirements = _entitySystem.GetEntitySystem(); Title = Loc.GetString("late-join-gui-title"); From d38c7d4b28ad0bf8147f986ddf6d2ae6f2814d1c Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Wed, 31 Jul 2024 22:07:07 +0300 Subject: [PATCH 013/143] Hotfix Playtime Requirements (#621) Shitcode --- Content.Client/LateJoin/LateJoinGui.cs | 2 +- Content.Client/Lobby/LobbyUIController.cs | 4 ++-- .../PlayTimeTracking/JobRequirementsManager.cs | 5 +++++ .../Preferences/UI/AntagPreferenceSelector.cs | 2 +- .../Preferences/UI/HumanoidProfileEditor.xaml.cs | 12 ++++++------ .../Systems/Ghost/Controls/Roles/GhostRolesEui.cs | 2 +- 6 files changed, 16 insertions(+), 11 deletions(-) diff --git a/Content.Client/LateJoin/LateJoinGui.cs b/Content.Client/LateJoin/LateJoinGui.cs index ff6c8bc3c54..92e1ee2aaf1 100644 --- a/Content.Client/LateJoin/LateJoinGui.cs +++ b/Content.Client/LateJoin/LateJoinGui.cs @@ -267,7 +267,7 @@ private void RebuildUI() prototype, (HumanoidCharacterProfile) (_prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), - _jobRequirements.GetPlayTimes(), + _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted(), _entityManager, _prototypeManager, diff --git a/Content.Client/Lobby/LobbyUIController.cs b/Content.Client/Lobby/LobbyUIController.cs index 3e7eb84b998..47ab651c10e 100644 --- a/Content.Client/Lobby/LobbyUIController.cs +++ b/Content.Client/Lobby/LobbyUIController.cs @@ -126,7 +126,7 @@ public void UpdateCharacterUI() GiveDummyJobClothes(_previewDummy.Value, GetPreferredJob(maybeProfile), maybeProfile); if (ShowLoadouts) _loadouts.ApplyCharacterLoadout(_previewDummy.Value, GetPreferredJob(maybeProfile), maybeProfile, - _jobRequirements.GetPlayTimes(), _jobRequirements.IsWhitelisted()); + _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted()); UpdateClothes = false; } @@ -173,7 +173,7 @@ public void GiveDummyJobClothesLoadout(EntityUid dummy, HumanoidCharacterProfile { var job = GetPreferredJob(profile); GiveDummyJobClothes(dummy, job, profile); - _loadouts.ApplyCharacterLoadout(dummy, job, profile, _jobRequirements.GetPlayTimes(), _jobRequirements.IsWhitelisted()); + _loadouts.ApplyCharacterLoadout(dummy, job, profile, _jobRequirements.GetRawPlayTimeTrackers(), _jobRequirements.IsWhitelisted()); } /// diff --git a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs index a38d4e2f308..a2f8061d057 100644 --- a/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs +++ b/Content.Client/Players/PlayTimeTracking/JobRequirementsManager.cs @@ -102,4 +102,9 @@ public Dictionary GetPlayTimes() dict.Add(PlayTimeTrackingShared.TrackerOverall, FetchOverallPlaytime()); return dict; } + + public Dictionary GetRawPlayTimeTrackers() + { + return _roles; + } } diff --git a/Content.Client/Preferences/UI/AntagPreferenceSelector.cs b/Content.Client/Preferences/UI/AntagPreferenceSelector.cs index 872b783c2f9..4a339d3f659 100644 --- a/Content.Client/Preferences/UI/AntagPreferenceSelector.cs +++ b/Content.Client/Preferences/UI/AntagPreferenceSelector.cs @@ -45,7 +45,7 @@ public AntagPreferenceSelector(AntagPrototype proto, JobPrototype highJob) : bas proto.Requirements, highJob, (HumanoidCharacterProfile) (prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), - requirements.GetPlayTimes(), + requirements.GetRawPlayTimeTrackers(), requirements.IsWhitelisted(), entMan, protoMan, diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 8d31ea92280..9115c6720bf 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -729,7 +729,7 @@ private void UpdateRoleRequirements() job.Requirements ?? new(), job, Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), _requirements.IsWhitelisted(), _entityManager, _prototypeManager, @@ -784,7 +784,7 @@ private void EnsureJobRequirementsValid() selector.Proto.Requirements ?? new(), selector.Proto, Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), _requirements.IsWhitelisted(), _entityManager, _prototypeManager, @@ -1434,7 +1434,7 @@ private void UpdateTraits(bool showUnusable) trait.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), _requirements.IsWhitelisted(), _entityManager, _prototypeManager, @@ -1449,7 +1449,7 @@ out _ trait.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), _requirements.IsWhitelisted(), _entityManager, _prototypeManager, @@ -1695,7 +1695,7 @@ private void UpdateLoadouts(bool showUnusable) loadout.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), _requirements.IsWhitelisted(), _entityManager, _prototypeManager, @@ -1710,7 +1710,7 @@ out _ loadout.Requirements, highJob?.Proto ?? new JobPrototype(), Profile ?? HumanoidCharacterProfile.DefaultWithSpecies(), - _requirements.GetPlayTimes(), + _requirements.GetRawPlayTimeTrackers(), _requirements.IsWhitelisted(), _entityManager, _prototypeManager, diff --git a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs index d0fd3a80c3b..f03289782ae 100644 --- a/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs +++ b/Content.Client/UserInterface/Systems/Ghost/Controls/Roles/GhostRolesEui.cs @@ -94,7 +94,7 @@ public override void HandleState(EuiStateBase state) group.Key.Requirements ?? new(), new(), (HumanoidCharacterProfile) (prefs.Preferences?.SelectedCharacter ?? HumanoidCharacterProfile.DefaultWithSpecies()), - requirementsManager.GetPlayTimes(), + requirementsManager.GetRawPlayTimeTrackers(), requirementsManager.IsWhitelisted(), entityManager, protoMan, From 95279363a8202a708db3a973fca26c165dc568f6 Mon Sep 17 00:00:00 2001 From: Tmanzxd <164098915+Tmanzxd@users.noreply.github.com> Date: Wed, 31 Jul 2024 17:24:39 -0500 Subject: [PATCH 014/143] Remove Cargo Pallet From Request Console (#626) Fixes #108 --- Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index fb3b2da41a8..409670636fb 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -1,13 +1,3 @@ -- type: cargoProduct - id: CargoPallet - icon: - sprite: Structures/catwalk.rsi - state: catwalk_preview - product: CargoPallet - cost: 250 - category: Logistics # DeltaV - Logistics Department replacing Cargo - group: market - - type: cargoProduct id: CargoOreBox icon: From 3a9c337adc3deaf6f5f06740635d96795dfbcffb Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Thu, 1 Aug 2024 06:36:20 +0800 Subject: [PATCH 015/143] Use Correct Changelog Name (#627) I did an oopsie --- Resources/Changelog/Changelog.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a8737170b81..af6cbaf7761 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4686,7 +4686,7 @@ Entries: Cybernetics. id: 6189 time: '2024-07-30T21:33:23.0000000+00:00' -- author: angelofallars +- author: Skubman changes: - type: Add message: >- From d39c9905af07fecda110be0adae93c19cdeae1f2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 31 Jul 2024 18:47:01 -0400 Subject: [PATCH 016/143] Fix Sound Params (#624) # Description Done by request from several people who have some issues with the sound mixing of certain items being very off. I did a little digging, and discovered that the heart of the issue is that id: BaseItem had for whatever utterly strange reason, set the volume for every item not overriding it to be above people's sound settings, resulting in pickup and drop sounds being strangely inconsistent with all other volumes. It got so bad that some people reportedly couldn't play the game. # Changelog :cl: - fix: Fixed Tools, Drink Containers, Lockers, and all base items having inconsistent sound settings. --- .../Objects/Consumable/Drinks/drinks.yml | 15 ++++-- .../Entities/Objects/Tools/tools.yml | 48 +++++++++++++++---- .../Prototypes/Entities/Objects/base_item.yml | 2 - .../Storage/Closets/base_structureclosets.yml | 4 ++ 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index cfe5294ff05..93d4b957fe7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -34,11 +34,20 @@ - key: enum.TransferAmountUiKey.Key type: TransferAmountBoundUserInterface - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand - sound: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/drinkglass_drop.ogg + params: + volume: -2 - type: entity parent: DrinkBase diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index 9ac46dbe305..d135b2f29bb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -5,12 +5,20 @@ description: This kills the wire. components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wirecutter_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wirecutter_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/wirecutter_drop.ogg + params: + volume: -2 - type: Tag tags: - PlantSampleTaker @@ -55,12 +63,20 @@ description: Industrial grade torque in a small screwdriving package. components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/screwdriver_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/screwdriver_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/screwdriver_drop.ogg + params: + volume: -2 - type: Tag tags: - Screwdriver @@ -103,12 +119,20 @@ description: 'A common tool for assembly and disassembly. Remember: righty tighty, lefty loosey.' components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wrench_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/wrench_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/wrench_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/wrench_drop.ogg + params: + volume: -2 - type: Tag tags: - Wrench @@ -146,12 +170,20 @@ description: A multipurpose tool to pry open doors and fight interdimensional invaders. components: - type: EmitSoundOnPickup - sound: /Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/crowbar_pickup.ogg + params: + volume: -2 - type: EmitSoundOnDrop - sound: /Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg + sound: + path: /Audio/SimpleStation14/Items/Handling/crowbar_drop.ogg + params: + volume: -2 - type: EmitSoundOnLand sound: path: /Audio/Items/crowbar_drop.ogg + params: + volume: -2 - type: Tag tags: - Crowbar diff --git a/Resources/Prototypes/Entities/Objects/base_item.yml b/Resources/Prototypes/Entities/Objects/base_item.yml index 55c4bbd6b79..84b5477f508 100644 --- a/Resources/Prototypes/Entities/Objects/base_item.yml +++ b/Resources/Prototypes/Entities/Objects/base_item.yml @@ -14,8 +14,6 @@ - type: EmitSoundOnLand sound: path: /Audio/Effects/drop.ogg - params: - volume: 2 - type: DamageOnHighSpeedImpact damage: types: diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index 23b1efdf535..e966a41780c 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -50,8 +50,12 @@ - type: EntityStorage closeSound: path: /Audio/Effects/closet_close.ogg + params: + volume: -4 openSound: path: /Audio/Effects/closet_open.ogg + params: + volume: -4 - type: ContainerContainer containers: entity_storage: !type:Container From 5f73a5a1df1d4928ff954a1d8cc91007fb833a26 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 31 Jul 2024 22:47:24 +0000 Subject: [PATCH 017/143] Automatic Changelog Update (#624) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index af6cbaf7761..719793e5b7d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4695,3 +4695,11 @@ Entries: give makeovers to your characters! id: 6190 time: '2024-07-30T21:34:37.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Fixed Tools, Drink Containers, Lockers, and all base items having + inconsistent sound settings. + id: 6191 + time: '2024-07-31T22:47:01.0000000+00:00' From c0114c0875a749c4b1d43305d09ba3f32a6a8097 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 31 Jul 2024 18:57:33 -0400 Subject: [PATCH 018/143] Lasers Have No Recoil (#603) # Description LASERS HAVE NO RECOIL, THEY SHOULD NOT PUSH YOU AROUND IN SPACE. THE CAPTAIN'S LASER PISTOL IS NOT AN INFINITE USE JET PACK. STUPID BUG. ME FIX. There are MANY things I hate about the gun system's code, I am going to revisit this later with a more comprehensive update. There are many hardcoded constants in it related to physics that I thoroughly despise. Guns should just be allowed to declare how much force of recoil they have, rather than it being hardcoded as "CONSTANT 25f". Also, I would like that if the Recoil value is greater than your character's mass, to then knock your character on their ass and/or send them flying. Imagine a Felinid getting thrown back by firing a shotgun. There's my justification for doing so. # Changelog :cl: - fix: Lasers no longer function as jetpacks in space. --- .../Weapons/Ranged/Components/GunComponent.cs | 6 ++++++ .../Weapons/Ranged/Systems/SharedGunSystem.cs | 10 +++++----- .../Objects/Weapons/Guns/Battery/battery_guns.yml | 2 ++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index ada99801f01..8d7ecae1a81 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -241,6 +241,12 @@ public sealed partial class GunComponent : Component /// [DataField] public float FireOnDropChance = 0.1f; + + /// + /// Whether or not this gun is truly Recoilless, such as Lasers, and therefore shouldn't move the user. + /// + [DataField] + public bool DoRecoil = true; } [Flags] diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 1dfdede1afa..3c5e5c79846 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -362,11 +362,11 @@ private void AttemptShoot(EntityUid user, EntityUid gunUid, GunComponent gun) var shotEv = new GunShotEvent(user, ev.Ammo); RaiseLocalEvent(gunUid, ref shotEv); - if (userImpulse && TryComp(user, out var userPhysics)) - { - if (_gravity.IsWeightless(user, userPhysics)) - CauseImpulse(fromCoordinates, toCoordinates.Value, user, userPhysics); - } + if (gun.DoRecoil + && userImpulse + && TryComp(user, out var userPhysics) + && _gravity.IsWeightless(user, userPhysics)) + CauseImpulse(fromCoordinates, toCoordinates.Value, user, userPhysics); Dirty(gunUid, gun); } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index fb2f56a6ed6..ec0a0a148bd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -21,6 +21,7 @@ fireOnDropChance: 0.15 soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg + doRecoil: false - type: Battery maxCharge: 1000 startingCharge: 1000 @@ -48,6 +49,7 @@ - SemiAuto soundGunshot: path: /Audio/Weapons/Guns/Gunshots/laser.ogg + doRecoil: false - type: MagazineAmmoProvider - type: ItemSlots slots: From 8a3abcba5e1b783bdee4b32f6129c92a8c918ffa Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 31 Jul 2024 22:57:58 +0000 Subject: [PATCH 019/143] Automatic Changelog Update (#603) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 719793e5b7d..b9dcc6fb148 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4703,3 +4703,9 @@ Entries: inconsistent sound settings. id: 6191 time: '2024-07-31T22:47:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: 'Lasers no longer function as jetpacks in space. ' + id: 6192 + time: '2024-07-31T22:57:33.0000000+00:00' From fa2abfa1a438c719fe8899361d73cdcf41b8a8d4 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Wed, 31 Jul 2024 16:32:52 -0700 Subject: [PATCH 020/143] Fix the Uncategorized Category Not Being Hidden (#628)

Media

![image](https://github.com/user-attachments/assets/8292491a-e3c6-4321-a2a9-acf3d7f92d3b)

--- # Changelog :cl: - fix: Fixed the Uncategorized category not being hidden when empty --- Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 9115c6720bf..954a705fceb 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -1599,7 +1599,7 @@ out _ // Hide Uncategorized tab if it's empty, other tabs already shouldn't exist if they're empty - _traitsTabs.SetTabVisible(0, uncategorized.Children.Any()); + _traitsTabs.SetTabVisible(0, uncategorized.Children.First().Children.First().Children.Any()); // Add fake tabs until tab container is happy for (var i = _traitsTabs.ChildCount - 1; i < _traitsTabs.CurrentTab; i++) @@ -1860,7 +1860,7 @@ out _ // Hide Uncategorized tab if it's empty, other tabs already shouldn't exist if they're empty - _loadoutsTabs.SetTabVisible(0, uncategorized.Children.Any()); + _loadoutsTabs.SetTabVisible(0, uncategorized.Children.First().Children.First().Children.Any()); // Add fake tabs until tab container is happy for (var i = _loadoutsTabs.ChildCount - 1; i < _loadoutsTabs.CurrentTab; i++) From 5335dceaf597c2381c0bb038e380a3a000ed1226 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 31 Jul 2024 23:33:15 +0000 Subject: [PATCH 021/143] Automatic Changelog Update (#628) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b9dcc6fb148..68ef06efebb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4709,3 +4709,9 @@ Entries: message: 'Lasers no longer function as jetpacks in space. ' id: 6192 time: '2024-07-31T22:57:33.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Fix + message: Fixed the Uncategorized category not being hidden when empty + id: 6193 + time: '2024-07-31T23:32:52.0000000+00:00' From b15d096a3ea39553f7ee7cb8372b40ed67e51d16 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Thu, 1 Aug 2024 02:57:25 +0300 Subject: [PATCH 022/143] Minor Language Fixes (#618) # Description Fixes: - Whisper not undergoing readability obfuscation when out of range - Handheld translators ignoring language knowledge requirements - Several animals not having defined languages - Computers not having languages (this primarily affects the RnD console and in the future the cargo request console which send radio messages) - Some languages lacking brightness and thus being hard to read Also makes language colors from language markers use alpha blending instead of overriding the original color. The change is subtle, kinda hard to make it noticable without defeating the original purpose...

Media

Example of the new colors ![image](https://github.com/user-attachments/assets/291c1a6d-829b-43ec-afb7-5c902a1e4aff)

--- # Changelog :cl: - fix: Whisper can no longer be heard clearly outside the intended range. - fix: Translators can no longer be used without knowing the languages they require. - fix: Computers (primarily RnD console) now speak GC by default instead of Universal. - tweak: Readjusted colors of all languages to make them easier to read. --- Content.Server/Chat/Systems/ChatSystem.cs | 19 +++++++------- Content.Server/Language/TranslatorSystem.cs | 3 +++ .../Radio/EntitySystems/RadioSystem.cs | 6 +++-- Content.Shared/Language/LanguagePrototype.cs | 6 ++++- Resources/Locale/en-US/language/languages.ftl | 3 +++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 25 ++++++++++++++++-- .../Entities/Objects/Devices/translators.yml | 1 + .../Computers/base_structurecomputers.yml | 9 +++++++ Resources/Prototypes/Language/languages.yml | 26 ++++++++++++++----- 9 files changed, 77 insertions(+), 21 deletions(-) diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index 022520abeb0..b41d2deda6f 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -78,6 +78,7 @@ public sealed partial class ChatSystem : SharedChatSystem public const int WhisperMuffledRange = 5; // how far whisper goes at all, in world units public const string DefaultAnnouncementSound = "/Audio/Announcements/announce.ogg"; public const float DefaultObfuscationFactor = 0.2f; // Percentage of symbols in a whispered message that can be seen even by "far" listeners + public readonly Color DefaultSpeakColor = Color.White; private bool _loocEnabled = true; private bool _deadLoocEnabled; @@ -525,28 +526,25 @@ private void SendEntityWhisper( { // Scenario 1: the listener can clearly understand the message result = perceivedMessage; - wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", name, perceivedMessage, language); + wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", name, result, language); } else if (_interactionSystem.InRangeUnobstructed(source, listener, WhisperMuffledRange, Shared.Physics.CollisionGroup.Opaque)) { - // Scenerio 2: if the listener is too far, they only hear fragments of the message + // Scenario 2: if the listener is too far, they only hear fragments of the message result = ObfuscateMessageReadability(perceivedMessage); - wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", nameIdentity, perceivedMessage, language); + wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", nameIdentity, result, language); } else { // Scenario 3: If listener is too far and has no line of sight, they can't identify the whisperer's identity result = ObfuscateMessageReadability(perceivedMessage); - wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-unknown-wrap-message", string.Empty, perceivedMessage, language); + wrappedMessage = WrapWhisperMessage(source, "chat-manager-entity-whisper-unknown-wrap-message", string.Empty, result, language); } _chatManager.ChatMessageToOne(ChatChannel.Whisper, result, wrappedMessage, source, false, session.Channel); } - var replayWrap = Loc.GetString("chat-manager-entity-whisper-wrap-message", - ("color", language.SpeechOverride.Color), - ("entityName", name), - ("message", FormattedMessage.EscapeText(message))); + var replayWrap = WrapWhisperMessage(source, "chat-manager-entity-whisper-wrap-message", name, FormattedMessage.EscapeText(message), language); _replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, replayWrap, GetNetEntity(source), null, MessageRangeHideChatForReplay(range))); var ev = new EntitySpokeEvent(source, message, channel, true, language); @@ -881,9 +879,12 @@ public string WrapMessage(LocId wrapId, InGameICChatType chatType, EntityUid sou var verbId = language.SpeechOverride.SpeechVerbOverrides is { } verbsOverride ? _random.Pick(verbsOverride).ToString() : _random.Pick(speech.SpeechVerbStrings); + var color = DefaultSpeakColor; + if (language.SpeechOverride.Color is { } colorOverride) + color = Color.InterpolateBetween(color, colorOverride, colorOverride.A); return Loc.GetString(wrapId, - ("color", language.SpeechOverride.Color), + ("color", color), ("entityName", entityName), ("verb", Loc.GetString(verbId)), ("fontType", language.SpeechOverride.FontId ?? speech.FontId), diff --git a/Content.Server/Language/TranslatorSystem.cs b/Content.Server/Language/TranslatorSystem.cs index adbfe2d681f..24f4cb17298 100644 --- a/Content.Server/Language/TranslatorSystem.cs +++ b/Content.Server/Language/TranslatorSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Language; +using Content.Shared.Language.Components; using Content.Shared.Language.Systems; using Content.Shared.PowerCell; using Content.Shared.Language.Components.Translators; @@ -173,11 +174,13 @@ private void UpdateBoundIntrinsicComp(HandheldTranslatorComponent comp, HoldsTra { intrinsic.SpokenLanguages = [..comp.SpokenLanguages]; intrinsic.UnderstoodLanguages = [..comp.UnderstoodLanguages]; + intrinsic.RequiredLanguages = [..comp.RequiredLanguages]; } else { intrinsic.SpokenLanguages.Clear(); intrinsic.UnderstoodLanguages.Clear(); + intrinsic.RequiredLanguages.Clear(); } intrinsic.Enabled = isEnabled; diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 7232a23d2c8..5fce6f770a2 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -178,9 +178,11 @@ public void SendRadioMessage(EntityUid messageSource, string message, RadioChann private string WrapRadioMessage(EntityUid source, RadioChannelPrototype channel, string name, string message, LanguagePrototype language) { + // TODO: code duplication with ChatSystem.WrapMessage var speech = _chat.GetSpeechVerb(source, message); - // TODO this is done just to preserve the old look of radio, perhaps we can change it as well? - var languageColor = language.SpeechOverride.Color == Color.White ? channel.Color : language.SpeechOverride.Color; + var languageColor = channel.Color; + if (language.SpeechOverride.Color is { } colorOverride) + languageColor = Color.InterpolateBetween(languageColor, colorOverride, colorOverride.A); return Loc.GetString(speech.Bold ? "chat-radio-message-wrap-bold" : "chat-radio-message-wrap", ("color", channel.Color), diff --git a/Content.Shared/Language/LanguagePrototype.cs b/Content.Shared/Language/LanguagePrototype.cs index d3a977202be..d40a7b40681 100644 --- a/Content.Shared/Language/LanguagePrototype.cs +++ b/Content.Shared/Language/LanguagePrototype.cs @@ -37,8 +37,12 @@ public sealed class LanguagePrototype : IPrototype [DataDefinition] public sealed partial class SpeechOverrideInfo { + /// + /// Color which text in this language will be blended with. + /// Alpha blending is used, which means the alpha component of the color controls the intensity of this color. + /// [DataField] - public Color Color = Color.White; + public Color? Color = null; [DataField] public string? FontId; diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl index 56dbe04f462..14d477b7840 100644 --- a/Resources/Locale/en-US/language/languages.ftl +++ b/Resources/Locale/en-US/language/languages.ftl @@ -70,5 +70,8 @@ language-Crab-description = Click! language-Kobold-name = Kobold language-Kobold-description = Hiss! +language-Hissing-name = Hissing +language-Hissing-description = Hiss! + language-Sign-name = Sign Language language-Sign-description = The standard Galactic sign language, used by those that are unable to speak Galactic Common or at all. diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 7f3b1cae588..92ede14d3ec 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -2442,6 +2442,12 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Hissing + - type: entity name: possum @@ -2519,6 +2525,11 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Hissing - type: entity name: fox @@ -2886,9 +2897,9 @@ - Syndicate - type: LanguageKnowledge speaks: - - Xeno + - Cat understands: - - Xeno + - Cat - GalacticCommon - type: entity @@ -3060,6 +3071,11 @@ barkMultiplier: 10 barks: - Sloth + - type: LanguageKnowledge # WHAT DOES THE SLOTH SAY??????? + speaks: + - Hissing + understands: + - Hissing - type: entity name: ferret @@ -3119,6 +3135,11 @@ - type: Tag tags: - VimPilot + - type: LanguageKnowledge + speaks: + - Hissing + understands: + - Hissing - type: entity name: hamster diff --git a/Resources/Prototypes/Entities/Objects/Devices/translators.yml b/Resources/Prototypes/Entities/Objects/Devices/translators.yml index d75b7af7fd6..6aa7947c82d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/translators.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/translators.yml @@ -215,6 +215,7 @@ - Pig - Crab - Kobold + - Hissing requires: - GalacticCommon setLanguageOnInteract: false diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml index 204e06c8600..b7ea7c6f6ca 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml @@ -61,3 +61,12 @@ - type: LightningTarget priority: 1 - type: RequireProjectileTarget + - type: LanguageSpeaker + currentLanguage: GalacticCommon + - type: LanguageKnowledge + speaks: + - GalacticCommon + - RobotTalk + understands: + - GalacticCommon + - RobotTalk diff --git a/Resources/Prototypes/Language/languages.yml b/Resources/Prototypes/Language/languages.yml index 566ee082914..65af93e02d4 100644 --- a/Resources/Prototypes/Language/languages.yml +++ b/Resources/Prototypes/Language/languages.yml @@ -39,7 +39,7 @@ - type: language id: Bubblish speech: - color: "#0077aa" + color: "#00a3e2dd" fontId: RubikBubbles obfuscation: !type:SyllableObfuscation @@ -56,7 +56,7 @@ - type: language id: Moffic speech: - color: "#869b29" + color: "#c7df2edd" fontId: Copperplate obfuscation: !type:SyllableObfuscation @@ -125,7 +125,7 @@ - type: language id: RootSpeak speech: - color: "#804000" + color: "#ce5e14dd" fontId: Noganas obfuscation: !type:SyllableObfuscation @@ -142,7 +142,7 @@ - type: language id: Nekomimetic speech: - color: "#803B56" + color: "#df57aaee" fontId: Manga obfuscation: !type:SyllableObfuscation @@ -202,7 +202,7 @@ - type: language id: Draconic speech: - color: "#228b22" + color: "#2aca2add" obfuscation: !type:SyllableObfuscation minSyllables: 2 @@ -297,7 +297,7 @@ - type: language id: Canilunzt speech: - color: "#b97a57" + color: "#d69b3dcc" obfuscation: !type:SyllableObfuscation minSyllables: 1 @@ -365,7 +365,7 @@ - type: language id: SolCommon speech: - color: "#8282fb" + color: "#8282fbaa" obfuscation: !type:SyllableObfuscation minSyllables: 1 @@ -576,6 +576,18 @@ - ss - ee +- type: language + id: Hissing + obfuscation: + !type:SyllableObfuscation + minSyllables: 2 + maxSyllables: 4 + replacement: + - hss + - iss + - ss + - is + # Example of a sign language. Not currently used anyhow. - type: language id: Sign From 80eb4568ee8a592cde36c163f9b77e4c23272316 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 31 Jul 2024 19:57:35 -0400 Subject: [PATCH 023/143] Comms Console Announcer Fixes (#610) # Description Cherry-Picks https://github.com/Fansana/floofstation1/pull/50 This fixes some mistakes in the code for Michael's announcements. --------- Co-authored-by: Fansana --- Content.Server/AlertLevel/AlertLevelSystem.cs | 2 +- .../Audio/Announcers/Michael/alerts/delta.ogg | Bin 0 -> 589590 bytes .../shuttle/{shuttle_called.ogg => called.ogg} | Bin .../shuttle/{shuttle_dock.ogg => dock.ogg} | Bin .../{shuttle_recalled.ogg => recalled.ogg} | Bin .../NEIL/alerts/{code_blue.ogg => blue.ogg} | Bin .../NEIL/alerts/{code_delta.ogg => delta.ogg} | Bin .../alerts/{code_epsilon.ogg => epsilon.ogg} | Bin .../NEIL/alerts/{code_gamma.ogg => gamma.ogg} | Bin .../NEIL/alerts/{code_green.ogg => green.ogg} | Bin .../NEIL/alerts/{code_red.ogg => red.ogg} | Bin .../alerts/{code_violet.ogg => violet.ogg} | Bin .../NEIL/alerts/{code_white.ogg => white.ogg} | Bin .../alerts/{code_yellow.ogg => yellow.ogg} | Bin Resources/Prototypes/Announcers/michael.yml | 4 ++-- 15 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 Resources/Audio/Announcers/Michael/alerts/delta.ogg rename Resources/Audio/Announcers/Michael/shuttle/{shuttle_called.ogg => called.ogg} (100%) rename Resources/Audio/Announcers/Michael/shuttle/{shuttle_dock.ogg => dock.ogg} (100%) rename Resources/Audio/Announcers/Michael/shuttle/{shuttle_recalled.ogg => recalled.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_blue.ogg => blue.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_delta.ogg => delta.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_epsilon.ogg => epsilon.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_gamma.ogg => gamma.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_green.ogg => green.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_red.ogg => red.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_violet.ogg => violet.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_white.ogg => white.ogg} (100%) rename Resources/Audio/Announcers/NEIL/alerts/{code_yellow.ogg => yellow.ogg} (100%) diff --git a/Content.Server/AlertLevel/AlertLevelSystem.cs b/Content.Server/AlertLevel/AlertLevelSystem.cs index d856fab9da7..b290d95a5c1 100644 --- a/Content.Server/AlertLevel/AlertLevelSystem.cs +++ b/Content.Server/AlertLevel/AlertLevelSystem.cs @@ -150,7 +150,7 @@ public void SetLevel(EntityUid station, string level, bool playSound, bool annou if (Loc.TryGetString(detail.Announcement, out var locAnnouncement)) announcement = locAnnouncement; - var alert = _announcer.GetAnnouncementId($"Alert{level}"); + var alert = $"alert{char.ToUpperInvariant(level[0]) + level[1..]}"; if (playSound) _announcer.SendAnnouncementAudio(alert, _stationSystem.GetInOwningStation(station)); if (announce) diff --git a/Resources/Audio/Announcers/Michael/alerts/delta.ogg b/Resources/Audio/Announcers/Michael/alerts/delta.ogg new file mode 100644 index 0000000000000000000000000000000000000000..95bea66f77abc7d7c5c18f4002e6e024c6af9811 GIT binary patch literal 589590 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%0DJrECQ=CI$Q~Q$9>_5~MK~Ne?|}=Y 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

gcrVH<-HrOGNy_ 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%0A;K^6abM*N3T(;>$fpIL&j+#Mh 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 Date: Wed, 31 Jul 2024 23:57:48 +0000 Subject: [PATCH 024/143] Automatic Changelog Update (#618) --- Resources/Changelog/Changelog.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 68ef06efebb..cb0933affcb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4715,3 +4715,19 @@ Entries: message: Fixed the Uncategorized category not being hidden when empty id: 6193 time: '2024-07-31T23:32:52.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: Whisper can no longer be heard clearly outside the intended range. + - type: Fix + message: >- + Translators can no longer be used without knowing the languages they + require. + - type: Fix + message: >- + Computers (primarily RnD console) now speak GC by default instead of + Universal. + - type: Tweak + message: Readjusted colors of all languages to make them easier to read. + id: 6194 + time: '2024-07-31T23:57:25.0000000+00:00' From 6d1ae1502811d05e1192a27cd8abf9c2615aacd3 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Thu, 1 Aug 2024 10:37:45 +0800 Subject: [PATCH 025/143] More Loadout Items: Wave 2 (#616) # Description Adds significantly more items to Loadouts. Notably, it adds almost every item from the ClothesMate, a decent amount of clothing from the AutoDrobe, and some missing clothes from the WinterDrobe. Other changes: - Restrict Command from wearing uniforms outside of their job - Limit Security's non-sec uniform/head/mask options to those that maintain the Security aesthetic, such as clothes that are red, black, and some blue/beige, and all MNK gear. - Restrict all shoes from Dionas and Harpies properly. I have a feeling that there's a better way to get around this issue, perhaps by preventing these species from selecting items that are based on `ClothingShoesBase`. - Make all colored jumpsuits available to all Civilians, and select jumpsuits for departments such as white/blue for Medical, white/purple for Epistemics, and yellow for Engineering. ## New Items ### Uniform Command cannot select any listed uniforms. Security (except HoS) can only select items marked with (*). - [2] white shirt and purple skirt - [2] yellow skirt with rose hoodie - [2] turquoise hoodie and shorts - [2] casual blue jumpsuit - [2] casual blue jumpskirt - [2] casual purple jumpsuit - [2] casual purple jumpskirt - [2] casual red jumpsuit (*) - [2] casual red jumpskirt (*) - [2] flannel jumpsuit (*) - [2] black hawaiian shirt - [2] blue hawaiian shirt - [2] red hawaiian shirt (*) - [2] yellow hawaiian shirt - [2] brown sweater with jeans - [2] green sweater with jeans - [2] red sweater with jeans (*) - [2] loungewear (*) - [2] sober sweater - [2] white t-shirt and jeans - [2] gray t-shirt and jeans (*) - [2] peach t-shirt and jeans (*) - [2] decorated turtle skirt (*) - [3] kimono - [3] geisha dress (*) - [3] bartender's uniform (jumpsuit) - [3] bartender's uniform (jumpskirt) - I find the bartender's uniform to be a neutral and very versatile piece, fitting the MNK aesthetic. This uniform with a white shirt and black bottom pairs well with the MNK black jacket and flannel jumpsuits. For this reason, I think the bartender's uniform should be accessible to everyone. - [3] lost tourist uniform - [3] black schoolgirl uniform (*) - [3] tan blazer schoolgirl uniform - [3] blue schoolgirl uniform - [3] cyan schoolgirl uniform - [3] dusk schoolgirl uniform - [3] green schoolgirl uniform - [3] orange schoolgirl uniform - [3] pink schoolgirl uniform - [3] purple schoolgirl uniform - [3] red schoolgirl uniform (*) - [4] red dress (*) ## Outer - [1] vest - [3] gentle coat - [3] jensen coat - [3] trench coat - [3] Denim jacket - [3] blue flannel jacket - [3] green flannel jacket - [3] red flannel jacket ## Head Security (including HoS) can only select items marked with (*). - [1] mime cap (*) - [1] mime cap (flipped) (*) - The mime cap is just a plain white cap, the same as the other caps in the Loadouts. - [2] beret (*) - [2] French beret (*) - [2] bowler hat (*) - [2] brown flatcap - [2] grey flatcap (*) - There already exists a "brown flat cap" (note the extra space) in the Loadouts, but it's a different item with a different style. - [2] black cowboy hat (*) - [2] brown cowboy hat - [2] red cowboy hat (*) - [2] grey cowboy hat (*) - [2] white cowboy hat (*) - [2] brown fedora (chocolate) - [2] grey fedora (*) - [2] fez (*) - [2] fishing cap - [4] rasta hat ## Shoes - [2] fishing boots - [2] tourist shoes - [3] high-heeled boots - [3] coder socks - [3] bee socks ## Neck Added some missing scarves and pins. Pins suggested by @Tmanzxd - [1] striped black scarf - [1] striped brown scarf - [1] striped light blue scarf - [1] striped orange scarf - [1] striped purple scarf - [1] black tie - [1] blue tie - [1] green tie - [1] red-tie - [1] white tie - [2] headphones Added bedsheets. Bedsheets are restricted to Civilian (excluding HoP) unless stated otherwise. - [2] black bedsheet - [2] blue bedsheet - [2] brown bedsheet - [2] green bedsheet - [2] grey bedsheet - [2] NT bedsheet - [2] orange bedsheet - Usable by all Logistics roles - [2] purple bedsheet - Usable by all Epistemics roles. We are one step closer to RD wizard - [2] rainbow bedsheet - [2] red bedsheet - Usable by all Security roles - [2] white bedsheet - [2] yellow bedsheet - Usable by all Engineering roles - [3] cosmos bedsheet ## Mask New category. There is conveniently already localization for the Mask category. Security (including HoS) can only select items marked with (*). - [1] black bandana (*) - [1] blue bandana - [1] brown bandana - [1] gold bandana - [1] green bandana - [1] grey bandana - [1] red bandana (*) - [1] skull bandana (*) - [1] gas mask (*) - [1] sterile mask (*) - [2] mercenary bandana - [2] muzzle (*) - [2] neck gaiter (*) - [2] red neck gaiter (*) ## Eyes - [1] glasses - Can't be used by characters with the Nearsighted trait as they already spawn with glasses - [2] jamjar glasses - [2] jensen glasses - [2] cheap sunglasses - A cheaper alternative to sunglasses (5 loadout points), without flash protection ## Items - [1] leather satchel - Leather satchels used to be a default backpack type in SS13 - [3] fire extinguisher - For when you need to put out fires from fire anomalies and pyromancy - [4] crayon box - Crew can use this to ~~vandalize sec front~~ decorate their workplaces with love - [4] barber scissors ## Jobs ### Chemist Suggested by @Tmanzxd - [1] heavy nitrile gloves - [1] chemistry tie - [1] enclosed shoes - [2] safety glasses - [2] chemical resistant apron - [2] formal chemistry suit ### Captain/HoP - [1] inspection gloves ### Head of Personnel - [2] Ian's bedsheet ### Medical - [2] medical bedsheet ### Clown - [1] sexy clown mask - [1] clown winter boots - [2] clown's bedsheet - [2] robes of the honkmother - [2] clown winter coat ### Mime - [1] sad mime mask - [1] scary mime mask - [1] sexy mime mask - [1] mime's winter boots - [2] mime's bedsheet - [2] mime's winter coat ### Cargo Technician - [1] logistics winter boots - [2] logistics winter coat ### Salvage Specialist - [2] mining winter coat ---

Media (Character Lookbook)

## Stylish Cowboy ![image](https://github.com/user-attachments/assets/23d78f00-a601-4fd7-8139-990850afc912) **Loadout:** black cowboy hat, bartender's uniform (jumpsuit), striped black scarf, red flannel jacket, fingerless gloves, fishing boots ## Secret agent ![image](https://github.com/user-attachments/assets/8d89a944-c147-47ce-b06a-21a2d0dee4dc) **Loadout:** french beret, cheap sunglasses, bartender's uniform (jumpskirt), MNK black jacket ## Cybernetic Tourist ![image](https://github.com/user-attachments/assets/ddd28b02-5211-4803-a5ae-6c37872f7d94) **Loadout:** glasses, blue hawaiian shirt, striped light blue scarf, geta sandals ## Cowgirl ![image](https://github.com/user-attachments/assets/25c6b5dd-30ff-4096-a710-fb785219958a) **Loadout:** white cowboy hat, MNK gym bra, high-heeled boots ## Cat schoolgirl ![image](https://github.com/user-attachments/assets/f97cd552-ddd2-49d0-8f4e-dcada261ec7f) **Loadout:** pink schoolgirl uniform, coder socks ## Olive Rancher ![image](https://github.com/user-attachments/assets/8f31921c-14e9-43c5-bd65-0c90ec9c3a5a) **Loadout:** grey cowboy hat, gray t-shirt and jeans, vest, leather shoes ## Casual ![image](https://github.com/user-attachments/assets/9610822b-cd3e-4dab-a06c-2a0f30f43866) **Loadout:** Beret, cheap sunglasses, sober sweater, laceup shoes ## French Chemist ![image](https://github.com/user-attachments/assets/325653a9-ddba-4670-bac2-67cda1d90b5c) **Loadout:** french beret, formal chemistry suit, chemistry tie, chemical resistant apron, heavy nitrile gloves, enclosed shoes (Hey Heidi!) ## RD Wizard ![image](https://github.com/user-attachments/assets/8807e3a8-12ec-4ed7-80c7-62952ebe39f0) *For my next magic trick, I cast Pyromancy!* **Loadout:** top hat, glasses, mystagogue lab coat, purple bedsheet, fishing boots

--- # Changelog :cl: Skubman - add: Added dozens of new clothes and items to Loadouts, including the new Mask category. Have fun dressing up your characters! - tweak: Restrict Command Loadouts from selecting uniforms outside of their job. - tweak: Limit the selection in Security Loadouts of non-sec uniforms, hats, and masks to those that maintain the Security aesthetic. - tweak: Made all types of colored jumpsuits in Loadouts available to Civilian roles (excluding HoP), and suitable jumpsuits to Epistemics, Engineering, and Medical. - fix: Prevent dionas and harpies from selecting shoes in Loadouts. --- .../Loadouts/Jobs/Heads/captain.yml | 5 + .../Loadouts/Jobs/Heads/chiefEngineer.yml | 5 + .../Jobs/Heads/chiefMedicalOfficer.yml | 5 + .../Loadouts/Jobs/Heads/command.yml | 12 + .../Loadouts/Jobs/Heads/headOfPersonnel.yml | 17 + .../Loadouts/Jobs/Heads/headOfSecurity.yml | 5 + .../Loadouts/Jobs/Heads/quarterMaster.yml | 5 + .../Loadouts/Jobs/Heads/researchDirector.yml | 5 + Resources/Prototypes/Loadouts/Jobs/cargo.yml | 44 + .../Prototypes/Loadouts/Jobs/medical.yml | 106 ++ .../Prototypes/Loadouts/Jobs/security.yml | 1 + .../Prototypes/Loadouts/Jobs/service.yml | 143 +++ Resources/Prototypes/Loadouts/categories.yml | 3 + Resources/Prototypes/Loadouts/eyes.yml | 36 + Resources/Prototypes/Loadouts/hands.yml | 8 + Resources/Prototypes/Loadouts/head.yml | 259 +++++ Resources/Prototypes/Loadouts/items.yml | 38 + Resources/Prototypes/Loadouts/mask.yml | 143 +++ Resources/Prototypes/Loadouts/neck.yml | 304 ++++++ .../Prototypes/Loadouts/outerClothing.yml | 57 + Resources/Prototypes/Loadouts/shoes.yml | 92 ++ Resources/Prototypes/Loadouts/uniform.yml | 981 ++++++++++++++++-- 22 files changed, 2184 insertions(+), 90 deletions(-) create mode 100644 Resources/Prototypes/Loadouts/Jobs/Heads/command.yml create mode 100644 Resources/Prototypes/Loadouts/mask.yml diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml index d8849472ff4..d77dabf557c 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/captain.yml @@ -130,6 +130,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Captain diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml index c4905591124..4de22bc9593 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefEngineer.yml @@ -39,6 +39,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ChiefEngineer diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml index c75c871b011..163bad29261 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/chiefMedicalOfficer.yml @@ -61,6 +61,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ChiefMedicalOfficer diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml new file mode 100644 index 00000000000..c8c98b5eb44 --- /dev/null +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/command.yml @@ -0,0 +1,12 @@ +- type: loadout + id: LoadoutCommandGlovesInspection + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfPersonnel + - Captain + items: + - ClothingHandsGlovesInspection diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml index 3d3799c0adf..e6bc6ada049 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfPersonnel.yml @@ -97,8 +97,25 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - HeadOfPersonnel items: - ClothingShoesBootsWinterHeadOfPersonel + +- type: loadout + id: LoadoutCommandHOPBedsheetIan + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - HeadOfPersonnel + items: + - BedsheetIan diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml index 4f0d785b14d..7be380d7474 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/headOfSecurity.yml @@ -168,6 +168,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - HeadOfSecurity diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml index 3359d8f5d74..15adc7d44e8 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/quarterMaster.yml @@ -64,6 +64,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - Quartermaster diff --git a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml index 87cb0db1790..5d06e54efab 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Heads/researchDirector.yml @@ -50,6 +50,11 @@ cost: 1 exclusive: true requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy - !type:CharacterJobRequirement jobs: - ResearchDirector diff --git a/Resources/Prototypes/Loadouts/Jobs/cargo.yml b/Resources/Prototypes/Loadouts/Jobs/cargo.yml index 87463862010..cdc83a3c0f7 100644 --- a/Resources/Prototypes/Loadouts/Jobs/cargo.yml +++ b/Resources/Prototypes/Loadouts/Jobs/cargo.yml @@ -1,3 +1,47 @@ +# Cargo technician +- type: loadout + id: LoadoutCargoOuterWinterCargo + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - CargoTechnician + items: + - ClothingOuterWinterCargo + +- type: loadout + id: LoadoutCargoShoesBootsWinterCargo + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - CargoTechnician + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsWinterCargo + +# Salvage specialist + +- type: loadout + id: LoadoutCargoOuterWinterMiner + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - SalvageSpecialist + items: + - ClothingOuterWinterMiner + - type: loadout id: LoadoutCargoNeckGoliathCloak category: Jobs diff --git a/Resources/Prototypes/Loadouts/Jobs/medical.yml b/Resources/Prototypes/Loadouts/Jobs/medical.yml index edf51747d00..f193dfaea2d 100644 --- a/Resources/Prototypes/Loadouts/Jobs/medical.yml +++ b/Resources/Prototypes/Loadouts/Jobs/medical.yml @@ -495,3 +495,109 @@ - Nearsighted items: - ClothingEyesPrescriptionMedHud + +- type: loadout + id: LoadoutMedicalEyesGlassesChemical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingEyesGlassesChemical + +- type: loadout + id: LoadoutMedicalBedsheetMedical + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Medical + items: + - BedsheetMedical + +# Chemist PPE gear +- type: loadout + id: LoadoutMedicalUniformJumpsuitChemShirt + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + items: + - ClothingUniformJumpsuitChemShirt + +- type: loadout + id: LoadoutMedicalNeckTieChem + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingNeckTieChem + +- type: loadout + id: LoadoutMedicalShoesEnclosedChem + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesEnclosedChem + +- type: loadout + id: LoadoutMedicalOuterApronChemist + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingOuterApronChemist + +- type: loadout + id: LoadoutMedicalEyesGlassesChemist + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingEyesGlassesChemist + +- type: loadout + id: LoadoutMedicalHandsGlovesChemist + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Chemist + items: + - ClothingHandsGlovesChemist diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index 2809c9c1ae5..c6a78ad5d22 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -255,6 +255,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy - !type:CharacterJobRequirement jobs: diff --git a/Resources/Prototypes/Loadouts/Jobs/service.yml b/Resources/Prototypes/Loadouts/Jobs/service.yml index 0d3f1dc869f..4e41f035d7b 100644 --- a/Resources/Prototypes/Loadouts/Jobs/service.yml +++ b/Resources/Prototypes/Loadouts/Jobs/service.yml @@ -27,6 +27,149 @@ - ClothingHeadHatJesterAlt - ClothingShoesJester +- type: loadout + id: LoadoutServiceClownOuterWinter + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - ClothingOuterWinterClown + +- type: loadout + id: LoadoutServiceClownOuterClownPriest + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - ClothingOuterClownPriest + +- type: loadout + id: LoadoutServiceClownBootsWinter + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsWinterClown + +- type: loadout + id: LoadoutServiceClownMaskSexy + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - ClothingMaskSexyClown + +- type: loadout + id: LoadoutServiceClownBedsheetClown + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + items: + - BedsheetClown + +# Mime +- type: loadout + id: LoadoutServiceMimeOuterWinter + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingOuterWinterMime + +- type: loadout + id: LoadoutServiceMimeMaskSad + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingMaskSadMime + +- type: loadout + id: LoadoutServiceMimeMaskScared + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingMaskScaredMime + +- type: loadout + id: LoadoutServiceMimeMaskSexy + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - ClothingMaskSexyMime + +- type: loadout + id: LoadoutServiceMimeShoesBootsWinter + category: Jobs + cost: 1 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsWinterMime + +- type: loadout + id: LoadoutServiceMimeBedsheetMime + category: Jobs + cost: 2 + exclusive: true + requirements: + - !type:CharacterJobRequirement + jobs: + - Mime + items: + - BedsheetMime + # Bartender - type: loadout id: LoadoutServiceBartenderUniformPurple diff --git a/Resources/Prototypes/Loadouts/categories.yml b/Resources/Prototypes/Loadouts/categories.yml index 79d2d7fe2bf..0dfccb096ca 100644 --- a/Resources/Prototypes/Loadouts/categories.yml +++ b/Resources/Prototypes/Loadouts/categories.yml @@ -18,6 +18,9 @@ - type: loadoutCategory id: Jobs +- type: loadoutCategory + id: Mask + - type: loadoutCategory id: Neck diff --git a/Resources/Prototypes/Loadouts/eyes.yml b/Resources/Prototypes/Loadouts/eyes.yml index 74226604e92..fed07c6bd6f 100644 --- a/Resources/Prototypes/Loadouts/eyes.yml +++ b/Resources/Prototypes/Loadouts/eyes.yml @@ -5,6 +5,34 @@ items: - ClothingEyesEyepatch +- type: loadout + id: LoadoutEyesGlasses + category: Eyes + cost: 1 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - Nearsighted + items: + - ClothingEyesGlasses + +- type: loadout + id: LoadoutEyesGlassesJamjar + category: Eyes + cost: 2 + exclusive: true + items: + - ClothingEyesGlassesJamjar + +- type: loadout + id: LoadoutEyesGlassesJensen + category: Eyes + cost: 2 + exclusive: true + items: + - ClothingEyesGlassesJensen + - type: loadout id: LoadoutEyesBlindfold category: Eyes @@ -12,6 +40,14 @@ items: - ClothingEyesBlindfold +- type: loadout + id: LoadoutItemCheapSunglasses + category: Eyes + cost: 2 + exclusive: true + items: + - ClothingEyesGlassesCheapSunglasses + - type: loadout id: LoadoutItemSunglasses category: Eyes diff --git a/Resources/Prototypes/Loadouts/hands.yml b/Resources/Prototypes/Loadouts/hands.yml index 3604678d387..6cef6420571 100644 --- a/Resources/Prototypes/Loadouts/hands.yml +++ b/Resources/Prototypes/Loadouts/hands.yml @@ -113,3 +113,11 @@ exclusive: true items: - ClothingHandsGlovesRobohands + +- type: loadout + id: LoadoutHandsGlovesFingerless + category: Hands + cost: 1 + exclusive: true + items: + - ClothingHandsGlovesFingerless diff --git a/Resources/Prototypes/Loadouts/head.yml b/Resources/Prototypes/Loadouts/head.yml index 9ee23f49e9f..e76e2f17ecd 100644 --- a/Resources/Prototypes/Loadouts/head.yml +++ b/Resources/Prototypes/Loadouts/head.yml @@ -6,6 +6,11 @@ exclusive: true items: - ClothingHeadHatBeaverHat + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadTophat @@ -23,6 +28,27 @@ items: - ClothingHeadHatFedoraBlack +- type: loadout + id: LoadoutHeadFedoraBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadFedoraGrey + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFedoraGrey + - type: loadout id: LoadoutHeadFedoraChoc category: Head @@ -30,6 +56,11 @@ exclusive: true items: - ClothingHeadHatFedoraChoc + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadFedoraWhite @@ -54,6 +85,11 @@ exclusive: true items: - ClothingHeadHatFlatBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadTinfoil @@ -79,6 +115,11 @@ exclusive: true items: - ClothingHeadHatBluesoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatBluesoftFlipped @@ -87,6 +128,11 @@ exclusive: true items: - ClothingHeadHatBluesoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatCorpsoft @@ -111,6 +157,11 @@ exclusive: true items: - ClothingHeadHatGreensoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatGreensoftFlipped @@ -119,6 +170,11 @@ exclusive: true items: - ClothingHeadHatGreensoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatGreysoft @@ -136,6 +192,22 @@ items: - ClothingHeadHatGreysoftFlipped +- type: loadout + id: LoadoutHeadHatMimesoft + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadHatMimesoft + +- type: loadout + id: LoadoutHeadHatMimesoftFlipped + category: Head + cost: 1 + exclusive: true + items: + - ClothingHeadHatMimesoftFlipped + - type: loadout id: LoadoutHeadHatOrangesoft category: Head @@ -143,6 +215,11 @@ exclusive: true items: - ClothingHeadHatOrangesoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatOrangesoftFlipped @@ -151,6 +228,11 @@ exclusive: true items: - ClothingHeadHatOrangesoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatPurplesoft @@ -159,6 +241,11 @@ exclusive: true items: - ClothingHeadHatPurplesoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatPurplesoftFlipped @@ -167,6 +254,11 @@ exclusive: true items: - ClothingHeadHatPurplesoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatRedsoft @@ -191,6 +283,11 @@ exclusive: true items: - ClothingHeadHatYellowsoft + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadHatYellowsoftFlipped @@ -199,6 +296,11 @@ exclusive: true items: - ClothingHeadHatYellowsoftFlipped + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security # Headbands - type: loadout @@ -216,6 +318,11 @@ exclusive: true items: - ClothingHeadBandBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandGold @@ -224,6 +331,11 @@ exclusive: true items: - ClothingHeadBandGold + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandGreen @@ -232,6 +344,11 @@ exclusive: true items: - ClothingHeadBandGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandGrey @@ -240,6 +357,11 @@ exclusive: true items: - ClothingHeadBandGrey + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandRed @@ -264,6 +386,11 @@ exclusive: true items: - ClothingHeadBandMerc + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security - type: loadout id: LoadoutHeadBandBrown @@ -272,3 +399,135 @@ exclusive: true items: - ClothingHeadBandBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadFishCap + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadFishCap + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadRastaHat + category: Head + cost: 4 + exclusive: true + items: + - ClothingHeadRastaHat + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadFez + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatFez + +- type: loadout + id: LoadoutHeadBowlerHat + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBowlerHat + +# Flatcaps +- type: loadout + id: LoadoutHeadGreyFlatcap + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatGreyFlatcap + +- type: loadout + id: LoadoutHeadBrownFlatcap + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBrownFlatcap + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +# Berets +- type: loadout + id: LoadoutHeadBeret + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBeret + +- type: loadout + id: LoadoutHeadBeretFrench + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatBeretFrench + +# Cowboy hats +- type: loadout + id: LoadoutHeadCowboyBrown + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutHeadCowboyBlack + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyBlack + +- type: loadout + id: LoadoutHeadCowboyWhite + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyWhite + +- type: loadout + id: LoadoutHeadCowboyGrey + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyGrey + +- type: loadout + id: LoadoutHeadCowboyRed + category: Head + cost: 2 + exclusive: true + items: + - ClothingHeadHatCowboyRed diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 35dcbf7b9ed..71c44d365d4 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -183,6 +183,13 @@ items: - CrowbarRed +- type: loadout + id: LoadoutItemFireExtinguisher + category: Items + cost: 3 + items: + - FireExtinguisher + #Misc Items - type: loadout id: LoadoutItemPAI @@ -191,12 +198,43 @@ items: - PersonalAI +- type: loadout + id: LoadoutItemBackpackSatchelLeather + category: Items + cost: 1 + items: + - ClothingBackpackSatchelLeather + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Prisoner + - type: loadout id: LoadoutItemWaistbag category: Items cost: 2 items: - ClothingBeltStorageWaistbag + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Prisoner + +- type: loadout + id: LoadoutItemCrayonBox + category: Items + cost: 4 + items: + - CrayonBox + +- type: loadout + id: LoadoutItemBarberScissors + category: Items + cost: 4 + items: + - BarberScissors - type: loadout id: LoadoutSolCommonTranslator diff --git a/Resources/Prototypes/Loadouts/mask.yml b/Resources/Prototypes/Loadouts/mask.yml new file mode 100644 index 00000000000..67be1e70ffd --- /dev/null +++ b/Resources/Prototypes/Loadouts/mask.yml @@ -0,0 +1,143 @@ +- type: loadout + id: LoadoutMaskSterile + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskSterile + +- type: loadout + id: LoadoutMaskMuzzle + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskMuzzle + +- type: loadout + id: LoadoutMaskGas + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskGas + +# Maskbands +- type: loadout + id: LoadoutMaskBandBlack + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandBlack + +- type: loadout + id: LoadoutMaskBandBlue + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandGold + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandGold + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandGreen + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandGrey + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandGrey + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandRed + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandRed + +- type: loadout + id: LoadoutMaskBandSkull + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandSkull + +- type: loadout + id: LoadoutMaskBandMerc + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskBandMerc + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +- type: loadout + id: LoadoutMaskBandBrown + category: Mask + cost: 1 + exclusive: true + items: + - ClothingMaskBandBrown + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + +# Gaiters +- type: loadout + id: LoadoutMaskNeckGaiter + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskNeckGaiter + +- type: loadout + id: LoadoutMaskNeckGaiterRed + category: Mask + cost: 2 + exclusive: true + items: + - ClothingMaskNeckGaiterRed diff --git a/Resources/Prototypes/Loadouts/neck.yml b/Resources/Prototypes/Loadouts/neck.yml index eb933de29ee..c7fc7003653 100644 --- a/Resources/Prototypes/Loadouts/neck.yml +++ b/Resources/Prototypes/Loadouts/neck.yml @@ -1,3 +1,12 @@ +- type: loadout + id: LoadoutNeckHeadphones + category: Neck + cost: 2 + exclusive: true + items: + - ClothingNeckHeadphones + +# Scarves - type: loadout id: LoadoutNeckScarfStripedRed category: Neck @@ -22,6 +31,46 @@ items: - ClothingNeckScarfStripedGreen +- type: loadout + id: LoadoutNeckScarfStripedBlack + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedBlack + +- type: loadout + id: LoadoutNeckScarfStripedBrown + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedBrown + +- type: loadout + id: LoadoutNeckScarfStripedLightBlue + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedLightBlue + +- type: loadout + id: LoadoutNeckScarfStripedOrange + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedOrange + +- type: loadout + id: LoadoutNeckScarfStripedPurple + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckScarfStripedPurple + - type: loadout id: LoadoutNeckScarfStripedZebra category: Neck @@ -30,6 +79,48 @@ items: - ClothingNeckScarfStripedZebra +# Ties +- type: loadout + id: LoadoutNeckTieRed + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieRed + +- type: loadout + id: LoadoutNeckTieWhite + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieWhite + +- type: loadout + id: LoadoutNeckTieBlack + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieBlack + +- type: loadout + id: LoadoutNeckTieBlue + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieBlue + +- type: loadout + id: LoadoutNeckTieGreen + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckTieGreen + + #Pride Accessories - type: loadout id: LoadoutItemsPrideLGBTPin @@ -102,3 +193,216 @@ exclusive: true items: - ClothingNeckTransPin + +# Bedsheets +- type: loadout + id: LoadoutNeckBedsheetBlack + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetBlack + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetBlue + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetBlue + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetBrown + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetBrown + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetCosmos + category: Neck + cost: 3 + exclusive: true + items: + - BedsheetCosmos + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetGreen + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetGreen + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetGrey + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetGrey + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetOrange + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetOrange + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Logistics + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetPurple + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetPurple + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Epistemics + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetRainbow + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetRainbow + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetRed + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetRed + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetWhite + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetWhite + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutNeckBedsheetYellow + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetYellow + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Engineering + - !type:CharacterJobRequirement + inverted: true + jobs: + - HeadOfPersonnel # Need to blacklist HoP and not command so other heads can wear this bedsheet + +- type: loadout + id: LoadoutNeckBedsheetNT + category: Neck + cost: 2 + exclusive: true + items: + - BedsheetNT + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index c52f35b0f5d..38ba17b6a3b 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -54,6 +54,13 @@ items: - ClothingOuterVestValet +- type: loadout + id: LoadoutOuterVest + category: Outer + cost: 1 + items: + - ClothingOuterVest + # Letterman Jackets - type: loadout id: LoadoutOuterCoatLettermanBlue @@ -168,3 +175,53 @@ cost: 2 items: - ClothingOuterZhCorporateJacket + +- type: loadout + id: LoadoutOuterDenimJacket + category: Outer + cost: 3 + items: + - ClothingOuterDenimJacket + +# Flannel +- type: loadout + id: LoadoutOuterFlannelRed + category: Outer + cost: 3 + items: + - ClothingOuterFlannelRed + +- type: loadout + id: LoadoutOuterFlannelGreen + category: Outer + cost: 3 + items: + - ClothingOuterFlannelGreen + +- type: loadout + id: LoadoutOuterFlannelBlue + category: Outer + cost: 3 + items: + - ClothingOuterFlannelBlue + +- type: loadout + id: LoadoutOuterCoatTrench + category: Outer + cost: 3 + items: + - ClothingOuterCoatTrench + +- type: loadout + id: LoadoutOuterCoatJensen + category: Outer + cost: 3 + items: + - ClothingOuterCoatJensen + +- type: loadout + id: LoadoutOuterCoatGentle + category: Outer + cost: 3 + items: + - ClothingOuterCoatGentle diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index bdea2b57ad1..470cac29834 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -8,6 +8,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorBlack @@ -21,6 +22,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorBlue @@ -34,6 +36,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorBrown @@ -47,6 +50,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorGreen @@ -60,6 +64,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorOrange @@ -73,6 +78,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorPurple @@ -86,6 +92,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorRed @@ -99,6 +106,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorWhite @@ -112,6 +120,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesColorYellow @@ -125,10 +134,25 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesGeta +- type: loadout + id: LoadoutShoesTourist + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesTourist + # Boots - type: loadout id: LoadoutShoesBootsWork @@ -139,6 +163,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsWork @@ -152,6 +177,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsLaceup @@ -165,6 +191,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsWinter @@ -178,6 +205,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyBrown @@ -191,6 +219,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyBlack @@ -204,6 +233,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyWhite @@ -217,10 +247,25 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesBootsCowboyFancy +- type: loadout + id: LoadoutShoesBootsFishing + category: Shoes + cost: 2 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesBootsFishing + # Miscellaneous - type: loadout id: LoadoutShoesSlippersDuck @@ -233,6 +278,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy - !type:CharacterJobRequirement jobs: @@ -247,6 +293,7 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesLeather @@ -260,6 +307,51 @@ - !type:CharacterSpeciesRequirement inverted: true species: + - Diona - Harpy items: - ClothingShoesMiscWhite + +- type: loadout + id: LoadoutShoesHighheelBoots + category: Shoes + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingShoesHighheelBoots + +# Socks +- type: loadout + id: LoadoutShoesUnderSocksCoder + category: Shoes + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingUnderSocksCoder + +# Socks +- type: loadout + id: LoadoutShoesUnderSocksBee + category: Shoes + cost: 3 + exclusive: true + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona + - Harpy + items: + - ClothingUnderSocksBee diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index eb46acc2f60..090a0957a92 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -28,9 +28,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorBlack @@ -40,9 +45,14 @@ items: - ClothingUniformJumpskirtColorBlack requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorBlue @@ -56,9 +66,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Medical + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorBlue @@ -68,9 +83,14 @@ items: - ClothingUniformJumpskirtColorBlue requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Medical + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorGreen @@ -84,9 +104,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorGreen @@ -96,9 +120,13 @@ items: - ClothingUniformJumpskirtColorGreen requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorOrange @@ -112,9 +140,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorOrange @@ -124,9 +156,13 @@ items: - ClothingUniformJumpskirtColorOrange requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorPink @@ -140,9 +176,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorPink @@ -152,9 +192,13 @@ items: - ClothingUniformJumpskirtColorPink requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorRed @@ -168,9 +212,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorRed @@ -180,9 +229,14 @@ items: - ClothingUniformJumpskirtColorRed requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Security + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorWhite @@ -196,9 +250,15 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Medical + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorWhite @@ -208,9 +268,15 @@ items: - ClothingUniformJumpskirtColorWhite requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Medical + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorYellow @@ -224,9 +290,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Engineering + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorYellow @@ -236,9 +307,14 @@ items: - ClothingUniformJumpskirtColorYellow requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Engineering + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorDarkBlue @@ -252,9 +328,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorDarkBlue @@ -264,9 +344,13 @@ items: - ClothingUniformJumpskirtColorDarkBlue requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorTeal @@ -280,9 +364,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorTeal @@ -292,9 +380,13 @@ items: - ClothingUniformJumpskirtColorTeal requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorPurple @@ -308,9 +400,14 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorPurple @@ -320,9 +417,14 @@ items: - ClothingUniformJumpskirtColorPurple requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - Epistemics + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorDarkGreen @@ -336,9 +438,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorDarkGreen @@ -348,9 +454,13 @@ items: - ClothingUniformJumpskirtColorDarkGreen requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorLightBrown @@ -364,9 +474,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorLightBrown @@ -376,9 +490,13 @@ items: - ClothingUniformJumpskirtColorLightBrown requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorBrown @@ -392,9 +510,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorBrown @@ -404,9 +526,13 @@ items: - ClothingUniformJumpskirtColorBrown requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpsuitColorMaroon @@ -420,9 +546,13 @@ inverted: true species: - Harpy - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformJumpskirtColorMaroon @@ -432,9 +562,446 @@ items: - ClothingUniformJumpskirtColorMaroon requirements: - - !type:CharacterJobRequirement - jobs: - - Passenger + - !type:CharacterDepartmentRequirement + departments: + - Civilian + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitFlannel + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitFlannel + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpskirtCasualBlue + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpskirtCasualBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitCasualPurple + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitCasualPurple + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpskirtCasualPurple + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpskirtCasualPurple + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitCasualRed + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitCasualRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpskirtCasualRed + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpskirtCasualRed + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitTshirtJeans + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitTshirtJeans + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitTshirtJeansGray + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitTshirtJeansGray + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitTshirtJeansPeach + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitTshirtJeansPeach + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitJeansGreen + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitJeansGreen + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitJeansRed + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitJeansRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitJeansBrown + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitJeansBrown + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitLostTourist + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpsuitLostTourist + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# Hawaiian shirts +- type: loadout + id: LoadoutUniformJumpsuitHawaiBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitHawaiBlack + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitHawaiBlue + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitHawaiBlue + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitHawaiRed + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitHawaiRed + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitHawaiYellow + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitHawaiYellow + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +# AutoDrobe clothes +- type: loadout + id: LoadoutUniformDressRed + category: Uniform + cost: 4 + exclusive: true + items: + - ClothingUniformDressRed + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformJumpsuitSober + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSober + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformSkirtTurtle + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformSkirtTurtle + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformGeisha + category: Uniform + cost: 3 + exclusive: true + items: + - UniformGeisha + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformCostumeArcDress + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingCostumeArcDress + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformCostumeMioSkirt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingCostumeMioSkirt + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformCostumeNaota + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingCostumeNaota + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpsuitLoungewear + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitLoungewear + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +# Bartender clothes +- type: loadout + id: LoadoutUniformJumpsuitBartender + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpsuitBartender + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformJumpskirtBartender + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpskirtBartender + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command # Kendo - type: loadout @@ -444,6 +1011,11 @@ exclusive: true items: - ClothingUniformKendoHakama + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutUniformMartialGi @@ -452,8 +1024,28 @@ exclusive: true items: - ClothingUniformMartialGi + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command # Kimono +- type: loadout + id: LoadoutClothingJumpsuitKimono + category: Uniform + cost: 3 + exclusive: true + items: + - ClothingUniformJumpsuitKimono + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + - type: loadout id: LoadoutClothingKimonoBlue category: Uniform @@ -461,6 +1053,12 @@ exclusive: true items: - ClothingKimonoBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout id: LoadoutClothingKimonoPink @@ -469,6 +1067,12 @@ exclusive: true items: - ClothingKimonoPink + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout id: LoadoutClothingKimonoPurple @@ -477,6 +1081,12 @@ exclusive: true items: - ClothingKimonoPurple + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout id: LoadoutClothingKimonoSky @@ -485,6 +1095,12 @@ exclusive: true items: - ClothingKimonoSky + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command - type: loadout id: LoadoutClothingKimonoGreen @@ -493,6 +1109,12 @@ exclusive: true items: - ClothingKimonoGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command # Gakuran - type: loadout @@ -502,6 +1124,150 @@ exclusive: true items: - ClothingUniformSchoolGakuranBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +# Schoolgirl uniform +- type: loadout + id: LoadoutUniformSchoolgirlBlack + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlBlue + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlBlue + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlCyan + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlCyan + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlGreen + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlGreen + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlOrange + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlOrange + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlPink + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlPink + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlPurple + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlPurple + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlRed + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlRed + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlDusk + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlDusk + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command + +- type: loadout + id: LoadoutUniformSchoolgirlBlazerTan + category: Uniform + cost: 3 + exclusive: true + items: + - UniformSchoolgirlBlazerTan + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Command # MNK Uniforms - type: loadout @@ -511,6 +1277,11 @@ exclusive: true items: - ClothingUniformMNKOfficeSkirt + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutClothingMNKUnderGarment @@ -519,6 +1290,11 @@ exclusive: true items: - ClothingUniformMNKUnderGarment + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutClothingMNKGymBra @@ -527,6 +1303,11 @@ exclusive: true items: - ClothingUniformMNKGymBra + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutClothingMNKDressBlack @@ -535,6 +1316,11 @@ exclusive: true items: - ClothingUniformMNKDressBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutClothingMNKBlackOveralls @@ -543,6 +1329,11 @@ exclusive: true items: - ClothingUniformMNKBlackOveralls + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutClothingMNKBlackShoulder @@ -551,6 +1342,11 @@ exclusive: true items: - ClothingUniformMNKBlackShoulder + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command - type: loadout id: LoadoutClothingMNKTracksuitBlack @@ -559,3 +1355,8 @@ exclusive: true items: - ClothingUniformMNKTracksuitBlack + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command From b3c36476b330e99dc27c65ca66e2573f5494ec92 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 02:38:09 +0000 Subject: [PATCH 026/143] Automatic Changelog Update (#616) --- Resources/Changelog/Changelog.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cb0933affcb..ceed259c0b0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4731,3 +4731,24 @@ Entries: message: Readjusted colors of all languages to make them easier to read. id: 6194 time: '2024-07-31T23:57:25.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Added dozens of new clothes and items to Loadouts, including the new + Mask category. Have fun dressing up your characters! + - type: Tweak + message: Restrict Command Loadouts from selecting uniforms outside of their job. + - type: Tweak + message: >- + Limit the selection in Security Loadouts of non-sec uniforms, hats, and + masks to those that maintain the Security aesthetic. + - type: Tweak + message: >- + Made all types of colored jumpsuits in Loadouts available to Civilian + roles (excluding HoP), and suitable jumpsuits to Epistemics, + Engineering, and Medical. + - type: Fix + message: Prevent dionas and harpies from selecting shoes in Loadouts. + id: 6195 + time: '2024-08-01T02:37:45.0000000+00:00' From 7fb089d95dc6e5b32beed5f95d9f6bd6d4e9fc66 Mon Sep 17 00:00:00 2001 From: Tmanzxd <164098915+Tmanzxd@users.noreply.github.com> Date: Thu, 1 Aug 2024 02:58:46 -0500 Subject: [PATCH 027/143] Replace and Fix MedHud Icons (#631) Fixes #362 --- .../Misc/health_icons.rsi/Critical.png | Bin 125 -> 122 bytes .../Interface/Misc/health_icons.rsi/Dead.png | Bin 214 -> 219 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png index 779874eaaeb3c64047fc7f01bc618725d36d2e7b..15a4972174518f9c088301d1a1469c01641d2eaa 100644 GIT binary patch delta 91 zcmV-h0HptYdXOYmK}keGR2Y?&kHHDRFbo5Ap&QxzPvFd?ewvR<2)U;?350D;(rSbY xK+hx{D|JbvB&`yoH#?WYH@_ELKY`PWBQJ597DYkwQQ`mq002ovPDHLkV1l=aBn$um delta 94 zcmV-k0HObSeUKzsL`g(JR2Y?okGmBBAP55wSHhXx$(?W}EPVcGxF$^!f&jRw6OcLt zptz|s0PVcGLnS67sX@+(h^`&Cq4i&PL-s|=1W^YW12RT~BLDyZ07*qoM6N<$g3kma Ao&W#< diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png index beceebd05cf3cb07497ad0a16f286074c94c1a12..8cebd95418635fed8eafeec929a5bb523339479f 100644 GIT binary patch delta 191 zcmV;w06_oN0owtPB!8kwL_t(Ijn$N~4Z<)GMV~W4Mo39{W2DR&l#Jq%F(?_sC8bC3 z2BA819G6HaAi|g2_`mZ%%O@uQk#QzaDc7`jKZ%TUy_LvkI0yiH_B*@Lat*<6Gh5E= z)NHxZpN0qM10u!;EHU;>%cy*=E?XZl0O1H}!P*nHT#@qxKsY&Go*Giwdf&A7ZSIoq tnU@h#Ma`@+@A98y!VCP9e*O(^_3uSvwHqDn7RUeq002ovPDHLkV1gqs(NI=1e5$Q;Q@m{fdX71vIcZ<7)G}M zn>om4p{pU*d~9xmv9Ts0mD1iYl1}T*X09)g=8#6+5G5`Po07*qoM6N<$g3>`rH2?qr From 5f2cae0c12a5e31f4f852d3aa1e51d5ef25a8a42 Mon Sep 17 00:00:00 2001 From: Tmanzxd <164098915+Tmanzxd@users.noreply.github.com> Date: Thu, 1 Aug 2024 02:58:56 -0500 Subject: [PATCH 028/143] Manual Removal of easy_pry.yml (#632) Fixes #25893 --- .../Structures/Doors/Airlocks/easy_pry.yml | 63 ------------------- 1 file changed, 63 deletions(-) delete mode 100644 Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml deleted file mode 100644 index 04a58eebe07..00000000000 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/easy_pry.yml +++ /dev/null @@ -1,63 +0,0 @@ -- type: entity - parent: AirlockExternal - id: AirlockExternalEasyPry - suffix: External, EasyPry - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalGlass - id: AirlockExternalGlassEasyPry - suffix: External, Glass, EasyPry - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockGlassShuttle - id: AirlockGlassShuttleEasyPry - suffix: EasyPry, Docking - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockShuttle - id: AirlockShuttleEasyPry - suffix: EasyPry, Docking - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalLocked - id: AirlockExternalEasyPryLocked - suffix: External, EasyPry, Locked - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalGlassLocked - id: AirlockExternalGlassEasyPryLocked - suffix: External, Glass, EasyPry, Locked - description: It opens, it closes, it might crush you, and there might be only space behind it. Has to be manually activated. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalGlassShuttleLocked - id: AirlockGlassShuttleEasyPryLocked - suffix: EasyPry, Docking, Locked - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered - -- type: entity - parent: AirlockExternalShuttleLocked - id: AirlockShuttleEasyPryLocked - suffix: EasyPry, Docking, Locked - description: Necessary for connecting two space craft together. Has a valve labelled "TURN TO OPEN" - components: - - type: PryUnpowered From 00a74a2c791111401e64a4a3fa88b35805a273c8 Mon Sep 17 00:00:00 2001 From: stellar-novas Date: Thu, 1 Aug 2024 04:25:27 -0400 Subject: [PATCH 029/143] Revert "Mirror: Restrict Door Remotes to only Being Able to Manipulate Doors Relevant to Their Type" (#491) Reverts Simple-Station/Einstein-Engines#315 As [I brought up](https://github.com/Simple-Station/Einstein-Engines/pull/315#issuecomment-2105861135) in the original pr, this change was made to counter power gaming, which isn't as much of an issue on EE downstreams, and adversely affects the engineering department, without any major benefits. --------- Signed-off-by: stellar-novas Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Content.Server/Remotes/DoorRemoteSystem.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index e42bc700912..31fcacdaf80 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -50,8 +50,10 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang return; } + // Holding the door remote grants you access to the relevant doors IN ADDITION to what ever access you had. + // This access is enforced in _doorSystem.HasAccess when it calls _accessReaderSystem.IsAllowed if (TryComp(args.Target, out var accessComponent) - && !_doorSystem.HasAccess(args.Target.Value, args.Used, doorComp, accessComponent)) + && !_doorSystem.HasAccess(args.Target.Value, args.User, doorComp, accessComponent)) { _doorSystem.Deny(args.Target.Value, doorComp, args.User); Popup.PopupEntity(Loc.GetString("door-remote-denied"), args.User, args.User); @@ -61,7 +63,10 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang switch (entity.Comp.Mode) { case OperatingMode.OpenClose: - if (_doorSystem.TryToggleDoor(args.Target.Value, doorComp, args.Used)) + // Note we provide args.User here to TryToggleDoor as the "user" + // This means that the door will look at all access items carried by the player for access, including + // this remote, but also including anything else they are carrying such as a PDA or ID card. + if (_doorSystem.TryToggleDoor(args.Target.Value, doorComp, args.User)) _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)}: {doorComp.State}"); break; case OperatingMode.ToggleBolts: @@ -69,7 +74,7 @@ private void OnBeforeInteract(Entity entity, ref BeforeRang { if (!boltsComp.BoltWireCut) { - _doorSystem.SetBoltsDown((args.Target.Value, boltsComp), !boltsComp.BoltsDown, args.Used); + _doorSystem.SetBoltsDown((args.Target.Value, boltsComp), !boltsComp.BoltsDown, args.User); _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to {(boltsComp.BoltsDown ? "" : "un")}bolt it"); } } From ac2fc06e10b4a077f263b99b578b5dbad27c688f Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Thu, 1 Aug 2024 01:30:47 -0700 Subject: [PATCH 030/143] Invert the Running/Walking States (#485) # Description Ports https://github.com/Simple-Station/Parkstation-Friendly-Chainsaw/pull/39 A change made to encourage people to [stop and smell the roses](https://www.urbandictionary.com/define.php?term=slow+down+and+smell+the+roses), instead of sprinting everywhere trying to get shit done. This goes well with #486, so people don't actually *have* to rush places to try to get things done before the shift ends fatally. It's weird anyway how we're all constantly sprinting everywhere and have to *very actively* choose not to (and why would you?). Increases the default speeds so that walking isn't painfully slow and sprinting feels more like sprinting in combination with the active choice to sprint. Someone needs to PR changing the default sprint or examine buttons, so people can fight and sprint with this change. (A lot of other default keybinds suck or conflict too and need to change) # Media Terrible video but whatever https://github.com/user-attachments/assets/5ff3863d-92c8-4df3-b76b-82874b5e1ae3 # Changelog :cl: - tweak: The station's crew hivemind has decided to slow down their movement and enjoy The Park instead of sprinting everywhere --------- Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Co-authored-by: Pspritechologist <81725545+Pspritechologist@users.noreply.github.com> --- .../Tests/Slipping/SlippingTest.cs | 10 +++++++--- Content.Shared/CCVar/CCVars.cs | 7 +++++++ .../Movement/Components/CanWalkComponent.cs | 11 ----------- .../Movement/Components/InputMoverComponent.cs | 7 ++++++- .../Components/MovementSpeedModifierComponent.cs | 4 ++-- .../Movement/Systems/SharedMoverController.Input.cs | 2 +- .../Movement/Systems/SharedMoverController.cs | 8 +++----- .../Locale/en-US/escape-menu/ui/options-menu.ftl | 4 ++-- .../Entities/Mobs/Cyborgs/base_borg_chassis.yml | 1 - Resources/Prototypes/Entities/Mobs/NPCs/animals.yml | 1 - Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml | 1 - Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml | 1 - Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml | 1 - Resources/Prototypes/Entities/Mobs/Species/base.yml | 1 - Resources/Prototypes/Entities/Mobs/Species/harpy.yml | 5 ++--- .../Entities/Objects/Specific/Mech/mechs.yml | 1 - 16 files changed, 30 insertions(+), 35 deletions(-) delete mode 100644 Content.Shared/Movement/Components/CanWalkComponent.cs diff --git a/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs b/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs index 7f77146f455..511a720ed07 100644 --- a/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs +++ b/Content.IntegrationTests/Tests/Slipping/SlippingTest.cs @@ -1,11 +1,14 @@ #nullable enable using System.Collections.Generic; using Content.IntegrationTests.Tests.Interaction; +using Content.Shared.CCVar; using Content.Shared.Movement.Components; using Content.Shared.Slippery; using Content.Shared.Stunnable; +using Robust.Shared.Configuration; using Robust.Shared.GameObjects; using Robust.Shared.Input; +using Robust.Shared.IoC; using Robust.Shared.Maths; namespace Content.IntegrationTests.Tests.Slipping; @@ -14,6 +17,7 @@ public sealed class SlippingTest : MovementTest { public sealed class SlipTestSystem : EntitySystem { + [Dependency] public readonly IConfigurationManager Config = default!; public HashSet Slipped = new(); public override void Initialize() { @@ -30,6 +34,7 @@ private void OnSlip(EntityUid uid, SlipperyComponent component, ref SlipEvent ar public async Task BananaSlipTest() { var sys = SEntMan.System(); + var sprintWalks = sys.Config.GetCVar(CCVars.GamePressToSprint); await SpawnTarget("TrashBananaPeel"); var modifier = Comp(Player).SprintSpeedModifier; @@ -42,7 +47,7 @@ public async Task BananaSlipTest() #pragma warning restore NUnit2045 // Walking over the banana slowly does not trigger a slip. - await SetKey(EngineKeyFunctions.Walk, BoundKeyState.Down); + await SetKey(EngineKeyFunctions.Walk, sprintWalks ? BoundKeyState.Up : BoundKeyState.Down); await Move(DirectionFlag.East, 1f); #pragma warning disable NUnit2045 Assert.That(Delta(), Is.LessThan(0.5f)); @@ -51,10 +56,9 @@ public async Task BananaSlipTest() AssertComp(false, Player); // Moving at normal speeds does trigger a slip. - await SetKey(EngineKeyFunctions.Walk, BoundKeyState.Up); + await SetKey(EngineKeyFunctions.Walk, sprintWalks ? BoundKeyState.Down : BoundKeyState.Up); await Move(DirectionFlag.West, 1f); Assert.That(sys.Slipped, Does.Contain(SEntMan.GetEntity(Player))); AssertComp(true, Player); } } - diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 3c3bfa8862d..df463b27299 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -407,6 +407,13 @@ public static readonly CVarDef public static readonly CVarDef GameAutoEatDrinks = CVarDef.Create("game.auto_eat_drinks", false, CVar.REPLICATED); + + /// + /// When true, you have to press the change speed button to sprint. + /// + public static readonly CVarDef GamePressToSprint = + CVarDef.Create("game.press_to_sprint", true, CVar.REPLICATED); + #if EXCEPTION_TOLERANCE /// - /// - /// - /// - /// - public float RampingEventTimeEquation(RampingStationEventSchedulerComponent component, float startTime, float endTimeOffset = 0) + public float GetChaosModifier(EntityUid uid, RampingStationEventSchedulerComponent component) { - var endTime = Math.Clamp(endTimeOffset, 0.1f, startTime - 1); - var shiftLength = Math.Max(1, _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) - component.ShiftLengthOffset); - return 2 * endTime - / (1 - + MathF.Exp(_cfg.GetCVar(CCVars.EventsRampingAverageChaos) - * component.ShiftChaosModifier - / shiftLength - * endTime - * (float) _gameTicker.RoundDuration().TotalSeconds - / 60)) - + (startTime - endTime); + var roundTime = (float) _gameTicker.RoundDuration().TotalSeconds; + if (roundTime > component.EndTime) + return component.MaxChaos; + + return component.MaxChaos / component.EndTime * roundTime + component.StartingChaos; } protected override void Started(EntityUid uid, RampingStationEventSchedulerComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) { base.Started(uid, component, gameRule, args); - PickNextEventTime(component); + var avgChaos = _cfg.GetCVar(CCVars.EventsRampingAverageChaos) * component.ChaosModifier; + var avgTime = _cfg.GetCVar(CCVars.EventsRampingAverageEndTime) * component.ShiftLengthModifier; + + // Worlds shittiest probability distribution + // Got a complaint? Send them to + component.MaxChaos = avgChaos * _random.NextFloat(0.75f, 1.25f); + // This is in minutes, so *60 for seconds (for the chaos calc) + component.EndTime = avgTime * _random.NextFloat(0.75f, 1.25f) * 60f; + component.StartingChaos = component.MaxChaos * component.StartingChaosRatio; + + PickNextEventTime(uid, component); } public override void Update(float frameTime) @@ -66,31 +61,17 @@ public override void Update(float frameTime) return; } - PickNextEventTime(scheduler); + PickNextEventTime(uid, scheduler); _event.RunRandomEvent(); } } - private void PickNextEventTime(RampingStationEventSchedulerComponent component) + private void PickNextEventTime(EntityUid uid, RampingStationEventSchedulerComponent component) { - // In case of server hosts being silly and setting maximum time to be lower than minimum time, sanity check the scheduler inputs and sort them by Min/Max - var minimumTime = MathF.Min(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTimeOffset) - - component.MinimumEventTimeOffset, _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTimeOffset) - - component.MaximumEventTimeOffset); - - var maximumTime = MathF.Max(_cfg.GetCVar(CCVars.GameEventsRampingMinimumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMinimumTimeOffset) - - component.MinimumEventTimeOffset, _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime) - - _cfg.GetCVar(CCVars.GameEventsRampingMaximumTimeOffset) - - component.MaximumEventTimeOffset); - - // Just in case someone messed up their math, set it to between 6 and 12 seconds. This absolutely isn't ideal component.TimeUntilNextEvent = _random.NextFloat( - RampingEventTimeEquation(component, MathF.Max(0.1f, minimumTime)), - RampingEventTimeEquation(component, MathF.Max(0.2f, maximumTime))); + _cfg.GetCVar(CCVars.GameEventsRampingMinimumTime), + _cfg.GetCVar(CCVars.GameEventsRampingMaximumTime)); - component.TimeUntilNextEvent *= component.EventDelayModifier; + component.TimeUntilNextEvent *= component.EventDelayModifier / GetChaosModifier(uid, component); } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 0d09dd59f74..985d9da1a18 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -119,7 +119,7 @@ public static readonly CVarDef /// Max chaos chosen for a round will deviate from this /// public static readonly CVarDef - EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 0.8f, CVar.ARCHIVE | CVar.SERVERONLY); + EventsRampingAverageChaos = CVarDef.Create("events.ramping_average_chaos", 6f, CVar.ARCHIVE | CVar.SERVERONLY); /* * Game @@ -186,29 +186,16 @@ public static readonly CVarDef // 25 Minutes GameEventsBasicMaximumTime = CVarDef.Create("game.events_basic_maximum_time", 1500, CVar.SERVERONLY); /// - /// Minimum time between Ramping station events in minutes + /// Minimum time between Ramping station events in seconds /// - public static readonly CVarDef // 8 Minutes - GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 8f, CVar.SERVERONLY); + public static readonly CVarDef // 4 Minutes + GameEventsRampingMinimumTime = CVarDef.Create("game.events_ramping_minimum_time", 240, CVar.SERVERONLY); /// - /// After the shift's desired "Endpoint" is reached, the minimum time between events is RampingMinimumTime - Offset. + /// Maximum time between Ramping station events in seconds /// - - public static readonly CVarDef - GameEventsRampingMinimumTimeOffset = CVarDef.Create("game.events_ramping_minimum_time_offset", 6f, CVar.SERVERONLY); - - /// - /// Maximum time between Ramping station events in minutes - /// - public static readonly CVarDef // 16 Minutes - GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 16f, CVar.SERVERONLY); - - /// - /// After the shift's desired "Endpoint" is reached, the maximum time between events is RampingMaximumTime - Offset. - /// - public static readonly CVarDef - GameEventsRampingMaximumTimeOffset = CVarDef.Create("game.events_ramping_maximum_time_offset", 10f, CVar.SERVERONLY); + public static readonly CVarDef // 12 Minutes + GameEventsRampingMaximumTime = CVarDef.Create("game.events_ramping_maximum_time", 720, CVar.SERVERONLY); /// /// - private List GetHealthyHumans(bool includeOffStation = true) + private List GetHealthyHumans(bool includeOffStation = false) { var healthy = new List(); var stationGrids = new HashSet(); if (!includeOffStation) { - foreach (var station in _station.GetStationsSet()) + foreach (var station in _gameTicker.GetSpawnableStations()) { if (TryComp(station, out var data) && _station.GetLargestGrid(data) is { } grid) stationGrids.Add(grid); @@ -223,13 +224,11 @@ private List GetHealthyHumans(bool includeOffStation = true) var zombers = GetEntityQuery(); while (players.MoveNext(out var uid, out _, out _, out var mob, out var xform)) { - if (!_mobState.IsAlive(uid, mob)) - continue; - - if (zombers.HasComponent(uid)) - continue; - - if (!includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) + if (!_mobState.IsAlive(uid, mob) + || HasComp(uid) //Do not include infected players in the "Healthy players" list. + || HasComp(uid) + || zombers.HasComponent(uid) + || !includeOffStation && !stationGrids.Contains(xform.GridUid ?? EntityUid.Invalid)) continue; healthy.Add(uid); From 4a6ad8ca683f1bef998cd467607d004dd771df8d Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 4 Aug 2024 14:14:36 +0000 Subject: [PATCH 067/143] Automatic Changelog Update (#652) --- Resources/Changelog/Changelog.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5ea713fda4f..a6bdca1ff36 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4877,3 +4877,14 @@ Entries: twice as fast. id: 6210 time: '2024-08-04T09:30:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: >- + Zombie events have had their Anti-Stalling mechanic improved. Dead + (Player) Zombies, Infected Players, and Initial Infected are all counted + as zombies for the purpose of determine if the shuttle should be called. + Additionally, any player who leaves the station is no longer counted as + a healthy crewman for the automatic shuttle call. + id: 6211 + time: '2024-08-04T14:14:12.0000000+00:00' From 7f784b0d0c34f318d5ebd6349b85d99b35d55511 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Mon, 5 Aug 2024 11:30:41 +0800 Subject: [PATCH 068/143] Rename Trait "Heavyweight Drunk" To "Alcohol Tolerance" (#669) # Description Renamed the trait "Heavyweight Drunk" into "Alcohol Tolerance". "_Heavyweight_" is a term that exists in real life, but to the plain eye the name is simply "Opposite of Lightweight Drunk". "Alcohol Tolerance" is a more intuitive and interesting trait name. More importantly, it's more natural for in-game characters to say "I have an alcohol tolerance" as opposed to "I'm a heavyweight drunk". # Changelog :cl: Skubman - tweak: Rename the trait "Heavyweight Drunk" into "Alcohol Tolerance". --------- Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- Resources/Locale/en-US/traits/traits.ftl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 25c309476f0..7e52e306685 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -11,8 +11,8 @@ trait-description-Pacifist = You cannot attack or hurt any living beings. trait-name-LightweightDrunk = Lightweight Drunk trait-description-LightweightDrunk = Alcohol has a stronger effect on you -trait-name-HeavyweightDrunk = Heavyweight Drunk -trait-description-HeavyweightDrunk = Alcohols are afraid of you +trait-name-HeavyweightDrunk = Alcohol Tolerance +trait-description-HeavyweightDrunk = Alcohol is afraid of you. trait-name-Muted = Muted trait-description-Muted = You can't speak From 812a3031ffaabee9ae33cd005bd2d92217384f09 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 5 Aug 2024 03:31:06 +0000 Subject: [PATCH 069/143] Automatic Changelog Update (#669) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a6bdca1ff36..8143bcdb938 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4888,3 +4888,9 @@ Entries: a healthy crewman for the automatic shuttle call. id: 6211 time: '2024-08-04T14:14:12.0000000+00:00' +- author: Skubman + changes: + - type: Tweak + message: Rename the trait "Heavyweight Drunk" into "Alcohol Tolerance". + id: 6212 + time: '2024-08-05T03:30:41.0000000+00:00' From 0acb879e61cf5ada2bd4f037d62edd5855ccceeb Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Mon, 5 Aug 2024 23:29:06 +0800 Subject: [PATCH 070/143] New Trait: Light Step (#658) # Description **Light Step** is a 1-point Auditory trait that reduces the volume of your footsteps by roughly 50%, enabling you to be quieter and stealthier. Inspired by the SS13 trait of the same name. ## TODO - [x] Locale strings - [x] ~~Reduce the distance in which Light Step footsteps can be heard~~ - It turns out that whatever I did reduced the delay between footstep sounds. - [x] Discuss the balancing values for the trait ## Technical details In the current implementation, Light Step reduces the volume of footsteps by 10 dB, resulting in roughly halving the volume. The fields in `FootstepVolumeModifierComponent` change the volume in terms of decibels. ## Media ![image](https://github.com/user-attachments/assets/d1e3efee-6f81-4212-a745-ae08687afcc0) # Changelog :cl: Skubman - add: Add the Light Step trait, a 1-point trait that makes your footsteps quieter. --------- Signed-off-by: Angelo Fallaria --- .../Movement/Systems/SharedMoverController.cs | 11 +++++++++- .../FootstepVolumeModifierComponent.cs | 22 +++++++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 4 ++++ Resources/Prototypes/Traits/skills.yml | 14 ++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 0944634db35..3cc35e7bc67 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -12,6 +12,7 @@ using Content.Shared.Movement.Events; using Content.Shared.StepTrigger.Components; using Content.Shared.Tag; +using Content.Shared.Traits.Assorted.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Configuration; @@ -261,9 +262,17 @@ protected void HandleMobMovement( TryGetSound(weightless, uid, mover, mobMover, xform, out var sound, tileDef: tileDef)) { var soundModifier = mover.Sprinting ? 3.5f : 1.5f; + var volume = sound.Params.Volume + soundModifier; + + if (_entities.TryGetComponent(uid, out FootstepVolumeModifierComponent? volumeModifier)) + { + volume += mover.Sprinting + ? volumeModifier.SprintVolumeModifier + : volumeModifier.WalkVolumeModifier; + } var audioParams = sound.Params - .WithVolume(sound.Params.Volume + soundModifier) + .WithVolume(volume) .WithVariation(sound.Params.Variation ?? FootstepVariation); // If we're a relay target then predict the sound for all relays. diff --git a/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs new file mode 100644 index 00000000000..8c7e763692c --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/FootstepVolumeModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies footstep volumes. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class FootstepVolumeModifierComponent : Component +{ + /// + /// What to add to the volume of sprinting, in terms of decibels. + /// + [DataField, AutoNetworkedField] + public float SprintVolumeModifier; + + /// + /// What to add to the volume of walking, in terms of decibels. + /// + [DataField, AutoNetworkedField] + public float WalkVolumeModifier; +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 7e52e306685..e8d007542fa 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -60,3 +60,7 @@ trait-name-Voracious = Voracious trait-description-Voracious = Nothing gets between you and your food. Your endless consumption of food and drinks is twice as fast. + +trait-name-LightStep = Light Step +trait-description-LightStep = + You move with a gentle step, making your footsteps quieter. diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 6350cdc3c23..51eeadfcada 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -40,3 +40,17 @@ - type: ConsumeDelayModifier foodDelayMultiplier: 0.5 drinkDelayMultiplier: 0.5 + +- type: trait + id: LightStep + category: Auditory + points: -1 + components: + - type: FootstepVolumeModifier + sprintVolumeModifier: -10 + walkVolumeModifier: -10 + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Felinid From 27c2c35d437ad9323f789bb345226093f2773836 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 5 Aug 2024 15:29:30 +0000 Subject: [PATCH 071/143] Automatic Changelog Update (#658) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8143bcdb938..39b94e7aaca 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4894,3 +4894,11 @@ Entries: message: Rename the trait "Heavyweight Drunk" into "Alcohol Tolerance". id: 6212 time: '2024-08-05T03:30:41.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Light Step trait, a 1-point trait that makes your footsteps + quieter. + id: 6213 + time: '2024-08-05T15:29:07.0000000+00:00' From 17aca3c851ddad88e812b7002dd3f222de6d6796 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Tue, 6 Aug 2024 00:55:31 +0800 Subject: [PATCH 072/143] New Trait: Sign Language (#677) # Description **Sign Language** is a 1-point Visual trait that allows you to use Galactic Sign Language. ## Media ![image](https://github.com/user-attachments/assets/ef9a3ed0-6157-4604-9db4-d7114595195b) ![image](https://github.com/user-attachments/assets/805b4a8f-a2d3-469c-b4ab-e46c787a55b6) # Changelog :cl: Skubman - add: Add a new 1-point trait called Sign Language, a trait that allows you to communicate in Galactic Sign Language. --------- Signed-off-by: Angelo Fallaria --- .../LanguageKnowledgeModifierComponent.cs | 23 ++++++++++++ .../LanguageKnowledgeModifierSystem.cs | 35 +++++++++++++++++++ Resources/Locale/en-US/language/languages.ftl | 6 ++-- Resources/Locale/en-US/traits/traits.ftl | 5 +++ Resources/Prototypes/Traits/skills.yml | 11 ++++++ 5 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs create mode 100644 Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs diff --git a/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs new file mode 100644 index 00000000000..170dae40fa6 --- /dev/null +++ b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Language; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; + +namespace Content.Server.Traits.Assorted; + +/// +/// Used for traits that modify entities' language knowledge. +/// +[RegisterComponent] +public sealed partial class LanguageKnowledgeModifierComponent : Component +{ + /// + /// List of languages this entity will learn to speak. + /// + [DataField("speaks")] + public List NewSpokenLanguages = new(); + + /// + /// List of languages this entity will learn to understand. + /// + [DataField("understands")] + public List NewUnderstoodLanguages = new(); +} diff --git a/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs new file mode 100644 index 00000000000..9053c9404fe --- /dev/null +++ b/Content.Server/Traits/Assorted/LanguageKnowledgeModifierSystem.cs @@ -0,0 +1,35 @@ +using System.Linq; +using Content.Server.Language; +using Content.Shared.Language.Components; + +namespace Content.Server.Traits.Assorted; + +public sealed class LanguageKnowledgeModifierSystem : EntitySystem +{ + [Dependency] private readonly LanguageSystem _languages = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(Entity entity, ref ComponentInit args) + { + if (!TryComp(entity, out var knowledge)) + { + Log.Warning($"Entity {entity.Owner} does not have a LanguageKnowledge but has a LanguageKnowledgeModifier!"); + return; + } + + foreach (var spokenLanguage in entity.Comp.NewSpokenLanguages) + { + _languages.AddLanguage(entity, spokenLanguage, true, false, knowledge); + } + + foreach (var understoodLanguage in entity.Comp.NewUnderstoodLanguages) + { + _languages.AddLanguage(entity, understoodLanguage, false, true, knowledge); + } + } +} diff --git a/Resources/Locale/en-US/language/languages.ftl b/Resources/Locale/en-US/language/languages.ftl index 14d477b7840..4b0c1248f28 100644 --- a/Resources/Locale/en-US/language/languages.ftl +++ b/Resources/Locale/en-US/language/languages.ftl @@ -28,6 +28,9 @@ language-Moffic-description = The language of the mothpeople borders on complete language-RobotTalk-name = RobotTalk language-RobotTalk-description = A language consisting of harsh binary chirps, whistles, hisses, and whines. Organic tongues cannot speak it without aid from special translators. +language-Sign-name = Galactic Sign Language +language-Sign-description = GSL for short, this sign language is prevalent among mute and deaf people. + language-Cat-name = Cat language-Cat-description = Meow @@ -72,6 +75,3 @@ language-Kobold-description = Hiss! language-Hissing-name = Hissing language-Hissing-description = Hiss! - -language-Sign-name = Sign Language -language-Sign-description = The standard Galactic sign language, used by those that are unable to speak Galactic Common or at all. diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index e8d007542fa..600a9834fd4 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -56,6 +56,11 @@ trait-description-Foreigner = For one reason or another you do not speak this station's primary language. Instead, you have a translator issued to you that only you can use. +trait-name-SignLanguage = Sign Language +trait-description-SignLanguage = + You can understand and use Galactic Sign Language (GSL). + If you are mute for any reason, you can still communicate with sign language. + trait-name-Voracious = Voracious trait-description-Voracious = Nothing gets between you and your food. diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 51eeadfcada..16b628a56d8 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -32,6 +32,17 @@ species: - Felinid +- type: trait + id: SignLanguage + category: Visual + points: -1 + components: + - type: LanguageKnowledgeModifier + speaks: + - Sign + understands: + - Sign + - type: trait id: Voracious category: Physical From 1bd9cd845b63b0caad0312710e542dafdcb6c396 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 5 Aug 2024 16:55:54 +0000 Subject: [PATCH 073/143] Automatic Changelog Update (#677) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 39b94e7aaca..b5263f12b7a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4902,3 +4902,11 @@ Entries: quieter. id: 6213 time: '2024-08-05T15:29:07.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add a new 1-point trait called Sign Language, a trait that allows you to + communicate in Galactic Sign Language. + id: 6214 + time: '2024-08-05T16:55:31.0000000+00:00' From c976bfa40c8b2ade3a38abe8c7ba4b06de3bc102 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Mon, 5 Aug 2024 20:10:42 +0300 Subject: [PATCH 074/143] Oracle Refactor (#549) # Description Refactors the oracle system and component, making them more customizable and less trash. - Most of the nyano shitcode was rewritten in accordance with the new standards and in a less hardcoded manner (all features were preserved, with some changes). - Replaced the accumulator field pattern with the "nextX" pattern for things oracle does on certain intervals. - Removed some code duplication and bloat. - Gave oracle a 75% chance to request technology and 25% to request a plant. - When requesting a technology, oracle will only request what's either already researched, or can be researched soon (that is, the prerequisites of the research are complete and the research isn't locked for any reason). - If there's no research server at the moment when oracle demands an item, it will only demand a plant - When dispensing rewards, oracle can now spawn 1, 3, or 5 crystals at once, and research disks worth 5k, 10k, and 20k research points. Each one of those have different probabilities (3 crystals and 5k points still prevail, but occasionally you can get the more expensive rewards). - When dispensing rewards, oracle now throws them at the person who fulfilled the request instead of simply spawning them at their feet. Almost every oracle thing (except for throwing and the amount of liquid dispensed) can now be configured in the yaml prototype of the oracle. # TODO Forget it

Media

https://github.com/user-attachments/assets/9d4be44f-37d5-4072-a6e6-f194764f7ff6 ![image](https://github.com/user-attachments/assets/011761d4-8d73-4d65-ba9c-92b25a28e95f)

--- # Changelog :cl: - tweak: Oracle requests are now more likely to be aligned with the current research. --- .../Tests/Nyanotrasen/Oracle/OracleTest.cs | 72 ----- .../Research/Oracle/OracleComponent.cs | 87 ------ .../Research/Oracle/OracleSystem.cs | 258 ---------------- .../Research/Oracle/OracleComponent.cs | 73 +++++ .../Research/Oracle/OracleSystem.cs | 288 ++++++++++++++++++ .../Entities/Objects/Materials/bluespace.yml | 56 ++++ .../Objects/Specific/Research/disk.yml | 9 + .../Structures/Specific}/oracle.yml | 44 ++- .../Entities/Objects/Materials/materials.yml | 44 --- .../{Nyanotrasen => }/Reagents/psionic.yml | 0 10 files changed, 469 insertions(+), 462 deletions(-) delete mode 100644 Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs delete mode 100644 Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs delete mode 100644 Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs create mode 100644 Content.Server/Research/Oracle/OracleComponent.cs create mode 100644 Content.Server/Research/Oracle/OracleSystem.cs create mode 100644 Resources/Prototypes/Entities/Objects/Materials/bluespace.yml rename Resources/Prototypes/{Nyanotrasen/Entities/Structures/Research => Entities/Structures/Specific}/oracle.yml (55%) rename Resources/Prototypes/{Nyanotrasen => }/Reagents/psionic.yml (100%) diff --git a/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs b/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs deleted file mode 100644 index c925db3ba21..00000000000 --- a/Content.IntegrationTests/Tests/Nyanotrasen/Oracle/OracleTest.cs +++ /dev/null @@ -1,72 +0,0 @@ -#nullable enable -using NUnit.Framework; -using System.Threading.Tasks; -using Content.Shared.Item; -using Content.Shared.Mobs.Components; -using Content.Server.Research.Oracle; -using Content.Shared.Chemistry.Components; -using Robust.Shared.GameObjects; -using Robust.Shared.Map; -using Robust.Shared.Prototypes; - - -/// -/// The oracle's request pool is huge. -/// We need to test everything that the oracle could request can be turned in. -/// -namespace Content.IntegrationTests.Tests.Oracle -{ - [TestFixture] - [TestOf(typeof(OracleSystem))] - public sealed class OracleTest - { - [Test] - public async Task AllOracleItemsCanBeTurnedIn() - { - await using var pairTracker = await PoolManager.GetServerClient(); - var server = pairTracker.Server; - // Per RobustIntegrationTest.cs, wait until state is settled to access it. - await server.WaitIdleAsync(); - - var mapManager = server.ResolveDependency(); - var prototypeManager = server.ResolveDependency(); - var entityManager = server.ResolveDependency(); - var entitySystemManager = server.ResolveDependency(); - - var oracleSystem = entitySystemManager.GetEntitySystem(); - var oracleComponent = new OracleComponent(); - - var testMap = await pairTracker.CreateTestMap(); - - await server.WaitAssertion(() => - { - var allProtos = oracleSystem.GetAllProtos(oracleComponent); - var coordinates = testMap.GridCoords; - - Assert.That((allProtos.Count > 0), "Oracle has no valid prototypes!"); - - foreach (var proto in allProtos) - { - var spawned = entityManager.SpawnEntity(proto, coordinates); - - Assert.That(entityManager.HasComponent(spawned), - $"Oracle can request non-item {proto}"); - - Assert.That(!entityManager.HasComponent(spawned), - $"Oracle can request reagent container {proto} that will conflict with the fountain"); - - Assert.That(!entityManager.HasComponent(spawned), - $"Oracle can request mob {proto} that could potentially have a player-set name."); - } - - // Because Server/Client pairs can be re-used between Tests, we - // need to clean up anything that might affect other tests, - // otherwise this pair cannot be considered clean, and the - // CleanReturnAsync call would need to be removed. - mapManager.DeleteMap(testMap.MapId); - }); - - await pairTracker.CleanReturnAsync(); - } - } -} diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs deleted file mode 100644 index e238d5c7a18..00000000000 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleComponent.cs +++ /dev/null @@ -1,87 +0,0 @@ -using Content.Shared.Chemistry.Reagent; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.Research.Oracle; - -[RegisterComponent] -public sealed partial class OracleComponent : Component -{ - public const string SolutionName = "fountain"; - - [ViewVariables] - [DataField("accumulator")] - public float Accumulator; - - [ViewVariables] - [DataField("resetTime")] - public TimeSpan ResetTime = TimeSpan.FromMinutes(10); - - [DataField("barkAccumulator")] - public float BarkAccumulator; - - [DataField("barkTime")] - public TimeSpan BarkTime = TimeSpan.FromMinutes(1); - - [DataField("rejectAccumulator")] - public float RejectAccumulator; - - [DataField("rejectTime")] - public TimeSpan RejectTime = TimeSpan.FromSeconds(5); - - [ViewVariables(VVAccess.ReadWrite)] - public EntityPrototype DesiredPrototype = default!; - - [ViewVariables(VVAccess.ReadWrite)] - public EntityPrototype? LastDesiredPrototype = default!; - - [DataField("rewardReagents", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public IReadOnlyList RewardReagents = new[] - { - "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "LotophagoiOil", "Wine", "Blood", "Ichor" - }; - - [DataField("demandMessages")] - public IReadOnlyList DemandMessages = new[] - { - "oracle-demand-1", - "oracle-demand-2", - "oracle-demand-3", - "oracle-demand-4", - "oracle-demand-5", - "oracle-demand-6", - "oracle-demand-7", - "oracle-demand-8", - "oracle-demand-9", - "oracle-demand-10", - "oracle-demand-11", - "oracle-demand-12" - }; - - [DataField("rejectMessages")] - public IReadOnlyList RejectMessages = new[] - { - "ἄγνοια", - "υλικό", - "ἀγνωσία", - "γήινος", - "σάκλας" - }; - - [DataField("blacklistedPrototypes")] - [ViewVariables(VVAccess.ReadOnly)] - public IReadOnlyList BlacklistedPrototypes = new[] - { - "Drone", - "QSI", - "HandTeleporter", - "BluespaceBeaker", - "ClothingBackpackHolding", - "ClothingBackpackSatchelHolding", - "ClothingBackpackDuffelHolding", - "TrashBagOfHolding", - "BluespaceCrystal", - "InsulativeHeadcage", - "CrystalNormality", - }; -} diff --git a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs b/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs deleted file mode 100644 index 148598fe2c3..00000000000 --- a/Content.Server/Nyanotrasen/Research/Oracle/OracleSystem.cs +++ /dev/null @@ -1,258 +0,0 @@ -using System.Linq; -using Content.Server.Botany; -using Content.Server.Chat.Managers; -using Content.Server.Chat.Systems; -using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Fluids.EntitySystems; -using Content.Server.Psionics; -using Content.Shared.Abilities.Psionics; -using Content.Shared.Chat; -using Content.Shared.Chemistry.Components; -using Content.Shared.Chemistry.EntitySystems; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.Interaction; -using Content.Shared.Mobs.Components; -using Content.Shared.Psionics.Glimmer; -using Content.Shared.Research.Prototypes; -using Robust.Server.GameObjects; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Random; - -namespace Content.Server.Research.Oracle; - -public sealed class OracleSystem : EntitySystem -{ - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly ChatSystem _chat = default!; - [Dependency] private readonly IChatManager _chatManager = default!; - [Dependency] private readonly SolutionContainerSystem _solutionSystem = default!; - [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly PuddleSystem _puddleSystem = default!; - - public override void Update(float frameTime) - { - base.Update(frameTime); - foreach (var oracle in EntityQuery()) - { - oracle.Accumulator += frameTime; - oracle.BarkAccumulator += frameTime; - oracle.RejectAccumulator += frameTime; - if (oracle.BarkAccumulator >= oracle.BarkTime.TotalSeconds) - { - oracle.BarkAccumulator = 0; - var message = Loc.GetString(_random.Pick(oracle.DemandMessages), ("item", oracle.DesiredPrototype.Name)) - .ToUpper(); - _chat.TrySendInGameICMessage(oracle.Owner, message, InGameICChatType.Speak, false); - } - - if (oracle.Accumulator >= oracle.ResetTime.TotalSeconds) - { - oracle.LastDesiredPrototype = oracle.DesiredPrototype; - NextItem(oracle); - } - } - } - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnInteractHand); - SubscribeLocalEvent(OnInteractUsing); - } - - private void OnInit(EntityUid uid, OracleComponent component, ComponentInit args) - { - NextItem(component); - } - - private void OnInteractHand(EntityUid uid, OracleComponent component, InteractHandEvent args) - { - if (!HasComp(args.User) || HasComp(args.User)) - return; - - if (!TryComp(args.User, out var actor)) - return; - - var message = Loc.GetString("oracle-current-item", ("item", component.DesiredPrototype.Name)); - - var messageWrap = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", - ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), ("message", message)); - - _chatManager.ChatMessageToOne(ChatChannel.Telepathic, - message, messageWrap, uid, false, actor.PlayerSession.ConnectedClient, Color.PaleVioletRed); - - if (component.LastDesiredPrototype != null) - { - var message2 = Loc.GetString("oracle-previous-item", ("item", component.LastDesiredPrototype.Name)); - var messageWrap2 = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", - ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), - ("message", message2)); - - _chatManager.ChatMessageToOne(ChatChannel.Telepathic, - message2, messageWrap2, uid, false, actor.PlayerSession.ConnectedClient, Color.PaleVioletRed); - } - } - - private void OnInteractUsing(EntityUid uid, OracleComponent component, InteractUsingEvent args) - { - if (HasComp(args.Used)) - return; - - if (!TryComp(args.Used, out var meta)) - return; - - if (meta.EntityPrototype == null) - return; - - var validItem = CheckValidity(meta.EntityPrototype, component.DesiredPrototype); - - var nextItem = true; - - if (component.LastDesiredPrototype != null && - CheckValidity(meta.EntityPrototype, component.LastDesiredPrototype)) - { - nextItem = false; - validItem = true; - component.LastDesiredPrototype = null; - } - - if (!validItem) - { - if (!HasComp(args.Used) && - component.RejectAccumulator >= component.RejectTime.TotalSeconds) - { - component.RejectAccumulator = 0; - _chat.TrySendInGameICMessage(uid, _random.Pick(component.RejectMessages), InGameICChatType.Speak, true); - } - return; - } - - EntityManager.QueueDeleteEntity(args.Used); - - EntityManager.SpawnEntity("ResearchDisk5000", Transform(args.User).Coordinates); - - DispenseLiquidReward(uid, component); - - var i = _random.Next(1, 4); - - while (i != 0) - { - EntityManager.SpawnEntity("MaterialBluespace1", Transform(args.User).Coordinates); - i--; - } - - if (nextItem) - NextItem(component); - } - - private bool CheckValidity(EntityPrototype given, EntityPrototype target) - { - // 1: directly compare Names - // name instead of ID because the oracle asks for them by name - // this could potentially lead to like, labeller exploits maybe but so far only mob names can be fully player-set. - if (given.Name == target.Name) - return true; - - return false; - } - - private void DispenseLiquidReward(EntityUid uid, OracleComponent component) - { - if (!_solutionSystem.TryGetSolution(uid, OracleComponent.SolutionName, out var fountainSol)) - return; - - var allReagents = _prototypeManager.EnumeratePrototypes() - .Where(x => !x.Abstract) - .Select(x => x.ID).ToList(); - - var amount = 20 + _random.Next(1, 30) + _glimmerSystem.Glimmer / 10f; - amount = (float) Math.Round(amount); - - var sol = new Solution(); - var reagent = ""; - - if (_random.Prob(0.2f)) - reagent = _random.Pick(allReagents); - else - reagent = _random.Pick(component.RewardReagents); - - sol.AddReagent(reagent, amount); - - _solutionSystem.TryMixAndOverflow(fountainSol.Value, sol, fountainSol.Value.Comp.Solution.MaxVolume, out var overflowing); - - if (overflowing != null && overflowing.Volume > 0) - _puddleSystem.TrySpillAt(uid, overflowing, out var _); - } - - private void NextItem(OracleComponent component) - { - component.Accumulator = 0; - component.BarkAccumulator = 0; - component.RejectAccumulator = 0; - var protoString = GetDesiredItem(component); - if (_prototypeManager.TryIndex(protoString, out var proto)) - component.DesiredPrototype = proto; - else - Logger.Error("Oracle can't index prototype " + protoString); - } - - private string GetDesiredItem(OracleComponent component) - { - return _random.Pick(GetAllProtos(component)); - } - - - public List GetAllProtos(OracleComponent component) - { - var allTechs = _prototypeManager.EnumeratePrototypes(); - var allRecipes = new List(); - - foreach (var tech in allTechs) - { - foreach (var recipe in tech.RecipeUnlocks) - { - var recipeProto = _prototypeManager.Index(recipe); - allRecipes.Add(recipeProto.Result); - } - } - - var allPlants = _prototypeManager.EnumeratePrototypes().Select(x => x.ProductPrototypes[0]) - .ToList(); - var allProtos = allRecipes.Concat(allPlants).ToList(); - var blacklist = component.BlacklistedPrototypes.ToList(); - - foreach (var proto in allProtos) - { - if (!_prototypeManager.TryIndex(proto, out var entityProto)) - { - blacklist.Add(proto); - continue; - } - - if (!entityProto.Components.ContainsKey("Item")) - { - blacklist.Add(proto); - continue; - } - - if (entityProto.Components.ContainsKey("SolutionTransfer")) - { - blacklist.Add(proto); - continue; - } - - if (entityProto.Components.ContainsKey("MobState")) - blacklist.Add(proto); - } - - foreach (var proto in blacklist) - { - allProtos.Remove(proto); - } - - return allProtos; - } -} diff --git a/Content.Server/Research/Oracle/OracleComponent.cs b/Content.Server/Research/Oracle/OracleComponent.cs new file mode 100644 index 00000000000..6196ce95060 --- /dev/null +++ b/Content.Server/Research/Oracle/OracleComponent.cs @@ -0,0 +1,73 @@ +using Content.Shared.Random; +using Robust.Shared.Prototypes; + +namespace Content.Server.Research.Oracle; + +[RegisterComponent] +public sealed partial class OracleComponent : Component +{ + public const string SolutionName = "fountain"; + + [DataField(required: true)] + public ProtoId DemandTypes; + + [DataField] + public List> BlacklistedDemands = new(); + + [DataField(required: true)] + public List> RewardEntities; + + [DataField(required: true)] + public ProtoId RewardReagents; + + /// + /// The chance to dispense a completely random chemical instead of what's listed in + /// + [DataField] + public float AbnormalReagentChance = 0.2f; + + [DataField] + public TimeSpan + NextDemandTime = TimeSpan.Zero, + NextBarkTime = TimeSpan.Zero, + NextRejectTime = TimeSpan.Zero; + + [DataField] + public TimeSpan + DemandDelay = TimeSpan.FromMinutes(10), + BarkDelay = TimeSpan.FromMinutes(2), + RejectDelay = TimeSpan.FromSeconds(10); + + [ViewVariables(VVAccess.ReadWrite)] + public EntityPrototype DesiredPrototype = default!; + + [ViewVariables(VVAccess.ReadWrite)] + public EntityPrototype? LastDesiredPrototype = default!; + + [DataField("demandMessages")] + public IReadOnlyList DemandMessages = new[] + { + "oracle-demand-1", + "oracle-demand-2", + "oracle-demand-3", + "oracle-demand-4", + "oracle-demand-5", + "oracle-demand-6", + "oracle-demand-7", + "oracle-demand-8", + "oracle-demand-9", + "oracle-demand-10", + "oracle-demand-11", + "oracle-demand-12" + }; + + [DataField("rejectMessages")] + public IReadOnlyList RejectMessages = new[] + { + "ἄγνοια", + "υλικό", + "ἀγνωσία", + "γήινος", + "σάκλας" + }; +} diff --git a/Content.Server/Research/Oracle/OracleSystem.cs b/Content.Server/Research/Oracle/OracleSystem.cs new file mode 100644 index 00000000000..63dcefbadd7 --- /dev/null +++ b/Content.Server/Research/Oracle/OracleSystem.cs @@ -0,0 +1,288 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using Content.Server.Botany; +using Content.Server.Chat.Managers; +using Content.Server.Chat.Systems; +using Content.Server.Chemistry.Containers.EntitySystems; +using Content.Server.Fluids.EntitySystems; +using Content.Server.Psionics; +using Content.Server.Research.Systems; +using Content.Shared.Abilities.Psionics; +using Content.Shared.Chat; +using Content.Shared.Chemistry.Components; +using Content.Shared.Chemistry.Reagent; +using Content.Shared.Interaction; +using Content.Shared.Mobs.Components; +using Content.Shared.Psionics.Glimmer; +using Content.Shared.Random.Helpers; +using Content.Shared.Research.Components; +using Content.Shared.Research.Prototypes; +using Content.Shared.Throwing; +using Robust.Shared.Map; +using Robust.Shared.Network; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Research.Oracle; + +public sealed class OracleSystem : EntitySystem +{ + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly IChatManager _chatMan = default!; + [Dependency] private readonly GlimmerSystem _glimmer = default!; + [Dependency] private readonly IPrototypeManager _protoMan = default!; + [Dependency] private readonly PuddleSystem _puddles = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ResearchSystem _research = default!; + [Dependency] private readonly SolutionContainerSystem _solutions = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + if (_timing.CurTime >= comp.NextDemandTime) + { + // Might be null if this is the first tick. In that case this will simply initialize it. + var last = (EntityPrototype?) comp.DesiredPrototype; + if (NextItem((uid, comp))) + comp.LastDesiredPrototype = last; + } + + if (_timing.CurTime >= comp.NextBarkTime) + { + comp.NextBarkTime = _timing.CurTime + comp.BarkDelay; + + var message = Loc.GetString(_random.Pick(comp.DemandMessages), ("item", comp.DesiredPrototype.Name)).ToUpper(); + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, false); + } + } + + query.Dispose(); + } + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInteractHand); + SubscribeLocalEvent(OnInteractUsing); + } + + private void OnInteractHand(Entity oracle, ref InteractHandEvent args) + { + if (!HasComp(args.User) || HasComp(args.User) + || !TryComp(args.User, out var actor)) + return; + + SendTelepathicInfo(oracle, actor.PlayerSession.Channel, + Loc.GetString("oracle-current-item", ("item", oracle.Comp.DesiredPrototype.Name))); + + if (oracle.Comp.LastDesiredPrototype != null) + SendTelepathicInfo(oracle, actor.PlayerSession.Channel, + Loc.GetString("oracle-previous-item", ("item", oracle.Comp.LastDesiredPrototype.Name))); + } + + private void OnInteractUsing(Entity oracle, ref InteractUsingEvent args) + { + if (args.Handled) + return; + + if (HasComp(args.Used) || !TryComp(args.Used, out var meta) || meta.EntityPrototype == null) + return; + + var requestValid = IsCorrectItem(meta.EntityPrototype, oracle.Comp.DesiredPrototype); + var updateRequest = true; + + if (oracle.Comp.LastDesiredPrototype != null && + IsCorrectItem(meta.EntityPrototype, oracle.Comp.LastDesiredPrototype)) + { + updateRequest = false; + requestValid = true; + oracle.Comp.LastDesiredPrototype = null; + } + + if (!requestValid) + { + if (!HasComp(args.Used) && + _timing.CurTime >= oracle.Comp.NextRejectTime) + { + oracle.Comp.NextRejectTime = _timing.CurTime + oracle.Comp.RejectDelay; + _chat.TrySendInGameICMessage(oracle, _random.Pick(oracle.Comp.RejectMessages), InGameICChatType.Speak, true); + } + + return; + } + + DispenseRewards(oracle, Transform(args.User).Coordinates); + QueueDel(args.Used); + + if (updateRequest) + NextItem(oracle); + } + + private void SendTelepathicInfo(Entity oracle, INetChannel client, string message) + { + var messageWrap = Loc.GetString("chat-manager-send-telepathic-chat-wrap-message", + ("telepathicChannelName", Loc.GetString("chat-manager-telepathic-channel-name")), + ("message", message)); + + _chatMan.ChatMessageToOne(ChatChannel.Telepathic, + message, messageWrap, oracle, false, client, Color.PaleVioletRed); + } + + private bool IsCorrectItem(EntityPrototype given, EntityPrototype target) + { + // Nyano, what is this shit? + // Why are we comparing by name instead of prototype id? + // Why is this ever necessary? + // What were you trying to accomplish?! + if (given.Name == target.Name) + return true; + + return false; + } + + private void DispenseRewards(Entity oracle, EntityCoordinates throwTarget) + { + foreach (var rewardRandom in oracle.Comp.RewardEntities) + { + // Spawn each reward next to oracle and throw towards the target + var rewardProto = _protoMan.Index(rewardRandom).Pick(_random); + var reward = EntityManager.SpawnNextToOrDrop(rewardProto, oracle); + _throwing.TryThrow(reward, throwTarget, recoil: false); + } + + DispenseLiquidReward(oracle); + } + + private void DispenseLiquidReward(Entity oracle) + { + if (!_solutions.TryGetSolution(oracle.Owner, OracleComponent.SolutionName, out var fountainSol)) + return; + + // Why is this hardcoded? + var amount = MathF.Round(20 + _random.Next(1, 30) + _glimmer.Glimmer / 10f); + var temporarySol = new Solution(); + var reagent = _protoMan.Index(oracle.Comp.RewardReagents).Pick(_random); + + if (_random.Prob(oracle.Comp.AbnormalReagentChance)) + { + var allReagents = _protoMan.EnumeratePrototypes() + .Where(x => !x.Abstract) + .Select(x => x.ID).ToList(); + + reagent = _random.Pick(allReagents); + } + + temporarySol.AddReagent(reagent, amount); + _solutions.TryMixAndOverflow(fountainSol.Value, temporarySol, fountainSol.Value.Comp.Solution.MaxVolume, out var overflowing); + + if (overflowing != null && overflowing.Volume > 0) + _puddles.TrySpillAt(oracle, overflowing, out var _); + } + + private bool NextItem(Entity oracle) + { + oracle.Comp.NextBarkTime = oracle.Comp.NextRejectTime = TimeSpan.Zero; + oracle.Comp.NextDemandTime = _timing.CurTime + oracle.Comp.DemandDelay; + + var protoId = GetDesiredItem(oracle); + if (protoId != null && _protoMan.TryIndex(protoId, out var proto)) + { + oracle.Comp.DesiredPrototype = proto; + return true; + } + + return false; + } + + // TODO: find a way to not just use string literals here (weighted random doesn't support enums) + private string? GetDesiredItem(Entity oracle) + { + var demand = _protoMan.Index(oracle.Comp.DemandTypes).Pick(_random); + + string? proto; + if (demand == "tech" && GetRandomTechProto(oracle, out proto)) + return proto; + + // This is also a fallback for when there's no research server to form an oracle tech request. + if (demand is "plant" or "tech" && GetRandomPlantProto(oracle, out proto)) + return proto; + + return null; + } + + private bool GetRandomTechProto(Entity oracle, [NotNullWhen(true)] out string? proto) + { + // Try to find the most advanced server. + var database = _research.GetServerIds() + .Select(x => _research.TryGetServerById(x, out var serverUid, out _) ? serverUid : null) + .Where(x => x != null && Transform(x.Value).GridUid == Transform(oracle).GridUid) + .Select(x => + { + TryComp(x!.Value, out var comp); + return new Entity(x.Value, comp); + }) + .Where(x => x.Comp != null) + .OrderByDescending(x => + _research.GetDisciplineTiers(x.Comp!).Select(pair => pair.Value).Max()) + .FirstOrDefault(EntityUid.Invalid); + + if (database.Owner == EntityUid.Invalid) + { + Log.Warning($"Cannot find an applicable server on grid {Transform(oracle).GridUid} to form an oracle request."); + proto = null; + return false; + } + + // Select a technology that's either already unlocked, or can be unlocked from current research + var techs = _protoMan.EnumeratePrototypes() + .Where(x => !x.Hidden) + .Where(x => + _research.IsTechnologyUnlocked(database.Owner, x, database.Comp) + || _research.IsTechnologyAvailable(database.Comp!, x)) + .SelectMany(x => x.RecipeUnlocks) + .Select(x => _protoMan.Index(x).Result) + .Where(x => IsDemandValid(oracle, x)) + .ToList(); + + // Unlikely. + if (techs.Count == 0) + { + proto = null; + return false; + } + + proto = _random.Pick(techs); + return true; + } + + private bool GetRandomPlantProto(Entity oracle, [NotNullWhen(true)] out string? proto) + { + var allPlants = _protoMan.EnumeratePrototypes() + .Select(x => x.ProductPrototypes.FirstOrDefault()) + .Where(x => IsDemandValid(oracle, x)) + .ToList(); + + if (allPlants.Count == 0) + { + proto = null; + return false; + } + + proto = _random.Pick(allPlants)!; + return true; + } + + private bool IsDemandValid(Entity oracle, ProtoId? id) + { + if (id == null || oracle.Comp.BlacklistedDemands.Contains(id.Value)) + return false; + + return _protoMan.TryIndex(id, out var proto) && proto.Components.ContainsKey("Item"); + } +} diff --git a/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml new file mode 100644 index 00000000000..f93534ecd5c --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Materials/bluespace.yml @@ -0,0 +1,56 @@ +- type: entity + parent: MaterialBase + id: MaterialBluespace + suffix: Full + name: bluespace crystal + components: + - type: Sprite + sprite: Nyanotrasen/Objects/Materials/materials.rsi + layers: + - state: bluespace_3 + map: ["base"] + - type: Appearance + - type: Material + - type: PhysicalComposition + materialComposition: + Bluespace: 100 + - type: Tag + tags: + - BluespaceCrystal + - RawMaterial + - type: Stack + stackType: Bluespace + baseLayer: base + layerStates: + - bluespace + - bluespace_2 + - bluespace_3 + count: 5 + - type: Item + size: Small + +- type: entity + parent: MaterialBluespace + id: MaterialBluespace1 + suffix: 1 + components: + - type: Sprite + state: bluespace + - type: Stack + count: 1 + +- type: entity + parent: MaterialBluespace1 + id: MaterialBluespace3 + suffix: 3 + components: + - type: Stack + count: 3 + +- type: entity + parent: MaterialBluespace1 + id: MaterialBluespace5 + suffix: 5 + components: + - type: Stack + count: 5 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml index fa1b75530b6..862716c5123 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml @@ -36,6 +36,15 @@ - type: ResearchDisk points: 10000 +- type: entity + parent: ResearchDisk + id: ResearchDisk20000 + name: research point disk (20000) + description: A disk for the R&D server containing 20000 points. + components: + - type: ResearchDisk + points: 20000 + - type: entity parent: ResearchDisk id: ResearchDiskDebug diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml similarity index 55% rename from Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml rename to Resources/Prototypes/Entities/Structures/Specific/oracle.yml index f7481abf1ed..51a25bffcdc 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/oracle.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/oracle.yml @@ -13,7 +13,6 @@ - state: oracle-0 - map: ["enum.SolutionContainerLayers.Fill"] state: oracle-0 - - type: Oracle - type: Speech speechSounds: Tenor - type: Psionic @@ -42,3 +41,46 @@ - type: SpriteFade - type: Tag tags: [] + - type: Oracle + demandTypes: OracleDemandTypes + rewardReagents: OracleRewardReagents + rewardEntities: + - OracleRewardDisks + - OracleRewardCrystals + demandBlacklist: + tags: + - Bluespace + components: + - MobState + demandWhitelist: + components: + - Item + + +- type: weightedRandomEntity + id: OracleRewardDisks + weights: + ResearchDisk5000: 20 + ResearchDisk10000: 5 + ResearchDisk20000: 1 + +- type: weightedRandomEntity + id: OracleRewardCrystals + weights: + MaterialBluespace1: 3 + MaterialBluespace3: 10 + MaterialBluespace5: 2 + +- type: weightedRandom + id: OracleRewardReagents + weights: + LotophagoiOil: 7 + Ichor: 2 + Wine: 1.2 + Blood: 0.8 + +- type: weightedRandom + id: OracleDemandTypes + weights: + tech: 3 + plant: 1 # Plants are very annoying to procure most of the time diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml index 75bb4727da2..5aed17363ba 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Materials/materials.yml @@ -1,47 +1,3 @@ -- type: entity - parent: MaterialBase - id: MaterialBluespace - suffix: Full - name: bluespace crystal - components: - - type: Sprite - sprite: Nyanotrasen/Objects/Materials/materials.rsi - layers: - - state: bluespace_3 - map: ["base"] - - type: Appearance - - type: Material - - type: PhysicalComposition - materialComposition: - Bluespace: 100 - - type: Tag - tags: - - BluespaceCrystal - - RawMaterial - - type: Stack - stackType: Bluespace - baseLayer: base - layerStates: - - bluespace - - bluespace_2 - - bluespace_3 - count: 5 - - type: Item - size: Small - -- type: entity - parent: MaterialBluespace - id: MaterialBluespace1 - suffix: 1 - components: - - type: Sprite - state: bluespace - - type: Stack - stackType: Bluespace - count: 1 - - type: Item - size: Tiny - - type: entity parent: BaseItem id: HideMothroach diff --git a/Resources/Prototypes/Nyanotrasen/Reagents/psionic.yml b/Resources/Prototypes/Reagents/psionic.yml similarity index 100% rename from Resources/Prototypes/Nyanotrasen/Reagents/psionic.yml rename to Resources/Prototypes/Reagents/psionic.yml From 22c979c346cd0745eb98d13498ea758ddde994d5 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 5 Aug 2024 17:11:05 +0000 Subject: [PATCH 075/143] Automatic Changelog Update (#549) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b5263f12b7a..a4018c20b9a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4910,3 +4910,11 @@ Entries: communicate in Galactic Sign Language. id: 6214 time: '2024-08-05T16:55:31.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Tweak + message: >- + Oracle requests are now more likely to be aligned with the current + research. + id: 6215 + time: '2024-08-05T17:10:42.0000000+00:00' From 664f482c33ba17b14603a54028d212b9aa3f098b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 5 Aug 2024 13:11:37 -0400 Subject: [PATCH 076/143] Carrying System Refactor (#580) # Description This is a very simple and apparently minor update to the Carrying System, bringing it up to date with more modern code. The biggest difference is that rather than having a private one-off implementation of one of the original Nyano MassContest functions, it uses the new public Reworked MassContests. With this change, pick up durations no longer infinitely scale with arbitrary mass, meaning that a hypothetical 2000kg Lamia doesn't have an arbitrarily infinitesimal pickup duration when trying to pick up a 10kg Harpy. Carrying is also more strictly limited by mass, rather than by carrying duration, meaning that if a target character is more than 25% heavier than your character, it will not be possible to shoulder them. You'll just have to either drag them, or get a roller bed to move overly massive characters. The last thing I did was just cleanup all of the code, so that has nice, Single-IF exit conditions, rather than 30+ line blocks of IF(THING) RETURN; Oh, and entities can now set their own internal base PickupDuration, so that entities can declare however easy or difficult they should be to pick up! # MEDIA https://github.com/user-attachments/assets/9ee0f1dd-ac75-406f-8bbd-9a130594d46d # Changelog :cl: - tweak: The Carrying system has been reworked as a means of better supporting having extremely large species and characters. 10kg Harpies should no longer be oppressed by 2000kg Lamia with infinitely short carry attempts. --- .../Carrying/BeingCarriedComponent.cs | 0 .../Carrying/CarriableComponent.cs | 9 +- .../Carrying/CarryingComponent.cs | 0 .../Carrying/CarryingSystem.cs | 177 ++++++------------ .../Carrying/CarryingDoAfterEvent.cs | 4 +- .../Carrying/CarryingSlowdownComponent.cs | 4 +- .../Carrying/CarryingSlowdownSystem.cs | 11 +- 7 files changed, 75 insertions(+), 130 deletions(-) rename Content.Server/{Nyanotrasen => }/Carrying/BeingCarriedComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Carrying/CarriableComponent.cs (58%) rename Content.Server/{Nyanotrasen => }/Carrying/CarryingComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Carrying/CarryingSystem.cs (73%) rename Content.Shared/{Nyanotrasen => }/Carrying/CarryingDoAfterEvent.cs (91%) rename Content.Shared/{Nyanotrasen => }/Carrying/CarryingSlowdownComponent.cs (80%) rename Content.Shared/{Nyanotrasen => }/Carrying/CarryingSlowdownSystem.cs (85%) diff --git a/Content.Server/Nyanotrasen/Carrying/BeingCarriedComponent.cs b/Content.Server/Carrying/BeingCarriedComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Carrying/BeingCarriedComponent.cs rename to Content.Server/Carrying/BeingCarriedComponent.cs diff --git a/Content.Server/Nyanotrasen/Carrying/CarriableComponent.cs b/Content.Server/Carrying/CarriableComponent.cs similarity index 58% rename from Content.Server/Nyanotrasen/Carrying/CarriableComponent.cs rename to Content.Server/Carrying/CarriableComponent.cs index f4fd1fa6d56..eb12dbc904e 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarriableComponent.cs +++ b/Content.Server/Carrying/CarriableComponent.cs @@ -9,9 +9,16 @@ public sealed partial class CarriableComponent : Component /// Number of free hands required /// to carry the entity /// - [DataField("freeHandsRequired")] + [DataField] public int FreeHandsRequired = 2; public CancellationTokenSource? CancelToken; + + /// + /// The base duration (In Seconds) of how long it should take to pick up this entity + /// before Contests are considered. + /// + [DataField] + public float PickupDuration = 3; } } diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingComponent.cs b/Content.Server/Carrying/CarryingComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Carrying/CarryingComponent.cs rename to Content.Server/Carrying/CarryingComponent.cs diff --git a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs b/Content.Server/Carrying/CarryingSystem.cs similarity index 73% rename from Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs rename to Content.Server/Carrying/CarryingSystem.cs index ff4c097080c..13338ea2b7b 100644 --- a/Content.Server/Nyanotrasen/Carrying/CarryingSystem.cs +++ b/Content.Server/Carrying/CarryingSystem.cs @@ -1,7 +1,6 @@ using System.Numerics; using System.Threading; using Content.Server.DoAfter; -using Content.Server.Body.Systems; using Content.Server.Resist; using Content.Server.Popups; using Content.Server.Inventory; @@ -14,8 +13,9 @@ using Content.Shared.Stunnable; using Content.Shared.Interaction.Events; using Content.Shared.Verbs; -using Content.Shared.Climbing.Events; // Added this. +using Content.Shared.Climbing.Events; using Content.Shared.Carrying; +using Content.Shared.Contests; using Content.Shared.Movement.Events; using Content.Shared.Movement.Systems; using Content.Shared.Standing; @@ -31,6 +31,7 @@ using Content.Shared.Storage; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; +using Robust.Server.GameObjects; namespace Content.Server.Carrying { @@ -47,6 +48,8 @@ public sealed class CarryingSystem : EntitySystem [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _movementSpeed = default!; [Dependency] private readonly PseudoItemSystem _pseudoItem = default!; + [Dependency] private readonly ContestsSystem _contests = default!; + [Dependency] private readonly TransformSystem _transform = default!; public override void Initialize() { @@ -70,22 +73,11 @@ public override void Initialize() private void AddCarryVerb(EntityUid uid, CarriableComponent component, GetVerbsEvent args) { - if (!args.CanInteract || !args.CanAccess) - return; - - if (!CanCarry(args.User, uid, component)) - return; - - if (HasComp(args.User)) // yeah not dealing with that - return; - - if (HasComp(args.User) || HasComp(args.Target)) - return; - - if (!_mobStateSystem.IsAlive(args.User)) - return; - - if (args.User == args.Target) + if (!args.CanInteract || !args.CanAccess || !_mobStateSystem.IsAlive(args.User) + || !CanCarry(args.User, uid, component) + || HasComp(args.User) + || HasComp(args.User) || HasComp(args.Target) + || args.User == args.Target) return; AlternativeVerb verb = new() @@ -105,13 +97,10 @@ private void AddInsertCarriedVerb(EntityUid uid, CarryingComponent component, Ge // If the person is carrying someone, and the carried person is a pseudo-item, and the target entity is a storage, // then add an action to insert the carried entity into the target var toInsert = args.Using; - if (toInsert is not { Valid: true } || !args.CanAccess || !TryComp(toInsert, out var pseudoItem)) - return; - - if (!TryComp(args.Target, out var storageComp)) - return; - - if (!_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) + if (toInsert is not { Valid: true } || !args.CanAccess + || !TryComp(toInsert, out var pseudoItem) + || !TryComp(args.Target, out var storageComp) + || !_pseudoItem.CheckItemFits((toInsert.Value, pseudoItem), (args.Target, storageComp))) return; InnateVerb verb = new() @@ -142,25 +131,22 @@ private void OnVirtualItemDeleted(EntityUid uid, CarryingComponent component, Vi /// Basically using virtual item passthrough to throw the carried person. A new age! /// Maybe other things besides throwing should use virt items like this... /// - private void OnThrow(EntityUid uid, CarryingComponent component, BeforeThrowEvent args) + private void OnThrow(EntityUid uid, CarryingComponent component, ref BeforeThrowEvent args) { - if (!TryComp(args.ItemUid, out var virtItem) || !HasComp(virtItem.BlockingEntity)) + if (!TryComp(args.ItemUid, out var virtItem) + || !HasComp(virtItem.BlockingEntity)) return; args.ItemUid = virtItem.BlockingEntity; - var multiplier = MassContest(uid, virtItem.BlockingEntity); - args.ThrowStrength = 5f * multiplier; + args.ThrowStrength *= _contests.MassContest(uid, virtItem.BlockingEntity, false, 2f) + * _contests.StaminaContest(uid, virtItem.BlockingEntity); } private void OnParentChanged(EntityUid uid, CarryingComponent component, ref EntParentChangedMessage args) { var xform = Transform(uid); - if (xform.MapID != args.OldMapId) - return; - - // Do not drop the carried entity if the new parent is a grid - if (xform.ParentUid == xform.GridUid) + if (xform.MapID != args.OldMapId || xform.ParentUid == xform.GridUid) return; DropCarried(uid, component.Carried); @@ -190,17 +176,14 @@ private void OnInteractionAttempt(EntityUid uid, BeingCarriedComponent component /// private void OnMoveInput(EntityUid uid, BeingCarriedComponent component, ref MoveInputEvent args) { - if (!TryComp(uid, out var escape)) - return; - - if (!args.HasDirectionalMovement) + if (!TryComp(uid, out var escape) + || !args.HasDirectionalMovement) return; + // Check if the victim is in any way incapacitated, and if not make an escape attempt. + // Escape time scales with the inverse of a mass contest. Being lighter makes escape harder. if (_actionBlockerSystem.CanInteract(uid, component.Carrier)) - { - // Note: the mass contest is inverted because weaker entities are supposed to take longer to escape - _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, MassContest(component.Carrier, uid)); - } + _escapeInventorySystem.AttemptEscape(uid, component.Carrier, escape, _contests.MassContest(uid, component.Carrier, false, 2f)); } private void OnMoveAttempt(EntityUid uid, BeingCarriedComponent component, UpdateCanMoveEvent args) @@ -237,10 +220,8 @@ private void OnBuckleChange(EntityUid uid, BeingCarriedComponent component, ref private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfterEvent args) { component.CancelToken = null; - if (args.Handled || args.Cancelled) - return; - - if (!CanCarry(args.Args.User, uid, component)) + if (args.Handled || args.Cancelled + || !CanCarry(args.Args.User, uid, component)) return; Carry(args.Args.User, uid); @@ -248,16 +229,18 @@ private void OnDoAfter(EntityUid uid, CarriableComponent component, CarryDoAfter } private void StartCarryDoAfter(EntityUid carrier, EntityUid carried, CarriableComponent component) { - TimeSpan length = GetPickupDuration(carrier, carried); - - if (length >= TimeSpan.FromSeconds(9)) + if (!TryComp(carrier, out var carrierPhysics) + || !TryComp(carried, out var carriedPhysics) + || carriedPhysics.Mass > carrierPhysics.Mass * 2f) { _popupSystem.PopupEntity(Loc.GetString("carry-too-heavy"), carried, carrier, Shared.Popups.PopupType.SmallCaution); return; } - if (!HasComp(carried)) - length *= 2f; + var length = TimeSpan.FromSeconds(component.PickupDuration + * _contests.MassContest(carriedPhysics, carrierPhysics, false, 4f) + * _contests.StaminaContest(carrier, carried) + * (_standingState.IsDown(carried) ? 0.5f : 1)); component.CancelToken = new CancellationTokenSource(); @@ -280,10 +263,10 @@ private void Carry(EntityUid carrier, EntityUid carried) if (TryComp(carried, out var pullable)) _pullingSystem.TryStopPull(carried, pullable); - Transform(carrier).AttachToGridOrMap(); - Transform(carried).AttachToGridOrMap(); - Transform(carried).Coordinates = Transform(carrier).Coordinates; - Transform(carried).AttachParent(Transform(carrier)); + _transform.AttachToGridOrMap(carrier); + _transform.AttachToGridOrMap(carried); + _transform.SetCoordinates(carried, Transform(carrier).Coordinates); + _transform.SetParent(carried, carrier); _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); _virtualItemSystem.TrySpawnVirtualItemInHand(carried, carrier); var carryingComp = EnsureComp(carrier); @@ -299,17 +282,13 @@ private void Carry(EntityUid carrier, EntityUid carried) public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? carriedComp = null) { - if (!Resolve(toCarry, ref carriedComp, false)) - return false; - - if (!CanCarry(carrier, toCarry, carriedComp)) - return false; - - // The second one means that carrier is a pseudo-item and is inside a bag. - if (HasComp(carrier) || HasComp(carrier)) - return false; - - if (GetPickupDuration(carrier, toCarry) > TimeSpan.FromSeconds(9)) + if (!Resolve(toCarry, ref carriedComp, false) + || !CanCarry(carrier, toCarry, carriedComp) + || HasComp(carrier) + || HasComp(carrier) + || TryComp(carrier, out var carrierPhysics) + && TryComp(toCarry, out var toCarryPhysics) + && carrierPhysics.Mass < toCarryPhysics.Mass * 2f) return false; Carry(carrier, toCarry); @@ -319,79 +298,41 @@ public bool TryCarry(EntityUid carrier, EntityUid toCarry, CarriableComponent? c public void DropCarried(EntityUid carrier, EntityUid carried) { - RemComp(carrier); // get rid of this first so we don't recusrively fire that event + RemComp(carrier); // get rid of this first so we don't recursively fire that event RemComp(carrier); RemComp(carried); RemComp(carried); _actionBlockerSystem.UpdateCanMove(carried); _virtualItemSystem.DeleteInHandsMatching(carrier, carried); - Transform(carried).AttachToGridOrMap(); + _transform.AttachToGridOrMap(carried); _standingState.Stand(carried); _movementSpeed.RefreshMovementSpeedModifiers(carrier); } private void ApplyCarrySlowdown(EntityUid carrier, EntityUid carried) { - var massRatio = MassContest(carrier, carried); - - if (massRatio == 0) - massRatio = 1; + var massRatio = _contests.MassContest(carrier, carried, true); + var massRatioSq = MathF.Pow(massRatio, 2); + var modifier = 1 - 0.15f / massRatioSq; + modifier = Math.Max(0.1f, modifier); - var massRatioSq = Math.Pow(massRatio, 2); - var modifier = (1 - (0.15 / massRatioSq)); - modifier = Math.Max(0.1, modifier); var slowdownComp = EnsureComp(carrier); - _slowdown.SetModifier(carrier, (float) modifier, (float) modifier, slowdownComp); + _slowdown.SetModifier(carrier, modifier, modifier, slowdownComp); } public bool CanCarry(EntityUid carrier, EntityUid carried, CarriableComponent? carriedComp = null) { - if (!Resolve(carried, ref carriedComp, false)) - return false; - - if (carriedComp.CancelToken != null) - return false; - - if (!HasComp(Transform(carrier).ParentUid)) - return false; - - if (HasComp(carrier) || HasComp(carried)) - return false; - - // if (_respirator.IsReceivingCPR(carried)) - // return false; - - if (!TryComp(carrier, out var hands)) + if (!Resolve(carried, ref carriedComp, false) + || carriedComp.CancelToken != null + || !HasComp(Transform(carrier).ParentUid) + || HasComp(carrier) + || HasComp(carried) + || !TryComp(carrier, out var hands) + || hands.CountFreeHands() < carriedComp.FreeHandsRequired) return false; - - if (hands.CountFreeHands() < carriedComp.FreeHandsRequired) - return false; - return true; } - private float MassContest(EntityUid roller, EntityUid target, PhysicsComponent? rollerPhysics = null, PhysicsComponent? targetPhysics = null) - { - if (!Resolve(roller, ref rollerPhysics, false) || !Resolve(target, ref targetPhysics, false)) - return 1f; - - if (targetPhysics.FixturesMass == 0) - return 1f; - - return rollerPhysics.FixturesMass / targetPhysics.FixturesMass; - } - - private TimeSpan GetPickupDuration(EntityUid carrier, EntityUid carried) - { - var length = TimeSpan.FromSeconds(3); - - var mod = MassContest(carrier, carried); - if (mod != 0) - length /= mod; - - return length; - } - public override void Update(float frameTime) { var query = EntityQueryEnumerator(); diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs b/Content.Shared/Carrying/CarryingDoAfterEvent.cs similarity index 91% rename from Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs rename to Content.Shared/Carrying/CarryingDoAfterEvent.cs index 6acd6b775f3..fb7225461cb 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingDoAfterEvent.cs +++ b/Content.Shared/Carrying/CarryingDoAfterEvent.cs @@ -4,7 +4,5 @@ namespace Content.Shared.Carrying { [Serializable, NetSerializable] - public sealed partial class CarryDoAfterEvent : SimpleDoAfterEvent - { - } + public sealed partial class CarryDoAfterEvent : SimpleDoAfterEvent { } } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs b/Content.Shared/Carrying/CarryingSlowdownComponent.cs similarity index 80% rename from Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs rename to Content.Shared/Carrying/CarryingSlowdownComponent.cs index aabde66af0d..597edc2a795 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownComponent.cs +++ b/Content.Shared/Carrying/CarryingSlowdownComponent.cs @@ -7,10 +7,10 @@ namespace Content.Shared.Carrying public sealed partial class CarryingSlowdownComponent : Component { - [DataField("walkModifier", required: true)] [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public float WalkModifier = 1.0f; - [DataField("sprintModifier", required: true)] [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true)] public float SprintModifier = 1.0f; } diff --git a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs b/Content.Shared/Carrying/CarryingSlowdownSystem.cs similarity index 85% rename from Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs rename to Content.Shared/Carrying/CarryingSlowdownSystem.cs index 9b9c8cec10f..04b714fdd78 100644 --- a/Content.Shared/Nyanotrasen/Carrying/CarryingSlowdownSystem.cs +++ b/Content.Shared/Carrying/CarryingSlowdownSystem.cs @@ -31,13 +31,12 @@ private void OnGetState(EntityUid uid, CarryingSlowdownComponent component, ref private void OnHandleState(EntityUid uid, CarryingSlowdownComponent component, ref ComponentHandleState args) { - if (args.Current is CarryingSlowdownComponentState state) - { - component.WalkModifier = state.WalkModifier; - component.SprintModifier = state.SprintModifier; + if (args.Current is not CarryingSlowdownComponentState state) + return; - _movementSpeed.RefreshMovementSpeedModifiers(uid); - } + component.WalkModifier = state.WalkModifier; + component.SprintModifier = state.SprintModifier; + _movementSpeed.RefreshMovementSpeedModifiers(uid); } private void OnRefreshMoveSpeed(EntityUid uid, CarryingSlowdownComponent component, RefreshMovementSpeedModifiersEvent args) { From 636f7f518369864fa54c7e9754d513af4a8bba50 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 5 Aug 2024 17:12:05 +0000 Subject: [PATCH 077/143] Automatic Changelog Update (#580) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a4018c20b9a..0359a65d4db 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4918,3 +4918,13 @@ Entries: research. id: 6215 time: '2024-08-05T17:10:42.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + The Carrying system has been reworked as a means of better supporting + having extremely large species and characters. 10kg Harpies should no + longer be oppressed by 2000kg Lamia with infinitely short carry + attempts. + id: 6216 + time: '2024-08-05T17:11:37.0000000+00:00' From f177d7df0fcf10f522fabd9021cac5bd20acd15b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Mon, 5 Aug 2024 17:16:12 +0000 Subject: [PATCH 078/143] Automatic Changelog Update (#673) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0359a65d4db..a0631c5f9d8 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4928,3 +4928,9 @@ Entries: attempts. id: 6216 time: '2024-08-05T17:11:37.0000000+00:00' +- author: Rane + changes: + - type: Add + message: Lamiae should now be rendered much better. + id: 6217 + time: '2024-08-05T17:15:51.0000000+00:00' From 1141f261ae1d0277f2555ae8a9b4dae5a90412db Mon Sep 17 00:00:00 2001 From: gluesniffler <159397573+gluesniffler@users.noreply.github.com> Date: Mon, 5 Aug 2024 21:14:31 -0400 Subject: [PATCH 079/143] Adds PKA & Jetpack Module for Salvage Cyborgs (#550) # Description Gives salvage borgs a special jetpack module with half of the capacity of a normal mini-jetpack. Granting them about 2 minutes of thrust, which allows them to be more useful in space, partake in some rescue missions and to some extent be independent for a limited amount of time if something happens to the salvagers. It also adds a PKA module, which gives them a PKA which can't be wielded, leading to a hilarious accuracy penalty. ---

Media

Demo of the Modules [![Crafting demo, basic usage](https://i.ytimg.com/vi/k6xbEAtudVA/maxresdefault.jpg)](https://youtu.be/k6xbEAtudVA "PKA/Jetpack Borg Demo") Stormtrooper aim vs dragon AI [![Soloing space dragon AI, ft. stormtrooper aim](https://i.ytimg.com/vi/0e8iXbtD-Pc/maxresdefault.jpg)](https://www.youtube.com/watch?v=0e8iXbtD-Pc "Stormtrooper vs Space Dragon AI") Refillable jetpack module demo [![Refilling jetpack](https://i.ytimg.com/vi/y7Ie81NV2QM/maxresdefault.jpg)](https://youtu.be/y7Ie81NV2QM "Refill showcase of the jetpack module")

--- # Changelog :cl: - add: Added an unlockable PKA and Jetpack module to Salvage Cyborgs --------- Signed-off-by: gluesniffler <159397573+gluesniffler@users.noreply.github.com> --- .../Unary/EntitySystems/GasCanisterSystem.cs | 26 +++++++++++- .../Silicons/Borgs/BorgSystem.Modules.cs | 5 +++ .../Borgs/Components/BorgJetpackComponent.cs | 12 ++++++ .../Locale/en-US/research/technologies.ftl | 1 + .../Specific/Robotics/borg_modules.yml | 28 ++++++++++++ .../Entities/Objects/Tools/jetpacks.yml | 40 ++++++++++++++++++ .../Entities/Structures/Machines/lathe.yml | 2 + .../Storage/Canisters/gas_canisters.yml | 1 + .../Prototypes/Recipes/Lathes/robotics.yml | 24 +++++++++++ Resources/Prototypes/Research/industrial.yml | 13 ++++++ .../Robotics/borgmodule.rsi/icon-jetpack.png | Bin 0 -> 303 bytes .../Robotics/borgmodule.rsi/icon-pka.png | Bin 0 -> 299 bytes .../Robotics/borgmodule.rsi/meta.json | 6 +++ 13 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-pka.png diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index 3e4340bf1db..d53e29c9499 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -15,6 +15,7 @@ using Content.Shared.Database; using Content.Shared.Interaction; using Content.Shared.Lock; +using Content.Server.Silicons.Borgs.Components; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; @@ -91,6 +92,10 @@ private void DirtyUI(EntityUid uid, if (canister.GasTankSlot.Item != null) { var tank = canister.GasTankSlot.Item.Value; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } var tankComponent = Comp(tank); tankLabel = Name(tank); tankPressure = tankComponent.Air.Pressure; @@ -163,7 +168,12 @@ private void OnCanisterUpdated(EntityUid uid, GasCanisterComponent canister, ref { if (canister.GasTankSlot.Item != null) { - var gasTank = Comp(canister.GasTankSlot.Item.Value); + var tank = canister.GasTankSlot.Item; + if (TryComp(tank, out var jetpack) && jetpack.JetpackUid.HasValue) + { + tank = jetpack.JetpackUid.Value; + } + var gasTank = Comp(tank.Value); _atmos.ReleaseGasTo(canister.Air, gasTank.Air, canister.ReleasePressure); } else @@ -233,7 +243,19 @@ private void OnCanisterInsertAttempt(EntityUid uid, GasCanisterComponent compone if (args.Slot.ID != component.ContainerName || args.User == null) return; - if (!TryComp(args.Item, out var gasTank) || gasTank.IsValveOpen) + var tank = args.Item; + + if (TryComp(tank, out var jetpack)) + { + if (!jetpack.JetpackUid.HasValue) + { + args.Cancelled = true; + return; + } + tank = jetpack.JetpackUid.Value; + } + + if (!TryComp(tank, out var gasTank) || gasTank.IsValveOpen) { args.Cancelled = true; return; diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index cc57c34c475..7ede2342428 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -2,6 +2,7 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction.Components; using Content.Shared.Silicons.Borgs.Components; +using Content.Server.Silicons.Borgs.Components; using Robust.Shared.Containers; namespace Content.Server.Silicons.Borgs; @@ -190,6 +191,10 @@ private void ProvideItems(EntityUid chassis, EntityUid uid, BorgChassisComponent if (!component.ItemsCreated) { item = Spawn(itemProto, xform.Coordinates); + if (TryComp(uid, out var module)) + { + module.JetpackUid = item; + } } else { diff --git a/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs new file mode 100644 index 00000000000..3a71dd3a501 --- /dev/null +++ b/Content.Server/Silicons/Borgs/Components/BorgJetpackComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Silicons.Borgs.Components; + +/// +/// Server side indicator for a jetpack module. Used as conditional for inserting in canisters. +/// +[RegisterComponent] +public sealed partial class BorgJetpackComponent : Component +{ + public EntityUid? JetpackUid = null; +} \ No newline at end of file diff --git a/Resources/Locale/en-US/research/technologies.ftl b/Resources/Locale/en-US/research/technologies.ftl index a68f9e80b4e..96cb2039116 100644 --- a/Resources/Locale/en-US/research/technologies.ftl +++ b/Resources/Locale/en-US/research/technologies.ftl @@ -16,6 +16,7 @@ research-technology-shuttlecraft = Shuttlecraft research-technology-ripley-aplu = Ripley APLU research-technology-advanced-atmospherics = Advanced Atmospherics research-technology-advanced-tools = Advanced Tools +research-technology-mechanized-salvaging = Mechanized Salvaging research-technology-super-powercells = Super Powercells research-technology-bluespace-storage = Bluespace Storage research-technology-portable-fission = Portable Fission diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index d37523bd735..a7cf7ad5c80 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -210,6 +210,34 @@ - Crowbar - RadioHandheld +- type: entity + id: BorgModuleJetpack + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: jetpack cyborg module + description: A piece of tech that gives cyborgs new abilities. Needs to be loaded by a cyborg before you can refill the jetpack. + components: + - type: Sprite + layers: + - state: cargo + - state: icon-jetpack + - type: BorgJetpack + - type: ItemBorgModule + items: + - JetpackMicroFilled + +- type: entity + id: BorgModulePka + parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] + name: proto kinetic accelerator cyborg module + components: + - type: Sprite + layers: + - state: cargo + - state: icon-pka + - type: ItemBorgModule + items: + - WeaponProtoKineticAccelerator + - type: entity id: BorgModuleGrapplingGun parent: [ BaseBorgModuleCargo, BaseProviderBorgModule ] diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index d0ac9c7a78a..a4c103847fe 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -295,3 +295,43 @@ moles: - 1.025689525 # oxygen - 1.025689525 # nitrogen + +#Empty micro - Used in the Cyborg module, visually the same as mini jetpack. +- type: entity + id: JetpackMicro + parent: BaseJetpack + name: micro jetpack + suffix: Empty + components: + - type: Item + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Sprite + sprite: Objects/Tanks/Jetpacks/mini.rsi + - type: Clothing + sprite: Objects/Tanks/Jetpacks/mini.rsi + slots: + - Back + - suitStorage + - Belt + - type: GasTank + outputPressure: 42.6 + air: + volume: 0.75 + + +# Filled micro +- type: entity + id: JetpackMicroFilled + parent: JetpackMicro + name: micro jetpack + suffix: Filled + components: + - type: GasTank + outputPressure: 42.6 + air: + # 2 minutes of thrust + volume: 0.75 + temperature: 293.15 + moles: + - 0.153853429 # oxygen + - 0.153853429 # nitrogen diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 5d727207fe6..7e861db0d5a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -594,6 +594,8 @@ - BorgModuleAdvancedTool - BorgModuleGPS - BorgModuleRCD + - BorgModuleJetpack + - BorgModulePka - BorgModuleArtifact - BorgModuleAnomaly - BorgModuleGardening diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index cd44f5f585a..52b008c7f2c 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -98,6 +98,7 @@ whitelist: components: - GasTank + - BorgJetpack - type: StaticPrice price: 1000 - type: AccessReader diff --git a/Resources/Prototypes/Recipes/Lathes/robotics.yml b/Resources/Prototypes/Recipes/Lathes/robotics.yml index f42e2851c78..bf6f479703e 100644 --- a/Resources/Prototypes/Recipes/Lathes/robotics.yml +++ b/Resources/Prototypes/Recipes/Lathes/robotics.yml @@ -612,3 +612,27 @@ Steel: 250 Glass: 250 Plastic: 250 + +- type: latheRecipe + id: BorgModulePka + result: BorgModulePka + category: Robotics + completetime: 3 + materials: + Steel: 1000 + Glass: 500 + Plastic: 500 + Silver: 100 + +- type: latheRecipe + id: BorgModuleJetpack + result: BorgModuleJetpack + category: Robotics + completetime: 3 + materials: + Steel: 250 + Glass: 250 + Plastic: 250 + Gold: 100 + Plasma: 1000 + diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index edcc9c66364..33377f52520 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -179,6 +179,19 @@ - BorgModuleAdvancedTool - BorgModuleRCD +- type: technology + id: MechanizedSalvaging + name: research-technology-mechanized-salvaging + icon: + sprite: Mobs/Silicon/chassis.rsi + state: miner + discipline: Industrial + tier: 2 + cost: 10000 + recipeUnlocks: + - BorgModulePka + - BorgModuleJetpack + # Tier 3 - type: technology diff --git a/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png b/Resources/Textures/Objects/Specific/Robotics/borgmodule.rsi/icon-jetpack.png new file mode 100644 index 0000000000000000000000000000000000000000..ec7033ec2fed40d598cfbe156ccc2dd8030c3855 GIT binary patch literal 303 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?3oArNM~bhqvgQ1GFr zi(^QHdvbyV>taO%DJB?kK=FXbs=wuZ`hU*rYqTwV`}lV_kJhx0DzlHftYWVFmzeP5 z>ud4D{0hpO)ASC1m)|d0_y6D756|UKmNl%(p5w_ebcip%-Lt@(6$WsMB4)L?~ZHs72j;rE1bH=;zhy6;oiQ-K6 z_tm96u&EGS^E0iDe?}Vnr~118Uh?cecFi(o@q5PtaO%DJB?kK=FXbs=wuZ`hU*rYqTwV`}lV_kJhx0DzlHftYS`>*8cm7 z!JfU9eGkvHN+&3n>D=&H6`1f<=gAAB6MIi5tXDf|kbF>(?cDTdJl0E>8Mo}vnvg8Q zd{VLC*Bj9`j+wDM`|Imdew_Ozo}>BPSh+3w`uxks8MCjwPq}d6Qo; Date: Tue, 6 Aug 2024 01:15:00 +0000 Subject: [PATCH 080/143] Automatic Changelog Update (#550) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a0631c5f9d8..35142b8bbfa 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4934,3 +4934,9 @@ Entries: message: Lamiae should now be rendered much better. id: 6217 time: '2024-08-05T17:15:51.0000000+00:00' +- author: gluesniffler + changes: + - type: Add + message: Added an unlockable PKA and Jetpack module to Salvage Cyborgs + id: 6218 + time: '2024-08-06T01:14:31.0000000+00:00' From 981b7dd9e3ce6be45911d29b605593cf7b48ea34 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 6 Aug 2024 00:52:32 -0400 Subject: [PATCH 081/143] Rebase Blood Drinker System, Arachne, Oneirophage (#438) # Description This is a simple rebase of the Blood Drinker System, and its related features that have been commented out and/or omitted due to its lack of rebase. I am NOT substantially updating any of this code at this time, outside of the barest minimum updates needed to make it run in the first place. The reason I am doing this is that I require the Blood Drinker system functional as a prerequisite for future features, and I will update or refactor it when needed. Arachne are still pending a Full Rework, but that is beyond the scope of this PR. # TODO - [x] Make the code functional - [x] Port Arachne - [x] Uncomment Oneirophages - [x] Re-add Oneirophage midround event # Changelog :cl: - add: Arachne have been reimplemented! - add: Oneirophages are back! --------- Signed-off-by: VMSolidus --- Content.Server/Arachne/ArachneSystem.cs | 231 ++++++++++++++++ Content.Server/Arachne/CocoonComponent.cs | 13 + .../Vampire/BloodSuckedComponent.cs | 9 + .../Vampire/BloodSuckerComponent.cs | 44 +++ Content.Server/Vampire/BloodSuckerSystem.cs | 213 ++++++++++++++ .../BloodSuckerGlandInjectorComponent.cs | 23 ++ .../BloodSuckerGlandInjectorSystem.cs | 39 +++ Content.Shared/Arachne/ArachneComponent.cs | 21 ++ Content.Shared/Arachne/Events.cs | 11 + Content.Shared/Arachne/WebComponent.cs | 8 + .../Vampiric/BloodSuckDoAfterEvent.cs | 10 + Resources/Locale/en-US/abilities/arachne.ftl | 13 + .../Locale/en-US/abilities/bloodsucker.ftl | 19 ++ Resources/Locale/en-US/species/species.ftl | 1 + .../Chemistry/metabolizer_types.yml | 6 +- Resources/Prototypes/Damage/containers.yml | 10 + Resources/Prototypes/Damage/modifier_sets.yml | 13 + .../Entities/Clothing/OuterClothing/armor.yml | 6 + .../OuterClothing/base_clothingouter.yml | 1 + .../Entities/Clothing/OuterClothing/suits.yml | 20 ++ .../Entities/Mobs/Player/arachne.yml | 35 +++ .../Entities/Mobs/Species/arachne.yml | 220 +++++++++++++++ Resources/Prototypes/GameRules/events.yml | 16 ++ .../anytaur_inventory_template.yml | 112 ++++++++ .../Entities/Body/Mechanisms/vampiric.yml | 22 ++ .../Entities/Body/Parts/spider.yml | 24 +- .../Entities/Body/Prototypes/arachne.yml | 63 +++++ .../Body/Prototypes/vampiricanimal.yml | 43 +++ .../Entities/Markers/Spawners/ghost_roles.yml | 40 +-- .../Entities/Mobs/NPCs/mutants.yml | 259 +++++++++--------- .../Entities/Structures/Webbing/webs.yml | 93 +++++++ Resources/Prototypes/Reagents/biological.yml | 23 ++ Resources/Prototypes/Species/arachne.yml | 50 ++++ Resources/Prototypes/tags.yml | 9 + .../female_full.png | Bin 0 -> 140 bytes .../female_none.png | Bin 0 -> 112 bytes .../female_top.png | Bin 0 -> 140 bytes .../anytaur_masking_helpers.rsi/full.png | Bin 0 -> 112 bytes .../anytaur_masking_helpers.rsi/male_full.png | Bin 0 -> 112 bytes .../anytaur_masking_helpers.rsi/male_none.png | Bin 0 -> 112 bytes .../anytaur_masking_helpers.rsi/male_top.png | Bin 0 -> 112 bytes .../anytaur_masking_helpers.rsi/meta.json | 59 ++++ .../anytaur_masking_helpers.rsi/none.png | Bin 0 -> 112 bytes .../anytaur_masking_helpers.rsi/top.png | Bin 0 -> 112 bytes .../unisex_full.png | Bin 0 -> 112 bytes .../unisex_none.png | Bin 0 -> 112 bytes .../unisex_top.png | Bin 0 -> 112 bytes .../Customization/spidereyes.rsi/eyes.png | Bin 0 -> 5070 bytes .../Customization/spidereyes.rsi/meta.json | 15 + .../Mobs/Species/arachne.rsi/meta.json | 19 ++ .../Mobs/Species/arachne.rsi/spider_body.png | Bin 0 -> 3288 bytes .../Species/arachne.rsi/spider_body_front.png | Bin 0 -> 761 bytes .../Textures/Mobs/Species/eyes.rsi/eyes.png | Bin 0 -> 5553 bytes .../Textures/Mobs/Species/eyes.rsi/meta.json | 15 + .../Structures/cocoon.rsi/cocoon1.png | Bin 0 -> 669 bytes .../Structures/cocoon.rsi/cocoon2.png | Bin 0 -> 636 bytes .../Structures/cocoon.rsi/cocoon3.png | Bin 0 -> 578 bytes .../Structures/cocoon.rsi/cocoon_large1.png | Bin 0 -> 762 bytes .../Structures/cocoon.rsi/cocoon_large2.png | Bin 0 -> 683 bytes .../Structures/cocoon.rsi/cocoon_large3.png | Bin 0 -> 876 bytes .../Structures/cocoon.rsi/meta.json | 35 +++ 61 files changed, 1704 insertions(+), 159 deletions(-) create mode 100644 Content.Server/Arachne/ArachneSystem.cs create mode 100644 Content.Server/Arachne/CocoonComponent.cs create mode 100644 Content.Server/Vampire/BloodSuckedComponent.cs create mode 100644 Content.Server/Vampire/BloodSuckerComponent.cs create mode 100644 Content.Server/Vampire/BloodSuckerSystem.cs create mode 100644 Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs create mode 100644 Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs create mode 100644 Content.Shared/Arachne/ArachneComponent.cs create mode 100644 Content.Shared/Arachne/Events.cs create mode 100644 Content.Shared/Arachne/WebComponent.cs create mode 100644 Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs create mode 100644 Resources/Locale/en-US/abilities/arachne.ftl create mode 100644 Resources/Locale/en-US/abilities/bloodsucker.ftl create mode 100644 Resources/Prototypes/Entities/Mobs/Player/arachne.yml create mode 100644 Resources/Prototypes/Entities/Mobs/Species/arachne.yml create mode 100644 Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml create mode 100644 Resources/Prototypes/Species/arachne.yml create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png create mode 100644 Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png create mode 100644 Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Customization/spidereyes.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/arachne.rsi/meta.json create mode 100644 Resources/Textures/Mobs/Species/arachne.rsi/spider_body.png create mode 100644 Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png create mode 100644 Resources/Textures/Mobs/Species/eyes.rsi/eyes.png create mode 100644 Resources/Textures/Mobs/Species/eyes.rsi/meta.json create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon2.png create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon3.png create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large2.png create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png create mode 100644 Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/meta.json diff --git a/Content.Server/Arachne/ArachneSystem.cs b/Content.Server/Arachne/ArachneSystem.cs new file mode 100644 index 00000000000..9cdefb441be --- /dev/null +++ b/Content.Server/Arachne/ArachneSystem.cs @@ -0,0 +1,231 @@ +using Content.Shared.Arachne; +using Content.Shared.Actions; +using Content.Shared.IdentityManagement; +using Content.Shared.Verbs; +using Content.Shared.Buckle.Components; +using Content.Shared.DoAfter; +using Content.Shared.Stunnable; +using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Damage; +using Content.Shared.Inventory; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; +using Content.Shared.Humanoid; +using Content.Shared.Nutrition.EntitySystems; +using Content.Server.Buckle.Systems; +using Content.Server.Popups; +using Content.Server.DoAfter; +using Content.Server.Body.Components; +using Content.Server.Vampiric; +using Content.Server.Speech.Components; +using Robust.Shared.Physics.Components; +using Robust.Shared.Containers; +using Robust.Shared.Map; +using Robust.Shared.Utility; +using Robust.Server.Console; + +namespace Content.Server.Arachne +{ + public sealed class ArachneSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly BuckleSystem _buckleSystem = default!; + [Dependency] private readonly ItemSlotsSystem _itemSlots = default!; + [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + + [Dependency] private readonly IServerConsoleHost _host = default!; + [Dependency] private readonly BloodSuckerSystem _bloodSuckerSystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + private const string BodySlot = "body_slot"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddCocoonVerb); + + SubscribeLocalEvent(OnCocEntInserted); + SubscribeLocalEvent(OnCocEntRemoved); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent>(AddSuccVerb); + SubscribeLocalEvent(OnCocoonDoAfter); + } + + private void AddCocoonVerb(EntityUid uid, ArachneComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (args.Target == uid) + return; + + if (!TryComp(args.Target, out var bloodstream)) + return; + + if (bloodstream.BloodReagent != component.WebBloodReagent) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCocooning(uid, component, args.Target); + }, + Text = Loc.GetString("cocoon"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnCocEntInserted(EntityUid uid, CocoonComponent component, EntInsertedIntoContainerMessage args) + { + _blindableSystem.UpdateIsBlind(args.Entity); + EnsureComp(args.Entity); + + if (TryComp(args.Entity, out var currentAccent)) + { + component.WasReplacementAccent = true; + component.OldAccent = currentAccent.Accent; + currentAccent.Accent = "mumble"; + } else + { + component.WasReplacementAccent = false; + var replacement = EnsureComp(args.Entity); + replacement.Accent = "mumble"; + } + } + + private void OnCocEntRemoved(EntityUid uid, CocoonComponent component, EntRemovedFromContainerMessage args) + { + if (component.WasReplacementAccent && TryComp(args.Entity, out var replacement)) + { + replacement.Accent = component.OldAccent; + } else + { + RemComp(args.Entity); + } + + RemComp(args.Entity); + _blindableSystem.UpdateIsBlind(args.Entity); + } + + private void OnDamageChanged(EntityUid uid, CocoonComponent component, DamageChangedEvent args) + { + if (!args.DamageIncreased) + return; + + if (args.DamageDelta == null) + return; + + var body = _itemSlots.GetItemOrNull(uid, BodySlot); + + if (body == null) + return; + + var damage = args.DamageDelta * component.DamagePassthrough; + _damageableSystem.TryChangeDamage(body, damage); + } + + private void AddSuccVerb(EntityUid uid, CocoonComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + if (!TryComp(args.User, out var sucker)) + return; + + if (!sucker.WebRequired) + return; + + var victim = _itemSlots.GetItemOrNull(uid, BodySlot); + + if (victim == null) + return; + + if (!TryComp(victim, out var stream)) + return; + + AlternativeVerb verb = new() + { + Act = () => + { + _bloodSuckerSystem.StartSuccDoAfter(args.User, victim.Value, sucker, stream, false); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnEntRemoved(EntityUid uid, WebComponent web, EntRemovedFromContainerMessage args) + { + if (!TryComp(uid, out var strap)) + return; + + if (HasComp(args.Entity)) + _buckleSystem.StrapSetEnabled(uid, false, strap); + } + + private void StartCocooning(EntityUid uid, ArachneComponent component, EntityUid target) + { + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-third-person", ("target", Identity.Entity(target, EntityManager)), ("spider", Identity.Entity(uid, EntityManager))), uid, + Shared.Popups.PopupType.MediumCaution); + + _popupSystem.PopupEntity(Loc.GetString("cocoon-start-second-person", ("target", Identity.Entity(target, EntityManager))), uid, uid, Shared.Popups.PopupType.Medium); + + var delay = component.CocoonDelay; + + if (HasComp(target)) + delay *= component.CocoonKnockdownMultiplier; + + // Is it good practice to use empty data just to disambiguate doafters + // Who knows, there's no docs! + var ev = new ArachneCocoonDoAfterEvent(); + + var args = new DoAfterArgs(EntityManager, uid, delay, ev, uid, target: target) + { + BreakOnUserMove = true, + BreakOnTargetMove = true, + }; + + _doAfter.TryStartDoAfter(args); + } + + private void OnCocoonDoAfter(EntityUid uid, ArachneComponent component, ArachneCocoonDoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Target == null) + return; + + var spawnProto = HasComp(args.Args.Target) ? "CocoonedHumanoid" : "CocoonSmall"; + Transform(args.Args.Target.Value).AttachToGridOrMap(); + var cocoon = Spawn(spawnProto, Transform(args.Args.Target.Value).Coordinates); + + if (!TryComp(cocoon, out var slots)) + return; + + // todo: our species should use scale visuals probably... + // TODO: We need a client-accessible notion of scale influence here. + /* if (spawnProto == "CocoonedHumanoid" && TryComp(args.Args.Target.Value, out var sprite)) */ + /* { */ + /* // why the fuck is this only available as a console command. */ + /* _host.ExecuteCommand(null, "scale " + cocoon + " " + sprite.Scale.Y); */ + if (TryComp(args.Args.Target.Value, out var physics)) + { + var scale = Math.Clamp(1 / (35 / physics.FixturesMass), 0.35, 2.5); + _host.ExecuteCommand(null, "scale " + cocoon + " " + scale); + } + _itemSlots.SetLock(cocoon, BodySlot, false, slots); + _itemSlots.TryInsert(cocoon, BodySlot, args.Args.Target.Value, args.Args.User); + _itemSlots.SetLock(cocoon, BodySlot, true, slots); + + var impact = (spawnProto == "CocoonedHumanoid") ? LogImpact.High : LogImpact.Medium; + + _adminLogger.Add(LogType.Action, impact, $"{ToPrettyString(args.Args.User):player} cocooned {ToPrettyString(args.Args.Target.Value):target}"); + args.Handled = true; + } + } +} diff --git a/Content.Server/Arachne/CocoonComponent.cs b/Content.Server/Arachne/CocoonComponent.cs new file mode 100644 index 00000000000..42ecf27971a --- /dev/null +++ b/Content.Server/Arachne/CocoonComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.Arachne +{ + [RegisterComponent] + public sealed partial class CocoonComponent : Component + { + public bool WasReplacementAccent = false; + + public string OldAccent = ""; + + [DataField("damagePassthrough")] + public float DamagePassthrough = 0.5f; + } +} diff --git a/Content.Server/Vampire/BloodSuckedComponent.cs b/Content.Server/Vampire/BloodSuckedComponent.cs new file mode 100644 index 00000000000..d7e402cd98a --- /dev/null +++ b/Content.Server/Vampire/BloodSuckedComponent.cs @@ -0,0 +1,9 @@ +namespace Content.Server.Vampiric +{ + /// + /// For entities who have been succed. + /// + [RegisterComponent] + public sealed partial class BloodSuckedComponent : Component + {} +} diff --git a/Content.Server/Vampire/BloodSuckerComponent.cs b/Content.Server/Vampire/BloodSuckerComponent.cs new file mode 100644 index 00000000000..f5619d1cb49 --- /dev/null +++ b/Content.Server/Vampire/BloodSuckerComponent.cs @@ -0,0 +1,44 @@ +namespace Content.Server.Vampiric +{ + [RegisterComponent] + public sealed partial class BloodSuckerComponent : Component + { + /// + /// How much to succ each time we succ. + /// + [DataField("unitsToSucc")] + public float UnitsToSucc = 20f; + + /// + /// The time (in seconds) that it takes to succ an entity. + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan Delay = TimeSpan.FromSeconds(4); + + // ***INJECT WHEN SUCC*** + + /// + /// Whether to inject chems into a chemstream when we suck something. + /// + [DataField("injectWhenSucc")] + public bool InjectWhenSucc = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + + /// + /// Whether we need to web the thing up first... + /// + [DataField("webRequired")] + public bool WebRequired = false; + } +} diff --git a/Content.Server/Vampire/BloodSuckerSystem.cs b/Content.Server/Vampire/BloodSuckerSystem.cs new file mode 100644 index 00000000000..a63334a8943 --- /dev/null +++ b/Content.Server/Vampire/BloodSuckerSystem.cs @@ -0,0 +1,213 @@ +using Content.Shared.Verbs; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Damage.Prototypes; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Administration.Logs; +using Content.Shared.Vampiric; +using Content.Server.Atmos.Components; +using Content.Server.Body.Components; +using Content.Server.Body.Systems; +using Content.Shared.Chemistry.EntitySystems; +using Content.Server.Popups; +using Content.Server.HealthExaminable; +using Content.Server.DoAfter; +using Content.Server.Nutrition.Components; +using Robust.Shared.Prototypes; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Utility; + +namespace Content.Server.Vampiric +{ + public sealed class BloodSuckerSystem : EntitySystem + { + [Dependency] private readonly BodySystem _bodySystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionSystem = default!; + [Dependency] private readonly PopupSystem _popups = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly StomachSystem _stomachSystem = default!; + [Dependency] private readonly DamageableSystem _damageableSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddSuccVerb); + SubscribeLocalEvent(OnHealthExamined); + SubscribeLocalEvent(OnDamageChanged); + SubscribeLocalEvent(OnDoAfter); + } + + private void AddSuccVerb(EntityUid uid, BloodSuckerComponent component, GetVerbsEvent args) + { + if (args.User == args.Target) + return; + if (component.WebRequired) + return; // handled elsewhere + if (!TryComp(args.Target, out var bloodstream)) + return; + if (!args.CanAccess) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartSuccDoAfter(uid, args.Target, component, bloodstream); // start doafter + }, + Text = Loc.GetString("action-name-suck-blood"), + Icon = new SpriteSpecifier.Texture(new ("/Textures/Nyanotrasen/Icons/verbiconfangs.png")), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void OnHealthExamined(EntityUid uid, BloodSuckedComponent component, HealthBeingExaminedEvent args) + { + args.Message.PushNewline(); + args.Message.AddMarkup(Loc.GetString("bloodsucked-health-examine", ("target", uid))); + } + + private void OnDamageChanged(EntityUid uid, BloodSuckedComponent component, DamageChangedEvent args) + { + if (args.DamageIncreased) + return; + + if (_prototypeManager.TryIndex("Brute", out var brute) && args.Damageable.Damage.TryGetDamageInGroup(brute, out var bruteTotal) + && _prototypeManager.TryIndex("Airloss", out var airloss) && args.Damageable.Damage.TryGetDamageInGroup(airloss, out var airlossTotal)) + { + if (bruteTotal == 0 && airlossTotal == 0) + RemComp(uid); + } + } + + private void OnDoAfter(EntityUid uid, BloodSuckerComponent component, BloodSuckDoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Target == null) + return; + + args.Handled = TrySucc(uid, args.Args.Target.Value); + } + + public void StartSuccDoAfter(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodSuckerComponent = null, BloodstreamComponent? stream = null, bool doChecks = true) + { + if (!Resolve(bloodsucker, ref bloodSuckerComponent)) + return; + + if (!Resolve(victim, ref stream)) + return; + + if (doChecks) + { + if (!_interactionSystem.InRangeUnobstructed(bloodsucker, victim)) + { + return; + } + + if (_inventorySystem.TryGetSlotEntity(victim, "head", out var headUid) && HasComp(headUid)) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-helmet", ("helmet", headUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_inventorySystem.TryGetSlotEntity(bloodsucker, "mask", out var maskUid) && + EntityManager.TryGetComponent(maskUid, out var blocker) && + blocker.Enabled) + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-mask", ("mask", maskUid)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + } + + if (stream.BloodReagent != "Blood") + { + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-not-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + return; + } + + if (_solutionSystem.PercentFull(stream.Owner) != 0) + _popups.PopupEntity(Loc.GetString("bloodsucker-fail-no-blood", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-doafter-start", ("target", victim)), victim, bloodsucker, Shared.Popups.PopupType.Medium); + + var ev = new BloodSuckDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, bloodsucker, bloodSuckerComponent.Delay, ev, bloodsucker, target: victim) + { + BreakOnTargetMove = true, + BreakOnUserMove = false, + DistanceThreshold = 2f, + NeedHand = false + }; + + _doAfter.TryStartDoAfter(args); + } + + public bool TrySucc(EntityUid bloodsucker, EntityUid victim, BloodSuckerComponent? bloodsuckerComp = null) + { + // Is bloodsucker a bloodsucker? + if (!Resolve(bloodsucker, ref bloodsuckerComp)) + return false; + + // Does victim have a bloodstream? + if (!TryComp(victim, out var bloodstream)) + return false; + + // No blood left, yikes. + if (_bloodstreamSystem.GetBloodLevelPercentage(victim, bloodstream) == 0.0f) + return false; + + // Does bloodsucker have a stomach? + var stomachList = _bodySystem.GetBodyOrganComponents(bloodsucker); + if (stomachList.Count == 0) + return false; + + if (!_solutionSystem.TryGetSolution(stomachList[0].Comp.Owner, StomachSystem.DefaultSolutionName, out var stomachSolution)) + return false; + + // Are we too full? + + if (_solutionSystem.PercentFull(bloodsucker) >= 1) + { + _popups.PopupEntity(Loc.GetString("drink-component-try-use-drink-had-enough"), bloodsucker, bloodsucker, Shared.Popups.PopupType.MediumCaution); + return false; + } + + _adminLogger.Add(Shared.Database.LogType.MeleeHit, Shared.Database.LogImpact.Medium, $"{ToPrettyString(bloodsucker):player} sucked blood from {ToPrettyString(victim):target}"); + + // All good, succ time. + _audio.PlayPvs("/Audio/Items/drink.ogg", bloodsucker); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked-victim", ("sucker", bloodsucker)), victim, victim, Shared.Popups.PopupType.LargeCaution); + _popups.PopupEntity(Loc.GetString("bloodsucker-blood-sucked", ("target", victim)), bloodsucker, bloodsucker, Shared.Popups.PopupType.Medium); + EnsureComp(victim); + + // Make everything actually ingest. + if (bloodstream.BloodSolution == null) + return false; + + var temp = _solutionSystem.SplitSolution(bloodstream.BloodSolution.Value, bloodsuckerComp.UnitsToSucc); + _stomachSystem.TryTransferSolution(stomachList[0].Comp.Owner, temp, stomachList[0].Comp); + + // Add a little pierce + DamageSpecifier damage = new(); + damage.DamageDict.Add("Piercing", 1); // Slowly accumulate enough to gib after like half an hour + + _damageableSystem.TryChangeDamage(victim, damage, true, true); + + //I'm not porting the nocturine gland, this code is deprecated, and will be reworked at a later date. + //if (bloodsuckerComp.InjectWhenSucc && _solutionSystem.TryGetInjectableSolution(victim, out var injectable)) + //{ + // _solutionSystem.TryAddReagent(victim, injectable, bloodsuckerComp.InjectReagent, bloodsuckerComp.UnitsToInject, out var acceptedQuantity); + //} + return true; + } + + private record struct BloodSuckData() + {} + } +} diff --git a/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs new file mode 100644 index 00000000000..1a3c9b1588a --- /dev/null +++ b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorComponent.cs @@ -0,0 +1,23 @@ +namespace Content.Server.Vampiric +{ + [RegisterComponent] + /// + /// Item that gives a bloodsucker injection glands (for poison, usually) + /// + public sealed partial class BloodSuckerGlandInjectorComponent : Component + { + public bool Used = false; + + /// + /// How many units of our injected chem to inject. + /// + [DataField("unitsToInject")] + public float UnitsToInject = 5; + + /// + /// Which reagent to inject. + /// + [DataField("injectReagent")] + public string InjectReagent = ""; + } +} diff --git a/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs new file mode 100644 index 00000000000..d2a92f24be6 --- /dev/null +++ b/Content.Server/Vampire/Injector/BloodSuckerGlandInjectorSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Popups; +using Content.Shared.Interaction; + +namespace Content.Server.Vampiric +{ + public sealed class BloodSuckerGlandInjectorSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popupSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnAfterInteract); + } + + private void OnAfterInteract(EntityUid uid, BloodSuckerGlandInjectorComponent component, AfterInteractEvent args) + { + if (component.Used) + return; + + if (!args.CanReach) + return; + + if (!TryComp(args.Target, out var bloodSuckerComponent)) + return; + + // They already have one. + if (bloodSuckerComponent.InjectWhenSucc) + return; + + bloodSuckerComponent.InjectWhenSucc = true; + bloodSuckerComponent.InjectReagent = component.InjectReagent; + bloodSuckerComponent.UnitsToInject = component.UnitsToInject; + component.Used = true; + QueueDel(uid); + + _popupSystem.PopupEntity(Loc.GetString("bloodsucker-glands-throb"), args.Target.Value, args.Target.Value); + } + } +} diff --git a/Content.Shared/Arachne/ArachneComponent.cs b/Content.Shared/Arachne/ArachneComponent.cs new file mode 100644 index 00000000000..04c369cc456 --- /dev/null +++ b/Content.Shared/Arachne/ArachneComponent.cs @@ -0,0 +1,21 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Arachne +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class ArachneComponent : Component + { + [DataField("cocoonDelay")] + public float CocoonDelay = 12f; + + [DataField("cocoonKnockdownMultiplier")] + public float CocoonKnockdownMultiplier = 0.5f; + + /// + /// Blood reagent required to web up a mob. + /// + + [DataField("webBloodReagent")] + public string WebBloodReagent = "Blood"; + } +} diff --git a/Content.Shared/Arachne/Events.cs b/Content.Shared/Arachne/Events.cs new file mode 100644 index 00000000000..02001286ac6 --- /dev/null +++ b/Content.Shared/Arachne/Events.cs @@ -0,0 +1,11 @@ +using Robust.Shared.Map; +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Arachne +{ + [Serializable, NetSerializable] + public sealed partial class ArachneCocoonDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Content.Shared/Arachne/WebComponent.cs b/Content.Shared/Arachne/WebComponent.cs new file mode 100644 index 00000000000..c8284f39434 --- /dev/null +++ b/Content.Shared/Arachne/WebComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Arachne +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class WebComponent : Component + {} +} diff --git a/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs b/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs new file mode 100644 index 00000000000..6aadc258d73 --- /dev/null +++ b/Content.Shared/Vampiric/BloodSuckDoAfterEvent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Vampiric +{ + [Serializable, NetSerializable] + public sealed partial class BloodSuckDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Resources/Locale/en-US/abilities/arachne.ftl b/Resources/Locale/en-US/abilities/arachne.ftl new file mode 100644 index 00000000000..6f6348d7212 --- /dev/null +++ b/Resources/Locale/en-US/abilities/arachne.ftl @@ -0,0 +1,13 @@ +action-name-spin-web = Spin Web +action-desc-spin-web = Use your spinnerets to make a spider web in the current tile. Makes you hungrier and thirstier. +action-name-spin-web-space = You can't spin a web in space! +action-name-spin-web-blocked = There's no room for a web here. +spin-web-action-hungry = You're too hungry to spin a web! +spin-web-action-thirsty = You're too thirsty to spin a web! +spin-web-start-second-person = You start spinning a web. +spin-web-start-third-person = {CAPITALIZE(THE($spider))} starts spinning a web! +cocoon-start-second-person = You start cocooning {THE($target)}. +cocoon-start-third-person = {CAPITALIZE(THE($spider))} starts cocooning {THE($target)}. +spun-web-second-person = You spin up a web. +spun-web-third-person = {CAPITALIZE(THE($spider))} spins up a web! +cocoon = Cocoon diff --git a/Resources/Locale/en-US/abilities/bloodsucker.ftl b/Resources/Locale/en-US/abilities/bloodsucker.ftl new file mode 100644 index 00000000000..d956eaff84e --- /dev/null +++ b/Resources/Locale/en-US/abilities/bloodsucker.ftl @@ -0,0 +1,19 @@ +action-name-suck-blood = Suck Blood +action-description-suck-blood = Suck the blood of the victim in your hand. + +bloodsucker-fail-helmet = You'd need to remove {THE($helmet)}. +bloodsucker-fail-mask = You'd need to remove your mask! + +bloodsucker-fail-not-blood = { CAPITALIZE(SUBJECT($target)) } doesn't have delicious, nourishing mortal blood. +bloodsucker-fail-no-blood = { CAPITALIZE(SUBJECT($target)) } has no blood in { POSS-ADJ($target) } body. +bloodsucker-fail-no-blood-bloodsucked = { CAPITALIZE(SUBJECT($target)) } has been sucked dry. + +bloodsucker-blood-sucked = You suck some blood from {$target}. +bloodsucker-doafter-start = You try to suck blood from {$target}. + +bloodsucker-doafter-start-victim = {CAPITALIZE(THE($sucker))} is trying to bite your neck! +bloodsucker-blood-sucked-victim = {CAPITALIZE(THE($sucker))} sucks some of your blood! + +bloodsucked-health-examine = [color=red]{ CAPITALIZE(SUBJECT($target)) } { CONJUGATE-HAVE($target) } bite marks on { POSS-ADJ($target) } neck.[/color] + +bloodsucker-glands-throb = The glands behind your fangs feel a bit sore. diff --git a/Resources/Locale/en-US/species/species.ftl b/Resources/Locale/en-US/species/species.ftl index f31b1fa0f00..79ce7fea6a1 100644 --- a/Resources/Locale/en-US/species/species.ftl +++ b/Resources/Locale/en-US/species/species.ftl @@ -6,6 +6,7 @@ species-name-reptilian = Reptilian species-name-slime = Slime Person species-name-diona = Diona species-name-arachnid = Arachnid +species-name-arachne = Arachne species-name-moth = Moth Person species-name-skeleton = Skeleton species-name-vox = Vox diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index 259387b6d5c..4d48dab9925 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -1,4 +1,4 @@ -# If your species wants to metabolize stuff differently, +# If your species wants to metabolize stuff differently, # you'll likely have to tag its metabolizers with something other than Human. - type: metabolizerType @@ -44,3 +44,7 @@ - type: metabolizerType id: Arachnid name: arachnid + +- type: metabolizerType + id: Vampiric + name: vampiric diff --git a/Resources/Prototypes/Damage/containers.yml b/Resources/Prototypes/Damage/containers.yml index fb40e9b658f..b01d22df3b7 100644 --- a/Resources/Prototypes/Damage/containers.yml +++ b/Resources/Prototypes/Damage/containers.yml @@ -52,3 +52,13 @@ id: ShadowHaze supportedTypes: - Heat + +- type: damageContainer + id: HalfSpirit + supportedGroups: + - Burn + - Brute + - Airloss + - Immaterial + supportedTypes: + - Poison diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 31dd47a9e16..a6798e39cfe 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -336,3 +336,16 @@ flatReductions: # can't punch the endoskeleton to death Blunt: 5 + +- type: damageModifierSet + id: HalfSpirit + coefficients: + Cold: 0.5 + Shock: 0.75 + Blunt: 0.75 + Slash: 0.75 + Piercing: 0.75 + Heat: 1.25 + Holy: 1.5 + flatReductions: + Cold: 3 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 9a1f1427402..b62658270eb 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -138,6 +138,9 @@ Radiation: 0 Caustic: 0.75 - type: GroupExamine + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterArmorHeavy @@ -234,6 +237,9 @@ - type: ExplosionResistance damageCoefficient: 0.5 - type: GroupExamine + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 8f4312e7711..36327fe1f78 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -138,6 +138,7 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings #DeltaV: Used by harpies to help render their hardsuit sprites + - FullBodyOuter - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index d6cd5295731..9f0a01cc481 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -25,6 +25,7 @@ tags: - Hardsuit - WhitelistChameleon + - FullBodyOuter - HidesHarpyWings - type: entity @@ -38,6 +39,17 @@ sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/janitor_bombsuit.rsi + - type: ClothingSpeedModifier + walkModifier: 0.8 + sprintModifier: 0.8 + - type: ExplosionResistance + damageCoefficient: 0.15 + - type: GroupExamine + - type: Tag + tags: + - Hardsuit + - WhitelistChameleon + - FullBodyOuter - type: entity parent: ClothingOuterBaseLarge @@ -97,6 +109,7 @@ - type: GroupExamine - type: Tag tags: + - FullBodyOuter - WhitelistChameleon - HidesHarpyWings @@ -124,6 +137,7 @@ toggleable-clothing: !type:ContainerSlot {} - type: Tag tags: + - FullBodyOuter - WhitelistChameleon - HidesHarpyWings @@ -177,6 +191,9 @@ sprite: Clothing/OuterClothing/Suits/chicken.rsi - type: Clothing sprite: Clothing/OuterClothing/Suits/chicken.rsi + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBase @@ -202,6 +219,9 @@ - type: ContainerContainer containers: toggleable-clothing: !type:ContainerSlot {} + - type: Tag + tags: + - FullBodyOuter - type: entity parent: ClothingOuterBase diff --git a/Resources/Prototypes/Entities/Mobs/Player/arachne.yml b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml new file mode 100644 index 00000000000..bebf42f31ba --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Player/arachne.yml @@ -0,0 +1,35 @@ +- type: entity + save: false + name: Urist McArachne + parent: MobArachneBase + id: MobArachne + components: + - type: CombatMode + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: MindContainer + showExamineInfo: true + - type: Input + context: "human" + - type: MobMover + - type: InputMover + - type: Respirator + damage: + types: + Asphyxiation: 1.0 + damageRecovery: + types: + Asphyxiation: -1.0 + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen + - type: PotentialPsionic diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachne.yml b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml new file mode 100644 index 00000000000..2f6437dc14e --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Species/arachne.yml @@ -0,0 +1,220 @@ +- type: entity + save: false + name: Urist McArachne + parent: BaseMobHuman + id: MobArachneBase + abstract: true + components: + - type: Sprite + # Arachne are one of the species that needs a manual visual layers setup. + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - map: [ "clownedon" ] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false + - type: HumanoidAppearance + species: Arachne + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.40 + density: 140 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Body + prototype: Arachne + requiredLegs: 8 + - type: Speech + speechSounds: Alto + - type: Inventory + templateId: anytaur + - type: Tag + tags: + - CanPilot + - ShoesRequiredStepTriggerImmune + - DoorBumpOpener + - type: Bloodstream + bloodReagent: DemonsBlood + - type: BloodSucker + webRequired: true + - type: Arachne + - type: DamageVisuals + thresholds: [ 20, 40, 100 ] + targetLayers: + - "enum.HumanoidVisualLayers.Chest" + - "enum.HumanoidVisualLayers.Head" + - "enum.HumanoidVisualLayers.LArm" + - "enum.HumanoidVisualLayers.RArm" + - type: MovedByPressure + pressureResistance: 4 + - type: Barotrauma + damage: + types: + Blunt: 0.05 #per second, scales with pressure and other constants. Reduced Damage. This allows medicine to heal faster than damage. + - type: MovementAlwaysTouching + - type: MovementSpeedModifier + baseWalkSpeed : 3.0 + baseSprintSpeed : 5.0 + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Generic_mob_burning + alternateState: arachne_standing + fireStackAlternateState: 3 + - type: Spider + - type: IgnoreSpiderWeb + +- type: entity + save: false + name: Urist McHands + parent: MobHumanDummy + id: MobArachneDummy + noSpawn: true + description: A dummy arachne meant to be used in character setup. + components: + - type: Sprite + layers: + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body + - map: [ "enum.HumanoidVisualLayers.Chest" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: torso_m + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + sprite: Mobs/Species/arachne.rsi + state: spider_body_front + - map: [ "enum.HumanoidVisualLayers.Head" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: head_m + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + color: "#008800" + sprite: Mobs/Species/eyes.rsi + state: eyes + - map: [ "enum.HumanoidVisualLayers.RArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_arm + - map: [ "enum.HumanoidVisualLayers.LArm" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_arm + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: [ "enum.HumanoidVisualLayers.StencilMask" ] + sprite: Mobs/Customization/anytaur_masking_helpers.rsi + state: unisex_full + visible: false + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: l_hand + - map: [ "enum.HumanoidVisualLayers.RHand" ] + color: "#e8b59b" + sprite: Mobs/Species/Human/parts.rsi + state: r_hand + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + state: bald + sprite: Mobs/Customization/human_hair.rsi + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + sprite: Mobs/Customization/masking_helpers.rsi + state: none + visible: false + - type: Inventory + templateId: anytaur + - type: HumanoidAppearance + species: Arachne diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 7863224436c..ca885117449 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -413,6 +413,22 @@ # - id: MobClownSpider # prob: 0.05 +- type: entity + id: OneirophageSpawn + parent: BaseGameRule + noSpawn: true + components: + - type: StationEvent + id: VentCritters + earliestStart: 15 + minimumPlayers: 15 + weight: 4 + duration: 60 + - type: VentCrittersRule + entries: + - id: MobGiantSpiderVampireAngry + prob: 0.01 + - type: entity id: ZombieOutbreak parent: BaseGameRule diff --git a/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml new file mode 100644 index 00000000000..0dd5961aef3 --- /dev/null +++ b/Resources/Prototypes/InventoryTemplates/anytaur_inventory_template.yml @@ -0,0 +1,112 @@ +- type: inventoryTemplate + id: anytaur + slots: + - name: jumpsuit + slotTexture: uniform + slotFlags: INNERCLOTHING + stripTime: 5 + uiWindowPos: 0,2 + strippingWindowPos: 0,2 + displayName: Jumpsuit + - name: outerClothing + slotTexture: suit + slotFlags: OUTERCLOTHING + slotGroup: MainHotbar + stripTime: 6 + uiWindowPos: 1,2 + strippingWindowPos: 1,2 + displayName: Suit + blacklist: + tags: + - FullBodyOuter + - name: gloves + slotTexture: gloves + slotFlags: GLOVES + uiWindowPos: 2,2 + strippingWindowPos: 2,2 + displayName: Gloves + - name: neck + slotTexture: neck + slotFlags: NECK + uiWindowPos: 0,1 + strippingWindowPos: 0,1 + displayName: Neck + - name: mask + slotTexture: mask + slotFlags: MASK + uiWindowPos: 1,1 + strippingWindowPos: 1,1 + displayName: Mask + - name: eyes + slotTexture: glasses + slotFlags: EYES + stripTime: 2 + uiWindowPos: 0,0 + strippingWindowPos: 0,0 + displayName: Eyes + - name: ears + slotTexture: ears + slotFlags: EARS + stripTime: 2 + uiWindowPos: 2,0 + strippingWindowPos: 2,1 + displayName: Ears + - name: head + slotTexture: head + slotFlags: HEAD + uiWindowPos: 1,0 + strippingWindowPos: 1,0 + displayName: Head + - name: pocket1 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 2 + uiWindowPos: 0,3 + strippingWindowPos: 0,3 + dependsOn: jumpsuit + displayName: Pocket 1 + stripHidden: true + - name: pocket2 + slotTexture: pocket + slotFlags: POCKET + slotGroup: MainHotbar + stripTime: 2 + uiWindowPos: 2,3 + strippingWindowPos: 2,3 + dependsOn: jumpsuit + displayName: Pocket 2 + stripHidden: true + - name: suitstorage + slotTexture: suit_storage + slotFlags: SUITSTORAGE + stripTime: 2 + uiWindowPos: 2,0 + strippingWindowPos: 2,0 + dependsOn: outerClothing + displayName: Suit Storage + - name: id + slotTexture: id + slotFlags: IDCARD + slotGroup: SecondHotbar + stripTime: 6 + uiWindowPos: 2,1 + strippingWindowPos: 2,4 + dependsOn: jumpsuit + displayName: ID + - name: belt + slotTexture: belt + slotFlags: BELT + slotGroup: SecondHotbar + stripTime: 5 + uiWindowPos: 3,1 + strippingWindowPos: 1,3 + displayName: Belt + - name: back + slotTexture: back + slotFlags: BACK + slotGroup: SecondHotbar + stripTime: 5 + uiWindowPos: 3,0 + strippingWindowPos: 0,4 + displayName: Back diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml new file mode 100644 index 00000000000..23934b3ebcc --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Mechanisms/vampiric.yml @@ -0,0 +1,22 @@ +- type: entity + id: OrganVampiricHumanoidStomach + parent: OrganHumanStomach + components: + - type: Metabolizer + # mm yummy + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink + +- type: entity + id: OrganVampiricStomach + parent: OrganAnimalStomach + components: + - type: Metabolizer + maxReagents: 3 + metabolizerTypes: [Vampiric] + groups: + - id: Food + - id: Drink diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml index a900f7524e7..7e71227dbcb 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Parts/spider.yml @@ -24,13 +24,33 @@ - ReagentId: DemonsBlood Quantity: 10 +- type: entity + id: ThoraxSpider + name: "spider thorax" #for arachne, actual spiders should get a cephalothorax that combines with head. + parent: PartSpider + components: + - type: Sprite + sprite: Mobs/Species/Moth/parts.rsi # placeholder sprite + state: "torso_m" + - type: Icon + sprite: Mobs/Species/Moth/parts.rsi + state: "torso_m" + - type: BodyPart #"Other" type + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: DemonsBlood + Quantity: 20 + - type: entity id: RightLegSpider name: "right spider leg" parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi @@ -48,7 +68,7 @@ parent: PartSpider components: - type: Sprite - sprite: Objects/Consumable/Food/meat.rsi + sprite: Objects/Consumable/Food/meat.rsi # placeholder sprite state: spiderleg - type: Icon sprite: Objects/Consumable/Food/meat.rsi diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml new file mode 100644 index 00000000000..553391484e2 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/arachne.yml @@ -0,0 +1,63 @@ +- type: body + id: Arachne + name: "arachne" + root: torso + slots: + head: + part: HeadHuman + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes + torso: + part: TorsoHuman + connections: + - left arm + - right arm + - thorax + organs: + heart: OrganHumanHeart + lungs: OrganHumanLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganHumanLiver + kidneys: OrganHumanKidneys + right arm: + part: RightArmHuman + connections: + - right hand + left arm: + part: LeftArmHuman + connections: + - left hand + right hand: + part: RightHandHuman + left hand: + part: LeftHandHuman + thorax: + part: ThoraxSpider + connections: + - left foreleg + - left second leg + - left third leg + - left hind leg + - right foreleg + - right second leg + - right third leg + - right hind leg + left foreleg: + part: LeftLegSpider + left second leg: + part: LeftLegSpider + left third leg: + part: LeftLegSpider + left hind leg: + part: LeftLegSpider + right foreleg: + part: RightLegSpider + right second leg: + part: RightLegSpider + right third leg: + part: RightLegSpider + right hind leg: + part: RightLegSpider diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml new file mode 100644 index 00000000000..3f4cdb06de1 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Body/Prototypes/vampiricanimal.yml @@ -0,0 +1,43 @@ +- type: body + id: VampiricAnimal + name: "vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal + +- type: body + id: VampiricAnimalLarge + name: "large vampiric animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganVampiricHumanoidStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml index 2652a89127e..046a324e6f6 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/ghost_roles.yml @@ -51,23 +51,23 @@ - state: prisoner # - type: MidRoundAntagSpawnLocation # When MidRoundAntag? -# - type: entity -# id: SpawnPointGhostVampSpider -# name: ghost role spawn point -# suffix: Vampire spider -# parent: MarkerBase -# noSpawn: true -# components: -# - type: GhostRoleMobSpawner -# prototype: MobGiantSpiderVampireAngry -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: Sprite -# sprite: Markers/jobs.rsi -# layers: -# - state: green -# - sprite: Mobs/Animals/bat.rsi -# state: bat +- type: entity + id: SpawnPointGhostVampSpider + name: ghost role spawn point + suffix: Vampire spider + parent: MarkerBase + noSpawn: true + components: + - type: GhostRoleMobSpawner + prototype: MobGiantSpiderVampireAngry + - type: GhostRole + makeSentient: true + name: ghost-role-information-giant-spider-vampire-name + description: ghost-role-information-giant-spider-vampire-description + rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Animals/bat.rsi + state: bat diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml index 5daf2e15e56..462b3254f1e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/NPCs/mutants.yml @@ -70,143 +70,130 @@ - type: Produce - type: NoSlip -# - type: entity -# name: oneirophage -# parent: SimpleMobBase -# id: MobGiantSpiderVampire -# description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. -# components: -# - type: Sprite -# drawdepth: Mobs -# layers: -# - map: ["enum.DamageStateVisualLayers.Base"] -# state: viper -# sprite: Mobs/Animals/spider.rsi -# - type: Physics -# - type: Fixtures -# fixtures: -# fix1: -# shape: -# !type:PhysShapeCircle -# radius: 0.35 -# density: 130 -# mask: -# - SmallMobMask -# layer: -# - SmallMobLayer -# - type: Appearance -# - type: DamageStateVisuals -# states: -# Alive: -# Base: viper -# Critical: -# Base: viper_dead -# Dead: -# Base: viper_dead -# - type: Butcherable -# spawned: -# - id: FoodMeatSpider -# amount: 2 -# - type: CombatMode -# - type: ReplacementAccent -# accent: xeno -# - type: InteractionPopup -# successChance: 0.5 -# interactSuccessString: petting-success-tarantula -# interactFailureString: petting-failure-generic -# - type: Puller -# needsHands: false -# - type: Arachne -# cocoonDelay: 8 -# - type: SolutionContainerManager -# solutions: -# melee: -# reagents: -# - ReagentId: Nocturine -# Quantity: 20 -# - type: MeleeChemicalInjector -# solution: melee -# transferAmount: 3.5 -# - type: SolutionRegeneration -# solution: melee -# generated: -# reagents: -# - ReagentId: Nocturine -# Quantity: 0.15 -# - type: BloodSucker -# unitsToSucc: 35 -# injectWhenSucc: true -# injectReagent: Cryptobiolin -# unitsToInject: 10 -# webRequired: true -# - type: Bloodstream -# bloodReagent: DemonsBlood -# - type: Body -# prototype: VampiricAnimalLarge -# - type: PotentialPsionic -# - type: Psionic -# removable: false -# - type: MetapsionicPower -# - type: MeleeWeapon -# hidden: true -# angle: 0 -# animation: WeaponArcBite -# damage: -# types: -# Piercing: 8 -# - type: AntiPsionicWeapon -# punish: false -# modifiers: -# coefficients: -# Piercing: 2.25 -# - type: Damageable -# damageContainer: HalfSpirit -# damageModifierSet: HalfSpirit -# - type: StatusEffects -# allowed: -# - Stun -# - KnockedDown -# - SlowedDown -# - Stutter -# - SeeingRainbows -# - Electrocution -# - Drunk -# - SlurredSpeech -# - PressureImmunity -# - Muted -# - ForcedSleep -# - TemporaryBlindness -# - Pacified -# - PsionicsDisabled -# - PsionicallyInsulated -# - type: Tag -# tags: -# - Oneirophage -# - type: MovementAlwaysTouching -# - type: PsionicInvisibleContacts -# whitelist: -# tags: -# - ArachneWeb +- type: entity + name: oneirophage + parent: MobGiantSpider + id: MobGiantSpiderVampire + description: The 'dream-eater' spider, rumored to be one of the potential genetic sources for arachne. + components: + - type: Sprite + drawdepth: Mobs + layers: + - map: ["enum.DamageStateVisualLayers.Base", "movement"] + state: viper + sprite: Mobs/Animals/spider.rsi + - type: SpriteMovement + movementLayers: + movement: + state: viper-moving + noMovementLayers: + movement: + state: viper + - type: Appearance + - type: DamageStateVisuals + states: + Alive: + Base: viper + Critical: + Base: viper_dead + Dead: + Base: viper_dead + - type: ReplacementAccent + accent: xeno + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-tarantula + interactFailureString: petting-failure-generic + interactSuccessSpawn: EffectHearts + interactSuccessSound: + path: /Audio/Animals/snake_hiss.ogg + - type: Puller + needsHands: false + - type: Arachne + cocoonDelay: 8 + - type: SolutionContainerManager + solutions: + melee: + reagents: + - ReagentId: Nocturine + Quantity: 20 + - type: MeleeChemicalInjector + solution: melee + transferAmount: 3.5 + - type: SolutionRegeneration + solution: melee + generated: + reagents: + - ReagentId: Nocturine + Quantity: 0.15 + - type: BloodSucker + unitsToSucc: 35 + injectWhenSucc: true + injectReagent: Cryptobiolin + unitsToInject: 10 + webRequired: true + - type: Bloodstream + bloodReagent: DemonsBlood + - type: Body + prototype: VampiricAnimalLarge + - type: PotentialPsionic + - type: Psionic + removable: false + - type: MetapsionicPower + - type: AntiPsionicWeapon + punish: false + modifiers: + coefficients: + Piercing: 2.25 + - type: Damageable + damageContainer: HalfSpirit + damageModifierSet: HalfSpirit + - type: StatusEffects + allowed: + - Stun + - KnockedDown + - SlowedDown + - Stutter + - SeeingRainbows + - Electrocution + - Drunk + - SlurredSpeech + - PressureImmunity + - Muted + - ForcedSleep + - TemporaryBlindness + - Pacified + - PsionicsDisabled + - PsionicallyInsulated + - type: Tag + tags: + - Oneirophage + - type: MovementAlwaysTouching + - type: PsionicInvisibleContacts + whitelist: + tags: + - ArachneWeb -# - type: entity -# name: oneirophage -# parent: MobGiantSpiderVampire -# id: MobGiantSpiderVampireAngry -# suffix: Angry -# components: -# - type: NpcFactionMember -# factions: -# - SimpleHostile -# - type: InputMover -# - type: MobMover -# - type: HTN -# rootTask: SimpleHostileCompound -# - type: GhostRole -# makeSentient: true -# name: ghost-role-information-giant-spider-vampire-name -# description: ghost-role-information-giant-spider-vampire-description -# rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. -# - type: GhostTakeoverAvailable +- type: entity + name: oneirophage + parent: MobGiantSpiderVampire + id: MobGiantSpiderVampireAngry + suffix: Angry + components: + - type: NpcFactionMember + factions: + - SimpleHostile + - type: InputMover + - type: MobMover + - type: HTN + rootTask: + task: SimpleHostileCompound + - type: GhostRole + makeSentient: true + name: ghost-role-information-giant-spider-vampire-name + description: ghost-role-information-giant-spider-vampire-description + rules: No antagonist restrictions. Just don't talk in emote; you have telepathic chat. + - type: GhostTakeoverAvailable - type: entity parent: SimpleMobBase diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml new file mode 100644 index 00000000000..e483ea5da71 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Webbing/webs.yml @@ -0,0 +1,93 @@ +- type: entity + id: CocoonedHumanoid + name: cocooned humanoid + description: Unlucky. + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: Nyanotrasen/Structures/cocoon.rsi + state: cocoon_large1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon_large1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon_large2: "" + - enum.DamageStateVisualLayers.Base: + cocoon_large3: "" + - type: Cocoon + - type: Clickable + - type: InteractionOutline + - type: Transform + noRot: true + - type: Damageable + damageModifierSet: Web + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 40 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.4,0.25,0.1" + density: 20 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: Physics + bodyType: Dynamic + - type: Pullable + - type: AntiRottingContainer + - type: ItemSlots + slots: + body_slot: + name: Body + locked: true + ejectOnBreak: true + - type: Butcherable + butcheringType: Knife + butcherDelay: 12 + spawned: + - id: MaterialCloth1 + amount: 1 + prob: 0.5 #This doesn't cost hunger so should at least make it not worth it time-wise + - type: Appearance + - type: ContainerContainer + containers: + body_slot: !type:ContainerSlot + +- type: entity + id: CocoonSmall + parent: CocoonedHumanoid + name: cocoon + description: What could be inside...? + placement: + mode: SnapgridCenter + snap: + - Wall + components: + - type: Sprite + layers: + - sprite: Nyanotrasen/Structures/cocoon.rsi + state: cocoon1 + map: [ "enum.DamageStateVisualLayers.Base" ] + - type: RandomSprite + available: + - enum.DamageStateVisualLayers.Base: + cocoon1: "" + - enum.DamageStateVisualLayers.Base: #your guess for why randomsprite requires an arbitrary layer is as good as mine friend + cocoon2: "" + - enum.DamageStateVisualLayers.Base: + cocoon3: "" diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 0c53ae10fd1..5c0cef314ca 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -23,6 +23,29 @@ - !type:OrganType type: Human shouldHave: false + - !type:SatiateHunger + factor: 0.5 + conditions: + - !type:OrganType + type: Vampiric + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Water + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Protein + amount: 0.15 + - !type:AdjustReagent + conditions: + - !type:OrganType + type: Vampiric + reagent: Omnizine + amount: 0.2 Food: effects: - !type:AdjustReagent diff --git a/Resources/Prototypes/Species/arachne.yml b/Resources/Prototypes/Species/arachne.yml new file mode 100644 index 00000000000..ed494c37cc8 --- /dev/null +++ b/Resources/Prototypes/Species/arachne.yml @@ -0,0 +1,50 @@ +- type: species + id: Arachne + name: species-name-arachne + roundStart: true + prototype: MobArachne + sprites: MobArachneSprites + markingLimits: MobArachneMarkingLimits + dollPrototype: MobArachneDummy + skinColoration: HumanToned + sexes: + - Female + minAge: 60 + youngAge: 150 + oldAge: 400 + maxAge: 666 + +- type: markingPoints + id: MobArachneMarkingLimits + points: + Hair: + points: 1 + required: false + Tail: + points: 1 + required: false + Chest: + points: 1 + required: false + Arms: + points: 2 + required: false + + +- type: speciesBaseSprites + id: MobArachneSprites + sprites: + Head: MobHumanHead + Hair: MobHumanoidAnyMarking + Chest: MobHumanTorso + Eyes: MobArachneEyes + LArm: MobHumanLArm + RArm: MobHumanRArm + LHand: MobHumanLHand + RHand: MobHumanRHand + +- type: humanoidBaseSprite + id: MobArachneEyes + baseSprite: + sprite: Mobs/Species/eyes.rsi + state: eyes diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 9b0ad51cfb6..786f641ddd1 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -16,6 +16,9 @@ - type: Tag id: AppraisalTool +- type: Tag + id: ArachneWeb + - type: Tag id: ArtifactFragment @@ -602,6 +605,9 @@ - type: Tag id: Fruit +- type: Tag + id: FullBodyOuter + - type: Tag id: Galaxythistle @@ -919,6 +925,9 @@ - type: Tag id: Ointment +- type: Tag + id: Oneirophage + - type: Tag id: Ore diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_full.png new file mode 100644 index 0000000000000000000000000000000000000000..acb96562e7374cbaba2d9f8eac4f1983c2722946 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pW8&%J7@~1LIYA=F!GWQPv*Eu3gIdO!1&Rrbf?NSjtdA<$*!Y?lS%R69 i8<@M9!xb)?)i4xI-eS7+u8$Z{KZB>MpUXO@geCy^0w-qx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_none.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/female_top.png new file mode 100644 index 0000000000000000000000000000000000000000..acb96562e7374cbaba2d9f8eac4f1983c2722946 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pW8&%J7@~1LIYA=F!GWQPv*Eu3gIdO!1&Rrbf?NSjtdA<$*!Y?lS%R69 i8<@M9!xb)?)i4xI-eS7+u8$Z{KZB>MpUXO@geCy^0w-qx literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/full.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_full.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_none.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/male_top.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json new file mode 100644 index 00000000000..b44be570c4f --- /dev/null +++ b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "copyright": "Rane", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "female_none", + "directions": 4 + }, + { + "name": "female_full", + "directions": 4 + }, + { + "name": "female_top", + "directions": 4 + }, + { + "name": "male_none", + "directions": 4 + }, + { + "name": "male_full", + "directions": 4 + }, + { + "name": "male_top", + "directions": 4 + }, + { + "name": "full", + "directions": 4 + }, + { + "name": "none", + "directions": 4 + }, + { + "name": "top", + "directions": 4 + }, + { + "name": "unisex_full", + "directions": 4 + }, + { + "name": "unisex_none", + "directions": 4 + }, + { + "name": "unisex_top", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/none.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/top.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_full.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_none.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png b/Resources/Textures/Mobs/Customization/anytaur_masking_helpers.rsi/unisex_top.png new file mode 100644 index 0000000000000000000000000000000000000000..20ccfaa8db4caa19d2762bbb84aa2c4a5dff53bc GIT binary patch literal 112 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0P3?wHke>@jRu?6^qxB}__|Nk$&IsYz@#aI&L z7tG-B>_!@pBjM@d7@~1LIYDC41ABo6PATIylLfUu7#QYSZ1zpv!|)iWhQZU-&t;uc GLK6T%$RK0@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png b/Resources/Textures/Mobs/Customization/spidereyes.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..0f2534769440310b1f727cde206dfda449257ab0 GIT binary patch literal 5070 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png b/Resources/Textures/Mobs/Species/arachne.rsi/spider_body_front.png new file mode 100644 index 0000000000000000000000000000000000000000..0171f16fe385fe420c6f1b1142b5381e2284ba92 GIT binary patch literal 761 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSoCO|{#S9F5M?jcysy3fA0|V1U zPZ!6KiaBrZ9`qM>6gmF!{+8Vi+G2O6t>rz%CBtGXu=nNv`4z?wm8z7c6lHq3>b})` z_pMSxSHic)aOSLUzju~yJ9%bb<>#{RUsQlrUqp7-u2zqhRC<9m~TO#Ecr>eQ`KzJ5W|QoS~ZL{9TeyS3u#mg`xS{f-Zc zH_f%!X2A2MsQ$i*T>MNm)e}>_W+zHysQ0bC`&KU}RO?vs)5>*@^G?6XTR*qBXwtFA z8^4=YdN(}xOj>-=W3fqaYOe1jv*p+4EHOEo_W!p@d(eyKnVA+ct77#2PhxNl{A2R0 zdpb*n)NwJE$t#b!F0?ssYWp|XHPA;)WQzDUp%86RR>uVfJSFu&(@%YlIrnpaYQAWK zDo<#?QtY?iRXg^r%WppT=GK>T+b$K|ce7vG#C`gA#G7eO`R;X3=3HIuan6#L?fS0z zL&DF`SgJptqxZXZuI_`E?Ms&2+_L26pSR6=nPzVzKYu(_&xt({v4}Q2eYn;6dH3B| zW8+XQ(Y^MT3$0(+uIJ~^HIX`LxtxFb@_R{-x7O}C6S6jJ>n@>JZ!cb4Q~zoA3IjA^m*&&Ubxth`@pA}Idyk3R@{B*k#_1*$lJK{*`{;6U*7GLyP1~j zeE)L{|Ekc^YTMW^zrDXo+~`y4mgbG+Z|7=u2#??YV$uJ~l}VU>`gfN9lgpc9^P48s h0VVlTBRtc5eHpZXY!0a6OTm*tEKgTImvv4FO#o58J(mCg literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png b/Resources/Textures/Mobs/Species/eyes.rsi/eyes.png new file mode 100644 index 0000000000000000000000000000000000000000..b6250e22b38a17c35b2b54789f66bb5cda1db308 GIT binary patch literal 5553 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Species/eyes.rsi/meta.json b/Resources/Textures/Mobs/Species/eyes.rsi/meta.json new file mode 100644 index 00000000000..a98aba406f1 --- /dev/null +++ b/Resources/Textures/Mobs/Species/eyes.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by @Rane#7518", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "eyes", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon1.png new file mode 100644 index 0000000000000000000000000000000000000000..27741fdf314bc38be7153151d603479000af1891 GIT binary patch literal 669 zcmV;O0%HA%P)$5Dx(m zFBXfsFs^ZhFvIKhs_Q@?a2Eu|Znw+%d={V2CxgL2(&@BRt5s77QvgGJv)QP)!{Lxf zBqH5zS3;qX0suChPIdoDARG?Ma5&VIZq5}t7z~=4e3$?qrcx<&lF#R5GMOk0#n$Wf zbgvNx%x1I6<#LhTZYQJB=)MNvY>Qb6p90{%P$;MnB8HP#EGF%CTX=>j_YedE$8-R| z2pY9PD*b+6(|S1pqs>SHF&0TClhWyQ6o&J|;UM$*{N4f71zSRDY#+4%AZuXAG5}6) zJ*{FSF&>X~3xL8MAVy2#m^3I#?&oqjg$5#%$!M*-lmLq%x>zjq8dr$n%mCybVgTLx zUR_f8)C2?Ph&LJyX|-C`y5LqQR|<#N5hY3%&StYJXt<{%0O37mT984J0?BUyP@joE zOaO?F549B$#R;MmAA^~AnE_;<*&=3=1DK@06q*z%=`4(1e*jw4~ z0qlJMWovU6H!CGJl-MY-xwmdtq%iY)ns=JT%y?aMo6Y-_-gBJS`Tw5(^PJ}DNTn6v)$^dz}l z?&{uG0e*DwrC2OVzu#ADv6;^I`F#40Q3}HmU~mHGDA`>A1U8Z_U5_|(ZouJi__HaQ zb4ntSh&q9ItyYt6w|oCZ)ai881#Y-_Jg%Y$7#{#)v6!9+#DQ$JTE_40cff%7Zs&#L z)@(La1XswMBT4plyIm@kirRiH^P2&PUpCc0o8Q&ftnh~bj4)&Ervm)TumCIo3*Z}` WA1sKIggnat0000>)WwzxBKr~01&TMs}c%@WV_wUYPFI?BEi)4t02Yzh&P)}+3)w-zg#X- zDwPz3@mqWv#0bC=C*w>eBcstsa=Dy%JRWspHk*mt?Us7It}P&@5XKH5PW1czd*+CH zy=I<#amf@8*aR#6tkGuT&~3hV6jRB0QN)BpQv%Znx93ryd@e$n4R$MNZwy{|3K8G+z z!Wb@C4gm4&)`v%71mO4kWiS|M;ZcBOY1xfC6eHr)fzRi=uS=y;5BGiuKv5kI2Xz3D zbULj^5ex=jy*HoFRS*~g7kH2Lwg7s)9`;=ujfVCSW>Y>rs(-WDs2hPmKqp|B26zX=cKp8o0}g-#@aF*j10gEyIQQql Q8~^|S07*qoM6N<$f*=3`Hvj+t literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large1.png new file mode 100644 index 0000000000000000000000000000000000000000..f9431f6428586fe569344878961bd645cbc04fc6 GIT binary patch literal 762 zcmVgc z)HGVt5GrUW(MCfaUs*`R6?PUu8&3| zNvG3tb#*1>a@o1Oyxf|EOMu{L0LW@nhDS$7QYw{P@YQN1KA%r^cX!o}?e_MT;npOS z0IYMloFtP;d3$?vgMWN{xLH0wKdZ(L0YI@wA`ywlP)iTC$+wedl~_5y~WPfkvBj3y>__7w^Rr`>L^ z5zz`*DNQVxW%cy*B;jyavm+Di%jHt5z#cw`quGZf5((9|PBO$gJv}9kQ>j#T)_MSj znM}ql8BVj=Oq~EE3y3gB=JUBr#MYRT2ni7n!3I&PNX3w1u}F_;pC|#GC@tUs6Lhgy zXaidIcHUNUn{!$Y^}?1i+)CY#N=3DoO#J%UXS&qe~DNc>iKw1&f>5L*PT;*8~QGffs!} zpU=Pki~!)>Zr7AbC3$_n-??}$BvKPl@Or&&PN$QpR;%WCJR0t~kVr)!dh+Mb%Vi;e0@UO25G7E>wo((o??RzquGg!nR4V3jxrFbX&*%3O z0E81G`|WlU5)_17DiwjiTW>rbi}%=(&*ww%*=%N(%jNq**lxEagrpwNU$2*_ffB3L z${IWs0l-J2k@(Mp0$hEk3tY;H0N}k|Po8sfE##*a31Y2Q6cTGIE(O#1Pj;9&toXiW$VheODDlgT8zK?E?T*O80l5Ya3g z4hJEF1z2KRP8L9d0(`w*ixt?Qz^Fn+hf<~lIGK9w2T~;8?RMdb)e4s!I1vDV(_;Z@ zaAJsPK?p0bYO~p7OCV?~nE~2@bb^MDJU|djc%Q%;i;ZYaz@K~`sb}CY@i-+99Y(s8 zAhX?W!`+Zni39-V>bIfvJK>}Bq&oirjJ71z@AtXHst`+{)9H8sBQF4W&yONKK#(DT zyoWmEg6Am1XCX43PGd<}SpWz>hyvPj6oG^YkErDOS?<#jTvI6!Y&B08jIW6P@f20a z0#hxX%$l3vJF)B8X%5)#dD~4${QyPKZkme+ R_X7X`002ovPDHLkV1mDMGcW)E literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png b/Resources/Textures/Nyanotrasen/Structures/cocoon.rsi/cocoon_large3.png new file mode 100644 index 0000000000000000000000000000000000000000..9a033961ffa27e1796d98c10f6fc9d563f13066a GIT binary patch literal 876 zcmV-y1C#uTP)P6p9*9R5b`t4M~gH+uwv|vr7wIu9v%9!kbKXc6WH6-}`4~`Dy;KodM1O zXMq0~pwVbJn!mrlo5#n;AAbb^VFc^-x=E+g=JoZ}j(k4v%;$5{ZnsYYISByqTrOv7 zwVJuOxG?MW+Hj9uUtgQaWWv-r1tK&6;zS*dMolahvjAM5pPy|e7K??sy1FuzN`)+h z4k{FY#EEjXTG^3ICM^VmdolqKFsu)og-`&AM8Z1e${_WsJ@>Nhc5BBe_9ejW?XBZB zm`y#x5`1}ivC#uTHvG^27y#ncYSqq_b|M4;| za|~gkCEcuJOs7*jPO%RF_xJZssZ{bB3Nbl}=HBV1Z zwiJ4&5-<=Js4E;0Z#J9Wx8hhy0swb+ced-*Ob8%O#Hm!ut2qXwj8m{&E;Dt2K-~3Z z-|aHx9D)b{5EUJdai!im;UbZUd3$@a5Tu<>M;N1I7(2#YZ_f>Sf#zjBr>G0;d{&+S z01k;V?-3skhjz|8t_T9m z+}|fW$GGwZB@4Y?FOY=*0ClCCHQ-*^ct8vPUUAI}K#JNiLu*@g_>hbjTa zp9$BgLl%fe;>v~^j7|qqe@X^I;+0IbvLu-NH#yC###c+Y{tIbhlW zM6IJ*< Date: Tue, 6 Aug 2024 04:52:58 +0000 Subject: [PATCH 082/143] Automatic Changelog Update (#438) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 35142b8bbfa..afe00fec1f2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4940,3 +4940,11 @@ Entries: message: Added an unlockable PKA and Jetpack module to Salvage Cyborgs id: 6218 time: '2024-08-06T01:14:31.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: Arachne have been reimplemented! + - type: Add + message: Oneirophages are back! + id: 6219 + time: '2024-08-06T04:52:32.0000000+00:00' From aed3baba152a568b0b291fe714beb68f6934761c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 6 Aug 2024 01:28:53 -0400 Subject: [PATCH 083/143] CPR Remake (#487) # Description This is a re implementation and complete rewrite of the original Nyanotrasen CPR feature, this time as its own completely standalone system. Unlike the original CPR, this system requires no modification of base game code, and can be toggled on and off via CVars while the server is running. Fixes #473 Fixes #49 # Changelog :cl: - add: CPR has been added to the game. People with CPR training can now perform CPR on anyone who is in either crit or dead states. - add: CPR Training has been added to the game as a new positive trait. All medical staff start with this trait for free. --------- Signed-off-by: VMSolidus --- Content.Server/Atmos/Rotting/RottingSystem.cs | 107 +------------ .../Atmos/Rotting/SharedRottingSystem.cs | 141 +++++++++++++++++- Content.Shared/CCVar/CCVars.cs | 49 ++++++ .../CPR/Components/CPRTrainingComponent.cs | 33 ++++ .../Medical/CPR/Systems/CPRSystem.CVars.cs | 27 ++++ .../Medical/CPR/Systems/CPRSystem.cs | 132 ++++++++++++++++ Resources/Audio/Effects/CPR.ogg | Bin 0 -> 68840 bytes .../components/cpr-training-component.ftl | 6 + Resources/Locale/en-US/traits/traits.ftl | 7 + .../DeltaV/Roles/Jobs/Security/brigmedic.yml | 3 + .../Prototypes/Roles/Jobs/Medical/chemist.yml | 4 + .../Jobs/Medical/chief_medical_officer.yml | 1 + .../Roles/Jobs/Medical/medical_doctor.yml | 4 + .../Roles/Jobs/Medical/medical_intern.yml | 4 + .../Roles/Jobs/Medical/paramedic.yml | 4 + .../Roles/Jobs/Medical/senior_physician.yml | 4 + Resources/Prototypes/Traits/skills.yml | 17 +++ 17 files changed, 431 insertions(+), 112 deletions(-) create mode 100644 Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs create mode 100644 Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs create mode 100644 Content.Shared/Medical/CPR/Systems/CPRSystem.cs create mode 100644 Resources/Audio/Effects/CPR.ogg create mode 100644 Resources/Locale/en-US/medical/components/cpr-training-component.ftl diff --git a/Content.Server/Atmos/Rotting/RottingSystem.cs b/Content.Server/Atmos/Rotting/RottingSystem.cs index 47bac84e0ca..5070b3f197f 100644 --- a/Content.Server/Atmos/Rotting/RottingSystem.cs +++ b/Content.Server/Atmos/Rotting/RottingSystem.cs @@ -1,15 +1,9 @@ -using Content.Shared.Damage; -using Content.Shared.Atmos; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; using Content.Server.Temperature.Components; +using Content.Shared.Atmos; using Content.Shared.Atmos.Rotting; -using Content.Shared.Examine; -using Content.Shared.IdentityManagement; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Rejuvenate; +using Content.Shared.Damage; using Robust.Server.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -22,83 +16,16 @@ public sealed class RottingSystem : SharedRottingSystem [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPerishableMapInit); - SubscribeLocalEvent(OnMobStateChanged); - SubscribeLocalEvent(OnPerishableExamined); - - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnRottingMobStateChanged); SubscribeLocalEvent(OnGibbed); - SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnTempIsRotting); } - private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) - { - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) - { - if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) - return; - - if (HasComp(uid)) - return; - - component.RotAccumulator = TimeSpan.Zero; - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) - { - if (TryComp(uid, out var perishable)) - { - perishable.RotNextUpdate = TimeSpan.Zero; - } - } - - private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) - { - if (args.NewMobState == MobState.Dead) - return; - RemCompDeferred(uid, component); - } - - public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) - { - // things don't perish by default. - if (!Resolve(uid, ref perishable, false)) - return false; - - // only dead things or inanimate objects can rot - if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) - return false; - - if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && - HasComp(container.Owner)) - { - return false; - } - - var ev = new IsRottingEvent(); - RaiseLocalEvent(uid, ref ev); - - return !ev.Handled; - } - - public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) - { - return Resolve(uid, ref rotting, false); - } - private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEvent args) { if (!TryComp(uid, out var physics)) @@ -112,36 +39,6 @@ private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEven tileMix?.AdjustMoles(Gas.Ammonia, molsToDump); } - private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) - { - int stage = PerishStage(perishable, MaxStages); - if (stage < 1 || stage > MaxStages) - { - // We dont push an examined string if it hasen't started "perishing" or it's already rotting - return; - } - - var isMob = HasComp(perishable); - var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); - args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); - } - - /// - /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to - /// generate examine messages for items that are starting to rot. - /// - public int PerishStage(Entity perishable, int maxStages) - { - if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) - return 0; - return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); - } - - private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) - { - RemCompDeferred(uid); - } - private void OnTempIsRotting(EntityUid uid, TemperatureComponent component, ref IsRottingEvent args) { if (args.Handled) diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 5e1758203a8..840818dee59 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -1,29 +1,85 @@ using Content.Shared.Examine; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs; using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Rejuvenate; +using Robust.Shared.Containers; +using Robust.Shared.Timing; namespace Content.Shared.Atmos.Rotting; public abstract class SharedRottingSystem : EntitySystem { + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + public const int MaxStages = 3; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnPerishableMapInit); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnPerishableExamined); + + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnRottingMobStateChanged); + SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnExamined); } - /// - /// Return the rot stage, usually from 0 to 2 inclusive. - /// - public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) { - if (!Resolve(uid, ref comp, ref perishable)) - return 0; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } - return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) + return; + + if (HasComp(uid)) + return; + + component.RotAccumulator = TimeSpan.Zero; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } + + private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) + { + int stage = PerishStage(perishable, MaxStages); + if (stage < 1 || stage > MaxStages) + { + // We dont push an examined string if it hasen't started "perishing" or it's already rotting + return; + } + + var isMob = HasComp(perishable); + var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); + args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); + } + + private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) + { + if (TryComp(uid, out var perishable)) + { + perishable.RotNextUpdate = TimeSpan.Zero; + } + } + + private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + return; + RemCompDeferred(uid, component); + } + + private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) + { + RemCompDeferred(uid); } private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args) @@ -41,4 +97,75 @@ private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(uid, EntityManager)))); } + + /// + /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to + /// generate examine messages for items that are starting to rot. + /// + public int PerishStage(Entity perishable, int maxStages) + { + if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) + return 0; + return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); + } + + public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) + { + // things don't perish by default. + if (!Resolve(uid, ref perishable, false)) + return false; + + // only dead things or inanimate objects can rot + if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) + return false; + + if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && + HasComp(container.Owner)) + { + return false; + } + + var ev = new IsRottingEvent(); + RaiseLocalEvent(uid, ref ev); + + return !ev.Handled; + } + + public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) + { + return Resolve(uid, ref rotting, false); + } + + public void ReduceAccumulator(EntityUid uid, TimeSpan time) + { + if (!TryComp(uid, out var perishable)) + return; + + if (!TryComp(uid, out var rotting)) + { + perishable.RotAccumulator -= time; + return; + } + var total = (rotting.TotalRotTime + perishable.RotAccumulator) - time; + + if (total < perishable.RotAfter) + { + RemCompDeferred(uid, rotting); + perishable.RotAccumulator = total; + } + + else + rotting.TotalRotTime = total - perishable.RotAfter; + } + + /// + /// Return the rot stage, usually from 0 to 2 inclusive. + /// + public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + { + if (!Resolve(uid, ref comp, ref perishable)) + return 0; + + return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index facbd1d71b6..3fc7e7247e6 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2291,6 +2291,55 @@ public static readonly CVarDef /// public static readonly CVarDef StationGoalsChance = CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); + + + #region CPR System + /// + /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too + /// if you are wishing to permanently disable the system on your server. + /// + public static readonly CVarDef EnableCPR = + CVarDef.Create("cpr.enable", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) + /// + public static readonly CVarDef CPRReducesRot = + CVarDef.Create("cpr.reduces_rot", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR heals airloss, included for completeness sake. I'm not going to stop you if your intention is to make CPR do nothing. + /// I guess it might be funny to troll your players with? I won't judge. + /// + public static readonly CVarDef CPRHealsAirloss = + CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// The chance for a patient to be resuscitated when CPR is successfully performed. + /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. + /// + public static readonly CVarDef CPRResuscitationChance = + CVarDef.Create("cpr.resuscitation_chance", 0.05f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount + /// of rot reduction. Set it to 2 for if you want 3 seconds of CPR to reduce 6 seconds of rot. + /// + /// + /// If you're wondering why there isn't a CVar for setting the duration of the doafter, that's because it's not actually possible to have a timespan in cvar form + /// Curiously, it's also not possible for **shared** systems to set variable timespans. Which is where this system lives. + /// + public static readonly CVarDef CPRRotReductionMultiplier = + CVarDef.Create("cpr.rot_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR heals airloss by 1 point for every second spent performing CPR. Just like above, this directly multiplies the healing amount. + /// Set it to 2 to get 6 points of airloss healing for every 3 seconds of CPR. + /// + public static readonly CVarDef CPRAirlossReductionMultiplier = + CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + #endregion #region Contests System diff --git a/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs new file mode 100644 index 00000000000..e01250858a1 --- /dev/null +++ b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs @@ -0,0 +1,33 @@ +using Robust.Shared.GameStates; +using Content.Shared.DoAfter; +using Robust.Shared.Audio; +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical.CPR +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class CPRTrainingComponent : Component + { + [DataField] + public SoundSpecifier CPRSound = new SoundPathSpecifier("/Audio/Effects/CPR.ogg"); + + /// + /// How long the doafter for CPR takes + /// + [DataField] + public TimeSpan DoAfterDuration = TimeSpan.FromSeconds(3); + + [DataField] + public int AirlossHeal = 6; + + [DataField] + public float CrackRibsModifier = 1f; + public EntityUid? CPRPlayingStream; + } + + [Serializable, NetSerializable] + public sealed partial class CPRDoAfterEvent : SimpleDoAfterEvent + { + + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs new file mode 100644 index 00000000000..9840b8ffbd4 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs @@ -0,0 +1,27 @@ +using Content.Shared.CCVar; +using Robust.Shared.Configuration; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem + { + [Dependency] private readonly IConfigurationManager _cfg = default!; + + public bool EnableCPR { get; private set; } + public bool HealsAirloss { get; private set; } + public bool ReducesRot { get; private set; } + public float ResuscitationChance { get; private set; } + public float RotReductionMultiplier { get; private set; } + public float AirlossReductionMultiplier { get; private set; } + + private void InitializeCVars() + { + Subs.CVar(_cfg, CCVars.EnableCPR, value => EnableCPR = value, true); + Subs.CVar(_cfg, CCVars.CPRHealsAirloss, value => HealsAirloss = value, true); + Subs.CVar(_cfg, CCVars.CPRReducesRot, value => ReducesRot = value, true); + Subs.CVar(_cfg, CCVars.CPRResuscitationChance, value => ResuscitationChance = value, true); + Subs.CVar(_cfg, CCVars.CPRRotReductionMultiplier, value => RotReductionMultiplier = value, true); + Subs.CVar(_cfg, CCVars.CPRAirlossReductionMultiplier, value => AirlossReductionMultiplier = value, true); + } + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs new file mode 100644 index 00000000000..799c0664a66 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs @@ -0,0 +1,132 @@ +using Content.Shared.Popups; +using Content.Shared.Atmos.Rotting; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Inventory; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Verbs; +using Robust.Shared.Network; +using Robust.Shared.Utility; +using Robust.Shared.Random; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem : EntitySystem + { + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedRottingSystem _rottingSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly INetManager _net = default!; + public override void Initialize() + { + base.Initialize(); + InitializeCVars(); + SubscribeLocalEvent>(AddCPRVerb); + SubscribeLocalEvent(OnCPRDoAfter); + } + + private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsEvent args) + { + if (!EnableCPR || !args.CanInteract || !args.CanAccess + || !TryComp(args.Target, out var targetState) + || targetState.CurrentState == MobState.Alive) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCPR(uid, args.Target, component); + }, + Text = Loc.GetString("cpr-verb"), + Icon = new SpriteSpecifier.Rsi(new("Interface/Alerts/human_alive.rsi"), "health4"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void StartCPR(EntityUid performer, EntityUid target, CPRTrainingComponent cprComponent) + { + if (HasComp(target)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-target-rotting", ("entity", target)), performer, performer); + return; + } + + if (_inventory.TryGetSlotEntity(target, "outerClothing", out var outer)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", outer)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(target, "mask", out var mask)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", mask)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(performer, "mask", out var maskSelf)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove-own-mask", ("clothing", maskSelf)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_net.IsServer) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person", ("target", target)), target, performer, PopupType.Medium); + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person-patient", ("user", performer)), target, target, PopupType.Medium); + cprComponent.CPRPlayingStream = _audio.PlayPvs(cprComponent.CPRSound, performer).Value.Entity; + } + + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, performer, cprComponent.DoAfterDuration, new CPRDoAfterEvent(), performer, target, performer) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true, + BlockDuplicate = true + }); + } + + private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, CPRDoAfterEvent args) + { + component.CPRPlayingStream = _audio.Stop(component.CPRPlayingStream); + + if (args.Target == null) + return; + + if (HealsAirloss) + { + // There is PROBABLY a better way to do this, by all means let me know + var healing = new DamageSpecifier() + { + DamageDict = new() + { + { "Asphyxiation", -component.AirlossHeal * AirlossReductionMultiplier} + } + }; + _damageable.TryChangeDamage(args.Target, healing, true, origin: performer); + } + + if (ReducesRot) + _rottingSystem.ReduceAccumulator((EntityUid) args.Target, component.DoAfterDuration * RotReductionMultiplier); + + if (_robustRandom.Prob(ResuscitationChance) + && _mobThreshold.TryGetThresholdForState((EntityUid) args.Target, MobState.Dead, out var threshold) + && TryComp(args.Target, out var damageableComponent) + && TryComp(args.Target, out var state) + && damageableComponent.TotalDamage < threshold) + { + _mobStateSystem.ChangeMobState(args.Target.Value, MobState.Critical, state, performer); + } + } + } +} diff --git a/Resources/Audio/Effects/CPR.ogg b/Resources/Audio/Effects/CPR.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2c7cedd2033c906029dcd1a8d90ab45b68bb0eba GIT binary patch literal 68840 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.mL>w?>>sa5J>hq2ux0H{*l6BSYS#*3Iz* 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

UUXQ{C-_~qG0dZv#l zCq_`E1x}SXgE`LQ zbrkgM_!ki11;k1qn1qlZ>3gGrlgiLc#;m7K+btJxRUTw*KY!M+G`4Gt zL!o!!t=q2pemc#DBobXk8@LecZ1vX+_U7cn-s3Nuw@%JLOx~W!vzwR2bO^gmY#ziR zUK28rv(w!%)+>qaP>q0wG|pQ;ayN|XGy)-K(|n*6JhSMK^}`F;Gat8djN-&9FH=U! zsK3F?$t=T;b=4`y+%#7bn0I?kP%P>~@yAbAJQn=iG=p{a8IT`UnE>*YwrMn$s#oO5 z6iX+$Om%$BuDNgi;4^=+4O`#AosL~gZ`25mst4u!QO5{fn{Aw>=I2~KYu4*$`>aF< zbDaIJ<%@4cdef;_BOB-{)ka=X;=rvhAHaElEJ}-Cge??rQT1Bep`4 z!1bNMLnhXf^IT+eXG*#(G(xB&sGsoAVnit6VgDJan8Bk4j?{f?<(_{#p~^jeN+mmo zGjPAi%Fd`+hRUKI1anaj?b928=EI88MEdokw_o2lKr4qJXd)+7R^F?3vf9ZSx|Q)G%#oW)tK_F)G}i&WSGGgV`sud z@r&}eb`%(1F&@sw@a0-a7d_o{$3&06>Ph{Bc)?bOqvA$`en>yJUJO-l^t=q%U1`WL z&qmmLx9pS}1!N15KFR3mckDlFz1VA(*~nVgEZvv#^SJ1MKUePm&`;*)_Q5%%&-gK(#xusMm618_PK{3@q~EU~XZe$M&vt;f`H3MH)H${hE|8*v&w7%IHE zPrkO={i3yfl-3lldHS4xJjzgBp&%7|R^q$$kp%K$)Rj6lJJX{zYT7qr)bh~8*I|OQ z&L4bMQ=tOvb)D@n{%fE!#gpQp$R{n7&enr!dSA4fthW9_%PR7IG)munD@O8?ip}58 zca0nu96BFafheG3^VgdK=Q%hmS(?upPCSZIhtCMT-uYi{(qMOW6`rGjAR;NjPF{u*AI~i89u%rBwDN`}Qeqk4b3f(A;2d zDH3A|Ri0Lh6oH_qWe4p=I3}vleR@IH16MxdA)A{vzv6*shF6v7j2rEF`SBaE10h|Z*(!2 ze~QwpJ)Sy=2YaX)ZgcPMDT`6<@f zg%_l-DW-TWxzD}PFlbg;_7oJW+6ek9H{b>|QHofMuIW6{&+GnW`RMH3^SKbY_2tkO zvn}aqp|=Vr5&S0k2&RTn(u?#vW(9ou0$4mYcreMDiSf8$7q1eJx^zT5us!&vy;(f?OFBw;9M`vdbK zK{?81CVms{)hG|uU0UO)g_fji5c8?fnu0Eh| zkLwv}W6It$n=sDMD!>=$$m#9M2_s61?#A{)7m9y1`eG&pEwWz&ak0>}+{#72V%ud; zjgxJpME!VWj%M=@>MwT-tb^P>tC6n8JduY^!cRcVGkeb`U?!F%0DR4#*wG66TX&!Z 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/medical/components/cpr-training-component.ftl b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl new file mode 100644 index 00000000000..7ed824a369f --- /dev/null +++ b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl @@ -0,0 +1,6 @@ +cpr-start-second-person = You start performing CPR on {CAPITALIZE($target)}. +cpr-start-second-person-patient = {CAPITALIZE(THE($user))} starts performing CPR on you. +cpr-must-remove = You must remove {THE($clothing)} from the patient. +cpr-must-remove-own-mask = You must remove your {THE($clothing)}. +cpr-target-rotting = {CAPITALIZE($entity)} is too far gone... +cpr-verb = Perform CPR diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 600a9834fd4..f4c4b158fce 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -35,6 +35,13 @@ trait-description-Stutter = You t-t-talk with a bit of a s-s-stutter... trait-name-Snoring = Snoring trait-description-Snoring = You will snore while sleeping. +trait-name-CPRTraining = CPR Training +trait-description-CPRTraining = At some point in your life, you have received training in how to perform CPR. + This trait is automatically given for free to medical doctors, and is intended for non-medical characters + +trait-name-NormalVisionHarpy = Trichromat Modification +trait-description-NormalVisionHarpy = Your eyes have been modified by means of advanced medicine to see in the standard colors of Red, Green, and Blue. + trait-name-Southern = Southern Drawl trait-description-Southern = You have a different way of speakin'. diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml index daf7f1195c0..f4b2fe95e14 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml @@ -26,6 +26,9 @@ special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: CorpsmanGear # see Prototypes/Roles/Jobs/Fun/misc_startinggear.yml for "BrigmedicGear" diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index 3fe22792092..66466352cbe 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -14,6 +14,10 @@ - Medical - Chemistry - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ChemistGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index 4a65b791283..61b1df7784f 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -44,6 +44,7 @@ components: - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. flatBonus: 0.025 + - type: CPRTraining - type: startingGear id: CMOGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index cc048470f0c..627b0e17dc3 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -16,6 +16,10 @@ extendedAccess: - Chemistry - Paramedic # DeltaV - Add Paramedic access + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: DoctorGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml index 0166a3dfadb..003eab22d25 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml @@ -15,6 +15,10 @@ access: - Medical - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: MedicalInternGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml index 9e3484a8dcf..0937a4627ae 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml @@ -23,6 +23,10 @@ - Paramedic # DeltaV - Add Paramedic access extendedAccess: - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ParamedicGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml index ac6e0620f5a..d13fd18afdd 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml @@ -21,6 +21,10 @@ - Medical - Maintenance - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: SeniorPhysicianGear diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 16b628a56d8..b23e0216224 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -1,3 +1,20 @@ +- type: trait + id: CPRTraining + category: Mental + points: -2 + components: + - type: CPRTraining + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - MedicalDoctor + - Chemist + - MedicalIntern + - Paramedic + - ChiefMedicalOfficer + - Brigmedic + - type: trait id: HeavyweightDrunk category: Physical From b1674d169148573dfcc11a26156c1a4559672337 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 05:29:22 +0000 Subject: [PATCH 084/143] Automatic Changelog Update (#487) --- Resources/Changelog/Changelog.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index afe00fec1f2..e294394372d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4948,3 +4948,15 @@ Entries: message: Oneirophages are back! id: 6219 time: '2024-08-06T04:52:32.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + CPR has been added to the game. People with CPR training can now perform + CPR on anyone who is in either crit or dead states. + - type: Add + message: >- + CPR Training has been added to the game as a new positive trait. All + medical staff start with this trait for free. + id: 6220 + time: '2024-08-06T05:28:54.0000000+00:00' From 22ff27c0985a04bf16a4e567326dfbd4ada4450e Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Tue, 6 Aug 2024 16:05:58 +0800 Subject: [PATCH 085/143] New Trait: Self-Aware (#680) # Description **Self-Aware** is a 2-point Mental trait that allows you to precisely examine your Brute/Burn damage as if using a health analyzer, and estimate the level of your toxin/airloss damage. Inspired by the SS13 trait of the same name. ## Media

Expand **Trait entry** ![image](https://github.com/user-attachments/assets/8faae16f-7dd5-42cd-8332-c65a0c610429) **No damage** ![image](https://github.com/user-attachments/assets/72bfa0f4-57fa-4b8d-b974-a604b4030ea6) **Damaged** ![image](https://github.com/user-attachments/assets/ec6318b4-41dc-4d3b-9aec-8f02333363e7)
# Changelog :cl: Skubman add: Add the Self-Aware trait, a 2-point trait that allows you to examine your Brute/Burn damage numbers like a health analyzer, and estimate your toxin/airloss damage. --------- Signed-off-by: Angelo Fallaria Co-authored-by: VMSolidus --- .../Body/Systems/BloodstreamSystem.cs | 15 ++- .../HealthExaminableComponent.cs | 8 +- .../HealthExaminableSystem.cs | 116 +++++++++++++++++- .../Traits/Assorted/SelfAwareComponent.cs | 31 +++++ .../Locale/en-US/bloodstream/bloodstream.ftl | 4 + .../health-examinable-selfaware.ftl | 22 ++++ Resources/Locale/en-US/traits/traits.ftl | 6 + Resources/Prototypes/Traits/skills.yml | 18 +++ 8 files changed, 210 insertions(+), 10 deletions(-) create mode 100644 Content.Server/Traits/Assorted/SelfAwareComponent.cs create mode 100644 Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 9e29fdf7568..0edb190c16e 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -242,20 +242,29 @@ private void OnHealthBeingExamined(Entity ent, ref HealthB if (ent.Comp.BleedAmount > ent.Comp.MaxBleedAmount / 2) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-profusely-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-profusely-bleeding")); } // Shows bleeding message when bleeding, but less than profusely. else if (ent.Comp.BleedAmount > 0) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-bleeding", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-bleeding")); } // If the mob's blood level is below the damage threshhold, the pale message is added. if (GetBloodLevelPercentage(ent, ent) < ent.Comp.BloodlossThreshold) { args.Message.PushNewline(); - args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + if (!args.IsSelfAware) + args.Message.AddMarkup(Loc.GetString("bloodstream-component-looks-pale", ("target", ent.Owner))); + else + args.Message.AddMarkup(Loc.GetString("bloodstream-component-selfaware-looks-pale")); } } diff --git a/Content.Server/HealthExaminable/HealthExaminableComponent.cs b/Content.Server/HealthExaminable/HealthExaminableComponent.cs index 3f434a93cfe..04053aed70e 100644 --- a/Content.Server/HealthExaminable/HealthExaminableComponent.cs +++ b/Content.Server/HealthExaminable/HealthExaminableComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Damage.Prototypes; +using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; @@ -7,8 +7,12 @@ namespace Content.Server.HealthExaminable; [RegisterComponent, Access(typeof(HealthExaminableSystem))] public sealed partial class HealthExaminableComponent : Component { + // + // The thresholds for determining the examine text for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // public List Thresholds = new() - { FixedPoint2.New(10), FixedPoint2.New(25), FixedPoint2.New(50), FixedPoint2.New(75) }; + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.50), FixedPoint2.New(0.75) }; [DataField("examinableTypes", required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] public HashSet ExaminableTypes = default!; diff --git a/Content.Server/HealthExaminable/HealthExaminableSystem.cs b/Content.Server/HealthExaminable/HealthExaminableSystem.cs index ed69a1c096a..89291726fbe 100644 --- a/Content.Server/HealthExaminable/HealthExaminableSystem.cs +++ b/Content.Server/HealthExaminable/HealthExaminableSystem.cs @@ -1,15 +1,20 @@ -using Content.Shared.Damage; +using Content.Server.Traits.Assorted; +using Content.Shared.Damage; using Content.Shared.Examine; using Content.Shared.FixedPoint; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; using Content.Shared.Verbs; using Robust.Shared.Utility; +using System.Linq; namespace Content.Server.HealthExaminable; public sealed class HealthExaminableSystem : EntitySystem { [Dependency] private readonly ExamineSystemShared _examineSystem = default!; + [Dependency] private readonly MobThresholdSystem _threshold = default!; public override void Initialize() { @@ -29,7 +34,13 @@ private void OnGetExamineVerbs(EntityUid uid, HealthExaminableComponent componen { Act = () => { - var markup = CreateMarkup(uid, component, damage); + FormattedMessage markup; + if (uid == args.User + && TryComp(uid, out var selfAware)) + markup = CreateMarkupSelfAware(uid, selfAware, component, damage); + else + markup = CreateMarkup(uid, component, damage); + _examineSystem.SendExamineTooltip(args.User, uid, markup, false, false); }, Text = Loc.GetString("health-examinable-verb-text"), @@ -47,6 +58,9 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c var msg = new FormattedMessage(); var first = true; + + var adjustedThresholds = GetAdjustedThresholds(uid, component.Thresholds); + foreach (var type in component.ExaminableTypes) { if (!damage.Damage.DamageDict.TryGetValue(type, out var dmg)) @@ -58,7 +72,7 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c FixedPoint2 closest = FixedPoint2.Zero; string chosenLocStr = string.Empty; - foreach (var threshold in component.Thresholds) + foreach (var threshold in adjustedThresholds) { var str = $"health-examinable-{component.LocPrefix}-{type}-{threshold}"; var tempLocStr = Loc.GetString($"health-examinable-{component.LocPrefix}-{type}-{threshold}", ("target", Identity.Entity(uid, EntityManager))); @@ -94,10 +108,100 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c } // Anything else want to add on to this? - RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true); + RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg, false), true); return msg; } + + private FormattedMessage CreateMarkupSelfAware(EntityUid target, SelfAwareComponent selfAware, HealthExaminableComponent component, DamageableComponent damage) + { + var msg = new FormattedMessage(); + + var first = true; + + foreach (var type in selfAware.AnalyzableTypes) + { + if (!damage.Damage.DamageDict.TryGetValue(type, out var typeDmgUnrounded)) + continue; + + var typeDmg = (int) Math.Round(typeDmgUnrounded.Float(), 0); + if (typeDmg <= 0) + continue; + + var damageString = Loc.GetString( + "health-examinable-selfaware-type-text", + ("damageType", Loc.GetString($"health-examinable-selfaware-type-{type}")), + ("amount", typeDmg) + ); + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(damageString); + } + + var adjustedThresholds = GetAdjustedThresholds(target, selfAware.Thresholds); + + foreach (var group in selfAware.DetectableGroups) + { + if (!damage.DamagePerGroup.TryGetValue(group, out var groupDmg) + || groupDmg == FixedPoint2.Zero) + continue; + + FixedPoint2 closest = FixedPoint2.Zero; + + string chosenLocStr = string.Empty; + foreach (var threshold in adjustedThresholds) + { + var locName = $"health-examinable-selfaware-group-{group}-{threshold}"; + var locStr = Loc.GetString(locName); + + var locDoesNotExist = locStr == locName; + if (locDoesNotExist) + continue; + + if (groupDmg > threshold && threshold > closest) + { + chosenLocStr = locStr; + closest = threshold; + } + } + + if (closest == FixedPoint2.Zero) + continue; + + if (!first) + msg.PushNewline(); + else + first = false; + msg.AddMarkup(chosenLocStr); + } + + if (msg.IsEmpty) + msg.AddMarkup(Loc.GetString($"health-examinable-selfaware-none")); + + // Event listeners can know if the examination is Self-Aware. + RaiseLocalEvent(target, new HealthBeingExaminedEvent(msg, true), true); + + return msg; + } + + /// + /// Return thresholds as percentages of an entity's critical threshold. + /// + private List GetAdjustedThresholds(EntityUid uid, List thresholdPercentages) + { + FixedPoint2 critThreshold = 0; + if (TryComp(uid, out var threshold)) + critThreshold = _threshold.GetThresholdForState(uid, Shared.Mobs.MobState.Critical, threshold); + + // Fallback to 100 crit threshold if none found + if (critThreshold == 0) + critThreshold = 100; + + return thresholdPercentages.Select(percentage => critThreshold * percentage).ToList(); + } } /// @@ -108,9 +212,11 @@ private FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent c public sealed class HealthBeingExaminedEvent { public FormattedMessage Message; + public bool IsSelfAware; - public HealthBeingExaminedEvent(FormattedMessage message) + public HealthBeingExaminedEvent(FormattedMessage message, bool isSelfAware) { Message = message; + IsSelfAware = isSelfAware; } } diff --git a/Content.Server/Traits/Assorted/SelfAwareComponent.cs b/Content.Server/Traits/Assorted/SelfAwareComponent.cs new file mode 100644 index 00000000000..03f5cd15502 --- /dev/null +++ b/Content.Server/Traits/Assorted/SelfAwareComponent.cs @@ -0,0 +1,31 @@ +using Content.Shared.Damage.Prototypes; +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Self-Aware trait to enhance the information received from HealthExaminableSystem. +/// +[RegisterComponent] +public sealed partial class SelfAwareComponent : Component +{ + // + // Damage types that an entity is able to precisely analyze like a health analyzer when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet AnalyzableTypes = default!; + + // + // Damage groups that an entity is able to detect the presence of when they examine themselves. + // + [DataField(required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] + public HashSet DetectableGroups = default!; + + // + // The thresholds for determining the examine text of DetectableGroups for certain amounts of damage. + // These are calculated as a percentage of the entity's critical threshold. + // + public List Thresholds = new() + { FixedPoint2.New(0.10), FixedPoint2.New(0.25), FixedPoint2.New(0.40), FixedPoint2.New(0.60) }; +} diff --git a/Resources/Locale/en-US/bloodstream/bloodstream.ftl b/Resources/Locale/en-US/bloodstream/bloodstream.ftl index 7d8f98c3087..65e475f1ab4 100644 --- a/Resources/Locale/en-US/bloodstream/bloodstream.ftl +++ b/Resources/Locale/en-US/bloodstream/bloodstream.ftl @@ -3,3 +3,7 @@ bloodstream-component-bleeding = [color=red]{CAPITALIZE(SUBJECT($target))} {CONJ bloodstream-component-profusely-bleeding = [color=crimson]{CAPITALIZE(SUBJECT($target))} {CONJUGATE-BE($target)} profusely bleeding![/color] bloodstream-component-wounds-cauterized = You feel your wounds painfully close! + +bloodstream-component-selfaware-looks-pale = [color=bisque]You feel dizzy from blood loss.[/color] +bloodstream-component-selfaware-bleeding = [color=red]You are bleeding.[/color] +bloodstream-component-selfaware-profusely-bleeding = [color=crimson]You are profusely bleeding![/color] diff --git a/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl new file mode 100644 index 00000000000..897c3f718de --- /dev/null +++ b/Resources/Locale/en-US/health-examinable/health-examinable-selfaware.ftl @@ -0,0 +1,22 @@ +health-examinable-selfaware-none = You feel healthy and well. + +health-examinable-selfaware-type-text = You have {$damageType}, around [bold]{$amount}[/bold]. + +health-examinable-selfaware-type-Blunt = [color=red]Blunt[/color] trauma +health-examinable-selfaware-type-Slash = [color=red]Slash[/color] wounds +health-examinable-selfaware-type-Piercing = [color=red]Piercing[/color] wounds + +health-examinable-selfaware-type-Heat = [color=orange]Heat[/color] burns +health-examinable-selfaware-type-Shock = [color=lightgoldenrodyellow]Shock[/color] burns +health-examinable-selfaware-type-Cold = [color=lightblue]Cold[/color] burns +health-examinable-selfaware-type-Caustic = [color=yellowgreen]Caustic[/color] burns + +health-examinable-selfaware-group-Toxin-10 = [color=green]You feel sick.[/color] +health-examinable-selfaware-group-Toxin-25 = [color=green]You feel nauseated.[/color] +health-examinable-selfaware-group-Toxin-40 = [color=green]You feel very unwell![/color] +health-examinable-selfaware-group-Toxin-60 = [color=green]You feel gravely ill![/color] + +health-examinable-selfaware-group-Airloss-10 = [color=lightblue]You feel lightheaded.[/color] +health-examinable-selfaware-group-Airloss-25 = [color=lightblue]You feel faint and woozy.[/color] +health-examinable-selfaware-group-Airloss-40 = [color=lightblue]You're struggling to breathe![/color] +health-examinable-selfaware-group-Airloss-60 = [color=lightblue]You're suffocating badly![/color] diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index f4c4b158fce..07ef099f832 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -8,6 +8,12 @@ trait-description-Narcolepsy = You fall asleep randomly trait-name-Pacifist = Pacifist trait-description-Pacifist = You cannot attack or hurt any living beings. +trait-name-SelfAware = Self-Aware +trait-description-SelfAware = + You possess a keen intuition of your body and senses. + You can accurately examine the severity of your wounds and burns like a health analyzer, + and can gauge if you have toxin or airloss damage. + trait-name-LightweightDrunk = Lightweight Drunk trait-description-LightweightDrunk = Alcohol has a stronger effect on you diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index b23e0216224..6d10886e8fa 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -15,6 +15,24 @@ - ChiefMedicalOfficer - Brigmedic +- type: trait + id: SelfAware + category: Mental + points: -2 + components: + - type: SelfAware + analyzableTypes: + - Blunt + - Slash + - Piercing + - Heat + - Shock + - Cold + - Caustic + detectableGroups: + - Airloss + - Toxin + - type: trait id: HeavyweightDrunk category: Physical From 5fcec4720ed3fb3697aa3517ce7fcfb3228493ae Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 08:06:27 +0000 Subject: [PATCH 086/143] Automatic Changelog Update (#680) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e294394372d..01f1a833faf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4960,3 +4960,12 @@ Entries: medical staff start with this trait for free. id: 6220 time: '2024-08-06T05:28:54.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Self-Aware trait, a 2-point trait that allows you to examine + your Brute/Burn damage numbers like a health analyzer, and estimate your + toxin/airloss damage. + id: 6221 + time: '2024-08-06T08:05:59.0000000+00:00' From 498d070a73227dedb9e08636a6f574682b86f0d3 Mon Sep 17 00:00:00 2001 From: "Tad \"Taddy\" Johnson" <120885811+TadJohnson00@users.noreply.github.com> Date: Wed, 7 Aug 2024 05:05:46 +1000 Subject: [PATCH 087/143] Remove Overlay Restrict From Vulps (#683) # Description As title, will allow players to put as many overlay markings as required for their vulps. --- # Changelog :cl: TJohnson - tweak: Removed overlay restriction for vulps, you can now have as many overlay markings as you want! Signed-off-by: Tad "Taddy" Johnson <120885811+TadJohnson00@users.noreply.github.com> --- Resources/Prototypes/DeltaV/Species/vulpkanin.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml index 8a3cd4c47ce..e139279dd5c 100644 --- a/Resources/Prototypes/DeltaV/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Species/vulpkanin.yml @@ -62,9 +62,6 @@ points: 1 required: true defaultMarkings: [ VulpEar ] - Overlay: - points: 2 - required: false - type: humanoidBaseSprite id: MobVulpkaninHead From cb3ddd458132809a21f0bfc38028f0ed79795b83 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 19:06:41 +0000 Subject: [PATCH 088/143] Automatic Changelog Update (#683) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 01f1a833faf..39fcb78cfa7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4969,3 +4969,11 @@ Entries: toxin/airloss damage. id: 6221 time: '2024-08-06T08:05:59.0000000+00:00' +- author: TJohnson + changes: + - type: Tweak + message: >- + Removed overlay restriction for vulps, you can now have as many overlay + markings as you want! + id: 6222 + time: '2024-08-06T19:05:46.0000000+00:00' From 55aa822a96f2ef8777e3b17efff0d4b4860b7010 Mon Sep 17 00:00:00 2001 From: username <113782077+whateverusername0@users.noreply.github.com> Date: Wed, 7 Aug 2024 05:08:47 +1000 Subject: [PATCH 089/143] Stamina Damage Resistance Real (#679) # Description Added stamina damage resistance, acts the same way as armor does. Call this shock resistance if you wish :trollface: Just attach StaminaDamageResistance component to an entity with a set multiplier and have fun. Made all hardsuits 25% stun resistant by default. With some variety, e.g. nukie, ERT, captain, HoS suits are 50%, DS are 90%, etc. etc. This will not remove stuneta but it will make it more difficult to stamcrit a traitor or such. Some armor/batong ratios that you need to hit before the target is stamcritted: 0% - 3 batong hits 25% - 4 batong hits 50% - 6 batong hits 75% - 12 batong hits 90% - 28 batong hits :trollface: 100% - ![image](https://github.com/user-attachments/assets/da147676-520b-4e3c-b027-ef9dc6a7394b) # Changelog :cl: - add: Added different stamina damage resistance to hardsuits. --------- Co-authored-by: whateverusername0 --- .../Abilities/Boxer/BoxingSystem.cs | 4 +- .../Nyanotrasen/Abilities/Oni/OniSystem.cs | 4 +- .../Nyanotrasen/Psionics/PsionicsSystem.cs | 12 +++-- ...eHitEvent.cs => TakeStaminaDamageEvent.cs} | 12 ++--- .../Damage/Systems/StaminaSystem.cs | 35 ++++++++++----- .../Inventory/InventorySystem.Relay.cs | 2 + .../StaminaDamageResistanceComponent.cs | 12 +++++ .../StaminaDamageResistanceSystem.cs | 26 +++++++++++ .../Locale/en-US/armor/armor-examine.ftl | 1 + .../OuterClothing/base_clothingouter.yml | 2 + .../Clothing/OuterClothing/hardsuits.yml | 44 +++++++++++++++++++ 11 files changed, 128 insertions(+), 26 deletions(-) rename Content.Shared/Damage/Events/{StaminaMeleeHitEvent.cs => TakeStaminaDamageEvent.cs} (67%) create mode 100644 Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs create mode 100644 Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs index 8bb68cb6f55..6f533c34199 100644 --- a/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Boxer/BoxingSystem.cs @@ -14,7 +14,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnInit(EntityUid uid, BoxerComponent component, ComponentInit args) @@ -27,7 +27,7 @@ private void OnMeleeHit(EntityUid uid, BoxerComponent component, MeleeHitEvent a args.ModifiersList.Add(component.UnarmedModifiers); } - private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, BoxingGlovesComponent component, TakeStaminaDamageEvent args) { if (!_containerSystem.TryGetContainingContainer(uid, out var equipee)) return; diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index 6fdb27097e9..4fc078e85bc 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -21,7 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnEntRemoved); SubscribeLocalEvent(OnOniMeleeHit); SubscribeLocalEvent(OnHeldMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); } private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedIntoContainerMessage args) @@ -68,7 +68,7 @@ private void OnHeldMeleeHit(EntityUid uid, HeldByOniComponent component, MeleeHi args.ModifiersList.Add(oni.MeleeModifiers); } - private void OnStamHit(EntityUid uid, HeldByOniComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, HeldByOniComponent component, TakeStaminaDamageEvent args) { if (!TryComp(component.Holder, out var oni)) return; diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs index 5a96af2e96b..33505e3f6fc 100644 --- a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs +++ b/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs @@ -51,7 +51,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnMeleeHit); - SubscribeLocalEvent(OnStamHit); + SubscribeLocalEvent(OnStamHit); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnRemove); @@ -110,14 +110,12 @@ private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); } - private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, StaminaMeleeHitEvent args) + private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { var bonus = false; - foreach (var stam in args.HitList) - { - if (HasComp(stam.Entity)) - bonus = true; - } + + if (HasComp(args.Target)) + bonus = true; if (!bonus) return; diff --git a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs similarity index 67% rename from Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs rename to Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs index c5ed0ddb602..6fca9dc2ef3 100644 --- a/Content.Shared/Damage/Events/StaminaMeleeHitEvent.cs +++ b/Content.Shared/Damage/Events/TakeStaminaDamageEvent.cs @@ -1,5 +1,5 @@ using Content.Shared.Damage.Components; -using Robust.Shared.Collections; +using Content.Shared.Inventory; namespace Content.Shared.Damage.Events; @@ -7,12 +7,14 @@ namespace Content.Shared.Damage.Events; /// The components in the list are going to be hit, /// give opportunities to change the damage or other stuff. /// -public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs +public sealed class TakeStaminaDamageEvent : HandledEntityEventArgs, IInventoryRelayEvent { + public SlotFlags TargetSlots { get; } = ~SlotFlags.POCKET; + /// /// List of hit stamina components. /// - public List<(EntityUid Entity, StaminaComponent Component)> HitList; + public EntityUid Target; /// /// The multiplier. Generally, try to use *= or /= instead of overwriting. @@ -24,8 +26,8 @@ public sealed class StaminaMeleeHitEvent : HandledEntityEventArgs /// public float FlatModifier = 0; - public StaminaMeleeHitEvent(List<(EntityUid Entity, StaminaComponent Component)> hitList) + public TakeStaminaDamageEvent(EntityUid target) { - HitList = hitList; + Target = target; } } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index de5338615ee..5c46e6055d1 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -166,20 +166,20 @@ private void OnMeleeHit(EntityUid uid, StaminaDamageOnHitComponent component, Me toHit.Add((ent, stam)); } - var hitEvent = new StaminaMeleeHitEvent(toHit); - RaiseLocalEvent(uid, hitEvent); + foreach (var (ent, comp) in toHit) + { + var hitEvent = new TakeStaminaDamageEvent(ent); + RaiseLocalEvent(uid, hitEvent); - if (hitEvent.Handled) - return; + if (hitEvent.Handled) + return; - var damage = component.Damage; + var damage = component.Damage; - damage *= hitEvent.Multiplier; + damage *= hitEvent.Multiplier; - damage += hitEvent.FlatModifier; + damage += hitEvent.FlatModifier; - foreach (var (ent, comp) in toHit) - { TakeStaminaDamage(ent, damage / toHit.Count, comp, source: args.User, with: args.Weapon, sound: component.Sound); } } @@ -204,12 +204,27 @@ private void OnThrowHit(EntityUid uid, StaminaDamageOnCollideComponent component private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, EntityUid target) { + if (!TryComp(target, out var stamComp)) + return; + var ev = new StaminaDamageOnHitAttemptEvent(); RaiseLocalEvent(uid, ref ev); if (ev.Cancelled) return; - TakeStaminaDamage(target, component.Damage, source: uid, sound: component.Sound); + var hitEvent = new TakeStaminaDamageEvent(target); + RaiseLocalEvent(target, hitEvent); + + if (hitEvent.Handled) + return; + + var damage = component.Damage; + + damage *= hitEvent.Multiplier; + + damage += hitEvent.FlatModifier; + + TakeStaminaDamage(target, damage, source: uid, sound: component.Sound); } private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs index c43a5885077..3308e881c52 100644 --- a/Content.Shared/Inventory/InventorySystem.Relay.cs +++ b/Content.Shared/Inventory/InventorySystem.Relay.cs @@ -1,5 +1,6 @@ using Content.Shared.Chemistry; using Content.Shared.Damage; +using Content.Shared.Damage.Events; using Content.Shared.Electrocution; using Content.Shared.Explosion; using Content.Shared.Eye.Blinding.Systems; @@ -20,6 +21,7 @@ public partial class InventorySystem public void InitializeRelay() { SubscribeLocalEvent(RelayInventoryEvent); + SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); SubscribeLocalEvent(RelayInventoryEvent); diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs new file mode 100644 index 00000000000..dc291bbe8ba --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceComponent.cs @@ -0,0 +1,12 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Stunnable; + +[RegisterComponent, NetworkedComponent] +public sealed partial class StaminaDamageResistanceComponent : Component +{ + /// + /// 1 - no reduction, 0 - full reduction + /// + [DataField] public float Coefficient = 1; +} diff --git a/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs new file mode 100644 index 00000000000..7632eed504d --- /dev/null +++ b/Content.Shared/Stunnable/StaminaDamageResistanceSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Examine; +using Content.Shared.Inventory; + +namespace Content.Shared.Stunnable; + +public sealed partial class StaminaDamageResistanceSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnStaminaMeleeHit); + SubscribeLocalEvent(OnExamine); + } + + private void OnStaminaMeleeHit(Entity ent, ref InventoryRelayedEvent args) + { + args.Args.Multiplier *= ent.Comp.Coefficient; + } + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + var percentage = (1 - ent.Comp.Coefficient) * 100; + args.PushMarkup(Loc.GetString("armor-examine-stamina", ("num", percentage))); + } +} diff --git a/Resources/Locale/en-US/armor/armor-examine.ftl b/Resources/Locale/en-US/armor/armor-examine.ftl index d49a1373f28..6dc511e66e5 100644 --- a/Resources/Locale/en-US/armor/armor-examine.ftl +++ b/Resources/Locale/en-US/armor/armor-examine.ftl @@ -17,3 +17,4 @@ armor-damage-type-cold = Cold armor-damage-type-poison = Poison armor-damage-type-shock = Shock armor-damage-type-structural = Structural +armor-examine-stamina = Reduces your stamina damage by [color=cyan]{$num}%[/color]. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 36327fe1f78..d6a2cd446be 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -142,6 +142,8 @@ - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index e0d8e7290da..70ab3016469 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -100,6 +100,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineering + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Spationaut Hardsuit - type: entity @@ -221,6 +223,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurity + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Brigmedic Hardsuit - type: entity @@ -248,6 +252,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #Warden's Hardsuit - type: entity @@ -278,6 +284,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWarden + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Captain's Hardsuit - type: entity @@ -310,6 +318,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCap + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Chief Engineer's Hardsuit - type: entity @@ -345,6 +355,8 @@ - type: ClothingGrantComponent component: - type: SupermatterImmune + - type: StaminaDamageResistance + coefficient: 0.65 # 35% #Chief Medical Officer's Hardsuit - type: entity @@ -412,6 +424,8 @@ price: 750 - type: StealTarget stealGroup: ClothingOuterHardsuitRd + - type: StaminaDamageResistance + coefficient: 0.75 # 25% as in "shock resistance" :trollface: #Head of Security's Hardsuit - type: entity @@ -443,6 +457,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSecurityRed + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Luxury Mining Hardsuit - type: entity @@ -520,6 +536,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% # Syndicate Medic Hardsuit - type: entity @@ -539,6 +557,8 @@ - Hardsuit - WhitelistChameleon - HidesHarpyWings + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Elite Hardsuit - type: entity @@ -575,6 +595,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieElite + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Syndicate Commander Hardsuit - type: entity @@ -607,6 +629,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitSyndieCommander + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Cybersun Juggernaut Hardsuit - type: entity @@ -639,6 +663,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitCybersun + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Wizard Hardsuit - type: entity @@ -671,6 +697,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitWizard + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Ling Space Suit - type: entity @@ -766,6 +794,8 @@ clothingPrototype: ClothingHeadHelmetHardsuitPirateCap - type: StaticPrice price: 0 + - type: StaminaDamageResistance + coefficient: 0.75 # 25% #CENTCOMM / ERT HARDSUITS #ERT Leader Hardsuit @@ -781,6 +811,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertleader.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTLeader + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Chaplain Hardsuit - type: entity @@ -795,6 +827,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertchaplain.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTChaplain + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Engineer Hardsuit - type: entity @@ -809,6 +843,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertengineer.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTEngineer + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Medic Hardsuit - type: entity @@ -823,6 +859,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertmedical.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTMedical + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Security Hardsuit - type: entity @@ -841,6 +879,8 @@ tags: - Hardsuit - WhitelistChameleon + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #ERT Janitor Hardsuit - type: entity @@ -855,6 +895,8 @@ sprite: Clothing/OuterClothing/Hardsuits/ERTSuits/ertjanitor.rsi - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitERTJanitor + - type: StaminaDamageResistance + coefficient: 0.5 # 50% #Deathsquad - type: entity @@ -889,6 +931,8 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitDeathsquad + - type: StaminaDamageResistance + coefficient: 0.1 # 90% #CBURN Hardsuit - type: entity From b7d30808f78456443343312d16b64ae01ea54d10 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 19:09:14 +0000 Subject: [PATCH 090/143] Automatic Changelog Update (#679) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 39fcb78cfa7..018c5adbd0d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4977,3 +4977,9 @@ Entries: markings as you want! id: 6222 time: '2024-08-06T19:05:46.0000000+00:00' +- author: whateverusername0 + changes: + - type: Add + message: Added different stamina damage resistance to hardsuits. + id: 6223 + time: '2024-08-06T19:08:48.0000000+00:00' From 6ab179737b5f42b800ab7436791509e9cc917254 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 7 Aug 2024 03:12:33 +0800 Subject: [PATCH 091/143] New Trait: Blood Deficiency (#686) # Description **Blood Deficiency** is a +2 points negative Physical trait that makes you slowly lose blood over time. When left untreated you will die from blood loss. Inspired by the SS13 trait of the same name. Slash/Piercing weapons and bleeding are much more lethal against you. The moment you start taking **any** blood loss damage, you start dying because you can't regenerate blood. Even just two consecutive kitchen knife stabs will make you bleed enough to die slowly unless you immediately apply gauze. Blood packs, iron pills (or copper for Arachnids), and gauze to stop bleeding will help you survive with this trait. Here's how the timeline looks for untreated blood deficiency: - ~0-21 minutes: losing blood slowly - ~21-31 minutes: blood level below 90%, start taking bloodloss damage - ~31-33 minutes: critical - ~34 minutes: death ## Media
Expand **Trait entry** ![image](https://github.com/user-attachments/assets/ea4a0c3c-7c05-45fc-8a32-48957701a246) ![image](https://github.com/user-attachments/assets/37398779-90a4-4f4f-a183-38d806184394) As shown above, even just reducing the blood volume to less than 90% means you will die a slow and painful death.

# Changelog :cl: Skubman - add: Add the Blood Deficiency trait, a new negative trait that makes you slowly lose blood over time. You must routinely receive blood loss treatment to live, and even normally non-lethal bleeding can make you start dying slowly. --- .../Body/Components/BloodstreamComponent.cs | 15 ++++++++++- .../Body/Systems/BloodstreamSystem.cs | 25 +++++++++++++++---- .../Traits/BloodDeficiencyComponent.cs | 14 +++++++++++ .../Traits/BloodDeficiencySystem.cs | 23 +++++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 5 ++++ Resources/Prototypes/Traits/disabilities.yml | 14 +++++++++++ 6 files changed, 90 insertions(+), 6 deletions(-) create mode 100644 Content.Server/Traits/BloodDeficiencyComponent.cs create mode 100644 Content.Server/Traits/BloodDeficiencySystem.cs diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3d..7a4af3e4cc1 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Server.Traits.Assorted; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -11,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; @@ -171,5 +172,17 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + /// + /// If this is true, the entity will not passively regenerate blood, + /// and instead will slowly lose blood. + /// + public bool HasBloodDeficiency = false; + + /// + /// How much reagent of blood should be removed with blood deficiency in each update interval? + /// + [DataField] + public FixedPoint2 BloodDeficiencyLossAmount; } } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index 0edb190c16e..fafc649eb29 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -118,11 +118,14 @@ public override void Update(float frameTime) if (!_solutionContainerSystem.ResolveSolution(uid, bloodstream.BloodSolutionName, ref bloodstream.BloodSolution, out var bloodSolution)) continue; - // Adds blood to their blood level if it is below the maximum; Blood regeneration. Must be alive. - if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) - { - TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); - } + // Removes blood for Blood Deficiency constantly. + if (bloodstream.HasBloodDeficiency) + if (!_mobStateSystem.IsDead(uid)) + RemoveBlood(uid, bloodstream.BloodDeficiencyLossAmount, bloodstream); + // Adds blood to their blood level if it is below the maximum. + else if (bloodSolution.Volume < bloodSolution.MaxVolume) + if (!_mobStateSystem.IsDead(uid)) + TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); // Removes blood from the bloodstream based on bleed amount (bleed rate) // as well as stop their bleeding to a certain extent. @@ -472,4 +475,16 @@ public void ChangeBloodReagent(EntityUid uid, string reagent, BloodstreamCompone if (currentVolume > 0) _solutionContainerSystem.TryAddReagent(component.BloodSolution.Value, component.BloodReagent, currentVolume, out _); } + + /// + /// Remove blood from an entity, without spilling it. + /// + private void RemoveBlood(EntityUid uid, FixedPoint2 amount, BloodstreamComponent? component = null) + { + if (!Resolve(uid, ref component, logMissing: false) + || !_solutionContainerSystem.ResolveSolution(uid, component.BloodSolutionName, ref component.BloodSolution, out var bloodSolution)) + return; + + bloodSolution.RemoveReagent(component.BloodReagent, amount); + } } diff --git a/Content.Server/Traits/BloodDeficiencyComponent.cs b/Content.Server/Traits/BloodDeficiencyComponent.cs new file mode 100644 index 00000000000..616f60cd834 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencyComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Blood Deficiency trait. +/// +[RegisterComponent] +public sealed partial class BloodDeficiencyComponent : Component +{ + // + // How much reagent of blood should be removed in each update interval? + // + [DataField(required: true)] + public float BloodLossAmount; +} diff --git a/Content.Server/Traits/BloodDeficiencySystem.cs b/Content.Server/Traits/BloodDeficiencySystem.cs new file mode 100644 index 00000000000..f1ae4909956 --- /dev/null +++ b/Content.Server/Traits/BloodDeficiencySystem.cs @@ -0,0 +1,23 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class BloodDeficiencySystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, BloodDeficiencyComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.HasBloodDeficiency = true; + bloodstream.BloodDeficiencyLossAmount = component.BloodLossAmount; + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 07ef099f832..bf0a44e767e 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -23,6 +23,11 @@ trait-description-HeavyweightDrunk = Alcohol is afraid of you. trait-name-Muted = Muted trait-description-Muted = You can't speak +trait-name-BloodDeficiency = Blood Deficiency +trait-description-BloodDeficiency = + Your body loses more blood than it can replenish. + You lose blood over time, and when left untreated you will eventually die from blood loss. + trait-name-Paracusia = Paracusia trait-description-Paracusia = You hear sounds that aren't really there diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index eb96d37e01a..afdd27f339d 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -94,3 +94,17 @@ - MedicalBorg components: - type: Snoring + +- type: trait + id: BloodDeficiency + category: Physical + points: 2 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, + bloodLossAmount: 0.07 # then become crit ~10 minutes later From bc3ffaf0cb61ba7febfad2c94c90e3d371510fc6 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 19:13:16 +0000 Subject: [PATCH 092/143] Automatic Changelog Update (#686) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 018c5adbd0d..7b3e9c5f2cc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4983,3 +4983,13 @@ Entries: message: Added different stamina damage resistance to hardsuits. id: 6223 time: '2024-08-06T19:08:48.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Blood Deficiency trait, a new negative trait that makes you + slowly lose blood over time. You must routinely receive blood loss + treatment to live, and even normally non-lethal bleeding can make you + start dying slowly. + id: 6224 + time: '2024-08-06T19:12:34.0000000+00:00' From 65748934f108517a3551805f20440038551fedb1 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 7 Aug 2024 03:50:19 +0800 Subject: [PATCH 093/143] New Trait: Oni Damage Bonuses (#676) # Description Adds three new 1-point traits for Onis that **redistribute** your damage bonuses, allowing you to specialize in Slash or Piercing instead of Blunt, or be a generalist who is equally effective with all melee Brute weapons. The three new traits are **Swashbuckler**, **Spearmaster**, and **Weapons Generalist**. | Traits / Damage Bonus | Blunt | Slash | Piercing | |------------------------|-------|-------|----------| | Base Oni (No Traits) | 35% | 20% | 20% | | **Swashbuckler** | 20% | 35% | 20% | | **Spearmaster** | 20% | 20% | 35% | | **Weapons Generalist** | 25% | 25% | 25% | # Changelog :cl: Skubman - add: Add three new 1-point traits for Onis that allow you to specialize in Slash or Piercing damage or be a melee weapons generalist. --------- Signed-off-by: Angelo Fallaria Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> --- .../Assorted/OniDamageModifierComponent.cs | 16 +++++ .../Assorted/OniDamageModifierSystem.cs | 31 ++++++++++ Resources/Locale/en-US/traits/traits.ftl | 15 +++++ Resources/Prototypes/Traits/species.yml | 62 +++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 Content.Server/Traits/Assorted/OniDamageModifierComponent.cs create mode 100644 Content.Server/Traits/Assorted/OniDamageModifierSystem.cs create mode 100644 Resources/Prototypes/Traits/species.yml diff --git a/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs new file mode 100644 index 00000000000..d6cf032aabd --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify Oni damage modifiers. +/// +[RegisterComponent] +public sealed partial class OniDamageModifierComponent : Component +{ + /// + /// Which damage modifiers to override. + /// + [DataField("modifiers", required: true)] + public DamageModifierSet MeleeModifierReplacers = default!; +} diff --git a/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs new file mode 100644 index 00000000000..9d701053769 --- /dev/null +++ b/Content.Server/Traits/Assorted/OniDamageModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Server.Abilities.Oni; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class OniDamageModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, OniDamageModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var oni)) + return; + + foreach (var (key, value) in component.MeleeModifierReplacers.Coefficients) + { + oni.MeleeModifiers.Coefficients[key] = value; + + } + + foreach (var (key, value) in component.MeleeModifierReplacers.FlatReduction) + { + oni.MeleeModifiers.FlatReduction[key] = value; + + } + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index bf0a44e767e..528517684c4 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -87,3 +87,18 @@ trait-description-Voracious = trait-name-LightStep = Light Step trait-description-LightStep = You move with a gentle step, making your footsteps quieter. + +trait-name-Swashbuckler = Swashbuckler +trait-description-Swashbuckler = + You are an expert in swordsmanship, wielding swords, knives, and other blades with unrivaled finesse. + Your melee Slash bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-Spearmaster = Spearmaster +trait-description-Spearmaster = + You have an outstanding proficiency with spears, wielding them as an extension of your body. + Your melee Piercing bonus is increased to 35%, but your melee Blunt bonus is reduced to 20%. + +trait-name-WeaponsGeneralist = Weapons Generalist +trait-description-WeaponsGeneralist = + You are a jack of all trades with melee weapons, enabling you to be versatile with your weapon arsenal. + Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. \ No newline at end of file diff --git a/Resources/Prototypes/Traits/species.yml b/Resources/Prototypes/Traits/species.yml new file mode 100644 index 00000000000..2c298252289 --- /dev/null +++ b/Resources/Prototypes/Traits/species.yml @@ -0,0 +1,62 @@ +- type: trait + id: Swashbuckler + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.35 + Piercing: 1.2 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Spearmaster + - WeaponsGeneralist + +- type: trait + id: Spearmaster + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.2 + Slash: 1.2 + Piercing: 1.35 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - WeaponsGeneralist + +- type: trait + id: WeaponsGeneralist + category: Physical + points: -1 + components: + - type: OniDamageModifier + modifiers: + coefficients: + Blunt: 1.25 + Slash: 1.25 + Piercing: 1.25 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Oni + - !type:CharacterTraitRequirement + inverted: true + traits: + - Swashbuckler + - Spearmaster From 0e293730ebcb5f38f0a8cd455f90b399369ddbcb Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 19:50:43 +0000 Subject: [PATCH 094/143] Automatic Changelog Update (#676) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7b3e9c5f2cc..6263b7d4005 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4993,3 +4993,11 @@ Entries: start dying slowly. id: 6224 time: '2024-08-06T19:12:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add three new 1-point traits for Onis that allow you to specialize in + Slash or Piercing damage or be a melee weapons generalist. + id: 6225 + time: '2024-08-06T19:50:20.0000000+00:00' From 32b08b03501bd65faed05fdffa1c8f7a6d55b016 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 6 Aug 2024 16:23:34 -0400 Subject: [PATCH 095/143] Port Justice Department From DeltaV (#675) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description This ports https://github.com/DeltaV-Station/Delta-v/pull/660 > ## About the PR > Adds the Justice Department, a department enveloping the lawyer and 3 new roles that manage the court system and charges against the accused. Includes: • New department, Justice! • 3 new roles: ◦ Chief Justice: The main, impartial judge for the station responsible for adjudicating criminal and civil trials, as well as other small matters like paroles and pardons. ◦ Clerk: The court clerk, who organizes trials, notarizes court documents (warrants, sentences, etc), and ensures correct sentencing and due process for the accused in sec custody. ◦ Prosecutor: A special lawyer role that legally advises sec and handles all of its court prep and prosecution, freeing up sec's time to go stun baton the clown instead of waiting for trial. • Antag objective to steal the Clerk's notary stamp, an object imbued with the authority to officialize court decisions. • Made the Lawyer role easier to understand and added them to the department. Renamed to Attorney, they now exclusively defend the accused or can sue on their behalf. Can also curse at the prosecutor in the bar. • Changed SoP to match. Notable changes include ◦ Felony charges and above must be reviewed and approved by the Clerk or Chief Justice if those roles are active. ◦ Parole, criminal trials, and civil trials are now all adjudicated by the Chief Justice, or the clerk in their absence. ◦ To ensure fair judgement, a Captain can only remove the Chief Justice with a majority vote from command. ◦ Warrants and court decisions must be written down and stamped with the notary stamp. Warrants must be approved by the Chief Justice. ◦ Full list of SoP changes can be found here: https://docs.google.com/document/d/12ZKTtzvVWBuC7PuiREL9v7mhVZve11p0-T6MBPpVeGs/edit?usp=sharing • Classy wooden desk timer to help keep trials timely and within limits. > > **TO DO:** Chief Justice > > * [x] Role > * [x] Inventory > * [x] Job Description > * [x] Icon > * [x] Access (CMD/CJ/Sec/Justice*) > * [x] Airlocks > * [x] Spawnpoint > * [x] Closet(just reuse legal w/ a lock) > * [x] Gavel** (proto/sprite/sound) > * [x] Stamp (proto/sprite) > * [x] Drip > > Court Clerk > > * [x] Role > * [x] Inventory > * [x] Job Description > * [x] Icon > * [x] Access (Sec/Justice*) > * [x] Spawnpoint > * [x] Closet(just reuse legal w/ a lock) > * [x] Stamp** (proto/sprite) > * [x] Warrant document > * [x] Drip > > Prosecutor > > * [x] Role > * [x] Inventory > * [x] Job Description > * [x] Icon > * [x] Access (Sec/Justice*) > * [x] Spawnpoint > * [x] Closet(just reuse legal w/ a lock) > * [x] Drip(Can be same as lawyer but should have a unique badge) > > SoP/Guidlines > > * [x] Civil and criminal law-penalties > * [x] Legal mutiny? > * [x] Assigning judges when no judge is present > * [x] Judge is representative of CC. Not necessarily _above_ captain but outside. > * [x] When to appeal to a jury? How to pick a jury? (random would be good) > * [x] Rules for gaining warrants > * [x] Procedure for arresting officer filing criminal charges > * [x] Rules for summoning witnesses > * [ ] Guide/book > > Other > > * [ ] Station Beacons > > ## Notes: > * We might want to consider bringing back brig access for cells to give legal dept sec access and not control over prisoners. > * Mapping would need to provide offices for CJ, CC, and Prosecuter. > * Chief Justice is a rep of CC not necessarily above captain but outside > > ## Why / Balance > The current legal system in-game is built around LRP gameplay, with security handling everything relating to arrests, sentencing, trials, and execution. Additionally, it is near-impossible to find an impartial judge for any court case with the current system. New legal department would guarantee an impartial and available judge (whether it be the Chief Justice or Clerk) for any court case, take pressure off of security to handle things like sentencing and trials. Additionally, there will be more roleplay opportunities for things like civil cases, inter-department disputes, internal affairs, or whatever else you may need legal help with. > > ## Technical details > n/a > > ## Media > ![image](https://private-user-images.githubusercontent.com/136020119/295444469-8569ec5a-8a44-41a5-83c8-165c940e9a9a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI4MjY5MTEsIm5iZiI6MTcyMjgyNjYxMSwicGF0aCI6Ii8xMzYwMjAxMTkvMjk1NDQ0NDY5LTg1NjllYzVhLThhNDQtNDFhNS04M2M4LTE2NWM5NDBlOWE5YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA1JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwNVQwMjU2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT03ZjE2M2UxNmE2OWE3YmNkM2MwMzY3YmQ5MWU5MGEwNzFjZTg5NDAyMGZkNzkyZTJjZDRhYWJlYzk1MTNmZDg3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.kv3SVoSKceqwlIctnBa4u6E3NHMJ3rPrg3VxoTl-jZQ) ![image](https://private-user-images.githubusercontent.com/136020119/295444610-9ab40e2b-149b-4d9d-af13-47c8fec40be3.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjI4MjY5MTEsIm5iZiI6MTcyMjgyNjYxMSwicGF0aCI6Ii8xMzYwMjAxMTkvMjk1NDQ0NjEwLTlhYjQwZTJiLTE0OWItNGQ5ZC1hZjEzLTQ3YzhmZWM0MGJlMy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODA1JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgwNVQwMjU2NTFaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT01ZDUyZWQ4NWVkZTM5NDlhNDcxNTNiZGIxZDljMjJkZTBmZThmN2IxNWEwMzk5MWQwMDdjNmQ4MWY1NTcxNWFlJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.jZUnQ8Xj6uor4NAU-IHU7MoD1e3F964XkmZ3aNjPj0U) > > * [x] I have added screenshots/videos to this PR showcasing its changes in-game, **or** this PR does not require an in-game showcase > > ## Breaking changes > none that I know of 😓 > **Changelog** 🆑 Leo, Velcroboy, and Timemaster - add: Added The Justice Department >:) --- .../Components/IdCardConsoleComponent.cs | 3 + Resources/Audio/DeltaV/Items/gavel.ogg | Bin 0 -> 10265 bytes .../en-US/deltav/devices/device-network.ftl | 2 + .../deltav/headset/headset-component.ftl | 2 + .../en-US/deltav/job/department-desc.ftl | 2 + .../Locale/en-US/deltav/job/department.ftl | 2 + .../en-US/deltav/job/job-description.ftl | 4 + .../Locale/en-US/deltav/job/job-names.ftl | 5 + .../en-US/deltav/job/job-supervisors.ftl | 2 + Resources/Locale/en-US/deltav/misc/pda.ftl | 4 + .../deltav/navmap-beacons/station-beacons.ftl | 4 + .../en-US/deltav/paper/stamp-component.ftl | 5 +- .../deltav/prototypes/access/accesses.ftl | 5 +- Resources/Locale/en-US/job/job-names.ftl | 3 +- Resources/Prototypes/Access/misc.yml | 3 + .../Prototypes/DeltaV/Access/justice.yml | 20 ++ Resources/Prototypes/DeltaV/Access/misc.yml | 3 + .../DeltaV/Catalog/Fills/Boxes/general.yml | 26 +++ .../DeltaV/Catalog/Fills/Boxes/pda.yml | 13 ++ .../Catalog/Fills/Lockers/chiefjustice.yml | 21 ++ .../DeltaV/Catalog/Fills/Lockers/clerk.yml | 14 ++ .../DeltaV/Device/devicenet_frequencies.yml | 5 + .../Entities/Clothing/Ears/headsets.yml | 40 ++++ .../DeltaV/Entities/Clothing/Head/hats.yml | 12 ++ .../DeltaV/Entities/Clothing/Neck/cloaks.yml | 12 ++ .../DeltaV/Entities/Clothing/Neck/misc.yml | 13 ++ .../Entities/Clothing/OuterClothing/coats.yml | 14 ++ .../Entities/Clothing/OuterClothing/vests.yml | 12 ++ .../Entities/Clothing/Uniforms/jumpskirts.yml | 34 +++ .../Entities/Clothing/Uniforms/jumpsuits.yml | 56 +++++ .../DeltaV/Entities/Markers/Spawners/jobs.yml | 52 +++++ .../Entities/Objects/Devices/door_remote.yml | 15 ++ .../Objects/Devices/encryption_keys.yml | 16 ++ .../DeltaV/Entities/Objects/Devices/pda.yml | 117 +++++++++++ .../Objects/Devices/station_beacon.yml | 25 +++ .../DeltaV/Entities/Objects/Misc/paper.yml | 25 +++ .../Entities/Objects/Misc/rubber_stamp.yml | 30 +++ .../Objects/Specific/Justice/gavel.yml | 21 ++ .../Objects/Specific/Justice/gavelblock.yml | 19 ++ .../Objects/Specific/Justice/trialtimer.yml | 24 +++ .../Structures/Doors/Airlocks/access.yml | 82 ++++++++ .../Structures/Doors/Airlocks/airlocks.yml | 22 ++ .../Structures/Doors/Windoors/windoor.yml | 36 ++++ .../Storage/Closets/Lockers/lockers.yml | 25 +++ .../Structures/Wallmounts/Signs/signs.yml | 22 ++ .../DeltaV/Objectives/stealTargetGroups.yml | 9 + .../Prototypes/DeltaV/Objectives/traitor.yml | 13 ++ .../Roles/Jobs/Justice/chief_justice.yml | 59 ++++++ .../DeltaV/Roles/Jobs/Justice/clerk.yml | 41 ++++ .../DeltaV/Roles/Jobs/Justice/prosecutor.yml | 34 +++ .../DeltaV/Roles/Jobs/departments.yml | 11 + .../DeltaV/Roles/play_time_trackers.yml | 3 + .../Prototypes/DeltaV/StatusEffects/job.yml | 21 ++ .../Prototypes/DeltaV/radio_channels.yml | 11 +- Resources/Prototypes/DeltaV/tags.yml | 6 + .../Devices/Electronics/door_access.yml | 24 +++ .../Objects/Devices/encryption_keys.yml | 1 + .../Objects/Misc/identification_cards.yml | 55 ++++- .../Objects/Tools/access_configurator.yml | 3 + .../Structures/Doors/Airlocks/access.yml | 6 +- .../Structures/Doors/airlock_groups.yml | 2 + .../Structures/Machines/telecomms.yml | 82 ++++++++ .../Prototypes/Palettes/departmental.yml | 3 +- .../Prototypes/Roles/Jobs/Civilian/lawyer.yml | 2 +- .../Prototypes/Roles/Jobs/departments.yml | 2 +- .../Prototypes/Roles/play_time_trackers.yml | 9 + Resources/Prototypes/StatusEffects/job.yml | 4 +- .../justice.rsi/alt-equipped-EARS.png | Bin 0 -> 847 bytes .../Headsets/justice.rsi/equipped-EARS.png | Bin 0 -> 628 bytes .../Ears/Headsets/justice.rsi/icon.png | Bin 0 -> 728 bytes .../Ears/Headsets/justice.rsi/icon_alt.png | Bin 0 -> 876 bytes .../Ears/Headsets/justice.rsi/meta.json | 25 +++ .../Hats/cj_toque.rsi/equipped-HELMET.png | Bin 0 -> 781 bytes .../Clothing/Head/Hats/cj_toque.rsi/icon.png | Bin 0 -> 647 bytes .../Head/Hats/cj_toque.rsi/inhand-left.png | Bin 0 -> 832 bytes .../Head/Hats/cj_toque.rsi/inhand-right.png | Bin 0 -> 806 bytes .../Clothing/Head/Hats/cj_toque.rsi/meta.json | 26 +++ .../Neck/Cloaks/cjcloak.rsi/equipped-NECK.png | Bin 0 -> 1771 bytes .../Clothing/Neck/Cloaks/cjcloak.rsi/icon.png | Bin 0 -> 1016 bytes .../Neck/Cloaks/cjcloak.rsi/inhand-left.png | Bin 0 -> 831 bytes .../Neck/Cloaks/cjcloak.rsi/inhand-right.png | Bin 0 -> 840 bytes .../Neck/Cloaks/cjcloak.rsi/meta.json | 26 +++ .../prosecutorbadge.rsi/equipped-NECK.png | Bin 0 -> 607 bytes .../Neck/Misc/prosecutorbadge.rsi/icon.png | Bin 0 -> 1018 bytes .../Neck/Misc/prosecutorbadge.rsi/meta.json | 18 ++ .../mantles/cjmantle.rsi/equipped-NECK.png | Bin 0 -> 1346 bytes .../Neck/mantles/cjmantle.rsi/icon.png | Bin 0 -> 744 bytes .../Neck/mantles/cjmantle.rsi/meta.json | 18 ++ .../cjrobe.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 1830 bytes .../OuterClothing/Coats/cjrobe.rsi/icon.png | Bin 0 -> 979 bytes .../Coats/cjrobe.rsi/inhand-left.png | Bin 0 -> 1058 bytes .../Coats/cjrobe.rsi/inhand-right.png | Bin 0 -> 1028 bytes .../OuterClothing/Coats/cjrobe.rsi/meta.json | 26 +++ .../clerkvest.rsi/equipped-OUTERCLOTHING.png | Bin 0 -> 1137 bytes .../Vests/clerkvest.rsi/icon.png | Bin 0 -> 709 bytes .../Vests/clerkvest.rsi/inhand-left.png | Bin 0 -> 785 bytes .../Vests/clerkvest.rsi/inhand-right.png | Bin 0 -> 787 bytes .../Vests/clerkvest.rsi/meta.json | 26 +++ .../cj.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1719 bytes .../Uniforms/Jumpskirt/cj.rsi/icon.png | Bin 0 -> 995 bytes .../Uniforms/Jumpskirt/cj.rsi/inhand-left.png | Bin 0 -> 955 bytes .../Jumpskirt/cj.rsi/inhand-right.png | Bin 0 -> 939 bytes .../Uniforms/Jumpskirt/cj.rsi/meta.json | 26 +++ .../clerk.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1384 bytes .../Uniforms/Jumpskirt/clerk.rsi/icon.png | Bin 0 -> 884 bytes .../Jumpskirt/clerk.rsi/inhand-left.png | Bin 0 -> 967 bytes .../Jumpskirt/clerk.rsi/inhand-right.png | Bin 0 -> 952 bytes .../Uniforms/Jumpskirt/clerk.rsi/meta.json | 26 +++ .../equipped-INNERCLOTHING.png | Bin 0 -> 1681 bytes .../Jumpskirt/prosecutorred.rsi/icon.png | Bin 0 -> 877 bytes .../prosecutorred.rsi/inhand-left.png | Bin 0 -> 983 bytes .../prosecutorred.rsi/inhand-right.png | Bin 0 -> 985 bytes .../Jumpskirt/prosecutorred.rsi/meta.json | 26 +++ .../cj.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1559 bytes .../Uniforms/Jumpsuit/cj.rsi/icon.png | Bin 0 -> 902 bytes .../Uniforms/Jumpsuit/cj.rsi/inhand-left.png | Bin 0 -> 955 bytes .../Uniforms/Jumpsuit/cj.rsi/inhand-right.png | Bin 0 -> 939 bytes .../Uniforms/Jumpsuit/cj.rsi/meta.json | 26 +++ .../cj_white.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 9718 bytes .../Uniforms/Jumpsuit/cj_white.rsi/icon.png | Bin 0 -> 537 bytes .../Jumpsuit/cj_white.rsi/inhand-left.png | Bin 0 -> 7793 bytes .../Jumpsuit/cj_white.rsi/inhand-right.png | Bin 0 -> 7879 bytes .../Uniforms/Jumpsuit/cj_white.rsi/meta.json | 26 +++ .../cjformal.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 9423 bytes .../Uniforms/Jumpsuit/cjformal.rsi/icon.png | Bin 0 -> 5678 bytes .../Jumpsuit/cjformal.rsi/inhand-left.png | Bin 0 -> 7183 bytes .../Jumpsuit/cjformal.rsi/inhand-right.png | Bin 0 -> 7415 bytes .../Uniforms/Jumpsuit/cjformal.rsi/meta.json | 26 +++ .../clerk.rsi/equipped-INNERCLOTHING.png | Bin 0 -> 1447 bytes .../Uniforms/Jumpsuit/clerk.rsi/icon.png | Bin 0 -> 910 bytes .../Jumpsuit/clerk.rsi/inhand-left.png | Bin 0 -> 967 bytes .../Jumpsuit/clerk.rsi/inhand-right.png | Bin 0 -> 952 bytes .../Uniforms/Jumpsuit/clerk.rsi/meta.json | 26 +++ .../equipped-INNERCLOTHING.png | Bin 0 -> 1615 bytes .../Jumpsuit/prosecutorred.rsi/icon.png | Bin 0 -> 868 bytes .../prosecutorred.rsi/inhand-left.png | Bin 0 -> 983 bytes .../prosecutorred.rsi/inhand-right.png | Bin 0 -> 985 bytes .../Jumpsuit/prosecutorred.rsi/meta.json | 26 +++ .../Misc/job_icons.rsi/ChiefJustice.png | Bin 0 -> 568 bytes .../Interface/Misc/job_icons.rsi/Clerk.png | Bin 0 -> 537 bytes .../Interface/Misc/job_icons.rsi/Lawyer.png | Bin 0 -> 539 bytes .../Misc/job_icons.rsi/Prosecutor.png | Bin 0 -> 5005 bytes .../Interface/Misc/job_icons.rsi/meta.json | 14 +- .../Interface/Paper/paper_heading_warrant.svg | 127 ++++++++++++ .../paper_heading_warrant.svg.200dpi.png | Bin 0 -> 10022 bytes .../paper_heading_warrant.svg.200dpi.png.yml | 2 + .../DeltaV/Markers/jobs.rsi/chiefjustice.png | Bin 0 -> 1439 bytes .../DeltaV/Markers/jobs.rsi/clerk.png | Bin 0 -> 1031 bytes .../DeltaV/Markers/jobs.rsi/meta.json | 9 + .../DeltaV/Markers/jobs.rsi/prosecutor.png | Bin 0 -> 836 bytes .../encryption_keys.rsi/justice_label.png | Bin 0 -> 570 bytes .../Devices/encryption_keys.rsi/meta.json | 9 +- .../DeltaV/Objects/Devices/pda.rsi/meta.json | 11 +- .../Devices/pda.rsi/pda-chiefjustice.png | Bin 0 -> 943 bytes .../Objects/Devices/pda.rsi/pda-clerk.png | Bin 0 -> 1022 bytes .../Devices/pda.rsi/pda-prosecutor.png | Bin 0 -> 6141 bytes .../Objects/Misc/bureaucracy.rsi/meta.json | 2 +- .../DeltaV/Objects/Misc/stamps.rsi/meta.json | 8 +- .../Objects/Misc/stamps.rsi/stamp-cj.png | Bin 0 -> 5263 bytes .../Objects/Misc/stamps.rsi/stamp-notary.png | Bin 0 -> 777 bytes .../Specific/Justice/gavel.rsi/icon.png | Bin 0 -> 434 bytes .../Justice/gavel.rsi/inhand-left.png | Bin 0 -> 11051 bytes .../Justice/gavel.rsi/inhand-right.png | Bin 0 -> 11817 bytes .../Specific/Justice/gavel.rsi/meta.json | 22 ++ .../Specific/Justice/gavelblock.rsi/icon.png | Bin 0 -> 225 bytes .../Specific/Justice/gavelblock.rsi/meta.json | 14 ++ .../Specific/Justice/trialtimer.rsi/meta.json | 14 ++ .../Justice/trialtimer.rsi/trialtimer.png | Bin 0 -> 1170 bytes .../Airlocks/Glass/justice.rsi/assembly.png | Bin 0 -> 1645 bytes .../Glass/justice.rsi/bolted_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Glass/justice.rsi/closed.png | Bin 0 -> 1763 bytes .../Glass/justice.rsi/closed_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Glass/justice.rsi/closing.png | Bin 0 -> 3014 bytes .../Glass/justice.rsi/closing_unlit.png | Bin 0 -> 432 bytes .../Airlocks/Glass/justice.rsi/deny_unlit.png | Bin 0 -> 321 bytes .../Glass/justice.rsi/emergency_unlit.png | Bin 0 -> 588 bytes .../Airlocks/Glass/justice.rsi/meta.json | 195 ++++++++++++++++++ .../Doors/Airlocks/Glass/justice.rsi/open.png | Bin 0 -> 760 bytes .../Airlocks/Glass/justice.rsi/opening.png | Bin 0 -> 3247 bytes .../Glass/justice.rsi/opening_unlit.png | Bin 0 -> 284 bytes .../Glass/justice.rsi/panel_closing.png | Bin 0 -> 445 bytes .../Airlocks/Glass/justice.rsi/panel_open.png | Bin 0 -> 315 bytes .../Glass/justice.rsi/panel_opening.png | Bin 0 -> 470 bytes .../Airlocks/Glass/justice.rsi/sparks.png | Bin 0 -> 697 bytes .../Glass/justice.rsi/sparks_broken.png | Bin 0 -> 183 bytes .../Glass/justice.rsi/sparks_damaged.png | Bin 0 -> 184 bytes .../Glass/justice.rsi/sparks_open.png | Bin 0 -> 175 bytes .../Airlocks/Glass/justice.rsi/welded.png | Bin 0 -> 296 bytes .../Standard/justice.rsi/assembly.png | Bin 0 -> 1369 bytes .../Standard/justice.rsi/bolted_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Standard/justice.rsi/closed.png | Bin 0 -> 1488 bytes .../Standard/justice.rsi/closed_unlit.png | Bin 0 -> 144 bytes .../Airlocks/Standard/justice.rsi/closing.png | Bin 0 -> 2683 bytes .../Standard/justice.rsi/closing_unlit.png | Bin 0 -> 432 bytes .../Standard/justice.rsi/deny_unlit.png | Bin 0 -> 321 bytes .../Standard/justice.rsi/emergency_unlit.png | Bin 0 -> 588 bytes .../Airlocks/Standard/justice.rsi/meta.json | 195 ++++++++++++++++++ .../Airlocks/Standard/justice.rsi/open.png | Bin 0 -> 729 bytes .../Airlocks/Standard/justice.rsi/opening.png | Bin 0 -> 2825 bytes .../Standard/justice.rsi/opening_unlit.png | Bin 0 -> 284 bytes .../Standard/justice.rsi/panel_closing.png | Bin 0 -> 445 bytes .../Standard/justice.rsi/panel_open.png | Bin 0 -> 315 bytes .../Standard/justice.rsi/panel_opening.png | Bin 0 -> 470 bytes .../Airlocks/Standard/justice.rsi/sparks.png | Bin 0 -> 697 bytes .../Standard/justice.rsi/sparks_broken.png | Bin 0 -> 183 bytes .../Standard/justice.rsi/sparks_damaged.png | Bin 0 -> 184 bytes .../Standard/justice.rsi/sparks_open.png | Bin 0 -> 175 bytes .../Airlocks/Standard/justice.rsi/welded.png | Bin 0 -> 296 bytes .../Wallmounts/signs.rsi/direction_court.png | Bin 0 -> 898 bytes .../signs.rsi/direction_justice.png | Bin 0 -> 926 bytes .../Structures/Wallmounts/signs.rsi/meta.json | 10 +- .../Objects/Misc/bureaucracy.rsi/meta.json | 3 + .../bureaucracy.rsi/paper_stamp-notary.png | Bin 0 -> 625 bytes .../Structures/Storage/closet.rsi/cj.png | Bin 0 -> 5692 bytes .../Structures/Storage/closet.rsi/cj_door.png | Bin 0 -> 5840 bytes .../Structures/Storage/closet.rsi/cj_open.png | Bin 0 -> 5529 bytes .../Structures/Storage/closet.rsi/clerk.png | Bin 0 -> 5806 bytes .../Storage/closet.rsi/clerk_door.png | Bin 0 -> 5853 bytes .../Storage/closet.rsi/clerk_open.png | Bin 0 -> 5588 bytes .../Structures/Storage/closet.rsi/meta.json | 20 +- 220 files changed, 2278 insertions(+), 23 deletions(-) create mode 100644 Resources/Audio/DeltaV/Items/gavel.ogg create mode 100644 Resources/Locale/en-US/deltav/devices/device-network.ftl create mode 100644 Resources/Locale/en-US/deltav/job/department-desc.ftl create mode 100644 Resources/Locale/en-US/deltav/job/job-supervisors.ftl create mode 100644 Resources/Locale/en-US/deltav/misc/pda.ftl create mode 100644 Resources/Prototypes/DeltaV/Access/justice.yml create mode 100644 Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/chiefjustice.yml create mode 100644 Resources/Prototypes/DeltaV/Catalog/Fills/Lockers/clerk.yml create mode 100644 Resources/Prototypes/DeltaV/Device/devicenet_frequencies.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Clothing/Neck/misc.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Objects/Devices/door_remote.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Objects/Misc/paper.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavel.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/gavelblock.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Objects/Specific/Justice/trialtimer.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Structures/Doors/Airlocks/airlocks.yml create mode 100644 Resources/Prototypes/DeltaV/Entities/Structures/Storage/Closets/Lockers/lockers.yml create mode 100644 Resources/Prototypes/DeltaV/Roles/Jobs/Justice/chief_justice.yml create mode 100644 Resources/Prototypes/DeltaV/Roles/Jobs/Justice/clerk.yml create mode 100644 Resources/Prototypes/DeltaV/Roles/Jobs/Justice/prosecutor.yml create mode 100644 Resources/Prototypes/DeltaV/Roles/Jobs/departments.yml create mode 100644 Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/alt-equipped-EARS.png create mode 100644 Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png create mode 100644 Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png create mode 100644 Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/equipped-HELMET.png create mode 100644 Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/equipped-NECK.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/equipped-OUTERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/equipped-INNERCLOTHING.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png create mode 100644 Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Clerk.png create mode 100644 Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Lawyer.png create mode 100644 Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png create mode 100644 Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg create mode 100644 Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png create mode 100644 Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png.yml create mode 100644 Resources/Textures/DeltaV/Markers/jobs.rsi/chiefjustice.png create mode 100644 Resources/Textures/DeltaV/Markers/jobs.rsi/clerk.png create mode 100644 Resources/Textures/DeltaV/Markers/jobs.rsi/prosecutor.png create mode 100644 Resources/Textures/DeltaV/Objects/Devices/encryption_keys.rsi/justice_label.png create mode 100644 Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-chiefjustice.png create mode 100644 Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png create mode 100644 Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png create mode 100644 Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-cj.png create mode 100644 Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-right.png create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/icon.png create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/open.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_opening.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/welded.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/assembly.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closed_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/meta.json create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/open.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_opening.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png create mode 100644 Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/welded.png create mode 100644 Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_court.png create mode 100644 Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png create mode 100644 Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-notary.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/cj.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/cj_door.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/cj_open.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/clerk.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/clerk_door.png create mode 100644 Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png diff --git a/Content.Shared/Access/Components/IdCardConsoleComponent.cs b/Content.Shared/Access/Components/IdCardConsoleComponent.cs index 417b77855cc..c994d83d9c5 100644 --- a/Content.Shared/Access/Components/IdCardConsoleComponent.cs +++ b/Content.Shared/Access/Components/IdCardConsoleComponent.cs @@ -89,6 +89,9 @@ public WriteToTargetIdMessage(string fullName, string jobTitle, ListE{I3B6Zok!ENbK?P*kKSReJ9oLK9GsfQX=gAiei0 zA|N0|kuGp2aL&2s{oecB`_J2-oyp9sHEU*-@0!^=(Xh1Cf=)w!T@9SX&iJarl`CgX zF`sgCa5k~V;5$zF)Zo7$h_~>}@%P(P8u*d_T=htmPitzID^BS^pn;2uv%~&1mS?^gpTHVxew&cRF+FG0F9xnoR z7K|kTpWCw93X+_lqM$CXaa-ZG+aAumGQME-WQ3nFPdmgL*dPT7pwwimmugYpBjlTOoG?~Xh9Lk=-k4VpXz+>T0!RX zb9^nVzN&nSxiRWuiv>C1VoTf=J#y!HD*6zr@IhVE(po~prC7nPi1FfsV0nqoK-7s^tdI{-6H}GvE3oJsl{^cZQtOmTtCy8_?d3Px%Sn$}pi_Vae`Q)H=lx%|#r=5m z|NWM+YPkl<09$@`V*KpHu7G6!?0kdh*upIk@Tm;)Mw7FE5=P)NMgrVQF1K4_RXcyH zlK<@lyxSp22F}>z#Mla~f#m6T7SzK?4rA1Yfhq77`Jb<6$MFIbVN0`!xA7t7k2F3u ziw_V>n?)>7dNLDW2+I1#n%tAT(J4xnJeOHWozh?bLOX@4x-c>2*n_rRbhE&hu(qV8 z%%q-VOqU92GWMkQm@w z);^KI4hvUA6#8l+>A0{i&yO`{g&;qQ<0$^SI1c5LD9()zzShS5rh~8j z2EHh6>=Ijk-AEx%3I|bqLl8u97;ZitQ!1*A#^Q!h*Riok1PptEDBx69vq)J&x?_+8 zBs#aj@&PLT?YMRJ?u$&l|GK+>GTx=+0Cz7Rj~2hAj<$}To8A2c*YPTU!x7i%VbAH| zu!l4O{~1{SAO`}V@jJ$3tVt;RbE>bp9Lb4;|3;1z_2($Y)+qKn0#G@AqNkUE281E z%F$>48#$TW;a^3aYUYg&`GU9wLzT&O&zq+~k7b zpJ+`&Wm{Nphr)^J{DRIBY48hHTr9dD6fp3A`tV@N2BbOSX zQs^6r&Y>4jdqG#0{a)@Vp@t(qmC2xdSFPu*xA+@$uxj_{s4E z6&{Q_f`~1yOBM!3fVG%+;YIbya$|G*P%2oQCgKhUc1R9Zf*UeXEyU3yRDdXyN+E6l zRZ@bZ6(@%I<5yJ?j|zrkFPm~>k0-~1$#IqV$t$#x*7y-NCCy;+LZBcTUO8kF25)9G z?G(jQo7%vd2T-9rm5ipvg6_wfUk0nf0Rm4mFv;<%c)$qNk|uh@u_!S45Gt$$N3Vqd z3fia^f~~Xzhoi-S5%@W9v_RBnS~L&Xem|aqSU>vlXOFE{ed`}7s^4=6qh$(@F1 z{bEfzL>E|r5BwsLp`r_nen@061u_`Ekm{?6K*S+c;q&-Dn?fW4-hA9wXda61qX3d| zVCzryrI3Tca6@3M3z!Xy9T5X#!IZ$>C?F5;VX;Fd%g1~i*a1`sn;#OP!hwx934wze z;EP3tz~i-%h(f>@Qr3(_fV?*Z`kIr$yue|hWz8rp1m0Yr4}}KDDk3s)1XJu$QH)a< zv1;%q$~+EPYG5f+6H<6UDu#lOI0{25N5tj~0wLE7DQC@wRYfRsR9&0OtMiQI1={j01`!0=ri(H8|7+!~!!kGs+`?l}$rIOoP6KSR_z65d#WF zuwQ_453nAiX$LSDCLGuT^nJz?7E(=5b`uf^y54-Aft z)ka;z0%l+;-4naolt9q>St2O&G=r{^2#o&xjbj~8K_3B@WeM3#@h2lcP=IyP;@8QW zMM_OyP6;W4QyD4Hp9rAqIJOWfFnmJX@0cK4SF9kQB z>H*A1=+Qh`$Mx2ySfb-=eU1T>iyEi4QEK*h!e2oJmeZ9Y-7z zL2|-(d{~L4#4qw>1PDMpU)Bi$i8zj1yePap5WH-E6Tn2rlOGe1a>N|}5U@Z1Sk(yu zO!RjRF9m{nj{SKt?y^ZfogVYEtLNxAPw+JZw!go5ZP@=Fe--4Jza;&=ivR!3|K}7? zK|3kY$L}NzmiJV|t}|Y^d5po!0CA0prs1+&0LCbE;&V;8@42~s2-`A2ge=}zNC1-| zzV8LG(FjCI(`D1pBwr-*8pxm^9}bbpA$V|?^+U?$QD~y9T#!NW0ajY;8;L-d%+Z>@ z7F`&V<%Z!#OhN^RQ66N46+i%P%K+Ue8U!*te25;?DY!jx2S`pvmkJVPU?}piBQ{}z z3#lFyVmkwJiP)a5SL5!XI|Ub}e96U#r)^$>z(%i0Zm0X& z!$BnX)Z_X-8jC*w;MuU)kiRGkPwjM6o3x;W1RQ5d)ebaYli< zj=nTL#~T`W%Ap7X7Quv5#15IPRBIzdZORs6*`B9Xq~2*Il~qTfdCXe4x!{%5e16mw zW2i-t&P`sHxrD-13Y+2)3*h_?J%^w(7x}1&sb!u$BZWj{lp{|==gyNdH7dx+++@r7 znCYl0!j&cj9^8XEC|(3LvBIVshL{ZOZa*4&(&Xm6-J>e*-1&W-`95_l8ba~Fu16!%3Y9-!Nm&g zfF!8v6J%vEFCr!(B_nrRQ5m7Cu8GwC=M9CAkIyl$3@CkkPToO$WIFDG@b4h-jFH7_ z&uCPlRn>JX?a>d8j?9jBj`ogbkEV}Ok8*eBN6&vDpFLcuvJtbsHNe@rfW;DS-qkv_ zY@84_YA5!T5mL;h^GJ7Y{nqg$WyQ%|%gu584D=XTH}!~pYcgdblH2ER! zI3yT2XD8EW|tep@{Y!m;D3w_t%tV z69ldmoyv`ukPf7KHy8MAE6s7llj?$&<5D43l!Xi>K2(w>st8f00? z>c<)5H?YYl6+rGWNgD9N+aBe~5U_jjefad#9t+=S@ZesYphRBP!(sgB;GyNZuvy(x zGc^JI685VqXC|m8c2-B*e56&wbZo5ylYYIaA4o&ZuCS9M$5-1njcCu#*X&EoR7O42 z=y$p4kLuI-VIp6L^8cOcoA`BMMtpPYDU`v%(iE{q9%OL7hv@xI*ZlMPFDuiiqc81Z z9urb?uW8??EB*fEK>qOkpX&XX#rZN!MWy&<^es;N83^UOM<#B@+mYSfuCGmo}@&ZQ3S%se3Vk4Tmh%f6AP2_Uua<6JM2Xat84cqv};7-^E=_BMpTWnWN{n z=$^x^A&+K<%{D~F+-I8QjU&uax5JU|qcX1p_xXrF&4(I?riU!M4oAo%qd51(F7(0B zhrNtP+fDDWj_MiV}AFB1$tZ+U)FSmxS}UTC&Zr~WHXYyGHJhiDb{nFT zSB)3%3MlSP2q@3EjwMhE9sB}^$Fq9<(Y?>=8gEN|F{IYF(SA!#^6Q zR4Y5L?qn*Y=R|X3Ywc$6v%^tEI_Mqg^zmzMzdsW+R8`ZcaLi zXF=NHa-1wB-Dd{wE>Xs4c0!RuV@>15ui@v#3-yKBrYpQIlb^|U|H-U;xP4crq>+4* zBlZnkOx*Ga8x!qG6D7qqrPA@?!9w1lcRI`UUrP+pm8rIc>tZ)NK9u%s?3hYw#q7S# zD6cHJ)APIPx`o$XapFZ+`o50h*-pxZ5hB^q^0=T+KR@uab3{kC69+Uuf~4Gi>p4c` z>KSaVR=wjeC%@UXD&aI_!@|BKMitS&=2q2(nvY?Qi7Jw|5jR7-NSB)1o0xpyRV)_Y zQ1w{e$qh4O;P38CO+<6uAhE04Hto(~jU8@@x=b5^9{^hcmN;SZj^qV2YbU0sBK^ zYAajcBa7!*UgvV11Mf;-c^B4QA={pFcxhEzFJHu+wy3TM4d%ZbTz~GntQ(|L8od2` zgL>LCuH-2E)8Qzcf&Q*u>$_Ky@4pmbYO2V?wmm1M*KafGa;7~(j2T=1kjYul5qjW` z5)Zt)r0CJlgfeH2&%U$xsl{|TvafIJP)aE(uz{fadJ*r=Ygt(<(y>T%6rrWR2jRK# zw67{6IvuM?BQob2mA}1H}adeF!xUlh2*55*~PefN05A1fnZ~kefqO{p9@Q~V=WKGOl(0o!G zAXRCTTQr!G@-&t#diJ&K&{U!3ZCrqwANp!o&q#y&=oa4~f3=h^XI zejbPO{NZ7CV~vfR5}xme-G1LqdYF(B^;GmDQ6$8=ahD)7XSk7Lb~!@-U8jR*k!A7e zVK37hOJ0RDn323mt;_FU-G4Uwmf)$!8VAB|*n%o0d?Kxvwx3(MR^GQZ-+?)W^3R7m z;bns4Km02f_a*kj7YtrL8IfB!OJN{?@56BNDyF!!i$3g+t^u#9)1jhHWE-8uk0S=3 zLzP!=d+YwhZhrI#m7aOVy>8i3bRa?7nXk8Yl(IW$8fwbo7S~JgtpCo1>k+fa;oe}1MXjW5fyqPZ-?8}}o$}!=?}jIT z#ja`R3YAdh_cA(Qw;!dr)+){lv!~q^xa8b|O*WMoUne)B0wB^Cfe0I%4S~d;lR@(^)!x8?F zWc}u@>UU!(W^4a%pE^G(GtwW#t<-g@#JRqn2z=$|`{N;+?1R-@&(FOlVw~G*j}+?Q z8kck6;T#L&T?fD9@=`?Y>96K>?M?*tl@!8V6Z-?@w#W4@ zT*&D>Ea9oPUg;=owz3UatGwYf;yf4}=(RNSB7i~+p-*sllz;VzC-p zFZ)v8a#c^qgE@! z`@7Jk!Gs5%akxIClAi&sdqhR9>m9od6)Q6(0f!62L>i%* zRjd24&P)OBNn9r4wp-F2_vOOW93)-xIVXBAA{+=~j77;VEJwRZG1cP zaxi0g#^?#9JAvvCUp_+8YhC&Tix(5#OE{(PIdYri=>$MyhG+_QXkF{3AQMBN9<%qI zVcy*$`o%pP{nuFoSg(}Gt$d8`mc;gtixvsLvZkIe*_AQUtTqOc(?={^-21$F<4YK~ zG=;iR@c!K$ag1lFUW6B+vCc9ga@zev)R^MKhs)ucgs%Kjq#*FS$@fOkUT7QRJx( z0I5pCUQ|Ym=WW+@JIK%e-h10xu;{W!TODI9rmmLu)tmt?Nb=asazZXo z|IO#8Z^b1%k~`BCesgLYJc2!G_x zEq_x@6T>jYjDBWh^_E5#O5-JIsrchO@GtK(t z+b7Px+iWj)F_eDf!4SKB_T)>JLb=m*E_Zg+zOYb`ztVNSmm%cvlIy|rS*m;s-lMXg z^D@El1=vOI>x#0wR&fvDyF-9>4RRyh3L~kT1xbxs@1DQ-98?=x78`tjm8c8 zrkMt9FPbkhqY@mu$hVr}F!_Pw{(2wGH}qb8Zjvf0y}ns@)D@UsU$oy-$FwkpDeM@* z(#1S%_*^XIFK$&hp*u74L@dbxz8U=0xJ0V%(#c;6@cB(+dy7!|KDjE(mg7;s-|Ld! zZJktolp?k36^9^5GNR=nCm!#QyAlpjbJF4RX}AZ|o4w4J@^7y0FE%eWUD#Bt>STdf z`tQ~`uku`~GjM*Qt0XYTZn(d^Iy{}8+KB(J4fq9CFT>U2=uP46ttny3NAG{W)6f*R zoEnO7++Rx$|KmkybqQJ7A6B~g-XM}s=}o!ZtgkuIW*XXcGUPyfoZ=5H%)>Ma@^TgL z_oeanacamYxTN>HvgWE*0@X&Oyv3f5C#sL;iunGRp)27*?zV6=#$%+wn@*LJldRKe zUpS8aP3tBn#!WZWvU2uL8l#FQsTo?lkAz8DKXlz&ix z-B&>^wi!v`xMloqqJN3me!Of+R{9?EihL^{&TGm1W#1vEMvdog zObOe(HrT>MaaiiNw1`am$bV`jyr4w2}pEH&>i= z*_pSVOp_D@+&t1*IM`V*ERgqn(|Xw{3v2E2qkSe^!u|T>xv!YA4#ZO-3E#8sq3a#XQSf66tP{ysq}nR z%5Sd*8n?cAx_{-{pe$OfjCv~c5?kVNnC)pAw!U8FkaOnHb-yN!K=Ug>?+e?4xMG3U zRW;jp@)vaZD}KEWDoi6=rAZQ45z$D9XOS!E!62R0u4~M?z^u#OXfL}b(wBCoM=9m6 zrI%DKt+#_;`7^IjLLXBely41Y5pd}z#LIsZ)~V%gxktc1{+@ba%_g@2hBEjPaY%Fa zPyL|6MtioIl$UdT;1<>4{6zJ|-fb7w%TnP|3LXG%N6QD9?Pq>He~?8%rzw2?tNmB; zPw?BHKy6+Bn(?|{qcdLsW%~@QU;oab%r3d<#x$8 zO%f@_hi8O0-i}h{SW`XN3Zt}_yTfeHz}{+XT30=FS!{`Bk{oUaW|TuhKCdxo+Hu#S zu4@y`4Tk<4cXr3@>p#fAYJDd-Amz>GCRm$6?<~pE<&-LE*bHx6VaTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz`!j8!i<;h*8KrSN4uwsV@O5Z+gls`ngc|ReT-I4 zR6cmKW#i&*=JgK_FjzP5Y4v{){lMW7hqL?w{R>CK3z9C)G)U;<`Ml>dSFO78H?-9? zkS8_rUG`)ZNwe9#THeeGe-~*OISNQvwrtB?D_~;$XT`*Y^VYv-Q%~IA;<4|`MCOQ1 z{Z_vf_r#VMoSYu*Z~LI}5cl-NNu~9rk4p{|?lZjptgd|T>*;$e`r4OH``@?Wg;Me1 z)WVg~3;p2sZ^=pDP-P+2_VC}H9QK*TA1=pTmVB0CvD57Irt|4d zkJnGWpzM5X-nREDEAGFVp%;67tJU)pwfu2v#%s2(fA+C<`MdRcTO{v}k2=C4)-uBu%dGnra?@zw2P=ENu{Qv`pLIVR6CUIaUR}I6#sFcjhCxlag P@xgTe~DWM4f39E$c literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/equipped-EARS.png new file mode 100644 index 0000000000000000000000000000000000000000..0633bb36441674a5eddb9d7907ca1a5b08699128 GIT binary patch literal 628 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>aTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz`%C|gc+x5^GO2**Lb=(hE&A8y|t0IK|z2u;E~L_ z2MT90AI-{2PU37~?n?h#Trn-UoKJbaBeXWy?yT}1n?a;u$h>hXKz2(g#_i`P}^{@Un{6BCZw#M`GOv&sQ o;qr&hXurt8riDWwL%4#$q+NJ@K~vOgpt~77UHx3vIVCg!0LP{XRR910 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce0c363f81ec594bc330d63cd30799599611907 GIT binary patch literal 728 zcmV;}0w?{6P)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmY3labT3lag+-G2N4009t5L_t(oN9|Ox4uUWcJ&Y3xj>5!-i%$Fm zD}Tb`H^K*qi)>6qH;E+10l6j+FbG%L#KB%d3iR&YyLasYXwwR41^!(DLqq__aq5j_ z!M!YjF(wo%f-~xi;CY^R4}ME0r6%Zu`@XM~#EMD+{lYMW%=3$OKv-(=_=jwgl&atdWPw z&hzU1;lP1WjdPm9CCdi!wrzK_p(qMc?lrXn1Zyhh07;TePC_a;<`QZF_B@W`$=-{A zQ;Q$?^=0mFeEYu$WG?6vOa`2EP{s%?IdF4@>3yw$RzNH869wM2dTcC2di%!!0000< KMNUMnLSTYB21$$n literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png b/Resources/Textures/DeltaV/Clothing/Ears/Headsets/justice.rsi/icon_alt.png new file mode 100644 index 0000000000000000000000000000000000000000..2142eee0392083d55fbd91f71fb92f30607e72ee GIT binary patch literal 876 zcmV-y1C#uTP)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmY3labT3lag+-G2N400E>)L_t(oN9~j`Pr^_T#}608gt}QKHe75R z7)TnN7-WS{!s4f6U~R&vbrBO1rh+U&Y$XoW|0UPd(E8qMH7>oRd2QdlyWjoayGK-6 zr9h>?KPyl(&41bH#8`7$uP00Iecw2aEH+wr?KqrV?EP?H5E+YrXak^fN%pi@@VYD@ znbTEP3qTT~(yRoSPpe@9p#-=c4B{|~XtUjZ+jmr$mRun4-vr=9CDn8`tDQ9(N6D>b zlK>~{0l3@m`H_RFij8@t0(n7DF(6>i%O%a{^Tf5+>k;Nml+b}a^0{%{xYcUKtJR91 zZnqmpQN-`~uM+40La{Kw`nq&P#A{v@bK4CaOVElz z5GdPR>0sM-(oXC3I@2E)&z0jOML+uf@7@7`NP}d_iaTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz@VoL!i*J5?aP4C;p*w)7*Y}U_LgDxp#XscAA?T_ zO}NoyRU%lTXJJwP`L@UYM(6#GA8(fwzf-W-@#2keARCIiqZ&_LX zz50FXPT`-={m%x~FaBB5v*^Wn|E@(7?tVMH<=NWD;eKW!>rb+^SoHbtd|s)yu%gyR zV9%p)Hjbmc@#@Eqx3_)SC3~}GxlvW+wEmk;x7POQgs+tOW<7J?{+ZXd%wg#Nu`J~) z*PQqJ#1e3F= zf2PlceHaqiPgQ-H|9R`{nucTYe80kH`x`J%`TAnBPOaelF{r5}E)VQCV03 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a06285c67cf62e498813b9a494d5a41ea86ab70 GIT binary patch literal 647 zcmV;20(kw2P)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB6006&9L_t(oM`K_Z1*0J_8UmvsFd6~_90H7_ z+Ak!k@E@0+cds9iY#s|K4&W7#{?En5g;UFKp#0|#Pf2nF(TYKqv$C>+Eyw1FZ{NOw z<$nME%|MDHn1~GlkfG60abOETmZ4*iI7prp%RzP%9ReW5pin3(C}2=l5NCMx`Xz&# zy&l7^gO?b@M8z4d-G0e1b?OA#I{*|7xT1j6;3qi*V4;93+DHw4Vxxal-Dn7mhQMeD hjE2By2n_EK000Y@PE)UtxyAqh002ovPDHLkV1oKU9f$w` literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Head/Hats/cj_toque.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..60426ff87fd29312e636f4662f9e04a2e77339e0 GIT binary patch literal 832 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 C3xgN{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json new file mode 100644 index 00000000000..a0670a97c96 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Cloaks/cjcloak.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Spritework by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..ce4e527400f155d092f564064b37b9a6fd13deb3 GIT binary patch literal 607 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU@XXVb`Ho)PG(@xm{>Y-zxQDW zk>mSwr*?&Ptx$M0VWC*NSXYyU7whhj_H9j})1S=R;xwtvyGtbe;L(K-6n6c{{$PJ0 zv>;S~#Z{oN-Nj(7Z5uBgTXTf>k>;b0h2asOZ62v9UX3{! zB)8m@QCf1zgccT7(Hy7tW{cFxY1eK}&-gJdP>p}_{#Gpu%Px(H=5AT7yH-sxy%hSZ zB;@Fw|K~4XOIx=0-9nWMzhCW|KiQ!`e#P~e@87SKzD{>|z`DaM`k&F+%y+ZDM0t11 zFh7)i@M+mnP4)v<^$fn{oQ%oyV2rBsWwz66IA~)~!~bP{_2#U1kNEakt5%>1OLf!@gfwqfP z%N&eTMB7>oG*y2LVZ>D1_nkZ77hUg2N2^cQ=$LQ+H)Gw z@#XZnbg!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000ie000ie0hKEb8vpVGweA)h=c>RI08mE6fXoW zx}XL@xy`#lo(6 zllNZ@cn~Bhm-~UX;V+U(&*%SQoZ8$Uk?D7`8^Q#={k`8tJTpKLtz{R;EeeKlY+Unv z&+keXUK@$H1*(GD*X}Fu>^Di#SCdG8_=N1}fB=i7n}AdY^mo(p*uS*pTHi5%;5`$w zvSR|#2uAR()k9>>81}4th`g#Tzn4C&#!{(gn0nLY+Js{Ry^RU;c_LmG9BF4G1h4s= z!S9cmYfTV1ULBW4mj~ZtJ8xj}d)^Vl69e`&k&WZdw@61WG`hDTPFhWT-s+HPJL zh&pMYuIgdt*UAE(G`Hg9^bZaW3c|oq{tV}cV$F;Scq&rD=HVt{$(OjeEJ^HK-)muD zt7r^4VK`m^>8A!rJtWZWO5^y-1iklF)iOtd!}p+Lh|%{;kHmOl`+> z{ZZJ1)mf@@tFL>E!q1}Yocs3+&f1=T#r8&cZWNok_sa8gV>K`XN)yxrr>*o}cJ8OS oTVs_lEB!wy9u^51xOWWv1&=&5X?=^%A^-pY07*qoM6N<$f?3eo#{d8T literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json new file mode 100644 index 00000000000..7f12698657f --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Neck/Misc/prosecutorbadge.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/equipped-NECK.png new file mode 100644 index 0000000000000000000000000000000000000000..9a881bf0dd0d24b2a35d5f4b346901bcaba2c084 GIT binary patch literal 1346 zcmV-I1-<%-P)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB600VkSL_t(|UhSH{Yg17a$8S@A;HaQ!X%}4_ zL_1_CZtg+?LjQq+75oQU3OX1lag2kYLjM7$1l+qxhYTtXF70Azql2SJZDYPSIggW< z_j=BIFE>y;7Xte3J@*V&ZF~ItJRC=U8~i?dr1=J ziAeKBVPk*%k_OEc)kuwpz>lM&UcKHNqmLjw$9yOVq!07ZiT~(%R(;jASzV}j)3w*n zUA0m*ZuIZ0`eKq0zjb`U3+!F| z>l&R8?s~aA0s-cKcDrt)^3d_MlYqeWIjpdTbvWMWWSpQXs4?JIQ zbluy{dH40xiK94eB5CWe544jYB*l<HW8v3Gm*`$YCiOZ36;6{LB5kCHxmSxz7E znQlN@a+AFBX&V0a^&w!MK8k!TjALl8KE(z-wY=9{io>6;Jq3ZP1iegS~FF*i5WKe0m-WqMSmd0ztMi2O7|m9$i&2LvjS zhwjzE$pSpg!#GBf{s0j`nt4ta%?gwhK!myt{M6BpK*rIJ@P1=q?7%fm66#j~yC)SO zQKR#Tu#OGQ)yuPnx57XZ#;G5H=f>-Xl8zbx1gQSTH$|O}Uqet2HPD1XT`0(h_anS& z4{C!L)XbsDLj{1$C)VFs!BQhwbPaM@+d6bl>er%143yV|1CTTqb zMU5uKQ`?KSA3@V5BLeX6{;b?|G>z&kX}nol6dN%#Im4T}MJB|F=G}7|{Rktup&p-9 zlh11)bliE%H#861-v}51BVYuKfDtePM!*OdfpG%=03&uuhB5S%XaE2J07*qoM6N<$ Ef*^o--~a#s literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Neck/mantles/cjmantle.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7fd93b7fd5b97f8fd15cad9174ba1618fa234c1c GIT binary patch literal 744 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 U)yR3|H~;_u07*qoM6N<$f@f8Te*gdg literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eb6ff72244d2c3e507ee9e791fb11826a1dc5a5f GIT binary patch literal 979 zcmV;^11$WBP)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB600Ik1L_t(oN9|R+N&`U@y?GduVAKS0jf$O$ zk(8Q3|3F9@KR^U)vGxP3EVLEHM#M%);UB0FEJZ`G6E%s*iVxz0#MLv)EUWHhW=SKs z7lxhLd+#~t-kF^x^33bNfA4_LZ3CwI#tc!;QKje_&s74*uj@6T=7C_8+=}q4cA&I1 zXmt4k1QI91d-xHjiitQS0sD(dV`;gY;esU97Gv|Z&2{#~8t-9}5@Cb``} zp3P=05q6(byhxDr3{3P6vuZ;Apj9Q-2RElwC=@7@$9HFbXL1(m4SrYq&D)a za>T)Sp6o101ppu%3Nsv3#zpWp+t={h<7MRV3)_>==M7EM=<>46aOUP0m=J7-$WZm` z`zvj4ZLpA`p(ItSRm$aZLY}4_h@a0g5RBcOO{+Q({T#eYh~qiPmzjA|98A|A>DaeI zRJ{1*ZMMJ2!(fJdJ{RyvKNFtU+0|$8szsu)Js6J<6=htdLnv!wD}GOa@DPgHIvj{F z7ytQS&M&88!@LLFm@5Hep%}Y}_-$t=8jr>a{?ixpCR8=$GmwtN8Kx7t{XLIU6`=gN z05ICoBmK|Up6^^?stR?C`??!i%J-7J4*ZD@d;-fKyUB0_YmNW_002ovPDHLkV1iZo B&shKf literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Coats/cjrobe.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..f7b9b21ebdba468b4db6d332a66132674c01058f GIT binary patch literal 1058 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 D_Phh$ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..443dbf1af9775da318c591b41f8813205b7e22ee GIT binary patch literal 709 zcmV;$0y_PPP)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB6008|-L_t(oM`K_Z1*0J_8UmvsFu)^~bTJL9oek5P>L{P{CpE68#HHwVO0WbpOJX9i@45$iD~ zVim&Ffh-4EhHg1FM-gK-$qpdKP*T*8H%Dq r6RHb{38hgrqaiRF0;3@?yh8v0o7h!0tg)Lb00000NkvXXu0mjfp!7G| literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..cf49f4588a69013853e1b0e5505a5b2b01fec9d6 GIT binary patch literal 785 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>aTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz@VoL!i*J5?aP4C;pyq(7*Y}U_SQzOLk0p34>g(= zbxiJF(EUK|2b1hB>)#yj>^iICkEs_178D8z-q8}z)LgnW*CJZ0e%S@J>5sGf_&N}eermlwNsiF@Ta>8d9 z-1uL&@$Ri|Z^wDNQ>2f2AM^SaoAhrFOG@M6e_7Wj23_!oc;qQ__L7(LiZ>0{e`h|H zYu>rjKCe*I<^1Zpje9CWA5W3IuWh^{&agUbv|-wAAyQsCbAYGO?`$MDvg uQ?H`;{KWkZU(`LmN&ELeJ)O~hfZbtoblQ97(!0QrX7F_Nb6Mw<&;$T8JyaaTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz@VoL!i*J5?aP4C;qB?-7*Y}U_SRmmLk1#k4>g(= ziKvSoRN}~MGJkO4?#nJBTwBC7@zDh5Uz4LM<~o_G$Isgm+js1P zBLgFgfCCzFKy$*8?k&D9QTNuJPg`;$L*S=R=AZ3RarzA>D{lR0TgCT)<%Zt%`?qVi z-&*qh_*tIc6Hmskw+gsfHRUPP_f&F-uM&RnwJxpr`|+6* zFK_Q}*cnQ{XI6Nds0;vvhH zf7Lrwj)n!zUK|y<_W!!G`M;|58|w4A#aq8HO>q5`n=YCC_xqxQPG>)}O-R`GKhJvO z!b8_K_K7=0|JM)DoU`Za+u8Q^>q-Q>6d_hPa5VCZ?TIUx`}AKsFsvCoUHx3vIVCg! E05ED~Z~y=R literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json new file mode 100644 index 00000000000..11ac46694ce --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/OuterClothing/Vests/clerkvest.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "sprites by leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..24c2af227bb3225ef1a887fbcb027fa911c53dd0 GIT binary patch literal 1719 zcmV;o21xmdP)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB600i$zL_t(|UhP{=PZU8AtrbWVVo1=4341^< za`8+^^e@PTUtr|K)fi(uni!QU2gQRwfP)Z!fJPJKz(KvB2jH+IViZHraZ^9$J zo!ObLo}FEcU1T#mGu{2FUe(mhP8A|S0t118z(8OiFc26B4E(1IRQ^S~XJ==l{{DWc zR;yC0)nt8rT}DSoy=+lUs#dQ?AZ%*tK^-6znwYqsa9OK;Qmv_R0P(ZtXz`tu1$bvy zmvqIS-JKnonVE(MDzOKmv9WPE)7>rm`}=Ybf3!-tkU)Hlg$}@?nEP7%Q?B4Jkizc+ z0|QA!*ymh4<$}vGSdSPmmL#NYF;0V@OMnRub}3t1Te7ycCfHJVUaLeF8IADM=J?>} z55PKKPjt@aEx`tSm3e1Ltr0S7}Bguz$BFTyervcGY4q# zou31ea5;JmHlO@(9Qz;z=gSnXZ{LZy?}M+p1V{pnG!r4SewhSt?X(==V?5SVMF16m zx5+xT*l&jvNq*GVivW{|b{O7FObr2*JjRdCJ116+AxNw)_}T>QOhCM_Jbm^kdD=_6 z25}tcF|I6e!PjCt6TpQ(et0b}XI~r>0mHG678*JhZ)G9emJtE%#xKLBux4N& zFc26B3<8(+ZzCE6#-_GgsnK<4ZeFjm#kSpGHdFy3Rj`?S)v1HjmHE z%?Wcu9TK1YX@;lP{m&Coe!xia;0W1l_cv@)qlJtO8+sQX;^tOqCh|VAy;u zj_+ml1!Z~DF3acD3>vMaPJ(GQIA3sWxN^L0ys48`7Zm}l&)bTlMh`*1z?GZ6X1UE{ zPXb1xKcJ|nbATNI=6=zxFc)LkC&aO7RVqymP(^^PpqT($od?W^9&Om0c6brsTZ?z` zu+JFk<3oh{IUp_cTHPpR-+6otrybq|aDjF;M*zPW*jfVel4jm{p9r_- N002ovPDHLkV1fg`A9(-( literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/cj.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..77371a3ba8c82b2b47d2bfbd3159a13792c60827 GIT binary patch literal 995 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 KMNUMnLSTZ`0gvGT literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcb8e026ee553ee2026f27b8edb10f6232c786e GIT binary patch literal 967 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>aTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz@VoL!i*J5?aP4C@!!+MF{C2y?X3M?EQSKd7RxM> zyD_gKBUMqU?AC7{GqHUQy{)|orEAynKhloT%ur9-I<=^&wYTD*_MgwJ&v~kMPv5Dc zty8!1P}(Qe&$nlq7#}N`z`%(W{n2L<*1ThD`L4!k`Q5ykZ}0BaIQ#Qjm!;K>ja9$f z=W6Ko=1-Pd9B5Whmt1_;>i+Ay{4=>^-dYyKec4i-^kxx5$LAdf4w*AJoZz=u+&bZU zccIU2bBTuPo4e=R^K-1*Y;@g0JoYY<@J@nmIOTzaopF5LOqM*f^Y7Z>J+7uQ~G;=Q_a<^6`L zn*SS~m#*Ku@w~=m?u(z6Iv!465P5#yva>#$Gv%Z@hIdobH1BIDdTS%&RBanBYklhLovW_7sitgx3WisRr`Yu}2{L}rdleae~* z|Cr15UeDT8^Ok`j>(soKC?%QW literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/clerk.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7d37745187ab3867fdeb0e22655dceb99718e9 GIT binary patch literal 952 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 D52}=N literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..d04680f3ca65d0edec4b2d879fbca4607012024c GIT binary patch literal 983 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU@XXVb`Ho)PG(@xm{>Y-zxQDW zk>mSwr*?&Ptx$M0VWC*NSXYyU7whhj_H9j})1S=R;xwtvyGtbe;L(K-6n6c{{$PJ0 zv>;S~#Z{oN-Nj(7Z5uBgTXTf>k>;b0h2asOZ62v9UX3{! zB)8m@QCf1zgccT7(Hy7tW{cFxY1eK}&-gJdP>p}_{#Gpu%Px(H=5AT7yH-sxy%hSZ zB;@Fw|K~4XOIx=0-9nWMzhCW|KiQ!`e#P~e@87SKzD{>|z`DaM`k&F+%y+ZDM0t11 zFh7)i@M+mnP4)v<^$fn{oQ%oyV2rBsWwz66IA~)~!~bP{_2#U1kN*?YcQW5ud=0>l>0U~Yv zN-r)2X>ny8b^IWECsw3}<>0}iZ(M7b*bf>`ZoVZhz~y)CYI=rw=0@kO)0Ql9H7L^B zZjyQV&XM5PQ|-Myiq8F?|NHLk>V@qb;v5YOIFLgS)9&KzID_pmdew*T^?!O$agO`g zk*gOak8kmt;Kw7reWD+Ki{A6Fj{C30)|Xi5R~)@~aplb9BMchOx3^UrKi{`)@1dtt z^K|!FoO}EyaaSjc^Q2`eN3N{NeKu{yt%A(w-xjG?Z{F&^np<<%`l~A+S%lQob9|k0 zsndAbOpAkw8*it(Z>gxe`#VN!Dw~t!xnBnrMRm2W1bL~So8c11ApPmm`#B=JHqWhJ zH~IAzjj87@y!`Wh)ePHv%BMFe{asR0qS*14(Pqc)W69UeXP^D??oV9$hdC-sKfh*} zqIkaSzi7=hT^}#?Q~o)u8jGWrzx~W(=Ps(UR`{tpUjy&#vtif6?=J4*_^r3p_*DE8 zkr(C<7N7h3W6ARATKN@mPjw}eHRmq*Fp-@}fdL2lu${xBbkXF$$(D&?L31G1Diup5L*l%Vq2+hq{ y%=p3UMY-zxQDW zk>mSwr*?&Ptx$M0VWC*NSXYyU7whhj_H9j})1S=R;xwtvyGtbe;L(K-6n6c{{$PJ0 zv>;S~#Z{oN-Nj(7Z5uBgTXTf>k>;b0h2asOZ62v9UX3{! zB)8m@QCf1zgccT7(Hy7tW{cFxY1eK}&-gJdP>p}_{#Gpu%Px(H=5AT7yH-sxy%hSZ zB;@Fw|K~4XOIx=0-9nWMzhCW|KiQ!`e#P~e@87SKzD{>|z`DaM`k&F+%y+ZDM0t11 zFh7)i@M+mnP4)v<^$fn{oQ%oyV2rBsWwz66IA~)~!~bP{_2#U1kNymC>d*GaVx586#CacAgYdV1UXll||Em+#guIc*hb|Jy^#_|u{V zJAz}Dy4_y>_xS9OpANqh%+=AqRJ_^sYh1t9ef`GwxBg@{H3kFZEi_&hwxAY?HoA zU;b}qiTgVSv+q~xWUuOqd}>rbzdK`|tKVwtZ$eML$~UrpEY)yod=@+o1z$5fs|_#Gy+| z)^Foo_3gS9V~on`l^eMlzR4Qo{#qrJP#r7XAdod{-z~Ehx9&?cWP-)+N-%JndB*2T uhrC_?Rcu1HLT#wxQ7euHhiM#t7&rWup3(B$#{`&O7(8A5T-G@yGywn;ZoQHK literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json new file mode 100644 index 00000000000..322f9da00e0 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpskirt/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000000000000000000000000000000000..b2e475bdbe1be1521d64a5a124b31a3c54ea5727 GIT binary patch literal 1559 zcmV+y2I%>TP)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB600d7-L_t(|UhP^7g~QpHx2#)QP53R-9#65lYkMe6w_9k)^SeogxAL; zGxyC$Tl!uI=_K#HbMCo!?o8)i5kI^FUIDLwSHLUa74Qn2Q3Xn;(eCy2^`KIzNVQs( zR;wkQPDkeF=bda(Evi?VX5L#M#+}EJ#%c_^|?*;82&N+wDrb-4=Xu@OLeVQDO|kk6Pn`A1eTX z7~VYI+1Zh1vnlvA1u#QXr5W%Fx8mR~*^B(`B5=J!Z|n2&W> zpJo(+9~%MiC_E2OnjV2+W&}V0dK~l2b*>`V``GyAzOMKaqsT>tFB1*3G1lAXXPU4# z`4oXaQh;INm{)_Sp0lWWz8AXz>%@ z2N00Pn*<;RzAs`R-0dq-n$u7f0sV94|E(wt1{n&%te>|C!~r(m)F@q=B-8>#)#=}?zHlbsA{ZTTZ}GvAUIA@y0I*d8m`xHk zaXhB_@V?$}ns6~H$r^Y*9Kp?7clw4$anOpOej;Q7qYl95bNC)%iH?yZ#yHLifI$wx z1_zEPQQ~makHxtmOVK7ky{|dYO>tIz3cP*TmM@<_$*b4TwcK-?4=&&YZrY*p z79s!utis^)q(p#O8Ok*RAb|N?KB`uy^@7WMyB_FTp;9M7*5XXkuHY_)V~uUR$w|va zB>?O5HgVMGG0-n??XIg?$=0za0khE`kannZfE@umPTLWtF@(KB_UXvu+;RXmHbcxz zfEoj`nu{ABJNz}qgNOPuND)lnBE1jN;9!=>(sZP$1<1;KCuJXJ0kqjRPlMBNaTXv? zgNoc+bs4mYrBOZ$BhxfT5#Lz=8h@N3MD+?}A*|oSD{zJs_y^3V&=AQ*#y0=}002ov JPDHLkV1nJ{-6a43 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03f703a26ccf83f715569b0cfc22840f2dfb1b9b GIT binary patch literal 902 zcmV;119|+3P)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB600F*9L_t(oN9|NGPQySDT!&bKNGJsekn9K0 z@BsdiFYp5@K0rZ!z!%c^38|>4Xk0;KOMpNq!cI^O95Y@==TZOz10m2{WaNcE322c?yMn@NPsL9O{Mv2(*9^#_LiLqATEQ z;3WJs&AAkShykqu(w#BT)dDz!ujg3DzSKkjq``gs{~Um*51=BnTiYN;vpM-x-uv_n c{2K;-0LZK71P8U)CjbBd07*qoM6N<$f=F?czyJUM literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..9b19bead358e0fc8be9ce1a23807753f7df8b751 GIT binary patch literal 955 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 KTJ?4N@c#m0(W=A% literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bf6ed67bc86a2668c33a6b1a00998ceb9793daa0 GIT binary patch literal 537 zcmV+!0_OdRP)MLMTa)5ZdG*2|^K(2#Q2RT8ZKyyzckxT@JzBX_o}|U4Hj_@7?eF zd4G+mR0;+uBMewNfDWJo{7-=M*fp7RI;1?8$%2=688io27z&emsR3Ld1Q8(ys{vk$ z)8!yBk8_az*i;3g7-0VGhzOA!%xuKr;juzZmw6AI#S%0JdkF5sKH%LAax=W67(x*M zXC5K#*;DYizT42$WHQk>Ww(HB(h9cy9JFzKu}m8Enj#2U05r$qg<_eSEiF2!8LC>X zO6I7GWJbyhMNkAG3qY6mE8<~eLXekBH`FGq)EL#>kK-+)Cb{zR0Adk?Sd3tCJo()- zw))bL&v#&Og}Nc|KTse=X8?;?co$Tjn?!D`+Uuz58nW5373db*A_Ub8fC-lyA=Xy5 zq`X)4{1h|Oe#}(^B;zMgyGy{8_affJuU9N8Va~Z)weqz+Q&{`rO(x@8ycUWrCQ7H75!7O6jL{bZwyMtq;Be zRnVCaBhgEJT+^>{Y#mc5_pKbKyX!tj`qaLXh=a?fbt>tBYuy#lhwQ%6mFWQoeIZzG z^EpI_L}2C0)#ZNCyX%Hto|QG1u97<2Je;nuG?u0sQ_{Z9y&KLi^5yfDqMu{<>9fDA zyfpscea_DJv&YKUz{cd|fzyHwuEVqKcl}d8eH+whyj|2&pj8wZ!)M^dEk0<(gBese8!@$(E`4;#H$Ddp3=Ezv4xa z|7S@j!l|~W&vxk<)$H32S=Tgb85=5Pj~_Vz(Yy#xN!h<&JfY8Ae`%1YB-R$=l{Aui ztXi38*EU7Wn^w^gnLTHoH%>*?xNvoy6@LeEcEr|7adMt(B@oE^2;oOG?S!$I$;xP6 zOkek~%=H%q_1vmjd{0j(2pmD9iO!>m=B?$U$+k28vDRiU@0FQF^7m#I+)s9W__(C! zlXJnncw5@z$8UN+-Z}0ETkdf6s9Hu?GvNzE!|i=T5uD*SWDR2!@fA@9E6u2dLq)Bs zYvM{dW$B@oR(9@R&?SQ*9Yz|T3$uIOm$mo`eBK)zOk+&a9;D6bOlyCUN`s}3Np%KG z-y50aLFc_$l|>D|XYoJZRll_hRDa>AK$|w=NwTqmJR{;=7su%sj$_p4RDZo)oUfOZ zM@RhU8)o)192#2U=5_n(PF-hm_d9@>>sqE)hn6Hd-@rQ}L$6csj139BJUsJRRcF6V z{?x|-qxGeg@7S0rgLL~9KDK!IR70b~jFVc;{Hv;Ou@dY-x3;7%>^IVSTI(p?e0|`6 z@8!V)gBM*D^BCEuQ%)^Cl!QX|Rl}Y`UgbUw6#=)qBV=1M4M(R2uJOGb9eAwBv(h3f z6JHcYgQU2$YfAn_?D85IBtT=UPfV~5a<2-UJzf_vjX zb}BcUzp~FxoAfo7KE;UCJd8znf}983y=CtBUUsE7yGWOO%meEMJihrry~ND&-ioc=WTmT^H189 z%dN zUWhGMba7s7N3J`lD<9bFcqy2ftZb?1y1P3u7^9AQMeLd`>YOnEe<y(|O2p6q(F5c|czWX>yMDCKUa|>APV4Q?6kE{0y&K+u2x6Ah&*WhY@ za7~<_$TvT+Ufz&Ru;7)NJLu{o ze3W9XfhfEz(SCdtJRpCgo7#RO;f+|Y7Lz8YC6iEMMSXH9av_tH6$^>B@yQiz@G{%J zSHsg)dYkkGe)t<>F-hUvzz2t|(a}aQaA}e|76oq6_f_}qzD!SiaS#%zDM~iSExaf>d#WdJal722 zp~cOiXx)X^QCYXx*>^I7v~7qV7p>6+OM| zP=xehMe{d1UF*&-6iccJeJrkbxeKS2#6R5aV=5V^V7xu-wH05h*ep(h!xhczbAWpv z1xZIv960poh{v;uJjEyEUN|S$@8vNI_J~r8)r<$VpA#t@I@U#oV#8qPCoZq{7C#L> zT;;wv^-#}Z#NghS;rRINhFq#I`vXKi$1Q5psb}E>cN%i9+66y*Ya(fvGCUgdTd#!N zp!uE>tM{)4I*%(+)f`u;7oV{~=9TelTq0g``yM&eeo6l@Fr?UY)ZZ={rjhZRT&g%J zn8t%L^Ea@#GKe_X)>Fo`*XfJqlM^LkIyr?3ocork7q0OsTv;gKoREenif}GCT7E5Pa@5eJ4&UOEx4~kP zh0#qD6xws9nDU_)oq-U`$-JlhZ>8kIY_5-291G<%Eh6PuMuzAQhIwU+QUlc>#TDC& z@Xtc%QHstJ6|r^?O`}XC#6E4y_#n?~B2pZ*JEJ`@lV@M8Srcu?*S7m)CA`_lm7+d$$`Dch%b_V-VebSrQ#xm)Y@*_OeZi9S+K$@jYBjjThs5A`wN<{m zGBsQQThpFf?Cvh?Gu63ZC3djs`W{Wz)p6Oxg{#N)2ouG4C8hWjcdJu@JLSmCjJ3Ff zPEwQK*;l`g9SeG&G$|i;P=p&^GkB|O9o*F4xL2dm;BjZE7?kFS8*#SA2X9}*D@Zs9 zQug!@x1sDCPp1yr&&?U%3-8hqfIw0hS3V*W_>iQbpK+bbpd zuhGw?Jgjsr4bp7;-GRMmt6Ki*dkKC_uM0A`_94h;L8+$iOX2Fc&$r2s>x;GDKZIwE z3F2Gs6^g`>zxB_3RJdb=nm#u~GQXS*9E*?#ZN4{A<@F7aX1`WxJxEnf)3y^gI?D8_ z3f0l5Sjj8S4@xZ|*Nr2`Vr+tEoyG$74%zIi_8wIi&;Ps)w|27l+EniIc$ef*m+y>7 z60!y9U=Y@%LeRt8b*6ejq8;!D7xN6tH0QB5D@25DAmFx>O*KjbE~O?!E~epDd%*8FV>nL5wTq$K{B26VietUX9K0(9(o-MiRq&2px2(uXd0h}T|2)dK zODDI_O>?lQ;Nz2b-XhGcvG~D4%dW(5$v`PXSO?N2urnPdgY2QS+UM&qBNdh2W!v)% zurj&n$ung|{Fr+<+;cg1+cUN8(;fL}tQ4_sac`Z~h_%CMYbU3C_u%W|w!)Sw;Y+fn zN?VM&Pmz~-IHS+p3{lUR))$Q@FnvBD^ahhn%=xPGa@!tUm%UV-SOR;<8>TLqpI4~Q zb^i-u?%rz6IaUn@9$b32Yw`T_xw03oKG$zl<-Jye89AW)zM(H>^CGzrWLHW54^eoY z_N=&>%qCn!oIW`FRby_GO;_}jv*Gu8Vxr!(?xtPhH(cvb+n$_tQye^FT=_v^{;c49 zFjcY5QNjOK*RAU6#baRKBE9J95%a+V{2}$Ydtf0^MeFf`_WO2u;R7!|#0ZLuGa_;z zzrU^WS-eta6>ex*(61C_-c03u*TKr!8iaQM=Nz2B*3h2UEm~E4$3rtZ{PmX|C*M~u zfqJYg&zHLwRPk3UW~MrqW;i>m*nIiUlfr9*PvTg}&=%B^CP!9>o{+q%Su|Ka{<=r) zuCm1RwU0ZalU}+9>_;fc^lS- z7tQoQpeR< zfwz%1cqXS8kv;U@#B-0`SM-Y1N5wKlu3$)5S^1i44F4edvhYLLnSm>xt3Hp+NDLWI zG(XaKe}RD2Og*WuRBoxT5~{oc58HXNskua0h3E9w{e!zL485cTs@C&e_gDFMQ7`1D z_=TSClfEru%--mqns{xxm-$`8*f!<%e8m<1qvMgEf}*z8YNcCw_ooST=caDG=rq*i zwrYra@DA3IjfXNgLrO13e!72uiX%beY1>UXX1Ve<=ikx1en)n!GLC+iXe%0P$tt*3 zbR7Id&zQv{F20pyA!Yx4oAQz~n3@r22ehp|G@xy@#-GHJJlvHDWDg=m+0We*Xlp?r z%_DxE1d=O-1twCQXml;e=O;A~FpaDQIfcf<@t(RAXPSNhgJK?FWI+mWC1J>rBZs*) z{jdOlJB396`?^Fcxm zbAvS*WGdDSckCwwFw%lJvsj*37|hq#SJ_uZ*@NK(Ltro%7#s;hBB6i=l<7}r5&WQZ zrpyM!4-6cINn+4ESu_ticmtC_^zdeBK_I|9_z(ZwJ@NQI;pxnuEC77K{0N>fgfblF z?hgCag2~eJ0YH8_^dBvl7C`q8Govs)ycr~lo)3l2lKB;aO#0K_)0^S884j5QqqtGr z0aYfjD&lWT9yh?7{Asa4ffLQ$bJGeS`)`^o8uc%-{^r}p%w{;hIs%ygiTgM0KVsih z2DI>aEY5@Ez2Tk#P7AWJK9=l3qLHziuS60-okFD`p#&nF2t}dM7$}BBLO~HkB0?3Z zhCxzP3BN!Y(3va(okZDy0>G7N01lamCXrE8btpkig#<-WRFP1kikb>kl|oWOkO)W; zQVsbFgfW8#R3*XfSFbjp$N&_Ij6tcA;3`lmg@k~j)Tm@AK?SV>MPe`rIF*W^!c~5F zLndL5c`)1wKssse1Sbm2lkT*+#s=Y7Z4(162vQmTm&C-4z@h>Mz#gE{$sWGUzosl` z?i6ztVS`VE8Ul%ct0C1@Q7AQ4^&ehuB3e-xOrRDwP!Vutl^-)3iNONl0MrsTDir|u zBTlR?gF;|=Ff2Sg+_WGY5a12VKd14)h9VPK1RQ}y0YKqM6c!HLNDCwayK$qS8^d4p zJ;*ew|No`Ev3#1Ckk+W{4Cf%?kPz*#W21$e?Ra6N- zGx#Su(}T+LB`_%3P5_SpS3rSoas`(EnJR_9d*ka&*~kMx8Nd_IXh=$2yo zK0vb5Q~xv*1mfY}c(!!(2Ym&EJ6HyIy&WGpIkpIiiH#Vm1C8@@1Dv*nU(fWr8pEvw z@$Iw6y^yOMIxVC1XwDr6OT)N2u`Ey% zwWnQ?%a$E}4#D#Z9us!Oao>UY=ZD<14&t)GmCek!+;QAvL7`}>ZQnqDGyrj)KD zJOPqq)RJp5`f+b+YxmFtrN*IVuPgC;c1ZLxUx3qS}wI4n; qFFABhdh4sl?6}IEg@H!0EeDP4?_v>|7h{1OgADYHaCth8!T$qmnggW( literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cj_white.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..deb205205ab91d09acd1729baa444204c3560f69 GIT binary patch literal 7879 zcmeHLc{G&m`xiwhWs4Bg6g4!)jA0mS*~?@bTh>{b48zRWMJ8o$k;)R1rI0O!DAHyP zA%!f_o1IYh_&wCy+k1ZBbAIPN=lA{Zea_4?&wVYQ`?@~&b>C;MC(`t!!A>4A9yT_% zokoVb=D@G^#&aL=W9^#O8^0IUtu9On!2q|?Y0Dhb5&_auQxeiSkrn_u_aL_7K) zDsj5&#Zk8GGo07Y-RYWezOGffCENU3$}UUmkfxDSQPu~yvwxJ7lr%0`8?G)}f(5fM zm$>0KuoeM}+)CJYi{_~-7A>@uu(_4humypT^*<$!m~lNbG; z=OQmhw#76Jr`Yu^hxe~Jerq0g`Vu?zeG+-m4D)VB_(=QC2}c?-B%=1xmi5JX$iQcq zNbvS@-f91Jottg7GeeJ;f@)r+an0*aw@2Bp_!X@*MyX5<&$ZlnI;GL58Auj^9=x5< zhdI+zzeE;&&mE&xCaswma%FlcNH%Tufy>#?L9g1EcG%@}M7p0#DeZE# z13fW=!Eu;busD$`K0v66ywoedGIj?xfaJSfQ&}k_C{!1qIi#NdvJxaKQvgpWB;B09UT0X{kL8T4$#u1LK3zIu;bKm^3)=Y?oad2 zq(WCD=uMDed;07AMS*hFzu8D7k#V!SF`GH~qC z4aY$7R+lh-12O-2GlOK0_tZgFdsi&Ft8^=a?F9UPzoJNPjkwbMaop zMLm6-V*YN9nxcDNUUpND-=8s-Sd$qKuI8Y_C(LE-n$+_-BAfFOb z)kVMim&Wsu)=6V;Rg-8=YojykUAmQ8!*X!DkmbgpGb2OGvn$qai1k5;?+khwpSrD&yTP;q_tslD_5_`lX!-i-Xk*F3lheIo{6<+W zpQ|o77`Fv=w?8#YI6gn(Q~9|Yeo+}e4@ohww!6L4tZH;9!N7{|18jk{G#=3}Ve3&J zyg28~lxw-ZzzmF^w2AA=SgEh54^VzT*wySw4biW@u~P@te7WqR{K&#o)s-3PUDn)U z=EbOO0*y+(he%4EDcifAs3;M#IbRlk@5*={eNz~}Vim6-jy_BAnl**|YyQ3qT(E09hkVH?5Lq(TO z=wRgbFl-Z-m(^~MAnG}2H%5@;>(o?rFOEz$b=-=oRk6()y(Beh8kkXGZY!y;jdK2) z;4TE`DQDqg0(bh2zpD`qrFRF&R;DM2quK87o*h;lPXf$)Lg)#@sC$nJM@8Sw_5G zln{Js)f}MrsKB=8whly7GrzD)EHvM_!{8|04HDfZmu5O={|GHBYjgQQ!J%2-p%ELp zRh)N`PFCH7CgNtj(bdScozPr~S9?duD#rndxI$MDpZ*Q|0u9%Ndh|!4C_vC-e z+N-wj33|JT?xfMT%p>pwP}=KYWb6QvvH^-*$&rjt%r?Qywk{%f-O(nouu3h2@jr1M1MbJujr@8 zllmGGu{EU3fJ;r`!8S_>HXg>zl$2#v(9v**n^EjF`YpT-4<<@Zik@f9iYz6o6w4JU zxI4+i?ujRDOEJCl_J#aN4A~&EDZQ@?#jpnT9X1sH>~i256R#(*_5Ia1lSKFDHJs(c zqERu4Z6zn#uW9D#b$8om<;t2G=9bnXq;8E`WS6-(fD@x(J?*}~-LPZGUamcqK<73Lz6+B;=N4SK=nQhKqViB}V4eil+0LVUK8 zW--QhdA1Ik8A!Py%VzIaWJDtciL7LPSr=!%DayOSu3Yxn&hsC+`JvpDCgsYOc&c2~ zw`3kHMBs?SB=U|4e zfm2pamnU=#jjhRo163e;3bwl-5s{`Zxvb_NY$X$QUl$AsdarF_^eO!C=P( z#Xo&lQQgz|_k>HU4IsTzo`(VSC(7dJGcxsp8O$)r;>uUx(JnUjvPJ4WiO{@nx=V0V zvsWU83NMpid1vmsLoI$d7qR8#(cV-cWaqP49Y5#*uU<|1-lKY>{@oPS)M@MB5Z$Z= z3xT4hsDW5_$HJ2nj)heP>9(@fJ(}ua!WIzIedpC0~6%U=Jr6a(2J18st#w zl$M#D^OEuhSCljN*Y!*#<0isIQCw}zslzQn)gZeq0+geULRwPIrTpEs)M5y*L9N@ZaMYX6`o?q$0wYt{1x3i!c6z;syD^7qN=Vw zu6t+R@92*+x75GpYqHZI)G|I5r4?%#s+OoXlRC@xu&?QMWagnSqe-SOlFf}(wcVdF zN0Pc(1o_M9`dm5km^1V*@7F9WuP!)Un=%<(U+{Puw?GK7)TJ>jpl0>;nHF*jUg=mX ztDcU<3))wlOAO!S8Qa)$Cm)=``e3}f1@1acAnDi{n|otk*tVc;UITA^f|RQyOVlsE z?!`!$nMGjyl(6NQ+1A`8iF<6{^O0nYjg`$_g03PRN2M>LRue8~Y8s_f^=w1Ooe}bu z)jE@&L>PwOK71%|A9v<;M}2J}A9d{IygT*JpIVM>DYqu?-gIPhL<({oL~Y2UadeiiFQK3rln!me!;^60YcjJYNr+bCI^aUX;3^wD_=nPdwq) zs!dte;f1$dk7?Db>E9X)6L)*u)arN!>EBawe04^NaIlTqaJJW1W$jb~K~P3dri)Co zIDYaVwZS<1SR_lMW-7({1Y|WZz_}`zW1b6k&+2Nt`td7#Nv3@9F^+2^!tJBa#=OBc zJ=pK#O?8cgMeDP+qWWO}0;;V*WlOTCeJW&&+c6ZrUB0DQj+i85bTHLZ#`Y$&Qsd?5 zvi_@A#8ycwKD+7G^2V@msa6_b&Kfln~seS5gUuyr@=DpR+>FS#fx%jvnf%!Rg zc%nppcVIP*!z*x?tLnj1ieLGu7Y&v~=>_tUTyt-`5_e3@^nM;mFvoR>R`{i5z-Fpo zL7IIcYcsA@=r6T|3D;Z7;niq(_x?K9{)^NA?wR|=bz&@ufHxz~GZ&OIWE=OfWCHsN za|a zIrCZ`mB?Z_`HF-elbRrpTuB-nO0vKt4U71WzGz{kJ>nrc8C{Lriz~HK?sxSov z41s_G7Ep%22NUN9^fcSx-OJWe{6i+6F<^kHk#Nlb)Obsv?(1ZSr&)pM)`33L6 z_{jpm2h0!W34_Zkz}($ozk4v4dOiTi&w&1;2LlVdJ%E{$7&LD>fu!d{@?akL9fC;s z-{X$)9lFlb#G!FwY-BV7&f#{6g^jX)uyHy=@oI5GjRpa{h)l88_w zf{cXXi8vyZOoZd`2po~5ibVYeW#qwN;yehX4JZIyo&wFxP(%PqQB?^}hU1i>2qFo9QYEPZ(I^9W zcpMU^g22I12;wFbk$~2x(cN*ta#GxJE+m+zhs&m7gK+dwQzH#9LSEr7i76GwBm)k> z9-w#-X}*lVR9K2T$%2X7;1iC5Bj5@sgc3?wML|Ic@t2VmiOv9OaRU{uAg}mCv#~H} zART~O+(xAW0Gl2_HfS9>3CE<-u{0W01H2IwXv6cD8Ut)7B94jE#W6_$r~(3sRscQ- zECP;3D4>;;p&P^B>}f;_+5i8t-q=1M^&g9FNMQi;`)`VV>?sS9*N@SUA(gVZnLwb; zZGpxSex$&_`H+5a3}F3G5nOQ|E+pXm_*t-j$|?V$7!*{M@hCW46-rbAwl|WftPEAb zkx5Xvsxpa$S5!d~P|BMu{6c5Y$V^`xopjU%;1S>oD9}x=K!<-W73A;szOJN=bpR*> zID-B~843*hnJjGM#P~B?b=d#nLw(cWw<8Ad`ym64F5o1D{W=PN@&&~D-@JaV!+&!M z5a{1Y{t>_b()BN0|A>KqWc+V+{Y%$BV&ESc|65)EZ*=ke)l88*fPX-~K&w<2>pBIr zS)BM22D)sHYzNq&TON4q1ti>_hPDhgHeP{^@0PaS;8j4##Wcd`agA){*dnBwp0XYFQ=c24qw!9z~q9 zli8N?fgQ8c`v{bEN+OI$xa^r~MDfGZZj4s7@4-FN`~Cg>Z%FvF@&CNuR3qlwoAU=R zCNyR~_ZnDw-_tK?@r`^T5;gx;-|M0LDUXw%Q1`d1OF?S22bSt+#5Z)tF?-;3u7~~U z$57Ovi#$eVveqwV>T?cXlY54IT`*&|9|AZ<9@LFRt@-N&uI+A|lNvgmAF2xu1@7^L zr>Vux)10mxY#**10-b)WVR0*%5njT(i_N*k#!!_r={4C8!KPCA#kBg7#qHIMS3MS6 z-k#zJ9S$GLI=@4*MPvr)eqLnkgVt%Yp-CekCLr)igloS2;PUe1r|CqjG&i6~WIq@D z8M`E*4+P<0)jy1_j~OB257iL=dD( z6#=OtNEZ;0BE=i@ob#SD?l;CA?-=*{clO9GYpyw;HRm(uTG@L=8R~1&P_j}2000`e zmYOl)u5@;uCnsD>vF00^q-&k6zWpw z@Nmh3h%7@@uNc}d4T|5JCi$N1?_9Kgd~g)8vv{Y~y$8R$KQLvzAM~VtlV~I7n?T^@ zWu(VsP?MoGi{&9UdrZyxn#b*w%8=DgFCUTdF^095og3EDi37971BpNSU$xIJu0_RH z4@XBYW!#$i5#bY5>A&=y?e@IyY{tfXMTaZoN)zo^RluwA!vt8M)WOkvmaudV@G;7b z#d_()z*~EB{;28DzqMnNCZK#DtzPkp&s(va-*hdrQqhLGabM_YJ=N-Ye3hNQ%PNv@ zDPgW77IA!d^K;T+%R4Yy?n-4m2Na&9gX({rrye%Re@U09O>4Jj_s$h z%)!64zcJmS$gKFSW)f|4vPnJ z9y{bAdS|pL`t8dn)cueJ*;jZr_Ua?_h%fc=w;zWQA;Em$=+1X{Y3hn*IsKn!jc<1j zWgdY#*)*gENT_86FD=Fjb@*Fuaj)g+?REE~oy1VB$}t5O*(&CV*z(eahRHTBHVf!q z-$`;_Zx~be8EDh=1^rkMZ!T$`E2je;bms);FyEmT>tMtSRd*!crW7bd8S8`UlJ8uQ zT};G-8y3xOQ}864cnB0En^}F|vMw)Kyy^J#shB--q2uu_u^91buUXYN*!L-&%2za> z#NR}6#mM&*=jlnGgtKDO{E{u~Z+R0HFqv6m(a(BH%Ur7JPA|H?{(Vn)!zS7KPHpDb1ggM!4Po!GCRKY^S5X!pt`kmWUfZuUp7Z2 zx)vsNZrPfTzIY)#+thrtJEgdn4qvGc#Q$u^Yg8Ns`EGobezx7~I_v8qSRXTA&35;G zYv;u~mNo?q!-UDM~Qk;g3c^Qcq!UL#eO?E2Jm>Ga3;O$;73_|-Hor~Pg!^s=QWerR~$)KD`qt7*1B11lxm#fFQ4C?{&;he zq|7WqbdmL$kM{@p##=Y9(NEosjWzU%iB503bj8Wd-Ba2Iw~6{d>ytJ+m)o%6AwQ|@ z&#^!v|Gau-F6HKrDHi20tzv2Tf| zYrT`KTIK;gdt9rZewT^O%x(f2_icK#g0Hbd{QIl54R?}vHAK4Mx>p558)-}ocisi! z0|c%yFK~2tymBF(!HgOQd}LwtyULMFPC0hPzIPioBc7xTDxUPN;$K?QUz@TNzqd7C zK~ulK#vl~-?O1nOnzxt>HlF#kI|w^aB)u%EA*XJePIOVfYvyT#x9vx2)^v0a`B=|` zYjubAjkCRerjJ>UcW!~}zY6WAq)koZ$BFxnk{Q%c^ zF^ukL#Ryk8eQL?Zpi5lGzDEC`0Ep+FOTax9YoohGO}Typ-gk1KTBs?|c(lE4SvaIIi#?Wz?R2yTVo-VZpk^g(sN~>v1C0 zB~BWHXL2xkBWeI4S`%HB)#FT32j*?TYUj2hcG>b0GYn}ILej^3I(m4pED0j~qi|B& zmZLVu3toU6 zgnuv5wVYBqClXb?U8a3rHsb8ZKtAch z-s3IDW;KVwAa=;;jVxS<6LDGe+uvSg>k7ASw4)PFeP&PD%0H_BV21JT~bHPw&0SYbWJb)x=Qo&s=5cV zbRhbdc^g9z3s>sX$f$xydjE&5+>bZH9f z6y6opaGm?9I>*Xew&1tKwsNV4V=k%ZsOA`T=t5;w-~qNsvX&%&)T(jM8saf?F`ayshaE;L7TCdxDN3cV46Zm;rf znkUHEs!f_izSSt1FqqVVJ_nQi?BR7o6It=;M$#Fx;I$1Vh|_bqwBlEIS+!&*BZXpf zu-HMmRMMQQTiHd_kHfPg?Qdxz8JakBy5BTEx=S=pUz6jA)Mk!LDY-ip%^tLf%!yj? zDoA*Hc(cKVi>GOmq$4~TQL>_J*Sa12WZbrE`b~x1{KV{#Mh9!^i8-UWyEP>{T91`3ZP+EZBQTcdHk(hWxc|yh93wquJdVk`gilb9#Aoo@3FIr0lHx@PSud+0ot{>(VmR}h=ZM`Byf zE2-A3buT<*mA3sGT4R~POn2c9l}?Gyj!)90J(&RV6WNx$5-Y``t#7V#UhYypDCxp! zgT-Fc#kdFI%BMzL_q9OyWD1QvmeC8q-BPN!$662SV&Oc*U)qMx!(tRiUrb8a?3cKJ zP~~b3I)S&kMA_$}s!lk8uGtEec}WWQ_n`u{@|$Z@n@nO`td^NKQx!7=97=BmbDGJE zt>@e<4r=GnU%k>6A_W{nXc=v!C?1zUv+q>DK1^r0Ibk%c8~6gO#C}x~0JE)q;D9QV zC4CV9E%R@jdq8Xa^V9ceOV;+4iZ4^JM*k`k=?4s-6=&3llEYnO0OrPnKbFSy(nW%h zm)_K#6ka&K{&Ch$j9Y|QlD4&oOR_)|Sx^%;2`6RZe7mwlLq~Z96mK_Bc0WPqVYBZb z;|#M_#}eYiChf8vZFo_L;Foh$U$1->c=N~&`m*Hqa$!PR#fD{(d1-kDWvwo4tspP8 zkwiJeqI>ywV}}u*;yW+WR%?(!q1Gkw3#BzgK2?{u4>Z}=wZj&OtOTSbA7Do3!`v9)0rU0o7O(sFdk7ytt z0I$Q@Zt2Y4n^cs$x!``HYX0*?rl0UK6ZL^`fe#(K!`yS`ITYvLvZngcYXAcuiP&4$ z`>6D{pR5uW_`D_#&1cAtjj69u|Kh{L(Y0TUr6UE>MF5_XzrG^L_fi6bai&6 zl9X?_6m4Y`h&?|HE8x;@!I+wz>LaZhi1O|(_LFcQ4Y*t){L!-W%jDQWTY85s z2qkt}oma&me(g4IP|8DmQxD|B(E5P-E*)aoQNZxq5d_PQ|5|o?L_~nR(s;;a;T7fi zVi^VNzBT^jkV4pl&?uh1FZ#wa?ir5MQSI)OA2QOFy|Xszpn_}9XNsqrn44nLuqGl6 zMiG3aX;BVEO->AM4#W{X_EvL5SMCYk|9Aizc_2DHP}Ui7i+=nlu}E+`>0vO>oYI`4 zzD>JMmpd6d*N@q5{vYah_Dlqh^I*e%orf~!dJswTX6&4rgt(|EtpMw7Vy-{BOymerY}^Puv{pQr~&iq{J`GSia|%ETleiWR*e9O; z?yx($UpQBlabKAh^kE|{^kH+)I7M+o+3XZhz>TG_CnfgTEV4$??`b{MWURXoWr?o@ zQOX~{jt(7jM*Lld3j(36iO1l#kkS6WTnUF)OiPOFj>=S zlSgE?S2c|%zuXqA`0V;BsoKlrlQAtc$t-iFq?+;k1#3?ABehFRBw7htcXMAay8Dx@ zH(fNycjk>=CBHKF-6d&5(K9XQB^N~WcuSL#9gE>b0~srFq+&LhW<%ujqAqVIno zmJ3xrKWsAMmOJ_m#eA7T;kr-l!9a5qkdT})zw{8j$eH}oBAJEOS-HdDtVgtPYR-5$*h*`V z))XcqcF`c}&?{O`kZ1&27vzgc%o>niB&yz8?8@zWFMDr$S7}LS{0>KuHw8e)-1!p_SRuZN8~ZH9~;uj?G|JeOGpevZ#!ieSDUDx*!- zXcAEuYWjFV3VWBEMq0qwl8hxHG;H~^)0X0(shcSssXCoIe!o^LYDwxYGuGgRtYULO zbK9#W;?w8-)Qx;ZmkQg&OY)zm*(8K+E~{Qrpau$xPu}bSFAhouvX?yi%nA1Qs$9FI zO7;O0T$$yYY%#@|$*1osoBRp(*~sh>RXbn1nEpBLW~P^)zomc5?X(H?13v>Cs2h}w zcWARcV~~z4isZUyjp*BnOb<7~^XT|J86|Z_#j7wdFq%|RT)pr)Q7_HH-X?eMmPV?4 z^eJ=crv?68wV6vLOsl2Fqgpps-WxIDe<~W>N>AN;8SzMIvurI;Bjl5UVP(U{X35&< zKyV9{n@im>I_>?G^h#|qvn=^NpWxo~&!j48VqzcJ{0AO#G;_T9_>UW&`42Habc9K z1VUIsS{f-VgBHgKqopN9#U%;<>Y^B_zd^xqcuxcli9UlOfP=9F96OXO1}R}DBP@wR ziV91h2r0Fb5S0|hVC-bkNQgLER8s735C$GtLRBK1|L)Zp6p8>PBPJ#)fkdN(WiSv) zVF^)`q_C_w1}Q8iC5Dm2prjVUHGZ!`c7pI3paYYzT*e zAYjq|NDQ43o*04wVGdw%C|4i+f4WStF6ir?h%-LLq{Sd&qEfQ564GKaqN2Y8|AlCV z_P`Tr@eEZ=6f6$;Wqy_zC?OmIwTQDyB>?=A6QY5tdY}=Wt{x_?uFf#f83gdm@~>_^ z!h}L0JP~RLPc#8k6e0l?CHx>J5HYBj6jWS7_^kOieOD9~SM+?!Q~Vo6gu@lL-j?H7%eB(K*gxgi z|DhP95Hd0-Q5hLwGzvqgCkbg$VOd!z31N(^I7$*NC5e(j{-*UWbi6CZ(+A;!R<t z`z<3ZU4)fT;D^Fl>hmdLgNT;Kt6;|CFk8kHo|8Xxt)%t8o(OB1rR2Bj=M~dP`GJX-~j+C zhO?7scslTyAUx*@*Hb^YOiDsT2Qo+|nFjz!hTv+-CcYD2Z;ClE>M@>zt*dpPTa3Pu zQ6#T$qpz4)Q>D|TPb57J20p1R_kudL^7cuNh9;?NVdpsWuM5#uRP~%5lC_SVJ)qH9&?t1MVgEe^fVEw!<)1bs`uL>m)~
xVuL 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 kbrf4712OWQUrly!^`%irUedqm2=0U1cD(f|Me literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4e73693046fa1d1ad954add9430787349fb847e1 GIT binary patch literal 7183 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/cjformal.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..567d302dc529f82b62c390a392703de835c62b06 GIT binary patch literal 7415 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..5dcb8e026ee553ee2026f27b8edb10f6232c786e GIT binary patch literal 967 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>aTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz@VoL!i*J5?aP4C@!!+MF{C2y?X3M?EQSKd7RxM> zyD_gKBUMqU?AC7{GqHUQy{)|orEAynKhloT%ur9-I<=^&wYTD*_MgwJ&v~kMPv5Dc zty8!1P}(Qe&$nlq7#}N`z`%(W{n2L<*1ThD`L4!k`Q5ykZ}0BaIQ#Qjm!;K>ja9$f z=W6Ko=1-Pd9B5Whmt1_;>i+Ay{4=>^-dYyKec4i-^kxx5$LAdf4w*AJoZz=u+&bZU zccIU2bBTuPo4e=R^K-1*Y;@g0JoYY<@J@nmIOTzaopF5LOqM*f^Y7Z>J+7uQ~G;=Q_a<^6`L zn*SS~m#*Ku@w~=m?u(z6Iv!465P5#yva>#$Gv%Z@hIdobH1BIDdTS%&RBanBYklhLovW_7sitgx3WisRr`Yu}2{L}rdleae~* z|Cr15UeDT8^Ok`j>(soKC?%QW literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/clerk.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7d37745187ab3867fdeb0e22655dceb99718e9 GIT binary patch literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEV9d*Ob`Ho)PG(@xm{>aTthP&_ z#Ibtg4hbEPNk?OOB70_OOzd^rcrdBQ=*FF$pO-$nxAU&`h2p0&+$<%N1E*)vB zS)(9R^rYd?bT9uYKRpYVoyqT-8&M+jXVvm)KM!`w=cLF6@9?+Cc-H0i)aI31;}lbK z?XBKv=6Zo@oeL%|IALVT^~HOu%I5vG5A*NyRDP8Bv_0~upnKbz3g<;)OS8SQqP|S2 zu?!1+xBqj=B1R(&bLiX^rmfIwWhd+eWPjRBJCS@o8xZY z-}QyHZ$XC7ZKqc&fDyo1;1OBOz@VoL!i*J5?aP4C@xjx@F{C2y?X3M?EQSKd7RxM> zyAd&`A|q8%sqEHoF}v2*-h|S%YkTz*Rtm z?-y>J?J<*f{;ZpPM%37=Z~_A-R`f@oDcP>5zn|~3&Tj2(Iq$#i`S$CN--)g4zxVDr zdH>@s`N_S%Y>t%gmfgB<W;nci+m2YW)8VTaUV#RuXkV9 zP-nx|KRIjF-LUU#Uw(Q${kr;B8<{q*O9$Vk{9H4A|1}LgopsYZUH9zWxo^um?saD_ zCS?7yI`zm%NP!U_`Vq)fJoo9TNfuri6$bMkt$53CaP-aFoX}}!0u_%n|Fq{`urA&~ zTqb$t9aV*E!V9|H=ic4^@7<##`RfW-ee~SVaO%+|%cftu|Mdlxtoh62+c1~mfWxZ4 zOxrF$!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000ie000ie0hKEb8vpWK77DBZU0I!mqb7)@k<(&JxW0_&CFC->AT@$C9aNjJSsg1!g)B2f*QZM zfTUicyu=7U8=UwwU)lrYqqI^?gkKW`T$cgR=;$bY{`g5fMvdQW0L#K?Kixsv-Shx! z%VF)it}iIQF9A@BQN`3An);?NzV{8#^z^iH95sHUpdE6MkFq%Ny>y%4mt6up_25)y zX{iYJ(Zc~+URtDBeFI(AT9jONgS4 zifVoiIVV|RXM>LKwgEyvKbPW{CE#G+4LbMX72SF>DDnaF=!gDc%EgyYm7eoYZj01F z9{teYuZWJTOMBb$r{f95_WPCwnw^=Uw)S>9HMdAOhQ{V|TQkKE*rXl!9rg9DdkimA zo~c3g2U-Gd$`%$D)nl%M0!Asv>pqN5BLc7{u>n3ikWzKjYu?WxIF1iy9Dn!gnC|j(2XH5Ni^bWU|1=Uc=-A zJAJrQDZzJj5(x1{1hBabHa3+b7=>3;=bNC+HJLQyW9fCQZ;)bIjP?L9&1W-eud~_I zsB-<7XdNH&rUPI^KqVZjmQG7RwU{@>^*Z}a-w8yUAl6-Gs`yV49PxT?>ZDgcg+rzI z&Z97DT&vGAU>UFsSOzQumI2FvWxz6E8L$lecMOOwMcMoQ{(f~inM$ST_{kF#+gE3# zCoG%D4?u7h@kx}Po*uCs;tqP$6?bvRhVLs9UJMNz8DK&J2Hh2EnjO z7j~X=5-);kN z@zW=I6NEC(6VjuxrujL3#(A~7@Og+jtYy9g*(5QIX(Go2!-`QTb!_SO%)Vz(013TN3ImS-=1Q N002ovPDHLkV1lje?7jd1 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0d2266c7ff736f194c2cde2bab940aa2e7391054 GIT binary patch literal 868 zcmV-q1DpJbP)!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000ie000ie0hKEb8vp8t*Wl%MceETLAbp92>;#T}qWK@MLqDGz9$+`i;apaB{<U1UjTT!HJihfD$zwjoWV+w?C;E+6gGaPG=~)vXcUhJCBtB z)tVacVr^4eRr@$eu$zU*RU;lG9r@Q&pz*tE2igr7s|Sv^He_)1PasQc+K&S*1(XV; ufSP$4OKLz;Kz9P-By8>&1&jiJuD~~;2cX7Z7GrY&0000Y-zxQDW zk>mSwr*?&Ptx$M0VWC*NSXYyU7whhj_H9j})1S=R;xwtvyGtbe;L(K-6n6c{{$PJ0 zv>;S~#Z{oN-Nj(7Z5uBgTXTf>k>;b0h2asOZ62v9UX3{! zB)8m@QCf1zgccT7(Hy7tW{cFxY1eK}&-gJdP>p}_{#Gpu%Px(H=5AT7yH-sxy%hSZ zB;@Fw|K~4XOIx=0-9nWMzhCW|KiQ!`e#P~e@87SKzD{>|z`DaM`k&F+%y+ZDM0t11 zFh7)i@M+mnP4)v<^$fn{oQ%oyV2rBsWwz66IA~)~!~bP{_2#U1kN*?YcQW5ud=0>l>0U~Yv zN-r)2X>ny8b^IWECsw3}<>0}iZ(M7b*bf>`ZoVZhz~y)CYI=rw=0@kO)0Ql9H7L^B zZjyQV&XM5PQ|-Myiq8F?|NHLk>V@qb;v5YOIFLgS)9&KzID_pmdew*T^?!O$agO`g zk*gOak8kmt;Kw7reWD+Ki{A6Fj{C30)|Xi5R~)@~aplb9BMchOx3^UrKi{`)@1dtt z^K|!FoO}EyaaSjc^Q2`eN3N{NeKu{yt%A(w-xjG?Z{F&^np<<%`l~A+S%lQob9|k0 zsndAbOpAkw8*it(Z>gxe`#VN!Dw~t!xnBnrMRm2W1bL~So8c11ApPmm`#B=JHqWhJ zH~IAzjj87@y!`Wh)ePHv%BMFe{asR0qS*14(Pqc)W69UeXP^D??oV9$hdC-sKfh*} zqIkaSzi7=hT^}#?Q~o)u8jGWrzx~W(=Ps(UR`{tpUjy&#vtif6?=J4*_^r3p_*DE8 zkr(C<7N7h3W6ARATKN@mPjw}eHRmq*Fp-@}fdL2lu${xBbkXF$$(D&?L31G1Diup5L*l%Vq2+hq{ y%=p3UMY-zxQDW zk>mSwr*?&Ptx$M0VWC*NSXYyU7whhj_H9j})1S=R;xwtvyGtbe;L(K-6n6c{{$PJ0 zv>;S~#Z{oN-Nj(7Z5uBgTXTf>k>;b0h2asOZ62v9UX3{! zB)8m@QCf1zgccT7(Hy7tW{cFxY1eK}&-gJdP>p}_{#Gpu%Px(H=5AT7yH-sxy%hSZ zB;@Fw|K~4XOIx=0-9nWMzhCW|KiQ!`e#P~e@87SKzD{>|z`DaM`k&F+%y+ZDM0t11 zFh7)i@M+mnP4)v<^$fn{oQ%oyV2rBsWwz66IA~)~!~bP{_2#U1kNymC>d*GaVx586#CacAgYdV1UXll||Em+#guIc*hb|Jy^#_|u{V zJAz}Dy4_y>_xS9OpANqh%+=AqRJ_^sYh1t9ef`GwxBg@{H3kFZEi_&hwxAY?HoA zU;b}qiTgVSv+q~xWUuOqd}>rbzdK`|tKVwtZ$eML$~UrpEY)yod=@+o1z$5fs|_#Gy+| z)^Foo_3gS9V~on`l^eMlzR4Qo{#qrJP#r7XAdod{-z~Ehx9&?cWP-)+N-%JndB*2T uhrC_?Rcu1HLT#wxQ7euHhiM#t7&rWup3(B$#{`&O7(8A5T-G@yGywn;ZoQHK literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json new file mode 100644 index 00000000000..322f9da00e0 --- /dev/null +++ b/Resources/Textures/DeltaV/Clothing/Uniforms/Jumpsuit/prosecutorred.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Heavily modified by leonardo_dabepis (Discord), original sprite taken from tgstation at commit https://github.com/tgstation/tgstation/commit/3a72dd925f7d6aeec620fe83bc4f88a3d7e5f693", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/ChiefJustice.png new file mode 100644 index 0000000000000000000000000000000000000000..6cba0e4a93f5f568d4ea91b8ef1b0845aea763a6 GIT binary patch literal 568 zcmV-80>}M{P)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB6003}FL_t&-S7T%V0@1*x|KG0eVc^nsVL+z8 z-a5p{$gO7gU%)XPqz(+8%!p!;$yf$v|9W+ofeEAwSrVoQM1xFY0GS}2zVtr`pwl3$ z;U>V0g_#E8gG^uo8-oLYtS9IOMv!KZJJ7ud;=f*B#|Qv96iQmwy+H8*00000NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB6002=*L_t&-S7T%V0v|rv{~#J2Z29z0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmYE+YT{E+YYWr9XB6002`-L_t&-S7T%V0v|rv{~#J2Z29z3;wK literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png b/Resources/Textures/DeltaV/Interface/Misc/job_icons.rsi/Prosecutor.png new file mode 100644 index 0000000000000000000000000000000000000000..997b29b2a446fecd8201e255aa482d1ef5e02c83 GIT binary patch literal 5005 zcmeHKc~leU7LT}K1Bk6vkk1Qi9XRa>i6isn&iMcs;Z~{f6#TA$mr4Wf4 zl!EFp1&O4;aoiA_b9aGt+RNCfRpVy&O+McgS@L+&<0n5QI|ZJ38a)pSIWaMkxHPX4 z8+_TYe3RzAs%+bHvK^Q2Jn4*bJ-Yj5xkqo$^E&)m(awgNE0=6?`+!*fNw@%+`Mjq5tjbo!PXPQ6UZABc#kDev1~ z?yzBT-bala7MxsA+Po&r-CwwItyS3%ZF|3|UG>{u%>Jgu&8_534m&?fUKg`+%n`cN zZ425){2IPKbF1ja&u3Db2OHZStZ~iJ@(uJ%{+WB_6^|PG6`z#PD4p*~&0N2(9i3C< zXO|xIaluYsUh%eov8hgT4)1m=Pf_SPp!xZ1s{o?Et5)+;YOhG9-~S^mBWvH^>=e6gtQM*}iz6&vo`(t!OucK-Q?s34 zy~l2B-n?g%CO4DE(N0d-(UTJ(^P|`#lM502TMG-v6i)hw74}W7^4eCH4E>IL%IZaJ zE?E=pxtpa|Eh27N-V1!P#c_dms_m?=vr^I=m$W}X(z9imcO%^-xq-7<@^Xqk&peiB zH4WOcswQWSTie+zWO=8yt*9}o>B4y1>4#GczSGt`|G-dN*kY*5%QPOV-(nwI60U=! zd)*yvpqlow`{ChhvzL^vYqq~8E*{fBc>&#~1P&pNipm+J9iKc zm##0%>+HEzX(W;t4<60GG4R9ht?DHY5Z5n@rWbZurJQQ@tmG-P@7}3CS4LZV&8V4U zyU@v|+rTfaj;}M&otN%*b}QakStk9^yQ3og(4#GZ;>*)YcKLQctK08yt9aDUPdwM1 zydlu3`_p^UIOC@emOgyoS~9fsOH|g(&aTPX49^JU8G;p z8QL0d@87iI(l^27zc$PnzaQT7!eY!~a^j^Q{-`IB#;7qLpCAlDz^VN_F8ez-@d~@v zP3&~Lg#kG&Yphpo+dDsdyWfc>**4bouG3G8e!O+Mdr_{uRJkxO?fSEip4nbsuzHDW za8AM5itWXZM2eW%ZNGH=c1_pzG`>yO=#|f2_JzB3ahT>%?)xgw`U4$aQx2p}^0Vu( zxwda#L3&^Bv)Yy;52Xzc|NXMw%Rhv5-~Rj9$<8e05sJrLkLuvcsW|xyhgBli4HQT1 zz2vWUEeXsUkgPAhfM*s&5RT7Fju-}-GG;2}P9e2{{OBJu{qB1_oVz)X%X6z%>00Cts{;dEb9ancnBnw4&H0F&`Q8HVDGQ9ydHC zuB48=|9JDnc2Ux;Slf2o2Rr}N(^gbLjN{sB)M0~(=dfpMjK@o+b#1*G$3J^CCc}w; zGr8^K)d@!Ym|wA1!IoW9qIdY*P1vDuMqq;ndwxD8A8O0 zs1ed2iVv3qdG*3X$TBgQ%sz&438s3R4Q1fyvk3dkxEDC z)w*F7fF5)`tf4b$47y51AMK$deB%Mha6*6Tp$i3ni0Hwn4v*6!sBb)~CR|2S$dM6$ zO`KL~E=P{gQ6;JZP#uWMd?Td4L>e^WVUi#UQ)$dzKt)f8VS#}P~}H2>tY*)oL!Wf}#*dpx{BUyE_}=Ddb#~C*yON zEWs#>KrIHk5>}4R%0wjxR5A`rz>^~g#1n8>AR9Rfs5o+n$7HZz4won3aph(zIU@AK zwJI2FC#HgS3rY3NLapzDX8h8~re`7lu^=3^m*k)aZFa6CGsG2j|nLZV@H6bk0YaKpZ` zV}H^NGSEEW;y|doj0tg=d<23~*d0%E&vkD{ZI$S{{z*^Kh3g`&50u5@` ziZXwAt6bm2Cq$#BeE^a{3^p_(8J9t&4;M=}O^jF7deHw%4-Ye7)QACoLpCtFz$B!P zjKX2PK(2q~HM|dhWe5u8U68lZ_nlnt5Ti#KNf^Jzu3 TKc9665l9l><>K + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png b/Resources/Textures/DeltaV/Interface/Paper/paper_heading_warrant.svg.200dpi.png new file mode 100644 index 0000000000000000000000000000000000000000..d13d8cf76b7f251b4c1064e87cea2230f43df73b GIT binary patch literal 10022 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 RbU^?B002ovPDHLkV1kb2nQ{OC literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-clerk.png new file mode 100644 index 0000000000000000000000000000000000000000..6f690e235d826c957098322cbea4a474f77d7b21 GIT binary patch literal 1022 zcmV0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmY3labT3lag+-G2N400K5iL_t(oM`K_Z1*0J_8UjRyfQ6aaePCq)ihAdNQ9aHO-U#cMLy& zeqmr|=K;&}a0)RzetCsq%bs~4E?zrW2zm{u;Ntzc3}3%~XJAmkqWact25xRn22JUB z6iF_2K4Oe!Aj$zC%S&5J7;Zhhgkh+fydFb$bq~Ya504lYPW{AC(P#iy1ByBvQ3F>) zlmkGjkDWdM*CZk)1ZKZ^^$v&;;$L>}1&SgZKui!2?EpSOUJUcl#afOP6JsZe8ltn| zr}v*3U>IfsI=`d-0?7`bY6!rh;MkQZ;DkvGAldXF(+fOsRVE@M;`1KRRo73+YxZl5F_#>vo5P652C!yg8QXIx4Q+&|wiy!m*CLGm9_MiW;M=_@9K<5cq4Wehj4aDQju zU%41CQsfJd0Qf?zFcNAF<^TWy07*qoM6N<$g23v+W&i*H literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png b/Resources/Textures/DeltaV/Objects/Devices/pda.rsi/pda-prosecutor.png new file mode 100644 index 0000000000000000000000000000000000000000..e44dcea1b57c088bcd901ae4ef1344c790bcd572 GIT binary patch literal 6141 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 aJIy%T7g?1U4 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png b/Resources/Textures/DeltaV/Objects/Misc/stamps.rsi/stamp-notary.png new file mode 100644 index 0000000000000000000000000000000000000000..b726cab3d3aa4c490adc09b14135bb1b8d658072 GIT binary patch literal 777 zcmV+k1NQuhP)0NRq`}3|WktD3OguvB6@DGT7X?^QGqAx!pUHWUFi}l!e&% zTKEsxDqBh^Qj(p$uZ^bbJ!Wbo&h6ay*K^MEcFuFaKb12~w>Au>RdAw{5p6!cpw&MU zpoI=b7}X8eo}QhE@$dM!#i!~`zv}h>zCTA(GUXcJYY-kXY^NYRCOoxLuoZ6#w;NeK zDSRLta^!%*mr75R`AKo6%x{XFSaclxs;8Fu!HFMiWF1quPdI4iibmx;>L!7dH8(4@ zOJ+ANQ6`C?k)X&jISTYkwIs8@ec^B440-Vw^0!&V5l4osctfHVrE5xRTJ)5BIaXEf zzw>m{g9GL6fe6$+dfsaf)Ney+%kw@DJ+E{GH4kuZRsDI%Y4~0At*RE>ht_pCy{Kx5 z9XQ*7&U;&T^lzy~razsAmlJ4?L)$epE|#;ZtaE$^u{C+3E7;wGUfJKe^aYNfXiVEe z>Zkw!010qNS#tmY3labT3lag+-G2N400BWsL_t(oM`K_Z1*0J_8UmvsFd6~_90H8w z+Mg(7{a@lgBf|^E{|xir9VOcw7IGW_vfP%9i$RRxFM~M49|i^>pIk?f=JJgK&H00000NkvXX Hu0mjfH4R;e literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3cf56d453711e1d07d02997fa223579b8f31a149 GIT binary patch literal 434 zcmV;j0ZsmiP)J=&Ll)CgG(?|+_o$Ghwf9~^iw`8Z+=bka=iZR#Y|ryVp0Y*G z`UluOfM)F?!nOPC6*33FO;p{o1R)5>SP@dS z2cPu*-w>Qibbt!&tYpiBARxE`-E`{F_3ab?62MxxfQd%_mjswELp6>z3J_zu5Qz>D z1PbnT9ExDRP;1_5Tt-|Fsb2v>P@DSiA9@8Yh_#<#Ql)c2X#EX2AhdtSx)3aRKnH>? zkZcRVnuxZ6V2@;R5V%KwCIE2|P!fc(P`V01iVH7BQ!zoLJ!3qU10pR+XR=i(1poj507*qoM6N<$f@Zw2pa1{> literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavel.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..a41d27bcc71f367c6771ae5b670d87dc72dc4068 GIT binary patch literal 11051 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 NgQu&X%Q~loCICE+PhJ23 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json new file mode 100644 index 00000000000..5abad9b4225 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/gavelblock.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Sprites sourced from https://github.com/tgstation/tgstation/pull/8495", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json new file mode 100644 index 00000000000..8081065c329 --- /dev/null +++ b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Original screen timer sprite by brainfood1183 (Github) for Space Station 14, modified by Leonardo_dabepis (Discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "trialtimer" + } + ] +} diff --git a/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png b/Resources/Textures/DeltaV/Objects/Specific/Justice/trialtimer.rsi/trialtimer.png new file mode 100644 index 0000000000000000000000000000000000000000..34c8f1b90a973a28041bc16e327ca95415305509 GIT binary patch literal 1170 zcmV;D1a13?P)aQ>CJn4l0N^WT@iMLQxP$sbH7t&{nYOlDsCZkfh-yMT)E7;!to9 zUHlsS4|Ek=6$C*ML>!&{TBOALnnH`TFWlT8=e=`zIRT`!!Az$o0hpG{GpVG!nqQMc z?~pJ;6#*3H*h|^P9J;QbM+8KFh>Ka>&vje_1xjVd@fiYSpcMrwtoYSeYoHF^wGMehIe zbo7~Ne|k6x^uBuD=L8Vi2kJG?`#tr%`WX;>0j{l6rJ-WRi(u z7lb^fyTAIrs;;g9_|MJC@_&41Tb|o?T9xJD^RGEv4Y+Rnlp_yrZpkYbj=}9)XOusK zp_>w7Hu2*3pP$CHM0$DfOU)}1p$q&t)c0?kg2_}U@=u-~)*`paq(}EgphZZI?+QPe z>oOVjk7xHl;ukJB2*yEzz@II!@S~(F@?Ho5QsA47$wYTD^@w9Q2ixgE;Q7FOA9m&2 zDveV3`|eeoFCYj4;4Fye(IE1KN4_uuLvzq0dKP$boL6LbkAKL0F5T>$F_?_&rFjyC zqX=ZZejmVJBuAn#oB<0Ml4t6Ju<;T|&cYy|&_vN!ONXL|64A2`&0<)k0(cm)CJo(Q zYPkT(vxq#C7+EAcWkoVB0;awaNji`xX`;UEOtMruStm*-KPLADPeesj>{foUvK_qyWS;X0t2s$SOWf zLWo{HuPPd-6#kz3z8=7wSy}vC22hhi%}SYNi%51)Ij#fD3k#lBI|*9U1SPT7jUNl} z`ilkAnFYfQA3lF)Q2Ku$YGqdmPf;7(6@ID{+!=9r@s4s^wHd2$tTR`3fuGs}!$BW* zM$Ml8MM@leE7qqA{9FyVcIh;Xrygu>xUJnsCmi`~|3~2gw{HAgA5bTE|K&Mx6s}*~ zQpf$}p@c!dU0vQBNqBX5l*<70VeR-SC$tD{N3@8%#v~EC#BUqhtZx)B3K#{90!9I& kfKk9GU=%P4{2dDX1|sUKK8xh*;Q#;t07*qoM6N<$g0DRnGXMYp literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/assembly.png new file mode 100644 index 0000000000000000000000000000000000000000..056fcc5c14180f45674a4b128b840a76a31ef1f4 GIT binary patch literal 1645 zcmV-z29o)SP)!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000id000id0mpBsWB>pJqe(ghw%Oc5L5H zw=4?ypa19`>5dooqlYCP5%Z248XB@p+o7-jZ34)3K&L$M(z{$Y9ENR~d%kV=frEXe zOUm%bh-*tZttZ@q_T1M`FW=QiW)N$YnuKNr0%}53Qer!{JHpZxW$cCb4}u5VGCult zz4q2}a?!K8no;xlteRiRw%qE=t9rS1N{NM2p45ee%A0%gl@FkU0RSnAk}l;^fm&s) zioR0=cJj~<-MnEe0)WSAx3}+H`Eo9R-mI`tuGrbIn`btJ#^j9%V4xWv(2OV1o3;76 zue}mlAY*AZ0C3}A0))5--t!2Aw{+WiYB_IqijSFF+TbS5D00%U`*9e7MDGv%q@Ne& z(-3z7_~z4)>)?^y=)=Wg@oyY&ECL(Gn~?wZW!BOgtE1S;ICz2%MKB((k<2a*=h?rC zG6^#i>Av<6pfwF)^We3y)niJ3C7*M4(i! zvIuBt*t`O@3GlBc!8nYfWilCJV0a3&-Y7wQqZF^Fap+Q2l@=El>G#J@(C1GbVPlqp zTekNawveNIHWgOat7pLvkGqLh8*hTp$w6#DOMC+lG*<|!CLS*s@{x~6_3uf&bDsJ$ zPj~Oq2OGu{ipvq1)A-}_K1$XaPvuVc0HHW;-o(3eZjSDEX}9mBj=(rwxN#P)^=hJB z3Q%&mc+4`Ns0rGwL@bwTM=uQz57WHXD$ywQYh#eyBRLGu#g*V&(X(9vUn^r0LZx&2=R^BZcntE<2tx; z$ch)9aTx)GOtomch+HcOtb^y`dbiKdYME7m>yIPvJ^A*h2UJNaI;g(&%(+zY^sk34 z?V+yu1=9(jV07FUxiR3BNoGgvcl(~+i(bad7c{-^nKyo%PZy>?o35R&y7l+C1>rXQ z@L10BHbi;0`Zu^(cb1QT`$OfIWKreDVVnJ!*gc&^9G(7{*y&~|z}p{aTK$-G5^64s z2Mpd3cDkLSV4kca&t*CRB0gdOqLpq|1>%!S^nmlBtkXxSDBo_a^XIhwN1M&!_0#Hi rfb(1b8AAv5MyjcWq|{gC?)Yg=ABppUv000000NkvXXu0mjfO|dJ^ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..6857f2a24154b06497367e4b2474465b750393e2 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000XT000XT0n*)m`~Uz28A(JzR9Hu?S6fURWfVR$%yw9Im%>tZ z#oDE$Af*XyYKT^A6ctl7u`vxMHokg^`lLSSQ;o(nHjTbn-+VERP4q!Av0gCs(xz=B zY5}`7i%r>H7Iw=5yDaR$UYzeA&g|^$?1D{CGMSnGT)yv||1NcRcNa;Q-rims9Ua9d zWwTlFE*6FAwumH2)ZE-GVs&+O(b(9S_*NJ^5{b~`p@L{Ub;C;o0|VsO9X7SLngnhp z5|o^srQzXWdUW$LeSJxz=XZI8e(18irq6?|8DV=`$3ns&Aq@@=76A^WuU_z}De<&M z0iP;tj$g=_1lIDi>KC*e{TBC#N+{!lN}f`SE8@RlL#e$M zXssAtRiP)gX!MV%Q zxP!d$Pz$|sf0GysP7w?mfy8XqEkHUsY@ca@4kQK9T+V}dq)3Hg<{QQiT zN+q?_Y*MR6V0zw|uGJ(uanTdM5!Lu{_rH3KtI3rV1ni=!YGQFN?l0t)^LW=psi8z1 z#NY@2R&#W}69Htb)q9(+Wf$iBc-t}3+1z?LiCC7W!q2e+u+qWXbnqD7cCYoU7gZQm zbf+T$21gK(um(f+T!G-m`kIxnlXptSoYYusRx`g#2Ss0%jegc!v;XK)*4HRoie6Ur{blP zV^g$!?_8^$#FeoOJz0MTu`QE`FJGrvGE_kpvBH$5=(%s->Fev$vqEMr8W|ZOEJM(9 ztgwG=zUe%0(A$p---Ynpm=6xW=N2+iQ_cnDX80On2NUo4j)a^XmWCr{(R~@ zef7)<@oyKU?Ga-nV?^%=H=26%T`Cz5YAg9GJ9aiwu*Xd_U%nFrE^MZ@U6nHdvBKfB z87uTzr}5oyyn_2nvCJ_*a*-}BrRafuhS4f`RCU#b#z#}s6Y){3P@X}xF@RXqRmyeG z_&7c6(s#&ygTeIBk{Qc!Z)I>%#+7`uRu_D(Md_egIS}EaFTK>>-cAwy$#ry4i~e8H z1=fZJsm{#Y-tI)=xeX!m%Pu;W{g?1<7Yx1*9T?*Edc|NYb+Tb?j)94v(zLbLG^8otXiG=lxxE2YvWpLP6+t_5Mtra9>Du~Xj zR*|(xK#$C=c5YwuRlA?Un+tCcuD?!vxc|K`j%bpUsiWei%h%$WOTQm?#KU~IZY*}A z){Y)u=uW>PlPs3f9}gXP8}G8sh%0~-FHXLYp+nEU^-Cm?9{O^qa6Ruf&f^Y(-SCsM zb5-vKQ$;0v?uVaqXJQ$R!TEH};iT6FI>q^rE3uvGGl&xr>tO{Xs>OgWz=18}f+$Gnm4H}}Tnxf( z3|{R}YHhD|aAk0DIkjHTaZiLKlg8=jc8lL{EOyrG`G4STl?ehIlk)%o002ovPDHLk FV1n3VX|ezS literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closed_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..c78d01c42d084dd5be78e8a33a599a90cc86107f GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DPP>^Ss#&mpghvZkX~#s0-h3N2b6`K?}O)meqDd+l#VI$hWM`6MlQ q&#%(rqf#%I&Hk(pG?9U!&gT+u#1#>y1s3nVf%u-TelF{r5}E)5_cy%& literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing.png new file mode 100644 index 0000000000000000000000000000000000000000..fd27f05b3a2cc24421e7756fbdca2d77b94cac00 GIT binary patch literal 3014 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 IM6N<$f(|R_lK=n! literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/closing_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..2a71f76d5d0c792fe84b136920ab32a386dfc7a5 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^2|(UR&i(je0cL#ec*0}-@j8|{(iQzwzWT#=l!&5f jT;0h840aHhFykh_!rG~;5AeP$1@S#y{an^LB{Ts5_a?jl literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/deny_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..7c56263f83958a17893b3db0b04ce3078c15cea0 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^2|(x;TbZ%z1lzVbEa*5x0l` zFLCLtQfk)goBm*9Wqa5)W5IyH?gg7O+Vq@#{gzqI_j{ICbSF<}<0|vo?Y_6yOll7; z+AsO(r`@v>Kf7}$KR*umYV~i&zP&s*_xJv-=38t1deYzEyLbMqy6^o$Z`IbavsGXD zr!(F8`6z;|L6RYjVFqIYc7~Z}LvrZvRZ(vk567Q>-*~3QX2MKG<^wzo#tdf|3@{iQ zO7s8d*3Gv+{xi?r|HRuDl15mS!8LAhWr_IppL3FmClFnFq60fUCY M)78&qol`;+0G5h<`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/emergency_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..817f2fb3f95c53ee8720a7c5be418b6208a6a7e6 GIT binary patch literal 588 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/opening_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..84933bd5ed9cd40a972aee792b227f9aec95f233 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^2|(X)s_s z#KIwr!I-V$V11^#dUpKLjjy-9DY|#Kuw+Jjzzl{&rWQ^CH3uAwt;hGhNWR~>|B3$l qhyP2a-~C|qG6v`^C}^l(vC57yE3)EC^YOwKkf5ilpUXO@geCx+nr^EA literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..db7be0bc4a0ec0b2bc29e8718fb6b71796846f16 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^2|(qk=b{5eiK-()1~xQ&@cMV`(mao8yQ?TZq;#^Y}m${ zacWZ!Yev-i>$j948lYsxftl|YY`yljZkp{(pFL*+-lj#WWzI6YweB*{ESZG)8eLCP zH-4D=_wruJUKQWqugks*3w-~bxAmsS_S>R@6K&4#1!`fty>^f8^xkc+O+xqazTJA; z{=7~2>uGDRIhyR%SJ)ONH}BrkKUz=f@~-S!d-avVtb5`KJrkcF_ZOUaf4N)v?bouY zpX0AZna`Cr-@$dKByUdGcPkF5{Og%j`&-%%FXZlavSVWw{8-KzzB@7SM0TXvt!o+A zif+H$q2jsc@9*!WwR0M*e5Y<-(ETyu&`qBj{lx9nl5Os{*Qk05m8bu?%XoF&`KQ?? l*%zfe7FQS8+W~`WRsIyAi(3!btSA5lf~TvW%Q~loCIEIM%9sEE literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..24eb2aedc2248aeb772b38f63ff992254e7aaec0 GIT binary patch literal 315 zcmV-B0mS}^P)G_@Zv*NK(#C83< z0hCg#mPY_q%Og#e`P2l!*GQEjpT`0MYBKbMv^%3TIE=g7KF`WXCR28pn>(x2n zemoXytpJ?bfcIZ;wOEjBHdt%rI!S!%PGhZ=2c^1AoGrxJR_5RoDx&OEP+E*gAHf&mPbH>ZE8FCH9e&*rpCoP%1 zIy_fR`1DT4EhW}ImG2+Fy>#^EcBOlIu{N4r8M|lHdv8DdMa^XX`Q)41s%D;5@l3t_ z>U!DiCu(!NfiicFek|lsbn*16WPNgF)9u86nlDcO+<9uZb*sRm>zlTKo#3wDtk_cV zGUiQg0fX*;t18(yxo?DbZh3Nv5#oCg`Gddm{r7*~nV;{o)~0;#=kiD}oLj`YgzrYV zCx61j+EYJuRBRcZ$AIaEWtl7E0M--(oM3v-T6o|50rvB z?(X|$_9K~q!b>Jme`5^XKVF&j%`2QtMsN-@c!MQ;uYX{&xPXV-MV4h*a7^*H)mTo% z^duKBlw8QrI7#Az6a!+!k42gRM*{jVXw(2^)BtAG0A@rO5W6r+TTo*dR0c>itn&u= ziYhf*#29dhKzXbye)sb`x`T#9jF|@skRQx^J~1)&r}u;k?=m8#VH_qLszE1c7I|*U z-vi17+kNaSpCz%9yQ#rS&sN2x0`#dRVZ$Zo3 z(YozxD(tDJ*Nd^#9ngM11*`#hZL|qqUX-aA#5S}G^!n=WLLU@GQ4~c{6dSK|xP5Tx z!-H@vnhtn%y49-Lc3NyR!WG{&^FjpmIbAy+o5nPrx)V}}E%fz`bB+BtcI@^)8^rTf zBx((Ky3EXU1aLM2IGxVm^KA+58-UdY;QHA(FXNaPN!aD?zV8}<6&DioA6qwm%&S`B zG(?rf)v;@BC^IYu=$f%ZGhhqXw5SF!qXsa;V!%*uXSl{qZh&O*G5ePMUQntINQ83i z$upoRb}H)fv5TKDu*ZP$-hvmY3!Atq6ENBh(WYFFM67|7l05p#?E1nmayZKasmvEs z4%uF#@2=U$hCc&#<3^>qaoRUjD5t(Q@!@5>eLn%YPa&y@Wk6F&Jf;Amr=S&p`TF~H zKQmyzZBbK@-3j_NfaCqFrZteLVgLD`ViBgsl+FQ!832*%0DhkaTq4i015y-4Q4~c{ f6h%=KHvsSpwHV1KmpgiI00000NkvXXu0mjf++aJ5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5d774588ae44eab5608571cb6aafad7375e158 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^2|(DFD66%%n7hj|c25u0=Hbzuz>&Md dbBcZ?)Aw7<0^jOhxdW|Y@O1TaS?83{1ORW&Jrn={ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_damaged.png new file mode 100644 index 0000000000000000000000000000000000000000..f16a028dee5bbe41a7f4e35f686043e8a112ce4e GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(YymzYu0Z<#e`9lQK{p_au_VYZ zn8D%MjWi%9!PCVtL_+fI!HvAl4m=D8Hh=XH6ZQR;XyVo{y01gP^_0k+pXD$8l*-N4 z&iUk!V5<=?maE{?*yyS)-udN6;H*Pi5*L(-Fs)pAdDY$x8SUGCM{GTG-~v& dN}IerjGt7Q1>7HnEC$-e;OXk;vd$@?2>`@EK-2&L literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Glass/justice.rsi/sparks_open.png new file mode 100644 index 0000000000000000000000000000000000000000..630eabb976ecf11fa59ba29f03502b02bde399aa GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^2|(GM)~O;5D{Ad0LZe;7N97KJC6BX-upNVgWUu;=WLfz+qP_d4j_bJ3vh=hfa5r9 z0qVN81qdO4*#ozUc?-;6LK?t17pG~m0|2;<_}}aJ8%Xzkw*de?p>!O_N2;HSWO<%5 ub^zoJEX!gGaL3n-QrC61fn;4*wm#k_G(h}nBOLz#0000!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000id000id0mpBsWB>pIk4Z#9R9HvFS6fdLK@>h)wioC{C~_%; zB1vt8L`@6{nixgJM2#jsYWxMh^5n1JQGb9j_~_-u2MCEVAtXeD5-JyoK%`oX zQ^~j_Nzl;HK)&Vc@e=tMTMfa$zyL(`f#Xe0WuTvHYmi-EhmnyHxZ1uAFF&i6Mjo6E zlCf8d9$T!7O$AEk(d|>VE@$#8G>83U!n3IYSVds)M$%CPcqN%NB6VJ<_12Wfwsv+Q zx4A>wb-ulR*B0~%)vyTxRG3)!Wx(!BG!ha)f0?Ii`*zqKUZJ}!0_=yDSVY8(>*(k( zUACb&a|VJ8L&Qdh(YA+qjtWj>@KPf@yigA!iS1%Z!k-xl5trFQ+a4TrY8-WcY|!m` zP+>L+f&VFv3FMXHk??d(ARO5LPN>GbOrV;FIL5|Xjs*@J3Eo!OE%Xovcu(;#LgD*{ z-qQ0zJPolHV83`8G7QFAv{A7HVwm5*&YF5_b`+Z#$3785v>|`}Q~+g$da7t82uPIE z_gw{U23jFKR=Mpm+utmgK-5LWgdBntLX ztqx1jI2uLi>gpn7=0<1fLG&*~RaID8T7nO^Cg8>0=YVY#x#vs-Vr|CE?pcjMOSc}G zjmk>UJk^c~Xv#Tu#fXEuCY8#U_2W+y^t+$_$ul2wP(SN40M4j6=$;Qlx>R`qahn5x zo8#mj{Q2o=xa`%dZ$D+QuhRv$92Opt^{~1O_x*9x==lA9=$EBca{qaqjdfIf@#n)X&_hK{0o8ZGxjRwQD7fk5F$`;_166E8 zu^#YuL^noxT{{fJQG8To*UAAx0N0y|UD-X1YRKF4;LTSgQ7zn94WEqvHm!!ZJ)OJ_ zn8RpW#%niz;02M71dQW~<#%iJMVrmy?Z@in%lfTf#)yFr*Gl2_E9XX| b^pN`tggBXyxtD+e00000NkvXXu0mjf4R4AJ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/bolted_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..6857f2a24154b06497367e4b2474465b750393e2 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJa8DP1uy!EP)!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000XT000XT0n*)m`~Uz121!IgR9HvFS8YoaQ4~JAj_&HNo35!@ zqzNmgAVLTgMOhhCP(&CM{er&sL;6@hAfi6@^1%WlFhK;Ve8H`D3oP=rw%qk)r&hOl z?r_GtcV=f+3p%ju%suBk=eg&eJLg_sdwYAH4C(6XqKSzKJW@8B7619XQ2i6}`FvDc zTPv{I+S+Jxa#B2N96XUo(AnlqG5B&eOnrTQ6g3=n*VkJFzAY_L>c6sB* z!_31<@X_RV8}{K?ogfi1oV^6W-7w(qGk%EeN80hiGiS$+y%FLcbes{kWfE8hRoGU= z05-_U;>QbWU1kl(QsmZ&I=XqZM%03rFea1W{Ur!sRx)cZFxD?Do7=TiVG@YNnG^*6 zmtgsKL?DyR{WH!xB2dcrqEv>C1l(o_9qSu+1xt-%`KS)orpCvH1v5ktd8VwF$8Haq z-wXa6v%idmv0_-zSs8f!G*v)OO|zLL&w}Yk4y)?H{ObgS%PM{2E}RsSk$%!b7X3YPL>-Tve#s=@MPV>^6sr3`F@~(rt1NF zA;K*X2vAE)3nh$S&ZvPpCna-Mha^ISdgpT%SNkzYjwVZ-9*oa zh?2Q2ENcl4U5q-OVmKo7d@S==6=JN<$u&pQV^`{lTe-Cj)PA7q-AHW5)?cjg za6j;x?ceIfnGnJa1nbS>)pobj4S~tnaP>^Ss#&mpghvZkX~#s0-h3N2b6`K?}O)meqDd+l#VI$hWM`6MlQ q&#%(rqf#%I&Hk(pG?9U!&gT+u#1#>y1s3nVf%u-TelF{r5}E)5_cy%& literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing.png new file mode 100644 index 0000000000000000000000000000000000000000..2a33b5d48af43b76c044ea70b1f28fee76866d9b GIT binary patch literal 2683 zcmV->3WW8EP)!NdSiF@JuQxt>)LH z;5!2FVH87%%FMQwvWq!%jh{!VrFe*oUft_D#y~-}8Q|+9o@Ewyi06sZTaG1ok9dTY zE@~=<%0ep35u%e$i7Zwz1O2ti%oCDdLEsS6K5r;wB;0T**=% zr!@f^8KjVe1O*jrLWhGmWs_#s*_UYemQf}TqrZhJI5~bjqkKyV+Z*If7a)OG7;K;Q+qHe3EO&1vqN^jb@c90TDU;PR%W zDF?vSE-?0N$y{zo0a|`d13oT*!8|a05A?5lvuf_+{0Ycy(-YkRhetq^>cbm<+Gc0@ ziLXu;00009a7bBm000XT000XT0n*)m`~Uz5u}MThRCr$PoZoL$MHI)+wzu7d{s4-! z6w>k|tx#em8WJ=b1+57hMPq`|_~5gzKKbZhz@ra7Y7FX=;sa<(FiK*Ypae>&&`N{~ zg@PrtKzI9Vy=Sgxdv&3&1ugUkZb~|#fNt;LH4(=;lWG}4)09+ z|4v2=a^dQakoAdwOI^>EmM|u^xawtXV|~>$bgaw3?EE53KbjXBlG4(;wgJ{O)Qc`x z_0lBn!s?WtMkWP#f6qpdge0_J@Q23!5!^azHciG!gyHDPD@7Q2_IIU4=AwwcEv-Te z_C_qWwWyfHLbgc2M=xxI51(BRt{TpxJ-4uw!XK3|ms)gORmY1P7ZavP!0r1u9o0rz zX<7N<*BHd1k7X?Y9{(gYN?q7v}CHc5|T5Yq!y6?TnksTV2`6-x6-tTZg=$O zU`-ll-@`P4xIZFRJBJ=GyoL8TS6WnDt{Fd!VX>(tj7coy6^5WBf=>u;V0>`Z{NPv1SB1F&dcR;;B_9%K>PWvH~}Z71({*R zrIs-6o|~=E(YFTRe(_F_4J|4ruJlGmW<&^9{2YKmxRjfQzR?z#SSmgjaWw}3E(Cjn zE?8Iv(UK{N+u&I4dRdGsEjq4BR9r3PnCWyHQXe#J7whu2x(4_(`zPe)ml8W0elOjv zOoU4<7*NhFS_MgWfUUU5%+9(rjP%aH^txTa9DoH63EF?Hjk&0F@p}f)6+6`58(zsf5JFrEc1LE%bMY)q}X*U#CKv?(|F>g!U zxTxAnEM(WtF;tWcT6irU0O8*Mfxh-4W0r-gL#rSr`j60uR5Qjb66Uh;a@}f_gUhj#r*-?!i1g1&u#FV8S2yC#6mXpwzxW?a!~`ZaT1h+ zuZss>r(KRJ z7cmK|)5C1aTd;Aw@+O{mx{Y~HimRhiE+w2F$VAm5e;Sq#cf#U}Y%v7Mw^UrOyv`FJ zb{oglQ7ISo$Za;&qS}gxQkQpb@E&CIOOQzg(}4}Iyv`GkwrnbY{qPxNF9r7SxH_V6 z&z?OCt^Sb+y$3z}Cx&lD)-o|w>h9zIf8JJN;&tMB=#S^+>O$!!yUM4|(s!aD6oO^P zjvd0AFKfVSwspu{{QJtO%S8fhYcXMJS3x#|k9DCZ{@S%`aPGAs`1Y-@Y*!yzpUlO- zT^AE(!5d0qYYh*2*drP%* z|37alF*^<~KZ_uq58%ayS6=xH81uv<@0p7i;l+jq_++sG)?aQc>5P@=h{7E@5M-e6 z9$(+3+3CnyRC56L|MRvI^Y-!C!m|jGY$>?Z!%Z*Ut&5)cFzY#b;9$y1`u548jDbx`2Qi7q9m|wp+gemkY!ClwawKT#l{fLk^9diF4|q-* zS4UJXYC!glsacV9ax7P(#l#y#!6&B&#Xx)x;5`ukj_Z}zdE)sHA~&30i>f0Emj^<& zjZ+d#w5Wowx|=BB^!=oT1dvai{=tn|HpW_&CthZ8zq~CSCR}8lxzi;4IaK0kF=Z0# z#CRG!@~NwWZNn?C^2Bo%7ma>-TRL=H;-Ebcy_%E+8jdQ_V#-7|1|QiaN0PR^@+QZQ z{K%046IX``7g=bK6-n^#1T1m1m@+B&!kioB%UW&Q)3L#AZNUT5Q&Z}1tWw<(DjiYm p>6}ZpcydTb)e>cxrnYi>`oA(9fB?(0zd8T_002ovPDHLkV1kIOCo=#5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/closing_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..2a71f76d5d0c792fe84b136920ab32a386dfc7a5 GIT binary patch literal 432 zcmeAS@N?(olHy`uVBq!ia0vp^2|(UR&i(je0cL#ec*0}-@j8|{(iQzwzWT#=l!&5f jT;0h840aHhFykh_!rG~;5AeP$1@S#y{an^LB{Ts5_a?jl literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/deny_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..7c56263f83958a17893b3db0b04ce3078c15cea0 GIT binary patch literal 321 zcmeAS@N?(olHy`uVBq!ia0vp^2|(x;TbZ%z1lzVbEa*5x0l` zFLCLtQfk)goBm*9Wqa5)W5IyH?gg7O+Vq@#{gzqI_j{ICbSF<}<0|vo?Y_6yOll7; z+AsO(r`@v>Kf7}$KR*umYV~i&zP&s*_xJv-=38t1deYzEyLbMqy6^o$Z`IbavsGXD zr!(F8`6z;|L6RYjVFqIYc7~Z}LvrZvRZ(vk567Q>-*~3QX2MKG<^wzo#tdf|3@{iQ zO7s8d*3Gv+{xi?r|HRuDl15mS!8LAhWr_IppL3FmClFnFq60fUCY M)78&qol`;+0G5h<`v3p{ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/emergency_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..817f2fb3f95c53ee8720a7c5be418b6208a6a7e6 GIT binary patch literal 588 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/opening_unlit.png new file mode 100644 index 0000000000000000000000000000000000000000..84933bd5ed9cd40a972aee792b227f9aec95f233 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^2|(X)s_s z#KIwr!I-V$V11^#dUpKLjjy-9DY|#Kuw+Jjzzl{&rWQ^CH3uAwt;hGhNWR~>|B3$l qhyP2a-~C|qG6v`^C}^l(vC57yE3)EC^YOwKkf5ilpUXO@geCx+nr^EA literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_closing.png new file mode 100644 index 0000000000000000000000000000000000000000..db7be0bc4a0ec0b2bc29e8718fb6b71796846f16 GIT binary patch literal 445 zcmeAS@N?(olHy`uVBq!ia0vp^2|(qk=b{5eiK-()1~xQ&@cMV`(mao8yQ?TZq;#^Y}m${ zacWZ!Yev-i>$j948lYsxftl|YY`yljZkp{(pFL*+-lj#WWzI6YweB*{ESZG)8eLCP zH-4D=_wruJUKQWqugks*3w-~bxAmsS_S>R@6K&4#1!`fty>^f8^xkc+O+xqazTJA; z{=7~2>uGDRIhyR%SJ)ONH}BrkKUz=f@~-S!d-avVtb5`KJrkcF_ZOUaf4N)v?bouY zpX0AZna`Cr-@$dKByUdGcPkF5{Og%j`&-%%FXZlavSVWw{8-KzzB@7SM0TXvt!o+A zif+H$q2jsc@9*!WwR0M*e5Y<-(ETyu&`qBj{lx9nl5Os{*Qk05m8bu?%XoF&`KQ?? l*%zfe7FQS8+W~`WRsIyAi(3!btSA5lf~TvW%Q~loCIEIM%9sEE literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/panel_open.png new file mode 100644 index 0000000000000000000000000000000000000000..24eb2aedc2248aeb772b38f63ff992254e7aaec0 GIT binary patch literal 315 zcmV-B0mS}^P)G_@Zv*NK(#C83< z0hCg#mPY_q%Og#e`P2l!*GQEjpT`0MYBKbMv^%3TIE=g7KF`WXCR28pn>(x2n zemoXytpJ?bfcIZ;wOEjBHdt%rI!S!%PGhZ=2c^1AoGrxJR_5RoDx&OEP+E*gAHf&mPbH>ZE8FCH9e&*rpCoP%1 zIy_fR`1DT4EhW}ImG2+Fy>#^EcBOlIu{N4r8M|lHdv8DdMa^XX`Q)41s%D;5@l3t_ z>U!DiCu(!NfiicFek|lsbn*16WPNgF)9u86nlDcO+<9uZb*sRm>zlTKo#3wDtk_cV zGUiQg0fX*;t18(yxo?DbZh3Nv5#oCg`Gddm{r7*~nV;{o)~0;#=kiD}oLj`YgzrYV zCx61j+EYJuRBRcZ$AIaEWtl7E0M--(oM3v-T6o|50rvB z?(X|$_9K~q!b>Jme`5^XKVF&j%`2QtMsN-@c!MQ;uYX{&xPXV-MV4h*a7^*H)mTo% z^duKBlw8QrI7#Az6a!+!k42gRM*{jVXw(2^)BtAG0A@rO5W6r+TTo*dR0c>itn&u= ziYhf*#29dhKzXbye)sb`x`T#9jF|@skRQx^J~1)&r}u;k?=m8#VH_qLszE1c7I|*U z-vi17+kNaSpCz%9yQ#rS&sN2x0`#dRVZ$Zo3 z(YozxD(tDJ*Nd^#9ngM11*`#hZL|qqUX-aA#5S}G^!n=WLLU@GQ4~c{6dSK|xP5Tx z!-H@vnhtn%y49-Lc3NyR!WG{&^FjpmIbAy+o5nPrx)V}}E%fz`bB+BtcI@^)8^rTf zBx((Ky3EXU1aLM2IGxVm^KA+58-UdY;QHA(FXNaPN!aD?zV8}<6&DioA6qwm%&S`B zG(?rf)v;@BC^IYu=$f%ZGhhqXw5SF!qXsa;V!%*uXSl{qZh&O*G5ePMUQntINQ83i z$upoRb}H)fv5TKDu*ZP$-hvmY3!Atq6ENBh(WYFFM67|7l05p#?E1nmayZKasmvEs z4%uF#@2=U$hCc&#<3^>qaoRUjD5t(Q@!@5>eLn%YPa&y@Wk6F&Jf;Amr=S&p`TF~H zKQmyzZBbK@-3j_NfaCqFrZteLVgLD`ViBgsl+FQ!832*%0DhkaTq4i015y-4Q4~c{ f6h%=KHvsSpwHV1KmpgiI00000NkvXXu0mjf++aJ5 literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_broken.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5d774588ae44eab5608571cb6aafad7375e158 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^2|(DFD66%%n7hj|c25u0=Hbzuz>&Md dbBcZ?)Aw7<0^jOhxdW|Y@O1TaS?83{1ORW&Jrn={ literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_damaged.png new file mode 100644 index 0000000000000000000000000000000000000000..f16a028dee5bbe41a7f4e35f686043e8a112ce4e GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(YymzYu0Z<#e`9lQK{p_au_VYZ zn8D%MjWi%9!PCVtL_+fI!HvAl4m=D8Hh=XH6ZQR;XyVo{y01gP^_0k+pXD$8l*-N4 z&iUk!V5<=?maE{?*yyS)-udN6;H*Pi5*L(-Fs)pAdDY$x8SUGCM{GTG-~v& dN}IerjGt7Q1>7HnEC$-e;OXk;vd$@?2>`@EK-2&L literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png b/Resources/Textures/DeltaV/Structures/Doors/Airlocks/Standard/justice.rsi/sparks_open.png new file mode 100644 index 0000000000000000000000000000000000000000..630eabb976ecf11fa59ba29f03502b02bde399aa GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^2|(GM)~O;5D{Ad0LZe;7N97KJC6BX-upNVgWUu;=WLfz+qP_d4j_bJ3vh=hfa5r9 z0qVN81qdO4*#ozUc?-;6LK?t17pG~m0|2;<_}}aJ8%Xzkw*de?p>!O_N2;HSWO<%5 ub^zoJEX!gGaL3n-QrC61fn;4*wm#k_G(h}nBOLz#0000Y-zxQDW zk>mSwr*?&Ptx$M0VWC*NSXYyU7whhj_H9j})1S=R;xwtvyGtbe;L(K-6n6c{{$PJ0 zv>;S~#Z{oN-Nj(7Z5uBgTXTf>k>;b0h2asOZ62v9UX3{! zB)8m@QCf1zgccT7(Hy7tW{cFxY1eK}&-gJdP>p}_{#Gpu%Px(H=5AT7yH-sxy%hSZ zB;@Fw|K~4XOIx=0-9nWMzhCW|KiQ!`e#P~e@87SKzD{>|z`DaM`k&F+%y+ZDM0t11 zFh7)i@M+mnP4)v<^$fn{oQ%oyV2rBsWwz66IA~)~!~bP{_2#U1kN3SB;ar4dD zl(c<0dPo19GgM$;c%<|*o_Dh@x9{qbZd4J4$Z?D><`!W`mAJ-O6 z`p@|J`OMuj=IwU<8@J=k^SoD>vs?{IziTefh7iU39PMeOf%}qEP*p zc*fVx2l?QRNAd>}^G_wy;`cnftN1y#yZ6~Ce0#r2+9UV6<5$L8&%T7)ZC?t!I$ z*M0X=z2BafU{Kqjb|-_|=nG>}|AzhdL(L~NS^Qex@OA4EREPbDXNhBUXJzqU^*ii8 QFk%@zUHx3vIVCg!08QzehX4Qo literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png b/Resources/Textures/DeltaV/Structures/Wallmounts/signs.rsi/direction_justice.png new file mode 100644 index 0000000000000000000000000000000000000000..ef94a9998f3367c89c30de82e90cbf633de39a8a GIT binary patch literal 926 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_door.png new file mode 100644 index 0000000000000000000000000000000000000000..f406e398073313aa73094d1239530fa0c9f747c6 GIT binary patch literal 5840 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png b/Resources/Textures/Structures/Storage/closet.rsi/cj_open.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba72a5bccf8a611fd93933b9fe00fbc53cdec3e GIT binary patch literal 5529 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 EZ{JG(3;+NC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png b/Resources/Textures/Structures/Storage/closet.rsi/clerk_open.png new file mode 100644 index 0000000000000000000000000000000000000000..ab865e6cbe5b83f38babec92d33e6a41c2e9694e GIT binary patch literal 5588 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 Date: Wed, 7 Aug 2024 04:36:59 +0800 Subject: [PATCH 096/143] New Trait: Parkour Training (#670) # Description **Parkour Training** is a 3-point Physical trait that increases your table climbing speed (and all other climbables), and crawling speed, and reduces the cooldown on laying down/standing up. Inspired by the SS13 trait called Freerunning, expanding on it by including new mechanics around the Laying Down system. Stats (Adjustable): - 30% faster table climbing speed - 25% faster crawling speed - Cooldown on laying down/standing up reduced from 2.5 seconds to 2 seconds ## Media ![image](https://github.com/user-attachments/assets/09237d2f-667b-473a-98ad-71bd19bce6c3) # Changelog :cl: Skubman - add: Add Parkour Training, a 3-point trait that makes you faster with climbing tables and crawling. --------- Signed-off-by: Angelo Fallaria --- .../Assorted/LayingDownModifierComponent.cs | 22 +++++++++++++++++++ .../Assorted/LayingDownModifierSystem.cs | 22 +++++++++++++++++++ .../Climbing/Systems/ClimbSystem.cs | 7 +++++- .../Components/ClimbDelayModifierComponent.cs | 16 ++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 5 +++++ Resources/Prototypes/Traits/skills.yml | 11 ++++++++++ 6 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Traits/Assorted/LayingDownModifierComponent.cs create mode 100644 Content.Server/Traits/Assorted/LayingDownModifierSystem.cs create mode 100644 Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs diff --git a/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs new file mode 100644 index 00000000000..22660ff4487 --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for traits that modify values related to the Laying Down system. +/// +[RegisterComponent] +public sealed partial class LayingDownModifierComponent : Component +{ + /// + /// What to multiply the cooldown of laying down and standing up by. + /// + [DataField] + public float LayingDownCooldownMultiplier = 1f; + + /// + /// What to multiply the speed multiplier when lying down by. + /// + [DataField] + public float DownedSpeedMultiplierMultiplier = 1f; +} diff --git a/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs new file mode 100644 index 00000000000..dc6dcd2de3b --- /dev/null +++ b/Content.Server/Traits/Assorted/LayingDownModifierSystem.cs @@ -0,0 +1,22 @@ +using Content.Server.Traits.Assorted; +using Content.Server.Standing; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class LayingDownModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + } + + private void OnStartup(EntityUid uid, LayingDownModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var layingDown)) + return; + + layingDown.Cooldown *= component.LayingDownCooldownMultiplier; + layingDown.DownedSpeedMultiplier *= component.DownedSpeedMultiplierMultiplier; + } +} diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 8f6e8046aa4..521f5ace99d 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -13,6 +13,7 @@ using Content.Shared.Physics; using Content.Shared.Popups; using Content.Shared.Stunnable; +using Content.Shared.Traits.Assorted.Components; using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; using Robust.Shared.Physics; @@ -216,7 +217,11 @@ public bool TryClimb( if (ev.Cancelled) return false; - var args = new DoAfterArgs(EntityManager, user, comp.ClimbDelay, new ClimbDoAfterEvent(), + var climbDelay = comp.ClimbDelay; + if (user == entityToMove && TryComp(user, out var delayModifier)) + climbDelay *= delayModifier.ClimbDelayMultiplier; + + var args = new DoAfterArgs(EntityManager, user, climbDelay, new ClimbDoAfterEvent(), entityToMove, target: climbable, used: entityToMove) diff --git a/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs new file mode 100644 index 00000000000..c04657a4875 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Components/ClimbDelayModifierComponent.cs @@ -0,0 +1,16 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies climbing speed. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class ClimbDelayModifierComponent : Component +{ + /// + /// What to multiply the climbing delay by. + /// + [DataField, AutoNetworkedField] + public float ClimbDelayMultiplier = 1f; +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 528517684c4..3439ffcdc97 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -84,6 +84,11 @@ trait-description-Voracious = Nothing gets between you and your food. Your endless consumption of food and drinks is twice as fast. +trait-name-ParkourTraining = Parkour Training +trait-description-ParkourTraining = + Whether as a hobby, lifestyle, or professional training, you are trained in the discipline of parkour. + You're faster with climbing, crawling, lying down, and getting up. + trait-name-LightStep = Light Step trait-description-LightStep = You move with a gentle step, making your footsteps quieter. diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 6d10886e8fa..1a4242aff80 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -87,6 +87,17 @@ foodDelayMultiplier: 0.5 drinkDelayMultiplier: 0.5 +- type: trait + id: ParkourTraining + category: Physical + points: -3 + components: + - type: ClimbDelayModifier + climbDelayMultiplier: 0.70 + - type: LayingDownModifier + layingDownCooldownMultiplier: 0.8 + downedSpeedMultiplierMultiplier: 1.25 + - type: trait id: LightStep category: Auditory From 8400f6c06baef4c34f5c29fdb9754683928c4c7a Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 20:37:26 +0000 Subject: [PATCH 097/143] Automatic Changelog Update (#670) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6263b7d4005..e0226cd7bf7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5001,3 +5001,11 @@ Entries: Slash or Piercing damage or be a melee weapons generalist. id: 6225 time: '2024-08-06T19:50:20.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add Parkour Training, a 3-point trait that makes you faster with + climbing tables and crawling. + id: 6226 + time: '2024-08-06T20:37:00.0000000+00:00' From 93ece39fc2bb998e3b9c593f2d63b4be5281ef18 Mon Sep 17 00:00:00 2001 From: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Date: Wed, 7 Aug 2024 06:47:49 +1000 Subject: [PATCH 098/143] Cherry-Pick "EMP Grenade Actually Sabotages Power" From Wizden (#516) ## About the PR EMP has been changed to target APC-powered-devices (most electrical devices) as well as batteries to disable them. This means EMP can interfere with autolathes, airlocks, atmos devices, substations and SMES. The power draw of a single EMP grenade now cuts out a substation, and the disabling effect prevents further recharge until it subsides. EMP duration now also stacks, which creates a novel way to quietly black out the station by attacking engineering SMES with 3 EMP grenades (6tc EMP bundle) to black out the station for 3 minutes. Edit, here's a detailed changelog of the PR, Functionality: - EMP disable has been generalised to kill and prevent further function of every device/battery by interrupting recharge - As a result of the above, some hard coded interactions have been culled - EMP disable duration now stacks with multiple EMP blasts - EMP is now capable of draining from gravity generators - The Charger system has been slightly reworked to facilitate communication between batteries and chargers Results: - EMP grenade can disable basically every powered machine, most notably doors - EMP grenade has had its power drain upped to 2.7MW, which is slightly more than a substation and 1/3 a SMES - EMP grenade can now instantly kill substations - EMP grenade can now instantly kill gravity generators - 3 EMP grenades (6tc) can be used to kill SMES and disable recharge for 3 minutes with no evidence on the power monitor. ## Why / Balance EMP at 2tc has a relatively low value-proposition when compared to C4 which is also 2tc. While EMP can probably black out one (or two if you're lucky) APCs and can be used as a defensive option against Stun/Lasers. C4 can be used to cut wires, substations, SMES, generators, doors, reinforced walls, people and the list probably continues. New EMP can be used to soft-bomb station power in an explosion that isn't globally alarming (salv boom). Targeting the captain's office directly may let you crowbar in and steal the locker but it leaves ephemeral evidence in the form of everything electrical shimmering blue. Opting to bomb substations blacks out a wider area, providing several degrees of separation from your target. That is to say, new EMP grenade favours map knowledge and rewards better stealth. ## Technical details - `C.S/.../EmpSystem.cs` uses TryComp to turn on/off charging for `C.S/Power/Components/PowerNetworkBatteryComponent` - `C.S/Power/EntitySystems/PowerReceiverSystem.cs` listens to `EmpPulseEvent` to turn off. Requests to turn back on are additionally intercepted by `EmpSystem.cs` and cancelled. - `C.S/.../GravityGeneratorSystem.cs` listens to `EmpPulseEvent` and converts energy consumption to a normalised charge - `C.S/Power/EntitySystems/ApcSystem.cs` no longer toggles its breaker, but still listens to `EmpPulseEvent` for updating visuals. - `C.S/Power/EntitySystems/ChargerSystem.cs` was refactored to add a `ChargingComponent` flag to power cells instead of `ActiveCharger` on itself. Battery and Charger communicate through this flag. Listens to `EmpPulseEvent` for updating its state machine. New `ChargerUpdateStatusEvent` allows batteries to update the charger's status. - `C.S/Power/EntitySystems/BatterySystem.cs` can now be disabled, and checks for disabling before updating its charge. Raises `ChargerUpdateStatusEvent` when hearing `EmpDisabledRemoved` to tell its charger to start charging again. - `C.S/Power/PowerWireAction.cs` checks for `EmpDisabledComponent` before turning power back on. - `C.S/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs` and `C.S/VendingMachines/VendingMachineSystem.cs` had redundant `EmpPulseEvent` listeners culled. - `Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml` buffed EMP grenade. ## Media https://www.youtube.com/embed/rSVph6OIg1s?si=8o4bx9Vx16B6usuu - outdated video demonstrating changes on a wizden map https://www.youtube.com/embed/B3iPhLcfs-0?si=trB1HY2ccjMf96Bj - electrical anomaly crit with updated emp - [x] I have added screenshots/videos to this PR showcasing its changes ingame, **or** this PR does not require an ingame showcase **Changelog** :cl: - tweak: EMP Grenades can now disable basically any electrical device, and stack in disable duration. --------- Signed-off-by: VMSolidus Co-authored-by: VMSolidus --- .../EntitySystems/GasThermoMachineSystem.cs | 2 +- .../Atmos/Portable/SpaceHeaterSystem.cs | 2 +- .../Unit/EntitySystems/DisposalUnitSystem.cs | 2 +- Content.Server/Emp/EmpSystem.cs | 33 ++-- .../Gravity/GravityGeneratorSystem.cs | 26 +++ .../Components/ActiveChargerComponent.cs | 10 -- .../Power/Components/ChargingComponent.cs | 19 +++ .../Power/EntitySystems/ApcSystem.cs | 19 ++- .../Power/EntitySystems/BatterySystem.cs | 32 +++- .../Power/EntitySystems/ChargerSystem.cs | 149 ++++++++++++++---- .../EntitySystems/PowerReceiverSystem.cs | 38 ++++- Content.Server/Power/PowerWireAction.cs | 4 + .../Systems/SurveillanceCameraSystem.cs | 19 --- .../VendingMachines/VendingMachineSystem.cs | 11 -- .../Objects/Weapons/Throwable/grenades.yml | 2 +- 15 files changed, 273 insertions(+), 95 deletions(-) delete mode 100644 Content.Server/Power/Components/ActiveChargerComponent.cs create mode 100644 Content.Server/Power/Components/ChargingComponent.cs diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 9b61044f03e..720fd5b5b91 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -143,7 +143,7 @@ private bool IsHeater(GasThermoMachineComponent comp) private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { - var powerState = _power.TogglePower(uid); + var powerState = _power.TryTogglePower(uid); _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); DirtyUI(uid, thermoMachine); } diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs index fff15f696c4..8094b0e1a66 100644 --- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs +++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs @@ -98,7 +98,7 @@ private void OnToggle(EntityUid uid, SpaceHeaterComponent spaceHeater, SpaceHeat if (!Resolve(uid, ref powerReceiver)) return; - _power.TogglePower(uid); + _power.TryTogglePower(uid); UpdateAppearance(uid); DirtyUI(uid, spaceHeater); diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index f9403f33b9d..d6647bbf2eb 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -235,7 +235,7 @@ private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent compon _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); break; case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Session.AttachedEntity); + _power.TryTogglePower(uid, user: args.Session.AttachedEntity); break; default: throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); diff --git a/Content.Server/Emp/EmpSystem.cs b/Content.Server/Emp/EmpSystem.cs index 7c1a6f9b5db..3a1d2d28196 100644 --- a/Content.Server/Emp/EmpSystem.cs +++ b/Content.Server/Emp/EmpSystem.cs @@ -1,7 +1,7 @@ using Content.Server.Explosion.EntitySystems; +using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Radio; -using Content.Server.SurveillanceCamera; using Content.Shared.Emp; using Content.Shared.Examine; using Robust.Shared.Map; @@ -22,8 +22,6 @@ public override void Initialize() SubscribeLocalEvent(OnRadioSendAttempt); SubscribeLocalEvent(OnRadioReceiveAttempt); - SubscribeLocalEvent(OnApcToggleMainBreaker); - SubscribeLocalEvent(OnCameraSetActive); } /// @@ -75,7 +73,19 @@ public void DoEmpEffects(EntityUid uid, float energyConsumption, float duration) if (ev.Disabled) { var disabled = EnsureComp(uid); - disabled.DisabledUntil = Timing.CurTime + TimeSpan.FromSeconds(duration); + // couldnt use null-coalescing operator here sadge + if (disabled.DisabledUntil == TimeSpan.Zero) + { + disabled.DisabledUntil = Timing.CurTime; + } + disabled.DisabledUntil = disabled.DisabledUntil + TimeSpan.FromSeconds(duration); + + /// i tried my best to go through the Pow3r server code but i literally couldn't find in relation to PowerNetworkBatteryComponent that uses the event system + /// the code is otherwise too esoteric for my innocent eyes + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = false; + } } } @@ -91,6 +101,11 @@ public override void Update(float frameTime) RemComp(uid); var ev = new EmpDisabledRemoved(); RaiseLocalEvent(uid, ref ev); + + if (TryComp(uid, out var powerNetBattery)) + { + powerNetBattery.CanCharge = true; + } } } } @@ -115,16 +130,6 @@ private void OnRadioReceiveAttempt(EntityUid uid, EmpDisabledComponent component { args.Cancelled = true; } - - private void OnApcToggleMainBreaker(EntityUid uid, EmpDisabledComponent component, ref ApcToggleMainBreakerAttemptEvent args) - { - args.Cancelled = true; - } - - private void OnCameraSetActive(EntityUid uid, EmpDisabledComponent component, ref SurveillanceCameraSetActiveAttemptEvent args) - { - args.Cancelled = true; - } } /// diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index b0c4bb56ff3..ec5646457e2 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Audio; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Interaction; @@ -28,6 +29,8 @@ public override void Initialize() SubscribeLocalEvent(OnInteractHand); SubscribeLocalEvent( OnSwitchGenerator); + + SubscribeLocalEvent(OnEmpPulse); } private void OnParentChanged(EntityUid uid, GravityGeneratorComponent component, ref EntParentChangedMessage args) @@ -289,5 +292,28 @@ private void OnSwitchGenerator( { SetSwitchedOn(uid, component, args.On, session:args.Session); } + + private void OnEmpPulse(EntityUid uid, GravityGeneratorComponent component, EmpPulseEvent args) + { + /// i really don't think that the gravity generator should use normalised 0-1 charge + /// as opposed to watts charge that every other battery uses + + ApcPowerReceiverComponent? powerReceiver = null; + if (!Resolve(uid, ref powerReceiver, false)) + return; + + var ent = (uid, component, powerReceiver); + + // convert from normalised energy to watts and subtract + float maxEnergy = component.ActivePowerUse / component.ChargeRate; + float currentEnergy = maxEnergy * component.Charge; + currentEnergy = Math.Max(0, currentEnergy - args.EnergyConsumption); + + // apply renormalised energy to charge variable + component.Charge = currentEnergy / maxEnergy; + + // update power state + UpdateState(ent); + } } } diff --git a/Content.Server/Power/Components/ActiveChargerComponent.cs b/Content.Server/Power/Components/ActiveChargerComponent.cs deleted file mode 100644 index f3d863c9e43..00000000000 --- a/Content.Server/Power/Components/ActiveChargerComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Content.Shared.Containers.ItemSlots; -using Content.Shared.Power; - -namespace Content.Server.Power.Components -{ - [RegisterComponent] - public sealed partial class ActiveChargerComponent : Component - { - } -} diff --git a/Content.Server/Power/Components/ChargingComponent.cs b/Content.Server/Power/Components/ChargingComponent.cs new file mode 100644 index 00000000000..db7c14f7082 --- /dev/null +++ b/Content.Server/Power/Components/ChargingComponent.cs @@ -0,0 +1,19 @@ +using Content.Shared.Containers.ItemSlots; +using Content.Shared.Power; + +namespace Content.Server.Power.Components +{ + [RegisterComponent] + public sealed partial class ChargingComponent : Component + { + /// + ///References the entity of the charger that is currently powering this battery + /// + public EntityUid ChargerUid; + + /// + ///References the component of the charger that is currently powering this battery + /// + public ChargerComponent ChargerComponent; + } +} diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 95b5d74a945..f345c9e88ea 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -7,6 +7,7 @@ using Content.Shared.APC; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; +using Content.Shared.Emp; using Content.Shared.Popups; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -37,6 +38,7 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } public override void Update(float deltaTime) @@ -163,7 +165,7 @@ public void UpdateUIState(EntityUid uid, private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery) { - if (HasComp(uid)) + if (HasComp(uid) || HasComp(uid)) return ApcChargeState.Emag; if (battery.CurrentStorage / battery.Capacity > ApcComponent.HighPowerThreshold) @@ -190,15 +192,16 @@ private ApcExternalPowerState CalcExtPowerState(EntityUid uid, PowerState.Batter return ApcExternalPowerState.Good; } - + private void OnEmpPulse(EntityUid uid, ApcComponent component, ref EmpPulseEvent args) { - if (component.MainBreakerEnabled) - { - args.Affected = true; - args.Disabled = true; - ApcToggleBreaker(uid, component); - } + EnsureComp(uid, out var emp); //event calls before EmpDisabledComponent is added, ensure it to force sprite update + UpdateApcState(uid); + } + + private void OnEmpDisabledRemoved(EntityUid uid, ApcComponent component, ref EmpDisabledRemoved args) + { + UpdateApcState(uid); } } diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index 0a0f2068b58..1c5d83b094d 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -1,5 +1,6 @@ using Content.Server.Cargo.Systems; using Content.Server.Emp; +using Content.Shared.Emp; using Content.Server.Power.Components; using Content.Shared.Examine; using Content.Shared.Rejuvenate; @@ -20,6 +21,7 @@ public override void Initialize() SubscribeLocalEvent(OnBatteryRejuvenate); SubscribeLocalEvent(CalculateBatteryPrice); SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); SubscribeLocalEvent(PreSync); SubscribeLocalEvent(PostSync); @@ -85,7 +87,7 @@ public override void Update(float frameTime) { if (!comp.AutoRecharge) continue; if (batt.IsFullyCharged) continue; - SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); + TrySetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); } } @@ -100,9 +102,21 @@ private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, re private void OnEmpPulse(EntityUid uid, BatteryComponent component, ref EmpPulseEvent args) { args.Affected = true; + args.Disabled = true; UseCharge(uid, args.EnergyConsumption, component); } + // if a disabled battery is put into a recharged, + // allow the recharger to start recharging again after the disable ends + private void OnEmpDisabledRemoved(EntityUid uid, BatteryComponent component, ref EmpDisabledRemoved args) + { + if (!TryComp(uid, out var charging)) + return; + + var ev = new ChargerUpdateStatusEvent(); + RaiseLocalEvent(charging.ChargerUid, ref ev); + } + public float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) { if (value <= 0 || !Resolve(uid, ref battery) || battery.CurrentCharge == 0) @@ -157,6 +171,18 @@ public bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = return true; } + /// + /// Like SetCharge, but checks for conditions like EmpDisabled before executing + /// + public bool TrySetCharge(EntityUid uid, float value, BatteryComponent? battery = null) + { + if (!Resolve(uid, ref battery, false) || TryComp(uid, out var emp)) + return false; + + SetCharge(uid, value, battery); + return true; + } + /// /// Returns whether the battery is at least 99% charged, basically full. /// @@ -165,6 +191,10 @@ public bool IsFull(EntityUid uid, BatteryComponent? battery = null) if (!Resolve(uid, ref battery)) return false; + // If the battery is full, remove its charging component. + if (TryComp(uid, out _)) + RemComp(uid); + return battery.CurrentCharge / battery.MaxCharge >= 0.99f; } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index db16dfa008e..ae6b024162e 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -1,13 +1,16 @@ using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Server.PowerCell; using Content.Shared.Examine; using Content.Shared.Power; using Content.Shared.PowerCell.Components; +using Content.Shared.Emp; using JetBrains.Annotations; using Robust.Shared.Containers; using System.Diagnostics.CodeAnalysis; using Content.Shared.Storage.Components; using Robust.Server.Containers; +using Content.Shared.Whitelist; namespace Content.Server.Power.EntitySystems; @@ -28,6 +31,11 @@ public override void Initialize() SubscribeLocalEvent(OnInsertAttempt); SubscribeLocalEvent(OnEntityStorageInsertAttempt); SubscribeLocalEvent(OnChargerExamine); + + SubscribeLocalEvent(OnUpdateStatus); + + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnStartup(EntityUid uid, ChargerComponent component, ComponentStartup args) @@ -40,21 +48,58 @@ private void OnChargerExamine(EntityUid uid, ChargerComponent component, Examine args.PushMarkup(Loc.GetString("charger-examine", ("color", "yellow"), ("chargeRate", (int) component.ChargeRate))); } + private void StartChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + bool charge = true; + + if (HasComp(uid)) + charge = false; + else + if (!TryComp(target, out var battery)) + charge = false; + else + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + charge = false; + + // wrap functionality in an if statement instead of returning... + if (charge) + { + var charging = EnsureComp(target); + charging.ChargerUid = uid; + charging.ChargerComponent = component; + } + + // ...so the status always updates (for insertin a power cell) + UpdateStatus(uid, component); + } + + private void StopChargingBattery(EntityUid uid, ChargerComponent component, EntityUid target) + { + if (HasComp(target)) + RemComp(target); + UpdateStatus(uid, component); + } + public override void Update(float frameTime) { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out _, out var charger, out var containerComp)) + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var charging)) { - if (!_container.TryGetContainer(uid, charger.SlotId, out var container, containerComp)) + if (!TryComp(charging.ChargerUid, out var chargerComponent)) continue; - if (charger.Status == CellChargerStatus.Empty || charger.Status == CellChargerStatus.Charged || container.ContainedEntities.Count == 0) + if (charging.ChargerComponent.Status == CellChargerStatus.Off || charging.ChargerComponent.Status == CellChargerStatus.Empty) continue; - foreach (var contained in container.ContainedEntities) - { - TransferPower(uid, contained, charger, frameTime); - } + if (HasComp(charging.ChargerUid)) + continue; + + if (!TryComp(uid, out var battery)) + continue; + + if (Math.Abs(battery.MaxCharge - battery.CurrentCharge) < 0.01) + StopChargingBattery(charging.ChargerUid, charging.ChargerComponent, uid); + TransferPower(charging.ChargerUid, uid, charging.ChargerComponent, frameTime); } } @@ -71,7 +116,7 @@ private void OnInserted(EntityUid uid, ChargerComponent component, EntInsertedIn if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StartChargingBattery(uid, component, args.Entity); } private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFromContainerMessage args) @@ -79,7 +124,7 @@ private void OnRemoved(EntityUid uid, ChargerComponent component, EntRemovedFrom if (args.Container.ID != component.SlotId) return; - UpdateStatus(uid, component); + StopChargingBattery(uid, component, args.Entity); } /// @@ -112,6 +157,11 @@ private void OnEntityStorageInsertAttempt(EntityUid uid, ChargerComponent compon args.Cancelled = true; } + private void OnUpdateStatus(EntityUid uid, ChargerComponent component, ref ChargerUpdateStatusEvent args) + { + UpdateStatus(uid, component); + } + private void UpdateStatus(EntityUid uid, ChargerComponent component) { var status = GetStatus(uid, component); @@ -126,15 +176,6 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) component.Status = status; - if (component.Status == CellChargerStatus.Charging) - { - AddComp(uid); - } - else - { - RemComp(uid); - } - switch (component.Status) { case CellChargerStatus.Off: @@ -146,7 +187,7 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Empty, appearance); break; case CellChargerStatus.Charging: - receiver.Load = component.ChargeRate; + receiver.Load = component.ChargeRate; //does not scale with multiple slotted batteries _appearance.SetData(uid, CellVisual.Light, CellChargerStatus.Charging, appearance); break; case CellChargerStatus.Charged: @@ -157,6 +198,42 @@ private void UpdateStatus(EntityUid uid, ChargerComponent component) throw new ArgumentOutOfRangeException(); } } + + private void OnEmpPulse(EntityUid uid, ChargerComponent component, ref EmpPulseEvent args) + { + // we don't care if we haven't been disabled + if (!args.Disabled) + return; + + // if the recharger is hit by an emp pulse, + // stop recharging contained batteries to save resources + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StopChargingBattery(uid, component, containedEntity); + } + } + + private void OnEmpDisabledRemoved(EntityUid uid, ChargerComponent component, ref EmpDisabledRemoved args) + { + // if an emp disable subsides, + // attempt to start charging all batteries + if (!_container.TryGetContainer(uid, component.SlotId, out var container)) + return; + + foreach (var containedEntity in container.ContainedEntities) + { + if (!SearchForBattery(containedEntity, out _, out _)) + continue; + + StartChargingBattery(uid, component, containedEntity); + } + } private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) { @@ -178,13 +255,28 @@ private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) if (container.ContainedEntities.Count == 0) return CellChargerStatus.Empty; - if (!SearchForBattery(container.ContainedEntities[0], out _, out var heldBattery)) - return CellChargerStatus.Off; + var statusOut = CellChargerStatus.Off; - if (Math.Abs(heldBattery.MaxCharge - heldBattery.CurrentCharge) < 0.01) - return CellChargerStatus.Charged; + foreach (var containedEntity in container.ContainedEntities) + { + // if none of the slotted items are actually batteries, represent the charger as off + if (!SearchForBattery(containedEntity, out _, out _)) + continue; - return CellChargerStatus.Charging; + // if all batteries are either EMP'd or fully charged, represent the charger as fully charged + statusOut = CellChargerStatus.Charged; + if (HasComp(containedEntity)) + continue; + + if (!HasComp(containedEntity)) + continue; + + // if we have atleast one battery being charged, represent the charger as charging; + statusOut = CellChargerStatus.Charging; + break; + } + + return statusOut; } private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerComponent component, float frameTime) @@ -201,11 +293,11 @@ private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerCompone if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); // Just so the sprite won't be set to 99.99999% visibility if (heldBattery.MaxCharge - heldBattery.CurrentCharge < 0.01) { - _battery.SetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); + _battery.TrySetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); } UpdateStatus(uid, component); @@ -223,3 +315,6 @@ private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out EntityUid? return true; } } + +[ByRefEvent] +public record struct ChargerUpdateStatusEvent(); \ No newline at end of file diff --git a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs index 048fda23553..2157a53a53d 100644 --- a/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerReceiverSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Power.Components; +using Content.Server.Emp; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Examine; @@ -11,6 +12,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Utility; +using Content.Shared.Emp; namespace Content.Server.Power.EntitySystems { @@ -38,6 +40,9 @@ public override void Initialize() SubscribeLocalEvent>(OnGetVerbs); SubscribeLocalEvent>(AddSwitchPowerVerb); + SubscribeLocalEvent(OnEmpPulse); + SubscribeLocalEvent(OnEmpEnd); + _recQuery = GetEntityQuery(); _provQuery = GetEntityQuery(); } @@ -131,7 +136,7 @@ private void AddSwitchPowerVerb(EntityUid uid, PowerSwitchComponent component, G { Act = () => { - TogglePower(uid, user: args.User); + TryTogglePower(uid, user: args.User); }, Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), Text = Loc.GetString("power-switch-component-toggle-verb"), @@ -192,5 +197,36 @@ public bool TogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerRece return !receiver.PowerDisabled; // i.e. PowerEnabled } + + public bool TryTogglePower(EntityUid uid, bool playSwitchSound = true, ApcPowerReceiverComponent? receiver = null, EntityUid? user = null) + { + if (HasComp(uid)) + return false; + + return TogglePower(uid, playSwitchSound, receiver, user); + } + + public void SetLoad(ApcPowerReceiverComponent comp, float load) + { + comp.Load = load; + } + + private void OnEmpPulse(EntityUid uid, ApcPowerReceiverComponent component, ref EmpPulseEvent args) + { + if (!component.PowerDisabled) + { + args.Affected = true; + args.Disabled = true; + TogglePower(uid, false); + } + } + + private void OnEmpEnd(EntityUid uid, ApcPowerReceiverComponent component, ref EmpDisabledRemoved args) + { + if (component.PowerDisabled) + { + TogglePower(uid, false); + } + } } } diff --git a/Content.Server/Power/PowerWireAction.cs b/Content.Server/Power/PowerWireAction.cs index 785eac91dba..374c1c41acb 100644 --- a/Content.Server/Power/PowerWireAction.cs +++ b/Content.Server/Power/PowerWireAction.cs @@ -1,6 +1,7 @@ using Content.Server.Electrocution; using Content.Server.Power.Components; using Content.Server.Wires; +using Content.Shared.Emp; using Content.Shared.Power; using Content.Shared.Wires; @@ -78,6 +79,9 @@ private void SetPower(EntityUid owner, bool pulsed) return; } + if (EntityManager.TryGetComponent(owner, out var emp)) + return; + power.PowerDisabled = false; } } diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index 410ba9f7540..ec3d33157ab 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -1,7 +1,6 @@ using Content.Server.DeviceNetwork; using Content.Server.DeviceNetwork.Components; using Content.Server.DeviceNetwork.Systems; -using Content.Server.Emp; using Content.Server.Power.Components; using Content.Shared.ActionBlocker; using Content.Shared.DeviceNetwork; @@ -59,9 +58,6 @@ public override void Initialize() SubscribeLocalEvent(OnSetName); SubscribeLocalEvent(OnSetNetwork); SubscribeLocalEvent>(AddVerbs); - - SubscribeLocalEvent(OnEmpPulse); - SubscribeLocalEvent(OnEmpDisabledRemoved); } private void OnPacketReceived(EntityUid uid, SurveillanceCameraComponent component, DeviceNetworkPacketEvent args) @@ -400,21 +396,6 @@ private void UpdateVisuals(EntityUid uid, SurveillanceCameraComponent? component _appearance.SetData(uid, SurveillanceCameraVisualsKey.Key, key, appearance); } - - private void OnEmpPulse(EntityUid uid, SurveillanceCameraComponent component, ref EmpPulseEvent args) - { - if (component.Active) - { - args.Affected = true; - args.Disabled = true; - SetActive(uid, false); - } - } - - private void OnEmpDisabledRemoved(EntityUid uid, SurveillanceCameraComponent component, ref EmpDisabledRemoved args) - { - SetActive(uid, true); - } } public sealed class OnSurveillanceCameraViewerAddEvent : EntityEventArgs diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 7c9aed188fe..36fa69313e3 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -49,7 +49,6 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDamage); SubscribeLocalEvent(OnVendingPrice); - SubscribeLocalEvent(OnEmpPulse); SubscribeLocalEvent(OnActivatableUIOpenAttempt); @@ -496,15 +495,5 @@ private void OnPriceCalculation(EntityUid uid, VendingMachineRestockComponent co args.Price += priceSets.Max(); } - - private void OnEmpPulse(EntityUid uid, VendingMachineComponent component, ref EmpPulseEvent args) - { - if (!component.Broken && this.IsPowered(uid, EntityManager)) - { - args.Affected = true; - args.Disabled = true; - component.NextEmpEject = _timing.CurTime; - } - } } } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 1cad73e30ea..f25023b4541 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -314,7 +314,7 @@ sprite: Objects/Weapons/Grenades/empgrenade.rsi - type: EmpOnTrigger range: 4 - energyConsumption: 50000 + energyConsumption: 2700000 - type: DeleteOnTrigger - type: Appearance - type: TimerTriggerVisuals From b6b21da48d04d2ea6ee5d3062da853a5424647c6 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 20:48:10 +0000 Subject: [PATCH 099/143] Automatic Changelog Update (#516) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e0226cd7bf7..c66b99d2ea1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5009,3 +5009,11 @@ Entries: climbing tables and crawling. id: 6226 time: '2024-08-06T20:37:00.0000000+00:00' +- author: WarMechanic + changes: + - type: Tweak + message: >- + EMP Grenades can now disable basically any electrical device, and stack + in disable duration. + id: 6227 + time: '2024-08-06T20:47:49.0000000+00:00' From 81ad859c46fc48ca3b19e8165454bda5ad52f8f1 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Wed, 7 Aug 2024 00:22:11 +0300 Subject: [PATCH 100/143] Admeme Language Commands (Attempt 2) (#565) # Description #562 but using commands instead of tricks. Less user-friendly but makes you look like a hacker when you use them :trollface:

Media

![image](https://github.com/user-attachments/assets/818b6226-aea8-4f9a-b30d-5df39b8041e6) ![image](https://github.com/user-attachments/assets/f3c40feb-f84d-4083-bc9a-44f7b1dfb30d) ![image](https://github.com/user-attachments/assets/31827207-4903-4df1-9074-eb060d0cf63c) (ignore the missing locale, I fixes)

# Changelog :cl: - add: Admin tooling: added several admin commands to help manipulate entities' languages. --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Language/Commands/AdminLanguageCommand.cs | 75 +++++++++ .../Commands/AdminTranslatorCommand.cs | 155 ++++++++++++++++++ Resources/Locale/en-US/language/commands.ftl | 18 ++ 3 files changed, 248 insertions(+) create mode 100644 Content.Server/Language/Commands/AdminLanguageCommand.cs create mode 100644 Content.Server/Language/Commands/AdminTranslatorCommand.cs diff --git a/Content.Server/Language/Commands/AdminLanguageCommand.cs b/Content.Server/Language/Commands/AdminLanguageCommand.cs new file mode 100644 index 00000000000..f02d9c7f401 --- /dev/null +++ b/Content.Server/Language/Commands/AdminLanguageCommand.cs @@ -0,0 +1,75 @@ +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Systems; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "language"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminLanguageCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("add")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool canSpeak = true, + [CommandArgument] bool canUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + + if (language == SharedLanguageSystem.UniversalPrototype) + { + EnsureComp(input); + Languages.UpdateEntityLanguages(input); + } + else + { + EnsureComp(input); + Languages.AddLanguage(input, language, canSpeak, canUnderstand); + } + + return input; + } + + [CommandImplementation("rm")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (language == SharedLanguageSystem.UniversalPrototype && HasComp(input)) + { + RemComp(input); + EnsureComp(input); + } + // We execute this branch even in case of universal so that it gets removed if it was added manually to the LanguageKnowledge + Languages.RemoveLanguage(input, language, removeSpeak, removeUnderstand); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + return Languages.GetSpokenLanguages(input); + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + return Languages.GetUnderstoodLanguages(input); + } +} diff --git a/Content.Server/Language/Commands/AdminTranslatorCommand.cs b/Content.Server/Language/Commands/AdminTranslatorCommand.cs new file mode 100644 index 00000000000..8a7984bc36b --- /dev/null +++ b/Content.Server/Language/Commands/AdminTranslatorCommand.cs @@ -0,0 +1,155 @@ +using System.Diagnostics.CodeAnalysis; +using Content.Server.Administration; +using Content.Shared.Administration; +using Content.Shared.Language; +using Content.Shared.Language.Components; +using Content.Shared.Language.Components.Translators; +using Content.Shared.Language.Systems; +using Robust.Server.Containers; +using Robust.Shared.Toolshed; +using Robust.Shared.Toolshed.Syntax; +using Robust.Shared.Toolshed.TypeParsers; + +namespace Content.Server.Language.Commands; + +[ToolshedCommand(Name = "translator"), AdminCommand(AdminFlags.Admin)] +public sealed class AdminTranslatorCommand : ToolshedCommand +{ + private LanguageSystem? _languagesField; + private ContainerSystem? _containersField; + + private ContainerSystem Containers => _containersField ??= GetSys(); + private LanguageSystem Languages => _languagesField ??= GetSys(); + + [CommandImplementation("addlang")] + public EntityUid AddLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool addSpeak = true, + [CommandArgument] bool addUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + // noob trap - needs a universallanguagespeakercomponent + if (language == SharedLanguageSystem.UniversalPrototype) + throw new ArgumentException(Loc.GetString("command-language-error-this-will-not-work")); + + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (addSpeak && !translator.SpokenLanguages.Contains(language)) + translator.SpokenLanguages.Add(language); + if (addUnderstand && !translator.UnderstoodLanguages.Contains(language)) + translator.UnderstoodLanguages.Add(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("rmlang")] + public EntityUid RemoveLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref, + [CommandArgument] bool removeSpeak = true, + [CommandArgument] bool removeUnderstand = true + ) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (removeSpeak) + translator.SpokenLanguages.Remove(language); + if (removeUnderstand) + translator.UnderstoodLanguages.Remove(language); + + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("addrequired")] + public EntityUid AddRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (!translator.RequiredLanguages.Contains(language)) + { + translator.RequiredLanguages.Add(language); + UpdateTranslatorHolder(input); + } + + return input; + } + + [CommandImplementation("rmrequired")] + public EntityUid RemoveRequiredLanguage( + [CommandInvocationContext] IInvocationContext ctx, + [PipedArgument] EntityUid input, + [CommandArgument] ValueRef> @ref) + { + var language = @ref.Evaluate(ctx)!; + if (!TryGetTranslatorComp(input, out var translator)) + throw new ArgumentException(Loc.GetString("command-language-error-not-a-translator", ("entity", input))); + + if (translator.RequiredLanguages.Remove(language)) + UpdateTranslatorHolder(input); + + return input; + } + + [CommandImplementation("lsspoken")] + public IEnumerable ListSpoken([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.SpokenLanguages; + } + + [CommandImplementation("lsunderstood")] + public IEnumerable ListUnderstood([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.UnderstoodLanguages; + } + + [CommandImplementation("lsrequired")] + public IEnumerable ListRequired([PipedArgument] EntityUid input) + { + if (!TryGetTranslatorComp(input, out var translator)) + return []; + return translator.RequiredLanguages; + } + + private bool TryGetTranslatorComp(EntityUid uid, [NotNullWhen(true)] out BaseTranslatorComponent? translator) + { + if (TryComp(uid, out var handheld)) + translator = handheld; + else if (TryComp(uid, out var implant)) + translator = implant; + else if (TryComp(uid, out var intrinsic)) + translator = intrinsic; + else + translator = null; + + return translator != null; + } + + private void UpdateTranslatorHolder(EntityUid translator) + { + if (!Containers.TryGetContainingContainer(translator, out var cont) + || cont.Owner is not { Valid: true } holder) + return; + + Languages.UpdateEntityLanguages(holder); + } +} diff --git a/Resources/Locale/en-US/language/commands.ftl b/Resources/Locale/en-US/language/commands.ftl index ba2b3160094..65959e3f28f 100644 --- a/Resources/Locale/en-US/language/commands.ftl +++ b/Resources/Locale/en-US/language/commands.ftl @@ -14,3 +14,21 @@ command-language-entry = {$id}. {$language} - {$name} command-language-invalid-number = The language number must be between 0 and {$total}. Alternatively, use the language name. command-language-invalid-language = The language {$id} does not exist or you cannot speak it. + +# toolshed + +command-description-language-add = Adds a new language to the piped entity. The two last arguments indicate whether it should be spoken/understood. Example: 'self language:add "Canilunzt" true true' +command-description-language-rm = Removes a language from the piped entity. Works similarly to language:add. Example: 'self language:rm "GalacticCommon" true true'. +command-description-language-lsspoken = Lists all languages the entity can speak. Example: 'self language:lsspoken' +command-description-language-lsunderstood = Lists all languages the entity can understand. Example: 'self language:lssunderstood' + +command-description-translator-addlang = Adds a new target language to the piped translator entity. See language:add for details. +command-description-translator-rmlang = Removes a target language from the piped translator entity. See language:rm for details. +command-description-translator-addrequired = Adds a new required language to the piped translator entity. Example: 'ent 1234 translator:addrequired "GalacticCommon"' +command-description-translator-rmrequired = Removes a required language from the piped translator entity. Example: 'ent 1234 translator:rmrequired "GalacticCommon"' +command-description-translator-lsspoken = Lists all spoken languages for the piped translator entity. Example: 'ent 1234 translator:lsspoken' +command-description-translator-lsunderstood = Lists all understood languages for the piped translator entity. Example: 'ent 1234 translator:lssunderstood' +command-description-translator-lsrequired = Lists all required languages for the piped translator entity. Example: 'ent 1234 translator:lsrequired' + +command-language-error-this-will-not-work = This will not work. +command-language-error-not-a-translator = Entity {$entity} is not a translator. From 48c0770ff49c622491ded7ae9591e77842304e8b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 21:22:38 +0000 Subject: [PATCH 101/143] Automatic Changelog Update (#565) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c66b99d2ea1..e3de08a18b0 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5017,3 +5017,11 @@ Entries: in disable duration. id: 6227 time: '2024-08-06T20:47:49.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: >- + Admin tooling: added several admin commands to help manipulate entities' + languages. + id: 6228 + time: '2024-08-06T21:22:11.0000000+00:00' From 04d01f687fb479d7f86e2df81cce6b9285dcbad6 Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Tue, 6 Aug 2024 17:51:21 -0400 Subject: [PATCH 102/143] Added Penlights (#567) # Description Added in penlights that spawn in Medical Staff PDAs. --- # TODO - [x] EyeCheck system - [x] Add in the bloody pens. ---

Media

https://github.com/user-attachments/assets/dc746aa2-782e-4d86-b9ef-9e012343fb87

--- # Changelog :cl: Tilkku - add: Added Pen Lights - add: Eye Examination --------- Signed-off-by: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Co-authored-by: VMSolidus --- .../PenLight/UI/PenLightBoundUserInterface.cs | 47 +++++++ .../Eye/PenLight/UI/PenLightWindow.xaml | 11 ++ .../Eye/PenLight/UI/PenLightWindow.xaml.cs | 78 ++++++++++++ .../EyeProtection/EyeProtectionSystem.cs | 2 +- Content.Server/Medical/PenLightSystem.cs | 118 ++++++++++++++++++ Content.Shared/Medical/PenLightComponent.cs | 33 +++++ Content.Shared/Medical/PenLightUiKey.cs | 9 ++ Content.Shared/Medical/PenLightUserMessage.cs | 24 ++++ .../en-US/medical/components/penlight.ftl | 11 ++ .../Entities/Objects/Devices/pda.yml | 54 ++++++++ .../Entities/Objects/Tools/penlight.yml | 90 +++++++++++++ .../Objects/Tools/cmopenlight.rsi/meta.json | 17 +++ .../Tools/cmopenlight.rsi/world-on.png | Bin 0 -> 4345 bytes .../Objects/Tools/cmopenlight.rsi/world.png | Bin 0 -> 4325 bytes .../Objects/Tools/penlight.rsi/meta.json | 17 +++ .../Objects/Tools/penlight.rsi/world-on.png | Bin 0 -> 253 bytes .../Objects/Tools/penlight.rsi/world.png | Bin 0 -> 234 bytes 17 files changed, 510 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs create mode 100644 Content.Client/Eye/PenLight/UI/PenLightWindow.xaml create mode 100644 Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs create mode 100644 Content.Server/Medical/PenLightSystem.cs create mode 100644 Content.Shared/Medical/PenLightComponent.cs create mode 100644 Content.Shared/Medical/PenLightUiKey.cs create mode 100644 Content.Shared/Medical/PenLightUserMessage.cs create mode 100644 Resources/Locale/en-US/medical/components/penlight.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Tools/penlight.yml create mode 100644 Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json create mode 100644 Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png create mode 100644 Resources/Textures/Objects/Tools/cmopenlight.rsi/world.png create mode 100644 Resources/Textures/Objects/Tools/penlight.rsi/meta.json create mode 100644 Resources/Textures/Objects/Tools/penlight.rsi/world-on.png create mode 100644 Resources/Textures/Objects/Tools/penlight.rsi/world.png diff --git a/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs new file mode 100644 index 00000000000..c4887531151 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightBoundUserInterface.cs @@ -0,0 +1,47 @@ +using Content.Shared.Medical; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Eye.PenLight.UI +{ + [UsedImplicitly] + public sealed class PenLightBoundUserInterface : BoundUserInterface + { + [ViewVariables] + private PenLightWindow? _window; + + public PenLightBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) { } + + protected override void Open() + { + base.Open(); + _window = new PenLightWindow + { + Title = EntMan.GetComponent(Owner).EntityName, + }; + _window.OnClose += Close; + _window.OpenCentered(); + } + + protected override void ReceiveMessage(BoundUserInterfaceMessage message) + { + if (_window == null + || message is not PenLightUserMessage cast) + return; + + _window.Diagnose(cast); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + if (_window != null) + _window.OnClose -= Close; + + _window?.Dispose(); + } + } +} diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml new file mode 100644 index 00000000000..149b8a13828 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs new file mode 100644 index 00000000000..809a569fa47 --- /dev/null +++ b/Content.Client/Eye/PenLight/UI/PenLightWindow.xaml.cs @@ -0,0 +1,78 @@ +using Content.Client.UserInterface.Controls; +using Content.Shared.Damage; +using Content.Shared.IdentityManagement; +using Content.Shared.Medical; +using Robust.Client.AutoGenerated; +using Robust.Client.UserInterface.XAML; +using System.Text; + + +namespace Content.Client.Eye.PenLight.UI +{ + [GenerateTypedNameReferences] + public sealed partial class PenLightWindow : FancyWindow + { + private readonly IEntityManager _entityManager; + private const int LightHeight = 150; + private const int LightWidth = 900; + + public PenLightWindow() + { + RobustXamlLoader.Load(this); + + var dependencies = IoCManager.Instance!; + _entityManager = dependencies.Resolve(); + } + public void Diagnose(PenLightUserMessage msg) + { + var target = _entityManager.GetEntity(msg.TargetEntity); + + if (target == null || !_entityManager.TryGetComponent(target, out var damageable)) + { + NoPatientDataText.Visible = true; + ExamDataLabel.Text = string.Empty; + return; + } + + NoPatientDataText.Visible = false; + + + string entityName = Loc.GetString("pen-light-window-entity-unknown-text"); + if (_entityManager.HasComponent(target.Value)) + entityName = Identity.Name(target.Value, _entityManager); + + var sb = new StringBuilder(); + sb.AppendLine(Loc.GetString("pen-light-window-entity-eyes-text", ("entityName", entityName))); + + // Check if Blind and return early if true + if (msg.Blind == true) + { + sb.AppendLine(Loc.GetString("pen-light-exam-blind-text")); + ExamDataLabel.Text = sb.ToString(); + SetHeight = LightHeight; + SetWidth = LightWidth; + return; + } + // EyeDamage + if (msg.EyeDamage == true) + sb.AppendLine(Loc.GetString("pen-light-exam-eyedamage-text")); + + // Drunk + if (msg.Drunk == true) + sb.AppendLine(Loc.GetString("pen-light-exam-drunk-text")); + + // Hallucinating + if (msg.SeeingRainbows == true) + sb.AppendLine(Loc.GetString("pen-light-exam-hallucinating-text")); + + // Healthy + if (msg.Healthy == true) + sb.AppendLine(Loc.GetString("pen-light-exam-healthy-text")); + + ExamDataLabel.Text = sb.ToString(); + + SetHeight = LightHeight; + SetWidth = LightWidth; + } + } +} \ No newline at end of file diff --git a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs index 2d54c03b51b..744483cfb82 100644 --- a/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs +++ b/Content.Server/Eye/Blinding/EyeProtection/EyeProtectionSystem.cs @@ -11,7 +11,7 @@ public sealed class EyeProtectionSystem : EntitySystem { [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly BlindableSystem _blindingSystem = default!; - + public override void Initialize() { base.Initialize(); diff --git a/Content.Server/Medical/PenLightSystem.cs b/Content.Server/Medical/PenLightSystem.cs new file mode 100644 index 00000000000..f48a84d0476 --- /dev/null +++ b/Content.Server/Medical/PenLightSystem.cs @@ -0,0 +1,118 @@ +using Content.Server.DoAfter; +using Content.Server.PowerCell; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Drugs; +using Content.Shared.Drunk; +using Content.Shared.Eye.Blinding.Components; +using Content.Shared.Interaction; +using Content.Shared.Medical; +using Content.Shared.Mobs.Systems; +using Content.Shared.Traits.Assorted.Components; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Medical; +/// +/// This stores the eye exam system for +/// +public sealed class PenLightSystem : EntitySystem +{ + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly PowerCellSystem _powerCell = default!; + [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnDoAfter); + } + + private void OnAfterInteract(EntityUid uid, PenLightComponent component, AfterInteractEvent args) + { + if (args.Handled + || args.Target is not { } target) + return; + + args.Handled = TryStartExam(uid, target, args.User, component); + } + + private void OnDoAfter(Entity uid, ref PenLightDoAfterEvent args) + { + if (args.Handled + || args.Cancelled + || args.Target == null + || !_powerCell.HasDrawCharge(uid, user: args.User)) + return; + + OpenUserInterface(args.User, uid); + Diagnose(uid, args.Target.Value); + args.Handled = true; + } + + + /// + /// Actually handles the exam interaction. + /// + public bool TryStartExam(EntityUid uid, EntityUid target, EntityUid user, PenLightComponent? component = null) + { + if (!Resolve(uid, ref component)) + return false; + + return _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ExamSpeed, new PenLightDoAfterEvent(), + uid, target, uid) + { + BlockDuplicate = true, + BreakOnUserMove = true, + BreakOnTargetMove = true, + BreakOnHandChange = true, + NeedHand = true + }); + } + private void OpenUserInterface(EntityUid user, EntityUid penlight) + { + if (!TryComp(user, out var actor) + || !_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui)) + return; + + _uiSystem.OpenUi(ui, actor.PlayerSession); + } + + /// + /// Runs the checks for the different types of eye damage + /// + private void Diagnose(EntityUid penlight, EntityUid target) + { + if (!_uiSystem.TryGetUi(penlight, PenLightUiKey.Key, out var ui) + || !HasComp(target)) + return; + // Blind + var blind = _entityManager.HasComponent(target); + + // Drunk + var drunk = _entityManager.HasComponent(target); + + // EyeDamage + var eyeDamage = false; + if (TryComp(target, out var eyeDam)) + { + eyeDamage = eyeDam.EyeDamage > 0 && eyeDam.EyeDamage < 6; //6 means perma-blind + } + + // Hallucinating + var seeingRainbows = _entityManager.HasComponent(target); + + // Healthy + var healthy = !(blind || drunk || eyeDamage || seeingRainbows); + + _uiSystem.SendUiMessage(ui, new PenLightUserMessage(GetNetEntity(target), + blind, + drunk, + eyeDamage, + healthy, + seeingRainbows + )); + } +} diff --git a/Content.Shared/Medical/PenLightComponent.cs b/Content.Shared/Medical/PenLightComponent.cs new file mode 100644 index 00000000000..50dacae3dc8 --- /dev/null +++ b/Content.Shared/Medical/PenLightComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.DoAfter; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; +namespace Content.Shared.Medical; + +/// +/// This for penlights; a tool used to check for eye damage. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentPause] +public sealed partial class PenLightComponent : Component +{ + /// + /// Cooldown Time, exams take a bit + /// + [AutoPausedField] + public TimeSpan? NextExamTime; + + /// + /// The min time between exams + /// + [DataField] + public TimeSpan ExamDelay = TimeSpan.FromSeconds(3); + + /// + /// How long the doafter for the exam takes + /// + [DataField(required: true)] + public float ExamSpeed { get; set; } + +} + +[Serializable, NetSerializable] +public sealed partial class PenLightDoAfterEvent : SimpleDoAfterEvent { } \ No newline at end of file diff --git a/Content.Shared/Medical/PenLightUiKey.cs b/Content.Shared/Medical/PenLightUiKey.cs new file mode 100644 index 00000000000..52fc6ce3401 --- /dev/null +++ b/Content.Shared/Medical/PenLightUiKey.cs @@ -0,0 +1,9 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; + +[Serializable, NetSerializable] +public enum PenLightUiKey : byte +{ + Key +} diff --git a/Content.Shared/Medical/PenLightUserMessage.cs b/Content.Shared/Medical/PenLightUserMessage.cs new file mode 100644 index 00000000000..42502b2171b --- /dev/null +++ b/Content.Shared/Medical/PenLightUserMessage.cs @@ -0,0 +1,24 @@ +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical; +[Serializable, NetSerializable] +public sealed class PenLightUserMessage : BoundUserInterfaceMessage +{ + public readonly NetEntity? TargetEntity; + public bool? Blind; + public bool? Drunk; + public bool? EyeDamage; + public bool? Healthy; + public bool? SeeingRainbows; + + public PenLightUserMessage(NetEntity? targetEntity, bool? blind, bool? drunk, bool? eyeDamage, bool? healthy, bool? seeingRainbows) + { + TargetEntity = targetEntity; + Blind = blind; + Drunk = drunk; + EyeDamage = eyeDamage; + Healthy = healthy; + SeeingRainbows = seeingRainbows; + } +} + diff --git a/Resources/Locale/en-US/medical/components/penlight.ftl b/Resources/Locale/en-US/medical/components/penlight.ftl new file mode 100644 index 00000000000..f0639ad7381 --- /dev/null +++ b/Resources/Locale/en-US/medical/components/penlight.ftl @@ -0,0 +1,11 @@ +penlight-off = The pen light is off. +pen-light-exam-title = Pen Light +pen-light-window-entity-eyes-text = {$entityName}'s conditions: +pen-light-window-no-patient-data-text = No patient data. +pen-light-window-entity-unknown-text = unknown + +pen-light-exam-blind-text = The patient's eyes are glassy and unfocused. They can't follow the light at all. +pen-light-exam-drunk-text = The patient's eyes are slow to follow the light, droopy. +pen-light-exam-eyedamage-text = The patient's eyes are partially focused, though they struggle to look at the light for too long. +pen-light-exam-hallucinating-text = The patient's eyes are wandering around, with dilated pupils. They don't focus on the light. +pen-light-exam-healthy-text = The patient follows the light perfectly with no stuttering. \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 0f68afefe69..2c28f60da58 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -151,6 +151,12 @@ - type: Pda id: MedicalInternIDCard state: pda-internmed + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#717059" accentVColor: "#447987" @@ -534,6 +540,12 @@ - type: Pda id: CMOIDCard state: pda-cmo + penSlot: # Fancy Pen Light + startingItem: CMOPenLight + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -550,6 +562,12 @@ - type: Pda id: MedicalIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -568,6 +586,12 @@ - type: Pda id: ParamedicIDCard state: pda-paramedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#2a4b5b" @@ -583,6 +607,12 @@ - type: Pda id: ChemistIDCard state: pda-chemistry + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#B34200" @@ -917,6 +947,12 @@ - type: Pda id: PsychologistIDCard state: pda-medical + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentVColor: "#447987" @@ -1002,6 +1038,12 @@ - type: Pda id: BrigmedicIDCard state: pda-brigmedic + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#A32D26" accentHColor: "#d7d7d0" @@ -1079,6 +1121,12 @@ - type: Pda id: SeniorPhysicianIDCard state: pda-seniorphysician + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#d7d7d0" accentHColor: "#447987" @@ -1129,6 +1177,12 @@ - type: Pda id: SyndicateIDCard state: pda-syndi-agent + penSlot: # Pen Lights + startingItem: PenLightBase + priority: -1 + whitelist: + tags: + - Write - type: PdaBorderColor borderColor: "#891417" - type: Icon diff --git a/Resources/Prototypes/Entities/Objects/Tools/penlight.yml b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml new file mode 100644 index 00000000000..7f8a9b262c0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Tools/penlight.yml @@ -0,0 +1,90 @@ +- type: entity + name: Pen Light + parent: Pen + id: PenLightBase + description: A pen-sized light, used by medical staff. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/penlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/penlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 3 #time in seconds + - type: Appearance + - type: UserInterface + interfaces: + - key: enum.PenLightUiKey.Key + type: PenLightBoundUserInterface + - type: ToggleableLightVisuals + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot {} + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen + +- type: entity + name: Chief Medical Officer's Pen Light + parent: PenLightBase + id: CMOPenLight + description: A pen-sized light, this one belonging to the Chief Medical Officer. When you get promoted you get a better pen. + components: + - type: HandheldLight + addPrefix: false + - type: Sprite + sprite: Objects/Tools/cmopenlight.rsi + layers: + - state: world + - state: world-on + shader: unshaded + visible: false + map: [ "light" ] + - type: Item + sprite: Objects/Tools/cmopenlight.rsi + heldPrefix: off + - type: PointLight + enabled: false + mask: /Textures/Effects/LightMasks/cone.png + autoRot: true + radius: 2 + netsync: false + - type: PenLight + examSpeed: 1.5 #time in seconds + - type: Appearance + - type: ToggleableLightVisuals + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellSmall + - type: Tag + tags: + - Flashlight + - Write + - Pen diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json new file mode 100644 index 00000000000..8f4b8ba253f --- /dev/null +++ b/Resources/Textures/Objects/Tools/cmopenlight.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "MistakeNot4892, https://github.com/NebulaSS13/Nebula/blob/dev/icons/obj/lighting/penlight.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "world" + }, + { + "name": "world-on" + } + ] +} diff --git a/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png b/Resources/Textures/Objects/Tools/cmopenlight.rsi/world-on.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd87cad2035e7c2b6594b9c55a43c83c01d4fcc GIT binary patch literal 4345 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Tools/penlight.rsi/world.png b/Resources/Textures/Objects/Tools/penlight.rsi/world.png new file mode 100644 index 0000000000000000000000000000000000000000..4cf616bf959f0b7b8905868edf5cdb484cb863b5 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5C^*N{ z#WAE}&fBX8c^edXSOa|K9C;YSXuiRx*JR<5f=x>sXZ(qq()`n3vy{J^8>pV)L41Su zu`}UbnX~yS+CT3Vclyd|VKRM{xA>9thCMsiq_Vz5j0Rj>jF-*<-@ zeTmsegyx;!rmfae$yf39$OVO0)rXoS=C#;1d0!URTO1)UE&c94)>?lbc8(;?10eS^ ZFz`# Date: Tue, 6 Aug 2024 21:51:47 +0000 Subject: [PATCH 103/143] Automatic Changelog Update (#567) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e3de08a18b0..b3218a908e1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5025,3 +5025,11 @@ Entries: languages. id: 6228 time: '2024-08-06T21:22:11.0000000+00:00' +- author: Tilkku + changes: + - type: Add + message: Added Pen Lights + - type: Add + message: Eye Examination + id: 6229 + time: '2024-08-06T21:51:21.0000000+00:00' From 8768df79121f3ccead72d97cba143cec49c9a369 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 7 Aug 2024 06:03:35 +0800 Subject: [PATCH 104/143] Unique Glove Fibers (#642) # Description Cherry-picked from Delta-V, originally by @WarMechanic (https://github.com/DeltaV-Station/Delta-v/pull/1455). Original Description: > Every pair of gloves now has its own fingerprint, so items can be traced back to gloves which can then be traced back to people. > > ## Why / Balance > > Evidence is very important to court cases running smoothly, so detectives now have more evidence that can certify whether or not John Syndicate's behaviour is valid. Traitors are now encouraged to either clean evidence off syndicate gear regardless of glove status, or use a disposable pair of gloves specifically for handling syndicate gear to be disposed of later. > > Aside from being required to obfuscate evidence you leave behind, there is now a value proposition to searching glove prints of departments. Wearing gloves that does not correspond your department can punish an unknowing detective into searching the wrong people. > > ## Technical details > > `FiberComponent.cs` now stores a Fiberprint variable like `FingerprintComponent.cs`. The code for assigning a fiberprint is the same as the fingerprint. When evidence is placed on an object, the fiberprint is concatenated to its localised fiber type.

Original Media

> hm ok we have these specific gloves on an akms >
> > > > hm well we found the gloves and they have fingerprints >
> > > > gotem >
> >

# Changelog :cl: WarMechanic - add: Gloves now have unique fingerprints. Items can be traced back to gloves, which can then be traced back to people. --------- Signed-off-by: Angelo Fallaria Co-authored-by: WarMechanic <69510347+WarMechanic@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: VMSolidus --- .../Forensics/Components/FiberComponent.cs | 3 +++ .../Forensics/Systems/ForensicsSystem.cs | 17 ++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/Content.Server/Forensics/Components/FiberComponent.cs b/Content.Server/Forensics/Components/FiberComponent.cs index 2086c958702..4cbb1e7be7f 100644 --- a/Content.Server/Forensics/Components/FiberComponent.cs +++ b/Content.Server/Forensics/Components/FiberComponent.cs @@ -12,5 +12,8 @@ public sealed partial class FiberComponent : Component [DataField] public string? FiberColor; + + [DataField] + public string? Fiberprint; } } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a081429fd3a..1663c20fedb 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -23,6 +23,7 @@ public sealed class ForensicsSystem : EntitySystem public override void Initialize() { SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnFiberInit); SubscribeLocalEvent(OnFingerprintInit); SubscribeLocalEvent(OnDNAInit); @@ -39,6 +40,11 @@ private void OnInteract(EntityUid uid, FingerprintComponent component, ContactIn ApplyEvidence(uid, args.Other); } + private void OnFiberInit(EntityUid uid, FiberComponent component, MapInitEvent args) + { + component.Fiberprint = GenerateFingerprint(length: 7); + } + private void OnFingerprintInit(EntityUid uid, FingerprintComponent component, MapInitEvent args) { component.Fingerprint = GenerateFingerprint(); @@ -150,9 +156,9 @@ private void OnCleanForensicsDoAfter(EntityUid uid, ForensicsComponent component targetComp.Residues.Add(string.IsNullOrEmpty(residue.ResidueColor) ? Loc.GetString("forensic-residue", ("adjective", residue.ResidueAdjective)) : Loc.GetString("forensic-residue-colored", ("color", residue.ResidueColor), ("adjective", residue.ResidueAdjective))); } - public string GenerateFingerprint() + public string GenerateFingerprint(int length = 16) { - var fingerprint = new byte[16]; + var fingerprint = new byte[Math.Clamp(length, 0, 255)]; _random.NextBytes(fingerprint); return Convert.ToHexString(fingerprint); } @@ -179,7 +185,12 @@ private void ApplyEvidence(EntityUid user, EntityUid target) if (_inventory.TryGetSlotEntity(user, "gloves", out var gloves)) { if (TryComp(gloves, out var fiber) && !string.IsNullOrEmpty(fiber.FiberMaterial)) - component.Fibers.Add(string.IsNullOrEmpty(fiber.FiberColor) ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial))); + { + var fiberLocale = string.IsNullOrEmpty(fiber.FiberColor) + ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) + : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial)); + component.Fibers.Add(fiberLocale + " ; " + fiber.Fiberprint); + } if (HasComp(gloves)) return; From 24a5f9201d906ee52b8a4da4c6e324cd2e64438e Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Tue, 6 Aug 2024 22:03:58 +0000 Subject: [PATCH 105/143] Automatic Changelog Update (#642) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b3218a908e1..742c9222745 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5033,3 +5033,11 @@ Entries: message: Eye Examination id: 6229 time: '2024-08-06T21:51:21.0000000+00:00' +- author: WarMechanic + changes: + - type: Add + message: >- + Gloves now have unique fingerprints. Items can be traced back to gloves, + which can then be traced back to people. + id: 6230 + time: '2024-08-06T22:03:36.0000000+00:00' From bd11307c54e0ed383246c81fec65a9d8dba1309f Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Tue, 6 Aug 2024 18:04:15 -0400 Subject: [PATCH 106/143] Alphabetized physical-desc.ftl (Fr This Time) (#648) # Description alphabetized physical-desc.ftl because it annoyed me --- .../en-US/reagents/meta/physical-desc.ftl | 170 +++++++++--------- 1 file changed, 85 insertions(+), 85 deletions(-) diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl index 50ea5f590c7..064b21eaa9c 100644 --- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl +++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl @@ -1,101 +1,101 @@ -reagent-physical-desc-skunky = skunky -reagent-physical-desc-soapy = soapy -reagent-physical-desc-ferrous = ferrous -reagent-physical-desc-nothing = nothing +reagent-physical-desc-abrasive = abrasive +reagent-physical-desc-acidic = acidic reagent-physical-desc-acrid = acrid -reagent-physical-desc-thick-and-grainy = thick and grainy -reagent-physical-desc-necrotic = necrotic -reagent-physical-desc-oily = oily -reagent-physical-desc-glowing = glowing -reagent-physical-desc-heterogeneous = heterogeneous -reagent-physical-desc-mucus-like = mucus-like -reagent-physical-desc-cold = cold +reagent-physical-desc-alkaline = alkaline +reagent-physical-desc-aromatic = aromatic reagent-physical-desc-bee-guts = bee guts -reagent-physical-desc-tangy = tangy -reagent-physical-desc-fizzy = fizzy -reagent-physical-desc-fuzzy = fuzzy -reagent-physical-desc-spicy = spicy -reagent-physical-desc-abrasive = abrasive -reagent-physical-desc-chalky = chalky -reagent-physical-desc-roaring = roaring -reagent-physical-desc-robust = robust -reagent-physical-desc-sickly = sickly -reagent-physical-desc-murky = murky -reagent-physical-desc-bubbling = bubbling -reagent-physical-desc-wormy = wormy -reagent-physical-desc-frosty = frosty reagent-physical-desc-blazing = blazing -reagent-physical-desc-translucent = translucent -reagent-physical-desc-sugary = sugary -reagent-physical-desc-putrid = putrid -reagent-physical-desc-saucey = saucey -reagent-physical-desc-salty = salty -reagent-physical-desc-milky = milky -reagent-physical-desc-refreshing = refreshing -reagent-physical-desc-soothing = soothing -reagent-physical-desc-starchy = starchy -reagent-physical-desc-starry = starry -reagent-physical-desc-tart = tart -reagent-physical-desc-aromatic = aromatic -reagent-physical-desc-thick = thick -reagent-physical-desc-syrupy = syrupy -reagent-physical-desc-grainy = grainy -reagent-physical-desc-foamy = foamy -reagent-physical-desc-tropical = tropical +reagent-physical-desc-bubbling = bubbling +reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-burning = burning +reagent-physical-desc-buzzy = buzzy +reagent-physical-desc-chalky = chalky +reagent-physical-desc-chewy = chewy +reagent-physical-desc-citric = citric +reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-clumpy = clumpy reagent-physical-desc-coarse = coarse -reagent-physical-desc-opaque = opaque -reagent-physical-desc-pulpy = pulpy -reagent-physical-desc-reasonably-metallic = reasonably metallic -reagent-physical-desc-metallic = metallic -reagent-physical-desc-gaseous = gaseous -reagent-physical-desc-ground-brass = ground brass -reagent-physical-desc-dark-brown = dark brown +reagent-physical-desc-cold = cold +reagent-physical-desc-creamy = creamy +reagent-physical-desc-crisp = crisp reagent-physical-desc-crystalline = crystalline -reagent-physical-desc-viscous = viscous -reagent-physical-desc-shiny = shiny +reagent-physical-desc-dark-brown = dark brown reagent-physical-desc-dark-red = dark-red +reagent-physical-desc-electric = electric +reagent-physical-desc-energizing = energizing +reagent-physical-desc-enigmatic = enigmatic +reagent-physical-desc-ethereal = ethereal +reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-exotic-smelling = exotic smelling +reagent-physical-desc-ferrous = ferrous +reagent-physical-desc-fibrous = fibrous +reagent-physical-desc-fizzy = fizzy +reagent-physical-desc-fizzy-and-creamy = fizzy and creamy +reagent-physical-desc-fluffy = fluffy +reagent-physical-desc-foamy = foamy +reagent-physical-desc-frosty = frosty +reagent-physical-desc-funny = funny +reagent-physical-desc-fuzzy = fuzzy +reagent-physical-desc-gaseous = gaseous +reagent-physical-desc-glittery = glittery +reagent-physical-desc-gloopy = gloopy +reagent-physical-desc-glowing = glowing +reagent-physical-desc-grainy = grainy +reagent-physical-desc-ground-brass = ground brass +reagent-physical-desc-heterogeneous = heterogeneous +reagent-physical-desc-holy = holy +reagent-physical-desc-inky = inky reagent-physical-desc-ionizing = ionizing +reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-metallic = metallic +reagent-physical-desc-milky = milky +reagent-physical-desc-mucus-like = mucus-like +reagent-physical-desc-murky = murky +reagent-physical-desc-necrotic = necrotic +reagent-physical-desc-neural = neural reagent-physical-desc-nondescript = nondescript -reagent-physical-desc-burning = burning +reagent-physical-desc-nothing = nothing +reagent-physical-desc-odorless = odorless +reagent-physical-desc-oily = oily +reagent-physical-desc-opaque = opaque +reagent-physical-desc-overpowering = overpowering reagent-physical-desc-porous = porous reagent-physical-desc-powdery = powdery -reagent-physical-desc-creamy = creamy -reagent-physical-desc-sticky = sticky -reagent-physical-desc-bubbly = bubbly +reagent-physical-desc-pulpy = pulpy +reagent-physical-desc-pungent = pungent +reagent-physical-desc-putrid = putrid +reagent-physical-desc-reasonably-metallic = reasonably metallic +reagent-physical-desc-reflective = reflective +reagent-physical-desc-refreshing = refreshing +reagent-physical-desc-roaring = roaring +reagent-physical-desc-robust = robust reagent-physical-desc-rocky = rocky -reagent-physical-desc-lemony-fresh = lemony fresh +reagent-physical-desc-salty = salty +reagent-physical-desc-saucey = saucey +reagent-physical-desc-shiny = shiny +reagent-physical-desc-sickly = sickly +reagent-physical-desc-skunky = skunky +reagent-physical-desc-slimy = slimy reagent-physical-desc-soapy = soapy -reagent-physical-desc-crisp = crisp -reagent-physical-desc-citric = citric -reagent-physical-desc-acidic = acidic -reagent-physical-desc-buzzy = buzzy -reagent-physical-desc-fibrous = fibrous -reagent-physical-desc-strong-smelling = strong smelling -reagent-physical-desc-fizzy-and-creamy = fizzy and creamy -reagent-physical-desc-overpowering = overpowering +reagent-physical-desc-soapy = soapy +reagent-physical-desc-soothing = soothing reagent-physical-desc-sour = sour -reagent-physical-desc-pungent = pungent -reagent-physical-desc-clumpy = clumpy +reagent-physical-desc-spicy = spicy +reagent-physical-desc-starchy = starchy +reagent-physical-desc-starry = starry +reagent-physical-desc-sticky = sticky +reagent-physical-desc-strong-smelling = strong smelling reagent-physical-desc-strong-smelling = strong-smelling -reagent-physical-desc-odorless = odorless -reagent-physical-desc-gloopy = gloopy -reagent-physical-desc-cloudy = cloudy +reagent-physical-desc-sugary = sugary reagent-physical-desc-sweet = sweet -reagent-physical-desc-electric = electric -reagent-physical-desc-chewy = chewy -reagent-physical-desc-volatile = volatile -reagent-physical-desc-inky = inky -reagent-physical-desc-enigmatic = enigmatic -reagent-physical-desc-exotic-smelling = exotic smelling -reagent-physical-desc-ethereal = ethereal -reagent-physical-desc-glittery = glittery -reagent-physical-desc-energizing = energizing -reagent-physical-desc-exhilarating = exhilarating +reagent-physical-desc-syrupy = syrupy +reagent-physical-desc-tangy = tangy +reagent-physical-desc-tart = tart +reagent-physical-desc-thick = thick +reagent-physical-desc-thick-and-grainy = thick and grainy +reagent-physical-desc-translucent = translucent +reagent-physical-desc-tropical = tropical reagent-physical-desc-vibrant = vibrant -reagent-physical-desc-fluffy = fluffy -reagent-physical-desc-funny = funny -reagent-physical-desc-alkaline = alkaline -reagent-physical-desc-reflective = reflective -reagent-physical-desc-holy = holy -reagent-physical-desc-slimy = slimy -reagent-physical-desc-neural = neural +reagent-physical-desc-viscous = viscous +reagent-physical-desc-volatile = volatile +reagent-physical-desc-wormy = wormy From ab2947b1ff5ba7ef8f60609454897616f8f13f55 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Wed, 7 Aug 2024 14:07:35 +0800 Subject: [PATCH 107/143] Fix No Blood Regeneration (#689) # Description Being a little too clever with omitting braces in complicated if statement chains in #686 caused blood regeneration for entities without Blood Deficiency to stop working altogether. I added some braces and now blood regeneration works again. I also added `DataField` to `HasBloodDeficiency` because I forgot to add that. # Changelog :cl: Skubman - fix: Passive blood regeneration now works again. --- Content.Server/Body/Components/BloodstreamComponent.cs | 1 + Content.Server/Body/Systems/BloodstreamSystem.cs | 9 ++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 7a4af3e4cc1..76eadb99fd8 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -177,6 +177,7 @@ public sealed partial class BloodstreamComponent : Component /// If this is true, the entity will not passively regenerate blood, /// and instead will slowly lose blood. ///
+ [DataField] public bool HasBloodDeficiency = false; /// diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index fafc649eb29..b37ac5efeb4 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -120,12 +120,15 @@ public override void Update(float frameTime) // Removes blood for Blood Deficiency constantly. if (bloodstream.HasBloodDeficiency) + { if (!_mobStateSystem.IsDead(uid)) RemoveBlood(uid, bloodstream.BloodDeficiencyLossAmount, bloodstream); + } // Adds blood to their blood level if it is below the maximum. - else if (bloodSolution.Volume < bloodSolution.MaxVolume) - if (!_mobStateSystem.IsDead(uid)) - TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); + else if (bloodSolution.Volume < bloodSolution.MaxVolume && !_mobStateSystem.IsDead(uid)) + { + TryModifyBloodLevel(uid, bloodstream.BloodRefreshAmount, bloodstream); + } // Removes blood from the bloodstream based on bleed amount (bleed rate) // as well as stop their bleeding to a certain extent. From cf310f302c2add2eb0fe25cc59d7807483049285 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 06:08:10 +0000 Subject: [PATCH 108/143] Automatic Changelog Update (#689) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 742c9222745..73e90b2faf9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5041,3 +5041,9 @@ Entries: which can then be traced back to people. id: 6230 time: '2024-08-06T22:03:36.0000000+00:00' +- author: Skubman + changes: + - type: Fix + message: Passive blood regeneration now works again. + id: 6231 + time: '2024-08-07T06:07:35.0000000+00:00' From 69946f87ce695bd0f1378a6705678845608b3a32 Mon Sep 17 00:00:00 2001 From: Fansana <116083121+Fansana@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:31:55 +0200 Subject: [PATCH 109/143] Fix BarotraumaSystem (#694) # Description This PR fixes an issue with the BarotraumaSystem which would constantly report high pressure damage, even when no such damage was applied. --- - [x] Tested High pressure damage correctly reported - [x] Tested Low pressure damage correctly reported - [x] Tested No pressure damage correctly reported --- # Changelog :cl: - fix: Barotrauma admin log spam --- .../Atmos/EntitySystems/BarotraumaSystem.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index d55ef355f02..948373940e4 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -247,7 +247,11 @@ public override void Update(float frameTime) var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); - + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); + } _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); } else @@ -258,11 +262,6 @@ public override void Update(float frameTime) barotrauma.TakingDamage = false; _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); } - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); - } // Set correct alert. switch (pressure) { From 1b2c946240b1ce5b229bc67ae5a1019d1f983f01 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 17:32:22 +0000 Subject: [PATCH 110/143] Automatic Changelog Update (#694) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 73e90b2faf9..5aca84c9f32 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5047,3 +5047,9 @@ Entries: message: Passive blood regeneration now works again. id: 6231 time: '2024-08-07T06:07:35.0000000+00:00' +- author: Fansana + changes: + - type: Fix + message: Barotrauma admin log spam + id: 6232 + time: '2024-08-07T17:31:55.0000000+00:00' From a0f3f31a747268dea5f82db49089314ebe826a89 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Thu, 8 Aug 2024 01:38:04 +0300 Subject: [PATCH 111/143] Butlergone (Cherry-Pick From Delta-V) (#678) # Description Cherry-picks https://github.com/DeltaV-Station/Delta-v/pull/1100 and https://github.com/DeltaV-Station/Delta-v/pull/1222. Makes butlertron anchorable, pullable, and destructible, and disables logging of butlertron's messages. Credit to adeinitas and NullWanderer. # Note This was cherry-picked without testing, someone needs to test it first. # Changelog :cl: - add: Mr. Butlertron can now suffer for its crimes. --------- Signed-off-by: Null <56081759+NullWanderer@users.noreply.github.com> Co-authored-by: Adeinitas <147965189+adeinitas@users.noreply.github.com> Co-authored-by: Null <56081759+NullWanderer@users.noreply.github.com> --- .../DeltaV/NPC/Roboisseur/RoboisseurSystem.cs | 4 ++-- Resources/Prototypes/DeltaV/NPC/roboisseur.yml | 10 ++++++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs index b4e99e6199d..ee1c4582239 100644 --- a/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs +++ b/Content.Server/DeltaV/NPC/Roboisseur/RoboisseurSystem.cs @@ -58,7 +58,7 @@ public override void Update(float frameTime) } else if (CheckTier(roboisseur.DesiredPrototype.ID, roboisseur) > 2) message = Loc.GetString(_random.Pick(roboisseur.DemandMessagesTier2), ("item", roboisseur.DesiredPrototype.Name)); - _chat.TrySendInGameICMessage(roboisseur.Owner, message, InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(roboisseur.Owner, message, InGameICChatType.Speak, true); } if (roboisseur.Accumulator >= roboisseur.ResetTime.TotalSeconds) @@ -100,7 +100,7 @@ private void OnInteractHand(EntityUid uid, RoboisseurComponent component, Intera if (CheckTier(component.DesiredPrototype.ID, component) > 1) message = Loc.GetString(_random.Pick(component.DemandMessagesTier2), ("item", component.DesiredPrototype.Name)); - _chat.TrySendInGameICMessage(component.Owner, message, InGameICChatType.Speak, false); + _chat.TrySendInGameICMessage(component.Owner, message, InGameICChatType.Speak, true); } private void OnInteractUsing(EntityUid uid, RoboisseurComponent component, InteractUsingEvent args) diff --git a/Resources/Prototypes/DeltaV/NPC/roboisseur.yml b/Resources/Prototypes/DeltaV/NPC/roboisseur.yml index 2c0b3aee8a0..e7f0b5bcd09 100644 --- a/Resources/Prototypes/DeltaV/NPC/roboisseur.yml +++ b/Resources/Prototypes/DeltaV/NPC/roboisseur.yml @@ -4,12 +4,22 @@ name: Mr. Butlertron description: It asks for food to deliver to exotic customers across the cosmos. Powered by the latest technology in bluespace food delivery. components: + - type: Anchorable + - type: Pullable - type: Sprite noRot: true drawdepth: Mobs sprite: DeltaV/Structures/Machines/roboisseur.rsi layers: - state: roboisseur-1 + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 1000 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] - type: Roboisseur - type: Speech speechSounds: Pai From 732b8e87c5236798edc1bf34937ca217a121cdf6 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 22:38:28 +0000 Subject: [PATCH 112/143] Automatic Changelog Update (#678) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5aca84c9f32..fb3fd2c343c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5053,3 +5053,9 @@ Entries: message: Barotrauma admin log spam id: 6232 time: '2024-08-07T17:31:55.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Add + message: Mr. Butlertron can now suffer for its crimes. + id: 6233 + time: '2024-08-07T22:38:04.0000000+00:00' From 2a6790ba9d703ecc825d59475187f70b96f031b1 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 19:11:41 -0400 Subject: [PATCH 113/143] White Dream Harpy Markings (#696) # Description ONIKS was kind enough to provide me with several new Harpy markings, consisting of alternate Bat-wings, Haven Tail, Long Forked Tail, and Swallow Tail. I have also taken the liberty of actually making a basic set of "Bionic Wings", which are just a slightly edited version of the "harpsuit" wing sleeve, including hardsuit lights. Unfortunately due to limitations in the game's code concerning markings, I couldn't make the lights use the unshaded shader. This limitation irritates me. I'll probably fix that in a separate PR. I actually also received a pack of Arachnid and Felinid sprites! But I'm going to add those in a different PR entirely.

Media

Bionic wings ![image](https://github.com/user-attachments/assets/6acc64a9-be6b-435b-9c61-91287ef65c10) Bat Wings ![image](https://github.com/user-attachments/assets/e44fe12e-8410-47ca-a4c1-5e644fd36b8a) Haven tail ![image](https://github.com/user-attachments/assets/2adadcdd-04fc-458d-8491-61bd52a3b4d1) Swallow tail ![image](https://github.com/user-attachments/assets/615391eb-0314-4e6d-a87b-101d0a307955) Long Forked Tail ![image](https://github.com/user-attachments/assets/e3d672f7-b8cb-4497-a2a3-87d0c224847d)

# Changelog :cl: - add: The following new markings have been added for Harpies: Bat Wings, Simple Bionic Wings, Haven Tail, Swallow tail, and Long Forked Tail --- Resources/Locale/en-US/markings/harpy.ftl | 18 +++++ .../Mobs/Customization/Markings/harpy.yml | 73 ++++++++++++++++++ .../Harpy/harpy_tails.rsi/forked_long.png | Bin 0 -> 1245 bytes .../Harpy/harpy_tails.rsi/haven_tone_1.png | Bin 0 -> 853 bytes .../Harpy/harpy_tails.rsi/haven_tone_2.png | Bin 0 -> 630 bytes .../Harpy/harpy_tails.rsi/meta.json | 18 ++++- .../Harpy/harpy_tails.rsi/swallow_tail.png | Bin 0 -> 1092 bytes .../harpy_wings.rsi/bat_wings_tone_1.png | Bin 0 -> 1581 bytes .../harpy_wings.rsi/bat_wings_tone_2.png | Bin 0 -> 1753 bytes .../harpy_wings.rsi/bionic_wings_tone_1.png | Bin 0 -> 1448 bytes .../harpy_wings.rsi/bionic_wings_tone_2.png | Bin 0 -> 329 bytes .../Harpy/harpy_wings.rsi/meta.json | 18 ++++- 12 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png create mode 100644 Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_2.png diff --git a/Resources/Locale/en-US/markings/harpy.ftl b/Resources/Locale/en-US/markings/harpy.ftl index 6d6ba75a936..724207c3ef8 100644 --- a/Resources/Locale/en-US/markings/harpy.ftl +++ b/Resources/Locale/en-US/markings/harpy.ftl @@ -40,6 +40,14 @@ marking-HarpyWingTipsClassic = Classic Wings with Feather Tips marking-HarpyWingTipsClassic-harpy_wingtip_1 = Main marking-HarpyWingTipsClassic-harpy_wingtip_2 = Feathertips +marking-HarpyWingBat = Bat Wings (Whitescale) +marking-HarpyWingBat-bat_wings_tone_1 = Limbs +marking-HarpyWingBat-bat_wings_tone_2 = Membrane + +marking-HarpyWingBionic = Simple Bionic Wings (Whitescale) +marking-HarpyWingBionic-bionic_wings_tone_1 = Wings +marking-HarpyWingBionic-bionic_wings_tone_2 = Lights (Unshaded) + marking-HarpyEarsDefault = Feather Tufts marking-HarpyEarsDefault-harpy_ears_default = Tufts @@ -65,6 +73,16 @@ marking-HarpyTailPeacock = Peacock Tail marking-HarpyTailPeacock-peacock_tail_feathers = Feathers marking-HarpyTailPeacock-peacock_tail_eyes = Eyes +marking-HarpyTailHaven = Haven Tail (Whitescale) +marking-HarpyTailHaven-haven_tone_1 = Outer Feathers +marking-HarpyTailHaven-haven_tone_2 = Inner Feathers + +marking-HarpyTailForkedLong = Long Forked Tail (Whitescale) +marking-HarpyTailForkedLong-forked_long = Tail + +marking-HarpyTailSwallow = Swallow Tail (Whitescale) +marking-HarpyTailForkedLong-forked_long = Tail + marking-HarpyChestDefault = Wing & Groin Under-Clothes marking-HarpyChestDefault-upper = Wing Under-Clothes marking-HarpyChestDefault-lower = Groin Under-Clothes diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml index 697781be939..2629d836516 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/harpy.yml @@ -253,6 +253,56 @@ - sprite: Mobs/Customization/Harpy/harpy_tails48x48.rsi state: peacock_tail_eyes +- type: marking + id: HarpyTailHaven + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: haven_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: haven_tone_2 + +- type: marking + id: HarpyTailForkedLong + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: forked_long + +- type: marking + id: HarpyTailSwallow + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + coloring: + default: + type: + !type:CategoryColoring + category: Hair + fallbackTypes: + - !type:SimpleColoring + sprites: + - sprite: Mobs/Customization/Harpy/harpy_tails.rsi + state: swallow_tail + - type: marking id: HarpyWing2ToneClassic bodyPart: RArm @@ -310,6 +360,29 @@ - sprite: Mobs/Customization/Harpy/harpy_wings.rsi state: harpy_wingtip_2 +- type: marking + id: HarpyWingBat + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bat_wings_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bat_wings_tone_2 + +- type: marking + id: HarpyWingBionic + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bionic_wings_tone_1 + - sprite: Mobs/Customization/Harpy/harpy_wings.rsi + state: bionic_wings_tone_2 + shader: unshaded + - type: marking id: HarpyChestDefault bodyPart: Chest diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/forked_long.png new file mode 100644 index 0000000000000000000000000000000000000000..280768b40af24643cf1eea7660bf0cfd1d5ebe05 GIT binary patch literal 1245 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU@Xscb`J1#c2)=|%1_J8No8Qr zI6rmbUTB$tEso0N_(!E$G%Bb%MPBO^qIGAdd_m8&3k6AS^4C)#pPp*5~QCP7M-|odeP1P zJ)R2bdTKM-C7lZ0VdtWtbT=@EASH5yXKKqK$*zd1Tlx81q_%67^Ao`!ubCbW0 zdv9HGVs|JIw%DDMIWzV_4Yx$ahLGsB-f?d2%NW-$cgUA|v72#MxYXvXd5@pSdE|cR zT-Ug_Het$t_VE3TiaRqTx9~hn0mcMpfk$L90|U1p2s75F#7|^kVCM03aSW-5dpj#} z)h!2+*2#;a1rG9VvC;YTZNU!qiMv=7cX0+5aEcZ3FVg_+xP2hT-NPRKk%NvoBe6g&#c*j`_*mU$_YHx6S{J{#_s#qf17uzOBC4X&W~d{ z{P4r;?@_+4l2wuh{|hV>PMwI?kQ3ozO=XIjwRFM>hT308Cz>@{{J48G>7wQQ^XKaJ zhabB5Yo2&czL~V8QY_y_HiJeJwk4hp@p@H?=vzVG|(xsrFeI~oeC zV{5sX@uWSy;dy2F?+-V2%zt_2zwU>uqOU4HxYjTV^&XW{xEMizp<0+Luzv0Py=Tup z@(#7VzT=P3d4|8Swbwi+XDcy3(C|AIem0WLQYn1zg-;zWYzwSP)=NwbouI89Rd_^- zL0!`>X2A)iGlG`tGgF+<1)D)(q8!4p>$i^diJF+3myilcb{iuaSfT#aOz9Z z&XBeZKIepX8ZkUFG??kb)UHuyHv4JXtNV+uX0fVG@LT>ksMvs6Vcw$1s=BZB4S%&) q<>$XT^k|-gaRSpZ9{qmnbMg;kc;eHRHDmxY3xlVtpUXO@geCyBy)|h7 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_1.png new file mode 100644 index 0000000000000000000000000000000000000000..e818e7dd11e8a67e719be7bd065da25e56a847ab GIT binary patch literal 853 zcmV-b1FHOqP)4Tx04UFuk-bX;K@i1XjFO;{6k3RgToJ`00Z|Z3iC~&&kwh?RbJ^q);qG$W zB}lLpY%Bs6qK#jL|ADrGt%4vZf{3NHUyX$GZ4yWjE!<^pe!RUm%+3NGaa|Zr=L}$& zB|8y|Dog2Q#rFaqh8cc@RpD6k$+;B%T%ULF$b1`-weY{ylg&8-@c7A7!m>+bc7ynO z$&$QH?iU3$OFkrrZ8k{0l6t1W&yw>EewS>g60^LUtf}PNIMc?WU>oEya>&rjqS=qU zNg!t~CYc8rLvWBl3{fb^po}%>C?UdZa%R8##_PTX6zLKCTByLLBaZ^TVX9?T%`t1# zbKE*Aa_&Fp>1dM^jp~6Y(DmfHZzF(j2dGtD_v^@YYsY~15x6j0{vziz{XxCj(n1G7 za1%JYY-yQY;Cu@hc(7DktxH};ho%9qr$BES=(_>BR~oZwp5x>mNNwy1LTR(v6Lcx3{-nU0uY)#Gjv^jEsz^sHmHpo0F51 zkB^T4005OnZi@f_01b3fPE-H?|NsC0|NsC0|Nj6z=pu#y000SaNLh0L01FWS01FWT ze`H^g0003vNklZv*wV;Pkr1iSxp>8%jGZiU;`RxB>P=XP1jl9ABLv@K zPA0$kz@-arG4h=~B%sAvk1 z1%N}w93V?NCQJg(T7U(h7GMFW1?T|B%jh4ur5rX0KuQ2{8x-NFIgdCM0Ofah1vkG*^t)BfOpK^MYwK07A%r?5Qn!B>y4KTAKZ fr#b%cUnsynzg)gFOz00000NkvXXu0mjfXVZOu literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/haven_tone_2.png new file mode 100644 index 0000000000000000000000000000000000000000..fe98ec53eb2c4f1b570ef1a891228a7586e37178 GIT binary patch literal 630 zcmV-+0*U>JP)4Tx04UFuk-bX;K@i1XjFO;{6k3RgToJ`00Z|Z3iC~&&kwh?RbJ^q);qG$W zB}lLpY%Bs6qK#jL|ADrGt%4vZf{3NHUyX$GZ4yWjE!<^pe!RUm%+3NGaa|Zr=L}$& zB|8y|Dog2Q#rFaqh8cc@RpD6k$+;B%T%ULF$b1`-weY{ylg&8-@c7A7!m>+bc7ynO z$&$QH?iU3$OFkrrZ8k{0l6t1W&yw>EewS>g60^LUtf}PNIMc?WU>oEya>&rjqS=qU zNg!t~CYc8rLvWBl3{fb^po}%>C?UdZa%R8##_PTX6zLKCTByLLBaZ^TVX9?T%`t1# zbKE*Aa_&Fp>1dM^jp~6Y(DmfHZzF(j2dGtD_v^@YYsY~15x6j0{vziz{XxCj(n1G7 za1%JYY-yQY;Cu@hc(7DktxH};ho%9qr$BES=(_>BR~oZwp5x>mNNwgoUh0LdQz2><{90(4SNQ~v1oG9HLxR|nsN{d zC=e*1K%n4%K}t3N32NFX)M;#eYe}}H>wfPIhY5uBjfzsL^{HjkzY?9Gj$k8@psPQO%C(2{wk@-f5YZ#0@<$e-Pd$XM%#9FGyq$zd$^i QBme*a07*qoM6N<$f@XjYK>z>% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json index f33401617c0..94795a626ea 100644 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch & Forked Tailfin by @stillxicarus", + "copyright": "Phoenix and Rooster by @leonardo_dabepis, Finch & Forked Tailfin by @stillxicarus, haven & forked_long & swallow by @Kilath", "size": { "x": 32, "y": 32 @@ -22,6 +22,22 @@ { "name": "whitescale_forked_tailfin", "directions": 4 + }, + { + "name": "haven_tone_1", + "directions": 4 + }, + { + "name": "haven_tone_2", + "directions": 4 + }, + { + "name": "forked_long", + "directions": 4 + }, + { + "name": "swallow_tail", + "directions": 4 } ] } diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_tails.rsi/swallow_tail.png new file mode 100644 index 0000000000000000000000000000000000000000..f9187b66f84ad6bddfef3452079a7697372ed3a7 GIT binary patch literal 1092 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7T#lEU@Xscb`J1#c2)=|%1_J8No8Qr zI6rmbUTB$tEso0N_(!E$G%Bb%MPBO^qIGAdd_m8&3k6AS^4C)#pPp*5~QCP7M-|odeP1P zJ)R2bdTKM-C7lZ0VdtWtbT=@EASH5yXKKqK$*zd1Tlx81q_%67^Ao`!ubCbW0 zdv9HGVs|JIw%DDMIWzV_4Yx$ahLGsB-f?d2%NW-$cgUA|v72#MxYXvXd5@pSdE|cR zT-Ug_Het$t_VE3TiaRqTx9~hn0mcMpfk$L90|U1p2s75F#7|^kU@G=>aSW-5dppaq z>yU$h>*G6)ANeLJ$T{sftWeBhevbD}MTg=OzD3gh3P}QYb_=e5p!7I@)so)Mmq#Sk zX0Bp?czf-!Rrgbcf--s8nEj3Nmm~!;dmLTFHlfRvS3$H}%0Wxav>`+%i(zHN6^5XV zD;Sp~3FbSz&F{=LlddW~pSRt6*WGpHR&)0#a73B>bqK8MUDNQisM1@m%W!Y#EH|kO z@4xSTTb3Q?Y`D(rF^|Rk^PFM#*pkm&-XPMuhC%P|;fDz(xgL^SyayaL@;_JaJ@tRD zR>IW4PaeODc2*pJ{4tH~+3JwSV%8^bZE{Z~ZS;8a(LYhWf64XNTW9t^{-G+Y^`CW- zhF8<;gX~_x``xT6Rrc=gQ=ja~{i}=9k1e772jlFr-G5*H-WNE_=s|I6_(RFalg;Z5 zOrFx)QEM%U=6&Td?v8|cwxBNqO=CjW`f7Z_Ec@n`GHdmNk{_)0@ zZWF%#%%1w}-@nV+2XE%2H67>+$VO{@RvAZIY6yuZ^}{{XgS)l*s&I)&<5#?#{Amme@J_Y13rJ zJL!+#`OJMN5nJ8t$9CZ2)vT{ubVJ1jl#@!=HaRgrP$|3Cay4B*JE?4C({i>2&OKqp zB5l19wQL)e(vF;qeP?5Ip6Q2>%#pAuHL~ZKcy=9q|9E5OwWi~^Oat~u9zw@8=Cz7{W5~LTNXP>}z^z%N(GM}Yx(sM<+fN7G!)78&q Iol`;+090D%3;+NC literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a147739cc90c5cc7bd164a8bb774730f17eed382 GIT binary patch literal 1581 zcmV+|2GaS7P)K@`MNB50!)F@jN>4us0f~|O4xJ%2X zR)vp*qmDEve693!nO_uV%KV|&NyI0?uWE)fHJq+tE$f)VgTfIrSJW!~sG9_JYhhk; zk3=snai)n8CQXqwaugVnY{|^(`-cB~bL7RN$={}gBaRGN@kT{0N>yF5A-XPKj*^=D z|9QH`=t#MGFa|Bpp7-7lfnE67@x1S2&-*!nrYE?xs{XvpY5Y_4ovIc&gwQ6OUsbjA z9$aie_oJP1Qh!pDgx@gW?F>4S(0L1O%jH>B_Bnlk#D+Z44eTGlfSeDl`~o4lXc-r; zD+mAp010qNS#tmY3labT3lag+-G2N400d=8L_t(|UhSGqPUAojg-sMLz=|`BV8kWh z7KjBKmPip|!GbLag*!x?feq|90SaiAXqJdGAZ2(So~Kf-?yimoeCr2^~(S)0sT>p6`O!x7SXy zmNI~&-QC^l_4TzretLSUMx#-y9_+Tax9k1Q&CTlm{@%39!5drJ=V~xd9v&W6M@L81 z!^1-(0Kq{@0Jad}6%ax;-V>YTYDo4bf=?eG=gv)TZd&yY_V?$e-1nWGiuFChC6U-` zAF)H#paGjkhetzGcz1U<+uPf#kDKf1GdLW{V<0<0HeTEEm;z)Rk`cSMu{z6pTTtJghs*>+nRYA#`9`OI-~$p#1?1&X9>CFhBQREzP@e*rfx>^ysWn_Qy$XogYP!ZI+6VkvcCA$a z#y?+P7Fxn2ayf%f-4MMBaF)r~eF1;)s~?P-_zZ6K_VMxYLLFe$V+<)`8L^2=!$&Vv z7Z(?;%3v~?bP~{|ewVtEzWfvlg+ifFC=?2X{~YUO<|^)8FFEuRRh|O|p(mBi&ZjlIdH6GXd$k~stu39!a zE8ABmu#r}lnv70P>hA%-$!O$`?K0ADYxKKyPCM@BCNyIpwoZ2Hc(jdWutPMLfX>^? zMz@j)pZR$NXM+(e_xf7|CSBxfEt%ku8VE53b&#Lr!;n&B7;XGQYdUNOgTY++GN!&p z#z1Un&~d2=+Sv}aOWM`n2i)G?R_p8QGx<$kDu-^3{IaIL#v1j|OaRt%0&MlS18(3@ zKNwkM%S5NwLS?;kc6Jv1LhLKC;^G(@Lv<|N%OIR@Y;3e{c-Ss`+FQtnBUuKGy$%Sc zx1L^KJ?%rpw7D*c(EoYfHLXUjO5;hWu`CaDMDvvxzs9ouW_s5CRUr0Eplugk1^(vS fA20uc#+Bk10P^udA=g`(00000NkvXXu0mjf*Ean; literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bat_wings_tone_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2170ff803c694b4080f0a18e8ec78b2ff383adb GIT binary patch literal 1753 zcmV;~1}6E5P)K@`MNB50!)F@jN>4us0f~|O4xJ%2X zR)vp*qmDEve693!nO_uV%KV|&NyI0?uWE)fHJq+tE$f)VgTfIrSJW!~sG9_JYhhk; zk3=snai)n8CQXqwaugVnY{|^(`-cB~bL7RN$={}gBaRGN@kT{0N>yF5A-XPKj*^=D z|9QH`=t#MGFa|Bpp7-7lfnE67@x1S2&-*!nrYE?xs{XvpY5Y_4ovIc&gwQ6OUsbjA z9$aie_oJP1Qh!pDgx@gW?F>4S(0L1O%jH>B_Bnlk#D+Z44eTGlfSeDl`~o4lXc-r; zD+mAp010qNS#tmY3labT3lag+-G2N400j|AL_t(|UhSGqN+d}X$0NlPxDb({4=}W% zYZo#!y6_4^(cVEkh14A!%DIHn%t~BZlrqa^Xa*4%E?o&Z@eAW0^C~|o(<)~Wj2|Rc zW_-Mlc=0mLm(FD}nM@{=$z(E_OeT}bd@zbxjg!fwyuZJ9H#axMWIUc~`)xEzzrPL! zQ*E1DTW(`xqg-2CbDNu+Gi8Y3aOkXzqvPWsdw+kw*Z6sLSZ=zA;S99KGhzH&`oFaa zbzS{Dg`cB*cz6hgbUEVa=qUWH%APgGVizRva$YdsEFBshAO#qJXMY_G%HKz$qRn`S z#)o$G_m_*ky}e*iUnKkD;vzWy{QSHoyJoEWHv+T(NoQ|^oZ7@v^#a}+v(nL92v(a9 zsqnX|fX>yfaVUZz%*VX01Id>07$e$b3!_7lqw(0%ro)s2@Dv@j@9@4~K|--QZYK0+ z9IFt|g96OoHb$})_KYQZUMpKf9ZGEA9GjYSNDffKv&JhNwYU2aL$F{R<5`hOG%U;& z74Y+i1FFeZ$?LVUMO6pu1git29AFc~>FH^?;qWz#K9*&iBYJ0rW-9U=BBjSc~HVE(EO zwIry}({?D!6fM0JaIqib6!r?mF05?E8rgHfc!hnN4pT;HZ`fSGHD%?l5Cm>V3d7;a zN%8aN&u)8rJKcubo(HV#>+9>{Prv#+3=#UQY9HAm>JSpRX5b|V3T!1jjOAx(kGRg4 z?-JY4OIFP(8MN`cZ}qs1#^R_&3Wz~0cd3jegX0_Ag_P+7^7O{ppBB7J#1UIj$I(ks zHqd7QIvs%VGMcxx7|v_!<>h7f{QT^AeN7)*-Qkrq#mv6Nj4o90RGAD}iV9x4;}ow` zc>Qjx(IXM2{YFw3RDeSP-1Rbz5PY zwM|+hz}D2Y>S2H}p2)DZ{FC7@6*=4Hofqchg9~IHztjrCR`7o7! z3NoEl8qlN)ce^F5@mymM_St){MY%|_ae^vPDdeMUwgo5}W>ux8F4zwUR##U;8%YMN zk)R}~1jx0w4*e>2D*%a5+fYdm6sT5 zT#<=vbkGMF(oYLztJ$)PcKdxmr@|^(gA!rW%In&HwfaI^K_5|ojRelEzFp4=t&R2$ z0CCmB7@P3^Pvb?^2^=Qu!!1}&=(-cMIzXS6K{V1mK0X$I|M+1O-dxq&w}b-dAQn_{ z!cU(*xs{cb-~=rmf9L;kQsh0m_%I_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/bionic_wings_tone_1.png new file mode 100644 index 0000000000000000000000000000000000000000..752d6cc9a2062ae380ac67d49149f5c25e783f9a GIT binary patch literal 1448 zcmV;Z1y}lsP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizyJUazyWI3i3tDz1wBbbK~#8N?V7tw zEHMMo5^HnW%PP4`N1%gOmfb5&Lo-L%?2Ki$K&yMJRXn7vMSQ{t5N4f zE-x>`YDJ(u`l({ow6wH{Px>|eFD@?T)TI@@9}d`)8y2jFT3cJuQLeA9uH^jq_$cS8 zsi{QgkuY&oUtcff$c~(chlgRuDVjj+`1rUgeFFb3-vk=yUuR`yB`6k)vHr0Ukk9AC zLZKkn2p*0ZJPgAD10}4ZWA;rqYq=Hxi#>U3ve0+Qy zJUu;0&^*$hw?}{20km6*wY4=&JGrhla1-{2J=nDoO8^BRfS#V7AeT!ua$}$$`ooS( zfXU|Orc50i=&KWrDCa0L@1s9$!LE&10w^Gwi^2Q*yPQ!5m7WOi+xjO7FyXWzdJ;G? zlF;v4lBcf9DN6uWOj|><&RmSla*_?M&Mu+_Glyw&a&l5iJki$%8|HoVhaK31T~%F1 zSpv|A0?y9Pq^_psqY0mG(n`#Fwqrlop@1Y2I#^66Cns~=-QB9@lPDl(f7^Z7fjx8K zCb20%0TUAwV(j|*TIxZi*N}dn{b0u>KnHDhcXu(A!{}*>Ehf|)(n+u#`@s(E!LCh1 zSpswc7Z(>{dwY8>3_to*D**k_A9h>4N0+H&n2u7y5{7isNz*mDOW)g@lKnEJK@=Z()rth-C z-w;6f08UR&GxJTTp{uJ)%2o{!fCEDY9aMEDz#i<4V$b+suT1r~Rr7JUl#vhlhvq zn;n0DpPQQto0^*BzDX7$ZNZbfySrd|dRpw`CwTns*VoqM0{i>>5&XN*DN32QX-^Yh`t!a~UHDb91-T*MoJWIgO{=stAcgc_+C zF(4MiBozi$!TQ{f783kNK*|_e`n-L)22M*tdf;R6WV z6+Au@{513l4fu2UlY7e^wh(Vkr7Dykt}aCDLxjfaDL88&YAzWG1RS`qCR0d Uhf+r841JJ!p00i_>zopr052DVy#N3J literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json index 7737af0afc2..c8bf28767a8 100644 --- a/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "classicharpy Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded, harpy, and owl by @stillxicarus", + "copyright": "classicharpy Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag | harpyfolded, harpy, and owl by @stillxicarus, bat wings by @Kilath", "states": [ { "name": "huescale_harpy", @@ -78,6 +78,22 @@ { "name": "whitescale_harpy_wing_owl", "directions": 4 + }, + { + "name": "bat_wings_tone_1", + "directions": 4 + }, + { + "name": "bat_wings_tone_2", + "directions": 4 + }, + { + "name": "bionic_wings_tone_1", + "directions": 4 + }, + { + "name": "bionic_wings_tone_2", + "directions": 4 } ] } From 07325fcdf80e9545da7d38a718c225e5b792136d Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:12:04 +0000 Subject: [PATCH 114/143] Automatic Changelog Update (#696) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fb3fd2c343c..3334fd4e136 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5059,3 +5059,11 @@ Entries: message: Mr. Butlertron can now suffer for its crimes. id: 6233 time: '2024-08-07T22:38:04.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + The following new markings have been added for Harpies: Bat Wings, + Simple Bionic Wings, Haven Tail, Swallow tail, and Long Forked Tail + id: 6234 + time: '2024-08-07T23:11:41.0000000+00:00' From 020e90ab1d9c7adf4c293053881b15a4bc8b4aae Mon Sep 17 00:00:00 2001 From: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Date: Thu, 8 Aug 2024 00:16:30 +0100 Subject: [PATCH 115/143] Add Le Psionic Orb From Nyanotrasen (#685) # Description It says Psionic chat out loud

Media

![image](https://github.com/user-attachments/assets/a60c4110-ce1b-40ca-8177-df2d0b45b6da)

--- # Changelog :cl: - add: Readded Psionic Relay Orb --- .../Entities/Objects/Specific/Research/misc.yml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml new file mode 100644 index 00000000000..79c475900aa --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/misc.yml @@ -0,0 +1,9 @@ +- type: entity + parent: PonderingOrb + id: PonderingOrbTelepathic + name: telepathic relay orb + description: Relays messages intercepted from Psionics. + components: + - type: TelepathicRepeater + - type: Psionic + - type: Speech \ No newline at end of file From 9e83f669c836e8934ad21585c2c1dcaed6ebec93 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:16:55 +0000 Subject: [PATCH 116/143] Automatic Changelog Update (#685) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3334fd4e136..b7ab981fc63 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5067,3 +5067,9 @@ Entries: Simple Bionic Wings, Haven Tail, Swallow tail, and Long Forked Tail id: 6234 time: '2024-08-07T23:11:41.0000000+00:00' +- author: DangerRevolution + changes: + - type: Add + message: Readded Psionic Relay Orb + id: 6235 + time: '2024-08-07T23:16:30.0000000+00:00' From dfe5c2c54045c026621f009b676f7f3ef97692dc Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 19:18:35 -0400 Subject: [PATCH 117/143] Psionic Refactor Part 1: Respacing To Keep Files Changed Down (#698) # Description Due to some inherent limitations of maintenance, code review, and me having both severely crippling ADHD and a lifelong adderal dependency, I've made the executive decision to break apart the Psionic Refactor into a multitude of smaller, bite sized PRs. I'm keeping the original Psionic Refactor PR open, because I'm going to need it for code reference to keep track of the changes I had originally worked on, but I need to essentially restart the entire refactor from scratch, and approach it from a new angle that's going to make everything actually way easier. I also need to be able to work on each available system individually wherever possible, and this fact is most readily shown by how the Lightning Refactor and Oracle Refactor were both done separately. To start off, this PR is ONLY moving all of the relevant psionics code to core folders, and nothing more. I'm doing this first so that I can immediately cut down massively on the "Files Changed" with the simplest, most basic change necessary to start my work. No changelog because this isn't player facing, and no media because there's literally nothing to show. --- .../CartridgeLoader/Cartridges/GlimmerMonitorUi.cs | 5 ++--- .../Cartridges/GlimmerMonitorUiFragment.xaml | 2 +- .../Cartridges/GlimmerMonitorUiFragment.xaml.cs | 4 ++-- .../{Nyanotrasen => }/Chat/PsionicChatUpdateSystem.cs | 2 +- .../Psionics/Glimmer/GlimmerReactiveVisuals.cs | 0 .../{Nyanotrasen => }/Psionics/UI/AcceptPsionicsEUI.cs | 0 .../{Nyanotrasen => }/Psionics/UI/AcceptPsionicsWindow.cs | 0 .../{Nyanotrasen => }/UserInterface/GlimmerGraph.cs | 2 +- .../UserInterface/Systems/Chat/ChatUIController.cs | 1 - .../Abilities/Psionics/Abilities/DispelPowerSystem.cs | 0 .../Psionics/Abilities/MetapsionicPowerSystem.cs | 0 .../Abilities/Psionics/Abilities/MindSwapPowerSystem.cs | 0 .../Abilities/Psionics/Abilities/MindSwappedComponent.cs | 0 .../Psionics/Abilities/NoosphericZapPowerSystem.cs | 0 .../Psionics/Abilities/PsionicInvisibilityPowerSystem.cs | 0 .../Psionics/Abilities/PsionicRegenerationPowerSystem.cs | 0 .../Psionics/Abilities/PyrokinesisPowerSystem.cs | 0 .../Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs | 0 .../Abilities/Psionics/PsionicAbilitiesSystem.cs | 0 .../{Nyanotrasen => }/Audio/GlimmerSoundComponent.cs | 0 .../Cartridges}/GlimmerMonitorCartridgeComponent.cs | 0 .../Cartridges}/GlimmerMonitorCartridgeSystem.cs | 0 .../{Nyanotrasen/Chat => Chat/Commands}/TSayCommand.cs | 0 Content.Server/Chat/Systems/ChatSystem.cs | 8 +++----- .../NyanoChatSystem.cs => Chat/TelepathicChatSystem.cs} | 6 +++--- .../{Nyanotrasen => }/Chat/TelepathicRepeaterComponent.cs | 2 +- .../{Nyanotrasen => }/Psionics/AcceptPsionicsEui.cs | 0 .../Psionics/AntiPsychicWeaponComponent.cs | 0 .../{Nyanotrasen => }/Psionics/Dreams/DreamSystem.cs | 0 .../{Nyanotrasen => }/Psionics/Glimmer/GlimmerCommands.cs | 0 .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 0 .../Psionics/Glimmer/PassiveGlimmerReductionSystem.cs | 0 .../Psionics/Glimmer/Structures/GlimmerSourceComponent.cs | 0 .../Glimmer/Structures/GlimmerStructuresSystem.cs | 0 .../Psionics/Invisibility/PsionicInvisibilitySystem.cs | 0 .../Invisibility/PsionicInvisibleContactsComponent.cs | 0 .../Invisibility/PsionicInvisibleContactsSystem.cs | 0 .../Invisibility/PsionicallyInvisibleComponent.cs | 0 .../Psionics/PotentialPsionicComponent.cs | 0 .../Psionics/PsionicAwaitingPlayerComponent.cs | 0 .../Psionics/PsionicBonusChanceComponent.cs | 0 .../{Nyanotrasen => }/Psionics/PsionicsCommands.cs | 0 .../{Nyanotrasen => }/Psionics/PsionicsSystem.cs | 0 .../StationEvents/Components/FreeProberRuleComponent.cs | 0 .../StationEvents/Components/GlimmerEventComponent.cs | 0 .../Components/GlimmerRandomSentienceRuleComponent.cs | 0 .../Components/GlimmerRevenantSpawnRuleComponent.cs | 0 .../StationEvents/Components/GlimmerWispRuleComponent.cs | 0 .../StationEvents/Components/MassMindSwapRuleComponent.cs | 0 .../Components/MundaneDischargeRuleComponent.cs | 0 .../Components/NoosphericFryRuleComponent.cs | 0 .../Components/NoosphericStormRuleComponent.cs | 0 .../Components/NoosphericZapRuleComponent.cs | 0 .../Components/PsionicCatGotYourTongueRuleComponent.cs | 0 .../StationEvents/Events/FreeProberRule.cs | 0 .../StationEvents/Events/GlimmerEventSystem.cs | 0 .../StationEvents/Events/GlimmerRandomSentienceRule.cs | 0 .../StationEvents/Events/GlimmerRevenantSpawnRule.cs | 0 .../StationEvents/Events/GlimmerWispSpawnRule.cs | 0 .../StationEvents/Events/MassMindSwapRule.cs | 0 .../StationEvents/Events/MundaneDischargeRule.cs | 0 .../StationEvents/Events/NoosphericFryRule.cs | 0 .../StationEvents/Events/NoosphericStormRule.cs | 0 .../StationEvents/Events/NoosphericZapRule.cs | 0 .../StationEvents/Events/PsionicCatGotYourTongueRule.cs | 0 .../Actions/Events/DispelPowerActionEvent.cs | 0 .../Actions/Events/EatMouseActionEvent.cs | 0 .../Actions/Events/HairballActionEvent.cs | 0 .../Actions/Events/MassSleepPowerActionEvent.cs | 0 .../Actions/Events/MetapsionicPowerActionEvent.cs | 0 .../Actions/Events/MindSwapPowerActionEvent.cs | 0 .../Actions/Events/NoosphericZapPowerActionEvent.cs | 0 .../Actions/Events/PsionicInvisibilityPowerActionEvent.cs | 0 .../Actions/Events/PsionicRegenerationPowerActionEvent.cs | 0 .../Actions/Events/PyrokinesisPowerActionEvent.cs | 0 .../RemovePsionicInvisibilityOffPowerActionEvent.cs | 0 .../Actions/Events/TelegnosisPowerActionEvent.cs | 0 .../CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs | 0 .../{Nyanotrasen => }/Chapel/SacrificeDoAfterEvent.cs | 0 .../Psionics/Abilities/AcceptPsionicsEuiMessage.cs | 0 .../Psionics/Abilities/Dispel/DamageOnDispelComponent.cs | 0 .../Psionics/Abilities/Dispel/DispelPowerComponent.cs | 0 .../Psionics/Abilities/Dispel/DispellableComponent.cs | 0 .../Abilities/MassSleep/MassSleepPowerComponent.cs | 0 .../Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs | 0 .../Abilities/Metapsionics/MetapsionicPowerComponent.cs | 0 .../Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs | 0 .../NoosphericZap/NoosphericZapPowerComponent.cs | 0 .../PsionicInvisibilityPowerComponent.cs | 0 .../PsionicInvisibilityUsedComponent.cs | 0 .../PsionicRegenerationPowerComponent.cs | 0 .../Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs | 0 .../Abilities/Telegnosis/TelegnosisPowerComponent.cs | 0 .../Telegnosis/TelegnosticProjectionComponent.cs | 0 Content.Shared/{Nyanotrasen => }/Psionics/Events.cs | 0 .../{Nyanotrasen => }/Psionics/Glimmer/GlimmerSystem.cs | 0 .../Psionics/Glimmer/SharedGlimmerReactiveComponent.cs | 0 .../Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs | 0 .../Psionics/Items/ClothingGrantPsionicPowerComponent.cs | 0 .../Abilities => }/Psionics/Items/HeadCageComponent.cs | 0 .../Abilities => }/Psionics/Items/HeadCagedComponent.cs | 0 .../Abilities => }/Psionics/Items/PsionicItemsSystem.cs | 0 .../Abilities => }/Psionics/Items/TinfoilHatComponent.cs | 0 .../Abilities => }/Psionics/PsionicComponent.cs | 0 .../Abilities => }/Psionics/PsionicInsulationComponent.cs | 0 .../Abilities => }/Psionics/PsionicsDisabledComponent.cs | 0 .../Psionics/SharedPsionicAbilitiesSystem.cs | 0 Content.Shared/{Nyanotrasen => }/Soul/GolemMessages.cs | 0 .../{Nyanotrasen => }/Soul/GunHeldByGolemComponent.cs | 0 .../{Nyanotrasen => }/Soul/SharedGolemComponent.cs | 0 .../{Nyanotrasen => }/Soul/SharedGolemSystem.cs | 0 111 files changed, 14 insertions(+), 18 deletions(-) rename Content.Client/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs (88%) rename Content.Client/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml (93%) rename Content.Client/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs (96%) rename Content.Client/{Nyanotrasen => }/Chat/PsionicChatUpdateSystem.cs (96%) rename Content.Client/{Nyanotrasen => }/Psionics/Glimmer/GlimmerReactiveVisuals.cs (100%) rename Content.Client/{Nyanotrasen => }/Psionics/UI/AcceptPsionicsEUI.cs (100%) rename Content.Client/{Nyanotrasen => }/Psionics/UI/AcceptPsionicsWindow.cs (100%) rename Content.Client/{Nyanotrasen => }/UserInterface/GlimmerGraph.cs (97%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/DispelPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/MindSwappedComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Abilities/Psionics/PsionicAbilitiesSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Audio/GlimmerSoundComponent.cs (100%) rename Content.Server/{Nyanotrasen/CartridgeLoader => CartridgeLoader/Cartridges}/GlimmerMonitorCartridgeComponent.cs (100%) rename Content.Server/{Nyanotrasen/CartridgeLoader => CartridgeLoader/Cartridges}/GlimmerMonitorCartridgeSystem.cs (100%) rename Content.Server/{Nyanotrasen/Chat => Chat/Commands}/TSayCommand.cs (100%) rename Content.Server/{Nyanotrasen/Chat/NyanoChatSystem.cs => Chat/TelepathicChatSystem.cs} (97%) rename Content.Server/{Nyanotrasen => }/Chat/TelepathicRepeaterComponent.cs (83%) rename Content.Server/{Nyanotrasen => }/Psionics/AcceptPsionicsEui.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/AntiPsychicWeaponComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Dreams/DreamSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/GlimmerCommands.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/GlimmerReactiveSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibilitySystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/Invisibility/PsionicallyInvisibleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PotentialPsionicComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicAwaitingPlayerComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicBonusChanceComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicsCommands.cs (100%) rename Content.Server/{Nyanotrasen => }/Psionics/PsionicsSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/FreeProberRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerEventComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/GlimmerWispRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/MassMindSwapRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/MundaneDischargeRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/NoosphericFryRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/NoosphericStormRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/NoosphericZapRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/FreeProberRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerEventSystem.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerRandomSentienceRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerRevenantSpawnRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/GlimmerWispSpawnRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/MassMindSwapRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/MundaneDischargeRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/NoosphericFryRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/NoosphericStormRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/NoosphericZapRule.cs (100%) rename Content.Server/{Nyanotrasen => }/StationEvents/Events/PsionicCatGotYourTongueRule.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/DispelPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/EatMouseActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/HairballActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/MassSleepPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/MetapsionicPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/MindSwapPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/NoosphericZapPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/PsionicInvisibilityPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/PsionicRegenerationPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/PyrokinesisPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Actions/Events/TelegnosisPowerActionEvent.cs (100%) rename Content.Shared/{Nyanotrasen => }/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs (100%) rename Content.Shared/{Nyanotrasen => }/Chapel/SacrificeDoAfterEvent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/AcceptPsionicsEuiMessage.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DispelPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Dispel/DispellableComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Events.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/GlimmerSystem.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/ClothingGrantPsionicPowerComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/HeadCageComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/HeadCagedComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/PsionicItemsSystem.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/Items/TinfoilHatComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicInsulationComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/PsionicsDisabledComponent.cs (100%) rename Content.Shared/{Nyanotrasen/Abilities => }/Psionics/SharedPsionicAbilitiesSystem.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/GolemMessages.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/GunHeldByGolemComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/SharedGolemComponent.cs (100%) rename Content.Shared/{Nyanotrasen => }/Soul/SharedGolemSystem.cs (100%) diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs similarity index 88% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs rename to Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs index 0b5fc7ad38c..9ef968e43b1 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs +++ b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUi.cs @@ -1,10 +1,9 @@ -using Robust.Client.GameObjects; -using Robust.Client.UserInterface; +using Robust.Client.UserInterface; using Content.Client.UserInterface.Fragments; using Content.Shared.CartridgeLoader.Cartridges; using Content.Shared.CartridgeLoader; -namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; +namespace Content.Client.CartridgeLoader.Cartridges; public sealed partial class GlimmerMonitorUi : UIFragment { diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml similarity index 93% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml rename to Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml index 119a1831e6e..e09a422ddf7 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml +++ b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml @@ -1,4 +1,4 @@ - diff --git a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs similarity index 96% rename from Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs rename to Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs index 43d9202aa45..3325c0d379e 100644 --- a/Content.Client/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs +++ b/Content.Client/CartridgeLoader/Cartridges/GlimmerMonitorUiFragment.xaml.cs @@ -1,12 +1,12 @@ using System.Linq; using System.Numerics; -using Content.Client.Nyanotrasen.UserInterface; +using Content.Client.UserInterface; using Robust.Client.AutoGenerated; using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; -namespace Content.Client.Nyanotrasen.CartridgeLoader.Cartridges; +namespace Content.Client.CartridgeLoader.Cartridges; [GenerateTypedNameReferences] public sealed partial class GlimmerMonitorUiFragment : BoxContainer diff --git a/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs b/Content.Client/Chat/PsionicChatUpdateSystem.cs similarity index 96% rename from Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs rename to Content.Client/Chat/PsionicChatUpdateSystem.cs index 84602052fe7..066501acb78 100644 --- a/Content.Client/Nyanotrasen/Chat/PsionicChatUpdateSystem.cs +++ b/Content.Client/Chat/PsionicChatUpdateSystem.cs @@ -2,7 +2,7 @@ using Content.Client.Chat.Managers; using Robust.Client.Player; -namespace Content.Client.Nyanotrasen.Chat +namespace Content.Client.Chat { public sealed class PsionicChatUpdateSystem : EntitySystem { diff --git a/Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs b/Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveVisuals.cs rename to Content.Client/Psionics/Glimmer/GlimmerReactiveVisuals.cs diff --git a/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs b/Content.Client/Psionics/UI/AcceptPsionicsEUI.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsEUI.cs rename to Content.Client/Psionics/UI/AcceptPsionicsEUI.cs diff --git a/Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs b/Content.Client/Psionics/UI/AcceptPsionicsWindow.cs similarity index 100% rename from Content.Client/Nyanotrasen/Psionics/UI/AcceptPsionicsWindow.cs rename to Content.Client/Psionics/UI/AcceptPsionicsWindow.cs diff --git a/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs b/Content.Client/UserInterface/GlimmerGraph.cs similarity index 97% rename from Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs rename to Content.Client/UserInterface/GlimmerGraph.cs index c4a9109dcd8..188ebe2475b 100644 --- a/Content.Client/Nyanotrasen/UserInterface/GlimmerGraph.cs +++ b/Content.Client/UserInterface/GlimmerGraph.cs @@ -4,7 +4,7 @@ using Robust.Client.ResourceManagement; using Robust.Client.UserInterface; -namespace Content.Client.Nyanotrasen.UserInterface; +namespace Content.Client.UserInterface; public sealed class GlimmerGraph : Control { diff --git a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs index 138dc9e52be..bc79283d76e 100644 --- a/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs +++ b/Content.Client/UserInterface/Systems/Chat/ChatUIController.cs @@ -38,7 +38,6 @@ using Robust.Shared.Replays; using Robust.Shared.Timing; using Robust.Shared.Utility; -using Content.Client.Nyanotrasen.Chat; //Nyano - Summary: chat namespace. namespace Content.Client.UserInterface.Systems.Chat; diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/DispelPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/DispelPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs b/Content.Server/Abilities/Psionics/Abilities/MindSwappedComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/MindSwappedComponent.cs rename to Content.Server/Abilities/Psionics/Abilities/MindSwappedComponent.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs b/Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs rename to Content.Server/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs diff --git a/Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Abilities/Psionics/PsionicAbilitiesSystem.cs rename to Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs diff --git a/Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs b/Content.Server/Audio/GlimmerSoundComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Audio/GlimmerSoundComponent.cs rename to Content.Server/Audio/GlimmerSoundComponent.cs diff --git a/Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeComponent.cs b/Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeComponent.cs rename to Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeComponent.cs diff --git a/Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeSystem.cs b/Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/CartridgeLoader/GlimmerMonitorCartridgeSystem.cs rename to Content.Server/CartridgeLoader/Cartridges/GlimmerMonitorCartridgeSystem.cs diff --git a/Content.Server/Nyanotrasen/Chat/TSayCommand.cs b/Content.Server/Chat/Commands/TSayCommand.cs similarity index 100% rename from Content.Server/Nyanotrasen/Chat/TSayCommand.cs rename to Content.Server/Chat/Commands/TSayCommand.cs diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs index b41d2deda6f..b4641928e48 100644 --- a/Content.Server/Chat/Systems/ChatSystem.cs +++ b/Content.Server/Chat/Systems/ChatSystem.cs @@ -8,7 +8,7 @@ using Content.Server.Language; using Content.Server.Speech.Components; using Content.Server.Speech.EntitySystems; -using Content.Server.Nyanotrasen.Chat; +using Content.Server.Chat; using Content.Server.Station.Components; using Content.Server.Station.Systems; using Content.Shared.ActionBlocker; @@ -69,9 +69,7 @@ public sealed partial class ChatSystem : SharedChatSystem [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!; [Dependency] private readonly LanguageSystem _language = default!; - - //Nyano - Summary: pulls in the nyano chat system for psionics. - [Dependency] private readonly NyanoChatSystem _nyanoChatSystem = default!; + [Dependency] private readonly TelepathicChatSystem _telepath = default!; public const int VoiceRange = 10; // how far voice goes in world units public const int WhisperClearRange = 2; // how far whisper goes while still being understandable, in world units @@ -277,7 +275,7 @@ public void TrySendInGameICMessage( break; //Nyano - Summary: case adds the telepathic chat sending ability. case InGameICChatType.Telepathic: - _nyanoChatSystem.SendTelepathicChat(source, message, range == ChatTransmitRange.HideChat); + _telepath.SendTelepathicChat(source, message, range == ChatTransmitRange.HideChat); break; } } diff --git a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs b/Content.Server/Chat/TelepathicChatSystem.cs similarity index 97% rename from Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs rename to Content.Server/Chat/TelepathicChatSystem.cs index 58ed1782741..8d44ead9d07 100644 --- a/Content.Server/Nyanotrasen/Chat/NyanoChatSystem.cs +++ b/Content.Server/Chat/TelepathicChatSystem.cs @@ -16,13 +16,13 @@ using System.Linq; using System.Text; -namespace Content.Server.Nyanotrasen.Chat +namespace Content.Server.Chat { /// - /// Extensions for nyano's chat stuff + /// Extensions for Telepathic chat stuff /// - public sealed class NyanoChatSystem : EntitySystem + public sealed class TelepathicChatSystem : EntitySystem { [Dependency] private readonly IAdminManager _adminManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; diff --git a/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs b/Content.Server/Chat/TelepathicRepeaterComponent.cs similarity index 83% rename from Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs rename to Content.Server/Chat/TelepathicRepeaterComponent.cs index fc199f4332a..2183fafd4d1 100644 --- a/Content.Server/Nyanotrasen/Chat/TelepathicRepeaterComponent.cs +++ b/Content.Server/Chat/TelepathicRepeaterComponent.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Nyanotrasen.Chat +namespace Content.Server.Chat { /// /// Repeats whatever is happening in telepathic chat. diff --git a/Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs b/Content.Server/Psionics/AcceptPsionicsEui.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/AcceptPsionicsEui.cs rename to Content.Server/Psionics/AcceptPsionicsEui.cs diff --git a/Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs b/Content.Server/Psionics/AntiPsychicWeaponComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/AntiPsychicWeaponComponent.cs rename to Content.Server/Psionics/AntiPsychicWeaponComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs b/Content.Server/Psionics/Dreams/DreamSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Dreams/DreamSystem.cs rename to Content.Server/Psionics/Dreams/DreamSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerCommands.cs rename to Content.Server/Psionics/Glimmer/GlimmerCommands.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/GlimmerReactiveSystem.cs rename to Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs rename to Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs rename to Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibilitySystem.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibilitySystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibleContactsComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs b/Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs rename to Content.Server/Psionics/Invisibility/PsionicInvisibleContactsSystem.cs diff --git a/Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs b/Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/Invisibility/PsionicallyInvisibleComponent.cs rename to Content.Server/Psionics/Invisibility/PsionicallyInvisibleComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs b/Content.Server/Psionics/PotentialPsionicComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PotentialPsionicComponent.cs rename to Content.Server/Psionics/PotentialPsionicComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs b/Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicAwaitingPlayerComponent.cs rename to Content.Server/Psionics/PsionicAwaitingPlayerComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs b/Content.Server/Psionics/PsionicBonusChanceComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicBonusChanceComponent.cs rename to Content.Server/Psionics/PsionicBonusChanceComponent.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs b/Content.Server/Psionics/PsionicsCommands.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicsCommands.cs rename to Content.Server/Psionics/PsionicsCommands.cs diff --git a/Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/Psionics/PsionicsSystem.cs rename to Content.Server/Psionics/PsionicsSystem.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/FreeProberRuleComponent.cs b/Content.Server/StationEvents/Components/FreeProberRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/FreeProberRuleComponent.cs rename to Content.Server/StationEvents/Components/FreeProberRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerEventComponent.cs b/Content.Server/StationEvents/Components/GlimmerEventComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerEventComponent.cs rename to Content.Server/StationEvents/Components/GlimmerEventComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs rename to Content.Server/StationEvents/Components/GlimmerRandomSentienceRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs rename to Content.Server/StationEvents/Components/GlimmerRevenantSpawnRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/GlimmerWispRuleComponent.cs b/Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/GlimmerWispRuleComponent.cs rename to Content.Server/StationEvents/Components/GlimmerWispRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/MassMindSwapRuleComponent.cs b/Content.Server/StationEvents/Components/MassMindSwapRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/MassMindSwapRuleComponent.cs rename to Content.Server/StationEvents/Components/MassMindSwapRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/MundaneDischargeRuleComponent.cs b/Content.Server/StationEvents/Components/MundaneDischargeRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/MundaneDischargeRuleComponent.cs rename to Content.Server/StationEvents/Components/MundaneDischargeRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/NoosphericFryRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericFryRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/NoosphericFryRuleComponent.cs rename to Content.Server/StationEvents/Components/NoosphericFryRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/NoosphericStormRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericStormRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/NoosphericStormRuleComponent.cs rename to Content.Server/StationEvents/Components/NoosphericStormRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/NoosphericZapRuleComponent.cs b/Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/NoosphericZapRuleComponent.cs rename to Content.Server/StationEvents/Components/NoosphericZapRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs b/Content.Server/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs rename to Content.Server/StationEvents/Components/PsionicCatGotYourTongueRuleComponent.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/FreeProberRule.cs b/Content.Server/StationEvents/Events/FreeProberRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/FreeProberRule.cs rename to Content.Server/StationEvents/Events/FreeProberRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerEventSystem.cs b/Content.Server/StationEvents/Events/GlimmerEventSystem.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerEventSystem.cs rename to Content.Server/StationEvents/Events/GlimmerEventSystem.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRandomSentienceRule.cs b/Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRandomSentienceRule.cs rename to Content.Server/StationEvents/Events/GlimmerRandomSentienceRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRevenantSpawnRule.cs b/Content.Server/StationEvents/Events/GlimmerRevenantSpawnRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerRevenantSpawnRule.cs rename to Content.Server/StationEvents/Events/GlimmerRevenantSpawnRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs b/Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/GlimmerWispSpawnRule.cs rename to Content.Server/StationEvents/Events/GlimmerWispSpawnRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs b/Content.Server/StationEvents/Events/MassMindSwapRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/MassMindSwapRule.cs rename to Content.Server/StationEvents/Events/MassMindSwapRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/MundaneDischargeRule.cs b/Content.Server/StationEvents/Events/MundaneDischargeRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/MundaneDischargeRule.cs rename to Content.Server/StationEvents/Events/MundaneDischargeRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs b/Content.Server/StationEvents/Events/NoosphericFryRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/NoosphericFryRule.cs rename to Content.Server/StationEvents/Events/NoosphericFryRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs b/Content.Server/StationEvents/Events/NoosphericStormRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/NoosphericStormRule.cs rename to Content.Server/StationEvents/Events/NoosphericStormRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs b/Content.Server/StationEvents/Events/NoosphericZapRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/NoosphericZapRule.cs rename to Content.Server/StationEvents/Events/NoosphericZapRule.cs diff --git a/Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs b/Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs similarity index 100% rename from Content.Server/Nyanotrasen/StationEvents/Events/PsionicCatGotYourTongueRule.cs rename to Content.Server/StationEvents/Events/PsionicCatGotYourTongueRule.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/DispelPowerActionEvent.cs b/Content.Shared/Actions/Events/DispelPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/DispelPowerActionEvent.cs rename to Content.Shared/Actions/Events/DispelPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/EatMouseActionEvent.cs b/Content.Shared/Actions/Events/EatMouseActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/EatMouseActionEvent.cs rename to Content.Shared/Actions/Events/EatMouseActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/HairballActionEvent.cs b/Content.Shared/Actions/Events/HairballActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/HairballActionEvent.cs rename to Content.Shared/Actions/Events/HairballActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs b/Content.Shared/Actions/Events/MassSleepPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/MassSleepPowerActionEvent.cs rename to Content.Shared/Actions/Events/MassSleepPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs b/Content.Shared/Actions/Events/MetapsionicPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/MetapsionicPowerActionEvent.cs rename to Content.Shared/Actions/Events/MetapsionicPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/MindSwapPowerActionEvent.cs b/Content.Shared/Actions/Events/MindSwapPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/MindSwapPowerActionEvent.cs rename to Content.Shared/Actions/Events/MindSwapPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/NoosphericZapPowerActionEvent.cs b/Content.Shared/Actions/Events/NoosphericZapPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/NoosphericZapPowerActionEvent.cs rename to Content.Shared/Actions/Events/NoosphericZapPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PsionicInvisibilityPowerActionEvent.cs b/Content.Shared/Actions/Events/PsionicInvisibilityPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/PsionicInvisibilityPowerActionEvent.cs rename to Content.Shared/Actions/Events/PsionicInvisibilityPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PsionicRegenerationPowerActionEvent.cs b/Content.Shared/Actions/Events/PsionicRegenerationPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/PsionicRegenerationPowerActionEvent.cs rename to Content.Shared/Actions/Events/PsionicRegenerationPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs b/Content.Shared/Actions/Events/PyrokinesisPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/PyrokinesisPowerActionEvent.cs rename to Content.Shared/Actions/Events/PyrokinesisPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs b/Content.Shared/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs rename to Content.Shared/Actions/Events/RemovePsionicInvisibilityOffPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/Actions/Events/TelegnosisPowerActionEvent.cs b/Content.Shared/Actions/Events/TelegnosisPowerActionEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Actions/Events/TelegnosisPowerActionEvent.cs rename to Content.Shared/Actions/Events/TelegnosisPowerActionEvent.cs diff --git a/Content.Shared/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs b/Content.Shared/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs similarity index 100% rename from Content.Shared/Nyanotrasen/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs rename to Content.Shared/CartridgeLoader/Cartridges/GlimmerMonitorUiState.cs diff --git a/Content.Shared/Nyanotrasen/Chapel/SacrificeDoAfterEvent.cs b/Content.Shared/Chapel/SacrificeDoAfterEvent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Chapel/SacrificeDoAfterEvent.cs rename to Content.Shared/Chapel/SacrificeDoAfterEvent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs b/Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/AcceptPsionicsEuiMessage.cs rename to Content.Shared/Psionics/Abilities/AcceptPsionicsEuiMessage.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DamageOnDispelComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispelPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DispelPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs b/Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Dispel/DispellableComponent.cs rename to Content.Shared/Psionics/Abilities/Dispel/DispellableComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs rename to Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs b/Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs rename to Content.Shared/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs b/Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Metapsionics/MetapsionicPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs b/Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs rename to Content.Shared/Psionics/Abilities/MindSwap/MindSwapPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs b/Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs rename to Content.Shared/Psionics/Abilities/NoosphericZap/NoosphericZapPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs b/Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicInvisibility/PsionicInvisibilityUsedComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs b/Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs rename to Content.Shared/Psionics/Abilities/PsionicRegeneration/PsionicRegenerationPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Pyrokinesis/PyrokinesisPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs rename to Content.Shared/Psionics/Abilities/Telegnosis/TelegnosisPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs b/Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs rename to Content.Shared/Psionics/Abilities/Telegnosis/TelegnosticProjectionComponent.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Events.cs b/Content.Shared/Psionics/Events.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Events.cs rename to Content.Shared/Psionics/Events.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs b/Content.Shared/Psionics/Glimmer/GlimmerSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/GlimmerSystem.cs rename to Content.Shared/Psionics/Glimmer/GlimmerSystem.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs b/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs rename to Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveComponent.cs diff --git a/Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs b/Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs rename to Content.Shared/Psionics/Glimmer/SharedGlimmerReactiveVisuals.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs b/Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/ClothingGrantPsionicPowerComponent.cs rename to Content.Shared/Psionics/Items/ClothingGrantPsionicPowerComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs b/Content.Shared/Psionics/Items/HeadCageComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCageComponent.cs rename to Content.Shared/Psionics/Items/HeadCageComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs b/Content.Shared/Psionics/Items/HeadCagedComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/HeadCagedComponent.cs rename to Content.Shared/Psionics/Items/HeadCagedComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs b/Content.Shared/Psionics/Items/PsionicItemsSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/PsionicItemsSystem.cs rename to Content.Shared/Psionics/Items/PsionicItemsSystem.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs b/Content.Shared/Psionics/Items/TinfoilHatComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/Items/TinfoilHatComponent.cs rename to Content.Shared/Psionics/Items/TinfoilHatComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs b/Content.Shared/Psionics/PsionicComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicComponent.cs rename to Content.Shared/Psionics/PsionicComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs b/Content.Shared/Psionics/PsionicInsulationComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicInsulationComponent.cs rename to Content.Shared/Psionics/PsionicInsulationComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs b/Content.Shared/Psionics/PsionicsDisabledComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/PsionicsDisabledComponent.cs rename to Content.Shared/Psionics/PsionicsDisabledComponent.cs diff --git a/Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs b/Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Abilities/Psionics/SharedPsionicAbilitiesSystem.cs rename to Content.Shared/Psionics/SharedPsionicAbilitiesSystem.cs diff --git a/Content.Shared/Nyanotrasen/Soul/GolemMessages.cs b/Content.Shared/Soul/GolemMessages.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/GolemMessages.cs rename to Content.Shared/Soul/GolemMessages.cs diff --git a/Content.Shared/Nyanotrasen/Soul/GunHeldByGolemComponent.cs b/Content.Shared/Soul/GunHeldByGolemComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/GunHeldByGolemComponent.cs rename to Content.Shared/Soul/GunHeldByGolemComponent.cs diff --git a/Content.Shared/Nyanotrasen/Soul/SharedGolemComponent.cs b/Content.Shared/Soul/SharedGolemComponent.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/SharedGolemComponent.cs rename to Content.Shared/Soul/SharedGolemComponent.cs diff --git a/Content.Shared/Nyanotrasen/Soul/SharedGolemSystem.cs b/Content.Shared/Soul/SharedGolemSystem.cs similarity index 100% rename from Content.Shared/Nyanotrasen/Soul/SharedGolemSystem.cs rename to Content.Shared/Soul/SharedGolemSystem.cs From f79c6db8c9549bb595423205004893ed59cb1f8d Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Thu, 8 Aug 2024 07:38:33 +0800 Subject: [PATCH 118/143] New Trait: Sluggish / Snail-Paced (#692) # Description This PR adds two new negative traits that decrease your movement speed: **Sluggish** and **Snail-Paced**. - Sluggish (+1 points) - 15% slower movement speed - 35% slower climbing speed (for standard tables, from 1.5s to ~2.02 seconds) - Cooldown on laying down/standing up increased from 2.5 seconds to 3 seconds - Snail-Paced (+2 points) - 30% slower movement speed - 66% slower climbing speed (for standard tables, from 1.5s to ~2.48 seconds) - Cooldown on laying down/standing up increased from 2.5 seconds to 4 seconds ## Media
Expand **Trait entry** ![image](https://github.com/user-attachments/assets/cb483536-ec3e-4c28-a4b4-c431bb1b669e) ![image](https://github.com/user-attachments/assets/a251844e-7058-4d4b-b21d-a5637c39489f)
# Changelog :cl: Skubman - add: Add two new negative traits: Sluggish (+1) and Snail-Paced (+2) that make you move slower, and climb tables slower. --------- Signed-off-by: Angelo Fallaria Co-authored-by: VMSolidus --- .../Assorted/TraitSpeedModifierComponent.cs | 14 +++++++ .../Assorted/TraitSpeedModifierSystem.cs | 19 ++++++++++ Resources/Locale/en-US/traits/traits.ftl | 12 +++++- Resources/Prototypes/Traits/disabilities.yml | 38 +++++++++++++++++++ Resources/Prototypes/Traits/skills.yml | 6 +++ 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs create mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs new file mode 100644 index 00000000000..6acb32e6c1d --- /dev/null +++ b/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs @@ -0,0 +1,14 @@ +namespace Content.Server.Traits.Assorted; + +/// +/// This component is used for traits that modify movement speed. +/// +[RegisterComponent] +public sealed partial class TraitSpeedModifierComponent : Component +{ + [DataField(required: true)] + public float WalkModifier = 1.0f; + + [DataField(required: true)] + public float SprintModifier = 1.0f; +} diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs new file mode 100644 index 00000000000..c804592347a --- /dev/null +++ b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Movement.Systems; +using Content.Server.Traits.Assorted; + +namespace Content.Shared.Traits.Assorted; + +public sealed class TraitSpeedModifierSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnRefreshMovementSpeed); + } + + private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkModifier, component.SprintModifier); + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 3439ffcdc97..5fb361af01f 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -89,6 +89,16 @@ trait-description-ParkourTraining = Whether as a hobby, lifestyle, or professional training, you are trained in the discipline of parkour. You're faster with climbing, crawling, lying down, and getting up. +trait-name-Sluggish = Sluggish +trait-description-Sluggish = + You navigate the world slower than others, perhaps due to a medical condition, inactivity, or age. + You move slower, and it takes longer for you to climb, lie down and get up. + +trait-name-SnailPaced = Snail-Paced +trait-description-SnailPaced = + You walk at a snail's pace, perhaps due to a medical condition, mobility impairment, or age. + You move substantially slower, and it takes far longer for you to climb, lie down and get up. + trait-name-LightStep = Light Step trait-description-LightStep = You move with a gentle step, making your footsteps quieter. @@ -106,4 +116,4 @@ trait-description-Spearmaster = trait-name-WeaponsGeneralist = Weapons Generalist trait-description-WeaponsGeneralist = You are a jack of all trades with melee weapons, enabling you to be versatile with your weapon arsenal. - Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. \ No newline at end of file + Your melee damage bonus for all Brute damage types (Blunt, Slash, Piercing) becomes 25%. diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index afdd27f339d..c47a673f84a 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -95,6 +95,44 @@ components: - type: Snoring +- type: trait + id: Sluggish + category: Physical + points: 1 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - SnailPaced + components: + - type: TraitSpeedModifier + sprintModifier: 0.85 + walkModifier: 0.85 + - type: ClimbDelayModifier + climbDelayMultiplier: 1.35 + - type: LayingDownModifier + layingDownCooldownMultiplier: 1.2 + +- type: trait + id: SnailPaced + category: Physical + points: 2 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - ParkourTraining + - Sluggish + components: + - type: TraitSpeedModifier + sprintModifier: 0.7 + walkModifier: 0.7 + - type: ClimbDelayModifier + climbDelayMultiplier: 1.66 + - type: LayingDownModifier + layingDownCooldownMultiplier: 1.6 + - type: trait id: BloodDeficiency category: Physical diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 1a4242aff80..0da622da3c9 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -91,6 +91,12 @@ id: ParkourTraining category: Physical points: -3 + requirements: + - !type:CharacterTraitRequirement + inverted: true + traits: + - Sluggish + - SnailPaced components: - type: ClimbDelayModifier climbDelayMultiplier: 0.70 From 04330a4cc89906508db781503f55a2ea8084b770 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:38:58 +0000 Subject: [PATCH 119/143] Automatic Changelog Update (#692) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b7ab981fc63..6de7dc7bf17 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5073,3 +5073,11 @@ Entries: message: Readded Psionic Relay Orb id: 6235 time: '2024-08-07T23:16:30.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add two new negative traits: Sluggish (+1) and Snail-Paced (+2) that + make you move slower, and climb tables slower. + id: 6236 + time: '2024-08-07T23:38:33.0000000+00:00' From 54e59822b6098df2f399c67d3fb7f7b6e2f1cbdd Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Thu, 8 Aug 2024 07:39:52 +0800 Subject: [PATCH 120/143] New Trait: Hemophilia (#690) # Description **Hemophilia** is a +1 point negative Physical trait that makes you more susceptible to bleeding. You bleed twice as long, and you take 10% more Blunt damage. ## Media
Expand ![image](https://github.com/user-attachments/assets/ceb0e91e-73c8-4986-a566-40fb9cd0d32b)
--- # Changelog :cl: Skubman - add: Add the Hemophilia trait, a new negative trait for 1 point that makes you bleed twice as long and makes you take 10% more Blunt damage. --- .../Body/Components/BloodstreamComponent.cs | 2 +- Content.Server/Traits/HemophiliaComponent.cs | 21 ++++++++++++++ Content.Server/Traits/HemophiliaSystem.cs | 28 +++++++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 5 ++++ Resources/Prototypes/Traits/disabilities.yml | 17 +++++++++++ 5 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 Content.Server/Traits/HemophiliaComponent.cs create mode 100644 Content.Server/Traits/HemophiliaSystem.cs diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 76eadb99fd8..dd93da9598c 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -12,7 +12,7 @@ namespace Content.Server.Body.Components { - [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem))] + [RegisterComponent, Access(typeof(BloodstreamSystem), typeof(ReactionMixerSystem), typeof(BloodDeficiencySystem), typeof(HemophiliaSystem))] public sealed partial class BloodstreamComponent : Component { public static string DefaultChemicalsSolutionName = "chemicals"; diff --git a/Content.Server/Traits/HemophiliaComponent.cs b/Content.Server/Traits/HemophiliaComponent.cs new file mode 100644 index 00000000000..e8f1f57c6e5 --- /dev/null +++ b/Content.Server/Traits/HemophiliaComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Damage; +namespace Content.Server.Traits.Assorted; + +/// +/// This is used for the Hemophilia trait. +/// +[RegisterComponent] +public sealed partial class HemophiliaComponent : Component +{ + // + // What the BleedReductionAmount should be multiplied by. + // + [DataField(required: true)] + public float BleedReductionModifier = 1f; + + /// + /// The damage increase from this trait. + /// + [DataField(required: true)] + public DamageModifierSet DamageModifiers = default!; +} diff --git a/Content.Server/Traits/HemophiliaSystem.cs b/Content.Server/Traits/HemophiliaSystem.cs new file mode 100644 index 00000000000..c70c7de37c0 --- /dev/null +++ b/Content.Server/Traits/HemophiliaSystem.cs @@ -0,0 +1,28 @@ +using Content.Server.Body.Systems; +using Content.Server.Body.Components; +using Content.Shared.Damage; + +namespace Content.Server.Traits.Assorted; + +public sealed class HemophiliaSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnDamageModify); + } + + private void OnStartup(EntityUid uid, HemophiliaComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var bloodstream)) + return; + + bloodstream.BleedReductionAmount *= component.BleedReductionModifier; + } + + private void OnDamageModify(EntityUid uid, HemophiliaComponent component, DamageModifyEvent args) + { + args.Damage = DamageSpecifier.ApplyModifierSet(args.Damage, component.DamageModifiers); + } +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 5fb361af01f..16cae663009 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -28,6 +28,11 @@ trait-description-BloodDeficiency = Your body loses more blood than it can replenish. You lose blood over time, and when left untreated you will eventually die from blood loss. +trait-name-Hemophilia = Hemophilia +trait-description-Hemophilia = + Your body's ability to form blood clots is impaired. + You bleed twice as long, and you have easy bruising, taking 10% more Blunt damage. + trait-name-Paracusia = Paracusia trait-description-Paracusia = You hear sounds that aren't really there diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index c47a673f84a..915ea0bf674 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -146,3 +146,20 @@ components: - type: BloodDeficiency # 0.07 = start taking bloodloss damage at around ~21.4 minutes, bloodLossAmount: 0.07 # then become crit ~10 minutes later + +- type: trait + id: Hemophilia + category: Physical + points: 1 + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - Borg + - MedicalBorg + components: + - type: Hemophilia + bleedReductionModifier: 0.5 + damageModifiers: + coefficients: + Blunt: 1.1 From 0fc4051e4f1333da6d8b1ea57531230aa9e48b9b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:40:16 +0000 Subject: [PATCH 121/143] Automatic Changelog Update (#690) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6de7dc7bf17..744677a1147 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5081,3 +5081,11 @@ Entries: make you move slower, and climb tables slower. id: 6236 time: '2024-08-07T23:38:33.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Hemophilia trait, a new negative trait for 1 point that makes + you bleed twice as long and makes you take 10% more Blunt damage. + id: 6237 + time: '2024-08-07T23:39:52.0000000+00:00' From c469961bf9944fdd37da2578f84211e51a075293 Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:51:29 -0400 Subject: [PATCH 122/143] Aloe Cream Recipe Fix, Now 15 Seconds (#688) # Description Changed the cooking time for aloe cream, so now it doesn't interfere with RegenerativeMesh any longer. # Changelog :cl: - fix: Fixed the RegenMesh recipe --- Resources/Prototypes/Recipes/Cooking/medical_recipes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml b/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml index 9d1947f03eb..03ca5203582 100644 --- a/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/medical_recipes.yml @@ -2,7 +2,7 @@ id: RecipeAloeCream name: aloe cream recipe result: AloeCream - time: 10 + time: 15 solids: FoodAloe: 1 From 7ef43ac75251636175c535ea610118b9870704b8 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:51:52 +0000 Subject: [PATCH 123/143] Automatic Changelog Update (#688) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 744677a1147..bb19e08360c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5089,3 +5089,9 @@ Entries: you bleed twice as long and makes you take 10% more Blunt damage. id: 6237 time: '2024-08-07T23:39:52.0000000+00:00' +- author: SleepyScarecrow + changes: + - type: Fix + message: Fixed the RegenMesh recipe + id: 6238 + time: '2024-08-07T23:51:29.0000000+00:00' From f2e6d1a657588be369a9ac0c2a19c9a4962170af Mon Sep 17 00:00:00 2001 From: dootythefrooty <137359445+dootythefrooty@users.noreply.github.com> Date: Wed, 7 Aug 2024 16:54:13 -0700 Subject: [PATCH 124/143] New Plant Trait : Bluespace Slips (#674) # Description Adds a new trait which plants can mutate to have. It teleports both the slippee and the produce to a random location within a radius determined by how potent the produce is. Inert unless the plant also has the slippery trait. ~~Probably very stinky code considering this is my first time dealing with c#.~~ ---

Media

https://github.com/user-attachments/assets/cd22756d-ea5e-4a30-8043-c991549c9019

--- # Changelog :cl: - add: Added Bluespace Slips, a plant trait that teleports you randomly if you slip. --- .../Components/TeleportingTraitComponent.cs | 31 +++++++++++ Content.Server/Botany/SeedPrototype.cs | 8 ++- .../Botany/Systems/BotanySystem.Seed.cs | 5 ++ .../Botany/Systems/MutationSystem.cs | 6 ++- .../Botany/Systems/TeleportingTraitSystem.cs | 51 +++++++++++++++++++ .../teleporting-trait-component.ftl | 1 + 6 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 Content.Server/Botany/Components/TeleportingTraitComponent.cs create mode 100644 Content.Server/Botany/Systems/TeleportingTraitSystem.cs create mode 100644 Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl diff --git a/Content.Server/Botany/Components/TeleportingTraitComponent.cs b/Content.Server/Botany/Components/TeleportingTraitComponent.cs new file mode 100644 index 00000000000..b5f79ac8c7e --- /dev/null +++ b/Content.Server/Botany/Components/TeleportingTraitComponent.cs @@ -0,0 +1,31 @@ +namespace Content.Server.Botany +{ + [RegisterComponent] + + public sealed partial class TeleportingTraitComponent : Component + { + /// + /// Teleportation radius of produce. + /// + [DataField] + public float ProduceTeleportRadius; + + /// + /// How much to divide the potency. + /// + [DataField] + public float PotencyDivide = 10f; + + /// + /// Potency of fruit. + /// + [DataField] + public float Potency; + + /// + /// Chance of deletion. + /// + [DataField] + public float DeletionChance = .5f; + } +} diff --git a/Content.Server/Botany/SeedPrototype.cs b/Content.Server/Botany/SeedPrototype.cs index 1a3c0473a48..2644da2a3b0 100644 --- a/Content.Server/Botany/SeedPrototype.cs +++ b/Content.Server/Botany/SeedPrototype.cs @@ -205,6 +205,11 @@ public partial class SeedData ///
[DataField("ligneous")] public bool Ligneous; + /// + /// If true, teleports both fruit and player if slippable. + /// + [DataField] public bool Teleporting; + // No, I'm not removing these. // if you re-add these, make sure that they get cloned. //public PlantSpread Spread { get; set; } @@ -215,7 +220,6 @@ public partial class SeedData //public bool Hematophage { get; set; } //public bool Thorny { get; set; } //public bool Stinging { get; set; } - // public bool Teleporting { get; set; } // public PlantJuicy Juicy { get; set; } #endregion @@ -295,6 +299,7 @@ public SeedData Clone() Slip = Slip, Sentient = Sentient, Ligneous = Ligneous, + Teleporting = Teleporting, PlantRsi = PlantRsi, PlantIconState = PlantIconState, @@ -358,6 +363,7 @@ public SeedData SpeciesChange(SeedData other) Slip = Slip, Sentient = Sentient, Ligneous = Ligneous, + Teleporting = Teleporting, PlantRsi = other.PlantRsi, PlantIconState = other.PlantIconState, diff --git a/Content.Server/Botany/Systems/BotanySystem.Seed.cs b/Content.Server/Botany/Systems/BotanySystem.Seed.cs index f64fcb3c43d..82190d1c443 100644 --- a/Content.Server/Botany/Systems/BotanySystem.Seed.cs +++ b/Content.Server/Botany/Systems/BotanySystem.Seed.cs @@ -207,6 +207,11 @@ public IEnumerable GenerateProduct(SeedData proto, EntityCoordinates var collisionWake = EnsureComp(entity); _colWakeSystem.SetEnabled(entity, false, collisionWake); } + if (proto.Teleporting) + { + var teleporting = EnsureComp(entity); + TeleportingTraitSystem.SetPotencyRadius(proto.Potency, teleporting); + } } return products; diff --git a/Content.Server/Botany/Systems/MutationSystem.cs b/Content.Server/Botany/Systems/MutationSystem.cs index c7ce5d47efa..4780f8b3310 100644 --- a/Content.Server/Botany/Systems/MutationSystem.cs +++ b/Content.Server/Botany/Systems/MutationSystem.cs @@ -40,7 +40,7 @@ public void MutateSeed(ref SeedData seed, float severity) } // Add up everything in the bits column and put the number here. - const int totalbits = 275; + const int totalbits = 285; // Tolerances (55) MutateFloat(ref seed.NutrientConsumption , 0.05f, 1.2f, 5, totalbits, severity); @@ -66,11 +66,12 @@ public void MutateSeed(ref SeedData seed, float severity) // Kill the plant (30) MutateBool(ref seed.Viable , false, 30, totalbits, severity); - // Fun (90) + // Fun (100) MutateBool(ref seed.Seedless , true , 10, totalbits, severity); MutateBool(ref seed.Slip , true , 10, totalbits, severity); MutateBool(ref seed.Sentient , true , 10, totalbits, severity); MutateBool(ref seed.Ligneous , true , 10, totalbits, severity); + MutateBool(ref seed.Teleporting , true , 10, totalbits, severity); MutateBool(ref seed.Bioluminescent, true , 10, totalbits, severity); MutateBool(ref seed.TurnIntoKudzu , true , 10, totalbits, severity); MutateBool(ref seed.CanScream , true , 10, totalbits, severity); @@ -120,6 +121,7 @@ public SeedData Cross(SeedData a, SeedData b) CrossBool(ref result.Slip, a.Slip); CrossBool(ref result.Sentient, a.Sentient); CrossBool(ref result.Ligneous, a.Ligneous); + CrossBool(ref result.Teleporting, a.Teleporting); CrossBool(ref result.Bioluminescent, a.Bioluminescent); CrossBool(ref result.TurnIntoKudzu, a.TurnIntoKudzu); CrossBool(ref result.CanScream, a.CanScream); diff --git a/Content.Server/Botany/Systems/TeleportingTraitSystem.cs b/Content.Server/Botany/Systems/TeleportingTraitSystem.cs new file mode 100644 index 00000000000..7aa9a6a82ab --- /dev/null +++ b/Content.Server/Botany/Systems/TeleportingTraitSystem.cs @@ -0,0 +1,51 @@ +using Robust.Shared.Random; +using Content.Shared.Slippery; +using Content.Server.Fluids.EntitySystems; +using Content.Shared.Chemistry.Components; +using Content.Shared.Popups; + +namespace Content.Server.Botany.Systems; + +public sealed class TeleportingTraitSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _xform = default!; + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly PuddleSystem _puddle = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(Teleport); + } + + // sets the potency and the radius + public static void SetPotencyRadius(float seedPotency, TeleportingTraitComponent comp) + { + comp.Potency = seedPotency; + comp.ProduceTeleportRadius = comp.Potency / comp.PotencyDivide; + } + + // teleports both the produce and the foolish fool who slipped on it to a random postion limited by the radius + private void Teleport(EntityUid uid, TeleportingTraitComponent comp, ref SlipEvent args) + { + var coordinates = Transform(uid).Coordinates; + _xform.SetCoordinates(uid, coordinates.Offset(_random.NextVector2(comp.ProduceTeleportRadius))); + _popup.PopupEntity(Loc.GetString("teleporting-trait-component-slipped"), args.Slipped, args.Slipped, PopupType.SmallCaution); + _xform.SetCoordinates(args.Slipped, coordinates.Offset(_random.NextVector2(comp.ProduceTeleportRadius))); + VanishProbablity(uid, comp); + } + + // chance of being deleted and then spawnin the goop + private void VanishProbablity(EntityUid uid, TeleportingTraitComponent comp) + { + if (!_random.Prob(comp.DeletionChance)) + return; + Solution vanishSolution = new(); + vanishSolution.AddReagent("Slime", comp.Potency / 2); + _puddle.TrySpillAt(uid, vanishSolution, out _); + QueueDel(uid); + } +} + diff --git a/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl b/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl new file mode 100644 index 00000000000..c38b8605f2b --- /dev/null +++ b/Resources/Locale/en-US/botany/components/teleporting-trait-component.ftl @@ -0,0 +1 @@ +teleporting-trait-component-slipped = You slip through bluespace! From a243fca7063844cb2ec13bafce52e216f94f5cb9 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Wed, 7 Aug 2024 23:54:35 +0000 Subject: [PATCH 125/143] Automatic Changelog Update (#674) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bb19e08360c..0aff29d638c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5095,3 +5095,11 @@ Entries: message: Fixed the RegenMesh recipe id: 6238 time: '2024-08-07T23:51:29.0000000+00:00' +- author: dootythefrooty + changes: + - type: Add + message: >- + Added Bluespace Slips, a plant trait that teleports you randomly if you + slip. + id: 6239 + time: '2024-08-07T23:54:13.0000000+00:00' From 4c4b37aacca1448842155a9a1bafa0d002e1c890 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 20:09:41 -0400 Subject: [PATCH 126/143] 1984 Dresser Arbitrage 2, Electric Boogaloo (#682) # Description @DEATHB4DEFEAT ![image](https://github.com/user-attachments/assets/0ee6b468-7959-4ebd-8202-6fbc2794511c) No changelog because this isn't player facing. --- Resources/Prototypes/Entities/Structures/Furniture/dresser.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 6c50b334091..1d0a25ed852 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -52,7 +52,7 @@ suffix: Filled components: - type: StaticPrice - price: 5 + price: 15 - type: StorageFill contents: - id: ClothingNeckLGBTPin From 9b112609e009fedccf7adb70292af914752fcd2c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 20:10:21 -0400 Subject: [PATCH 127/143] Respace Psionics Audio & Localization Files (#700) # Description Effectively Part 2 of splitting up the Psionic Refactor. This PR is partially respacing the non-C# side of Psionics code, such as Localizations, Audio files, some entities. I'm not respacing all of them in a single sitting because just finding them all is a complete pain in the ass. No media because there's nothing to show. No changelog because this isn't player facing. --- .../Ambience/Objects/prober_hum_dangerous.ogg | Bin .../Ambience/Objects/prober_hum_high.ogg | Bin .../Ambience/Objects/prober_hum_low.ogg | Bin .../Ambience/Objects/prober_hum_moderate.ogg | Bin .../Psionics/attributions.yml | 0 .../Psionics/heartbeat_fast.ogg | Bin .../{nyanotrasen => }/abilities/psionic.ftl | 0 .../en-US/cartridge-loader/cartridges.ftl | 5 + .../en-US/chemistry/reagent-effects.ftl | 2 +- .../en-US/guidebook/chemistry/effects.ftl | 18 +++ Resources/Locale/en-US/guidebook/guides.ftl | 4 + .../cartridge-loader/cartridges.ftl | 4 - .../en-US/nyanotrasen/chemistry/effects.ftl | 18 --- .../en-US/nyanotrasen/guidebook/guides.ftl | 3 - .../en-US/nyanotrasen/reagents/toxins.ftl | 8 - .../xenoarchaeology/artifact-hints.ftl | 1 - .../paper => psionics}/book-epistemics.ftl | 0 .../cargo => psionics}/cargo-epistemics.ftl | 0 .../{nyanotrasen => }/psionics/death-gasp.ftl | 0 .../crates => psionics}/epistemics-crates.ftl | 0 .../events => psionics}/noospheric-storm.ftl | 0 .../objectives.ftl} | 0 .../research => psionics}/oracle.ftl | 0 .../psionics/psionic-chat.ftl | 0 .../psionics/psionic-commands.ftl | 0 .../paper => psionics}/stamp-component.ftl | 0 .../research => psionics}/technologies.ftl | 0 .../Locale/en-US/reagents/meta/toxins.ftl | 9 ++ .../{nyanotrasen => }/reagents/psionic.ftl | 0 .../en-US/xenoarchaeology/artifact-hints.ftl | 3 + Resources/Prototypes/Actions/psionics.yml | 136 +++++++++++++++++ .../Prototypes/Nyanotrasen/Actions/types.yml | 139 +----------------- .../Structures/Research/glimmer_prober.yml | 14 +- .../Interface/VerbIcons/dispel.png | Bin .../Interface/VerbIcons/dispel.png.yml | 0 .../Interface/VerbIcons/license.txt | 0 .../Interface/VerbIcons/mass_sleep.png | Bin .../Interface/VerbIcons/mass_sleep.png.yml | 0 .../Interface/VerbIcons/metapsionic.png | Bin .../Interface/VerbIcons/metapsionic.png.yml | 0 .../Interface/VerbIcons/mind_swap.png | Bin .../Interface/VerbIcons/mind_swap.png.yml | 0 .../Interface/VerbIcons/mind_swap_return.png | Bin .../VerbIcons/mind_swap_return.png.yml | 0 .../Interface/VerbIcons/noospheric_zap.png | Bin .../VerbIcons/noospheric_zap.png.yml | 0 .../VerbIcons/psionic_invisibility.png | Bin .../VerbIcons/psionic_invisibility.png.yml | 0 .../VerbIcons/psionic_invisibility_off.png | Bin .../psionic_invisibility_off.png.yml | 0 .../VerbIcons/psionic_regeneration.png | Bin .../VerbIcons/psionic_regeneration.png.yml | 0 .../Interface/VerbIcons/pyrokinesis.png | Bin .../Interface/VerbIcons/pyrokinesis.png.yml | 0 .../Interface/VerbIcons/telegnosis.png | Bin .../Interface/VerbIcons/telegnosis.png.yml | 0 56 files changed, 184 insertions(+), 180 deletions(-) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_dangerous.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_high.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_low.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Ambience/Objects/prober_hum_moderate.ogg (100%) rename Resources/Audio/{Nyanotrasen => }/Psionics/attributions.yml (100%) rename Resources/Audio/{Nyanotrasen => }/Psionics/heartbeat_fast.ogg (100%) rename Resources/Locale/en-US/{nyanotrasen => }/abilities/psionic.ftl (100%) delete mode 100644 Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl delete mode 100644 Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl rename Resources/Locale/en-US/{nyanotrasen/paper => psionics}/book-epistemics.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/prototypes/catalog/cargo => psionics}/cargo-epistemics.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/psionics/death-gasp.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/prototypes/catalog/fills/crates => psionics}/epistemics-crates.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/station-events/events => psionics}/noospheric-storm.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/objectives/conditions/conditions.ftl => psionics/objectives.ftl} (100%) rename Resources/Locale/en-US/{nyanotrasen/research => psionics}/oracle.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/psionics/psionic-chat.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/psionics/psionic-commands.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/paper => psionics}/stamp-component.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen/research => psionics}/technologies.ftl (100%) rename Resources/Locale/en-US/{nyanotrasen => }/reagents/psionic.ftl (100%) create mode 100644 Resources/Prototypes/Actions/psionics.yml rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/dispel.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/dispel.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/license.txt (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mass_sleep.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mass_sleep.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/metapsionic.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/metapsionic.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap_return.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/mind_swap_return.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/noospheric_zap.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/noospheric_zap.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility_off.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_invisibility_off.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_regeneration.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/psionic_regeneration.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/pyrokinesis.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/pyrokinesis.png.yml (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/telegnosis.png (100%) rename Resources/Textures/{Nyanotrasen => }/Interface/VerbIcons/telegnosis.png.yml (100%) diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg b/Resources/Audio/Ambience/Objects/prober_hum_dangerous.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_dangerous.ogg diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_high.ogg b/Resources/Audio/Ambience/Objects/prober_hum_high.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_high.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_high.ogg diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg b/Resources/Audio/Ambience/Objects/prober_hum_low.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_low.ogg diff --git a/Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_moderate.ogg b/Resources/Audio/Ambience/Objects/prober_hum_moderate.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Ambience/Objects/prober_hum_moderate.ogg rename to Resources/Audio/Ambience/Objects/prober_hum_moderate.ogg diff --git a/Resources/Audio/Nyanotrasen/Psionics/attributions.yml b/Resources/Audio/Psionics/attributions.yml similarity index 100% rename from Resources/Audio/Nyanotrasen/Psionics/attributions.yml rename to Resources/Audio/Psionics/attributions.yml diff --git a/Resources/Audio/Nyanotrasen/Psionics/heartbeat_fast.ogg b/Resources/Audio/Psionics/heartbeat_fast.ogg similarity index 100% rename from Resources/Audio/Nyanotrasen/Psionics/heartbeat_fast.ogg rename to Resources/Audio/Psionics/heartbeat_fast.ogg diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl b/Resources/Locale/en-US/abilities/psionic.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/abilities/psionic.ftl rename to Resources/Locale/en-US/abilities/psionic.ftl diff --git a/Resources/Locale/en-US/cartridge-loader/cartridges.ftl b/Resources/Locale/en-US/cartridge-loader/cartridges.ftl index f5cda2f2a18..cfa1b1424d2 100644 --- a/Resources/Locale/en-US/cartridge-loader/cartridges.ftl +++ b/Resources/Locale/en-US/cartridge-loader/cartridges.ftl @@ -19,3 +19,8 @@ log-probe-scan = Downloaded logs from {$device}! log-probe-label-time = Time log-probe-label-accessor = Accessed by log-probe-label-number = # + +glimmer-monitor-program-name = Glimmer Monitor +glimmer-monitor-current-glimmer = Current Glimmer: {$glimmer}Ψ +glimmer-monitor-interval = Interval +glimmer-monitor-sync = Sync diff --git a/Resources/Locale/en-US/chemistry/reagent-effects.ftl b/Resources/Locale/en-US/chemistry/reagent-effects.ftl index 537770b35a5..cb55db111d6 100644 --- a/Resources/Locale/en-US/chemistry/reagent-effects.ftl +++ b/Resources/Locale/en-US/chemistry/reagent-effects.ftl @@ -1 +1 @@ -effect-sleepy = You feel a bit sleepy. +effect-sleepy = You feel a bit sleepy. \ No newline at end of file diff --git a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl index b6f45d23862..db2f3816f6b 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl @@ -344,3 +344,21 @@ reagent-effect-guidebook-missing = [1] Causes *[other] cause } an unknown effect as nobody has written this effect yet + +reagent-effect-guidebook-change-glimmer-reaction-effect = + { $chance -> + [1] Modifies + *[other] modify + } the glimmer count by {$count} points + +reagent-effect-guidebook-chem-remove-psionic = + { $chance -> + [1] Removes + *[other] remove + } psionic powers + +reagent-effect-guidebook-chem-reroll-psionic = + { $chance -> + [1] Allows + *[other] allow + } a chance to get a different psionic power \ No newline at end of file diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index 72746dbf51f..968d3b20038 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -70,3 +70,7 @@ guide-entry-space-ninja = Space Ninja guide-entry-writing = Writing guide-entry-glossary = Glossary + +guide-entry-altars-golemancy = Altars and Golemancy +guide-entry-psionics = Psionics +guide-entry-reverse-engineering = Reverse Engineering diff --git a/Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl b/Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl deleted file mode 100644 index 906466bc10f..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/cartridge-loader/cartridges.ftl +++ /dev/null @@ -1,4 +0,0 @@ -glimmer-monitor-program-name = Glimmer Monitor -glimmer-monitor-current-glimmer = Current Glimmer: {$glimmer}Ψ -glimmer-monitor-interval = Interval -glimmer-monitor-sync = Sync diff --git a/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl b/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl index 19aeebee69e..8d0c96f13c5 100644 --- a/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl +++ b/Resources/Locale/en-US/nyanotrasen/chemistry/effects.ftl @@ -1,21 +1,3 @@ -reagent-effect-guidebook-change-glimmer-reaction-effect = - { $chance -> - [1] Modifies - *[other] modify - } the glimmer count by {$count} points - -reagent-effect-guidebook-chem-remove-psionic = - { $chance -> - [1] Removes - *[other] remove - } psionic powers - -reagent-effect-guidebook-chem-reroll-psionic = - { $chance -> - [1] Allows - *[other] allow - } a chance to get a different psionic power - ## Disease System support reagent-effect-guidebook-chem-miasma-pool = diff --git a/Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl b/Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl deleted file mode 100644 index 60166b82598..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/guidebook/guides.ftl +++ /dev/null @@ -1,3 +0,0 @@ -guide-entry-altars-golemancy = Altars and Golemancy -guide-entry-psionics = Psionics -guide-entry-reverse-engineering = Reverse Engineering diff --git a/Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl b/Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl deleted file mode 100644 index 43e35c191c9..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/reagents/toxins.ftl +++ /dev/null @@ -1,8 +0,0 @@ -reagent-name-soulbreaker-toxin = soulbreaker toxin -reagent-desc-soulbreaker-toxin = An anti-psionic about 4 times as powerful as mindbreaker toxin. - -reagent-name-lotophagoi-oil = lotophagoi oil -reagent-desc-lotophagoi-oil = A super potent drug that is much better at inducing psionics than normal hallucinogens, but with worse side effects. - -reagent-name-ectoplasm = ectoplasm -reagent-desc-ectoplasm = The physical component of semi-corporeal spirits. diff --git a/Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl deleted file mode 100644 index e07aa0a0322..00000000000 --- a/Resources/Locale/en-US/nyanotrasen/xenoarchaeology/artifact-hints.ftl +++ /dev/null @@ -1 +0,0 @@ -artifact-effect-hint-psionic = Noöspheric disturbance diff --git a/Resources/Locale/en-US/nyanotrasen/paper/book-epistemics.ftl b/Resources/Locale/en-US/psionics/book-epistemics.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/paper/book-epistemics.ftl rename to Resources/Locale/en-US/psionics/book-epistemics.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/prototypes/catalog/cargo/cargo-epistemics.ftl b/Resources/Locale/en-US/psionics/cargo-epistemics.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/prototypes/catalog/cargo/cargo-epistemics.ftl rename to Resources/Locale/en-US/psionics/cargo-epistemics.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/death-gasp.ftl b/Resources/Locale/en-US/psionics/death-gasp.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/psionics/death-gasp.ftl rename to Resources/Locale/en-US/psionics/death-gasp.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/prototypes/catalog/fills/crates/epistemics-crates.ftl b/Resources/Locale/en-US/psionics/epistemics-crates.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/prototypes/catalog/fills/crates/epistemics-crates.ftl rename to Resources/Locale/en-US/psionics/epistemics-crates.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/station-events/events/noospheric-storm.ftl b/Resources/Locale/en-US/psionics/noospheric-storm.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/station-events/events/noospheric-storm.ftl rename to Resources/Locale/en-US/psionics/noospheric-storm.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/objectives/conditions/conditions.ftl b/Resources/Locale/en-US/psionics/objectives.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/objectives/conditions/conditions.ftl rename to Resources/Locale/en-US/psionics/objectives.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/research/oracle.ftl b/Resources/Locale/en-US/psionics/oracle.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/research/oracle.ftl rename to Resources/Locale/en-US/psionics/oracle.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psionic-chat.ftl b/Resources/Locale/en-US/psionics/psionic-chat.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/psionics/psionic-chat.ftl rename to Resources/Locale/en-US/psionics/psionic-chat.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/psionics/psionic-commands.ftl b/Resources/Locale/en-US/psionics/psionic-commands.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/psionics/psionic-commands.ftl rename to Resources/Locale/en-US/psionics/psionic-commands.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl b/Resources/Locale/en-US/psionics/stamp-component.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/paper/stamp-component.ftl rename to Resources/Locale/en-US/psionics/stamp-component.ftl diff --git a/Resources/Locale/en-US/nyanotrasen/research/technologies.ftl b/Resources/Locale/en-US/psionics/technologies.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/research/technologies.ftl rename to Resources/Locale/en-US/psionics/technologies.ftl diff --git a/Resources/Locale/en-US/reagents/meta/toxins.ftl b/Resources/Locale/en-US/reagents/meta/toxins.ftl index eb8422e66cf..fa2a813d1d6 100644 --- a/Resources/Locale/en-US/reagents/meta/toxins.ftl +++ b/Resources/Locale/en-US/reagents/meta/toxins.ftl @@ -75,3 +75,12 @@ reagent-desc-vestine = Has an adverse reaction within the body causing major jit reagent-name-tazinide = tazinide reagent-desc-tazinide = A highly dangerous metallic mixture which can interfere with most movement through an electrifying current. + +reagent-name-soulbreaker-toxin = soulbreaker toxin +reagent-desc-soulbreaker-toxin = An anti-psionic about 4 times as powerful as mindbreaker toxin. + +reagent-name-lotophagoi-oil = lotophagoi oil +reagent-desc-lotophagoi-oil = A super potent drug that is much better at inducing psionics than normal hallucinogens, but with worse side effects. + +reagent-name-ectoplasm = ectoplasm +reagent-desc-ectoplasm = The physical component of semi-corporeal spirits. diff --git a/Resources/Locale/en-US/nyanotrasen/reagents/psionic.ftl b/Resources/Locale/en-US/reagents/psionic.ftl similarity index 100% rename from Resources/Locale/en-US/nyanotrasen/reagents/psionic.ftl rename to Resources/Locale/en-US/reagents/psionic.ftl diff --git a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl index 98dfa89fa9f..a139c2036e1 100644 --- a/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl +++ b/Resources/Locale/en-US/xenoarchaeology/artifact-hints.ftl @@ -40,3 +40,6 @@ artifact-trigger-hint-regular-gases = Standard atmospheric gases artifact-trigger-hint-plasma = Gaseous plasma artifact-trigger-hint-land = Active deceleration artifact-trigger-hint-examine = Examination + +# Psionic Effects +artifact-effect-hint-psionic = Noöspheric disturbance diff --git a/Resources/Prototypes/Actions/psionics.yml b/Resources/Prototypes/Actions/psionics.yml new file mode 100644 index 00000000000..62a7fc014cd --- /dev/null +++ b/Resources/Prototypes/Actions/psionics.yml @@ -0,0 +1,136 @@ +- type: entity + id: ActionDispel + name: action-name-dispel + description: action-description-dispel + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/dispel.png + useDelay: 45 + checkCanAccess: false + range: 6 + itemIconStyle: BigAction + canTargetSelf: false + event: !type:DispelPowerActionEvent + +- type: entity + id: ActionMassSleep + name: action-name-mass-sleep + description: action-description-mass-sleep + noSpawn: true + components: + - type: WorldTargetAction + icon: Interface/VerbIcons/mass_sleep.png + useDelay: 60 + checkCanAccess: false + range: 8 + itemIconStyle: BigAction + event: !type:MassSleepPowerActionEvent + +- type: entity + id: ActionMindSwap + name: action-name-mind-swap + description: action-description-mind-swap + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/mind_swap.png + useDelay: 240 + checkCanAccess: false + range: 8 + itemIconStyle: BigAction + event: !type:MindSwapPowerActionEvent + +- type: entity + id: ActionMindSwapReturn + name: action-name-mind-swap-return + description: action-description-mind-swap-return + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/mind_swap_return.png + useDelay: 20 + checkCanInteract: false + event: !type:MindSwapPowerReturnActionEvent + +- type: entity + id: ActionNoosphericZap + name: action-name-noospheric-zap + description: action-description-noospheric-zap + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/noospheric_zap.png + useDelay: 100 + range: 5 + itemIconStyle: BigAction + event: !type:NoosphericZapPowerActionEvent + +- type: entity + id: ActionPyrokinesis + name: action-name-pyrokinesis + description: action-description-pyrokinesis + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/VerbIcons/pyrokinesis.png + useDelay: 50 + range: 6 + checkCanAccess: false + itemIconStyle: BigAction + event: !type:PyrokinesisPowerActionEvent + +- type: entity + id: ActionMetapsionic + name: action-name-metapsionic + description: action-description-metapsionic + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/metapsionic.png + useDelay: 45 + event: !type:MetapsionicPowerActionEvent + +- type: entity + id: ActionPsionicRegeneration + name: action-name-psionic-regeneration + description: action-description-psionic-regeneration + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/psionic_regeneration.png + useDelay: 120 + event: !type:PsionicRegenerationPowerActionEvent + +- type: entity + id: ActionTelegnosis + name: action-name-telegnosis + description: action-description-telegnosis + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/telegnosis.png + useDelay: 150 + event: !type:TelegnosisPowerActionEvent + +- type: entity + id: ActionPsionicInvisibility + name: action-name-psionic-invisibility + description: action-description-psionic-invisibility + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/psionic_invisibility.png + useDelay: 120 + event: !type:PsionicInvisibilityPowerActionEvent + +- type: entity + id: ActionPsionicInvisibilityUsed + name: action-name-psionic-invisibility-off + description: action-description-psionic-invisibility-off + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/psionic_invisibility_off.png + event: !type:RemovePsionicInvisibilityOffPowerActionEvent + diff --git a/Resources/Prototypes/Nyanotrasen/Actions/types.yml b/Resources/Prototypes/Nyanotrasen/Actions/types.yml index 04002f5755d..cab8f4a1f4e 100644 --- a/Resources/Prototypes/Nyanotrasen/Actions/types.yml +++ b/Resources/Prototypes/Nyanotrasen/Actions/types.yml @@ -18,141 +18,4 @@ charges: 1 icon: { sprite: Nyanotrasen/Objects/Specific/Species/felinid.rsi, state: icon } useDelay: 30 - event: !type:HairballActionEvent - -- type: entity - id: ActionDispel - name: action-name-dispel - description: action-description-dispel - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/dispel.png - useDelay: 45 - checkCanAccess: false - range: 6 - itemIconStyle: BigAction - canTargetSelf: false - event: !type:DispelPowerActionEvent - -- type: entity - id: ActionMassSleep - name: action-name-mass-sleep - description: action-description-mass-sleep - noSpawn: true - components: - - type: WorldTargetAction - icon: Nyanotrasen/Interface/VerbIcons/mass_sleep.png - useDelay: 60 - checkCanAccess: false - range: 8 - itemIconStyle: BigAction - event: !type:MassSleepPowerActionEvent - -- type: entity - id: ActionMindSwap - name: action-name-mind-swap - description: action-description-mind-swap - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/mind_swap.png - useDelay: 240 - checkCanAccess: false - range: 8 - itemIconStyle: BigAction - event: !type:MindSwapPowerActionEvent - -- type: entity - id: ActionMindSwapReturn - name: action-name-mind-swap-return - description: action-description-mind-swap-return - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/mind_swap_return.png - useDelay: 20 - checkCanInteract: false - event: !type:MindSwapPowerReturnActionEvent - -- type: entity - id: ActionNoosphericZap - name: action-name-noospheric-zap - description: action-description-noospheric-zap - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/noospheric_zap.png - useDelay: 100 - range: 5 - itemIconStyle: BigAction - event: !type:NoosphericZapPowerActionEvent - -- type: entity - id: ActionPyrokinesis - name: action-name-pyrokinesis - description: action-description-pyrokinesis - noSpawn: true - components: - - type: EntityTargetAction - icon: Nyanotrasen/Interface/VerbIcons/pyrokinesis.png - useDelay: 50 - range: 6 - checkCanAccess: false - itemIconStyle: BigAction - event: !type:PyrokinesisPowerActionEvent - -- type: entity - id: ActionMetapsionic - name: action-name-metapsionic - description: action-description-metapsionic - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/metapsionic.png - useDelay: 45 - event: !type:MetapsionicPowerActionEvent - -- type: entity - id: ActionPsionicRegeneration - name: action-name-psionic-regeneration - description: action-description-psionic-regeneration - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png - useDelay: 120 - event: !type:PsionicRegenerationPowerActionEvent - -- type: entity - id: ActionTelegnosis - name: action-name-telegnosis - description: action-description-telegnosis - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/telegnosis.png - useDelay: 150 - event: !type:TelegnosisPowerActionEvent - -- type: entity - id: ActionPsionicInvisibility - name: action-name-psionic-invisibility - description: action-description-psionic-invisibility - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png - useDelay: 120 - event: !type:PsionicInvisibilityPowerActionEvent - -- type: entity - id: ActionPsionicInvisibilityUsed - name: action-name-psionic-invisibility-off - description: action-description-psionic-invisibility-off - noSpawn: true - components: - - type: InstantAction - icon: Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png - event: !type:RemovePsionicInvisibilityOffPowerActionEvent - + event: !type:HairballActionEvent \ No newline at end of file diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml index e157f8b7ff4..102000f8b26 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Research/glimmer_prober.yml @@ -67,22 +67,22 @@ - type: AmbientSound range: 6 volume: -6 - sound: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg + sound: /Audio/Ambience/Objects/prober_hum_low.ogg - type: AmbientOnPowered - type: GlimmerSound glimmerTier: Minimal: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg + path: /Audio/Ambience/Objects/prober_hum_low.ogg Low: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_low.ogg + path: /Audio/Ambience/Objects/prober_hum_low.ogg Moderate: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_moderate.ogg + path: /Audio/Ambience/Objects/prober_hum_moderate.ogg High: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_high.ogg + path: /Audio/Ambience/Objects/prober_hum_high.ogg Dangerous: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg + path: /Audio/Ambience/Objects/prober_hum_dangerous.ogg Critical: - path: /Audio/Nyanotrasen/Ambience/Objects/prober_hum_dangerous.ogg + path: /Audio/Ambience/Objects/prober_hum_dangerous.ogg - type: entity parent: BaseMachinePowered diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png b/Resources/Textures/Interface/VerbIcons/dispel.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png rename to Resources/Textures/Interface/VerbIcons/dispel.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png.yml b/Resources/Textures/Interface/VerbIcons/dispel.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/dispel.png.yml rename to Resources/Textures/Interface/VerbIcons/dispel.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/license.txt b/Resources/Textures/Interface/VerbIcons/license.txt similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/license.txt rename to Resources/Textures/Interface/VerbIcons/license.txt diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png b/Resources/Textures/Interface/VerbIcons/mass_sleep.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png rename to Resources/Textures/Interface/VerbIcons/mass_sleep.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png.yml b/Resources/Textures/Interface/VerbIcons/mass_sleep.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mass_sleep.png.yml rename to Resources/Textures/Interface/VerbIcons/mass_sleep.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png b/Resources/Textures/Interface/VerbIcons/metapsionic.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png rename to Resources/Textures/Interface/VerbIcons/metapsionic.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png.yml b/Resources/Textures/Interface/VerbIcons/metapsionic.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/metapsionic.png.yml rename to Resources/Textures/Interface/VerbIcons/metapsionic.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png b/Resources/Textures/Interface/VerbIcons/mind_swap.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png rename to Resources/Textures/Interface/VerbIcons/mind_swap.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png.yml b/Resources/Textures/Interface/VerbIcons/mind_swap.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap.png.yml rename to Resources/Textures/Interface/VerbIcons/mind_swap.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png b/Resources/Textures/Interface/VerbIcons/mind_swap_return.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png rename to Resources/Textures/Interface/VerbIcons/mind_swap_return.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png.yml b/Resources/Textures/Interface/VerbIcons/mind_swap_return.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/mind_swap_return.png.yml rename to Resources/Textures/Interface/VerbIcons/mind_swap_return.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png b/Resources/Textures/Interface/VerbIcons/noospheric_zap.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png rename to Resources/Textures/Interface/VerbIcons/noospheric_zap.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png.yml b/Resources/Textures/Interface/VerbIcons/noospheric_zap.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/noospheric_zap.png.yml rename to Resources/Textures/Interface/VerbIcons/noospheric_zap.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png b/Resources/Textures/Interface/VerbIcons/psionic_invisibility.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_invisibility.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility.png.yml rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png b/Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_invisibility_off.png.yml rename to Resources/Textures/Interface/VerbIcons/psionic_invisibility_off.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png b/Resources/Textures/Interface/VerbIcons/psionic_regeneration.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png rename to Resources/Textures/Interface/VerbIcons/psionic_regeneration.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png.yml b/Resources/Textures/Interface/VerbIcons/psionic_regeneration.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/psionic_regeneration.png.yml rename to Resources/Textures/Interface/VerbIcons/psionic_regeneration.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png b/Resources/Textures/Interface/VerbIcons/pyrokinesis.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png rename to Resources/Textures/Interface/VerbIcons/pyrokinesis.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png.yml b/Resources/Textures/Interface/VerbIcons/pyrokinesis.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/pyrokinesis.png.yml rename to Resources/Textures/Interface/VerbIcons/pyrokinesis.png.yml diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png b/Resources/Textures/Interface/VerbIcons/telegnosis.png similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png rename to Resources/Textures/Interface/VerbIcons/telegnosis.png diff --git a/Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png.yml b/Resources/Textures/Interface/VerbIcons/telegnosis.png.yml similarity index 100% rename from Resources/Textures/Nyanotrasen/Interface/VerbIcons/telegnosis.png.yml rename to Resources/Textures/Interface/VerbIcons/telegnosis.png.yml From e9e10f29b69cef5b79114caec0786de3b801d757 Mon Sep 17 00:00:00 2001 From: BlueHNT <79374236+BlueHNT@users.noreply.github.com> Date: Thu, 8 Aug 2024 02:16:02 +0200 Subject: [PATCH 128/143] Updates WelderRefinable Component (#687) # Description I have made this originally for N14 as there was a heavy need for junk items to be list instead of a hash. It created a few issues where you were unable to put down 2 pieces of steel without making a new defined entity which spawns a stack of 2. I thought this was quite annoying so I decided to instead make it into a `EntitySpawnEntry` from a `string` which would also give it options of `amount` `prob` `maxAmount` and `orGroup` which would definitely aid in the scrapping needs there as you could randomize the refined amounts. I believe this could be useful upstream. As well as cleaning up code which is more modifiable than before. The new example of how it can be typed in yaml is also simpler in my opinion as it is self-explanatory and used in various places like StorageFill contents for one. ```YAML - type: WelderRefinable refineResult: - id: SheetGlass1 amount: 1 maxAmount: 2 prob: 0.5 orGroup: Glass ``` --- :cl: refactor: Refactors WelderRefinableComponent.cs and RefiningSystem.cs tweak: Tweaked the formatting for WelderRefinable refineResult to use EntitySpawnEntry format --- .../Components/WelderRefinableComponent.cs | 13 +++++----- Content.Server/Construction/RefiningSystem.cs | 15 +++-------- .../Entities/Objects/Materials/shards.yml | 18 ++++++------- .../Entities/Objects/Misc/broken_bottle.yml | 2 +- .../Entities/Objects/Power/lights.yml | 26 +++++++++---------- 5 files changed, 33 insertions(+), 41 deletions(-) diff --git a/Content.Server/Construction/Components/WelderRefinableComponent.cs b/Content.Server/Construction/Components/WelderRefinableComponent.cs index 9d8958f7614..dc3074f1958 100644 --- a/Content.Server/Construction/Components/WelderRefinableComponent.cs +++ b/Content.Server/Construction/Components/WelderRefinableComponent.cs @@ -1,5 +1,6 @@ using Content.Shared.Tools; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Content.Shared.Storage; +using Robust.Shared.Prototypes; namespace Content.Server.Construction.Components { @@ -10,13 +11,13 @@ namespace Content.Server.Construction.Components [RegisterComponent] public sealed partial class WelderRefinableComponent : Component { - [DataField("refineResult")] - public HashSet? RefineResult = new(); + [DataField] + public List RefineResult = new(); - [DataField("refineTime")] + [DataField] public float RefineTime = 2f; - [DataField("qualityNeeded", customTypeSerializer:typeof(PrototypeIdSerializer))] - public string QualityNeeded = "Welding"; + [DataField] + public ProtoId QualityNeeded = "Welding"; } } diff --git a/Content.Server/Construction/RefiningSystem.cs b/Content.Server/Construction/RefiningSystem.cs index b9d80c7170a..d4df8b0916b 100644 --- a/Content.Server/Construction/RefiningSystem.cs +++ b/Content.Server/Construction/RefiningSystem.cs @@ -1,11 +1,8 @@ using Content.Server.Construction.Components; using Content.Server.Stack; using Content.Shared.Construction; -using Content.Shared.DoAfter; using Content.Shared.Interaction; -using Content.Shared.Stacks; -using Content.Shared.Tools; -using Robust.Shared.Serialization; +using Content.Shared.Storage; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; namespace Content.Server.Construction @@ -13,7 +10,6 @@ namespace Content.Server.Construction public sealed class RefiningSystem : EntitySystem { [Dependency] private readonly SharedToolSystem _toolSystem = default!; - [Dependency] private readonly StackSystem _stackSystem = default!; public override void Initialize() { base.Initialize(); @@ -39,14 +35,9 @@ private void OnDoAfter(EntityUid uid, WelderRefinableComponent component, Welder EntityManager.DeleteEntity(uid); // spawn each result after refine - foreach (var result in component.RefineResult!) + foreach (var ent in EntitySpawnCollection.GetSpawns(component.RefineResult)) { - var droppedEnt = EntityManager.SpawnEntity(result, resultPosition); - - // TODO: If something has a stack... Just use a prototype with a single thing in the stack. - // This is not a good way to do it. - if (TryComp(droppedEnt, out var stack)) - _stackSystem.SetCount(droppedEnt, 1, stack); + Spawn(ent, resultPosition); } } } diff --git a/Resources/Prototypes/Entities/Objects/Materials/shards.yml b/Resources/Prototypes/Entities/Objects/Materials/shards.yml index 5fcb006cfa5..6cdc066cf10 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/shards.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/shards.yml @@ -89,7 +89,7 @@ color: "#bbeeff" - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 - type: DamageUserOnTrigger damage: types: @@ -120,8 +120,8 @@ color: "#96cdef" - type: WelderRefinable refineResult: - - SheetGlass1 - - PartRodMetal1 + - id: SheetGlass1 + - id: PartRodMetal1 - type: DamageUserOnTrigger damage: types: @@ -152,8 +152,8 @@ color: "#FF72E7" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetPlasma1 + - id: SheetGlass1 + - id: SheetPlasma1 - type: DamageUserOnTrigger damage: types: @@ -186,8 +186,8 @@ color: "#8eff7a" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetUranium1 + - id: SheetGlass1 + - id: SheetUranium1 - type: DamageUserOnTrigger damage: types: @@ -221,8 +221,8 @@ color: "#e0aa36" - type: WelderRefinable refineResult: - - SheetGlass1 - - SheetBrass1 + - id: SheetGlass1 + - id: SheetBrass1 - type: DamageUserOnTrigger damage: types: diff --git a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml index b7c73f5e0cc..32222d0036c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml @@ -28,4 +28,4 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 diff --git a/Resources/Prototypes/Entities/Objects/Power/lights.yml b/Resources/Prototypes/Entities/Objects/Power/lights.yml index c8089cd22d3..b18a0feaa52 100644 --- a/Resources/Prototypes/Entities/Objects/Power/lights.yml +++ b/Resources/Prototypes/Entities/Objects/Power/lights.yml @@ -68,7 +68,7 @@ - type: SpaceGarbage - type: WelderRefinable refineResult: - - SheetGlass1 + - id: SheetGlass1 - type: entity parent: BaseLightbulb @@ -276,8 +276,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalCyan + - id: SheetGlass1 + - id: ShardCrystalCyan - type: entity parent: LightTubeCrystalCyan @@ -296,8 +296,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalBlue + - id: SheetGlass1 + - id: ShardCrystalBlue - type: entity parent: LightTubeCrystalCyan @@ -316,8 +316,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalPink + - id: SheetGlass1 + - id: ShardCrystalPink - type: entity parent: LightTubeCrystalCyan @@ -336,8 +336,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalOrange + - id: SheetGlass1 + - id: ShardCrystalOrange - type: entity parent: LightTubeCrystalCyan @@ -356,8 +356,8 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalRed + - id: SheetGlass1 + - id: ShardCrystalRed - type: entity parent: LightTubeCrystalCyan @@ -376,5 +376,5 @@ node: icon - type: WelderRefinable refineResult: - - SheetGlass1 - - ShardCrystalGreen + - id: SheetGlass1 + - id: ShardCrystalGreen From 844218c8180d2e4439642717ad1c91e1d7229381 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 8 Aug 2024 00:16:23 +0000 Subject: [PATCH 129/143] Automatic Changelog Update (#687) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 0aff29d638c..45e36fa3f08 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5103,3 +5103,11 @@ Entries: slip. id: 6239 time: '2024-08-07T23:54:13.0000000+00:00' +- author: BlueHNT + changes: + - type: Tweak + message: >- + Tweaked the formatting for WelderRefinable refineResult to use + EntitySpawnEntry format + id: 6240 + time: '2024-08-08T00:16:02.0000000+00:00' From 75d2ea8f35c9be1b76a6b6c15531fc2cf5592fe9 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Wed, 7 Aug 2024 20:18:08 -0400 Subject: [PATCH 130/143] 1984 Shit Colored Moths (#681) # Description I'll let google image search make my case. ![image](https://github.com/user-attachments/assets/c8fe9ec7-0292-4d77-bc94-f890219349e3) ![image](https://github.com/user-attachments/assets/1d871bff-4a18-4ce9-a121-d0282821c48c) ![image](https://github.com/user-attachments/assets/2375fe34-691c-49ab-b9d7-a16a17b2a3ce) Done. By popular request, I'm bringing back RGB Moths. # Changelog :cl: - fix: Moths can now once again be colorful. --- Content.Shared/Humanoid/SkinColor.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 55fab4af5ba..dcc5c2d7645 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -136,7 +136,7 @@ public static Color TintedHues(Color color) /// The skin color to blend with /// Blending factor (0.0 to 1.0) /// Tinted hue color - public static Color TintedHuesSkin(Color color, Color skinColor, float blendFactor = 0.5f) + public static Color TintedHuesSkin(Color color, Color skinColor, float blendFactor = 0.0f) { blendFactor = MathHelper.Clamp(blendFactor, 0.0f, 1.0f); From ba9a93707855c63dcbbbdc5cf5fe0931f196c9b0 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 8 Aug 2024 00:18:30 +0000 Subject: [PATCH 131/143] Automatic Changelog Update (#681) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 45e36fa3f08..f6fba8d64b5 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5111,3 +5111,9 @@ Entries: EntitySpawnEntry format id: 6240 time: '2024-08-08T00:16:02.0000000+00:00' +- author: VMSolidus + changes: + - type: Fix + message: Moths can now once again be colorful. + id: 6241 + time: '2024-08-08T00:18:08.0000000+00:00' From d1c8bf10953b63c675eb8629b119fb06f66b1ea5 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Fri, 9 Aug 2024 13:52:49 +0300 Subject: [PATCH 132/143] Tweak Skeleton Description (#707) # Description Cherry-picks https://github.com/Fansana/floofstation1/pull/88 from Floofstation - changes skeleton description to match with Delta-v. Credit to ShatteredSwords. # Changelog :cl: ShatteredSwords - tweak: Skeleton ghost role description has been adjusted to be less evil. --------- Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Co-authored-by: ShatteredSwords <135023515+ShatteredSwords@users.noreply.github.com> --- Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 7b25eb660bc..9260db903fc 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -161,7 +161,7 @@ ghost-role-information-skeleton-biker-name = Skeleton Biker ghost-role-information-skeleton-biker-description = Ride around on your sweet ride. ghost-role-information-closet-skeleton-name = Closet Skeleton -ghost-role-information-closet-skeleton-description = Wreak havoc! You are a primordial force with no allegiance. Live happily with the crew or wage sweet skeletal war. +ghost-role-information-closet-skeleton-description = You are a closet skeleton! You are a primordial force of chaos with no allegiance! You can either join the crew and use your skeletal antics to help them, or be a a prankster, and hinder their efforts! ghost-role-information-onestar-mecha-name = Onestar Mecha ghost-role-information-onestar-mecha-description = You are an experimental mecha created by who-knows-what, all you know is that you have weapons and you detect fleshy moving targets nearby... From 892f1e04c9861e04b2b1e7fc6c2279e80f1b53fa Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 9 Aug 2024 10:53:11 +0000 Subject: [PATCH 133/143] Automatic Changelog Update (#707) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f6fba8d64b5..6e9745ffd8b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5117,3 +5117,9 @@ Entries: message: Moths can now once again be colorful. id: 6241 time: '2024-08-08T00:18:08.0000000+00:00' +- author: ShatteredSwords + changes: + - type: Tweak + message: Skeleton ghost role description has been adjusted to be less evil. + id: 6242 + time: '2024-08-09T10:52:49.0000000+00:00' From 7d92c3e69f2347fe4616600698f63e6d23280282 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 9 Aug 2024 07:13:13 -0400 Subject: [PATCH 134/143] Soft-Refactor Geiger Counters (#615) # Description This refactors Geiger Counters so that their behavior of "Only making sound to a person holding them" is no longer hardcoded. The GeigerCounterComponent now can define how loud it ticks, how far away people can hear the ticks, and whether it plays only for the person holding it or for anyone nearby. This PR partially fulfills one of the "Nice To Have" features requested for https://github.com/Simple-Station/Einstein-Engines/pull/341 by making it possible to create stationary radiation alarm objects. It also serves as a substantial quality of life improvement for Engineering and Science crew, since it's now possible to place an active Geiger counter in the artifact lab, and then be able to audibly hear if the lab becomes radioactive due to an artifact.

Media

https://github.com/user-attachments/assets/74122135-7345-4995-bb0e-d1216e1d53b6 https://github.com/user-attachments/assets/de79db6f-e1c1-471f-88b5-0a47ff4bfa16

# Changelog :cl: - add: Geiger Counters other than ones installed in Hardsuits now generate an audible sound when active and exposed to radiation. - add: Wall mounted geiger counters have been added to the game. --------- Signed-off-by: VMSolidus --- .../Radiation/Systems/GeigerSystem.cs | 28 +++++----- .../Radiation/Components/GeigerComponent.cs | 19 +++++-- .../OuterClothing/base_clothingouter.yml | 3 ++ .../Structures/Wallmounts/radalarm.yml | 51 ++++++++++++++++++ .../Wallmounts/radalarm.rsi/geiger_base.png | Bin 0 -> 1283 bytes .../Wallmounts/radalarm.rsi/geiger_on_ext.png | Bin 0 -> 375 bytes .../radalarm.rsi/geiger_on_high.png | Bin 0 -> 375 bytes .../radalarm.rsi/geiger_on_idle.png | Bin 0 -> 326 bytes .../Wallmounts/radalarm.rsi/geiger_on_low.png | Bin 0 -> 363 bytes .../Wallmounts/radalarm.rsi/geiger_on_med.png | Bin 0 -> 368 bytes .../Wallmounts/radalarm.rsi/meta.json | 35 ++++++++++++ 11 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_high.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_idle.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_low.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png create mode 100644 Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json diff --git a/Content.Server/Radiation/Systems/GeigerSystem.cs b/Content.Server/Radiation/Systems/GeigerSystem.cs index f889336a068..06e5911cb7c 100644 --- a/Content.Server/Radiation/Systems/GeigerSystem.cs +++ b/Content.Server/Radiation/Systems/GeigerSystem.cs @@ -6,8 +6,8 @@ using Content.Shared.Radiation.Components; using Content.Shared.Radiation.Systems; using Robust.Server.Audio; -using Robust.Server.GameObjects; using Robust.Server.Player; +using Robust.Shared.Player; namespace Content.Server.Radiation.Systems; @@ -152,19 +152,19 @@ private void UpdateSound(EntityUid uid, GeigerComponent? component = null) component.Stream = _audio.Stop(component.Stream); - if (!component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) - return; - - if (component.User == null) - return; - - if (!_player.TryGetSessionByEntity(component.User.Value, out var session)) - return; - - var sound = _audio.GetSound(sounds); - var param = sounds.Params.WithLoop(true).WithVolume(-4f); - - component.Stream = _audio.PlayGlobal(sound, session, param)?.Entity; + if (component.Sounds.TryGetValue(component.DangerLevel, out var sounds)) + { + var sound = _audio.GetSound(sounds); + + if (component.LocalSoundOnly + && component.User is not null + && _player.TryGetSessionByEntity(component.User.Value, out var session)) + { + component.Stream = _audio.PlayGlobal(sound, session, component.AudioParameters)?.Entity; + return; + } + component.Stream = _audio.PlayEntity(sound, Filter.Pvs(uid), uid, true, component.AudioParameters)?.Entity; + } } public static GeigerDangerLevel RadsToLevel(float rads) diff --git a/Content.Shared/Radiation/Components/GeigerComponent.cs b/Content.Shared/Radiation/Components/GeigerComponent.cs index 71edb70b37c..710d74d9b38 100644 --- a/Content.Shared/Radiation/Components/GeigerComponent.cs +++ b/Content.Shared/Radiation/Components/GeigerComponent.cs @@ -29,14 +29,12 @@ public sealed partial class GeigerComponent : Component /// /// Should it shows examine message with current radiation level? /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool ShowExamine; /// /// Should it shows item control when equipped by player? /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool ShowControl; @@ -55,7 +53,7 @@ public sealed partial class GeigerComponent : Component /// /// Current radiation level in rad per second. /// - [ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] + [DataField, AutoNetworkedField] public float CurrentRadiation; /// @@ -66,8 +64,6 @@ public sealed partial class GeigerComponent : Component /// /// Current player that equipped geiger counter. - /// Because sound is annoying, geiger counter clicks will play - /// only for player that equipped it. /// [ViewVariables(VVAccess.ReadOnly), AutoNetworkedField] public EntityUid? User; @@ -83,6 +79,19 @@ public sealed partial class GeigerComponent : Component /// Played only for current user. /// public EntityUid? Stream; + + /// + /// Controls whether the geiger counter plays only for the local player, or plays for everyone nearby. + /// Useful for things like hardsuits with integrated geigers. Alternatively, to create stationary radiation alarm objects. + /// + [DataField] + public bool LocalSoundOnly = false; + + /// + /// Used for all geiger counter audio controls, allowing entities to override default audio parameters. + /// + [DataField] + public AudioParams AudioParameters; } [Serializable, NetSerializable] diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index d6a2cd446be..358f91d2971 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -142,6 +142,9 @@ - type: Clothing equipDelay: 2.5 # Hardsuits are heavy and take a while to put on/off. unequipDelay: 2.5 + - type: Geiger + attachedToSuit: true + localSoundOnly: true - type: StaminaDamageResistance coefficient: 0.75 # 25% diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml new file mode 100644 index 00000000000..44bbe3e6170 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/radalarm.yml @@ -0,0 +1,51 @@ +- type: entity + id: GeigerCounterWallMount + name: wall-mounted Geiger counter + description: A stationary device that emits a warning tone when it detects radiation pulses. + placement: + mode: SnapgridCenter + snap: + - Wallmount + components: + - type: InteractionOutline + - type: Clickable + - type: Rotatable + rotateWhileAnchored: false + rotateWhilePulling: true + - type: WallMount + - type: Transform + noRot: false + anchored: true + - type: Sprite + noRot: true + drawdepth: WallMountedItems + sprite: Structures/Wallmounts/radalarm.rsi + layers: + - state: geiger_base + - state: geiger_on_idle + map: ["enum.GeigerLayers.Screen"] + shader: unshaded + visible: false + - type: Geiger + showControl: true + showExamine: true + localSoundOnly: false + audioParameters: + volume: -4 + maxDistance: 10 + rolloffFactor: 4 + - type: Appearance + - type: GenericVisualizer + visuals: + enum.GeigerVisuals.IsEnabled: + GeigerLayers.Screen: + True: { visible: True } + False: { visible: False } + enum.GeigerVisuals.DangerLevel: + GeigerLayers.Screen: + None: {state: geiger_on_idle} + Low: {state: geiger_on_low} + Med: {state: geiger_on_med} + High: {state: geiger_on_high} + Extreme: {state: geiger_on_ext} + diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_base.png new file mode 100644 index 0000000000000000000000000000000000000000..778c427735012720fbd093e0a7f54b9adb5b5dcb GIT binary patch literal 1283 zcmV+e1^oJnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!~g&e!~vBn4jTXf1ei%gK~#8N?VC+# z6fqRXr&cSaqWD?6t)*JE2zpUb#DgLhKMo?O^ybN1p$8GygRlx-R>Xs_7x5&5hzjDt z4+L=!A{9I-i1nkTe$-ZrRV-3vsr%35)tF6YGP|?0vzi|~l1aBS$;-=|yq8_aVzF5M zXKHxqNhXt-)ae3=Hzx9}m3orr8fTS8Qwg6KOt$g=a8F#c!aQnthlTd=_ z1XXMP!^a_3mdgpQT(z!f=V|iHKo)?(%2F;c@KOeEiqUHj`+y*O00Mgf>;sCi02+MW zf>Ql2-ZKCtEQI1vn8Vm~zJm}zqAjc-ky^6=K*2n@X zfoK8PRbJ?8nJUQwyyB3Tub#!j0>S`;7R#V`SwK}N05eHa3|?_fRVY9Q%p7kWS%wN|%+zQ5a5bql8YVO2tzFVm4M5nXo!!3YGv& zzf?RGK(ntB5qB*{;{*vf-!S}+kq_{5Dj2-UYbZ?QwO=g03eY(f5pqaTLf&6SPK&G3 z|+1`002ovPDHLkV1lQfLi_*# literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_ext.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7f3f4e767822a0454026ece50fdf8aa63daccc GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yo-qubspz*wJ?a07p8pOJ|MxEk${c^8m;$8OOM?7@|APU8lsB^* zP>8d@BeIx*f$sJOGwXs7uI@pgKH7q$8)q86K*i9cof7b<0cat^NPii2}sJdh|QQQw?qxU9i%sA7!F7P~0;<4II9;|murgH5Pcbli+x?k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=yo-qubspz*wJ?a07p8pOJ|MxEk${c^8m;$8OOM?7@|APU8lsB^* zP>8d@BeIx*f$sJOGwXs7uI@pgKH7q$8)q86K*i9cof7b<0cat^NPii2}sJdh|QQQw?qxU9i%sA7!F7P~0;<4II9;|murgH5Pcbli+x?k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%x+S`|Sc~6vEk-F}i@#+7YfWj|k1jGO-wvr&f;Qt`NuzCNI{Xh}U z0*}aI1_r((Aj~*bn@<`jxZ2ajF(ktM?X=r`4GJ6%d;k5{Hy4xSoVh*9^qlvtXMz)@ z)c6)P-RI?228@qvIwE(XyR3@?Nurq^Y~6x>W|$yl@f_MtwG zd)f+}n#D>H@zbP4no78RnGQW?=_|GO45;UJFLPAa3SczQ=qO~I8t?n@t65k9(Af;0 Lu6{1-oD!Mk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xcKM4hij)2SKj*;`&i@}b0fpa6e^LQbY$ZW{!T&*kVe|ea`+*{y z1s;*b3=DinK$vl=HlH+5@Pem{V@QPi+i4fYniV)4m_ProuUw&1I>|Xx-}=t;{(1YYCyj+c)I$ztaD0e0swKOgqZ*U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/geiger_on_med.png new file mode 100644 index 0000000000000000000000000000000000000000..33d354a6a6ecd6f9b410c95d9aa80557712694e8 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O_~O1^9%xPBP(H=Fb27kpHGeqyK07fx=#U>Y9KQTS<^#@P80s*t~zqexL|v zfk$L90|Va?5N4dJ%_j{Myz1%V7!u+BcABG5vjUH+r_%TRMT$$fR9zKv#pmwnJtjHt zBez$FTg->@rU?^2XRcywa9~ilsx!60z&Yq_Q27KY2XFRgJl|HZxI1dGn$DZb7tqH$ zzov!zYgm2&YxB+vtY7E4OMJA73}X!l>j~)$b=;nC&H90;a_FPyk|jG1uu6*WP}r>K zVc+^CaJ#dg`o4EQNM|}nc>gTe~DWM4f D7!iXk literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json new file mode 100644 index 00000000000..2ef22994bc0 --- /dev/null +++ b/Resources/Textures/Structures/Wallmounts/radalarm.rsi/meta.json @@ -0,0 +1,35 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Made by @dootythefrooty (Discord)", + "states": [ + { + "name": "geiger_base", + "directions": 4 + }, + { + "name": "geiger_on_idle", + "directions": 4 + }, + { + "name": "geiger_on_low", + "directions": 4 + }, + { + "name": "geiger_on_med", + "directions": 4 + }, + { + "name": "geiger_on_high", + "directions": 4 + }, + { + "name": "geiger_on_ext", + "directions": 4 + } + ] +} From f0340314ad062d4bf7e2bfbfd7dc9efb67a62ce3 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 9 Aug 2024 11:13:38 +0000 Subject: [PATCH 135/143] Automatic Changelog Update (#615) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6e9745ffd8b..f571aeb6bbf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5123,3 +5123,13 @@ Entries: message: Skeleton ghost role description has been adjusted to be less evil. id: 6242 time: '2024-08-09T10:52:49.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Geiger Counters other than ones installed in Hardsuits now generate an + audible sound when active and exposed to radiation. + - type: Add + message: Wall mounted geiger counters have been added to the game. + id: 6243 + time: '2024-08-09T11:13:13.0000000+00:00' From f4d2e3551b78203cfa5bb4a068ebfbdc515a2c23 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Sat, 10 Aug 2024 01:28:01 +0800 Subject: [PATCH 136/143] Make Dionas Slow And Steady (#704) # Description Dionas now have 25% slower movement speed in exchange for total slip immunity and slow immunity (except lying down). Note that this also prevents slowdowns from hunger and thirst. This also fixes an existing bug with Sluggish and Snail-Paced related to `TraitSpeedModifierSystem`, as it was not applying the reduced movement speed upon spawning, only when the movement speed has been modified by another source. `TraitSpeedModifierSystem` has been moved from `Content.Server` to `Content.Shared`. This used to be a trait costing 3 points, but is now given for free to all Dionas per request of @VMSolidus. ## Media
Expand **Speed with no items** ![image](https://github.com/user-attachments/assets/b723614a-79fe-401c-ae53-2ad98ff9a6d3) **Speed wearing a jugsuit, wearing a duffel bag, holding one duffel bag in each arm, and walking through a puddle of glue covered in spider webs.** ![image](https://github.com/user-attachments/assets/a934d2c1-437f-463c-8fe3-63b7b54a1f58)
# Changelog :cl: Skubman - add: Dionas have been given a 25% slower movement speed. In exchange for that, they gain absolute slip immunity and movement speed modifier immunity. This makes them immune to slowdown from things like duffelbags, hardsuits, and spider webs. - fix: Sluggish and Snail-Paced will now properly apply their movement penalties upon joining. --- Content.Server/Standing/LayingDownSystem.cs | 2 +- .../Assorted/TraitSpeedModifierSystem.cs | 19 ------------ .../Systems/MovementSpeedModifierSystem.cs | 23 ++++++++++++-- .../SpeedModifierImmunityComponent.cs | 12 +++++++ .../TraitSpeedModifierComponent.cs | 10 +++--- .../Systems/TraitSpeedModifierSystem.cs | 31 +++++++++++++++++++ .../Entities/Mobs/Species/diona.yml | 5 +++ Resources/Prototypes/Traits/disabilities.yml | 8 +++++ Resources/Prototypes/Traits/skills.yml | 4 +++ 9 files changed, 88 insertions(+), 26 deletions(-) delete mode 100644 Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs create mode 100644 Content.Shared/Traits/Assorted/Components/SpeedModifierImmunityComponent.cs rename {Content.Server/Traits/Assorted => Content.Shared/Traits/Assorted/Components}/TraitSpeedModifierComponent.cs (52%) create mode 100644 Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs diff --git a/Content.Server/Standing/LayingDownSystem.cs b/Content.Server/Standing/LayingDownSystem.cs index 69787ae8308..73a929fdfc4 100644 --- a/Content.Server/Standing/LayingDownSystem.cs +++ b/Content.Server/Standing/LayingDownSystem.cs @@ -48,7 +48,7 @@ private void OnRefreshMovementSpeed(EntityUid uid, LayingDownComponent component if (TryComp(uid, out var standingState) && standingState.Standing) return; - args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier); + args.ModifySpeed(component.DownedSpeedMultiplier, component.DownedSpeedMultiplier, bypassImmunity: true); } private void OnParentChanged(EntityUid uid, LayingDownComponent component, EntParentChangedMessage args) diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs b/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs deleted file mode 100644 index c804592347a..00000000000 --- a/Content.Server/Traits/Assorted/TraitSpeedModifierSystem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Content.Shared.Movement.Systems; -using Content.Server.Traits.Assorted; - -namespace Content.Shared.Traits.Assorted; - -public sealed class TraitSpeedModifierSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnRefreshMovementSpeed); - } - - private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkModifier, component.SprintModifier); - } -} diff --git a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs index 7c793d5eb89..67a238cf60f 100644 --- a/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs +++ b/Content.Shared/Movement/Systems/MovementSpeedModifierSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Inventory; using Content.Shared.Movement.Components; +using Content.Shared.Traits.Assorted.Components; using Robust.Shared.Timing; namespace Content.Shared.Movement.Systems @@ -16,7 +17,11 @@ public void RefreshMovementSpeedModifiers(EntityUid uid, MovementSpeedModifierCo if (_timing.ApplyingState) return; - var ev = new RefreshMovementSpeedModifiersEvent(); + var isImmune = false; + if (HasComp(uid)) + isImmune = true; + + var ev = new RefreshMovementSpeedModifiersEvent(isImmune); RaiseLocalEvent(uid, ev); if (MathHelper.CloseTo(ev.WalkSpeedModifier, move.WalkSpeedModifier) && @@ -64,10 +69,24 @@ public sealed class RefreshMovementSpeedModifiersEvent : EntityEventArgs, IInven public float WalkSpeedModifier { get; private set; } = 1.0f; public float SprintSpeedModifier { get; private set; } = 1.0f; - public void ModifySpeed(float walk, float sprint) + /// + /// Whether this entity is immune to most movement speed modifiers. + /// Bypassable by setting bypassImmunity to true. + /// +/// This is used to make an entity's movement speed constant and +/// never affected by almost all movement speed modifiers. +///
+[RegisterComponent, NetworkedComponent] +public sealed partial class SpeedModifierImmunityComponent : Component +{ +} diff --git a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs similarity index 52% rename from Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs rename to Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs index 6acb32e6c1d..85dc52a21f5 100644 --- a/Content.Server/Traits/Assorted/TraitSpeedModifierComponent.cs +++ b/Content.Shared/Traits/Assorted/Components/TraitSpeedModifierComponent.cs @@ -1,14 +1,16 @@ -namespace Content.Server.Traits.Assorted; +using Robust.Shared.GameStates; + +namespace Content.Shared.Traits.Assorted.Components; /// /// This component is used for traits that modify movement speed. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class TraitSpeedModifierComponent : Component { - [DataField(required: true)] + [DataField, AutoNetworkedField] public float WalkModifier = 1.0f; - [DataField(required: true)] + [DataField, AutoNetworkedField] public float SprintModifier = 1.0f; } diff --git a/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs new file mode 100644 index 00000000000..9817ebc1560 --- /dev/null +++ b/Content.Shared/Traits/Assorted/Systems/TraitSpeedModifierSystem.cs @@ -0,0 +1,31 @@ +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; +using Content.Shared.Traits.Assorted.Components; + +namespace Content.Shared.Traits.Assorted.Systems; + +public sealed class TraitSpeedModifierSystem : EntitySystem +{ + [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnRefreshMovementSpeed); + } + + private void OnRefreshMovementSpeed(EntityUid uid, TraitSpeedModifierComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkModifier, component.SprintModifier, bypassImmunity: true); + } + + private void OnStartup(EntityUid uid, TraitSpeedModifierComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var move)) + return; + + _movement.RefreshMovementSpeedModifiers(uid, move); + } +} diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index e1628c620a2..42383d9a426 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -109,6 +109,11 @@ understands: - GalacticCommon - RootSpeak + - type: TraitSpeedModifier + sprintModifier: 0.75 + walkModifier: 0.75 + - type: SpeedModifierImmunity + - type: NoSlip - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Traits/disabilities.yml b/Resources/Prototypes/Traits/disabilities.yml index 915ea0bf674..ca2453e41a1 100644 --- a/Resources/Prototypes/Traits/disabilities.yml +++ b/Resources/Prototypes/Traits/disabilities.yml @@ -105,6 +105,10 @@ traits: - ParkourTraining - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: TraitSpeedModifier sprintModifier: 0.85 @@ -124,6 +128,10 @@ traits: - ParkourTraining - Sluggish + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: TraitSpeedModifier sprintModifier: 0.7 diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 0da622da3c9..56a8549c933 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -97,6 +97,10 @@ traits: - Sluggish - SnailPaced + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Diona components: - type: ClimbDelayModifier climbDelayMultiplier: 0.70 From 3657ad42d2f0ab15f44bc6d32ee9f442c047090b Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 9 Aug 2024 17:28:26 +0000 Subject: [PATCH 137/143] Automatic Changelog Update (#704) --- Resources/Changelog/Changelog.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f571aeb6bbf..3f94c100b5a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5133,3 +5133,17 @@ Entries: message: Wall mounted geiger counters have been added to the game. id: 6243 time: '2024-08-09T11:13:13.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Dionas have been given a 25% slower movement speed. In exchange for + that, they gain absolute slip immunity and movement speed modifier + immunity. This makes them immune to slowdown from things like + duffelbags, hardsuits, and spider webs. + - type: Fix + message: >- + Sluggish and Snail-Paced will now properly apply their movement + penalties upon joining. + id: 6244 + time: '2024-08-09T17:28:01.0000000+00:00' From 31e3c02aad4fdb435b9682d42df90e27ef9af96b Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 9 Aug 2024 16:41:18 -0400 Subject: [PATCH 138/143] Psionic System Cleanup (#703) # Description Just some regular cleanup of PsionicSystem and PsionicAbilitiesSystem. No refactoring today, just cleanup. Tomorrow I will serialize this shit, assuming this gets merged. No media because there's nothing to show. No changelog because this isn't playerfacing. --- .../Psionics/PsionicAbilitiesSystem.cs | 48 +++++++------------ Content.Server/Psionics/PsionicsSystem.cs | 41 ++++------------ 2 files changed, 25 insertions(+), 64 deletions(-) diff --git a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs index ee16aaccfb6..e59696aa904 100644 --- a/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs +++ b/Content.Server/Abilities/Psionics/PsionicAbilitiesSystem.cs @@ -6,13 +6,9 @@ using Content.Server.EUI; using Content.Server.Psionics; using Content.Server.Mind; -using Content.Shared.Mind; -using Content.Shared.Mind.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Prototypes; -using Robust.Server.GameObjects; -using Robust.Server.Player; using Robust.Shared.Player; namespace Content.Server.Abilities.Psionics @@ -22,13 +18,14 @@ public sealed class PsionicAbilitiesSystem : EntitySystem [Dependency] private readonly IComponentFactory _componentFactory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly EuiManager _euiManager = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly MindSystem _mindSystem = default!; + private ISawmill _sawmill = default!; + public override void Initialize() { base.Initialize(); @@ -46,17 +43,11 @@ private void OnPlayerAttached(EntityUid uid, PsionicAwaitingPlayerComponent comp public void AddPsionics(EntityUid uid, bool warn = true) { - if (Deleted(uid)) - return; - - if (HasComp(uid)) + if (Deleted(uid) + || HasComp(uid)) return; - //Don't know if this will work. New mind state vs old. - if (!TryComp(uid, out var mindContainer) || - !_mindSystem.TryGetMind(uid, out _, out var mind )) - //|| - //!_mindSystem.TryGetMind(uid, out var mind, mindContainer)) + if (!_mindSystem.TryGetMind(uid, out _, out var mind)) { EnsureComp(uid); return; @@ -65,7 +56,7 @@ public void AddPsionics(EntityUid uid, bool warn = true) if (!_mindSystem.TryGetSession(mind, out var client)) return; - if (warn && TryComp(uid, out var actor)) + if (warn && HasComp(uid)) _euiManager.OpenEui(new AcceptPsionicsEui(uid, this), client); else AddRandomPsionicPower(uid); @@ -73,10 +64,8 @@ public void AddPsionics(EntityUid uid, bool warn = true) public void AddPsionics(EntityUid uid, string powerComp) { - if (Deleted(uid)) - return; - - if (HasComp(uid)) + if (Deleted(uid) + || HasComp(uid)) return; AddComp(uid); @@ -93,7 +82,7 @@ public void AddRandomPsionicPower(EntityUid uid) if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) { - Logger.Error("Can't index the random psionic power pool!"); + _sawmill.Error("Can't index the random psionic power pool!"); return; } @@ -108,15 +97,13 @@ public void AddRandomPsionicPower(EntityUid uid) public void RemovePsionics(EntityUid uid) { - if (!TryComp(uid, out var psionic)) - return; - - if (!psionic.Removable) + if (!TryComp(uid, out var psionic) + || !psionic.Removable) return; if (!_prototypeManager.TryIndex("RandomPsionicPowerPool", out var pool)) { - Logger.Error("Can't index the random psionic power pool!"); + _sawmill.Error("Can't index the random psionic power pool!"); return; } @@ -127,13 +114,10 @@ public void RemovePsionics(EntityUid uid) if (EntityManager.TryGetComponent(uid, comp.GetType(), out var psionicPower)) RemComp(uid, psionicPower); } - if (psionic.PsionicAbility != null){ - _actionsSystem.TryGetActionData( psionic.PsionicAbility, out var psiAbility ); - if (psiAbility != null){ - var owner = psiAbility.Owner; - _actionsSystem.RemoveAction(uid, psiAbility.Owner); - } - } + if (psionic.PsionicAbility != null + && _actionsSystem.TryGetActionData(psionic.PsionicAbility, out var psiAbility) + && psiAbility is not null) + _actionsSystem.RemoveAction(uid, psionic.PsionicAbility); _statusEffectsSystem.TryAddStatusEffect(uid, "Stutter", TimeSpan.FromMinutes(5), false, "StutteringAccent"); diff --git a/Content.Server/Psionics/PsionicsSystem.cs b/Content.Server/Psionics/PsionicsSystem.cs index 33505e3f6fc..fb5d18f2843 100644 --- a/Content.Server/Psionics/PsionicsSystem.cs +++ b/Content.Server/Psionics/PsionicsSystem.cs @@ -1,19 +1,15 @@ using Content.Shared.Abilities.Psionics; using Content.Shared.StatusEffect; -using Content.Shared.Mobs; using Content.Shared.Psionics.Glimmer; using Content.Shared.Weapons.Melee.Events; using Content.Shared.Damage.Events; -using Content.Shared.IdentityManagement; using Content.Shared.CCVar; using Content.Server.Abilities.Psionics; using Content.Server.Chat.Systems; using Content.Server.Electrocution; using Content.Server.NPC.Components; using Content.Server.NPC.Systems; -using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; -using Robust.Shared.Player; using Robust.Shared.Configuration; using Robust.Shared.Random; @@ -27,7 +23,6 @@ public sealed class PsionicsSystem : EntitySystem [Dependency] private readonly ElectrocutionSystem _electrocutionSystem = default!; [Dependency] private readonly MindSwapPowerSystem _mindSwapPowerSystem = default!; [Dependency] private readonly GlimmerSystem _glimmerSystem = default!; - [Dependency] private readonly ChatSystem _chat = default!; [Dependency] private readonly NpcFactionSystem _npcFactonSystem = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; @@ -41,9 +36,7 @@ public override void Update(float frameTime) { base.Update(frameTime); foreach (var roller in _rollers) - { RollPsionics(roller.uid, roller.component, false); - } _rollers.Clear(); } public override void Initialize() @@ -90,13 +83,9 @@ private void OnMeleeHit(EntityUid uid, AntiPsionicWeaponComponent component, Mel private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit args) { - if (!component.Removable) - return; - - if (!TryComp(uid, out var factions)) - return; - - if (_npcFactonSystem.ContainsFaction(uid, "GlimmerMonster", factions)) + if (!component.Removable + || !TryComp(uid, out var factions) + || _npcFactonSystem.ContainsFaction(uid, "GlimmerMonster", factions)) return; _npcFactonSystem.AddFaction(uid, "PsionicInterloper"); @@ -104,7 +93,7 @@ private void OnInit(EntityUid uid, PsionicComponent component, ComponentInit arg private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove args) { - if (!TryComp(uid, out var factions)) + if (!HasComp(uid)) return; _npcFactonSystem.RemoveFaction(uid, "PsionicInterloper"); @@ -112,24 +101,14 @@ private void OnRemove(EntityUid uid, PsionicComponent component, ComponentRemove private void OnStamHit(EntityUid uid, AntiPsionicWeaponComponent component, TakeStaminaDamageEvent args) { - var bonus = false; - if (HasComp(args.Target)) - bonus = true; - - if (!bonus) - return; - - - args.FlatModifier += component.PsychicStaminaDamage; + args.FlatModifier += component.PsychicStaminaDamage; } public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, bool applyGlimmer = true, float multiplier = 1f) { - if (HasComp(uid)) - return; - - if (!_cfg.GetCVar(CCVars.PsionicRollsEnabled)) + if (HasComp(uid) + || !_cfg.GetCVar(CCVars.PsionicRollsEnabled)) return; var chance = component.Chance; @@ -154,10 +133,8 @@ public void RollPsionics(EntityUid uid, PotentialPsionicComponent component, boo public void RerollPsionics(EntityUid uid, PotentialPsionicComponent? psionic = null, float bonusMuliplier = 1f) { - if (!Resolve(uid, ref psionic, false)) - return; - - if (psionic.Rerolled) + if (!Resolve(uid, ref psionic, false) + || psionic.Rerolled) return; RollPsionics(uid, psionic, multiplier: bonusMuliplier); From 05364c5ad8d465ea35241bf53397b4721012c5ce Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 9 Aug 2024 16:41:46 -0400 Subject: [PATCH 139/143] Minor Glimmer System Cleanup (#702) # Description More tedium to get out of the way, I can't do much more than this since by now in the day my adderall has worn off. This just does basic code cleanup of the glimmer system. No media because there's nothing to show. No changelog because this isn't player facing. --- .../Psionics/Glimmer/GlimmerCommands.cs | 6 +- .../Psionics/Glimmer/GlimmerReactiveSystem.cs | 139 ++++++------------ .../Glimmer/PassiveGlimmerReductionSystem.cs | 2 - .../Structures/GlimmerSourceComponent.cs | 8 +- .../Structures/GlimmerStructuresSystem.cs | 10 +- 5 files changed, 57 insertions(+), 108 deletions(-) diff --git a/Content.Server/Psionics/Glimmer/GlimmerCommands.cs b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs index 744f4cdb9a8..9e05886adca 100644 --- a/Content.Server/Psionics/Glimmer/GlimmerCommands.cs +++ b/Content.Server/Psionics/Glimmer/GlimmerCommands.cs @@ -27,10 +27,8 @@ public sealed class GlimmerSetCommand : IConsoleCommand public async void Execute(IConsoleShell shell, string argStr, string[] args) { - if (args.Length != 1) - return; - - if (!int.TryParse(args[0], out var glimmerValue)) + if (args.Length != 1 + || !int.TryParse(args[0], out var glimmerValue)) return; var entMan = IoCManager.Resolve(); diff --git a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs index da3b07d6dab..f828874aacb 100644 --- a/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs +++ b/Content.Server/Psionics/Glimmer/GlimmerReactiveSystem.cs @@ -3,12 +3,10 @@ using Content.Server.Electrocution; using Content.Server.Lightning; using Content.Server.Explosion.EntitySystems; -using Content.Server.Construction; using Content.Server.Ghost; using Content.Server.Revenant.EntitySystems; using Content.Shared.Audio; using Content.Shared.Construction.EntitySystems; -using Content.Shared.Coordinates.Helpers; using Content.Shared.GameTicking; using Content.Shared.Psionics.Glimmer; using Content.Shared.Verbs; @@ -16,14 +14,12 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.Construction.Components; -using Content.Shared.Mind; using Content.Shared.Mind.Components; using Content.Shared.Weapons.Melee.Components; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Random; -using Robust.Shared.Physics.Components; using Robust.Shared.Utility; namespace Content.Server.Psionics.Glimmer @@ -39,13 +35,12 @@ public sealed class GlimmerReactiveSystem : EntitySystem [Dependency] private readonly LightningSystem _lightning = default!; [Dependency] private readonly ExplosionSystem _explosionSystem = default!; [Dependency] private readonly EntityLookupSystem _entityLookupSystem = default!; - [Dependency] private readonly AnchorableSystem _anchorableSystem = default!; [Dependency] private readonly SharedDestructibleSystem _destructibleSystem = default!; [Dependency] private readonly GhostSystem _ghostSystem = default!; [Dependency] private readonly RevenantSystem _revenantSystem = default!; - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly SharedPointLightSystem _pointLightSystem = default!; + private ISawmill _sawmill = default!; public float Accumulator = 0; public const float UpdateFrequency = 15f; @@ -78,35 +73,28 @@ private void UpdateEntityState(EntityUid uid, SharedGlimmerReactiveComponent com { var isEnabled = true; - if (component.RequiresApcPower) - if (TryComp(uid, out ApcPowerReceiverComponent? apcPower)) - isEnabled = apcPower.Powered; + if (component.RequiresApcPower + && TryComp(uid, out ApcPowerReceiverComponent? apcPower)) + isEnabled = apcPower.Powered; _appearanceSystem.SetData(uid, GlimmerReactiveVisuals.GlimmerTier, isEnabled ? currentGlimmerTier : GlimmerTier.Minimal); - // update ambient sound + // Update ambient sound if (TryComp(uid, out GlimmerSoundComponent? glimmerSound) && TryComp(uid, out AmbientSoundComponent? ambientSoundComponent) - && glimmerSound.GetSound(currentGlimmerTier, out SoundSpecifier? spec)) + && glimmerSound.GetSound(currentGlimmerTier, out SoundSpecifier? spec) + && spec != null) + _sharedAmbientSoundSystem.SetSound(uid, spec, ambientSoundComponent); + + // Update point light + if (component.ModulatesPointLight + && _pointLightSystem.TryGetLight(uid, out var pointLight)) { - if (spec != null) - _sharedAmbientSoundSystem.SetSound(uid, spec, ambientSoundComponent); + _pointLightSystem.SetEnabled(uid, isEnabled ? currentGlimmerTier != GlimmerTier.Minimal : false, pointLight); + _pointLightSystem.SetEnergy(uid, pointLight.Energy + glimmerTierDelta * component.GlimmerToLightEnergyFactor, pointLight); + _pointLightSystem.SetRadius(uid, pointLight.Radius + glimmerTierDelta * component.GlimmerToLightRadiusFactor, pointLight); } - if (component.ModulatesPointLight) //SharedPointLightComponent is now being fetched via TryGetLight. - if (_pointLightSystem.TryGetLight(uid, out var pointLight)) - { - _pointLightSystem.SetEnabled(uid, isEnabled ? currentGlimmerTier != GlimmerTier.Minimal : false, pointLight); - // The light energy and radius are kept updated even when off - // to prevent the need to store additional state. - // - // Note that this doesn't handle edge cases where the - // PointLightComponent is removed while the - // GlimmerReactiveComponent is still present. - _pointLightSystem.SetEnergy(uid, pointLight.Energy + glimmerTierDelta * component.GlimmerToLightEnergyFactor, pointLight); - _pointLightSystem.SetRadius(uid, pointLight.Radius + glimmerTierDelta * component.GlimmerToLightRadiusFactor, pointLight); - } - } /// @@ -117,7 +105,7 @@ private void UpdateEntityState(EntityUid uid, SharedGlimmerReactiveComponent com private void OnMapInit(EntityUid uid, SharedGlimmerReactiveComponent component, MapInitEvent args) { if (component.RequiresApcPower && !HasComp(uid)) - Logger.Warning($"{ToPrettyString(uid)} had RequiresApcPower set to true but no ApcPowerReceiverComponent was found on init."); + _sawmill.Warning($"{ToPrettyString(uid)} had RequiresApcPower set to true but no ApcPowerReceiverComponent was found on init."); UpdateEntityState(uid, component, LastGlimmerTier, (int) LastGlimmerTier); } @@ -157,7 +145,8 @@ private void OnTierChanged(EntityUid uid, SharedGlimmerReactiveComponent compone receiver.PowerDisabled = false; receiver.NeedsPower = false; - } else + } + else { receiver.NeedsPower = true; } @@ -165,13 +154,10 @@ private void OnTierChanged(EntityUid uid, SharedGlimmerReactiveComponent compone private void AddShockVerb(EntityUid uid, SharedGlimmerReactiveComponent component, GetVerbsEvent args) { - if(!args.CanAccess || !args.CanInteract) - return; - - if (!TryComp(uid, out var receiver)) - return; - - if (receiver.NeedsPower) + if (!args.CanAccess + || !args.CanInteract + || !TryComp(uid, out var receiver) + || receiver.NeedsPower) return; AlternativeVerb verb = new() @@ -181,7 +167,7 @@ private void AddShockVerb(EntityUid uid, SharedGlimmerReactiveComponent componen _sharedAudioSystem.PlayPvs(component.ShockNoises, args.User); _electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false); }, - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/Spare/poweronoff.svg.192dpi.png")), Text = Loc.GetString("power-switch-component-toggle-verb"), Priority = -3 }; @@ -190,10 +176,8 @@ private void AddShockVerb(EntityUid uid, SharedGlimmerReactiveComponent componen private void OnDamageChanged(EntityUid uid, SharedGlimmerReactiveComponent component, DamageChangedEvent args) { - if (args.Origin == null) - return; - - if (!_random.Prob((float) _glimmerSystem.Glimmer / 1000)) + if (args.Origin == null + || !_random.Prob((float) _glimmerSystem.Glimmer / 1000)) return; var tier = _glimmerSystem.GetGlimmerTier(); @@ -222,27 +206,23 @@ private void OnDestroyed(EntityUid uid, SharedGlimmerReactiveComponent component private void OnUnanchorAttempt(EntityUid uid, SharedGlimmerReactiveComponent component, UnanchorAttemptEvent args) { - if (_glimmerSystem.GetGlimmerTier() >= GlimmerTier.Dangerous) - { - _sharedAudioSystem.PlayPvs(component.ShockNoises, args.User); - _electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false); - args.Cancel(); - } + if (_glimmerSystem.GetGlimmerTier() < GlimmerTier.Dangerous) + return; + + _sharedAudioSystem.PlayPvs(component.ShockNoises, args.User); + _electrocutionSystem.TryDoElectrocution(args.User, null, _glimmerSystem.Glimmer / 200, TimeSpan.FromSeconds((float) _glimmerSystem.Glimmer / 100), false); + args.Cancel(); } public void BeamRandomNearProber(EntityUid prober, int targets, float range = 10f) { List targetList = new(); - foreach (var target in _entityLookupSystem.GetComponentsInRange(_transformSystem.GetMapCoordinates(prober), range)) - { - if (target.AllowedEffects.Contains("Electrocution")) - targetList.Add(target.Owner); - } + foreach (var (target, status) in _entityLookupSystem.GetEntitiesInRange(_transformSystem.GetMapCoordinates(prober), range)) + if (status.AllowedEffects.Contains("Electrocution")) + targetList.Add(target); - foreach(var reactive in _entityLookupSystem.GetComponentsInRange(_transformSystem.GetMapCoordinates(prober), range)) - { - targetList.Add(reactive.Owner); - } + foreach (var reactive in _entityLookupSystem.GetEntitiesInRange(_transformSystem.GetMapCoordinates(prober), range)) + targetList.Add(reactive); _random.Shuffle(targetList); foreach (var target in targetList) @@ -257,10 +237,9 @@ public void BeamRandomNearProber(EntityUid prober, int targets, float range = 10 private void Beam(EntityUid prober, EntityUid target, GlimmerTier tier, bool obeyCD = true) { - if (obeyCD && BeamCooldown != 0) - return; - - if (Deleted(prober) || Deleted(target)) + if (obeyCD && BeamCooldown != 0 + || Deleted(prober) + || Deleted(target)) return; var lxform = Transform(prober); @@ -293,47 +272,27 @@ private void Beam(EntityUid prober, EntityUid target, GlimmerTier tier, bool obe private void AnchorOrExplode(EntityUid uid) { - var xform = Transform(uid); - if (xform.Anchored) - return; - - if (!TryComp(uid, out var physics)) - return; - - var coordinates = xform.Coordinates; - var gridUid = xform.GridUid; - - if (_mapManager.TryGetGrid(gridUid, out var grid)) - { - var tileIndices = grid.TileIndicesFor(coordinates); + if (Transform(uid).GridUid is null) + _destructibleSystem.DestroyEntity(uid); - if (_anchorableSystem.TileFree(grid, tileIndices, physics.CollisionLayer, physics.CollisionMask) && - _transformSystem.AnchorEntity(uid, xform)) - { - return; - } - } - - // Wasn't able to get a grid or a free tile, so explode. - _destructibleSystem.DestroyEntity(uid); + if (HasComp(uid)) + _transformSystem.AnchorEntity(uid, Transform(uid)); } private void OnMeleeThrowOnHitAttempt(Entity ent, ref AttemptMeleeThrowOnHitEvent args) { - var (uid, _) = ent; - if (_glimmerSystem.GetGlimmerTier() < GlimmerTier.Dangerous) return; args.Cancelled = true; args.Handled = true; - _lightning.ShootRandomLightnings(uid, 10, 2, "SuperchargedLightning", 2, false); + _lightning.ShootRandomLightnings(ent, 10, 2, "SuperchargedLightning", 2, false); // Check if the parent of the user is alive, which will be the case if the user is an item and is being held. var zapTarget = _transformSystem.GetParentUid(args.User); if (TryComp(zapTarget, out _)) - _electrocutionSystem.TryDoElectrocution(zapTarget, uid, 5, TimeSpan.FromSeconds(3), true, + _electrocutionSystem.TryDoElectrocution(zapTarget, ent, 5, TimeSpan.FromSeconds(3), true, ignoreInsulation: true); } @@ -360,7 +319,8 @@ public override void Update(float frameTime) var currentGlimmerTier = _glimmerSystem.GetGlimmerTier(); var reactives = EntityQuery(); - if (currentGlimmerTier != LastGlimmerTier) { + if (currentGlimmerTier != LastGlimmerTier) + { var glimmerTierDelta = (int) currentGlimmerTier - (int) LastGlimmerTier; var ev = new GlimmerTierChangedEvent(LastGlimmerTier, currentGlimmerTier, glimmerTierDelta); @@ -378,10 +338,9 @@ public override void Update(float frameTime) _revenantSystem.MakeVisible(true); GhostsVisible = true; foreach (var reactive in reactives) - { BeamRandomNearProber(reactive.Owner, 1, 12); - } - } else if (GhostsVisible == true) + } + else if (GhostsVisible == true) { _ghostSystem.MakeVisible(false); _revenantSystem.MakeVisible(false); diff --git a/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs index f0da85ce453..57c74398b08 100644 --- a/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs +++ b/Content.Server/Psionics/Glimmer/PassiveGlimmerReductionSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.CCVar; using Content.Shared.Psionics.Glimmer; using Content.Shared.GameTicking; -using Content.Server.CartridgeLoader.Cartridges; namespace Content.Server.Psionics.Glimmer { @@ -17,7 +16,6 @@ public sealed class PassiveGlimmerReductionSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; - [Dependency] private readonly GlimmerMonitorCartridgeSystem _cartridgeSys = default!; /// List of glimmer values spaced by minute. public List GlimmerValues = new(); diff --git a/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs index 5babb6c446d..c7db2a5229f 100644 --- a/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs +++ b/Content.Server/Psionics/Glimmer/Structures/GlimmerSourceComponent.cs @@ -6,22 +6,22 @@ namespace Content.Server.Psionics.Glimmer /// public sealed partial class GlimmerSourceComponent : Component { - [DataField("accumulator")] + [DataField] public float Accumulator = 0f; - [DataField("active")] + [DataField] public bool Active = true; /// /// Since glimmer is an int, we'll do it like this. /// - [DataField("secondsPerGlimmer")] + [DataField] public float SecondsPerGlimmer = 10f; /// /// True if it produces glimmer, false if it subtracts it. /// - [DataField("addToGlimmer")] + [DataField] public bool AddToGlimmer = true; } } diff --git a/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs index 75125569cb5..8694147dc0e 100644 --- a/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs +++ b/Content.Server/Psionics/Glimmer/Structures/GlimmerStructuresSystem.cs @@ -58,10 +58,8 @@ public override void Update(float frameTime) base.Update(frameTime); foreach (var source in EntityQuery()) { - if (!_powerReceiverSystem.IsPowered(source.Owner)) - continue; - - if (!source.Active) + if (!_powerReceiverSystem.IsPowered(source.Owner) + || !source.Active) continue; source.Accumulator += frameTime; @@ -70,13 +68,9 @@ public override void Update(float frameTime) { source.Accumulator -= source.SecondsPerGlimmer; if (source.AddToGlimmer) - { _glimmerSystem.Glimmer++; - } else - { _glimmerSystem.Glimmer--; - } } } } From c8c859a6a8cdf84ef5ecd08e0091edc719b2730f Mon Sep 17 00:00:00 2001 From: OldDanceJacket <98985560+OldDanceJacket@users.noreply.github.com> Date: Sat, 10 Aug 2024 05:00:06 -0700 Subject: [PATCH 140/143] Melee Pt2 (#693) # PT2 of Melee Weapons The Numbers Don't Lie This is part 2 of the ongoing work of Solid and myself going through and touching up the melee combat in the game. In this part I rebalance all of the melee weapons to generally do less damage, more stamina damage, and be more unique in regards to slight range changes, attack speed adjustments, along with every weapon getting slightly adjusted heavy swing changes ranging from attack rates, damage, range, angle, and how many targets you can hit. Majority of weapons will hit the standard amount of targets of 5(the old norm), but a few are lowered to be single target hits. These are usually tightened in the angle that they attack in(old angle range was 60). Similarly all melee weapons have individual stamina costs on their heavy swings, most of these are in the range of 5 or 10, and following this PR the new standard should be 10 as the outliers that would abuse this have been addressed in this PR. --- # Changelog Normally I would do a changelog but this took awhile and I forgo. :cl: ODJ - tweak: Melee Weapons now feel different across the board, from the Wrench to the Chainsaw, try out their normal swings and their heavy attacks! --------- Co-authored-by: VMSolidus Co-authored-by: jcsmithing --- .../Weapons/Melee/MeleeWeaponSystem.cs | 5 +- Content.Server/Execution/ExecutionSystem.cs | 2 +- .../Weapons/Melee/MeleeWeaponSystem.cs | 11 ++- .../Zombies/ZombieSystem.Transform.cs | 2 +- .../Damage/Systems/StaminaSystem.cs | 3 +- .../Weapons/Melee/MeleeSoundSystem.cs | 6 +- .../Weapons/Melee/MeleeWeaponComponent.cs | 71 ++++++++------ .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 93 ++++++++++--------- .../Locale/en-US/damage/damage-examine.ftl | 1 + .../Consumable/Drinks/drinks_bottles.yml | 11 ++- .../Fun/Instruments/instruments_string.yml | 76 ++++++++++++--- .../Prototypes/Entities/Objects/Fun/toys.yml | 10 ++ .../Entities/Objects/Misc/briefcases.yml | 12 +++ .../Entities/Objects/Misc/broken_bottle.yml | 9 +- .../Objects/Misc/fire_extinguisher.yml | 9 +- .../Objects/Specific/Chapel/bibles.yml | 8 +- .../Objects/Specific/Hydroponics/tools.yml | 45 +++++++-- .../Objects/Specific/Janitorial/janitor.yml | 20 +++- .../Objects/Specific/Medical/surgery.yml | 78 +++++++++++++--- .../Entities/Objects/Tools/flashlights.yml | 16 +++- .../Entities/Objects/Tools/gas_tanks.yml | 9 +- .../Entities/Objects/Tools/jaws_of_life.yml | 12 ++- .../Entities/Objects/Tools/toolbox.yml | 14 ++- .../Entities/Objects/Tools/tools.yml | 68 ++++++++++++-- .../Entities/Objects/Tools/welders.yml | 4 +- .../Objects/Weapons/Melee/baseball_bat.yml | 11 ++- .../Objects/Weapons/Melee/chainsaw.yml | 6 +- .../Entities/Objects/Weapons/Melee/cult.yml | 28 ++++-- .../Objects/Weapons/Melee/e_sword.yml | 14 +-- .../Objects/Weapons/Melee/fireaxe.yml | 10 +- .../Entities/Objects/Weapons/Melee/knife.yml | 39 +++++--- .../Entities/Objects/Weapons/Melee/mining.yml | 22 ++++- .../Objects/Weapons/Melee/pickaxe.yml | 32 +++++-- .../Objects/Weapons/Melee/sledgehammer.yml | 10 +- .../Entities/Objects/Weapons/Melee/spear.yml | 32 ++++--- .../Objects/Weapons/Melee/stunprod.yml | 13 ++- .../Entities/Objects/Weapons/Melee/sword.yml | 48 ++++++++-- .../Objects/Weapons/Melee/white_cane.yml | 15 ++- .../Entities/Objects/Weapons/security.yml | 12 ++- 39 files changed, 675 insertions(+), 212 deletions(-) diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs index 641d56d3d14..cf987e62c7b 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.cs @@ -1,5 +1,6 @@ using System.Linq; using Content.Client.Gameplay; +using Content.Shared.CCVar; using Content.Shared.CombatMode; using Content.Shared.Effects; using Content.Shared.Hands.Components; @@ -16,8 +17,6 @@ using Robust.Shared.Input; using Robust.Shared.Map; using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Timing; namespace Content.Client.Weapons.Melee; @@ -228,7 +227,7 @@ private void ClientHeavyAttack(EntityUid user, EntityCoordinates coordinates, En // This should really be improved. GetEntitiesInArc uses pos instead of bounding boxes. // Server will validate it with InRangeUnobstructed. var entities = GetNetEntityList(ArcRayCast(userPos, direction.ToWorldAngle(), component.Angle, distance, userXform.MapID, user).ToList()); - RaisePredictiveEvent(new HeavyAttackEvent(GetNetEntity(meleeUid), entities.GetRange(0, Math.Min(MaxTargets, entities.Count)), GetNetCoordinates(coordinates))); + RaisePredictiveEvent(new HeavyAttackEvent(GetNetEntity(meleeUid), entities.GetRange(0, Math.Min(component.MaxTargets, entities.Count)), GetNetCoordinates(coordinates))); } private void OnMeleeLunge(MeleeLungeEvent ev) diff --git a/Content.Server/Execution/ExecutionSystem.cs b/Content.Server/Execution/ExecutionSystem.cs index 3b87fa17cad..326aa1d6a49 100644 --- a/Content.Server/Execution/ExecutionSystem.cs +++ b/Content.Server/Execution/ExecutionSystem.cs @@ -251,7 +251,7 @@ private void OnDoafterMelee(EntityUid uid, SharpComponent component, DoAfterEven return; _damageableSystem.TryChangeDamage(victim, melee.Damage * DamageModifier, true); - _audioSystem.PlayEntity(melee.HitSound, Filter.Pvs(weapon), weapon, true, AudioParams.Default); + _audioSystem.PlayEntity(melee.SoundHit, Filter.Pvs(weapon), weapon, true, AudioParams.Default); if (attacker == victim) { diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 22840cde8f5..d63dd093eec 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -57,6 +57,9 @@ private void OnMeleeExamineDamage(EntityUid uid, MeleeWeaponComponent component, return; _damageExamine.AddDamageExamine(args.Message, damageSpec, Loc.GetString("damage-melee")); + + if (damageSpec * component.HeavyDamageBaseModifier != damageSpec) + _damageExamine.AddDamageExamine(args.Message, damageSpec * component.HeavyDamageBaseModifier, Loc.GetString("damage-melee-heavy")); } protected override bool ArcRaySuccessful(EntityUid targetUid, Vector2 position, Angle angle, Angle arcWidth, float range, MapId mapId, @@ -132,7 +135,7 @@ protected override bool DoDisarm(EntityUid user, DisarmAttackEvent ev, EntityUid if (attemptEvent.Cancelled) return false; - var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode) * _contests.MassContest(user, target); + var chance = CalculateDisarmChance(user, target, inTargetHand, combatMode); if (_random.Prob(chance)) { @@ -212,7 +215,11 @@ private float CalculateDisarmChance(EntityUid disarmer, EntityUid disarmed, Enti chance += malus.Malus; } - return Math.Clamp(chance, 0f, 1f); + return Math.Clamp(chance + * _contests.MassContest(disarmer, disarmed, false, 0.5f) + * _contests.StaminaContest(disarmer, disarmed, false, 0.5f) + * _contests.HealthContest(disarmer, disarmed, false, 0.5f), + 0f, 1f); } public override void DoLunge(EntityUid user, EntityUid weapon, Angle angle, Vector2 localPos, string? animation, bool predicted = true) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index c87132cc3cb..c6c71b80345 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -143,7 +143,7 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) melee.AltDisarm = false; melee.Range = 1.2f; melee.Angle = 0.0f; - melee.HitSound = zombiecomp.BiteSound; + melee.SoundHit = zombiecomp.BiteSound; if (mobState.CurrentState == MobState.Alive) { diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 5c46e6055d1..54a88205b2d 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -260,7 +260,8 @@ public bool TryTakeStamina(EntityUid uid, float value, StaminaComponent? compone public void TakeStaminaDamage(EntityUid uid, float value, StaminaComponent? component = null, EntityUid? source = null, EntityUid? with = null, bool visual = true, SoundSpecifier? sound = null) { - if (!Resolve(uid, ref component, false)) + if (!Resolve(uid, ref component, false) + || value == 0) return; var ev = new BeforeStaminaDamageEvent(value); diff --git a/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs b/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs index 5bf74802026..350642105a5 100644 --- a/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeSoundSystem.cs @@ -20,7 +20,7 @@ public sealed class MeleeSoundSystem : EntitySystem ///
public void PlaySwingSound(EntityUid userUid, EntityUid weaponUid, MeleeWeaponComponent weaponComponent) { - _audio.PlayPredicted(weaponComponent.SwingSound, weaponUid, userUid); + _audio.PlayPredicted(weaponComponent.SoundSwing, weaponUid, userUid); } /// @@ -32,8 +32,8 @@ public void PlaySwingSound(EntityUid userUid, EntityUid weaponUid, MeleeWeaponCo /// A sound can be supplied by the itself to override everything else public void PlayHitSound(EntityUid targetUid, EntityUid? userUid, string? damageType, SoundSpecifier? hitSoundOverride, MeleeWeaponComponent weaponComponent) { - var hitSound = weaponComponent.HitSound; - var noDamageSound = weaponComponent.NoDamageSound; + var hitSound = weaponComponent.SoundHit; + var noDamageSound = weaponComponent.SoundNoDamage; var playedSound = false; diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index 85d2e4675f7..d30e27e98c7 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -18,13 +18,12 @@ public sealed partial class MeleeWeaponComponent : Component /// /// Does this entity do a disarm on alt attack. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool AltDisarm = true; /// /// Should the melee weapon's damage stats be examinable. /// - [ViewVariables(VVAccess.ReadWrite)] [DataField] public bool Hidden; @@ -32,14 +31,13 @@ public sealed partial class MeleeWeaponComponent : Component /// Next time this component is allowed to light attack. Heavy attacks are wound up and never have a cooldown. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [ViewVariables(VVAccess.ReadWrite)] [AutoPausedField] public TimeSpan NextAttack; /// /// Starts attack cooldown when equipped if true. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField] public bool ResetOnHandSelected = true; /* @@ -51,77 +49,98 @@ public sealed partial class MeleeWeaponComponent : Component /// /// How many times we can attack per second. /// - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public float AttackRate = 1f; + /// + /// When power attacking, the swing speed (in attacks per second) is multiplied by this amount + /// + [DataField, AutoNetworkedField] + public float HeavyRateModifier = 0.8f; /// /// Are we currently holding down the mouse for an attack. /// Used so we can't just hold the mouse button and attack constantly. /// - [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [AutoNetworkedField] public bool Attacking = false; /// /// If true, attacks will be repeated automatically without requiring the mouse button to be lifted. /// - [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [DataField, AutoNetworkedField] public bool AutoAttack; /// /// Base damage for this weapon. Can be modified via heavy damage or other means. /// [DataField(required: true)] - [ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] + [AutoNetworkedField] public DamageSpecifier Damage = default!; - [DataField] - [ViewVariables(VVAccess.ReadWrite)] - public FixedPoint2 BluntStaminaDamageFactor = FixedPoint2.New(0.5f); + [DataField, AutoNetworkedField] + public FixedPoint2 BluntStaminaDamageFactor = FixedPoint2.New(1f); /// /// Multiplies damage by this amount for single-target attacks. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public FixedPoint2 ClickDamageModifier = FixedPoint2.New(1); // TODO: Temporarily 1.5 until interactionoutline is adjusted to use melee, then probably drop to 1.2 /// /// Nearest edge range to hit an entity. /// - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public float Range = 1.5f; + /// + /// Attack range for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyRangeModifier = 1f; + + /// + /// Weapon damage is multiplied by this amount for heavy swings + /// + [DataField, AutoNetworkedField] + public float HeavyDamageBaseModifier = 1.2f; + /// /// Total width of the angle for wide attacks. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public Angle Angle = Angle.FromDegrees(60); - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntProtoId Animation = "WeaponArcPunch"; - [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] + [DataField, AutoNetworkedField] public EntProtoId WideAnimation = "WeaponArcSlash"; /// /// Rotation of the animation. /// 0 degrees means the top faces the attacker. /// - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField, AutoNetworkedField] public Angle WideAnimationRotation = Angle.Zero; - [ViewVariables(VVAccess.ReadWrite), DataField] + [DataField] public bool SwingLeft; + [DataField, AutoNetworkedField] + public float HeavyStaminaCost = 20f; + + [DataField, AutoNetworkedField] + public int MaxTargets = 5; + // Sounds /// /// This gets played whenever a melee attack is done. This is predicted by the client. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("soundSwing"), AutoNetworkedField] - public SoundSpecifier SwingSound { get; set; } = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg") + [DataField, AutoNetworkedField] + public SoundSpecifier SoundSwing { get; set; } = new SoundPathSpecifier("/Audio/Weapons/punchmiss.ogg") { Params = AudioParams.Default.WithVolume(-3f).WithVariation(0.025f), }; @@ -130,16 +149,14 @@ public sealed partial class MeleeWeaponComponent : Component // then a player may doubt if the target actually took damage or not. // If overwatch and apex do this then we probably should too. - [ViewVariables(VVAccess.ReadWrite)] - [DataField("soundHit"), AutoNetworkedField] - public SoundSpecifier? HitSound; + [DataField, AutoNetworkedField] + public SoundSpecifier? SoundHit; /// /// Plays if no damage is done to the target entity. /// - [ViewVariables(VVAccess.ReadWrite)] - [DataField("soundNoDamage"), AutoNetworkedField] - public SoundSpecifier NoDamageSound { get; set; } = new SoundCollectionSpecifier("WeakHit"); + [DataField, AutoNetworkedField] + public SoundSpecifier SoundNoDamage { get; set; } = new SoundCollectionSpecifier("WeakHit"); } /// diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index e59b4a13fed..b5a537b7e15 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -4,7 +4,9 @@ using Content.Shared.ActionBlocker; using Content.Shared.Administration.Logs; using Content.Shared.CombatMode; +using Content.Shared.Contests; using Content.Shared.Damage; +using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.FixedPoint; @@ -12,7 +14,6 @@ using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Inventory; -using Content.Shared.Item; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Physics; using Content.Shared.Popups; @@ -27,35 +28,30 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Timing; -using Robust.Shared.Toolshed.Syntax; using ItemToggleMeleeWeaponComponent = Content.Shared.Item.ItemToggle.Components.ItemToggleMeleeWeaponComponent; namespace Content.Shared.Weapons.Melee; public abstract class SharedMeleeWeaponSystem : EntitySystem { - [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; - [Dependency] protected readonly ActionBlockerSystem Blocker = default!; - [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!; - [Dependency] protected readonly DamageableSystem Damageable = default!; - [Dependency] protected readonly SharedInteractionSystem Interaction = default!; - [Dependency] protected readonly IMapManager MapManager = default!; - [Dependency] protected readonly SharedPopupSystem PopupSystem = default!; - [Dependency] protected readonly IGameTiming Timing = default!; - [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; - [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; - [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] protected readonly ActionBlockerSystem Blocker = default!; + [Dependency] protected readonly SharedCombatModeSystem CombatMode = default!; + [Dependency] protected readonly DamageableSystem Damageable = default!; + [Dependency] protected readonly SharedInteractionSystem Interaction = default!; + [Dependency] protected readonly IMapManager MapManager = default!; + [Dependency] protected readonly SharedPopupSystem PopupSystem = default!; + [Dependency] protected readonly IGameTiming Timing = default!; + [Dependency] protected readonly SharedTransformSystem TransformSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly MeleeSoundSystem _meleeSound = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly IPrototypeManager _protoManager = default!; + [Dependency] private readonly StaminaSystem _stamina = default!; + [Dependency] private readonly ContestsSystem _contests = default!; private const int AttackMask = (int) (CollisionGroup.MobMask | CollisionGroup.Opaque); - /// - /// Maximum amount of targets allowed for a wide-attack. - /// - public const int MaxTargets = 5; - /// /// If an attack is released within this buffer it's assumed to be full damage. /// @@ -80,8 +76,7 @@ public override void Initialize() SubscribeAllEvent(OnStopAttack); #if DEBUG - SubscribeLocalEvent (OnMapInit); + SubscribeLocalEvent(OnMapInit); } private void OnMapInit(EntityUid uid, MeleeWeaponComponent component, MapInitEvent args) @@ -252,7 +247,11 @@ public FixedPoint2 GetHeavyDamageModifier(EntityUid uid, EntityUid user, MeleeWe var ev = new GetHeavyDamageModifierEvent(uid, component.ClickDamageModifier, 1, user); RaiseLocalEvent(uid, ref ev); - return ev.DamageModifier * ev.Multipliers; + return ev.DamageModifier + * ev.Multipliers + * component.HeavyDamageBaseModifier + * _contests.StaminaContest(user, false, 2f) //Taking stamina damage reduces wide swing damage by up to 50% + / _contests.HealthContest(user, false, 0.8f); //Being injured grants up to 20% more wide swing damage } public bool TryGetWeapon(EntityUid entity, out EntityUid weaponUid, [NotNullWhen(true)] out MeleeWeaponComponent? melee) @@ -340,6 +339,8 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo if (!CombatMode.IsInCombatMode(user)) return false; + var fireRateSwingModifier = 1f; + switch (attack) { case LightAttackEvent light: @@ -359,6 +360,9 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo if (!Blocker.CanAttack(user, disarmTarget, (weaponUid, weapon), true)) return false; break; + case HeavyAttackEvent: + fireRateSwingModifier *= weapon.HeavyRateModifier; + break; default: if (!Blocker.CanAttack(user, weapon: (weaponUid, weapon))) return false; @@ -366,7 +370,7 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo } // Windup time checked elsewhere. - var fireRate = TimeSpan.FromSeconds(1f / GetAttackRate(weaponUid, user, weapon)); + var fireRate = TimeSpan.FromSeconds(1f / GetAttackRate(weaponUid, user, weapon) * fireRateSwingModifier); var swings = 0; // TODO: If we get autoattacks then probably need a shotcounter like guns so we can do timing properly. @@ -436,8 +440,9 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) { - // If I do not come back later to fix Light Attacks being Heavy Attacks you can throw me in the spider pit -Errant - var damage = GetDamage(meleeUid, user, component) * GetHeavyDamageModifier(meleeUid, user, component); + var damage = GetDamage(meleeUid, user, component) + * _contests.StaminaContest(user) //Taking stamina damage reduces light attack damage by up to 25% + / _contests.HealthContest(user, false, 0.8f); //Being injured grants up to 20% more damage; var target = GetEntity(ev.Target); // For consistency with wide attacks stuff needs damageable. @@ -526,7 +531,7 @@ protected virtual void DoLightAttack(EntityUid user, LightAttackEvent ev, Entity } } - protected abstract void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform); + protected abstract void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform); private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeUid, MeleeWeaponComponent component, ICommonSession? session) { @@ -541,9 +546,9 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU var userPos = TransformSystem.GetWorldPosition(userXform); var direction = targetMap.Position - userPos; - var distance = Math.Min(component.Range, direction.Length()); + var distance = Math.Min(component.Range * component.HeavyRangeModifier, direction.Length()); - var damage = GetDamage(meleeUid, user, component); + var damage = GetDamage(meleeUid, user, component) * GetHeavyDamageModifier(meleeUid, user, component); var entities = GetEntityList(ev.Entities); if (entities.Count == 0) @@ -567,11 +572,9 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU return true; } - // Naughty input - if (entities.Count > MaxTargets) - { - entities.RemoveRange(MaxTargets, entities.Count - MaxTargets); - } + var maxTargets = component.MaxTargets; + if (entities.Count > maxTargets) + entities.RemoveRange(maxTargets, entities.Count - maxTargets); // Validate client for (var i = entities.Count - 1; i >= 0; i--) @@ -666,6 +669,10 @@ private bool DoHeavyAttack(EntityUid user, HeavyAttackEvent ev, EntityUid meleeU DoDamageEffect(targets, user, Transform(targets[0])); } + if (TryComp(user, out var stamina)) + _stamina.TakeStaminaDamage(user, component.HeavyStaminaCost, stamina); + + return true; } @@ -785,20 +792,20 @@ private void OnItemToggle(EntityUid uid, ItemToggleMeleeWeaponComponent itemTogg meleeWeapon.Damage = itemToggleMelee.ActivatedDamage; } - meleeWeapon.HitSound = itemToggleMelee.ActivatedSoundOnHit; + meleeWeapon.SoundHit = itemToggleMelee.ActivatedSoundOnHit; if (itemToggleMelee.ActivatedSoundOnHitNoDamage != null) { //Setting the deactivated sound on no damage hit to the weapon's regular value before changing it. - itemToggleMelee.DeactivatedSoundOnHitNoDamage ??= meleeWeapon.NoDamageSound; - meleeWeapon.NoDamageSound = itemToggleMelee.ActivatedSoundOnHitNoDamage; + itemToggleMelee.DeactivatedSoundOnHitNoDamage ??= meleeWeapon.SoundNoDamage; + meleeWeapon.SoundNoDamage = itemToggleMelee.ActivatedSoundOnHitNoDamage; } if (itemToggleMelee.ActivatedSoundOnSwing != null) { //Setting the deactivated sound on no damage hit to the weapon's regular value before changing it. - itemToggleMelee.DeactivatedSoundOnSwing ??= meleeWeapon.SwingSound; - meleeWeapon.SwingSound = itemToggleMelee.ActivatedSoundOnSwing; + itemToggleMelee.DeactivatedSoundOnSwing ??= meleeWeapon.SoundSwing; + meleeWeapon.SoundSwing = itemToggleMelee.ActivatedSoundOnSwing; } if (itemToggleMelee.DeactivatedSecret) @@ -809,13 +816,13 @@ private void OnItemToggle(EntityUid uid, ItemToggleMeleeWeaponComponent itemTogg if (itemToggleMelee.DeactivatedDamage != null) meleeWeapon.Damage = itemToggleMelee.DeactivatedDamage; - meleeWeapon.HitSound = itemToggleMelee.DeactivatedSoundOnHit; + meleeWeapon.SoundHit = itemToggleMelee.DeactivatedSoundOnHit; if (itemToggleMelee.DeactivatedSoundOnHitNoDamage != null) - meleeWeapon.NoDamageSound = itemToggleMelee.DeactivatedSoundOnHitNoDamage; + meleeWeapon.SoundNoDamage = itemToggleMelee.DeactivatedSoundOnHitNoDamage; if (itemToggleMelee.DeactivatedSoundOnSwing != null) - meleeWeapon.SwingSound = itemToggleMelee.DeactivatedSoundOnSwing; + meleeWeapon.SoundSwing = itemToggleMelee.DeactivatedSoundOnSwing; if (itemToggleMelee.DeactivatedSecret) meleeWeapon.Hidden = true; diff --git a/Resources/Locale/en-US/damage/damage-examine.ftl b/Resources/Locale/en-US/damage/damage-examine.ftl index 974b8fa9650..9e24d4d2f72 100644 --- a/Resources/Locale/en-US/damage/damage-examine.ftl +++ b/Resources/Locale/en-US/damage/damage-examine.ftl @@ -5,6 +5,7 @@ damage-examinable-verb-message = Examine the damage values. damage-hitscan = hitscan damage-projectile = projectile damage-melee = melee +damage-melee-heavy = power attack damage-throw = throw damage-examine = It does the following damage: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index fc35fae1af8..a6752286dd2 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -47,6 +47,15 @@ components: - type: Sprite state: icon + - type: MeleeWeapon + bluntStaminaDamageFactor: 2.0 + damage: + types: + Blunt: 7.5 + heavyRangeModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 25 - type: DamageOnLand damage: types: @@ -54,7 +63,7 @@ - type: DamageOtherOnHit damage: types: - Blunt: 4 + Blunt: 5 - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml index fab8b56b06f..947a973bbf6 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_string.yml @@ -14,6 +14,19 @@ - type: Sprite sprite: Objects/Fun/Instruments/eguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: Item size: Normal sprite: Objects/Fun/Instruments/eguitar.rsi @@ -43,6 +56,19 @@ - type: Sprite sprite: Objects/Fun/Instruments/bassguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: Item size: Normal sprite: Objects/Fun/Instruments/bassguitar.rsi @@ -71,6 +97,27 @@ - type: Sprite sprite: Objects/Fun/Instruments/rockguitar.rsi state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Nyanotrasen/Weapons/electricguitarhit.ogg + range: 1.85 + attackRate: 1.25 + wideAnimationRotation: 45 + damage: + types: + Blunt: 6 + Shock: 1 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 15 + angle: 160 + - type: Wieldable + - type: IncreaseDamageOnWield + damage: + types: + Blunt: 2 + Shock: 1 - type: Item size: Normal sprite: Objects/Fun/Instruments/rockguitar.rsi @@ -82,18 +129,6 @@ - type: Tag tags: - StringInstrument - - type: MeleeWeapon - wideAnimationRotation: 45 - damage: - types: - Blunt: 6 - Slash: 2 - - type: Wieldable - - type: IncreaseDamageOnWield #they don't call it an axe for nothing - damage: - types: - Blunt: 4 - Slash: 2 - type: entity parent: BaseHandheldInstrument @@ -145,14 +180,20 @@ types: Blunt: 20 - type: MeleeWeapon + range: 1.5 wideAnimationRotation: 45 damage: types: - Blunt: 5 + Blunt: 7 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: IncreaseDamageOnWield damage: types: - Blunt: 15 + Blunt: 2 - type: entity parent: BaseHandheldInstrument @@ -186,10 +227,15 @@ - type: MeleeWeapon soundHit: path: /Audio/SimpleStation14/Weapons/Melee/banjohit.ogg + range: 1.5 damage: types: Blunt: 7 - bluntStaminaDamageFactor: 1.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 75 - type: entity parent: BaseHandheldInstrument diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 094f434c39c..66d6713fb22 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -628,6 +628,16 @@ - type: Sprite sprite: Objects/Fun/ducky.rsi state: icon + - type: MeleeWeapon + attackRate: 1.5 + range: 1.3 + damage: + types: + Blunt: 0.1 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 5 + maxTargets: 8 + angle: 25 - type: Clothing quickEquip: false sprite: Objects/Fun/ducky.rsi diff --git a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml index 762204701cb..760a0bafb68 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/briefcases.yml @@ -9,6 +9,18 @@ - type: Storage grid: - 0,0,5,3 + - type: MeleeWeapon + bluntStaminaDamageFactor: 3.0 + attackRate: 0.9 + range: 1.75 + damage: + types: + Blunt: 3.5 + heavyRateModifier: 0.8 + heavyRangeModifier: 0.8 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 5 + maxTargets: 8 - type: Tag tags: - Briefcase diff --git a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml index 32222d0036c..f8dbabd07a1 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/broken_bottle.yml @@ -7,9 +7,16 @@ - type: Sharp - type: MeleeWeapon attackRate: 1.5 + range: 1.3 damage: types: - Slash: 5 + Slash: 4 + heavyRateModifier: 0.8 + heavyRangeModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 75 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml index bae33f27f17..f1802e426fb 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/fire_extinguisher.yml @@ -38,9 +38,16 @@ hasSafety: true - type: MeleeWeapon wideAnimationRotation: 180 + attackRate: 0.8 + bluntStaminaDamageFactor: 2.5 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 8 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 2 + heavyStaminaCost: 15 + maxTargets: 8 soundHit: path: /Audio/Weapons/smash.ogg - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 1162a3ec71b..9ab53cebc96 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -45,8 +45,12 @@ - type: MeleeWeapon # Nyanotrasen - Bibles do Holy damage damage: types: - Blunt: 3 - Holy: 10 + Blunt: 4 + Holy: 20 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 5 + maxTargets: 3 - type: Tag tags: - Book diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index 727c75c8794..37b8daddc27 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -16,7 +16,14 @@ swingLeft: true damage: types: - Slash: 6 + Slash: 3.5 + Blunt: 3 + heavyRateModifier: 1 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 5 + angle: 100 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi @@ -34,9 +41,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.8 damage: types: - Slash: 7 + Pierce: 7 + heavyRateModifier: 0.9 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 - type: Item sprite: Objects/Tools/Hydroponics/clippers.rsi storedRotation: -90 @@ -53,9 +67,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 135 + range: 1.85 damage: types: - Slash: 10 + Slash: 7 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 120 - type: Item size: Normal - type: Clothing @@ -81,10 +102,13 @@ - type: MeleeWeapon wideAnimationRotation: 135 swingLeft: true + attackRate: 1.25 + range: 1.25 damage: types: - Slash: 8 - Piercing: 2 + Slash: 10 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi @@ -104,14 +128,19 @@ wideAnimationRotation: 45 damage: types: - Blunt: 8 - Piercing: 2 # I guess you can stab it into them? + Blunt: 6 + Slash: 2 # I guess you can stab it into them? + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + angle: 80 soundHit: collection: MetalThud - type: Item sprite: Objects/Tools/Hydroponics/spade.rsi - type: Shovel - speedModifier: 0.75 # slower at digging than a full-sized shovel + speedModifier: 0.85 # slower at digging than a full-sized shovel - type: entity name: plant bag diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index b192401c8b8..de5c33671a8 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -8,9 +8,17 @@ sprite: Objects/Specific/Janitorial/mop.rsi state: mop - type: MeleeWeapon + range: 1.85 damage: types: - Blunt: 10 + Blunt: 2 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 2 + angle: 180 soundHit: collection: MetalThud - type: Spillable @@ -48,9 +56,17 @@ sprite: Objects/Specific/Janitorial/advmop.rsi state: advmop - type: MeleeWeapon + range: 1.85 damage: types: - Blunt: 10 + Blunt: 2 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 2 + angle: 180 soundHit: collection: MetalThud - type: Spillable diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index aa0cf461872..c81768da4d3 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -50,9 +50,15 @@ - 0,0,1,0 - 1,1,1,1 - type: MeleeWeapon + attackRate: 0.75 + range: 1.3 damage: types: - Piercing: 10 + Piercing: 8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: /Audio/Items/drill_hit.ogg - type: StaticPrice @@ -80,10 +86,16 @@ - type: MeleeWeapon wideAnimationRotation: 90 swingLeft: true - attackRate: 1.5 + attackRate: 1.25 + range: 1.25 damage: types: - Slash: 8 + Slash: 7.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg @@ -111,7 +123,7 @@ - type: MeleeWeapon damage: types: - Slash: 12 + Slash: 8 - type: entity name: laser scalpel @@ -121,6 +133,11 @@ components: - type: Sprite state: laser + - type: MeleeWeapon + damage: + types: + Slash: 6.5 + Heat: 1 - type: Item heldPrefix: laser @@ -179,7 +196,19 @@ qualities: - Sawing speed: 1.0 -# No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb. + - type: MeleeWeapon + attackRate: 0.75 + range: 1.35 + damage: + types: + Blunt: 2.5 + Slash: 6.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 20 + maxTargets: 8 + angle: 20 +# ~~No melee for regular saw because have you ever seen someone use a band saw as a weapon? It's dumb.~~ No, I'm going to saw through your bones. - type: entity name: choppa @@ -192,9 +221,17 @@ - type: Item heldPrefix: improv - type: MeleeWeapon + attackRate: 0.85 damage: - groups: - Brute: 10 + types: + Blunt: 3 + Slash: 7 + bluntStaminaDamageFactor: 3 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 20 + maxTargets: 8 + angle: 20 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Tool @@ -214,9 +251,18 @@ heldPrefix: electric storedRotation: 90 - type: MeleeWeapon + attackRate: 1.15 + range: 1.4 + bluntStaminaDamageFactor: 3.0 damage: - groups: - Brute: 15 + types: + Blunt: 4.5 + Slash: 5.5 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 15 + maxTargets: 8 + angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool @@ -236,10 +282,18 @@ heldPrefix: advanced storedRotation: 90 - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1.25 + range: 1.4 + bluntStaminaDamageFactor: 5.0 damage: - groups: - Brute: 15 + types: + Blunt: 4.5 + Slash: 7.5 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 15 + maxTargets: 8 + angle: 360 soundHit: path: /Audio/Items/drill_hit.ogg - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml index d22e9190921..2b75a7e3dd9 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/flashlights.yml @@ -54,6 +54,14 @@ shader: unshaded visible: false map: [ "light" ] + - type: MeleeWeapon + attackRate: 0.8 + bluntStaminaDamageFactor: 1.5 + damage: + types: + Blunt: 6 + soundHit: + collection: MetalThud - type: Item sprite: Objects/Tools/flashlight.rsi storedRotation: -90 @@ -108,9 +116,15 @@ map: [ "light" ] - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.8 damage: types: - Blunt: 10 + Blunt: 6.5 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.9 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 2f281e141a1..f739de251cb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -34,9 +34,16 @@ - type: MeleeWeapon wideAnimationRotation: 45 attackRate: 0.8 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 8 + bluntStaminaDamageFactor: 2.5 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 15 + maxTargets: 1 + angle: 140 - type: PhysicalComposition materialComposition: Steel: 185 diff --git a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml index 8e2b7597970..36d2f1308fb 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jaws_of_life.yml @@ -44,9 +44,18 @@ changeSound: /Audio/Items/change_jaws.ogg - type: MeleeWeapon wideAnimationRotation: 90 + attackRate: 0.75 + range: 1.75 damage: types: Blunt: 10 + Slash: 2 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 10 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud @@ -87,4 +96,5 @@ - type: MeleeWeapon damage: types: - Blunt: 14 + Blunt: 12 + Slash: 2 diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 9e35443cd4b..6702ae39d69 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -21,9 +21,15 @@ - type: Item size: Ginormous - type: MeleeWeapon + attackRate: 0.9 + range: 1.75 damage: types: - Blunt: 12 + Blunt: 9 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyStaminaCost: 10 + angle: 80.5 soundHit: path: "/Audio/Weapons/smash.ogg" - type: Tag @@ -134,7 +140,7 @@ - type: MeleeWeapon damage: types: - Blunt: 20 + Blunt: 11.5 - type: entity name: golden toolbox @@ -147,6 +153,10 @@ state: icon - type: Item sprite: Objects/Tools/Toolboxes/toolbox_gold.rsi + - type: MeleeWeapon + damage: + types: + Blunt: 12 - type: entity id: ToolboxThief diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index d135b2f29bb..a6926f1d8c3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -31,10 +31,16 @@ - state: cutters-cutty-thingy - type: MeleeWeapon wideAnimationRotation: -90 + attackRate: 0.9 + range: 1.6 damage: types: - Piercing: 2 - attackRate: 2 #open and close that shit on their arm like hell! because you sure aren't doing any damage with this + Blunt: 6.5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 4 + angle: 60 soundHit: path: "/Audio/Items/wirecutter.ogg" - type: Tool @@ -91,10 +97,15 @@ storedRotation: -90 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1 + attackRate: 1.35 damage: types: Piercing: 6 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: "/Audio/Weapons/bladeslice.ogg" - type: Tool @@ -146,10 +157,16 @@ state: storage - type: MeleeWeapon wideAnimationRotation: 135 - attackRate: 1.5 + attackRate: 0.9 + range: 1.6 damage: types: - Blunt: 4.5 + Blunt: 6.5 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + angle: 100 soundHit: collection: MetalThud - type: Tool @@ -198,9 +215,12 @@ state: storage - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 damage: types: - Blunt: 8 + Blunt: 6 + bluntStaminaDamageFactor: 2 + heavyStaminaCost: 5 soundHit: collection: MetalThud - type: Tool @@ -252,6 +272,16 @@ - state: icon - state: green-unlit shader: unshaded + - type: MeleeWeapon + attackRate: 0.75 + damage: + types: + Shock: 2 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 - type: Item size: Small - type: Clothing @@ -391,10 +421,16 @@ price: 100 - type: MeleeWeapon wideAnimationRotation: -90 - attackRate: 1.5 + attackRate: 0.9 + range: 1.4 damage: types: - Piercing: 10 + Piercing: 8 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: path: "/Audio/Items/drill_hit.ogg" @@ -600,9 +636,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: 45 + attackRate: 0.8 + range: 2.0 damage: types: - Blunt: 14 + Blunt: 8 + bluntStaminaDamageFactor: 1.5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Item @@ -642,9 +685,16 @@ - Belt - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.9 damage: types: Blunt: 7 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.5 + heavyStaminaCost: 5 + maxTargets: 1 + angle: 20 soundHit: collection: MetalThud - type: Tool diff --git a/Resources/Prototypes/Entities/Objects/Tools/welders.yml b/Resources/Prototypes/Entities/Objects/Tools/welders.yml index e141f35caeb..8214ec56f34 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/welders.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/welders.yml @@ -55,7 +55,7 @@ collection: MetalThud activatedDamage: types: - Heat: 8 + Heat: 7 - type: ItemToggleSize activatedSize: Large - type: ItemToggleHot @@ -75,7 +75,7 @@ wideAnimationRotation: -90 damage: types: - Blunt: 5 #i mean... i GUESS you could use it like that + Blunt: 6 #i mean... i GUESS you could use it like that soundHit: collection: MetalThud - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml index 834d35a5297..8780d377e05 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml @@ -9,17 +9,24 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + range: 1.6 damage: types: - Blunt: 10 + Blunt: 7.5 Structural: 5 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 15 + maxTargets: 2 + angle: 120 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 + Blunt: 4 Structural: 10 - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml index bfdd94add6c..b2727b334c6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/chainsaw.yml @@ -15,7 +15,6 @@ state: icon - type: MeleeWeapon autoAttack: true - angle: 0 wideAnimationRotation: -135 attackRate: 4 damage: @@ -23,6 +22,11 @@ Slash: 2 Blunt: 2 Structural: 4 + heavyRateModifier: 0.5 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 15 + maxTargets: 20 + angle: 160 soundHit: path: /Audio/Weapons/chainsaw.ogg params: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml index ecb6479de70..5e9d789b658 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml @@ -10,10 +10,14 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 12 + Slash: 8 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 - type: Item size: Normal - type: Clothing @@ -35,9 +39,14 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 0.75 + range: 1.75 damage: types: - Slash: 16 + Slash: 12 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + maxTargets: 6 + angle: 90 - type: Item size: Normal - type: Clothing @@ -62,19 +71,24 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 0.75 + range: 1.75 damage: types: - Blunt: 10 - Slash: 10 + Blunt: 2 + Slash: 13 Structural: 5 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 - Slash: 5 + Blunt: 2 + Slash: 3 Structural: 10 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index bc376df5eab..0cbc824365d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -35,8 +35,8 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 8 + Heat: 10 Structural: 20 - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi @@ -49,7 +49,7 @@ map: [ "blade" ] - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1 + attackRate: 1.25 damage: types: Blunt: 4.5 @@ -106,8 +106,8 @@ variation: 0.250 activatedDamage: types: - Slash: 10 - Heat: 10 + Slash: 4 + Heat: 8 deactivatedSecret: true - type: ItemToggleActiveSound activeSound: @@ -245,8 +245,8 @@ variation: 0.250 activatedDamage: types: - Slash: 12 - Heat: 12 + Slash: 8 + Heat: 13 Structural: 15 - type: ItemToggleActiveSound activeSound: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index 93765ec40c3..b30a2855796 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -18,16 +18,20 @@ damage: types: # axes are kinda like sharp hammers, you know? - Blunt: 5 - Slash: 10 + Blunt: 4 + Slash: 6 Structural: 10 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 10 + angle: 100 soundHit: collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Slash: 10 + Blunt: 2 + Slash: 5 Structural: 40 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 9cd1bb29408..68f8863d116 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -12,9 +12,16 @@ - Knife - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 10 + Slash: 8 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -60,10 +67,11 @@ state: butch - type: MeleeWeapon wideAnimationRotation: -115 - attackRate: 1.5 + attackRate: 1 damage: types: - Slash: 13 + Slash: 8 + Blunt: 1 - type: Item size: Normal sprite: Objects/Weapons/Melee/cleaver.rsi @@ -87,15 +95,16 @@ - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 1.5 + range: 1.4 damage: types: - Slash: 12 + Slash: 9 - type: EmbeddableProjectile sound: /Audio/Weapons/star_hit.ogg - type: DamageOtherOnHit damage: types: - Slash: 10 + Slash: 9 - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi - type: DisarmMalus @@ -110,6 +119,13 @@ - type: Sprite sprite: Objects/Weapons/Melee/survival_knife.rsi state: icon + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 1.25 + range: 1.5 + damage: + types: + Slash: 8 - type: Item sprite: Objects/Weapons/Melee/survival_knife.rsi @@ -124,9 +140,10 @@ state: icon - type: MeleeWeapon attackRate: 1.0 + range: 1.75 damage: types: - Slash: 15 + Slash: 10 - type: Item sprite: Objects/Weapons/Melee/kukri_knife.rsi @@ -186,7 +203,8 @@ sprite: Objects/Weapons/Melee/shiv.rsi state: icon - type: MeleeWeapon - attackRate: 1.5 + attackRate: 1.75 + range: 0.75 damage: types: Slash: 5.5 @@ -205,7 +223,6 @@ graph: ReinforcedShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: Slash: 7 #each "tier" grants an additional 2 damage @@ -224,10 +241,9 @@ graph: PlasmaShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: - Slash: 9 + Slash: 8.5 - type: Item sprite: Objects/Weapons/Melee/plasma_shiv.rsi - type: Sprite @@ -243,10 +259,9 @@ graph: UraniumShiv node: icon - type: MeleeWeapon - attackRate: 1.5 damage: types: - Slash: 7 + Slash: 6.5 Radiation: 4 - type: Item sprite: Objects/Weapons/Melee/uranium_shiv.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index ccf45bf59aa..a1addba2625 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -43,12 +43,18 @@ capacity: 1 count: 1 - type: MeleeWeapon - attackRate: 1.5 + attackRate: 0.75 + range: 1.75 wideAnimationRotation: -135 damage: types: - Blunt: 10 - Slash: 5 + Blunt: 8 + Slash: 4 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 120 soundHit: collection: MetalThud - type: Wieldable @@ -79,10 +85,16 @@ - type: MeleeWeapon autoAttack: true wideAnimationRotation: -135 - attackRate: 2 + attackRate: 1.25 + range: 1.4 damage: types: - Slash: 15 + Slash: 9 + heavyRateModifier: 0.9 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 2 + angle: 20 - type: Tag tags: - Knife diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml index 324d4ee878e..6ba659ccb40 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/pickaxe.yml @@ -11,21 +11,27 @@ sprite: Objects/Weapons/Melee/pickaxe.rsi state: pickaxe - type: MeleeWeapon - attackRate: 0.7 + attackRate: 0.75 + range: 1.75 wideAnimationRotation: -135 soundHit: path: "/Audio/Weapons/smash.ogg" params: volume: -3 damage: - groups: - Brute: 5 + types: + Blunt: 6 + Pierce: 3 + bluntStaminaDamageFactor: 2.0 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + maxTargets: 2 + angle: 60 - type: Wieldable - type: IncreaseDamageOnWield damage: - groups: - Brute: 10 types: + Blunt: 5 Structural: 30 - type: Item size: Normal @@ -52,16 +58,24 @@ state: handdrill - type: MeleeWeapon autoAttack: true - angle: 0 wideAnimationRotation: -90 soundHit: path: "/Audio/Items/drill_hit.ogg" - attackRate: 3.5 + attackRate: 0.5 + range: 1.4 damage: - groups: - Brute: 3 types: + Blunt: 9 + Slash: 3 Structural: 12 + bluntStaminaDamageFactor: 4.0 + heavyRateModifier: 1 + heavyRangeModifier: 2 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 10 + maxTargets: 3 + angle: 20 + - type: ReverseEngineering # Nyano difficulty: 2 recipes: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml index 0c75015d9aa..ecc84e50073 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml @@ -9,10 +9,18 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 + range: 1.75 damage: types: - Blunt: 10 + Blunt: 6 Structural: 10 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 15 + maxTargets: 10 + angle: 120 soundHit: collection: MetalThud - type: Wieldable diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml index 0def916ddc7..576d0b2a0ce 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/spear.yml @@ -35,17 +35,24 @@ visible: false - type: MeleeWeapon wideAnimationRotation: -135 + range: 1.75 damage: types: - Piercing: 12 - angle: 0 + Piercing: 7 + Slash: 1 + heavyRateModifier: 0.75 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.0 + heavyStaminaCost: 5 + maxTargets: 3 + angle: 20 animation: WeaponArcThrust soundHit: path: /Audio/Weapons/bladeslice.ogg - type: DamageOtherOnHit damage: types: - Piercing: 15 + Piercing: 10 - type: Item size: Ginormous - type: Clothing @@ -75,7 +82,8 @@ - type: IncreaseDamageOnWield damage: types: - Piercing: 4 + Piercing: 3 + Slash: 3 - type: Damageable damageContainer: Inorganic - type: Destructible @@ -124,11 +132,12 @@ wideAnimationRotation: -135 damage: types: - Piercing: 15 + Piercing: 8.5 + Slash: 1 - type: DamageOtherOnHit damage: types: - Piercing: 18 + Piercing: 12 - type: Construction graph: SpearReinforced @@ -144,11 +153,12 @@ wideAnimationRotation: -135 damage: types: - Piercing: 18 + Piercing: 9.5 + Slash: 1.5 - type: DamageOtherOnHit damage: types: - Piercing: 21 + Piercing: 14 - type: Construction graph: SpearPlasma @@ -164,13 +174,13 @@ wideAnimationRotation: -135 damage: types: - Piercing: 10 + Piercing: 8 Radiation: 8 - type: DamageOtherOnHit damage: types: - Piercing: 12 - Radiation: 9 + Piercing: 8 + Radiation: 8 - type: Construction graph: SpearUranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml index b0b166f6ce8..d8955b4defe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/stunprod.yml @@ -30,16 +30,23 @@ energyPerUse: 70 - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 + range: 1.4 damage: types: - Blunt: 9 + Blunt: 7.5 + bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.8 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 5 + maxTargets: 3 angle: 60 animation: WeaponArcThrust - type: StaminaDamageOnHit - damage: 20 + damage: 22 sound: /Audio/Weapons/egloves.ogg - type: StaminaDamageOnCollide - damage: 20 + damage: 22 sound: /Audio/Weapons/egloves.ogg - type: Battery maxCharge: 360 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index 17e31e5893c..82b99ce37e3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -10,12 +10,19 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 1.5 + attackRate: 1.25 + range: 1.75 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: Slash: 17 #cmon, it has to be at least BETTER than the rest. + heavyRateModifier: 0.8 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 5 + maxTargets: 7 + angle: 80 - type: Reflect enabled: true reflectProb: .5 @@ -43,11 +50,18 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.5 soundHit: path: /Audio/SimpleStation14/Weapons/Melee/rapierhit.ogg damage: types: - Slash: 15 + Slash: 12 + heavyRateModifier: 0.5 + heavyRangeModifier: 3 #Superior Japanese folded steel + heavyDamageBaseModifier: 1.25 + heavyStaminaCost: 10 + maxTargets: 1 + angle: 20 - type: Item size: Normal sprite: DeltaV/Objects/Weapons/Melee/katana.rsi #DeltaV @@ -66,7 +80,7 @@ wideAnimationRotation: -60 damage: types: - Slash: 30 + Slash: 25 - type: Item size: Normal sprite: Objects/Weapons/Melee/energykatana.rsi @@ -99,9 +113,15 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 damage: types: Slash: 15 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.25 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + angle: 80 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -121,10 +141,19 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 - attackRate: 0.75 + attackRate: 0.65 + range: 1.85 damage: types: - Slash: 20 + Slash: 19 + Blunt: 1 + bluntStaminaDamageFactor: 25.0 + heavyRateModifier: 0.5 + heavyRangeModifier: 1 + heavyDamageBaseModifier: 1 + heavyStaminaCost: 20 + maxTargets: 10 + angle: 200 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -150,9 +179,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 1.25 damage: types: - Slash: 16 + Slash: 12 + heavyRateModifier: 0.8 + heavyRangeModifier: 1.2 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 + maxTargets: 3 + angle: 40 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml index 6b24c96e309..123de813cbd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/white_cane.yml @@ -12,16 +12,23 @@ sprite: Objects/Weapons/Melee/white_cane.rsi - type: MeleeWeapon wideAnimationRotation: 45 + attackRate: 0.9 + range: 1.6 damage: types: - Blunt: 5 - - type: StaminaDamageOnHit - damage: 5 + Blunt: 6 + bluntStaminaDamageFactor: 2.5 + heavyRateModifier: 0.5 + heavyRangeModifier: 1.75 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 0 + maxTargets: 1 + angle: 20 - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 3 + Blunt: 2 - type: UseDelay delay: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index 9ac737e9cbb..a952713dd5f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -35,6 +35,10 @@ types: Blunt: 7 bluntStaminaDamageFactor: 2.0 + heavyRateModifier: 0.75 + heavyDamageBaseModifier: 1.75 + heavyStaminaCost: 5 + maxTargets: 3 angle: 60 animation: WeaponArcSlash - type: StaminaDamageOnHit @@ -93,12 +97,16 @@ state: icon - type: MeleeWeapon wideAnimationRotation: -135 + attackRate: 0.8 damage: types: - Blunt: 20 + Blunt: 15 soundHit: collection: MetalThud - bluntStaminaDamageFactor: 1.5 + bluntStaminaDamageFactor: 2 + heavyRateModifier: 1 + heavyDamageBaseModifier: 1.2 + heavyStaminaCost: 10 - type: Item size: Normal - type: Clothing From c5fb2026ec7477fd32e6eec1b052f5641e6b8ee1 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 12:00:29 +0000 Subject: [PATCH 141/143] Automatic Changelog Update (#693) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3f94c100b5a..58afb71648b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5147,3 +5147,11 @@ Entries: penalties upon joining. id: 6244 time: '2024-08-09T17:28:01.0000000+00:00' +- author: ODJ + changes: + - type: Tweak + message: >- + Melee Weapons now feel different across the board, from the Wrench to + the Chainsaw, try out their normal swings and their heavy attacks! + id: 6245 + time: '2024-08-10T12:00:06.0000000+00:00' From cb6e6ae8b60f3442642b1b7e7ee3afc2ee29e142 Mon Sep 17 00:00:00 2001 From: Rane <60792108+Elijahrane@users.noreply.github.com> Date: Sat, 10 Aug 2024 08:03:11 -0400 Subject: [PATCH 142/143] Rename Mantis (#709) "Mantis" was going to be the original name, but the doubling as detective lead me to needing to add the qualifier "forensic" to make that part clearer. The "Mantis" was already there to imply the psionic part. For "psionic mantis" defenders, I propose an alternative renaming scheme: Mystagogue -> Psionic Mystagogue Mantis -> Psionic Mantis Cyborg -> Robotic Cyborg Chaplain -> Religious Chaplain Players either already know what a mantis is, or they've got little enough playtime that there's still some intrigue left in the setting and it's something they can learn by observation. Weird names are mostly restricted to one dept here and a tinge harder time understanding it is what I'd call "Mystery" rather than something that's undesirable here. The mechanic the mantis interacts with - psionics - is also somewhat hidden and esoteric. # Media ![image](https://github.com/user-attachments/assets/8706c0cd-97a3-4ed6-a0e4-e23012a461a7) ![image](https://github.com/user-attachments/assets/7e6296fb-52ca-4d4e-b40d-2e166520d4b5) # Changelog :cl: Rane - tweak: Renamed "Psionic Mantis" to "Mantis", as it was originally going to be called. --- Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl | 2 +- Resources/Locale/en-US/nyanotrasen/job/job-names.ftl | 4 ++-- Resources/Locale/en-US/psionics/stamp-component.ftl | 2 +- Resources/Maps/hammurabi.yml | 2 +- Resources/Prototypes/Access/misc.yml | 2 +- Resources/Prototypes/Access/research.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml | 2 +- .../Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml | 2 +- .../Entities/Clothing/OuterClothing/wintercoats.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml | 2 +- .../Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml | 4 ++-- .../Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml | 2 +- .../Entities/Objects/Devices/Misc/identification_cards.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml | 2 +- .../Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml | 2 +- .../Entities/Structures/Storage/Closets/Lockers/lockers.yml | 2 +- .../Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml | 2 +- Resources/Prototypes/Roles/Jobs/Science/research_director.yml | 2 +- Resources/ServerInfo/Rules.txt | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl index 2c5a3c871c0..3ebfe8bf1b1 100644 --- a/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl +++ b/Resources/Locale/en-US/deltav/prototypes/access/accesses.ftl @@ -1,5 +1,5 @@ id-card-access-level-orders = Orders -id-card-access-level-mantis = Psionic Mantis +id-card-access-level-mantis = Mantis id-card-access-level-chief-justice = Chief Justice id-card-access-level-prosecutor = Prosecutor id-card-access-level-justice = Justice diff --git a/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl b/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl index bc99a777f1a..8660d214615 100644 --- a/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl +++ b/Resources/Locale/en-US/nyanotrasen/job/job-names.ftl @@ -3,8 +3,8 @@ job-name-guard = Prison Guard job-name-mail-carrier = Courier job-name-martialartist = Martial Artist job-name-prisoner = Prisoner -job-name-mantis = Psionic Mantis +job-name-mantis = Mantis # Role timers JobMailCarrier = Courier -JobForensicMantis = Psionic Mantis +JobForensicMantis = Mantis diff --git a/Resources/Locale/en-US/psionics/stamp-component.ftl b/Resources/Locale/en-US/psionics/stamp-component.ftl index 0434e6d26ac..381278f8cf9 100644 --- a/Resources/Locale/en-US/psionics/stamp-component.ftl +++ b/Resources/Locale/en-US/psionics/stamp-component.ftl @@ -1 +1 @@ -stamp-component-stamped-name-mantis = Psionic Mantis +stamp-component-stamped-name-mantis = Mantis diff --git a/Resources/Maps/hammurabi.yml b/Resources/Maps/hammurabi.yml index 022c647ba76..0afaa64934e 100644 --- a/Resources/Maps/hammurabi.yml +++ b/Resources/Maps/hammurabi.yml @@ -26862,7 +26862,7 @@ entities: - uid: 18085 components: - type: MetaData - name: psionic mantis office/epistemics hall APC + name: mantis office/epistemics hall APC - type: Transform pos: -31.5,-37.5 parent: 1 diff --git a/Resources/Prototypes/Access/misc.yml b/Resources/Prototypes/Access/misc.yml index f717c57a000..f402c7544a0 100644 --- a/Resources/Prototypes/Access/misc.yml +++ b/Resources/Prototypes/Access/misc.yml @@ -34,7 +34,7 @@ - Atmospherics - Mail # Nyanotrasen - MailCarrier, see Resources/Prototypes/Nyanotrasen/Roles/Jobs/Cargo/mail-carrier.yml - Orders # DeltaV - Orders, see Resources/Prototypes/DeltaV/Access/cargo.yml - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml - Paramedic # DeltaV - Add Paramedic access - Psychologist # DeltaV - Add Psychologist access - Boxer # DeltaV - Add Boxer access diff --git a/Resources/Prototypes/Access/research.yml b/Resources/Prototypes/Access/research.yml index f0de2c93db4..3e3b0432b45 100644 --- a/Resources/Prototypes/Access/research.yml +++ b/Resources/Prototypes/Access/research.yml @@ -11,4 +11,4 @@ tags: - ResearchDirector - Research - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml index 4f2ac846efa..8847f8d03a9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Belt/belts.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMantis - name: psionic mantis' belt # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' belt description: Perfect for storing all of your equipment. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml index 2cd9785d989..deaca17558a 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Head/hats.yml @@ -124,7 +124,7 @@ - type: entity parent: ClothingHeadBase id: ClothingHeadHatFezMantis - name: psionic mantis' fez # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' fez description: A fine red fez with a gold tassel. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml index a16f6cd2212..75f8c7ddd01 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/coats.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingOuterStorageBase id: ClothingOuterCoatMantis - name: psionic mantis' jacket # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' jacket description: Modeled after an ancient infantry uniform, this jacket may guard you against the unknown in your journey for the truth. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml index b83cd75fc11..748ae0e9a4d 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/OuterClothing/wintercoats.yml @@ -47,7 +47,7 @@ - type: entity parent: ClothingOuterWinterCoat id: ClothingOuterWinterCoatMantis - name: psionic mantis' winter coat # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' winter coat description: Solve cold cases in style. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml index 4b1cec27f6c..207abcba801 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Shoes/boots.yml @@ -1,7 +1,7 @@ - type: entity parent: ClothingShoesBaseButcherable id: ClothingShoesBootsMantis - name: psionic mantis' boots # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' boots description: Soft, comfortable, and good for rough terrain. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml index 11f6d32b5c3..b238ef7b063 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Clothing/Uniforms/jumpsuits.yml @@ -72,7 +72,7 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitMantis - name: psionic mantis' uniform # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' uniform description: Modeled after an ancient infantry uniform, this uniform has superior mobility for tense situations. components: - type: Sprite @@ -83,7 +83,7 @@ - type: entity parent: ClothingUniformSkirtBase id: ClothingUniformSkirtMantis - name: psionic mantis' jumpskirt # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' jumpskirt description: Adapted from an ancient infantry uniform, this jumpskirt has superior mobility for tense situations. components: - type: Sprite diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml index ebe73808e53..62a24bd75b9 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Markers/Spawners/jobs.yml @@ -65,7 +65,7 @@ - type: entity id: SpawnPointForensicMantis parent: SpawnPointJobBase - name: psionic mantis # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis components: - type: SpawnPoint job_id: ForensicMantis diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml index 94efc40530c..4338b836854 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/Misc/identification_cards.yml @@ -82,7 +82,7 @@ - type: entity parent: IDCardStandard id: ForensicMantisIDCard - name: psionic mantis ID card # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis ID card components: - type: Sprite layers: diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml index 4e6115ba339..d898124b771 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Devices/pda.yml @@ -99,7 +99,7 @@ - type: entity parent: BasePDA id: ForensicMantisPDA - name: psionic mantis PDA # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis PDA description: Smells like illegal substances. components: - type: Pda diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml index 22361c9aef6..b381aaa0c7e 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Objects/Misc/paper.yml @@ -1,5 +1,5 @@ - type: entity - name: psionic mantis' seal # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' seal parent: RubberStampBase id: RubberStampMantis suffix: DO NOT MAP diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 2744f965e07..fe25a9cc53c 100644 --- a/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Nyanotrasen/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -2,7 +2,7 @@ id: LockerForensicMantis parent: LockerDetective suffix: Empty - name: psionic mantis' cabinet # DeltaV - Rename Forensic Mantis to Psionic Mantis + name: mantis' cabinet description: You'll never know what's inside until you collapse the quantum superposition of all possible mysteries. components: # Because it holds a traitor objective, StrongMetallic, diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml index 31c08140ac7..e2f99548429 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Epistemics/forensicmantis.yml @@ -18,7 +18,7 @@ access: - Research - Maintenance - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml special: - !type:AddComponentSpecial components: diff --git a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml index 6f965b31b49..747ee41b840 100644 --- a/Resources/Prototypes/Roles/Jobs/Science/research_director.yml +++ b/Resources/Prototypes/Roles/Jobs/Science/research_director.yml @@ -21,7 +21,7 @@ - Command - Maintenance - ResearchDirector - - Mantis # DeltaV - Psionic Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml + - Mantis # DeltaV - Mantis, see Resources/Prototypes/DeltaV/Access/epistemics.yml - Chapel # DeltaV - Chaplain is in Epistemics - Cryogenics special: # Nyanotrasen - Mystagogue can use the Bible diff --git a/Resources/ServerInfo/Rules.txt b/Resources/ServerInfo/Rules.txt index 9d5ed774b08..c16976b944c 100644 --- a/Resources/ServerInfo/Rules.txt +++ b/Resources/ServerInfo/Rules.txt @@ -92,7 +92,7 @@ Players that are revived by using a defibrillator CAN recall what killed them an [color=#a4885c]11.[/color] Psionics - Players that have psionic powers are allowed to use them at-will to accomplish their roleplay goals. It should be noted that in-character consequences can happen as a result of their use, including being stripped of psionic powers or even death. - - As a psionic mantis, it is not your goal to hunt down psionics. Do not mindbreak others against their will solely because they have psionic powers. + - As a mantis, it is not your goal to hunt down psionics. Do not mindbreak others against their will solely because they have psionic powers. [color=#a4885c]12.[/color] Don't rush for or prepare equipment unrelated to your job for no purpose other than to have it "just in case" (referred to as "Powergaming"). - A medical doctor does not need insulated gloves, and the Head of Personnel does not need to give themselves armory access so they can go grab a gun. Have an actual reason for needing these things. From 07c8eba9f7daf37090aa5fd629fc607be36a9900 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 10 Aug 2024 12:03:36 +0000 Subject: [PATCH 143/143] Automatic Changelog Update (#709) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 58afb71648b..1abacbd8fe1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -5155,3 +5155,11 @@ Entries: the Chainsaw, try out their normal swings and their heavy attacks! id: 6245 time: '2024-08-10T12:00:06.0000000+00:00' +- author: Rane + changes: + - type: Tweak + message: >- + Renamed "Psionic Mantis" to "Mantis", as it was originally going to be + called. + id: 6246 + time: '2024-08-10T12:03:12.0000000+00:00'
/// diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl index 10e6a4a24f2..0b8fa83ae8b 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-survival.ftl @@ -3,6 +3,3 @@ survival-description = No internal threats, but how long can the station survive hellshift-title = Hellshift hellshift-description = The station rolled a "one" in a luck check. Can the crew make it to the end? - -longsurvival-title = Long Survival -longsurvival-description = Survival, but two hours longer. Event growth is stretched over a vastly greater length of time. diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index e046b871fa7..0af55a7f9d0 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -132,21 +132,15 @@ components: - type: RampingStationEventScheduler -- type: entity - id: LongSurvivalStationEventScheduler - parent: BaseGameRule - noSpawn: true - components: - - type: RampingStationEventScheduler - shiftLengthOffset: -120 - - type: entity id: HellshiftStationEventScheduler parent: BaseGameRule noSpawn: true components: - type: RampingStationEventScheduler - shiftChaosModifier: 4 #30 minute HELL SHIFT + chaosModifier: 4 # By default, one event each 30-10 seconds after two hours. Changing CVars will cause this to deviate. + startingChaosRatio: 0.025 # Starts as slow as survival, but quickly ramps up + shiftLengthModifier: 2.5 # variation passes - type: entity diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index 7e83f224433..7d7169bf10a 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -20,17 +20,6 @@ - HellshiftStationEventScheduler - BasicRoundstartVariation -- type: gamePreset - id: SurvivalLonger - alias: - - longsurvival - showInVote: true - name: longsurvival-title - description: longsurvival-description - rules: - - LongSurvivalStationEventScheduler - - BasicRoundstartVariation - - type: gamePreset id: AllAtOnce name: all-at-once-title From b9b3868acf08cfec6d9ba5e50db262550600206c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 2 Aug 2024 22:53:08 +0000 Subject: [PATCH 050/143] Automatic Changelog Update (#644) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 26b1b13d570..51dd6418484 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4831,3 +4831,11 @@ Entries: circumstances id: 6204 time: '2024-08-02T07:14:01.0000000+00:00' +- author: Mnemotechnician + changes: + - type: Fix + message: >- + Reverted the station event scheduler rework due to it absolutely + breaking the game. + id: 6205 + time: '2024-08-02T22:52:41.0000000+00:00' From 80e48a578fd3382779ddc80947615cca3394413c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 2 Aug 2024 20:41:53 -0400 Subject: [PATCH 051/143] Supermatter Engine (Port From White Dream) (#341) # Description ![SM boom](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/6937c520-0963-437c-a9a6-49afe6c8b787) ![New edge supermatter](https://github.com/Simple-Station/Einstein-Engines/assets/16548818/e8305536-b777-41f8-b9bf-295d402dc1bf) This PR has been produced in collaboration with coders from White Dream, with written permission given by the relevant code owners to port this specific slice of content to Einstein-Engines. Supermatter Engines are a form of nuclear reactor, which produces energy in the form of radioactive particles, while also decaying into Phoron when excited by an external energy source. Power can be obtained from the engine via radiation collectors, which like those of a singularity engine, must be periodically refueled. In addition, the engine must also be actively cooled via aid from Atmospherics, and for undesirable gasses to be extracted from the reactor chamber. If not cooled, the crystal will begin to destabilize and eventually collapse into one of three different situations depending on the source of its instability. 1. A nuclear blast. 2. A gravitational singularity 3. A Tesla ball # Changelog :cl: VMSolidus, White Dream, Colin-Tel - add: Supermatter Engines have been implemented. --------- Signed-off-by: VMSolidus Co-authored-by: whateverusername0 Co-authored-by: username <113782077+whateverusername0@users.noreply.github.com> Co-authored-by: Danger Revolution! <142105406+DangerRevolution@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Systems/SupermatterSystem.Processing.cs | 412 ++++++++++++++++++ .../Supermatter/Systems/SupermatterSystem.cs | 212 +++++++++ Content.Shared/CCVar/CCVars.cs | 50 +++ .../Components/SupermatterComponent.cs | 390 +++++++++++++++++ .../Components/SupermatterFoodComponent.cs | 8 + .../Components/SupermatterImmuneComponent.cs | 9 + Resources/Audio/Supermatter/calm.ogg | Bin 0 -> 172011 bytes Resources/Audio/Supermatter/delamming.ogg | Bin 0 -> 160153 bytes .../en-US/objectives/conditions/steal.ftl | 3 + .../Locale/en-US/supermatter/supermatter.ftl | 26 ++ .../Clothing/OuterClothing/hardsuits.yml | 3 + .../Entities/Mobs/Player/admin_ghost.yml | 1 + .../Objects/Misc/supermatter_sliver.yml | 25 ++ .../Objects/Specific/Medical/morgue.yml | 1 + .../Generation/Singularity/singularity.yml | 1 + .../Generation/Supermatter/supermatter.yml | 66 +++ .../Power/Generation/Tesla/coil.yml | 2 + .../Power/Generation/Tesla/energyball.yml | 1 + .../Prototypes/Guidebook/engineering.yml | 6 + .../Prototypes/Objectives/objectiveGroups.yml | 1 + .../Objectives/stealTargetGroups.yml | 7 + Resources/Prototypes/Objectives/traitor.yml | 12 + Resources/Prototypes/explosion.yml | 16 + Resources/Prototypes/tags.yml | 4 +- .../Guidebook/Engineering/Supermatter.xml | 65 +++ .../Supermatter/supermatter.rsi/meta.json | 15 + .../supermatter.rsi/supermatter.png | Bin 0 -> 28899 bytes .../supermatter_sliver.rsi/icon.png | Bin 0 -> 357 bytes .../supermatter_sliver.rsi/meta.json | 14 + 29 files changed, 1348 insertions(+), 2 deletions(-) create mode 100644 Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs create mode 100644 Content.Server/Supermatter/Systems/SupermatterSystem.cs create mode 100644 Content.Shared/Supermatter/Components/SupermatterComponent.cs create mode 100644 Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs create mode 100644 Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs create mode 100644 Resources/Audio/Supermatter/calm.ogg create mode 100644 Resources/Audio/Supermatter/delamming.ogg create mode 100644 Resources/Locale/en-US/supermatter/supermatter.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml create mode 100644 Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml create mode 100644 Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml create mode 100644 Resources/Textures/Supermatter/supermatter.rsi/meta.json create mode 100644 Resources/Textures/Supermatter/supermatter.rsi/supermatter.png create mode 100644 Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png create mode 100644 Resources/Textures/Supermatter/supermatter_sliver.rsi/meta.json diff --git a/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs new file mode 100644 index 00000000000..7a62eba6f7d --- /dev/null +++ b/Content.Server/Supermatter/Systems/SupermatterSystem.Processing.cs @@ -0,0 +1,412 @@ +using Content.Shared.Atmos; +using Content.Shared.Radiation.Components; +using Content.Shared.Supermatter.Components; +using System.Text; +using Content.Shared.Chat; +using System.Linq; +using Content.Shared.Audio; +using Content.Shared.CCVar; + +namespace Content.Server.Supermatter.Systems; + +public sealed partial class SupermatterSystem +{ + /// + /// Handle power and radiation output depending on atmospheric things. + /// + private void ProcessAtmos(EntityUid uid, SupermatterComponent sm) + { + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is not { }) + return; + + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (!(moles > 0f)) + return; + + var gases = sm.GasStorage; + var facts = sm.GasDataFields; + + // Lets get the proportions of the gasses in the mix for scaling stuff later + // They range between 0 and 1 + gases = gases.ToDictionary( + gas => gas.Key, + gas => Math.Clamp(absorbedGas.GetMoles(gas.Key) / moles, 0, 1) + ); + + // No less then zero, and no greater then one, we use this to do explosions and heat to power transfer. + var powerRatio = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].PowerMixRatio); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var heatModifier = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].HeatPenalty); + + // Minimum value of -10, maximum value of 23. Affects plasma, o2 and heat output. + var transmissionBonus = gases.Sum(gas => gases[gas.Key] * facts[gas.Key].TransmitModifier); + + var h2OBonus = 1 - gases[Gas.WaterVapor] * 0.25f; + + powerRatio = Math.Clamp(powerRatio, 0, 1); + heatModifier = Math.Max(heatModifier, 0.5f); + transmissionBonus *= h2OBonus; + + // Effects the damage heat does to the crystal + sm.DynamicHeatResistance = 1f; + + // More moles of gases are harder to heat than fewer, so let's scale heat damage around them + sm.MoleHeatPenaltyThreshold = (float) Math.Max(moles * sm.MoleHeatPenalty, 0.25); + + // Ramps up or down in increments of 0.02 up to the proportion of CO2 + // Given infinite time, powerloss_dynamic_scaling = co2comp + // Some value from 0-1 + if (moles > sm.PowerlossInhibitionMoleThreshold && gases[Gas.CarbonDioxide] > sm.PowerlossInhibitionGasThreshold) + { + var co2powerloss = Math.Clamp(gases[Gas.CarbonDioxide] - sm.PowerlossDynamicScaling, -0.02f, 0.02f); + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling + co2powerloss, 0f, 1f); + } + else + sm.PowerlossDynamicScaling = Math.Clamp(sm.PowerlossDynamicScaling - 0.05f, 0f, 1f); + + // Ranges from 0~1(1 - (0~1 * 1~(1.5 * (mol / 500)))) + // We take the mol count, and scale it to be our inhibitor + var powerlossInhibitor = + Math.Clamp( + 1 + - sm.PowerlossDynamicScaling + * Math.Clamp( + moles / sm.PowerlossInhibitionMoleBoostThreshold, + 1f, 1.5f), + 0f, 1f); + + if (sm.MatterPower != 0) // We base our removed power off 1/10 the matter_power. + { + var removedMatter = Math.Max(sm.MatterPower / sm.MatterPowerConversion, 40); + // Adds at least 40 power + sm.Power = Math.Max(sm.Power + removedMatter, 0); + // Removes at least 40 matter power + sm.MatterPower = Math.Max(sm.MatterPower - removedMatter, 0); + } + + // Based on gas mix, makes the power more based on heat or less effected by heat + var tempFactor = powerRatio > 0.8 ? 50f : 30f; + + // If there is more pluox and N2 then anything else, we receive no power increase from heat + sm.Power = Math.Max(absorbedGas.Temperature * tempFactor / Atmospherics.T0C * powerRatio + sm.Power, 0); + + // Irradiate stuff + if (TryComp(uid, out var rad)) + rad.Intensity = + sm.Power + * Math.Max(0, 1f + transmissionBonus / 10f) + * 0.003f + * _config.GetCVar(CCVars.SupermatterRadsModifier); + + // Power * 0.55 * 0.8~1 + var energy = sm.Power * sm.ReactionPowerModifier; + + // Keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock is on. + // An increase of 4°C at 25% efficiency here results in an increase of 1°C / (#tilesincore) overall. + // Power * 0.55 * 1.5~23 / 5 + absorbedGas.Temperature += energy * heatModifier * sm.ThermalReleaseModifier; + absorbedGas.Temperature = Math.Max(0, + Math.Min(absorbedGas.Temperature, sm.HeatThreshold * heatModifier)); + + // Release the waste + absorbedGas.AdjustMoles(Gas.Plasma, Math.Max(energy * heatModifier * sm.PlasmaReleaseModifier, 0f)); + absorbedGas.AdjustMoles(Gas.Oxygen, Math.Max((energy + absorbedGas.Temperature * heatModifier - Atmospherics.T0C) * sm.OxygenReleaseEfficiencyModifier, 0f)); + + _atmosphere.Merge(mix, absorbedGas); + + var powerReduction = (float) Math.Pow(sm.Power / 500, 3); + + // After this point power is lowered + // This wraps around to the begining of the function + sm.Power = Math.Max(sm.Power - Math.Min(powerReduction * powerlossInhibitor, sm.Power * 0.83f * powerlossInhibitor), 0f); + } + + /// + /// Shoot lightning bolts depensing on accumulated power. + /// + private void SupermatterZap(EntityUid uid, SupermatterComponent sm) + { + // Divide power by its' threshold to get a value from 0-1, then multiply by the amount of possible lightnings + var zapPower = sm.Power / sm.PowerPenaltyThreshold * sm.LightningPrototypes.Length; + var zapPowerNorm = (int) Math.Clamp(zapPower, 0, sm.LightningPrototypes.Length - 1); + _lightning.ShootRandomLightnings(uid, 3.5f, sm.Power > sm.PowerPenaltyThreshold ? 3 : 1, sm.LightningPrototypes[zapPowerNorm]); + } + + /// + /// Handles environmental damage. + /// + private void HandleDamage(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + var indices = _xform.GetGridOrMapTilePosition(uid, xform); + + sm.DamageArchived = sm.Damage; + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + // We're in space or there is no gas to process + if (!xform.GridUid.HasValue || mix is not { } || mix.TotalMoles == 0f) + { + sm.Damage += Math.Max(sm.Power / 1000 * sm.DamageIncreaseMultiplier, 0.1f); + return; + } + + // Absorbed gas from surrounding area + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + var totalDamage = 0f; + + var tempThreshold = Atmospherics.T0C + sm.HeatPenaltyThreshold; + + // Temperature start to have a positive effect on damage after 350 + var tempDamage = + Math.Max( + Math.Clamp(moles / 200f, .5f, 1f) + * absorbedGas.Temperature + - tempThreshold + * sm.DynamicHeatResistance, + 0f) + * sm.MoleHeatThreshold + / 150f + * sm.DamageIncreaseMultiplier; + totalDamage += tempDamage; + + // Power only starts affecting damage when it is above 5000 + var powerDamage = Math.Max(sm.Power - sm.PowerPenaltyThreshold, 0f) / 500f * sm.DamageIncreaseMultiplier; + totalDamage += powerDamage; + + // Mol count only starts affecting damage when it is above 1800 + var moleDamage = Math.Max(moles - sm.MolePenaltyThreshold, 0) / 80 * sm.DamageIncreaseMultiplier; + totalDamage += moleDamage; + + // Healing damage + if (moles < sm.MolePenaltyThreshold) + { + // There's a very small float so that it doesn't divide by 0 + var healHeatDamage = Math.Min(absorbedGas.Temperature - tempThreshold, 0.001f) / 150; + totalDamage += healHeatDamage; + } + + // Check for space tiles next to SM + //TODO: Change moles out for checking if adjacent tiles exist + var enumerator = _atmosphere.GetAdjacentTileMixtures(xform.GridUid.Value, indices, false, false); + while (enumerator.MoveNext(out var ind)) + { + if (ind.TotalMoles != 0) + continue; + + var integrity = GetIntegrity(sm); + + var factor = integrity switch + { + < 10 => 0.0005f, + < 25 => 0.0009f, + < 45 => 0.005f, + < 75 => 0.002f, + _ => 0f + }; + + totalDamage += Math.Clamp(sm.Power * factor * sm.DamageIncreaseMultiplier, 0, sm.MaxSpaceExposureDamage); + + break; + } + + var damage = Math.Min(sm.DamageArchived + sm.DamageHardcap * sm.DamageDelaminationPoint, totalDamage); + + // Prevent it from going negative + sm.Damage = Math.Clamp(damage, 0, float.PositiveInfinity); + } + + /// + /// Handles core damage announcements + /// + private void AnnounceCoreDamage(EntityUid uid, SupermatterComponent sm) + { + var message = string.Empty; + var global = false; + + var integrity = GetIntegrity(sm).ToString("0.00"); + + // Special cases + if (sm.Damage < sm.DamageDelaminationPoint && sm.Delamming) + { + message = Loc.GetString("supermatter-delam-cancel", ("integrity", integrity)); + sm.DelamAnnounced = false; + global = true; + } + + if (sm.Delamming && !sm.DelamAnnounced) + { + var sb = new StringBuilder(); + var loc = string.Empty; + + switch (sm.PreferredDelamType) + { + case DelamType.Cascade: loc = "supermatter-delam-cascade"; break; + case DelamType.Singulo: loc = "supermatter-delam-overmass"; break; + case DelamType.Tesla: loc = "supermatter-delam-tesla"; break; + default: loc = "supermatter-delam-explosion"; break; + } + + var station = _station.GetOwningStation(uid); + if (station != null) + _alert.SetLevel((EntityUid) station, sm.AlertCodeDeltaId, true, true, true, false); + + sb.AppendLine(Loc.GetString(loc)); + sb.AppendLine(Loc.GetString("supermatter-seconds-before-delam", ("seconds", sm.DelamTimer))); + + message = sb.ToString(); + global = true; + sm.DelamAnnounced = true; + + SendSupermatterAnnouncement(uid, message, global); + return; + } + + // Ignore the 0% integrity alarm + if (sm.Delamming) + return; + + // We are not taking consistent damage, Engineers aren't needed + if (sm.Damage <= sm.DamageArchived) + return; + + if (sm.Damage >= sm.DamageWarningThreshold) + { + message = Loc.GetString("supermatter-warning", ("integrity", integrity)); + if (sm.Damage >= sm.DamageEmergencyThreshold) + { + message = Loc.GetString("supermatter-emergency", ("integrity", integrity)); + global = true; + } + } + + SendSupermatterAnnouncement(uid, message, global); + } + + /// If true, sends a station announcement + /// Localisation string for a custom announcer name + public void SendSupermatterAnnouncement(EntityUid uid, string message, bool global = false, string? customSender = null) + { + if (global) + { + var sender = Loc.GetString(customSender != null ? customSender : "supermatter-announcer"); + _chat.DispatchStationAnnouncement(uid, message, sender, colorOverride: Color.Yellow); + return; + } + + _chat.TrySendInGameICMessage(uid, message, InGameICChatType.Speak, hideChat: false, checkRadioPrefix: true); + } + + /// + /// Returns the integrity rounded to hundreds, e.g. 100.00% + /// + public float GetIntegrity(SupermatterComponent sm) + { + var integrity = sm.Damage / sm.DamageDelaminationPoint; + integrity = (float) Math.Round(100 - integrity * 100, 2); + integrity = integrity < 0 ? 0 : integrity; + return integrity; + } + + /// + /// Decide on how to delaminate. + /// + public DelamType ChooseDelamType(EntityUid uid, SupermatterComponent sm) + { + if (_config.GetCVar(CCVars.SupermatterDoForceDelam)) + return _config.GetCVar(CCVars.SupermatterForcedDelamType); + + var mix = _atmosphere.GetContainingMixture(uid, true, true); + + if (mix is { }) + { + var absorbedGas = mix.Remove(sm.GasEfficiency * mix.TotalMoles); + var moles = absorbedGas.TotalMoles; + + if (_config.GetCVar(CCVars.SupermatterDoSingulooseDelam) + && moles >= sm.MolePenaltyThreshold * _config.GetCVar(CCVars.SupermatterSingulooseMolesModifier)) + return DelamType.Singulo; + } + + if (_config.GetCVar(CCVars.SupermatterDoTeslooseDelam) + && sm.Power >= sm.PowerPenaltyThreshold * _config.GetCVar(CCVars.SupermatterTesloosePowerModifier)) + return DelamType.Tesla; + + //TODO: Add resonance cascade when there's crazy conditions or a destabilizing crystal + + return DelamType.Explosion; + } + + /// + /// Handle the end of the station. + /// + private void HandleDelamination(EntityUid uid, SupermatterComponent sm) + { + var xform = Transform(uid); + + sm.PreferredDelamType = ChooseDelamType(uid, sm); + + if (!sm.Delamming) + { + sm.Delamming = true; + AnnounceCoreDamage(uid, sm); + } + + if (sm.Damage < sm.DamageDelaminationPoint && sm.Delamming) + { + sm.Delamming = false; + AnnounceCoreDamage(uid, sm); + } + + sm.DelamTimerAccumulator++; + + if (sm.DelamTimerAccumulator < sm.DelamTimer) + return; + + switch (sm.PreferredDelamType) + { + case DelamType.Cascade: + Spawn(sm.KudzuSpawnPrototype, xform.Coordinates); + break; + + case DelamType.Singulo: + Spawn(sm.SingularitySpawnPrototype, xform.Coordinates); + break; + + case DelamType.Tesla: + Spawn(sm.TeslaSpawnPrototype, xform.Coordinates); + break; + + default: + _explosion.TriggerExplosive(uid); + break; + } + } + + /// + /// Swaps out ambience sounds when the SM is delamming or not. + /// + private void HandleSoundLoop(EntityUid uid, SupermatterComponent sm) + { + var ambient = Comp(uid); + + if (ambient == null) + return; + + if (sm.Delamming && sm.CurrentSoundLoop != sm.DelamSound) + sm.CurrentSoundLoop = sm.DelamSound; + + else if (!sm.Delamming && sm.CurrentSoundLoop != sm.CalmSound) + sm.CurrentSoundLoop = sm.CalmSound; + + if (ambient.Sound != sm.CurrentSoundLoop) + _ambient.SetSound(uid, sm.CurrentSoundLoop, ambient); + } +} \ No newline at end of file diff --git a/Content.Server/Supermatter/Systems/SupermatterSystem.cs b/Content.Server/Supermatter/Systems/SupermatterSystem.cs new file mode 100644 index 00000000000..3d86f57fb84 --- /dev/null +++ b/Content.Server/Supermatter/Systems/SupermatterSystem.cs @@ -0,0 +1,212 @@ +using Robust.Shared.Audio.Systems; +using Robust.Shared.Configuration; +using Robust.Shared.Containers; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Events; +using Robust.Server.GameObjects; +using Content.Shared.Atmos; +using Content.Shared.Interaction; +using Content.Shared.Projectiles; +using Content.Shared.Mobs.Components; +using Content.Server.Atmos.EntitySystems; +using Content.Server.Chat.Systems; +using Content.Server.Explosion.EntitySystems; +using Content.Shared.Supermatter.Components; +using Content.Server.Lightning; +using Content.Server.AlertLevel; +using Content.Server.Station.Systems; +using Content.Server.Kitchen.Components; +using Content.Shared.DoAfter; +using Content.Shared.Examine; +using Content.Server.DoAfter; +using Content.Server.Popups; +using Content.Shared.Audio; + +namespace Content.Server.Supermatter.Systems; + +public sealed partial class SupermatterSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmosphere = default!; + [Dependency] private readonly ChatSystem _chat = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly ExplosionSystem _explosion = default!; + [Dependency] private readonly TransformSystem _xform = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedAmbientSoundSystem _ambient = default!; + [Dependency] private readonly LightningSystem _lightning = default!; + [Dependency] private readonly AlertLevelSystem _alert = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly IConfigurationManager _config = default!; + + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + + SubscribeLocalEvent(OnCollideEvent); + SubscribeLocalEvent(OnHandInteract); + SubscribeLocalEvent(OnItemInteract); + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnGetSliver); + } + + + public override void Update(float frameTime) + { + base.Update(frameTime); + + foreach (var sm in EntityManager.EntityQuery()) + { + if (!sm.Activated) + return; + + var uid = sm.Owner; + sm.UpdateAccumulator += frameTime; + + if (sm.UpdateAccumulator >= sm.UpdateTimer) + { + sm.UpdateAccumulator -= sm.UpdateTimer; + Cycle(uid, sm); + } + } + } + + + public void Cycle(EntityUid uid, SupermatterComponent sm) + { + sm.ZapAccumulator++; + sm.YellAccumulator++; + + ProcessAtmos(uid, sm); + HandleDamage(uid, sm); + + if (sm.Damage >= sm.DamageDelaminationPoint || sm.Delamming) + HandleDelamination(uid, sm); + + HandleSoundLoop(uid, sm); + + if (sm.ZapAccumulator >= sm.ZapTimer) + { + sm.ZapAccumulator -= sm.ZapTimer; + SupermatterZap(uid, sm); + } + + if (sm.YellAccumulator >= sm.YellTimer) + { + sm.YellAccumulator -= sm.YellTimer; + AnnounceCoreDamage(uid, sm); + } + } + + private void OnMapInit(EntityUid uid, SupermatterComponent sm, MapInitEvent args) + { + // Set the Sound + _ambient.SetAmbience(uid, true); + + // Add Air to the initialized SM in the Map so it doesn't delam on its' own + var mix = _atmosphere.GetContainingMixture(uid, true, true); + mix?.AdjustMoles(Gas.Oxygen, Atmospherics.OxygenMolesStandard); + mix?.AdjustMoles(Gas.Nitrogen, Atmospherics.NitrogenMolesStandard); + } + + private void OnCollideEvent(EntityUid uid, SupermatterComponent sm, ref StartCollideEvent args) + { + if (!sm.Activated) + sm.Activated = true; + + var target = args.OtherEntity; + if (args.OtherBody.BodyType == BodyType.Static + || HasComp(target) + || _container.IsEntityInContainer(uid)) + return; + + if (!HasComp(target)) + { + EntityManager.SpawnEntity(sm.CollisionResultPrototype, Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + sm.Power += args.OtherBody.Mass; + } + + EntityManager.QueueDeleteEntity(target); + + if (TryComp(target, out var food)) + sm.Power += food.Energy; + else if (TryComp(target, out var projectile)) + sm.Power += (float) projectile.Damage.GetTotal(); + else + sm.Power++; + + sm.MatterPower += HasComp(target) ? 200 : 0; + } + + private void OnHandInteract(EntityUid uid, SupermatterComponent sm, ref InteractHandEvent args) + { + if (!sm.Activated) + sm.Activated = true; + + var target = args.User; + + if (HasComp(target)) + return; + + sm.MatterPower += 200; + + EntityManager.SpawnEntity(sm.CollisionResultPrototype, Transform(target).Coordinates); + _audio.PlayPvs(sm.DustSound, uid); + EntityManager.QueueDeleteEntity(target); + } + + private void OnItemInteract(EntityUid uid, SupermatterComponent sm, ref InteractUsingEvent args) + { + if (!sm.Activated) + sm.Activated = true; + + if (sm.SliverRemoved) + return; + + if (!HasComp(args.Used)) + return; + + var dae = new DoAfterArgs(EntityManager, args.User, 30f, new SupermatterDoAfterEvent(), args.Target) + { + BreakOnDamage = true, + BreakOnHandChange = false, + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnWeightlessMove = false, + NeedHand = true, + RequireCanInteract = true, + }; + + _doAfter.TryStartDoAfter(dae); + _popup.PopupClient(Loc.GetString("supermatter-tamper-begin"), uid, args.User); + } + + private void OnGetSliver(EntityUid uid, SupermatterComponent sm, ref SupermatterDoAfterEvent args) + { + if (args.Cancelled) + return; + + // Your criminal actions will not go unnoticed + sm.Damage += sm.DamageDelaminationPoint / 10; + + var integrity = GetIntegrity(sm).ToString("0.00"); + SendSupermatterAnnouncement(uid, Loc.GetString("supermatter-announcement-cc-tamper", ("integrity", integrity)), true, "Central Command"); + + Spawn(sm.SliverPrototype, _transform.GetMapCoordinates(args.User)); + _popup.PopupClient(Loc.GetString("supermatter-tamper-end"), uid, args.User); + + sm.DelamTimer /= 2; + } + + private void OnExamine(EntityUid uid, SupermatterComponent sm, ref ExaminedEvent args) + { + if (args.IsInDetailsRange) + args.PushMarkup(Loc.GetString("supermatter-examine-integrity", ("integrity", GetIntegrity(sm).ToString("0.00")))); + } +} diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 985d9da1a18..facbd1d71b6 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1,3 +1,4 @@ +using Content.Shared.Supermatter.Components; using Robust.Shared; using Robust.Shared.Configuration; @@ -2339,5 +2340,54 @@ public static readonly CVarDef CVarDef.Create("contests.max_percentage", 0.25f, CVar.REPLICATED | CVar.SERVER); #endregion + + #region Supermatter System + + /// + /// With completely default supermatter values, Singuloose delamination will occur if engineers inject at least 900 moles of coolant per tile + /// in the crystal chamber. For reference, a gas canister contains 1800 moles of air. This Cvar directly multiplies the amount of moles required to singuloose. + /// + public static readonly CVarDef SupermatterSingulooseMolesModifier = + CVarDef.Create("supermatter.singuloose_moles_modifier", 1f, CVar.SERVER); + + /// + /// Toggles whether or not Singuloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. + /// + public static readonly CVarDef SupermatterDoSingulooseDelam = + CVarDef.Create("supermatter.do_singuloose", true, CVar.SERVER); + + /// + /// By default, Supermatter will "Tesloose" if the conditions for Singuloose are not met, and the core's power is at least 4000. + /// The actual reasons for being at least this amount vary by how the core was screwed up, but traditionally it's caused by "The core is on fire". + /// This Cvar multiplies said power threshold for the purpose of determining if the delam is a Tesloose. + /// + public static readonly CVarDef SupermatterTesloosePowerModifier = + CVarDef.Create("supermatter.tesloose_power_modifier", 1f, CVar.SERVER); + + /// + /// Toggles whether or not Tesloose delaminations can occur. If both Singuloose and Tesloose are disabled, it will always delam into a Nuke. + /// + public static readonly CVarDef SupermatterDoTeslooseDelam = + CVarDef.Create("supermatter.do_tesloose", true, CVar.SERVER); + + /// + /// When true, bypass the normal checks to determine delam type, and instead use the type chosen by supermatter.forced_delam_type + /// + public static readonly CVarDef SupermatterDoForceDelam = + CVarDef.Create("supermatter.do_force_delam", false, CVar.SERVER); + + /// + /// If supermatter.do_force_delam is true, this determines the delamination type, bypassing the normal checks. + /// + public static readonly CVarDef SupermatterForcedDelamType = + CVarDef.Create("supermatter.forced_delam_type", DelamType.Singulo, CVar.SERVER); + + /// + /// Directly multiplies the amount of rads put out by the supermatter. Be VERY conservative with this. + /// + public static readonly CVarDef SupermatterRadsModifier = + CVarDef.Create("supermatter.rads_modifier", 1f, CVar.SERVER); + + #endregion } } diff --git a/Content.Shared/Supermatter/Components/SupermatterComponent.cs b/Content.Shared/Supermatter/Components/SupermatterComponent.cs new file mode 100644 index 00000000000..ad7604f5ba6 --- /dev/null +++ b/Content.Shared/Supermatter/Components/SupermatterComponent.cs @@ -0,0 +1,390 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Audio; +using Content.Shared.Atmos; +using Content.Shared.Whitelist; +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Supermatter.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SupermatterComponent : Component +{ + #region Base + + /// + /// The SM will only cycle if activated. + /// + [DataField] + public bool Activated = false; + + [DataField] + public string SliverPrototype = "SupermatterSliver"; + + /// + /// Affects delamination timer. + /// If removed - delamination timer is divided by 2. + /// + [DataField] + public bool SliverRemoved = false; + + public string[] LightningPrototypes = + { + "Lightning", + "ChargedLightning", + "SuperchargedLightning", + "HyperchargedLightning" + }; + + [DataField] + public string SingularitySpawnPrototype = "Singularity"; + + [DataField] + public string TeslaSpawnPrototype = "TeslaEnergyBall"; + + [DataField] + public string KudzuSpawnPrototype = "SupermatterKudzu"; + + /// + /// What spawns in the place of an unfortunate entity that got removed by the SM. + /// + [DataField] + public string CollisionResultPrototype = "Ash"; + + [DataField] + public SoundSpecifier DustSound = new SoundPathSpecifier("/Audio/Effects/Grenades/Supermatter/supermatter_start.ogg"); + + [DataField] + public SoundSpecifier CalmSound = new SoundPathSpecifier("/Audio/Supermatter/calm.ogg"); + + [DataField] + public SoundSpecifier DelamSound = new SoundPathSpecifier("/Audio/Supermatter/delamming.ogg"); + + [DataField] + public SoundSpecifier CurrentSoundLoop = new SoundPathSpecifier("/Audio/Supermatter/calm.ogg"); + + #endregion + + #region Processing + + [DataField] + public float Power; + + [DataField] + public float MatterPower; + + [DataField] + public float MatterPowerConversion = 10f; + + /// + /// The portion of the gasmix we're on + /// + [DataField] + public float GasEfficiency = 0.15f; + + /// + /// Based on CO2 percentage, this slowly moves between 0 and 1. + /// We use it to calculate the powerloss_inhibitor. + /// + [DataField] + public float PowerlossDynamicScaling; + + /// + /// Affects the amount of damage and minimum point at which the SM takes heat damage + /// + [DataField] + public float DynamicHeatResistance = 1; + + /// + /// Multiplier on damage the core takes from absorbing hot gas. + /// Default is ~1/350. + /// + [DataField] + public float MoleHeatPenalty = 0.00286f; + + /// + /// Inverse of + /// + [DataField] + public float MoleHeatThreshold = 350f; + + /// + /// Multiplier on power generated by nuclear reactions + /// + [DataField] + public float ReactionPowerModifier = 0.55f; + + /// + /// Acts as a multiplier on the amount that nuclear reactions increase the supermatter core temperature + /// + [DataField] + public float ThermalReleaseModifier = 0.2f; + + /// + /// Multiplier on how much plasma is released during supermatter reactions + /// Default is ~1/750 + /// + [DataField] + public float PlasmaReleaseModifier = 0.001333f; + + /// + /// Multiplier on how much oxygen is released during supermatter reactions. + /// Default is ~1/325 + /// + [DataField] + public float OxygenReleaseEfficiencyModifier = 0.0031f; + + #endregion + + #region Timing + + /// + /// We yell if over 50 damage every YellTimer Seconds + /// + [DataField] + public float YellTimer = 60f; + + /// + /// Set to YellTimer at first so it doesnt yell a minute after being hit + /// + [DataField] + public float YellAccumulator = 60f; + + /// + /// Timer for delam + /// + [DataField] + public float DelamTimerAccumulator; + + /// + /// Time until delam + /// + [DataField] + public float DelamTimer = 120f; + + /// + /// The message timer + /// + [DataField] + public float SpeakAccumulator = 60f; + + [DataField] + public float UpdateAccumulator = 0f; + + [DataField] + public float UpdateTimer = 1f; + + [DataField] + public float ZapAccumulator = 0f; + + [DataField] + public float ZapTimer = 10f; + + #endregion + + #region Thresholds + + /// + /// The heat threshold in Kelvin, after which the supermatter begins taking damage. + /// + [DataField] + public float HeatThreshold = 2500f; + + /// + /// Percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. + /// + [DataField] + public float PowerlossInhibitionGasThreshold = 0.20f; + + /// + /// Moles of the gas needed before the charge inertia chain reaction effect starts. + /// Scales powerloss inhibition down until this amount of moles is reached. + /// + [DataField] + public float PowerlossInhibitionMoleThreshold = 20f; + + /// + /// Bonus powerloss inhibition boost if this amount of moles is reached + /// + [DataField] + public float PowerlossInhibitionMoleBoostThreshold = 500f; + + /// + /// Above this value we can get lord singulo and independent mol damage, below it we can heal damage + /// + [DataField] + public float MolePenaltyThreshold = 900f; + + /// + /// More moles of gases are harder to heat than fewer, so let's scale heat damage around them + /// + [DataField] + public float MoleHeatPenaltyThreshold; + + /// + /// The cutoff on power properly doing damage, pulling shit around, + /// and delamming into a tesla. Low chance of pyro anomalies, +2 bolts of electricity + /// + [DataField] + public float PowerPenaltyThreshold = 4000f; + + /// + /// Maximum safe operational temperature in degrees Celsius. + /// Supermatter begins taking damage above this temperature. + /// + [DataField] + public float HeatPenaltyThreshold = 40f; + + #endregion + + #region Damage + + /// + /// The amount of damage taken + /// + [DataField] + public float Damage = 0f; + + /// + /// The damage from before this cycle. + /// Used to limit the damage we can take each cycle, and for safe alert. + /// + [DataField] + public float DamageArchived = 0f; + + /// + /// Is multiplied by ExplosionPoint to cap evironmental damage per cycle + /// + [DataField] + public float DamageHardcap = 0.002f; + + /// + /// Environmental damage is scaled by this + /// + [DataField] + public float DamageIncreaseMultiplier = 0.25f; + + /// + /// Max space damage the SM will take per cycle + /// + [DataField] + public float MaxSpaceExposureDamage = 2; + + /// + /// The point at which we should start sending radio messages about the damage. + /// + [DataField] + public float DamageWarningThreshold = 50; + + /// + /// The point at which we start sending station announcements about the damage. + /// + [DataField] + public float DamageEmergencyThreshold = 500; + + /// + /// The point at which the SM begins delaminating. + /// + [DataField] + public int DamageDelaminationPoint = 900; + + [DataField] + public bool Delamming = false; + + [DataField] + public DelamType PreferredDelamType = DelamType.Explosion; + + #endregion + + #region Announcements + + [DataField] + public string AlertCodeYellowId = "yellow"; + + [DataField] + public string AlertCodeDeltaId = "delta"; + + [DataField] + public bool DelamAnnounced = false; + + #endregion + + #region Gases + + /// + /// How much gas is in the SM + /// + [DataField] + public Dictionary GasStorage = new Dictionary() + { + { Gas.Oxygen, 0f }, + { Gas.Nitrogen, 0f }, + { Gas.CarbonDioxide, 0f }, + { Gas.Plasma, 0f }, + { Gas.Tritium, 0f }, + { Gas.WaterVapor, 0f }, + { Gas.Frezon, 0f }, + { Gas.Ammonia, 0f }, + { Gas.NitrousOxide, 0f }, + }; + + /// + /// Stores information about how every gas interacts with the SM + /// + //TODO: Replace this with serializable GasFact array something + public readonly Dictionary GasDataFields = new() + { + { Gas.Oxygen, (1.5f, 1f, 1f) }, + { Gas.Nitrogen, (0f, -1.5f, -1f) }, + { Gas.CarbonDioxide, (0f, 0.1f, 1f) }, + { Gas.Plasma, (4f, 15f, 1f) }, + { Gas.Tritium, (30f, 10f, 1f) }, + { Gas.WaterVapor, (2f, 12f, 1f) }, + { Gas.Frezon, (3f, -10f, -1f) }, + { Gas.Ammonia, (0f, .5f, 1f) }, + { Gas.NitrousOxide, (0f, -5f, -1f) }, + }; + + #endregion +} + + +public enum SupermatterSound : sbyte +{ + Aggressive = 0, + Delam = 1 +} + +public enum DelamType : int +{ + Explosion = 0, + Singulo = 1, + Tesla = 2, + Cascade = 3 +} + +[Serializable, DataDefinition] +public sealed partial class GasFact +{ + [DataField] + public float TransmitModifier; + + [DataField] + public float HeatPenalty; + + [DataField] + public float PowerMixRatio; + + public GasFact(float transmitModifier, float heatPenalty, float powerMixRatio) + { + TransmitModifier = transmitModifier; + HeatPenalty = heatPenalty; + PowerMixRatio = powerMixRatio; + } +} + +[Serializable, NetSerializable] +public sealed partial class SupermatterDoAfterEvent : SimpleDoAfterEvent +{ + +} diff --git a/Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs b/Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs new file mode 100644 index 00000000000..9d235a4b4d3 --- /dev/null +++ b/Content.Shared/Supermatter/Components/SupermatterFoodComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Shared.Supermatter.Components; + +[RegisterComponent] +public sealed partial class SupermatterFoodComponent : Component +{ + [DataField] + public int Energy { get; set; } = 1; +} diff --git a/Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs b/Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs new file mode 100644 index 00000000000..b517115eca7 --- /dev/null +++ b/Content.Shared/Supermatter/Components/SupermatterImmuneComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Supermatter.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class SupermatterImmuneComponent : Component +{ + +} diff --git a/Resources/Audio/Supermatter/calm.ogg b/Resources/Audio/Supermatter/calm.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dc3102e57866eb386ca4f7977b5e9f3696db1a98 GIT binary patch literal 172011 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 EdSVilTuz2 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

)P%>x$;)u7(ofnE>YR_`jm~glc-b8) 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/objectives/conditions/steal.ftl b/Resources/Locale/en-US/objectives/conditions/steal.ftl index 00c8e0fdaf9..0709bf6e5e6 100644 --- a/Resources/Locale/en-US/objectives/conditions/steal.ftl +++ b/Resources/Locale/en-US/objectives/conditions/steal.ftl @@ -9,3 +9,6 @@ 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-steal-smsliver-title = Cut off a sliver from the supermatter crystal. +objective-condition-steal-smsliver-description = Use any cutting tool that comes in handy. A scalpel is more recommended. Also, don't die of radiation poisoning. diff --git a/Resources/Locale/en-US/supermatter/supermatter.ftl b/Resources/Locale/en-US/supermatter/supermatter.ftl new file mode 100644 index 00000000000..52593f5524e --- /dev/null +++ b/Resources/Locale/en-US/supermatter/supermatter.ftl @@ -0,0 +1,26 @@ +supermatter-announcer = Automatic Supermatter Engine +supermatter-examine-integrity = + Its' integrity is [color=yellow]{$integrity}%[/color]. +supermatter-announcement-warning = + Warning! Crystal hyperstructure integrity faltering! Integrity: {$integrity}%. +supermatter-announcement-emergency = + DANGER! Crystal hyperstructure integrity reaching critical levels! Integrity: {$integrity}%. +supermatter-announcement-delam-explosion = + CRYSTAL DELAMINATION IMMINENT! The crystal has reached critical integrity failure! Emergency causality destabilization field has been engaged. +supermatter-announcement-delam-overmass = + CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical mass failure! Singularity formation imminent! +supermatter-announcement-delam-tesla = + CRYSTAL DELAMINATION IMMINENT! Crystal hyperstructure integrity has reached critical power surge failure! Energy ball formation imminent! +supermatter-announcement-delam-cascade = + CRYSTAL DELAMINATION IMMINENT! Harmonic frequency limits exceeded, casualty destabilization field could not be engaged! +supermatter-announcement-delam-cancel = + Crystalline hyperstructure returning to safe operating parameters. Failsafe has been Disengaged. Integrity: {$integrity}%. +supermatter-seconds-before-delam = + Estimated time before delamination: {$seconds} seconds. +supermatter-tamper-begin = + You begin carefully cutting a piece off the supermatter crystal... +supermatter-tamper-end = + You feel the power of a thousand suns laying on your palms. Or is it all the radiation? +supermatter-announcement-cc-tamper = + Our automatic casualty system has detected that the supermatter crystal structural integrity was compromised by an external force. + Engineering department, report to the supermatter engine immediately. diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml index 974da1ebccd..e0d8e7290da 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/hardsuits.yml @@ -342,6 +342,9 @@ - type: HeldSpeedModifier - type: ToggleableClothing clothingPrototype: ClothingHeadHelmetHardsuitEngineeringWhite + - type: ClothingGrantComponent + component: + - type: SupermatterImmune #Chief Medical Officer's Hardsuit - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 6291fd23335..6c9ec2049f4 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -95,6 +95,7 @@ - type: InventorySlots - type: Loadout prototypes: [ MobAghostGear ] + - type: SupermatterImmune - type: entity id: ActionAGhostShowSolar diff --git a/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml b/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml new file mode 100644 index 00000000000..d62935523d5 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/supermatter_sliver.yml @@ -0,0 +1,25 @@ +- type: entity + parent: BaseItem + id: SupermatterSliver + name: supermatter sliver + description: A shard from the station's Supermatter crystal. Highly radioactive. + components: + - type: PointLight + enabled: true + radius: 3 + energy: 2 + color: "#fff633" + - type: RadiationSource + intensity: .75 + - type: Icon + sprite: Supermatter/supermatter_sliver.rsi + state: icon + - type: Sprite + sprite: Supermatter/supermatter_sliver.rsi + state: icon + - type: StealTarget + stealGroup: SupermatterSliver + - type: Tag + tags: + - HighRiskItem + - type: SupermatterImmune diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml index 8f54bb8059c..da67b5a5928 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/morgue.yml @@ -130,6 +130,7 @@ solution: food - type: Extractable grindableSolutionName: food + - type: SupermatterImmune - type: entity parent: Ash diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml index 25d219ab945..b8d66c61e38 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Singularity/singularity.yml @@ -3,6 +3,7 @@ name: gravitational singularity description: A mesmerizing swirl of darkness that sucks in everything. If it's moving towards you, run. components: + - type: SupermatterImmune - type: Clickable - type: AmbientSound volume: -4 diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml new file mode 100644 index 00000000000..6fc3429600a --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Supermatter/supermatter.yml @@ -0,0 +1,66 @@ +- type: entity + id: Supermatter + name: supermatter crystal + description: A strangely translucent and iridescent crystal. + placement: + mode: SnapgridCenter + components: + - type: Supermatter + - type: RadiationSource + - type: AmbientSound + range: 5 + volume: 0 + sound: + path: /Audio/Supermatter/calm.ogg + - type: Physics + - type: Speech + speechSounds: Pai + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.25,-0.25,0.25,0.25" + mask: + - Impassable + - MidImpassable + - HighImpassable + - LowImpassable + - InteractImpassable + - Opaque + layer: + - MidImpassable + - HighImpassable + - BulletImpassable + - InteractImpassable + - type: Transform + anchored: true + noRot: true + - type: CollisionWake + enabled: false + - type: Clickable + - type: InteractionOutline + - type: Sprite + drawdepth: WallMountedItems + sprite: Supermatter/supermatter.rsi + state: supermatter + - type: Icon + sprite: Supermatter/supermatter.rsi + state: supermatter + - type: PointLight + enabled: true + radius: 10 + energy: 5 + color: "#ffe000" + - type: Explosive + explosionType: Supermatter + maxIntensity: 25000 + intensitySlope: 5 + totalIntensity: 25000 + - type: GuideHelp + guides: [ Supermatter, Power ] + - type: WarpPoint + follow: true + location: supermatter + - type: SinguloFood + energy: 10000 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml index 48994ac7d84..55a22a59a58 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/coil.yml @@ -5,6 +5,7 @@ placement: mode: SnapgridCenter components: + - type: SupermatterImmune - type: Transform anchored: true - type: Physics @@ -110,6 +111,7 @@ placement: mode: SnapgridCenter components: + - type: SupermatterImmune - type: Transform anchored: true - type: Physics diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml index ea41ba3a20d..1cfdb9256a5 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/Tesla/energyball.yml @@ -2,6 +2,7 @@ id: BaseEnergyBall abstract: true components: + - type: SupermatterImmune - type: Clickable - type: Physics bodyType: KinematicController diff --git a/Resources/Prototypes/Guidebook/engineering.yml b/Resources/Prototypes/Guidebook/engineering.yml index 21d17f02279..e08d46276cd 100644 --- a/Resources/Prototypes/Guidebook/engineering.yml +++ b/Resources/Prototypes/Guidebook/engineering.yml @@ -66,6 +66,7 @@ - Singularity - TEG - RTG + - Supermatter - type: guideEntry id: AME @@ -91,3 +92,8 @@ id: PortableGenerator name: guide-entry-portable-generator text: "/ServerInfo/Guidebook/Engineering/PortableGenerator.xml" + +- type: guideEntry + id: Supermatter + name: guide-entry-sm + text: "/ServerInfo/Guidebook/Engineering/Supermatter.xml" diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index f00641702a2..263494f7987 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -26,6 +26,7 @@ LOLuckyBillStealObjective: 0.5 # DeltaV - LO steal objective, see Resources/Prototypes/DeltaV/Objectives/traitor.yml HoPBookIanDossierStealObjective: 1 # DeltaV - HoP steal objective, see Resources/Prototypes/DeltaV/Objectives/traitor.yml HoSGunStealObjective: 0.5 + StealSupermatterSliverObjective: 0.5 - type: weightedRandom id: TraitorObjectiveGroupKill diff --git a/Resources/Prototypes/Objectives/stealTargetGroups.yml b/Resources/Prototypes/Objectives/stealTargetGroups.yml index 11e503d7940..e93c9c319da 100644 --- a/Resources/Prototypes/Objectives/stealTargetGroups.yml +++ b/Resources/Prototypes/Objectives/stealTargetGroups.yml @@ -1,5 +1,12 @@ # Traitor single items +- type: stealTargetGroup + id: SupermatterSliver + name: supermatter sliver + sprite: + sprite: Supermatter/supermatter_sliver.rsi + state: icon + - type: stealTargetGroup id: Hypospray name: hypospray diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index ffeba32546d..d9c071c30c0 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -309,3 +309,15 @@ - type: StealCondition stealGroup: NukeDisk owner: objective-condition-steal-station + +- type: entity + noSpawn: true + parent: BaseTraitorStealObjective + id: StealSupermatterSliverObjective + components: + - type: Objective + difficulty: 3.5 + - type: StealCondition + stealGroup: SupermatterSliver + objectiveNoOwnerText: objective-condition-steal-smsliver-title + descriptionText: objective-condition-steal-smsliver-description \ No newline at end of file diff --git a/Resources/Prototypes/explosion.yml b/Resources/Prototypes/explosion.yml index 1eaf4f52ff4..7ef2e774a71 100644 --- a/Resources/Prototypes/explosion.yml +++ b/Resources/Prototypes/explosion.yml @@ -117,3 +117,19 @@ lightColor: Orange texturePath: /Textures/Effects/fire.rsi fireStates: 6 + +- type: explosion + id: Supermatter + damagePerIntensity: + types: + Radiation: 5 + Heat: 4 + Blunt: 3 + Piercing: 3 + tileBreakChance: [0, 0.5, 1] + tileBreakIntensity: [0, 10, 30] + tileBreakRerollReduction: 20 + lightColor: Yellow + fireColor: Green + texturePath: /Textures/Effects/fire_greyscale.rsi + fireStates: 3 diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index c2e46d5f590..9b0ad51cfb6 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1119,10 +1119,10 @@ id: SmallMech - type: Tag - id: SnapPop + id: Smokable - type: Tag - id: Smokable + id: SnapPop - type: Tag id: SnowyLabs diff --git a/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml b/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml new file mode 100644 index 00000000000..6e89df44324 --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Engineering/Supermatter.xml @@ -0,0 +1,65 @@ + + + + + # The Supermatter Engine + + So you've decided to take on the challenge and set up the Supermatter Engine? First, let's give you a short overview of the main Supermatter crystal beforehand. + + Its primary features are emitting electrical arcs that are harnessed to power the station through tesla coils. + + Side effects include radiation emission, releasing hot oxygen and plasma, heating the air around, and exploding, transforming into a black hole or an energy ball and eating the entire station if you screw up hard enough. + + It begins inert but being hit by an object or a projectile will activate it and it'll start exhibiting nearly all of the aforementioned properties. + + ## Words of Warning + + 1. The Supermatter crystal is [color=red]VERY DANGEROUS[/color]. Activating the crystal should be the last step in setting up any form of Supermatter based power! + + 2. [color=red]PUT YOUR RADIATION SUIT ON[/color]. + + 3. Most the Supermatter setup involves a gas loop that is designed to cool down the Supermatter chamber. Please have at least some knowledge of gases and their atmospheric properties. + + 4. Anything that bumps into the Supermatter is [color=red]fundamentally annihilated[/color]. [color=red]Do not touch it[/color]. This means weld and bolt the door to the chamber. + + ## Gas Interactions + + Here's a list of all gases from least dangerous to most dangerous. + + 1. [color=#bffffe]Frezon[/color]. Aside from cooling down the Supermatter, it basically stops power and waste production, which may come handy if the Supermatter is close to delaminating and you need to shut it down fast. + + 2. [color=#c20000]Nitrogen[/color]. N2 is the basic gas most Supermatter setups will run exclusively, being very simple to set up for. It dampens the power generation from heat, and reduces the amount of plasma the SM belches out, making it good for when you aren't trying to do something silly. + + 3. [color=#b16d6d]Nitrous oxide[/color]. Reinforces the heat resistance of the crystal, allowing for much hotter setups than usual. However, at high temperatures it will decompose into Nitrogen and Oxygen. While N2 is good, O2 certainly is not. This O2 will also react with the Plasma to create Tritium and then a Tritium fire. + + 4. [color=#62d5ca]Oxygen[/color]. Provides a boost to power transmission without actively increasing the waste gas amount or temperature. Pretty risky to use, as any disruption of the cooling loop will soon cause a plasma fire in the crystal chamber. Even just a high concentration of O2 will activate and continuously power the crystal. + + 5. [color=#19b348]Ammonia[/color]. Increases the power generation slightly at a minor cost to the heat penalty. + + 6. [color=#979797]Carbon Dioxide[/color]. In low concentrations, it will increase the crystal's power generation. In high concentrations it will raise the crystal's energy to extremely high levels. With poor management and insufficient or downright bad preparation, it will eventually exceed safe energy levels and begin a charge delamination, producing electric arcs and anomalies until it eventually explodes into a Tesla ball. + + [color=red]7[/color]. [color=#ff9d00]Plasma[/color]. Very similar to Oxygen but provides a higher power boost as well as a much higher waste and heat penalty. The extreme pressures and volumes of gas produced by this gas are very likely to clog pipes and overheat the chamber. + + [color=red]8[/color]. [color=#08a800]Tritium[/color]. Increases the power production of the Supermatter by up to 3 times, there is one slight issue with it. It is dangerous. It is very dangerous. Tritium is a horrifyingly irritable and jumpy gas. While it isn't as harmful to the heat level as Plasma is (just barely), it also has the second worst heat capacity of all gasses while Plasma has the second highest. This means that Plasma can be kept happy with enough cooling, whereas Tritium eagerly goes from a safe space loop into a burning hellfire. Add to this the byproduct of large amounts of Oxygen production (not exclusive to Tritium, an issue in a Plasma engine too), and you have a tritium fire and a very hot crystal. Do not use this gas unless you have a very strong understanding of atmospherics and the Supermatter, and are willing to get creative. + + ## Practical guide to the Supermatter + + Now, forget about everything you've just read and get to setting up the most basic loop there is: the Nitrogen loop. + + The atmospheric setup in its' most basic form should look like this: + + (We did not have enough budget for images, here is a text representation) + + 1. Nitrogen gets pumped into the chamber by passive vents from one side + + 2. Every gas gets pumped out of the chamber by using scrubbers set on Siphon on the other side. + + 3. The output gets filtered, cooled down, and excess nitrogen gets either routed into space or rerouted into the input. + + That's basically it. I hope you understand at least something in this example. Now get to it! + + ## Experiment + + You're not a real engineer if you haven't figured out the most efficient way to produce electricity using the Supermatter crystal, are you? + + \ No newline at end of file diff --git a/Resources/Textures/Supermatter/supermatter.rsi/meta.json b/Resources/Textures/Supermatter/supermatter.rsi/meta.json new file mode 100644 index 00000000000..6bca0558a89 --- /dev/null +++ b/Resources/Textures/Supermatter/supermatter.rsi/meta.json @@ -0,0 +1,15 @@ +{ + "version": 1, + "copyright": "Taken and edited from https://tgstation13.org/wiki/images/a/a4/Supermatter-bg.gif", + "license": "CC-BY-SA-3.0", + "size": { + "x": 32, + "y": 48 + }, + "states": [ + { + "name": "supermatter", + "delays": [ [ 0.08, 0.08, 0.08 ] ] + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png b/Resources/Textures/Supermatter/supermatter.rsi/supermatter.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5747a315fec5fc2d2965078fe08a0dd9296681 GIT binary patch literal 28899 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png b/Resources/Textures/Supermatter/supermatter_sliver.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2187706b107afd46d3d977ef25092feee253cd8b GIT binary patch literal 357 zcmV-r0h<1aP)ugi+s(f3-PG?@+kv<2$y(1BY3}*}r{UA3Re!wlF Date: Sat, 3 Aug 2024 00:42:15 +0000 Subject: [PATCH 052/143] Automatic Changelog Update (#341) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 51dd6418484..6d6093caef4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4839,3 +4839,9 @@ Entries: breaking the game. id: 6205 time: '2024-08-02T22:52:41.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Supermatter Engines have been implemented. ' + id: 6206 + time: '2024-08-03T00:41:54.0000000+00:00' From d2e976e91d8ddf3af2abaa56696033a2cce4b05f Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 2 Aug 2024 23:56:09 -0400 Subject: [PATCH 053/143] Fix NoMaterialArbitrage Test Fail (#653) # Description This test fail has annoyed me for the last time. ![image](https://github.com/user-attachments/assets/84dea50c-d907-4db1-b58e-fd3f9df61bbf) --- Resources/Prototypes/Entities/Structures/Furniture/dresser.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 2caa4010ca0..6c50b334091 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -51,6 +51,8 @@ parent: Dresser suffix: Filled components: + - type: StaticPrice + price: 5 - type: StorageFill contents: - id: ClothingNeckLGBTPin From 9d25d0f1831039b58565258a617643c20fde696e Mon Sep 17 00:00:00 2001 From: Tmanzxd <164098915+Tmanzxd@users.noreply.github.com> Date: Sat, 3 Aug 2024 06:02:45 -0500 Subject: [PATCH 054/143] =?UTF-8?q?Fix=20for=20Failed=20to=20Cherry-Pick?= =?UTF-8?q?=20PR=20#26217:=20Fix=20Pressure=20Damage=20Calculat=E2=80=A6?= =?UTF-8?q?=20(#655)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #245 --- .../Atmos/EntitySystems/BarotraumaSystem.cs | 107 ++++++++---------- Content.Shared/Atmos/Atmospherics.cs | 2 +- .../Prototypes/Atmospherics/thresholds.yml | 9 +- 3 files changed, 53 insertions(+), 65 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index fc77a1c8d94..d55ef355f02 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -153,9 +153,6 @@ public float GetFeltLowPressure(EntityUid uid, BarotraumaComponent barotrauma, f return Math.Min(modified, Atmospherics.OneAtmosphere); } - ///

- /// Returns adjusted pressure after having applied resistances from equipment and innate (if any), to check against a high pressure hazard threshold - /// public float GetFeltHighPressure(EntityUid uid, BarotraumaComponent barotrauma, float environmentPressure) { if (barotrauma.HasImmunity) @@ -226,69 +223,59 @@ public override void Update(float frameTime) pressure = MathF.Max(mixture.Pressure, 1f); } - switch (pressure) + pressure = pressure switch { - // Low pressure. - case <= Atmospherics.WarningLowPressure: - pressure = GetFeltLowPressure(uid, barotrauma, pressure); - - if (pressure > Atmospherics.WarningLowPressure) - goto default; + // Adjust pressure based on equipment. Works differently depending on if it's "high" or "low". + <= Atmospherics.WarningLowPressure => GetFeltLowPressure(uid, barotrauma, pressure), + >= Atmospherics.WarningHighPressure => GetFeltHighPressure(uid, barotrauma, pressure), + _ => pressure + }; + if (pressure <= Atmospherics.HazardLowPressure) + { + // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false); + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); + } - // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * Atmospherics.LowPressureDamage, true, false); + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + } + else if (pressure >= Atmospherics.HazardHighPressure) + { + var damageScale = MathF.Min(((pressure / Atmospherics.HazardHighPressure) - 1) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); - } + _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); - if (pressure <= Atmospherics.HazardLowPressure) - { - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + } + else + { + // Within safe pressure limits + if (barotrauma.TakingDamage) + { + barotrauma.TakingDamage = false; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); + } + if (!barotrauma.TakingDamage) + { + barotrauma.TakingDamage = true; + _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); + } + // Set correct alert. + switch (pressure) + { + case <= Atmospherics.WarningLowPressure: + _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); break; - } - - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); - break; - - // High pressure. - case >= Atmospherics.WarningHighPressure: - pressure = GetFeltHighPressure(uid, barotrauma, pressure); - - if (pressure < Atmospherics.WarningHighPressure) - goto default; - - var damageScale = MathF.Min((pressure / Atmospherics.HazardHighPressure) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); - - // Deal damage and ignore resistances. Resistance to pressure damage should be done via pressure protection gear. - _damageableSystem.TryChangeDamage(uid, barotrauma.Damage * damageScale, true, false); - - if (!barotrauma.TakingDamage) - { - barotrauma.TakingDamage = true; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); - } - - if (pressure >= Atmospherics.HazardHighPressure) - { - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + case >= Atmospherics.WarningHighPressure: + _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); break; - } - - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); - break; - - // Normal pressure. - default: - if (barotrauma.TakingDamage) - { - barotrauma.TakingDamage = false; - _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} stopped taking pressure damage"); - } - _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); - break; + default: + _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); + break; + } } } } diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 6a8587ca239..78b692d52de 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -271,7 +271,7 @@ public static class Atmospherics public const float HazardLowPressure = 20f; /// - /// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, + /// /// The amount of pressure damage someone takes is equal to ((pressure / HAZARD_HIGH_PRESSURE) - 1)*PRESSURE_DAMAGE_COEFFICIENT /// with the maximum of MaxHighPressureDamage. /// public const float PressureDamageCoefficient = 4; diff --git a/Resources/Prototypes/Atmospherics/thresholds.yml b/Resources/Prototypes/Atmospherics/thresholds.yml index 9b09d64a10c..22ca42869ed 100644 --- a/Resources/Prototypes/Atmospherics/thresholds.yml +++ b/Resources/Prototypes/Atmospherics/thresholds.yml @@ -12,13 +12,14 @@ - type: alarmThreshold id: stationPressure upperBound: !type:AlarmThresholdSetting - threshold: 550 # as defined in Atmospherics.cs + threshold: 550 # HazardHighPressure from Atmospherics.cs lowerBound: !type:AlarmThresholdSetting - threshold: 20 # as defined in Atmospherics.cs + # Actual low pressure damage threshold is at 20 kPa, but below ~85 kPa you can't breathe due to lack of oxygen. + threshold: 20 upperWarnAround: !type:AlarmThresholdSetting - threshold: 0.7 + threshold: 0.7 # 385 kPa, WarningHighPressure from Atmospherics.cs lowerWarnAround: !type:AlarmThresholdSetting - threshold: 2.5 + threshold: 1.05 # ~90 kPa # a reminder that all of these are percentages (where 1 is 100%), # so 0.01 is 1%, From 7e822bec5e9bc4c498f872a8302b06591a08b21b Mon Sep 17 00:00:00 2001 From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com> Date: Sat, 3 Aug 2024 07:04:01 -0400 Subject: [PATCH 055/143] Changed Rouny Sprite (#649) # Description Changed the rouny sprite to be less simplistic --- # Changelog :cl: Tilkku - tweak: Rouny Sprite Changed --- .../Mobs/Aliens/Xenos/rouny.rsi/crit.png | Bin 1357 -> 3967 bytes .../Mobs/Aliens/Xenos/rouny.rsi/dead.png | Bin 2373 -> 5646 bytes .../Mobs/Aliens/Xenos/rouny.rsi/meta.json | 42 +++++++++--------- .../Mobs/Aliens/Xenos/rouny.rsi/running.png | Bin 3810 -> 11054 bytes .../Mobs/Aliens/Xenos/rouny.rsi/sleeping.png | Bin 600 -> 2887 bytes 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/crit.png index 0be8b9b1ddb6724ea152355e6589b13075437b12..23a7ec0af6ce506eb43bb5cea68bc2adc5a96e93 100644 GIT binary patch delta 3960 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 z zJb%=FIMw)Q#f5n4E7`N-0Beu-@JhFrhjfFybOUBP@%sZzjx=1C=mr7c0~2N{RzU=r zeWs%VaBrj{is)o!Drs+0}hV|e`mE*#-gi0DOkP8Nj& zgG{?wPpILW8{Q>onxp0b(G*(PR0pB5q}9z z0flMC|7G7%?k_QT-1`|9yA3W!3F!gIAsIayJX%yH^PlbG|;E29FCHogl% zftFA0_$ubETEo&}4~kI8%5fr8g>~KiOcFBrJVHbyV7IF*KD?i=6jjk^nlTHgtSRT) zn>L<003-PU)u!^~CSwK z66Fe`meY%s@*2XTx)dz_FaSIsVUXvS*HRV?(Rx7(Yd3DE%#?&9U0#RNL4V7PCgzUN zYRd?KuSe2h3G^fQai>LR&(RE~dy0AT0&X}dd+WRslzO`6rh zb*o>CfiM7kY+6nf;H_>i-_i`q1=v)DqB5OBy#pw|0j6IxiMKy&BX@9!;&Pp>U47_* zA*yT2&`R7~zvhiZPBBvph=1?=OunF%YvQu2;mwq&l-V50)cn$Lp@82+4qyD{s@W)J zn1F8()oEwm>u>UnqAKd7nUEsaj<06l&h~`!N+z(f_ZWAiV2c%1;d2CfI85v0dTv^~ zjwf}4is~}v|LH^S)eVXjLCf?e=Dqf2%z z$MIu5vCeW#aYdo3(Zh!A`x%glS>U8uEo^!J)7amiN@z+^n8nLMX+@Ip4Ib`%@4s1~ z8@LsP%DQsC_5S<(psIn#+D}mZ83Q1MkdNpF2eO>h4F)hgrQGw;rcpt7YQiLW@JKfb zkUt7PI9ya!<{L zN3Q%%Lp=+(ZQ%yZU`nZ*$J;&`6MK83X3!uqcZ_<8n@4wS!*7N&T6|O_me0wJ@D?}g z9;O!NA%I8rY~L9)%_caB)8ax1d85(5Ur(yzrq!>Vm@pFtHh)52Ul}1t0D_Usa0tj1 zkVhgo`GqbX`mBvB+y>{5F``68Q59AOj&oIh3C|zcJ$5IUZZTuo{beOpm|-(kwMAu7 zqJ3srhuGC<^~L(8(d6FG1fk_WuHZTjY@g(h6lxEPr6<#EzQ4 zaS2C&ehE$?P=5tzb{qe6Xito6y~J&h3p6Ro)-swzTW+Vt0>&yr2x$|7P~3diYX+gn z@91gNOe{*X*=2Xwdh=?{z=P%aGwDsX%oxwz|GDnfu266`oIwD-Xc0oluSI-Ix=1s; znmuO#h)O11tooK(ZeIWPxd{MRAYA1(m^wn#usLijK7V8}+UFzy04~)gFE1=lYUM*> zzu=q&04z&*TsKmd($RjwIS;^Nx{=Z;t_XBUbE=W(a6$A`avaKytCLI~Dno4nQT{qqWg(MmE1RHZ1IG7%Ga*B0i@!w1iNDttOc z2qACRtLTv?Iw#H{sU(A9V$pD)OL(y>xl{aS2|&C!6=i5h%CxPgQ)Y$FW%(aYrLNno SZY3!I0000vb(e6$)4YwIdf*#(-?D20AS2D0e^ro*8~8@ToV8ob4>tX z%rya!wt+RE5>;mtSca!c4d4cf{27}It;0nn_!5CU&A~IJ0w8-o%6O?uY#Ep6__-(t ze|3wz0bvb58o$9xTrayVwsDaa27cxyE1@MC_y*e*UxtOVAo#b~#TRJco@n7?c4lC` z<7^%qnCB(&D1RuURm~cN69Auzhp6Eh&Qo)@v5)K2%Zv;S(<(cQJ@JsQ;c2GcU?_#_zXL^g?y;-N}V_&%9(kAH30R%dE|m+3V-S+=vR8dlu>V1>|>wJ!dF=V z(0i+nAom*%)Mc<_An@6EDHlO7n5EvAWB)P50s?|tG~M;n?=(}i>Hc}l;23)WJ}51K z;3WMyP0qhX5#W8y;TkLURQOfw;2!E#z3i_1BjAP7CPMf@Jn0zyBONbOB+w;i33)UV zCR4JWY=19{K$yw{XO>uNV<9M=Dua)VKML@E#HK486aN7S)`Jl}dg){_|DPai2DBghX@uLh;DauFnr ze-n%RC6*sp{|6 z9QXx0ogS7D%4k$+u0H}Hj=rZU^}05zC@^ZeROK#USbKopTdLQkJ`rVYx2I9r7H$5X zk$)V8>HoHh-26Z4e3N3%0|M+~rmzBV!Ek-m>*m9BubXIyW+m>-pxV-N3{z_zuPSgI zysfMN)Qsym4-#fjlF!(*6DBJF-_q~8Q5NNjHV@rtlX3y|d1d@hqK0*L3NB3#x3-1_)zrw|4Z03q zt~3$=Y8=BuIol72l8WfQc|q#^0DYWp!r!;RgXCa8AYuIkUNDMx29qyHWbsdv#ExNm z!N>vVvBQUen284{2tSJ*tZEyoVH(yZX{IrtjCyqyi;-TSvO<+hxCD_IfTYQhxqmC< z-CDp_Nn?Sky8#6KHer$~Qvh+jKu@+@2hPkrpr0CI58t77xJ9nJzh2M96zL@ZY5bv4 zTIQ(l3aPqpW1h>+S6c{~1BgnG<^2sj|I!hTLU@rC@UEDm^Ia!+EZpixWbC$8O@$L zD^&KFz^tJa8-h0gbOYaDOZc;oJDU*tdCWRH+j*fHH(BxqfTpF8+1ijbW?9;ba!ELWdK8EY;$>YAX9X8WNB|8RBvx=!KdMT000%4 zNklBqD`|1CAxS{j@eEY>w?OH_s;*PlaSsDRAuOk5s=ZB0kGVa1C*?p;2A zF51+zHn$Ppv!9N(4r1{*Ah=vE`V|*YR#nP`-#luFg8cqfApsG=a2Xgb zgP$A>Gd?e$Q5o4JTrNBrUc|Bx)52vatb|FVEkZn&z|tBEFaZltfCms@*r*{~{M0ii zw1j^-0Lj#sE@Ojzu3UZi(9bXFH&{P-@NEDdo<5aWM+{3_Sf<98;l=IqF!!-#UGAM9 zD#uKiXsr>z(3)NGHePKy48YZa5cy)e)|higGWE}od^iAzh+cmFG~$_VjvQ{L?Pxn@ z!o=hA;1A}Km6J(cRwm`dHV7apGn z!!Qsa+7YGYNGpx?M~FpZUDhym@@UTg%i>cHfQab7oHvQRZ@x>UwS(TCAtHzpvi(^U z75AecKbOgmECJx5c^~8Azda5>wlcW2tdeVYZR>J>l{b@%vjfLn$H=p4nDyw=QwxBI z=-c`aCLW8OcyRiCN^rRhL@BhXNtg+|UN==EhcM@{W!zp=3J94w83g+V$P4B&>(QkE ze7jF^uON>+tCm@hK7Q%|5E1?LUqr=MHL1rI-V>Hzpeuvk}hdz^^$x;yVjJU$OM?t6<{f}tLti3tAuT*`-+ zGIO!*Hj4@d0&vTrcTQav5D|StFhoYT>xN-)bNyaE8we2)@M5Q{_bUbcgM4|*#$G{i zo{v9}%a9QjOn>N6epXY*m76x4IsoPdi*>DZE(S>Ld~SXY-uzs?ylxEu3j!eu1+uYo zc5;OpJEzBhCJk-a`8@~dD^NFf7_Y2(gKTXbTOlP3DCtk>kU>oT<6ln=0E0cgr_RYK zm{O7kK(MF}2lpMqaKW&MAAb(-#_#d) z>nRht^ogg5Sr%7^%DFqdo0Ew%Svi^1jjv(K{SO}(gbxG&5z$`_hR993HtOtJ9$C4O zpx8UueQ{;OO1W_9lS~fuC$4RnvVe&dA&Rnm)bBe)ds_spH3j{H3@RVU`49e$JFDw> zDtw3$iW7q1^|~2xRt+;AT5?PfJ}>~j84Te`yEc4u6$kbo;+cJiIZYsgPE&Vz+_c9N z^y{0?pvr;FS^PNHJMlva^tL3W6s1*z`1H!o+Ti+Nh|CkL&FyhB>g-z1f3SB#bW#AE zsFfum`dh(J%G?3+f_`ep4d*vYSM#UC?*MR9&@p+hn{VxZn~MS=N(`Z{ww$-O?d`$j zdXuWU(>T)5OhHM1E?oRLy#?OxQZalmm%gyFS1ULv02Y;0>TmDedCbrIxV(JHU(hAG zyFG3yst2>FzJUqD%F$Xg?SV&9q-9{)02Z!YbIdur=k(Nql~7hy!du(-GGt^WpIH7h z-L0>?xZEyoICv2;#OpBW>Dmg2wbRkXI4Gb+k${YwcAF5>c+Una-p<{E!t z7YoS9@-cWw2?zGo(^P*10AH4mXe5f6Fj>?PrpoWgnLYx2 z^HWT(d+Jk$!ZIyH2}4E?;o(U{u*%+#C#H zC`HW~Lz(;da*_>>q%3L(^U&1EY+b*-%Y1H+i!;Uy=ireR-h1}|Z7uDoBBaVV$+*cp*fbH){d)Y?%$WaKLCo{o_pU*#1~!_2=UX#Ft5M; z4FrSQ(%ZQ?7~MdOWhyyOtf~w14UqLpF`;Ss7x>rj$5X|BiJGP%Z03xDSY#qa-VQZNaDCXLi zYRLAL1B#J@{|D$a%|#7iz7z=2*O`7%Lzug&s%flm>N00WrWZ?dOy%R)JV0YJMmI2I zLwGLL&sG4qwIR&S!B9_gSBm!h9JU{BrT~Zn_dD|~Uhf7VHy_R$ z98Up}0wCn}JbeG=@fQjPf`v#1mX2YQ(PTlR=}7G3XnmCXE;1RLwgsy#7_H#D4Pky* zT1o5CwjPSMLzlcA1>Oc8Y_J!(@al4+5shhq$0Pjy=exQ7^g5Pq+|ETgK>!YD_+?|b zM_|;z77Y`=F@$Swc!oQ_JD&2fE;0)u#I5}#tfN>~6uXIL%bbxh>0tq{zWF6ICYFwo zFq?^+O_;h3OPiogG!|20?rse8?3VE;ysEN2XPEc1A^ha(u^+q8Gn54c0M)nMy?Em zC~)l11a4~x^V8}P)bBssLwOB^fqD^4t$CsC0JG;0!f-);A4QH|aC-#9fLK)1+@#41 z2;aGWC$|Jcn7}3r9&75k`xda#f=@hn6`!2?P1fwb3`@tbtacJs3o-K$aq|eK)e7Pw zVIJunfakW2*NOH#rk=ixm$qGm8BrVSz>{A8O!sLp%!6sHVA5lNS`SbA_M(a4%Q1^x=?( zy&9fq3iCC`_mf-FqTxNDzW|RBbaqoCxHzNYx6H~95fXS4 z;fm3x@y7ZcJ(LIAKXd1M>4*pe1}W~j<4rmuc8dJmf1O5qt3^hZP+Y2Tx#7mE?0Nh? zFU=h%mok%b(_LTW>`AN8MA15qr8_XKb}S;yu8Vfb1fsP@MD)_v`y=Ax-idLBC(Bwo z8yc&2UW`lSAqXNaMwk7RJOBP!zBcn-O0sj<)7rw1D~8hCc(m6=ZP1WC&x^JMUxrXV zRFR*XNl8(FctSIK+6r#Fr;=}dc?Wa8GLq`k%g{{`Iy{QV5#iGp4!|(Lb~f$!bpnk> z>x6CcI)Z7nGofk)0LwQGCT=xjSrKNBY(F*?er!XwHdGdhOzxYMNC5yg$++p@Ue@kj zh;6h6akGgtD<5XzchBLz|6a*;znIC7zW8?*^&N<1T122nf$}PlJIf1Bv!tX#k)3P5 z4(4Sspuo?}sm}p$#dppo-mb_Ec-iy%5tiM*mbJUD08BIqw6_0SI^lre?6MglVYQI3 z+OTv7mKDJw&YY3e3@Rp`R<#n*>yQ027-YG z#+3hx3%@dsM}D%J1z#V}1K)qS3o)wj_*jtBCpFJn4gOhPMA?%Y29#A9c)a%KRi*uy zH{%6v{=>!m_O|CZeM&iRZ#l$<7j^@%de{6^79zF#aT^3ow2q^798*WpI)-UQh?^}K zo>rz0Z5I*I4^BOgPdxQ(PZvnN5z*ai?7X0#ukPH+lbeSiV&IZ|CJlRunG47A_xm~z zVt-mwNBzD-DFDDOe+Ag5;i2Y(w3u-gEG%c=J4Y!h&P5pz8l=e07nBHRR1e}e%Uj6{ z=5Wuo%K`Y<!G4H#FWu(jS^Ty`m1JJ#$A5hYt&#zy{Gh1s>;zQx(+@ULZe)BvsGyE9hL$sU4=bIF{kY# z((YyPlO6o-*5_HX>r%%8wBri)pG6eYiel+@5>_h-s|Cwy$I>xo)wS~1X;awx+IFf( z4`tr6<;SMNmjsJ-K2Vr8WW<@(xW2O*B|hASAGc9}#|Yw9xqyMz7DWU6++Do5i{&h8 z2s1f9#4}A{F1e!2u_nbYezc2EeZHLO(+d%;m_P4DKK+Gq%7+;YFE3=?jFnvajS2ke zju&`k=fxx}lRLf_X82hlW}MxEX|<8CS}?5^EFDY51luhvB;l}DWifN~QGPpa9D8?# z@dtAF>dww@rX-s@>1oiqE*O$M8iqLlczqrQlopY9_p2z$U}l|N+_*)KKDMzW7fiHH zFr#*VkIqa~DOM*e`p@tnUWEu$))?G!jh)^;drbuuL);854iarwta)ueL#nd4>ay1X zSa97rd|{!1X+>ymHko_oI-c4%+CDuJH-dqP3qfJ&IA$Woc{Qtebk=m54mXpCC1|K` zBGMK?DU~`S80yQCH=^wp(3JfgI%oIbr}iMWc-jnaru?y^b08p3%z`G;bv~X zX9y#!2H+3%MQe>xNr$rggvoZh{XT|iwV~0heYSy`6$9A17zN2tx%tUJp0!f2(KtD5789F&j%qiCc}B zR+K5jH}+^yDnoHg{X5M6Oc^3JGTa`avf5zMl$uTjoZ3R8IjeFBpS`An@SaxAnw-ms$|64IaDt?K^E<Q0u5bJ2<*OxRg{AhwiJkhK2Nge~8<$FP8F;~63sw)831VR+#X0q*QI~4*& zCH?sPtLwTb|K#R!aG0QI7l<3Tk;l1JD_9T+QPB$k^FQO5d6D9bvjYxu>tu6i3oV*G zJEN>#k-+7KqGCmUo)>>s7LAP-*M4aYOV@i1xFE6m6bQI}S$ zw|_2|gGXYNRM`Ii;`V8DcJh+l6x{_B+rPC_aA{}9jno)hEUucrfjRHybm1&XNgsI> z_}_*wi`RScxZ#4DUW%dQE(0mfe0^aFKRmbxfG0OsfwmA)WO*vFbTmy7v0G)@;H;`g zIX^!{f3XiUzwa=@mv_u`cHE({sn<#6ljJ6C=Nwh+Jy*_WmQx4BnKX1A-AP*%2y19b zgLiSNCFTJ%b4JFF-xEwH3Xfbki>#ZsB4VVLqcIV!5aq&ThWK}jO+mbL$ zlwr@6>;aq<0Lk|N%Qg-q*&DJIHBh)v%7@#?M{wC7h=GW`B*C4UH(@n94nLf>r$23zab~k!SW0<9{7dR!diPrYl?QoR;K#s@LzwdX& zwJv5~>L$7Dl*b7e%7D4dUvW$7Yq#L!%&${(ULsOO6KyU@|{Yjf}c*lwj5Bb)HO2>hC9tgM5kherQ^

AY-~QcNb&GU+l!(HmvQrrZEJQqx{?1@0NZCM0FVNWPr@KYhWSPb$ z9fp|`LIuv5-8=StDh&Ishq5m1mt)R0(9EglsF*j zu317moFQGha{%}k0br*?!&!II=aX7=0+9kFU8(d9@4*i`IU}iIlExTKbUF|z!exus z2h)chhY0;MlBEpY-pkk5#!hr`(_NWZX0n1*-~>Gzr1US!b*iaTfiJnfBzX2bxqiiY zr|lya>wW#Fd$TjvcC>VyXx$%~-wle0UcRZ!DUg!wZY$;Ew&*lCG$LNdx-=Km9<)ci z&!66WqyXqGmUOK-a7dF%wZ)v90nN-2jsJfEfa8JCyW|C7Vu@W2|D!*;`bYtgl-_=2 o(p^5NpWA&T0XUWNZx6u#0oNXS8`xUtE&u=k07*qoM6N<$g8Ct?1^@s6 delta 2354 zcmV-23C;G7EX5L#EPuoR01m_fl`9S#000R0Nkl6~aFxk!Y2Y#k57}IzQ zmUEmc6{Jjn^}zXHd_EXv)5k&ICEQ#{nt+R)`}u_n=YLUBewFLI3-7#s5XA)?Cz}`! ze(Fc*O-8}E2sqXLBc9`2h$Ur>Y;kctJ9X)4-ZgX#>u)>HLJl!t_M0I zJr^$(_J4YY@ppLKWAzcRLZN6+1rZ4e__(!%uU!0Fh9r@z&LK67qfQth=S$C*^w*el zA`%ktNaa;q$5SLlqD(Cl%O^Bu60^j#i=jw^MZ1r3f-P!ETGtGdXOkZs zaw(kiAQZU>k5+ait;|@YO+aKum}u7jQ+(Nh1?lX|HbO`saXV58vax$yw zKoBqelPbmQfE7kps~S$^cJLnGF<8b6NR(=*B@({zc#yYzz|&Ge>eV2vf7x2IF%YS6 z4S(`b88f4Q{I`rJ@7D43MhP|b4h-~#jx#c0?K%hY=K??9rUT8RW6J*r_h7%Qi9UiT z=PbZMH*U}Z8L1&st_H`N@g-2uL=^%&h$5l$D#y`w#WcLTGkT2Q2lM#$9Wq*)qt9J) zbCi@aC<<_u+P`{05BnV#k(~}QvINA8mwzn>Hay61;I)uapMOEZp524!^#pOhI?p_I z{%jC;-Y%K4w*?LD=>lFhIv|tG^Gb=p4NSZBR>@S!<#vuYAJS8bGVzc$0mAr(S0z00 zJqLzp(i<8kSsx`dUXuT|U4IT3PL7`6=irGoUhMls#=K$%Lk~&&m33##fLHzg?pr*n*HL0*Lcqk6>!tki?q>i>Wj%Sfe zbIft##4sKvbqE4PG^o0V!etYM&6-|Hk%zHLY_5%LDs8F?gwtO^!hfKdHFEfM19cTh z+jxPb2?!VgC=O-Z{e|n?-Vq-2^nCzs?+)&?UUjnNqg6=!yto>=pHn-sji*DxKK1(81#6amBD z&^kA41QwEhz;wdMFp_tIEPz`|6zu$oj@3uz+irNic2UvnvVXb0ZlIQ`K+91IGmaw;3#_Jp0;T@%(2KtQjpXhgo zX}=n?HZZM+UxGaCr&|W&$~8dFU=F3W2cCp`4e~YDjsdr8N9cvB-L_if{$SL7GlaB@ zA!~OyTpOr`sPYWPec8Erb)+f=!W%2Cl-Ktoeu$l@*MI35*$|1`BL9mg;cupF5xae6 zhlwB|W1FJp15Ltyex{d1Mt>wVk%q_mhfMvrB5Qvr8T*FGGWcE;X+>%-!spWbamADq zVCVUxep5&W#*$Et+$bfaL&B625F0__^|2)(W;vuv!jvl@-b>c8kVz7zoB#pw(A5AR z>wKgN1b>QSKc|u>WDNn41};-e(QYGW zJAV*+on%SK8Uiew@pPg>EynCPFJA4ILoAZX5wePa(2V&mSCH`!s0(mCj#G=wIxW~1 zQR8rmSw(AM>KAn&rYa4$6OfQ~1PE9Tu`4KvG4aatM94}4>?EGlSb-5gkw^vq Y2T4l%rHv@+#sB~S07*qoM6N<$f|%iCJOBUy diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json index ce2209e72dd..cc020d01c46 100644 --- a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json +++ b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/meta.json @@ -1,24 +1,24 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/TerraGov-Marine-Corps/blob/a2034543920664ddf0c0f3c681bf1d8003dc2ade/icons/Xeno/2x2_Xenos.dmi", - "size": { - "x": 64, - "y": 64 - }, - "states": [ - { - "name": "running", - "directions": 4 + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "DakoDragon, discord ID: 56038550335922176", + "size": { + "x": 64, + "y": 64 }, - { - "name": "sleeping" - }, - { - "name": "dead" - }, - { - "name": "crit" - } - ] + "states": [ + { + "name": "running", + "directions": 4 + }, + { + "name": "sleeping" + }, + { + "name": "dead" + }, + { + "name": "crit" + } + ] } diff --git a/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png b/Resources/Textures/Mobs/Aliens/Xenos/rouny.rsi/running.png index 2bbe1c603ebd34666782723ceaa52f655f4d388e..1438285113f2ade192e11385efe9fecfc529ede8 100644 GIT binary patch literal 11054 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 IKbeL7AJieO4*&oF literal 3810 zcmb`K=QkUS`^FPuSInRYLQ`9dDs42>tX5R*6(iBwqgHFje#(PVF={K-5?fMD;<~Tvoa@}@e)&1~Gh-utc2+@F006*la7V}FujBp`GvnXc zgLL}x*I0b-So;G2;NJfP#LI$({)P+#o!e$l^ES|w`o%`B(bQWFpBVU~2D&vL%w61} zlkRpf_sf@rOKaig8J@WLtO9wpnT7=?b2s|SbhF}jJ9sr z4^rbI?3|zNGYN&9e)&oEky125#W!$^HHvet*g@*JOgcjc(&sY#Nz81VHV}?yAmkFQ z;Ktq*Sr3r6Xe=dowy->W15|hIw@E|E{0s7UO9RiG9B9lOiIK`PWy82#)BEAR(_%_K z5+?#!!SR~({4eXF6WVojmF_l2d>j)@TQz6$0WQos<{ARBj=aam!Bl3WfnOO9x;|Lr zLIs8@7_py(F28f+0GbtB9Qo&I35qM|#wJMsWJF;tS0jqKcnJj_Q;dDxB$2E43B$LD%B2q45}SWR89eR;W3#zT&+&RQ!#oAVNIXQt(0VL3IQ_!JTr$V z^v2q>;(?ty za^iW(0N9d5hB3i79WAt4aqd;787$Z@hjKRk9c{kXku%xK(`Js;b&8JLjGtQ8lf&4? zBu&vd`*&2%RGW?a@(hobz(eT^Ng?6>%J1N2MQQcBF@g(_L)t$O=pLxK^r>xBj$CyX zJ!6^sK+E;Yi^3g&p-_mb9$jS^aG7LWh4(DQbYr=&s{~2F^?-`Q1_ejIJzq9sVbmkU zrxLgG#a2e1kTgAaZZ*Vs?qU3|wvZaC>Lt+Y&owyfhwxX{QBeWXESR*eC-eGvvQwdU z>Woa`ybYejusJh(7^MW49d|&UxbB`dl&ivIaW_{)NH{vYC=Y_0c*z%Q9O~oUW47HW ze{jR>Y-&HEIob~JZ97RLqFM2q@JD$73t(DZ07rE|LeX^=N67@ok*tPegoVO1{E=za z8#Pg`V;4QfxX4x)3QYW~ipxEh4=HhI^<;0TfLW)jP1W}cViEh+Kp{RE;LKVIxKAlT zkr-8!9Ju?llb^p&FsP8@7B+4!A|Zl0bp^G~c7_;S%-xtHdv^POrNi4RYb>dYBo3j7 z{7NvoQ-81>{JKefs>Y$~E@gMiew9}6L8V>RIOy|=XIpWb5s`!ab@b9Gt&m2+IxBwp zQcqt*V3$sLbZ7^+;G8rV<6t}W802jYe`BKbOSnt{4@qK?SIl~g18F~OwJkm+-1cVZ zuj1peFQRW1+oIAwV~DvZp`cG&Y}nk$_S2}N^+$)t_$%(deyol+Vng#|l$UvC3-7K% zmn=DXvd~rmZljL1ce`Hs-wJ6>r+5K|J65mVg&N^v<(3r_^q4+adow{{K?Sd3AVnvc zg3;1tSI>5l`cCz3;96*MAKpWP;7?MXO$xf;xQ==?ZZ@cgpU7TM+gUze_Jk#f-7VUX z=pEbT&Zv2>b2si&+Ufj6P@HRnO|zbIB@KDsi(xAGyF7>Gc`hE~L!lM~8+U*I=ibzp z>sRJ~ef%cx%m7A%k{;So(*Qrf|@c!i(C{G9vDuXMcBU1pTMg|b~f zYD>W8LTP2={4r}%Z9gxQCcPLoZ~YuEGx~e1NT5i>8%`Zdtl5go67jaW^FkA8m=pAe zi8nXvE>Z<-{x!RtI?2jsz#vMGI5elfY_n@k7S}2+>S&VS4NGMu0<9e`1HnKv1t$7g z=45`F*)N}`stHAFw?8qIbi25D^JZsk+V<(~qhw=FKKq$mZLEMq7k6-~6exR_?h zFFTX;i20xtN86{yl}#6T$XI{dPyvvyo{pqnz$^VHp2F z&p4gbYiD0BD(LvEi=K|@WQ44GJ2So;&Uzpw0|LWd*>6{#9niyK?{NCdswD!tzU6BR z3QIxP&FDTb@mQbO*Y5C3c7f9vC8^&XKDTJf{hQz4cbKJ}s?QuAXDldS&-Th)b`HZ`0}kc&?i%=~@uol`B=b~(A|-bZbVKX!Q(maokb|2yvd z|8Zsq2QHs^M-UviZUjb__l|Hm{??bSeCN1?=BaA_F?*2OMhtH*{S2qgRxr<+cJ?Js z5uCJ|;8|7Cn3K$c$wIHmAN!Y8fY`k!U^{l8tKvP@O2BTU+;H*a1j5QttdCr=A0Fg| z5q(Xl6tQ3sQV-SDuySMGa*VJfk4j!uvGjHKf<cIt#f&H8;*{m{_+mkbOfPT&|83Nym z5iR#;D4wNhIj-lXC|ebRt&vufE{uVI`BU$;H$X0QG*IaqUCipLQh8ru>Jb+iIr{UG zOfn{=20qCB2HLCIL}pY;-D5{5}*%2`OL#Uu;Yfr84r%uO94IeMd5Qa;$ONF15u@ z)B!R;-s6YZqBzX!RmtpOMRE>JJ%l^>Qzv-tDiCXlAymAiSzKRPeNszg4scZn>y}o0 znB_D%Zv}amCYQOc{aOF(JrKky*C*^x@~RBI>e-5~R-agchXj)%@02&qUnWfyb2mH@ zjDJU!h@)S28S>LlAu7UGM3e&_iR_}Mq|LcqnJoiJWG%Hv>VEY$!IlQX2T!lyRuU($&(Ru6G=$ zR)&I|C`5`@Al--kF5y|#&4;p-l6^~9sx><4X7FZ5>*Np13e*LO+f{emTktH%Akz2s zHBkpo=m>7-frXaWWY&OpN(@JRfjmJunZnwFX>}L6XbXB_3t-(|cyitt41)4;V$C`2 zAGfVOD4vLz&NsZxxM>;@$?+9$F2K54b6><~bU^Sj7E{&5`h0m%Kil9Kb6VFyvpSrx z2Ld18YOL@!6u}@AlRu<+Nqr?8^rX+v$3KU9%bq&sS$OG}?~#m%N0ggA=tTr&|iL zR-Zi@;2b0d)f63g6AQ7nEid#FD!o` za)Lsu$UR&#zzmT=CoH6z!FD6izx|Y4(B5!#yi}Qs1;^B~+vMGJcGAN7*EF?8x5#(~ z+}V2Toz9tf^m_CV?-0vu zL0LjZs-$~;<*^roqDy);N6{#!#?-G)9|xF0(^>WXB7eN-Z^WN=HUzjLOqMMRWD#_F z$oF(aP6nvu^g?zWQHJU+mG)pp$AfYZU1yg#H?CHWm8Yuas!Ujvd)J*B=1Wz2K556k z#k#{cb#igF;be3^Qptk5d-iUvjR!H)c9;|};+rG|DvCZ?1jiPTEPulQ01m?e$8V@)0000RbVXQnQ*UN;cVTj607GSLb9r+hQ*?D? zX>TA@Z*OeDr{R1601DDcL_t(|ob8!;Y+S_|z<=}h?dALJ+Ux82K5`O62oxG}#{qh& z1vN*5stRZ-Qd&_}MNQL?n4_quss#N5wNw=ddO+1mt!PPt6Mu&g8qyGQG#qIX$FbK* zeC+zRv)q?CM?MI-?v0VDxTw+_=PNdQRz zNdQRz)2+j_N)kX4KoUR_z;x^Ikx8~{J>Uz67LRO~Qi`$u^M3(A2oVA-uYTnV)c*aS z+?7{KN!TDW&3}QXARA|@gLS+2jtXMN0}w(;fZr^-fg|TGk`APf=%ZRy%IB7_aqnwa zL7341gb?ztx31#c*$eb`^ z3T){C__C+Dg{fH_RLW(Qp@)2eOOEjMKf&=Vhx~N5%952SNb~EOzD#c-ZIV%bK2G z9VOK|cOQK7)9(X>5C$M#SiY2@fy)SsASK1YOUKSq6Bp6zd|o!YbaEnXibY|2do%aD zbX<|P_yi!Y$iscd-v0Oi*c3$sr8GW@v9`PQgn#EucLt9&o?&yQ2a6Ecoi_Rh13c#Q zvd*PbEzEpCwW^#%;2I9%8Ic3#=~e1 zn17bAM$@@Y0S91n*x1_I$WPrmmbm}t>N#vae)OXO5Pv@ZeEVv;I(pdj*5TOiX^MsI zrIic~TqYa}PkP*8KxORg?u>*gRiUI>=MV2RbF*Tad7aNot)_Fm0`|!BT`rvhLCgt$ zXaMnxety{!><$~9m;7u#ew1HS%qFkMgMZCo!)jGQnBLgm)`hq60^#uFPDTJYX27+P zg&2{K8u{G-nj}=&Rn8BG2umo5n0nL_KBqvtgxnN6kF_@PpsNrYP+e2Ok6u6c+bIF4 zwx_&udU)tIfEQLQ#b&eO@93uUqMzV!kUF227i(A2)73|NYX`yM5Q?IpSQOm38h<$j zZURHYoO{2SP%t#9IR}6v1~hb;3tFTkCOQ)HI6Uq5a+{{dU_~K()uqRrWoo{g`c@w| zTNUcsnGAa@ETYcm<(G4>p|7(CW1JnfIc$_x7ZD7GXl-d{ z>-p1HIXN(Qw@pGP;FAyt1z2jc$A3(Cq!d*YaHjDhN5hgE74z6ci=VH#badcXelJo= z;kMePFBq6O6^<_akE>U3simD>e;S9cmD;RAmgQ^w_}%~T>@AD=)_;LFCawmf z3xD>O#k4kFU^p({9!u(cUcTwlDI4?dWpr_-I;fae%GY112Vjk+lP|ym931Roy_UoF zi%s0F>D)LD03ihBb4zJD)l7DI0jC--@?={Rn_N2A7MTw3@uCV!XBD%dzG3WYPzWKP zTe6tu)2)*}r>zp&5DZDl=YN&Ngkv%ygka9XD%S1Z%Z{8PGF=(CJQ_m4Q2%AV^Y&ZR zMl4{gv4s#+)s*wh!DG~Bxu{%F&bpm@xYwnlD}q@y6>QkEkKf&V6L%kcb94Yg2>C>5 zH3NNvV@#7M0n7p<49rnXXXO@VMK)Cks#Rs)qFLPW@~*3V!q5E|sDDXyvE1&!F&=>V z5!GqKlSF*kN%+&yd5b~kyBE%%4!dYoLso4UG zUFl?GrZNcpqwx|p%+O_>Xpj+7Tvf1fo^HWbqT!O<&E`S=hCT&yZk7dT}&txCM_eC^{?&);Lb>0 zFz8C>snhSX#a&2wWg+(-I&?LFhur#v=eALrXZ&gZ1-5#M2#3P-McR9%xhu_qegyE| zU^giimBFy-NPlZxI$;U3ggJ&~j5+Fj-h}6xR5w{RClc7-mD-P>8yXXAvVqyw@yZioh>bA6T_g#YX8gpw46JZOk}4*&}m5W?JC2;Fc%F; zi-etVyAmCEfB9_7cUxN)oE#o}`?)2HK|=e5PMW$0Xn&S4gn2BYAFF`B`OR^Dot~p^ z>TM4vPHl!|MFK#_%)FrLnsV0etY?EuXO<$^(b*DFQ^r;+0J&1rnFxS8 z&xP-jpMKzkVVY!pmlpvTqrGqtLOz^ZLO5&?^)q3hA2W6JNf?%rhVIsc|Bd$+CjvoQ zg~HOT0)MWLRD5HJ)n=u9UMb(GZ@B8W*bxBaa!qIH1o69Ub}>z-S~zM*x}<52V<{_y zkSjH_`s$EZ{KD=o?`Yj)^3tuVSi5V_gb<<@u|m_y6_5=$uaYoG#u-<#-$UDs_`2kr4-_NNBY7vXXcS20Tts+ zt6Ehm=a;gfe&3W7T&3w~0;(fBWMJm_VIt>0qO{#^qiR7JYj;j;0i(%6XWI6omj`yF zD1S;|&@k+9B^+wA3whv;L*{pj+UySnOJX`kqrfUnXYmBbV9vtoScsYGF4bx}L15oF z$Kd-Fb9n0Pdx>6J2>C&PMDG%JYwuBr!sFsCb%L}aDPmc!n!a4dVdVV zAQTD{37Wqlbq^`uGa+{_Thuc7tVtPW=%E2EHSVQ?>b|85o$jJY5_^D(1YMX&ZFdK)`K(ljI9ylLNXt+`Rfc zPns5WI~?B8-gjbyWaZlVQ*}>gl*LbW=~H??dCR1!(i+EE94yrsP8l)=^l>&6`7lgL zW?CR4%Rq^Z*o>lx%NJcfwj)Y#`cUJ-}BW|=Je>X?s(AL_}_5n zw22p&HVEzD(Oam^crsBxVa;)s64e76O@4UR`a6{~-D~@NJc?6)$Nnq-WmJI@cMCFZ zYCnBlP<@hp|NGrS8(3qxRv7Yj#Iowhp40mgB{YlsL$e-l1ABd}vr{nRPT3ePxi!`G z<~5H^6%^HvT~(gN5wW|m^WmnSf}dYH1gnH@ziF4S`a$iVhLy5as+Rvsd_CSq`CJu3RSGXx~u=nhxxWV7vHUN)h|riJ5Bjpt(O1aYnc}QcKyK# zTZ$?jZa6nNZ(4Uf>UV5}IV zt&4guEJ@#UIjr!mN8Ze-tbF>a`-Pji*A=Nne0uJzx$v-epNjmB>-AsvH_VSQkoErD wm7?Nhz2awOLy43pbA+`}xvk)>A}Pzopr0PFDj2><{9 From b5bc58386aac307b206e388810b06011ab6ba4b2 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sat, 3 Aug 2024 11:04:23 +0000 Subject: [PATCH 056/143] Automatic Changelog Update (#649) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6d6093caef4..c1c317f536f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4845,3 +4845,9 @@ Entries: message: 'Supermatter Engines have been implemented. ' id: 6206 time: '2024-08-03T00:41:54.0000000+00:00' +- author: Tilkku + changes: + - type: Tweak + message: Rouny Sprite Changed + id: 6207 + time: '2024-08-03T11:04:01.0000000+00:00' From 75b36bff1eacf4db236c4128f1b6f2389efe5236 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Sun, 4 Aug 2024 01:34:22 +0300 Subject: [PATCH 057/143] Fix Event Manager Allowing to Start Multiple Events of the Same Type in a Short Time Window (#645) # Description Makes it so that the event scheduler doesn't pick events that were already added (but not yet ended). In order to fix this:

![image](https://github.com/user-attachments/assets/fd73dbce-7cbc-489b-8990-7ae791723351)

--- Content.Server/StationEvents/EventManagerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/StationEvents/EventManagerSystem.cs b/Content.Server/StationEvents/EventManagerSystem.cs index 261e8ca46dd..2d8606e9293 100644 --- a/Content.Server/StationEvents/EventManagerSystem.cs +++ b/Content.Server/StationEvents/EventManagerSystem.cs @@ -162,7 +162,7 @@ public TimeSpan TimeSinceLastEvent(EntityPrototype stationEvent) private bool CanRun(EntityPrototype prototype, StationEventComponent stationEvent, int playerCount, TimeSpan currentTime) { - if (GameTicker.IsGameRuleActive(prototype.ID)) + if (GameTicker.IsGameRuleAdded(prototype.ID)) return false; if (stationEvent.MaxOccurrences.HasValue && GetOccurrences(prototype) >= stationEvent.MaxOccurrences.Value) From dd2a0cf29d2935b3adcfd9eff2caaedb606cfbff Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sat, 3 Aug 2024 20:23:53 -0400 Subject: [PATCH 058/143] Remove Clothesmate Bloat (#637) # Description The original intended purpose of Loadouts as designed by Death was to serve as the ultimate solution to the Clothesmate BLOAT. Ironically, when Wizden made their own Loadouts, they made a version of Loadout that is incapable of this. Now that we've more significantly fleshed out EE Loadouts to fulfill that purpose, I can finally trim down the Clothesmate. I haven't touched any of the other vendors, just the Clothesmate. As an aside, the cost of a Clothing restock has gone down from a fucking ridiculous 4500, down to only 1500. Making it something Cargo techs can actually reasonably buy. Clothesmates now only contain the absolute barest minimum clothes for a greytider. This also helpfully serves as a balancing act against Loadouts being able to provide items other than clothes. It is much harder to get clothing outside of loadouts, preventing people from spamming useless clothing entities on the station. If you spend all your loadout points on items, you are locking yourself out of wearing actually nice drip. Choose how you spend your points wisely!

Media

![image](https://github.com/user-attachments/assets/9f6d7668-c8ba-4404-834c-b4f885b6617f)

--- # Changelog :cl: - tweak: Due to budget cuts, Nanotrasen has ceased stocking Clothesmate vendors with more clothing than the average cargo tech can afford. Civilians are advised to bring their own clothes to the station if they wish to wear anything other than grey. --- .../Catalog/Cargo/cargo_vending.yml | 2 +- .../Inventories/clothesmate.yml | 117 ++---------------- .../Structures/Machines/vending_machines.yml | 2 +- 3 files changed, 15 insertions(+), 106 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 93c60e4caa0..7062b2eb155 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 4500 + cost: 1500 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 2c4c27137f0..bc8f73d618c 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -1,116 +1,25 @@ - type: vendingMachineInventory id: ClothesMateInventory startingInventory: - ClothingBackpack: 5 - ClothingBackpackDuffel: 5 - ClothingBackpackSatchel: 3 + # STOP! ADD NOTHING TO THIS! GO PUT YOUR CLOTHES IN LOADOUTS INSTEAD! + ClothingBackpack: 2 + ClothingBackpackDuffel: 2 + ClothingBackpackSatchel: 2 ClothingBackpackSatchelLeather: 2 - ClothingRandomSpawner: 8 - ClothingHeadHatBeret: 4 + ClothingRandomSpawner: 6 ClothingHeadBandBlack: 2 - ClothingHeadBandBlue: 2 - ClothingHeadBandGreen: 2 - ClothingHeadBandRed: 2 - ClothingHeadBandSkull: 2 - ClothingHeadHatGreyFlatcap: 3 - ClothingHeadHatBrownFlatcap: 3 - ClothingUniformJumpsuitColorGrey: 8 - ClothingUniformJumpskirtColorGrey: 8 - ClothingUniformJumpsuitColorWhite: 3 - ClothingUniformJumpskirtColorWhite: 3 - ClothingUniformJumpsuitColorBlack: 3 - ClothingUniformJumpskirtColorBlack: 3 - ClothingUniformJumpsuitColorBlue: 2 - ClothingUniformJumpskirtColorBlue: 2 - ClothingUniformJumpsuitColorYellow: 2 - ClothingUniformJumpskirtColorYellow: 2 - ClothingUniformJumpsuitColorGreen: 2 - ClothingUniformJumpskirtColorGreen: 2 - ClothingUniformJumpsuitColorOrange: 2 - ClothingUniformJumpskirtColorOrange: 2 - ClothingUniformJumpsuitColorRed: 2 - ClothingUniformJumpskirtColorRed: 2 - ClothingUniformJumpsuitColorPurple: 2 - ClothingUniformJumpskirtColorPurple: 2 - ClothingUniformJumpsuitColorPink: 2 - ClothingUniformJumpskirtColorPink: 2 - ClothingUniformJumpsuitColorDarkBlue: 2 - ClothingUniformJumpskirtColorDarkBlue: 2 - ClothingUniformJumpsuitColorDarkGreen: 2 - ClothingUniformJumpskirtColorDarkGreen: 2 - ClothingUniformJumpsuitColorTeal: 2 - ClothingUniformJumpskirtColorTeal: 2 - ClothingUniformJumpsuitHawaiBlack: 2 - ClothingUniformJumpsuitHawaiBlue: 2 - ClothingUniformJumpsuitHawaiRed: 2 - ClothingUniformJumpsuitHawaiYellow: 2 - ClothingUniformJumpsuitFlannel: 2 - ClothingUniformJumpsuitCasualBlue: 2 - ClothingUniformJumpskirtCasualBlue: 2 - ClothingUniformJumpsuitCasualPurple: 2 - ClothingUniformJumpskirtCasualPurple: 2 - ClothingUniformJumpsuitCasualRed: 2 - ClothingUniformJumpskirtCasualRed: 2 - ClothingUniformJumpsuitTshirtJeans: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitTshirtJeansGray: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitTshirtJeansPeach: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansGreen: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansRed: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitJeansBrown: 2 # Nyano - Clothing addition - ClothingUniformJumpsuitLostTourist: 2 # Nyano - Clothing addition - ClothingShoesColorBlack: 8 - ClothingShoesColorBrown: 4 - ClothingShoesColorWhite: 3 - ClothingShoesColorBlue: 2 - ClothingShoesColorYellow: 2 - ClothingShoesColorGreen: 2 - ClothingShoesColorOrange: 2 - ClothingShoesColorRed: 2 - ClothingShoesColorPurple: 2 - ClothingHeadHatGreysoft: 8 - ClothingHeadHatMimesoft: 3 - ClothingHeadHatBluesoft: 2 - ClothingHeadHatYellowsoft: 2 - ClothingHeadHatGreensoft: 2 - ClothingHeadHatOrangesoft: 2 - ClothingHeadHatRedsoft: 2 - ClothingHeadHatBlacksoft: 2 - ClothingHeadHatPurplesoft: 2 + ClothingHeadHatGreyFlatcap: 2 + ClothingUniformJumpsuitColorGrey: 2 + ClothingUniformJumpskirtColorGrey: 2 + ClothingShoesColorBlack: 4 + ClothingHeadHatGreysoft: 2 ClothingHeadHatCorpsoft: 2 - ClothingOuterWinterCoat: 2 # Nyano - Clothing addition - ClothingOuterWinterCoatLong: 2 # Nyano - Clothing addition - ClothingOuterWinterCoatPlaid: 2 # Nyano - Clothing addition - ClothingOuterCoatHyenhSweater: 2 # Nyano - Clothing addition - ClothingOuterCoatLettermanBlue: 2 # Nyano - Clothing addition - ClothingOuterCoatLettermanRed: 2 # Nyano - Clothing addition - ClothingOuterDenimJacket: 2 # DeltaV - Clothing addition - ClothingOuterCorporateJacket: 2 # DeltaV - Clothing addition - ClothingOuterCsCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterEeCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHiCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterHmCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterIdCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterZhCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterGeCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterFaCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterDdCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingOuterBcCorporateJacket: 2 # Einstein Engines - Clothing addition - ClothingShoesBootsFishing: 2 # Nyano - Clothing addition - ClothingHeadTinfoil: 2 # Nyano - Clothing addition - ClothingHeadFishCap: 2 - ClothingHeadRastaHat: 2 + ClothingOuterWinterCoat: 2 + ClothingOuterCorporateJacket: 2 ClothingBeltStorageWaistbag: 3 ClothingEyesGlasses: 6 ClothingHandsGlovesColorBlack: 4 - ClothingHandsGlovesColorGray: 4 - ClothingHandsGlovesColorBrown: 2 - ClothingHandsGlovesColorWhite: 2 - ClothingHandsGlovesColorRed: 2 - ClothingHandsGlovesColorBlue: 2 - ClothingHandsGlovesColorGreen: 2 - ClothingHandsGlovesColorOrange: 2 - ClothingHandsGlovesColorPurple: 2 - ClothingEyesGlassesCheapSunglasses: 3 + ClothingEyesGlassesCheapSunglasses: 2 contrabandInventory: ClothingMaskNeckGaiter: 2 ClothingUniformJumpsuitTacticool: 1 diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index fcc6e4974c1..02cdd80af35 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -322,7 +322,7 @@ parent: VendingMachine id: VendingMachineClothing name: ClothesMate - description: A vending machine for clothing. + description: A vending machine for dispensing the cheapest clothing Nanotrasen can buy. components: - type: VendingMachine pack: ClothesMateInventory From 62045fff8af44c1e278ddbd9ea214aea59a9b206 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 4 Aug 2024 00:24:28 +0000 Subject: [PATCH 059/143] Automatic Changelog Update (#637) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c1c317f536f..f947f711fb2 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4851,3 +4851,13 @@ Entries: message: Rouny Sprite Changed id: 6207 time: '2024-08-03T11:04:01.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Due to budget cuts, Nanotrasen has ceased stocking Clothesmate vendors + with more clothing than the average cargo tech can afford. Civilians are + advised to bring their own clothes to the station if they wish to wear + anything other than grey. + id: 6208 + time: '2024-08-04T00:23:53.0000000+00:00' From fb7c4d9da85d283fa9dac846ba9f272abc819f15 Mon Sep 17 00:00:00 2001 From: Tmanzxd <164098915+Tmanzxd@users.noreply.github.com> Date: Sat, 3 Aug 2024 20:15:19 -0500 Subject: [PATCH 060/143] Fixes Failed to Cherry-Pick PR #25986: Return Detective to Security #145 (#656) Partial fix to #145, as the changes in inventory will need reflected in the Security Loadout system which will be in another PR. Made so Detective has the same access as Security Officers. --- Resources/Prototypes/Roles/Jobs/Security/detective.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index 0ed2eba9556..861088b5e5c 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -17,6 +17,8 @@ - Maintenance - Service - Detective + - External + - Cryogenics special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] From 1509caa60d2d967031577dd590f875f2e02ffafc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 3 Aug 2024 18:22:30 -0700 Subject: [PATCH 061/143] Update Credits (#667) This is an automated Pull Request. This PR updates the GitHub contributors in the credits section. Co-authored-by: SimpleStation Changelogs --- Resources/Credits/GitHub.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index e6c7690ad37..6e47a71e43f 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, angelofallars, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, BramvanZijp, Brandon-Huu, Bribrooo, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CaasGit, CakeQ, CaptainSqrBeard, Carbonhell, Carolyn3114, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, CodedCrow, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, Deeeeja, deepdarkdepths, Delete69, deltanedas, DeltaV-Bot, DerbyX, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, FoxxoTrystan, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, geraeumig, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, graevy, GreyMario, Guess-My-Name, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, Hoolny, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, Interrobang01, IProduceWidgets, ItsMeThom, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTrotter, KaiShibaa, kalane15, kalanosh, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, leonardo-dabepis, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, LovelyLophi, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, misandrie, MishaUnity, MisterMecky, Mith-randalf, Mnemotechnician, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OCOtheOmega, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, PHCodes, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykzz, PuroSlavKing, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, ShadowCommander, Shadowtheprotogen546, SignalWalker, SimpleStation14, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, spoogemonster, ssdaniel24, stalengd, Stealthbomber16, stellar-novas, StrawberryMoses, superjj18, SweptWasTaken, Szunti, TadJohnson00, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, Tmanzxd, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, Tornado-Technology, tosatur, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, UnicornOnLSD, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, VMSolidus, volundr-, Voomra, Vordenburg, vulppine, wafehling, WarMechanic, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From f6a5a2fe7e76892ddd0c1148fc61d54499e12a6c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 4 Aug 2024 02:26:34 -0400 Subject: [PATCH 062/143] Add 4 Missing Vendors To Vendor Spawners (#639) # Description https://github.com/Simple-Station/Einstein-Engines/pull/400 added 4 new vendors that were never implemented in the game's spawners, so they never actually appeared ingame. This PR adds them to random vendor spawners, so that they'll show up on stations. # Changelog :cl: - add: SweatMAX, "hot foods", Mars Mart, and Nippon-tan vendors have all been added to vendor spawners. --- .../Prototypes/Entities/Markers/Spawners/Random/vending.yml | 4 ++++ .../Entities/Markers/Spawners/Random/vendingdrinks.yml | 1 + 2 files changed, 5 insertions(+) diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml index d55a7916b46..ca68d7df53b 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/vending.yml @@ -31,4 +31,8 @@ - VendingMachineSoda - VendingMachineStarkist - VendingMachineSpaceUp + - VendingMachineFitness + - VendingMachineHotfood + - VendingMachineSolsnack + - VendingMachineWeeb chance: 1 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml index a911b7ebfc0..1e452098531 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/vendingdrinks.yml @@ -22,4 +22,5 @@ - VendingMachineSoda - VendingMachineStarkist - VendingMachineSpaceUp + - VendingMachineFitness chance: 1 From 1c26a1064595eb1956726b59a566a2d11aa5a142 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 4 Aug 2024 06:26:57 +0000 Subject: [PATCH 063/143] Automatic Changelog Update (#639) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index f947f711fb2..878c3a83447 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4861,3 +4861,11 @@ Entries: anything other than grey. id: 6208 time: '2024-08-04T00:23:53.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + SweatMAX, "hot foods", Mars Mart, and Nippon-tan vendors have all been + added to vendor spawners. + id: 6209 + time: '2024-08-04T06:26:34.0000000+00:00' From 23fc467bd1723d161b83b5c117d07c5b7043e2df Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Sun, 4 Aug 2024 17:30:31 +0800 Subject: [PATCH 064/143] New Trait: Voracious (#668) # Description **Voracious** is a 1-point Physical trait that makes you eat and drink twice as fast. Inspired by the SS13 trait of the same name. Roughly based on the Parkstation implementation of Voracious by @DEATHB4DEFEAT. ## Technical Details The new component `ConsumeDelayModifierComponent` is rather generic, and can decrease or _increase_ the consumption speed of food and/or drinks. This gives room to add a negative trait that includes slower eating/drinking. ## Media ![image](https://github.com/user-attachments/assets/f8475b2a-de0b-4cae-83c6-8a280139bfd8) # Changelog :cl: Skubman add: Add the Voracious trait, a 1-point trait that makes you eat and drink twice as fast. --- .../Nutrition/EntitySystems/DrinkSystem.cs | 7 +++++- .../Nutrition/EntitySystems/FoodSystem.cs | 7 +++++- .../Assorted/ConsumeDelayModifierComponent.cs | 22 +++++++++++++++++++ Resources/Locale/en-US/traits/traits.ftl | 5 +++++ Resources/Prototypes/Traits/skills.yml | 9 ++++++++ 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index 47e7fa6802c..2249926baab 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -7,6 +7,7 @@ using Content.Server.Inventory; using Content.Server.Nutrition.Components; using Content.Server.Popups; +using Content.Server.Traits.Assorted.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.CCVar; @@ -279,9 +280,13 @@ private bool TryDrink(EntityUid user, EntityUid target, DrinkComponent drink, En var flavors = _flavorProfile.GetLocalizedFlavorsMessage(user, drinkSolution); + var drinkDelay = drink.Delay; + if (TryComp(target, out var delayModifier)) + drinkDelay *= delayModifier.DrinkDelayMultiplier; + var doAfterEventArgs = new DoAfterArgs(EntityManager, user, - forceDrink ? drink.ForceFeedDelay : drink.Delay, + forceDrink ? drink.ForceFeedDelay : drinkDelay, new ConsumeDoAfterEvent(drink.Solution, flavors), eventTarget: item, target: target, diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 06d1c4b42d3..84355f03c16 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Nutrition.Components; using Content.Server.Popups; using Content.Server.Stack; +using Content.Server.Traits.Assorted.Components; using Content.Shared.Administration.Logs; using Content.Shared.Body.Components; using Content.Shared.Body.Organ; @@ -176,9 +177,13 @@ private void OnFeedFood(Entity entity, ref AfterInteractEvent arg _adminLogger.Add(LogType.Ingestion, LogImpact.Low, $"{ToPrettyString(target):target} is eating {ToPrettyString(food):food} {SolutionContainerSystem.ToPrettyString(foodSolution)}"); } + var foodDelay = foodComp.Delay; + if (TryComp(target, out var delayModifier)) + foodDelay *= delayModifier.FoodDelayMultiplier; + var doAfterArgs = new DoAfterArgs(EntityManager, user, - forceFeed ? foodComp.ForceFeedDelay : foodComp.Delay, + forceFeed ? foodComp.ForceFeedDelay : foodDelay, new ConsumeDoAfterEvent(foodComp.Solution, flavors), eventTarget: food, target: target, diff --git a/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs b/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs new file mode 100644 index 00000000000..aa551a79f76 --- /dev/null +++ b/Content.Server/Traits/Assorted/ConsumeDelayModifierComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Server.Traits.Assorted.Components; + +/// +/// This is used for any trait that modifies how fast an entity consumes food and drinks. +/// +[RegisterComponent] +public sealed partial class ConsumeDelayModifierComponent : Component +{ + /// + /// What to multiply the eating delay by. + /// + [DataField] + public float FoodDelayMultiplier { get; set; } = 1f; + + /// + /// What to multiply the drinking delay by. + /// + [DataField] + public float DrinkDelayMultiplier { get; set; } = 1f; +} diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index cd5d1782ba3..25c309476f0 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -55,3 +55,8 @@ trait-name-Foreigner = Foreigner trait-description-Foreigner = For one reason or another you do not speak this station's primary language. Instead, you have a translator issued to you that only you can use. + +trait-name-Voracious = Voracious +trait-description-Voracious = + Nothing gets between you and your food. + Your endless consumption of food and drinks is twice as fast. diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 2cfbd244e7e..6350cdc3c23 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -31,3 +31,12 @@ inverted: true species: - Felinid + +- type: trait + id: Voracious + category: Physical + points: -1 + components: + - type: ConsumeDelayModifier + foodDelayMultiplier: 0.5 + drinkDelayMultiplier: 0.5 From 09e11deea66600deac0694cecaa6b46139a92111 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Sun, 4 Aug 2024 09:30:53 +0000 Subject: [PATCH 065/143] Automatic Changelog Update (#668) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 878c3a83447..5ea713fda4f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4869,3 +4869,11 @@ Entries: added to vendor spawners. id: 6209 time: '2024-08-04T06:26:34.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: >- + Add the Voracious trait, a 1-point trait that makes you eat and drink + twice as fast. + id: 6210 + time: '2024-08-04T09:30:31.0000000+00:00' From 0b0e5f3998cff978283b76b5a1b5f8bd62bc97d7 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 4 Aug 2024 10:14:12 -0400 Subject: [PATCH 066/143] Zombie Improvements Take 2 (#652) # Description Problem: "Players like to stall zombie rounds" Solution: Fix the Anti-Stall mechanic. The set of functions for handling the automatic shuttle call now correctly only checks "The" station, rather than any grid containing a StationDataComponent. By using the less permissive _gameTicker.GetSpawnableStations(); function, the zombie gamerule no longer includes stations such as Centcomm, Planet Expeditions, some salvage wrecks, certain space ships, the Syndicate Listening Outpost, and Nukie World. Additionally, the check for "Healthy" humans no longer considers anyone infected with the zombie virus to be a "Healthy" human, ensuring that someone with a 200u jug of Bicaridine can no longer contribute to round stalling. Finally, dead (player)zombies are now by default checked for the purpose of calling the evac shuttle. The reason being for this assumption, is that dead zombies are still players removed from the round. If a majority of players are removed from the round(or fucked off to space), the shuttle should be called. # Changelog :cl: - fix: Zombie events have had their Anti-Stalling mechanic improved. Dead (Player) Zombies, Infected Players, and Initial Infected are all counted as zombies for the purpose of determine if the shuttle should be called. Additionally, any player who leaves the station is no longer counted as a healthy crewman for the automatic shuttle call. --- .../GameTicking/Rules/ZombieRuleSystem.cs | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index e8dc37dc1eb..5714337d4db 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -43,6 +43,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem [Dependency] private readonly AntagSelectionSystem _antagSelection = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly AnnouncerSystem _announcer = default!; + [Dependency] private readonly GameTicker _gameTicker = default!; public override void Initialize() { @@ -89,7 +90,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) ("username", player.Value))); } - var healthy = GetHealthyHumans(); + var healthy = GetHealthyHumans(true); // Gets a bunch of the living players and displays them if they're under a threshold. // InitialInfected is used for the threshold because it scales with the player count well. if (healthy.Count <= 0 || healthy.Count > 2 * zombie.InitialInfectedNames.Count) @@ -185,7 +186,7 @@ private void OnZombifySelf(EntityUid uid, PendingZombieComponent component, Zomb /// Include healthy players that are not on the station grid /// Should dead zombies be included in the count /// - private float GetInfectedFraction(bool includeOffStation = true, bool includeDead = false) + private float GetInfectedFraction(bool includeOffStation = false, bool includeDead = true) { var players = GetHealthyHumans(includeOffStation); var zombieCount = 0; @@ -205,14 +206,14 @@ private float GetInfectedFraction(bool includeOffStation = true, bool includeDea /// Flying off via a shuttle disqualifies you. ///
/// Amount of times round start must fail before the server is shut down. diff --git a/Content.Shared/Movement/Components/CanWalkComponent.cs b/Content.Shared/Movement/Components/CanWalkComponent.cs deleted file mode 100644 index fab851595c7..00000000000 --- a/Content.Shared/Movement/Components/CanWalkComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Movement.Components; - -/// -/// Indicates if the entity can toggle walking or not. -/// -[NetworkedComponent, RegisterComponent] -public sealed partial class CanWalkComponent : Component -{ -} diff --git a/Content.Shared/Movement/Components/InputMoverComponent.cs b/Content.Shared/Movement/Components/InputMoverComponent.cs index 263190d46fd..916ecc90af1 100644 --- a/Content.Shared/Movement/Components/InputMoverComponent.cs +++ b/Content.Shared/Movement/Components/InputMoverComponent.cs @@ -1,6 +1,8 @@ using System.Numerics; using Content.Shared.Alert; +using Content.Shared.CCVar; using Content.Shared.Movement.Systems; +using Robust.Shared.Configuration; using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -72,7 +74,10 @@ public sealed partial class InputMoverComponent : Component public const float LerpTime = 1.0f; - public bool Sprinting => (HeldMoveButtons & MoveButtons.Walk) == 0x0; + //NOTE I don't think I'm supposed to do this + public bool Sprinting => IoCManager.Resolve().GetCVar(CCVars.GamePressToSprint) + ? (HeldMoveButtons & MoveButtons.Walk) != 0x0 + : (HeldMoveButtons & MoveButtons.Walk) == 0x0; [ViewVariables(VVAccess.ReadWrite)] public bool CanMove = true; diff --git a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs index 813a18f974c..0f404f45b97 100644 --- a/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs +++ b/Content.Shared/Movement/Components/MovementSpeedModifierComponent.cs @@ -22,8 +22,8 @@ public sealed partial class MovementSpeedModifierComponent : Component public const float DefaultFriction = 20f; public const float DefaultFrictionNoInput = 20f; - public const float DefaultBaseWalkSpeed = 2.5f; - public const float DefaultBaseSprintSpeed = 4.5f; + public const float DefaultBaseWalkSpeed = 3f; + public const float DefaultBaseSprintSpeed = 5f; [AutoNetworkedField, ViewVariables] public float WalkSpeedModifier = 1.0f; diff --git a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs index 891bd518b1c..50cffa6ffea 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.Input.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.Input.cs @@ -620,7 +620,7 @@ public enum MoveButtons : byte Down = 2, Left = 4, Right = 8, - Walk = 16, + Walk = 16, // This may be either a sprint button or a walk button, depending on server config AnyDirection = Up | Down | Left | Right, } diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 4c2c91db6a1..0944634db35 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -289,12 +289,10 @@ protected void HandleMobMovement( PhysicsSystem.SetAngularVelocity(physicsUid, 0, body: physicsComponent); } - public void WalkingAlert(EntityUid player, bool walking) + private void WalkingAlert(EntityUid player, bool walking) { - if (HasComp(player)) - { - _alerts.ShowAlert(player, AlertType.Walking, walking ? (short) 0 : (short) 1); - } + walking = _configManager.GetCVar(CCVars.GamePressToSprint) ? !walking : walking; + _alerts.ShowAlert(player, AlertType.Walking, walking ? (short) 0 : (short) 1); } public void LerpRotation(EntityUid uid, InputMoverComponent mover, float frameTime) diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 8c6cf575d54..7b25b616b24 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -112,13 +112,13 @@ ui-options-header-dev = Development ui-options-header-general = General ui-options-hotkey-keymap = Use US QWERTY Keys -ui-options-hotkey-toggle-walk = Toggle Walk +ui-options-hotkey-toggle-walk = Toggle Speed ui-options-function-move-up = Move Up ui-options-function-move-left = Move Left ui-options-function-move-down = Move Down ui-options-function-move-right = Move Right -ui-options-function-walk = Walk +ui-options-function-walk = Change Speed ui-options-function-camera-rotate-left = Rotate left ui-options-function-camera-rotate-right = Rotate right diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index eba1253dde4..9ff9837a3b9 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -223,7 +223,6 @@ understands: - GalacticCommon - RobotTalk - - type: CanWalk - type: entity id: BaseBorgChassisNT diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 92ede14d3ec..29234ea34cf 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1313,7 +1313,6 @@ tags: - VimPilot - DoorBumpOpener - - type: CanWalk - type: entity name: monkey diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml index 2515c7880ac..c2380c40278 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/elemental.yml @@ -293,7 +293,6 @@ solution: bloodstream - type: DrainableSolution solution: bloodstream - - type: CanWalk - type: entity name: Reagent Slime Spawner diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index e10bdbcf0ec..d1b3bd6a6a9 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -126,7 +126,6 @@ understands: - GalacticCommon - Mouse - - type: CanWalk - type: entity id: MobRatKingBuff diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 3735bcc4eca..fbf133a0f1e 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -128,7 +128,6 @@ speechSounds: Slime - type: TypingIndicator proto: slime - - type: CanWalk - type: entity name: blue slime diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 1b9e9674f44..c4906f6f975 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -229,7 +229,6 @@ - CanPilot - FootstepSound - DoorBumpOpener - - type: CanWalk - type: entity save: false diff --git a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml index b265d9343a3..05d70e8adc5 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/harpy.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/harpy.yml @@ -119,8 +119,8 @@ False: {visible: false} True: {visible: true} - type: MovementSpeedModifier - baseWalkSpeed: 2.5 - baseSprintSpeed: 5.0 + baseWalkSpeed: 3 + baseSprintSpeed: 5.5 weightlessAcceleration: 2.5 - type: Inventory speciesId: harpy @@ -140,7 +140,6 @@ understands: - GalacticCommon - SolCommon - - type: entity save: false name: Urist McHands diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index 471801f3a1f..6e5362d9bbb 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -92,7 +92,6 @@ - type: GuideHelp guides: - Robotics - - type: CanWalk - type: entity id: MechRipley From a6237f3b75e60a7b4da86c10631aa04eb66ada0c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 08:31:14 +0000 Subject: [PATCH 031/143] Automatic Changelog Update (#485) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ceed259c0b0..3f14b7df941 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4752,3 +4752,11 @@ Entries: message: Prevent dionas and harpies from selecting shoes in Loadouts. id: 6195 time: '2024-08-01T02:37:45.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + The station's crew hivemind has decided to slow down their movement and + enjoy The Park instead of sprinting everywhere + id: 6196 + time: '2024-08-01T08:30:47.0000000+00:00' From 94098c6f7f6dffbc58f47bc003d3a1a3f94b4a2c Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 1 Aug 2024 17:12:49 -0400 Subject: [PATCH 032/143] Move Survival Boxes To Loadouts (#634) # Description Survival boxes take up a shitload of space, and very few people actually want them. Most people take the Epipen and Spacepen out, and throw the box away immediately on roundstart. Having survival boxes automatically in the backpack causes issues when Loadouts contain "large items", causing most or all of a person's loadout to be dumped on the floor at roundstart. While that isn't completely unavoidable, moving survival boxes to loadouts will go a long way towards ameliorating said issue. I intentionally omitted removing survival boxes from antagonist bags because we currently don't have antag character slots and loadouts. In the future when we have that update, we can remove survival boxes from the nukie bags too. # Changelog :cl: - add: Survival Boxes have been added to loadouts. --- .../Fills/Backpacks/StarterGear/backpack.yml | 51 ------------- .../Fills/Backpacks/StarterGear/duffelbag.yml | 54 +------------- .../Fills/Backpacks/StarterGear/satchel.yml | 53 +------------ .../Fills/Backpacks/StarterGear/backpack.yml | 3 - .../Fills/Backpacks/StarterGear/duffelbag.yml | 3 - .../Fills/Backpacks/StarterGear/satchel.yml | 3 - .../Clothing/Back/backpacks.yml/backpacks.yml | 1 - .../Clothing/Back/backpacks.yml/duffelbag.yml | 1 - .../Clothing/Back/backpacks.yml/satchel.yml | 1 - Resources/Prototypes/Loadouts/items.yml | 74 +++++++++++++++++++ .../Fills/Backpacks/StarterGear/backpack.yml | 1 - .../Fills/Backpacks/StarterGear/duffelbag.yml | 1 - .../Fills/Backpacks/StarterGear/satchel.yml | 1 - 13 files changed, 76 insertions(+), 171 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml index 2e09906b13e..4d33ec98a90 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -2,10 +2,6 @@ parent: ClothingBackpack id: ClothingBackpackFilled noSpawn: true - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -25,7 +21,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash # - id: MagazinePistol # DeltaV - Security doesn't get an extra mag @@ -36,7 +31,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: ForensicPad - id: ForensicScanner @@ -45,10 +39,6 @@ noSpawn: true parent: ClothingBackpackMedical id: ClothingBackpackMedicalFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -57,7 +47,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - type: entity @@ -67,7 +56,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- name: StationCharter #- name: TelescopicBaton @@ -78,7 +66,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalEngineering - id: Flash #- id: TelescopicBaton @@ -89,7 +76,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -100,7 +86,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -111,7 +96,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: Flash #- id: TelescopicBaton @@ -122,7 +106,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -133,7 +116,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: MagazinePistol @@ -141,37 +123,21 @@ noSpawn: true parent: ClothingBackpackEngineering id: ClothingBackpackEngineeringFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackAtmospherics id: ClothingBackpackAtmosphericsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackScience id: ClothingBackpackScienceFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackHydroponics id: ClothingBackpackHydroponicsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -180,17 +146,12 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampMime - type: entity noSpawn: true parent: ClothingBackpackChemistry id: ClothingBackpackChemistryFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -199,7 +160,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Bible - id: RubberStampChaplain @@ -210,7 +170,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: AcousticGuitarInstrument - id: SaxophoneInstrument @@ -221,7 +180,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BookRandom - type: entity @@ -231,7 +189,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Lighter - id: CigPackBlack - id: HandLabeler @@ -372,19 +329,11 @@ noSpawn: true parent: ClothingBackpackCargo id: ClothingBackpackCargoFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSalvage id: ClothingBackpackSalvageFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival # Pirate diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index f7ad973b842..3cac13ab53e 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -2,10 +2,6 @@ noSpawn: true parent: ClothingBackpackDuffel id: ClothingBackpackDuffelFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -14,7 +10,6 @@ components: - type: StorageFill contents: - - id: BoxHug - id: RubberStampClown - type: entity @@ -24,7 +19,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash # - id: MagazinePistol # DeltaV - Security doesn't get an extra mag @@ -35,7 +29,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: ForensicPad - id: ForensicScanner @@ -53,10 +46,6 @@ noSpawn: true parent: ClothingBackpackDuffelMedical id: ClothingBackpackDuffelMedicalFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -65,7 +54,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - type: entity @@ -75,10 +63,10 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- name: StationCharter #- name: TelescopicBaton + - type: entity noSpawn: true parent: ClothingBackpackDuffelEngineering @@ -86,7 +74,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalEngineering - id: Flash #- id: TelescopicBaton @@ -97,7 +84,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -108,7 +94,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -119,7 +104,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: Flash #- id: TelescopicBaton @@ -130,7 +114,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -141,7 +124,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: MagazinePistol @@ -149,38 +131,21 @@ noSpawn: true parent: ClothingBackpackDuffelEngineering id: ClothingBackpackDuffelEngineeringFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackDuffelAtmospherics id: ClothingBackpackDuffelAtmosphericsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - - type: entity noSpawn: true parent: ClothingBackpackDuffelScience id: ClothingBackpackDuffelScienceFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackDuffelHydroponics id: ClothingBackpackDuffelHydroponicsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -189,17 +154,12 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampMime - type: entity noSpawn: true parent: ClothingBackpackDuffelChemistry id: ClothingBackpackDuffelChemistryFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -208,7 +168,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Bible - id: RubberStampChaplain @@ -219,7 +178,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: AcousticGuitarInstrument - id: SaxophoneInstrument @@ -230,7 +188,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BookRandom - type: entity @@ -240,7 +197,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Lighter - id: CigPackBlack - id: BoxForensicPad @@ -250,16 +206,8 @@ noSpawn: true parent: ClothingBackpackDuffelCargo id: ClothingBackpackDuffelCargoFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackDuffelSalvage id: ClothingBackpackDuffelSalvageFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 1a3dda66487..89ae8fdf477 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -2,10 +2,6 @@ noSpawn: true parent: ClothingBackpackSatchel id: ClothingBackpackSatchelFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -14,7 +10,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Crowbar - id: Wrench - id: Screwdriver @@ -38,7 +33,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash # - id: MagazinePistol # DeltaV - Security doesn't get an extra mag @@ -49,7 +43,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: ForensicPad - id: ForensicScanner @@ -67,10 +60,6 @@ noSpawn: true parent: ClothingBackpackSatchelMedical id: ClothingBackpackSatchelMedicalFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -79,7 +68,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - type: entity @@ -89,10 +77,10 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- name: StationCharter #- name: TelescopicBaton + - type: entity noSpawn: true parent: ClothingBackpackSatchelEngineering @@ -100,7 +88,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalEngineering - id: Flash #- id: TelescopicBaton @@ -111,7 +98,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -122,7 +108,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -133,7 +118,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: Flash #- id: TelescopicBaton @@ -144,7 +128,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Flash #- id: TelescopicBaton @@ -155,7 +138,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: Flash - id: MagazinePistol @@ -163,46 +145,26 @@ noSpawn: true parent: ClothingBackpackSatchelEngineering id: ClothingBackpackSatchelEngineeringFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackSatchelAtmospherics id: ClothingBackpackSatchelAtmosphericsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalEngineering - type: entity noSpawn: true parent: ClothingBackpackSatchelScience id: ClothingBackpackSatchelScienceFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSatchelHydroponics id: ClothingBackpackSatchelHydroponicsFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSatchelChemistry id: ClothingBackpackSatchelChemistryFilled - components: - - type: StorageFill - contents: - - id: BoxSurvivalMedical - type: entity noSpawn: true @@ -211,7 +173,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: Bible - id: RubberStampChaplain @@ -222,7 +183,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: AcousticGuitarInstrument - id: SaxophoneInstrument @@ -233,7 +193,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BookRandom - type: entity @@ -243,7 +202,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: BoxForensicPad - id: Lighter - id: CigPackBlack @@ -253,19 +211,11 @@ noSpawn: true parent: ClothingBackpackSatchelCargo id: ClothingBackpackSatchelCargoFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true parent: ClothingBackpackSatchelSalvage id: ClothingBackpackSatchelSalvageFilled - components: - - type: StorageFill - contents: - - id: BoxSurvival - type: entity noSpawn: true @@ -274,7 +224,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampMime - type: entity diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml index dcde538f9cd..b73c1d5b4fc 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -18,7 +18,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib @@ -30,7 +29,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: RubberStampPsychologist @@ -41,5 +39,4 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampLawyer diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index 4aa423e0aed..50ef77a316f 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib @@ -17,7 +16,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: RubberStampPsychologist @@ -28,5 +26,4 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampLawyer diff --git a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 1ef1441b3b9..99a770e37e1 100644 --- a/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/DeltaV/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib @@ -17,7 +16,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalMedical - id: RubberStampPsychologist @@ -28,5 +26,4 @@ components: - type: StorageFill contents: - - id: BoxSurvival - id: RubberStampLawyer diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml index 38bbd956868..2fbc17d2585 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/backpacks.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml index caf5aa3515b..bcd12b5e1b1 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/duffelbag.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml index 9c27500a1f7..31dc027a21e 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Back/backpacks.yml/satchel.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvivalSecurity - id: EmergencyRollerBedSpawnFolded - id: BodyBagFolded - id: Portafib diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 71c44d365d4..75c0461c106 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -190,6 +190,80 @@ items: - FireExtinguisher +- type: loadout + id: LoadoutItemBoxSurvival + category: Items + cost: 2 #All survival kits are intentionally cheaper than their contents to help encourage people to buy them. The contents can be bought separately to save space, or as spares + items: + - BoxSurvival + requirements: + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Security + - Medical + - Engineering + - Epistemics + - !type:CharacterJobRequirement + inverted: true + jobs: + - Clown + +- type: loadout + id: LoadoutItemBoxSurvivalEngineering + category: Items + cost: 2 + items: + - BoxSurvivalEngineering + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Engineering + +- type: loadout + id: LoadoutItemBoxSurvivalSecurity + category: Items + cost: 2 + items: + - BoxSurvivalSecurity + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Security + +- type: loadout + id: LoadoutItemBoxSurvivalBrigmedic + category: Items + cost: 2 + items: + - BoxSurvivalBrigmedic + requirements: + - !type:CharacterJobRequirement + jobs: + - Brigmedic + +- type: loadout + id: LoadoutItemBoxSurvivalMedical + category: Items + cost: 2 + items: + - BoxSurvivalMedical + requirements: + - !type:CharacterDepartmentRequirement + departments: + - Medical + +- type: loadout + id: LoadoutItemBoxHug + category: Items + cost: 2 + items: + - BoxHug + requirements: + - !type:CharacterJobRequirement + jobs: + - Clown + #Misc Items - type: loadout id: LoadoutItemPAI diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml index d72e0dd7cd8..810f9ec03b6 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival # - id: BoxForensicPad # DeltaV - Mantis is no longer a Detective - id: HandLabeler - id: PillMindbreakerToxin diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index 982b820ad10..88e33cdd252 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival # - id: BoxForensicPad # DeltaV - Mantis is no longer a Detective - id: HandLabeler - id: PillMindbreakerToxin diff --git a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 5644f36c9ce..e90759ac8fb 100644 --- a/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/Nyanotrasen/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -5,7 +5,6 @@ components: - type: StorageFill contents: - - id: BoxSurvival # - id: BoxForensicPad # DeltaV - Mantis is no longer a Detective - id: HandLabeler - id: PillMindbreakerToxin From 11524d85723904027329509deb254420f48d7345 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 21:13:17 +0000 Subject: [PATCH 033/143] Automatic Changelog Update (#634) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3f14b7df941..103a69c104a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4760,3 +4760,9 @@ Entries: enjoy The Park instead of sprinting everywhere id: 6196 time: '2024-08-01T08:30:47.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: 'Survival Boxes have been added to loadouts. ' + id: 6197 + time: '2024-08-01T21:12:49.0000000+00:00' From dfdae62c84acb665228cfa0916092ecaabd312e2 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 1 Aug 2024 17:55:09 -0400 Subject: [PATCH 034/143] Make Boxes Not Useless (#635) # Description Subcontainers such as Boxes, Medkits, and Lunchboxes are essentially useless items that players always throw away. The given reason for this is that because the boxes only ever provided the same or less inventory slots than the inventory slots they take away, using boxes only ever penalizes players. Since you can only ever open one container at a time, placing items in boxes means you have to first open your backpack, then open the box, then take the item out. How it SHOULD work instead, is that boxes contain slightly more inventory slots than what they remove. You would effectively be trading the ability to quickly and efficiently access all your items, for having slightly more inventory capacity. This PR buffs the parent of four different categories of items, such that 3x3 boxes occupy 9 inventory spaces and provide 16 spaces, and 2x4 boxes occupy 8 spaces and provide 12 spaces. The difference accounts for 3x3 boxes being significantly more inventory-awkward to put in your backpack than the 2x4 containers. Toolboxes are unchanged because they're already huge, and don't fit in backpacks anyway. Here's a demonstration of inventory management with a backpack full of boxes. https://github.com/user-attachments/assets/40b184f6-b061-4f0a-8e8b-7e2a7b9793bc # Changelog :cl: - add: Boxes(Cardboard, Medkits, Lunchboxes) now contain slightly more inventory slots than they occupy. --- Resources/Prototypes/Catalog/Fills/Boxes/general.yml | 2 +- .../Objects/Consumable/Food/Containers/lunchbox.yml | 6 +++--- .../Entities/Objects/Specific/Medical/medkits.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml index e4181d27a21..59a9e8d0056 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml @@ -11,7 +11,7 @@ - type: Storage maxItemSize: Small grid: - - 0,0,2,2 + - 0,0,3,3 - type: Sprite state: box - type: EmitSoundOnPickup diff --git a/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml b/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml index 46e689615b3..c7aae33c76d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml +++ b/Resources/Prototypes/DeltaV/Entities/Objects/Consumable/Food/Containers/lunchbox.yml @@ -18,9 +18,9 @@ - type: Storage maxItemSize: Normal grid: - - 0,0,1,1 - - 3,0,1,1 - - 4,0,4,1 + - 0,0,1,2 + - 3,0,1,2 + - 4,0,4,2 - type: PhysicalComposition materialComposition: Plastic: 100 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml index d7f2231ec99..62e5ab44762 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml @@ -10,7 +10,7 @@ - type: Storage maxItemSize: Small grid: - - 0,0,3,1 + - 0,0,3,2 - type: Item size: Large sprite: Objects/Specific/Medical/firstaidkits.rsi From 437ac5ae2eccbe18645a210531563c1f746db841 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 21:55:34 +0000 Subject: [PATCH 035/143] Automatic Changelog Update (#635) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 103a69c104a..8ef76bac30b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4766,3 +4766,11 @@ Entries: message: 'Survival Boxes have been added to loadouts. ' id: 6197 time: '2024-08-01T21:12:49.0000000+00:00' +- author: VMSolidus + changes: + - type: Add + message: >- + Boxes(Cardboard, Medkits, Lunchboxes) now contain slightly more + inventory slots than they occupy. + id: 6198 + time: '2024-08-01T21:55:09.0000000+00:00' From 6bc8b60bff4d9d7c9d658ad0644e18b1fa07aaea Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Thu, 1 Aug 2024 18:41:23 -0400 Subject: [PATCH 036/143] "Buff" Vision Traits (#636) # Description This takes Ultravision, Dogvision, and Normalvision, making all 3 traits into our first set of "Neutral" traits. They now cost 0 points, but still occupy one of the 5 trait selections. In the future we should have a decent roster of Positive, Neutral, and Negative traits. If Death ever finishes making Subcategories, we'll probably want to have Positive, Neutral, and Negative be the 3 "Main" categories, and all subcategories sit underneath them.

Media

Token screenshot for a 3 line PR because my maintainers will get onto me if I don't include some kind of media. :trollface: ![image](https://github.com/user-attachments/assets/27a7feea-a347-41bf-ae01-099eb84ed7af)

# Changelog :cl: - tweak: Ultraviolet Vision, Deuteranopia, and Trichromat Modification are all now 0 point Neutral traits. They still occupy one of your trait selections. --------- Signed-off-by: VMSolidus Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Resources/Prototypes/DeltaV/Traits/altvision.yml | 2 -- Resources/Prototypes/Traits/neutral.yml | 1 - 2 files changed, 3 deletions(-) diff --git a/Resources/Prototypes/DeltaV/Traits/altvision.yml b/Resources/Prototypes/DeltaV/Traits/altvision.yml index 97742d98ce5..390e14d4ad1 100644 --- a/Resources/Prototypes/DeltaV/Traits/altvision.yml +++ b/Resources/Prototypes/DeltaV/Traits/altvision.yml @@ -1,7 +1,6 @@ - type: trait id: UltraVision category: Visual - points: -1 requirements: - !type:CharacterSpeciesRequirement inverted: true @@ -18,7 +17,6 @@ - type: trait id: DogVision category: Visual - points: -1 requirements: - !type:CharacterSpeciesRequirement inverted: true diff --git a/Resources/Prototypes/Traits/neutral.yml b/Resources/Prototypes/Traits/neutral.yml index 28f6adc170a..ab5bcb238d7 100644 --- a/Resources/Prototypes/Traits/neutral.yml +++ b/Resources/Prototypes/Traits/neutral.yml @@ -31,7 +31,6 @@ - type: trait id: NormalVision category: Visual - points: -1 requirements: - !type:CharacterSpeciesRequirement species: From 0d1c9310cbe2fe2966e1a23cb98e1f5390fbd5f0 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 22:41:49 +0000 Subject: [PATCH 037/143] Automatic Changelog Update (#636) --- Resources/Changelog/Changelog.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 8ef76bac30b..3751e787af1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4774,3 +4774,12 @@ Entries: inventory slots than they occupy. id: 6198 time: '2024-08-01T21:55:09.0000000+00:00' +- author: VMSolidus + changes: + - type: Tweak + message: >- + Ultraviolet Vision, Deuteranopia, and Trichromat Modification are all + now 0 point Neutral traits. They still occupy one of your trait + selections. + id: 6199 + time: '2024-08-01T22:41:24.0000000+00:00' From c96cfcc2dbfe1de2d2e041a3dc8440903d7efaeb Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Fri, 2 Aug 2024 06:45:13 +0800 Subject: [PATCH 038/143] More Loadout Items: Wave 3 (#633) # Description Adds some useful items in the Items category and unused clothes into Loadouts. There are nine suits from Delta-V that were meant for a planned Mafia gamemode, but otherwise, they are unused. These suits were made by @TadJohnson00. I renamed some of the mobster suits to lessen the association with and added them to Loadouts. There is an "inspector's coat" in-game not used anywhere, that has been renamed to "slim trench coat" and added to Loadouts. Adds labels to survival boxes in the Loadouts UI to be able to distinguish against them. ## New Items ### Uniform Security (except HoS) can only select items marked with (*). - [2] black suit (*) - [2] dark suit (*) - [2] red suit (*) - [2] brown suit - Security doesn't have this as a Security Officer wearing this might be confused for the Detective. - [2] dubious suit (*) - [2] mafioso suit (*) - [2] white suit - [2] negative suit (*) - [2] gangster suit (*) ## Outer - [3] slim trench coat - [4] overcoat - More expensive than other coats due to its increased resistance to Slashing (10%) and Hea (25%). ## Items - [1] book [Random] - [1] water bottle - [1] space medipen - [1] emergency medipen - [1] folder [grey] - [1] breath mask - [1] emergency flare - [1] paper - This item gives four pieces of paper instead of one, as indicated in the loadout description. - [1] pen - [2] flashlight - [2] pipe - [3] flippo lighter - [3] pre-packed lunchbox [Filled, Random] ### Medkits Each medkit is only accessible to Medical (except Chemist) and Corpsman unless specified otherwise. - [4] first aid kit - Selectable by every role. - [4] brute trauma treatment kit - [4] burn treatment kit - [4] combat medical kit - Selectable only by Chief Medical Officer and Corpsman. - [4] oxygen deprivation treatment kit - [4] radiation treatment kit - [4] toxin treatment kit - [5] advanced first aid kit

Media

## Survival box labels ![image](https://github.com/user-attachments/assets/4eab5ed4-51a1-4784-a9d5-f41b76e35365) ## Mobster suits ![image](https://github.com/user-attachments/assets/c7b8a1dd-c243-4b9d-9973-860d8810b793) ## Vintage ![image](https://github.com/user-attachments/assets/09e4dc1e-bfeb-46d1-80d8-da4338b5348e) **Loadout:** black cowboy hat, **pipe**, **dubious suit**, **slim trench coat**, laceup shoes ## Dapper Cop ![image](https://github.com/user-attachments/assets/2b6fbe0d-b00a-4d20-ba8f-c1a766cda392) **Loadout:** white fedora, security hud, **pipe**, **gangster suit**, striped red scarf, white gloves ## Biker ![image](https://github.com/user-attachments/assets/f4ca8fe0-e600-42cd-83d7-070b57d57b46) **Loadout:** cheap sunglasses, **brown suit**, MNK black jacket, black gloves, black cowboy boots

--- # Changelog :cl: Skubman - add: Added new clothes in Loadouts: slim trench coat, and Mafia-style suits. - add: Added new useful items in Loadouts: lunchbox, more survival gear, paperwork, and medkits. --------- Signed-off-by: Angelo Fallaria --- Resources/Locale/en-US/loadouts/items.ftl | 22 ++ .../Entities/Clothing/Uniforms/jumpsuits.yml | 14 +- .../Entities/Clothing/OuterClothing/coats.yml | 4 +- Resources/Prototypes/Loadouts/items.yml | 217 +++++++++++++++++- .../Prototypes/Loadouts/outerClothing.yml | 14 ++ Resources/Prototypes/Loadouts/uniform.yml | 156 +++++++++++++ 6 files changed, 415 insertions(+), 12 deletions(-) diff --git a/Resources/Locale/en-US/loadouts/items.ftl b/Resources/Locale/en-US/loadouts/items.ftl index b92f56bc7cb..c2ec9a1c847 100644 --- a/Resources/Locale/en-US/loadouts/items.ftl +++ b/Resources/Locale/en-US/loadouts/items.ftl @@ -13,3 +13,25 @@ loadout-description-LoadoutItemPlushieSharkGrey = Introducing the Grey Shark Plu loadout-description-LoadoutItemPlushieCarp = Brace for extraterrestrial antics with the Purple Space Carp Plushie! A fishy invader from the cosmic deep, this plushie brings a splash of humor to zero-gravity escapades. From hostile waters to interstellar giggles, it's a cuddly contradiction that's out of this world loadout-description-LoadoutSolCommonTranslator = The most common of all translators, such that it can be purchased in any civilized station. This device translates Sol Common speech into Galactic Common. +loadout-name-LoadoutItemPapers = papers (x4) +loadout-description-LoadoutItemPapers = four pieces of paper, good for filling out tedious paperwork and silent communication. +loadout-description-LoadoutItemBoxFolderGrey = A folder to store papers and top secret documents. +loadout-description-LoadoutBookRandom = A notebook with a random cover. Can be used as a diary, or for writing fanfiction drafts for SpacePad. +loadout-description-LoadoutPen = An extra pen, just in case your pen from your PDA gets robbed by skeletal space pirates. +loadout-description-LoadoutItemLunchboxGenericFilledRandom = Packed with love. + This is only useful when the chefs are either a.) nonexistent or b.) not doing their job. + In conclusion, this lunchbox is useful most of the time. +loadout-description-LoadoutHandLabeler = A hand labeler, used to label items and objects. + It's not really recommended to use this to label a fuel tank with "SOLUTION TO CLOWN PROBLEM". +loadout-description-LoadoutEmergencyMedipen = A rapid and safe way to stabilize patients in critical condition for personnel without advanced medical knowledge. + WARNING: injecting two emergency medipens at once will cause an epinephrine overdose. +loadout-description-LoadoutSpaceMedipen = Contains a mix of chemicals that protect you from the deadly effects of space. + Also known as the "poor man's hardsuit". + WARNING: injecting two space medipens at once will cause a barozine overdose. + +loadout-name-LoadoutItemBoxSurvival = survival box (standard) +loadout-name-LoadoutItemBoxSurvivalEngineering = extended-capacity survival box (engineering) +loadout-name-LoadoutItemBoxSurvivalSecurity = survival box (security) +loadout-name-LoadoutItemBoxSurvivalBrigmedic = survival box (corpsman) +loadout-name-LoadoutItemBoxSurvivalMedical = survival box (medical) +loadout-name-LoadoutItemBoxHug = box of hugs (clown) diff --git a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml index 99021b47e42..8a0a500e6fa 100644 --- a/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/DeltaV/Entities/Clothing/Uniforms/jumpsuits.yml @@ -45,8 +45,8 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitBlackMob - name: mobster's attire - description: A crisp red shirt and charcoal slacks. Reminds you of your debts. + name: red suit + description: A crisp red shirt and charcoal slacks. Reminds you of law enforcement. components: - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/suitblackmob.rsi @@ -67,7 +67,7 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitBrownAlt - name: suspicious suit + name: dubious suit description: A crisp grey shirt and chocolate slacks. Reminds you of clandestine operators. components: - type: Sprite @@ -78,8 +78,8 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitBrownMob - name: gangster's attire - description: A crisp red shirt and chocolate slacks. Reminds you of drivebys. + name: mafioso suit + description: A crisp red shirt and chocolate slacks. Reminds you of family. components: - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/suitbrownmob.rsi @@ -111,8 +111,8 @@ - type: entity parent: ClothingUniformBase id: ClothingUniformJumpsuitSuitWhiteMob - name: mafioso's attire - description: A crisp red shirt and ivory slacks. Reminds you of family. + name: gangster suit + description: A crisp red shirt and ivory slacks. Reminds you of organized Japanese crime. components: - type: Sprite sprite: DeltaV/Clothing/Uniforms/Jumpsuit/suitwhitemob.rsi diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml index c78a5f9bdb5..a47a2bbcebc 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/coats.yml @@ -66,8 +66,8 @@ - type: entity parent: ClothingOuterStorageBase id: ClothingOuterCoatInspector - name: inspector's coat - description: A strict inspector's coat for being intimidating during inspections. + name: slim trench coat + description: A slim minimalist trench coat best worn unbuttoned. components: - type: Sprite sprite: Clothing/OuterClothing/Coats/insp_coat.rsi diff --git a/Resources/Prototypes/Loadouts/items.yml b/Resources/Prototypes/Loadouts/items.yml index 75c0461c106..e09d02c463a 100644 --- a/Resources/Prototypes/Loadouts/items.yml +++ b/Resources/Prototypes/Loadouts/items.yml @@ -63,11 +63,18 @@ - CheapLighter - type: loadout - id: LoadoutItemMatches + id: LoadoutItemLighterFlippo category: Items - cost: 1 + cost: 3 + items: + - FlippoLighter + +- type: loadout + id: LoadoutItemSmokingPipeFilledTobacco + category: Items + cost: 2 items: - - Matchbox + - SmokingPipeFilledTobacco # Instruments - type: loadout @@ -176,6 +183,13 @@ items: - DoubleEmergencyOxygenTankFilled +- type: loadout + id: LoadoutItemClothingMaskBreath + category: Items + cost: 1 + items: + - ClothingMaskBreath + - type: loadout id: LoadoutItemsEmergencyCrowbar category: Items @@ -190,6 +204,82 @@ items: - FireExtinguisher +- type: loadout + id: LoadoutItemFlashlightLantern + category: Items + cost: 2 + items: + - FlashlightLantern + +- type: loadout + id: LoadoutItemFlare + category: Items + cost: 1 + items: + - Flare + +- type: loadout + id: LoadoutEmergencyMedipen + category: Items + cost: 1 + items: + - EmergencyMedipen + +- type: loadout + id: LoadoutSpaceMedipen + category: Items + cost: 1 + items: + - SpaceMedipen + +# Paperwork +- type: loadout + id: LoadoutItemPapers + category: Items + cost: 1 + items: + - Paper + - Paper + - Paper + - Paper + +- type: loadout + id: LoadoutItemBoxFolderGrey + category: Items + cost: 1 + items: + - BoxFolderGrey + +- type: loadout + id: LoadoutBookRandom + category: Items + cost: 1 + items: + - BookRandom + +- type: loadout + id: LoadoutPen + category: Items + cost: 1 + items: + - Pen + +# Food and drink +- type: loadout + id: LoadoutDrinkWaterBottleFull + category: Items + cost: 1 + items: + - DrinkWaterBottleFull + +- type: loadout + id: LoadoutItemLunchboxGenericFilledRandom + category: Items + cost: 3 + items: + - LunchboxGenericFilledRandom + +# Survival boxes - type: loadout id: LoadoutItemBoxSurvival category: Items @@ -230,6 +320,10 @@ - !type:CharacterDepartmentRequirement departments: - Security + - !type:CharacterJobRequirement + inverted: true + jobs: + - Brigmedic - type: loadout id: LoadoutItemBoxSurvivalBrigmedic @@ -264,6 +358,116 @@ jobs: - Clown +# Medkits +- type: loadout + id: LoadoutMedkitFilled + category: Items + cost: 4 + items: + - MedkitFilled + +- type: loadout + id: LoadoutMedkitBruteFilled + category: Items + cost: 4 + items: + - MedkitBruteFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitBurnFilled + category: Items + cost: 4 + items: + - MedkitBurnFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitToxinFilled + category: Items + cost: 4 + items: + - MedkitToxinFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitOxygenFilled + category: Items + cost: 4 + items: + - MedkitOxygenFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitRadiationFilled + category: Items + cost: 4 + items: + - MedkitRadiationFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitAdvancedFilled + category: Items + cost: 5 + items: + - MedkitAdvancedFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - MedicalDoctor + - Paramedic + - ChiefMedicalOfficer + - MedicalIntern + - Brigmedic + +- type: loadout + id: LoadoutMedkitCombatFilled + category: Items + cost: 4 # Discounted for the CMO and Corpsman + items: + - MedkitCombatFilled + requirements: + - !type:CharacterJobRequirement + jobs: + - ChiefMedicalOfficer + - Brigmedic + #Misc Items - type: loadout id: LoadoutItemPAI @@ -316,3 +520,10 @@ cost: 3 items: - SolCommonTranslator + +- type: loadout + id: LoadoutHandLabeler + category: Items + cost: 3 + items: + - HandLabeler diff --git a/Resources/Prototypes/Loadouts/outerClothing.yml b/Resources/Prototypes/Loadouts/outerClothing.yml index 38ba17b6a3b..da091412b6c 100644 --- a/Resources/Prototypes/Loadouts/outerClothing.yml +++ b/Resources/Prototypes/Loadouts/outerClothing.yml @@ -225,3 +225,17 @@ cost: 3 items: - ClothingOuterCoatGentle + +- type: loadout + id: LoadoutOuterCoatInspector + category: Outer + cost: 3 + items: + - ClothingOuterCoatInspector + +- type: loadout + id: LoadoutOuterCoatOvercoat + category: Outer + cost: 4 + items: + - ClothingOuterCoatOvercoat diff --git a/Resources/Prototypes/Loadouts/uniform.yml b/Resources/Prototypes/Loadouts/uniform.yml index 090a0957a92..5843cb30ee5 100644 --- a/Resources/Prototypes/Loadouts/uniform.yml +++ b/Resources/Prototypes/Loadouts/uniform.yml @@ -1360,3 +1360,159 @@ inverted: true departments: - Command + +# Suits +- type: loadout + id: LoadoutClothingJumpsuitSuitBlack + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBlack + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBlackAlt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBlackAlt + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBlackMob + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBlackMob + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBrown + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBrown + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + - Security + +- type: loadout + id: LoadoutClothingJumpsuitSuitBrownAlt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBrownAlt + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitBrownMob + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitBrownMob + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitWhite + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitWhite + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + - Security + +- type: loadout + id: LoadoutClothingJumpsuitSuitWhiteAlt + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitWhiteAlt + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command + +- type: loadout + id: LoadoutClothingJumpsuitSuitWhiteMob + category: Uniform + cost: 2 + exclusive: true + items: + - ClothingUniformJumpsuitSuitWhiteMob + requirements: + - !type:CharacterSpeciesRequirement + inverted: true + species: + - Harpy + - !type:CharacterDepartmentRequirement + inverted: true + departments: + - Command From adafe4a09b7df1de5ebdc25d72c9e144491b9002 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 22:45:37 +0000 Subject: [PATCH 039/143] Automatic Changelog Update (#633) --- Resources/Changelog/Changelog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 3751e787af1..d2d1007a290 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4783,3 +4783,13 @@ Entries: selections. id: 6199 time: '2024-08-01T22:41:24.0000000+00:00' +- author: Skubman + changes: + - type: Add + message: 'Added new clothes in Loadouts: slim trench coat, and Mafia-style suits.' + - type: Add + message: >- + Added new useful items in Loadouts: lunchbox, more survival gear, + paperwork, and medkits. + id: 6200 + time: '2024-08-01T22:45:13.0000000+00:00' From 1481146f641a2514cf28990dcf8b1576b1042c6a Mon Sep 17 00:00:00 2001 From: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Date: Fri, 2 Aug 2024 01:06:24 +0200 Subject: [PATCH 040/143] Vulpkanin Tail Wagging (#588) # Description Add the ability for Vulpkanins to wag their tails like Lizards and add a far better icon for tail wagging making it not look like only action. ---

Media

![image](https://github.com/user-attachments/assets/6ed28a22-81ac-494c-bc18-92b5f7ae8ecb) ![image](https://github.com/user-attachments/assets/d3f976b1-d680-4181-a645-8e84a071e6cf)

--- # Changelog :cl: - add: Vulpkanins can wag their tails now --------- Signed-off-by: FoxxoTrystan <45297731+FoxxoTrystan@users.noreply.github.com> Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- Content.Server/Wagging/WaggingSystem.cs | 2 + .../en-US/deltav/markings/vulpkanin.ftl | 32 ++------- Resources/Prototypes/Actions/types.yml | 4 +- .../Mobs/Customization/Markings/vulpkanin.yml | 66 +++++++++++------- .../Entities/Mobs/Species/vulpkanin.yml | 1 + .../Vulpkanin/tail_markings.rsi/corgi.png | Bin 0 -> 206 bytes .../Vulpkanin/tail_markings.rsi/dalmatian.png | Bin 0 -> 276 bytes .../Vulpkanin/tail_markings.rsi/meta.json | 8 +++ .../Interface/Actions/wagging.rsi/icon-on.png | Bin 0 -> 1783 bytes .../Interface/Actions/wagging.rsi/icon.png | Bin 0 -> 1283 bytes .../Interface/Actions/wagging.rsi/meta.json | 17 +++++ 11 files changed, 77 insertions(+), 53 deletions(-) create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/corgi.png create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/dalmatian.png create mode 100644 Resources/Textures/Interface/Actions/wagging.rsi/icon-on.png create mode 100644 Resources/Textures/Interface/Actions/wagging.rsi/icon.png create mode 100644 Resources/Textures/Interface/Actions/wagging.rsi/meta.json diff --git a/Content.Server/Wagging/WaggingSystem.cs b/Content.Server/Wagging/WaggingSystem.cs index 7ccc19e20c6..ed2747da198 100644 --- a/Content.Server/Wagging/WaggingSystem.cs +++ b/Content.Server/Wagging/WaggingSystem.cs @@ -65,6 +65,8 @@ public bool TryToggleWagging(EntityUid uid, WaggingComponent? wagging = null, Hu wagging.Wagging = !wagging.Wagging; + _actions.SetToggled(wagging.ActionEntity, wagging.Wagging); + for (var idx = 0; idx < markings.Count; idx++) // Animate all possible tails { var currentMarkingId = markings[idx].MarkingId; diff --git a/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl b/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl index 857cc711570..d23dd4d346a 100644 --- a/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl +++ b/Resources/Locale/en-US/deltav/markings/vulpkanin.ftl @@ -102,14 +102,6 @@ marking-VulpTailTip-vulp = Vulpkanin tail (base) marking-VulpTailTip-vulp-tip = Vulpkanin tail (tip) marking-VulpTailTip = Vulpkanin (tip) -marking-VulpTailWag-vulp_wag = Vulpkanin tail (base) -marking-VulpTailWag-vulp_wag-fade = Vulpkanin tail (fade) -marking-VulpTailWag = Vulpkanin (wag) - -marking-VulpTailWagTip-vulp_wag = Vulpkanin tail (base) -marking-VulpTailWagTip-vulp_wag-tip = Vulpkanin tail (tip) -marking-VulpTailWagTip = Vulpkanin (wag, tip) - marking-VulpTailAlt-vulp_alt = Vulpkanin tail (base) marking-VulpTailAlt-vulp_alt-fade = Vulpkanin tail (fade) marking-VulpTailAlt = Vulpkanin (alt) @@ -130,29 +122,12 @@ marking-VulpTailFoxTip-fox = Fox tail (base) marking-VulpTailFoxTip-fox-tip = Fox tail (fade) marking-VulpTailFoxTip = Vulpkanin Fox (tip) -marking-VulpTailFoxWag-fox_wag = Fox tail (base) -marking-VulpTailFoxWag-fox_wag-fade = Fox tail (fade) -marking-VulpTailFoxWag = Vulpkanin Fox (wag) - -marking-VulpTailFoxWagTip-fox_wag = Fox tail (base) -marking-VulpTailFoxWagTip-fox_wag-tip = Fox tail (tip) -marking-VulpTailFoxWagTip = Vulpkanin Fox (wag, tip) - marking-VulpTailBushy-bushfluff = Bush tail marking-VulpTailBushy = Vulpkanin Bush -marking-VulpTailBushyWag-bushfluff_wag = Bush tail -marking-VulpTailBushyWag = Vulpkanin Bush (wag) - marking-VulpTailCoyote-coyote = Coyote tail marking-VulpTailCoyote = Vulpkanin Coyote -marking-VulpTailCoyoteWag-coyote_wag = Coyote tail -marking-VulpTailCoyoteWag = Vulpkanin Coyote (wag) - -marking-VulpTailCorgiWag-corgi_wag = Crogi tail -marking-VulpTailCorgiWag = Vulpkanin Corgi (wag) - marking-VulpTailHusky-husky-inner = Husky tail (inner) marking-VulpTailHusky-husky-outer = Husky tail (outer) marking-VulpTailHusky = Vulpkanin Husky @@ -176,8 +151,11 @@ marking-VulpTailOtie = Vulpkanin Otie marking-VulpTailFluffy-fluffy = Fluffy tail marking-VulpTailFluffy = Vulpkanin Fluffy -marking-VulpTailDalmatianWag-dalmatian_wag = Dalmatian tail -marking-VulpTailDalmatianWag = Vulpkanin Dalmatian (wag) +marking-VulpTailCorgi-corgi = Crogi tail +marking-VulpTailCorgi = Vulpkanin Corgi + +marking-VulpTailDalmatian-dalmatian = Dalmatian tail +marking-VulpTailDalmatian = Vulpkanin Dalmatian marking-VulpBellyCrest-belly_crest = Belly diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index f55f59daaa8..f5dff1f453a 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -345,8 +345,8 @@ noSpawn: true components: - type: InstantAction - icon: { sprite: Mobs/Customization/reptilian_parts.rsi, state: tail_smooth_behind } - iconOn: { sprite: Mobs/Customization/reptilian_parts.rsi, state: tail_smooth_behind } + icon: { sprite: Interface/Actions/wagging.rsi, state: icon } + iconOn: { sprite: Interface/Actions/wagging.rsi, state: icon-on } itemIconStyle: NoItem useDelay: 1 # emote spam event: !type:ToggleActionEvent diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml index 502ddf35498..69bbb2bd96d 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/vulpkanin.yml @@ -280,32 +280,32 @@ state: vulp-fade - type: marking - id: VulpTailTip + id: VulpTailAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp + state: vulp_wag - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp-tip + state: vulp_wag-tip #fade - type: marking - id: VulpTailWag + id: VulpTailTip bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp_wag + state: vulp - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: vulp_wag-tip #fade + state: vulp-tip - type: marking - id: VulpTailWagTip + id: VulpTailTipAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: vulp_wag @@ -357,32 +357,32 @@ state: fox-fade - type: marking - id: VulpTailFoxTip + id: VulpTailFoxAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox + state: fox_wag - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox-tip + state: fox_wag-fade - type: marking - id: VulpTailFoxWag + id: VulpTailFoxTip bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox_wag + state: fox - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi - state: fox_wag-fade + state: fox-tip - type: marking - id: VulpTailFoxWagTip + id: VulpTailFoxTipAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: fox_wag @@ -399,10 +399,10 @@ state: bushfluff - type: marking - id: VulpTailBushyWag + id: VulpTailBushyAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: bushfluff_wag @@ -417,19 +417,28 @@ state: coyote - type: marking - id: VulpTailCoyoteWag + id: VulpTailCoyoteAnimated bodyPart: Tail markingCategory: Tail - speciesRestriction: [Vulpkanin] + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: coyote_wag - type: marking - id: VulpTailCorgiWag + id: VulpTailCorgi bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] + sprites: + - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi + state: corgi + +- type: marking + id: VulpTailCorgiAnimated + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: corgi_wag @@ -502,10 +511,19 @@ state: fluffy - type: marking - id: VulpTailDalmatianWag + id: VulpTailDalmatian bodyPart: Tail markingCategory: Tail speciesRestriction: [Vulpkanin] + sprites: + - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi + state: dalmatian + +- type: marking + id: VulpTailDalmatianAnimated + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [] sprites: - sprite: DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi state: dalmatian_wag diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index 9e4f80bfb52..0bcd71fbadb 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -97,6 +97,7 @@ Female: FemaleVulpkanin Unsexed: MaleVulpkanin - type: DogVision + - type: Wagging - type: LanguageKnowledge speaks: - GalacticCommon diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/corgi.png b/Resources/Textures/DeltaV/Mobs/Customization/Vulpkanin/tail_markings.rsi/corgi.png new file mode 100644 index 0000000000000000000000000000000000000000..fc9cb1c89179400b4e6faeed4de434731954098e GIT binary patch literal 206 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!DLSt$B>G+x3?~G9#G(6b$A(b?v2R1t4b*i zZaInt?1~@tpM1XwRL9U@bWGy=s*1dwi>6k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`212l#}ze);kxD=X{%{rmg(?+1!K`JP`0q*zOW{DS`j0mJWYe8E5g&H|6f zVg?4j!ywFfJby(BP_Wk1#W5tp{q1x|z6Jvh7R?X;&83r;`mVTm)kWWWdQpSs9fv=v z^4v?lCNPvK+-hc#UHD{ilM%DlhJR`+7C11nGO~)Why(}(I5+}12jiOpzXdGVS@OQ= zsA8exJzjVAuB}Qtx2DhCTGTVg_^F@#?c8R+aOP`2nYc6x%I`CzmD}&T{Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D28>BWK~z{r?N>`o zQ&|{3wiHp3(pxAmpA-t{!U*^njZVT$9Vj^CLgQix%wFATOmtz?pr9L3qHD*&m|3_H z2tpJc6DQFKYJ7(l-(V>%#RretI^TD=t+y0(bS9b2e96guoO93l{?~WT760SE#x(W% zujAOUW4e)%k>qF3o{6JJk9yVDG5Bf%2M!!iaM6uFMIp3n*Dmkj!-o}v!EhrnF;RzW zNp*F#Q|*t!7ZcdOf4@@AsFE zj*j;3-Mcpn_nmj{-0|GHb*p5{mMu{v{x*Sw2M=b$o$WT8ExVwgK%}Lm33wug0IU~R zuU-}R@85U5diCnt+}vEB)oSg+cexiXTyWjKecO(?A|&Xt&w`7?_1Ow7s2N$Bb6DVsNMUgMM=KtfqC z0hz`u9twrTix)3MTU(p=+_`feHr~H{`7)&SL^wx)l(@J!1D~0w%oBhmtf8v`t%vKI z7cN|AWVUO;#h*WaE;>3ooG7;yj~+d;A;vabzqx$*@*ql29r-at0JS1IMyh^HN&rkP zaHj?C53`lvWV9R^?8oAzAliN8$Pr(CeZ3Dc?n5X-aCsyjXe}E+H%u&f>6#bjm(`iFMZ!uQ@&-?f91AJyb=K%&dB!&P6=&-06 z?LYyY7~rb#dz!D#fwEsN{aMa*jw-3z3cUQ zy#aWrsl2>gp;4$D_q}`f-26U<02ko|6BiGIeXugp3BtPR)2GXP!BxKF9JC&#hG_XK z)~;P^0Kp8-+11tM$M@x@PMwk-j3Jr5sSYgppYp+jEod{?eqaZ!xeu=9!T z?rtaU9gI8lB!jWtZdm#qNDN@%HtdK-?1C(;Fb zl&*E-#*GEgdox@|Qu@h4!3<}tVUY#>Qp>|22?`Uc#EL3ev17-MC)h*caIb?>_Mp$c zdGqF&0|^&nONM)su#dMaS+YbyoZZag@$h~GNl_c9kW@;o7YK%ALZ9o;{o-^5*x-hi@6eMi4g6ovPue?mf_?&e{pefIdXw2MMXyAPoF;3BUch2E|LVpLQfzUq$eOU>q|;Xn)!`7?Pn1ofWyQn1fvC3R$$}E zym;}V17T^re*O9|?tRFUUy%=|L8KH!;y@%Gc>o^cL`VW*G9f=42uCBrF|1DgNyMm4 zU0q#Ha&qzwHP+Vc+qZkvE{T2n_VI@#4QGZwacEIMQXbimxPny!74*RqHvFDNeK$FT Z_zPj&fN=@xoCN>?002ovPDHLkV1hR*VC(<@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/wagging.rsi/icon.png b/Resources/Textures/Interface/Actions/wagging.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6dbb54fe2f2c11ae06b1277aedd7306a29214ca0 GIT binary patch literal 1283 zcmV+e1^oJnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1ei%gK~z{r?N?b# zD@hnF6Zb77Y6KTtB5`{jbr2QAxn!L2=cp)%ps1iP`WFV~7r5Yps3SPctEi}xsEGTL z822^abJ|L7$4)2Fd*5abG~KD{uJ3&3TdE@d$A2C%^8R7;_xD?HGrau@g0Hi)(=DGP z;==@bdwWd=gTb1Tk}`px8Mt1Qi8mN=oj*N2Ia*s=U2j9-@gV|3LqoQ>xVXvW@h+(aZn$s&TrA^A*2MMZI4U7g6t$Po0N1bFvf{0)UfPEL-v zzrQzMUS75|Ha3pW%*=S?QW``gpf+AxTPqS16XlFPVq;?!64%$)X1CkjjPL%Ko11%( z(?JN8#Q`wplwHp_ z0`aCXB@BMxdvSh#o{0Hh>+9?PoSmJ$lT!icDu9HtVu37r@!q)4=M($;`(k=}+C4ft zdd7>-2L}f}wG#du0a&gfZG{}9_mFLd+ni74j=t?FSd5=aAA1;|>sY4i67|Mn*mR*jGhTh8s6tKqE*Vl#D>pg+Ar*c?9Zf>p>V+M5ys1|btIOk73 zyoZJW7BIkQMtppHP(pEGcqw*vcHAhh=I-upubfh<1-)UiprF9wSB&o;A0IPZULJ3Rmy(hae*y&{J@R=x9(tspudmO7_b2hbt+KLGWM*atIwIA&y}dobcPH|7 z4KxI3gbTbk?g!`KWndD74G9SeO1|K(jByQmzrDTfg<8LLb#(>QdJhc&b<9J7(!#qy zR>K%$OD`3}=zId@C{|Zj#ogWADc;xhp3o2o2U*t!v)RnLRxmg?=tfdH78e(}`6vx( zWo1P;oz5+8%i+8yq9#CP7~jIeLQ7g&+5~%roD%Kr?Jh|E1)Gj@YHI2dJ;901=u0$b z0zCr8P@!OkGuG&kR?G+WcamUZLY3GM_v%j{NZQ)kEa-s$I2?|W{QP`PGCn>&3UoZ~ z_x~aRe~Kh=Bxn?1OtHZ<&(F_$4-XIJ=r^cUKuKoF;ZGxE2oS%Mi;Ig>c*$ou`UZx^ zYPAaP6Kp;_FUYA+A!M<``-i5crU_*C?7peBV`}r>95x zLxLtWjuVm002ovPDHLkV1kgDR_Xu% literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/wagging.rsi/meta.json b/Resources/Textures/Interface/Actions/wagging.rsi/meta.json new file mode 100644 index 00000000000..022930052e5 --- /dev/null +++ b/Resources/Textures/Interface/Actions/wagging.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC0-1.0", + "copyright": "Created by dootythefrooty (Discord 273243513800622090)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon-on" + } + ] +} From 8ccbf7e3536b8e31d49313e40ffb67e87c6863fc Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Thu, 1 Aug 2024 23:06:47 +0000 Subject: [PATCH 041/143] Automatic Changelog Update (#588) --- Resources/Changelog/Changelog.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d2d1007a290..7a58aa97679 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4793,3 +4793,9 @@ Entries: paperwork, and medkits. id: 6200 time: '2024-08-01T22:45:13.0000000+00:00' +- author: FoxxoTrystan + changes: + - type: Add + message: Vulpkanins can wag their tails now + id: 6201 + time: '2024-08-01T23:06:24.0000000+00:00' From 172e0362dee9abd33eb9750cde423a998564d92e Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Fri, 2 Aug 2024 15:08:07 +0800 Subject: [PATCH 042/143] Increase Combat Knife Availability (#640) # Description Added combat knives to the SecTech vendor and added the combat knife to the security techfab for a cost of 2.5 steel and 1 plastic. With this change, Harpy and Diona Security players can now get a combat knife from the SecTech as they cannot spawn nor wear combat boots, which contains a combat knife. Prison guards now start with combat boots with a combat knife, and a combat knife has been added to Loadouts for Felinid/Harpy security. Cherry-picked from Space Wizards (https://github.com/space-wizards/space-station-14/pull/27224). An equivalent to "Fix no combat knives in sec techfab" (https://github.com/space-wizards/space-station-14/pull/28086) has been added with 7809b504cc1c2f8f4e9db2e820d94f292e787115, which also adds the combat knife to emagged autolathes. # Changelog :cl: Skubman, Ghagliiarghii - add: Added the combat knife to the SecTech, and the ability to manufacture combat knives in the SecLathe and emagged autolathes. - add: Added a 1-point combat knife to Loadouts for Felinid/Harpy security jobs. - tweak: Made the security belt and security webbing able to hold combat knives. - tweak: Prison Guards now start with combat boots with a combat knife. --------- Co-authored-by: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> --- .../Catalog/VendingMachines/Inventories/sec.yml | 1 + .../Prototypes/Entities/Clothing/Belt/belts.yml | 1 + .../Entities/Structures/Machines/lathe.yml | 2 ++ Resources/Prototypes/Loadouts/Jobs/security.yml | 16 ++++++++++++++++ .../Roles/Jobs/Security/prisonguard.yml | 2 +- Resources/Prototypes/Recipes/Lathes/security.yml | 9 +++++++++ 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index c071305b77c..7ea927e9b62 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -14,6 +14,7 @@ ClothingEyesHudSecurity: 2 ClothingEyesEyepatchHudSecurity: 2 ClothingBeltSecurityWebbing: 5 + CombatKnife: 3 Zipties: 12 RiotShield: 2 RiotLaserShield: 2 diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index d90945a7eba..359165cfc50 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -472,6 +472,7 @@ - Sidearm - MagazinePistol - MagazineMagnum + - CombatKnife components: - Stunbaton - FlashOnTrigger diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 2f4ecae7645..5d727207fe6 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -169,6 +169,7 @@ - ShellTranquilizer - CartridgeLightRifle - CartridgeRifle + - CombatKnife - MagazineBoxPistol - MagazineBoxMagnum - MagazineBoxRifle @@ -706,6 +707,7 @@ runningState: icon staticRecipes: - ClothingEyesHudSecurity + - CombatKnife - Flash - Handcuffs - Zipties diff --git a/Resources/Prototypes/Loadouts/Jobs/security.yml b/Resources/Prototypes/Loadouts/Jobs/security.yml index c6a78ad5d22..f1c64730378 100644 --- a/Resources/Prototypes/Loadouts/Jobs/security.yml +++ b/Resources/Prototypes/Loadouts/Jobs/security.yml @@ -363,6 +363,22 @@ items: - ClothingBeltSecurityWebbingFilled +# Equipment +- type: loadout + id: LoadoutSecurityCombatKnife + category: Jobs + cost: 1 + requirements: + - !type:CharacterSpeciesRequirement + species: + - Diona + - Harpy + - !type:CharacterDepartmentRequirement + departments: + - Security + items: + - CombatKnife + # TODO: Make this replace the secoff handgun and make it cheaper # # Species # - type: loadout diff --git a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml index 12c859b7d8c..fec6ac685ed 100644 --- a/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml +++ b/Resources/Prototypes/Nyanotrasen/Roles/Jobs/Security/prisonguard.yml @@ -30,7 +30,7 @@ equipment: jumpsuit: ClothingUniformJumpsuitPrisonGuard back: ClothingBackpackSecurityFilled - shoes: ClothingShoesBootsJack + shoes: ClothingShoesBootsCombatFilled eyes: ClothingEyesGlassesSecurity head: ClothingHeadPrisonGuard id: PrisonGuardPDA diff --git a/Resources/Prototypes/Recipes/Lathes/security.yml b/Resources/Prototypes/Recipes/Lathes/security.yml index ffa74d460f9..08e11e4ff82 100644 --- a/Resources/Prototypes/Recipes/Lathes/security.yml +++ b/Resources/Prototypes/Recipes/Lathes/security.yml @@ -30,6 +30,15 @@ Steel: 300 Plastic: 300 +- type: latheRecipe + id: CombatKnife + result: CombatKnife + category: Weapons + completetime: 2 + materials: + Steel: 250 + Plastic: 100 + - type: latheRecipe id: WeaponLaserCarbine result: WeaponLaserCarbine From 3a27ee82732adf1725b4dda0670f4274b1289271 Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 2 Aug 2024 07:08:34 +0000 Subject: [PATCH 043/143] Automatic Changelog Update (#640) --- Resources/Changelog/Changelog.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 7a58aa97679..6d50113b36a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4799,3 +4799,19 @@ Entries: message: Vulpkanins can wag their tails now id: 6201 time: '2024-08-01T23:06:24.0000000+00:00' +- author: angelofallars + changes: + - type: Add + message: >- + Added the combat knife to the SecTech, and the ability to manufacture + combat knives in the SecLathe and emagged autolathes. + - type: Add + message: >- + Added a 1-point combat knife to Loadouts for Felinid/Harpy security + jobs. + - type: Tweak + message: Made the security belt and security webbing able to hold combat knives. + - type: Tweak + message: 'Prison Guards now start with combat boots with a combat knife. ' + id: 6202 + time: '2024-08-02T07:08:07.0000000+00:00' From 9b3f1f519d426ddd1c66a106948452d95d6baaa1 Mon Sep 17 00:00:00 2001 From: Angelo Fallaria Date: Fri, 2 Aug 2024 15:09:44 +0800 Subject: [PATCH 044/143] Add Breaching Charges (#638) # Description Adds breaching charges for Security, a weaker version of the Salvage seismic charge for breaching through walls. Originally made by @rosieposieeee for Delta-V (https://github.com/DeltaV-Station/Delta-v/pull/1056). --- # Changelog :cl: rosieposieeee - add: Added breaching charges to the SecTech vendor for Security, to break through walls. --------- Co-authored-by: rosieposie <52761126+rosieposieeee@users.noreply.github.com> --- .../VendingMachines/Inventories/sec.yml | 3 +- .../Objects/Weapons/Bombs/plastic.yml | 31 +++++++++++++++++- .../Weapons/Bombs/breaching.rsi/icon.png | Bin 0 -> 3388 bytes .../Bombs/breaching.rsi/inhand-left.png | Bin 0 -> 3499 bytes .../Bombs/breaching.rsi/inhand-right.png | Bin 0 -> 3502 bytes .../Weapons/Bombs/breaching.rsi/meta.json | 31 ++++++++++++++++++ .../Weapons/Bombs/breaching.rsi/primed.png | Bin 0 -> 3520 bytes 7 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml index 7ea927e9b62..01b58ae40fb 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/sec.yml @@ -22,8 +22,9 @@ ClothingHeadHelmetInsulated: 2 # Nyanotrasen - Insulative headgear ClothingHeadCage: 2 # Nyanotrasen - Insulative headgear ClothingOuterArmorPlateCarrier: 2 # DeltaV - moved body armour from SecDrobe to SecTech - ClothingOuterArmorDuraVest: 2 + ClothingOuterArmorDuraVest: 2 ClothingHeadHelmetBasic: 2 # DeltaV - added helmets to the SecTech. Another line of defense between the tide and your grey matter. + BreachingCharge: 8 # security officers need to follow a diet regimen! contrabandInventory: FoodDonutHomer: 12 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml index 62f81fa5466..b39c8af9b25 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/plastic.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: BasePlasticExplosive parent: BaseItem abstract: true @@ -106,3 +106,32 @@ maxIntensity: 30 canCreateVacuum: false - type: ExplodeOnTrigger + +- type: entity + name: breaching charge + description: A breaching explosive for security officers to break through walls. + parent: SeismicCharge + id: BreachingCharge + components: + - type: Sprite + sprite: Objects/Weapons/Bombs/breaching.rsi + state: icon + layers: + - state: icon + map: ["base"] + - type: OnUseTimerTrigger + delay: 10 + delayOptions: [10, 15, 20, 25] + initialBeepDelay: 0 + beepSound: + path: /Audio/Effects/Cargo/buzz_two.ogg + params: + volume: -6 + startOnStick: true + canToggleStartOnStick: true + - type: Explosive + explosionType: DemolitionCharge + totalIntensity: 10 + intensitySlope: 10 + maxIntensity: 10 + canCreateVacuum: false diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5bd58663b6e6b8ba24c6e652c1a679ed70000b81 GIT binary patch literal 3388 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%0Dy!50Qvv` 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%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600O#6L_t(|obB1aYZ_r32Jq(v zA;qaujF{$Xqz*wu9E55zgcR-ErK3)DXgdX$ZtB)WI(BFw5ZkH$L6n9J77Id)grh@C z)0!$qg1AV8z_*iD5~Jsj^F7V?8E-fqKfZS;k02u4Ov)m8j1mkkLJkH;yUP744KLeQ|T*8(Jc9?DzoSFY!B zIXu0;hPOX{84@5I4tGD$MzsuKG9mfxXmo&>%Srp~3v6v~LseC{-EOF=ih8YP*l!>B z|Dpzf%6S_A27X!B0tg`}6bfCrp3CLBkA)Evb2$kB-u*o8UK`YR;7ib~!C;U& zeG7%c(5^#&2aGBzJH36ibR7z?_24c&+*rf1Z3U;b3KFmLh6VtD)XpY-`h1MTFMlTo zSoAOe126ys$nGFD48Q;kzyPv4NDTup00S_9><&`H0P_N%*B&`Bz$}K+n9E5kx0X;j zZ%=)Zng~G8V!e6u>Ir$3Wz?HZJbwP(H~;{U|L}rJEObVkpq z-hWbn-ql!-y`XoZ%Vx9214#Njw0qV>@032xI247fHXGb-H}>}Sj0KSNc?bY@&zb=A z8BO|)w9`BZV*zy5mq$w`0Kk6xLbns(_xs6WvA}M(cSqW3o`kUhX0;mYJy&L(xnS*@d|){G4>kE?ON%*~%6y}|$t caKi!q0a)(|p9l-|;s5{u07*qoM6N<$g3VoizyJUM literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json new file mode 100644 index 00000000000..678ffd9abd5 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/meta.json @@ -0,0 +1,31 @@ + { + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "made by rosieposieeee (github) for ss14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed", + "delays": [ + [ + 0.1, + 0.1 + ] + ] + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png b/Resources/Textures/Objects/Weapons/Bombs/breaching.rsi/primed.png new file mode 100644 index 0000000000000000000000000000000000000000..135cc2d3492384253f3ff6c1d7fbbe12203d0823 GIT binary patch literal 3520 zcmV;x4L|aUP)f6 zXi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijGMAUI`6dRUF zWUU$Bym{}eS9UO(Z2>7`&z9wUXbV-Il#&6`Y8GKGQ04S2&F6MJnWNa;Ck|;8QE#r9r;7G||@X{|> z%+C|c55>;RS}qbKr-&IQTvLXPlM{>K&(BTgi^a?^4mXV>;xX8n8Ce|RasXz}{8imI52H3ZN4bfe_i~WlJ|C&UW9+{8AKoW!}eExnGFE2re(F+`iE_46#!l9 z0Z_aBhs|Iw0E)7{bq;-T9=d#9QpDmcXDh4R++0fmpKB>E=%LdZt9g$j;($`3&Zthxi`{{&gM}5&R^+h%b~yM9Zd3AWW9ETgVfL z1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un?|lo#M+5oIi_w{w zo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3S!?g~$*UQipUPL&zMmg;!4Do9IA%up=Rh? z=qPj=x&RGBx1dpI68aT-2O}^EromdU5o`ssU{5#*j)WJ%$?!5bA1;Eoz?EiTr=n?cd`V|I)p<|3Oju?MT93~aB0<#&j8`F+Cg&D?-VWzQItUA^l>xvD zRIYI4MQ`g1<+DyrL=EogS06Xii({| zv`U^zjmmKqDIK93(F5q|^fLNk`gQs{RV`IdRle#b)i%{Ds;|}NsClUI)k@Ub)kf6b zsWa4l)YH_rsduU0(?DsMX@qO!YV6TCtMPOWZH~(v?wpc2hv(eZgf-1HBQ#fN?$aF5 zoYvCT^3%%Fs?s{6^;Da#?V+8jy+iwi_M{F~$4y6|vqR^k&SQoO!;_KDsATjprgSxR z{dFa}^}2()GkV5)QF?`X?Rxk03HmJkB>f%wz4}uIItC#I1qQ7Kw+-=zEW;GTU55RJ zuZ@h2VvIHzbs0S}Rx=JT&Npr~zH34@aW`3J(qMAU6l2OVO*7qXdf5y%vo}jIt1%lg zhs_<#1?IcWhb_<+P8LFo28$a^64R5J!)#@aTGB0pEekEXET35!SjAgyv+B3{Xl-wu zZrx~o$A)4PXj5p@WAm%6nJw40#`fA=@?77!tLJvleQsxN$G6*KchjC~A7a13zSsVP zgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%*^w!zIS?qk+`4<X~g?%56 z2@eae34a)26HyS+zks@6$%2*zuOhu7%OdYYnM6sVdZQJi6QY}=U&naIl*dS8tzuWk zUW(I*6U24LW8oFzvR(TOpM zEs5_rp_~TJ^wNN(wM(bCZ0;`Z6P^ce2XB(^$}i_nB)KM)Cp}7bP2Qe7nc|*Ok@8f) z7E}wKr~0SXrM^xJP1~RLDLp2=Jp-4Km~m7{5vB?IGPN`FGKaIwvx>8%%bb_(Ts9>N z5;bK**^9Ef#WdN^)PTf9vR*Qp{o-l7 zTcBI8wqSIn=gRt3(5j`YdRObOE?Pal#&6AmwS={4Ykw%TE-Wv6xh`g1Pmxy9nxe7w ze(PI{6^cd0H#WFzsN0CzDA+i-Y3`<~O&?2mB^OJrODjs>Z{}{k_?699m0x|@lC)*8 z%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb$&Qyhm+ZVyVOLSNi?B>BD~Ee(8aT1AWbo&CM;EEoH56tE6@EV8X%6-*|u1-NtOIZ>P7H z9s-9XhaP{M`0e$>L5F*fu#U8SXZT%h2eqT56Y5;vIn|ZYCGC#u9zGg)w718lr{jCe z@An_mJyvsE<#^c%!il02pHAkVoIaIx>gnm^(__6$dheWxJ#(!uyl?Pq(Ao3ne9xWf z_v}A;-u3*k3(gmgUSwVDy5w-FbHIL};|Kd6ItCpEJBJ*Hx-UCj?irppeBz4xmD5+f zub#UWaP88_{E^}7QP*$YNVp-r$-DXJR{E{yw{vdK+*xxMeYfPE(!GlNn)e%iH2tw% z>L5Kn>ODH}V8MesW8ASPKV|>)e!S=*`C-L`&P4Mg+egPHeJ3wJUif(YN!F8@r^P=j z|6Kdbc>FRj6+1QlT=e|YubW?}zu5oM?q%0Dy!50Qvv` z0D$NK0Cg|`0P0`>06Lfe02gqax=}m;000SaNLh0L01FZT01FZU(%pXi0000RbVXQn zQ*UN;cVTj607GSLb9r+hQ*?D?X>TA@Z*OeDr{R1600PWOL_t(&f$f>UOB-Pvho2V& zt;An}^NdDMsYqHvpmi|lAlA_S1Krw;LVpZh+qFyofzl3kJBK1dr&6$yBZIAibPx-+ zSTuSTx=6vnc6vLMTrZapbC-LsgZXan=PviWc`olaFLy#p$we;F63`ORn1F@xF$u7^ zw=e2ts!A2VApr~HV{)*goht(atR0kC+}jrm<70Au)Btd@pp*EY{Bs4A;opD#24H^F zVC|qptxSak)%>~w-0e~UiT#iH{ z;T$(jvnnfE789wIlNBv1u!Jc14gU>3{rrVoE?04^P$*PoUw3zzNTqmxb_Re^DmC>h z2+Dun)&{`MotsXtECk<*%mG{5U-&f6fi?CBR#UwoR=Z_$z?smq1YdYB~*s zums$b$Y!&|VlgKx6bjVJ+>NQ3CKv_Zw}5iRVlig|-VAW=Oj!E@Rs4pRK&@s|w+V*4 zAyUOx*8~;p2vzXaH9-XeRPcTEfJ`O>Kxbzs02><{)XJLO0!PXBC150(q&FUSfbI#n zGbv^04@Ok+0}BAy-rla5Ksk#-Kv;ZV0)UD&=U#)o@i;$EPB^q}Wdc<2eLWTzLdbh} zt}&opqF*26!IKrdV-;UsCEu5T*{LCUV|o;TetnSFZ$9817dMZU2~ffJ{bFQxYRLIO uar0Ps$G$EWpu*<2-VC(_v; Date: Fri, 2 Aug 2024 07:10:08 +0000 Subject: [PATCH 045/143] Automatic Changelog Update (#638) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6d50113b36a..fa05375853f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4815,3 +4815,11 @@ Entries: message: 'Prison Guards now start with combat boots with a combat knife. ' id: 6202 time: '2024-08-02T07:08:07.0000000+00:00' +- author: rosieposieeee + changes: + - type: Add + message: >- + Added breaching charges to the SecTech vendor for Security, to break + through walls. + id: 6203 + time: '2024-08-02T07:09:44.0000000+00:00' From 6b86a6df5d7979b2fde171e876562fb39231a593 Mon Sep 17 00:00:00 2001 From: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> Date: Fri, 2 Aug 2024 00:14:01 -0700 Subject: [PATCH 046/143] AHelp Sound Improvements (#585) # Description I don't like the bwoink. I also don't like being notified about the thing I'm staring at. If anyone has better quality sounds to suggest, I might use those instead. ---

Media

## Different sounds https://github.com/user-attachments/assets/8003f785-0cd0-44c9-94c2-919c59adac5c ## Ignore sounds when looking https://github.com/user-attachments/assets/2ac99672-a601-41e0-a5cd-25ce9c1a5c49

--- # Changelog :cl: - tweak: The AdminHelp sound has changed to three that play under different circumstances --------- Signed-off-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com> --- .../Administration/Systems/AdminSystem.cs | 21 +++++-------- .../Administration/Systems/BwoinkSystem.cs | 11 +++++-- .../Systems/Bwoink/AHelpUIController.cs | 28 ++++++++---------- Content.Shared/CCVar/CCVars.cs | 2 -- Resources/Audio/Admin/ahelp_error.ogg | Bin 0 -> 5721 bytes Resources/Audio/Admin/ahelp_receive.ogg | Bin 0 -> 13627 bytes Resources/Audio/Admin/ahelp_send.ogg | Bin 0 -> 13748 bytes Resources/Audio/Admin/attributions.yml | 9 ++++++ Resources/Audio/Effects/adminhelp.ogg | Bin 17220 -> 0 bytes 9 files changed, 37 insertions(+), 34 deletions(-) create mode 100755 Resources/Audio/Admin/ahelp_error.ogg create mode 100755 Resources/Audio/Admin/ahelp_receive.ogg create mode 100755 Resources/Audio/Admin/ahelp_send.ogg create mode 100644 Resources/Audio/Admin/attributions.yml delete mode 100644 Resources/Audio/Effects/adminhelp.ogg diff --git a/Content.Client/Administration/Systems/AdminSystem.cs b/Content.Client/Administration/Systems/AdminSystem.cs index f7451d23047..db1b721343e 100644 --- a/Content.Client/Administration/Systems/AdminSystem.cs +++ b/Content.Client/Administration/Systems/AdminSystem.cs @@ -10,16 +10,9 @@ public sealed partial class AdminSystem : EntitySystem { public event Action>? PlayerListChanged; - private Dictionary? _playerList; - public IReadOnlyList PlayerList - { - get - { - if (_playerList != null) return _playerList.Values.ToList(); - - return new List(); - } - } + public Dictionary PlayerInfos = new(); + public IReadOnlyList PlayerList => + PlayerInfos != null ? PlayerInfos.Values.ToList() : new List(); public override void Initialize() { @@ -40,15 +33,15 @@ private void OnPlayerInfoChanged(PlayerInfoChangedEvent ev) { if(ev.PlayerInfo == null) return; - if (_playerList == null) _playerList = new(); + if (PlayerInfos == null) PlayerInfos = new(); - _playerList[ev.PlayerInfo.SessionId] = ev.PlayerInfo; - PlayerListChanged?.Invoke(_playerList.Values.ToList()); + PlayerInfos[ev.PlayerInfo.SessionId] = ev.PlayerInfo; + PlayerListChanged?.Invoke(PlayerInfos.Values.ToList()); } private void OnPlayerListChanged(FullPlayerListEvent msg) { - _playerList = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); + PlayerInfos = msg.PlayersInfo.ToDictionary(x => x.SessionId, x => x); PlayerListChanged?.Invoke(msg.PlayersInfo); } } diff --git a/Content.Client/Administration/Systems/BwoinkSystem.cs b/Content.Client/Administration/Systems/BwoinkSystem.cs index 5166dc8416b..a3b295d6b6e 100644 --- a/Content.Client/Administration/Systems/BwoinkSystem.cs +++ b/Content.Client/Administration/Systems/BwoinkSystem.cs @@ -1,7 +1,10 @@ #nullable enable +using Content.Client.UserInterface.Systems.Bwoink; using Content.Shared.Administration; using JetBrains.Annotations; +using Robust.Client.Audio; using Robust.Shared.Network; +using Robust.Shared.Player; using Robust.Shared.Timing; namespace Content.Client.Administration.Systems @@ -10,6 +13,8 @@ namespace Content.Client.Administration.Systems public sealed class BwoinkSystem : SharedBwoinkSystem { [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly AudioSystem _audio = default!; + [Dependency] private readonly AdminSystem _adminSystem = default!; public event EventHandler? OnBwoinkTextMessageRecieved; private (TimeSpan Timestamp, bool Typing) _lastTypingUpdateSent; @@ -21,6 +26,10 @@ protected override void OnBwoinkTextMessage(BwoinkTextMessage message, EntitySes public void Send(NetUserId channelId, string text, bool playSound) { + var info = _adminSystem.PlayerInfos.GetValueOrDefault(channelId)?.Connected ?? true; + _audio.PlayGlobal(info ? AHelpUIController.AHelpSendSound : AHelpUIController.AHelpErrorSound, + Filter.Local(), false); + // Reuse the channel ID as the 'true sender'. // Server will ignore this and if someone makes it not ignore this (which is bad, allows impersonation!!!), that will help. RaiseNetworkEvent(new BwoinkTextMessage(channelId, channelId, text, playSound: playSound)); @@ -31,9 +40,7 @@ public void SendInputTextUpdated(NetUserId channel, bool typing) { if (_lastTypingUpdateSent.Typing == typing && _lastTypingUpdateSent.Timestamp + TimeSpan.FromSeconds(1) > _timing.RealTime) - { return; - } _lastTypingUpdateSent = (_timing.RealTime, typing); RaiseNetworkEvent(new BwoinkClientTypingUpdated(channel, typing)); diff --git a/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs b/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs index 2c913a2d580..2d2be1babca 100644 --- a/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs +++ b/Content.Client/UserInterface/Systems/Bwoink/AHelpUIController.cs @@ -33,7 +33,6 @@ namespace Content.Client.UserInterface.Systems.Bwoink; public sealed class AHelpUIController: UIController, IOnSystemChanged, IOnStateChanged, IOnStateChanged { [Dependency] private readonly IClientAdminManager _adminManager = default!; - [Dependency] private readonly IConfigurationManager _config = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IUserInterfaceManager _uiManager = default!; @@ -43,9 +42,14 @@ public sealed class AHelpUIController: UIController, IOnSystemChanged UIManager.GetActiveUIWidgetOrNull()?.AHelpButton; private Button? LobbyAHelpButton => (UIManager.ActiveScreen as LobbyGui)?.AHelpButton; public IAHelpUIHandler? UIHelper; + private bool _discordRelayActive; private bool _hasUnreadAHelp; - private string? _aHelpSound; + + public const string AHelpErrorSound = "/Audio/Admin/ahelp_error.ogg"; + public const string AHelpReceiveSound = "/Audio/Admin/ahelp_receive.ogg"; + public const string AHelpSendSound = "/Audio/Admin/ahelp_send.ogg"; + public override void Initialize() { @@ -55,9 +59,9 @@ public override void Initialize() SubscribeNetworkEvent(PeopleTypingUpdated); _adminManager.AdminStatusUpdated += OnAdminStatusUpdated; - _config.OnValueChanged(CCVars.AHelpSound, v => _aHelpSound = v, true); } + public void UnloadButton() { if (GameAHelpButton != null) @@ -112,14 +116,10 @@ public void OnSystemUnloaded(BwoinkSystem system) private void SetAHelpPressed(bool pressed) { if (GameAHelpButton != null) - { GameAHelpButton.Pressed = pressed; - } if (LobbyAHelpButton != null) - { LobbyAHelpButton.Pressed = pressed; - } UIManager.ClickSound(); UnreadAHelpRead(); @@ -130,22 +130,18 @@ private void ReceivedBwoink(object? sender, SharedBwoinkSystem.BwoinkTextMessage Logger.InfoS("c.s.go.es.bwoink", $"@{message.UserId}: {message.Text}"); var localPlayer = _playerManager.LocalSession; if (localPlayer == null) - { return; - } - if (message.PlaySound && localPlayer.UserId != message.TrueSender) + + EnsureUIHelper(); + + if (message.PlaySound && localPlayer.UserId != message.TrueSender && !UIHelper!.IsOpen) { - if (_aHelpSound != null) - _audio.PlayGlobal(_aHelpSound, Filter.Local(), false); + _audio.PlayGlobal(AHelpReceiveSound, Filter.Local(), false); _clyde.RequestWindowAttention(); } - EnsureUIHelper(); - if (!UIHelper!.IsOpen) - { UnreadAHelpReceived(); - } UIHelper!.Receive(message); } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index df463b27299..0d09dd59f74 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -838,8 +838,6 @@ public static readonly CVarDef CVarDef.Create("audio.admin_chat_sound_path", "/Audio/Items/pop.ogg", CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED); public static readonly CVarDef AdminChatSoundVolume = CVarDef.Create("audio.admin_chat_sound_volume", -5f, CVar.ARCHIVE | CVar.CLIENT | CVar.REPLICATED); - public static readonly CVarDef AHelpSound = - CVarDef.Create("audio.ahelp_sound", "/Audio/Effects/adminhelp.ogg", CVar.ARCHIVE | CVar.CLIENTONLY); /* * HUD diff --git a/Resources/Audio/Admin/ahelp_error.ogg b/Resources/Audio/Admin/ahelp_error.ogg new file mode 100755 index 0000000000000000000000000000000000000000..bcdb326790068a884cfeef0e154ed9c8af911bef GIT binary patch literal 5721 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Admin/attributions.yml b/Resources/Audio/Admin/attributions.yml new file mode 100644 index 00000000000..8df7e38c578 --- /dev/null +++ b/Resources/Audio/Admin/attributions.yml @@ -0,0 +1,9 @@ +- files: [ "ahelp_error" ] + license: "CC-BY-NC-SA-3.0" + copyright: "CM-SS13" + source: "https://github.com/cmss13-devs/cmss13/commit/497204fb1660977fb6bf1fe8de153c65c8299d7d" + +- files: [ "ahelp_receive", "ahelp_send" ] + license: "CC-BY-NC-SA-3.0" + copyright: "CM-SS13" + source: "https://github.com/cmss13-devs/cmss13/commit/21e6447cc08aea502f671c819fdbcecbb85e6028" diff --git a/Resources/Audio/Effects/adminhelp.ogg b/Resources/Audio/Effects/adminhelp.ogg deleted file mode 100644 index 704c0fd6d20fa552c750f19f606847e2dff1beaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17220 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 From 49c944d6bdd3a7b731d89b75bad103b552120c9c Mon Sep 17 00:00:00 2001 From: SimpleStation Changelogs Date: Fri, 2 Aug 2024 07:14:25 +0000 Subject: [PATCH 047/143] Automatic Changelog Update (#585) --- Resources/Changelog/Changelog.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index fa05375853f..26b1b13d570 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -4823,3 +4823,11 @@ Entries: through walls. id: 6203 time: '2024-08-02T07:09:44.0000000+00:00' +- author: DEATHB4DEFEAT + changes: + - type: Tweak + message: >- + The AdminHelp sound has changed to three that play under different + circumstances + id: 6204 + time: '2024-08-02T07:14:01.0000000+00:00' From d25a25c8fea8fbd038b54ac1ba5444c42d412f3b Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:17:27 +0300 Subject: [PATCH 048/143] Fix Stinky Anomaly Announcement (#646) # Description Title.

Media

![image](https://github.com/user-attachments/assets/31a9527d-1481-423f-a561-274d9814ee92)

# Changelog No cl no fun --- Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl index 543bef949aa..30fe4971eb8 100644 --- a/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl +++ b/Resources/Locale/en-US/station-events/events/anomaly-spawn.ftl @@ -1,4 +1,4 @@ -station-event-anomaly-spawn-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. +anomaly-spawn-event-announcement = Our readings have detected a dangerous interspacial anomaly. Please inform the research team of { $sighting }. anomaly-spawn-sighting-1 = low pulsating sounds heard throughout the station anomaly-spawn-sighting-2 = strange sources of light From 58a1f88ded711e5f9581784e3f20d04f75ef6266 Mon Sep 17 00:00:00 2001 From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com> Date: Sat, 3 Aug 2024 01:52:41 +0300 Subject: [PATCH 049/143] Revert "Refactor Ramping Event Scheduler (#592)" (#644) # Description This reverts commit 910b4c3c4e83e07fe2e22687e74c940604e97eb1. The PR was never tested properly, and after it was merged on deep station, a lot of significant issues have been uncovered, including station events appearing every 6-12 seconds regardless of the gamemode, some RampingStationEventScheduler component fields being unused, some CVars having misleading usages, some CVars being unused, and more. The PR needs to be re-done and tested thoroughly before it can be merged. :cl: - fix: Reverted the station event scheduler rework due to it absolutely breaking the game. --- .../RampingStationEventSchedulerComponent.cs | 36 ++++------ .../RampingStationEventSchedulerSystem.cs | 65 +++++++------------ Content.Shared/CCVar/CCVars.cs | 27 ++------ .../game-presets/preset-survival.ftl | 3 - Resources/Prototypes/GameRules/roundstart.yml | 12 +--- Resources/Prototypes/game_presets.yml | 11 ---- 6 files changed, 45 insertions(+), 109 deletions(-) diff --git a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs index 673c82b20f6..282ee5b612a 100644 --- a/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs +++ b/Content.Server/StationEvents/Components/RampingStationEventSchedulerComponent.cs @@ -4,50 +4,38 @@ public sealed partial class RampingStationEventSchedulerComponent : Component { /// - /// Multiplies the End Time of the Ramping Event curve. Lower this number for shorter, hectic shifts, increase this number for longer shifts. + /// The maximum number by which the event rate will be multiplied when shift time reaches the end time. /// [DataField] - public float ShiftChaosModifier = 1f; + public float ChaosModifier = 3f; /// - /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. + /// The minimum number by which the event rate will be multiplied when the shift has just begun. /// [DataField] - public float EventDelayModifier = 1f; - + public float StartingChaosRatio = 0.1f; /// - /// Shift Length(in Minutes) is directly reduced by this value. - /// - [DataField] - public float ShiftLengthOffset = 0f; - - /// - /// Minimum time between events is decreased by this value. + /// The number by which all event delays will be multiplied. Unlike chaos, remains constant throughout the shift. /// [DataField] - public float MinimumEventTimeOffset = 0f; + public float EventDelayModifier = 1f; /// - /// Maximum time between events is decreased by this value. + /// The number by which average expected shift length is multiplied. Higher values lead to slower chaos growth. /// - - [DataField] - public float MaximumEventTimeOffset = 0f; - - [DataField] - public bool IgnoreMinimumTimes = false; + public float ShiftLengthModifier = 1f; // Everything below is overridden in the RampingStationEventSchedulerSystem based on CVars - [DataField] + [DataField("endTime"), ViewVariables(VVAccess.ReadWrite)] public float EndTime; - [DataField] + [DataField("maxChaos"), ViewVariables(VVAccess.ReadWrite)] public float MaxChaos; - [DataField] + [DataField("startingChaos"), ViewVariables(VVAccess.ReadWrite)] public float StartingChaos; - [DataField] + [DataField("timeUntilNextEvent"), ViewVariables(VVAccess.ReadWrite)] public float TimeUntilNextEvent; } diff --git a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs index e24578fdac9..aa0c9b214b4 100644 --- a/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs +++ b/Content.Server/StationEvents/RampingStationEventSchedulerSystem.cs @@ -2,10 +2,10 @@ using Content.Server.GameTicking.Rules; using Content.Server.GameTicking.Rules.Components; using Content.Server.StationEvents.Components; +using Content.Server.StationEvents.Events; using Content.Shared.CCVar; using Robust.Shared.Configuration; using Robust.Shared.Random; -using Robust.Shared.Utility; namespace Content.Server.StationEvents; @@ -16,35 +16,30 @@ public sealed class RampingStationEventSchedulerSystem : GameRuleSystem - /// A logistic curve equation used to smooth out the transition between event times at shift start, vs. shift end. - /// Depending on the settings used, the end time might not necessarily be the point at which timers hit the floor. - /// It is after all, an asymptote. - ///