ГАРПИИ (#559)

* 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~

* говно

* говно говна линтер соси
This commit is contained in:
KurokoTurbo
2023-11-12 21:25:33 +03:00
committed by Aviu00
parent bccb80ab4f
commit 5f4485c770
39 changed files with 1202 additions and 6 deletions

View File

@@ -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<InstrumentComponent, MobStateChangedEvent>(OnMobStateChangedEvent);
SubscribeLocalEvent<GotEquippedEvent>(OnEquip);
SubscribeLocalEvent<EntityZombifiedEvent>(OnZombified);
//SubscribeLocalEvent<InstrumentComponent, KnockedDownEvent>(OnKnockedDown); //WD EDIT
//SubscribeLocalEvent<InstrumentComponent, StunnedEvent>(OnStunned); //WD EDIT
SubscribeLocalEvent<InstrumentComponent, SleepStateChangedEvent>(OnSleep);
SubscribeLocalEvent<InstrumentComponent, StatusEffectAddedEvent>(OnStatusEffect);
//SubscribeLocalEvent<InstrumentComponent, DamageChangedEvent>(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<HarpySingerComponent, OpenUiActionEvent>(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<AddAccentClothingComponent>(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);
}
/// <summary>
/// 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.
/// </summary>
/// <summary>
/// Closes the MIDI UI if it is open.
/// </summary>
private void CloseMidiUi(EntityUid uid)
{
if (HasComp<ActiveInstrumentComponent>(uid) &&
TryComp<ActorComponent>(uid, out var actor))
{
_instrument.ToggleInstrumentUi(uid, actor.PlayerSession);
}
}
/// <summary>
/// Prevent the player from opening the MIDI UI under some circumstances.
/// </summary>
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<ZombieComponent>(uid, out var _);
var muzzled = _inventorySystem.TryGetSlotEntity(uid, "mask", out var maskUid) &&
TryComp<AddAccentClothingComponent>(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);
}
}
}

View File

@@ -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<EntityPrototype>))]
public string? MidiActionId = "ActionHarpyPlayMidi";
[DataField("midiAction", serverOnly: true)] // server only, as it uses a server-BUI event !type
public EntityUid? MidiAction;
}
}

View File

@@ -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<HarpySingerComponent, ComponentStartup>(OnStartup);
SubscribeLocalEvent<HarpySingerComponent, ComponentShutdown>(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);
}
}
}

View File

@@ -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"

Binary file not shown.

Binary file not shown.

View File

@@ -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

View File

@@ -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.

View File

@@ -0,0 +1,6 @@
species-name-harpy = Гарпия
marking-HarpyWingDefault = обычные крылья
marking-HarpyEarsDefault = пучки перьев
marking-HarpyTailPhoenix = хвост феникса
marking-HarpyTailRooster = петушиный хвост
no-sing-while-no-speak = Вы не можете петь.

View File

@@ -309,3 +309,10 @@
flatReductions: flatReductions:
# can't punch the endoskeleton to death # can't punch the endoskeleton to death
Blunt: 5 Blunt: 5
- type: damageModifierSet
id: Harpy
coefficients:
Blunt: 1.15
Slash: 1.15
Piercing: 1.15

View File

@@ -2,7 +2,7 @@
id: TattooHiveChest id: TattooHiveChest
bodyPart: Chest bodyPart: Chest
markingCategory: Chest markingCategory: Chest
speciesRestriction: [Human, Dwarf] speciesRestriction: [Human, Dwarf, Harpy]
coloring: coloring:
default: default:
type: type:
@@ -16,7 +16,7 @@
id: TattooNightlingChest id: TattooNightlingChest
bodyPart: Chest bodyPart: Chest
markingCategory: Chest markingCategory: Chest
speciesRestriction: [Human, Dwarf] speciesRestriction: [Human, Dwarf, Harpy]
coloring: coloring:
default: default:
type: type:
@@ -30,7 +30,7 @@
id: TattooSilverburghLeftLeg id: TattooSilverburghLeftLeg
bodyPart: LLeg bodyPart: LLeg
markingCategory: Legs markingCategory: Legs
speciesRestriction: [Human, Dwarf] speciesRestriction: [Human, Dwarf, Harpy ]
coloring: coloring:
default: default:
type: type:
@@ -58,7 +58,7 @@
id: TattooCampbellLeftArm id: TattooCampbellLeftArm
bodyPart: LArm bodyPart: LArm
markingCategory: Arms markingCategory: Arms
speciesRestriction: [Human, Dwarf] speciesRestriction: [Human, Dwarf, Harpy]
coloring: coloring:
default: default:
type: type:
@@ -114,7 +114,7 @@
id: TattooEyeRight id: TattooEyeRight
bodyPart: Eyes bodyPart: Eyes
markingCategory: Head markingCategory: Head
speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf] speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Harpy]
coloring: coloring:
default: default:
type: type:
@@ -128,7 +128,7 @@
id: TattooEyeLeft id: TattooEyeLeft
bodyPart: Eyes bodyPart: Eyes
markingCategory: Head markingCategory: Head
speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf] speciesRestriction: [Human, SlimePerson, Reptilian, Dwarf, Harpy]
coloring: coloring:
default: default:
type: type:

View File

@@ -125,6 +125,61 @@
Purr: Purr:
collection: FelinidPurrs 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 - type: emoteSounds
id: UnisexReptilian id: UnisexReptilian
params: params:

View File

@@ -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

View File

@@ -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!

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 ]

View File

@@ -117,3 +117,19 @@
buttonText: Облизываться buttonText: Облизываться
chatMessages: [облизывается] chatMessages: [облизывается]
allowMenu: true allowMenu: true
- type: emote
id: Sigh
category: Vocal
chatMessages: [вздыхает]
- type: emote
id: Whistle
category: Vocal
chatMessages: [свистит]
- type: emote
id: Crying
category: Vocal
chatMessages: [плачет]

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 786 B

View File

@@ -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
}
]
}

View File

@@ -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
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1015 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 820 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 749 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 791 B

View File

@@ -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
}
]
}