Felishit (#37)

* Мне слишком мало платят

* ЖРИ МЫШЕЙ

* Лок рас

* Але оп

* Блять

---------

Co-authored-by: Mona Hmiza <>
This commit is contained in:
RavMorgan
2023-05-11 00:53:11 +03:00
committed by Aviu00
parent 977e075086
commit 26c6290be0
67 changed files with 1340 additions and 3 deletions

View File

@@ -6,6 +6,7 @@ using Content.Client.Message;
using Content.Client.Players.PlayTimeTracking;
using Content.Client.Stylesheets;
using Content.Client.UserInterface.Controls;
using Content.Client.White.Sponsors;
using Content.Shared.CCVar;
using Content.Shared.GameTicking;
using Content.Shared.Humanoid;
@@ -54,6 +55,11 @@ namespace Content.Client.Preferences.UI
[GenerateTypedNameReferences]
public sealed partial class HumanoidProfileEditor : Control
{
//WD-EDIT
private readonly SponsorsManager _sponsorsManager;
//WD-EDIT
private readonly IClientPreferencesManager _preferencesManager;
private readonly IEntityManager _entMan;
private readonly IConfigurationManager _configurationManager;
@@ -114,6 +120,7 @@ namespace Content.Client.Preferences.UI
IEntityManager entityManager, IConfigurationManager configurationManager)
{
RobustXamlLoader.Load(this);
_sponsorsManager = IoCManager.Resolve<SponsorsManager>();
_prototypeManager = prototypeManager;
_entMan = entityManager;
_preferencesManager = preferencesManager;
@@ -188,9 +195,23 @@ namespace Content.Client.Preferences.UI
#region Species
_speciesList = prototypeManager.EnumeratePrototypes<SpeciesPrototype>().Where(o => o.RoundStart).ToList();
for (var i = 0; i < _speciesList.Count; i++)
{
var name = Loc.GetString(_speciesList[i].Name);
//WD EDIT
var specie = _speciesList[i];
var name = Loc.GetString(specie.Name);
if (specie.SponsorOnly)
{
if(_sponsorsManager.TryGetInfo(out var info) && info.AllowedMarkings.Contains(specie.Name))
{
CSpeciesButton.AddItem(name, i);
}
continue;
}
//WD EDIT
CSpeciesButton.AddItem(name, i);
}

View File

@@ -0,0 +1,12 @@
namespace Content.Server.Abilities.Felinid
{
[RegisterComponent]
public sealed class CoughingUpHairballComponent : Component
{
[DataField("accumulator")]
public float Accumulator = 0f;
[DataField("coughUpTime")]
public TimeSpan CoughUpTime = TimeSpan.FromSeconds(2.15); // length of hairball.ogg
}
}

View File

@@ -0,0 +1,22 @@
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
using Robust.Shared.Prototypes;
using Content.Shared.Actions.ActionTypes;
using Robust.Shared.Utility;
namespace Content.Server.Abilities.Felinid
{
[RegisterComponent]
public sealed class FelinidComponent : Component
{
/// <summary>
/// The hairball prototype to use.
/// </summary>
[DataField("hairballPrototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
public string HairballPrototype = "Hairball";
[DataField("hairballAction")]
public InstantAction? HairballAction;
public EntityUid? PotentialTarget = null;
}
}

View File

@@ -0,0 +1,6 @@
namespace Content.Server.Abilities.Felinid
{
[RegisterComponent]
public sealed class FelinidFoodComponent : Component
{}
}

View File

@@ -0,0 +1,195 @@
using Content.Shared.Actions;
using Content.Shared.Audio;
using Content.Shared.StatusEffect;
using Content.Shared.Throwing;
using Content.Shared.Item;
using Content.Shared.Inventory;
using Content.Shared.Hands;
using Content.Shared.Actions.ActionTypes;
using Content.Shared.IdentityManagement;
using Content.Shared.Nutrition.Components;
using Content.Shared.Nutrition.EntitySystems;
using Content.Server.Body.Components;
using Content.Server.Medical;
using Content.Server.Nutrition.EntitySystems;
using Content.Server.Nutrition.Components;
using Content.Server.Chemistry.EntitySystems;
using Content.Server.Popups;
using Robust.Shared.Audio;
using Robust.Shared.Player;
using Robust.Shared.Random;
using Robust.Shared.Prototypes;
namespace Content.Server.Abilities.Felinid
{
public sealed class FelinidSystem : EntitySystem
{
[Dependency] private readonly SharedActionsSystem _actionsSystem = default!;
[Dependency] private readonly HungerSystem _hungerSystem = default!;
[Dependency] private readonly VomitSystem _vomitSystem = default!;
[Dependency] private readonly SolutionContainerSystem _solutionSystem = default!;
[Dependency] private readonly IRobustRandom _robustRandom = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<FelinidComponent, ComponentInit>(OnInit);
SubscribeLocalEvent<FelinidComponent, HairballActionEvent>(OnHairball);
SubscribeLocalEvent<FelinidComponent, EatMouseActionEvent>(OnEatMouse);
SubscribeLocalEvent<FelinidComponent, DidEquipHandEvent>(OnEquipped);
SubscribeLocalEvent<FelinidComponent, DidUnequipHandEvent>(OnUnequipped);
SubscribeLocalEvent<HairballComponent, ThrowDoHitEvent>(OnHairballHit);
SubscribeLocalEvent<HairballComponent, GettingPickedUpAttemptEvent>(OnHairballPickupAttempt);
}
private Queue<EntityUid> RemQueue = new();
public override void Update(float frameTime)
{
base.Update(frameTime);
foreach (var cat in RemQueue)
{
RemComp<CoughingUpHairballComponent>(cat);
}
RemQueue.Clear();
foreach (var (hairballComp, catComp) in EntityQuery<CoughingUpHairballComponent, FelinidComponent>())
{
hairballComp.Accumulator += frameTime;
if (hairballComp.Accumulator < hairballComp.CoughUpTime.TotalSeconds)
continue;
hairballComp.Accumulator = 0;
SpawnHairball(hairballComp.Owner, catComp);
RemQueue.Enqueue(hairballComp.Owner);
}
}
private void OnInit(EntityUid uid, FelinidComponent component, ComponentInit args)
{
if (!_prototypeManager.TryIndex<InstantActionPrototype>("HairballAction", out var hairball))
return;
component.HairballAction = new InstantAction(hairball);
_actionsSystem.AddAction(uid, component.HairballAction, uid);
}
private void OnEquipped(EntityUid uid, FelinidComponent component, DidEquipHandEvent args)
{
if (!HasComp<FelinidFoodComponent>(args.Equipped))
return;
component.PotentialTarget = args.Equipped;
if (_prototypeManager.TryIndex<InstantActionPrototype>("EatMouse", out var eatMouse))
_actionsSystem.AddAction(uid, new InstantAction(eatMouse), null);
}
private void OnUnequipped(EntityUid uid, FelinidComponent component, DidUnequipHandEvent args)
{
if (args.Unequipped == component.PotentialTarget)
{
component.PotentialTarget = null;
if (_prototypeManager.TryIndex<InstantActionPrototype>("EatMouse", out var eatMouse))
_actionsSystem.RemoveAction(uid, eatMouse);
}
}
private void OnHairball(EntityUid uid, FelinidComponent component, HairballActionEvent args)
{
if (_inventorySystem.TryGetSlotEntity(uid, "mask", out var maskUid) &&
EntityManager.TryGetComponent<IngestionBlockerComponent>(maskUid, out var blocker) &&
blocker.Enabled)
{
_popupSystem.PopupEntity(Loc.GetString("hairball-mask", ("mask", maskUid)), uid, uid);
return;
}
_popupSystem.PopupEntity(Loc.GetString("hairball-cough", ("name", Identity.Entity(uid, EntityManager))), uid);
SoundSystem.Play("/Audio/White/Felinid/hairball.ogg", Filter.Pvs(uid), uid, AudioHelpers.WithVariation(0.15f));
EnsureComp<CoughingUpHairballComponent>(uid);
args.Handled = true;
}
private void OnEatMouse(EntityUid uid, FelinidComponent component, EatMouseActionEvent args)
{
if (component.PotentialTarget == null)
return;
if (!TryComp<HungerComponent>(uid, out var hunger))
return;
if (hunger.CurrentThreshold == Shared.Nutrition.Components.HungerThreshold.Overfed)
{
_popupSystem.PopupEntity(Loc.GetString("food-system-you-cannot-eat-any-more"), uid, uid, Shared.Popups.PopupType.SmallCaution);
return;
}
if (_inventorySystem.TryGetSlotEntity(uid, "mask", out var maskUid) &&
EntityManager.TryGetComponent<IngestionBlockerComponent>(maskUid, out var blocker) &&
blocker.Enabled)
{
_popupSystem.PopupEntity(Loc.GetString("hairball-mask", ("mask", maskUid)), uid, uid, Shared.Popups.PopupType.SmallCaution);
return;
}
if (component.HairballAction != null)
{
_actionsSystem.SetCharges(component.HairballAction, component.HairballAction.Charges + 1);
_actionsSystem.SetEnabled(component.HairballAction, true);
}
Del(component.PotentialTarget.Value);
component.PotentialTarget = null;
SoundSystem.Play("/Audio/Items/eatfood.ogg", Filter.Pvs(uid), uid, AudioHelpers.WithVariation(0.15f));
_hungerSystem.ModifyHunger(uid, 70f, hunger);
if (_prototypeManager.TryIndex<InstantActionPrototype>("EatMouse", out var eatMouse))
_actionsSystem.RemoveAction(uid, eatMouse);
}
private void SpawnHairball(EntityUid uid, FelinidComponent component)
{
var hairball = EntityManager.SpawnEntity(component.HairballPrototype, Transform(uid).Coordinates);
var hairballComp = Comp<HairballComponent>(hairball);
if (TryComp<BloodstreamComponent>(uid, out var bloodstream))
{
var temp = bloodstream.ChemicalSolution.SplitSolution(20);
if (_solutionSystem.TryGetSolution(hairball, hairballComp.SolutionName, out var hairballSolution))
{
_solutionSystem.TryAddSolution(hairball, hairballSolution, temp);
}
}
}
private void OnHairballHit(EntityUid uid, HairballComponent component, ThrowDoHitEvent args)
{
if (HasComp<FelinidComponent>(args.Target) || !HasComp<StatusEffectsComponent>(args.Target))
return;
if (_robustRandom.Prob(0.2f))
_vomitSystem.Vomit(args.Target);
}
private void OnHairballPickupAttempt(EntityUid uid, HairballComponent component, GettingPickedUpAttemptEvent args)
{
if (HasComp<FelinidComponent>(args.User) || !HasComp<StatusEffectsComponent>(args.User))
return;
if (_robustRandom.Prob(0.2f))
{
_vomitSystem.Vomit(args.User);
args.Cancel();
}
}
}
public sealed class HairballActionEvent : InstantActionEvent {}
public sealed class EatMouseActionEvent : InstantActionEvent {}
}

View File

@@ -0,0 +1,8 @@
namespace Content.Server.Abilities.Felinid
{
[RegisterComponent]
public sealed class HairballComponent : Component
{
public string SolutionName = "hairball";
}
}

View File

@@ -125,6 +125,9 @@ public sealed partial class SpeciesPrototype : IPrototype
/// </summary>
[DataField("maxAge")]
public int MaxAge = 120;
[DataField("sponsorOnly")]
public bool SponsorOnly { get; } = false;
}
public enum SpeciesNaming : byte

View File

@@ -379,6 +379,12 @@ namespace Content.Shared.Preferences
speciesPrototype = prototypeManager.Index<SpeciesPrototype>(Species);
}
if (speciesPrototype.SponsorOnly && !sponsorMarkings.Contains(Species))
{
Species = SharedHumanoidAppearanceSystem.DefaultSpecies;
speciesPrototype = prototypeManager.Index<SpeciesPrototype>(Species);
}
var sex = Sex switch
{
Sex.Male => Sex.Male,

View File

@@ -0,0 +1,10 @@
using Robust.Shared.Serialization;
using Content.Shared.DoAfter;
namespace Content.Shared.Item.PseudoItem
{
[Serializable, NetSerializable]
public sealed class PseudoItemInsertDoAfterEvent : SimpleDoAfterEvent
{
}
}

Binary file not shown.

View File

@@ -0,0 +1 @@
hairball.ogg taken from https://en.wikipedia.org/wiki/File:Common_house_cat_coughing_hairball.ogv CC-BY-SA-3.0

View File

@@ -0,0 +1,24 @@
- files: ["cat_hiss1.ogg", "cat_hiss2.ogg"]
license: "CC-BY-4.0"
copyright: "Original sound by https://freesound.org/people/secondbody/ - cut out two clips of cat hissing, cleaned up, and converted to ogg."
source: "https://freesound.org/people/secondbody/sounds/50357/"
- files: ["cat_meow1.ogg", "cat_meow2.ogg", "cat_meow3.ogg"]
license: "CC-BY-3.0"
copyright: "Original sound by https://freesound.org/people/ignotus/ - cut out three clips of cat meowing, cleaned up, and converted to ogg."
source: "https://freesound.org/people/ignotus/sounds/26104/"
- files: ["cat_mew1.ogg", "cat_mew2.ogg"]
license: "CC0-1.0"
copyright: "Original sound by https://freesound.org/people/videog/ - cut out two clips of kittens mewing, cleaned up, and converted to ogg."
source: "https://freesound.org/people/videog/sounds/149191/"
- files: ["cat_purr1.ogg"]
license: "CC-BY-4.0"
copyright: "Original sound by https://freesound.org/people/klangstrand/ - cut out short clip, fade in and out, converted to ogg."
source: "https://freesound.org/people/klangstrand/sounds/213951/"
- files: ["cat_growl1.ogg"]
license: "CC0-1.0"
copyright: "Original sound by https://freesound.org/people/Zabuhailo/ - fade in and out, converted to ogg."
source: "https://freesound.org/people/Zabuhailo/sounds/146968/"

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,4 @@
cat_scream1.ogg licensed under CC0 1.0 taken from Queen_Westeros at https://freesound.org/people/queen_westeros/sounds/222590/
cat_scream2.ogg licensed under CC4.0 taken from InspectorJ at https://freesound.org/people/InspectorJ/sounds/415209/
cat_scream3.ogg licensed under CC sampling plus 1.0 taken from Hamface at https://freesound.org/people/Hamface/sounds/98669/
cat_wilhelm.ogg used with apologies to type moon

View File

@@ -6,3 +6,4 @@ species-name-reptilian = Ящер
species-name-slime = Слаймолюд
species-name-diona = Диона
species-name-skrell = Скрелл
species-name-felinid = Фелинид

View File

@@ -0,0 +1,65 @@
hairball-action = Откашлять комок шерсти.
hairball-action-desc = Люди это не любят.
hairball-mask = Сначала сними {$mask}.
hairball-cough = {CAPITALIZE(THE($name))} пытается выкашлять комок шесрти!
action-name-eat-mouse = Съесть мышь.
action-description-eat-mouse = Съешьте мышь в своей руке, получая питательные вещества и заряд комка шерсти.
marking-FelinidEarsBasic = Обычные ушки
marking-FelinidEarsBasic-basic_outer = Внешняя часть уха
marking-FelinidEarsBasic-basic_inner = Внутренняя часть уха
marking-FelinidEarsCurled = Завитые ушки
marking-FelinidEarsCurled-curled_outer = Внешняя часть уха
marking-FelinidEarsCurled-curled_inner = Внутренняя часть уха
marking-FelinidEarsDroopy = Висячие ушки
marking-FelinidEarsDroopy-droopy_outer = Внешняя часть уха
marking-FelinidEarsDroopy-droopy_inner = Внутренняя часть уха
marking-FelinidEarsFuzzy = Пушистые ушки
marking-FelinidEarsFuzzy-basic_outer = Внешняя часть уха
marking-FelinidEarsFuzzy-fuzzy_inner = Пух
marking-FelinidEarsStubby = Stubby Ears
marking-FelinidEarsStubby-stubby_outer = Внешняя часть уха
marking-FelinidEarsStubby-stubby_inner = Внутренняя часть уха
marking-FelinidEarsTall = Высокие ушки
marking-FelinidEarsTall-tall_outer = Внешняя часть уха
marking-FelinidEarsTall-tall_inner = Внутренняя часть уха
marking-FelinidEarsTall-tall_fuzz = Пух
marking-FelinidEarsTorn = Порванные ушки
marking-FelinidEarsTorn-torn_outer = Внешняя часть уха
marking-FelinidEarsTorn-torn_inner = Внутренняя часть уха
marking-FelinidEarsWide = Широкие ушки
marking-FelinidEarsWide-wide_outer = Внешняя часть уха
marking-FelinidEarsWide-wide_inner = Внутренняя часть уха
marking-FelinidTailBasic = Обычный хвостик
marking-FelinidTailBasic-basic_tail_tip = Кончик
marking-FelinidTailBasic-basic_tail_stripes_even = Полосы, четные
marking-FelinidTailBasic-basic_tail_stripes_odd = Полосы, нечетные
marking-FelinidTailBasicWithBow = Хвостик с бантом
marking-FelinidTailBasicWithBow-basic_tail_tip = Кончик
marking-FelinidTailBasicWithBow-basic_tail_stripes_even = Полосы, четные
marking-FelinidTailBasicWithBow-basic_tail_stripes_odd = Полосы, нечетные
marking-FelinidTailBasicWithBow-basic_bow = Бант
marking-FelinidTailBasicWithBell = Хвостик с колокольчиком
marking-FelinidTailBasicWithBell-basic_tail_tip = Кончик
marking-FelinidTailBasicWithBell-basic_tail_stripes_even = Полосы, четные
marking-FelinidTailBasicWithBell-basic_tail_stripes_odd = Полосы, нечетные
marking-FelinidTailBasicWithBell-basic_bell = Колокольчик
marking-FelinidTailBasicWithBowAndBell = Хвостик с колокольчиком и бантиком
marking-FelinidTailBasicWithBowAndBell-basic_tail_tip = Кончик
marking-FelinidTailBasicWithBowAndBell-basic_tail_stripes_even = Полосы, четные
marking-FelinidTailBasicWithBowAndBell-basic_tail_stripes_odd = Полосы, нечетные
marking-FelinidTailBasicWithBowAndBell-basic_bow = Бант
marking-FelinidTailBasicWithBowAndBell-basic_bell = Колокольчик

View File

@@ -1339,6 +1339,7 @@
components:
- type: Body
prototype: Mouse
- type: FelinidFood
- type: GhostRole
makeSentient: true
allowSpeech: true
@@ -2550,7 +2551,7 @@
- type: NpcFactionMember
factions:
- Syndicate
- type: entity
name: space cat
id: MobCatSpace

View File

@@ -155,6 +155,7 @@
description: He's da mini rat. He don't make da roolz.
noSpawn: true #Must be configured to a King or the AI breaks.
components:
- type: FelinidFood
- type: CombatMode
- type: MovementSpeedModifier
baseWalkSpeed : 3.5

View File

@@ -24,7 +24,7 @@
supervisors: job-supervisors-centcom
whitelistedSpecies:
- Human
- Dwarf
- Felinid
canBeAntag: false
accessGroups:
- AllAccess

View File

@@ -67,6 +67,46 @@
Whistle:
collection: Whistles
- type: emoteSounds
id: MaleFelinid
params:
variation: 0.125
sounds:
Scream:
collection: FelinidScreams
Laugh:
collection: MaleLaugh
Hiss:
collection: FelinidHisses
Meow:
collection: FelinidMeows
Mew:
collection: FelinidMews
Growl:
collection: FelinidGrowls
Purr:
collection: FelinidPurrs
- type: emoteSounds
id: FemaleFelinid
params:
variation: 0.125
sounds:
Scream:
collection: FelinidScreams
Laugh:
collection: FemaleLaugh
Hiss:
collection: FelinidHisses
Meow:
collection: FelinidMeows
Mew:
collection: FelinidMews
Growl:
collection: FelinidGrowls
Purr:
collection: FelinidPurrs
- type: emoteSounds
id: UnisexReptilian
params:

View File

@@ -0,0 +1,49 @@
- type: body
id: Felinid
name: "felinid"
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: OrganAnimalHeart
lungs: OrganHumanLungs
stomach: OrganReptilianStomach
liver: OrganAnimalLiver
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,50 @@
# vocal emotes
- type: emote
id: Hiss
category: Vocal
chatMessages: [Шипит.]
chatTriggers:
- шипит
- шипит.
- шипит!
- шипит
- шипит
- type: emote
id: Meow
category: Vocal
chatMessages: [Мяукает.]
chatTriggers:
- мяукает
- мяукает.
- мяукает!
- ня
- ня.
- ня!
- type: emote
id: Mew
category: Vocal
chatMessages: [Мявкает.]
chatTriggers:
- мявкает
- мявкает.
- мявкает!
- type: emote
id: Growl
category: Vocal
chatMessages: [рычит.]
chatTriggers:
- рычит
- рычит.
- рычит!
- type: emote
id: Purr
category: Vocal
chatMessages: [Мурчит.]
chatTriggers:
- мурчит
- мурчит.
- мурчит!

View File

@@ -0,0 +1,153 @@
# Felinid Ears
- type: marking
id: FelinidEarsBasic
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: basic_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: basic_inner
- type: marking
id: FelinidEarsCurled
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: curled_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: curled_inner
- type: marking
id: FelinidEarsDroopy
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: droopy_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: droopy_inner
- type: marking
id: FelinidEarsFuzzy
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: basic_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: fuzzy_inner
- type: marking
id: FelinidEarsStubby
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: stubby_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: stubby_inner
- type: marking
id: FelinidEarsTall
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: tall_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: tall_inner
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: tall_fuzz
- type: marking
id: FelinidEarsTorn
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: torn_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: torn_inner
- type: marking
id: FelinidEarsWide
bodyPart: HeadTop
markingCategory: HeadTop
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: wide_outer
- sprite: White/Mobs/Customization/felinid_ears.rsi
state: wide_inner
# Felinid Tails
- type: marking
id: FelinidTailBasic
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- type: marking
id: FelinidTailBasicWithBow
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bow
- type: marking
id: FelinidTailBasicWithBell
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bell
- type: marking
id: FelinidTailBasicWithBowAndBell
bodyPart: Tail
markingCategory: Tail
speciesRestriction: [Felinid]
sprites:
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_tip
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_even
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_tail_stripes_odd
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bow
- sprite: White/Mobs/Customization/felinid_tails.rsi
state: basic_bell

View File

@@ -0,0 +1,42 @@
- type: entity
save: false
name: Player felinid
parent: MobFelinidBase
id: MobFelinid
components:
- type: CombatMode
canDisarm: true
- type: Mind
showExamineInfo: true
- type: Input
context: "human"
- type: MobMover
- type: InputMover
- type: Respirator
damage:
types:
Asphyxiation: 1.5
damageRecovery:
types:
Asphyxiation: -1.5
- type: Alerts
- type: Vocal
wilhelm: "/Audio/Voice/Felinid/cat_wilhelm.ogg"
sounds:
Male: MaleFelinid
Female: FemaleFelinid
Unsexed: MaleFelinid
- type: Actions
- type: Eye
- type: CameraRecoil
- type: Examiner
- type: CanHostGuardian
- type: Faction
factions:
- NanoTrasen
- type: Felinid #since this just adds an action...
- type: InteractionPopup
successChance: 1
interactSuccessString: hugging-success-generic
interactSuccessSound: /Audio/Effects/thudswoosh.ogg
messagePerceivedByOthers: hugging-success-generic-others

View File

@@ -0,0 +1,241 @@
- type: entity
save: false
name: Base felinid
parent: BaseMobHuman
id: MobFelinidBase
abstract: true
components:
- type: Sprite
netsync: false
noRot: true
drawdepth: Mobs
scale: 0.8, 0.8
layers:
- map: [ "enum.HumanoidVisualLayers.Chest" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: torso_m
- map: [ "enum.HumanoidVisualLayers.Head" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: head_m
- map: [ "enum.HumanoidVisualLayers.Eyes" ]
color: "#008800"
sprite: Mobs/Customization/eyes.rsi
state: eyes
- map: [ "enum.HumanoidVisualLayers.RArm" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_arm
- map: [ "enum.HumanoidVisualLayers.LArm" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_arm
- map: [ "enum.HumanoidVisualLayers.RLeg" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_leg
- map: [ "enum.HumanoidVisualLayers.LLeg" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_leg
- shader: StencilClear
sprite: Mobs/Species/Human/parts.rsi
state: l_leg
- shader: StencilMask
map: [ "enum.HumanoidVisualLayers.StencilMask" ]
sprite: Mobs/Customization/masking_helpers.rsi
state: female_full
visible: false
- map: [ "underwearb" ] #White
- map: [ "underweart" ] #White
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_foot
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_foot
- map: [ "socks" ] #White
- map: [ "jumpsuit" ]
shader: StencilDraw
- map: [ "enum.HumanoidVisualLayers.LHand" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_hand
- map: [ "enum.HumanoidVisualLayers.RHand" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_hand
- 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" ]
state: shaved
sprite: Mobs/Customization/human_facial_hair.rsi
- map: [ "enum.HumanoidVisualLayers.Hair" ]
state: bald
sprite: Mobs/Customization/human_hair.rsi
- map: [ "enum.HumanoidVisualLayers.HeadTop" ]
sprite: Mobs/Customization/masking_helpers.rsi
state: none
visible: false
- map: [ "mask" ]
- map: [ "head" ]
- map: [ "pocket1" ]
- map: [ "pocket2" ]
- map: [ "enum.HumanoidVisualLayers.Tail" ]
sprite: Mobs/Customization/masking_helpers.rsi
state: none
visible: false
- type: HumanoidAppearance
species: Felinid
- type: Body
prototype: Felinid
- type: Damageable
damageContainer: Biological
damageModifierSet: Felinid
- type: MeleeWeapon
soundHit:
collection: Punch
animation: WeaponArcClaw
damage:
types:
Blunt: 1
Slash: 5
- type: DiseaseCarrier
naturalImmunities:
- OwOnavirus
- type: Thieving
stealthy: true
stripTimeReduction: 1
- type: Speech
speechSounds: Alto
- type: DamageOnHighSpeedImpact
damage:
types:
Blunt: 1
soundHit:
path: /Audio/Effects/hit_kick.ogg
- type: Stamina
excess: 85
- type: Perishable
- type: entity
save: false
name: Felinid Dummy
parent: MobHumanDummy
id: MobFelinidDummy
noSpawn: true
description: A dummy felinid meant to be used in character setup.
components:
- type: Sprite
netsync: false
noRot: true
drawdepth: Mobs
scale: 1, 1
layers:
- map: ["enum.HumanoidVisualLayers.Chest"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: torso_m
- map: ["enum.HumanoidVisualLayers.Head"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: head_m
- map: ["enum.HumanoidVisualLayers.Eyes"]
color: "#008800"
sprite: Mobs/Customization/eyes.rsi
state: eyes
- map: ["enum.HumanoidVisualLayers.RArm"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_arm
- map: ["enum.HumanoidVisualLayers.LArm"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_arm
- map: ["enum.HumanoidVisualLayers.RLeg"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_leg
- map: ["enum.HumanoidVisualLayers.LLeg"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_leg
- shader: StencilClear
- shader: StencilMask
map: ["enum.HumanoidVisualLayers.StencilMask"]
sprite: Mobs/Customization/masking_helpers.rsi
state: female_full
visible: false
- map: [ "underwearb" ] #White
- map: [ "underweart" ] #White
- map: [ "enum.HumanoidVisualLayers.LFoot" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_foot
- map: [ "enum.HumanoidVisualLayers.RFoot" ]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_foot
- map: [ "socks" ] #White
- map: ["jumpsuit"]
shader: StencilDraw
- map: ["enum.HumanoidVisualLayers.LHand"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: l_hand
- map: ["enum.HumanoidVisualLayers.RHand"]
color: "#e8b59b"
sprite: Mobs/Species/Human/parts.rsi
state: r_hand
- 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"]
state: shaved
sprite: Mobs/Customization/human_facial_hair.rsi
- map: ["enum.HumanoidVisualLayers.Hair"]
state: bald
sprite: Mobs/Customization/human_hair.rsi
- map: [ "enum.HumanoidVisualLayers.HeadTop" ]
sprite: Mobs/Customization/masking_helpers.rsi
state: none
visible: false
- map: ["mask"]
- map: ["head"]
- map: [ "pocket1" ]
- map: [ "pocket2" ]
- map: ["hand-left"]
- map: ["hand-right"]
- map: [ "enum.HumanoidVisualLayers.Tail" ]
sprite: Mobs/Customization/masking_helpers.rsi
state: none
visible: false
#Nya~~

View File

@@ -0,0 +1,24 @@
- type: entity
parent: BaseItem
id: Hairball
name: hairball
description: Felinids, man...
components:
- type: Sprite
netsync: false
sprite: White/Specific/Species/felinid.rsi
state: icon
- type: Hairball
- type: SolutionContainerManager
solutions:
hairball:
maxVol: 25
reagents:
- ReagentId: Protein
Quantity: 2
- type: Extractable
grindableSolutionName: hairball
- type: Tag
tags:
- Recyclable
- Trash

View File

@@ -0,0 +1,35 @@
- type: soundCollection
id: FelinidScreams
files:
- /Audio/White/Voice/Felinid/cat_scream1.ogg
- /Audio/White/Voice/Felinid/cat_scream2.ogg
- /Audio/White/Voice/Felinid/cat_scream3.ogg
- type: soundCollection
id: FelinidHisses
files:
- /Audio/White/Voice/Felinid/cat_hiss1.ogg
- /Audio/White/Voice/Felinid/cat_hiss2.ogg
- type: soundCollection
id: FelinidMeows
files:
- /Audio/White/Voice/Felinid/cat_meow1.ogg
- /Audio/White/Voice/Felinid/cat_meow2.ogg
- /Audio/White/Voice/Felinid/cat_meow3.ogg
- type: soundCollection
id: FelinidMews
files:
- /Audio/White/Voice/Felinid/cat_mew1.ogg
- /Audio/White/Voice/Felinid/cat_mew2.ogg
- type: soundCollection
id: FelinidGrowls
files:
- /Audio/White/Voice/Felinid/cat_growl1.ogg
- type: soundCollection
id: FelinidPurrs
files:
- /Audio/White/Voice/Felinid/cat_purr1.ogg

View File

@@ -0,0 +1,14 @@
- type: instantAction
id: EatMouse
name: action-name-eat-mouse
description: action-description-eat-mouse
icon: White/Icons/verbiconfangs.png
serverEvent: !type:EatMouseActionEvent
- type: instantAction
id: HairballAction
name: hairball-action
description: hairball-action-desc
charges: 1
useDelay: 30
serverEvent: !type:HairballActionEvent

View File

@@ -0,0 +1,39 @@
- type: species
id: Felinid
name: species-name-felinid
roundStart: true
prototype: MobFelinid
sprites: MobHumanSprites
markingLimits: MobFelinidMarkingLimits
dollPrototype: MobFelinidDummy
skinColoration: HumanToned
bodyTypes:
- HumanNormal
sponsorOnly: true
- type: markingPoints
id: MobFelinidMarkingLimits
points:
Hair:
points: 1
required: false
FacialHair:
points: 1
required: false
Tail:
points: 1
required: true
defaultMarkings: [ FelinidTailBasic ]
HeadTop:
points: 1
required: true
defaultMarkings: [ FelinidEarsBasic ]
Chest:
points: 1
required: false
Legs:
points: 2
required: false
Arms:
points: 2
required: false

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 B

View File

@@ -0,0 +1,75 @@
{
"version": 1,
"copyright": "@Vordenburg",
"license": "CC-BY-SA-4.0",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "basic_inner",
"directions": 4
},
{
"name": "basic_outer",
"directions": 4
},
{
"name": "curled_inner",
"directions": 4
},
{
"name": "curled_outer",
"directions": 4
},
{
"name": "fuzzy_inner",
"directions": 4
},
{
"name": "tall_outer",
"directions": 4
},
{
"name": "tall_inner",
"directions": 4
},
{
"name": "tall_fuzz",
"directions": 4
},
{
"name": "torn_outer",
"directions": 4
},
{
"name": "torn_inner",
"directions": 4
},
{
"name": "stubby_outer",
"directions": 4
},
{
"name": "stubby_inner",
"directions": 4
},
{
"name": "droopy_outer",
"directions": 4
},
{
"name": "droopy_inner",
"directions": 4
},
{
"name": "wide_inner",
"directions": 4
},
{
"name": "wide_outer",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 198 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 153 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 239 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 B

View File

@@ -0,0 +1,181 @@
{
"version": 1,
"copyright": "@Vordenburg",
"license": "CC-BY-SA-4.0",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "basic_tail_tip",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
]
]
},
{
"name": "basic_tail_stripes_even",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
]
]
},
{
"name": "basic_tail_stripes_odd",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
]
]
},
{
"name": "basic_bow",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
]
]
},
{
"name": "basic_bell",
"directions": 4,
"delays": [
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
],
[
0.2,
0.2,
0.2,
0.2,
0.2
]
]
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 B

View File

@@ -0,0 +1,14 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Made by QuizzyQuin",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "icon"
}
]
}