]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
closet skeleton event (#19802)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Tue, 19 Sep 2023 05:05:17 +0000 (01:05 -0400)
committerGitHub <noreply@github.com>
Tue, 19 Sep 2023 05:05:17 +0000 (15:05 +1000)
Content.Server/StationEvents/Components/RandomEntityStorageSpawnRuleComponent.cs [new file with mode: 0644]
Content.Server/StationEvents/Events/RandomEntityStorageSpawnRule.cs [new file with mode: 0644]
Content.Shared/Humanoid/SkinColor.cs
Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl
Resources/Prototypes/Entities/Mobs/Player/skeleton.yml
Resources/Prototypes/GameRules/events.yml
Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml

diff --git a/Content.Server/StationEvents/Components/RandomEntityStorageSpawnRuleComponent.cs b/Content.Server/StationEvents/Components/RandomEntityStorageSpawnRuleComponent.cs
new file mode 100644 (file)
index 0000000..141ff1b
--- /dev/null
@@ -0,0 +1,18 @@
+using Content.Server.StationEvents.Events;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Server.StationEvents.Components;
+
+/// <summary>
+/// Spawns a single entity in a random EntityStorage on the station
+/// </summary>
+[RegisterComponent, Access(typeof(RandomEntityStorageSpawnRule))]
+public sealed partial class RandomEntityStorageSpawnRuleComponent : Component
+{
+    /// <summary>
+    /// The entity to be spawned.
+    /// </summary>
+    [DataField("prototype", required: true, customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string Prototype = string.Empty;
+}
diff --git a/Content.Server/StationEvents/Events/RandomEntityStorageSpawnRule.cs b/Content.Server/StationEvents/Events/RandomEntityStorageSpawnRule.cs
new file mode 100644 (file)
index 0000000..a9e8c43
--- /dev/null
@@ -0,0 +1,44 @@
+using Content.Server.GameTicking.Rules.Components;
+using Content.Server.StationEvents.Components;
+using Content.Server.Storage.Components;
+using Content.Server.Storage.EntitySystems;
+using Robust.Shared.Random;
+
+namespace Content.Server.StationEvents.Events;
+
+public sealed class RandomEntityStorageSpawnRule : StationEventSystem<RandomEntityStorageSpawnRuleComponent>
+{
+    [Dependency] private readonly EntityStorageSystem _entityStorage = default!;
+
+    protected override void Started(EntityUid uid, RandomEntityStorageSpawnRuleComponent comp, GameRuleComponent gameRule, GameRuleStartedEvent args)
+    {
+        base.Started(uid, comp, gameRule, args);
+
+        if (!TryGetRandomStation(out var station))
+            return;
+
+        var validLockers = new List<(EntityUid, EntityStorageComponent, TransformComponent)>();
+
+        var query = EntityQueryEnumerator<EntityStorageComponent, TransformComponent>();
+        while (query.MoveNext(out var ent, out var storage, out var xform))
+        {
+            if (StationSystem.GetOwningStation(ent, xform) != station)
+                continue;
+
+            if (!_entityStorage.CanInsert(ent, storage) || storage.Open)
+                continue;
+
+            validLockers.Add((ent, storage, xform));
+        }
+
+        if (validLockers.Count == 0)
+            return;
+
+        var (locker, storageComp, xformComp) = RobustRandom.Pick(validLockers);
+        var spawn = Spawn(comp.Prototype, xformComp.Coordinates);
+        if (!_entityStorage.Insert(spawn, locker, storageComp))
+        {
+            Del(spawn);
+        }
+    }
+}
index b38b426a19b42a63528787cca73926202bf757e1..89c78b7ea008834063ce4f311ea27e7955517fc1 100644 (file)
@@ -2,6 +2,9 @@ namespace Content.Shared.Humanoid;
 
 public static class SkinColor
 {
+    public const float MaxTintedHuesSaturation = 0.1f;
+    public const float MinTintedHuesLightness = 0.85f;
+
     public static Color ValidHumanSkinTone => Color.FromHsv(new Vector4(0.07f, 0.2f, 1f, 1f));
 
     /// <summary>
@@ -117,8 +120,9 @@ public static class SkinColor
     /// <returns>Tinted hue color</returns>
     public static Color TintedHues(Color color)
     {
-        var newColor = Color.ToHsv(color);
-        newColor.Y *= 0.1f;
+        var newColor = Color.ToHsl(color);
+        newColor.Y *= MaxTintedHuesSaturation;
+        newColor.Z = MathHelper.Lerp(MinTintedHuesLightness, 1f, newColor.Z);
 
         return Color.FromHsv(newColor);
     }
@@ -131,7 +135,7 @@ public static class SkinColor
     public static bool VerifyTintedHues(Color color)
     {
         // tinted hues just ensures saturation is always .1, or 10% saturation at all times
-        return Color.ToHsv(color).Y != .1f;
+        return Color.ToHsl(color).Y <= MaxTintedHuesSaturation && Color.ToHsl(color).Z >= MinTintedHuesLightness;
     }
 
     public static bool VerifySkinColor(HumanoidSkinColor type, Color color)
index 81604e8d6be921ccfefb717a19c018844577f678..9ab3e77cb63861b2fc360c79daed221a570feae2 100644 (file)
@@ -122,6 +122,9 @@ ghost-role-information-skeleton-pirate-description = Cause chaos and loot the st
 ghost-role-information-skeleton-biker-name = Skeleton Biker
 ghost-role-information-skeleton-biker-description = Ride around on your sweet ride.
 
+ghost-role-information-closet-skeleton-name = Closet Skeleton
+ghost-role-information-closet-skeleton-description = Wreak havoc! You are a primordial force with no allegiance. Live happily with the crew or wage sweet skeletal war.
+
 ghost-role-information-onestar-mecha-name = Onestar Mecha
 ghost-role-information-onestar-mecha-description = You are an experimental mecha created by who-knows-what, all you know is that you have weapons and you detect fleshy moving targets nearby...
 ghost-role-information-onestar-mecha-rules = Use your weapons to cause havoc. You are an antagonist.
index d49ea2fd3f14a923835d435d9631aa504f66583f..96abe01b6cf147e86f5a031052cd073b2ceb1567 100644 (file)
   - type: Loadout
     prototypes: [SkeletonBiker]
   - type: RandomHumanoidAppearance
+
+- type: entity
+  parent: MobSkeletonPerson
+  id: MobSkeletonCloset
+  name: Closet Skeleton
+  components:
+  - type: GhostRole
+    name: ghost-role-information-closet-skeleton-name
+    description: ghost-role-information-closet-skeleton-description
+  - type: GhostTakeoverAvailable
+  - type: Loadout
+    prototypes: [LimitedPassengerGear]
+  - type: RandomHumanoidAppearance
index 550163bb7d86b9a9401de705763ec396db05c3be..a8f5d506849a49f5c693db883971c494f53ac9f6 100644 (file)
     duration: 1
   - type: BureaucraticErrorRule
 
+- type: entity
+  parent: BaseGameRule
+  id: ClosetSkeleton
+  noSpawn: true
+  components:
+  - type: StationEvent
+    weight: 10
+    duration: 1
+  - type: RandomEntityStorageSpawnRule
+    prototype: MobSkeletonCloset
+
 - type: entity
   parent: BaseGameRule
   id: Dragon
index 367ffb9deae51666b310b8eed63dfe60379a7f95..066ed49adcb4610cac648e1dd5ac23974f11a496 100644 (file)
     jumpsuit: ClothingUniformJumpsuitJacketMonkey
     id: BartenderIDCard
 
+# Passenger but without the ID, bag, or headset
+
+- type: startingGear
+  id: LimitedPassengerGear
+  equipment:
+    jumpsuit: ClothingUniformJumpsuitColorGrey
+    shoes: ClothingShoesColorBlack
+  innerclothingskirt: ClothingUniformJumpskirtColorGrey
+
 # DeathMatch Gear
 
 - type: startingGear