From 5f4485c77046b268f6d22574ac0314ade745b009 Mon Sep 17 00:00:00 2001 From: KurokoTurbo <92106367+melanoTurbo@users.noreply.github.com> Date: Sun, 12 Nov 2023 21:25:33 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=90=D0=A0=D0=9F=D0=98=D0=98=20(#559)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * harpy initial * fix and some locale * ru locale * actions refactor shit * пофиксив гавпий~~~ пойду тестить~~ * hawpies are ready UwU * cweanup OwO * hawpies fixed a bit, still cant seawch them nya~ * hawpies can be stwipped now, fixie-dixie awwived~ * emotes fixie-dixied nya~ * говно * говно говна линтер соси --- .../White/Harpy/HarpysingerSystem.cs | 134 ++++++++++ .../White/Harpy/HarpySingerComponent.cs | 17 ++ .../White/Harpy/HarpySingerSystem.cs | 27 ++ .../Audio/White/Voice/Harpy/attributions.yml | 9 + Resources/Audio/White/Voice/Harpy/caw1.ogg | Bin 0 -> 8200 bytes Resources/Audio/White/Voice/Harpy/chirp1.ogg | Bin 0 -> 6456 bytes Resources/Audio/White/Voice/Harpy/license.txt | 2 + Resources/Locale/en-US/white/harpy/harpy.ftl | 6 + .../ru-RU/white/species/harpy/harpy.ftl | 6 + Resources/Prototypes/Damage/modifier_sets.yml | 7 + .../Mobs/Customization/Markings/tattoos.yml | 12 +- .../Prototypes/Voice/speech_emote_sounds.yml | 55 ++++ .../White/Body/Prototypes/harpy.yml | 49 ++++ .../Prototypes/White/Emotes/harpy_emotes.yml | 184 +++++++++++++ .../Customization/Markings/harpy-parts.yml | 95 +++++++ .../Prototypes/White/Mobs/Player/harpy.yml | 35 +++ .../Prototypes/White/Mobs/Species/harpy.yml | 178 +++++++++++++ .../White/SoundCollections/harpy.yml | 242 ++++++++++++++++++ Resources/Prototypes/White/Species/harpy.yml | 39 +++ Resources/Prototypes/emotes.yml | 16 ++ .../White/Interface/Actions/harpy_sing.png | Bin 0 -> 441 bytes .../harpy_ears.rsi/harpy_ears_default.png | Bin 0 -> 786 bytes .../Harpy/harpy_ears.rsi/meta.json | 16 ++ .../Harpy/harpy_tails.rsi/meta.json | 20 ++ .../Harpy/harpy_tails.rsi/phoenix_tail.png | Bin 0 -> 1076 bytes .../Harpy/harpy_tails.rsi/rooster_tail.png | Bin 0 -> 1052 bytes .../Harpy/harpy_wings.rsi/harpy.png | Bin 0 -> 1365 bytes .../Harpy/harpy_wings.rsi/harpy2tone1.png | Bin 0 -> 813 bytes .../Harpy/harpy_wings.rsi/harpy2tone2.png | Bin 0 -> 1015 bytes .../Harpy/harpy_wings.rsi/harpy3tone1.png | Bin 0 -> 820 bytes .../Harpy/harpy_wings.rsi/harpy3tone2.png | Bin 0 -> 493 bytes .../Harpy/harpy_wings.rsi/harpy3tone3.png | Bin 0 -> 791 bytes .../Harpy/harpy_wings.rsi/harpyspeckled1.png | Bin 0 -> 1321 bytes .../Harpy/harpy_wings.rsi/harpyspeckled2.png | Bin 0 -> 749 bytes .../Harpy/harpy_wings.rsi/harpyundertone1.png | Bin 0 -> 1298 bytes .../Harpy/harpy_wings.rsi/harpyundertone2.png | Bin 0 -> 356 bytes .../Harpy/harpy_wings.rsi/harpywingtip1.png | Bin 0 -> 1132 bytes .../Harpy/harpy_wings.rsi/harpywingtip2.png | Bin 0 -> 791 bytes .../Harpy/harpy_wings.rsi/meta.json | 59 +++++ 39 files changed, 1202 insertions(+), 6 deletions(-) create mode 100644 Content.Server/White/Harpy/HarpysingerSystem.cs create mode 100644 Content.Shared/White/Harpy/HarpySingerComponent.cs create mode 100644 Content.Shared/White/Harpy/HarpySingerSystem.cs create mode 100644 Resources/Audio/White/Voice/Harpy/attributions.yml create mode 100644 Resources/Audio/White/Voice/Harpy/caw1.ogg create mode 100644 Resources/Audio/White/Voice/Harpy/chirp1.ogg create mode 100644 Resources/Audio/White/Voice/Harpy/license.txt create mode 100644 Resources/Locale/en-US/white/harpy/harpy.ftl create mode 100644 Resources/Locale/ru-RU/white/species/harpy/harpy.ftl create mode 100644 Resources/Prototypes/White/Body/Prototypes/harpy.yml create mode 100644 Resources/Prototypes/White/Emotes/harpy_emotes.yml create mode 100644 Resources/Prototypes/White/Mobs/Customization/Markings/harpy-parts.yml create mode 100644 Resources/Prototypes/White/Mobs/Player/harpy.yml create mode 100644 Resources/Prototypes/White/Mobs/Species/harpy.yml create mode 100644 Resources/Prototypes/White/SoundCollections/harpy.yml create mode 100644 Resources/Prototypes/White/Species/harpy.yml create mode 100644 Resources/Textures/White/Interface/Actions/harpy_sing.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png create mode 100644 Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json diff --git a/Content.Server/White/Harpy/HarpysingerSystem.cs b/Content.Server/White/Harpy/HarpysingerSystem.cs new file mode 100644 index 0000000000..117b852bf4 --- /dev/null +++ b/Content.Server/White/Harpy/HarpysingerSystem.cs @@ -0,0 +1,134 @@ +using Content.Server.Instruments; +using Content.Server.Speech.Components; +using Content.Server.UserInterface; +using Content.Shared.ActionBlocker; +using Content.Shared.White.Harpy; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; +using Content.Shared.Mobs; +using Content.Shared.Popups; +using Content.Shared.StatusEffect; +using Content.Shared.UserInterface; +using Content.Shared.Zombies; +using Robust.Server.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server.White.Harpy +{ + public sealed class HarpySingerSystem : EntitySystem + { + [Dependency] private readonly InstrumentSystem _instrument = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnMobStateChangedEvent); + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnZombified); + //SubscribeLocalEvent(OnKnockedDown); //WD EDIT + //SubscribeLocalEvent(OnStunned); //WD EDIT + SubscribeLocalEvent(OnSleep); + SubscribeLocalEvent(OnStatusEffect); + //SubscribeLocalEvent(OnDamageChanged); //WD EDIT + + // This is intended to intercept the UI event and stop the MIDI UI from opening if the + // singer is unable to sing. Thus it needs to run before the ActivatableUISystem. + SubscribeLocalEvent(OnInstrumentOpen, before: new[] { typeof(ActivatableUISystem) }); + } + + private void OnEquip(GotEquippedEvent args) + { + // Check if an item that makes the singer mumble is equipped to their face + // (not their pockets!). As of writing, this should just be the muzzle. + if (TryComp(args.Equipment, out var accent) && + accent.ReplacementPrototype == "mumble" && + args.Slot == "mask") + { + CloseMidiUi(args.Equipee); + } + } + + private void OnMobStateChangedEvent(EntityUid uid, InstrumentComponent component, MobStateChangedEvent args) + { + if (args.NewMobState is MobState.Critical or MobState.Dead) + CloseMidiUi(args.Target); + } + + private void OnZombified(ref EntityZombifiedEvent args) + { + CloseMidiUi(args.Target); + } + + /* + private void OnKnockedDown(EntityUid uid, InstrumentComponent component, ref KnockedDownEvent args) + { + CloseMidiUi(uid); + } + + private void OnStunned(EntityUid uid, InstrumentComponent component, ref StunnedEvent args) + { + CloseMidiUi(uid); + } + */ + + private void OnSleep(EntityUid uid, InstrumentComponent component, SleepStateChangedEvent args) + { + if (args.FellAsleep) + CloseMidiUi(uid); + } + + private void OnStatusEffect(EntityUid uid, InstrumentComponent component, StatusEffectAddedEvent args) + { + if (args.Key == "Muted") + CloseMidiUi(uid); + } + + /// + /// Almost a copy of Content.Server.Damage.ForceSay.DamageForceSaySystem.OnDamageChanged. + /// Done so because DamageForceSaySystem doesn't output an event, and my understanding is + /// that we don't want to change upstream code more than necessary to avoid merge conflicts + /// and maintenance overhead. It still reuses the values from DamageForceSayComponent, so + /// any tweaks to that will keep ForceSay consistent with singing interruptions. + /// + + /// + /// Closes the MIDI UI if it is open. + /// + private void CloseMidiUi(EntityUid uid) + { + if (HasComp(uid) && + TryComp(uid, out var actor)) + { + _instrument.ToggleInstrumentUi(uid, actor.PlayerSession); + } + } + + /// + /// Prevent the player from opening the MIDI UI under some circumstances. + /// + private void OnInstrumentOpen(EntityUid uid, HarpySingerComponent component, OpenUiActionEvent args) + { + // CanSpeak covers all reasons you can't talk, including being incapacitated + // (crit/dead), asleep, or for any reason mute inclding glimmer or a mime's vow. + var canNotSpeak = !_blocker.CanSpeak(uid); + var zombified = TryComp(uid, out var _); + var muzzled = _inventorySystem.TryGetSlotEntity(uid, "mask", out var maskUid) && + TryComp(maskUid, out var accent) && + accent.ReplacementPrototype == "mumble"; + + // Set this event as handled when the singer should be incapable of singing in order + // to stop the ActivatableUISystem event from opening the MIDI UI. + args.Handled = canNotSpeak || muzzled || zombified; + + // Tell the user that they can not sing. + if (args.Handled) + _popupSystem.PopupEntity(Loc.GetString("no-sing-while-no-speak"), uid, uid, PopupType.Medium); + } + } +} diff --git a/Content.Shared/White/Harpy/HarpySingerComponent.cs b/Content.Shared/White/Harpy/HarpySingerComponent.cs new file mode 100644 index 0000000000..b0421a39e4 --- /dev/null +++ b/Content.Shared/White/Harpy/HarpySingerComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.White.Harpy +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class HarpySingerComponent : Component + { + [DataField("midiActionId", serverOnly: true, + customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? MidiActionId = "ActionHarpyPlayMidi"; + + [DataField("midiAction", serverOnly: true)] // server only, as it uses a server-BUI event !type + public EntityUid? MidiAction; + } +} diff --git a/Content.Shared/White/Harpy/HarpySingerSystem.cs b/Content.Shared/White/Harpy/HarpySingerSystem.cs new file mode 100644 index 0000000000..050a6c6591 --- /dev/null +++ b/Content.Shared/White/Harpy/HarpySingerSystem.cs @@ -0,0 +1,27 @@ +using Content.Shared.Actions; + +namespace Content.Shared.White.Harpy +{ + public class HarpySingerSystem : EntitySystem + { + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + } + + private void OnStartup(EntityUid uid, HarpySingerComponent component, ComponentStartup args) + { + _actionsSystem.AddAction(uid, ref component.MidiAction, component.MidiActionId); + } + + private void OnShutdown(EntityUid uid, HarpySingerComponent component, ComponentShutdown args) + { + _actionsSystem.RemoveAction(uid, component.MidiAction); + } + } +} diff --git a/Resources/Audio/White/Voice/Harpy/attributions.yml b/Resources/Audio/White/Voice/Harpy/attributions.yml new file mode 100644 index 0000000000..f8c5fc7236 --- /dev/null +++ b/Resources/Audio/White/Voice/Harpy/attributions.yml @@ -0,0 +1,9 @@ +- files: ["caw1.ogg"] + license: "CC-BY-SA-4.0" + copyright: "Original sound by https://xeno-canto.org/756861" + source: "https://xeno-canto.org/756861" + + files: ["chirp1.ogg"] + license: "CC-BY-SA-4.0" + copyright: "Original sound by https://xeno-canto.org/797998" + source: "https://xeno-canto.org/797998" diff --git a/Resources/Audio/White/Voice/Harpy/caw1.ogg b/Resources/Audio/White/Voice/Harpy/caw1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..182d3e755bfa77dc8d5ded9775bf32b213f1d690 GIT binary patch literal 8200 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/White/Voice/Harpy/chirp1.ogg b/Resources/Audio/White/Voice/Harpy/chirp1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..07303b6626c89630aa752e4c1a514837c5ff6fa3 GIT binary patch literal 6456 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 Vn(i&TMW*T`vjFnPv=Bc4{s+nl0CNBU literal 0 HcmV?d00001 diff --git a/Resources/Audio/White/Voice/Harpy/license.txt b/Resources/Audio/White/Voice/Harpy/license.txt new file mode 100644 index 0000000000..d7e2f4ed36 --- /dev/null +++ b/Resources/Audio/White/Voice/Harpy/license.txt @@ -0,0 +1,2 @@ +caw1.ogg licensed under CC-BY-SA-4.0 taken from https://xeno-canto.org/756861 +chirp1.ogg licensed under CC-BY-SA-4.0 taken from https://xeno-canto.org/797998 diff --git a/Resources/Locale/en-US/white/harpy/harpy.ftl b/Resources/Locale/en-US/white/harpy/harpy.ftl new file mode 100644 index 0000000000..7162fd4ee5 --- /dev/null +++ b/Resources/Locale/en-US/white/harpy/harpy.ftl @@ -0,0 +1,6 @@ +species-name-harpy = Harpy +marking-HarpyWingDefault = Basic Wings +marking-HarpyEarsDefault = Feather Tufts +marking-HarpyTailPhoenix = Phoenix Tail +marking-HarpyTailRooster = Rooster Tail +no-sing-while-no-speak = You can't sing right now. diff --git a/Resources/Locale/ru-RU/white/species/harpy/harpy.ftl b/Resources/Locale/ru-RU/white/species/harpy/harpy.ftl new file mode 100644 index 0000000000..282b1cd4cd --- /dev/null +++ b/Resources/Locale/ru-RU/white/species/harpy/harpy.ftl @@ -0,0 +1,6 @@ +species-name-harpy = Гарпия +marking-HarpyWingDefault = обычные крылья +marking-HarpyEarsDefault = пучки перьев +marking-HarpyTailPhoenix = хвост феникса +marking-HarpyTailRooster = петушиный хвост +no-sing-while-no-speak = Вы не можете петь. diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 92ba63d4eb..48ddb7e103 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -309,3 +309,10 @@ flatReductions: # can't punch the endoskeleton to death Blunt: 5 + +- type: damageModifierSet + id: Harpy + coefficients: + Blunt: 1.15 + Slash: 1.15 + Piercing: 1.15 diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/tattoos.yml index 8a1c1f5d78..548eb2bde1 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, Dwarf] + speciesRestriction: [Human, Dwarf, Harpy] coloring: default: type: @@ -16,7 +16,7 @@ id: TattooNightlingChest bodyPart: Chest markingCategory: Chest - speciesRestriction: [Human, Dwarf] + speciesRestriction: [Human, Dwarf, Harpy] coloring: default: type: @@ -30,7 +30,7 @@ id: TattooSilverburghLeftLeg bodyPart: LLeg markingCategory: Legs - speciesRestriction: [Human, Dwarf] + speciesRestriction: [Human, Dwarf, Harpy ] coloring: default: type: @@ -58,7 +58,7 @@ id: TattooCampbellLeftArm bodyPart: LArm markingCategory: Arms - speciesRestriction: [Human, Dwarf] + speciesRestriction: [Human, Dwarf, Harpy] coloring: default: type: @@ -114,7 +114,7 @@ id: TattooEyeRight bodyPart: Eyes markingCategory: Head - speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf] + speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Harpy] coloring: default: type: @@ -128,7 +128,7 @@ id: TattooEyeLeft bodyPart: Eyes markingCategory: Head - speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf] + speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Harpy] coloring: default: type: diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 04205f2cdb..5eae73e120 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -125,6 +125,61 @@ Purr: collection: FelinidPurrs +- type: emoteSounds + id: SoundsHarpy + params: + variation: 0.125 + sounds: + Scream: + collection: HarpyScreams + Laugh: + collection: HarpyLaugh + Sneeze: + collection: MaleSneezes + Cough: + collection: MaleCoughs + Sigh: + collection: MaleSigh + Crying: + collection: HarpyCry + Whistle: + collection: Whistles + Hiss: + collection: HarpyHisses + Meow: + collection: HarpyMeows + Mew: + collection: HarpyMews + Growl: + collection: HarpyGrowls + Purr: + collection: HarpyPurrs + Boom: + collection: HarpyBooms + Ring: + collection: HarpyRings + HonkHarpy: + collection: HarpyHonks + Pew: + collection: HarpyPews + Bang: + collection: HarpyBangs + Beep: + collection: HarpyBeeps + Rev: + collection: HarpyRevs + Click: + collection: HarpyClicks + Chitter: + collection: HarpyChitter + Squeak: + collection: HarpySqueak + Caw: + collection: HarpyCaws + Chirp: + collection: HarpyChirps + + - type: emoteSounds id: UnisexReptilian params: diff --git a/Resources/Prototypes/White/Body/Prototypes/harpy.yml b/Resources/Prototypes/White/Body/Prototypes/harpy.yml new file mode 100644 index 0000000000..9c832d9af3 --- /dev/null +++ b/Resources/Prototypes/White/Body/Prototypes/harpy.yml @@ -0,0 +1,49 @@ +- type: body + id: Harpy + name: "harpy" + root: torso + slots: + head: + part: HeadHuman + connections: + - torso + organs: + brain: OrganHumanBrain + eyes: OrganHumanEyes + torso: + part: TorsoHuman + connections: + - left arm + - right arm + - left leg + - right leg + organs: + heart: OrganHumanHeart + lungs: OrganHumanLungs + stomach: OrganHumanStomach + liver: OrganHumanLiver + kidneys: OrganHumanKidneys + right arm: + part: RightArmHuman + connections: + - right hand + left arm: + part: LeftArmHuman + connections: + - left hand + right hand: + part: RightHandHuman + left hand: + part: LeftHandHuman + right leg: + part: RightLegHuman + connections: + - right foot + left leg: + part: LeftLegHuman + connections: + - left foot + right foot: + part: RightFootHuman + left foot: + part: LeftFootHuman diff --git a/Resources/Prototypes/White/Emotes/harpy_emotes.yml b/Resources/Prototypes/White/Emotes/harpy_emotes.yml new file mode 100644 index 0000000000..2a1b10f46d --- /dev/null +++ b/Resources/Prototypes/White/Emotes/harpy_emotes.yml @@ -0,0 +1,184 @@ +- type: emote + id: Boom + category: Vocal + chatMessages: [имитирует звук взрыва] + chatTriggers: + - имитирует звук взрыва + - имитирует звук взрыва. + - бум + - взрыв + - boom + - booms + - booms. + - booms! + - booming + - boomed + +- type: emote + id: HonkHarpy + category: Vocal + chatMessages: [гудит] + chatTriggers: + - гудит. + - гудит + - хонкает + - хонкает. + - хонк + - honk + - honks + - honks. + - honks! + - honking + - honked + +- type: emote + id: Ring + category: Vocal + chatMessages: [звенит] + chatTriggers: + - звенит + - звенит. + - имитирует звонок + - имитирует звонок. + - ring + - rings + - rings. + - rings! + - ringing + - ringed + +- type: emote + id: Pew + category: Vocal + chatMessages: [пиукает] + chatTriggers: + - пиу + - пиу-пиу + - пиукает. + - пиукает + - pew. + - pews. + - pew! + +- type: emote + id: Bang + category: Vocal + chatMessages: [имитирует звук выстрела] + chatTriggers: + - имитирует звук выстрела + - выстрел + - выстрел. + - bangs. + - bang. + - bang! + - banging. + - banged. + +- type: emote + id: Beep + category: Vocal + chatMessages: [пищит] + chatTriggers: + - писк + - пищит + - beeps. + - beep. + - beep! + - beeping. + - beeped. + +- type: emote + id: Click + category: Vocal + chatMessages: [щёлкает] + chatTriggers: + - щелкает клювом + - щелк + - щёлкает + - щёлкает клювом + - щёлк + - clicks. + - click. + - click! + - clicking. + - clicked. + +- type: emote + id: Caw + category: Vocal + chatMessages: [воркует] + chatTriggers: + - воркует + - воркует. + - caws. + - caw. + - caw! + - cawing + - cawed + +- type: emote + id: Chirp + category: Vocal + chatMessages: [чирикает] + chatTriggers: + - чирик + - чирик. + - чирикает. + - чирикает + - чик-чирикает + - чик-чирикает. + - chirps. + - chirp. + - chirp! + - chirping. + - chirped. + +- type: emote + id: Rev + category: Vocal + chatMessages: [издает рёв] + chatTriggers: + - рев + - рев. + - рёв + - рёв. + - издает рев + - издает рев. + - издает рёв + - издает рёв. + +- type: emote + id: Chitter + category: Vocal + chatMessages: [тарахтит] + chatTriggers: + - тарахтит + - тараътит. + - chitter + - chitter. + - chitter! + - chitters + - chitters. + - chitters! + - chittered + - chittered. + - chittered! + +- type: emote + id: Squeak + category: Vocal + chatMessages: [сквикает] + chatTriggers: + - сквик + - сквик. + - сквикает + - сквикает. + - squeak + - squeak. + - squeak! + - squeaks + - squeaks. + - squeaks! + - squeaked + - squeaked. + - squeaked! diff --git a/Resources/Prototypes/White/Mobs/Customization/Markings/harpy-parts.yml b/Resources/Prototypes/White/Mobs/Customization/Markings/harpy-parts.yml new file mode 100644 index 0000000000..4f5a89430b --- /dev/null +++ b/Resources/Prototypes/White/Mobs/Customization/Markings/harpy-parts.yml @@ -0,0 +1,95 @@ +# All the Harpy customization + +# Ears Markings +- type: marking + id: HarpyWingDefault + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpy + +- type: marking + id: HarpyEarsDefault + bodyPart: Head + markingCategory: HeadTop + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_ears.rsi + state: harpy_ears_default + +- type: marking + id: HarpyTailPhoenix + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_tails.rsi + state: phoenix_tail + +- type: marking + id: HarpyTailRooster + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_tails.rsi + state: rooster_tail + +- type: marking + id: HarpyWing2Tone + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpy2tone1 + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpy2tone2 + +- type: marking + id: HarpyWing3Tone + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpy3tone1 + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpy3tone2 + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpy3tone3 + +- type: marking + id: HarpyWingSpeckled + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpyspeckled1 + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpyspeckled2 + +- type: marking + id: HarpyWingUndertone + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpyundertone1 + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpyundertone2 + +- type: marking + id: HarpyWingTips + bodyPart: RArm + markingCategory: Arms + speciesRestriction: [Harpy] + sprites: + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpywingtip1 + - sprite: White/Mobs/Customization/Harpy/harpy_wings.rsi + state: harpywingtip2 diff --git a/Resources/Prototypes/White/Mobs/Player/harpy.yml b/Resources/Prototypes/White/Mobs/Player/harpy.yml new file mode 100644 index 0000000000..f7466136cc --- /dev/null +++ b/Resources/Prototypes/White/Mobs/Player/harpy.yml @@ -0,0 +1,35 @@ +- type: entity + save: false + name: Urist McHarpy + parent: MobHarpyBase + id: MobHarpy + components: + - type: CombatMode + - type: InteractionPopup + successChance: 1 + interactSuccessString: hugging-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: hugging-success-generic-others + - type: MindContainer + showExamineInfo: true + - type: Input + context: "human" + - type: MobMover + - type: InputMover + - type: Respirator + damage: + types: + Asphyxiation: 1.15 + damageRecovery: + types: + Asphyxiation: -1.15 + - type: Alerts + - type: HarpySinger + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen diff --git a/Resources/Prototypes/White/Mobs/Species/harpy.yml b/Resources/Prototypes/White/Mobs/Species/harpy.yml new file mode 100644 index 0000000000..43fafd63a9 --- /dev/null +++ b/Resources/Prototypes/White/Mobs/Species/harpy.yml @@ -0,0 +1,178 @@ +- type: entity + save: false + name: Urist McHarpy + parent: BaseMobHuman + id: MobHarpyBase + abstract: true + components: + - type: HarpySinger + + - type: Instrument + allowPercussion: false + program: 52 + - type: SwappableInstrument + instrumentList: + "Voice": {52: 0} + "Trumpet": {56: 0} + "Electric": {27: 0} + "Bass": {33: 0} + "Rock": {29: 0} + "Acoustic": {24: 0} + "Flute": {73: 0} + "Sax": {66: 0} + - type: UserInterface + interfaces: + - key: enum.InstrumentUiKey.Key + type: InstrumentBoundUserInterface + - key: enum.VoiceMaskUIKey.Key + type: VoiceMaskBoundUserInterface + - key: enum.HumanoidMarkingModifierKey.Key + type: HumanoidMarkingModifierBoundUserInterface + - key: enum.StrippingUiKey.Key + type: StrippableBoundUserInterface + - type: Sprite + scale: 0.9, 0.9 + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "underwearb" ] #White + - map: [ "underweart" ] #White + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: [ "socks" ] #White + - map: [ "jumpsuit" ] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "clownedon" ] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false +# Yes, RArm has to be down here + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "mask" ] + - map: [ "head" ] + + - type: HumanoidAppearance + species: Harpy + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.28 + density: 140 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Body + prototype: Harpy + - type: Damageable + damageModifierSet: Harpy + - type: MeleeWeapon + soundHit: + collection: Punch + animation: WeaponArcClaw + damage: + types: + Blunt: 1 + Slash: 5 + - type: Speech + speechSounds: Alto + - type: Vocal + sounds: + Male: SoundsHarpy + Female: SoundsHarpy + Unsexed: SoundsHarpy + +- type: entity + save: false + name: Urist McHands + parent: MobHumanDummy + id: MobHarpyDummy + noSpawn: true + description: A dummy Harpy meant to be used in character setup. + components: + - type: HumanoidAppearance + species: Harpy + - type: Sprite + scale: 0.9, 0.9 + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "underpants" ] + - map: [ "undershirt" ] + - map: [ "socks" ] + - map: [ "jumpsuit" ] + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: [ "id" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "clownedon" ] # Dynamically generated + sprite: "Effects/creampie.rsi" + state: "creampie_human" + visible: false +# Yes, RArm has to be down here + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "mask" ] + - map: [ "head" ] + +- type: entity + id: ActionHarpyPlayMidi + name: Play MIDI + description: Sing your heart out! Right click yourself to set an instrument. + noSpawn: true + components: + - type: InstantAction + icon: White/Interface/Actions/harpy_sing.png + checkCanInteract: true + event: !type:OpenUiActionEvent + key: enum.InstrumentUiKey.Key diff --git a/Resources/Prototypes/White/SoundCollections/harpy.yml b/Resources/Prototypes/White/SoundCollections/harpy.yml new file mode 100644 index 0000000000..d129af60c9 --- /dev/null +++ b/Resources/Prototypes/White/SoundCollections/harpy.yml @@ -0,0 +1,242 @@ +- type: soundCollection + id: HarpyScreams + files: + - /Audio/White/Voice/Felinid/cat_scream1.ogg + - /Audio/White/Voice/Felinid/cat_scream2.ogg + - /Audio/White/Voice/Felinid/cat_scream3.ogg + - /Audio/Animals/monkey_scream.ogg + - /Audio/Voice/Human/malescream_1.ogg + - /Audio/Voice/Human/malescream_2.ogg + - /Audio/Voice/Human/malescream_3.ogg + - /Audio/Voice/Human/malescream_4.ogg + - /Audio/Voice/Human/malescream_5.ogg + - /Audio/Voice/Human/malescream_6.ogg + - /Audio/Voice/Human/femalescream_1.ogg + - /Audio/Voice/Human/femalescream_2.ogg + - /Audio/Voice/Human/femalescream_3.ogg + - /Audio/Voice/Human/femalescream_4.ogg + - /Audio/Voice/Human/femalescream_5.ogg + #- /Audio/Voice/Moth/moth_scream.ogg + - /Audio/Voice/Skeleton/skeleton_scream.ogg + - /Audio/Voice/Reptilian/reptilian_scream.ogg + +- type: soundCollection + id: HarpyLaugh + files: + - /Audio/Voice/Human/manlaugh1.ogg + - /Audio/Voice/Human/manlaugh2.ogg + - /Audio/Voice/Human/womanlaugh.ogg + - /Audio/Voice/Diona/diona_rustle1.ogg + - /Audio/Voice/Diona/diona_rustle2.ogg + - /Audio/Voice/Diona/diona_rustle3.ogg + - /Audio/Animals/lizard_happy.ogg + - /Audio/Animals/ferret_happy.ogg + #- /Audio/Voice/Moth/moth_laugh.ogg + +- type: soundCollection + id: HarpyHisses + files: + - /Audio/White/Voice/Felinid/cat_hiss1.ogg + - /Audio/White/Voice/Felinid/cat_hiss2.ogg + - /Audio/Weapons/ebladeon.ogg + - /Audio/Weapons/eblade1.ogg + - /Audio/Items/hiss.ogg + - /Audio/Items/hypospray.ogg + - /Audio/Items/ratchet.ogg + - /Audio/Items/welder.ogg + - /Audio/Machines/airlock_close.ogg + - /Audio/Machines/airlock_ext_close.ogg + - /Audio/Machines/airlock_ext_open.ogg + - /Audio/Machines/airlock_open.ogg + - /Audio/Machines/disposalflush.ogg + - /Audio/Machines/printer.ogg + - /Audio/Machines/windoor_open.ogg + - /Audio/Effects/spray.ogg + - /Audio/Effects/spray2.ogg + +- type: soundCollection + id: HarpySigh + files: + - /Audio/Voice/Human/male_sigh.ogg + - /Audio/Voice/Human/female_sigh.ogg + +- type: soundCollection + id: HarpyCry + files: + - /Audio/Voice/Human/cry_male_1.ogg + - /Audio/Voice/Human/cry_male_2.ogg + - /Audio/Voice/Human/cry_male_3.ogg + - /Audio/Voice/Human/cry_male_4.ogg + - /Audio/Voice/Human/cry_female_1.ogg + - /Audio/Voice/Human/cry_female_2.ogg + - /Audio/Voice/Human/cry_female_3.ogg + - /Audio/Voice/Human/cry_female_4.ogg + +- type: soundCollection + id: HarpyMeows + files: + - /Audio/White/Voice/Felinid/cat_meow1.ogg + - /Audio/White/Voice/Felinid/cat_meow2.ogg + - /Audio/White/Voice/Felinid/cat_meow3.ogg + - /Audio/Items/Toys/meow1.ogg + - /Audio/Animals/cat_meow.ogg + +- type: soundCollection + id: HarpyMews + files: + - /Audio/White/Voice/Felinid/cat_mew1.ogg + - /Audio/White/Voice/Felinid/cat_mew2.ogg + +- type: soundCollection + id: HarpyGrowls + files: + - /Audio/White/Voice/Felinid/cat_growl1.ogg + - /Audio/Animals/bear.ogg + +- type: soundCollection + id: HarpyPurrs + files: + - /Audio/White/Voice/Felinid/cat_purr1.ogg + - /Audio/Mecha/sound_mecha_hydraulic.ogg + +- type: soundCollection + id: HarpyBooms + files: + - /Audio/Effects/flash_bang.ogg + +- type: soundCollection + id: HarpyRings + files: + - /Audio/Items/desk_bell_ring.ogg + - /Audio/Items/ring.ogg + - /Audio/Machines/ding.ogg + #- /Audio/Machines/warning_buzzer.ogg + +- type: soundCollection + id: HarpyHonks + files: + - /Audio/Items/bikehorn.ogg + - /Audio/Items/brokenbikehorn.ogg + +- type: soundCollection + id: HarpyPews + files: + - /Audio/Weapons/Guns/Gunshots/silenced.ogg + - /Audio/Weapons/Guns/Gunshots/taser.ogg + - /Audio/Weapons/Guns/Gunshots/taser2.ogg + - /Audio/Weapons/Guns/Gunshots/laser.ogg + - /Audio/Weapons/Guns/Gunshots/laser3.ogg + - /Audio/Weapons/emitter.ogg + - /Audio/Effects/Arcade/player_attack.ogg + - /Audio/Effects/Arcade/player_charge.ogg + - /Audio/Effects/Arcade/player_heal.ogg + - /Audio/Magic/blink.ogg + - /Audio/Magic/staff_animation.ogg + - /Audio/Magic/staff_change.ogg + - /Audio/Magic/staff_chaos.ogg + - /Audio/Magic/staff_door.ogg + - /Audio/Magic/staff_healing.ogg + +- type: soundCollection + id: HarpyBangs + files: + - /Audio/Weapons/Guns/Gunshots/atreides.ogg + - /Audio/Weapons/Guns/Gunshots/bang.ogg + - /Audio/Weapons/Guns/Gunshots/mk58.ogg + - /Audio/Weapons/Guns/Gunshots/pistol.ogg + - /Audio/Weapons/Guns/Gunshots/c-20r.ogg + - /Audio/Items/snap.ogg + - /Audio/Machines/airlock_creaking.ogg + - /Audio/Machines/blastdoor.ogg + - /Audio/Machines/machine_vend.ogg + - /Audio/Magic/disintegrate.ogg + - /Audio/Magic/fireball.ogg + - /Audio/Magic/forcewall.ogg + - /Audio/Magic/knock.ogg + +- type: soundCollection + id: HarpyBeeps + files: + - /Audio/Weapons/Guns/EmptyAlarm/smg_empty_alarm.ogg + - /Audio/Weapons/flash.ogg + - /Audio/Items/beep.ogg + - /Audio/Items/flashlight_pda.ogg + - /Audio/Items/locator_beep.ogg + - /Audio/Items/toolbox_drop.ogg + - /Audio/Items/Defib/defib_charge.ogg + - /Audio/Items/Defib/defib_ready.ogg + - /Audio/Items/Defib/defib_safety_off.ogg + - /Audio/Items/Defib/defib_safety_on.ogg + - /Audio/Items/Medical/healthscanner.ogg + - /Audio/Effects/RingtoneNotes/a.ogg + - /Audio/Effects/RingtoneNotes/asharp.ogg + - /Audio/Effects/RingtoneNotes/b.ogg + - /Audio/Effects/RingtoneNotes/c.ogg + - /Audio/Effects/RingtoneNotes/csharp.ogg + - /Audio/Effects/RingtoneNotes/d.ogg + - /Audio/Effects/RingtoneNotes/dsharp.ogg + - /Audio/Effects/RingtoneNotes/e.ogg + - /Audio/Effects/RingtoneNotes/f.ogg + - /Audio/Effects/RingtoneNotes/fsharp.ogg + - /Audio/Effects/RingtoneNotes/g.ogg + - /Audio/Effects/RingtoneNotes/gsharp.ogg + - /Audio/Effects/Arcade/gameover.ogg + - /Audio/Effects/Arcade/win.ogg + - /Audio/Machines/airlock_deny.ogg + - /Audio/Machines/alarm.ogg + - /Audio/Machines/beep.ogg + - /Audio/Machines/boltsdown.ogg + - /Audio/Machines/boltsup.ogg + - /Audio/Machines/custom_deny.ogg + - /Audio/Machines/high_tech_confirm.ogg + - /Audio/Machines/microwave_done_beep.ogg + - /Audio/Machines/scan_finish.ogg + - /Audio/Machines/vending_jingle.ogg + +- type: soundCollection + id: HarpyRevs + files: + #- /Audio/Weapons/chainsawwield.ogg + - /Audio/Machines/blender.ogg + - /Audio/Machines/juicer.ogg + - /Audio/Machines/reclaimer_startup.ogg + +- type: soundCollection + id: HarpyClicks + files: + - /Audio/Items/deconstruct.ogg + - /Audio/Items/flashlight_off.ogg + - /Audio/Items/flashlight_on.ogg + - /Audio/Items/pistol_cock.ogg + - /Audio/Items/pistol_magin.ogg + - /Audio/Items/pistol_magout.ogg + - /Audio/Items/rped.ogg + - /Audio/Machines/door_lock_off.ogg + - /Audio/Machines/door_lock_on.ogg + - /Audio/Machines/id_swipe.ogg + - /Audio/Machines/machine_switch.ogg + - /Audio/Machines/screwdriveropen.ogg + +- type: soundCollection + id: HarpyChitter + files: + - /Audio/Machines/circuitprinter.ogg + - /Audio/Machines/diagnoser_printing.ogg + - /Audio/Machines/uniformprinter.ogg + - /Audio/Machines/vaccinator_running.ogg + +- type: soundCollection + id: HarpySqueak + files: + #- /Audio/Voice/Moth/moth_squeak.ogg + - /Audio/Animals/mouse_squeak.ogg + +- type: soundCollection + id: HarpyCaws + files: + - /Audio/White/Voice/Harpy/caw1.ogg + +- type: soundCollection + id: HarpyChirps + files: + - /Audio/White/Voice/Harpy/chirp1.ogg diff --git a/Resources/Prototypes/White/Species/harpy.yml b/Resources/Prototypes/White/Species/harpy.yml new file mode 100644 index 0000000000..d1f29c8d69 --- /dev/null +++ b/Resources/Prototypes/White/Species/harpy.yml @@ -0,0 +1,39 @@ +- type: species + id: Harpy + name: species-name-harpy + roundStart: true + prototype: MobHarpy + markingLimits: MobHarpyMarkingLimits + dollPrototype: MobHarpyDummy + skinColoration: HumanToned + sprites: MobHumanSprites + bodyTypes: + - HumanNormal + +- type: markingPoints + id: MobHarpyMarkingLimits + points: + Hair: + points: 1 + required: false + FacialHair: + points: 1 + required: false + Tail: + points: 1 + required: true + defaultMarkings: [ HarpyTailPhoenix ] + HeadTop: + points: 1 + required: true + defaultMarkings: [ HarpyEarsDefault ] + Chest: + points: 1 + required: false + Legs: + points: 2 + required: false + Arms: + points: 1 + required: false + defaultMarkings: [ HarpyWingDefault ] diff --git a/Resources/Prototypes/emotes.yml b/Resources/Prototypes/emotes.yml index c6bc63f12f..a19ac79310 100644 --- a/Resources/Prototypes/emotes.yml +++ b/Resources/Prototypes/emotes.yml @@ -117,3 +117,19 @@ buttonText: Облизываться chatMessages: [облизывается] allowMenu: true +- type: emote + + id: Sigh + category: Vocal + chatMessages: [вздыхает] + +- type: emote + id: Whistle + category: Vocal + chatMessages: [свистит] + +- type: emote + id: Crying + category: Vocal + chatMessages: [плачет] + diff --git a/Resources/Textures/White/Interface/Actions/harpy_sing.png b/Resources/Textures/White/Interface/Actions/harpy_sing.png new file mode 100644 index 0000000000000000000000000000000000000000..0109e9aae9ffc3627d9a9f068d9f3638a7ab607d GIT binary patch literal 441 zcmV;q0Y?6bP)Px$SxH1eR9J=Wm%mK|F%-ssjzYr#p+iC<5C%w>1)!v102ly7#RQZvKo}s!RY;it z20%heKp+O7p+Ha|Vv6{Y*s)K!i;*u9Ut_&zpYOfz{jsfx2VHQz0;okapcGVuJv6}6 zS1|%MSH{1tM=&6`c?i?SCJ(`%Fd%Tl;$tQ`1OEmjH=sxox`jTIQK9n7E6d~z%+m=q zz{A0zrQGgaS#sGdco#dIsEByPkiVQ9Kt&2V}vUb#ew2CI_-W$6LR?_v+it z-(zI?84zfImy<03HZC5mg&uv3S5*ZW_&D!a3*?jw=~?z1_yObDTxeWqkCgxb01jnX jNoGw=04e|g00;m8000000Mb*F00000NkvXXu0mjfqo1ya literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png new file mode 100644 index 0000000000000000000000000000000000000000..fa27e2b74a63f4fe460360508f78c5a595514d0d GIT binary patch literal 786 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 Xk>Dg~@AHrF00000NkvXXu0mjfH-m8O literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png new file mode 100644 index 0000000000000000000000000000000000000000..2030ff8cf2dc36c1f600ec256d459b11b938e46a GIT binary patch literal 813 zcmV+|1JeA7P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940>Vi|K~#8N?V2&J z;y?_Bd3%CKMMcFWC^-QV6=$SE;slgjf{Kc6#Rb^>*)cMHnT$O%N!XP?DGKA6*uOna z&eaSU*U*Ti#x-LuwAm_W??iCQw zIA;eeTrQU%u|Z>d!j5?><__o*0Alu)I%y*na^A^+vpxuq_a%#Q?RAlUUYY^mY zLh=Hh5CYJc2je!mK77o^>d(49+5vEc15W4&Q@!x@kXMGFADB0~8Jc--wHrs4AuW>W?iU&L932ouc z-vU57*9I$Pxm-ru9d^uHF@Fohk|p~PT|i)msr@Ce^A6Br>VVWv577x!(D{7+*8W{! z9_xU1BUA;z1BM)@z&flC!y6w`ipMA-`9Ed zR7i;?(_;Ca?|#2eUIZk+SS-TmFWUE)!1P)?+ccf4nT{c;t0Oo zZom3kuEs6U=L4~!0a~ER+Wx>)fXCy}o*{~Y#VVfjOKpspFNzHwyIJ%*jNjnSK0R@X rMmus3AAbS|+{wSn|B{C@471rESxqjPYMgxi00000NkvXXu0mjf!`^oZ literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png new file mode 100644 index 0000000000000000000000000000000000000000..f8825513a346a4a108875f652fbb26a6d581951e GIT binary patch literal 1015 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1B^*TK~#8N?V7!A zA~6(&hb^`vQi`ObN&3`ukTOM(cnMyCXUHq$4N^r41uf}P(q9}@@D2n1|G#V{&rMDT1-rENu_7AF|OaU==V>SFr z%R=7Y-BfTpI{m?(X-5CbcZntZu!2|n+Cc&Ek2J`v(=@o(Z(GTpJ1dNZFNf#LJ z(~+A143xpgAd}z|;G*B}FJpb?0Xwjl-frMbfE+*}u}e?}P$a+xeedq>(!2ctd%+se zkuzs6LEn;e^{1^60qDaqD1H8X&<5?fG-PHK9gr;?WY^c%&cmc=CFJ#m0IZ1NaF{$i zJmiiC)Br+PT@loj=X;|;3P2+4y%>`KIX)zKfMlgrGj^9GK#%-PUfW!!~9g{o(Hkg3%cx>u7H#fnFx8X!cTfr+p4g#?v z=p6V25UxD*r(dvZ0*JILb*w8z0zhm6P=*Kq?Em%kmAt*ZCB0tHw1c9g`H#SHLMGf*PqAF)$v}V6m|@Q5AC&8<Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ940?A24K~#8N?U_4{ z0x=AR*}VZ36&07D@@F2K$|J4PYoVJDs$cI8h(Y#w9(cAShh zObo*?48t%C!(g%B?;rSd&6ZGKAEf-0YWVKHKb}-@&DdA>XL4Q$Q3A;LX0v%Z1k^5B z0S?FGv9)_To!)$drtg7%j02j_L0kbL0U*||!D_W?Z7-M0w(YLC3ysr!4(y5U>V|^N zjn{w`z1?msyU;P6PT5IdRR9GC!)}|%jn@EM2wno_b2YFMfXq{HIWSMF0%Ad&&*ztZ zzfEwGz&-=GB_-K^Is8N-P;7_AV$t?D0k+?0qu);iXCc@LpnaGEsr4^uJBmb;zZ6c z#L%bfQiE$-dVeWiz0gfDMER?rSsgk1CAZgvr~+Id0EEN=^yOBI1IIpTDM6F~{|q=B z4nc840pHNjHCv>=MTjc^C5DW{`Fg$nN|l_(7D(BEZ)kuPXp)vc5GCM#zqj8IMb2Uw zFZrc5M$8uZh89W`Y2;G9LWG})lGRAz+SjyQZ75U$?g_0$>@ciNM)6x9Mjycg*sMA2 zW2h!TyX-?~`=~P3*S_SS<-527TmgNQW)9b9=p5=5I2_z*fk44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`0(2Ka=y9yoB|?%liV*ROx|>eZ%AoBsd*50qKH_jw4AVlN5u3kHgS1f{&0 z-GD-z1s;*b3=DjSL74G){)!Z!C4QbRjv*25Z>JudbVPx}B{^-<|Nl<}T{8rFw{C8~ ztMyyS>2p(r-Evq!?%qLk41kuH_i6i z&gJk*kYNJDZn1=V7lYJ0MHBiqv#q%-7-O$;t7;dg&idEar-Xc%@a=%gj)z(^H;7K! zS+QH$a!H=$2U*#Jy$iyZ2rpP%Etn(8Yjp5Lz!iBuUP`KhxCW*4Ek~Mt!^xP zDr-fg7(c|#XW(FncxN8Qx<~I98{fVQN~@Ot4r*dr$J6mI(eLQwy}ku4-B}@W+W(8Y zx5zWH?lWPWB@nPmhWDv1+k*!S_Z*jRJlr{ln<4w}z2yy8>z<1osM`P4C}Ho;m8B0< g|9SkEE4VLjb~?(LcaLE$Ft`~!UHx3vIVCg!0Dt4gM*si- literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png new file mode 100644 index 0000000000000000000000000000000000000000..477e6873e8f1938ecbfcd2f248554d9d124b849e GIT binary patch literal 791 zcmV+y1L*vTP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0<1|yK~#8N?V7QU z;xG_~!xqPU`{8iVxn#f& z?CGqJzyMH#PN!2*1usJFp9wHQ-QjSkbLjwk)*4VT>6JHuJsSb2vtF+==^u6@HE;p* z`8*X7uwyO2#iq_HgxU2Caa5!s*lM*BO#?Vib9uR3I@9Si(iUC)q|=Y{%%-n^DuXmc z*xJJg(Mc6}kY@jUQSJBpo?S0t3P}43gb6S~-R*X((xcHRu?CvT-EP-@1iVuKL01ZW zN7aoB`2@Rw+x8N92>>+u&gZkU*=(%Vinw5H>-Bn0yBU!DT^2JD@9{pKz}5ClOG1VIo4K@fz(Ql|g!a<3r`D2g~P7K_qF6q>mYsxU5S z_;TX{V58r6U;cPJ-tl;>R;%ff=TCEs40rx=xj1+<*K9T)dqtS3GE;?HZ z?k=a(N$0*XosR_b2;esMyKkK*f%Jl?^(*u>IdHq()Un-et7Fjv!S#`5@*#}CAu*fH zl##(;poaf`zgOijTJ))atIqXe8mv|;l^>7CKJC5&KL6o7r!4CLf}oQMz7|-o1294q zdDw>m%^Y29hi;=Nqw_@UAmB9?zVZWos5USOx zdIt)dJa2R7I{xV{eE+cc(Z`I^PXIn~AKlM?_+D`nf8FzcV(*el4uYVQ!Y{^gz5tUq Vd6(tcu%-Y2002ovPDHLkV1ld-V<`Xt literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png new file mode 100644 index 0000000000000000000000000000000000000000..f48d8e6538d3a9787bb79075318982b7701fd919 GIT binary patch literal 1321 zcmV+^1=jkBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGizyJUazyWI3i3tDz1inc`K~#8N?V7Dl zBtaB~n_UeF0#GO%0*&MqP&^9Hz@wl@FjyoSfdhjA1PQ23HkqBTGKW3fuKt_pVU}!t zN#)kht$R;ZR~HOSRVWk+g+ifFD0FjueLbPfnxAMJ8-qUam#RU5FD@>!3Dmy~0lu(4 z`G;uuF|)1Q-``JmcXw0pHD5I7>*cT$Bm z{kaWj^VdnD-G?|o=F`a%v7OVC1~Sx6z}3}N#iha1RA7H1*mw!5t#SD?pE$%LZeRFG zqNhe%r%oHGOKsYhtS(E&@pC=IA>JUgaJLfUyDPj;La0aEhT{8t>Xcm0CgiKR^tpc7 zEOC;G`r3r}82&zAeTvhD{E6jttjCM^nEQJj8%amS!SVL?HXS?aI$pYr;_-KsjAPHy z(|r054i3^$O^z9wd_A|~rbdP)-`tv#lfwWu?pWU^=lGnaxQ=}B(M^qCoZA=Ar5MCj ze{DTcfF@EjR-4p-`+J;L0fx_^J#_IRZi3=dN73v)X{`U4(ZES3$Hb?H{5#y*NMuIFSEIQ}4w3+GotxV*faP}JvR z-lwAW7^fgU;g|yp-Y30jV2b+LHps}dgPedzmB33A&ipC{EZLG$}z;nrZPU>Dn)Rg-Pk-aF~ zacgUv@Pu{I>4Iz0BCTw~%gYPhiS6y}nx+1*`X;Kv;ruyp)Kq!HI=`@fe5}5Bd_6wD~K5M`j-|jTw6|i((RbQ8I? fPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T)Fndp27mdGq|tLYZ78#;{3<@ArSc zBW{3CgPl&N zCjoiJ&*a%?JS~2PoD0&f893kWlvR75rwMe461DM>8**Kp15ez7n*saP!VXsK=mjh6 z<&9`Yn?CPn6m3zoyj;qPoV(%T%PRL}Wk&u204t`KS9cR2>ILGfIiq;M-}c_EL(W6< zK~V0rm&h!jIeh8``ELpVu|nt*;U-`$tony214!OEd4_KSW7XiIIYD3xH$cm=x)JjC z5>B67v;}gOg@^wIq=8oSCtUdmEk{|4+JyTT#P?(S!WN3Q@N&P`{DaNcvQgM_@gQiz f=IcxP*zJA+@U9j^72-mB00000NkvXXu0mjflmAwf literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png new file mode 100644 index 0000000000000000000000000000000000000000..7a792111c50484da1fc227cfc6f2635405275079 GIT binary patch literal 1298 zcmV+t1?~EYP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ941gA+vK~#8N?V7Pp zR(DXDk^UVwsUpx^~~11cmMTIeXKDCnS}0!~7L0$sJ2 z-{(I!nb?lK$u4_3e^QiW?2P9hkG)xzB9qBvGMP*!lWFJj@^Xm7-qr}UO)~>~ZiV7r zUti7r?(S~&?Ah6wX`7pyGxu9tThV?~;5c$@5^4+a#h!!Q-`@|HmX_>Y81zGbd)pfn z=%Q?EOhzoN380wA$4BSv1Ky(@{lGYqaD9F4oZ-?ogdOdvcoP5tQao`50Hj?eq0dBY zY;2gboN)=;Q*b8W@bIt-nqoNnz7nII{bbUlzb-Jzm~mrJ_$DVr;{gP_zrSy;A%cPc zHaXWapm^C1aL>KtvOk`O9{|6p zmEfy3y{vr8%=f&cmH^Dq#l?l0c?eirTeB^rf#=}|{@^#Y0`v?*C_au?R#uF?6ll)4 zhg~NkrUDureA(2?!Lzl>+s;9A)-nW>ORTtZCGlVyR-rK$iftFVg0-i+B>_W1s^iUBr`7efJ@r zwE3zT{C36@(J-c(3ubP1$}Z1Yi`i@xEim2Dc+jKLQE1SPM0^cE_~Lw znM@{=$z(E_OeO=8zjL3So>pIC_V)IA`_A5lE-@u_*5BZso}NBE2@t=yxM=VGkn;D- z+D~I`tgf!wD>n#+hc)#^tnaoMHPM;E?7zLe6|=Lm*77&g2ujaFpViUkUsfh#jIDy` z3V>tz4+sbVxPk+)war!xG5#3~K#Yhr7HZ2 zE@8Zg9U7>|HrEJ#3VeKgm@_jP0|Fh#%MpC0B$hE#gAZo{@bQ9Udwbj5bN1U3(RbOq zXd8nuGG=I?9%E26oXPbsHxi(ifh@sEh?mGcLGK58qU2tnmx4FwVTrwL2nSO9xXL~R zW>mg|xHd(Zh(U?Htl>1qil6kX`(QPUl7!kGfPZA?jrQQFf%h_J{IMdCH#lw_wrTuXL$N!Z|4|gb0o$9Ax?qATnE(I)07*qo IM6N<$f*f#aN&o-= literal 0 HcmV?d00001 diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a753996b721c068ba7c405e784e1de89b24afc3 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`212l#}z9yoB|?%liP<>l+wuLp{)IjX-0NU@d#`33(60*2q)_=14~oCO|{ z#S9F5he4R}c>anMpx{|g7srqY_qY9yLPr!hSRDWUpFN#(hty<+=#{sGYdb`&WEXs! zB(j9zPq4$^x7!&C4~op@O+5H>`{Xm{czwDXc1$n(CE}^Wq!sq+VeymjMoFb6r%jDl zWp6t2UgTUO^~cCD`PpffOP3%0*mYu;l7;;hv8s)nS+Q;kTeev3(>wEZ6SLU_J*`{| zfvcCqz_~!RX=0<-irh5XTkun_=T$I~KqGqhdghF?hQAxvXPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!2kdb!2!6DYwZ941OZ7zK~#8N?U_GL zD=`qp^Ekny04f?Nk*FvrxdIhO;S5}X8&Dx}0!nInXsCb!i3@~$#$PmzQxJr+1`+#1H2ld&7aIQf_(jnB@`!geFne3PLXw(`*>YH;k}0cCa{n|e&JesBjMfaBxiJQ@bpM-!((Pl zzLXqN&5m6B^769Kit>JxRfg03{rx=p7MH(`2QNH9tN+rZEfQ`896=EYb^W!2{0oI%3(1po;*IjFK(PvrrPtj-O9&jD)(5`05ID=nR0MJ#4b^_O};+qVzg+OZ(>H0d`I7?1_N#I2 z|G0oor_0chMzn&8d2M=zh5?2Pj&&FL6ok-nBC#ow=_j*>HrA@081ReoL8*~ z5&P6Kgr)@OJ>c%{&J?#P;2Rq9FrhVigcC5Gfg@gYAmea;bab@z5>ztAEl{%o-_QUp z&_pfN8ljp1WD_46{QUe(^Cu@Kb7$5INl;5nDjq}h1s1cf}KTQ;HEA;mEHr?6T zN#CEJpVQGoC!%#T^3Z|Q5`1uQkdE)~?~~o#-Kq}v7Jvaz3Lb&$;8)p{N@$ywUjnVr z>;(@7KLtua=sNy5g3Wa#)=dEJCB83YYn2$g?JYbX)CkQW4JuTPX#@H;kS(~0;3aZT z(EEWd6mEz7b%|;RU?D)@wcyv$njX@p-V3NV%dZy3ts2{3LWi5KdI@%e^Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0<1|yK~#8N?V3G~ z!Y~kp!>+U?5)B;e@7Uy_6Q8IbD5}<>+lgUKbd4ngYJ^W?XfQorDXM%iX5r8_Fx@GlEz#sfR)DT=i3~9h7iwZ%$ zvh*z=0rIdEd<0;ysz`v%XKIb974xotm8|~MK`*-YP1yV=MkoO~7_j|*FYM`bT3E+w zwG#af1_NUPQU%WzK+sG<-;e70LNUQFP<|M30BNTD{y7LC0MIf4RVP52Nk8HvqyQ?jEsrvxL|{240}x68 z&DBF^c!3N!!QiPFbu;m48y!O z=kxjHf5Q4|w7wspgWvCXX8-CyqtCO3%mZ+}UZde~D34wjXoS|n&?sWRUa#-(F#QQ= zg=RGdal(M}@iR5-_xn-1-LC9$c@t>-Y;98*H