diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs index c734b2b89d..b44af241c9 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs @@ -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(clothing)) - EnsureComp(clothing); - EnsureComp(args.Target); - }); + EnsureComp(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 index 0000000000..e380699259 --- /dev/null +++ b/Content.Server/Cluwne/CluwneSystem.cs @@ -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(OnComponentStartup); + SubscribeLocalEvent(OnMobState); + SubscribeLocalEvent(OnEmote, before: + new[] { typeof(VocalSystem), typeof(BodyEmotesSystem) }); + } + + /// + /// On death removes active comps and gives genetic damage to prevent cloning, reduce this to allow cloning. + /// + private void OnMobState(EntityUid uid, CluwneComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + { + RemComp(uid); + RemComp(uid); + RemComp(uid); + var damageSpec = new DamageSpecifier(_prototypeManager.Index("Genetic"), 300); + _damageableSystem.TryChangeDamage(uid, damageSpec); + } + } + + public EmoteSoundsPrototype? EmoteSounds; + + /// + /// OnStartup gives the cluwne outfit, ensures clumsy, gives name prefix and makes sure emote sounds are laugh. + /// + 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(uid); + _autoEmote.AddEmote(uid, "CluwneGiggle"); + EnsureComp(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); + } + + /// + /// Handles the timing on autoemote as well as falling over and honking. + /// + 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 index 0000000000..0ddac352ac --- /dev/null +++ b/Content.Shared/Cluwne/CluwneComponent.cs @@ -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 +{ + /// + /// timings for giggles and knocks. + /// + [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))] + public string? EmoteSoundsId = "Cluwne"; + + /// + /// Amount of time cluwne is paralyzed for when falling over. + /// + [ViewVariables(VVAccess.ReadWrite)] + public float ParalyzeTime = 2f; + + /// + /// Sound specifiers for honk and knock. + /// + [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 index 0000000000..e8434ef28c Binary files /dev/null and b/Resources/Audio/Items/airhorn.ogg differ diff --git a/Resources/Audio/Items/attributions.yml b/Resources/Audio/Items/attributions.yml index aee30635ab..b297c99428 100644 --- a/Resources/Audio/Items/attributions.yml +++ b/Resources/Audio/Items/attributions.yml @@ -17,3 +17,13 @@ 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 index 0000000000..002ca809d7 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 index 0000000000..464afb1861 --- /dev/null +++ b/Resources/Audio/Voice/Cluwne/attributions.yml @@ -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 index 0000000000..dc1b4960a7 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 index 0000000000..7e04c6d25b 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 index 0000000000..3fd4cdd5fd Binary files /dev/null and b/Resources/Audio/Voice/Cluwne/cluwnelaugh3.ogg differ diff --git a/Resources/Locale/en-US/administration/smites.ftl b/Resources/Locale/en-US/administration/smites.ftl index 1d231a05c3..e8f9dcded5 100644 --- a/Resources/Locale/en-US/administration/smites.ftl +++ b/Resources/Locale/en-US/administration/smites.ftl @@ -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 index 0000000000..206df8657d --- /dev/null +++ b/Resources/Locale/en-US/cluwne/cluwne.ftl @@ -0,0 +1,2 @@ +cluwne-transform = {CAPITALIZE(THE($target))} turned into a cluwne! +cluwne-name-prefix = Cluwnified {$target} diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index 987dbf8a2f..503c1636c9 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -201,3 +201,14 @@ 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 diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index 1bed24612d..cea116c388 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -257,3 +257,12 @@ 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 diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index 435228ca81..a731e0f09c 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -232,3 +232,18 @@ - 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 diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index c71a0ebce8..378dfe7575 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -141,3 +141,16 @@ 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 diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml index 9e47078ace..c95014a91b 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpsuits.yml @@ -962,6 +962,19 @@ 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 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 3883bea6d6..0b6f7208ae 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -34,6 +34,7 @@ - ClothingNeckNonBinaryPin - ClothingNeckPansexualPin - ClothingNeckTransPin + - CluwneHorn rareChance: 0.01 prototypes: - Lighter diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml index 86ebb59e1a..6082cd2d8d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/human.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/human.yml @@ -39,3 +39,10 @@ types: Blunt: 200 +- type: entity + parent: MobHuman + id: MobCluwne + name: person + description: A polymorphed unfortunate. + components: + - type: Cluwne diff --git a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml index bc61bba396..f985e4dfbc 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/humanoid.yml @@ -357,3 +357,29 @@ 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 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml index a079ec1a01..cd69d01bbc 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/box.yml @@ -517,6 +517,9 @@ - type: Item sprite: Objects/Storage/happyhonk/cluwne.rsi heldPrefix: box + - type: StorageFill + contents: + - id: CluwneHorn - type: entity id: FoodMealHappyHonkClown diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 272c96c171..f4b934ad54 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -708,3 +708,27 @@ 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 + diff --git a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml index bc8adf3120..317691b63d 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml @@ -40,6 +40,28 @@ 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 diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index bdb9ccf37c..50da83763b 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -573,3 +573,17 @@ - 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 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/wands.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/wands.yml index 3a29ef44f1..af2b3b86d6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/wands.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/wands.yml @@ -94,3 +94,14 @@ 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 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml index de69d09cdd..94e928bdd1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/magic.yml @@ -1,4 +1,4 @@ -- type: entity +- type: entity id: ProjectileFireball name: fireball description: You better GITTAH WEIGH. @@ -111,3 +111,16 @@ 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 diff --git a/Resources/Prototypes/Polymorphs/polymorph.yml b/Resources/Prototypes/Polymorphs/polymorph.yml index 628c1aa8e8..9c6076fc6f 100644 --- a/Resources/Prototypes/Polymorphs/polymorph.yml +++ b/Resources/Prototypes/Polymorphs/polymorph.yml @@ -58,6 +58,15 @@ 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 index 0000000000..41360479d1 --- /dev/null +++ b/Resources/Prototypes/Roles/Jobs/Fun/cluwne.yml @@ -0,0 +1,10 @@ +- type: startingGear + id: CluwneGear + equipment: + jumpsuit: ClothingUniformJumpsuitCluwne + back: ClothingBackpackCluwne + shoes: ClothingShoesCluwne + mask: ClothingMaskCluwne + id: CluwnePDA + gloves: ClothingHandsGlovesCluwne + pocket1: CluwneHorn diff --git a/Resources/Prototypes/SoundCollections/bike_horn.yml b/Resources/Prototypes/SoundCollections/bike_horn.yml index ff6c75ff53..7fab2d63e9 100644 --- a/Resources/Prototypes/SoundCollections/bike_horn.yml +++ b/Resources/Prototypes/SoundCollections/bike_horn.yml @@ -2,3 +2,9 @@ id: BikeHorn files: - /Audio/Items/bikehorn.ogg + +- type: soundCollection + id: CluwneHorn + files: + - /Audio/Items/brokenbikehorn.ogg + diff --git a/Resources/Prototypes/SoundCollections/screams.yml b/Resources/Prototypes/SoundCollections/screams.yml index ce47dad97f..46965712b0 100644 --- a/Resources/Prototypes/SoundCollections/screams.yml +++ b/Resources/Prototypes/SoundCollections/screams.yml @@ -22,4 +22,11 @@ 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 diff --git a/Resources/Prototypes/Voice/auto_emotes.yml b/Resources/Prototypes/Voice/auto_emotes.yml index 5bfa295d01..2d2de26604 100644 --- a/Resources/Prototypes/Voice/auto_emotes.yml +++ b/Resources/Prototypes/Voice/auto_emotes.yml @@ -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 diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 0f469bf35f..88af527c39 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -88,3 +88,10 @@ 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 index 0000000000..589cf50997 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 index 0000000000..3d31713622 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 index 0000000000..da59cddfe8 --- /dev/null +++ b/Resources/Textures/Clothing/Back/Backpacks/cluwne.rsi/meta.json @@ -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 index 0000000000..0681cdabba 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 index 0000000000..1cc7520ee2 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 index 0000000000..96e7181a21 --- /dev/null +++ b/Resources/Textures/Clothing/Mask/cluwne.rsi/meta.json @@ -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 index 0000000000..cfa9828674 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 index 0000000000..da8715a320 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 index 0000000000..2db96aba4c --- /dev/null +++ b/Resources/Textures/Clothing/Shoes/Specific/cluwne.rsi/meta.json @@ -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 index 0000000000..18da005b09 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 index 0000000000..714b20859a 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 index 0000000000..611d86ed36 --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpsuit/cluwne.rsi/meta.json @@ -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 index 0000000000..ea5ef164c4 Binary files /dev/null and b/Resources/Textures/Markers/jobs.rsi/cluwne.png differ diff --git a/Resources/Textures/Markers/jobs.rsi/meta.json b/Resources/Textures/Markers/jobs.rsi/meta.json index ec261c2caf..b6f9620c4c 100644 --- a/Resources/Textures/Markers/jobs.rsi/meta.json +++ b/Resources/Textures/Markers/jobs.rsi/meta.json @@ -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 @@ -162,6 +162,9 @@ }, { "name": "warden" + }, + { + "name": "cluwne" }, { "name": "musician" diff --git a/Resources/Textures/Objects/Devices/pda.rsi/meta.json b/Resources/Textures/Objects/Devices/pda.rsi/meta.json index baafb528fb..245f7608b8 100644 --- a/Resources/Textures/Objects/Devices/pda.rsi/meta.json +++ b/Resources/Textures/Objects/Devices/pda.rsi/meta.json @@ -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 @@ -171,6 +171,9 @@ }, { "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 index 0000000000..e4873ee8b3 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 index 0000000000..0bcdf15016 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 index 0000000000..907d599672 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 index 0000000000..689538356d 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 index 0000000000..eda778252f 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 index 0000000000..25e7e61d32 --- /dev/null +++ b/Resources/Textures/Objects/Fun/cluwnehorn.rsi/meta.json @@ -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 index 0000000000..d57a7e3d41 Binary files /dev/null and b/Resources/Textures/Objects/Misc/id_cards.rsi/idcluwne.png differ diff --git a/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json b/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json index 228d88ec55..e7e01531fa 100644 --- a/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/id_cards.rsi/meta.json @@ -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 @@ -195,6 +195,9 @@ }, { "name": "syndie" + }, + { + "name": "idcluwne" }, { "name": "gold-inhand-left",