]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Separate Udder examine into ExamineableHunger (#35164)
authorTayrtahn <tayrtahn@gmail.com>
Sat, 15 Feb 2025 04:29:40 +0000 (23:29 -0500)
committerGitHub <noreply@github.com>
Sat, 15 Feb 2025 04:29:40 +0000 (05:29 +0100)
* Separate udder hunger examine into ExamineableHunger

* Fluent grammar improvements

* Add ExamineableHunger to chickens and ducks.

* Use starving message as "dead" message

Content.Shared/Animals/UdderSystem.cs
Content.Shared/Nutrition/Components/ExamineableHungerComponent.cs [new file with mode: 0644]
Content.Shared/Nutrition/EntitySystems/ExamineableHungerSystem.cs [new file with mode: 0644]
Resources/Locale/en-US/animals/udder/udder-system.ftl
Resources/Locale/en-US/nutrition/components/examineable-hunger-component.ftl [new file with mode: 0644]
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml

index cb6e5b307fe9e513c82fbc3aa5acd077bfb12cdb..177fbab2f2a3ae97432158adb928cbc26535514a 100644 (file)
@@ -1,7 +1,6 @@
 using Content.Shared.Chemistry.Components;
 using Content.Shared.Chemistry.EntitySystems;
 using Content.Shared.DoAfter;
-using Content.Shared.Examine;
 using Content.Shared.IdentityManagement;
 using Content.Shared.Mobs.Systems;
 using Content.Shared.Nutrition.Components;
@@ -32,7 +31,6 @@ public sealed class UdderSystem : EntitySystem
         SubscribeLocalEvent<UdderComponent, MapInitEvent>(OnMapInit);
         SubscribeLocalEvent<UdderComponent, GetVerbsEvent<AlternativeVerb>>(AddMilkVerb);
         SubscribeLocalEvent<UdderComponent, MilkingDoAfterEvent>(OnDoAfter);
-        SubscribeLocalEvent<UdderComponent, ExaminedEvent>(OnExamine);
     }
 
     private void OnMapInit(EntityUid uid, UdderComponent component, MapInitEvent args)
@@ -140,50 +138,4 @@ public sealed class UdderSystem : EntitySystem
         };
         args.Verbs.Add(verb);
     }
-
-    /// <summary>
-    ///     Defines the text provided on examine.
-    ///     Changes depending on the amount of hunger the target has.
-    /// </summary>
-    private void OnExamine(Entity<UdderComponent> entity, ref ExaminedEvent args)
-    {
-
-        var entityIdentity = Identity.Entity(args.Examined, EntityManager);
-
-        string message;
-
-        // Check if the target has hunger, otherwise return not hungry.
-        if (!TryComp<HungerComponent>(entity, out var hunger))
-        {
-            message = Loc.GetString("udder-system-examine-none", ("entity", entityIdentity));
-            args.PushMarkup(message);
-            return;
-        }
-
-        // Choose the correct examine string based on HungerThreshold.
-        switch (_hunger.GetHungerThreshold(hunger))
-        {
-            case >= HungerThreshold.Overfed:
-                message = Loc.GetString("udder-system-examine-overfed", ("entity", entityIdentity));
-                break;
-
-            case HungerThreshold.Okay:
-                message = Loc.GetString("udder-system-examine-okay", ("entity", entityIdentity));
-                break;
-
-            case HungerThreshold.Peckish:
-                message = Loc.GetString("udder-system-examine-hungry", ("entity", entityIdentity));
-                break;
-
-            // There's a final hunger threshold called "dead" but animals don't actually die so we'll re-use this.
-            case <= HungerThreshold.Starving:
-                message = Loc.GetString("udder-system-examine-starved", ("entity", entityIdentity));
-                break;
-
-            default:
-                return;
-        }
-
-        args.PushMarkup(message);
-    }
 }
