From 9dd569dfd5fe3c9fafcd7000d019358a63fe73ae Mon Sep 17 00:00:00 2001
From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>
Date: Sun, 8 Sep 2024 17:39:19 +0300
Subject: [PATCH 01/13] Make Height Sliders Affect Your Bloodstream Volume
(#858)
# Description
Something that just makes sense, this makes your effect character weight
affect your bloodstream volume. As a minimum size felinid you will get
33% of normal blood volume, whereas as something as huge as a lamia you
may get up to 3 times the normal blood volume.
The resulting volume of your bloodstream can be calculated as `V =
clamp(normal_volume * mass_contest ^ 0.6)` (assuming default
parameters), where mass_contest is the result of a mass contest between
your entity and the average humanoid. For average species like vulps,
this means that their bloodstream can become up to ~40% smaller than
normal (at minimum size), or up to 50% larger than normal (at maximum
size). For onis the range is shifted towards higher values, a maximum
size oni will have twice as much blood as an average human.
This has both drawbacks and advantages. For instance, having little
blood means you can bleed out easily, but at the same time it means it
will take way less blood packs/saline/iron/proteins to restore your
blood to the normal level. Opposite is also true, having more blood
means you will be harder to heal.
Also, this PR slightly refactors the HeightAdjustSystem to be more
flexible.
# Changelog
:cl:
- add: Your character size now affects your blood level. Smaller
characters will have less blood, and larger characters will have more.
---------
Signed-off-by: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>
Co-authored-by: VMSolidus
Co-authored-by: DEATHB4DEFEAT <77995199+DEATHB4DEFEAT@users.noreply.github.com>
---
.../HeightAdjust/BloodstreamAdjustSystem.cs | 45 +++++++++++++++++++
.../BloodstreamAffectedByMassComponent.cs | 26 +++++++++++
Content.Shared/CCVar/CCVars.cs | 9 ++++
.../HeightAdjust/HeightAdjustSystem.cs | 24 ++--------
.../HeightAdjust/HeightAdjustedEvent.cs | 11 +++++
.../Prototypes/Entities/Mobs/Species/base.yml | 2 +
6 files changed, 96 insertions(+), 21 deletions(-)
create mode 100644 Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs
create mode 100644 Content.Server/HeightAdjust/BloodstreamAffectedByMassComponent.cs
create mode 100644 Content.Shared/HeightAdjust/HeightAdjustedEvent.cs
diff --git a/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs b/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs
new file mode 100644
index 00000000000..92e03e0c111
--- /dev/null
+++ b/Content.Server/HeightAdjust/BloodstreamAdjustSystem.cs
@@ -0,0 +1,45 @@
+using Content.Server.Body.Components;
+using Content.Server.Chemistry.Containers.EntitySystems;
+using Content.Shared.CCVar;
+using Content.Shared.Chemistry.Reagent;
+using Content.Shared.Contests;
+using Content.Shared.HeightAdjust;
+using Robust.Shared.Configuration;
+
+namespace Content.Server.HeightAdjust;
+
+public sealed class BloodstreamAdjustSystem : EntitySystem
+{
+ [Dependency] private readonly IConfigurationManager _config = default!;
+ [Dependency] private readonly ContestsSystem _contests = default!;
+ [Dependency] private readonly SolutionContainerSystem _solutionContainer = default!;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent((uid, comp, _) => TryAdjustBloodstream((uid, comp)));
+ SubscribeLocalEvent((uid, comp, _) => TryAdjustBloodstream((uid, comp)));
+ }
+
+ ///
+ /// Adjusts the bloodstream of the specified entity based on the settings provided by the component.
+ ///
+ public bool TryAdjustBloodstream(Entity ent)
+ {
+ if (!TryComp(ent, out var bloodstream)
+ || !_solutionContainer.TryGetSolution(ent.Owner, bloodstream.BloodSolutionName, out var bloodSolutionEnt)
+ || !_config.GetCVar(CCVars.HeightAdjustModifiesBloodstream))
+ return false;
+
+ var bloodSolution = bloodSolutionEnt.Value.Comp.Solution;
+
+ var factor = Math.Pow(_contests.MassContest(ent, bypassClamp: true, rangeFactor: 4f), ent.Comp.Power);
+ factor = Math.Clamp(factor, ent.Comp.Min, ent.Comp.Max);
+
+ var newVolume = bloodstream.BloodMaxVolume * factor;
+ var newBloodLevel = bloodSolution.FillFraction * newVolume;
+ bloodSolution.MaxVolume = newVolume;
+ bloodSolution.SetContents([new ReagentQuantity(bloodstream.BloodReagent, newBloodLevel, null)], false);
+
+ return true;
+ }
+}
diff --git a/Content.Server/HeightAdjust/BloodstreamAffectedByMassComponent.cs b/Content.Server/HeightAdjust/BloodstreamAffectedByMassComponent.cs
new file mode 100644
index 00000000000..f6c3a0e250c
--- /dev/null
+++ b/Content.Server/HeightAdjust/BloodstreamAffectedByMassComponent.cs
@@ -0,0 +1,26 @@
+using Content.Server.Body.Components;
+
+namespace Content.Server.HeightAdjust;
+
+///
+/// When applied to a humanoid or any mob, adjusts their blood level based on the mass contest between them
+/// and an average humanoid.
+///
+/// The formula for the resulting bloodstream volume is V = BloodMaxVolume * MassContest^Power
+/// clamped between the specified Min and Max values.
+///
+[RegisterComponent]
+public sealed partial class BloodstreamAffectedByMassComponent : Component
+{
+ ///
+ /// Minimum and maximum resulting volume factors. A minimum value of 0.5 means that the resulting volume will be at least 50% of the original.
+ ///
+ [DataField]
+ public float Min = 1 / 3f, Max = 3f;
+
+ ///
+ /// The power to which the outcome of the mass contest will be risen.
+ ///
+ [DataField]
+ public float Power = 1f;
+}
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index 84a8e460c59..1501c92f88e 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -2341,6 +2341,15 @@ public static readonly CVarDef
public static readonly CVarDef HeightAdjustModifiesZoom =
CVarDef.Create("heightadjust.modifies_zoom", false, CVar.SERVERONLY);
+ ///
+ /// Whether height & width sliders adjust a player's bloodstream volume.
+ ///
+ ///
+ /// This can be configured more precisely by modifying BloodstreamAffectedByMassComponent.
+ ///
+ public static readonly CVarDef HeightAdjustModifiesBloodstream =
+ CVarDef.Create("heightadjust.modifies_bloodstream", true, CVar.SERVERONLY);
+
///
/// Enables station goals
///
diff --git a/Content.Shared/HeightAdjust/HeightAdjustSystem.cs b/Content.Shared/HeightAdjust/HeightAdjustSystem.cs
index 46b2d9b656f..8bfdaccfd13 100644
--- a/Content.Shared/HeightAdjust/HeightAdjustSystem.cs
+++ b/Content.Shared/HeightAdjust/HeightAdjustSystem.cs
@@ -25,27 +25,7 @@ public sealed class HeightAdjustSystem : EntitySystem
/// True if all operations succeeded
public bool SetScale(EntityUid uid, float scale)
{
- var succeeded = true;
- if (_config.GetCVar(CCVars.HeightAdjustModifiesZoom) && EntityManager.TryGetComponent(uid, out var eye))
- _eye.SetMaxZoom(uid, eye.MaxZoom * scale);
- else
- succeeded = false;
-
- if (_config.GetCVar(CCVars.HeightAdjustModifiesHitbox) && EntityManager.TryGetComponent(uid, out var fixtures))
- foreach (var fixture in fixtures.Fixtures)
- _physics.SetRadius(uid, fixture.Key, fixture.Value, fixture.Value.Shape, MathF.MinMagnitude(fixture.Value.Shape.Radius * scale, 0.49f));
- else
- succeeded = false;
-
- if (EntityManager.HasComponent(uid))
- {
- _appearance.SetHeight(uid, scale);
- _appearance.SetWidth(uid, scale);
- }
- else
- succeeded = false;
-
- return succeeded;
+ return SetScale(uid, new Vector2(scale, scale));
}
///
@@ -75,6 +55,8 @@ public bool SetScale(EntityUid uid, Vector2 scale)
else
succeeded = false;
+ RaiseLocalEvent(uid, new HeightAdjustedEvent { NewScale = scale });
+
return succeeded;
}
}
diff --git a/Content.Shared/HeightAdjust/HeightAdjustedEvent.cs b/Content.Shared/HeightAdjust/HeightAdjustedEvent.cs
new file mode 100644
index 00000000000..3db856e0d83
--- /dev/null
+++ b/Content.Shared/HeightAdjust/HeightAdjustedEvent.cs
@@ -0,0 +1,11 @@
+using System.Numerics;
+
+namespace Content.Shared.HeightAdjust;
+
+///
+/// Raised on a humanoid after their scale has been adjusted in accordance with their profile and their physics have been updated.
+///
+public sealed class HeightAdjustedEvent : EntityEventArgs
+{
+ public Vector2 NewScale;
+}
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index 8200f0cdbff..33635eeec20 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -309,6 +309,8 @@
- type: OfferItem
- type: LayingDown
- type: Shoving
+ - type: BloodstreamAffectedByMass
+ power: 0.6 # A minimum size felinid will have 30% blood, a minimum size vulp will have 60%, a maximum size oni will have ~200%
- type: entity
save: false
From 5c48a1e48489939983feb9a03f5da75d6bcc029a Mon Sep 17 00:00:00 2001
From: Mnemotechnican <69920617+Mnemotechnician@users.noreply.github.com>
Date: Sun, 8 Sep 2024 17:42:30 +0300
Subject: [PATCH 02/13] Disable Quick Swap for Item Slots by Default (#856)
# Description
As was discussed on discord, quick swap is a feature that makes certain
things needlessly easy. You can instantly swap the magazine in a gun
without even paying attention to it, you can quickly swap cells in
IPCs/borgs, you can instantly swap the ID in your pda with that of
someone else without anyone noticing, et cetera. In my opinion, this is
unnecessary QOL that makes the game feel more bland and primitive.
Besides, it used to lead to odd and unwanted behavior, such as IPCs
being able to swap their own power cells.
In addition to that, certain entities do not support quick swap. For
instance, rechargers will stop working if you insert a power cell and
then quick-swap it before it finishes charging.
This PR makes quick swap disabled by default. It can still be re-enabled
by setting `ItemSlotsComponent.Slots.[ItemSlot].Swap = true` on
individual entities.
# Changelog
:cl:
- remove: Quick swap has been disabled for most item slots. This
primarily means you will have to eject power cells/magazines from
items/weapons/borgs before replacing them with different ones.
---
Content.Shared/CCVar/CCVars.cs | 6 ++++++
Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs | 3 ++-
Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs | 9 ++++++++-
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs
index 1501c92f88e..8fac5b3f636 100644
--- a/Content.Shared/CCVar/CCVars.cs
+++ b/Content.Shared/CCVar/CCVars.cs
@@ -402,6 +402,12 @@ public static readonly CVarDef
public static readonly CVarDef GamePressToSprint =
CVarDef.Create("game.press_to_sprint", true, CVar.REPLICATED);
+ ///
+ /// Whether item slots, such as power cell slots or AME fuel cell slots, should support quick swap if it is not otherwise specified in their YAML prototype.
+ ///
+ public static readonly CVarDef AllowSlotQuickSwap =
+ CVarDef.Create("game.slot_quick_swap", false, CVar.REPLICATED);
+
#if EXCEPTION_TOLERANCE
///
/// Amount of times round start must fail before the server is shut down.
diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs
index 42e7f721b3e..ba8a9a934e4 100644
--- a/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs
+++ b/Content.Shared/Containers/ItemSlot/ItemSlotsComponent.cs
@@ -214,6 +214,7 @@ public ItemSlot(ItemSlot other)
///
/// If the user interacts with an entity with an already-filled item slot, should they attempt to swap out the item?
+ /// If set to null, will be deduced based on the relevant config variable.
///
///
/// Useful for things like chem dispensers, but undesirable for things like the ID card console, where you
@@ -221,7 +222,7 @@ public ItemSlot(ItemSlot other)
///
[DataField]
[Access(typeof(ItemSlotsSystem), Other = AccessPermissions.ReadWriteExecute)]
- public bool Swap = true;
+ public bool? Swap = null;
public string? ID => ContainerSlot?.ID;
diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs
index 9cb21e882e3..c7932ef8f75 100644
--- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs
+++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs
@@ -1,6 +1,7 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.ActionBlocker;
using Content.Shared.Administration.Logs;
+using Content.Shared.CCVar;
using Content.Shared.Database;
using Content.Shared.Destructible;
using Content.Shared.Hands.Components;
@@ -10,6 +11,7 @@
using Content.Shared.Popups;
using Content.Shared.Verbs;
using Robust.Shared.Audio.Systems;
+using Robust.Shared.Configuration;
using Robust.Shared.Containers;
using Robust.Shared.GameStates;
using Robust.Shared.Utility;
@@ -27,11 +29,14 @@ public sealed class ItemSlotsSystem : EntitySystem
{
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!;
+ [Dependency] private readonly IConfigurationManager _config = default!;
[Dependency] private readonly SharedContainerSystem _containers = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly SharedAudioSystem _audioSystem = default!;
+ private bool _defaultQuickSwap;
+
public override void Initialize()
{
base.Initialize();
@@ -53,6 +58,8 @@ public override void Initialize()
SubscribeLocalEvent(HandleItemSlotsState);
SubscribeLocalEvent(HandleButtonPressed);
+
+ _config.OnValueChanged(CCVars.AllowSlotQuickSwap, b => _defaultQuickSwap = b, true);
}
#region ComponentManagement
@@ -202,7 +209,7 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera
if (!slot.InsertOnInteract)
continue;
- if (!CanInsert(uid, args.Used, args.User, slot, swap: slot.Swap, popup: args.User))
+ if (!CanInsert(uid, args.Used, args.User, slot, swap: slot.Swap ?? _defaultQuickSwap, popup: args.User))
continue;
// Drop the held item onto the floor. Return if the user cannot drop.
From 1580c4e49dbc2acca08601ce57373f992fd4179a Mon Sep 17 00:00:00 2001
From: SimpleStation Changelogs
Date: Sun, 8 Sep 2024 14:43:06 +0000
Subject: [PATCH 03/13] Automatic Changelog Update (#858)
---
Resources/Changelog/Changelog.yml | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 3a64146cdb6..87290d411ce 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -5985,3 +5985,12 @@ Entries:
id: 6325
time: '2024-09-07T03:59:44.0000000+00:00'
url: https://github.com/Simple-Station/Einstein-Engines/pull/861
+- author: Mnemotechnician
+ changes:
+ - type: Add
+ message: >-
+ Your character size now affects your blood level. Smaller characters
+ will have less blood, and larger characters will have more.
+ id: 6326
+ time: '2024-09-08T14:39:19.0000000+00:00'
+ url: https://github.com/Simple-Station/Einstein-Engines/pull/858
From d7b6c8238939dd9c116a1fa01911dbf2f88d5a67 Mon Sep 17 00:00:00 2001
From: SleepyScarecrow <136123749+SleepyScarecrow@users.noreply.github.com>
Date: Sun, 8 Sep 2024 10:43:50 -0400
Subject: [PATCH 04/13] Fixed some Comment Syntax (#851)
# Description
Fixed some comment syntax that annoyed me.
---
Resources/Locale/en-US/devices/device-network.ftl | 4 ++--
.../Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl | 4 ++--
Resources/Locale/en-US/revenant/revenant.ftl | 2 +-
Resources/Locale/en-US/weapons/melee/melee.ftl | 2 +-
4 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/Resources/Locale/en-US/devices/device-network.ftl b/Resources/Locale/en-US/devices/device-network.ftl
index d88b1f719da..2740143d519 100644
--- a/Resources/Locale/en-US/devices/device-network.ftl
+++ b/Resources/Locale/en-US/devices/device-network.ftl
@@ -31,7 +31,7 @@ device-address-prefix-freezer = FZR-
device-address-prefix-volume-pump = VPP-
device-address-prefix-smes = SMS-
-#PDAs and terminals
+# PDAs and terminals
device-address-prefix-console = CLS-
device-address-prefix-fire-alarm = FIR-
device-address-prefix-air-alarm = AIR-
@@ -40,7 +40,7 @@ device-address-prefix-sensor-monitor = MON-
device-address-examine-message = The device's address is {$address}.
-#Device net ID names
+# Device net ID names
device-net-id-private = Private
device-net-id-wired = Wired
device-net-id-wireless = Wireless
diff --git a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl
index 421dfe1484c..682e03ff772 100644
--- a/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl
+++ b/Resources/Locale/en-US/reagents/meta/consumable/drink/alcohol.ftl
@@ -37,8 +37,8 @@ reagent-desc-poison-wine = Is this even wine? Toxic! Hallucinogenic! Probably co
reagent-name-rum = rum
reagent-desc-rum = Distilled alcoholic drink made from sugarcane byproducts.
-#reagent-name-sake = sake
-#reagent-desc-sake = Alcoholic beverage made by fermenting rice that has been polished.
+# reagent-name-sake = sake
+# reagent-desc-sake = Alcoholic beverage made by fermenting rice that has been polished.
reagent-name-tequila = tequila
reagent-desc-tequila = A strong and mildly flavoured, mexican produced spirit.
diff --git a/Resources/Locale/en-US/revenant/revenant.ftl b/Resources/Locale/en-US/revenant/revenant.ftl
index f4ea6d79ff3..1d6bae7b343 100644
--- a/Resources/Locale/en-US/revenant/revenant.ftl
+++ b/Resources/Locale/en-US/revenant/revenant.ftl
@@ -16,7 +16,7 @@ revenant-soul-yield-low = {CAPITALIZE(THE($target))} has a below average soul.
revenant-soul-begin-harvest = {CAPITALIZE(THE($target))} suddenly rises slightly into the air, {POSS-ADJ($target)} skin turning an ashy gray.
revenant-soul-finish-harvest = {CAPITALIZE(THE($target))} slumps onto the ground!
-#UI
+# UI
revenant-user-interface-title = Ability Shop
revenant-user-interface-essence-amount = [color=plum]{$amount}[/color] Stolen Essence
diff --git a/Resources/Locale/en-US/weapons/melee/melee.ftl b/Resources/Locale/en-US/weapons/melee/melee.ftl
index 871d142504f..d3318ea2449 100644
--- a/Resources/Locale/en-US/weapons/melee/melee.ftl
+++ b/Resources/Locale/en-US/weapons/melee/melee.ftl
@@ -3,5 +3,5 @@ melee-inject-failed-hardsuit = Your {$weapon} cannot inject through hardsuits!
melee-balloon-pop = {CAPITALIZE(THE($balloon))} popped!
-#BatteryComponent
+# BatteryComponent
melee-battery-examine = It has enough charge for [color={$color}]{$count}[/color] hits.
From da02682353f9df335d0e80719725a7be39201ef3 Mon Sep 17 00:00:00 2001
From: router
Date: Sun, 8 Sep 2024 17:44:12 +0300
Subject: [PATCH 05/13] Add New Nuke Music (#850)
# Description
Nuff said.
I just wanted to make this and uhhhhh. It grew into its own thing.
---
# Changelog
:cl: router
- add: Added Chip Nightmare to the nuke music roster.
---
.../Audio/StationEvents/attributions.yml | 7 ++++++-
.../Audio/StationEvents/chip_nightmare.ogg | Bin 0 -> 3337960 bytes
.../Prototypes/SoundCollections/NukeMusic.yml | 3 ++-
3 files changed, 8 insertions(+), 2 deletions(-)
create mode 100644 Resources/Audio/StationEvents/chip_nightmare.ogg
diff --git a/Resources/Audio/StationEvents/attributions.yml b/Resources/Audio/StationEvents/attributions.yml
index e63b18a627f..9b3ad134841 100644
--- a/Resources/Audio/StationEvents/attributions.yml
+++ b/Resources/Audio/StationEvents/attributions.yml
@@ -6,4 +6,9 @@
- files: ["clearly_nuclear.ogg"]
license: "CC-BY-3.0"
copyright: "Created by mryikes"
- source: "https://www.youtube.com/watch?v=chix8uz-oUQ"
\ No newline at end of file
+ source: "https://www.youtube.com/watch?v=chix8uz-oUQ"
+
+- files: ["chip_nightmare.ogg"]
+ license: "CC-BY-SA-4.0"
+ copyright: "Created by BasedUser on top of chip-meltdown.mod by Reanimator (Thom)."
+ source: "http://ygg.baseduser.eu.org/chip-nightmare_ss14.ogg"
diff --git a/Resources/Audio/StationEvents/chip_nightmare.ogg b/Resources/Audio/StationEvents/chip_nightmare.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..c721c0ca24a8a10188528ba24b95e2a1df60ebf4
GIT binary patch
literal 3337960
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