diff --git a/Content.Server/Atmos/Miasma/RottingSystem.cs b/Content.Server/Atmos/Miasma/RottingSystem.cs index 676c9ec6e99..feef657e5b9 100644 --- a/Content.Server/Atmos/Miasma/RottingSystem.cs +++ b/Content.Server/Atmos/Miasma/RottingSystem.cs @@ -13,6 +13,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; +using Content.Shared.Cuffs.Components; namespace Content.Server.Atmos.Miasma; @@ -98,6 +99,17 @@ public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) return false; } + if (TryComp(uid, out var cuffed) && cuffed.CuffedHandCount > 0) + { + if (TryComp(cuffed.LastAddedCuffs, out var cuffcomp)) + { + if (cuffcomp.NoRot) + { + return false; + } + } + } + var ev = new IsRottingEvent(); RaiseLocalEvent(uid, ref ev); diff --git a/Content.Server/Nyanotrasen/Abilities/Felinid/FelinidSystem.cs b/Content.Server/Nyanotrasen/Abilities/Felinid/FelinidSystem.cs index 11c9c2bf665..56e14777711 100644 --- a/Content.Server/Nyanotrasen/Abilities/Felinid/FelinidSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Felinid/FelinidSystem.cs @@ -5,7 +5,6 @@ using Content.Shared.Item; using Content.Shared.Inventory; using Content.Shared.Hands; -using Content.Shared.Actions; using Content.Shared.IdentityManagement; using Content.Server.Body.Components; using Content.Server.Medical; @@ -41,7 +40,7 @@ public override void Initialize() SubscribeLocalEvent(OnHairball); SubscribeLocalEvent(OnEatMouse); SubscribeLocalEvent(OnEquipped); - SubscribeLocalEvent(OnUnequipped); + SubscribeLocalEvent(OnUnequipped); SubscribeLocalEvent(OnHairballHit); SubscribeLocalEvent(OnHairballPickupAttempt); } diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs index af18a8021d4..804d8f399c5 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniComponent.cs @@ -9,6 +9,6 @@ public sealed partial class OniComponent : Component public DamageModifierSet MeleeModifiers = default!; [DataField("stamDamageBonus")] - public float StamDamageMultiplier = 1.25f; + public float StamDamageMultiplier = 1.20f; } } diff --git a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs index e0139685a7a..b680788ff80 100644 --- a/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs +++ b/Content.Server/Nyanotrasen/Abilities/Oni/OniSystem.cs @@ -26,27 +26,22 @@ private void OnEntInserted(EntityUid uid, OniComponent component, EntInsertedInt 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; + gun.MinAngle *= 20f; + gun.AngleIncrease *= 20f; + gun.MaxAngle *= 20f; } } 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; + gun.MinAngle /= 20f; + gun.AngleIncrease /= 20f; + gun.MaxAngle /= 20f; } RemComp(args.Entity); diff --git a/Content.Server/Spider/SpiderSystem.cs b/Content.Server/Spider/SpiderSystem.cs index 449e43984c3..8004e4c7eae 100644 --- a/Content.Server/Spider/SpiderSystem.cs +++ b/Content.Server/Spider/SpiderSystem.cs @@ -4,12 +4,15 @@ using Content.Shared.Maps; using Robust.Server.GameObjects; using Robust.Shared.Map; +using Content.Shared.Nutrition.EntitySystems; +using Content.Shared.Nutrition.Components; namespace Content.Server.Spider; public sealed class SpiderSystem : SharedSpiderSystem { [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly HungerSystem _hungerSystem = default!; public override void Initialize() { @@ -22,6 +25,13 @@ private void OnSpawnNet(EntityUid uid, SpiderComponent component, SpiderWebActio if (args.Handled) return; + if (TryComp(uid, out var hungerComp) + && _hungerSystem.IsHungerBelowState(uid, HungerThreshold.Okay, hungerComp.CurrentHunger - 5, hungerComp)) + { + _popup.PopupEntity(Loc.GetString("sericulture-failure-hunger"), args.Performer, args.Performer); + return; + } + var transform = Transform(uid); if (transform.GridUid == null) @@ -42,22 +52,10 @@ private void OnSpawnNet(EntityUid uid, SpiderComponent component, SpiderWebActio result = true; } - // Spawn web in other directions - for (var i = 0; i < 4; i++) - { - var direction = (DirectionFlag) (1 << i); - coords = transform.Coordinates.Offset(direction.AsDir().ToVec()); - - if (!IsTileBlockedByWeb(coords)) - { - Spawn(component.WebPrototype, coords); - result = true; - } - } - if (result) { _popup.PopupEntity(Loc.GetString("spider-web-action-success"), args.Performer, args.Performer); + _hungerSystem.ModifyHunger(uid, -5); args.Handled = true; } else diff --git a/Content.Server/_NF/ArachnidChaos/ArachnidChaosComponent.cs b/Content.Server/_NF/ArachnidChaos/ArachnidChaosComponent.cs new file mode 100644 index 00000000000..cbf0ac490b2 --- /dev/null +++ b/Content.Server/_NF/ArachnidChaos/ArachnidChaosComponent.cs @@ -0,0 +1,7 @@ + +namespace Content.Server.ArachnidChaos +{ + [RegisterComponent] + public sealed partial class ArachnidChaosComponent : Component + {} +} diff --git a/Content.Server/_NF/ArachnidChaos/ArachnidChaosSystem.cs b/Content.Server/_NF/ArachnidChaos/ArachnidChaosSystem.cs new file mode 100644 index 00000000000..df4496d99dc --- /dev/null +++ b/Content.Server/_NF/ArachnidChaos/ArachnidChaosSystem.cs @@ -0,0 +1,139 @@ +using Content.Server.Administration.Logs; +using Content.Shared.Verbs; +using Content.Shared.DoAfter; +using Content.Shared.Popups; +using Content.Shared.Inventory; +using Content.Shared.Nutrition.Components; +using Content.Shared.Nutrition.EntitySystems; +using Robust.Shared.Audio; +using Content.Shared.Audio; +using Content.Server.Body.Components; +using Content.Shared.ArachnidChaos; +using Content.Server.Nutrition.EntitySystems; +using Robust.Shared.Player; +using Content.Shared.Mobs.Systems; +using Content.Server.Body.Systems; +using Content.Shared.Database; +using Robust.Shared.Utility; + +namespace Content.Server.ArachnidChaos +{ + public sealed class ArachnidChaosSystem : EntitySystem + { + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly HungerSystem _hunger = default!; + [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly BloodstreamSystem _bloodstreamSystem = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent>(AddBiteVerb); + SubscribeLocalEvent(OnDoAfter); + } + private void AddBiteVerb(EntityUid uid, ArachnidChaosComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + if (!_mobStateSystem.IsAlive(args.User)) + return; + + if (args.User == args.Target) + return; + + if (!TryComp(args.Target, out var bloodstream)) + return; + + InnateVerb verb = new() + { + Act = () => + { + if (!IsActionValid(args.User, args.Target)) + return; + + _popupSystem.PopupEntity(Loc.GetString("spider-biting", ("UsernameName", args.User), ("targetName", args.Target)), args.User); + _popupSystem.PopupEntity(Loc.GetString("spider-biting"), args.User, args.User); + + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, 3f, new ArachnidChaosDoAfterEvent(), uid, target: args.Target, used: uid) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + BreakOnDamage = true, + BlockDuplicate = true + }; + + _doAfter.TryStartDoAfter(doAfterEventArgs); + }, + Icon = new SpriteSpecifier.Rsi(new ("Nyanotrasen/Icons/verbiconfangs.rsi"), "icon"), + Text = Loc.GetString("action-name-spider-bite"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + private void OnDoAfter(EntityUid uid, ArachnidChaosComponent comp, DoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Target == null) + return; + + if (!IsActionValid(args.Args.User, args.Args.Target.Value)) + return; + + if (!TryComp(args.Args.User, out var hunger)) + return; + + if (!TryComp(args.Args.Target.Value, out var bloodstream)) + return; + + _bloodstreamSystem.TryModifyBloodLevel(args.Args.Target.Value, -5, bloodstream); + SoundSystem.Play("/Audio/Items/drink.ogg", Filter.Pvs(args.Args.User), args.Args.User, AudioHelpers.WithVariation(0.15f)); + _hunger.ModifyHunger(args.Args.User, 5, hunger); + + _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(args.Args.User):actor} drank blood from {ToPrettyString(args.Args.Target.Value):actor}"); + + args.Repeat = true; + } + + private bool IsActionValid(EntityUid user, EntityUid target) + { + if (!TryComp(target, out var bloodstream)) + return false; + + if (bloodstream.BloodReagent == "Blood") + { + if (_bloodstreamSystem.GetBloodLevelPercentage(target, bloodstream) <= 0.0f) + { + _popupSystem.PopupEntity(Loc.GetString("no-blood-warning"), user, user, Shared.Popups.PopupType.SmallCaution); + return false; + } + } + else + { + _popupSystem.PopupEntity(Loc.GetString("no-good-blood"), user, user, Shared.Popups.PopupType.SmallCaution); + return false; + } + + if (!TryComp(user, out var hunger)) + return false; + + if (hunger.CurrentThreshold == Shared.Nutrition.Components.HungerThreshold.Overfed) + { + _popupSystem.PopupEntity(Loc.GetString("food-system-you-cannot-eat-any-more"), user, user, Shared.Popups.PopupType.SmallCaution); + return false; + } + + if (_inventorySystem.TryGetSlotEntity(user, "mask", out var maskUid) && + EntityManager.TryGetComponent(maskUid, out var blocker) && + blocker.Enabled) + { + _popupSystem.PopupEntity(Loc.GetString("hairball-mask", ("mask", maskUid)), user, user, Shared.Popups.PopupType.SmallCaution); + return false; + } + + return true; + } + } +} diff --git a/Content.Server/_NF/SizeAttribute/SizeAttributeComponent.cs b/Content.Server/_NF/SizeAttribute/SizeAttributeComponent.cs new file mode 100644 index 00000000000..0cb88abe587 --- /dev/null +++ b/Content.Server/_NF/SizeAttribute/SizeAttributeComponent.cs @@ -0,0 +1,13 @@ + +namespace Content.Server.SizeAttribute +{ + [RegisterComponent] + public sealed partial class SizeAttributeComponent : Component + { + [DataField("short")] + public bool Short = false; + + [DataField("tall")] + public bool Tall = false; + } +} diff --git a/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs b/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs new file mode 100644 index 00000000000..34a865d8b78 --- /dev/null +++ b/Content.Server/_NF/SizeAttribute/SizeAttributeSystem.cs @@ -0,0 +1,91 @@ +using System.Numerics; +using Robust.Server.GameObjects; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Physics.Systems; +using Content.Server.Item.PseudoItem; + +namespace Content.Server.SizeAttribute +{ + public sealed class SizeAttributeSystem : EntitySystem + { + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly AppearanceSystem _appearance = default!; + [Dependency] private readonly FixtureSystem _fixtures = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnComponentInit); + } + + private void OnComponentInit(EntityUid uid, SizeAttributeComponent component, ComponentInit args) + { + if (!TryComp(uid, out var whitelist)) + return; + + if (whitelist.Tall && component.Tall) + { + Scale(uid, component, whitelist.TallScale, whitelist.TallDensity); + PseudoItem(uid, component, whitelist.TallPseudoItem); + } + else if (whitelist.Short && component.Short) + { + Scale(uid, component, whitelist.ShortScale, whitelist.ShortDensity); + PseudoItem(uid, component, whitelist.ShortPseudoItem); + } + } + + private void PseudoItem(EntityUid uid, SizeAttributeComponent component, bool active) + { + if (active) + { + if (TryComp(uid, out var pseudoI)) + return; + + _entityManager.AddComponent(uid); + } + else + { + if (!TryComp(uid, out var pseudoI)) + return; + + _entityManager.RemoveComponent(uid); + } + } + + private void Scale(EntityUid uid, SizeAttributeComponent component, float scale, float density) + { + if (scale <= 0f && density <= 0f) + return; + + _entityManager.EnsureComponent(uid); + + var appearanceComponent = _entityManager.EnsureComponent(uid); + if (!_appearance.TryGetData(uid, ScaleVisuals.Scale, out var oldScale, appearanceComponent)) + oldScale = Vector2.One; + + _appearance.SetData(uid, ScaleVisuals.Scale, oldScale * scale, appearanceComponent); + + if (_entityManager.TryGetComponent(uid, out FixturesComponent? manager)) + { + foreach (var (id, fixture) in manager.Fixtures) + { + switch (fixture.Shape) + { + case PhysShapeCircle circle: + _physics.SetPositionRadius(uid, id, fixture, circle, circle.Position * scale, circle.Radius * scale, manager); + break; + default: + throw new NotImplementedException(); + } + + _physics.SetDensity(uid, id, fixture, density); + } + } + } + } + + [ByRefEvent] + public readonly record struct ScaleEntityEvent(EntityUid Uid) { } +} diff --git a/Content.Server/_NF/SizeAttribute/SizeAttributeWhitelistComponent.cs b/Content.Server/_NF/SizeAttribute/SizeAttributeWhitelistComponent.cs new file mode 100644 index 00000000000..34f2ed6a044 --- /dev/null +++ b/Content.Server/_NF/SizeAttribute/SizeAttributeWhitelistComponent.cs @@ -0,0 +1,34 @@ +using Robust.Shared.Physics.Collision.Shapes; + +namespace Content.Server.SizeAttribute +{ + [RegisterComponent] + public sealed partial class SizeAttributeWhitelistComponent : Component + { + // Short + [DataField("short")] + public bool Short = false; + + [DataField("shortscale")] + public float ShortScale = 0f; + + [DataField("shortDensity")] + public float ShortDensity = 0f; + + [DataField("shortPseudoItem")] + public bool ShortPseudoItem = false; + + // Tall + [DataField("tall")] + public bool Tall = false; + + [DataField("tallscale")] + public float TallScale = 0f; + + [DataField("tallDensity")] + public float TallDensity = 0f; + + [DataField("tallPseudoItem")] + public bool TallPseudoItem = false; + } +} diff --git a/Content.Shared/Cuffs/Components/HandcuffComponent.cs b/Content.Shared/Cuffs/Components/HandcuffComponent.cs index b43bf18bf8f..b5f3ca337c6 100644 --- a/Content.Shared/Cuffs/Components/HandcuffComponent.cs +++ b/Content.Shared/Cuffs/Components/HandcuffComponent.cs @@ -9,6 +9,12 @@ namespace Content.Shared.Cuffs.Components; [Access(typeof(SharedCuffableSystem))] public sealed partial class HandcuffComponent : Component { + /// + /// Whether or not the entity can rot when cuffed (for spooder cocoon) + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public bool NoRot = false; + /// /// The time it takes to cuff an entity. /// diff --git a/Content.Shared/_NF/ArachnidChaos/ArachnidChaosDoAfterEvent.cs b/Content.Shared/_NF/ArachnidChaos/ArachnidChaosDoAfterEvent.cs new file mode 100644 index 00000000000..df106f2e773 --- /dev/null +++ b/Content.Shared/_NF/ArachnidChaos/ArachnidChaosDoAfterEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.ArachnidChaos; + +[Serializable, NetSerializable] +public sealed partial class ArachnidChaosDoAfterEvent : SimpleDoAfterEvent +{ +} diff --git a/Resources/Audio/_NF/Vulpikanin/scream1.ogg b/Resources/Audio/_NF/Vulpikanin/scream1.ogg new file mode 100644 index 00000000000..8c5cf335a4a Binary files /dev/null and b/Resources/Audio/_NF/Vulpikanin/scream1.ogg differ diff --git a/Resources/Audio/_NF/Vulpikanin/scream2.ogg b/Resources/Audio/_NF/Vulpikanin/scream2.ogg new file mode 100644 index 00000000000..0ff2ac25ce4 Binary files /dev/null and b/Resources/Audio/_NF/Vulpikanin/scream2.ogg differ diff --git a/Resources/Locale/en-US/_NF/ArachnidChaos.ftl b/Resources/Locale/en-US/_NF/ArachnidChaos.ftl new file mode 100644 index 00000000000..bb582c88c24 --- /dev/null +++ b/Resources/Locale/en-US/_NF/ArachnidChaos.ftl @@ -0,0 +1,4 @@ +action-name-spider-bite = Bite for blood +no-blood-warning = There no blood! +no-good-blood = You cant drink this blood! +spider-biting = {THE($UsernameName)} start biting {THE($targetName)} for his blood! diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index 02cbd973647..fb45acbe147 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -73,3 +73,8 @@ fence-rattle-success = *rattle* hugging-success-generic = You hug {THE($target)}. hugging-success-generic-others = { CAPITALIZE(THE($user)) } hugs {THE($target)}. hugging-success-generic-target = { CAPITALIZE(THE($user)) } hugs you. + +## Patting players +pat-success-generic = You pet {THE($target)} soft fluffy head. +pat-success-generic-others = { CAPITALIZE(THE($user)) } pets {THE($target)} soft fluffy head. +pat-success-generic-target = { CAPITALIZE(THE($user)) } pets your soft fluffy head. diff --git a/Resources/Prototypes/Actions/spider.yml b/Resources/Prototypes/Actions/spider.yml index 14b9fb6ccbb..9f42f11b2bf 100644 --- a/Resources/Prototypes/Actions/spider.yml +++ b/Resources/Prototypes/Actions/spider.yml @@ -7,7 +7,7 @@ - type: InstantAction icon: Interface/Actions/web.png event: !type:SpiderWebActionEvent - useDelay: 25 + useDelay: 30 - type: entity id: ActionSericulture diff --git a/Resources/Prototypes/Body/Organs/arachnid.yml b/Resources/Prototypes/Body/Organs/arachnid.yml index b4eb11b623b..958bdcda381 100644 --- a/Resources/Prototypes/Body/Organs/arachnid.yml +++ b/Resources/Prototypes/Body/Organs/arachnid.yml @@ -35,6 +35,12 @@ sprite: Mobs/Species/Arachnid/organs.rsi state: stomach - type: Stomach + specialDigestible: + tags: + - Fruit + - Pill + - BloodFood + - Soup updateInterval: 1.5 - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Body/Organs/moth.yml b/Resources/Prototypes/Body/Organs/moth.yml index b5244ddbe7e..fda0df49077 100644 --- a/Resources/Prototypes/Body/Organs/moth.yml +++ b/Resources/Prototypes/Body/Organs/moth.yml @@ -4,9 +4,11 @@ noSpawn: true components: - type: Stomach - # specialDigestible: - # tags: - # - ClothMade + specialDigestible: + tags: + - MothFood + - Fruit + - Pill - type: SolutionContainerManager solutions: stomach: @@ -26,4 +28,4 @@ - id: Medicine - id: Poison - id: Narcotic - - id: Alcohol \ No newline at end of file + - id: Alcohol diff --git a/Resources/Prototypes/Body/Organs/reptilian.yml b/Resources/Prototypes/Body/Organs/reptilian.yml index b2233a92070..2d2b09fb852 100644 --- a/Resources/Prototypes/Body/Organs/reptilian.yml +++ b/Resources/Prototypes/Body/Organs/reptilian.yml @@ -9,6 +9,8 @@ - Fruit - Meat - Pill + - Egg + - Bread - type: SolutionContainerManager solutions: stomach: diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/emergency.yml b/Resources/Prototypes/Catalog/Fills/Boxes/emergency.yml index 65fa55e84cf..c8569879b50 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/emergency.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/emergency.yml @@ -11,7 +11,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: Flare - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Sprite layers: @@ -31,7 +31,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: Flare - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Sprite layers: @@ -53,7 +53,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: Flare - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Sprite layers: @@ -75,7 +75,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: EmergencyMedipen - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Sprite layers: @@ -96,7 +96,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: Flare - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Sprite layers: @@ -122,7 +122,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: Flare - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Tag tags: @@ -141,7 +141,7 @@ - id: SpaceMedipen - id: EmergencyMedipen - id: Flare - - id: FoodTinMRE + - id: FoodPSB - id: EncryptionKeyTraffic # Frontier - type: Sprite layers: diff --git a/Resources/Prototypes/Chemistry/metabolizer_types.yml b/Resources/Prototypes/Chemistry/metabolizer_types.yml index a3507977ad2..00b7a65580d 100644 --- a/Resources/Prototypes/Chemistry/metabolizer_types.yml +++ b/Resources/Prototypes/Chemistry/metabolizer_types.yml @@ -36,3 +36,7 @@ - type: metabolizerType id: Moth name: moth + +- type: metabolizerType + id: Reptilian + name: reptilian diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index dcd152a0517..27bb1c4272c 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -125,20 +125,19 @@ id: Scale # Skin tougher, bones weaker, strong stomachs, cold-blooded (kindof) coefficients: Cold: 1.3 - Heat: 0.7 + Heat: 0.8 - type: damageModifierSet id: Diona coefficients: Blunt: 0.7 - Slash: 0.8 - Heat: 1.5 - Shock: 1.2 + Slash: 0.7 + Heat: 1.4 - type: damageModifierSet id: Moth # Slightly worse at everything but cold coefficients: - Cold: 0.7 + Cold: 0.8 Heat: 1.3 - type: damageModifierSet diff --git a/Resources/Prototypes/DeltaV/Body/Organs/vulpkanin.yml b/Resources/Prototypes/DeltaV/Body/Organs/vulpkanin.yml index b6708e3a58c..5a648a9e2cf 100644 --- a/Resources/Prototypes/DeltaV/Body/Organs/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Body/Organs/vulpkanin.yml @@ -4,7 +4,19 @@ noSpawn: true components: - type: Stomach + specialDigestible: + tags: + - Fruit + - Meat + - Pill + - Egg + - Bread - type: SolutionContainerManager solutions: stomach: maxVol: 50 + food: + maxVol: 5 + reagents: + - ReagentId: UncookedAnimalProteins + Quantity: 5 diff --git a/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml b/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml index c449cccfb81..a1ac59ede9d 100644 --- a/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Body/Parts/vulpkanin.yml @@ -2,189 +2,128 @@ # TODO BODY: Part damage - type: entity id: PartVulpkanin - parent: BaseItem + parent: [BaseItem, BasePart] name: "vulpkanin body part" abstract: true components: - - type: Damageable - damageContainer: Biological - - type: BodyPart - - type: ContainerContainer - containers: - bodypart: !type:Container - ents: [] - - type: Tag - tags: - - Trash + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 3 + - ReagentId: Blood + Quantity: 10 - type: entity id: TorsoVulpkanin name: "vulpkanin torso" - parent: PartVulpkanin + parent: [PartVulpkanin, BaseTorso] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "torso_m" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "torso_m" - - type: BodyPart - partType: Torso + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 10 + - ReagentId: Blood + Quantity: 20 - type: entity id: HeadVulpkanin name: "vulpkanin head" - parent: PartVulpkanin + parent: [PartVulpkanin, BaseHead] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "head_m" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "head_m" - - type: BodyPart - partType: Head - vital: true - - type: Input - context: "ghost" - - type: InputMover - - type: GhostOnMove - - type: Tag - tags: - - Head + - type: Extractable + juiceSolution: + reagents: + - ReagentId: Fat + Quantity: 5 + - ReagentId: Blood + Quantity: 10 - type: entity id: LeftArmVulpkanin name: "left vulpkanin arm" - parent: PartVulpkanin + parent: [PartVulpkanin, BaseLeftArm] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "l_arm" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "l_arm" - - type: BodyPart - partType: Arm - symmetry: Left - type: entity id: RightArmVulpkanin name: "right vulpkanin arm" - parent: PartVulpkanin + parent: [PartVulpkanin, BaseRightArm] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "r_arm" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "r_arm" - - type: BodyPart - partType: Arm - symmetry: Right - type: entity id: LeftHandVulpkanin - name: "left vulpkanin hand" - parent: PartVulpkanin + name: "left vulpkanin handpaw" + parent: [PartVulpkanin, BaseLeftHand] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "l_hand" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "l_hand" - - type: BodyPart - partType: Hand - symmetry: Left - type: entity id: RightHandVulpkanin - name: "right vulpkanin hand" - parent: PartVulpkanin + name: "right vulpkanin handpaw" + parent: [PartVulpkanin, BaseRightHand] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "r_hand" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "r_hand" - - type: BodyPart - partType: Hand - symmetry: Right - type: entity id: LeftLegVulpkanin name: "left vulpkanin leg" - parent: PartVulpkanin + parent: [PartVulpkanin, BaseLeftLeg] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "l_leg" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "l_leg" - - type: BodyPart - partType: Leg - symmetry: Left - - type: MovementBodyPart - walkSpeed : 2.6 - sprintSpeed : 4.8 - type: entity id: RightLegVulpkanin name: "right vulpkanin leg" - parent: PartVulpkanin + parent: [PartVulpkanin, BaseRightLeg] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "r_leg" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "r_leg" - - type: BodyPart - partType: Leg - symmetry: Right - - type: MovementBodyPart - walkSpeed : 2.6 - sprintSpeed : 4.8 - type: entity id: LeftFootVulpkanin - name: "left vulpkanin foot" - parent: PartVulpkanin + name: "left vulpkanin paw" + parent: [PartVulpkanin, BaseLeftFoot] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "l_foot" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "l_foot" - - type: BodyPart - partType: Foot - symmetry: Left - type: entity id: RightFootVulpkanin - name: "right vulpkanin foot" - parent: PartVulpkanin + name: "right vulpkanin paw" + parent: [PartVulpkanin, BaseRightFoot] components: - type: Sprite netsync: false sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: "r_foot" - - type: Icon - sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi - state: "r_foot" - - type: BodyPart - partType: Foot - symmetry: Right diff --git a/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml b/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml index 35242a12614..3df356598e2 100644 --- a/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml +++ b/Resources/Prototypes/DeltaV/Damage/modifier_sets.yml @@ -1,5 +1,6 @@ - type: damageModifierSet id: Vulps coefficients: - Cold: 0.5 + Cold: 0.8 + Heat: 1.3 Poison: 0.9 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index 1cda9bedf89..958a5d13c8a 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -7,9 +7,9 @@ - type: CombatMode - type: InteractionPopup successChance: 1 - interactSuccessString: hugging-success-generic + interactSuccessString: pat-success-generic interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others + messagePerceivedByOthers: pat-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml index dfdaa9a31c4..0cde00041c0 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Species/vulpkanin.yml @@ -7,15 +7,13 @@ components: - type: HumanoidAppearance species: Vulpkanin + - type: Carriable # Carrying system from nyanotrasen. - type: Hunger - baseDecayRate: 0.06 starvationDamage: types: Cold: 0.05 Bloodloss: 0.1 - - type: Carriable # Carrying system from nyanotrasen. - type: Thirst - baseDecayRate: 0.0125 - type: Icon sprite: DeltaV/Mobs/Species/Vulpkanin/parts.rsi state: full @@ -25,6 +23,11 @@ - type: VulpLanguageSpeaker - type: VulpLangaugeListener - type: VulpGiveTranslator + - type: SizeAttributeWhitelist + short: true + shortscale: 0.8 + shortDensity: 140 + shortPseudoItem: true - type: Speech speechSounds: Vulpkanin speechVerb: Vulpkanin @@ -84,9 +87,21 @@ - type: Damageable damageContainer: Biological damageModifierSet: Vulps + - type: MeleeWeapon + soundHit: + path: /Audio/Weapons/slash.ogg + angle: 30 + animation: WeaponArcClaw + damage: + types: + Slash: 4 + Blunt: 1 + - type: InteractionPopup + successChance: 1 + interactSuccessString: pat-success-generic + interactSuccessSound: /Audio/Effects/thudswoosh.ogg + messagePerceivedByOthers: pat-success-generic-others - type: Perishable - - type: TemperatureProtection - coefficient: 0.1 - type: Temperature heatDamageThreshold: 335 coldDamageThreshold: 200 @@ -100,7 +115,6 @@ types: Heat: 1.5 # Rip Fur - - type: entity save: false name: Vulpkanin Dummy diff --git a/Resources/Prototypes/DeltaV/SoundCollections/vulpkanin.yml b/Resources/Prototypes/DeltaV/SoundCollections/vulpkanin.yml index e37edb26a6b..1ee85a69132 100644 --- a/Resources/Prototypes/DeltaV/SoundCollections/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/SoundCollections/vulpkanin.yml @@ -13,4 +13,10 @@ - type: soundCollection id: VulpkaninHowl files: - - /Audio/_NF/Vulpikanin/howl.ogg \ No newline at end of file + - /Audio/_NF/Vulpikanin/howl.ogg + +- type: soundCollection + id: VulpkaninScreams + files: + - /Audio/_NF/Vulpikanin/scream1.ogg + - /Audio/_NF/Vulpikanin/scream2.ogg diff --git a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml index 3fbfbd002fa..5b807620c55 100644 --- a/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/DeltaV/Voice/speech_emote_sounds.yml @@ -4,7 +4,7 @@ variation: 0.125 sounds: Scream: - collection: MaleScreams + collection: VulpkaninScreams Laugh: collection: MaleLaugh Growl: @@ -20,7 +20,7 @@ variation: 0.125 sounds: Scream: - collection: FemaleScreams + collection: VulpkaninScreams Laugh: collection: FemaleLaugh Growl: diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 10fbaeb2fc9..78f9ed01067 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -22,20 +22,15 @@ # Damage (Self) - type: Bloodstream bloodReagent: SpiderBlood # would be cool if they had to drink copper instead of iron but that might just be more bloat to deal with. - # Damage (Others) - - type: MeleeWeapon - animation: WeaponArcClaw - soundHit: - collection: AlienClaw - damage: - types: # Realisically this is more like 5 slash - Slash: 4 # Fun - type: Sericulture action: ActionSericulture productionLength: 3 entityProduced: MaterialWebSilk1 hungerCost: 9 # Should total to 12 total silk on full hunger + - type: ArachnidChaos + - type: Spider + - type: IgnoreSpiderWeb - type: Perishable - type: Butcherable butcheringType: Spike diff --git a/Resources/Prototypes/Entities/Mobs/Species/diona.yml b/Resources/Prototypes/Entities/Mobs/Species/diona.yml index 499a4b49eba..f0127179434 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/diona.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/diona.yml @@ -99,6 +99,9 @@ - type: BodyEmotes soundsId: DionaBodyEmotes - type: IgnoreKudzu + - type: Tag + tags: + - ShoesRequiredStepTriggerImmune - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index 5da1bb6fc65..f9fa619b37d 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -23,6 +23,8 @@ prototype: Reptilian requiredLegs: 2 - type: Perishable + - type: Inventory + speciesId: reptilian - type: Butcherable butcheringType: Spike spawned: @@ -40,14 +42,19 @@ - type: Damageable damageContainer: Biological damageModifierSet: Scale + - type: SizeAttributeWhitelist + tall: true + tallscale: 1.2 + tallDensity: 220 - type: MeleeWeapon soundHit: - path: /Audio/Weapons/pierce.ogg + path: /Audio/Weapons/slash.ogg angle: 30 - animation: WeaponArcPunch + animation: WeaponArcClaw damage: types: - Piercing: 5 + Slash: 4 + Blunt: 1 - type: Temperature heatDamageThreshold: 400 coldDamageThreshold: 285 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index 6ba829f665f..a2ea163558c 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -174,6 +174,7 @@ - type: Tag tags: - Nugget + - Meat - type: Sprite sprite: Objects/Consumable/Food/Baked/nuggets.rsi layers: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index 6439b2eb6c5..511921aae04 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -184,7 +184,7 @@ - type: Produce seedId: deathNettle - type: MeleeChemicalInjector - transferAmount: 6 + transferAmount: 6 solution: food pierceArmor: true # We do a little trolling - type: Extractable @@ -222,7 +222,7 @@ - type: Tag tags: - Fruit - + - type: entity name: mimana parent: FoodProduceBase @@ -314,7 +314,7 @@ state: peel - type: Item sprite: Objects/Specific/Hydroponics/mimana.rsi - heldPrefix: peel + heldPrefix: peel - type: Slippery slipSound: path: /Audio/Effects/slip.ogg @@ -699,6 +699,7 @@ - type: Tag tags: - Fruit # Fuck you they're a fruit + - BloodFood - type: entity name: eggplant @@ -1237,7 +1238,7 @@ - type: Tag tags: - Galaxythistle - - Fruit # Probably? + - Fruit # Probably? - type: entity name: fly amanita diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml index 25af1325ab8..f5b4a5e87b4 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/snacks.yml @@ -390,6 +390,12 @@ size: 10 - type: Sprite state: nutribrick-open + - type: Tag + tags: + - FoodSnack + - MothFood + - BloodFood + - Meat - type: Food - type: SolutionContainerManager solutions: @@ -411,6 +417,9 @@ - type: Tag tags: - FoodSnack + - MothFood + - BloodFood + - Meat - type: SpawnItemsOnUse items: - id: FoodPacketMRETrash diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index c1908971f9f..46f00d5ca38 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -398,7 +398,7 @@ Quantity: 5 - type: Tag tags: - - ClothMade + - MothFood - DroneUsable - RawMaterial diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml index 0cba7656cb3..8ae1a7ca800 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml @@ -7,6 +7,9 @@ snap: - Wall components: + - type: Construction + graph: WebStructures + node: spiderweb - type: MeleeSound soundGroups: Brute: @@ -40,7 +43,7 @@ layer: - MidImpassable - type: Damageable - damageModifierSet: Wood + damageModifierSet: Web - type: Destructible thresholds: - trigger: @@ -132,7 +135,7 @@ mask: - ItemMask - type: Damageable - damageModifierSet: Wood + damageModifierSet: Web - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index b2752f36348..d28303c4ff0 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -205,7 +205,19 @@ components: - type: Tag tags: + - BloodFood - Bloodpack + - type: Food + requiresSpecialDigestion: true + - type: SolutionContainerManager + solutions: + food: + maxVol: 5 + reagents: + - ReagentId: Nutriment + Quantity: 5 + - ReagentId: Fat + Quantity: 5 - type: Sprite state: bloodpack - type: Healing diff --git a/Resources/Prototypes/Entities/Structures/Furniture/beds.yml b/Resources/Prototypes/Entities/Structures/Furniture/beds.yml index 83e043334cb..44065215f90 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/beds.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/beds.yml @@ -153,3 +153,16 @@ - type: Construction graph: WebStructures node: bed + +- type: entity + parent: WebBed + id: WebNest + name: web nest + description: You got webbed. + components: + - type: Sprite + sprite: Structures/Web/nest.rsi + state: icon + - type: Construction + graph: WebStructures + node: nest diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index 367ffa0894b..3dbadeda5ff 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -218,6 +218,9 @@ - !type:OrganType type: Rat shouldHave: false + - !type:OrganType + type: Plant + shouldHave: false - !type:ReagentThreshold reagent: Miasma min: 0.8 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/web.yml b/Resources/Prototypes/Recipes/Construction/Graphs/web.yml index 4eb368f5ab7..3576d2ccd17 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/web.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/web.yml @@ -60,6 +60,15 @@ amount: 8 doAfter: 6 + - to: nest + completed: + - !type:SnapToGrid + southRotation: true + steps: + - material: WebSilk + amount: 6 + doAfter: 3 + # Deconstruction is down here - node: wall @@ -133,3 +142,15 @@ steps: - tool: Cutting doAfter: 3 + + - node: nest + entity: WebNest + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWebSilk1 + amount: 5 + steps: + - tool: Cutting + doAfter: 2 diff --git a/Resources/Prototypes/Recipes/Construction/web.yml b/Resources/Prototypes/Recipes/Construction/web.yml index 2d61ac15158..7804ae894bd 100644 --- a/Resources/Prototypes/Recipes/Construction/web.yml +++ b/Resources/Prototypes/Recipes/Construction/web.yml @@ -99,3 +99,21 @@ canBuildInImpassable: false conditions: - !type:TileNotBlocked + +- type: construction + name: web nest + id: WebNest + graph: WebStructures + startNode: start + targetNode: nest + category: construction-category-furniture + description: Fun fact, you eating spiders in your sleep is false. + icon: + sprite: Structures/Web/nest.rsi + state: icon + objectType: Structure + placementMode: SnapgridCenter + canRotate: false + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml index 2bde191cdb2..d8a37299651 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/web.yml @@ -36,6 +36,12 @@ amount: 4 doAfter: 6 + - to: cocoon + steps: + - material: WebSilk + amount: 8 + doAfter: 6 + # Deconstruction - node: tile entity: FloorTileItemWeb @@ -51,3 +57,6 @@ - node: cloth entity: MaterialCloth1 + + - node: cocoon + entity: WebCocoon diff --git a/Resources/Prototypes/Recipes/Crafting/web.yml b/Resources/Prototypes/Recipes/Crafting/web.yml index 0cd8b22c0ac..3b17f832084 100644 --- a/Resources/Prototypes/Recipes/Crafting/web.yml +++ b/Resources/Prototypes/Recipes/Crafting/web.yml @@ -62,3 +62,16 @@ sprite: Objects/Materials/materials.rsi state: cloth_3 objectType: Item + +- type: construction + name: web cocoon + id: WebCocoon + graph: WebObjects + startNode: start + targetNode: cocoon + category: construction-category-clothing + description: "Strong web cocoon used to restrain criminal or preys, its also prevent rotting." + icon: + sprite: Clothing/OuterClothing/Misc/webcocoon.rsi + state: cocoon + objectType: Item diff --git a/Resources/Prototypes/_NF/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/_NF/Entities/Objects/Consumable/Food/produce.yml index 52d162b66e1..9ab84a26dc1 100644 --- a/Resources/Prototypes/_NF/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/_NF/Entities/Objects/Consumable/Food/produce.yml @@ -20,3 +20,6 @@ sprite: _NF/Objects/Specific/Hydroponics/pear.rsi - type: Produce seedId: pear + - type: Tag + tags: + - Fruit diff --git a/Resources/Prototypes/_NF/Entities/Objects/Misc/handcuffs.yml b/Resources/Prototypes/_NF/Entities/Objects/Misc/handcuffs.yml new file mode 100644 index 00000000000..7f1adc89a7e --- /dev/null +++ b/Resources/Prototypes/_NF/Entities/Objects/Misc/handcuffs.yml @@ -0,0 +1,28 @@ +- type: entity + name: web cocoon + description: Strong web cocoon used to restrain criminal or preys, its also prevent rotting. + id: WebCocoon + parent: ClothingOuterStraightjacket + components: + - type: Handcuff + noRot: true + cuffedRSI: Clothing/OuterClothing/Misc/webcocoon.rsi + bodyIconState: body-overlay + breakOnRemove: true + brokenPrototype: MaterialWebSilk1 + startCuffSound: + path: /Audio/Items/Handcuffs/rope_start.ogg + endCuffSound: + path: /Audio/Items/Handcuffs/rope_end.ogg + startUncuffSound: + path: /Audio/Items/Handcuffs/rope_start.ogg + endUncuffSound: + path: /Audio/Items/Handcuffs/rope_breakout.ogg + startBreakoutSound: + path: /Audio/Items/Handcuffs/rope_takeoff.ogg + - type: Construction + graph: WebObjects + node: cocoon + - type: Sprite + sprite: Clothing/OuterClothing/Misc/webcocoon.rsi + state: cocoon diff --git a/Resources/Prototypes/_NF/Recipes/Crafting/Cooking/moth_recipes.yml b/Resources/Prototypes/_NF/Recipes/Crafting/Cooking/moth_recipes.yml new file mode 100644 index 00000000000..e076d959977 --- /dev/null +++ b/Resources/Prototypes/_NF/Recipes/Crafting/Cooking/moth_recipes.yml @@ -0,0 +1,48 @@ +- type: microwaveMealRecipe + id: RecipeFoodMothPizzaCotton + name: cotton pizza recipe + result: FoodMothPizzaCotton + time: 30 + solids: + FoodDoughFlat: 1 + FoodCheeseSlice: 1 + MaterialCloth1: 1 + +- type: microwaveMealRecipe + id: RecipeMothMothmallow + name: mothmallow recipe + result: FoodMothMothmallow + time: 10 + reagents: + Sugar: 10 + Rum: 5 + MilkSoy: 5 + solids: + FoodSoybeans: 1 + +- type: microwaveMealRecipe + id: RecipeMothMoffin + name: moffin recipe + result: FoodMothMoffin + time: 5 + reagents: + Flour: 5 + Milk: 5 + Egg: 6 + solids: + MaterialCloth1: 1 + +- type: microwaveMealRecipe + id: RecipeMothCottonSoup + name: cotton soup recipe + result: FoodMothCottonSoup + time: 10 + reagents: + Water: 10 + solids: + FoodBowlBig: 1 + FoodEggplant: 1 + FoodOnion: 1 + FoodCarrot: 1 + FoodMothBakedCorn: 1 + MaterialCotton1: 1 diff --git a/Resources/Prototypes/_NF/Traits/sizeattribute.yml b/Resources/Prototypes/_NF/Traits/sizeattribute.yml new file mode 100644 index 00000000000..3dfa3f5152c --- /dev/null +++ b/Resources/Prototypes/_NF/Traits/sizeattribute.yml @@ -0,0 +1,25 @@ +- type: trait + id: Tall + name: Tall + whitelist: + components: + - SizeAttributeWhitelist + blacklist: + components: + - SizeAttribute + components: + - type: SizeAttribute + tall: true + +- type: trait + id: Short + name: Short + whitelist: + components: + - SizeAttributeWhitelist + blacklist: + components: + - SizeAttribute + components: + - type: SizeAttribute + short: true diff --git a/Resources/Prototypes/_Nyano/Body/Prototypes/felinid.yml b/Resources/Prototypes/_Nyano/Body/Prototypes/felinid.yml index f0c98ff83ef..9ca70228667 100644 --- a/Resources/Prototypes/_Nyano/Body/Prototypes/felinid.yml +++ b/Resources/Prototypes/_Nyano/Body/Prototypes/felinid.yml @@ -18,10 +18,10 @@ - left leg - right leg organs: - heart: OrganAnimalHeart + heart: OrganHumanHeart lungs: OrganHumanLungs - stomach: OrganReptilianStomach - liver: OrganAnimalLiver + stomach: OrganAnimalStomach + liver: OrganAnimalLiver kidneys: OrganHumanKidneys right arm: part: RightArmHuman diff --git a/Resources/Prototypes/_Nyano/Entities/Mobs/Species/felinid.yml b/Resources/Prototypes/_Nyano/Entities/Mobs/Species/felinid.yml index a11169e7d2f..3834f6abcc7 100644 --- a/Resources/Prototypes/_Nyano/Entities/Mobs/Species/felinid.yml +++ b/Resources/Prototypes/_Nyano/Entities/Mobs/Species/felinid.yml @@ -30,8 +30,8 @@ animation: WeaponArcClaw damage: types: - Blunt: 1 - Slash: 5 + Blunt: 3 + Slash: 2 - type: Thieving stealthy: true stripTimeReduction: 1 @@ -42,7 +42,11 @@ types: Blunt: 1 - type: Stamina - - type: PseudoItem + #- type: PseudoItem // Need to fix this. + - type: SizeAttributeWhitelist + tall: true + tallscale: 1 + tallDensity: 185 - type: Vocal wilhelm: "/Audio/Nyanotrasen/Voice/Felinid/cat_wilhelm.ogg" sounds: diff --git a/Resources/Prototypes/_Nyano/Entities/Mobs/Species/oni.yml b/Resources/Prototypes/_Nyano/Entities/Mobs/Species/oni.yml index 9a74fd95fe5..c84c737ca65 100644 --- a/Resources/Prototypes/_Nyano/Entities/Mobs/Species/oni.yml +++ b/Resources/Prototypes/_Nyano/Entities/Mobs/Species/oni.yml @@ -13,10 +13,10 @@ - type: Oni modifiers: coefficients: - Blunt: 1.35 + Blunt: 1.2 Slash: 1.2 Piercing: 1.2 - Asphyxiation: 1.35 + Asphyxiation: 1.2 - type: Damageable damageModifierSet: Oni - type: Body diff --git a/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/moth.yml b/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/moth.yml index 9371be3592c..71cfd936e18 100644 --- a/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/moth.yml +++ b/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/moth.yml @@ -540,6 +540,11 @@ Quantity: 6 - ReagentId: Water Quantity: 4 + - type: Tag + tags: + - MothFood + - type: Food + requiresSpecialDigestion: true #Tastes like cotton and broth - type: entity @@ -918,7 +923,7 @@ name: kachumbari salad parent: FoodBowlBase id: FoodMothKachumbariSalad - description: + description: components: - type: FlavorProfile flavors: @@ -1110,6 +1115,11 @@ - type: Sprite sprite: Nyanotrasen/Objects/Consumable/Food/moth.rsi state: pizza-cotton + - type: Tag + tags: + - MothFood + - type: Food + requiresSpecialDigestion: true - type: entity name: slice of cotton pizza @@ -1125,6 +1135,11 @@ - type: Sprite sprite: Nyanotrasen/Objects/Consumable/Food/moth.rsi state: pizza-cotton-slice + - type: Tag + tags: + - MothFood + - type: Food + requiresSpecialDigestion: true # Tastes like crust, cotton, cheese # Sweets @@ -1182,6 +1197,11 @@ Quantity: 10 - ReagentId: Sugar Quantity: 10 + - type: Tag + tags: + - MothFood + - type: Food + requiresSpecialDigestion: true #Tastes like vanilla and clouds. - type: entity @@ -1207,6 +1227,11 @@ Quantity: 4 - ReagentId: Sugar Quantity: 2 + - type: Tag + tags: + - MothFood + - type: Food + requiresSpecialDigestion: true #Tastes like vanilla and clouds. - type: entity @@ -1243,4 +1268,10 @@ Quantity: 5 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - MothFood + - type: Food + requiresSpecialDigestion: true + #Tastes like muffin, dust and lint diff --git a/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/ration.yml b/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/ration.yml index 1793080418f..0bf2ddd336d 100644 --- a/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/ration.yml +++ b/Resources/Prototypes/_Nyano/Entities/Objects/Consumable/Food/ration.yml @@ -69,6 +69,11 @@ reagents: - ReagentId: Nutriment Quantity: 15 + - type: Tag + tags: + - MothFood + - BloodFood + - Meat - type: entity name: soy sustenance bar @@ -195,4 +200,4 @@ - savory - type: Sprite state: psb-bar-wonka - - type: Item \ No newline at end of file + - type: Item diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 67a27be4160..991492cf86e 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -234,7 +234,7 @@ - type: Tag id: CanPilot - + - type: Tag id: CannonRestrict @@ -1094,3 +1094,9 @@ - type: Tag id: MindShield + +- type: Tag + id: BloodFood + +- type: Tag + id: MothFood diff --git a/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/meta.json index b69addc4760..025a1b39d66 100644 --- a/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/meta.json +++ b/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/meta.json @@ -17,6 +17,10 @@ "name": "off-equipped-HELMET", "directions": 4 }, + { + "name": "off-equipped-HELMET-vulpkanin", + "directions": 4 + }, { "name": "off-inhand-left", "directions": 4 @@ -29,6 +33,10 @@ "name": "on-equipped-HELMET", "directions": 4 }, + { + "name": "on-equipped-HELMET-vulpkanin", + "directions": 4 + }, { "name": "on-inhand-left", "directions": 4 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/off-equipped-HELMET-vulpkanin.png b/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/off-equipped-HELMET-vulpkanin.png new file mode 100644 index 00000000000..c9618bf4029 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/off-equipped-HELMET-vulpkanin.png differ diff --git a/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/on-equipped-HELMET-vulpkanin.png b/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/on-equipped-HELMET-vulpkanin.png new file mode 100644 index 00000000000..15467a15cf4 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Hardsuits/syndiemedic.rsi/on-equipped-HELMET-vulpkanin.png differ diff --git a/Resources/Textures/Clothing/Mask/clown.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/clown.rsi/equipped-MASK-reptilian.png new file mode 100644 index 00000000000..95e472532eb Binary files /dev/null and b/Resources/Textures/Clothing/Mask/clown.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/clown.rsi/meta.json b/Resources/Textures/Clothing/Mask/clown.rsi/meta.json index 715f16e7779..d8fb8d7a273 100644 --- a/Resources/Textures/Clothing/Mask/clown.rsi/meta.json +++ b/Resources/Textures/Clothing/Mask/clown.rsi/meta.json @@ -18,6 +18,10 @@ "name": "equipped-MASK-vulpkanin", "directions": 4 }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 + }, { "name": "equipped-MASK-hamster", "directions": 4 diff --git a/Resources/Textures/Clothing/Mask/mime.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/mime.rsi/equipped-MASK-reptilian.png new file mode 100644 index 00000000000..b88f5e0017e Binary files /dev/null and b/Resources/Textures/Clothing/Mask/mime.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/mime.rsi/meta.json b/Resources/Textures/Clothing/Mask/mime.rsi/meta.json index b38ed86dc2e..f078bcdb097 100644 --- a/Resources/Textures/Clothing/Mask/mime.rsi/meta.json +++ b/Resources/Textures/Clothing/Mask/mime.rsi/meta.json @@ -18,6 +18,10 @@ "name": "equipped-MASK-vulpkanin", "directions": 4 }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 + }, { "name": "equipped-MASK-hamster", "directions": 4 diff --git a/Resources/Textures/Clothing/Mask/sadmime.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/sadmime.rsi/equipped-MASK-reptilian.png new file mode 100644 index 00000000000..b88f5e0017e Binary files /dev/null and b/Resources/Textures/Clothing/Mask/sadmime.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/sadmime.rsi/meta.json b/Resources/Textures/Clothing/Mask/sadmime.rsi/meta.json index ded008adb13..c92372b7585 100644 --- a/Resources/Textures/Clothing/Mask/sadmime.rsi/meta.json +++ b/Resources/Textures/Clothing/Mask/sadmime.rsi/meta.json @@ -17,6 +17,10 @@ { "name": "equipped-MASK-vulpkanin", "directions": 4 + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 } ] } diff --git a/Resources/Textures/Clothing/Mask/scaredmime.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/scaredmime.rsi/equipped-MASK-reptilian.png new file mode 100644 index 00000000000..b88f5e0017e Binary files /dev/null and b/Resources/Textures/Clothing/Mask/scaredmime.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/scaredmime.rsi/meta.json b/Resources/Textures/Clothing/Mask/scaredmime.rsi/meta.json index ded008adb13..c92372b7585 100644 --- a/Resources/Textures/Clothing/Mask/scaredmime.rsi/meta.json +++ b/Resources/Textures/Clothing/Mask/scaredmime.rsi/meta.json @@ -17,6 +17,10 @@ { "name": "equipped-MASK-vulpkanin", "directions": 4 + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 } ] } diff --git a/Resources/Textures/Clothing/Mask/sexyclown.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/sexyclown.rsi/equipped-MASK-reptilian.png new file mode 100644 index 00000000000..f9e825bc2af Binary files /dev/null and b/Resources/Textures/Clothing/Mask/sexyclown.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/sexyclown.rsi/meta.json b/Resources/Textures/Clothing/Mask/sexyclown.rsi/meta.json index 91c3ad0d5a6..a4e4329799d 100644 --- a/Resources/Textures/Clothing/Mask/sexyclown.rsi/meta.json +++ b/Resources/Textures/Clothing/Mask/sexyclown.rsi/meta.json @@ -17,6 +17,10 @@ { "name": "equipped-MASK-vulpkanin", "directions": 4 - } + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 + } ] } diff --git a/Resources/Textures/Clothing/Mask/sexymime.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/sexymime.rsi/equipped-MASK-reptilian.png new file mode 100644 index 00000000000..62c881e5126 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/sexymime.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/sexymime.rsi/meta.json b/Resources/Textures/Clothing/Mask/sexymime.rsi/meta.json index 91c3ad0d5a6..1b25dccdf00 100644 --- a/Resources/Textures/Clothing/Mask/sexymime.rsi/meta.json +++ b/Resources/Textures/Clothing/Mask/sexymime.rsi/meta.json @@ -17,6 +17,10 @@ { "name": "equipped-MASK-vulpkanin", "directions": 4 + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 } ] } diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/body-overlay-2.png b/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/body-overlay-2.png new file mode 100644 index 00000000000..dc9448e2fcb Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/body-overlay-2.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/cocoon.png b/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/cocoon.png new file mode 100644 index 00000000000..4d4b07d7a92 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/cocoon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/meta.json new file mode 100644 index 00000000000..101fefc436a --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/Misc/webcocoon.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Heroman3003", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "cocoon" + }, + { + "name": "body-overlay-2", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Nyanotrasen/Icons/verbiconfangs.rsi/icon.png b/Resources/Textures/Nyanotrasen/Icons/verbiconfangs.rsi/icon.png new file mode 100644 index 00000000000..4511cbd21fd Binary files /dev/null and b/Resources/Textures/Nyanotrasen/Icons/verbiconfangs.rsi/icon.png differ diff --git a/Resources/Textures/Nyanotrasen/Icons/verbiconfangs.rsi/meta.json b/Resources/Textures/Nyanotrasen/Icons/verbiconfangs.rsi/meta.json new file mode 100644 index 00000000000..3c7af0079af --- /dev/null +++ b/Resources/Textures/Nyanotrasen/Icons/verbiconfangs.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "From Nyanotrasen", + "states": [ + { + "name": "icon" + } + ] +} diff --git a/Resources/Textures/Structures/Web/nest.rsi/icon.png b/Resources/Textures/Structures/Web/nest.rsi/icon.png new file mode 100644 index 00000000000..378e6af55b2 Binary files /dev/null and b/Resources/Textures/Structures/Web/nest.rsi/icon.png differ diff --git a/Resources/Textures/Structures/Web/nest.rsi/meta.json b/Resources/Textures/Structures/Web/nest.rsi/meta.json new file mode 100644 index 00000000000..5cde3e94233 --- /dev/null +++ b/Resources/Textures/Structures/Web/nest.rsi/meta.json @@ -0,0 +1,14 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Made by Heroman3003", + "states": [ + { + "name": "icon" + } + ] +}