From cd7843028bc52cea3cabd201bf92d0aa5fa181a6 Mon Sep 17 00:00:00 2001 From: Willhelm53 <97707302+Willhelm53@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:20:47 -0600 Subject: [PATCH] Pettable Animals (#6530) Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: mirrorcult --- Content.Client/Entry/IgnoredComponents.cs | 1 + Content.Client/Window/WindowComponent.cs | 11 --- .../Electrocution/ElectrocutionSystem.cs | 6 +- .../Components/InteractionPopupComponent.cs | 67 +++++++++++++++ .../Interaction/InteractionPopupSystem.cs | 72 +++++++++++++++++ Content.Server/Window/WindowComponent.cs | 24 ------ Content.Server/Window/WindowSystem.cs | 44 ---------- .../Conditions/EmptyOrWindowValidInTile.cs | 1 - .../Conditions/NoWindowsInTile.cs | 5 +- .../Window/SharedWindowComponent.cs | 10 --- Resources/Audio/Animals/cat_meow.ogg | Bin 0 -> 14151 bytes .../Audio/Animals/chicken_cluck_happy.ogg | Bin 0 -> 14542 bytes Resources/Audio/Animals/duck_quack_happy.ogg | Bin 0 -> 9282 bytes Resources/Audio/Animals/license.txt | 9 +++ .../Audio/Animals/small_dog_bark_happy.ogg | Bin 0 -> 13998 bytes .../interaction-popup-component.ftl | 34 ++++++++ .../Prototypes/Entities/Mobs/NPCs/animals.yml | 76 +++++++++++++++++- .../Prototypes/Entities/Mobs/NPCs/pets.yml | 61 ++++++++++++++ .../Entities/Structures/Windows/window.yml | 16 +++- Resources/Prototypes/tags.yml | 3 + 20 files changed, 343 insertions(+), 97 deletions(-) delete mode 100644 Content.Client/Window/WindowComponent.cs create mode 100644 Content.Server/Interaction/Components/InteractionPopupComponent.cs create mode 100644 Content.Server/Interaction/InteractionPopupSystem.cs delete mode 100644 Content.Server/Window/WindowComponent.cs delete mode 100644 Content.Server/Window/WindowSystem.cs delete mode 100644 Content.Shared/Window/SharedWindowComponent.cs create mode 100644 Resources/Audio/Animals/cat_meow.ogg create mode 100644 Resources/Audio/Animals/chicken_cluck_happy.ogg create mode 100644 Resources/Audio/Animals/duck_quack_happy.ogg create mode 100644 Resources/Audio/Animals/license.txt create mode 100644 Resources/Audio/Animals/small_dog_bark_happy.ogg create mode 100644 Resources/Locale/en-US/interaction/interaction-popup-component.ftl diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index 11f96b3c48..5c3711fe19 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -308,6 +308,7 @@ namespace Content.Client.Entry "RandomArtifactSprite", "EnergySword", "DoorRemote", + "InteractionPopup", }; } } diff --git a/Content.Client/Window/WindowComponent.cs b/Content.Client/Window/WindowComponent.cs deleted file mode 100644 index fdf936629b..0000000000 --- a/Content.Client/Window/WindowComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Shared.Window; -using Robust.Shared.GameObjects; - -namespace Content.Client.Window -{ - [RegisterComponent] - [ComponentReference(typeof(SharedWindowComponent))] - public class WindowComponent : SharedWindowComponent - { - } -} diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index a756043223..9f21653f46 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -8,7 +8,6 @@ using Content.Server.NodeContainer.Nodes; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Power.NodeGroups; -using Content.Server.Window; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.Database; @@ -21,6 +20,7 @@ using Content.Shared.Pulling.Components; using Content.Shared.Speech.EntitySystems; using Content.Shared.StatusEffect; using Content.Shared.Stunnable; +using Content.Shared.Tag; using Content.Shared.Weapons.Melee; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -166,12 +166,14 @@ namespace Content.Server.Electrocution if (!electrified.Enabled) return false; + var tagSystem = EntitySystem.Get(); + if (electrified.NoWindowInTile) { foreach (var entity in transform.Coordinates.GetEntitiesInTile( LookupFlags.Approximate | LookupFlags.IncludeAnchored, _entityLookup)) { - if (EntityManager.HasComponent(entity)) + if (tagSystem.HasTag(entity, "Window")) return false; } } diff --git a/Content.Server/Interaction/Components/InteractionPopupComponent.cs b/Content.Server/Interaction/Components/InteractionPopupComponent.cs new file mode 100644 index 0000000000..2df01a8641 --- /dev/null +++ b/Content.Server/Interaction/Components/InteractionPopupComponent.cs @@ -0,0 +1,67 @@ +using Content.Shared.Sound; + +namespace Content.Server.Interaction.Components; + +[RegisterComponent, Friend(typeof(InteractionPopupSystem))] + + public sealed class InteractionPopupComponent : Component + { + /// + /// Time delay between interactions to avoid spam. + /// + [DataField("interactDelay")] + [ViewVariables(VVAccess.ReadWrite)] + public TimeSpan InteractDelay = TimeSpan.FromSeconds(1.0); + + /// + /// String will be used to fetch the localized message to be played if the interaction succeeds. + /// Nullable in case none is specified on the yaml prototype. + /// + [DataField("interactSuccessString")] + public string? InteractSuccessString; + + /// + /// String will be used to fetch the localized message to be played if the interaction fails. + /// Nullable in case no message is specified on the yaml prototype. + /// + [DataField("interactFailureString")] + public string? InteractFailureString; + + /// + /// Sound effect to be played when the interaction succeeds. + /// Nullable in case no path is specified on the yaml prototype. + /// + [DataField("interactSuccessSound")] + public SoundSpecifier? InteractSuccessSound; + + /// + /// Sound effect to be played when the interaction fails. + /// Nullable in case no path is specified on the yaml prototype. + /// + [DataField("interactFailureSound")] + public SoundSpecifier? InteractFailureSound; + + /// + /// Chance that an interaction attempt will succeed. + /// 1 = always play "success" popup and sound. + /// 0.5 = 50% chance to play either success or failure popup and sound. + /// 0 = always play "failure" popup and sound. + /// + [DataField("successChance")] + public float SuccessChance = 1.0f; // Always succeed, unless specified otherwise on the yaml prototype. + + /// + /// Will the popup message be perceived by entities not involved in the interaction? + /// + [DataField("popupPerceivedByOthers")] + public bool PopupPerceivedByOthers = false; + + /// + /// Will the sound effect be perceived by entities not involved in the interaction? + /// + [DataField("soundPerceivedByOthers")] + public bool SoundPerceivedByOthers = true; + + [ViewVariables(VVAccess.ReadWrite)] + public TimeSpan LastInteractTime; + } diff --git a/Content.Server/Interaction/InteractionPopupSystem.cs b/Content.Server/Interaction/InteractionPopupSystem.cs new file mode 100644 index 0000000000..a01bf92a2a --- /dev/null +++ b/Content.Server/Interaction/InteractionPopupSystem.cs @@ -0,0 +1,72 @@ +using Content.Server.Popups; +using Content.Server.Interaction.Components; +using Content.Shared.Interaction; +using Content.Shared.MobState.Components; +using Robust.Shared.Audio; +using Robust.Shared.Player; +using Robust.Shared.Timing; +using Robust.Shared.Random; + + +namespace Content.Server.Interaction; + +public sealed class InteractionPopupSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnInteractHand); + } + + private void OnInteractHand(EntityUid uid, InteractionPopupComponent component, InteractHandEvent args) + { + if (args.Handled) + return; + + var curTime = _gameTiming.CurTime; + + if (curTime < component.LastInteractTime + component.InteractDelay) + return; + + if (TryComp(uid, out var state) // if it has a MobStateComponent, + && !state.IsAlive()) // AND if that state is not Alive (e.g. dead/incapacitated/critical) + return; + + string msg = ""; // Stores the text to be shown in the popup message + string sfx = ""; // Stores the filepath of the sound to be played + + if (_random.Prob(component.SuccessChance)) + { + if (component.InteractSuccessString != null) + msg = Loc.GetString(component.InteractSuccessString, ("target", uid)); // Success message (localized). + + if (component.InteractSuccessSound != null) + sfx = component.InteractSuccessSound.GetSound(); + } + else + { + if (component.InteractFailureString != null) + msg = Loc.GetString(component.InteractFailureString, ("target", uid)); // Failure message (localized). + + if (component.InteractFailureSound != null) + sfx = component.InteractFailureSound.GetSound(); + } + + if (component.PopupPerceivedByOthers) + _popupSystem.PopupEntity(msg, uid, Filter.Pvs(uid)); //play for everyone in range + else + _popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User)); //play only for the initiating entity. + + if (component.SoundPerceivedByOthers) + SoundSystem.Play(Filter.Pvs(args.Target), sfx, args.Target); //play for everyone in range + else + SoundSystem.Play(Filter.Entities(args.User, args.Target), sfx, args.Target); //play only for the initiating entity and its target. + + component.LastInteractTime = curTime; + args.Handled = true; + } +} diff --git a/Content.Server/Window/WindowComponent.cs b/Content.Server/Window/WindowComponent.cs deleted file mode 100644 index 44b5a3333f..0000000000 --- a/Content.Server/Window/WindowComponent.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using Content.Shared.Sound; -using Content.Shared.Window; -using Robust.Shared.GameObjects; -using Robust.Shared.Serialization.Manager.Attributes; -using Robust.Shared.ViewVariables; - -namespace Content.Server.Window -{ - [RegisterComponent] - [ComponentReference(typeof(SharedWindowComponent))] - public class WindowComponent : SharedWindowComponent - { - [DataField("knockDelay")] - [ViewVariables(VVAccess.ReadWrite)] - public TimeSpan KnockDelay = TimeSpan.FromSeconds(0.5); - - [DataField("knockSound")] - public SoundSpecifier KnockSound = new SoundPathSpecifier("/Audio/Effects/glass_knock.ogg"); - - [ViewVariables(VVAccess.ReadWrite)] - public TimeSpan LastKnockTime; - } -} diff --git a/Content.Server/Window/WindowSystem.cs b/Content.Server/Window/WindowSystem.cs deleted file mode 100644 index 290d52bcb0..0000000000 --- a/Content.Server/Window/WindowSystem.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Content.Server.Popups; -using Content.Shared.Audio; -using Content.Shared.Interaction; -using Robust.Shared.Audio; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Localization; -using Robust.Shared.Player; -using Robust.Shared.Timing; - -namespace Content.Server.Window; - -public class WindowSystem : EntitySystem -{ - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInteractHand); - } - - private void OnInteractHand(EntityUid uid, WindowComponent component, InteractHandEvent args) - { - if (args.Handled) - return; - - if (component.KnockDelay.TotalSeconds <= 0) - return; - - if (_gameTiming.CurTime < component.LastKnockTime + component.KnockDelay) - return; - - SoundSystem.Play(Filter.Pvs(args.Target), component.KnockSound.GetSound(), - Transform(args.Target).Coordinates, AudioHelpers.WithVariation(0.05f)); - - var msg = Loc.GetString("comp-window-knock"); - _popupSystem.PopupEntity(msg, uid, Filter.Pvs(uid)); - - component.LastKnockTime = _gameTiming.CurTime; - args.Handled = true; - } -} diff --git a/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs b/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs index 9e12089294..5c987db9f6 100644 --- a/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs +++ b/Content.Shared/Construction/Conditions/EmptyOrWindowValidInTile.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using Content.Shared.Maps; -using Content.Shared.Window; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; diff --git a/Content.Shared/Construction/Conditions/NoWindowsInTile.cs b/Content.Shared/Construction/Conditions/NoWindowsInTile.cs index a5f37f5aff..2174e18f7b 100644 --- a/Content.Shared/Construction/Conditions/NoWindowsInTile.cs +++ b/Content.Shared/Construction/Conditions/NoWindowsInTile.cs @@ -1,5 +1,5 @@ using Content.Shared.Maps; -using Content.Shared.Window; +using Content.Shared.Tag; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; @@ -15,9 +15,10 @@ namespace Content.Shared.Construction.Conditions { public bool Condition(EntityUid user, EntityCoordinates location, Direction direction) { + var tagSystem = EntitySystem.Get(); foreach (var entity in location.GetEntitiesInTile(LookupFlags.Approximate | LookupFlags.IncludeAnchored)) { - if (IoCManager.Resolve().HasComponent(entity)) + if (tagSystem.HasTag(entity, "Window")) return false; } diff --git a/Content.Shared/Window/SharedWindowComponent.cs b/Content.Shared/Window/SharedWindowComponent.cs deleted file mode 100644 index ae0ef6ee67..0000000000 --- a/Content.Shared/Window/SharedWindowComponent.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Robust.Shared.GameObjects; -using Robust.Shared.GameStates; - -namespace Content.Shared.Window -{ - [NetworkedComponent] - public class SharedWindowComponent : Component - { - } -} diff --git a/Resources/Audio/Animals/cat_meow.ogg b/Resources/Audio/Animals/cat_meow.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b65b6cd7ec16488b7405a2e13838b972b3643328 GIT binary patch literal 14151 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%0Adqt>#bt`~@Kt4t>p)iddBk!s&U!*! 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 LS=<9uI;{T#$~b8) literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl new file mode 100644 index 0000000000..fc278c1578 --- /dev/null +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -0,0 +1,34 @@ +### Interaction Popup component + +## Petting animals + +petting-success-generic = You pet {THE($target)} on {POSS-ADJ($target)} head. +petting-success-soft-floofy = You pet {THE($target)} on {POSS-ADJ($target)} soft floofy head. + +petting-success-bird = You pet {THE($target)} on {POSS-ADJ($target)} cute feathery head. +petting-success-cat = You pet {THE($target)} on {POSS-ADJ($target)} fuzzy little head. +petting-success-corrupted-corgi = In an act of hubris, you pet {THE($target)} on {POSS-ADJ($target)} cursed little head. +petting-success-crab = You pet {THE($target)} on {POSS-ADJ($target)} smooth little head. +petting-success-dog = You pet {THE($target)} on {POSS-ADJ($target)} soft floofy head. +petting-success-frog = You pet {THE($target)} on {POSS-ADJ($target)} slippery little head. +petting-success-goat = You pet {THE($target)} on {POSS-ADJ($target)} horned floofy head. +petting-success-goose = Against all odds, you manage to pet {THE($target)} on {POSS-ADJ($target)} horrible little head. +petting-success-reptile = You pet {THE($target)} on {POSS-ADJ($target)} scaly little head. +petting-success-sloth = You pet {THE($target)} on {POSS-ADJ($target)} slow moving head. +petting-success-space-cat = You pet {THE($target)} on {POSS-ADJ($target)} glass domed head. +petting-success-tarantula = You pet {THE($target)} on {POSS-ADJ($target)} hairy little head. + + +petting-failure-generic = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} aloof towards you. + +petting-failure-bat = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} too hard to catch! +petting-failure-corrupted-corgi = You reach out to pet {THE($target)}, but think better of it. +petting-failure-crab = You reach out to pet {THE($target)}, but {SUBJECT($target)} snaps {POSS-ADJ($target)} claws in your general direction! +petting-failure-goat = You reach out to pet {THE($target)}, but {SUBJECT($target)} stubbornly refuses! +petting-failure-goose = You reach out to pet {THE($target)}, but {SUBJECT($target)} {CONJUGATE-BE($target)} too horrible! +petting-failure-sloth = You reach out to pet {THE($target)}, but {SUBJECT($target)} somehow dodge with ludicrous speed! + +## Knocking on windows + +# Shown when knocking on a window +comp-window-knock = *knock knock* diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index e5f253bc9c..d573fefb12 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -39,6 +39,10 @@ - type: Butcherable meat: FoodMeat pieces: 1 + - type: InteractionPopup + successChance: 0.2 + interactSuccessString: petting-success-soft-floofy + interactFailureString: petting-failure-bat - type: entity name: bee @@ -130,6 +134,12 @@ - type: Butcherable meat: FoodMeatChicken pieces: 1 + - type: InteractionPopup + successChance: 0.8 + interactSuccessString: petting-success-bird + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/chicken_cluck_happy.ogg - type: entity name: mallard duck #Quack @@ -152,6 +162,12 @@ - type: Butcherable meat: FoodMeatDuck pieces: 1 + - type: InteractionPopup + successChance: 0.9 + interactSuccessString: petting-success-bird + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/duck_quack_happy.ogg - type: entity name: white duck #Quack @@ -174,6 +190,12 @@ - type: Butcherable meat: FoodMeatDuck pieces: 1 + - type: InteractionPopup + successChance: 0.9 + interactSuccessString: petting-success-bird + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/duck_quack_happy.ogg - type: entity name: brown duck #Quack @@ -196,6 +218,12 @@ - type: Butcherable meat: FoodMeatDuck pieces: 1 + - type: InteractionPopup + successChance: 0.9 + interactSuccessString: petting-success-bird + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/duck_quack_happy.ogg - type: entity name: butterfly @@ -295,6 +323,13 @@ - type: Butcherable meat: FoodMeat pieces: 5 + - type: Grammar + attributes: + gender: female # Here because of UdderComponent + - type: InteractionPopup + successChance: 0.7 + interactSuccessString: petting-success-soft-floofy + interactFailureString: petting-failure-generic - type: entity name: crab @@ -332,12 +367,16 @@ - type: Butcherable meat: FoodMeatCrab pieces: 2 + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-crab + interactFailureString: petting-failure-crab - type: entity name: goat parent: SimpleMobBase id: MobGoat - description: His spine consists of long sharp segments, no wonder he is so grumpy. + description: Her spine consists of long sharp segments, no wonder she is so grumpy. components: - type: Sprite drawdepth: Mobs @@ -366,6 +405,13 @@ - type: Butcherable meat: FoodMeat pieces: 4 + - type: Grammar + attributes: + gender: female # Here because of UdderComponent + - type: InteractionPopup + successChance: 0.2 + interactSuccessString: petting-success-goat + interactFailureString: petting-failure-goat # Note that we gotta make this bitch vomit someday when you feed it anthrax or sumthin. Needs to be a small item thief too and aggressive if attacked. - type: entity @@ -389,6 +435,10 @@ - type: Butcherable meat: FoodMeatChicken pieces: 2 + - type: InteractionPopup # TODO: Make it so there's a separate chance to make certain animals outright hostile towards you. + successChance: 0.1 # Yeah, good luck with that. + interactSuccessString: petting-success-goose + interactFailureString: petting-failure-goose - type: entity name: gorilla @@ -679,6 +729,10 @@ - type: Butcherable meat: FoodMeat pieces: 1 + - type: InteractionPopup + successChance: 0.3 + interactSuccessString: petting-success-reptile + interactFailureString: petting-failure-generic - type: entity name: frog @@ -718,6 +772,10 @@ - type: Butcherable meat: FoodMeat pieces: 1 + - type: InteractionPopup + successChance: 0.6 + interactSuccessString: petting-success-frog + interactFailureString: petting-failure-generic # Would be cool to have some functionality for the parrot to be able to sit on stuff - type: entity @@ -758,6 +816,10 @@ - type: Butcherable meat: FoodMeat pieces: 1 + - type: InteractionPopup + successChance: 0.6 + interactSuccessString: petting-success-bird + interactFailureString: petting-failure-generic - type: entity name: penguin @@ -794,6 +856,10 @@ - type: Butcherable meat: FoodMeatPenguin pieces: 3 + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-bird + interactFailureString: petting-failure-generic - type: entity name: snake @@ -833,6 +899,10 @@ - type: Butcherable meat: FoodMeat pieces: 1 + - type: InteractionPopup + successChance: 0.6 + interactSuccessString: petting-success-reptile + interactFailureString: petting-failure-generic # Code unique spider prototypes or combine them all into one spider and get a # random sprite state when you spawn it. @@ -871,3 +941,7 @@ - type: Butcherable meat: FoodMeatSpider pieces: 2 + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-tarantula + interactFailureString: petting-failure-generic diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 30341e30c8..a03912a5d1 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -38,6 +38,14 @@ pieces: 3 - type: ReplacementAccent accent: dog + - type: InteractionPopup + interactSuccessString: petting-success-dog + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/small_dog_bark_happy.ogg + - type: Grammar + attributes: + gender: epicene - type: entity name: corrupted corgi @@ -71,6 +79,13 @@ - type: AiFactionTag factions: - SimpleHostile + - type: InteractionPopup + successChance: 0 # Override the automatic success that would normally be inherited from MobCorgi. + interactSuccessString: petting-success-corrupted-corgi # Normally impossible but added an easter egg just in case. + interactFailureString: petting-failure-corrupted-corgi + - type: Grammar + attributes: + gender: epicene - type: entity name: Ian @@ -90,6 +105,10 @@ normal: ian crit: ian_dead dead: ian_dead + - type: Grammar + attributes: + proper: true + gender: male - type: entity name: Old Ian @@ -109,6 +128,10 @@ normal: old_ian crit: old_ian_dead dead: old_ian_dead + - type: Grammar + attributes: + proper: true + gender: male - type: entity name: Lisa @@ -128,6 +151,10 @@ normal: lisa crit: lisa_dead dead: lisa_dead + - type: Grammar + attributes: + proper: true + gender: female - type: entity name: corgi puppy @@ -147,6 +174,9 @@ normal: puppy crit: puppy_dead dead: puppy_dead + - type: Grammar + attributes: + gender: epicene - type: entity name: cat @@ -185,6 +215,15 @@ pieces: 2 - type: ReplacementAccent accent: cat + - type: InteractionPopup + successChance: 0.7 + interactSuccessString: petting-success-cat + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/cat_meow.ogg + - type: Grammar + attributes: + gender: epicene - type: entity name: calico cat @@ -204,6 +243,9 @@ normal: cat2 crit: cat2_dead dead: cat2_dead + - type: Grammar + attributes: + gender: epicene - type: entity name: space cat @@ -223,6 +265,15 @@ normal: spacecat crit: spacecat_dead dead: spacecat_dead + - type: InteractionPopup + successChance: 0.7 + interactSuccessString: petting-success-space-cat + interactFailureString: petting-failure-generic + interactSuccessSound: + path: /Audio/Animals/cat_meow.ogg + - type: Grammar + attributes: + gender: epicene - type: entity name: caracal cat @@ -242,6 +293,9 @@ normal: caracal_flop crit: caracal_dead dead: caracal_dead + - type: Grammar + attributes: + gender: epicene - type: entity name: sloth @@ -281,3 +335,10 @@ - type: Butcherable meat: FoodMeat pieces: 3 + - type: InteractionPopup + successChance: 0.9 + interactSuccessString: petting-success-sloth + interactFailureString: petting-failure-sloth + - type: Grammar + attributes: + gender: epicene diff --git a/Resources/Prototypes/Entities/Structures/Windows/window.yml b/Resources/Prototypes/Entities/Structures/Windows/window.yml index 142676cde1..84c75e9990 100644 --- a/Resources/Prototypes/Entities/Structures/Windows/window.yml +++ b/Resources/Prototypes/Entities/Structures/Windows/window.yml @@ -12,6 +12,7 @@ tags: - RCDDeconstructWhitelist - ForceFixRotations + - Window - type: Sprite netsync: false drawdepth: WallTops @@ -64,7 +65,11 @@ - type: IconSmooth key: windows base: window - - type: Window + - type: InteractionPopup + interactSuccessString: comp-window-knock + popupPerceivedByOthers: true + interactSuccessSound: + path: /Audio/Effects/glass_knock.ogg - type: Construction graph: Window node: window @@ -89,6 +94,9 @@ components: # Attention! If adding tags here: # Keep WindowTintedDirectional in mind + - type: Tag + tags: + - Window - type: Sprite netsync: false sprite: Structures/Windows/directional.rsi @@ -96,6 +104,11 @@ - type: Icon sprite: Structures/Windows/directional.rsi state: window + - type: InteractionPopup + interactSuccessString: comp-window-knock + popupPerceivedByOthers: true + interactSuccessSound: + path: /Audio/Effects/glass_knock.ogg - type: Physics - type: Fixtures fixtures: @@ -136,7 +149,6 @@ noAirWhenFullyAirBlocked: false airBlockedDirection: - South - - type: Window - type: Construction graph: WindowDirectional node: windowDirectional diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 8a43625186..910c6da7f0 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -285,6 +285,9 @@ - type: Tag id: Wall +- type: Tag + id: Window + - type: Tag id: Wirecutter