From 5fa0e7dd49729bdc4968e04bb1e1efeb6f584df5 Mon Sep 17 00:00:00 2001
From: Ed <96445749+TheShuEd@users.noreply.github.com>
Date: Fri, 13 Oct 2023 20:34:18 +0300
Subject: [PATCH] Animals make hearts when you pet them (#20859)
---
.../Components/InteractionPopupComponent.cs | 13 ++++++++++
.../Interaction/InteractionPopupSystem.cs | 6 +++++
.../Prototypes/Entities/Effects/hearts.yml | 16 ++++++++++++
.../Prototypes/Entities/Mobs/NPCs/animals.yml | 23 +++++++++++++++++
.../Prototypes/Entities/Mobs/NPCs/pets.yml | 13 +++++++++-
.../Textures/Effects/hearts.rsi/hearts.png | Bin 0 -> 734 bytes
.../Textures/Effects/hearts.rsi/meta.json | 24 ++++++++++++++++++
7 files changed, 94 insertions(+), 1 deletion(-)
create mode 100644 Resources/Prototypes/Entities/Effects/hearts.yml
create mode 100644 Resources/Textures/Effects/hearts.rsi/hearts.png
create mode 100644 Resources/Textures/Effects/hearts.rsi/meta.json
diff --git a/Content.Server/Interaction/Components/InteractionPopupComponent.cs b/Content.Server/Interaction/Components/InteractionPopupComponent.cs
index eef29506b2..f41f57dd09 100644
--- a/Content.Server/Interaction/Components/InteractionPopupComponent.cs
+++ b/Content.Server/Interaction/Components/InteractionPopupComponent.cs
@@ -1,4 +1,5 @@
using Robust.Shared.Audio;
+using Robust.Shared.Prototypes;
namespace Content.Server.Interaction.Components;
@@ -40,6 +41,18 @@ public sealed partial class InteractionPopupComponent : Component
[DataField("interactFailureSound")]
public SoundSpecifier? InteractFailureSound;
+ ///
+ /// a prototype that will spawn upon successful interaction (as planned only for special effects)
+ ///
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public EntProtoId? InteractSuccessSpawn;
+
+ ///
+ /// a prototype that will spawn upon failure interaction (as planned only for special effects)
+ ///
+ [DataField, ViewVariables(VVAccess.ReadWrite)]
+ public EntProtoId? InteractFailureSpawn;
+
///
/// Chance that an interaction attempt will succeed.
/// 1 = always play "success" popup and sound.
diff --git a/Content.Server/Interaction/InteractionPopupSystem.cs b/Content.Server/Interaction/InteractionPopupSystem.cs
index 286919b64f..86158fb7a8 100644
--- a/Content.Server/Interaction/InteractionPopupSystem.cs
+++ b/Content.Server/Interaction/InteractionPopupSystem.cs
@@ -58,6 +58,9 @@ public sealed class InteractionPopupSystem : EntitySystem
if (component.InteractSuccessSound != null)
sfx = component.InteractSuccessSound.GetSound();
+
+ if (component.InteractSuccessSpawn != null)
+ Spawn(component.InteractSuccessSpawn, Transform(uid).MapPosition);
}
else
{
@@ -66,6 +69,9 @@ public sealed class InteractionPopupSystem : EntitySystem
if (component.InteractFailureSound != null)
sfx = component.InteractFailureSound.GetSound();
+
+ if (component.InteractFailureSpawn != null)
+ Spawn(component.InteractFailureSpawn, Transform(uid).MapPosition);
}
if (component.MessagePerceivedByOthers != null)
diff --git a/Resources/Prototypes/Entities/Effects/hearts.yml b/Resources/Prototypes/Entities/Effects/hearts.yml
new file mode 100644
index 0000000000..042fdb5e8a
--- /dev/null
+++ b/Resources/Prototypes/Entities/Effects/hearts.yml
@@ -0,0 +1,16 @@
+- type: entity
+ id: EffectHearts
+ noSpawn: true
+ components:
+ - type: TimedDespawn
+ lifetime: 0.85
+ - type: Sprite
+ noRot: true
+ drawdepth: Effects
+ sprite: Effects/hearts.rsi
+ state: hearts
+ - type: EffectVisuals
+ - type: Tag
+ tags:
+ - HideContextMenu
+ - type: AnimationPlayer
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
index a79a0e0a99..0077fddcfc 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
@@ -41,6 +41,7 @@
successChance: 0.2
interactSuccessString: petting-success-soft-floofy
interactFailureString: petting-failure-bat
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/fox_squeak.ogg
- type: SentienceTarget
@@ -204,6 +205,7 @@
successChance: 0.8
interactSuccessString: petting-success-bird
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/chicken_cluck_happy.ogg
- type: Bloodstream
@@ -290,6 +292,7 @@
successChance: 0.9
interactSuccessString: petting-success-bird
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/duck_quack_happy.ogg
- type: Bloodstream
@@ -469,6 +472,7 @@
interactDelay: 2 # Avoids overlapping SFX due to spam - these SFX are a little longer than the typical 1 second.
interactSuccessString: petting-success-soft-floofy
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/cow_moo.ogg
- type: Perishable
@@ -523,6 +527,7 @@
successChance: 0.5
interactSuccessString: petting-success-crab
interactFailureString: petting-failure-crab
+ interactSuccessSpawn: EffectHearts
- type: Bloodstream
bloodMaxVolume: 50
- type: Tag
@@ -598,6 +603,7 @@
successChance: 0.2
interactSuccessString: petting-success-goat
interactFailureString: petting-failure-goat
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/goat_bah.ogg
- type: NpcFactionMember
@@ -650,6 +656,7 @@
successChance: 0.1 # Yeah, good luck with that.
interactSuccessString: petting-success-goose
interactFailureString: petting-failure-goose
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/goose_honk.ogg
- type: Bloodstream
@@ -1160,6 +1167,7 @@
successChance: 0.3
interactSuccessString: petting-success-reptile
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/lizard_happy.ogg
- type: Bloodstream
@@ -1215,6 +1223,7 @@
successChance: 0.3
interactSuccessString: petting-success-generic
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
- type: Bloodstream
bloodMaxVolume: 50
@@ -1259,6 +1268,7 @@
successChance: 0.6
interactSuccessString: petting-success-frog
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/frog_ribbit.ogg
- type: Bloodstream
@@ -1310,6 +1320,7 @@
successChance: 0.6
interactSuccessString: petting-success-bird
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/parrot_raught.ogg
- type: Bloodstream
@@ -1353,6 +1364,7 @@
successChance: 0.5
interactSuccessString: petting-success-bird
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/penguin_squawk.ogg
- type: Tag
@@ -1578,6 +1590,7 @@
successChance: 0.6
interactSuccessString: petting-success-reptile
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
- type: Bloodstream
bloodMaxVolume: 50
- type: Damageable
@@ -1655,6 +1668,7 @@
successChance: 0.5
interactSuccessString: petting-success-tarantula
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
- type: NoSlip
- type: Spider
- type: IgnoreSpiderWeb
@@ -1834,6 +1848,7 @@
successChance: 0.2 # Low when undomesticated.
interactSuccessString: petting-success-soft-floofy
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/raccoon_chatter.ogg
- type: Grammar
@@ -1890,6 +1905,7 @@
successChance: 0.5
interactSuccessString: petting-success-soft-floofy
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/fox_squeak.ogg
- type: Grammar
@@ -1951,6 +1967,7 @@
- type: InteractionPopup
interactSuccessString: petting-success-dog
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/small_dog_bark_happy.ogg
- type: Grammar
@@ -2100,6 +2117,7 @@
successChance: 0.7
interactSuccessString: petting-success-cat
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/cat_meow.ogg
- type: Grammar
@@ -2152,6 +2170,7 @@
successChance: 0.7
interactSuccessString: petting-success-space-cat
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/cat_meow.ogg
- type: Respirator #It just works?
@@ -2225,6 +2244,7 @@
successChance: 0.9
interactSuccessString: petting-success-sloth
interactFailureString: petting-failure-sloth
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/sloth_squeak.ogg
- type: Grammar
@@ -2282,6 +2302,7 @@
interactDelay: 1.5 # Avoids overlapping SFX due to spam - these SFX are a little longer than the typical 1 second.
interactSuccessString: petting-success-soft-floofy
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/ferret_happy.ogg
- type: Grammar
@@ -2412,6 +2433,7 @@
successChance: 0.4
interactSuccessString: petting-success-hamster
interactFailureString: petting-failure-hamster
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/fox_squeak.ogg
- type: Bloodstream
@@ -2482,6 +2504,7 @@
successChance: 0.7
interactSuccessString: petting-success-pig
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/pig_oink.ogg
- type: ReplacementAccent
diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml
index 1efa767af1..21cc305acd 100644
--- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml
+++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml
@@ -211,6 +211,7 @@
successChance: 0.9
interactSuccessString: petting-success-bingus
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/cat_meow.ogg
- type: Grammar
@@ -273,6 +274,7 @@
successChance: 0.5
interactSuccessString: petting-success-dog
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/small_dog_bark_happy.ogg
- type: Grammar
@@ -312,6 +314,7 @@
successChance: 1
interactSuccessString: petting-success-sloth
interactFailureString: petting-failure-sloth
+ interactSuccessSpawn: EffectHearts
- type: Grammar
attributes:
proper: true
@@ -368,6 +371,7 @@
successChance: 0.7
interactSuccessString: petting-success-dog
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/small_dog_bark_happy.ogg
- type: Grammar
@@ -389,6 +393,7 @@
successChance: 1.0 # Hey, c'mon, this is Morty we're talking about here.
interactSuccessString: petting-success-possum
interactFailureString: petting-failure-possum
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/snake_hiss.ogg
- type: Grammar
@@ -410,6 +415,7 @@
successChance: 0.7
interactSuccessString: petting-success-raccoon
interactFailureString: petting-failure-raccoon
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/raccoon_chatter.ogg
- type: Grammar
@@ -431,6 +437,7 @@
successChance: 1
interactSuccessString: petting-success-pig
interactFailureString: petting-failure-pig
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/pig_oink.ogg
- type: Grammar
@@ -452,6 +459,7 @@
successChance: 1
interactSuccessString: petting-success-soft-floofy
interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/fox_squeak.ogg
- type: Butcherable
@@ -492,6 +500,7 @@
successChance: 1
interactSuccessString: petting-success-hamster
interactFailureString: petting-failure-hamster
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/fox_squeak.ogg
- type: Butcherable
@@ -518,6 +527,7 @@
successChance: 0.5 # spider is mean
interactSuccessString: petting-success-tarantula
interactFailureString: petting-failure-hamster
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/snake_hiss.ogg
- type: NpcFactionMember
@@ -592,7 +602,8 @@
- type: InteractionPopup
successChance: 0.8
interactSuccessString: petting-success-kangaroo
- interactFailureString: petting-failure-kangaroo
+ interactFailureString: petting-failure-generic
+ interactSuccessSpawn: EffectHearts
interactSuccessSound:
path: /Audio/Animals/kangaroo_grunt.ogg
- type: Grammar
diff --git a/Resources/Textures/Effects/hearts.rsi/hearts.png b/Resources/Textures/Effects/hearts.rsi/hearts.png
new file mode 100644
index 0000000000000000000000000000000000000000..25bf0a8b5a8d082603679b14adf3447ab45e9853
GIT binary patch
literal 734
zcmV<40wMj0P)Px%m`OxIRCt{2o4sz^FcgI^RkcGicdP-sbC&F`-@>yOFMXvhp8WvXZy9AQswkiz0!QQ
zQs#B`3Xm*>bK+y>iZ|Uzx(Tyk6s4hkT<}VrWv-~
zGo58*x~%Ce3vyb%reR+ns4VKEIAu{gn~mTK;3x!F>l!Nl6u!=BzFVo==ZZ>|6A@9V
za=Lx4oE^`}3h?OzISRq`EesXkhOcdG?k`nNzIOB7jlO*#(SL_C`TUixbk!*nwlrPR
z^0}9j^=P4epa1UW^=P55^Dl4zT|Zzr3c*KE7x9Co>xUD(evhCqLGrkmnak)i2Z*bg
z!Ga7^d{--d(Ji2hrS3Dni!)?x0a9;YL+DyWXndCsI<^)d{q{A4exGoE5aK&J|v$nim!O-al@C8{6<+3^J(^7$Bk4^;j~tO
zkDxxqcNsTQK84e|HPKa2-{QLrnkk>cIavWdf;hx?*_$cpbXca%ecTJ24ii3tE>1iE
z00000kRr87u@tc$K<;C2Ca}{w88?K*l#f6X$3H(bm|_3`000000Dyk^2Qi9x)|JuV
Qn*aa+07*qoM6N<$f`MgOzW@LL
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Effects/hearts.rsi/meta.json b/Resources/Textures/Effects/hearts.rsi/meta.json
new file mode 100644
index 0000000000..0c90d63d88
--- /dev/null
+++ b/Resources/Textures/Effects/hearts.rsi/meta.json
@@ -0,0 +1,24 @@
+{
+ "version": 1,
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by TheShuEd (github) for ss14",
+ "states": [
+ {
+ "name": "hearts",
+ "delays": [
+ [
+ 0.15,
+ 0.15,
+ 0.15,
+ 0.15,
+ 0.15,
+ 0.15
+ ]
+ ]
+ }
+ ]
+}
\ No newline at end of file