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 0000000000..182d3e755b Binary files /dev/null and b/Resources/Audio/White/Voice/Harpy/caw1.ogg differ diff --git a/Resources/Audio/White/Voice/Harpy/chirp1.ogg b/Resources/Audio/White/Voice/Harpy/chirp1.ogg new file mode 100644 index 0000000000..07303b6626 Binary files /dev/null and b/Resources/Audio/White/Voice/Harpy/chirp1.ogg differ 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 0000000000..0109e9aae9 Binary files /dev/null and b/Resources/Textures/White/Interface/Actions/harpy_sing.png differ 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 0000000000..fa27e2b74a Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/harpy_ears_default.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json new file mode 100644 index 0000000000..8b80a5a45f --- /dev/null +++ b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_ears.rsi/meta.json @@ -0,0 +1,16 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "By @leonardo_dabepis", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "harpy_ears_default", + "directions": 4 + } + + ] +} diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json new file mode 100644 index 0000000000..b795894cae --- /dev/null +++ b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/meta.json @@ -0,0 +1,20 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Phoenix and Rooster by @leonardo_dabepis", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "phoenix_tail", + "directions": 4 + }, + { + "name": "rooster_tail", + "directions": 4 + } + + ] +} diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png new file mode 100644 index 0000000000..e3aace5e8c Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/phoenix_tail.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png new file mode 100644 index 0000000000..1cbca989d1 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_tails.rsi/rooster_tail.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png new file mode 100644 index 0000000000..ce932f0df5 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy.png differ 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 0000000000..2030ff8cf2 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone1.png differ 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 0000000000..f8825513a3 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy2tone2.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png new file mode 100644 index 0000000000..4bd0018656 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone1.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png new file mode 100644 index 0000000000..7e431a95b4 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone2.png differ 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 0000000000..477e6873e8 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpy3tone3.png differ 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 0000000000..f48d8e6538 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled1.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png new file mode 100644 index 0000000000..b687a2bf9f Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyspeckled2.png differ 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 0000000000..7a792111c5 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone1.png differ 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 0000000000..8a753996b7 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpyundertone2.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png new file mode 100644 index 0000000000..49f7e0c135 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip1.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png new file mode 100644 index 0000000000..bde6c00692 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/harpywingtip2.png differ diff --git a/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json new file mode 100644 index 0000000000..0785ff1aaa --- /dev/null +++ b/Resources/Textures/White/Mobs/Customization/Harpy/harpy_wings.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from S.P.L.U.R.T at commit https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13/commit/285f6f86ac41a6246f250993486effeab8581c2c, edited by @raistlin_jag", + "states": [ + { + "name": "harpy", + "directions": 4 + }, + { + "name": "harpy2tone1", + "directions": 4 + }, + { + "name": "harpy2tone2", + "directions": 4 + }, + { + "name": "harpy3tone1", + "directions": 4 + }, + { + "name": "harpy3tone2", + "directions": 4 + }, + { + "name": "harpy3tone3", + "directions": 4 + }, + { + "name": "harpyspeckled1", + "directions": 4 + }, + { + "name": "harpyspeckled2", + "directions": 4 + }, + { + "name": "harpyundertone1", + "directions": 4 + }, + { + "name": "harpyundertone2", + "directions": 4 + }, + { + "name": "harpywingtip1", + "directions": 4 + }, + { + "name": "harpywingtip2", + "directions": 4 + } + ] +}