Files
gavlaandGitHub 2d1899d874 Adds an Experiment and Milky plush (#5660)
## About The Pull Request

<img width="2048" height="1536" alt="image"
src="https://github.com/user-attachments/assets/b4cc8beb-3448-4a75-a193-cb9fad316820"
/>

🎨: [@Koklv_09](https://x.com/Koklv_09/status/2057418483688755627)  on X

This PR adds two plushies inspired from the hit game: Casualties Unknown
(Formerly "Scav: Prototype"). The sprites are originally from Wizden
SS14 and shares an appearance in its [own
game](https://scavprototype.wiki.gg/wiki/Plushie). Possibly confirming
shared universes??

Each Plush can be worn as a hat, have emissive eyes when worn, have
inhand sprites and are all very adorable.
Shout out to Orsoniks (rivey0 on discord) for the original spritework.
And nevimer for the code help.

## Why It's Good For The Game

This one goes out to all of the great times I've had on station
interacting with the Experiments. They deserve a tiny, cuddable version
of themselves!

## Proof Of Testing

<details>
<summary>Screenshots/Videos (Plushie interaction spoiler in
here!!)</summary>

Emissive preview:


https://github.com/user-attachments/assets/fd1b669b-36c3-4853-8b1b-4741de0b2b09

Unique Interaction preview:


https://github.com/user-attachments/assets/cddb1676-ec93-4c01-ae51-2ba20b853e21

</details>

## Changelog

🆑 shayoki, nevimer, orsoniks
add: Adds an experiment and milky plush. Both are available in the
loadout.
/🆑
2026-05-25 08:38:39 -07:00

831 lines
34 KiB
Plaintext

/obj/item/toy/plush/chaotic_toaster
name = "Chaotic toaster"
desc = "You arent sure if this plushie want a hug, or harvest your organs, or both."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "chaotic_toaster"
attack_verb_simple = list("beeped", "booped", "pinged")
squeak_override = list('sound/machines/beep/beep.ogg' = 1)
/obj/item/toy/plush/Synth
name = "Synth plushie"
desc = "An adorable stuffed toy that resembles a very happy synth."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "plushie_synth"
/obj/item/toy/plush/mal0
name = "Mal0 plushie"
desc = "An adorable stuffed toy that resembles something you download on your pda."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "plushie_mal0"
/obj/item/toy/plush/nobl
name = "fluffy skog plushie"
desc = "It seems to be a small canine, not necessarily latex like you would suspect for some reason, but extremely squishy."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "nobl"
squeak_override = list('modular_zubbers/sound/misc/dog_toy.ogg' = 1)
/obj/item/toy/plush/chirp_plush
name = "chirping synth Plushie"
desc = "It's warm to the touch."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "chirp"//Sprited by Kan3/kaylexi
attack_verb_continuous = list("chirps", "chimes")
attack_verb_simple = list("chirps")
squeak_override = list('sound/machines/beep/beep.ogg' = 1)
gender = FEMALE
/obj/item/toy/plush/bigdeer
name = "big deer plushie"
desc = "An incredibly round deer plush. It appears to have had too many berries for snack time."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "bigdeer" //sprited by Gavla
attack_verb_simple = list("puff", "smother")
squeak_override = list('modular_zubbers/sound/misc/squeakle.ogg' = 1)
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
inhand_icon_state = "bigdeer"
/obj/item/toy/plush/bubbledragon
name = "bubbledragon plushie"
desc = "This plush of a regal dragon seems to clean every surface it touches. When hugged, it squeaks and blows bubbles! An excellent companion for when TamaGoSlep"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "bubbledragon"
squeak_override = list('modular_zubbers/sound/misc/squeakle.ogg' = 1)
/obj/item/toy/plush/bubbledragon/Initialize(mapload)
. = ..()
AddComponent(/datum/component/cleaner, 3 SECONDS, pre_clean_callback=CALLBACK(src, PROC_REF(should_clean)))
/obj/item/toy/plush/bubbledragon/proc/should_clean(datum/cleaning_source, atom/atom_to_clean, mob/living/cleaner)
return (src in cleaner)
/obj/item/toy/plush/headcrab
name = "headcrab plushie"
desc = "A small, parasitic alien from the borderworld of Xen, this one is fake."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "headcrab"
/obj/item/toy/plush/bellybird
name = "bellybird plushie"
desc = "It has a tag on the back. 'You seen the opera, now get ready for the theatrical release with the new Bellybird plushie. House Feather's patented design allows this plushie to feel almost lifelike with its synthetic feathers and smoothed scales, glow in the dark eyes and a round tummy to rest your head on, not to mention it comes complete with Autumn the snake tail! Witness Autumn in action as this flexible tail is able to snap her jaws and hiss at any opponent with such realism. Order now for only two low payments of 19.95!'"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "bellybird"
squeak_override = list('modular_skyrat/modules/emotes/sound/emotes/hiss.ogg' = 1)
/obj/item/toy/plush/tiredtesh
name = "tired tesh plushie"
desc = "He looks very eepy. A tag on the back of the plushie reads, 'Happy birthday, big guy.'"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "tiredtesh"
squeak_override = list('modular_zubbers/sound/emotes/nose_boop.ogg' = 1)
/obj/item/toy/plush/xenoplush
name = "xenomorph plushie"
desc = "A cute rendition of the notorious xenomorph. Its stuffing is an acidic green colour."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "xenoplush"
squeak_override = list('sound/mobs/non-humanoids/hiss/hiss6.ogg' = 1)
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
inhand_icon_state = "xenoplush"
attack_verb_continuous = list("hisses at", "bites", "chews", "chomps", "tail stabs")
attack_verb_simple = list("hiss at", "bite", "chew", "chomp", "tail stab")
/obj/item/toy/plush/xenoplush/xenomaidplush
name = "xenomorph maid plushie"
desc = "A cute rendition of the notorious xenomorph, but in a maid costume. It's eager to help you clean the station."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "xenomaidplush"
attack_verb_continuous = list("polishes", "cleans", "tidies", "washes")
attack_verb_simple = list("polish", "clean", "tidy", "wash")
/obj/item/toy/plush/skyrat/jecca
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
/obj/item/toy/plush/purplecat
name = "Purple cat plushie"
desc = "A small, fluffy purple cat with an even purpler collar and bell. It also has a translucent green tail that rubbery to the touch."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "purplecat" //sprited by Bit_Synergy
attack_verb_simple = list("mew", "mow")
attack_verb_continuous = list("mews", "mows")
squeak_override = list('modular_zubbers/sound/misc/moew.ogg' = 1)
gender = FEMALE
/obj/item/toy/plush/largeredslime
name = "large red slime plushie" //Donator item exclusive for Blovy. Sprited by Casey/Keila.
desc = "The plushie is squishy to touch and smells strongly of strawberry."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "blovyplushie"
attack_verb_continuous = list("blorbles", "slimes", "absorbs")
attack_verb_simple = list("blorble", "slime", "absorb")
squeak_override = list('sound/effects/blob/blobattack.ogg' = 1)
/obj/item/toy/plush/tunafish
name = "Piscene Paddle" //Donator plush for Astroturf, sprited by Crumpaloo
desc = "Useful for more than just sashimi."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "tunafish"
attack_verb_continuous = list("slaps", "whacks")
attack_verb_simple = list("slap", "whack")
squeak_override = list('sound/items/weapons/slap.ogg' = 1)
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
inhand_icon_state = "tunafish"
/obj/item/toy/plush/secoff
name = "GalFed Secoff"
desc = "A soft toy representing a popular, young officer, representing the alliance between GalFed and NT. The bottom of his work boot says 'Andy'"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "secoff"
attack_verb_continuous = list("shoots (and misses)", "batongs", "annoys", "harmbatons", "magdumps")
attack_verb_simple = list("shot (and missed)", "batong", "annoy", "harmbaton", "magdump")
squeak_override = list('sound/items/weapons/gun/general/bolt_rack.ogg' = 1)
/obj/item/toy/plush/cescrewsplush
name = "Chief Screws Plush" //Plush for Steals The Screwdriver/SteamStucKobold, sprited by stickygoat. and Amorbis
desc = "An adorable blue Lizard plushie wearing a Chief Engineer's Uniform, Rocket Boots, and Meson Goggles. It has a strange, silicone pocket on its underside..."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "cescrewsplush"
attack_verb_continuous = list("slaps", "plaps", "smears")
attack_verb_simple = list("slap", "plap", "smear")
gender = FEMALE
squeak_override = list('sound/misc/soggy.ogg'=1)
/obj/item/toy/plush/cescrewsplush/examine(mob/user)
. = ..()
. += span_notice("Alt-click to take a look under her skirt.")
/obj/item/toy/plush/cescrewsplush/click_alt(mob/user)
user.visible_message(span_notice("[user] turns [src], revealing the hole underneath."), span_notice("You turn [src], revealing a tight, lubed hole."))
playsound(user, 'sound/effects/blob/blobattack.ogg', 50, TRUE)
var/obj/item/toy/plush/fleshlight/screws/toy = new(null)
qdel(src)
user.put_in_hands(toy)
return TRUE
/obj/item/toy/plush/internshiba
name = "Intern Shiba Plush" //Plush for Kazumi Hasegawa/sprited by Amorbis
desc = "An adorable shiba inu plushie of a well-known intern mutt."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "internshiba"
attack_verb_continuous = list("baps", "paws", "claws")
attack_verb_simple = list("bap", "paw", "claw")
gender = MALE
squeak_override = list('sound/mobs/non-humanoids/dog/growl2.ogg' = 1)
/obj/item/toy/plush/bottomsynf
name = "CentCom Synth Fox Plush"
desc = "The plush of a synth fox who enjoys being high in the chain of command. Or so it seems. It's wearing its favourite CentCom formal coat."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "bottomsynf"
attack_verb_continuous = list("emags", "hacks", "geckers")
attack_verb_simple = list("beeps", "boops", "pings", "geckers")
gender = MALE
squeak_override = list('sound/machines/terminal_alert_short.ogg' = 1)
// Silly plush for kurzaen, sprited and coded by Waterpig
// Spontaneously combusts when touched by other plushies
/obj/item/toy/plush/cat_annoying
name = "\improper Annoying Cat Plush"
desc = "This plush reeks of Green apples, and HATES physical affection. You can feel it looking at you with a judgmental gaze.."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "annoyingcat"
gender = MALE
squeak_override = list(
'modular_skyrat/modules/emotes/sound/voice/scream_m1.ogg' = 1,
'modular_skyrat/modules/emotes/sound/voice/scream_m2.ogg' = 1,
)
/obj/item/toy/plush/cat_annoying/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/toy/plush))
combust()
return ..()
/obj/item/toy/plush/cat_annoying/pre_attack(atom/A, mob/living/user, params)
if(istype(A, /obj/item/toy/plush))
combust()
return ..()
/obj/item/toy/plush/cat_annoying/proc/combust()
src.fire_act(5000)
src.visible_message(span_notice("The [src.name] spontaneously combusts from physical affection!"))
addtimer(CALLBACK(src, PROC_REF(ash)), 2 SECONDS)
/obj/item/toy/plush/cat_annoying/proc/ash()
new /obj/effect/decal/cleanable/ash(get_turf(src))
src.visible_message(span_warning("The [src.name] turns to ash!"))
qdel(src)
// Plush for Vanilla
/obj/item/toy/plush/suspicious_protogen
name = "\improper Suspicious protogen plush"
desc = "A suspicious pink looking protogen plushie commonly seen roaming the station almost everywhere, \
perfect for cuddling when you feel upset at something."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "pinkproot"
gender = FEMALE
squeak_override = list('modular_skyrat/modules/emotes/sound/emotes/dwoop.ogg' = 1)
// Plush for ZeferwasnttakenFR
/obj/item/toy/plush/foxy_plush
name = "tiny prankster fox plush"
desc = "A fox plush made to look like a certain prankster fox. Unsuprisingly it also smells like ocean breeze and a nice warm forge. \ Batteries not included for the plastic arm!"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "FoxyPlush"
gender = MALE
squeak_override = list('modular_zubbers/sound/emotes/claponce1.ogg' = 1)
// Rin/Yayyay007's plush
/obj/item/toy/plush/squeaky_toy
name = "squeaky rat plushie"
desc = "A plush made to order of a particular rodent. Smells like an awful lover. \ A small sticker says, TUG MY EARS!"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "squeaky_toy"
gender = MALE
squeak_override = list('sound/mobs/non-humanoids/mouse/mousesqueek.ogg' = 1)
// Sophie/Cydia's plush
/obj/item/toy/plush/androiddog
name = "android dog plushie"
desc = "A faded plushie toy of an android dog. Will not bite. \ A sticker says 'Push me!' on a little heart on the hand."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "androiddog"
gender = FEMALE
squeak_override = list('modular_zubbers/sound/emotes/arf.ogg' = 1)
// xPokee's plush
/obj/item/toy/plush/ghoul
name = "intern ghoul plushie"
desc = "Even the marketable plushie of this thing is utterly terrifying. At least it's cuddly..."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "johnghoul"
attack_verb_continuous = list("ghouls")
attack_verb_simple = list("ghoul")
// plushie for BeoTheKobold
// sprite by Cepha, code by Mitryll
/obj/item/toy/plush/mold_kobold
name = "hemophage awareness kobold"
desc = "A cuddly kobold plushie. Produced by Nanotrasen in the soft likeness of a hemophage employee; \
focus groups thought this design played less into hemophage stereotypes as opposed to the previous iteration, \
Lord Grog the Vile Parasite. A tag on the left leg says 10% of proceeds go to blood banks!"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "themold"
attack_verb_continuous = list("bites", "curses", "drains")
attack_verb_simple = list("bite", "invoke", "claw")
gender = FEMALE
// Plushie for Decinomics
/obj/item/toy/plush/sinvox
name = "sinister vox plushie"
desc = "An evil looking toy. It's got a vox beak that splits into mandibles like a bug;\
its tail looks like a copy of the xenomorph plushie stitched together poorly.\
Property and copyright of VOXXXED Studios..."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "sinvox"
attack_verb_continuous = list("hisses at", "bites", "mauls", "quills", "tail stabs")
attack_verb_simple = list("hiss at", "bite", "maul", "quill", "tail stab")
gender = MALE
squeak_override = list(
'sound/mobs/non-humanoids/hiss/hiss2.ogg' = 1,
'modular_skyrat/modules/emotes/sound/emotes/voxrustle.ogg' = 1,
)
/obj/item/toy/plush/mothroach_plush
name = "mothroach plush"
desc = "A plushie featuring the likeness everyone's favorite genetic freak-turned station pet. Do not soak it in milk and throw it against a wall."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "mothroach"
attack_verb_continuous = list("mothroaches", "moths", "roaches")
attack_verb_simple = list("mothroach", "moth", "roach")
gender = MALE
squeak_override = list( 'sound/mobs/humanoids/moth/scream_moth.ogg' = 1, )
/obj/item/toy/plush/moth/lovers
name = "lovers moth plushie"
desc = "An adorable mothperson plushie. It's a lovely bug!"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "moffplush_lovers"
/obj/item/toy/plush/lazy_synth
name = "lazy synth plush"
desc = "A soft plush of an extremely lazy synth. Might be found loafing in random places."
attack_verb_continuous = list("squishes", "loafs on", "sleeps on", "eggs")
attack_verb_simple = list("squish", "loaf on", "sleep on", "egg")
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "lazy_synth"
squeak_override = list('modular_zubbers/sound/misc/squeakle.ogg' = 1)
/obj/item/toy/plush/goatplushie
name = "strange goat plushie"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "goat"
desc = "Despite its cuddly appearance and plush nature, it will beat you up all the same. Goats never change."
squeak_override = list('sound/items/weapons/punch1.ogg'=1)
/// Whether or not this goat is currently taking in a monsterous doink
var/going_hard = FALSE
/// Whether or not this goat has been flattened like a funny pancake
var/splat = FALSE
/obj/item/toy/plush/goatplushie/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
COMSIG_TURF_INDUSTRIAL_LIFT_ENTER = PROC_REF(splat),
)
AddElement(/datum/element/connect_loc, loc_connections)
/obj/item/toy/plush/goatplushie/attackby(obj/item/cigarette/rollie/fat_dart, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(fat_dart))
return ..()
if(splat)
to_chat(user, span_notice("[src] doesn't seem to be able to go hard right now."))
return
if(going_hard)
to_chat(user, span_notice("[src] is already going too hard!"))
return
if(!fat_dart.lit)
to_chat(user, span_notice("You'll have to light that first!"))
return
to_chat(user, span_notice("You put [fat_dart] into [src]'s mouth."))
qdel(fat_dart)
going_hard = TRUE
update_icon(UPDATE_OVERLAYS)
/obj/item/toy/plush/goatplushie/proc/splat(datum/source)
SIGNAL_HANDLER
if(splat)
return
if(going_hard)
going_hard = FALSE
update_icon(UPDATE_OVERLAYS)
icon_state = "goat_splat"
playsound(src, SFX_DESECRATION, 50, TRUE)
visible_message(span_danger("[src] gets absolutely flattened!"))
splat = TRUE
/obj/item/toy/plush/goatplushie/examine()
. = ..()
if(splat)
. += span_notice("[src] might need medical attention.")
if(going_hard)
. += span_notice("[src] is going so hard, feel free to take a picture.")
/obj/item/toy/plush/goatplushie/update_overlays()
. = ..()
if(going_hard)
. += "goat_dart"
/obj/item/toy/plush/sunny_plush
name = "weighty moostoat plushie"
desc = "A soft, weighted plushie of a moostoat. Very comfortable to hug and have lying on you. It smells of fresh milk."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "sunny_plush"
squeak_override = list(
'modular_skyrat/modules/emotes/sound/voice/moo.ogg' = 1,
'sound/mobs/non-humanoids/stoat/stoat_sounds.ogg' = 1,
)
//Plushie for and by Lazhannya
//Original Design by Cepha
/obj/item/toy/plush/amber_shadekin_plush
name = "Squishy Shadekin Plush"
desc = "A plushie featuring the likeness of a certain self declared mad genius shadekin. It smells faintly of cinnamon."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "amberalert"
attack_verb_continuous = list("mars at", "bites", "chomps", "paws at", "fwoomps", "marmars")
attack_verb_simple = list("mar", "bite", "chomp", "paw", "fwoomp", "marmar")
gender = FEMALE
squeak_override = list('modular_zubbers/sound/emotes/sound_voice_mar.ogg' = 1)
//Marketable Plushie of Vega VI, made by Ssalty
/obj/item/toy/plush/ethereal
name = "businessman ethereal plush"
desc = "A plushie showing a succesful ethereal, manufactured in attempts to raise visibility of Sproutians and their culture, and 3% are going to charity! Its shoe-straps can be tugged on to activate the voicebox, playing real ethereal noises!"
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "ethereal"
attack_verb_continuous = list("businesscard-slaps", "financially educates", "threatens to sue", "zaps", "bzzts", "buzzes")
attack_verb_simple = list("businesscard-slap", "financially educate", "threaten to sue", "zap", "bzzt", "buzz")
squeak_override = list('sound/effects/sparks/sparks1.ogg' = 98, 'sound/mobs/non-humanoids/hygienebot/cutarteries.ogg' = 1, 'sound/items/dump_it.ogg' = 1)
//Plushie for Roxy, of Cellophane
/obj/item/toy/plush/cello_plush
var/shirt = TRUE
name = "concerningly large merseed plush"
desc = "A large, silky-soft plushie of a merseed dragon. When you hug it, you can't get your arms around it no matter how hard you try."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
icon_state = "celloplush"
inhand_icon_state = "celloplush-shirt"
attack_verb_continuous = list("squishes", "smothers", "smacks", "bullies", "pancakes", "flops at", "smears", "dents")
attack_verb_simple = list("squish", "smother", "smack", "bully", "pancake", "flop", "smear", "dent")
gender = FEMALE
squeak_override = list(
'sound/mobs/non-humanoids/fish/fish_slap1.ogg' = 1, 'sound/mobs/non-humanoids/fish/fish_slap2.ogg' = 1,
)
/obj/item/toy/plush/cello_plush/click_alt(mob/user)
shirt = !shirt
if(!shirt)
balloon_alert(user, "tummy shown...")
icon_state = "celloplush-alt"
inhand_icon_state = "celloplush-alt"
else
balloon_alert(user, "tummy tucked away...")
icon_state = "celloplush"
inhand_icon_state = "celloplush-shirt"
update_inhand_icon()
return ..()
//Plushie for / of MyrThel
/obj/item/toy/plush/myrthel_plush
var/myrfire = TRUE
light_system = COMPLEX_LIGHT
light_range = 2
light_power = 1.4
light_color = COLOR_LIGHT_ORANGE
light_on = FALSE
name = "extra hot moth plush"
desc = "An action plush of a mothic engineer. Comes with family-friendly, self-igniting action! Not a viable source of heat, or fire. "
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
icon_state = "myrthel-plush"
inhand_icon_state = "myrthelplush"
attack_verb_continuous = list("smacks", "beans", "paffs", "buzzes", "dents")
attack_verb_simple = list("smack", "bean", "paff", "buzz", "dent")
gender = MALE
squeak_override = list(
'sound/mobs/humanoids/moth/moth_death.ogg' = 3,
'sound/mobs/humanoids/moth/moth_chitter.ogg' = 3,
'sound/mobs/humanoids/moth/moth_flutter.ogg' = 3,
'sound/mobs/humanoids/moth/moth_squeak.ogg' = 3,
'sound/items/weapons/emitter.ogg' = 1,
'sound/items/weapons/emitter2.ogg' = 1,
'sound/effects/sparks/sparks4.ogg' = 1,
)
/obj/item/toy/plush/myrthel_plush/click_alt(mob/user)
myrfire = !myrfire
if(!myrfire)
set_light_on(TRUE)
playsound(src, 'sound/effects/fire_puff.ogg', 20, TRUE)
playsound(src, 'sound/mobs/humanoids/moth/scream_moth.ogg', 20, TRUE)
icon_state = "myrthel-plush-fire"
else
set_light_on(FALSE)
playsound(src, 'sound/effects/wounds/sizzle2.ogg', 10, TRUE)
icon_state = "myrthel-plush"
update_light()
return ..()
// Plushie coded and sprited by Mathilde.
// Props to Seijan-Etroix for helping with the design!
/obj/item/toy/plush/tian_plush
name = "bureaucratic goat plush"
desc = "A giant, weighted plushie of a goat-carp bureaucrat, who seems to be very hungry for paper(work). It's nearly impossible to get your arms all the way around her.<br><br><span style=color:#6685F5><i>A tag on the back reads 'Comfort provided under official licence.'</i></span>"
attack_verb_continuous = list("stomps", "smothers", "buries", "squishes", "nibbles", "gnashes", "flattens", "pummels", "chomps")
attack_verb_simple = list("stomp", "smother", "bury", "squish", "nibble", "gnash", "flatten", "pummel", "chomp")
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "tianplush"
gender = FEMALE
squeak_override = list('modular_zubbers/sound/misc/meatybaa.ogg'=1)
var/shirt = TRUE
var/bg_color = "#9b2e8c"
var/static/list/folder_insertables = typecacheof(list(
/obj/item/paper,
/obj/item/photo,
/obj/item/documents,
/obj/item/paperwork,
))
/obj/item/toy/plush/tian_plush/interact(mob/user)
return
/obj/item/toy/plush/tian_plush/attack_self_secondary(mob/user, modifiers)
. = ..()
if(.)
return
add_fingerprint(user)
ui_interact(user)
return TRUE
/obj/item/toy/plush/tian_plush/attack_hand_secondary(mob/user, list/modifiers)
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return
add_fingerprint(user)
ui_interact(user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
//Plot armour
/obj/item/toy/plush/tian_plush/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(I.get_sharpness())
to_chat(user, span_notice("[I] just bounces off!"))
return
return ..()
//The plushie works exactly like a folder
/obj/item/toy/plush/tian_plush/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(is_type_in_typecache(tool, folder_insertables))
if(!user.transferItemToLoc(tool, src, silent = FALSE))
return ITEM_INTERACT_BLOCKING
balloon_alert(user, "nom!")
return ITEM_INTERACT_SUCCESS
return NONE
/obj/item/toy/plush/tian_plush/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!is_type_in_typecache(interacting_with, folder_insertables))
return NONE
var/obj/item/item_to_insert = interacting_with
if(item_to_insert.loc == user)
if(!user.transferItemToLoc(item_to_insert, src, silent = TRUE))
return ITEM_INTERACT_BLOCKING
else
item_to_insert.do_pickup_animation(src)
item_to_insert.forceMove(src)
playsound(src, item_to_insert.pickup_sound, PICKUP_SOUND_VOLUME, item_to_insert.sound_vary, ignore_walls = FALSE)
balloon_alert(user, "nom!")
return ITEM_INTERACT_SUCCESS
/obj/item/toy/plush/tian_plush/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Folder")
ui.open()
/obj/item/toy/plush/tian_plush/ui_data(mob/user)
var/list/data = list()
data["bg_color"] = "[bg_color]"
data["folder_name"] = "[name]"
data["contents"] = list()
data["contents_ref"] = list()
for(var/Content in src)
data["contents"] += "[Content]"
data["contents_ref"] += "[REF(Content)]"
return data
/obj/item/toy/plush/tian_plush/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
if(usr.stat != CONSCIOUS || HAS_TRAIT(usr, TRAIT_HANDS_BLOCKED))
return
switch(action)
if("remove")
var/obj/item/Item = locate(params["ref"]) in src
if(istype(Item))
Item.forceMove(usr.loc)
usr.put_in_hands(Item)
to_chat(usr, span_notice("You remove [Item] from [src]."))
. = TRUE
if("examine")
var/obj/item/Item = locate(params["ref"]) in src
if(istype(Item))
usr.examinate(Item)
. = TRUE
//Belly
/obj/item/toy/plush/tian_plush/click_alt(mob/user)
shirt = !shirt
if(!shirt)
balloon_alert(user, "tummy shown...")
icon_state = "tianplush-alt"
else
balloon_alert(user, "tummy tucked away...")
icon_state = "tianplush"
return ..()
// Plushling, used when plushnium reactions fail
/obj/item/toy/plush/plushling
name = "peculiar plushie"
desc = "An adorable stuffed toy- wait, did it just move?"
/// Cooldown ticks between absorbs
var/absorb_cooldown = 100
/// When can it absorb another plushie
var/next_absorb = 0
var/check_interval = 20
var/next_check = 0
/obj/item/toy/plush/plushling/attack_self(mob/user)
if(!user)
return
to_chat(user, span_warning("You try to pet the plushie, but recoil as it bites your hand instead! OW!"))
var/mob/living/carbon/human/human_user = user
if(!human_user)
return
human_user.add_mood_event("plush_bite", /datum/mood_event/plush_bite)
human_user.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
addtimer(CALLBACK(human_user, TYPE_PROC_REF(/mob/living/carbon/human, dropItemToGround), src, TRUE), 1)
/obj/item/toy/plush/plushling/New()
var/initial_state = pick("mothroach", "moffplush_lovers", "johnghoul")
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = initial_state
START_PROCESSING(SSobj, src)
return ..()
/obj/item/toy/plush/plushling/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
/obj/item/toy/plush/plushling/process()
if(world.time < next_absorb || world.time < next_check)
return
next_check = world.time + check_interval
var/obj/item/toy/plush/target
for(var/obj/item/toy/plush/possible_target in loc) //First, it tries to get anything in its same location, be it a tile or a backpack
if(possible_target == src || istype(possible_target, /obj/item/toy/plush/plushling))
continue
target = possible_target
break
if(!target)
if(!isturf(loc))
return
for(var/obj/item/toy/plush/adjacent_plush in oview(1, src)) //If that doesn't work, it hunts for plushies adjacent to its own tile
if(istype(adjacent_plush, /obj/item/toy/plush/plushling)) //These do not hunt their own kind
continue
src.throw_at(adjacent_plush, 1, 2)
visible_message(span_danger("[src] leaps at [adjacent_plush]!"))
break
return
if(istype(target, /obj/item/toy/plush/plushling)) //These do not consume their own.
return
next_absorb = world.time + absorb_cooldown
plushie_absorb(target)
/obj/item/toy/plush/plushling/proc/plushie_absorb(obj/item/toy/plush/victim)
if(!victim)
return
visible_message(span_warning("[src] gruesomely mutilates [victim], leaving nothing more than dust!"))
name = victim.name
desc = victim.desc + " Wait, did it just move..?"
icon_state = victim.icon_state
squeak_override = victim.squeak_override
new /obj/effect/decal/cleanable/ash(get_turf(victim))
qdel(victim)
/obj/item/toy/plush/plushling/love(obj/item/toy/plush/kisser, mob/living/user) //You shouldn't have come here, poor plush.
if(!kisser)
return
plushie_absorb(kisser)
/obj/item/toy/plush/aeri
name = "Interdimensional Terrorist Plushie"
desc = "A highly controversial silicone 'plushie' modeled after its infamous namesake. Pulled from most storefronts after a spectacular public backlash, it now survives mainly through grey-market resellers. Rumor has it a few limited-run units shipped with a functional handheld railgun."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
icon_state = "aeri"
inhand_icon_state = null
attack_verb_continuous = list("cuddles", "squeaks", "hugs", "caresses")
attack_verb_simple = list("cuddle", "squeak", "hug", "caress")
squeak_override = list(
'modular_zubbers/sound/lewd/rubber1.ogg' = 1,
'modular_zubbers/sound/lewd/rubber2.ogg' = 1,
'modular_zubbers/sound/lewd/rubber3.ogg' = 1
)
var/clothed = TRUE
/obj/item/toy/plush/aeri/Initialize(mapload)
. = ..()
update_plush_state()
/obj/item/toy/plush/aeri/proc/update_plush_state()
if(clothed)
name = "Interdimensional Terrorist Plushie"
desc = "A highly controversial silicone 'plushie' modeled after its infamous namesake. Pulled from most storefronts after a spectacular public backlash, it now survives mainly through grey-market resellers. Rumor has it a few limited-run units shipped with a functional handheld railgun."
icon_state = "aeri"
//probably not necessary to put the verb and squeak override once again here but it kinda bugs out if I don't
attack_verb_continuous = list("cuddles", "squeaks", "hugs", "caresses")
attack_verb_simple = list("cuddle", "squeak", "hug", "caress")
squeak_override = list(
'modular_zubbers/sound/lewd/rubber1.ogg' = 1,
'modular_zubbers/sound/lewd/rubber2.ogg' = 1,
'modular_zubbers/sound/lewd/rubber3.ogg' = 1
)
hitsound = initial(hitsound)
else
name = "Interdimensional terrorist Doll"
desc = "Without the outfit, the 'plushie' label becomes much harder to defend. Beneath the clothing is a glossy, stretchable silicone shell with ribbed orifices and breasts that experts have described as 'Fuckable'."
icon_state = "aeri-alt"
attack_verb_continuous = list("cuddles", "squeaks", "hugs", "caresses")
attack_verb_simple = list("cuddle", "squeak", "hug", "caress")
squeak_override = list(
'modular_zubbers/sound/lewd/rubber1.ogg' = 1,
'modular_zubbers/sound/lewd/rubber2.ogg' = 1,
'modular_zubbers/sound/lewd/rubber3.ogg' = 1
)
hitsound = null
inhand_icon_state = null
update_appearance()
update_inhand_icon()
/obj/item/toy/plush/aeri/examine(mob/user)
. = ..()
if(clothed)
. += span_purple("Alt-click to remove the plushie's clothes.")
else
. += span_purple("Alt-click to dress the doll back up.")
/obj/item/toy/plush/aeri/click_alt(mob/user)
clothed = !clothed
if(clothed)
to_chat(user, span_notice("You dress [src] back up."))
else
to_chat(user, span_notice("You remove [src]'s clothes."))
playsound(user, 'modular_zubbers/sound/lewd/rubber1.ogg', 50, TRUE)
update_plush_state()
return TRUE
/obj/item/toy/plush/aeri/attack(mob/living/carbon/human/target, mob/living/carbon/human/user)
if(clothed)
return ..()
var/obj/item/toy/plush/fleshlight/proxy = new(loc)
proxy.name = name
proxy.desc = desc
proxy.icon = icon
proxy.icon_state = icon_state
. = proxy.attack(target, user)
qdel(proxy)
//If you suicide with this toy it just summons a BSA smite on you
/obj/item/toy/plush/aeri/suicide_act(mob/living/carbon/human/user)
user.visible_message(span_suicide("[user] angers the plushie! Oh god, it's locking a Bluespace Artillery strike onto [user.p_them()]! It looks like [user.p_theyre()] trying to kill [user.p_them()]self!"))
var/datum/smite/bsa/bluespace_smite = new()
bluespace_smite.effect(user.client, user)
return BRUTELOSS
//Sprite from SS14 Main. Sprited by Orsoniks (rivey0 on discord)
/obj/item/toy/plush/expie
name = "Experiment Plushie"
icon_state = "expie"
slot_flags = ITEM_SLOT_HEAD
worn_icon = 'modular_zubbers/icons/mob/clothing/head/hats.dmi'
worn_icon_state = "expie"
desc = "A plushie of a canid of sorts. It yearns to be detonated on a landmine."
icon = 'modular_zubbers/icons/obj/toys/plushes.dmi'
attack_verb_simple = list("bark", "growl", "whine")
squeak_override = list('modular_zubbers/sound/misc/plushie.ogg' = 1)
lefthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_lefthand.dmi'
righthand_file = 'modular_zubbers/icons/mob/inhands/items/plushes_righthand.dmi'
inhand_icon_state = "expie"
/obj/item/toy/plush/expie/worn_overlays(mutable_appearance/standing, isinhands, icon_file) //emissive glow when worn on head.
. = ..()
if(!isinhands)
. += emissive_appearance(icon_file, "[icon_state]-emissive", src, alpha = src.alpha, effect_type = EMISSIVE_BLOOM)
/obj/item/toy/plush/expie/item_interaction(mob/living/feeder, obj/item/reagent_containers/applicator/pill/enom, list/modifiers)
if(!istype(enom))
return ..()
enom.forceMove(src) // pill go into the expie stummy
to_chat(feeder, span_notice("You feed the [enom] to [src] and watch as it eats..."))
playsound(src, 'modular_zubbers/sound/misc/eatcrunch.ogg', 75, TRUE)
addtimer(CALLBACK(src, PROC_REF(eat), feeder, enom), 3 SECONDS)
return ITEM_INTERACT_SUCCESS
/obj/item/toy/plush/expie/proc/eat(mob/living/feeder, obj/item/reagent_containers/applicator/pill/enom)
if(istype(enom, /obj/item/reagent_containers/applicator/pill))
SpinAnimation(speed = 0.3 SECONDS, loops = 3)
qdel(enom)
return
//expie reacts to being splashed
/obj/item/toy/plush/expie/proc/splash_reagents()
SIGNAL_HANDLER
playsound(src, 'modular_zubbers/sound/misc/dogshake.ogg', 75)
spasm_animation(2 SECONDS)
visible_message(span_warning("[src] gets soaked and shakes itself off!"))
/obj/item/toy/plush/expie/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_ATOM_SPLASHED, PROC_REF(splash_reagents))
/datum/reagent/consumable/milk/expose_obj(obj/exposed_obj, reac_volume, methods=TOUCH, show_message=TRUE) //spill milk on the expie to make it milky
. = ..()
if(!istype(exposed_obj, /obj/item/toy/plush/expie))
return
var/obj/item/toy/plush/expie/milked = exposed_obj
milked.name = /obj/item/toy/plush/expie/milky::name
milked.desc = /obj/item/toy/plush/expie/milky::desc
milked.worn_icon_state = /obj/item/toy/plush/expie/milky::worn_icon_state
milked.icon_state = /obj/item/toy/plush/expie/milky::icon_state
milked.inhand_icon_state = /obj/item/toy/plush/expie/milky::inhand_icon_state
/obj/item/toy/plush/expie/milky
name = "Milky Plushie"
desc = "A plushie of snowy-white, furred canid. Maybe it'll trade something with you?"
worn_icon_state = "milky"
icon_state = "milky"
inhand_icon_state = "milky"