diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 38b004a657..1abe077980 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -204,6 +204,11 @@ mood_change = -1 timeout = 2 MINUTES +/datum/mood_event/plush_bite + description = "IT BIT ME!! OW!\n" + mood_change = -3 + timeout = 2 MINUTES + //Cursed stuff below /datum/mood_event/emptypred diff --git a/code/game/objects/items/miscellaneous.dm b/code/game/objects/items/miscellaneous.dm index 6f1aec287b..33349cee67 100644 --- a/code/game/objects/items/miscellaneous.dm +++ b/code/game/objects/items/miscellaneous.dm @@ -255,7 +255,7 @@ /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/random) //don't allow these special ones (you can still get narplush/hugbox) + 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) //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 diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index 44205f4884..9a8f1214f0 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -167,7 +167,7 @@ return log_game("[key_name(user)] activated a hidden grenade in [src].") grenade.preprime(user, msg = FALSE, volume = 10) - SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plushpet", /datum/mood_event/plushpet) else to_chat(user, "You try to pet [src], but it has no stuffing. Aww...") SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_nostuffing", /datum/mood_event/plush_nostuffing) @@ -754,8 +754,8 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) attack_verb = list("headbutt", "scritched", "bit") squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) can_random_spawn = FALSE - - + + /obj/item/toy/plush/hairball name = "Hairball" desc = "A bundle of undigested fibers and scales. Yuck." @@ -765,3 +765,78 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) squeak_override = list('sound/misc/splort.ogg'=1) attack_verb = list("sploshed", "splorted", "slushed") can_random_spawn = FALSE + +/obj/item/toy/plush/plushling + name = "peculiar plushie" + desc = "An adorable stuffed toy- wait, did it just move?" + can_random_spawn = FALSE + var/absorb_cooldown = 100 //ticks cooldown between absorbs + var/next_absorb = 0 //When can it absorb another plushie + var/check_interval = 20 + var/next_check = 0 + +//Overrides parent proc +/obj/item/toy/plush/plushling/attack_self(mob/user) + if(!user) //hmmmmm + return + to_chat(user, "You try to pet the plushie, but recoil as it bites your hand instead! OW!") + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT,"plush_bite", /datum/mood_event/plush_bite) + var/mob/living/carbon/human/H = user + if(!H) + return //Type safety. + H.apply_damage(5, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) + addtimer(CALLBACK(H, /mob/living/carbon/human.proc/dropItemToGround, src, TRUE), 1) + +/obj/item/toy/plush/plushling/New() + var/initial_state = pick("plushie_lizard", "plushie_snake", "plushie_slime", "fox") + icon_state = initial_state + item_state = initial_state + START_PROCESSING(SSobj, src) + . = ..() + +/obj/item/toy/plush/plushling/Destroy() + STOP_PROCESSING(SSobj, src) + . = ..() + +/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/P in oview(1, src)) //If that doesn't work, it hunts for plushies adjacent to its own tile + if(istype(P, /obj/item/toy/plush/plushling)) //These do not hunt their own kind + continue + src.throw_at(P, 1, 2) + visible_message("[src] leaps at [P]!") + 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("[src] gruesomely mutilliates [victim], leaving nothing more than dust!") + name = victim.name + desc = victim.desc + " Wait, did it just move..?" + icon_state = victim.icon_state + item_state = victim.item_state + squeak_override = victim.squeak_override + attack_verb = victim.attack_verb + 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) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index aea156a8f5..0cee2fc5cd 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -501,7 +501,10 @@ PurityMin = 0.6 /datum/chemical_reaction/fermi/plushmium/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH) - new /obj/item/toy/plush/random(get_turf(my_atom)) + if(volume < 20) //It creates a normal plush at low volume.. at higher amounts, things get slightly more interesting. + new /obj/item/toy/plush/random(get_turf(my_atom)) + else + new /obj/item/toy/plush/plushling(get_turf(my_atom)) my_atom.visible_message("The reaction suddenly zaps, creating a plushie!") my_atom.reagents.clear_reagents()