diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 18b6f88df2..a81e15ed05 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -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(); _prototypeManager = prototypeManager; _entMan = entityManager; _preferencesManager = preferencesManager; @@ -188,9 +195,23 @@ namespace Content.Client.Preferences.UI #region Species _speciesList = prototypeManager.EnumeratePrototypes().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); } diff --git a/Content.Server/White/Felinid/CoughingUpHairballComponent.cs b/Content.Server/White/Felinid/CoughingUpHairballComponent.cs new file mode 100644 index 0000000000..854a29894a --- /dev/null +++ b/Content.Server/White/Felinid/CoughingUpHairballComponent.cs @@ -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 + } +} diff --git a/Content.Server/White/Felinid/FelinidComponent.cs b/Content.Server/White/Felinid/FelinidComponent.cs new file mode 100644 index 0000000000..51a74fe04a --- /dev/null +++ b/Content.Server/White/Felinid/FelinidComponent.cs @@ -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 + { + /// + /// The hairball prototype to use. + /// + [DataField("hairballPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string HairballPrototype = "Hairball"; + + [DataField("hairballAction")] + public InstantAction? HairballAction; + + public EntityUid? PotentialTarget = null; + } +} diff --git a/Content.Server/White/Felinid/FelinidFoodComponent.cs b/Content.Server/White/Felinid/FelinidFoodComponent.cs new file mode 100644 index 0000000000..11543401e5 --- /dev/null +++ b/Content.Server/White/Felinid/FelinidFoodComponent.cs @@ -0,0 +1,6 @@ +namespace Content.Server.Abilities.Felinid +{ + [RegisterComponent] + public sealed class FelinidFoodComponent : Component + {} +} diff --git a/Content.Server/White/Felinid/FelinidSystem.cs b/Content.Server/White/Felinid/FelinidSystem.cs new file mode 100644 index 0000000000..610631a0c0 --- /dev/null +++ b/Content.Server/White/Felinid/FelinidSystem.cs @@ -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(OnInit); + SubscribeLocalEvent(OnHairball); + SubscribeLocalEvent(OnEatMouse); + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnHairballHit); + SubscribeLocalEvent(OnHairballPickupAttempt); + } + + private Queue RemQueue = new(); + + public override void Update(float frameTime) + { + base.Update(frameTime); + foreach (var cat in RemQueue) + { + RemComp(cat); + } + RemQueue.Clear(); + + foreach (var (hairballComp, catComp) in EntityQuery()) + { + 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("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(args.Equipped)) + return; + + component.PotentialTarget = args.Equipped; + + if (_prototypeManager.TryIndex("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("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(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(uid); + args.Handled = true; + } + + private void OnEatMouse(EntityUid uid, FelinidComponent component, EatMouseActionEvent args) + { + if (component.PotentialTarget == null) + return; + + if (!TryComp(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(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("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(hairball); + + if (TryComp(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(args.Target) || !HasComp(args.Target)) + return; + if (_robustRandom.Prob(0.2f)) + _vomitSystem.Vomit(args.Target); + } + + private void OnHairballPickupAttempt(EntityUid uid, HairballComponent component, GettingPickedUpAttemptEvent args) + { + if (HasComp(args.User) || !HasComp(args.User)) + return; + + if (_robustRandom.Prob(0.2f)) + { + _vomitSystem.Vomit(args.User); + args.Cancel(); + } + } + } + + public sealed class HairballActionEvent : InstantActionEvent {} + public sealed class EatMouseActionEvent : InstantActionEvent {} +} diff --git a/Content.Server/White/Felinid/HairballComponent.cs b/Content.Server/White/Felinid/HairballComponent.cs new file mode 100644 index 0000000000..465d81791c --- /dev/null +++ b/Content.Server/White/Felinid/HairballComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.Abilities.Felinid +{ + [RegisterComponent] + public sealed class HairballComponent : Component + { + public string SolutionName = "hairball"; + } +} diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs index 8970b9e345..663120d587 100644 --- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs @@ -125,6 +125,9 @@ public sealed partial class SpeciesPrototype : IPrototype /// [DataField("maxAge")] public int MaxAge = 120; + + [DataField("sponsorOnly")] + public bool SponsorOnly { get; } = false; } public enum SpeciesNaming : byte diff --git a/Content.Shared/Preferences/HumanoidCharacterProfile.cs b/Content.Shared/Preferences/HumanoidCharacterProfile.cs index 505dd0a2e6..3a70753ce7 100644 --- a/Content.Shared/Preferences/HumanoidCharacterProfile.cs +++ b/Content.Shared/Preferences/HumanoidCharacterProfile.cs @@ -379,6 +379,12 @@ namespace Content.Shared.Preferences speciesPrototype = prototypeManager.Index(Species); } + if (speciesPrototype.SponsorOnly && !sponsorMarkings.Contains(Species)) + { + Species = SharedHumanoidAppearanceSystem.DefaultSpecies; + speciesPrototype = prototypeManager.Index(Species); + } + var sex = Sex switch { Sex.Male => Sex.Male, diff --git a/Content.Shared/White/Item/PseudoItemInsertDoAfterEvent.cs b/Content.Shared/White/Item/PseudoItemInsertDoAfterEvent.cs new file mode 100644 index 0000000000..ac6417cb85 --- /dev/null +++ b/Content.Shared/White/Item/PseudoItemInsertDoAfterEvent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.Serialization; +using Content.Shared.DoAfter; + +namespace Content.Shared.Item.PseudoItem +{ + [Serializable, NetSerializable] + public sealed class PseudoItemInsertDoAfterEvent : SimpleDoAfterEvent + { + } +} diff --git a/Resources/Audio/White/Felinid/hairball.ogg b/Resources/Audio/White/Felinid/hairball.ogg new file mode 100644 index 0000000000..f7fb40de60 Binary files /dev/null and b/Resources/Audio/White/Felinid/hairball.ogg differ diff --git a/Resources/Audio/White/Felinid/license.txt b/Resources/Audio/White/Felinid/license.txt new file mode 100644 index 0000000000..0370cf25c6 --- /dev/null +++ b/Resources/Audio/White/Felinid/license.txt @@ -0,0 +1 @@ +hairball.ogg taken from https://en.wikipedia.org/wiki/File:Common_house_cat_coughing_hairball.ogv CC-BY-SA-3.0 diff --git a/Resources/Audio/White/Voice/Felinid/attributions.yml b/Resources/Audio/White/Voice/Felinid/attributions.yml new file mode 100644 index 0000000000..bca921c51d --- /dev/null +++ b/Resources/Audio/White/Voice/Felinid/attributions.yml @@ -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/" diff --git a/Resources/Audio/White/Voice/Felinid/cat_growl1.ogg b/Resources/Audio/White/Voice/Felinid/cat_growl1.ogg new file mode 100644 index 0000000000..f7c5b43cee Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_growl1.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_hiss1.ogg b/Resources/Audio/White/Voice/Felinid/cat_hiss1.ogg new file mode 100644 index 0000000000..10cfe9670d Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_hiss1.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_hiss2.ogg b/Resources/Audio/White/Voice/Felinid/cat_hiss2.ogg new file mode 100644 index 0000000000..faaa953ee1 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_hiss2.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_meow1.ogg b/Resources/Audio/White/Voice/Felinid/cat_meow1.ogg new file mode 100644 index 0000000000..6ed99f0d58 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_meow1.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_meow2.ogg b/Resources/Audio/White/Voice/Felinid/cat_meow2.ogg new file mode 100644 index 0000000000..34bb375fe5 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_meow2.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_meow3.ogg b/Resources/Audio/White/Voice/Felinid/cat_meow3.ogg new file mode 100644 index 0000000000..0af0cb0e07 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_meow3.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_mew1.ogg b/Resources/Audio/White/Voice/Felinid/cat_mew1.ogg new file mode 100644 index 0000000000..e41650e0fb Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_mew1.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_mew2.ogg b/Resources/Audio/White/Voice/Felinid/cat_mew2.ogg new file mode 100644 index 0000000000..d82657b9a4 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_mew2.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_purr1.ogg b/Resources/Audio/White/Voice/Felinid/cat_purr1.ogg new file mode 100644 index 0000000000..d7ef89fc50 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_purr1.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_scream1.ogg b/Resources/Audio/White/Voice/Felinid/cat_scream1.ogg new file mode 100644 index 0000000000..2ecc1cf64d Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_scream1.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_scream2.ogg b/Resources/Audio/White/Voice/Felinid/cat_scream2.ogg new file mode 100644 index 0000000000..abb19bcba1 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_scream2.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_scream3.ogg b/Resources/Audio/White/Voice/Felinid/cat_scream3.ogg new file mode 100644 index 0000000000..5e29752046 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_scream3.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/cat_wilhelm.ogg b/Resources/Audio/White/Voice/Felinid/cat_wilhelm.ogg new file mode 100644 index 0000000000..45934ebeb3 Binary files /dev/null and b/Resources/Audio/White/Voice/Felinid/cat_wilhelm.ogg differ diff --git a/Resources/Audio/White/Voice/Felinid/license.txt b/Resources/Audio/White/Voice/Felinid/license.txt new file mode 100644 index 0000000000..89905a5d65 --- /dev/null +++ b/Resources/Audio/White/Voice/Felinid/license.txt @@ -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 diff --git a/Resources/Locale/ru-RU/species/species.ftl b/Resources/Locale/ru-RU/species/species.ftl index 97031c596c..aa5387fe4c 100644 --- a/Resources/Locale/ru-RU/species/species.ftl +++ b/Resources/Locale/ru-RU/species/species.ftl @@ -6,3 +6,4 @@ species-name-reptilian = Ящер species-name-slime = Слаймолюд species-name-diona = Диона species-name-skrell = Скрелл +species-name-felinid = Фелинид diff --git a/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl b/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl new file mode 100644 index 0000000000..5943bd2f30 --- /dev/null +++ b/Resources/Locale/ru-RU/white/species/felinid/felinid.ftl @@ -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 = Колокольчик diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index e47e14c9c8..226543de4b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -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 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index dd507e9516..59fbf1b910 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -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 diff --git a/Resources/Prototypes/Roles/Jobs/Command/captain.yml b/Resources/Prototypes/Roles/Jobs/Command/captain.yml index f3e9f41037..34a2de9547 100644 --- a/Resources/Prototypes/Roles/Jobs/Command/captain.yml +++ b/Resources/Prototypes/Roles/Jobs/Command/captain.yml @@ -24,7 +24,7 @@ supervisors: job-supervisors-centcom whitelistedSpecies: - Human - - Dwarf + - Felinid canBeAntag: false accessGroups: - AllAccess diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 9810d805e9..b828d576eb 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -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: diff --git a/Resources/Prototypes/White/Body/Prototypes/felinid.yml b/Resources/Prototypes/White/Body/Prototypes/felinid.yml new file mode 100644 index 0000000000..f0c98ff83e --- /dev/null +++ b/Resources/Prototypes/White/Body/Prototypes/felinid.yml @@ -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 diff --git a/Resources/Prototypes/White/Emotes/felinid_emotes.yml b/Resources/Prototypes/White/Emotes/felinid_emotes.yml new file mode 100644 index 0000000000..c818fb29d4 --- /dev/null +++ b/Resources/Prototypes/White/Emotes/felinid_emotes.yml @@ -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: + - мурчит + - мурчит. + - мурчит! diff --git a/Resources/Prototypes/White/Mobs/Customization/Markings/felinid.yml b/Resources/Prototypes/White/Mobs/Customization/Markings/felinid.yml new file mode 100644 index 0000000000..78d543aea6 --- /dev/null +++ b/Resources/Prototypes/White/Mobs/Customization/Markings/felinid.yml @@ -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 diff --git a/Resources/Prototypes/White/Mobs/Player/felinid.yml b/Resources/Prototypes/White/Mobs/Player/felinid.yml new file mode 100644 index 0000000000..a9c193373f --- /dev/null +++ b/Resources/Prototypes/White/Mobs/Player/felinid.yml @@ -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 diff --git a/Resources/Prototypes/White/Mobs/Species/felinid.yml b/Resources/Prototypes/White/Mobs/Species/felinid.yml new file mode 100644 index 0000000000..e54a35580e --- /dev/null +++ b/Resources/Prototypes/White/Mobs/Species/felinid.yml @@ -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~~ diff --git a/Resources/Prototypes/White/Objects/Specific/Species/felinid.yml b/Resources/Prototypes/White/Objects/Specific/Species/felinid.yml new file mode 100644 index 0000000000..612d514db5 --- /dev/null +++ b/Resources/Prototypes/White/Objects/Specific/Species/felinid.yml @@ -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 diff --git a/Resources/Prototypes/White/SoundCollections/felinid.yml b/Resources/Prototypes/White/SoundCollections/felinid.yml new file mode 100644 index 0000000000..819323b5b8 --- /dev/null +++ b/Resources/Prototypes/White/SoundCollections/felinid.yml @@ -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 diff --git a/Resources/Prototypes/White/Species/actions.yml b/Resources/Prototypes/White/Species/actions.yml new file mode 100644 index 0000000000..c56c6748d3 --- /dev/null +++ b/Resources/Prototypes/White/Species/actions.yml @@ -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 diff --git a/Resources/Prototypes/White/Species/felinid.yml b/Resources/Prototypes/White/Species/felinid.yml new file mode 100644 index 0000000000..5cc33f76a3 --- /dev/null +++ b/Resources/Prototypes/White/Species/felinid.yml @@ -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 diff --git a/Resources/Textures/White/Icons/verbiconfangs.png b/Resources/Textures/White/Icons/verbiconfangs.png new file mode 100644 index 0000000000..4511cbd21f Binary files /dev/null and b/Resources/Textures/White/Icons/verbiconfangs.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/basic_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/basic_inner.png new file mode 100644 index 0000000000..15d3feceeb Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/basic_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/basic_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/basic_outer.png new file mode 100644 index 0000000000..dacfe6dcef Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/basic_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/curled_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/curled_inner.png new file mode 100644 index 0000000000..40c07fafc7 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/curled_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/curled_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/curled_outer.png new file mode 100644 index 0000000000..1fc78f303f Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/curled_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/droopy_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/droopy_inner.png new file mode 100644 index 0000000000..ffbca7bd46 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/droopy_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/droopy_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/droopy_outer.png new file mode 100644 index 0000000000..268e8ec732 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/droopy_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/fuzzy_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/fuzzy_inner.png new file mode 100644 index 0000000000..5af32433c6 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/fuzzy_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/meta.json b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/meta.json new file mode 100644 index 0000000000..9d6aeb1ae9 --- /dev/null +++ b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/meta.json @@ -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 + } + ] +} diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/stubby_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/stubby_inner.png new file mode 100644 index 0000000000..dd417e8a85 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/stubby_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/stubby_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/stubby_outer.png new file mode 100644 index 0000000000..317166f934 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/stubby_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_fuzz.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_fuzz.png new file mode 100644 index 0000000000..e17ef18cae Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_fuzz.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_inner.png new file mode 100644 index 0000000000..7e9a8897e3 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_outer.png new file mode 100644 index 0000000000..3847b37b9c Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/tall_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/torn_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/torn_inner.png new file mode 100644 index 0000000000..54c8ca35bf Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/torn_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/torn_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/torn_outer.png new file mode 100644 index 0000000000..56fab2c36f Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/torn_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/wide_inner.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/wide_inner.png new file mode 100644 index 0000000000..2be9161aa0 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/wide_inner.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/wide_outer.png b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/wide_outer.png new file mode 100644 index 0000000000..bfd0042ff5 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_ears.rsi/wide_outer.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_bell.png b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_bell.png new file mode 100644 index 0000000000..8a6ca94940 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_bell.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_bow.png b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_bow.png new file mode 100644 index 0000000000..bfb8843413 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_bow.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_stripes_even.png b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_stripes_even.png new file mode 100644 index 0000000000..4950c72d7f Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_stripes_even.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_stripes_odd.png b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_stripes_odd.png new file mode 100644 index 0000000000..10e47bbd2b Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_stripes_odd.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_tip.png b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_tip.png new file mode 100644 index 0000000000..0248320764 Binary files /dev/null and b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/basic_tail_tip.png differ diff --git a/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/meta.json b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/meta.json new file mode 100644 index 0000000000..a333d23a8e --- /dev/null +++ b/Resources/Textures/White/Mobs/Customization/felinid_tails.rsi/meta.json @@ -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 + ] + ] + } + ] +} diff --git a/Resources/Textures/White/Specific/Species/felinid.rsi/icon.png b/Resources/Textures/White/Specific/Species/felinid.rsi/icon.png new file mode 100644 index 0000000000..f9483ac80f Binary files /dev/null and b/Resources/Textures/White/Specific/Species/felinid.rsi/icon.png differ diff --git a/Resources/Textures/White/Specific/Species/felinid.rsi/meta.json b/Resources/Textures/White/Specific/Species/felinid.rsi/meta.json new file mode 100644 index 0000000000..aaad7ca5b9 --- /dev/null +++ b/Resources/Textures/White/Specific/Species/felinid.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by QuizzyQuin", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + } + ] +}