Extra Plushies + Plushify Spell (#27384)

* Plushie PR

TODO-
Fix borgs becoming mind
Add to smite list
Add diona plush effect

* Fixed Issues

Added alien plush
Added loadout
Yeah

* Apply suggestions from code review

Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Signed-off-by: Drakeven <50409888+Drakeven@users.noreply.github.com>

* WIP

Will finish later

* Fixed the various issues

Should be working now! Changed the bread smite to a 'generic item' smite and then made it a specifcally breaded smite.

* Minor typo fixing

And stuff

* WIP Conversion

Converting all the attacks into more sleek attacks, will need to finish.

* Fixes galore

Yippie!

* Russian revolver wasn't working

now you can self-shoot again! Horay!

* You can no longer eat spraycans

IPC clowns everywhere devistated

* Apply suggestions from code review

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
Signed-off-by: Drakeven <50409888+Drakeven@users.noreply.github.com>

* A tinsy bit of touching up

:)

---------

Signed-off-by: Drakeven <50409888+Drakeven@users.noreply.github.com>
Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com>
Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
Drakeven
2024-12-23 16:09:24 +00:00
committed by GitHub
co-authored by Contrabang Luc Burzah
parent 33eaf8ae42
commit a5726efe0c
38 changed files with 668 additions and 264 deletions
+21 -20
View File
@@ -33,6 +33,8 @@
var/preset_message
/// The index of the character in the message that will be drawn next.
var/preset_message_index = 0
/// Can this crayon be consumed or not
var/consumable = TRUE
/obj/item/toy/crayon/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is jamming the [name] up [user.p_their()] nose and into [user.p_their()] brain. It looks like [user.p_theyre()] trying to commit suicide!</span>")
@@ -42,7 +44,9 @@
..()
drawtype = pick(pick(graffiti), pick(letters), "rune[rand(1, 8)]")
/obj/item/toy/crayon/attack_self__legacy__attackchain(mob/living/user as mob)
/obj/item/toy/crayon/activate_self(mob/user)
if(..())
return
update_window(user)
/obj/item/toy/crayon/proc/update_window(mob/living/user as mob)
@@ -105,9 +109,12 @@
drawtype = temp
update_window(usr)
/obj/item/toy/crayon/afterattack__legacy__attackchain(atom/target, mob/user, proximity)
if(!proximity) return
if(busy) return
/obj/item/toy/crayon/after_attack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity_flag)
return
if(busy)
return
if(is_type_in_list(target,validSurfaces))
var/temp = "rune"
if(preset_message_index > 0)
@@ -137,8 +144,10 @@
qdel(src)
busy = FALSE
/obj/item/toy/crayon/attack__legacy__attackchain(mob/M, mob/user)
if(M == user)
/obj/item/toy/crayon/attack(mob/living/target, mob/living/carbon/human/user)
if(..() || !consumable)
return FINISH_ATTACK
if(target == user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(!H.check_has_mouth())
@@ -152,8 +161,6 @@
else
to_chat(user, "<span class='warning'>There is no more of [name] left!</span>")
qdel(src)
else
..()
/obj/item/toy/crayon/examine(mob/user)
. = ..()
@@ -255,9 +262,6 @@
dye_color = DYE_MIME
uses = 0
/obj/item/toy/crayon/mime/attack_self__legacy__attackchain(mob/living/user as mob)
update_window(user)
/obj/item/toy/crayon/mime/update_window(mob/living/user as mob)
dat += "<center><span style='border:1px solid #161616; background-color: [colour];'>&nbsp;&nbsp;&nbsp;</span><a href='byond://?src=[UID()];color=1'>Change color</a></center>"
..()
@@ -281,9 +285,6 @@
dye_color = DYE_RAINBOW
uses = 0
/obj/item/toy/crayon/rainbow/attack_self__legacy__attackchain(mob/living/user as mob)
update_window(user)
/obj/item/toy/crayon/rainbow/update_window(mob/living/user as mob)
dat += "<center><span style='border:1px solid #161616; background-color: [colour];'>&nbsp;&nbsp;&nbsp;</span><a href='byond://?src=[UID()];color=1'>Change color</a></center>"
..()
@@ -312,15 +313,15 @@
instant = TRUE
validSurfaces = list(/turf/simulated/floor,/turf/simulated/wall)
dye_color = null // not technically a crayon, so we're not gonna have it dye stuff in the laundry machine
consumable = FALSE // To stop you from eating spraycans. It's TOO SILLY!
/obj/item/toy/crayon/spraycan/New()
..()
update_icon()
/obj/item/toy/crayon/spraycan/attack__legacy__attackchain(mob/M, mob/user)
return // To stop you from eating spraycans. It's TOO SILLY!
/obj/item/toy/crayon/spraycan/attack_self__legacy__attackchain(mob/living/user)
/obj/item/toy/crayon/spraycan/activate_self(mob/user)
if(..())
return
var/choice = tgui_input_list(user, "Do you want to...", "Spraycan Options", list("Toggle Cap","Change Drawing", "Change Color"))
switch(choice)
if("Toggle Cap")
@@ -335,9 +336,9 @@
return
update_icon()
/obj/item/toy/crayon/spraycan/afterattack__legacy__attackchain(atom/target, mob/user as mob, proximity)
/obj/item/toy/crayon/spraycan/after_attack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity)
if(!proximity_flag)
return
if(capped)
to_chat(user, "<span class='warning'>You cannot spray [target] while the cap is still on!</span>")
+9 -6
View File
@@ -14,7 +14,9 @@
return ..()
// Attack self
/obj/item/toy/plushie/carpplushie/dehy_carp/attack_self__legacy__attackchain(mob/user as mob)
/obj/item/toy/plushie/carpplushie/dehy_carp/activate_self(mob/user)
if(..())
return
src.add_fingerprint(user) // Anyone can add their fingerprints to it with this
if(owned)
to_chat(user, "<span class='notice'>[src] stares up at you with friendly eyes.</span>")
@@ -27,14 +29,15 @@
if(volume >= 1)
Swell()
/obj/item/toy/plushie/carpplushie/dehy_carp/afterattack__legacy__attackchain(obj/O, mob/user,proximity)
if(!proximity) return
if(istype(O,/obj/structure/sink))
/obj/item/toy/plushie/carpplushie/dehy_carp/after_attack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity_flag)
return
if(istype(target,/obj/structure/sink))
to_chat(user, "<span class='notice'>You place [src] under a stream of water...</span>")
user.drop_item()
loc = get_turf(O)
loc = get_turf(target)
return Swell()
..()
/obj/item/toy/plushie/carpplushie/dehy_carp/proc/Swell()
desc = "It's growing!"
+420 -168
View File
@@ -24,6 +24,7 @@
throw_speed = 4
throw_range = 20
force = 0
new_attack_chain = TRUE
/*
@@ -40,21 +41,23 @@
..()
create_reagents(10)
/obj/item/toy/balloon/attack__legacy__attackchain(mob/living/carbon/human/M as mob, mob/user as mob)
return
/obj/item/toy/balloon/pre_attack(atom/target, mob/living/user, params)
..()
return FINISH_ATTACK
/obj/item/toy/balloon/afterattack__legacy__attackchain(atom/A, mob/user, proximity)
if(!proximity)
/obj/item/toy/balloon/after_attack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity_flag)
return
if(istype(A, /obj/structure/reagent_dispensers))
var/obj/structure/reagent_dispensers/RD = A
if(istype(target, /obj/structure/reagent_dispensers))
var/obj/structure/reagent_dispensers/RD = target
if(RD.reagents.total_volume <= 0)
to_chat(user, "<span class='warning'>[RD] is empty.</span>")
else if(reagents.total_volume >= 10)
to_chat(user, "<span class='warning'>[src] is full.</span>")
else
A.reagents.trans_to(src, 10)
to_chat(user, "<span class='notice'>You fill the balloon with the contents of [A].</span>")
target.reagents.trans_to(src, 10)
to_chat(user, "<span class='notice'>You fill the balloon with the contents of [target].</span>")
desc = "A translucent balloon with some form of liquid sloshing around in it."
update_icon()
@@ -66,20 +69,22 @@
update_icon()
return
/obj/item/toy/balloon/attackby__legacy__attackchain(obj/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/drinks/drinkingglass))
if(O.reagents)
if(O.reagents.total_volume < 1)
to_chat(user, "[O] is empty.")
else if(O.reagents.total_volume >= 1)
if(O.reagents.has_reagent("facid", 1))
/obj/item/toy/balloon/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(istype(attacking, /obj/item/reagent_containers/glass) || istype(attacking, /obj/item/reagent_containers/drinks/drinkingglass))
if(attacking.reagents)
if(attacking.reagents.total_volume < 1)
to_chat(user, "[attacking] is empty.")
else if(attacking.reagents.total_volume >= 1)
if(attacking.reagents.has_reagent("facid", 1))
to_chat(user, "The acid chews through the balloon!")
O.reagents.reaction(user)
attacking.reagents.reaction(user)
qdel(src)
else
desc = "A translucent balloon with some form of liquid sloshing around in it."
to_chat(user, "<span class='notice'>You fill the balloon with the contents of [O].</span>")
O.reagents.trans_to(src, 10)
to_chat(user, "<span class='notice'>You fill the balloon with the contents of [attacking].</span>")
attacking.reagents.trans_to(src, 10)
update_icon()
return
@@ -115,8 +120,8 @@
w_class = WEIGHT_CLASS_BULKY
var/lastused = null
/obj/item/toy/syndicateballoon/attack_self__legacy__attackchain(mob/user)
if(world.time - lastused < CLICK_CD_MELEE)
/obj/item/toy/syndicateballoon/activate_self(mob/user)
if(..() || world.time - lastused < CLICK_CD_MELEE)
return
var/playverb = pick("bat [src]", "tug on [src]'s string", "play with [src]")
user.visible_message("<span class='notice'>[user] plays with [src].</span>", "<span class='notice'>You [playverb].</span>")
@@ -184,7 +189,9 @@
w_class = WEIGHT_CLASS_SMALL
attack_verb = list("attacked", "struck", "hit")
/obj/item/toy/sword/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/sword/activate_self(mob/user)
if(..())
return
active = !active
if(active)
to_chat(user, "<span class='notice'>You extend the plastic blade with a quick flick of your wrist.</span>")
@@ -204,24 +211,24 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
add_fingerprint(user)
return
// Copied from /obj/item/melee/energy/sword/attackby
/obj/item/toy/sword/attackby__legacy__attackchain(obj/item/W, mob/living/user, params)
..()
if(istype(W, /obj/item/toy/sword))
if(W == src)
/obj/item/toy/sword/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(istype(attacking, /obj/item/toy/sword))
if(attacking == src)
to_chat(user, "<span class='notice'>You try to attach the end of the plastic sword to... Itself. You're not very smart, are you?</span>")
if(ishuman(user))
user.adjustBrainLoss(10)
else if((W.flags & NODROP) || (flags & NODROP))
to_chat(user, "<span class='notice'>\the [flags & NODROP ? src : W] is stuck to your hand, you can't attach it to \the [flags & NODROP ? W : src]!</span>")
var/mob/living/carbon/human/H = user
H.adjustBrainLoss(10)
else if((attacking.flags & NODROP) || (flags & NODROP))
to_chat(user, "<span class='notice'>\the [flags & NODROP ? src : attacking] is stuck to your hand, you can't attach it to \the [flags & NODROP ? attacking : src]!</span>")
else
to_chat(user, "<span class='notice'>You attach the ends of the two plastic swords, making a single double-bladed toy! You're fake-cool.</span>")
new /obj/item/dualsaber/toy(user.loc)
user.unEquip(W)
user.unEquip(attacking)
user.unEquip(src)
qdel(W)
qdel(attacking)
qdel(src)
/obj/item/toy/sword/chaosprank
@@ -229,9 +236,9 @@
/// Sets to TRUE once the character using it hits something and realises it's not a real energy sword
var/pranked = FALSE
/obj/item/toy/sword/attack__legacy__attackchain(mob/target, mob/living/user)
if(!cigarette_lighter_act(user, target))
return ..()
/obj/item/toy/sword/attack(mob/living/target, mob/living/carbon/human/user)
if(..() || cigarette_lighter_act(user, target))
return FINISH_ATTACK
/obj/item/toy/sword/cigarette_lighter_act(mob/living/user, mob/living/target, obj/item/direct_attackby_item)
var/obj/item/clothing/mask/cigarette/cig = ..()
@@ -283,8 +290,8 @@
target.unEquip(cig, TRUE)
return TRUE
/obj/item/toy/sword/chaosprank/afterattack__legacy__attackchain(mob/living/target, mob/living/user, proximity)
..()
/obj/item/toy/sword/chaosprank/after_attack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!pranked)
to_chat(user, "<span class='chaosverybad'>Oh... It's a fake.</span>")
name = "toy sword"
@@ -430,7 +437,9 @@
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/nuke/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/nuke/activate_self(mob/user)
if(..())
return
if(cooldown < world.time)
cooldown = world.time + 1800 //3 minutes
user.visible_message("<span class='warning'>[user] presses a button on [src]</span>", "<span class='notice'>You activate [src], it plays a loud noise!</span>", "<span class='notice'>You hear the click of a button.</span>")
@@ -462,11 +471,12 @@
desc += " This one is [item_color]."
icon_state = "therapy[item_color]"
/obj/item/toy/therapy/attack_self__legacy__attackchain(mob/user)
if(cooldown < world.time - 8)
to_chat(user, "<span class='notice'>You relieve some stress with \the [src].</span>")
playsound(user, 'sound/items/squeaktoy.ogg', 20, 1)
cooldown = world.time
/obj/item/toy/therapy/activate_self(mob/user)
if(..() || !(cooldown < world.time - 8))
return
to_chat(user, "<span class='notice'>You relieve some stress with \the [src].</span>")
playsound(user, 'sound/items/squeaktoy.ogg', 20, TRUE)
cooldown = world.time
/obj/random/therapy
name = "Random Therapy Doll"
@@ -585,20 +595,33 @@
var/list/poof_sound = list('sound/weapons/thudswoosh.ogg' = 1)
var/has_stuffing = TRUE //If the plushie has stuffing in it
var/obj/item/grenade/grenade //You can remove the stuffing from a plushie and add a grenade to it for *nefarious uses*
var/sound/rare_hug_sound
var/rare_hug_word
/// This is a variable that stores a mob that has been cursed into a plushie inside it.
var/mob/living/cursed_plushie_victim
COOLDOWN_DECLARE(rare_hug_cooldown)
/obj/item/toy/plushie/attack__legacy__attackchain(mob/M as mob, mob/user as mob)
/obj/item/toy/plushie/attack(mob/living/target, mob/living/carbon/human/user)
if(..())
return FINISH_ATTACK
playsound(loc, pickweight(poof_sound), 20, 1) // Play the whoosh sound in local area
if(iscarbon(M))
if(iscarbon(target))
if(prob(10))
M.reagents.add_reagent("hugs", 10)
return ..()
target.reagents.add_reagent("hugs", 10)
/obj/item/toy/plushie/attack_self__legacy__attackchain(mob/user as mob)
/obj/item/toy/plushie/activate_self(mob/user as mob)
if(..())
return
if(has_stuffing || grenade)
var/cuddle_verb = pick("hugs", "cuddles", "snugs")
user.visible_message("<span class='notice'>[user] [cuddle_verb] [src].</span>")
playsound(get_turf(src), poof_sound, 50, TRUE, -1)
if(rare_hug_sound && rare_hug_word && COOLDOWN_FINISHED(src, rare_hug_cooldown))
playsound(src, rare_hug_sound , 10, FALSE)
visible_message("<span class='danger'>[rare_hug_word]</span>")
COOLDOWN_START(src, rare_hug_cooldown, 3 SECONDS)
else
var/cuddle_verb = pick("hugs", "cuddles", "snugs")
user.visible_message("<span class='notice'>[user] [cuddle_verb] [src].</span>")
playsound(get_turf(src), pickweight(poof_sound), 50, TRUE, -1)
if(grenade && !grenade.active)
add_attack_logs(user, user, "activated a hidden grenade in [src].", ATKLOG_MOST)
playsound(loc, 'sound/weapons/armbomb.ogg', 10, TRUE, -3)
@@ -606,48 +629,67 @@
addtimer(CALLBACK(src, PROC_REF(explosive_betrayal), grenade), rand(1, 3) SECONDS)
else
to_chat(user, "<span class='notice'>You try to pet [src], but it has no stuffing. Aww...</span>")
return ..()
/obj/item/toy/plushie/proc/explosive_betrayal(obj/item/grenade/grenade_callback)
var/grenade_inside = FALSE //Any grenade, even non-explosive, will destroy the plushie.
if(grenade)
grenade_inside = TRUE
grenade_callback.prime()
if(grenade_inside && !QDELETED(src))
qdel(src)
/obj/item/toy/plushie/Destroy()
QDEL_NULL(grenade)
QDEL_NULL(cursed_plushie_victim)
return ..()
/obj/item/toy/plushie/attackby__legacy__attackchain(obj/item/I, mob/living/user, params)
if(I.sharp)
/obj/item/toy/plushie/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(attacking.sharp)
if(!grenade)
if(!has_stuffing)
to_chat(user, "<span class='warning'>You already murdered it!</span>")
return
return FINISH_ATTACK
user.visible_message("<span class='warning'>[user] tears out the stuffing from [src]!</span>", "<span class='notice'>You rip a bunch of the stuffing from [src]. Murderer.</span>")
I.play_tool_sound(src)
attacking.play_tool_sound(src)
has_stuffing = FALSE
else
to_chat(user, "<span class='notice'>You remove the grenade from [src].</span>")
grenade.forceMove(get_turf(src))
user.put_in_hands(grenade)
grenade = null
return
if(istype(I, /obj/item/grenade))
return FINISH_ATTACK
if(istype(attacking, /obj/item/grenade))
if(has_stuffing)
to_chat(user, "<span class='warning'>You need to remove some stuffing first!</span>")
return
return FINISH_ATTACK
if(grenade)
to_chat(user, "<span class='warning'>[src] already has a grenade!</span>")
return
return FINISH_ATTACK
if(!user.drop_item())
to_chat(user, "<span class='warning'>[I] is stuck to you and cannot be placed into [src].</span>")
return
user.visible_message("<span class='warning'>[user] slides [I] into [src].</span>", \
"<span class='warning'>You slide [I] into [src].</span>")
I.forceMove(src)
grenade = I
to_chat(user, "<span class='warning'>[attacking] is stuck to you and cannot be placed into [src].</span>")
return FINISH_ATTACK
user.visible_message("<span class='warning'>[user] slides [attacking] into [src].</span>", \
"<span class='warning'>You slide [attacking] into [src].</span>")
attacking.forceMove(src)
grenade = attacking
add_attack_logs(user, user, "placed a hidden grenade in [src].", ATKLOG_ALMOSTALL)
return FINISH_ATTACK
/obj/item/toy/plushie/proc/un_plushify()
if(!cursed_plushie_victim)
return
return ..()
cursed_plushie_victim.forceMove(get_turf(src))
cursed_plushie_victim.status_flags &= ~GODMODE
cursed_plushie_victim.notransform = FALSE
for(var/mob/living/simple_animal/shade/sword/generic_item/B in contents)
cursed_plushie_victim.key = B.key
break
cursed_plushie_victim = null
qdel(src)
/obj/random/plushie
name = "Random Plushie"
@@ -803,9 +845,8 @@
/obj/item/toy/plushie/greyplushie/proc/reset_hugdown()
hug_cooldown = FALSE //Resets the hug interaction cooldown.
/obj/item/toy/plushie/greyplushie/attack_self__legacy__attackchain(mob/user)//code for talking when hugged.
. = ..()
if(hug_cooldown)
/obj/item/toy/plushie/greyplushie/activate_self(mob/user)//code for talking when hugged.
if(..() || hug_cooldown)
return
hug_cooldown = TRUE
addtimer(CALLBACK(src, PROC_REF(reset_hugdown)), 5 SECONDS) //Hug interactions only put the plushie on a 5 second cooldown.
@@ -819,16 +860,8 @@
desc = "A stitched-together vox, fresh from the skipjack. Press its belly to hear it skree!"
icon_state = "plushie_vox"
item_state = "plushie_vox"
var/cooldown = 0
/obj/item/toy/plushie/voxplushie/attack_self__legacy__attackchain(mob/user)
if(!cooldown)
playsound(user, 'sound/voice/shriek1.ogg', 10, 0)
visible_message("<span class='danger'>Skreee!</span>")
cooldown = 1
spawn(30) cooldown = 0
return
..()
rare_hug_sound = 'sound/voice/shriek1.ogg'
rare_hug_word = "Skreee!"
/obj/item/toy/plushie/ipcplushie
name = "IPC plushie"
@@ -836,14 +869,15 @@
icon_state = "plushie_ipc"
item_state = "plushie_ipc"
/obj/item/toy/plushie/ipcplushie/attackby__legacy__attackchain(obj/item/B, mob/user, params)
if(istype(B, /obj/item/food/breadslice))
/obj/item/toy/plushie/ipcplushie/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(istype(attacking, /obj/item/food/breadslice))
new /obj/item/food/toast(get_turf(loc))
to_chat(user, "<span class='notice'>You insert bread into the toaster.</span>")
playsound(loc, 'sound/machines/ding.ogg', 50, 1)
qdel(B)
else
return ..()
qdel(attacking)
return FINISH_ATTACK
//New generation TG plushies
@@ -876,23 +910,15 @@
desc = "A silky nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian"
item_state = "plushie_nian"
var/cooldown = FALSE
rare_hug_sound = 'sound/voice/scream_moth.ogg'
rare_hug_word = "Buzzzz!"
/obj/item/toy/plushie/nianplushie/attack_self__legacy__attackchain(mob/user)
if(cooldown)
return ..()
playsound(src, 'sound/voice/scream_moth.ogg', 10, 0)
visible_message("<span class='danger'>Buzzzz!</span>")
cooldown = TRUE
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 3 SECONDS)
/obj/item/toy/plushie/nianplushie/monarch
name = "monarch nian plushie"
desc = "A monarch nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_monarch"
item_state = "plushie_nian_monarch"
/obj/item/toy/plushie/nianplushie/luna
name = "luna nian plushie"
desc = "A luna nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
@@ -904,31 +930,31 @@
desc = "An atlas nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_atlas"
item_state = "plushie_nian_atlas"
/obj/item/toy/plushie/nianplushie/reddish
name = "reddish nian plushie"
desc = "A reddish nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_reddish"
item_state = "plushie_nian_reddish"
/obj/item/toy/plushie/nianplushie/royal
name = "royal nian plushie"
desc = "A royal nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_royal"
item_state = "plushie_nian_royal"
/obj/item/toy/plushie/nianplushie/gothic
name = "gothic nian plushie"
desc = "A gothic nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_gothic"
item_state = "plushie_nian_gothic"
/obj/item/toy/plushie/nianplushie/lovers
name = "lovers nian plushie"
desc = "A lovers nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_lovers"
item_state = "plushie_nian_lovers"
/obj/item/toy/plushie/nianplushie/whitefly
name = "whitefly nian plushie"
desc = "A whitefly nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
@@ -940,7 +966,7 @@
desc = "A punnished nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_punished"
item_state = "plushie_nian_punished"
/obj/item/toy/plushie/nianplushie/firewatch
name = "firewatch nian plushie"
desc = "A firewtach nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
@@ -952,43 +978,43 @@
desc = "A deathshead nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_deadhead"
item_state = "plushie_nian_deadhead"
/obj/item/toy/plushie/nianplushie/poison
name = "poison nian plushie"
desc = "A poison nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_poison"
item_state = "plushie_nian_poison"
/obj/item/toy/plushie/nianplushie/ragged
name = "ragged nian plushie"
desc = "A ragged nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_ragged"
item_state = "plushie_nian_ragged"
/obj/item/toy/plushie/nianplushie/snow
name = "snow nian plushie"
desc = "A snow nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_snow"
item_state = "plushie_nian_snow"
/obj/item/toy/plushie/nianplushie/clockwork
name = "clockwork nian plushie"
desc = "A clockwork nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_clockwork"
item_state = "plushie_nian_clockwork"
/obj/item/toy/plushie/nianplushie/moonfly
name = "moonfly nian plushie"
desc = "A moonfly nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_moonfly"
item_state = "plushie_nian_moonfly"
/obj/item/toy/plushie/nianplushie/rainbow
name = "rainbow nian plushie"
desc = "A rainbow nian plushie, straight from the nebula. Pull its antenna to hear it buzz!"
icon_state = "plushie_nian_rainbow"
item_state = "plushie_nian_rainbow"
/obj/item/toy/plushie/shark
name = "shark plushie"
desc = "A plushie depicting a somewhat cartoonish shark. The tag calls it a 'hákarl', noting that it was made by an obscure furniture manufacturer in old Scandinavia."
@@ -1013,6 +1039,215 @@
'sound/weapons/cablecuff.ogg' = 1,
)
/obj/item/toy/plushie/skrellplushie
name = "skrell plushie"
desc = "The latest from 'SoftSkrells.net', features its very own headpocket! Warble!"
icon_state = "plushie_skrell"
rare_hug_sound = 'sound/effects/warble.ogg'
rare_hug_word = "Warble!"
var/obj/item/headpocket_item
/obj/item/toy/plushie/skrellplushie/examine(mob/user)
. = ..()
. += "<span class='notice'>Alt-click to put something small inside the headpocket, or take an item out.</span>"
/obj/item/toy/plushie/skrellplushie/AltClick(mob/user)
if(!Adjacent(user) || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED))
return
var/obj/item/I = user.get_active_hand()
if(I == src)
return
if(!I)
if(!headpocket_item)
return
to_chat(user, "<span class='notice'>You remove [headpocket_item] from [src].</span>")
headpocket_item.forceMove(get_turf(src))
user.put_in_hands(headpocket_item)
headpocket_item = null
return
if(I.w_class > WEIGHT_CLASS_SMALL)
to_chat(user, "<span class='warning'>You cannot fit [I] in [src]!</span>")
return
if(!iscarbon(user))
return
if(headpocket_item)
to_chat(user, "<span class='warning'>[src] already has an item in its headpocket!</span>")
return
if(!user.drop_item())
to_chat(user, "<span class='warning'>You cannot slip [I] inside [src]!</span>")
return
user.visible_message("<span class='notice'>[user] places [I] into [src].</span>", "<span class='notice'>You place [I] into [src].</span>")
add_fingerprint(user)
I.forceMove(src)
headpocket_item = I
/obj/item/toy/plushie/skrellplushie/Destroy()
headpocket_item.forceMove(get_turf(src))
headpocket_item = null
return ..()
/obj/item/toy/plushie/humanplushie
name = "human plushie"
desc = "This plushie is slightly less popular than its counterparts. The designers obviously didn't find humans that endearing..."
icon_state = "plushie_human"
poof_sound = list('sound/weapons/thudswoosh.ogg' = 30,
'sound/goonstation/voice/male_scream.ogg' = 1)
/obj/item/toy/plushie/borgplushie
name = "borg plushie"
desc = "The synthetic backbone of the station, rendered in plush form. Inbuilt flashlight included!"
icon_state = "plushie_borg"
var/borg_plushie_overlay
var/on = FALSE
/obj/item/toy/plushie/borgplushie/Initialize(mapload)
. = ..()
borg_plushie_overlay = (pick("plushie_borgjan", "plushie_borgsec", "plushie_borgmed", "plushie_borgmine", "plushie_borgserv", "plushie_borgassist", "plushie_borgengi"))
update_icon()
/obj/item/toy/plushie/borgplushie/activate_self(mob/user)
if(..())
return
on = !on
update_brightness()
/obj/item/toy/plushie/borgplushie/proc/update_brightness()
if(on)
set_light(4)
else
set_light(0)
update_icon()
/obj/item/toy/plushie/borgplushie/update_overlays()
. = ..()
add_overlay(borg_plushie_overlay)
if(on)
add_overlay("borglights")
else
cut_overlay("borglights")
/obj/item/toy/plushie/borgplushie/extinguish_light(force = FALSE)
if(!force)
if(on)
visible_message("<span class='danger'>[src]'s light grows dim...</span>")
on = !on
update_brightness()
else
atom_say("Self-destruct command received!</span>")
visible_message("<span class='danger'>[src] explodes!</span>")
var/turf/T = get_turf(src)
playsound(T, 'sound/goonstation/effects/robogib.ogg', 50, TRUE)
robogibs(T)
if(grenade)
explosive_betrayal(grenade)
if(!QDELETED(src))
qdel(src)
/obj/item/toy/plushie/dionaplushie
name = "diona plushie"
desc = "This plushy is seemingly comprised of other, smaller, nymph plushies. They really went all out on the realism! Keep away from plantkiller."
icon_state = "plushie_diona"
rare_hug_sound = 'sound/voice/dionatalk1.ogg'
rare_hug_word = "Creak..."
/obj/item/toy/plushie/nymphplushie
name = "nymph plushie"
desc = "Life-sized plushie of a diona nymph, perhaps if you find another you could make a diona!"
icon_state = "plushie_nymph"
rare_hug_sound = 'sound/creatures/nymphchirp.ogg'
rare_hug_word = "Chirp!"
/obj/item/toy/plushie/nymphplushie/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(istype(attacking, /obj/item/toy/plushie/nymphplushie))
var/obj/item/toy/plushie/nymphplushie/NP = attacking
var/found_grenade = FALSE
if(grenade)
found_grenade = TRUE
explosive_betrayal(grenade)
if(NP.grenade)
found_grenade = TRUE
NP.explosive_betrayal(NP.grenade)
if(found_grenade)
return FINISH_ATTACK
new /obj/item/toy/plushie/dionaplushie(get_turf(loc))
to_chat(user, "<span class='notice'>The nymph plushies combine seamlessly into an diona plushie!</span>")
playsound(loc, 'sound/voice/dionatalk1.ogg', 50, TRUE)
qdel(NP)
qdel(src)
return FINISH_ATTACK
/obj/item/toy/plushie/plasmamanplushie
name = "plasmaman plushie"
desc = "A freindly plasma-being in plush form. WARNING: KEEP AWAY FROM OPEN FLAME!"
icon_state = "plushie_plasma"
rare_hug_sound = 'sound/voice/plas_rattle.ogg'
rare_hug_word = "Rattle!"
/obj/item/toy/plushie/plasmamanplushie/welder_act(mob/user, obj/item/I)
if(I.use_tool(src, user, volume = I.tool_volume))
bakoom()
return TRUE
/obj/item/toy/plushie/plasmamanplushie/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(attacking.get_heat())
bakoom()
return FINISH_ATTACK
/obj/item/toy/plushie/plasmamanplushie/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE)
..()
bakoom()
/obj/item/toy/plushie/plasmamanplushie/proc/bakoom()
visible_message("<span class='danger'>[src] explodes!</span>")
if(grenade)
explosive_betrayal(grenade)
explosion(get_turf(src), -1, 0, 1, 1, flame_range = 1)
if(!QDELETED(src))
qdel(src)
/obj/item/toy/plushie/draskplushie
name = "drask plushie"
desc = "This plushie is cool as a cucumber, featuring realistic soap-munching action."
icon_state = "plushie_drask"
rare_hug_sound = 'sound/voice/drasktalk.ogg'
rare_hug_word = "Ruuuumble..."
/obj/item/toy/plushie/draskplushie/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(istype(attacking, /obj/item/soap))
if(prob(20))
visible_message("<span class='danger'>[src] consumes the soap...</span>")
qdel(attacking)
return FINISH_ATTACK
visible_message("<span class='danger'>[src] munches the soap...</span>")
playsound(loc, 'sound/items/eatfood.ogg', 50, TRUE)
/obj/item/toy/plushie/kidanplushie
name = "kidan plushie"
desc = "F-ANT-asticly fun kidan plushie! Exoskeleton has never been so soft. The label says to keep it away from insecticides"
icon_state = "plushie_kidan"
var/sadbug = FALSE
rare_hug_sound = 'sound/effects/Kidanclack.ogg'
rare_hug_word = "Click clack!"
/obj/item/toy/plushie/kidanplushie/activate_self(mob/user)
if(..())
return
if(prob(10) && sadbug)
visible_message("<span class='notice'>[src] begins to cheer up!</span>")
icon_state = "plushie_kidan"
sadbug = FALSE
/obj/item/toy/plushie/kidanplushie/proc/make_cry()
visible_message("<span class='danger'>[src] starts to cry...</span>")
icon_state = "plushie_kidansad"
sadbug = TRUE
/*
* Foam Armblade
*/
@@ -1054,7 +1289,9 @@
else
. += "single_latch"
/obj/item/toy/windup_toolbox/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/windup_toolbox/activate_self(mob/user)
if(..())
return
if(!active)
to_chat(user, "<span class='notice'>You wind up [src], it begins to rumble.</span>")
active = TRUE
@@ -1083,10 +1320,12 @@
item_state = "flashtool"
w_class = WEIGHT_CLASS_TINY
/obj/item/toy/flash/attack__legacy__attackchain(mob/living/M, mob/user)
/obj/item/toy/flash/attack(mob/living/target, mob/living/carbon/human/user)
if(..())
return FINISH_ATTACK
playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
flick("[initial(icon_state)]2", src)
user.visible_message("<span class='disarm'>[user] blinds [M] with the flash!</span>")
user.visible_message("<span class='disarm'>[user] blinds [target] with the flash!</span>")
/*
@@ -1100,7 +1339,9 @@
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/redbutton/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/redbutton/activate_self(mob/user)
if(..())
return
if(cooldown >= world.time)
to_chat(user, "<span class='alert'>Nothing happens.</span>")
return
@@ -1125,16 +1366,15 @@
w_class = WEIGHT_CLASS_SMALL
var/cooldown = 0
/obj/item/toy/ai/attack_self__legacy__attackchain(mob/user)
if(!cooldown) //for the sanity of everyone
var/message = generate_ion_law()
to_chat(user, "<span class='notice'>You press the button on [src].</span>")
playsound(user, 'sound/machines/click.ogg', 20, 1)
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
cooldown = 1
spawn(30) cooldown = 0
/obj/item/toy/ai/activate_self(mob/user)
if(..() || cooldown) //for the sanity of everyone
return
..()
var/message = generate_ion_law()
to_chat(user, "<span class='notice'>You press the button on [src].</span>")
playsound(user, 'sound/machines/click.ogg', 20, TRUE)
visible_message("<span class='danger'>[bicon(src)] [message]</span>")
cooldown = 1
spawn(30) cooldown = 0
/obj/item/toy/codex_gigas
name = "Toy Codex Gigas"
@@ -1145,18 +1385,19 @@
var/list/messages = list("You must challenge the devil to a dance-off!", "The devils true name is Ian", "The devil hates salt!", "Would you like infinite power?", "Would you like infinite wisdom?", " Would you like infinite healing?")
var/cooldown = FALSE
/obj/item/toy/codex_gigas/attack_self__legacy__attackchain(mob/user)
if(!cooldown)
user.visible_message(
"<span class='notice'>[user] presses the button on \the [src].</span>",
"<span class='notice'>You press the button on \the [src].</span>",
"<span class='notice'>You hear a soft click.</span>")
playsound(loc, 'sound/machines/click.ogg', 20, TRUE)
cooldown = TRUE
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 60)
for(var/message in pick(messages))
user.loc.visible_message("<span class='danger'>[bicon(src)] [message]</span>")
sleep(10)
/obj/item/toy/codex_gigas/activate_self(mob/user)
if(..() || cooldown)
return
user.visible_message(
"<span class='notice'>[user] presses the button on \the [src].</span>",
"<span class='notice'>You press the button on \the [src].</span>",
"<span class='notice'>You hear a soft click.</span>")
playsound(loc, 'sound/machines/click.ogg', 20, TRUE)
cooldown = TRUE
addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 60)
for(var/message in pick(messages))
user.loc.visible_message("<span class='danger'>[bicon(src)] [message]</span>")
sleep(10)
// DND Character minis. Use the naming convention (type)character for the icon states.
/obj/item/toy/character
@@ -1205,7 +1446,8 @@
attack_verb = list("attacked", "bashed", "smashed", "stoned")
hitsound = "swing_hit"
/obj/item/toy/pet_rock/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/pet_rock/activate_self(mob/user)
. = ..()
var/cuddle_verb = pick("admires", "respects", "cherises", "appreciates")
user.visible_message("<span class='notice'>[user] [cuddle_verb] [src].</span>")
@@ -1230,8 +1472,9 @@
var/cooldown = 0
var/obj/stored_minature = null
/obj/item/toy/minigibber/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/minigibber/activate_self(mob/user)
if(..())
return
if(stored_minature)
to_chat(user, "<span class='danger'>\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!</span>")
QDEL_NULL(stored_minature)
@@ -1243,20 +1486,22 @@
playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1)
cooldown = world.time
/obj/item/toy/minigibber/attackby__legacy__attackchain(obj/O, mob/user, params)
if(istype(O,/obj/item/toy/character) && O.loc == user)
to_chat(user, "<span class='notice'>You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input.</span>")
/obj/item/toy/minigibber/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(istype(attacking,/obj/item/toy/character) && attacking.loc == user)
to_chat(user, "<span class='notice'>You start feeding \the [attacking] [bicon(attacking)] into \the [src]'s mini-input.</span>")
if(do_after(user, 10, target = src))
if(O.loc != user)
to_chat(user, "<span class='alert'>\The [O] is too far away to feed into \the [src]!</span>")
if(attacking.loc != user)
to_chat(user, "<span class='alert'>\The [attacking] is too far away to feed into \the [src]!</span>")
else
to_chat(user, "<span class='notice'>You feed \the [O] [bicon(O)] into \the [src]!</span>")
user.unEquip(O)
O.forceMove(src)
stored_minature = O
to_chat(user, "<span class='notice'>You feed \the [attacking] [bicon(attacking)] into \the [src]!</span>")
user.unEquip(attacking)
attacking.forceMove(src)
stored_minature = attacking
else
to_chat(user, "<span class='warning'>You stop feeding \the [O] into \the [src]'s mini-input.</span>")
else ..()
to_chat(user, "<span class='warning'>You stop feeding \the [attacking] into \the [src]'s mini-input.</span>")
return FINISH_ATTACK
/obj/item/toy/russian_revolver
name = "russian revolver"
@@ -1289,7 +1534,9 @@
..()
spin_cylinder()
/obj/item/toy/russian_revolver/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/russian_revolver/activate_self(mob/user)
if(..())
return
if(!bullets_left)
user.visible_message("<span class='warning'>[user] loads a bullet into [src]'s cylinder before spinning it.</span>")
spin_cylinder()
@@ -1297,11 +1544,12 @@
user.visible_message("<span class='warning'>[user] spins the cylinder on [src]!</span>")
spin_cylinder()
/obj/item/toy/russian_revolver/attack__legacy__attackchain(mob/M, mob/living/user)
return
/obj/item/toy/russian_revolver/interact_with_atom(atom/target, mob/living/user, list/modifiers)
return ITEM_INTERACT_SKIP_TO_AFTER_ATTACK
/obj/item/toy/russian_revolver/afterattack__legacy__attackchain(atom/target, mob/user, flag, params)
if(flag)
/obj/item/toy/russian_revolver/after_attack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(proximity_flag)
if(target in user.contents)
return
if(!ismob(target))
@@ -1368,7 +1616,9 @@
to_chat(user, "<span class='warning'>You go to spin the chamber... and it goes off in your face!</span>")
shoot_gun(user)
/obj/item/toy/russian_revolver/trick_revolver/attack_self__legacy__attackchain(mob/user)
/obj/item/toy/russian_revolver/trick_revolver/activate_self(mob/user)
if(..())
return
if(!bullets_left) //You can re-arm the trap...
user.visible_message("<span class='warning'>[user] loads a bullet into [src]'s cylinder before spinning it.</span>")
spin_cylinder()
@@ -1376,17 +1626,18 @@
user.visible_message("<span class='warning'>[user] tries to empty [src], but it goes off in their face!</span>")
shoot_gun(user)
/obj/item/toy/russian_revolver/trick_revolver/attackby__legacy__attackchain(obj/item/I, mob/user, params)
if(is_pen(I))
/obj/item/toy/russian_revolver/trick_revolver/attack_by(obj/item/attacking, mob/user, params)
if(..())
return FINISH_ATTACK
if(is_pen(attacking))
to_chat(user, "<span class='warning'>You go to write on [src].. and it goes off in your face!</span>")
shoot_gun(user)
if(istype(I, /obj/item/ammo_casing/a357))
if(istype(attacking, /obj/item/ammo_casing/a357))
to_chat(user, "<span class='warning'>You go to load a bullet into [src].. and it goes off in your face!</span>")
shoot_gun(user)
if(istype(I, /obj/item/ammo_box/a357))
if(istype(attacking, /obj/item/ammo_box/a357))
to_chat(user, "<span class='warning'>You go to speedload [src].. and it goes off in your face!</span>")
shoot_gun(user)
return ..()
/obj/item/toy/russian_revolver/trick_revolver/run_pointed_on_item(mob/pointer_mob, atom/target_atom)
if(target_atom != src)
@@ -1456,8 +1707,9 @@
var/cooldown = 0
var/cooldown_time = 3 SECONDS
/obj/item/toy/figure/attack_self__legacy__attackchain(mob/user)
..()
/obj/item/toy/figure/activate_self(mob/user)
if(..())
return
if(cooldown < world.time)
cooldown = world.time + cooldown_time
activate(user)
@@ -1839,14 +2091,14 @@
var/cooldown = 0
var/list/possible_answers = list("Definitely", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future Unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.")
/obj/item/toy/eight_ball/attack_self__legacy__attackchain(mob/user as mob)
if(!cooldown)
var/answer = pick(possible_answers)
user.visible_message("<span class='notice'>[user] focuses on [user.p_their()] question and [use_action]...</span>")
user.visible_message("<span class='notice'>[bicon(src)] [src] says \"[answer]\"</span>")
spawn(30)
cooldown = 0
/obj/item/toy/eight_ball/activate_self(mob/user as mob)
if(..() || cooldown)
return
var/answer = pick(possible_answers)
user.visible_message("<span class='notice'>[user] focuses on [user.p_their()] question and [use_action]...</span>")
user.visible_message("<span class='notice'>[bicon(src)] [src] says \"[answer]\"</span>")
spawn(30)
cooldown = 0
/obj/item/toy/eight_ball/conch
name = "\improper Magic Conch Shell"