From 344c10745e9a317dd32ea53056269669297f5693 Mon Sep 17 00:00:00 2001 From: "I.K" <45953835+notquitehadouken@users.noreply.github.com> Date: Wed, 18 Oct 2023 09:03:00 -0500 Subject: [PATCH 01/30] FIX (#21091) --- Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs index 0dd207fbb19..0f2f98e7640 100644 --- a/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs +++ b/Content.Client/Weapons/Melee/MeleeWeaponSystem.Effects.cs @@ -46,7 +46,7 @@ public override void DoLunge(EntityUid user, EntityUid weapon, Angle angle, Vect if (arcComponent.Animation != WeaponArcAnimation.None && TryComp(weapon, out MeleeWeaponComponent? meleeWeaponComponent)) { - if (user == weapon + if (user != weapon && TryComp(weapon, out SpriteComponent? weaponSpriteComponent)) sprite.CopyFrom(weaponSpriteComponent); From badb601dd1867f497d8181e8add98e02f16e4f30 Mon Sep 17 00:00:00 2001 From: Link <131011403+LinkUyx@users.noreply.github.com> Date: Wed, 18 Oct 2023 20:18:54 +0300 Subject: [PATCH 02/30] Added implanter sprite (#20758) * add * Update meta.json * tweaaaak --- .../Prototypes/Catalog/Cargo/cargo_armory.yml | 4 +-- .../Prototypes/Catalog/Cargo/cargo_fun.yml | 12 ++++---- .../Catalog/Cargo/cargo_medical.yml | 4 +-- .../Entities/Objects/Misc/implanters.yml | 29 +++++++++--------- .../Specific/Medical/implanter.rsi/broken.png | Bin 257 -> 483 bytes .../Medical/implanter.rsi/implanter0.png | Bin 229 -> 539 bytes .../Medical/implanter.rsi/implanter1.png | Bin 124 -> 127 bytes .../Specific/Medical/implanter.rsi/meta.json | 2 +- .../Medical/syndi_implanter.rsi/broken.png | Bin 0 -> 257 bytes .../syndi_implanter.rsi/implanter0.png | Bin 0 -> 229 bytes .../syndi_implanter.rsi/implanter1.png | Bin 0 -> 124 bytes .../Medical/syndi_implanter.rsi/meta.json | 20 ++++++++++++ 12 files changed, 45 insertions(+), 26 deletions(-) create mode 100644 Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/broken.png create mode 100644 Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/implanter0.png create mode 100644 Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/implanter1.png create mode 100644 Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/meta.json diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml index 77140aba3b8..f8f5253b23a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_armory.yml @@ -21,8 +21,8 @@ - type: cargoProduct id: TrackingImplant icon: - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 product: CrateTrackingImplants cost: 1000 category: Armory diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml index cc18f6676f1..5ea658ffe51 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml @@ -121,8 +121,8 @@ - type: cargoProduct id: FunSadTromboneImplants icon: - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 product: CrateFunSadTromboneImplants cost: 1000 category: Fun @@ -131,8 +131,8 @@ - type: cargoProduct id: FunLightImplants icon: - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 product: CrateFunLightImplants cost: 1000 category: Fun @@ -171,8 +171,8 @@ - type: cargoProduct id: FunBikeHornImplants icon: - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 product: CrateFunBikeHornImplants cost: 1000 category: Fun diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml index 42370eb7d9a..16498a5a750 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_medical.yml @@ -101,8 +101,8 @@ - type: cargoProduct id: MedicalMindShieldImplants icon: - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 product: CrateMindShieldImplants cost: 3000 category: Medical diff --git a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml index 8cb55e386e7..41966ab93f8 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml @@ -21,17 +21,17 @@ tags: - SubdermalImplant - type: Sprite - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 layers: - - state: syringe2 + - state: implanter0 + map: [ "implantOnly" ] + visible: true + - state: implanter1 map: [ "implantFull" ] - color: '#1cd94e' visible: false - - state: syringe_base0 - map: [ "implantOnly" ] - type: Item - sprite: Objects/Specific/Chemistry/syringe.rsi + sprite: Objects/Specific/Medical/implanter.rsi heldPrefix: 0 - type: Appearance - type: GenericVisualizer @@ -43,7 +43,7 @@ enum.ImplanterImplantOnlyVisuals.ImplantOnly: implantOnly: True: {state: broken} - False: {state: syringe_base0} + False: {state: implanter0} - type: entity id: Implanter @@ -61,14 +61,13 @@ abstract: true components: - type: Sprite - sprite: Objects/Specific/Chemistry/syringe.rsi - state: syringe_base0 + sprite: Objects/Specific/Medical/implanter.rsi + state: implanter0 layers: - - state: syringe2 + - state: implanter1 map: [ "implantFull" ] - color: '#1cd94e' visible: true - - state: syringe_base0 + - state: implanter0 map: [ "implantOnly" ] - type: Implanter currentMode: Inject @@ -81,10 +80,10 @@ abstract: true components: - type: Item - sprite: Objects/Specific/Medical/implanter.rsi + sprite: Objects/Specific/Medical/syndi_implanter.rsi size: 3 - type: Sprite - sprite: Objects/Specific/Medical/implanter.rsi + sprite: Objects/Specific/Medical/syndi_implanter.rsi state: implanter1 layers: - state: implanter0 diff --git a/Resources/Textures/Objects/Specific/Medical/implanter.rsi/broken.png b/Resources/Textures/Objects/Specific/Medical/implanter.rsi/broken.png index 027ecee0f7dd50e3a991da3cace39bca29e5c4dc..301d1928d74fa23b37d89fcb738977092ed066e7 100644 GIT binary patch delta 457 zcmV;)0XF`D0^8cgW?g5ejX<=koyo)a6y~pBPsc zTrHVQA`*#khkxi8fH6kV=ppI4PPJN%7-KZ;pCiBDPXrI_Vt#3j7-Jm~i^YiG;r8pv zfhIeP=CPH4z%*p_8mNMF!WQ|0N18H7= z`vIEd^La^mE7A!7O$&BiqO2C|CJO`tfq=_5pFhqe5@fBu00000NkvXXu0mjfzsAzK delta 229 zcmaFN+{iRRrJl3EBeIx*f$s4Sea(SUI8it`xSPs2st89-JJg=!Pm8Qk-jko;zxq{*_?yI{>N=YV@0pP&? zon*7wFm^f}K6;N-?>)w541xe5gox^N>1)i+-dFkjQEIh!)M~G>?E+Ftq?7Hb^N6f`FMjx5!Q2j9wBlbK?q)h99e6I|A3A z?qG6vviaCw(DMzbv-6)>vI}Bq@pdTO{;|#%{|$#mk8Xvr)%u3-e@!&Dw$^59>T*mx zbp>N%2SwE_V*&$vhY@^&!f8<~I-!ZyipTfXMi>DeF1URnRkxgIC`!ygmwLS}%+;p4 rx0yRmF?Ig{Rj0TmL5)VE(M0(R!fURm#&O6300000NkvXXu0mjfT;TI( delta 189 zcmV;u07Czp1myvcFn<7_NklhEZ!h^hFri~ z$=*Qr3fovN2v%v9RHU#&}lOR?j5 diff --git a/Resources/Textures/Objects/Specific/Medical/implanter.rsi/implanter1.png b/Resources/Textures/Objects/Specific/Medical/implanter.rsi/implanter1.png index 1dd9ee53bd1de40a364ff2a21d5a4bb385aba1ae..6072b5227211fe976fe89807467103a75c973196 100644 GIT binary patch delta 83 zcmb=apJ3=`>FMGa64CnhjG`cef(XmSr7UeNOA0vIe+Pi n9p|=1I<#$H{N=)Q70+FK6<^qyI1J=D8Gyjk)z4*}Q$iB}E!-Z| delta 80 zcmb=gnPBK`=IP=X64CnhOrRixfPllnAnM8ko<6r;+Pgg&ebxsLQ09ZgFqyPW_ diff --git a/Resources/Textures/Objects/Specific/Medical/implanter.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/implanter.rsi/meta.json index 38050ea3101..efcfc1c348a 100644 --- a/Resources/Textures/Objects/Specific/Medical/implanter.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Medical/implanter.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/PestoVerde322/tgstation/blob/37460afeeb24f84e591d538e40bb04e60aef9cf8/icons/obj/syringe.dmi", + "copyright": "Taken from tgstation at commit https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d, resprite by @linkblyat", "size": { "x": 32, "y": 32 diff --git a/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/broken.png b/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..027ecee0f7dd50e3a991da3cace39bca29e5c4dc GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz&H|6fVg?4jBOuH;Rhv&5D7e|v z#WAE}&f80dT!#!q*dB-%aLY!C2OC7*nX^l5`6FH%7rh6Dd%Dag_+2vXzRT6*t#)#X z<*g>k)+W~}|Kpk7^ZvZ|`0R_*j6kCxK!R1HOGzU6M%8wH?|R8B&gUE7&siKCyZI!; zXA@OLmlI)=CcU$|a?V%y_v}qeazk5P=S`k6X-d$Nt##Z|tUK)0w_Mw_W;g4*+CN{W uo;1I(et-S#$BkRR%=~jrkO^eLAJqqp>LI$Bn%}1ggZQ4VelF{r5}E)&!C;pF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/implanter0.png b/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/implanter0.png new file mode 100644 index 0000000000000000000000000000000000000000..57956f4c907f44dedc29aa8ae67fc841985d94cf GIT binary patch literal 229 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}^F3W0Ln2z= zUNGchG8ACFpns!Pw=6g1;F67-XKCx)Q>bW*IS_sFp2Ih;+Yx#kVVToHRwi$C)aAKx z-XH3`o8*k^} c;_`*X>7LG_s>-9jK&LWzy85}Sb4q9e0Q=cl7ytkO literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/implanter1.png b/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/implanter1.png new file mode 100644 index 0000000000000000000000000000000000000000..1dd9ee53bd1de40a364ff2a21d5a4bb385aba1ae GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}W}YsNArY-_ z&jboG2naYFT;3v=MXJtr->KQ-sVb&HS$=Pfh;sd!esWBUD< Vl}YsXHx8f)44$rjF6*2UngBi!DDwaS literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/meta.json new file mode 100644 index 00000000000..38050ea3101 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Medical/syndi_implanter.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/PestoVerde322/tgstation/blob/37460afeeb24f84e591d538e40bb04e60aef9cf8/icons/obj/syringe.dmi", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "broken" + }, + { + "name": "implanter0" + }, + { + "name": "implanter1" + } + ] +} From 8edd5257c4b83957e52c56233df0523a8b110c87 Mon Sep 17 00:00:00 2001 From: daerSeebaer <61566539+daerSeebaer@users.noreply.github.com> Date: Wed, 18 Oct 2023 19:46:32 +0200 Subject: [PATCH 03/30] Display current load and maximum capacity (#20181) --- Content.Client/Ame/UI/AmeWindow.xaml | 20 +++++++++++--- Content.Client/Ame/UI/AmeWindow.xaml.cs | 3 +++ Content.Server/Ame/AmeNodeGroup.cs | 17 ++++++++---- .../Ame/Components/AmeControllerComponent.cs | 11 ++++++++ .../Ame/EntitySystems/AmeControllerSystem.cs | 27 ++++++++++++++++--- .../Ame/SharedAmeControllerComponent.cs | 8 ++++-- .../components/ame-controller-component.ftl | 2 ++ 7 files changed, 75 insertions(+), 13 deletions(-) diff --git a/Content.Client/Ame/UI/AmeWindow.xaml b/Content.Client/Ame/UI/AmeWindow.xaml index 8769e3124e1..14835f85c71 100644 --- a/Content.Client/Ame/UI/AmeWindow.xaml +++ b/Content.Client/Ame/UI/AmeWindow.xaml @@ -1,7 +1,7 @@ - - + - + + + + + + + diff --git a/Content.Client/Ame/UI/AmeWindow.xaml.cs b/Content.Client/Ame/UI/AmeWindow.xaml.cs index 0ad8880beca..8f5103e6cf7 100644 --- a/Content.Client/Ame/UI/AmeWindow.xaml.cs +++ b/Content.Client/Ame/UI/AmeWindow.xaml.cs @@ -64,6 +64,9 @@ public void UpdateState(BoundUserInterfaceState state) CoreCount.Text = $"{castState.CoreCount}"; InjectionAmount.Text = $"{castState.InjectionAmount}"; + // format power statistics to pretty numbers + CurrentPowerSupply.Text = $"{castState.CurrentPowerSupply.ToString("N1")}"; + TargetedPowerSupply.Text = $"{castState.TargetedPowerSupply.ToString("N1")}"; } } } diff --git a/Content.Server/Ame/AmeNodeGroup.cs b/Content.Server/Ame/AmeNodeGroup.cs index d0e854469f5..d970f43d8be 100644 --- a/Content.Server/Ame/AmeNodeGroup.cs +++ b/Content.Server/Ame/AmeNodeGroup.cs @@ -126,11 +126,7 @@ public float InjectFuel(int fuel, out bool overloading) var safeFuelLimit = CoreCount * 2; - // Note the float conversions. The maths will completely fail if not done using floats. - // Oh, and don't ever stuff the result of this in an int. Seriously. - var floatFuel = (float) fuel; - var floatCores = (float) CoreCount; - var powerOutput = 20000f * floatFuel * floatFuel / floatCores; + var powerOutput = CalculatePower(fuel, CoreCount); if (fuel <= safeFuelLimit) return powerOutput; @@ -177,6 +173,17 @@ public float InjectFuel(int fuel, out bool overloading) return powerOutput; } + /// + /// Calculates the amount of power the AME can produce with the given settings + /// + public float CalculatePower(int fuel, int cores) + { + // Fuel is squared so more fuel vastly increases power and efficiency + // We divide by the number of cores so a larger AME is less efficient at the same fuel settings + // this results in all AMEs having the same efficiency at the same fuel-per-core setting + return 20000f * fuel * fuel / cores; + } + public int GetTotalStability() { if (CoreCount < 1) diff --git a/Content.Server/Ame/Components/AmeControllerComponent.cs b/Content.Server/Ame/Components/AmeControllerComponent.cs index 42bfa5303d7..1bf1ac2c927 100644 --- a/Content.Server/Ame/Components/AmeControllerComponent.cs +++ b/Content.Server/Ame/Components/AmeControllerComponent.cs @@ -72,10 +72,21 @@ public sealed partial class AmeControllerComponent : SharedAmeControllerComponen [DataField("nextUpdate")] public TimeSpan NextUpdate = default!; + /// + /// The next time this will try to update the controller UI. + /// + public TimeSpan NextUIUpdate = default!; + /// /// The the amount of time that passes between injection attempts. /// [DataField("updatePeriod")] [ViewVariables(VVAccess.ReadWrite)] public TimeSpan UpdatePeriod = TimeSpan.FromSeconds(10.0); + + /// + /// The maximum amount of time that passes between UI updates. + /// + [ViewVariables] + public TimeSpan UpdateUIPeriod = TimeSpan.FromSeconds(3.0); } diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs index 7b9ea7146ef..44140193d2a 100644 --- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs +++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs @@ -50,6 +50,8 @@ public override void Update(float frameTime) { if (controller.NextUpdate <= curTime) UpdateController(uid, curTime, controller, nodes); + else if (controller.NextUIUpdate <= curTime) + UpdateUi(uid, controller); } } @@ -60,6 +62,8 @@ private void UpdateController(EntityUid uid, TimeSpan curTime, AmeControllerComp controller.LastUpdate = curTime; controller.NextUpdate = curTime + controller.UpdatePeriod; + // update the UI regardless of other factors to update the power readings + UpdateUi(uid, controller); if (!controller.Injecting) return; @@ -106,18 +110,35 @@ public void UpdateUi(EntityUid uid, AmeControllerComponent? controller = null) var state = GetUiState(uid, controller); _userInterfaceSystem.SetUiState(bui, state); + + controller.NextUIUpdate = _gameTiming.CurTime + controller.UpdateUIPeriod; } private AmeControllerBoundUserInterfaceState GetUiState(EntityUid uid, AmeControllerComponent controller) { var powered = !TryComp(uid, out var powerSource) || powerSource.Powered; - var coreCount = TryGetAMENodeGroup(uid, out var group) ? group.CoreCount : 0; + var coreCount = 0; + // how much power can be produced at the current settings, in kW + // we don't use max. here since this is what is set in the Controller, not what the AME is actually producing + float targetedPowerSupply = 0; + if (TryGetAMENodeGroup(uid, out var group)) + { + coreCount = group.CoreCount; + targetedPowerSupply = group.CalculatePower(controller.InjectionAmount, group.CoreCount) / 1000; + } + + // set current power statistics in kW + float currentPowerSupply = 0; + if (TryComp(uid, out var powerOutlet) && coreCount > 0) + { + currentPowerSupply = powerOutlet.CurrentSupply / 1000; + } var hasJar = Exists(controller.JarSlot.ContainedEntity); if (!hasJar || !TryComp(controller.JarSlot.ContainedEntity, out var jar)) - return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), false, hasJar, 0, controller.InjectionAmount, coreCount); + return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), false, hasJar, 0, controller.InjectionAmount, coreCount, currentPowerSupply, targetedPowerSupply); - return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), controller.Injecting, hasJar, jar.FuelAmount, controller.InjectionAmount, coreCount); + return new AmeControllerBoundUserInterfaceState(powered, IsMasterController(uid), controller.Injecting, hasJar, jar.FuelAmount, controller.InjectionAmount, coreCount, currentPowerSupply, targetedPowerSupply); } private bool IsMasterController(EntityUid uid) diff --git a/Content.Shared/Ame/SharedAmeControllerComponent.cs b/Content.Shared/Ame/SharedAmeControllerComponent.cs index 386d577ef38..8dde66724d5 100644 --- a/Content.Shared/Ame/SharedAmeControllerComponent.cs +++ b/Content.Shared/Ame/SharedAmeControllerComponent.cs @@ -1,4 +1,4 @@ -using Robust.Shared.Serialization; +using Robust.Shared.Serialization; namespace Content.Shared.Ame; @@ -17,8 +17,10 @@ public sealed class AmeControllerBoundUserInterfaceState : BoundUserInterfaceSta public readonly int FuelAmount; public readonly int InjectionAmount; public readonly int CoreCount; + public readonly float CurrentPowerSupply; + public readonly float TargetedPowerSupply; - public AmeControllerBoundUserInterfaceState(bool hasPower, bool isMaster, bool injecting, bool hasFuelJar, int fuelAmount, int injectionAmount, int coreCount) + public AmeControllerBoundUserInterfaceState(bool hasPower, bool isMaster, bool injecting, bool hasFuelJar, int fuelAmount, int injectionAmount, int coreCount, float currentPowerSupply, float targetedPowerSupply) { HasPower = hasPower; IsMaster = isMaster; @@ -27,6 +29,8 @@ public AmeControllerBoundUserInterfaceState(bool hasPower, bool isMaster, bool i FuelAmount = fuelAmount; InjectionAmount = injectionAmount; CoreCount = coreCount; + CurrentPowerSupply = currentPowerSupply; + TargetedPowerSupply = targetedPowerSupply; } } diff --git a/Resources/Locale/en-US/ame/components/ame-controller-component.ftl b/Resources/Locale/en-US/ame/components/ame-controller-component.ftl index f55fa8755f0..cd5e6b4661c 100644 --- a/Resources/Locale/en-US/ame/components/ame-controller-component.ftl +++ b/Resources/Locale/en-US/ame/components/ame-controller-component.ftl @@ -16,6 +16,8 @@ ame-window-fuel-not-inserted-text = No fuel inserted ame-window-injection-amount-label = Injection amount: ame-window-refresh-parts-button = Refresh Parts ame-window-core-count-label = Core count: +ame-window-power-currentsupply-label = Current power supply: +ame-window-power-targetsupply-label = Targeted power supply: ame-window-toggle-injection-button = Toggle Injection ame-window-eject-button = Eject ame-window-increase-fuel-button = Increase From 8adbd50cf93e02537ff682caa120cf8ef4a184c9 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 13:47:37 -0400 Subject: [PATCH 04/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index cd0c690f584..43bda6635ea 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: Flareguy - changes: - - {message: The Microwave and wall-mounted Nanomed now use sprites similar to the - ones found in SS14., type: Tweak} - id: 4520 - time: '2023-08-11T05:12:37.0000000+00:00' - author: Potato1234_x changes: - {message: Ice has been added to the freezer crates. Chefs rejoice!, type: Tweak} @@ -2933,3 +2927,9 @@ Entries: - {message: Fix vaulting mispredict., type: Fix} id: 5019 time: '2023-10-18T05:11:33.0000000+00:00' +- author: daerSeebaer + changes: + - {message: The AME controller now shows the current load and maximum capacity., + type: Add} + id: 5020 + time: '2023-10-18T17:46:33.0000000+00:00' From 064cb8797e3921051de9287cdfac9a9258722c7e Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Wed, 18 Oct 2023 20:05:15 +0200 Subject: [PATCH 05/30] Accurate temperature alerts (#19913) --- .../Temperature/Systems/TemperatureSystem.cs | 67 ++++++++++++------- 1 file changed, 42 insertions(+), 25 deletions(-) diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index 4796704d27b..0dc5e9391af 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; +using Content.Server.Body.Components; using Content.Server.Temperature.Components; using Content.Shared.Alert; using Content.Shared.Atmos; @@ -133,41 +134,57 @@ private void OnRejuvenate(EntityUid uid, TemperatureComponent comp, RejuvenateEv private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args) { - switch (args.CurrentTemperature) + AlertType type; + float threshold; + float idealTemp; + + if (!TryComp(uid, out var temperature)) { - // Cold strong. - case <= 260: - _alerts.ShowAlert(uid, AlertType.Cold, 3); - break; + _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + return; + } - // Cold mild. - case <= 280 and > 260: - _alerts.ShowAlert(uid, AlertType.Cold, 2); - break; + if (TryComp(uid, out var regulator) && + regulator.NormalBodyTemperature > temperature.ColdDamageThreshold && + regulator.NormalBodyTemperature < temperature.HeatDamageThreshold) + { + idealTemp = regulator.NormalBodyTemperature; + } + else + { + idealTemp = (temperature.ColdDamageThreshold + temperature.HeatDamageThreshold) / 2; + } - // Cold weak. - case <= 292 and > 280: - _alerts.ShowAlert(uid, AlertType.Cold, 1); - break; + if (args.CurrentTemperature <= idealTemp) + { + type = AlertType.Cold; + threshold = temperature.ColdDamageThreshold; + } + else + { + type = AlertType.Hot; + threshold = temperature.HeatDamageThreshold; + } - // Safe. - case <= 327 and > 292: - _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + // Calculates a scale where 1.0 is the ideal temperature and 0.0 is where temperature damage begins + // The cold and hot scales will differ in their range if the ideal temperature is not exactly halfway between the thresholds + var tempScale = (args.CurrentTemperature - threshold) / (idealTemp - threshold); + switch (tempScale) + { + case <= 0f: + _alerts.ShowAlert(uid, type, 3); break; - // Heat weak. - case <= 335 and > 327: - _alerts.ShowAlert(uid, AlertType.Hot, 1); + case <= 0.4f: + _alerts.ShowAlert(uid, type, 2); break; - // Heat mild. - case <= 360 and > 335: - _alerts.ShowAlert(uid, AlertType.Hot, 2); + case <= 0.66f: + _alerts.ShowAlert(uid, type, 1); break; - // Heat strong. - case > 360: - _alerts.ShowAlert(uid, AlertType.Hot, 3); + case > 0.66f: + _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); break; } } From f20ed9461482e788d312fc9406436b04f0ed94cc Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 14:06:20 -0400 Subject: [PATCH 06/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 43bda6635ea..6e7dfce019b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,9 +1,4 @@ Entries: -- author: Potato1234_x - changes: - - {message: Ice has been added to the freezer crates. Chefs rejoice!, type: Tweak} - id: 4521 - time: '2023-08-11T07:28:27.0000000+00:00' - author: tom-leys changes: - {message: Air Technicians will find a new fire-fighting door remote in their locker. @@ -2933,3 +2928,8 @@ Entries: type: Add} id: 5020 time: '2023-10-18T17:46:33.0000000+00:00' +- author: Errant + changes: + - {message: Temperature alerts are now more accurate for different species., type: Fix} + id: 5021 + time: '2023-10-18T18:05:15.0000000+00:00' From 9741aaa5c1f907ae32ace2525da002e00631c0ab Mon Sep 17 00:00:00 2001 From: Fluffiest Floofers Date: Wed, 18 Oct 2023 20:11:41 +0200 Subject: [PATCH 07/30] Adjust warm donk pocket chemicals (#21052) Add omnizine and increase nutriment as the comment suggest. --- .../Entities/Objects/Consumable/Food/Baked/donkpocket.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml index 0564524e9af..061852f5616 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/donkpocket.yml @@ -58,7 +58,9 @@ maxVol: 10 reagents: - ReagentId: Nutriment - Quantity: 7 + Quantity: 8 + - ReagentId: Omnizine + Quantity: 2 - type: entity name: dank-pocket From 7b4ceb9d0c776905e374621f99b9ded04c13023f Mon Sep 17 00:00:00 2001 From: Keiku <41867291+Keikiru@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:59:00 +0200 Subject: [PATCH 08/30] Add checkbox for toggle walking (#20926) Co-authored-by: onoira LGTM! --- .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 58 +++++++++++++++++++ Content.Shared/CCVar/CCVars.cs | 6 ++ .../en-US/escape-menu/ui/options-menu.ftl | 1 + 3 files changed, 65 insertions(+) diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index 188fe7740cc..c68e7f3af95 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -1,5 +1,6 @@ using System.Numerics; using Content.Client.Stylesheets; +using Content.Shared.CCVar; using Content.Shared.Input; using Robust.Client.AutoGenerated; using Robust.Client.Input; @@ -41,6 +42,61 @@ private void HandleToggleUSQWERTYCheckbox(BaseButton.ButtonToggledEventArgs args _cfg.SaveToFile(); } + private void InitToggleWalk() + { + if (_cfg.GetCVar(CCVars.ToggleWalk)) + { + ToggleFunctions.Add(EngineKeyFunctions.Walk); + } + else + { + ToggleFunctions.Remove(EngineKeyFunctions.Walk); + } + } + + private void HandleToggleWalk(BaseButton.ButtonToggledEventArgs args) + { + _cfg.SetCVar(CCVars.ToggleWalk, args.Pressed); + _cfg.SaveToFile(); + InitToggleWalk(); + + if (!_keyControls.TryGetValue(EngineKeyFunctions.Walk, out var keyControl)) + { + return; + } + + var bindingType = args.Pressed ? KeyBindingType.Toggle : KeyBindingType.State; + for (var i = 0; i <= 1; i++) + { + var binding = (i == 0 ? keyControl.BindButton1 : keyControl.BindButton2).Binding; + if (binding == null) + { + continue; + } + + var registration = new KeyBindingRegistration + { + Function = EngineKeyFunctions.Walk, + BaseKey = binding.BaseKey, + Mod1 = binding.Mod1, + Mod2 = binding.Mod2, + Mod3 = binding.Mod3, + Priority = binding.Priority, + Type = bindingType, + CanFocus = binding.CanFocus, + CanRepeat = binding.CanRepeat, + }; + + _deferCommands.Add(() => + { + _inputManager.RemoveBinding(binding); + _inputManager.RegisterBinding(registration); + }); + } + + _deferCommands.Add(_inputManager.SaveToUserData); + } + public KeyRebindTab() { IoCManager.InjectDependencies(this); @@ -98,6 +154,8 @@ void AddCheckBox(string checkBoxName, bool currentState, Action public static readonly CVarDef DragDropDeadZone = CVarDef.Create("control.drag_dead_zone", 12f, CVar.CLIENTONLY | CVar.ARCHIVE); + /// + /// Toggles whether the walking key is a toggle or a held key. + /// + public static readonly CVarDef ToggleWalk = + CVarDef.Create("control.toggle_walk", false, CVar.CLIENTONLY | CVar.ARCHIVE); + /* * UPDATE */ 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 10db378ab42..97d1da949b0 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -82,6 +82,7 @@ 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-function-move-up = Move Up ui-options-function-move-left = Move Left From c92b99f6bacaa0e829995be0fcfbef2f4f7b374c Mon Sep 17 00:00:00 2001 From: phunnyguy <90366172+phunnyguy@users.noreply.github.com> Date: Wed, 18 Oct 2023 17:03:23 -0400 Subject: [PATCH 09/30] Tortilla dough, Taco shells, and Tacos (#20797) LGTM! --- .../Objects/Consumable/Food/ingredients.yml | 50 +++++- .../Objects/Consumable/Food/meals.yml | 10 +- .../Entities/Objects/Consumable/Food/taco.yml | 145 ++++++++++++++++++ .../Construction/Graphs/food/tortilla.yml | 13 ++ .../Recipes/Cooking/meal_recipes.yml | 82 +++++++++- .../Prototypes/Recipes/Reactions/food.yml | 14 ++ .../Consumable/Food/ingredients.rsi/meta.json | 11 +- .../ingredients.rsi/tortilladough-flat.png | Bin 0 -> 378 bytes .../ingredients.rsi/tortilladough-slice.png | Bin 0 -> 438 bytes .../Food/ingredients.rsi/tortilladough.png | Bin 0 -> 610 bytes .../Consumable/Food/meals.rsi/meta.json | 2 +- .../Food/meals.rsi/{taco.png => softtaco.png} | Bin .../Consumable/Food/taco.rsi/beeftaco.png | Bin 0 -> 303 bytes .../Food/taco.rsi/beeftacosupreme.png | Bin 0 -> 307 bytes .../Consumable/Food/taco.rsi/chickentaco.png | Bin 0 -> 308 bytes .../Food/taco.rsi/chickentacosupreme.png | Bin 0 -> 309 bytes .../Consumable/Food/taco.rsi/fishtaco.png | Bin 0 -> 286 bytes .../Consumable/Food/taco.rsi/meta.json | 32 ++++ .../Consumable/Food/taco.rsi/rattaco.png | Bin 0 -> 329 bytes .../Consumable/Food/taco.rsi/tacoshell.png | Bin 0 -> 283 bytes 20 files changed, 347 insertions(+), 12 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Consumable/Food/taco.yml create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/food/tortilla.yml create mode 100644 Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough-flat.png create mode 100644 Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough-slice.png create mode 100644 Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough.png rename Resources/Textures/Objects/Consumable/Food/meals.rsi/{taco.png => softtaco.png} (100%) create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/beeftaco.png create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/beeftacosupreme.png create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/chickentaco.png create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/chickentacosupreme.png create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/fishtaco.png create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/meta.json create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/rattaco.png create mode 100644 Resources/Textures/Objects/Consumable/Food/taco.rsi/tacoshell.png diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml index 8ef9bab706a..71008ac89a3 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml @@ -379,6 +379,54 @@ - type: Sprite state: cornmealdough-slice +- type: entity + name: tortilla dough + parent: FoodBakingBase + id: FoodDoughTortilla + description: A piece of tortilla dough. + components: + - type: FlavorProfile + flavors: + - chalky + - dough + - type: Sprite + state: tortilladough + - type: SliceableFood + count: 3 + slice: FoodDoughTortillaSlice + +- type: entity + name: tortilla dough slice + parent: FoodBakingBase + id: FoodDoughTortillaSlice + description: A slice of tortilla dough. + components: + - type: FlavorProfile + flavors: + - chalky + - dough + - type: Sprite + state: tortilladough-slice + - type: Construction + graph: Tortilla + node: start + +- type: entity + name: flattened tortilla dough + parent: FoodBakingBase + id: FoodDoughTortillaFlat + description: A flattened slice of tortilla dough, cook this to get a taco shell. + components: + - type: FlavorProfile + flavors: + - chalky + - dough + - type: Sprite + state: tortilladough-flat + - type: Construction + graph: Tortilla + node: flat + - type: entity name: bun parent: FoodBakingBase @@ -460,7 +508,7 @@ components: - type: Sprite state: butter - + - type: entity name: stick of cannabis butter parent: FoodBakingBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml index a55c5354213..f4b52217cdf 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meals.yml @@ -580,9 +580,9 @@ - Fruit - type: entity - name: taco + name: soft taco parent: FoodMealBase - id: FoodMealTaco + id: FoodMealSoftTaco description: Take a bite! components: - type: FlavorProfile @@ -592,10 +592,8 @@ - meaty - onion - type: Sprite - state: taco - - type: Tag - tags: - - Meat + state: softtaco + - type: entity name: corn in butter diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/taco.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/taco.yml new file mode 100644 index 00000000000..385f52b5430 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/taco.yml @@ -0,0 +1,145 @@ +- type: entity + name: taco shell + parent: FoodMealBase + id: FoodTacoShell + description: A taco shell, easy to hold, but falls on its side when put down. + components: + - type: Food + - type: Sprite + sprite: Objects/Consumable/Food/taco.rsi + layers: + - state: tacoshell + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Nutriment + Quantity: 6.66 # Just using the same values as the bun values, since the recipe for taco shells is roughly the same as buns. +# Base + +- type: entity + parent: FoodInjectableBase + id: FoodTacoBase + abstract: true + components: + - type: FlavorProfile + flavors: + - meaty + - cheesy + - type: Food + transferAmount: 3 + - type: Sprite + sprite: Objects/Consumable/Food/taco.rsi + - type: SolutionContainerManager + solutions: + food: + maxVol: 15 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 4 + - type: Item + sprite: Objects/Consumable/Food/taco.rsi + +- type: entity + name: beef taco + parent: FoodTacoBase + id: FoodTacoBeef + description: A very basic and run of the mill beef taco, now with cheese! + components: + - type: Food + - type: Sprite + state: beeftaco + +- type: entity + name: chicken taco + parent: FoodTacoBase + id: FoodTacoChicken + description: A very basic and run of the mill chicken taco, now with cheese! + components: + - type: Food + - type: Sprite + state: chickentaco + +- type: entity + name: fish taco + parent: FoodTacoBase + id: FoodTacoFish + description: Sounds kinda gross, but it's actually not that bad. + components: + - type: FlavorProfile + flavors: + - onion + - fishy + - type: Food + - type: Sprite + state: fishtaco + - type: SolutionContainerManager + solutions: + food: + maxVol: 20 + reagents: + - ReagentId: Nutriment + Quantity: 10 + - ReagentId: Vitamin + Quantity: 6 + +- type: entity + name: rat taco + parent: FoodTacoBase + id: FoodTacoRat + description: Yeah, that looks about right... + components: + - type: Food + - type: Sprite + state: rattaco + - type: SolutionContainerManager + solutions: + food: + maxVol: 15 + reagents: + - ReagentId: Nutriment + Quantity: 6 + - ReagentId: Vitamin + Quantity: 4 + +- type: entity + name: beef taco supreme + parent: FoodTacoBase + id: FoodTacoBeefSupreme + description: It's like a regular beef taco, but surpeme! + components: + - type: Food + - type: Sprite + state: beeftacosupreme + - type: SolutionContainerManager + solutions: + food: + maxVol: 26 + reagents: + - ReagentId: Nutriment + Quantity: 14 + - ReagentId: Vitamin + Quantity: 6 + +- type: entity + name: chicken taco supreme + parent: FoodTacoBase + id: FoodTacoChickenSupreme + description: It's like a regular chicken taco, but surpeme! + components: + - type: Food + - type: Sprite + state: chickentacosupreme + - type: SolutionContainerManager + solutions: + food: + maxVol: 26 + reagents: + - ReagentId: Nutriment + Quantity: 14 + - ReagentId: Vitamin + Quantity: 6 + diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/food/tortilla.yml b/Resources/Prototypes/Recipes/Construction/Graphs/food/tortilla.yml new file mode 100644 index 00000000000..4678ef801e7 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/food/tortilla.yml @@ -0,0 +1,13 @@ +- type: constructionGraph + id: Tortilla + start: start + graph: + - node: start + entity: FoodDoughTortillaSlice + edges: + - to: flat + steps: + - tool: Rolling + doAfter: 1 + - node: flat + entity: FoodDoughTortillaFlat diff --git a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml index c02919777b2..d83d58bc925 100644 --- a/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml +++ b/Resources/Prototypes/Recipes/Cooking/meal_recipes.yml @@ -1674,9 +1674,9 @@ FoodKebabSkewer: 1 - type: microwaveMealRecipe - id: RecipeFoodMealTaco - name: taco recipe - result: FoodMealTaco + id: RecipeFoodMealSoftTaco + name: soft taco recipe + result: FoodMealSoftTaco time: 10 solids: FoodDoughSlice: 1 @@ -1733,3 +1733,79 @@ FoodCorn: 1 FoodPlate: 1 FoodButter: 1 + +- type: microwaveMealRecipe + id: RecipeTacoShell + name: taco shell recipe + result: FoodTacoShell + time: 5 + solids: + FoodDoughTortillaFlat: 1 # one third of a standard bread dough recipe + +- type: microwaveMealRecipe + id: RecipeTacoBeef + name: beef taco recipe + result: FoodTacoBeef + time: 10 + solids: + FoodTacoShell: 1 + FoodMeatCutlet: 1 + FoodCheeseSlice: 1 + +- type: microwaveMealRecipe + id: RecipeTacoChicken + name: chicken taco recipe + result: FoodTacoChicken + time: 10 + solids: + FoodTacoShell: 1 + FoodMeatChickenCutlet: 1 + FoodCheeseSlice: 1 + +- type: microwaveMealRecipe + id: RecipeTacoFish + name: fish taco recipe + result: FoodTacoFish + time: 10 + solids: + FoodTacoShell: 1 + FoodMeatFish: 1 + FoodOnionSlice: 2 + FoodTomato: 1 + FoodCabbage: 1 + +- type: microwaveMealRecipe + id: RecipeTacoRat + name: rat taco recipe + result: FoodTacoRat + time: 10 + solids: + FoodTacoShell: 1 + FoodCheeseSlice: 1 + FoodMeatRat: 1 + +- type: microwaveMealRecipe + id: RecipeTacoBeefSupreme + name: beef taco supreme recipe + result: FoodTacoBeefSupreme + time: 10 + solids: + FoodTacoShell: 1 + FoodCheeseSlice: 1 + FoodMeatCutlet: 1 + FoodTomato: 1 + FoodCabbage: 1 + FoodOnionSlice: 2 + +- type: microwaveMealRecipe + id: RecipeTacoChickenSupreme + name: beef taco supreme recipe + result: FoodTacoChickenSupreme + time: 10 + solids: + FoodTacoShell: 1 + FoodCheeseSlice: 1 + FoodMeatChickenCutlet: 1 + FoodTomato: 1 + FoodCabbage: 1 + FoodOnionSlice: 2 diff --git a/Resources/Prototypes/Recipes/Reactions/food.yml b/Resources/Prototypes/Recipes/Reactions/food.yml index 284b1c763a4..3ca69b379d3 100644 --- a/Resources/Prototypes/Recipes/Reactions/food.yml +++ b/Resources/Prototypes/Recipes/Reactions/food.yml @@ -58,6 +58,20 @@ - !type:CreateEntityReactionEffect entity: FoodDoughCornmeal +- type: reaction + id: CreateTortillaDough + impact: Low + quantized: true + conserveEnergy: false + reactants: + Cornmeal: + amount: 15 + Water: + amount: 10 + effects: + - !type:CreateEntityReactionEffect + entity: FoodDoughTortilla + - type: reaction id: CreateCakeBatter impact: Low diff --git a/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/meta.json index bf656ff00ca..3c66005b04b 100644 --- a/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/meta.json +++ b/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation and baystation and modified by potato1234x at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and https://github.com/Baystation12/Baystation12/commit/a6067826de7fd8f698793f6d84e6c2f1f9b1f188. Tofu and tofu-slice were created by Discord user rosysyntax#6514. Chevrelog and chevredisk created by Github user deathride58", + "copyright": "Taken from tgstation and baystation and modified by potato1234x at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and https://github.com/Baystation12/Baystation12/commit/a6067826de7fd8f698793f6d84e6c2f1f9b1f188. Tofu and tofu-slice were created by Discord user rosysyntax#6514. Chevrelog and chevredisk created by Github user deathride58, tortilladough tortillaflat and tortillaslice added by Phunny,", "size": { "x": 32, "y": 32 @@ -108,6 +108,15 @@ }, { "name": "tofu-slice" + }, + { + "name": "tortilladough" + }, + { + "name": "tortilladough-flat" + }, + { + "name": "tortilladough-slice" } ] } diff --git a/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough-flat.png b/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough-flat.png new file mode 100644 index 0000000000000000000000000000000000000000..a0820eeacc524aa43ad73bc14bc91836310cfc08 GIT binary patch literal 378 zcmV-=0fqjFP)RB!U=$z& Y00FXY@jIq8U;qFB07*qoM6N<$f*^jUaR2}S literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough-slice.png b/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough-slice.png new file mode 100644 index 0000000000000000000000000000000000000000..b69ffc39e6f48dea8b0ee55421744ff53c70ebf2 GIT binary patch literal 438 zcmV;n0ZIOeP)r&iv~q|BB-}KCm<4Uxw+VWL9-s&40i*{A7p>|IiZ<=r1T9**2$Ntc z1~b$gguz0lh0MheW*j%QxZh@m|D1dOpL@>*i9{li{4sO0Ec$%DaED(5035pmz{>XV zOnZe| zM=rqPvNloscKQHBm4wj3hL{gB*9(R)Ph@hmnwF@0#^ah}chC!l2p)uQ%FFXTS6^7e zY&R(8OQ=h$q85q88Ga3L><-^fpKi}4l~jSzwRoX}hST>108&YnV!i~x?cEh-y(T6< z5{sj#X`)KvmwDdUL{ZZyYMQtE6W@~vyr*iV>}pz8gy{Bc0L*rSt@T|JnH=7e^g;o2 zU!O#;-#kn;DAh{Y1<oB#j-07*qoM6N<$f;J+^1^@s6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough.png b/Resources/Textures/Objects/Consumable/Food/ingredients.rsi/tortilladough.png new file mode 100644 index 0000000000000000000000000000000000000000..d502da9b1cc84f6ea5824338c622680fd3fbb712 GIT binary patch literal 610 zcmV-o0-gPdP)BjE7=|A!#g;M1l^P>#r~{#HmJ*DUzmTCzp^!h&Ipi03&MzpLyJsncLLpl_7GpYe zaTSur1{>j4vPDGYK&%eVo#S9E+3i-n+v&c$=l#C>bO(tNCHmi$T4mAM$$q%Ay~kQQ zBfmMe2f(0jQG4|^_P$FQxcpQPExX0e_MZH9-$dy3CUNaLbVm~E*d8gZ z2!Ni~Xr3O1|IC1ZYi4-{u4nxzH0uK}7+%Ymvy=Tu6Ojhqzk4|sp4T&sRYRV=`#Xo* zu@JEv&tF6)7R$iKlV=htB(fd4BMegmz%VuRrxh9F*=^RQ&9bvqVU-@h${M;frK9}I@qxE%|(W1*R4Zf`~s44?##9D8;ffG>>?09^e# z|2qQ!UoV=#^d1lpC2;WUwls1dUNN`i`qythF1(T-Et)*2H&Vw(yCF2G0`Abeo0-5Y zyM=$zq`Fy?>`rTdb=^eg-{!-WT4{ZrikNp%F#mPdxF{)agN7yW+@2T6_~Is_yor5Spg z#o<23MKdrkFeqI5%aCNvM3f_lasYa;W22)|&O!J#CJf2*e=*EWWFyKEL?xQ7OGW={ zseWU)cAJY~$p!(2n1BxqFg`XqCh{wTx&#x$%@_X|j^4#@2T=~#vEKOqhxdON1O!RB!U=)lT008pMpG64@mz4kj002ovPDHLkV1l}8 BfIa{K literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/taco.rsi/beeftacosupreme.png b/Resources/Textures/Objects/Consumable/Food/taco.rsi/beeftacosupreme.png new file mode 100644 index 0000000000000000000000000000000000000000..4db06131dce7e2f745568d4a6f0d1c1ccd2ccec3 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJU!E?GArY;~2@#5yEbD3Ao!D>pm0mjg6^3g;Tf$kU??zny85}Sb4q9e0G()r AO#lD@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/taco.rsi/chickentaco.png b/Resources/Textures/Objects/Consumable/Food/taco.rsi/chickentaco.png new file mode 100644 index 0000000000000000000000000000000000000000..014e20c0e96aefc2e7f7135cc4fa58815e276643 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ-<~dxArY;~2@=0O;wsjB8kb);J}X?FK$OKm3Y$QEGaiP_Uwae71HZvT`UuhS3UkOfA4>y zfIv#3!nCwqA37VoPt7=}R?8Y`nG5zIm)k)N2}=fstI7)wg!cYh0SpEPPgg&ebxsLQ E0H#5yEbD3Ao!D>pm0mjgT8M?AW-nE5SoRlqq_8 z*T3sQe~%TsH4{HPiI<7TkWpSDp(f|c<3Gg!isRw+z1u94!CvHYJE$S?iGg9qrP&{%{CtIh;lSYO>gTe~DWM4f DruKs) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/taco.rsi/fishtaco.png b/Resources/Textures/Objects/Consumable/Food/taco.rsi/fishtaco.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2a6055234cfd987914d15b9d79ec33f83adfec GIT binary patch literal 286 zcmV+(0pb3MP)NkdKx49UWY!G0G3HZPO z<71zZ}<>ckG kQ7{Td!6+C7qhRC!0KPrHzdt#tZ~y=R07*qoM6N<$f+7}!E&u=k literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/taco.rsi/meta.json b/Resources/Textures/Objects/Consumable/Food/taco.rsi/meta.json new file mode 100644 index 00000000000..3e028b55c93 --- /dev/null +++ b/Resources/Textures/Objects/Consumable/Food/taco.rsi/meta.json @@ -0,0 +1,32 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Added by Phunny", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "tacoshell" + }, + { + "name": "beeftaco" + }, + { + "name": "beeftacosupreme" + }, + { + "name": "chickentaco" + }, + { + "name": "chickentacosupreme" + }, + { + "name": "fishtaco" + }, + { + "name": "rattaco" + } + ] +} diff --git a/Resources/Textures/Objects/Consumable/Food/taco.rsi/rattaco.png b/Resources/Textures/Objects/Consumable/Food/taco.rsi/rattaco.png new file mode 100644 index 0000000000000000000000000000000000000000..f80673f6a685cd9786f0c9bbf1d7fa7f196a0d04 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFba6OIEF;DCMQU+E=~~XX$mwr z&@fTP_rHDH|N4J_G@F+!F**GCxxeJO`Fl?;So*8i@!}iplg|tvZe6kbxxLZ$t*0^| zhcqw$S~E$e(fs0prux|_>dn($nYU$c-zhOIM!;7KF4w!W zX36#Sk`mfl25*$LuD*-N|MUOwZ+jl5CLNw5m&Eg17tRQbi}MTXlZN@6tIeK)VY$)< V(S(VT>wrPT;OXk;vd$@?2>|nika++A literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Consumable/Food/taco.rsi/tacoshell.png b/Resources/Textures/Objects/Consumable/Food/taco.rsi/tacoshell.png new file mode 100644 index 0000000000000000000000000000000000000000..63a396484ce9a4922224beaf9fafacbec44afd63 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJN1iT@ArY;~2@NpBnze9yq|CYRp9+(9l+EsL6mj1m zuv#EVlDX^Yjf^11K*a{RH#c6am{QC$Y0@R0wqvhUTA2bn(_RN%{2#UIzQnq_&ypfG zIW{P&Jz!?;>F-xl3lw_VAp5%ae|^ROc1MQ^t&I}5VxIFI-g-NR=ibHjCr_n9y~5>o c@B|Y>qhjZoITL0AJFVdQ&MBb@01fMadH?_b literal 0 HcmV?d00001 From dffc32163ea99b6ce541fc0775a021edc5a5746b Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 17:04:27 -0400 Subject: [PATCH 10/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 6e7dfce019b..c147cbdd60d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: tom-leys - changes: - - {message: Air Technicians will find a new fire-fighting door remote in their locker. - It controls FireLocks Let space in and fire out using a handy remote from a - safe distance!, type: Add} - - {message: 'FireDoors can be bolted and unbolted by fire-fighting, engineering - and command door remotes', type: Add} - - {message: 'Door remotes add your ID card access to their own. If you have access - to open a door, you can control that door with any door remote.', type: Tweak} - id: 4522 - time: '2023-08-11T09:29:33.0000000+00:00' - author: deltanedas changes: - {message: Nanotrasen has designed the new Vim exosuit for all your beloved pets! @@ -2933,3 +2922,11 @@ Entries: - {message: Temperature alerts are now more accurate for different species., type: Fix} id: 5021 time: '2023-10-18T18:05:15.0000000+00:00' +- author: Phunny + changes: + - {message: Added Tortilla doughs and variants., type: Add} + - {message: Added Taco shells and recipe, type: Add} + - {message: Added various types of Tacos, type: Add} + - {message: Changed naming of the original taco to soft shell taco, type: Tweak} + id: 5022 + time: '2023-10-18T21:03:23.0000000+00:00' From 414701dd3bfc0cf0a2dd40d2cfe692f2d0b70985 Mon Sep 17 00:00:00 2001 From: TemporalOroboros Date: Wed, 18 Oct 2023 14:04:47 -0700 Subject: [PATCH 11/30] Swaps HV/MV/LV scaling to supply power scaling (#20880) --- .../Components/ElectrifiedComponent.cs | 12 ---- .../Components/ElectrocutionComponent.cs | 13 ++-- .../Electrocution/ElectrocutionSystem.cs | 59 ++++++++++--------- .../Power/Pow3r/BatteryRampPegSolver.cs | 1 + Content.Server/Power/Pow3r/PowerState.cs | 5 ++ 5 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs b/Content.Server/Electrocution/Components/ElectrifiedComponent.cs index d551aa15410..2f3def6e061 100644 --- a/Content.Server/Electrocution/Components/ElectrifiedComponent.cs +++ b/Content.Server/Electrocution/Components/ElectrifiedComponent.cs @@ -41,18 +41,6 @@ public sealed partial class ElectrifiedComponent : Component [DataField("lowVoltageNode")] public string? LowVoltageNode; - [DataField("highVoltageDamageMultiplier")] - public float HighVoltageDamageMultiplier = 3f; - - [DataField("highVoltageTimeMultiplier")] - public float HighVoltageTimeMultiplier = 1.5f; - - [DataField("mediumVoltageDamageMultiplier")] - public float MediumVoltageDamageMultiplier = 2f; - - [DataField("mediumVoltageTimeMultiplier")] - public float MediumVoltageTimeMultiplier = 1.25f; - [DataField("shockDamage")] public int ShockDamage = 20; diff --git a/Content.Server/Electrocution/Components/ElectrocutionComponent.cs b/Content.Server/Electrocution/Components/ElectrocutionComponent.cs index 2534544f6ce..9da78c9134f 100644 --- a/Content.Server/Electrocution/Components/ElectrocutionComponent.cs +++ b/Content.Server/Electrocution/Components/ElectrocutionComponent.cs @@ -7,15 +7,18 @@ [Access(typeof(ElectrocutionSystem))] public sealed partial class ElectrocutionComponent : Component { - [DataField("timeLeft")] - public float TimeLeft; - [DataField("electrocuting")] public EntityUid Electrocuting; + [DataField("source")] + public EntityUid Source; + + [DataField("timeLeft")] + public float TimeLeft; + [DataField("accumDamage")] public float AccumulatedDamage; - [DataField("source")] - public EntityUid Source; + [DataField("baseDamage")] + public float BaseDamage = 20f; } diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index 48415c39533..6c962667404 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -17,6 +17,7 @@ using Content.Shared.Inventory; using Content.Shared.Jittering; using Content.Shared.Maps; +using Content.Shared.Mobs; using Content.Shared.Popups; using Content.Shared.Pulling.Components; using Content.Shared.Speech.EntitySystems; @@ -61,7 +62,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem private const string DamageType = "Shock"; // Yes, this is absurdly small for a reason. - private const float ElectrifiedDamagePerWatt = 0.0015f; + private const float ElectrifiedScalePerWatt = 1E-6f; private const float RecursiveDamageMultiplier = 0.75f; private const float RecursiveTimeMultiplier = 0.8f; @@ -102,7 +103,7 @@ private void UpdateElectrocutions(float frameTime) var timePassed = Math.Min(frameTime, electrocution.TimeLeft); electrocution.TimeLeft -= timePassed; - electrocution.AccumulatedDamage += consumer.ReceivedPower * ElectrifiedDamagePerWatt * timePassed; + electrocution.AccumulatedDamage += electrocution.BaseDamage * (consumer.ReceivedPower / consumer.DrawRate) * timePassed; if (!MathHelper.CloseTo(electrocution.TimeLeft, 0)) continue; @@ -117,7 +118,7 @@ private void UpdateElectrocutions(float frameTime) if (actual != null) { _adminLogger.Add(LogType.Electrocution, - $"{ToPrettyString(electrocution.Electrocuting):entity} received {actual.Total:damage} powered electrocution damage from {ToPrettyString(electrocution.Source):source}"); + $"{ToPrettyString(electrocution.Electrocuting):entity} received {actual.GetTotal():damage} powered electrocution damage from {ToPrettyString(electrocution.Source):source}"); } } QueueDel(uid); @@ -257,15 +258,17 @@ public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid, } var node = PoweredNode(uid, electrified, nodeContainer); - if (node == null) + if (node?.NodeGroup is not IBasePowerNet powerNet) return false; - var (damageMult, timeMult) = node.NodeGroupID switch - { - NodeGroupID.HVPower => (electrified.HighVoltageDamageMultiplier, electrified.HighVoltageTimeMultiplier), - NodeGroupID.MVPower => (electrified.MediumVoltageDamageMultiplier, electrified.MediumVoltageTimeMultiplier), - _ => (1f, 1f) - }; + var net = powerNet.NetworkNode; + var supp = net.LastCombinedSupply; + + if (supp <= 0f) + return false; + + // Initial damage scales off of the available supply on the principle that the victim has shorted the entire powernet through their body. + var damageScale = supp * ElectrifiedScalePerWatt; { var lastRet = true; @@ -276,8 +279,8 @@ public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid, entity, uid, node, - (int) (electrified.ShockDamage * MathF.Pow(RecursiveDamageMultiplier, depth) * damageMult), - TimeSpan.FromSeconds(electrified.ShockTime * MathF.Pow(RecursiveTimeMultiplier, depth) * timeMult), + (int) (electrified.ShockDamage * damageScale * MathF.Pow(RecursiveDamageMultiplier, depth)), + TimeSpan.FromSeconds(electrified.ShockTime * MathF.Min(1f + MathF.Log2(1f + damageScale), 3f) * MathF.Pow(RecursiveTimeMultiplier, depth)), true, electrified.SiemensCoefficient); } @@ -304,18 +307,18 @@ public bool TryDoElectrifiedAct(EntityUid uid, EntityUid targetUid, } } - /// - public override bool TryDoElectrocution( - EntityUid uid, EntityUid? sourceUid, int shockDamage, TimeSpan time, bool refresh, float siemensCoefficient = 1f, - StatusEffectsComponent? statusEffects = null, bool ignoreInsulation = false) - { - if (!DoCommonElectrocutionAttempt(uid, sourceUid, ref siemensCoefficient, ignoreInsulation) - || !DoCommonElectrocution(uid, sourceUid, shockDamage, time, refresh, siemensCoefficient, statusEffects)) - return false; + /// + public override bool TryDoElectrocution( + EntityUid uid, EntityUid? sourceUid, int shockDamage, TimeSpan time, bool refresh, float siemensCoefficient = 1f, + StatusEffectsComponent? statusEffects = null, bool ignoreInsulation = false) + { + if (!DoCommonElectrocutionAttempt(uid, sourceUid, ref siemensCoefficient, ignoreInsulation) + || !DoCommonElectrocution(uid, sourceUid, shockDamage, time, refresh, siemensCoefficient, statusEffects)) + return false; - RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient), true); - return true; - } + RaiseLocalEvent(uid, new ElectrocutedEvent(uid, sourceUid, siemensCoefficient), true); + return true; + } private bool TryDoElectrocutionPowered( EntityUid uid, @@ -331,12 +334,12 @@ private bool TryDoElectrocutionPowered( if (!DoCommonElectrocutionAttempt(uid, sourceUid, ref siemensCoefficient)) return false; + if (!DoCommonElectrocution(uid, sourceUid, shockDamage, time, refresh, siemensCoefficient, statusEffects)) + return false; + // Coefficient needs to be higher than this to do a powered electrocution! if (siemensCoefficient <= 0.5f) - return DoCommonElectrocution(uid, sourceUid, shockDamage, time, refresh, siemensCoefficient, statusEffects); - - if (!DoCommonElectrocution(uid, sourceUid, null, time, refresh, siemensCoefficient, statusEffects)) - return false; + return true; if (!Resolve(sourceUid, ref sourceTransform)) // This shouldn't really happen, but just in case... return true; @@ -422,7 +425,7 @@ private bool DoCommonElectrocution(EntityUid uid, EntityUid? sourceUid, if (actual != null) { _adminLogger.Add(LogType.Electrocution, - $"{ToPrettyString(uid):entity} received {actual.Total:damage} powered electrocution damage{(sourceUid != null ? " from " + ToPrettyString(sourceUid.Value) : ""):source}"); + $"{ToPrettyString(uid):entity} received {actual.GetTotal():damage} powered electrocution damage{(sourceUid != null ? " from " + ToPrettyString(sourceUid.Value) : ""):source}"); } } diff --git a/Content.Server/Power/Pow3r/BatteryRampPegSolver.cs b/Content.Server/Power/Pow3r/BatteryRampPegSolver.cs index e2399d8f779..d0c0a297b47 100644 --- a/Content.Server/Power/Pow3r/BatteryRampPegSolver.cs +++ b/Content.Server/Power/Pow3r/BatteryRampPegSolver.cs @@ -170,6 +170,7 @@ private void UpdateNetwork(Network network, PowerState state, float frameTime) } } + network.LastCombinedLoad = demand; network.LastCombinedSupply = totalSupply + totalBatterySupply; network.LastCombinedMaxSupply = totalMaxSupply + totalMaxBatterySupply; diff --git a/Content.Server/Power/Pow3r/PowerState.cs b/Content.Server/Power/Pow3r/PowerState.cs index 2b94af97b22..78ba97bb22a 100644 --- a/Content.Server/Power/Pow3r/PowerState.cs +++ b/Content.Server/Power/Pow3r/PowerState.cs @@ -488,6 +488,11 @@ public sealed class Network /// [ViewVariables] public List BatterySupplies = new(); + /// + /// The total load on the power network as of last tick. + /// + [ViewVariables] public float LastCombinedLoad = 0f; + /// /// Available supply, including both normal supplies and batteries. /// From 9c25db8b13723713375949e22d02516076b06e95 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 17:05:50 -0400 Subject: [PATCH 12/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c147cbdd60d..ff8aa62cfe7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: deltanedas - changes: - - {message: Nanotrasen has designed the new Vim exosuit for all your beloved pets! - Research it alongside the HAMTR in the new "Critters Mechs" research technology, - type: Add} - id: 4523 - time: '2023-08-11T16:20:16.0000000+00:00' - author: tom-leys changes: - {message: 'After a flurry of memos, the Atmospheric Technician''s remote no longer @@ -2930,3 +2923,9 @@ Entries: - {message: Changed naming of the original taco to soft shell taco, type: Tweak} id: 5022 time: '2023-10-18T21:03:23.0000000+00:00' +- author: TemporalOroboros + changes: + - {message: Electric shocks now scale with the amount of power in the cables instead + of the type of cable., type: Tweak} + id: 5023 + time: '2023-10-18T21:04:47.0000000+00:00' From b419dbb3eb85f7fe542d275ff921460cbec79b94 Mon Sep 17 00:00:00 2001 From: Doru991 <75124791+Doru991@users.noreply.github.com> Date: Thu, 19 Oct 2023 00:15:17 +0300 Subject: [PATCH 13/30] Make gibbing drop items again (#21047) LGTM, Just a warning that this will probably get overriden when medical refactor gets merged since it refactors gibbing. --- Content.Server/Body/Systems/BodySystem.cs | 9 ++++++--- .../Explosion/EntitySystems/TriggerSystem.cs | 2 +- .../Body/Systems/SharedBodySystem.Body.cs | 15 +++++++++++++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/Content.Server/Body/Systems/BodySystem.cs b/Content.Server/Body/Systems/BodySystem.cs index 2010537e34b..f2f848c488d 100644 --- a/Content.Server/Body/Systems/BodySystem.cs +++ b/Content.Server/Body/Systems/BodySystem.cs @@ -111,7 +111,7 @@ protected override void RemovePart( _humanoidSystem.SetLayersVisibility(bodyUid, layers, false, true, humanoid); } - public override HashSet GibBody(EntityUid bodyId, bool gibOrgans = false, BodyComponent? body = null, bool deleteItems = false) + public override HashSet GibBody(EntityUid bodyId, bool gibOrgans = false, BodyComponent? body = null, bool deleteItems = false, bool deleteBrain = false) { if (!Resolve(bodyId, ref body, false)) return new HashSet(); @@ -123,7 +123,7 @@ public override HashSet GibBody(EntityUid bodyId, bool gibOrgans = fa if (xform.MapUid == null) return new HashSet(); - var gibs = base.GibBody(bodyId, gibOrgans, body, deleteItems); + var gibs = base.GibBody(bodyId, gibOrgans, body, deleteItems, deleteBrain); var coordinates = xform.Coordinates; var filter = Filter.Pvs(bodyId, entityManager: EntityManager); @@ -135,7 +135,10 @@ public override HashSet GibBody(EntityUid bodyId, bool gibOrgans = fa { if (deleteItems) { - QueueDel(entity); + if (!HasComp(entity) || deleteBrain) + { + QueueDel(entity); + } } else { diff --git a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs index 91b32af8708..b57e9bd2987 100644 --- a/Content.Server/Explosion/EntitySystems/TriggerSystem.cs +++ b/Content.Server/Explosion/EntitySystems/TriggerSystem.cs @@ -148,7 +148,7 @@ private void HandleGibTrigger(EntityUid uid, GibOnTriggerComponent component, Tr if (!TryComp(uid, out var xform)) return; - _body.GibBody(xform.ParentUid, deleteItems: component.DeleteItems); + _body.GibBody(xform.ParentUid, true, deleteItems: component.DeleteItems); args.Handled = true; } diff --git a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs index 8f16ca8efc4..74a202386ec 100644 --- a/Content.Shared/Body/Systems/SharedBodySystem.Body.cs +++ b/Content.Shared/Body/Systems/SharedBodySystem.Body.cs @@ -5,6 +5,8 @@ using Content.Shared.Body.Part; using Content.Shared.Body.Prototypes; using Content.Shared.DragDrop; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; using Robust.Shared.Containers; using Robust.Shared.Map; @@ -19,6 +21,8 @@ public partial class SharedBodySystem * - Each "connection" is a body part (e.g. arm, hand, etc.) and each part can also contain organs. */ + [Dependency] private readonly InventorySystem _inventory = default!; + private void InitializeBody() { // Body here to handle root body parts. @@ -263,7 +267,7 @@ public IEnumerable GetBodyAllSlots(EntityUid bodyId, BodyComponent } public virtual HashSet GibBody(EntityUid bodyId, bool gibOrgans = false, - BodyComponent? body = null, bool deleteItems = false) + BodyComponent? body = null, bool deleteItems = false, bool deleteBrain = false) { var gibs = new HashSet(); @@ -287,7 +291,14 @@ public virtual HashSet GibBody(EntityUid bodyId, bool gibOrgans = fal gibs.Add(organ.Id); } } - + if(TryComp(bodyId, out var inventory)) + { + foreach (var item in _inventory.GetHandOrInventoryEntities(bodyId)) + { + SharedTransform.AttachToGridOrMap(item); + gibs.Add(item); + } + } return gibs; } } From 68ed9784357a26b70402cdb6b28add4a55950953 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 17:16:22 -0400 Subject: [PATCH 14/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ff8aa62cfe7..a5edc43947c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: tom-leys - changes: - - {message: 'After a flurry of memos, the Atmospheric Technician''s remote no longer - opens the Chief Engineer''s door. So I guess fires in that room are considered - "totally normal" by command. To compensate, the remotes are more widely available - in more stations. Thanks Wookyskill.', type: Tweak} - id: 4524 - time: '2023-08-11T22:18:40.0000000+00:00' - author: mirrorcult changes: - {message: Mobs with crit states that die will now perform a visible emote., type: Add} @@ -2929,3 +2921,9 @@ Entries: of the type of cable., type: Tweak} id: 5023 time: '2023-10-18T21:04:47.0000000+00:00' +- author: Doru991 + changes: + - {message: Being gibbed through normal means will no longer delete all items on + the body., type: Fix} + id: 5024 + time: '2023-10-18T21:15:17.0000000+00:00' From 83acaa5bf2b021e015cb96ef24c77c6495434b25 Mon Sep 17 00:00:00 2001 From: Velcroboy <107660393+IamVelcroboy@users.noreply.github.com> Date: Wed, 18 Oct 2023 22:43:52 -0500 Subject: [PATCH 15/30] Add security beacon (#21048) Co-authored-by: Jeff --- Resources/Prototypes/Entities/Markers/warp_point.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Resources/Prototypes/Entities/Markers/warp_point.yml b/Resources/Prototypes/Entities/Markers/warp_point.yml index 8e15994dc5f..da109f6212b 100644 --- a/Resources/Prototypes/Entities/Markers/warp_point.yml +++ b/Resources/Prototypes/Entities/Markers/warp_point.yml @@ -109,6 +109,17 @@ - type: WarpPoint location: science +- type: entity + id: WarpPointBeaconSecurity + parent: WarpPointBeacon + name: warp point (security) + components: + - type: NavMapBeacon + text: security + color: "#DE3A3A" + - type: WarpPoint + location: security + - type: entity id: WarpPointBeaconService parent: WarpPointBeacon From 4ca9227294d9a185aeff355352fe13ad1d626f5e Mon Sep 17 00:00:00 2001 From: Vasilis Date: Thu, 19 Oct 2023 05:44:06 +0200 Subject: [PATCH 16/30] Add sufix to sci flash (#21095) * Add sufix to flash * It's 4 am please help --- Resources/Prototypes/Entities/Objects/Weapons/security.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/security.yml b/Resources/Prototypes/Entities/Objects/Weapons/security.yml index eafcc46815d..92e7dbd4c1d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/security.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/security.yml @@ -144,6 +144,7 @@ - type: entity name: flash parent: Flash + suffix: 2 charges id: SciFlash components: - type: LimitedCharges From 5703776232e34ea773ef67db772a446a6e930a55 Mon Sep 17 00:00:00 2001 From: KingFroozy <140668342+KingFroozy@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:44:58 +0300 Subject: [PATCH 17/30] Atmos-tech's casual jumpsuit resprite (#20989) * Pixels go brrr * Update meta.json --- .../equipped-INNERCLOTHING-monkey.png | Bin 20591 -> 1266 bytes .../equipped-INNERCLOTHING.png | Bin 708 -> 638 bytes .../Jumpsuit/atmos_casual.rsi/icon.png | Bin 355 -> 299 bytes .../Jumpsuit/atmos_casual.rsi/inhand-left.png | Bin 408 -> 499 bytes .../atmos_casual.rsi/inhand-right.png | Bin 416 -> 512 bytes .../Jumpsuit/atmos_casual.rsi/meta.json | 4 ++-- 6 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/equipped-INNERCLOTHING-monkey.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/equipped-INNERCLOTHING-monkey.png index 95744ee74947feece8ba8747bfd4f14173628612..4d2bc04576b6a40951077d45a1cf0938f9b72344 100644 GIT binary patch delta 1247 zcmV<51R(qGpaJp;kR*Qrb5ch_0Itp)=>Px(tVu*cRCt{2nonpPRUF4ZPxP`Tg+R?h zBROc)AcUp$5Xd2!o5>|$JV*}~&t+%lB4MK-IoXnUnVsOtLx_}~l0r_^)2^T-C@Fif z5!*{?tQ%?&8wVl9Uk|f0`!`|UB)fs+ePEcG-_E}8Z{EE3dozFU_rPE<7z_r3;hdu4 zUg+i_GYr<2C&eo^)+e?97MBrg%fn6C3c$H}@{YFXzar6Z#RElB{g>j3=Vk+OH)RLL zoG0~rH)Z4a)#H482NLVA&epaL>mz#vH+oCN%_Fjha7!e#$sXe7Yc@B3a!$DU_WEwV zwzbob%gafeDy@HmOe?fx|$o%o+LD=-$>0fy_xaQe|_WEGQif^%EKvekC9Uurs6Vs4R zr*Vi^BzzuD=S(>Y6rpbw^oCL|Db#q`hdO*@XiHT^)21v zw0ZB+3S57xo;2+p-vc^O0pXJz8yn-J@t?@eHumv}X(%i-UfT)Aez^_fwHQ=dukE8i z*h#`Mx47Im4i}f}#^NsOiwMz{P(S`CP$dd_BcdGNQ;zSc^7hF^{n+}xr;T zAKDY3)dJjSl)@;l010eA)?d}pk=S4`7z_r(8A9)4sEg=+);6P5yj#=%7C2+XeicsgMB+Y$ z)8yQ@08;^{?Z9bs?khlRKAj4E$K?neB8t=$5wEl->gp}ZZe%&31(MM<<^q8kKS4L9$M2-cRq56A8TGNq7t zoBEt!r*Ts@GH)YO#~)_3x`5-i=IN_Vuj{m=!|K)sI0ib(p0vc$_ z2G<8f$M+O#i(17cdSah_+&=%Lo10I{Y3myd27|$1Fc{7PF954`X;CI9bRhr$002ov JPDHLkV1kxTZTbKJ literal 20591 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 diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/equipped-INNERCLOTHING.png index 3c93a0aa7696e8220b6d571ec90d693026d3dcda..567435a374461b3346a26f931b99af3d5ad5ab59 100644 GIT binary patch delta 528 zcmX@Y`j2ITA*1(1C!hLHrxCV!Y-A~eqws^xBbhU%XtnPlyiRv`W8+Nxo9Y_CSG&r)9C{C2Mm8q6)Jyz z_B`n;=ge{Am8gPf=cQvTmmb@k-*~ltKcl9?ku6I&B-~i8Id>>-+4cLHrQ)&^oXk!a z-#2)zX9!Vx#C^$Fs~fikvhN=$x<2q3jyJcCDNHkKw}G z*bB@l4E;q{+g|i@W$mrw@9<@qmnajn@cZ0*3?Ap^EMlzT6fLlOdiv`m|8&-Zy4uJ0 z>#G-+dut?yJXpi^!?3EZM~mUWN#8I=qh`he8MOnt=NNjvs54i1Zn)RHHjY`Xt4Qj2 zK>a%3uM9E`^~?_Y?HB#NCGF6~apl3+gDOmJXA>^`P*8JLRVkEL?Bi{VXgH$g%)a5b z$J*)}3_Jd3GZ=D+HB4t%%^Gnq#;GT!ahLYxZS`kFT|^yX>)kGFFE!+_*#0c>LQJ{V zi(UEe`OW^;-}GF;C@-|V<|@PW8f{Cigh`TLzMcCU&$YtZ`?HquL5X_x1s7+kRo5tP znY;eKl;i%^$1QRRHqC{H*cL>snbh!`VeL+DA8UrgG8vNRx2^oAV8;yq}AGL zoA-ZHcQ2QggMgjU8U2xUNI3TRLNEo~^h0fc4M6=Wz;$x#YEb9gZnwi#V^I>gPP*!? z6pRkNdDRx`QFnbm_%H=O^!*xv{xEnHZ5;_p_+XG7(W3xnlDU3U0WYQ8~X|% z^_LpjLV&kN385q`J^`4BhkplPW|$E98WLG8K4tu+GL9qXPXUaq79X;H`lR4J03HeJ zqL2R8&j3E6GytM1;INO!*JIotG|qK+JMr(`_+|u)G|t5lNYPki0DMD~Isl$bVt*nF zkS8<%GQK82ehXE=n*YB5vJzC61Ni4N{L97oX@C!OoG>U=PRAt8pQ$$k^KL=^+C+ z0I={?#5EsVdmYfthm1OaJCAF;0)OV`34onNQ>Q%F?usx4UXnDX(t2>*yxSvShD#F+ zfNo=NrxUwar~LW*>46XdDhyMMiVL&*-lK(-!mv-Y-Er TBur9_00000NkvXXu0mjfs$Ba& diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/icon.png index 02e22ce0d5fb25a7f90edf6f33f5233c50ce019c..0ccbcfd86bd1ff4d1c691a4c3208450dd55bd658 100644 GIT binary patch delta 169 zcmV;a09OCw0;>X$F_A%Be~C#%K~y-6?a)CE10e_n(Ek;o>P$QLKW&*slcABc`<6sD zJO#w@A@F;^Xr&a-2{6!VsYX}^M6H@i0<1xrnl?eR1Q58v^BPQrh;%>Dxtw9bZx4S3 zmwH$e6d586e-i-Uz;gn;0lfto#1(9P?Du{2EdxCJ^KFO-&J~z~ALH?gY>Q?5!I$6( XaxXazgxi_a00000NkvXXu0mjfOS4Gm delta 223 zcmV<503iRX0^CpdhL#CDqeUl%Ov; z<^CC!4hzLRa=4XiL9`eQH!D1Xgra8lLMV@5LC~BKxQ!a%YoIwJf{HA(uQ2k1lYj*w z_?<@(;SRw)*dSq9r+IsC^RzCb(qRD;4&p|rSW*ISjXEkFUb5CIDmX`ez``Ye;lqQ_ Z+74O3Ij(Qy*zN!T002ovPDHLkV1gX%ToV8Q diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/inhand-left.png index 95489b82685eaeb7fdfb0450915380f8a2aa5408..a9f940b4d00691502b9970cfce756a14a87fe8a4 100644 GIT binary patch delta 484 zcmVrr8Gi-<0063Kaozv`00DDSM?wIu&K&6g00FH@L_t(|obB1YPQp+a z#_>PK$qOi}g9DqRlQ}nFm|VRBz}0vG#>B*ga04cW&1k~pNMiykYz(p(7Z|(&hU3s; zz!Z@3ik{^8Z9TM4o3|ef4~U3}h=_=Yh=@oowT5rs;j`BB=6`)(YTw~==Pj^fl2U8< z`d&5jr}|!X{UKQAEnzc&lq)lLasDIYiCDwj@wJ9`kWy>7DKU*xS|^9@KZW_pLBC}MVd?TfX}Tf+1scv#}=J&jv4 zckG|!Wigp#{R02;dP)>U6pKZibHs7XXf$Fx9&>!~!1?vh&t;vr%&tWUK;`5CS5EF! z{~25fTs7SutUms?^A<6CmoCp1|L0%buYVrvJP{EQ5nT}x5fKpyoKYKX+6!!rVS60r z08$ohba(?WZll8+fN^^q-T;i-%mhG`wJG^aH?QxJ#0H{3{ a5gVV5u@>j$32+$z0000NS%G}50G|-o zi4_b77BH+{z53?OoB!W2Ff^@W$eYZt^nXuJPe@2ec6K&HP-#^xP&LCQNgI&Kd?i7C z!T*r~gX@7iCx9}X1s;*b3=H*rhk>dNGak=hkpdLG>*?Yc65;-K>Orm+10I*)tta0_ z{r_LSeWBo#GY2MdH@vB%|9qI9aYgM(83#JZ@a&9W0VoN#aHH`g$BNU1+<#v5R^ z!|_1O@1m!V%}(*?N9@$vb8F3lGas6cIr$tqo5q^TR?&Rzm;Uv0yEUX49D78TICwg8 zOKpPOPli_L|bWm__H_R b_P(vm$Ml!AJYoa-l)=;0&t;txQ$iB}Ro13` diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/inhand-right.png index 53fde2ef924c0e8bca8d34b9712497a6db7ebad1..8ab7f969dc0c96d344e76a27df2cb08e0b0162a8 100644 GIT binary patch delta 497 zcmVC&~z<*fKn(FBrhNoH>u#%F`=NVZVq)RU3BORI9!J$ zC7PVM7|^@&{kBUk$Cv-bbNB;9L_|bHL_|bH1OV`SxqB(-Lx1L7H-hKOppR^}g1l#{ z#d`H_?yX+ETe#@aRmhuPfSCMARn+sPa1Tv*9Kyxc%WmaY$QHo!CE6VTKsW|4kTSUz zj^jD)jyYe!Zr&u@KuVpw*#dlj0m~5pV7>r?O${#>8w8sg=8JgFaum%oLB+h;0=zxf zFq;AZTFvOQntx0t5N-9vtS-oSAjG#U*EArOWkR;v}(>ou+}hq!ynfA$orll}yR{+~O#wF+#z_yNY3HoP%Z5?Axr4K>dI>tq`cg?nru`XqI nIFD@|V;!Y-j2&1a`fq*#Ug{R-zK2;x00000NkvXXu0mjf93g!S%qM6F?cx0*}aI28MdR!$4Js8IR|$NCApI^>lFziEw{A)tm3I0uQUN(3@?F z-}mSJ)U;UVQgC|Nr1ZwrFGk!VFAsiHRx@xs#G>YLMyMfr+R@&d>uwqyJh*Gk$1~CL z6W2DKecV+iEfll4^1!nWIhVWx3Y$Y2T>KYVd`{(`xmI0hZ^ws!zx#7!ziz76F^}0i znWe)nu1dzRBS-Mf3*jBl*Y=+fb97*0IW%Frol^9Dg_a-LtrOp;ZsXc_9BAW=11y~@ znS5R6Z`iTouHz1ez>B@pu7#L1b05>5b@0%vuDlOhmL>Y9ahZtTO#mu0pWzUEk@p|l mtS-BUP3wPDA1vI%=u~)2ze1vEG6Mq_1B0ilpUXO@geCy@!K|+U diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/meta.json index a83b7d7f366..7cd0cba745c 100644 --- a/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/meta.json +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/atmos_casual.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Edited from the atmos jumpsuit and grey jumpsuit by Flareguy for Space Station 14. In hand sprite scaled down by potato1234_x, monkey made by brainfood1183 (github)", + "copyright": "Sprited by KingFroozy (github) for space station 14", "size": { "x": 32, "y": 32 @@ -27,4 +27,4 @@ "directions": 4 } ] -} \ No newline at end of file +} From 3e32e757372f0cba3bb8de3ddb9e52b8f1c3ef41 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 23:46:02 -0400 Subject: [PATCH 18/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a5edc43947c..ab9119b8c12 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,14 +1,4 @@ Entries: -- author: mirrorcult - changes: - - {message: Mobs with crit states that die will now perform a visible emote., type: Add} - - {message: 'Succumbing in crit is more accessible, as it''s also an action now', - type: Tweak} - - {message: 'You can now say your ''last words'' while in crit. This action will - let you whisper up to 30 characters, then kill you.', type: Add} - - {message: You can fake your own deathgasp emote using an action in crit., type: Add} - id: 4525 - time: '2023-08-12T05:56:34.0000000+00:00' - author: CrigCrag changes: - {message: Pickaxes are now 80 size and take more wood and steel to manufacture., @@ -2927,3 +2917,8 @@ Entries: the body., type: Fix} id: 5024 time: '2023-10-18T21:15:17.0000000+00:00' +- author: KingFroozy + changes: + - {message: Atmospheric technician's casual jumpsuit was resprited., type: Tweak} + id: 5025 + time: '2023-10-19T03:44:58.0000000+00:00' From e04d6a312c940803544adc4ee287fa633c1a3db8 Mon Sep 17 00:00:00 2001 From: Vasilis Date: Thu, 19 Oct 2023 05:48:55 +0200 Subject: [PATCH 19/30] Fixed players without headrevs ticked being picked anyway (#20895) * Fixy fix fix uwu merge pwease * admin message to inform them * oop --- Content.Server/Antag/AntagSelectionSystem.cs | 3 +-- .../Rules/Components/RevolutionaryRuleComponent.cs | 3 +++ .../GameTicking/Rules/RevolutionaryRuleSystem.cs | 9 +++++++-- .../game-ticking/game-presets/preset-revolutionary.ftl | 1 + 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index f1ca1817569..5e323f5ab8e 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -116,14 +116,13 @@ public void EligiblePlayers(string antagPrototype, var antags = Math.Clamp(allPlayers.Count / antagsPerPlayer, 1, maxAntags); for (var antag = 0; antag < antags; antag++) { - IPlayerSession chosenPlayer; + IPlayerSession chosenPlayer = null!; if (prefList.Count == 0) { if (playerList.Count == 0) { break; } - chosenPlayer = _random.PickAndTake(playerList); } else { diff --git a/Content.Server/GameTicking/Rules/Components/RevolutionaryRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/RevolutionaryRuleComponent.cs index f015f8bd573..7d036c615ba 100644 --- a/Content.Server/GameTicking/Rules/Components/RevolutionaryRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/RevolutionaryRuleComponent.cs @@ -29,6 +29,9 @@ public sealed partial class RevolutionaryRuleComponent : Component [DataField] public Dictionary HeadRevs = new(); + [DataField] + public ProtoId HeadRevPrototypeId = "HeadRev"; + [DataField] public ProtoId RevPrototypeId = "Rev"; diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index d6195aaa540..54b45f59e94 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -142,9 +142,14 @@ private void OnPlayerJobAssigned(RulePlayerJobsAssignedEvent ev) var query = QueryActiveRules(); while (query.MoveNext(out _, out var comp, out _)) { - _antagSelection.EligiblePlayers(comp.RevPrototypeId, comp.MaxHeadRevs, comp.PlayersPerHeadRev, comp.HeadRevStartSound, + _antagSelection.EligiblePlayers(comp.HeadRevPrototypeId, comp.MaxHeadRevs, comp.PlayersPerHeadRev, comp.HeadRevStartSound, "head-rev-role-greeting", "#5e9cff", out var chosen); - GiveHeadRev(chosen, comp.RevPrototypeId, comp); + if (!chosen.Any()) + GiveHeadRev(chosen, comp.RevPrototypeId, comp); + else + { + _chatManager.SendAdminAnnouncement(Loc.GetString("rev-no-heads")); + } } } diff --git a/Resources/Locale/en-US/game-ticking/game-presets/preset-revolutionary.ftl b/Resources/Locale/en-US/game-ticking/game-presets/preset-revolutionary.ftl index 8bcdc249775..89588021618 100644 --- a/Resources/Locale/en-US/game-ticking/game-presets/preset-revolutionary.ftl +++ b/Resources/Locale/en-US/game-ticking/game-presets/preset-revolutionary.ftl @@ -46,6 +46,7 @@ rev-description = Revolutionaries are among us. rev-not-enough-ready-players = Not enough players readied up for the game. There were {$readyPlayersCount} players readied up out of {$minimumPlayers} needed. Can't start a Revolution. rev-no-one-ready = No players readied up! Can't start a Revolution. +rev-no-heads = There were no Head Revolutionaries to be selected. Can't start a Revolution. rev-all-heads-dead = All the heads are dead, now finish up the rest of the crew! From 0a4c16ca21e266c24243119d944cbff8084829dd Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Thu, 19 Oct 2023 04:49:51 +0100 Subject: [PATCH 20/30] make meat sizzle when cooked (#20877) * make meat sizzle when cooked * fixy * better sound * vorbis ops * fade out --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- Resources/Audio/Effects/attributions.yml | 5 +++ Resources/Audio/Effects/sizzle.ogg | Bin 0 -> 59043 bytes .../Construction/Graphs/food/steak.yml | 30 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 Resources/Audio/Effects/sizzle.ogg diff --git a/Resources/Audio/Effects/attributions.yml b/Resources/Audio/Effects/attributions.yml index 556c4603a5a..7fd46a02417 100644 --- a/Resources/Audio/Effects/attributions.yml +++ b/Resources/Audio/Effects/attributions.yml @@ -67,3 +67,8 @@ license: "CC-BY-4.0" copyright: "Taken from InspectorJ via freesound.org and mixed from stereo to mono." source: "https://freesound.org/people/InspectorJ/sounds/411642/" + +- files: ["sizzle.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Recorded by deltanedas for SS14" + source: "https://github.com/deltanedas" diff --git a/Resources/Audio/Effects/sizzle.ogg b/Resources/Audio/Effects/sizzle.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2c39b87490d0d21f36a0ba4c3640f2bfa95e84e2 GIT binary patch literal 59043 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 Rcz1xM-eqMwG{E0c01jNF*u?+< literal 0 HcmV?d00001 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/food/steak.yml b/Resources/Prototypes/Recipes/Construction/Graphs/food/steak.yml index a2fa2ec6b03..bbf8f5ef54d 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/food/steak.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/food/steak.yml @@ -7,6 +7,9 @@ - node: start edges: - to: meat steak + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 335 @@ -22,6 +25,9 @@ - node: start edges: - to: cooked penguin + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 345 @@ -37,6 +43,9 @@ - node: start edges: - to: cooked chicken + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 345 @@ -52,6 +61,9 @@ - node: start edges: - to: cooked duck + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 335 #duck is actually culinarily red meat IRL and has a lower min temp than other poultry @@ -67,6 +79,9 @@ - node: start edges: - to: lizard steak + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 345 @@ -82,6 +97,9 @@ - node: start edges: - to: filet migrawr + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 345 #apparently trichinellosis is a concern @@ -97,6 +115,9 @@ - node: start edges: - to: cooked crab + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 335 @@ -112,6 +133,9 @@ - node: start edges: - to: goliath steak + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 345 #I dunno what this is but I don't want whatever parasites are inside @@ -126,6 +150,9 @@ - node: start edges: - to: rouny steak + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 445 #rouny - node: rouny steak @@ -139,6 +166,9 @@ - node: start edges: - to: bacon + completed: + - !type:PlaySound + sound: /Audio/Effects/sizzle.ogg steps: - minTemperature: 345 - node: bacon From 41ec40a0d3d30914228665000936ed02dcfe3db1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 18 Oct 2023 23:49:59 -0400 Subject: [PATCH 21/30] Automatic changelog update --- Resources/Changelog/Changelog.yml | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ab9119b8c12..e4544db1d8a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,10 +1,4 @@ Entries: -- author: CrigCrag - changes: - - {message: Pickaxes are now 80 size and take more wood and steel to manufacture., - type: Tweak} - id: 4526 - time: '2023-08-12T06:17:26.0000000+00:00' - author: Ilya246 changes: - {message: Traitors can now exist along with nuclear operatives., type: Add} @@ -2922,3 +2916,10 @@ Entries: - {message: Atmospheric technician's casual jumpsuit was resprited., type: Tweak} id: 5025 time: '2023-10-19T03:44:58.0000000+00:00' +- author: Vasilis + changes: + - {message: You will no longer be picked as a head revolutionary if you have not + checked it in the antag picker. Note you can still become a revolutionary if + someone converts you., type: Fix} + id: 5026 + time: '2023-10-19T03:48:56.0000000+00:00' From 3be48bed3b075332a4f19786a3556d93740e640c Mon Sep 17 00:00:00 2001 From: Panzer <146987057+Panzer-IV1@users.noreply.github.com> Date: Thu, 19 Oct 2023 06:52:12 +0300 Subject: [PATCH 22/30] wet floor bomb properties (#20823) * wet floor bomb prop made it more powerful * Update uplink_catalog.yml Made it clearer and credited myself --- Resources/Prototypes/Catalog/uplink_catalog.yml | 2 +- .../Entities/Objects/Specific/Janitorial/janitor.yml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 5c6bad28fa1..10dee0b804c 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -977,7 +977,7 @@ description: uplink-proximity-mine-desc productEntity: WetFloorSignMineExplosive cost: - Telecrystal: 4 + Telecrystal: 5 # was 4, with my buff made it 5 to be closer to minibomb -panzer categories: - UplinkJob conditions: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index 3ae89e0d1c0..333c17b2171 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -246,9 +246,9 @@ - type: LandMine - type: ExplodeOnTrigger - type: Explosive - explosionType: Default - maxIntensity: 5 # about a ~67.5 total damage - totalIntensity: 60 # about a ~3 tile radius + explosionType: HardBomb # normally Default and max 5 total 60 + maxIntensity: 10 # about a ~67.5 total damage + totalIntensity: 30 # about a ~3 tile radius canCreateVacuum: false - type: DeleteOnTrigger - type: OnUseTimerTrigger From 8d070d4758537da7abdbc5b8ff1a300d0c26a5a7 Mon Sep 17 00:00:00 2001 From: Itzbenz <49940811+Itzbenz@users.noreply.github.com> Date: Thu, 19 Oct 2023 11:53:32 +0800 Subject: [PATCH 23/30] Allow Chemical Dispenser to be scrollable (#20800) --- .../Chemistry/UI/ReagentDispenserWindow.xaml | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml b/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml index d01454eb7a7..e17586db14e 100644 --- a/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml +++ b/Content.Client/Chemistry/UI/ReagentDispenserWindow.xaml @@ -18,8 +18,10 @@