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"