From b88d8663f935fbe330bbe2cf22152804dc2b1611 Mon Sep 17 00:00:00 2001 From: Adrian16199 <144424013+Adrian16199@users.noreply.github.com> Date: Thu, 21 Sep 2023 23:39:49 +0200 Subject: [PATCH] Oni Morphotype from nyanotrasen (#28) * Oni Morphotype from nyanotrasen The big felinid destroyer has arrived. * Added some files. changed species weight again by deletin that one space and addin vulpkanin weight. (will have to prolly change that after felinids merge) * Finally fixin the *reason* why it just didnt wanted to show Also Fixed horns * Changed localization of files. * Changed excess to critThreshold Also changed capitalization of oni_horns.rsi to Oni_horns.rsi. * Leavin a comment so that someone else can do this. * Additional merge fixes with files. * Added THE NAMING SYSTEM! Only touched 2 base files and summarized it because had no other choice from my understanding * Removed erroneously named folder * Replaced erroneously named folder * Added link so the horns dont have file names. --------- Signed-off-by: Adrian16199 <144424013+Adrian16199@users.noreply.github.com> Co-authored-by: Colin-Tel <113523727+Colin-Tel@users.noreply.github.com> --- .../Abilities/Oni/HeldbyOniComponent.cs | 8 ++ .../Nyanotrasen/Abilities/Oni/OniComponent.cs | 14 ++++ .../Nyanotrasen/Abilities/Oni/OniSystem.cs | 76 ++++++++++++++++++ Content.Shared/Humanoid/NamingSystem.cs | 5 ++ .../Humanoid/Prototypes/SpeciesPrototype.cs | 3 + .../en-US/nyanotrasen/abilities/Oni.ftl | 1 + .../Locale/en-US/nyanotrasen/markings/Oni.ftl | 7 ++ .../en-US/nyanotrasen/species/namepreset.ftl | 1 + .../en-US/nyanotrasen/species/species.ftl | 1 + .../Nyanotrasen/Damage/modifier_sets.yml | 7 ++ .../Nyanotrasen/Datasets/Names/oni_female.yml | 21 +++++ .../Datasets/Names/oni_location.yml | 31 +++++++ .../Nyanotrasen/Datasets/Names/oni_male.yml | 20 +++++ .../Mobs/Customization/Markings/Oni_horns.yml | 69 ++++++++++++++++ .../Nyanotrasen/Entities/Mobs/Player/Oni.yml | 35 ++++++++ .../Nyanotrasen/Entities/Mobs/Species/Oni.yml | 45 +++++++++++ .../Prototypes/Nyanotrasen/Species/Oni.yml | 36 +++++++++ .../Prototypes/Species/species_weights.yml | 1 + .../oni_horns.rsi/double_curved.png | Bin 0 -> 2435 bytes .../oni_horns.rsi/double_curved_outwards.png | Bin 0 -> 603 bytes .../double_left_broke_curved.png | Bin 0 -> 2416 bytes .../double_right_broke_curved.png | Bin 0 -> 2395 bytes .../Customization/oni_horns.rsi/meta.json | 39 +++++++++ .../oni_horns.rsi/single_curved.png | Bin 0 -> 633 bytes .../oni_horns.rsi/single_left_curved.png | Bin 0 -> 2432 bytes .../oni_horns.rsi/single_right_curved.png | Bin 0 -> 2430 bytes 26 files changed, 420 insertions(+) create mode 100644 Content.Server/Nyanotrasen/Abilities/Oni/HeldbyOniComponent.cs create mode 100644 Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs create mode 100644 Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs create mode 100644 Resources/Locale/en-US/nyanotrasen/abilities/Oni.ftl create mode 100644 Resources/Locale/en-US/nyanotrasen/markings/Oni.ftl create mode 100644 Resources/Locale/en-US/nyanotrasen/species/namepreset.ftl create mode 100644 Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_female.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_location.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_male.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/Oni_horns.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml create mode 100644 Resources/Prototypes/Nyanotrasen/Species/Oni.yml create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_curved.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_curved_outwards.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_left_broke_curved.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_right_broke_curved.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/meta.json create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/single_curved.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/single_left_curved.png create mode 100644 Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/single_right_curved.png diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/HeldbyOniComponent.cs b/Content.Server/Nyanotrasen/Abilities/Oni/HeldbyOniComponent.cs new file mode 100644 index 00000000000..41ec3fa630e --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Oni/HeldbyOniComponent.cs @@ -0,0 +1,8 @@ +namespace Content.Server.Abilities.Oni +{ + [RegisterComponent] + public sealed partial class HeldByOniComponent : Component + { + public EntityUid Holder = default!; + } +} diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs new file mode 100644 index 00000000000..af18a8021d4 --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Damage; + +namespace Content.Server.Abilities.Oni +{ + [RegisterComponent] + public sealed partial class OniComponent : Component + { + [DataField("modifiers", required: true)] + public DamageModifierSet MeleeModifiers = default!; + + [DataField("stamDamageBonus")] + public float StamDamageMultiplier = 1.25f; + } +} diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs new file mode 100644 index 00000000000..e0139685a7a --- /dev/null +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -0,0 +1,76 @@ +using Content.Server.Tools; +using Content.Shared.Tools.Components; +using Content.Shared.Damage.Events; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Weapons.Ranged.Components; +using Robust.Shared.Containers; + +namespace Content.Server.Abilities.Oni +{ + public sealed class OniSystem : EntitySystem + { + [Dependency] private readonly ToolSystem _toolSystem = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnEntInserted); + SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent(OnOniMeleeHit); + SubscribeLocalEvent(OnHeldMeleeHit); + SubscribeLocalEvent(OnStamHit); + } + + private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedIntoContainerMessage args) + { + var heldComp = EnsureComp(args.Entity); + heldComp.Holder = uid; + + if (TryComp(args.Entity, out var tool) && _toolSystem.HasQuality(args.Entity, "Prying", tool)) + tool.SpeedModifier *= 1.66f; + + if (TryComp(args.Entity, out var gun)) + { + gun.MinAngle *= 15f; + gun.AngleIncrease *= 15f; + gun.MaxAngle *= 15f; + } + } + + private void OnEntRemoved(EntityUid uid, OniComponent component, EntRemovedFromContainerMessage args) + { + if (TryComp(args.Entity, out var tool) && _toolSystem.HasQuality(args.Entity, "Prying", tool)) + tool.SpeedModifier /= 1.66f; + + if (TryComp(args.Entity, out var gun)) + { + gun.MinAngle /= 15f; + gun.AngleIncrease /= 15f; + gun.MaxAngle /= 15f; + } + + RemComp(args.Entity); + } + + private void OnOniMeleeHit(EntityUid uid, OniComponent component, MeleeHitEvent args) + { + args.ModifiersList.Add(component.MeleeModifiers); + } + + private void OnHeldMeleeHit(EntityUid uid, HeldByOniComponent component, MeleeHitEvent args) + { + if (!TryComp(component.Holder, out var oni)) + return; + + args.ModifiersList.Add(oni.MeleeModifiers); + } + + private void OnStamHit(EntityUid uid, HeldByOniComponent component, StaminaMeleeHitEvent args) + { + if (!TryComp(component.Holder, out var oni)) + return; + + args.Multiplier *= oni.StamDamageMultiplier; + } + } +} diff --git a/Content.Shared/Humanoid/NamingSystem.cs b/Content.Shared/Humanoid/NamingSystem.cs index 5e9ebdbf23c..a44f396dcaf 100644 --- a/Content.Shared/Humanoid/NamingSystem.cs +++ b/Content.Shared/Humanoid/NamingSystem.cs @@ -26,6 +26,11 @@ public string GetName(string species, Gender? gender = null) switch (speciesProto.Naming) { + //Start of Nyano code for Oni naming + case SpeciesNaming.XnoY: + return Loc.GetString("namepreset-x-no-y", + ("first", GetFirstName(speciesProto, gender)), ("last", GetLastName(speciesProto))); + //End of Nyano code for Oni naming case SpeciesNaming.TheFirstofLast: return Loc.GetString("namepreset-thefirstoflast", ("first", GetFirstName(speciesProto, gender)), ("last", GetLastName(speciesProto))); diff --git a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs index 54c74e542fc..ad2562fe141 100644 --- a/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs +++ b/Content.Shared/Humanoid/Prototypes/SpeciesPrototype.cs @@ -126,5 +126,8 @@ public enum SpeciesNaming : byte { FirstLast, FirstDashFirst, + //Start of Nyano code for Oni naming + XnoY, + //End of Nyano code for Oni naming TheFirstofLast, } diff --git a/Resources/Locale/en-US/nyanotrasen/abilities/Oni.ftl b/Resources/Locale/en-US/nyanotrasen/abilities/Oni.ftl new file mode 100644 index 00000000000..a84178339d6 --- /dev/null +++ b/Resources/Locale/en-US/nyanotrasen/abilities/Oni.ftl @@ -0,0 +1 @@ +oni-gun-fire = You can't fire guns! diff --git a/Resources/Locale/en-US/nyanotrasen/markings/Oni.ftl b/Resources/Locale/en-US/nyanotrasen/markings/Oni.ftl new file mode 100644 index 00000000000..7b8a14bccf3 --- /dev/null +++ b/Resources/Locale/en-US/nyanotrasen/markings/Oni.ftl @@ -0,0 +1,7 @@ +marking-OniHornSingleCurved = Single Curved +marking-OniHornSingleLeftCurved =Single Left Curved +marking-OniHornSingleRightCurved = Single Right Curved +marking-OniHornDoubleCurvedOutwards = Double Curved Outwards +marking-OniHornDoubleCurved = Double Curved +marking-OniHornDoubleLeftBrokeCurved = Double Left Broke Curved +marking-OniHornDoubleRightBrokeCurved = Double Right Broke Curved diff --git a/Resources/Locale/en-US/nyanotrasen/species/namepreset.ftl b/Resources/Locale/en-US/nyanotrasen/species/namepreset.ftl new file mode 100644 index 00000000000..030001e5ef5 --- /dev/null +++ b/Resources/Locale/en-US/nyanotrasen/species/namepreset.ftl @@ -0,0 +1 @@ +namepreset-x-no-y = {$last}-no-{$first} diff --git a/Resources/Locale/en-US/nyanotrasen/species/species.ftl b/Resources/Locale/en-US/nyanotrasen/species/species.ftl index b67fa191414..c55f81ed0b5 100644 --- a/Resources/Locale/en-US/nyanotrasen/species/species.ftl +++ b/Resources/Locale/en-US/nyanotrasen/species/species.ftl @@ -1 +1,2 @@ +species-name-oni = Oni species-name-felinid = Felinid diff --git a/Resources/Prototypes/Nyanotrasen/Damage/modifier_sets.yml b/Resources/Prototypes/Nyanotrasen/Damage/modifier_sets.yml index a92c387bd09..97f5b72cf0f 100644 --- a/Resources/Prototypes/Nyanotrasen/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Nyanotrasen/Damage/modifier_sets.yml @@ -1,3 +1,10 @@ +- type: damageModifierSet + id: Oni + coefficients: + Blunt: 0.85 + Slash: 0.85 + Piercing: 0.85 + - type: damageModifierSet id: Felinid coefficients: diff --git a/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_female.yml b/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_female.yml new file mode 100644 index 00000000000..afb58253096 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_female.yml @@ -0,0 +1,21 @@ +- type: dataset + id: names_oni_female + values: + - Akari #星 + - Kira + - Kirameki + - Aki #陽 + - Akiho + - Akimi + - Akashi #明 + - Saya + - Aporo #月 + - Arute + - Meguru + - Tiara #天 + - Suisei + - Io #水 + - Aoi + - Mizu + - Shuten #epic references + - Suika diff --git a/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_location.yml b/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_location.yml new file mode 100644 index 00000000000..a7eda394872 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_location.yml @@ -0,0 +1,31 @@ +- type: dataset + id: names_oni_location + values: + - Amiboshi + - Amefuriboshi + - Aoboshi + - Ashitareboshi + - Chirikoboshi + - Chichiriboshi + - Ekieboshi + - Inamiboshi + - Hatsuinoshi + - Hikitsuboshi + - Hotohoriboshi + - Karasukiboshi + - Miboshi + - Namameboshi + - Nakagoboshi + - Nuriboshi + - Soiboshi + - Suboshi + - Subaruboshi + - Tamaonoboshi + - Tasukiboshi + - Tataraboshi + - Tomiteboshi + - Tomoboshi + - Tokakiboshi + - Torokiboshi + - Umiyameboshi + - Urukiboshi diff --git a/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_male.yml b/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_male.yml new file mode 100644 index 00000000000..2742cf90734 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Datasets/Names/oni_male.yml @@ -0,0 +1,20 @@ +- type: dataset + id: names_oni_male + values: + - Kiyoshi #陽 + - Satoshi #明 + - Teru #光 + - Hiroshi + - Takashi #天 + - Eeichi #永一 + - Eeichirou #永一朗 + - Kyousaburou + - Tsutomu + - Tsuyoshi + - Kenshi + - Kenji + - Kenichi + - Susumu + - Kyounosuke + - Suisei #Mars + - Shuten #Reference diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/Oni_horns.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/Oni_horns.yml new file mode 100644 index 00000000000..39dca5ef9ab --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Customization/Markings/Oni_horns.yml @@ -0,0 +1,69 @@ +- type: marking + id: OniHornSingleCurved + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: single_curved + +- type: marking + id: OniHornSingleLeftCurved + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: single_left_curved + +- type: marking + id: OniHornSingleRightCurved + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: single_right_curved + +- type: marking + id: OniHornDoubleCurvedOutwards + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: double_curved_outwards + +- type: marking + id: OniHornDoubleCurved + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: double_curved + +- type: marking + id: OniHornDoubleLeftBrokeCurved + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: double_left_broke_curved + +- type: marking + id: OniHornDoubleRightBrokeCurved + bodyPart: HeadTop + markingCategory: HeadTop + forcedColoring: false + speciesRestriction: [Oni] + sprites: + - sprite: Nyanotrasen/Mobs/Customization/oni_horns.rsi + state: double_right_broke_curved diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml new file mode 100644 index 00000000000..86126334be9 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Player/Oni.yml @@ -0,0 +1,35 @@ +- type: entity + save: false + name: Urist McOni + parent: MobOniBase + id: MobOni + 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.0 + damageRecovery: + types: + Asphyxiation: -1.0 + - type: Alerts + - type: Actions + - type: Eye + - type: CameraRecoil + - type: Examiner + - type: CanHostGuardian + - type: NpcFactionMember + factions: + - NanoTrasen + #type: PotentialPsionic diff --git a/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml new file mode 100644 index 00000000000..e11f1c4165f --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml @@ -0,0 +1,45 @@ +- type: entity + parent: BaseMobHuman + name: Urist McOni + id: MobOniBase + abstract: true + components: + - type: Speech + speechSounds: Baritone + - type: HumanoidAppearance + species: Oni + - type: Sprite + scale: 1.2, 1.2 + - type: Oni + modifiers: + coefficients: + Blunt: 1.35 + Slash: 1.2 + Piercing: 1.2 + Asphyxiation: 1.35 + - type: Damageable + damageModifierSet: Oni + - type: Body + prototype: Human + - type: Fixtures + fixtures: # TODO: This needs a second fixture just for mob collisions. + fix1: + shape: + !type:PhysShapeCircle + radius: 0.42 + density: 220 + restitution: 0.0 + mask: + - MobMask + layer: + - MobLayer + - type: Stamina + critThreshold: 115 + +- type: entity + save: false + name: Urist McOni + parent: MobHumanDummy + id: MobOniDummy + noSpawn: true + description: A dummy oni meant to be used in character setup. diff --git a/Resources/Prototypes/Nyanotrasen/Species/Oni.yml b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml new file mode 100644 index 00000000000..84c6eac63d2 --- /dev/null +++ b/Resources/Prototypes/Nyanotrasen/Species/Oni.yml @@ -0,0 +1,36 @@ +- type: species + id: Oni + name: species-name-oni + roundStart: true + prototype: MobOni + dollPrototype: MobOniDummy + markingLimits: MobOniMarkingLimits + sprites: MobHumanSprites + skinColoration: Hues + maleFirstNames: names_oni_male + femaleFirstNames: names_oni_female + lastNames: names_oni_location + naming: XnoY + +- type: markingPoints + id: MobOniMarkingLimits + points: + Hair: + points: 1 + required: false + FacialHair: + points: 1 + required: false + HeadTop: + points: 1 + required: true + defaultMarkings: [ OniHornSingleCurved ] + Chest: + points: 1 + required: false + Legs: + points: 2 + required: false + Arms: + points: 2 + required: false diff --git a/Resources/Prototypes/Species/species_weights.yml b/Resources/Prototypes/Species/species_weights.yml index ca66b529d18..990a8ccecfa 100644 --- a/Resources/Prototypes/Species/species_weights.yml +++ b/Resources/Prototypes/Species/species_weights.yml @@ -5,6 +5,7 @@ Human: 5 Reptilian: 4 SlimePerson: 4 + Oni: 3 #Nyanotrasen Oni, see Prototypes/Nyanotrasen/Entities/Mobs/Species/Oni.yml Felinid: 4 # Nyanotrasen - Felinid, see Prototypes/Nyanotrasen/Entities/Mobs/Species/felinid.yml Vulpkanin: 3 # DeltaV - Vulpkanin, see Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml Diona: 2 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_curved.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_curved.png new file mode 100644 index 0000000000000000000000000000000000000000..cca26d0c7c4d8570b2b4a6518bb5daf6eec72d87 GIT binary patch literal 2435 zcmV-}34Hd6P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+U;0dk|ZY#{O1%t0s@5KI0#ULZ{XuQMOF7q@638< zz5a4+RZLOMLx@bhYQp~OPYZwGO43UxEUorhBd*d*PXjM4UROU)isd}dRqi4De(4X- zfrPG%HeWww-17(e`E9{t57O8E(C(4cZb9@Ee6H*}`}=yYB>L0UPq!wa@9U-ZCht|% zThM%{+}{4mQ?2{B_#Iw41Sl=WMmeRODaZ3Hmj>DYQXbxqXUq-rD9d^0fF|X~kpRfc z@g8lA?*V!N`SBLMMgRHs4ftu?{rMX#>x~g!J{=(brawQoN$)q#PmR*+fR-mQA3!!+ z&1_$%8>Ir#dRx>1n;v2?Q2}{A%PMZcALCul-Ep@#;soU@&ZxL2bxJ_r0u@>`$Y`H- z(u9g7?IdVZnkk>YmL>Hxv-4E^CQFigUb%s+nRdt--RY?doqhY+Z&Jg~i!e12gwdh@ zJ9qe}!JoN<*>s2~wkKB5E4f`m4QI}um<2+}Zr=C+{J3xW<2(C-se(a1FgF}7 zMmKBeFy-^)$r^ft$U_8qIAP}ujHNi!Gn0;v1Q+b66o&vWxIc6p&=8Z*2PJ^!yLUH`YnmY>RfSTf z)w=pf+P1mQ)ip!I3Xx(e1?E^a>=CWCwd1&i`12u#tm2*I76W+JGRVgAq78VNY-Iqk z5`_T?LuJ#n7mbR(XvD7?`LFjnSq$tNAiUeA+yDtO0LVnT&^={i{nThV%Qk3(;R#DI z*MsWGAbPKLzt^S;4$)3OkJT z_8mw%%bM^2pialCX*5Js!UKppbuafQWDvL0$~y$fM)=0zQ&SPhY82buoHC? zV2K)dFU5{@j_Y{Ewjordf?-h@%@(N8I^5ZbxooW6wgx}A813h1kXm)-qVRoA9rBy8(MyG~Q;lYUzer>^@4-M|)h>JSA z2R69$4;||(ZTM9IzXkmk^y`8|_>Rxv3JZ@AjnS7N?eXaIFip<@f2|KcD*&I(_=5VV zV)#VYxaH0za(O=A*(9QX(K)Vcg1CpIX&#mFy{aK2{CU~^Zx)}mw~FD{`8tVrg>|Z# zN8&v(2$APq)=l~@>x#W(-HEibln1(lhtPsT1WJ0sWdv8$#B1biyE2ZXGVa6jMr1{j zLUEd|Xvru@Z>_=yHQ&mzQ37=rC`zqp~%gQl-#RVndbjw!6qnivnTd1rPS}V;VMC4l!)xm z3XvVeV&1(ChhM|PF<%&yz3OuLgSQVm(?{gGYgDTe%);?ug}kf>#;ePWx@wil1;DH_QUb_uK|&J^=GPxyxeVbX=$SK5$%a=~vw zzXkoD1i{ncWZ`eUJ9E~?eI!``00D(*LqkwWLqi~Na&Km7Y-Iodc$|HaJxIeq9K~N# z#ZoE`W)N}6P{qN5Ux=eru?QAQTcK44lS{v#Nkh`&;wZQl9Q;_UI=DFN>fkB}f*&A` zPELw0QsV!TLW>v=j{EWM-sA2aAT-KMv%1CsO|P2CSX9bnSEZg;1QCFUQB26pGUBPl zG(5-GJ$!tkf-5YKE@4bJ<-A}h)&@j3CBNf#u3*&tDLtuYvmei-IKpCl+#yIT&FpN z7?u!60umI|P(m41L}=AXv5=(wsE2>h@h8ZokgEhnjs;YpL3aG$fAG6oD?c^qCWWFv z_ls?R3mpj0~lOdb3 zBl&3x`8@D`M&FbL`fq{Yn%i4zAEysMnz~xP0S*pvil!EdWSd=lxC2UYj&0D`J3T>}6B000000002+ zW}VPlj>=2KTva8TaP^qx4OogSc~2l(H^Qs|>BQD@N}I+?b6x2ZD1J-CI>*hju;qe+ zyLX-WQ@2emz4vZuKok+jF9!es000000002k?FDN)bO>m4bxHsL002ovPDHLkV1o0d BjOG9U literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_curved_outwards.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/double_curved_outwards.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3d02a43efff2c7b54ef1bc055b9498c5693906 GIT binary patch literal 603 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 Q6a(=+UHx3vIVCg!0BUXlxc~qF literal 0 HcmV?d00001 diff --git a/Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/single_left_curved.png b/Resources/Textures/Nyanotrasen/Mobs/Customization/oni_horns.rsi/single_left_curved.png new file mode 100644 index 0000000000000000000000000000000000000000..d079bef1e535c952ed26293248f6dbd9df6b4eb7 GIT binary patch literal 2432 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 literal 0 HcmV?d00001