]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Cluwne smite (#13367)
authorbrainfood1183 <113240905+brainfood1183@users.noreply.github.com>
Mon, 6 Mar 2023 19:09:24 +0000 (19:09 +0000)
committerGitHub <noreply@github.com>
Mon, 6 Mar 2023 19:09:24 +0000 (11:09 -0800)
55 files changed:
Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs
Content.Server/Cluwne/CluwneSystem.cs [new file with mode: 0644]
Content.Shared/Cluwne/CluwneComponent.cs [new file with mode: 0644]
Resources/Audio/Items/airhorn.ogg [new file with mode: 0644]
Resources/Audio/Items/attributions.yml
Resources/Audio/Items/brokenbikehorn.ogg [new file with mode: 0644]
Resources/Audio/Voice/Cluwne/attributions.yml [new file with mode: 0644]
Resources/Audio/Voice/Cluwne/cluwnelaugh1.ogg [new file with mode: 0644]
Resources/Audio/Voice/Cluwne/cluwnelaugh2.ogg [new file with mode: 0644]
Resources/Audio/Voice/Cluwne/cluwnelaugh3.ogg [new file with mode: 0644]
Resources/Locale/en-US/administration/smites.ftl
Resources/Locale/en-US/cluwne/cluwne.ftl [new file with mode: 0644]
Resources/Prototypes/Entities/Clothing/Back/backpacks.yml
Resources/Prototypes/Entities/Clothing/Hands/gloves.yml
Resources/Prototypes/Entities/Clothing/Masks/masks.yml
Resources/Prototypes/Entities/Clothing/Shoes/specific.yml
Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml
Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
Resources/Prototypes/Entities/Mobs/NPCs/human.yml
Resources/Prototypes/Entities/Mobs/Player/humanoid.yml
Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml
Resources/Prototypes/Entities/Objects/Devices/pda.yml
Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml
Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml
Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/wands.yml
Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml
Resources/Prototypes/Polymorphs/polymorph.yml
Resources/Prototypes/Roles/Jobs/Fun/cluwne.yml [new file with mode: 0644]
Resources/Prototypes/SoundCollections/bike_horn.yml
Resources/Prototypes/SoundCollections/screams.yml
Resources/Prototypes/Voice/auto_emotes.yml
Resources/Prototypes/Voice/speech_emote_sounds.yml
Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/equipped-BACKPACK.png [new file with mode: 0644]
Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/icon.png [new file with mode: 0644]
Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Clothing/Mask/cluwne.rsi/equipped-MASK.png [new file with mode: 0644]
Resources/Textures/Clothing/Mask/cluwne.rsi/icon.png [new file with mode: 0644]
Resources/Textures/Clothing/Mask/cluwne.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/equipped-FEET.png [new file with mode: 0644]
Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/icon.png [new file with mode: 0644]
Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/equipped-INNERCLOTHING.png [new file with mode: 0644]
Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/icon.png [new file with mode: 0644]
Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Markers/jobs.rsi/cluwne.png [new file with mode: 0644]
Resources/Textures/Markers/jobs.rsi/meta.json
Resources/Textures/Objects/Devices/pda.rsi/meta.json
Resources/Textures/Objects/Devices/pda.rsi/pda-cluwne.png [new file with mode: 0644]
Resources/Textures/Objects/Fun/cluwnehorn.rsi/equipped-BELT.png [new file with mode: 0644]
Resources/Textures/Objects/Fun/cluwnehorn.rsi/icon.png [new file with mode: 0644]
Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-left.png [new file with mode: 0644]
Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-right.png [new file with mode: 0644]
Resources/Textures/Objects/Fun/cluwnehorn.rsi/meta.json [new file with mode: 0644]
Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png [new file with mode: 0644]
Resources/Textures/Objects/Misc/id_cards.rsi/meta.json

index c734b2b89d2aac6ae8b2836bc319e6d463079799..b44af241c9dc7dea0f9843ad78f54ab9607630be 100644 (file)
@@ -43,6 +43,7 @@ using Content.Shared.Popups;
 using Content.Shared.Tabletop.Components;
 using Content.Shared.Verbs;
 using Robust.Server.GameObjects;
+using Robust.Server.GameStates;
 using Robust.Shared.Map;
 using Robust.Shared.Map.Components;
 using Robust.Shared.Physics;
@@ -51,7 +52,9 @@ using Robust.Shared.Physics.Systems;
 using Robust.Shared.Player;
 using Robust.Shared.Random;
 using Robust.Shared.Utility;
+using Robust.Shared.Audio;
 using Timer = Robust.Shared.Timing.Timer;
+using Content.Shared.Cluwne;
 
 namespace Content.Server.Administration.Systems;
 
@@ -557,25 +560,21 @@ public sealed partial class AdminVerbSystem
             };
             args.Verbs.Add(killSign);
 
