From 2e222657a94d72497e312e54fa3ee175e4e06555 Mon Sep 17 00:00:00 2001 From: Dvir <39403717+dvir001@users.noreply.github.com> Date: Tue, 2 Jan 2024 03:24:38 +0200 Subject: [PATCH] Felinids & Vulp Update (#806) * Fluffy tail for felinids (#433) * Fluffy tail for felinids After 9 years. I finished it. (Requires Phil's approval, will put it to ready for review as soon as he gets to see fully the fully finished PR) * An small update. Updated meta.json to include all numbers to be equal. Updated PNG to allow updated numbers to have actual sprites and not just empty sprites. * Improved the tail sprite. Proper animation and code. * Updates ftl for it to properly work. * Prevent shooting while inside a duffelbag (#510) Anyone shoved into a duffelbag gets an ItemComponent. This denies anyone with an ItemComponent from shooting a gun. * Prevent pseudoitems from being transferred between bags (#553) * Update PseudoItemSystem.cs * Rider full cleanup * Also abort in sharedstorage * Make the comp shared * Why drop the bags? * Make felinids meow it instead of sayin it. (#543) * Make felinids meow it instead of sayin it. A note: snapping doesnt even make a sound effect on humans. Only putting it just incase that ever gets fixed upstream. Also fixes issue #525 A simple PR. * Hopefully fixes yaml linter. * Removes notes. * Fixing * FTL fix * Missing FTL * fix tattoos * Updates more variation of mraowing. (#604) Thats it. * Allow vulpkaning to sigh. (#569) Nothing much. Just a small quality of life. * What the hell is even a yeep? * Update felinid.yml --------- Co-authored-by: Adrian16199 <144424013+Adrian16199@users.noreply.github.com> Co-authored-by: Bakke Co-authored-by: Debug <49997488+DebugOk@users.noreply.github.com> --- .../Item/PseudoItem/PseudoItemComponent.cs | 18 -- .../Item/PseudoItem/PseudoItemSystem.cs | 253 ++++++++++-------- .../_NF/SizeAttribute/SizeAttributeSystem.cs | 2 +- .../Item/Components/PseudoItemComponent.cs | 15 ++ .../Item/PseudoItemInsertDoAfterEvent.cs | 10 + .../EntitySystems/SharedStorageSystem.cs | 4 + .../Weapons/Ranged/Systems/SharedGunSystem.cs | 4 +- .../en-US/_NF/chat/managers/chat_manager.ftl | 8 +- .../en-US/_Nyano/{ => abilities}/felinid.ftl | 5 +- .../en-US/_Nyano/{ => abilities}/oni.ftl | 0 .../Locale/en-US/deltav/markings/felinid.ftl | 5 + Resources/Locale/en-US/markings/felinid.ftl | 56 ++++ .../Mobs/Customization/Markings/felinid.yml | 20 ++ .../DeltaV/Voice/speech_emote_sounds.yml | 20 ++ .../Prototypes/DeltaV/Voice/speech_verbs.yml | 9 + .../Mobs/Customization/Markings/tattoos.yml | 20 +- .../_NF/Voice/speech_emote_sounds.yml | 4 + Resources/Prototypes/_Nyano/Actions/types.yml | 4 +- .../_Nyano/Entities/Mobs/Player/felinid.yml | 3 + .../Prototypes/_Nyano/Voice/speech_emotes.yml | 53 ++-- .../Felinid_fluffy_tail_full.png | Bin 0 -> 2573 bytes .../felinid_fluffy_tail_rings.png | Bin 0 -> 2040 bytes .../Felinid/felinid_tails.rsi/meta.json | 111 ++++++++ 23 files changed, 446 insertions(+), 178 deletions(-) delete mode 100644 Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs create mode 100644 Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs create mode 100644 Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs rename Resources/Locale/en-US/_Nyano/{ => abilities}/felinid.ftl (63%) rename Resources/Locale/en-US/_Nyano/{ => abilities}/oni.ftl (100%) create mode 100644 Resources/Locale/en-US/deltav/markings/felinid.ftl create mode 100644 Resources/Locale/en-US/markings/felinid.ftl create mode 100644 Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/Felinid_fluffy_tail_full.png create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/felinid_fluffy_tail_rings.png create mode 100644 Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/meta.json diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs deleted file mode 100644 index 73ff83f0d1d..00000000000 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemComponent.cs +++ /dev/null @@ -1,18 +0,0 @@ - -using Content.Shared._NF.Cloning; - -namespace Content.Server.Item.PseudoItem -{ - /// - /// For entities that behave like an item under certain conditions, - /// but not under most conditions. - /// - [RegisterComponent] - public sealed partial class PseudoItemComponent : Component, ITransferredByCloning - { - [DataField("size")] - public int Size = 120; - - public bool Active = false; - } -} diff --git a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs index 579366b1451..9f5bd596d76 100644 --- a/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs +++ b/Content.Server/Nyanotrasen/Item/PseudoItem/PseudoItemSystem.cs @@ -1,159 +1,174 @@ -using System.Threading; -using Content.Shared.Verbs; -using Content.Shared.Item; -using Content.Shared.Hands; +using Content.Server.DoAfter; +using Content.Server.Storage.EntitySystems; using Content.Shared.DoAfter; +using Content.Shared.Hands; using Content.Shared.IdentityManagement; -using Content.Shared.Pseudo; -using Content.Server.Storage.Components; -using Content.Server.Storage.EntitySystems; -using Content.Server.DoAfter; +using Content.Shared.Item; +using Content.Shared.Item.PseudoItem; using Content.Shared.Storage; using Content.Shared.Tag; +using Content.Shared.Verbs; using Robust.Shared.Containers; -namespace Content.Server.Item.PseudoItem +namespace Content.Server.Item.PseudoItem; + +public sealed class PseudoItemSystem : EntitySystem { - public sealed class PseudoItemSystem : EntitySystem - { - [Dependency] private readonly StorageSystem _storageSystem = default!; - [Dependency] private readonly ItemSystem _itemSystem = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly StorageSystem _storageSystem = default!; + [Dependency] private readonly ItemSystem _itemSystem = default!; + [Dependency] private readonly DoAfterSystem _doAfter = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; [ValidatePrototypeId] - private const string PreventTag = "PreventLabel";public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent>(AddInsertVerb); - SubscribeLocalEvent>(AddInsertAltVerb); - SubscribeLocalEvent(OnEntRemoved); - SubscribeLocalEvent(OnGettingPickedUpAttempt); - SubscribeLocalEvent(OnDropAttempt); - SubscribeLocalEvent(OnDoAfter); - } + private const string PreventTag = "PreventLabel"; - private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) - { - if (!args.CanInteract || !args.CanAccess) - return; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddInsertVerb); + SubscribeLocalEvent>(AddInsertAltVerb); + SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent(OnGettingPickedUpAttempt); + SubscribeLocalEvent(OnDropAttempt); + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent(OnInsertAttempt); + } - if (component.Active) - return; + private void AddInsertVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; - if (!TryComp(args.Target, out var targetStorage)) - return; + if (component.Active) + return; - if (component.Size > targetStorage.StorageCapacityMax - targetStorage.StorageUsed) - return; + if (!TryComp(args.Target, out var targetStorage)) + return; - if (Transform(args.Target).ParentUid == uid) - return; + if (component.Size > targetStorage.StorageCapacityMax - targetStorage.StorageUsed) + return; - InnateVerb verb = new() - { - Act = () => - { - TryInsert(args.Target, uid, component, targetStorage); - }, - Text = Loc.GetString("action-name-insert-self"), - Priority = 2 - }; - args.Verbs.Add(verb); - } + if (Transform(args.Target).ParentUid == uid) + return; - private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) + InnateVerb verb = new() { - if (!args.CanInteract || !args.CanAccess) - return; + Act = () => + { + TryInsert(args.Target, uid, component, targetStorage); + }, + Text = Loc.GetString("action-name-insert-self"), + Priority = 2 + }; + args.Verbs.Add(verb); + } - if (args.User == args.Target) - return; + private void AddInsertAltVerb(EntityUid uid, PseudoItemComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; - if (args.Hands == null) - return; + if (args.User == args.Target) + return; - if (!TryComp(args.Hands.ActiveHandEntity, out var targetStorage)) - return; + if (args.Hands == null) + return; - AlternativeVerb verb = new() - { - Act = () => - { - StartInsertDoAfter(args.User, uid, args.Hands.ActiveHandEntity.Value, component); - }, - Text = Loc.GetString("action-name-insert-other", ("target", Identity.Entity(args.Target, EntityManager))), - Priority = 2 - }; - args.Verbs.Add(verb); - } + if (!TryComp(args.Hands.ActiveHandEntity, out var targetStorage)) + return; - private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRemovedFromContainerMessage args) + AlternativeVerb verb = new() { - if (!component.Active) - return; + Act = () => + { + StartInsertDoAfter(args.User, uid, args.Hands.ActiveHandEntity.Value, component); + }, + Text = Loc.GetString("action-name-insert-other", ("target", Identity.Entity(args.Target, EntityManager))), + Priority = 2 + }; + args.Verbs.Add(verb); + } - RemComp(uid); - component.Active = false; - } + private void OnEntRemoved(EntityUid uid, PseudoItemComponent component, EntGotRemovedFromContainerMessage args) + { + if (!component.Active) + return; - private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, GettingPickedUpAttemptEvent args) - { - if (args.User == args.Item) - return; + RemComp(uid); + component.Active = false; + } + + private void OnGettingPickedUpAttempt(EntityUid uid, PseudoItemComponent component, + GettingPickedUpAttemptEvent args) + { + if (args.User == args.Item) + return; - Transform(uid).AttachToGridOrMap(); + Transform(uid).AttachToGridOrMap(); + args.Cancel(); + } + + private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args) + { + if (component.Active) args.Cancel(); - } + } - private void OnDropAttempt(EntityUid uid, PseudoItemComponent component, DropAttemptEvent args) - { - if (component.Active) - args.Cancel(); - } - private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args) - { - if (args.Handled || args.Cancelled || args.Args.Used == null) - return; + private void OnDoAfter(EntityUid uid, PseudoItemComponent component, DoAfterEvent args) + { + if (args.Handled || args.Cancelled || args.Args.Used == null) + return; - args.Handled = TryInsert(args.Args.Used.Value, uid, component); - } + args.Handled = TryInsert(args.Args.Used.Value, uid, component); + } - public bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, StorageComponent? storage = null) - { - if (!Resolve(storageUid, ref storage)) - return false; + public bool TryInsert(EntityUid storageUid, EntityUid toInsert, PseudoItemComponent component, + StorageComponent? storage = null) + { + if (!Resolve(storageUid, ref storage)) + return false; - if (component.Size > storage.StorageCapacityMax - storage.StorageUsed) - return false; + if (component.Size > storage.StorageCapacityMax - storage.StorageUsed) + return false; - var item = EnsureComp(toInsert); - _tagSystem.TryAddTag(toInsert, PreventTag); + var item = EnsureComp(toInsert); + _tagSystem.TryAddTag(toInsert, PreventTag); _itemSystem.SetSize(toInsert, component.Size, item); - if (!_storageSystem.Insert(storageUid, toInsert, out _, storageComp: storage)) - { - component.Active = false; - RemComp(toInsert); - return false; - } + if (!_storageSystem.Insert(storageUid, toInsert, out _, null, storage)) + { + component.Active = false; + RemComp(toInsert); + return false; + } - component.Active = true; - Transform(storageUid).AttachToGridOrMap(); - return true; + component.Active = true; + return true; + } - } - private void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, EntityUid storageEntity, PseudoItemComponent? pseudoItem = null) + private void StartInsertDoAfter(EntityUid inserter, EntityUid toInsert, EntityUid storageEntity, + PseudoItemComponent? pseudoItem = null) + { + if (!Resolve(toInsert, ref pseudoItem)) + return; + + var ev = new PseudoItemInsertDoAfterEvent(); + var args = new DoAfterArgs(EntityManager, inserter, 5f, ev, toInsert, toInsert, storageEntity) { - if (!Resolve(toInsert, ref pseudoItem)) - return; + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true + }; - _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, inserter, 5f, new PseudoDoAfterEvent(), toInsert, target: toInsert, used: storageEntity) - { - BreakOnTargetMove = true, - BreakOnUserMove = true, - NeedHand = true - }); - } + _doAfter.TryStartDoAfter(args); + } + + private void OnInsertAttempt(EntityUid uid, PseudoItemComponent component, + ContainerGettingInsertedAttemptEvent args) + { + if (!component.Active) + return; + // This hopefully shouldn't trigger, but this is a failsafe just in case so we dont bluespace them cats + args.Cancel(); } } diff --git a/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs b/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs index 34a865d8b78..1dbd2da4c08 100644 --- a/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs +++ b/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs @@ -3,7 +3,7 @@ using Robust.Shared.Physics; using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Systems; -using Content.Server.Item.PseudoItem; +using Content.Shared.Item.PseudoItem; namespace Content.Server.SizeAttribute { diff --git a/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs b/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs new file mode 100644 index 00000000000..4505e365fdf --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/Components/PseudoItemComponent.cs @@ -0,0 +1,15 @@ +using Content.Shared._NF.Cloning; + +namespace Content.Shared.Item.PseudoItem; +/// +/// For entities that behave like an item under certain conditions, +/// but not under most conditions. +/// +[RegisterComponent] +public sealed partial class PseudoItemComponent : Component, ITransferredByCloning +{ + [DataField("size")] + public int Size = 120; + + public bool Active = false; +} diff --git a/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs b/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs new file mode 100644 index 00000000000..4b34118f377 --- /dev/null +++ b/Content.Shared/Nyanotrasen/Item/PseudoItemInsertDoAfterEvent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Item.PseudoItem; + + +[Serializable, NetSerializable] +public sealed partial class PseudoItemInsertDoAfterEvent : SimpleDoAfterEvent +{ +} diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 5faec99fd5b..efd77b1e91a 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Implants.Components; using Content.Shared.Interaction; using Content.Shared.Item; +using Content.Shared.Item.PseudoItem; using Content.Shared.Lock; using Content.Shared.Placeable; using Content.Shared.Popups; @@ -439,6 +440,9 @@ public void TransferEntities(EntityUid source, EntityUid target, EntityUid? user foreach (var entity in entities.ToArray()) { + if (HasComp(entity)) // Nyanotrasen - They dont transfer properly + continue; + Insert(target, entity, out _, user: user, targetComp, playSound: false); } diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs index 6f764bb9f4e..d0adcccf2ee 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Gravity; using Content.Shared.Hands; using Content.Shared.Hands.Components; +using Content.Shared.Item; // Delta-V: Felinids in duffelbags can't shoot. using Content.Shared.Popups; using Content.Shared.Projectiles; using Content.Shared.Tag; @@ -128,7 +129,8 @@ private void OnShootRequest(RequestShootEvent msg, EntitySessionEventArgs args) if (user == null || !_combatMode.IsInCombatMode(user) || - !TryGetGun(user.Value, out var ent, out var gun)) + !TryGetGun(user.Value, out var ent, out var gun) || + HasComp(user)) // Delta-V: Felinids in duffelbags can't shoot. { return; } diff --git a/Resources/Locale/en-US/_NF/chat/managers/chat_manager.ftl b/Resources/Locale/en-US/_NF/chat/managers/chat_manager.ftl index ba803dc651c..9d71e720e80 100644 --- a/Resources/Locale/en-US/_NF/chat/managers/chat_manager.ftl +++ b/Resources/Locale/en-US/_NF/chat/managers/chat_manager.ftl @@ -1,4 +1,10 @@ chat-speech-verb-vulpkanin-1 = rawrs chat-speech-verb-vulpkanin-2 = barks chat-speech-verb-vulpkanin-3 = rurs -chat-speech-verb-vulpkanin-4 = yeeps +chat-speech-verb-vulpkanin-4 = yaps +chat-speech-verb-vulpkanin-5 = yeeps + +chat-speech-verb-felinid-1 = mraows +chat-speech-verb-felinid-2 = mews +chat-speech-verb-felinid-3 = meows +chat-speech-verb-felinid-4 = purrs out diff --git a/Resources/Locale/en-US/_Nyano/felinid.ftl b/Resources/Locale/en-US/_Nyano/abilities/felinid.ftl similarity index 63% rename from Resources/Locale/en-US/_Nyano/felinid.ftl rename to Resources/Locale/en-US/_Nyano/abilities/felinid.ftl index 62d4469e687..92181194167 100644 --- a/Resources/Locale/en-US/_Nyano/felinid.ftl +++ b/Resources/Locale/en-US/_Nyano/abilities/felinid.ftl @@ -1,5 +1,6 @@ -hairball-action = Cough Up Hairball -hairball-action-desc = Purge some of your chemstream, and gain a cool hairball to throw at people. +action-name-hairball = Cough Up Hairball +action-description-hairball = Purge some of your chemstream, and gain a cool hairball to throw at people. + hairball-mask = Take off your {$mask} first. hairball-cough = {CAPITALIZE(THE($name))} starts coughing up a hairball! diff --git a/Resources/Locale/en-US/_Nyano/oni.ftl b/Resources/Locale/en-US/_Nyano/abilities/oni.ftl similarity index 100% rename from Resources/Locale/en-US/_Nyano/oni.ftl rename to Resources/Locale/en-US/_Nyano/abilities/oni.ftl diff --git a/Resources/Locale/en-US/deltav/markings/felinid.ftl b/Resources/Locale/en-US/deltav/markings/felinid.ftl new file mode 100644 index 00000000000..89f4d43bd4e --- /dev/null +++ b/Resources/Locale/en-US/deltav/markings/felinid.ftl @@ -0,0 +1,5 @@ +marking-FelinidFluffyTail-Felinid_fluffy_tail_full = Fluffy Tail +marking-FelinidFluffyTailRings-Felinid_fluffy_tail_full = Fluffy tail +marking-FelinidFluffyTailRings-felinid_fluffy_tail_rings = Fluffy Tail Rings +marking-FelinidFluffyTail = Fluffy Tail +marking-FelinidFluffyTailRings = Fluffy Tail with rings diff --git a/Resources/Locale/en-US/markings/felinid.ftl b/Resources/Locale/en-US/markings/felinid.ftl new file mode 100644 index 00000000000..d2e7abae4f7 --- /dev/null +++ b/Resources/Locale/en-US/markings/felinid.ftl @@ -0,0 +1,56 @@ +marking-FelinidEarsBasic = Basic Ears +marking-FelinidEarsBasic-basic_outer = Outer ear +marking-FelinidEarsBasic-basic_inner = Inner ear + +marking-FelinidEarsCurled = Curled Ears +marking-FelinidEarsCurled-curled_outer = Outer ear +marking-FelinidEarsCurled-curled_inner = Inner ear + +marking-FelinidEarsDroopy = Droopy Ears +marking-FelinidEarsDroopy-droopy_outer = Outer ear +marking-FelinidEarsDroopy-droopy_inner = Inner ear + +marking-FelinidEarsFuzzy = Fuzzy Ears +marking-FelinidEarsFuzzy-basic_outer = Outer ear +marking-FelinidEarsFuzzy-fuzzy_inner = Ear fuzz + +marking-FelinidEarsStubby = Stubby Ears +marking-FelinidEarsStubby-stubby_outer = Outer ear +marking-FelinidEarsStubby-stubby_inner = Inner ear + +marking-FelinidEarsTall = Tall Ears +marking-FelinidEarsTall-tall_outer = Outer ear +marking-FelinidEarsTall-tall_inner = Inner ear +marking-FelinidEarsTall-tall_fuzz = Ear fuzz + +marking-FelinidEarsTorn = Torn Ears +marking-FelinidEarsTorn-torn_outer = Outer ear +marking-FelinidEarsTorn-torn_inner = Inner ear + +marking-FelinidEarsWide = Wide Ears +marking-FelinidEarsWide-wide_outer = Outer ear +marking-FelinidEarsWide-wide_inner = Inner ear + +marking-FelinidTailBasic = Basic Tail +marking-FelinidTailBasic-basic_tail_tip = Tail tip +marking-FelinidTailBasic-basic_tail_stripes_even = Tail stripes, even +marking-FelinidTailBasic-basic_tail_stripes_odd = Tail stripes, odd + +marking-FelinidTailBasicWithBow = Basic Tail with Bow +marking-FelinidTailBasicWithBow-basic_tail_tip = Tail tip +marking-FelinidTailBasicWithBow-basic_tail_stripes_even = Tail stripes, even +marking-FelinidTailBasicWithBow-basic_tail_stripes_odd = Tail stripes, odd +marking-FelinidTailBasicWithBow-basic_bow = Bow + +marking-FelinidTailBasicWithBell = Basic Tail with Bell +marking-FelinidTailBasicWithBell-basic_tail_tip = Tail tip +marking-FelinidTailBasicWithBell-basic_tail_stripes_even = Tail stripes, even +marking-FelinidTailBasicWithBell-basic_tail_stripes_odd = Tail stripes, odd +marking-FelinidTailBasicWithBell-basic_bell = Bell + +marking-FelinidTailBasicWithBowAndBell = Basic Tail with Bow & Bell +marking-FelinidTailBasicWithBowAndBell-basic_tail_tip = Tail tip +marking-FelinidTailBasicWithBowAndBell-basic_tail_stripes_even = Tail stripes, even +marking-FelinidTailBasicWithBowAndBell-basic_tail_stripes_odd = Tail stripes, odd +marking-FelinidTailBasicWithBowAndBell-basic_bow = Bow +marking-FelinidTailBasicWithBowAndBell-basic_bell = Bell diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml new file mode 100644 index 00000000000..1d386dd9363 --- /dev/null +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Customization/Markings/felinid.yml @@ -0,0 +1,20 @@ +- type: marking + id: FelinidFluffyTailRings + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Felinid] + sprites: + - sprite: DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi + state: Felinid_fluffy_tail_full + - sprite: DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi + state: felinid_fluffy_tail_rings + +- type: marking + id: FelinidFluffyTail + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Felinid] + sprites: + - sprite: DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi + state: Felinid_fluffy_tail_full + diff --git a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml index 5b807620c55..ab0df74bdc0 100644 --- a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml @@ -7,6 +7,16 @@ collection: VulpkaninScreams Laugh: collection: MaleLaugh + Sneeze: + collection: MaleSneezes + Cough: + collection: MaleCoughs + Crying: + collection: MaleCry + Whistle: + collection: Whistles + Sigh: + collection: MaleSigh Growl: collection: VulpkaninGrowls Howl: @@ -23,6 +33,16 @@ collection: VulpkaninScreams Laugh: collection: FemaleLaugh + Sneeze: + collection: FemaleSneezes + Cough: + collection: FemaleCoughs + Crying: + collection: FemaleCry + Whistle: + collection: Whistles + Sigh: + collection: FemaleSigh Growl: collection: VulpkaninGrowls Howl: diff --git a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml index 246b9883798..20c04e130cb 100644 --- a/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml +++ b/Resources/Prototypes/DeltaV/Voice/speech_verbs.yml @@ -5,3 +5,12 @@ - chat-speech-verb-vulpkanin-2 - chat-speech-verb-vulpkanin-3 - chat-speech-verb-vulpkanin-4 + - chat-speech-verb-vulpkanin-5 + +- type: speechVerb + id: Felinid + speechVerbStrings: + - chat-speech-verb-felinid-1 + - chat-speech-verb-felinid-2 + - chat-speech-verb-felinid-3 + - chat-speech-verb-felinid-4 diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml index 2fff0480689..b5a5440ec79 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml @@ -2,7 +2,7 @@ id: TattooHiveChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Oni, Felinid, Dwarf, Oni] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -16,7 +16,7 @@ id: TattooNightlingChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -30,7 +30,7 @@ id: TattooSilverburghLeftLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -44,7 +44,7 @@ id: TattooSilverburghRightLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -58,7 +58,7 @@ id: TattooCampbellLeftArm bodyPart: LArm markingCategory: Arms - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -72,7 +72,7 @@ id: TattooCampbellRightArm bodyPart: RArm markingCategory: Arms - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -86,7 +86,7 @@ id: TattooCampbellLeftLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -100,7 +100,7 @@ id: TattooCampbellRightLeg bodyPart: RLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf, Oni, Felinid] + speciesRestriction: [Human, Dwarf, Felinid, Oni] coloring: default: type: @@ -114,7 +114,7 @@ id: TattooEyeRight bodyPart: Eyes markingCategory: Head - speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Oni, Felinid, Reptilian] + speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni] coloring: default: type: @@ -128,7 +128,7 @@ id: TattooEyeLeft bodyPart: Eyes markingCategory: Head - speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Oni, Felinid, Reptilian] + speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Felinid, Oni] coloring: default: type: diff --git a/Resources/Prototypes/_NF/Voice/speech_emote_sounds.yml b/Resources/Prototypes/_NF/Voice/speech_emote_sounds.yml index 29dca329596..4d15e37a25d 100644 --- a/Resources/Prototypes/_NF/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/_NF/Voice/speech_emote_sounds.yml @@ -17,6 +17,8 @@ collection: FelinidGrowls Purr: collection: FelinidPurrs + Sigh: + collection: MaleSigh - type: emoteSounds id: FemaleFelinid @@ -37,6 +39,8 @@ collection: FelinidGrowls Purr: collection: FelinidPurrs + Sigh: + collection: FemaleSigh - type: emoteSounds id: MaleMoth diff --git a/Resources/Prototypes/_Nyano/Actions/types.yml b/Resources/Prototypes/_Nyano/Actions/types.yml index 12f65c4d284..6668bc07238 100644 --- a/Resources/Prototypes/_Nyano/Actions/types.yml +++ b/Resources/Prototypes/_Nyano/Actions/types.yml @@ -12,8 +12,8 @@ - type: entity id: ActionHairball - name: hairball-action - description: hairball-action-desc + name: action-name-hairball + description: action-description-hairball noSpawn: true components: - type: InstantAction diff --git a/Resources/Prototypes/_Nyano/Entities/Mobs/Player/felinid.yml b/Resources/Prototypes/_Nyano/Entities/Mobs/Player/felinid.yml index 6147037ced1..c2f033becc4 100644 --- a/Resources/Prototypes/_Nyano/Entities/Mobs/Player/felinid.yml +++ b/Resources/Prototypes/_Nyano/Entities/Mobs/Player/felinid.yml @@ -3,3 +3,6 @@ name: Urist McFelinid parent: [MobFelinidBase, BaseMob] id: MobFelinid + components: + - type: Speech + speechVerb: Felinid diff --git a/Resources/Prototypes/_Nyano/Voice/speech_emotes.yml b/Resources/Prototypes/_Nyano/Voice/speech_emotes.yml index 21bb428029d..32b2a9716a0 100644 --- a/Resources/Prototypes/_Nyano/Voice/speech_emotes.yml +++ b/Resources/Prototypes/_Nyano/Voice/speech_emotes.yml @@ -4,65 +4,70 @@ category: Vocal chatMessages: [hisses.] chatTriggers: - - hiss - - hisses + - hiss. - hisses. - hisses! - - hissing - - hissed + - hissing. + - hissed. - type: emote id: Meow category: Vocal chatMessages: [meows.] chatTriggers: - - meow - - meows + - meow. + - meow! - meows. + - meows~ - meows! - - meowing - - meowed - - miau - - miaus + - meowing. + - meowed. + - miau. - miaus. - miaus! - - nya - - nyas + - nya. - nyas. - nyas! + - mraow. + - mraow! + - mraow~ + - mraows. + - mraows! + - mraows~ - type: emote id: Mew category: Vocal chatMessages: [mews.] chatTriggers: - - mew - - mews + - mew. + - mew! + - mew~ - mews. - mews! - - mewing - - mewed + - mews~ + - mewing. + - mewed. - type: emote id: Growl category: Vocal chatMessages: [growls.] chatTriggers: - - growl - - growls + - growl. - growls. - growls! - - growling - - growled + - growling. + - growled. - type: emote id: Purr category: Vocal chatMessages: [purrs.] chatTriggers: - - purr - - purrs + - purr. - purrs. + - purrs~ - purrs! - - purring - - purred + - purring. + - purred. \ No newline at end of file diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/Felinid_fluffy_tail_full.png b/Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/Felinid_fluffy_tail_full.png new file mode 100644 index 0000000000000000000000000000000000000000..d699f1035a403b9dccfda1030fa6d79f29dc2dfb GIT binary patch literal 2573 zcmdT``#aMQ1O1F`E@6{0luISlT#BR#o2*=tOOf_!F2$&YS2H7QE?pEVwh4*>BKfFJj^PK1Wdd_p6bKAqsQCU$-5dZ*XXD94w z008N2>O^_yCRg+7M>mb|OAZbmmo8oe0HaKDChDZD=e8SYwd0?i;3inF({Hvbq$Zzp z0S{o)^pkzFT?t!vu?}SGT|f?>lUFav@SQ~WpMBvC2Oo#OtfLUI??qXdwfBng z6O4tqbF8-k0T?x;s9h+fO}~aUJE!={#UI2am7nU3%&RzU`K0Wnc-RgV`DJFlCk+6} zfaT$On8g1xaTO9C5kc=p)~PqBjQsj=$U`WS2|k~5@bvg&H^=X+oT>+Ib`!1T@r2&6 z#f635!v&vkXKktCbxWlM7K>Gk^YQVyq%Oeni*;ZySjxxM#fi>S<}jDAkv5uCg-Fv* z%baQG;q&>$wcJz)LIh3i>guZdDOu*aBOLR4?0pP5td9+9{y#OboJrh<`pm4xTxG zU+^qUmmTsv+FcPt);1Eks$TBJVX`_RGUp+PXGB zEo`|dh}&UEJb*6Gh=VX9K}5Wq)U+NQHGKO? z35w%uu!<;UI-2A)bCvzmo;!m3bGw70u)g#f>-vt0b3v`6f8<=lf;%H0Y6|-1MAoW% zx~QV~x}NB~Tdq0Zb#b>~^gEe9h6_BXcwD~@d7l44z7Fp%Jj>XKB>4epWhMB3mF=g zq`N*z_|7d(u{&V-qC>sl2z2IJNvQ)5dHIhFV zt@YXh_!X^1kZBfQc3J^v*uk-MXu54KjjTh~S__AIrFdw^f3|1X%H)Bz;w3RA`p7MJ zR1Sy5hC$WGsP=lM^7C33MLQX178+URa3SYv)3eLpN1z?kiob*U!j{rh zWF972)ygMR>r!1O#HQRO|O{Gw!cuL4T$fZLxu zy(6X~PGdxE%7wt3`R~i*I^3HZ6)mD^S&xtLTkGh{1^|KLz4EqJ@Tutf(}mkpwb+pt zPE6U~{OM`tL&wYXLpNx+=G~TnKBV~Xy?Jd#A?mR!6YNGy`4j9t7Ry?r^ccX!RyuN6 zESU`aF`IA<#dGuDk!G%8T6y)=9Z5D4IgIAptCej&FdO9i45rN^iNY#Ou1JYiRks z)11M4@@{BeiMIy70CQB(*GYV3!6^MkSYHwr7wIls`m7Xc)Re8nlSrrrUk1ic#Xz$@ zBm|@eo!%}OJxq3S@RLWXIYR0Ur z5iJ?l_FB&aB}POE7ils zOlVGwM4SauBC%$NNU6B7S)Xh%R&M0#RG{q=0eZdW6=w$wUDbI3ROtt*E`%2*53We1 zKYgg{+qL7rxVQN&P-_wBk}m(Kb|Q<_Dtpa^gHXV9hH*Ki?q|6}4fL$vIg}O8fQ^Q< znvc2(eeT*ZBZ9@i4fZ>(C8Tv!Dk7lMijsqk*S!<3b#HIsooDquTI;6S3d`@dc24Fd>MfAaX0MqV*$zk0cHzQ Ah5!Hn literal 0 HcmV?d00001 diff --git a/Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/felinid_fluffy_tail_rings.png b/Resources/Textures/DeltaV/Mobs/Customization/Felinid/felinid_tails.rsi/felinid_fluffy_tail_rings.png new file mode 100644 index 0000000000000000000000000000000000000000..4e6a6d8dc0de8e79a8724c266ee253a140694f63 GIT binary patch literal 2040 zcmdT_`B&139tB(~%mqhuMtx(;IQAfl$!9?-;1*Gip@9~G%b1SK9L?crCYq#Hqo*;) zCF^xe${YyHEtJf0nIR=p#K{QPK_i<&5tsa8fbg7u;r%e@ydOUI-1GVI-p{?CVsaSK z7U~KGfk3vTqrnj%5O~KXXK%IMM8P}Z#O5L`IVgyn93Kw??fEJ5r>^6H;h*;Br-WC+ z!h?dJ{$sD}_ItZr#XDS5$%PHhT^FrVs##TKuQ>GqNk7o^u6p|vTbfM)XX~zs2?H%K zO&cCi>{rcHddRS{K~}BJFyV-dhI&*cos)8uTof@<*nVhg`|o0>MPAxxHg`XwzgFlh z?5J7^rRlBC#Hd*=sxPc#WYZ1}{n8v76ziS7=MVVe=;-f{ms*+?mEgo|Csie=}hJ z9m3Js9gY;7mJefDMN2n~_s(E2MX(NK7hprXl;r*4K}7kc0o%?UJVO$rX6WJhbJXT#jE4xm`5;}^yqznD)#936JTN@s`PXSrp#RSsds_dBL!x@7g& zb^%XIpSZY0TW)pOL12TxkpEjU6AS72nf`ulZ7sg#)OSk#{Ho8K&hF!#XFD6CZb?)s zRg~TGlkV>BQ~Rpl+rd~jiG$y^(W>4!Zma-6yGFg>hr`97)^oZ{`qadpU?Z2yeF;RZ znbC{W)6*e+e&?QH``WfT-0bMRPi4~cC_}lZt8wtknyb)v+RplFD36Lqa8%NyO&EW2 z01UB$AUOUb5;z%1nT&WiVe#q7HoowxKc@uB)8M6<_Ivt+0B)IoT2#6xf!(Wvu&9J8 z!+xoPlh|8w~Je zaW?!}^z!++vbL2{VvfCYi~Y&)4NB={J~U}65k5kaZIpWvV!yX~84q{DCS06v`(Ey5 zCw~rK>hx}CZ}dy0U%YxJDM0{`h`&G2K|qyaZ~n-5ULrE z$LD`{@V4eeWd4z<^$Yp=X8k~kZ|UmFN~?4y@_N_jp{K086_2azIkyEJS${%}KHxsJ zcj!*T$N7xWK5yiaNOtmc*3@}wdrvC_ zD(3|w5FBS;lY1mv(nz2XBwf{EdNqPmv4|TmQ+i2bwO(=fOusp$+nu5WQQgWH4b)w5 zZX60&3f?>auaq&#Ep8mZZq+vWzqUnkNmnmf)#i_>l!EXi^c zR%_9QNZMy0M9PO!%@$QGxu%sQn~DbwMa=$HEC z#6AS2LodqkAHLhFAGpStHX}IsRusY(dK|rkpoORqN$v0vN#Y|$t^l`1N4b>HWa=kf7o-8ntALpOTHAOOsKgt<_bf`2??)|j7q z{@LkkvLN>a&QL6`P{}eDfmp--#`>DwnI=WdMmv4qb=P!1Oir=Kg}lZh7m-Nhsi|cd zOO_8cJZ_cb*;l-IxedK`