diff --git a/auxmos.dll b/auxmos.dll
index 52481b4b96..c465a14e53 100644
Binary files a/auxmos.dll and b/auxmos.dll differ
diff --git a/auxmos.pdb b/auxmos.pdb
index 2f767e4107..c0e3bae993 100644
Binary files a/auxmos.pdb and b/auxmos.pdb differ
diff --git a/code/controllers/configuration/entries/connections.dm b/code/controllers/configuration/entries/connections.dm
index 6ec41590f2..0fadccdecd 100644
--- a/code/controllers/configuration/entries/connections.dm
+++ b/code/controllers/configuration/entries/connections.dm
@@ -32,7 +32,6 @@
min_val = 0
/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+?
- config_entry_value = TRUE
/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time?
diff --git a/code/datums/elements/object_reskinning.dm b/code/datums/elements/object_reskinning.dm
index a75a818fc3..87f5f13385 100644
--- a/code/datums/elements/object_reskinning.dm
+++ b/code/datums/elements/object_reskinning.dm
@@ -110,10 +110,9 @@
)
SIGNAL_HANDLER
- if(isnull(held_item))
- switch(source.reskin_binding)
- if(COMSIG_CLICK_CTRL_SHIFT)
- LAZYSET(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB], INTENT_ANY, "Reskin PDA")
- else
- LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Reskin [source]")
- return CONTEXTUAL_SCREENTIP_SET
+ switch(source.reskin_binding)
+ if(COMSIG_CLICK_CTRL_SHIFT)
+ LAZYSET(context[SCREENTIP_CONTEXT_CTRL_SHIFT_LMB], INTENT_ANY, "Reskin PDA")
+ else
+ LAZYSET(context[SCREENTIP_CONTEXT_ALT_LMB], INTENT_ANY, "Reskin [source]")
+ return CONTEXTUAL_SCREENTIP_SET
diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm
index 539e43bd84..590bd37d8c 100644
--- a/code/game/objects/items/miscellaneous.dm
+++ b/code/game/objects/items/miscellaneous.dm
@@ -240,18 +240,31 @@
item_state = "box"
/obj/item/choice_beacon/box/plushie/generate_display_names()
- var/list/plushie_list = list()
- //plushie set 1: just subtypes of /obj/item/toy/plush
- var/list/plushies_set_one = subtypesof(/obj/item/toy/plush) - list(/obj/item/toy/plush/narplush, /obj/item/toy/plush/awakenedplushie, /obj/item/toy/plush/random_snowflake, /obj/item/toy/plush/plushling, /obj/item/toy/plush/random, /obj/item/toy/plush/goatplushie, /obj/item/toy/plush/goatplushie/angry, /obj/item/toy/plush/goatplushie/angry/realgoat, /obj/item/toy/plush/realgoat, /obj/item/toy/plush/goatplushie/angry/kinggoat, /obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat, /obj/item/toy/plush/goatplushie/angry/guardgoat, /obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat) //don't allow these special ones (you can still get narplush/hugbox)
- for(var/V in plushies_set_one)
- var/atom/A = V
- plushie_list[initial(A.name)] = A
- //plushie set 2: snowflake plushies
- var/list/plushies_set_two = CONFIG_GET(keyed_list/snowflake_plushies)
- for(var/V in plushies_set_two)
- plushie_list[V] = V //easiest way to do this which works with how selecting options works, despite being snowflakey to have the key equal the value
+ var/static/list/plushie_list = list()
+ if(!length(plushie_list))
+ //plushie set 1: just subtypes of /obj/item/toy/plush
+ var/list/plushies_set_one = subtypesof(/obj/item/toy/plush)
+ plushies_set_one = remove_bad_plushies(plushies_set_one)
+ for(var/V in plushies_set_one)
+ var/atom/A = V
+ plushie_list[initial(A.name)] = A
+ //plushie set 2: snowflake plushies
+ var/list/plushies_set_two = CONFIG_GET(keyed_list/snowflake_plushies)
+ for(var/V in plushies_set_two)
+ plushie_list[V] = V //easiest way to do this which works with how selecting options works, despite being snowflakey to have the key equal the value
return plushie_list
+/// Don't allow these special ones (you can still get narplush/hugbox)
+/obj/item/choice_beacon/box/plushie/proc/remove_bad_plushies(list/plushies)
+ plushies -= list(
+ /obj/item/toy/plush/narplush,
+ /obj/item/toy/plush/awakenedplushie,
+ /obj/item/toy/plush/random_snowflake,
+ /obj/item/toy/plush/plushling,
+ /obj/item/toy/plush/random
+ )
+ return plushies
+
/obj/item/skub
desc = "It's skub."
name = "skub"
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index c033aec648..2e881a333f 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -6,6 +6,8 @@
attack_verb = list("thumped", "whomped", "bumped")
w_class = WEIGHT_CLASS_SMALL
resistance_flags = FLAMMABLE
+ lefthand_file = 'icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/plushes_righthand.dmi'
var/list/squeak_override //Weighted list; If you want your plush to have different squeak sounds use this
var/stuffed = TRUE //If the plushie has stuffing in it
var/unstuffable = FALSE //for plushies that can't be stuffed
@@ -180,6 +182,10 @@
. = ..()
if(stuffed || grenade)
to_chat(user, "You pet [src]. D'awww.")
+ visible_message("[loc == user ? user : "Someone"] pets [src]. D'awww.", ignored_mobs = user)
+ if(isturf(user.loc) && COOLDOWN_FINISHED(src, petting_heart_cooldown))
+ new /obj/effect/temp_visual/heart(user.loc)
+ COOLDOWN_START(src, petting_heart_cooldown, 5)
if(grenade && !grenade.active)
if(istype(grenade, /obj/item/grenade/chem_grenade))
var/obj/item/grenade/chem_grenade/G = grenade
@@ -193,6 +199,8 @@
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing)
/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/pen))
+ return ..()
if(I.get_sharpness())
if(!grenade)
if(unstuffable)
@@ -484,7 +492,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "space carp plushie"
desc = "An adorable stuffed toy that resembles a space carp."
icon_state = "carpplush"
- item_state = "carp_plushie"
attack_verb = list("bitten", "eaten", "fin slapped")
squeak_override = list('sound/weapons/bite.ogg'=1)
@@ -603,7 +610,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "lizard plushie"
desc = "An adorable stuffed toy that resembles a lizardperson."
icon_state = "plushie_lizard"
- item_state = "plushie_lizard"
attack_verb = list("clawed", "hissed", "tail slapped")
squeak_override = list('sound/weapons/slash.ogg' = 1)
@@ -611,19 +617,16 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "kobold plushie"
desc = "An adorable stuffed toy that resembles a kobold."
icon_state = "kobold"
- item_state = "kobold"
/obj/item/toy/plush/lizardplushie/kobold
name = "spacelizard plushie"
desc = "An adorable stuffed toy that resembles a lizard in a suit."
icon_state = "plushie_spacelizard"
- item_state = "plushie_spacelizard"
/obj/item/toy/plush/nukeplushie
name = "operative plushie"
desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious."
icon_state = "plushie_nuke"
- item_state = "plushie_nuke"
attack_verb = list("shot", "nuked", "detonated")
squeak_override = list('sound/effects/hit_punch.ogg' = 1)
@@ -631,7 +634,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "slime plushie"
desc = "An adorable stuffed toy that resembles a slime. It is practically just a hacky sack."
icon_state = "plushie_slime"
- item_state = "plushie_slime"
attack_verb = list("blorbled", "slimed", "absorbed", "glomped")
squeak_override = list('sound/effects/blobattack.ogg' = 1)
gender = FEMALE //given all the jokes and drawings, I'm not sure the xenobiologists would make a slimeboy
@@ -640,7 +642,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "awakened plushie"
desc = "An ancient plushie that has grown enlightened to the true nature of reality."
icon_state = "plushie_awake"
- item_state = "plushie_awake"
can_random_spawn = FALSE
/obj/item/toy/plush/awakenedplushie/ComponentInitialize()
@@ -651,7 +652,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "bee plushie"
desc = "A cute toy that resembles an even cuter bee."
icon_state = "plushie_bee"
- item_state = "plushie_bee"
attack_verb = list("stung")
gender = FEMALE
squeak_override = list('modular_citadel/sound/voice/scream_moth.ogg' = 1)
@@ -660,7 +660,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "moth plushie"
desc = "An adorable stuffed toy that resembles some kind of insect."
icon_state = "moff"
- item_state = "moff"
squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1)
can_random_spawn = FALSE
@@ -668,7 +667,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "lamp plushie"
desc = "A toy lamp plushie, doesn't actually make light, but it still toggles on and off. Click clack!"
icon_state = "plushie_lamp"
- item_state = "plushie_lamp"
attack_verb = list("lit", "flickered", "flashed")
squeak_override = list('sound/weapons/magout.ogg' = 1)
@@ -676,72 +674,61 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "drake plushie"
desc = "A large beast from lavaland turned into a marketable plushie!"
icon_state = "drake"
- item_state = "drake"
attack_verb = list("bit", "devoured", "burned")
/obj/item/toy/plush/deer
name = "deer plushie"
desc = "Oh deer, a plushie!"
icon_state = "deer"
- item_state = "deer"
attack_verb = list("bleated", "rammed", "kicked")
/obj/item/toy/plush/box
name = "cardboard plushie"
desc = "A toy box plushie, it holds cotten. Only a baddie would place a bomb through the postal system..."
icon_state = "box"
- item_state = "box"
attack_verb = list("open", "closed", "packed", "hidden", "rigged", "bombed", "sent", "gave")
/obj/item/toy/plush/slaggy
name = "slag plushie"
desc = "A piece of slag with some googly eyes and a drawn on mouth."
icon_state = "slaggy"
- item_state = "slaggy"
attack_verb = list("melted", "refined", "stared")
/obj/item/toy/plush/mr_buckety
name = "bucket plushie"
desc = "A bucket that is missing its handle with some googly eyes and a drawn on mouth."
icon_state = "mr_buckety"
- item_state = "mr_buckety"
attack_verb = list("filled", "dumped", "stared")
/obj/item/toy/plush/dr_scanny
name = "scanner plushie"
desc = "A old outdated scanner that has been modified to have googly eyes, a dawn on mouth and, heart."
icon_state = "dr_scanny"
- item_state = "dr_scanny"
attack_verb = list("scanned", "beeped", "stared")
/obj/item/toy/plush/borgplushie
name = "K9 plushie"
desc = "An adorable stuffed toy of a robot."
icon_state = "securityk9"
- item_state = "securityk9"
attack_verb = list("beeped", "booped", "pinged")
squeak_override = list('sound/machines/beep.ogg' = 1)
/obj/item/toy/plush/borgplushie/medihound
name = "medihound plushie"
icon_state = "medihound"
- item_state = "medihound"
/obj/item/toy/plush/borgplushie/scrubpuppy
name = "scrubpuppy plushie"
icon_state = "scrubpuppy"
- item_state = "scrubpuppy"
/obj/item/toy/plush/borgplushie/pupdozer
name = "pupdozer plushie"
icon_state = "pupdozer"
- item_state = "pupdozer"
/obj/item/toy/plush/aiplush
name = "AI plushie"
desc = "A little stuffed toy AI core... it appears to be malfunctioning."
icon_state = "malfai"
- item_state = "malfai"
attack_verb = list("hacked", "detonated", "overloaded")
squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1)
@@ -749,7 +736,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "snake plushie"
desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing."
icon_state = "plushie_snake"
- item_state = "plushie_snake"
attack_verb = list("bitten", "hissed", "tail slapped")
squeak_override = list('modular_citadel/sound/voice/hiss.ogg' = 1)
@@ -757,20 +743,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "mammal plushie"
desc = "An adorable stuffed toy resembling some sort of crew member."
icon_state = "ych"
- item_state = "ych"
can_random_spawn = FALSE
/obj/item/toy/plush/mammal/fox
name = "fox plushie"
desc = "An adorable stuffed toy resembling a fox."
icon_state = "fox"
- item_state = "fox"
attack_verb = list("yipped", "geckered", "yapped")
/obj/item/toy/plush/mammal/dog
name = "dog plushie"
icon_state = "corgi"
- item_state = "corgi"
desc = "An adorable stuffed toy that resembles a dog."
attack_verb = list("barked", "boofed", "borked")
squeak_override = list(
@@ -781,20 +764,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
/obj/item/toy/plush/mammal/dog/fcorgi
name = "corgi plushie"
icon_state = "girlycorgi"
- item_state = "girlycorgi"
desc = "An adorable stuffed toy that resembles a dog. This one dons a pink ribbon."
/obj/item/toy/plush/mammal/dog/borgi
name = "borgi plushie"
icon_state = "borgi"
- item_state = "borgi"
desc = "An adorable stuffed toy that resembles a robot dog."
/obj/item/toy/plush/xeno
name = "xenohybrid plushie"
desc = "An adorable stuffed toy that resembles a xenomorphic crewmember."
icon_state = "xeno"
- item_state = "xeno"
squeak_override = list('sound/voice/hiss2.ogg' = 1)
can_random_spawn = FALSE
@@ -802,7 +782,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "bird plushie"
desc = "An adorable stuffed plushie that resembles an avian."
icon_state = "bird"
- item_state = "bird"
attack_verb = list("peeped", "beeped", "poofed")
squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1)
can_random_spawn = FALSE
@@ -811,7 +790,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "sergal plushie"
desc = "An adorable stuffed plushie that resembles a sagaru."
icon_state = "sergal"
- item_state = "sergal"
squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1)
can_random_spawn = FALSE
@@ -819,7 +797,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "feline plushie"
desc = "An adorable stuffed toy that resembles a feline."
icon_state = "cat"
- item_state = "cat"
attack_verb = list("headbutt", "scritched", "bit")
squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
can_random_spawn = FALSE
@@ -828,7 +805,6 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "medcat plushie"
desc = "An affectionate stuffed toy that resembles a certain medcat, comes complete with battery operated wagging tail!! You get the impression she's cheering you on to to find happiness and be kind to people."
icon_state = "fermis"
- item_state = "fermis"
attack_verb = list("cuddled", "petpatted", "wigglepurred")
squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1)
@@ -836,20 +812,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths())
name = "teddy"
desc = "It's a teddy bear!"
icon_state = "teddy"
- item_state = "teddy"
/obj/item/toy/plush/crab
name = "crab plushie"
desc = "Fewer pinches than a real one, but it still clicks."
icon_state = "crab"
- item_state = "crab"
attack_verb = list("clicked", "clacked", "pinched")
/obj/item/toy/plush/gondola
name = "gondola plushie"
desc = "Just looking at it seems to calm you down. Please do not eat it though."
icon_state = "gondola"
- item_state = "gondola"
attack_verb = list("calmed", "smiled", "peaced")
/obj/item/toy/plush/hairball
diff --git a/html/changelogs/archive/2023-10.yml b/html/changelogs/archive/2023-10.yml
index 9f09b6c242..ebc8e74981 100644
--- a/html/changelogs/archive/2023-10.yml
+++ b/html/changelogs/archive/2023-10.yml
@@ -13,6 +13,12 @@
- tweak: makes the gas mask in loadouts no longer restricted
Vhariik:
- rscdel: Sci machinery
+2023-10-04:
+ SmiLeYre and SandPoot:
+ - rscadd: Patting plushies will make hearts like patting Ian.
+ - rscadd: Plushies can be renamed.
+ - rscadd: Added some extra plushies.
+ - imageadd: Added held sprite for most modular plushies.
2023-10-05:
Anonymous:
- bugfix: Fixes Bane Syndrome quirk overwriting loadout's masks. Now the mask from
diff --git a/icons/mob/inhands/misc/plushes_lefthand.dmi b/icons/mob/inhands/misc/plushes_lefthand.dmi
new file mode 100644
index 0000000000..1a12cece7d
Binary files /dev/null and b/icons/mob/inhands/misc/plushes_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/plushes_righthand.dmi b/icons/mob/inhands/misc/plushes_righthand.dmi
new file mode 100644
index 0000000000..fab9101eb6
Binary files /dev/null and b/icons/mob/inhands/misc/plushes_righthand.dmi differ
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index ec97d0659f..906da43448 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -113,7 +113,6 @@
desc = "While a normal carrot would be good for your eyes, this one seems a bit more for hugging then eating."
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "carrot"
- item_state = "carrot"
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("slapped")
resistance_flags = FLAMMABLE
@@ -146,7 +145,6 @@
desc = "A festive plush that squeeks when you squeeze it!"
icon = 'icons/obj/custom.dmi'
icon_state = "pine_c"
- item_state = "pine_c"
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("slapped")
resistance_flags = FLAMMABLE
@@ -547,7 +545,6 @@
/obj/item/toy/plush/mammal/dog/fritz
icon = 'icons/obj/custom.dmi'
icon_state = "fritz"
- item_state = "fritz"
attack_verb = list("barked", "boofed", "shotgun'd")
obj_flags = UNIQUE_RENAME
unique_reskin = list(
diff --git a/modular_sand/code/datums/interactions/lewd_definitions.dm b/modular_sand/code/datums/interactions/lewd_definitions.dm
index 347dd716b3..1e7a9cb7b9 100644
--- a/modular_sand/code/datums/interactions/lewd_definitions.dm
+++ b/modular_sand/code/datums/interactions/lewd_definitions.dm
@@ -770,7 +770,7 @@
did_anything = FALSE
if(did_anything)
LAZYADD(obscure_to, src)
- else //todo: better self cum messages
+ if(!message) //todo: better self cum messages
message = "cums all over themselves!"
if(gender == MALE)
playlewdinteractionsound(loc, pick('modular_sand/sound/interactions/final_m1.ogg',
diff --git a/modular_sand/code/game/objects/items/plushes.dm b/modular_sand/code/game/objects/items/plushes.dm
index da9f13ec4f..4935443720 100644
--- a/modular_sand/code/game/objects/items/plushes.dm
+++ b/modular_sand/code/game/objects/items/plushes.dm
@@ -1,251 +1,164 @@
-// Honestly, Saliith was just sad when he made this. Leave this file in the game to let people hug him.
-// i agree and support - one of the spriters
+/obj/item/choice_beacon/box/plushie/remove_bad_plushies(list/plushies)
+ var/list/returned_plushies = ..()
+ returned_plushies -= list(/obj/item/toy/plush/goatplushie,
+ /obj/item/toy/plush/goatplushie/angry,
+ /obj/item/toy/plush/goatplushie/angry/realgoat,
+ /obj/item/toy/plush/realgoat,
+ /obj/item/toy/plush/goatplushie/angry/kinggoat,
+ /obj/item/toy/plush/goatplushie/angry/kinggoat/ascendedkinggoat,
+ /obj/item/toy/plush/goatplushie/angry/guardgoat,
+ /obj/item/toy/plush/goatplushie/angry/guardgoat/masterguardgoat,
+ /obj/item/toy/plush/lizardplushie/saliith,
+ /obj/item/toy/plush/mammal/fox/vulp
+ )
+ return returned_plushies
-/obj/item/toy/plush/lizardplushie/saliith
- name = "Saliith plushie"
- desc = "He looks like he needs a friend."
- icon = 'modular_sand/icons/obj/plushes.dmi'
- icon_state = "saliith"
- gender = MALE
- can_random_spawn = FALSE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF // Protected by a higher power
- unstuffable = TRUE // Prevent grenades
-
-/obj/item/toy/plush/lizardplushie/saliith/Initialize(mapload, set_snowflake_id)
- // Check if plush already exists
- if(GLOB.saliith_plushie && (GLOB.saliith_plushie != src))
- return INITIALIZE_HINT_QDEL
-
- // Appear on orbit menu
- GLOB.poi_list += src
-
- // Return normally
- . = ..()
-
-/obj/item/toy/plush/lizardplushie/saliith/Destroy()
- // Let's not keep the reference hanging around
- GLOB.poi_list -= src
- . = ..()
-
-/obj/item/toy/plush/lizardplushie/saliith/ComponentInitialize()
- . = ..()
-
- // Add respawn component
- AddComponent(/datum/component/stationloving)
-
- // Define pronouns
- var/p_they = p_they()
- var/p_s = p_s()
-
- // Add custom description
- normal_desc = "[p_they] look[p_s] like [p_they] need[p_s] a friend."
-
-/obj/item/toy/plush/lizardplushie/saliith/examine(mob/user)
- . = ..()
-
- // Define pronouns
- var/p_them = p_them()
- //var/p_they = p_they()
- //var/p_are = p_are()
-
- // Check for stuffing
- if(!stuffed)
- // Update examine text and return
- . += span_deadsay("[p_they(TRUE)] [p_are()] dead.")
- return
-
- // Check if user is Saliith himself
- if(user.ckey == "sandpoot")
- // Update examine text and return
- . += span_deadsay("You feel a sense of familiarity from [p_them].")
- return
-
- // Check for antag datums
- if((length(user?.mind?.antag_datums) >= 1))
- // Update examine text
- . += span_warning("[src] gives you a menacing glare! Patting [p_them] would be a dangerous mistake.")
-
-/obj/item/toy/plush/lizardplushie/saliith/attack_self(mob/living/carbon/human/user)
- // Check if user exists
- if(!user)
- // Return normally
- return ..()
-
- // Check if user has a mind
- if(!user.mind)
- // Return normally
- return ..()
-
- // Define pronouns
- var/p_they = p_they()
- //var/p_their = p_their()
- var/p_s = p_s()
-
- // Check if user is Saliith himself
- if(user.ckey == "sandpoot")
- // Alert him and return
- to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accept[p_s] the gesture anyhow."))
- return ..()
-
- // Check if user is an antagonist role
- if((length(user?.mind?.antag_datums) >= 1))
- // Check if user is a xenobio changeling
- if(user?.mind?.has_antag_datum(/datum/antagonist/changeling/xenobio))
- // Alert the user
- to_chat(user, span_notice("[src] senses what you really are, but decides to spare you."))
-
- // Check if user is a brainwashed victim
- else if(user?.mind?.has_antag_datum(/datum/antagonist/brainwashed))
- // Alert the user
- to_chat(user, span_notice("[src] senses that you're not in control of your actions, and offers [p_their()] sympathy."))
-
- // User is not a whitelisted antagonist
- else
- // Drop the item
- user.dropItemToGround(src)
-
- // Warn user
- user.visible_message(span_warning("[src] smites [user] with an otherworldly wrath!"), span_boldwarning("You've made a grave mistake."))
-
- // Get lightning location
- var/turf/turf_target = get_step(get_step(user, NORTH), NORTH)
-
- // Perform lightning effect
- turf_target.Beam(user, icon_state="lightning[rand(1,12)]", time = 5)
- user.electrocution_animation(40)
-
- // Play sound effect
- playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
-
- // Add fire damage
- user.adjustFireLoss(120)
-
- // Return
- return
-
- // User has no antagonist status
-
- // Alert the user
- to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accepts the gesture anyhow."))
-
- // Return
- return ..()
-
-/obj/item/toy/plush/lizardplushie/saliith/attackby(obj/item/item_used, mob/living/user, params)
- // Check for sharp object
- if(item_used.get_sharpness())
- // Warn in local chat
- visible_message(span_warning("[src] knocks \the [item_used] out of [user]'s hands!"), span_warning("[src] knocks \the [item_used] out of your hands!"))
-
- // Drop the item
- user.dropItemToGround(item_used)
-
- // Throw the item away
- item_used.throw_at(pick(oview(7,get_turf(src))),10,1)
-
- // Return
- return
-
- // Check if user is Saliith himself
- if(user.ckey == "sandpoot")
- // Return with no effects
- return ..()
-
- // Check for grenade
- if(istype(item_used, /obj/item/grenade))
- // Warn in local chat
- visible_message(span_warning("[src] forces \the [item_used] into [user]'s mouth!"), span_warning("[src] forces \the [item_used] into your mouth!"))
-
- // Define the grenade item
- var/obj/item/grenade/item_grenade = item_used
-
- // Move grenade to the user
- item_grenade.forceMove(user)
-
- // Set the detonation time
- item_grenade.preprime(volume = 10)
-
- // Return
- return
-
- // Return normally
- return ..()
-
-/obj/item/toy/plush/lizardplushie/saliith/ex_act(severity, target, origin)
- return
-
-/obj/item/toy/plush/plushling/plushie_absorb(obj/item/toy/plush/victim)
- // Check if target is the Saliith plushie
- if(istype(victim, /obj/item/toy/plush/lizardplushie/saliith))
- // Warn in local chat
- visible_message(span_warning("[victim] violently parries the impostor! [src] is utterly annihilated!"))
-
- // Create a gib effect
- new /obj/effect/gibspawner(get_turf(src))
-
- // Delete the plushling
- qdel(src)
-
- // Return
- return
-
- // Return normally
- return ..()
-
-/obj/item/toy/plush/love(obj/item/toy/plush/Kisser, mob/living/user)
- // Define saliith plush
- var/plush_saliith = /obj/item/toy/plush/lizardplushie/saliith
-
- // Check if interaction involves the Saliith plush
- if(istype(src, plush_saliith) || istype(Kisser, plush_saliith))
- // Check if user is Saliith himself
- if(user.ckey == "sandpoot")
- // Return normally
- return ..()
-
- // User is not Saliith
- // Warn in local chat
- user.visible_message(span_warning("[user] tried to force [Kisser] to kiss [src] against their will, and has been yeeted!"), span_warning("You try to force [Kisser] to kiss [src], but get yeeted instead!"))
-
- // Display voice of god message
- say("YEET", spans = list("colossus","yell"))
-
- // Play sound
- playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5)
-
- // Drop the plushies if held
- if(src in user.held_items)
- user.dropItemToGround(src)
- if(Kisser in user.held_items)
- user.dropItemToGround(Kisser)
-
- // Launch user away
- var/turf/yeet_target = get_edge_target_turf(user, pick(GLOB.alldirs))
- user.throw_at(yeet_target, 10, 14)
- log_combat(src, user, "plush yeeted")
-
- // Return
- return
-
- // Interaction does not involve Saliith
- // Return normally
- return ..()
-
-// Pinpointer for plushie toy
-/obj/item/pinpointer/plushie_saliith
- name = "Saliith plushie pinpointer"
- desc = "A handheld tracking device that locates Saliith's plushie."
- icon = 'modular_sand/icons/obj/device.dmi'
- icon_state = "pinpointer_saliith"
-
-/obj/item/pinpointer/plushie_saliith/scan_for_target()
- set_target(GLOB.saliith_plushie, src)
-
-// cube guy thing. beware, very silly
+/obj/item/toy/plush
+ obj_flags = UNIQUE_RENAME
+ COOLDOWN_DECLARE(petting_heart_cooldown)
+/// cube guy thing. beware, very silly
/obj/item/toy/plush/cube
name = "Cubical plushie"
desc = "That's one weird looking plushie."
icon = 'modular_sand/icons/obj/plushes.dmi'
icon_state = "cube"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
squeak_override = list('sound/effects/footstep/rustystep1.ogg' = 1)
+
+/obj/item/toy/plush/nukeplushie/susplushie
+ name = "Suspect Plushie"
+ desc = "A stuffed toy that resembles a red space station employee. The tag claims red employee to be purely fictitious."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "plushie_sus"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ attack_verb = list("shot", "eat", "killed")
+
+/obj/item/toy/plush/nukeplushie/minisusplushie
+ name = "Mini Suspect Plushie"
+ desc = "A stuffed toy that resembles a red space station mini employee. The tag claims red employee to be purely fictitious."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "plushie_minisus"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ attack_verb = list("mini-shot", "mini-eat", "mini-killed")
+
+/obj/item/toy/plush/shark
+ name = "shark plushie"
+ desc = "A soft shark plushie for soft men. Mostly known as 'Blahaj', but some call it 'The IKEA shark'."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "blahaj"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ attack_verb = list("gnawed", "gnashed", "chewed")
+ squeak_override = list('modular_sand/sound/voice/rawr.ogg' = 1)
+
+/obj/item/toy/plush/rouny
+ name = "rouny plushie"
+ desc = "A plushie depicting a xenomorph runner, made to commemorate the centenary of the Battle of LV-426. Much cuddlier than the real thing."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "rouny"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ attack_verb = list("slashed", "bit", "charged")
+
+/obj/item/toy/plush/ada
+ name = "Ada Plushie"
+ desc = "Plush toy of a gray cat with bright, emerald-like eyes. The tongue is attached carelessly. Wings are not included."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "ada"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1)
+
+/obj/item/toy/plush/mammal/fox/vulp
+ desc = "An adorable stuffed toy resembling a vulp."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+
+/obj/item/toy/plush/mammal/fox/vulp/emma
+ name = "Emma Plushie"
+ icon_state = "emma"
+
+/obj/item/toy/plush/mammal/fox/vulp/shiro
+ name = "shiro plushie"
+ icon_state = "shiro"
+
+/obj/item/toy/plush/mammal/fox/vulp/raita
+ name = "raita plushie"
+ icon_state = "raita"
+
+/obj/item/toy/plush/mammal/fox/vulp/aiko
+ name = "Aiko Plushie"
+ icon_state = "aiko"
+
+/obj/item/toy/plush/nukeplushie/who
+ name = "security officer plushie"
+ desc = "A stuffed toy that resembles a Nanotrasen operative. He smells like burnt cotton."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "who"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ squeak_override = list('modular_sand/sound/voice/plush_1.ogg' = 9, 'modular_sand/sound/voice/plush_2.ogg' = 1)
+
+/obj/item/toy/plush/deer/qm
+ name = "supply chief plushie"
+ desc = "A stuffed toy that resembles a Cargonia Chief. Looks like a fallen economy."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "qm"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+
+/obj/item/toy/plush/sergal/judas
+ name = "yellow shark plushie"
+ desc = "An adorable stuffed plushie that resembles a yellow security shark."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "judas"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ squeak_override = list('modular_sand/sound/voice/voice_alphys.ogg' = 9)
+
+#define GREEN_NINJA_SKIN "green space ninja plushie"
+#define BLUE_NINJA_SKIN "blue space ninja plushie"
+#define RED_NINJA_SKIN "red space ninja plushie"
+
+// Little cute Ninja plushie
+/obj/item/toy/plush/ninja
+ name = GREEN_NINJA_SKIN
+ desc = "A protagonist of one of the most popular cartoon series on this side of galaxy. \"運命の忍者矢\""
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "ninja_plushie_green"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ attack_verb = list("shot", "nuked", "detonated")
+ squeak_override = list('sound/effects/hit_punch.ogg' = 1)
+ always_reskinnable = TRUE
+ unique_reskin = list(
+ GREEN_NINJA_SKIN = list("icon_state" = "ninja_plushie_green"),
+ BLUE_NINJA_SKIN = list("icon_state" = "ninja_plushie_blue"),
+ RED_NINJA_SKIN = list("icon_state" = "ninja_plushie_red")
+ )
+ COOLDOWN_DECLARE(change_ninja_cooldown)
+
+/obj/item/toy/plush/ninja/reskin_obj(mob/user)
+ . = ..()
+ name = current_skin
+ if(COOLDOWN_FINISHED(src, change_ninja_cooldown))
+ COOLDOWN_START(src, change_ninja_cooldown, 3 SECONDS)
+ switch(current_skin)
+ if(BLUE_NINJA_SKIN)
+ say("Your simple light won't stop me!")
+ if(RED_NINJA_SKIN)
+ say("You can run, but you can't hide!")
+ else
+ say("I am not afraid of the darkness! I am the darkness!")
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+
+#undef GREEN_NINJA_SKIN
+#undef BLUE_NINJA_SKIN
+#undef RED_NINJA_SKIN
diff --git a/modular_sand/code/game/objects/items/plushes/plushes.dm b/modular_sand/code/game/objects/items/plushes/plushes.dm
index 4f3a7a64ba..6a870d8d23 100644
--- a/modular_sand/code/game/objects/items/plushes/plushes.dm
+++ b/modular_sand/code/game/objects/items/plushes/plushes.dm
@@ -3,11 +3,13 @@
desc = "An adorable stuffed toy of a Medidrake."
icon = 'modular_sand/icons/obj/plushes.dmi'
icon_state = "meddrake"
- item_state = "meddrake"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
/obj/item/toy/plush/borgplushie/secdrake
name = "SecDrake Plushie"
desc = "An adorable stuffed toy of a Secdrake."
icon = 'modular_sand/icons/obj/plushes.dmi'
icon_state = "secdrake"
- item_state = "secdrake"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
diff --git a/modular_sand/code/game/objects/items/plushes/saliith.dm b/modular_sand/code/game/objects/items/plushes/saliith.dm
new file mode 100644
index 0000000000..c6bf6194fd
--- /dev/null
+++ b/modular_sand/code/game/objects/items/plushes/saliith.dm
@@ -0,0 +1,245 @@
+// Honestly, Saliith was just sad when he made this. Leave this file in the game to let people hug him.
+// i agree and support - one of the spriters
+
+/obj/item/toy/plush/lizardplushie/saliith
+ name = "Saliith plushie"
+ desc = "He looks like he needs a friend."
+ icon = 'modular_sand/icons/obj/plushes.dmi'
+ icon_state = "saliith"
+ lefthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi'
+ righthand_file = 'modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi'
+ gender = MALE
+ can_random_spawn = FALSE
+ resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF // Protected by a higher power
+ unstuffable = TRUE // Prevent grenades
+ obj_flags = null // One and only
+
+/obj/item/toy/plush/lizardplushie/saliith/Initialize(mapload, set_snowflake_id)
+ // Check if plush already exists
+ if(GLOB.saliith_plushie && (GLOB.saliith_plushie != src))
+ return INITIALIZE_HINT_QDEL
+
+ // Appear on orbit menu
+ GLOB.poi_list += src
+
+ // Return normally
+ . = ..()
+
+/obj/item/toy/plush/lizardplushie/saliith/Destroy()
+ // Let's not keep the reference hanging around
+ GLOB.poi_list -= src
+ . = ..()
+
+/obj/item/toy/plush/lizardplushie/saliith/ComponentInitialize()
+ . = ..()
+
+ // Add respawn component
+ AddComponent(/datum/component/stationloving)
+
+ // Define pronouns
+ var/p_they = p_they()
+ var/p_s = p_s()
+
+ // Add custom description
+ normal_desc = "[p_they] look[p_s] like [p_they] need[p_s] a friend."
+
+/obj/item/toy/plush/lizardplushie/saliith/examine(mob/user)
+ . = ..()
+
+ // Define pronouns
+ var/p_them = p_them()
+ //var/p_they = p_they()
+ //var/p_are = p_are()
+
+ // Check for stuffing
+ if(!stuffed)
+ // Update examine text and return
+ . += span_deadsay("[p_they(TRUE)] [p_are()] dead.")
+ return
+
+ // Check if user is Saliith himself
+ if(user.ckey == "sandpoot")
+ // Update examine text and return
+ . += span_deadsay("You feel a sense of familiarity from [p_them].")
+ return
+
+ // Check for antag datums
+ if((length(user?.mind?.antag_datums) >= 1))
+ // Update examine text
+ . += span_warning("[src] gives you a menacing glare! Patting [p_them] would be a dangerous mistake.")
+
+/obj/item/toy/plush/lizardplushie/saliith/attack_self(mob/living/carbon/human/user)
+ // Check if user exists
+ if(!user)
+ // Return normally
+ return ..()
+
+ // Check if user has a mind
+ if(!user.mind)
+ // Return normally
+ return ..()
+
+ // Define pronouns
+ var/p_they = p_they()
+ //var/p_their = p_their()
+ var/p_s = p_s()
+
+ // Check if user is Saliith himself
+ if(user.ckey == "sandpoot")
+ // Alert him and return
+ to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accept[p_s] the gesture anyhow."))
+ return ..()
+
+ // Check if user is an antagonist role
+ if((length(user?.mind?.antag_datums) >= 1))
+ // Check if user is a xenobio changeling
+ if(user?.mind?.has_antag_datum(/datum/antagonist/changeling/xenobio))
+ // Alert the user
+ to_chat(user, span_notice("[src] senses what you really are, but decides to spare you."))
+
+ // Check if user is a brainwashed victim
+ else if(user?.mind?.has_antag_datum(/datum/antagonist/brainwashed))
+ // Alert the user
+ to_chat(user, span_notice("[src] senses that you're not in control of your actions, and offers [p_their()] sympathy."))
+
+ // User is not a whitelisted antagonist
+ else
+ // Drop the item
+ user.dropItemToGround(src)
+
+ // Warn user
+ user.visible_message(span_warning("[src] smites [user] with an otherworldly wrath!"), span_boldwarning("You've made a grave mistake."))
+
+ // Get lightning location
+ var/turf/turf_target = get_step(get_step(user, NORTH), NORTH)
+
+ // Perform lightning effect
+ turf_target.Beam(user, icon_state="lightning[rand(1,12)]", time = 5)
+ user.electrocution_animation(40)
+
+ // Play sound effect
+ playsound(get_turf(user), 'sound/magic/lightningbolt.ogg', 50, 1)
+
+ // Add fire damage
+ user.adjustFireLoss(120)
+
+ // Return
+ return
+
+ // User has no antagonist status
+
+ // Alert the user
+ to_chat(user, span_notice("[p_they] give[p_s] you a hesitant gaze, but accepts the gesture anyhow."))
+
+ // Return
+ return ..()
+
+/obj/item/toy/plush/lizardplushie/saliith/attackby(obj/item/item_used, mob/living/user, params)
+ // Check for sharp object
+ if(item_used.get_sharpness())
+ // Warn in local chat
+ visible_message(span_warning("[src] knocks \the [item_used] out of [user]'s hands!"), span_warning("[src] knocks \the [item_used] out of your hands!"))
+
+ // Drop the item
+ user.dropItemToGround(item_used)
+
+ // Throw the item away
+ item_used.throw_at(pick(oview(7,get_turf(src))),10,1)
+
+ // Return
+ return
+
+ // Check if user is Saliith himself
+ if(user.ckey == "sandpoot")
+ // Return with no effects
+ return ..()
+
+ // Check for grenade
+ if(istype(item_used, /obj/item/grenade))
+ // Warn in local chat
+ visible_message(span_warning("[src] forces \the [item_used] into [user]'s mouth!"), span_warning("[src] forces \the [item_used] into your mouth!"))
+
+ // Define the grenade item
+ var/obj/item/grenade/item_grenade = item_used
+
+ // Move grenade to the user
+ item_grenade.forceMove(user)
+
+ // Set the detonation time
+ item_grenade.preprime(volume = 10)
+
+ // Return
+ return
+
+ // Return normally
+ return ..()
+
+/obj/item/toy/plush/lizardplushie/saliith/ex_act(severity, target, origin)
+ return
+
+/obj/item/toy/plush/plushling/plushie_absorb(obj/item/toy/plush/victim)
+ // Check if target is the Saliith plushie
+ if(istype(victim, /obj/item/toy/plush/lizardplushie/saliith))
+ // Warn in local chat
+ visible_message(span_warning("[victim] violently parries the impostor! [src] is utterly annihilated!"))
+
+ // Create a gib effect
+ new /obj/effect/gibspawner(get_turf(src))
+
+ // Delete the plushling
+ qdel(src)
+
+ // Return
+ return
+
+ // Return normally
+ return ..()
+
+/obj/item/toy/plush/love(obj/item/toy/plush/Kisser, mob/living/user)
+ // Define saliith plush
+ var/plush_saliith = /obj/item/toy/plush/lizardplushie/saliith
+
+ // Check if interaction involves the Saliith plush
+ if(istype(src, plush_saliith) || istype(Kisser, plush_saliith))
+ // Check if user is Saliith himself
+ if(user.ckey == "sandpoot")
+ // Return normally
+ return ..()
+
+ // User is not Saliith
+ // Warn in local chat
+ user.visible_message(span_warning("[user] tried to force [Kisser] to kiss [src] against their will, and has been yeeted!"), span_warning("You try to force [Kisser] to kiss [src], but get yeeted instead!"))
+
+ // Display voice of god message
+ say("YEET", spans = list("colossus","yell"))
+
+ // Play sound
+ playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 5)
+
+ // Drop the plushies if held
+ if(src in user.held_items)
+ user.dropItemToGround(src)
+ if(Kisser in user.held_items)
+ user.dropItemToGround(Kisser)
+
+ // Launch user away
+ var/turf/yeet_target = get_edge_target_turf(user, pick(GLOB.alldirs))
+ user.throw_at(yeet_target, 10, 14)
+ log_combat(src, user, "plush yeeted")
+
+ // Return
+ return
+
+ // Interaction does not involve Saliith
+ // Return normally
+ return ..()
+
+// Pinpointer for plushie toy
+/obj/item/pinpointer/plushie_saliith
+ name = "Saliith plushie pinpointer"
+ desc = "A handheld tracking device that locates Saliith's plushie."
+ icon = 'modular_sand/icons/obj/device.dmi'
+ icon_state = "pinpointer_saliith"
+
+/obj/item/pinpointer/plushie_saliith/scan_for_target()
+ set_target(GLOB.saliith_plushie, src)
diff --git a/modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi b/modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi
new file mode 100644
index 0000000000..e835a04b14
Binary files /dev/null and b/modular_sand/icons/mob/inhands/misc/plushes_lefthand.dmi differ
diff --git a/modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi b/modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi
new file mode 100644
index 0000000000..5e7d6316e9
Binary files /dev/null and b/modular_sand/icons/mob/inhands/misc/plushes_righthand.dmi differ
diff --git a/modular_sand/icons/obj/plushes.dmi b/modular_sand/icons/obj/plushes.dmi
index 0fbcb04f57..f2a4b18f47 100644
Binary files a/modular_sand/icons/obj/plushes.dmi and b/modular_sand/icons/obj/plushes.dmi differ
diff --git a/modular_sand/sound/voice/plush_1.ogg b/modular_sand/sound/voice/plush_1.ogg
new file mode 100644
index 0000000000..b638c547a1
Binary files /dev/null and b/modular_sand/sound/voice/plush_1.ogg differ
diff --git a/modular_sand/sound/voice/plush_2.ogg b/modular_sand/sound/voice/plush_2.ogg
new file mode 100644
index 0000000000..2d44558df6
Binary files /dev/null and b/modular_sand/sound/voice/plush_2.ogg differ
diff --git a/modular_sand/sound/voice/rawr.ogg b/modular_sand/sound/voice/rawr.ogg
new file mode 100644
index 0000000000..ae5a97b3e4
Binary files /dev/null and b/modular_sand/sound/voice/rawr.ogg differ
diff --git a/modular_sand/sound/voice/voice_alphys.ogg b/modular_sand/sound/voice/voice_alphys.ogg
new file mode 100644
index 0000000000..5b136e8f90
Binary files /dev/null and b/modular_sand/sound/voice/voice_alphys.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 84307334b3..76365725ad 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -4081,6 +4081,7 @@
#include "modular_sand\code\game\objects\items\devices\radio\headset.dm"
#include "modular_sand\code\game\objects\items\plushes\goat_boss.dm"
#include "modular_sand\code\game\objects\items\plushes\plushes.dm"
+#include "modular_sand\code\game\objects\items\plushes\saliith.dm"
#include "modular_sand\code\game\objects\items\robot\robot_upgrades.dm"
#include "modular_sand\code\game\objects\items\stacks\sheets\glass.dm"
#include "modular_sand\code\game\objects\items\stacks\sheets\mineral.dm"