diff --git a/Content.Shared/Nutrition/Components/ExamineableHungerComponent.cs b/Content.Shared/Nutrition/Components/ExamineableHungerComponent.cs
new file mode 100644 (file)
index 0000000..00aba82
--- /dev/null
@@ -0,0 +1,31 @@
+using Content.Shared.Nutrition.EntitySystems;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Nutrition.Components;
+
+/// <summary>
+/// Adds text to the entity's description box based on its current hunger threshold.
+/// </summary>
+[RegisterComponent, NetworkedComponent]
+[Access(typeof(ExamineableHungerSystem))]
+public sealed partial class ExamineableHungerComponent : Component
+{
+    /// <summary>
+    /// Dictionary of hunger thresholds to LocIds of the messages to display.
+    /// </summary>
+    [DataField]
+    public Dictionary<HungerThreshold, LocId> Descriptions = new()
+    {
+        { HungerThreshold.Overfed, "examineable-hunger-component-examine-overfed"},
+        { HungerThreshold.Okay, "examineable-hunger-component-examine-okay"},
+        { HungerThreshold.Peckish, "examineable-hunger-component-examine-peckish"},
+        { HungerThreshold.Starving, "examineable-hunger-component-examine-starving"},
+        { HungerThreshold.Dead, "examineable-hunger-component-examine-starving"}
+    };
+
+    /// <summary>
+    /// LocId of a fallback message to display if the entity has no <see cref="HungerComponent"/>
+    /// or does not have a value in <see cref="Descriptions"/> for the current threshold.
+    /// </summary>
+    public LocId NoHungerDescription = "examineable-hunger-component-examine-none";
+}
diff --git a/Content.Shared/Nutrition/EntitySystems/ExamineableHungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/ExamineableHungerSystem.cs
new file mode 100644 (file)
index 0000000..e0ac767
--- /dev/null
@@ -0,0 +1,41 @@
+using Content.Shared.Examine;
+using Content.Shared.IdentityManagement;
+using Content.Shared.Nutrition.Components;
+
+namespace Content.Shared.Nutrition.EntitySystems;
+
+/// <inheritdoc cref="ExamineableHungerComponent"/>
+public sealed class ExamineableHungerSystem : EntitySystem
+{
+    [Dependency] private readonly HungerSystem _hunger = default!;
+    private EntityQuery<HungerComponent> _hungerQuery;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        _hungerQuery = GetEntityQuery<HungerComponent>();
+
+        SubscribeLocalEvent<ExamineableHungerComponent, ExaminedEvent>(OnExamine);
+    }
+
+    /// <summary>
+    ///     Defines the text provided on examine.
+    ///     Changes depending on the amount of hunger the target has.
+    /// </summary>
+    private void OnExamine(Entity<ExamineableHungerComponent> entity, ref ExaminedEvent args)
+    {
+        var identity = Identity.Entity(entity, EntityManager);
+
+        if (!_hungerQuery.TryComp(entity, out var hungerComp)
+            || !entity.Comp.Descriptions.TryGetValue(_hunger.GetHungerThreshold(hungerComp), out var locId))
+        {
+            // Use a fallback message if the entity has no HungerComponent
+            // or is missing a description for the current threshold
+            locId = entity.Comp.NoHungerDescription;
+        }
+
+        var msg = Loc.GetString(locId, ("entity", identity));
+        args.PushMarkup(msg);
+    }
+}
index 959a4fef59159d7597e32732ec36469e30ebdfdf..8479ae08bff035aea221b0262b3f692f61198eb0 100644 (file)
@@ -5,9 +5,3 @@ udder-system-success = You fill {THE($target)} with {$amount}u from the udder.
 udder-system-dry = The udder is dry.
 
 udder-system-verb-milk = Milk
-
-udder-system-examine-overfed = {CAPITALIZE(SUBJECT($entity))} looks stuffed!
-udder-system-examine-okay = {CAPITALIZE(SUBJECT($entity))} looks content.
-udder-system-examine-hungry = {CAPITALIZE(SUBJECT($entity))} looks hungry.
-udder-system-examine-starved = {CAPITALIZE(SUBJECT($entity))} looks starved!
-udder-system-examine-none = {CAPITALIZE(SUBJECT($entity))} seems not to get hungry.
diff --git a/Resources/Locale/en-US/nutrition/components/examineable-hunger-component.ftl b/Resources/Locale/en-US/nutrition/components/examineable-hunger-component.ftl
new file mode 100644 (file)
index 0000000..d8d9963
--- /dev/null
@@ -0,0 +1,5 @@
+examineable-hunger-component-examine-overfed = {CAPITALIZE(SUBJECT($entity))} {CONJUGATE-BASIC($entity, "look", "looks")} stuffed!
+examineable-hunger-component-examine-okay = {CAPITALIZE(SUBJECT($entity))} {CONJUGATE-BASIC($entity, "look", "looks")} content.
+examineable-hunger-component-examine-peckish = {CAPITALIZE(SUBJECT($entity))} {CONJUGATE-BASIC($entity, "look", "looks")} hungry.
+examineable-hunger-component-examine-starving = {CAPITALIZE(SUBJECT($entity))} {CONJUGATE-BASIC($entity, "look", "looks")} starved!
+examineable-hunger-component-examine-none = {CAPITALIZE(SUBJECT($entity))} {CONJUGATE-BASIC($entity, "seem", "seems")} not to get hungry.
index e71902db6b084016fe42ed318e34a954740d18d4..a33529cc48caf698b34e5fa05cfdc13237063f60 100644 (file)
   - type: EggLayer
     eggSpawn:
     - id: FoodEgg
+  - type: ExamineableHunger
   - type: ReplacementAccent
     accent: chicken
   - type: SentienceTarget
   - type: EggLayer
     eggSpawn:
     - id: FoodEgg
+  - type: ExamineableHunger
   - type: ReplacementAccent
     accent: duck
   - type: SentienceTarget
     reagentId: Milk
     quantityPerUpdate: 25
     growthDelay: 30
+  - type: ExamineableHunger
   - type: Butcherable
     spawned:
     - id: FoodMeat
     reagentId: MilkGoat
     quantityPerUpdate: 25
     growthDelay: 20
+  - type: ExamineableHunger
   - type: Wooly
   - type: Food
     solution: wool