^*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!M?-rj
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-2.png b/Resources/Textures/Mobs/Customization/cyberlimbs/hesphiastos/hesphiastos_monitor.rsi/head-2.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d351d8822a6aa9555c994395ae82bd74aa725c3
GIT binary patch
literal 565
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=oCO|{#S9F5he4R}c>anM1_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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