-            // TODO: Port cluwne outfit.
-            Verb clown = new()
+            Verb cluwne = new()
             {
-                Text = "Clown",
+                Text = "Cluwne",
                 Category = VerbCategory.Smite,
-                Icon = new SpriteSpecifier.Rsi(new ResourcePath("/Textures/Objects/Fun/bikehorn.rsi"), "icon"),
+
+                Icon = new SpriteSpecifier.Rsi(new ResourcePath("/Textures/Clothing/Mask/cluwne.rsi"), "icon"),
+
                 Act = () =>
                 {
-                    SetOutfitCommand.SetOutfit(args.Target, "ClownGear", EntityManager, (_, clothing) =>
-                    {
-                        if (HasComp<ClothingComponent>(clothing))
-                            EnsureComp<UnremoveableComponent>(clothing);
-                        EnsureComp<ClumsyComponent>(args.Target);
-                    });
+                    EnsureComp<CluwneComponent>(args.Target);
                 },
                 Impact = LogImpact.Extreme,
-                Message = Loc.GetString("admin-smite-clown-description")
+                Message = Loc.GetString("admin-smite-cluwne-description")
             };
-            args.Verbs.Add(clown);
+            args.Verbs.Add(cluwne);
 
             Verb maiden = new()
             {
diff --git a/Content.Server/Cluwne/CluwneSystem.cs b/Content.Server/Cluwne/CluwneSystem.cs
new file mode 100644 (file)
index 0000000..e380699
--- /dev/null
@@ -0,0 +1,104 @@
+using Content.Server.Administration.Commands;
+using Content.Server.Popups;
+using Content.Shared.Popups;
+using Content.Shared.Mobs;
+using Content.Server.Chat;
+using Content.Server.Chat.Systems;
+using Content.Shared.Chat.Prototypes;
+using Robust.Shared.Random;
+using Content.Shared.Stunnable;
+using Content.Shared.Damage.Prototypes;
+using Content.Shared.Damage;
+using Robust.Shared.Prototypes;
+using Content.Server.Emoting.Systems;
+using Content.Server.Speech.EntitySystems;
+using Content.Shared.Cluwne;
+using Content.Shared.Interaction.Components;
+
+namespace Content.Server.Cluwne;
+
+public sealed class CluwneSystem : EntitySystem
+{
+    [Dependency] private readonly PopupSystem _popupSystem = default!;
+    [Dependency] private readonly SharedAudioSystem _audio = default!;
+    [Dependency] private readonly IRobustRandom _robustRandom = default!;
+    [Dependency] private readonly SharedStunSystem _stunSystem = default!;
+    [Dependency] private readonly DamageableSystem _damageableSystem = default!;
+    [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+    [Dependency] private readonly ChatSystem _chat = default!;
+    [Dependency] private readonly AutoEmoteSystem _autoEmote = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        SubscribeLocalEvent<CluwneComponent, ComponentStartup>(OnComponentStartup);
+        SubscribeLocalEvent<CluwneComponent, MobStateChangedEvent>(OnMobState);
+        SubscribeLocalEvent<CluwneComponent, EmoteEvent>(OnEmote, before:
+        new[] { typeof(VocalSystem), typeof(BodyEmotesSystem) });
+    }
+
+    /// <summary>
+    /// On death removes active comps and gives genetic damage to prevent cloning, reduce this to allow cloning.
+    /// </summary>
+    private void OnMobState(EntityUid uid, CluwneComponent component, MobStateChangedEvent args)
+    {
+        if (args.NewMobState == MobState.Dead)
+               {
+            RemComp<CluwneComponent>(uid);
+            RemComp<ClumsyComponent>(uid);
+            RemComp<AutoEmoteComponent>(uid);
+            var damageSpec = new DamageSpecifier(_prototypeManager.Index<DamageGroupPrototype>("Genetic"), 300);
+            _damageableSystem.TryChangeDamage(uid, damageSpec);
+               }
+    }
+
+    public EmoteSoundsPrototype? EmoteSounds;
+
+    /// <summary>
+    /// OnStartup gives the cluwne outfit, ensures clumsy, gives name prefix and makes sure emote sounds are laugh.
+    /// </summary>
+    private void OnComponentStartup(EntityUid uid, CluwneComponent component, ComponentStartup args)
+    {
+        if (component.EmoteSoundsId == null)
+            return;
+        _prototypeManager.TryIndex(component.EmoteSoundsId, out EmoteSounds);
+
+        var meta = MetaData(uid);
+        var name = meta.EntityName;
+
+        EnsureComp<AutoEmoteComponent>(uid);
+        _autoEmote.AddEmote(uid, "CluwneGiggle");
+        EnsureComp<ClumsyComponent>(uid);
+
+        _popupSystem.PopupEntity(Loc.GetString("cluwne-transform", ("target", uid)), uid, PopupType.LargeCaution);
+        _audio.PlayPvs(component.SpawnSound, uid);
+
+        meta.EntityName = Loc.GetString("cluwne-name-prefix", ("target", name));
+
+        SetOutfitCommand.SetOutfit(uid, "CluwneGear", EntityManager);
+    }
+
+    /// <summary>
+    /// Handles the timing on autoemote as well as falling over and honking.
+    /// </summary>
+    private void OnEmote(EntityUid uid, CluwneComponent component, ref EmoteEvent args)
+    {
+        if (args.Handled)
+            return;
+        args.Handled = _chat.TryPlayEmoteSound(uid, EmoteSounds, args.Emote);
+
+        if (_robustRandom.Prob(component.GiggleRandomChance))
+        {
+            _audio.PlayPvs(component.SpawnSound, uid);
+            _chat.TrySendInGameICMessage(uid, "honks", InGameICChatType.Emote, false, false);
+        }
+
+        else if (_robustRandom.Prob(component.KnockChance))
+        {
+            _audio.PlayPvs(component.KnockSound, uid);
+            _stunSystem.TryParalyze(uid, TimeSpan.FromSeconds(component.ParalyzeTime), true);
+            _chat.TrySendInGameICMessage(uid, "spasms", InGameICChatType.Emote, false, false);
+        }
+    }
+}
diff --git a/Content.Shared/Cluwne/CluwneComponent.cs b/Content.Shared/Cluwne/CluwneComponent.cs
new file mode 100644 (file)
index 0000000..0ddac35
--- /dev/null
@@ -0,0 +1,41 @@
+using Robust.Shared.Audio;
+using Content.Shared.Chat.Prototypes;
+using Robust.Shared.GameStates;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
+
+namespace Content.Shared.Cluwne;
+
+[RegisterComponent]
+[NetworkedComponent]
+public sealed class CluwneComponent : Component
+{
+    /// <summary>
+    /// timings for giggles and knocks.
+    /// </summary>
+    [ViewVariables(VVAccess.ReadWrite)]
+    public TimeSpan DamageGiggleCooldown = TimeSpan.FromSeconds(2);
+
+    [ViewVariables(VVAccess.ReadWrite)]
+    public float KnockChance = 0.05f;
+
+    [ViewVariables(VVAccess.ReadWrite)]
+    public float GiggleRandomChance = 0.1f;
+
+    [DataField("emoteId", customTypeSerializer: typeof(PrototypeIdSerializer<EmoteSoundsPrototype>))]
+    public string? EmoteSoundsId = "Cluwne";
+
+    /// <summary>
+    /// Amount of time cluwne is paralyzed for when falling over.
+    /// </summary>
+    [ViewVariables(VVAccess.ReadWrite)]
+    public float ParalyzeTime = 2f;
+
+    /// <summary>
+    /// Sound specifiers for honk and knock.
+    /// </summary>
+    [DataField("spawnsound")]
+    public SoundSpecifier SpawnSound = new SoundPathSpecifier("/Audio/Items/bikehorn.ogg");
+
+    [DataField("knocksound")]
+    public SoundSpecifier KnockSound = new SoundPathSpecifier("/Audio/Items/airhorn.ogg");
+}
diff --git a/Resources/Audio/Items/airhorn.ogg b/Resources/Audio/Items/airhorn.ogg
new file mode 100644 (file)
index 0000000..e8434ef
Binary files /dev/null and b/Resources/Audio/Items/airhorn.ogg differ
index aee30635ab4b87220f0799c78472bf08d1decc6a..b297c994288cf643ed15ab37b345d2fc112ce53d 100644 (file)
   license: "CC-BY-SA-3.0"
   copyright: "Time immemorial"
   source: "https://github.com/tgstation/tgstation/blob/172b533d0257fcc1f8a05406f1c9fad514c14d88/sound/items/rped.ogg"
+
+- files: ["scary_horn.ogg"]
+  license: "CC-BY-SA-3.0"
+  copyright: "Made by theOperand (github) for tgstation, modified by brainfood1183 (github) for ss14"
+  source: "https://github.com/tgstation/tgstation/blob/9a378933d2cfcb2c6692f5c60fbce979ac4e47c5/sound/spookoween/scary_horn.ogg"
+
+- files: ["airhorn.ogg"]
+  license: "CC-BY-SA-3.0"
+  copyright: "Taken from tgstation, modified by brainfood1183 (github) for ss14"
+  source: "https://github.com/tgstation/tgstation/blob/529d97cb1c105bcd548e95a9c9070bbf5253dd81/sound/items/AirHorn.ogg"
diff --git a/Resources/Audio/Items/brokenbikehorn.ogg b/Resources/Audio/Items/brokenbikehorn.ogg
new file mode 100644 (file)
index 0000000..002ca80
Binary files /dev/null and b/Resources/Audio/Items/brokenbikehorn.ogg differ
diff --git a/Resources/Audio/Voice/Cluwne/attributions.yml b/Resources/Audio/Voice/Cluwne/attributions.yml
new file mode 100644 (file)
index 0000000..464afb1
--- /dev/null
@@ -0,0 +1,7 @@
+- files:
+    - cluwnelaugh1.ogg
+    - cluwnelaugh2.ogg
+    - cluwnelaugh3.ogg
+  license: "CC-BY-4.0"
+  copyright: "Evil Laughs 3 Pack by Nanakisan. Modified by brainfood1183 (Github), shortened, converted from WAV to OGG and downmixed to 1 channel."
+  source: "https://freesound.org/people/Nanakisan/packs/15544/"
diff --git a/Resources/Audio/Voice/Cluwne/cluwnelaugh1.ogg b/Resources/Audio/Voice/Cluwne/cluwnelaugh1.ogg
new file mode 100644 (file)
index 0000000..dc1b496
Binary files /dev/null and b/Resources/Audio/Voice/Cluwne/cluwnelaugh1.ogg differ
diff --git a/Resources/Audio/Voice/Cluwne/cluwnelaugh2.ogg b/Resources/Audio/Voice/Cluwne/cluwnelaugh2.ogg
new file mode 100644 (file)
index 0000000..7e04c6d
Binary files /dev/null and b/Resources/Audio/Voice/Cluwne/cluwnelaugh2.ogg differ
diff --git a/Resources/Audio/Voice/Cluwne/cluwnelaugh3.ogg b/Resources/Audio/Voice/Cluwne/cluwnelaugh3.ogg
new file mode 100644 (file)
index 0000000..3fd4cdd
Binary files /dev/null and b/Resources/Audio/Voice/Cluwne/cluwnelaugh3.ogg differ
index 1d231a05c3fbc090f6cb46ca70886089b4473200..e8f9dcded516f56fe36b993181a7f133c74e2521 100644 (file)
@@ -33,7 +33,7 @@ admin-smite-become-bread-description = It turns them into bread. Really, that's
 admin-smite-ghostkick-description = Silently kicks the user, dropping their connection.
 admin-smite-nyanify-description = Forcibly add cat ears, there is no escape.
 admin-smite-kill-sign-description = Marks a player for death by their fellows.
-admin-smite-clown-description = Clowns them. The suit cannot be removed.
+admin-smite-cluwne-description = Cluwnes them. The suit cannot be removed and the station's crew may murder them freely.
 admin-smite-anger-pointing-arrows-description = Angers the pointing arrows, causing them to assault this entity explosively.
 admin-smite-dust-description = Reduces the target to a small pile of ash.
 admin-smite-buffering-description = Causes the target to randomly start buffering, freezing them in place for a short timespan while they load.
diff --git a/Resources/Locale/en-US/cluwne/cluwne.ftl b/Resources/Locale/en-US/cluwne/cluwne.ftl
new file mode 100644 (file)
index 0000000..206df86
--- /dev/null
@@ -0,0 +1,2 @@
+cluwne-transform = {CAPITALIZE(THE($target))} turned into a cluwne!
+cluwne-name-prefix = Cluwnified {$target}
index 987dbf8a2fed241cbb1c20842f92b2ae58aabcaf..503c1636c9fac1755897c043a1cebdaad31a6e3a 100644 (file)
     equippedPrefix: holding
   - type: Storage
     capacity: 9999
+
+- type: entity
+  parent: ClothingBackpackClown
+  id: ClothingBackpackCluwne
+  name: cursed giggles von honkerton
+  suffix: Unremoveable
+  description: Cursed giggles von honkerton backpack.
+  components:
+  - type: Sprite
+    sprite: Clothing/Back/Backpacks/cluwne.rsi
+  - type: Unremoveable
index 1bed24612d878e0872802f609d4b8616b486cefb..cea116c3887e0b854af86ea02318a41c102073dc 100644 (file)
       fiberMaterial: fibers-synthetic
       fiberColor: fibers-black
     - type: FingerprintMask
+
+- type: entity
+  parent: ClothingHandsGlovesColorWhite
+  id: ClothingHandsGlovesCluwne
+  name: cluwne hands
+  suffix: Unremoveable
+  description:  A cursed pair of cluwne hands.
+  components:
+  - type: Unremoveable
index 435228ca8171b19269d1121a3e1e27aefe419393..a731e0f09cd0868ce52e135de759673e60596858 100644 (file)
   - type: DiseaseProtection
     protection: 0.1
   - type: IdentityBlocker
+
+- type: entity
+  parent: ClothingMaskClown
+  id: ClothingMaskCluwne
+  name: cluwne face and hair
+  suffix: Unremoveable
+  description: Cursed cluwne face and hair.
+  components:
+  - type: Sprite
+    sprite: Clothing/Mask/cluwne.rsi
+  - type: Clothing
+    sprite: Clothing/Mask/cluwne.rsi
+  - type: Unremoveable 
+  - type: AddAccentClothing
+    accent: StutteringAccent
index c71a0ebce8ba96c0e27e325beb3f2b05f8b5fa68..378dfe7575c1fbf1b4c048b9cc7398c4f656ebfe 100644 (file)
       sprite: Clothing/Shoes/Specific/jester.rsi
     - type: Clothing
       sprite: Clothing/Shoes/Specific/jester.rsi
+
+- type: entity
+  parent: ClothingShoesClown
+  id: ClothingShoesCluwne
+  name: cluwne shoes
+  suffix: Unremoveable
+  description: "Cursed pair of cluwne shoes."
+  components:
+  - type: Sprite
+    sprite: Clothing/Shoes/Specific/cluwne.rsi
+  - type: Clothing
+    sprite: Clothing/Shoes/Specific/cluwne.rsi
+  - type: Unremoveable
index 9e47078acea4fe054edb063799c591ee1ecf4983..c95014a91be8ccb52ff89fde834c3b17aa707c48 100644 (file)
         Slash: 0.8
         Piercing: 0.8
 
+- type: entity
+  parent: ClothingUniformJumpsuitClown
+  id: ClothingUniformJumpsuitCluwne
+  name: cluwne suit
+  suffix: Unremoveable
+  description: Cursed cluwne suit.
+  components:
+  - type: Sprite
+    sprite: Clothing/Uniforms/Jumpsuit/cluwne.rsi
+  - type: Clothing
+    sprite: Clothing/Uniforms/Jumpsuit/cluwne.rsi
+  - type: Unremoveable
+  
 - type: entity
   parent: ClothingUniformBase
   id: ClothingUniformJumpsuitDameDane
index 3883bea6d68c8f3b6a7dfdc52e66f309a98c97f2..0b6f7208aefe49c2194547e4f894013246a60380 100644 (file)
@@ -34,6 +34,7 @@
         - ClothingNeckNonBinaryPin
         - ClothingNeckPansexualPin
         - ClothingNeckTransPin
+        - CluwneHorn
       rareChance: 0.01
       prototypes:
         - Lighter
index 86ebb59e1abfa3bc86a19e36dff48a146e858492..6082cd2d8d43dd6416a4a5e0852b95a75ba1020b 100644 (file)
       types:
         Blunt: 200
 
+- type: entity
+  parent: MobHuman
+  id: MobCluwne
+  name: person
+  description: A polymorphed unfortunate.
+  components:
+  - type: Cluwne
index bc61bba3960c167d25f297f1ec7e6502dba3a2b0..f985e4dfbc0ba42d77081ee540141044ccebb2bd 100644 (file)
   id: NukeOp
   components:
     - type: NukeOperative
+
+- type: entity
+  id: RandomHumanoidSpawnerCluwne
+  name: Cluwne
+  suffix: spawns a cluwne
+  components:
+    - type: Sprite
+      netsync: false
+      sprite: Markers/jobs.rsi
+      state: cluwne
+    - type: RandomHumanoidSpawner
+      settings: Cluwne
+    - type: RandomMetadata
+      nameSegments:
+      - names_first
+      - names_last
+
+
+- type: randomHumanoidSettings
+  id: Cluwne
+  randomizeName: false
+  components:
+    - type: GhostTakeoverAvailable
+      name: Cluwne
+      description: Become a pitiful cluwne, your only goal in life is to find a sweet release from your suffering (usually by being beaten to death). A cluwne is not an antagonist but may defend itself. Crewmembers may murder cluwnes freely.
+    - type: Cluwne
index a079ec1a01a00947b2ac84d2f262ffc7d1e321fb..cd69d01bbc5803e15eeb712a7dc54d3d701bdbea 100644 (file)
   - type: Item
     sprite: Objects/Storage/happyhonk/cluwne.rsi
     heldPrefix: box
+  - type: StorageFill
+    contents:
+      - id: CluwneHorn
 
 - type: entity
   id: FoodMealHappyHonkClown
index 272c96c171d1a9a3589a9b247ce5de4a8b54c485..f4b934ad5497e6d0617017577b4a45c4d9231ac0 100644 (file)
     borderColor: "#774705"
   - type: Icon
     state: pda-detective
+
+- type: entity
+  parent: ClownPDA
+  id: CluwnePDA
+  name: cluwne PDA
+  suffix: Unremoveable
+  description: Cursed cluwne PDA.
+  components:
+  - type: PDA
+    id: CluwneIDCard
+    state: pda-cluwne
+  - type: PDABorderColor
+    borderColor: "#1c8f4d"
+  - type: Icon
+    state: pda-cluwne
+    penSlot:
+      startingItem: CrayonGreen
+      ejectSound: /Audio/Items/bikehorn.ogg
+      priority: -1
+      whitelist:
+        tags:
+        - Write
+  - type: Unremoveable
+
index bc8adf312005f7e6c66674e267a5d6849076cc3e..317691b63ded3749a3d060d2dc1c61e4163bb434 100644 (file)
       types:
         Blunt: 0
 
+- type: entity
+  parent: BikeHorn
+  id: CluwneHorn
+  name: broken bike horn
+  description: A broken horn off of a bicycle.
+  components:
+  - type: Sprite
+    sprite: Objects/Fun/cluwnehorn.rsi
+    state: icon
+  - type: Item
+    sprite: Objects/Fun/cluwnehorn.rsi
+    size: 5
+  - type: Clothing
+    sprite: Objects/Fun/cluwnehorn.rsi
+    slots: [Belt]
+    quickEquip: false
+  - type: EmitSoundOnUse
+    sound:
+      collection: CluwneHorn
+      params:
+        variation: 0.246
+
 - type: entity
   parent: BikeHorn
   id: GoldenBikeHorn
@@ -58,4 +80,4 @@
     slots: [Belt]
   - type: Prayable
   - type: StaticPrice
-    price: 1000
\ No newline at end of file
+    price: 1000
index bdb9ccf37ca9daee8a9561120d6404d27fe65c78..50da83763bb99f25be8a770b55bb7477ce0f2f5e 100644 (file)
   - type: Item
     heldPrefix: gold
     
+
+- type: entity
+  parent: IDCardStandard
+  id: CluwneIDCard
+  name: cluwne ID card
+  suffix: Unremoveable
+  components:
+  - type: Sprite
+    layers:
+    - state: default
+    - state: idcluwne
+  - type: IdCard
+    jobTitle: Cluwne
+  - type: Unremoveable
index 3a29ef44f172570d67e692ecb8833e8ccb8ba0c5..af2b3b86d6c733990b5aa2e9ebad72f946763d93 100644 (file)
     proto: ProjectilePolyboltDoor
     capacity: 10
     count: 10
+
+- type: entity
+  name: wand of cluwning
+  parent: WeaponWandPolymorphBase
+  id: WeaponWandCluwne
+  description: Make their situation worse by turning them into a cluwne.
+  components:
+  - type: BasicEntityAmmoProvider
+    proto: ProjectilePolyboltCluwne
+    capacity: 3
+    count: 3
index de69d09cdd833f8bdb0cd705b6c9880341e660a5..94e928bdd116c9097260b5c27cb1d4a42ae3393f 100644 (file)
@@ -1,4 +1,4 @@
-- type: entity
+- type: entity
   id: ProjectileFireball
   name: fireball
   description: You better GITTAH WEIGH.
       types:
         Piercing: 300
     ignoreResistances: true
+
+- type: entity
+  id: ProjectilePolyboltCluwne
+  parent: ProjectilePolyboltBase
+  name: cluwne polybolt
+  description: knoH KnoH!
+  noSpawn: true
+  components:
+  - type: PolymorphOnCollide
+    polymorph: WizardForcedCluwne
+    whitelist:
+      components:
+      - Body
index 628c1aa8e854981b6922715b5dacb5f0677f1f5e..9c6076fc6f2c6aacf8a606aa5f25346ef22fdeb1 100644 (file)
   revertOnCrit: false
   revertOnDeath: false
 
+- type: polymorph
+  id: WizardForcedCluwne
+  entity: MobCluwne
+  forced: true
+  transferName: true
+  transferHumanoidAppearance: true
+  inventory: Transfer
+  revertOnDeath: true
+
 # this is a test for transferring some visual appearance stuff
 - type: polymorph
   id: TestHumanMorph
diff --git a/Resources/Prototypes/Roles/Jobs/Fun/cluwne.yml b/Resources/Prototypes/Roles/Jobs/Fun/cluwne.yml
new file mode 100644 (file)
index 0000000..4136047
--- /dev/null
@@ -0,0 +1,10 @@
+- type: startingGear
+  id: CluwneGear
+  equipment:
+    jumpsuit: ClothingUniformJumpsuitCluwne
+    back: ClothingBackpackCluwne
+    shoes: ClothingShoesCluwne
+    mask: ClothingMaskCluwne
+    id: CluwnePDA
+    gloves: ClothingHandsGlovesCluwne
+    pocket1: CluwneHorn
index ff6c75ff533fcdebd12047e2a07963e9afb62475..7fab2d63e9f9932fcb1eaaabe4f03e9b1e6d70b8 100644 (file)
@@ -2,3 +2,9 @@
   id: BikeHorn
   files:
   - /Audio/Items/bikehorn.ogg
+
+- type: soundCollection
+  id: CluwneHorn
+  files:
+  - /Audio/Items/brokenbikehorn.ogg
+
index ce47dad97f25e5a3cc812779ddb2a77d7a49c100..46965712b0e5dba40ab47799294b6bc3c92e5a14 100644 (file)
   files:
     - /Audio/Voice/Zombie/zombie-1.ogg
     - /Audio/Voice/Zombie/zombie-2.ogg
-    - /Audio/Voice/Zombie/zombie-3.ogg
\ No newline at end of file
+    - /Audio/Voice/Zombie/zombie-3.ogg
+
+- type: soundCollection
+  id: CluwneScreams
+  files:
+    - /Audio/Voice/Cluwne/cluwnelaugh1.ogg
+    - /Audio/Voice/Cluwne/cluwnelaugh2.ogg
+    - /Audio/Voice/Cluwne/cluwnelaugh3.ogg
index 5bfa295d018f147775cc64af05c04325ce3a3bcb..2d2de26604e9616d79ed87ebf728675691aeff77 100644 (file)
@@ -5,3 +5,10 @@
   interval: 5.0
   chance: 0.1
   withChat: false
+# Cluwne
+- type: autoEmote
+  id: CluwneGiggle
+  emote: Scream
+  interval: 5.0
+  chance: 0.5
+  withChat: false
index 0f469bf35f0ca81d446e03d83167923f62d55302..88af527c39ad75756fce1af556b8be843db334df 100644 (file)
     path: /Audio/Animals/mouse_squeak.ogg
     params:
       variation: 0.125
+
+- type: emoteSounds
+  id: Cluwne
+  sound:
+    collection: CluwneScreams
+    params:
+      variation: 0.125
diff --git a/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/equipped-BACKPACK.png b/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/equipped-BACKPACK.png
new file mode 100644 (file)
index 0000000..589cf50
Binary files /dev/null and b/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/equipped-BACKPACK.png differ
diff --git a/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/icon.png b/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/icon.png
new file mode 100644 (file)
index 0000000..3d31713
Binary files /dev/null and b/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/meta.json b/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/meta.json
new file mode 100644 (file)
index 0000000..da59cdd
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by brainfood1183 (github) for ss14",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon"
+    },
+    {
+      "name": "equipped-BACKPACK",
+      "directions": 4
+    }
+  ]
+}
diff --git a/Resources/Textures/Clothing/Mask/cluwne.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Mask/cluwne.rsi/equipped-MASK.png
new file mode 100644 (file)
index 0000000..0681cda
Binary files /dev/null and b/Resources/Textures/Clothing/Mask/cluwne.rsi/equipped-MASK.png differ
diff --git a/Resources/Textures/Clothing/Mask/cluwne.rsi/icon.png b/Resources/Textures/Clothing/Mask/cluwne.rsi/icon.png
new file mode 100644 (file)
index 0000000..1cc7520
Binary files /dev/null and b/Resources/Textures/Clothing/Mask/cluwne.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Mask/cluwne.rsi/meta.json b/Resources/Textures/Clothing/Mask/cluwne.rsi/meta.json
new file mode 100644 (file)
index 0000000..96e7181
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by brainfood1183 (github) for ss14",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon"
+    },
+    {
+      "name": "equipped-MASK",
+      "directions": 4
+    }
+  ]
+}
diff --git a/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/equipped-FEET.png
new file mode 100644 (file)
index 0000000..cfa9828
Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/equipped-FEET.png differ
diff --git a/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/icon.png
new file mode 100644 (file)
index 0000000..da8715a
Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/meta.json
new file mode 100644 (file)
index 0000000..2db96ab
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by brainfood1183 (github) for ss14.",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon"
+    },
+    {
+      "name": "equipped-FEET",
+      "directions": 4
+    }
+  ]
+}
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/equipped-INNERCLOTHING.png
new file mode 100644 (file)
index 0000000..18da005
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/equipped-INNERCLOTHING.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/icon.png
new file mode 100644 (file)
index 0000000..714b208
Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/icon.png differ
diff --git a/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/meta.json
new file mode 100644 (file)
index 0000000..611d86e
--- /dev/null
@@ -0,0 +1,18 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by brainfood1183 (github) for ss14",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon"
+    },
+    {
+      "name": "equipped-INNERCLOTHING",
+      "directions": 4
+    }
+  ]
+}
diff --git a/Resources/Textures/Markers/jobs.rsi/cluwne.png b/Resources/Textures/Markers/jobs.rsi/cluwne.png
new file mode 100644 (file)
index 0000000..ea5ef16
Binary files /dev/null and b/Resources/Textures/Markers/jobs.rsi/cluwne.png differ
index ec261c2cafd2fa40c0ed2fb58f10b67ecbb28327..b6f9620c4cfb07145fa9b2cd8c1147ae7a308b07 100644 (file)
@@ -1,7 +1,7 @@
 {
   "version": 1,
   "license": "CC-BY-SA-3.0",
-  "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/e71d6c4fba5a51f99b81c295dcaec4fc2f58fb19/icons/mob/screen1.dmi, librarian by Peptide. cburn made by brainfood1183 (github)",
+  "copyright": "Taken from https://github.com/vgstation-coders/vgstation13/blob/e71d6c4fba5a51f99b81c295dcaec4fc2f58fb19/icons/mob/screen1.dmi, librarian by Peptide. cburn and cluwne made by brainfood1183 (github)",
   "size": {
     "x": 32,
     "y": 32
     },
     {
       "name": "warden"
+    },
+       {
+      "name": "cluwne"
     },
     {
       "name": "musician"
index baafb528fb0aa3114c2ea7af14feab2e9ba72654..245f7608b80cf6154f942b16cc48287d913fc009 100644 (file)
@@ -1,7 +1,7 @@
 {
   "version": 1,
   "license": "CC-BY-SA-3.0",
-  "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d",
+  "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/59f2a4e10e5ba36033c9734ddebfbbdc6157472d, pda-cluwne made by brainfood1183 (github) ss14",
   "size": {
     "x": 32,
     "y": 32
     },
     {
       "name": "pda-ert"
+    },
+       {
+      "name": "pda-cluwne"
     }
   ]
 }
diff --git a/Resources/Textures/Objects/Devices/pda.rsi/pda-cluwne.png b/Resources/Textures/Objects/Devices/pda.rsi/pda-cluwne.png
new file mode 100644 (file)
index 0000000..e4873ee
Binary files /dev/null and b/Resources/Textures/Objects/Devices/pda.rsi/pda-cluwne.png differ
diff --git a/Resources/Textures/Objects/Fun/cluwnehorn.rsi/equipped-BELT.png b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/equipped-BELT.png
new file mode 100644 (file)
index 0000000..0bcdf15
Binary files /dev/null and b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/equipped-BELT.png differ
diff --git a/Resources/Textures/Objects/Fun/cluwnehorn.rsi/icon.png b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/icon.png
new file mode 100644 (file)
index 0000000..907d599
Binary files /dev/null and b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-left.png b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-left.png
new file mode 100644 (file)
index 0000000..6895383
Binary files /dev/null and b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-left.png differ
diff --git a/Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-right.png b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-right.png
new file mode 100644 (file)
index 0000000..eda7782
Binary files /dev/null and b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/inhand-right.png differ
diff --git a/Resources/Textures/Objects/Fun/cluwnehorn.rsi/meta.json b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/meta.json
new file mode 100644 (file)
index 0000000..25e7e61
--- /dev/null
@@ -0,0 +1,26 @@
+{
+  "version": 1,
+  "license": "CC-BY-SA-3.0",
+  "copyright": "Made by brainfood1183 (github) for ss14",
+  "size": {
+    "x": 32,
+    "y": 32
+  },
+  "states": [
+    {
+      "name": "icon"
+    },
+    {
+      "name": "equipped-BELT",
+      "directions": 4
+    },
+    {
+      "name": "inhand-left",
+      "directions": 4
+    },
+    {
+      "name": "inhand-right",
+      "directions": 4
+    }
+  ]
+}
diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png b/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png
new file mode 100644 (file)
index 0000000..d57a7e3
Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png differ
index 228d88ec553398680f447a2c9c4f6753f3434d71..e7e01531fa1b70e86fed25c8d8d1a36413a2484e 100644 (file)
@@ -1,7 +1,7 @@
 {
   "version": 1,
   "license": "CC-BY-SA-3.0",
-  "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e",
+  "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/d917f4c2a088419d5c3aec7656b7ff8cebd1822e idcluwne made by brainfood1183 (github) for ss14",
   "size": {
     "x": 32,
     "y": 32
     },
     {
       "name": "syndie"
+    },
+       {
+      "name": "idcluwne"
     },
     {
       "name": "gold-inhand-left",