diff --git a/code/_onclick/hud/action/types/mime_vow.dm b/code/_onclick/hud/action/types/mime_vow.dm new file mode 100644 index 0000000000..06da6d3ff0 --- /dev/null +++ b/code/_onclick/hud/action/types/mime_vow.dm @@ -0,0 +1,31 @@ +/datum/action/innate/vow_of_silence + name = "Break Vow" + desc = "Break your vow of silence. Permanently." + button_icon = 'icons/inventory/face/item.dmi' + button_icon_state = "mime" + +/datum/action/innate/vow_of_silence/Grant(mob/grant_to) + . = ..() + ADD_TRAIT(grant_to, TRAIT_MIMING, "[type]") + +/datum/action/innate/vow_of_silence/Remove(mob/remove_from) + . = ..() + REMOVE_TRAIT(remove_from, TRAIT_MIMING, "[type]") + +/datum/action/innate/vow_of_silence/Activate() + if(tgui_alert(target, "Are you sure? There's no going back.", "Break Vow", list("I'm Sure", "Abort")) != "I'm Sure") + return + break_silence() + +/datum/action/innate/vow_of_silence/proc/break_silence() + to_chat(target, span_notice("You break your vow of silence.")) + REMOVE_TRAIT(target, TRAIT_MIMING, "[type]") + var/datum/job/mime/mime_job = SSjob.get_job(JOB_MIME) + mime_job.total_positions += 1 + remove_mimery(target) + qdel(src) + +/datum/action/innate/vow_of_silence/proc/remove_mimery(mob/living/user) + for(var/datum/spell/spell in user.mind.learned_spells) + if(spell.school == "mime") + user.remove_spell(spell) diff --git a/code/datums/outfits/jobs/special_vr.dm b/code/datums/outfits/jobs/special_vr.dm index 268cbe1310..d9eca7c5d6 100644 --- a/code/datums/outfits/jobs/special_vr.dm +++ b/code/datums/outfits/jobs/special_vr.dm @@ -49,9 +49,13 @@ shoes = /obj/item/clothing/shoes/mime head = /obj/item/clothing/head/soft/mime mask = /obj/item/clothing/mask/gas/mime - backpack_contents = list(/obj/item/pen/crayon/mime = 1) + backpack_contents = list( + /obj/item/reagent_containers/food/drinks/bottle/bottleofnothing = 1, + /obj/item/stamp/mime = 1, //CHOMPEdit - Enable Mimery book + /obj/item/spellbook/oneuse/mime/mimery = 1) //Disabled on Virgo - No magic //ChompEdit - Enable Mimery book id_type = /obj/item/card/id/civilian/mime pda_type = /obj/item/pda/mime + l_hand = /obj/item/storage/backpack/mime /datum/decl/hierarchy/outfit/job/mime/post_equip(mob/living/carbon/human/H) ..() diff --git a/code/game/jobs/job/job_goodies.dm b/code/game/jobs/job/job_goodies.dm index dbd0c70501..b797a98c74 100644 --- a/code/game/jobs/job/job_goodies.dm +++ b/code/game/jobs/job/job_goodies.dm @@ -275,7 +275,7 @@ ) mail_color = COMMS_COLOR_SERVICE -/datum/alt_title/clown +/datum/job/clown mail_goodies = list( /obj/fruitspawner/banana = 200, /obj/item/pen/crayon/rainbow = 200, @@ -286,13 +286,15 @@ /obj/item/reagent_containers/food/snacks/pie = 100 ) -/datum/alt_title/mime +/datum/job/mime mail_goodies = list( /obj/item/reagent_containers/food/drinks/bottle/wine = 250, /obj/item/reagent_containers/glass/bottle/nothing = 250, /obj/item/reagent_containers/food/snacks/baguette = 200, /obj/item/pen/crayon/mime = 200 ) + mail_color = COLOR_WHITE + /datum/job/entrepreneur // Same for these guys! What could they get? mail_goodies = list( /obj/item/entrepreneur/crystal_ball = 40, diff --git a/code/game/jobs/job/special.dm b/code/game/jobs/job/special.dm index 91b9ba2969..a4333adafd 100644 --- a/code/game/jobs/job/special.dm +++ b/code/game/jobs/job/special.dm @@ -149,6 +149,12 @@ outfit_type = /datum/decl/hierarchy/outfit/job/mime pto_type = PTO_CIVILIAN +/datum/job/mime/equip(mob/living/carbon/human/H, alt_title) + . = ..() + if(H.mind) + var/datum/action/innate/vow_of_silence/vow = new(H) + vow.Grant(H) + /datum/alt_title/poseur title = JOB_ALT_PASEUR diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index 14014726d5..29fc905bc5 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -110,6 +110,11 @@ desc = "It's a backpack made by Honk! Co." icon_state = "backpack_clown" +/obj/item/storage/backpack/mime + name = "Parcel Parceaux" + desc = "A silent backpack made for those silent workers. Silence Co." + icon_state = "backpack_mime" + /obj/item/storage/backpack/white name = "white backpack" icon_state = "backpack_white" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 6987c80244..e509c9fee0 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -644,3 +644,20 @@ desc = "A box full of weapon power cells. For all your portable energy storage needs." icon_state = "secbox" starts_with = list(/obj/item/cell/device/weapon = 7) + +/obj/item/storage/box/mime + name = "invisible box" + desc = "Unfortunately not large enough to trap the mime." + foldable = null + icon_state = "box" + alpha = 0 + +/obj/item/storage/box/mime/attack_hand(mob/user) + ..() + if(HAS_MIND_TRAIT(user, TRAIT_MIMING)) + alpha = 255 + +/obj/item/storage/box/mime/Moved(atom/old_loc, direction, forced, movetime) + if(iscarbon(old_loc)) + alpha = 0 + return ..() diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 4934d9cbc2..2f25afe2ba 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -519,3 +519,10 @@ /obj/structure/bed/chair/sofa/corner/orange sofa_material = MAT_CLOTH_ORANGE + +/obj/structure/bed/chair/mime + name = "invisible chair" + desc = "The mime needs to sit down and shut up." + anchored = FALSE + icon_state = null + alpha = 0 diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm index 7eddee5f53..b93c73f9a4 100644 --- a/code/modules/emotes/definitions/audible.dm +++ b/code/modules/emotes/definitions/audible.dm @@ -18,10 +18,12 @@ /datum/decl/emote/audible/whimper key = "whimper" emote_message_3p = "whimpers." + emote_message_mute_3p = "whimpers silently." /datum/decl/emote/audible/gasp key = "gasp" emote_message_3p = "gasps." + emote_message_mute_3p = "gasps silently!" conscious = FALSE /datum/decl/emote/audible/gasp/get_emote_sound(atom/user) @@ -48,6 +50,7 @@ /datum/decl/emote/audible/choke key = "choke" emote_message_3p = "chokes." + emote_message_mute_3p = "chokes silently." conscious = FALSE /datum/decl/emote/audible/gnarl @@ -57,6 +60,7 @@ /datum/decl/emote/audible/multichirp key = "mchirp" emote_message_3p = "chirps a chorus of notes!" + emote_message_mute_3p = "acts out a chirp a chorus of notes." emote_sound = 'sound/voice/multichirp.ogg' /datum/decl/emote/audible/alarm @@ -88,15 +92,18 @@ /datum/decl/emote/audible/sniff key = "sniff" emote_message_3p = "sniffs." + emote_message_mute_3p = "sniffs silently." /datum/decl/emote/audible/snore key = "snore" emote_message_3p = "snores." + emote_message_mute_3p = "sleeps soundly." conscious = FALSE /datum/decl/emote/audible/whimper key = "whimper" emote_message_3p = "whimpers." + emote_message_mute_3p = "whimpers silently." /datum/decl/emote/audible/yawn key = "yawn" @@ -109,126 +116,153 @@ 'sound/misc/clap2.ogg', 'sound/misc/clap3.ogg', 'sound/misc/clap4.ogg') //ChompEDIT END + able_mute = TRUE /datum/decl/emote/audible/chuckle key = "chuckle" emote_message_3p = "chuckles." + emote_message_mute_3p = "acts out chuckling." /datum/decl/emote/audible/cry key = "cry" emote_message_3p = "cries." + emote_message_mute_3p = "sobs silently." /datum/decl/emote/audible/sigh key = "sigh" emote_message_3p = "sighs." + emote_message_mute_3p = "sighs silently." /datum/decl/emote/audible/laugh key = "laugh" emote_message_3p_target = "laughs at TARGET." emote_message_3p = "laughs." + emote_message_mute_3p = "acts out a laugh." /datum/decl/emote/audible/mumble key = "mumble" emote_message_3p = "mumbles!" + emote_message_mute_3p = "silently mumbles!" /datum/decl/emote/audible/grumble key = "grumble" emote_message_3p = "grumbles!" + emote_message_mute_3p = "silently grumbles!" /datum/decl/emote/audible/groan key = "groan" emote_message_3p = "groans!" + emote_message_mute_3p = "silently groans!" conscious = FALSE /datum/decl/emote/audible/moan key = "moan" emote_message_3p = "moans!" + emote_message_mute_3p = "silently moans!" conscious = FALSE /datum/decl/emote/audible/giggle key = "giggle" emote_message_3p = "giggles." + emote_message_mute_3p = "acts out a giggle." /datum/decl/emote/audible/grunt key = "grunt" emote_message_3p = "grunts." + emote_message_mute_3p = "silently grunts!" /datum/decl/emote/audible/bug_hiss key = "bhiss" emote_message_3p_target = "hisses at TARGET." emote_message_3p = "hisses." + emote_message_mute_3p = "hisses silently." emote_sound = 'sound/voice/bughiss.ogg' /datum/decl/emote/audible/bug_buzz key = "bbuzz" emote_message_3p = "buzzes USER_THEIR wings." emote_sound = 'sound/voice/BugBuzz.ogg' + able_mute = TRUE /datum/decl/emote/audible/bug_chitter key = "chitter" emote_message_3p = "chitters." + emote_message_mute_3p = "chitters silently." emote_sound = 'sound/voice/bug.ogg' /datum/decl/emote/audible/roar key = "roar" + emote_message_mute_3p = "acts out a roar!!" emote_message_3p = "roars!" /datum/decl/emote/audible/bellow key = "bellow" + emote_message_mute_3p = "bellows silently!" emote_message_3p = "bellows!" /datum/decl/emote/audible/howl key = "howl" emote_message_3p = "howls!" + emote_message_mute_3p = "howls silently!" /datum/decl/emote/audible/wheeze key = "wheeze" emote_message_3p = "wheezes." + emote_message_mute_3p = "wheezes silently." /datum/decl/emote/audible/hiss key = "hiss" emote_message_3p_target = "hisses softly at TARGET." emote_message_3p = "hisses softly." + emote_message_mute_3p = "hisses silently." /datum/decl/emote/audible/chirp key = "chirp" emote_message_3p = "chirps!" + emote_message_mute_3p = "chirps silently." emote_sound = 'sound/misc/nymphchirp.ogg' /datum/decl/emote/audible/crack key = "crack" emote_message_3p = "cracks USER_THEIR knuckles." emote_sound = 'sound/voice/knuckles.ogg' + able_mute = TRUE /datum/decl/emote/audible/squish key = "squish" emote_sound = 'sound/effects/slime_squish.ogg' //Credit to DrMinky (freesound.org) for the sound. emote_message_3p = "squishes." + emote_message_mute_3p = "squishes silently." sound_vary = FALSE /datum/decl/emote/audible/warble key = "warble" emote_sound = 'sound/effects/warble.ogg' // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound. emote_message_3p = "warbles." + emote_message_mute_3p = "warbles silently." /datum/decl/emote/audible/croon key = "croon" emote_message_3p = "croons..." + emote_message_mute_3p = "silently croons..." emote_sound = list('sound/voice/croon1.ogg', 'sound/voice/croon2.ogg') /datum/decl/emote/audible/lwarble key = "lwarble" emote_message_3p = "lets out a low, throaty warble!" + emote_message_mute_3p = "warbles silently!" emote_sound = 'sound/voice/lwarble.ogg' /datum/decl/emote/audible/croak_skrell key = "scroak" emote_message_3p = "croaks!" + emote_message_mute_3p = "silently croaks!" emote_sound = 'sound/voice/croak_skrell.ogg' /datum/decl/emote/audible/vox_shriek key = "shriek" emote_message_3p = "SHRIEKS!" + emote_message_mute_3p = "acts out a SHRIEK!" emote_sound = 'sound/voice/shriek1.ogg' /datum/decl/emote/audible/caw @@ -237,38 +271,45 @@ emote_message_3p = "caws!" emote_message_1p_target = "You caw at TARGET." emote_message_3p_target = "caws at TARGET." + emote_message_mute_3p = "caws silently." emote_sound = 'sound/voice/emotes/caw1.ogg' // Copyright Sampling+ 1.0 Vixuxx (freesound.org) for the source audio. /datum/decl/emote/audible/caw2 key = "caw2" emote_message_3p = "caws." + emote_message_mute_3p = "caws silently." emote_sound = 'sound/voice/emotes/caw2.ogg' // Copyright CC0 1.0 Universal, by Jofae on freesound.org. /datum/decl/emote/audible/caw_m key = "caw_m" emote_message_3p = "caws multiple times." + emote_message_mute_3p = "acts out multiple caws." emote_sound = 'sound/voice/emotes/caw_multiple.ogg' // Copyright CC0 1.0 Universal, by Ambientsoundapp on freesound.org. /datum/decl/emote/audible/gwah key = "gwah" emote_message_3p = "gwah." + emote_message_mute_3p = "silently gwahs." emote_sound = 'sound/voice/emotes/gwah.ogg' // Copyright CC0 1.0 Universal, by Ambientsoundapp on freesound.org. /datum/decl/emote/audible/purr key = "purr" emote_message_3p = "purrs." + emote_message_mute_3p = "silently purrs." emote_sound = 'sound/voice/cat_purr.ogg' /datum/decl/emote/audible/purrlong key = "purrl" emote_message_3p = "purrs." + emote_message_mute_3p = "silently purrs." emote_sound = 'sound/voice/cat_purr_long.ogg' /datum/decl/emote/audible/fennecscream key = "fennecscream" emote_message_3p = "screeches!" + emote_message_mute_3p = "screeches silently!" /datum/decl/emote/audible/zoom key = "zoom" @@ -280,6 +321,7 @@ emote_message_3p = "chirps in surprise!" emote_message_1p_target = "You chirp in surprise at TARGET!" emote_message_3p_target = "chirps in surprise at TARGET!" + emote_message_mute_3p = "lets out a silent chirp!" emote_sound = 'sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. sound_vary = FALSE @@ -289,6 +331,7 @@ emote_message_3p = "chirps!" emote_message_1p_target = "You chirp at TARGET!" emote_message_3p_target = "chirps at TARGET!" + emote_message_mute_3p = "chirps silently!" emote_sound = 'sound/voice/teshchirp.ogg' // Copyright Sampling+ 1.0 Incarnidine (freesound.org) for the source audio. /datum/decl/emote/audible/teshtrill @@ -297,12 +340,15 @@ emote_message_3p = "trills." emote_message_1p_target = "You trill at TARGET." emote_message_3p_target = "trills at TARGET." + emote_message_mute_3p = "trills silently." emote_sound = 'sound/voice/teshtrill.ogg' // Copyright CC BY-NC 3.0 Arnaud Coutancier (freesound.org) for the source audio. /datum/decl/emote/audible/teshscream key = "teshscream" emote_message_1p = "You scream!" emote_message_3p = "screams!" + emote_message_mute_1p = "You scream silently!" + emote_message_mute_3p = "screams silently!" emote_sound = 'sound/voice/teshscream.ogg' /datum/decl/emote/audible/prbt @@ -311,17 +357,20 @@ emote_message_3p = "prbts." emote_message_1p_target = "You prbt at TARGET." emote_message_3p_target = "prbts at TARGET." + emote_message_mute_3p = "prbts silently." emote_sound = 'sound/voice/prbt.ogg' //Some Spooky sounds. /datum/decl/emote/audible/evil_laugh key = "evillaugh" emote_message_3p = "laughs!" + emote_message_mute_3p = "acts out a laugh." emote_sound = 'sound/mob/spooky/laugh.ogg' /datum/decl/emote/audible/evil_no key = "evilno" emote_message_3p = "says no!" + emote_message_mute_3p = "shakes their head." emote_sound = 'sound/mob/spooky/no.ogg' /datum/decl/emote/audible/evil_breathing diff --git a/code/modules/emotes/definitions/audible_belch.dm b/code/modules/emotes/definitions/audible_belch.dm index 126312c585..41bb0004d0 100644 --- a/code/modules/emotes/definitions/audible_belch.dm +++ b/code/modules/emotes/definitions/audible_belch.dm @@ -1,6 +1,7 @@ /datum/decl/emote/audible/belch key = "belch" emote_message_3p = "belches." + emote_message_mute_3p = "acts out a belch." message_type = AUDIBLE_MESSAGE sound_preferences = list(/datum/preference/toggle/emote_noises, /datum/preference/toggle/belch_noises) diff --git a/code/modules/emotes/definitions/audible_cough.dm b/code/modules/emotes/definitions/audible_cough.dm index 700df8c409..4f150569a0 100644 --- a/code/modules/emotes/definitions/audible_cough.dm +++ b/code/modules/emotes/definitions/audible_cough.dm @@ -4,6 +4,8 @@ emote_message_1p_target = "You cough on TARGET!" emote_message_3p = "coughs!" emote_message_3p_target = "coughs on TARGET!" + emote_message_mute_1p = "You cough silently!" + emote_message_mute_3p = "coughs silently!" emote_message_synthetic_1p_target = "You emit a robotic cough towards TARGET." emote_message_synthetic_1p = "You emit a robotic cough." emote_message_synthetic_3p_target = "emits a robotic cough towards TARGET." diff --git a/code/modules/emotes/definitions/audible_furry_vr.dm b/code/modules/emotes/definitions/audible_furry_vr.dm index 3fc35c968c..6a4c065eca 100644 --- a/code/modules/emotes/definitions/audible_furry_vr.dm +++ b/code/modules/emotes/definitions/audible_furry_vr.dm @@ -1,95 +1,118 @@ /datum/decl/emote/audible/awoo key = "awoo" emote_message_3p = "lets out an awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/awoo.ogg' /datum/decl/emote/audible/awoo2 key = "awoo2" emote_message_3p = "lets out an awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/long_awoo.ogg' /datum/decl/emote/audible/growl key = "growl" emote_message_3p = "lets out a growl." + emote_message_mute_3p = "lets out a silent growl." emote_sound = 'sound/voice/growl.ogg' /datum/decl/emote/audible/woof key = "woof" emote_message_3p = "lets out a woof." + emote_message_mute_3p = "lets out a silent woof." emote_sound = 'sound/voice/woof.ogg' /datum/decl/emote/audible/woof2 key = "woof2" emote_message_3p = "lets out a woof." + emote_message_mute_3p = "lets out a silent woof." emote_sound = 'sound/voice/woof2.ogg' /datum/decl/emote/audible/nya key = "nya" emote_message_3p = "lets out a nya." + emote_message_mute_3p = "lets out a silent nya." emote_sound = 'sound/voice/nya.ogg' /datum/decl/emote/audible/mrowl key = "mrowl" emote_message_3p = "mrowls." + emote_message_mute_3p = "mrowls quietly." emote_sound = 'sound/voice/mrow.ogg' /datum/decl/emote/audible/peep key = "peep" emote_message_3p = "peeps like a bird." + emote_message_mute_3p = "peeps silently like a bird." emote_sound = 'sound/voice/peep.ogg' /datum/decl/emote/audible/chirp key = "chirp" emote_message_3p = "chirps!" + emote_message_mute_3p = "silently chirps!" emote_sound = 'sound/misc/nymphchirp.ogg' sound_vary = FALSE /datum/decl/emote/audible/hoot key = "hoot" emote_message_3p = "hoots!" + emote_message_mute_3p = "silently hoots!" emote_sound = 'sound/voice/hoot.ogg' /datum/decl/emote/audible/weh key = "weh" emote_message_3p = "lets out a weh." + emote_message_mute_3p = "lets out a silent weh." emote_sound = 'sound/voice/weh.ogg' /datum/decl/emote/audible/merp key = "merp" emote_message_3p = "lets out a merp." + emote_message_mute_3p = "lets out a silent merp." emote_sound = 'sound/voice/merp.ogg' /datum/decl/emote/audible/myarp key = "myarp" emote_message_3p = "lets out a myarp." + emote_message_mute_3p = "lets out a silent myarp." emote_sound = 'sound/voice/myarp.ogg' /datum/decl/emote/audible/bark key = "bark" emote_message_3p = "lets out a bark." + emote_message_mute_3p = "lets out a silent bark." emote_sound = 'sound/voice/bark2.ogg' /datum/decl/emote/audible/bork key = "bork" emote_message_3p = "lets out a bork." + emote_message_mute_3p = "lets out a silent bork." emote_sound = 'sound/voice/bork.ogg' /datum/decl/emote/audible/mrow key = "mrow" emote_message_3p = "lets out a mrow." + emote_message_mute_3p = "lets out a silent mrow." emote_sound = 'sound/voice/mrow.ogg' /datum/decl/emote/audible/hypno key = "hypno" emote_message_3p = "lets out a mystifying tone." + emote_message_mute_3p = "lets out a silent, mystifying tone." emote_sound = 'sound/voice/hypno.ogg' /datum/decl/emote/audible/hiss key = "hiss" emote_message_3p = "lets out a hiss." + emote_message_mute_3p = "lets out a silent hiss." emote_sound = 'sound/voice/hiss.ogg' /datum/decl/emote/audible/rattle key = "rattle" emote_message_3p = "rattles!" + able_mute = TRUE emote_sound = 'sound/voice/rattle.ogg' /datum/decl/emote/audible/squeak key = "squeak" emote_message_3p = "lets out a squeak." + emote_message_mute_3p = "lets out a silent squeak." emote_sound = 'sound/effects/mouse_squeak.ogg' /datum/decl/emote/audible/geck key = "geck" emote_message_3p = "geckers!" + emote_message_mute_3p = "geckers silently!" emote_sound = 'sound/voice/geck.ogg' /datum/decl/emote/audible/baa key = "baa" emote_message_3p = "lets out a baa." + emote_message_mute_3p = "lets out a silent baa." emote_sound = 'sound/voice/baa.ogg' /datum/decl/emote/audible/baa2 key = "baa2" emote_message_3p = "bleats." + emote_message_mute_3p = "bleats silently." emote_sound = 'sound/voice/baa2.ogg' /* /datum/decl/emote/audible/deathgasp2 @@ -101,68 +124,83 @@ /datum/decl/emote/audible/mar key = "mar" emote_message_3p = "lets out a mar." + emote_message_mute_3p = "lets out a silent mar." emote_sound = 'sound/voice/mar.ogg' /datum/decl/emote/audible/wurble key = "wurble" emote_message_3p = "lets out a wurble." + emote_message_mute_3p = "lets out a silent wurble." emote_sound = 'sound/voice/wurble.ogg' /datum/decl/emote/audible/snort key = "snort" emote_message_3p = "snorts!" + able_mute = TRUE emote_sound = 'sound/voice/snort.ogg' sound_vary = FALSE /datum/decl/emote/audible/meow key = "meow" emote_message_3p = "gently meows!" + emote_message_mute_3p = "silently meows!" emote_sound = 'sound/voice/meow.ogg' sound_vary = FALSE /datum/decl/emote/audible/moo key = "moo" emote_message_3p = "takes a breath and lets out a moo." + emote_message_mute_3p = "takes a breath and lets out a silent moo." emote_sound = 'sound/voice/moo.ogg' /datum/decl/emote/audible/croak key = "croak" emote_message_3p = "rumbles their throat, puffs their cheeks and croaks." + emote_message_mute_3p = "rumbles their throat and puffs their cheeks." emote_sound = 'sound/voice/croak_frog.ogg' /datum/decl/emote/audible/gao key = "gao" emote_message_3p = "lets out a gao." + emote_message_mute_3p = "lets out a silent gao." emote_sound = 'sound/voice/gao.ogg' /datum/decl/emote/audible/cackle key = "cackle" emote_message_3p = "cackles hysterically!" + emote_message_mute_3p = "mimics a hysteric cackle!" emote_sound = 'sound/voice/yeencackle.ogg' /datum/decl/emote/audible/spiderchitter key = "spiderchitter" emote_message_3p = "chitters." + emote_message_mute_3p = "chitters silently." emote_sound = 'sound/voice/spiderchitter.ogg' /datum/decl/emote/audible/spiderpurr key = "spiderpurr" emote_message_3p = "purrs." + emote_message_mute_3p = "purrs silently." emote_sound = 'sound/voice/spiderpurr.ogg' /datum/decl/emote/audible/squeaky key = "squeaky" emote_message_3p = "squeaks." + emote_message_mute_3p = "squeaks silently." emote_sound = 'sound/items/drop/plushie.ogg' /datum/decl/emote/audible/mothscream key = "mothscream" emote_message_3p ="screams" + emote_message_mute_3p = "screams silently" emote_sound = 'sound/voice/moth/scream_moth.ogg' /datum/decl/emote/audible/mothchitter key = "mothchitter" emote_message_3p = "chitters" + emote_message_mute_3p = "chitters silently" emote_sound = 'sound/voice/moth/moth_chitter.ogg' /datum/decl/emote/audible/mothlaugh key = "mothlaugh" emote_message_3p = "laughs" + emote_message_mute_3p = "laughs silently!" emote_sound = 'sound/voice/moth/moth_laugh.ogg' /datum/decl/emote/audible/gyoh key = "gyoh" emote_message_3p = "gyohs." + emote_message_mute_3p = "gyohs silently." emote_sound = 'sound/voice/teppi/whine1.ogg' var/list/bigsound = list('sound/voice/teppi/gyooh1.ogg', 'sound/voice/teppi/gyooh2.ogg', 'sound/voice/teppi/gyooh3.ogg', 'sound/voice/teppi/gyooh4.ogg', 'sound/voice/teppi/gyooh5.ogg','sound/voice/teppi/gyooh6.ogg') var/list/smolsound = list('sound/voice/teppi/whine1.ogg', 'sound/voice/teppi/whine2.ogg') @@ -190,6 +228,7 @@ /datum/decl/emote/audible/rumble key = "rumble" emote_message_3p = "rumbles contentedly." + emote_message_mute_3p = "rumbles silently." emote_sound = 'sound/voice/teppi/whine1.ogg' var/list/bigsound = list('sound/voice/teppi/rumble.ogg') var/list/smolsound = list('sound/voice/teppi/cute_rumble.ogg') @@ -217,34 +256,41 @@ /datum/decl/emote/audible/coyawoo key = "coyawoo" emote_message_3p = "lets out a scraggly awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/coyoteawoo.ogg' /datum/decl/emote/audible/coyawoo2 key = "coyawoo2" emote_message_3p = "lets out a pronounced, scraggly awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/coyoteawoo2.ogg' /datum/decl/emote/audible/coyawoo3 key = "coyawoo3" emote_message_3p = "yaps and lets out a scraggly awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/coyoteawoo3.ogg' /datum/decl/emote/audible/coyawoo4 key = "coyawoo4" emote_message_3p = "yaps several times, and lets out a short, scraggly awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/coyoteawoo4.ogg' /datum/decl/emote/audible/coyawoo5 key = "coyawoo5" emote_message_3p = "lets out a scraggly, whine-awoo." + emote_message_mute_3p = "lets out a silent awoo." emote_sound = 'sound/voice/coyoteawoo5.ogg' /datum/decl/emote/audible/roarbark // Upstream port from CHOMP key = "roarbark" emote_message_3p = "lets out a roar-bark!" + emote_message_mute_3p = "lets out a silent roar-bark!" emote_sound = 'sound/voice/roarbark.ogg' /datum/decl/emote/audible/dook key = "dook" emote_message_3p = "dooks." + emote_message_mute_3p = "dooks silently." emote_sound = 'sound/voice/ferretdook.ogg' diff --git a/code/modules/emotes/definitions/audible_pain.dm b/code/modules/emotes/definitions/audible_pain.dm index 287f3162f4..8e375646c6 100644 --- a/code/modules/emotes/definitions/audible_pain.dm +++ b/code/modules/emotes/definitions/audible_pain.dm @@ -2,6 +2,8 @@ key = "pain" emote_message_1p = "You yell in pain!" emote_message_3p = "yells in pain!" + emote_message_mute_1p = "You yell silently in pain!" + emote_message_mute_3p = "yells silently in pain!" /datum/decl/emote/audible/pain/get_emote_message_1p(atom/user, atom/target, extra_params) if(ishuman(user)) diff --git a/code/modules/emotes/definitions/audible_scream.dm b/code/modules/emotes/definitions/audible_scream.dm index 2ad9ceb782..83329932e4 100644 --- a/code/modules/emotes/definitions/audible_scream.dm +++ b/code/modules/emotes/definitions/audible_scream.dm @@ -2,6 +2,8 @@ key = "scream" emote_message_1p = "You scream!" emote_message_3p = "screams!" + emote_message_mute_1p = "You scream silently!" + emote_message_mute_3p = "screams silently!" /datum/decl/emote/audible/scream/get_emote_sound(atom/user) if(ishuman(user)) @@ -17,11 +19,15 @@ /datum/decl/emote/audible/scream/get_emote_message_1p(atom/user, atom/target, extra_params) if(ishuman(user)) var/mob/living/carbon/human/H = user + if(HAS_MIND_TRAIT(H, TRAIT_MIMING)) + return emote_message_mute_1p return "You [H.species.scream_verb_1p]!" . = ..() /datum/decl/emote/audible/scream/get_emote_message_3p(atom/user, atom/target, extra_params) if(ishuman(user)) var/mob/living/carbon/human/H = user + if(HAS_MIND_TRAIT(H, TRAIT_MIMING)) + return emote_message_mute_3p return "[H.species.scream_verb_3p]!" . = ..() diff --git a/code/modules/emotes/definitions/audible_scream_vr.dm b/code/modules/emotes/definitions/audible_scream_vr.dm index c89952790c..144953ad29 100644 --- a/code/modules/emotes/definitions/audible_scream_vr.dm +++ b/code/modules/emotes/definitions/audible_scream_vr.dm @@ -13,4 +13,5 @@ /datum/decl/emote/audible/malehumanscream key = "malehumanscream" emote_message_3p = "screams!" + emote_message_mute_3p = "screams silently!" emote_sound = 'sound/voice/malescream_2.ogg' diff --git a/code/modules/emotes/definitions/audible_slap.dm b/code/modules/emotes/definitions/audible_slap.dm index 462e7b1b5d..cbc404f00a 100644 --- a/code/modules/emotes/definitions/audible_slap.dm +++ b/code/modules/emotes/definitions/audible_slap.dm @@ -7,6 +7,7 @@ emote_sound = 'sound/effects/snap.ogg' check_restraints = TRUE check_range = 1 + able_mute = TRUE /datum/decl/emote/audible/slap/New() ..() diff --git a/code/modules/emotes/definitions/audible_snap.dm b/code/modules/emotes/definitions/audible_snap.dm index a979d8b176..7fdf52f9f8 100644 --- a/code/modules/emotes/definitions/audible_snap.dm +++ b/code/modules/emotes/definitions/audible_snap.dm @@ -5,6 +5,7 @@ emote_message_1p_target = "You snap your fingers at TARGET." emote_message_3p_target = "snaps USER_THEIR fingers at TARGET." emote_sound = 'sound/effects/fingersnap.ogg' + able_mute = TRUE /datum/decl/emote/audible/snap/proc/can_snap(atom/user) if(ishuman(user)) diff --git a/code/modules/emotes/definitions/audible_sneeze.dm b/code/modules/emotes/definitions/audible_sneeze.dm index d84c2aa226..ab6e259436 100644 --- a/code/modules/emotes/definitions/audible_sneeze.dm +++ b/code/modules/emotes/definitions/audible_sneeze.dm @@ -6,6 +6,8 @@ emote_message_synthetic_1p_target = "You emit a robotic sneeze towards TARGET." emote_message_synthetic_3p = "emits a robotic sneeze." emote_message_synthetic_3p_target = "emits a robotic sneeze towards TARGET." + emote_message_mute_1p = "You act out an exaggerated silent sneeze." + emote_message_mute_3p = "acts out an exaggerated silent sneeze." /datum/decl/emote/audible/sneeze/get_emote_sound(atom/user) if(ishuman(user) && !check_synthetic(user)) diff --git a/code/modules/emotes/definitions/audible_whistle.dm b/code/modules/emotes/definitions/audible_whistle.dm index d5d4133132..de82bcaff5 100644 --- a/code/modules/emotes/definitions/audible_whistle.dm +++ b/code/modules/emotes/definitions/audible_whistle.dm @@ -7,6 +7,7 @@ emote_sound_synthetic = 'sound/voice/longwhistle_robot.ogg' emote_message_synthetic_1p = "You whistle a robotic tune." emote_message_synthetic_3p = "whistles a robotic tune." + able_mute = TRUE /datum/decl/emote/audible/whistle/quiet key = "qwhistle" @@ -16,6 +17,7 @@ emote_message_synthetic_1p = "You whistle robotically." emote_message_synthetic_3p = "whistles robotically." emote_sound_synthetic = 'sound/voice/shortwhistle_robot.ogg' + able_mute = TRUE /datum/decl/emote/audible/whistle/wolf key = "wwhistle" @@ -25,6 +27,7 @@ emote_message_synthetic_1p = "You beep inappropriately." emote_message_synthetic_3p = "beeps inappropriately." emote_sound_synthetic = 'sound/voice/wolfwhistle_robot.ogg' + able_mute = TRUE /datum/decl/emote/audible/whistle/summon key = "swhistle" @@ -34,3 +37,4 @@ emote_message_synthetic_1p = "You whistle a robotic tune." emote_message_synthetic_3p = "whistles a robotic tune." emote_sound_synthetic = 'sound/voice/summon_whistle_robot.ogg' + able_mute = TRUE diff --git a/code/modules/emotes/definitions/visible_animated.dm b/code/modules/emotes/definitions/visible_animated.dm index ee6f5324f0..b8d30c0b8e 100644 --- a/code/modules/emotes/definitions/visible_animated.dm +++ b/code/modules/emotes/definitions/visible_animated.dm @@ -25,6 +25,7 @@ emote_message_1p = "You do a flip!" emote_message_3p = "does a flip!" emote_sound = 'sound/effects/bodyfall4.ogg' + able_mute = TRUE /datum/decl/emote/visible/flip/do_extra(mob/user) . = ..() diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm index 7d1b9d7414..f78616eacd 100644 --- a/code/modules/emotes/emote_define.dm +++ b/code/modules/emotes/emote_define.dm @@ -16,6 +16,9 @@ var/emote_message_synthetic_1p // First person message for robits. var/emote_message_synthetic_3p // Third person message for robits. + var/emote_message_mute_1p // First person message for mutes. + var/emote_message_mute_3p // Third person message for mutes. + var/emote_message_impaired // Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth') var/emote_message_1p_target // 'You do a flip at Urist McTarget!' @@ -40,6 +43,7 @@ var/check_range // falsy, or a range outside which the emote will not work var/conscious = TRUE // Do we need to be awake to emote this? var/emote_range = 0 // If >0, restricts emote visibility to viewers within range. + var/able_mute = FALSE // If it this emote doesn't require vocal chords. var/sound_preferences = list(/datum/preference/toggle/emote_noises) // Default emote sound_preferences is just emote_noises. Belch emote overrides this list for pref-checks. var/sound_vary = FALSE @@ -54,6 +58,11 @@ if(emote_message_synthetic_1p_target && check_synthetic(user)) return emote_message_synthetic_1p_target return emote_message_1p_target + var/mob/living/mob + if(isliving(user)) + mob = user + if(emote_message_mute_1p && HAS_MIND_TRAIT(mob, TRAIT_MIMING)) + return emote_message_mute_1p if(emote_message_synthetic_1p && check_synthetic(user)) return emote_message_synthetic_1p return emote_message_1p @@ -63,6 +72,11 @@ if(emote_message_synthetic_3p_target && check_synthetic(user)) return emote_message_synthetic_3p_target return emote_message_3p_target + var/mob/living/mob + if(isliving(user)) + mob = user + if(emote_message_mute_3p && HAS_MIND_TRAIT(mob, TRAIT_MIMING)) + return emote_message_mute_3p if(emote_message_synthetic_3p && check_synthetic(user)) return emote_message_synthetic_3p return emote_message_3p @@ -146,7 +160,10 @@ M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range, runemessage = prefinal_3p) do_extra(user, target) - do_sound(user) + if(isliving(user)) + var/mob/living/mob = user + if(!(HAS_MIND_TRAIT(mob, TRAIT_MIMING) && !able_mute)) + do_sound(user) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_EMOTE_PERFORMED, user, extra_params) /datum/decl/emote/proc/replace_target_tokens(msg, atom/target) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 84a8fca542..9a38247604 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -209,6 +209,9 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key) var/list/message_pieces = parse_languages(message) if(istype(message_pieces, /datum/multilingual_say_piece)) // Little quark for dealing with hivemind/signlang languages. var/datum/multilingual_say_piece/S = message_pieces // Yay for BYOND's hilariously broken typecasting for allowing us to do this. + if(HAS_MIND_TRAIT(src, TRAIT_MIMING)) + to_chat(src, span_green("You stop yourself from signing in favor of the art of mimery!")) + return FALSE S.speaking.broadcast(src, S.message) return 1 @@ -216,6 +219,10 @@ GLOBAL_LIST_EMPTY(channel_to_radio_key) log_runtime(EXCEPTION("Message failed to generate pieces. [message] - [json_encode(message_pieces)]")) return 0 + if(HAS_MIND_TRAIT(src, TRAIT_MIMING)) + to_chat(src, span_green("Your vow of silence prevents you from speaking!")) + return + // If you're muzzled, you can only speak sign language // However, sign language is handled above. if(is_muzzled()) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index ec5d6e167d..f61238ac0e 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -61,6 +61,10 @@ name = "clown's rubber stamp" icon_state = "stamp-clown" +/obj/item/stamp/mime + name = "mime's rubber stamp" + icon_state = "stamp-mime" + /obj/item/stamp/internalaffairs name = "internal affairs rubber stamp" icon_state = "stamp-intaff" diff --git a/code/modules/reagents/reagents/food_drinks.dm b/code/modules/reagents/reagents/food_drinks.dm index 57462b9315..5bbe596eb9 100644 --- a/code/modules/reagents/reagents/food_drinks.dm +++ b/code/modules/reagents/reagents/food_drinks.dm @@ -2664,6 +2664,11 @@ glass_name = REAGENT_ID_NOTHING glass_desc = "Absolutely nothing." +/datum/reagent/drink/nothing/affect_ingest(mob/living/carbon/M, alien, removed) + ..() + if(HAS_MIND_TRAIT(M, TRAIT_MIMING)) + M.heal_organ_damage(1 * removed, 1 * removed) + /datum/reagent/drink/dreamcream name = REAGENT_DREAMCREAM id = REAGENT_ID_DREAMCREAM diff --git a/code/modules/spells/aoe_turf/conjure/invisible_box.dm b/code/modules/spells/aoe_turf/conjure/invisible_box.dm new file mode 100644 index 0000000000..772d55c756 --- /dev/null +++ b/code/modules/spells/aoe_turf/conjure/invisible_box.dm @@ -0,0 +1,28 @@ +/datum/spell/aoe_turf/conjure/invisible_box + name = "Invisible box" + desc = "The mime's performance transmutates a box into physical reality." + cast_sound = null + charge_max = 30 SECONDS + duration = 50 SECONDS + charge_max = 300 + override_base = "grey" + hud_state = "box" + school = "mime" + +/datum/spell/aoe_turf/conjure/invisible_box/cast(list/targets, mob/user) + if(!HAS_MIND_TRAIT(user, TRAIT_MIMING)) + to_chat(user, "Your performance is not good enough!") + return + + var/obj/item/storage/box/mime/mimebox = new /obj/item/storage/box/mime(get_turf(user)) + user.put_in_any_hand_if_possible(mimebox) + mimebox.alpha = 255 + addtimer(CALLBACK(src, PROC_REF(cleanup_box), mimebox), duration) + +/datum/spell/aoe_turf/conjure/invisible_box/proc/cleanup_box(obj/item/storage/box/box) + if(QDELETED(box) || !istype(box)) + return + + for(var/obj/thing in box) + thing.forceMove(get_turf(thing)) + qdel(box) diff --git a/code/modules/spells/aoe_turf/conjure/invisible_chair.dm b/code/modules/spells/aoe_turf/conjure/invisible_chair.dm new file mode 100644 index 0000000000..857c842a0a --- /dev/null +++ b/code/modules/spells/aoe_turf/conjure/invisible_chair.dm @@ -0,0 +1,23 @@ +/datum/spell/aoe_turf/conjure/invisible_chair + name = "Invisible chair" + desc = "The mime's performance transmutates a chair into physical reality." + invocation_type = SpI_EMOTE + invocation = "pulls out an invisible chair and sits down." + charge_max = 30 SECONDS + cast_sound = null + duration = 25 SECONDS + override_base = "grey" + hud_state = "chair" + school = "mime" + +/datum/spell/aoe_turf/conjure/invisible_chair/cast(list/targets, mob/user) + if(!HAS_MIND_TRAIT(user, TRAIT_MIMING)) + to_chat(user, "Your performance is not good enough!") + return + + var/obj/structure/bed/chair/mime/chair = new /obj/structure/bed/chair/mime(get_turf(user)) + chair.set_dir(user.dir) + chair.buckle_mob(user) + + if(duration) + QDEL_IN(chair, duration) diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index b5e4824f5f..b93d4b6052 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -441,3 +441,28 @@ ..() to_chat(user, span_warning("[src] suddenly feels very warm!")) empulse(src, 1, 1, 1, 1) + +/obj/item/spellbook/oneuse/mime + name = "Guide to Mimery Vol 0" + desc = "The missing entry into the legendary saga. Unfortunately it doesn't teach you anything." + icon_state ="bookmime" + +/obj/item/spellbook/oneuse/mime/mimery + name = "Guide to Dank Mimery" + desc = "Teaches three classic pantomime routines, allowing a practiced mime to conjure invisible objects into corporeal existence. One use only." + spell = /datum/spell/aoe_turf/conjure/forcewall/mime + spellname = "" + +/obj/item/spellbook/oneuse/mime/mimery/onlearned(mob/user) + if(ishuman(user)) + var/mob/living/carbon/human/human = user + var/datum/spell/chair = new /datum/spell/aoe_turf/conjure/invisible_chair + var/datum/spell/box = new /datum/spell/aoe_turf/conjure/invisible_box + human.add_spell(chair) + human.add_spell(box) + var/datum/action/innate/vow_of_silence/vow = locate() in human.actions + if(!vow && human.mind) + vow = new(human.mind) + vow.Grant(human) + to_chat(user, span_warning("The book disappears into thin air.")) + qdel(src) diff --git a/icons/inventory/back/item.dmi b/icons/inventory/back/item.dmi index a8b13b1b5c..e12d212e7b 100644 Binary files a/icons/inventory/back/item.dmi and b/icons/inventory/back/item.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index b879b1874f..2a06abf289 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 0ca7ee5772..ebe72aa5ae 100644 Binary files a/icons/obj/library.dmi and b/icons/obj/library.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 7c12f4a359..64d13ecf1e 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -515,6 +515,7 @@ #include "code\_onclick\hud\action\item_action.dm" #include "code\_onclick\hud\action\positioning.dm" #include "code\_onclick\hud\action\types\item.dm" +#include "code\_onclick\hud\action\types\mime_vow.dm" #include "code\ATMOSPHERICS\_atmos_setup.dm" #include "code\ATMOSPHERICS\_atmospherics_helpers.dm" #include "code\ATMOSPHERICS\atmospherics.dm" @@ -4905,6 +4906,8 @@ #include "code\modules\spells\aoe_turf\conjure\conjure.dm" #include "code\modules\spells\aoe_turf\conjure\construct.dm" #include "code\modules\spells\aoe_turf\conjure\forcewall.dm" +#include "code\modules\spells\aoe_turf\conjure\invisible_box.dm" +#include "code\modules\spells\aoe_turf\conjure\invisible_chair.dm" #include "code\modules\spells\general\area_teleport.dm" #include "code\modules\spells\general\rune_write.dm" #include "code\modules\spells\targeted\ethereal_jaunt.dm"