From c67ed25b85b48ca1c2b77c7427091d98668fcc05 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Sat, 16 May 2015 16:01:41 +1000 Subject: [PATCH 1/7] visible_message() now affects objects. Holopads, pAIs, AI cards people in mecha should hence be able to see them Tape recorders record hearable emotes and action messages Human and robot emotes now use custom_emote() --- code/game/machinery/hologram.dm | 6 + code/game/mecha/mecha.dm | 6 + code/game/objects/items/devices/aicard.dm | 7 + code/game/objects/items/devices/paicard.dm | 6 + .../objects/items/devices/taperecorder.dm | 29 ++- .../objects/items/weapons/storage/storage.dm | 16 +- code/game/objects/objs.dm | 3 + .../structures/crates_lockers/closets.dm | 20 +- code/modules/clothing/suits/storage.dm | 8 + .../clothing/under/accessories/storage.dm | 8 + code/modules/mob/holder.dm | 4 +- code/modules/mob/living/carbon/human/emote.dm | 210 ++++++++---------- .../modules/mob/living/silicon/robot/emote.dm | 56 +++-- code/modules/mob/mob.dm | 61 ++++- 14 files changed, 285 insertions(+), 155 deletions(-) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 28bb2be7bc..424971cc71 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -113,6 +113,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ master.show_message(rendered, 2) return +/obj/machinery/hologram/holopad/show_message(msg, type, alt, alt_type) + for(var/mob/living/silicon/ai/master in masters) + var/rendered = "Holopad received, [msg]" + master.show_message(rendered, type) + return + /obj/machinery/hologram/holopad/proc/create_holo(mob/living/silicon/ai/A, turf/T = loc) var/obj/effect/overlay/hologram = new(T)//Spawn a blank effect at the location. hologram.icon = A.holo_icon diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index b52f98827a..0f8d666de9 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -258,6 +258,12 @@ occupant.show_message(rendered, 2) ..() +/obj/mecha/show_message(msg, type, alt, alt_type) + if(occupant && occupant.client) + var/rendered = "[msg]" + occupant.show_message(rendered, type) + ..() + //////////////////////////// ///// Action processing //// //////////////////////////// diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 5e2ab73155..e5a8129ebf 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -160,6 +160,13 @@ var/rendered = "[text]" carded_ai.show_message(rendered, 2) ..() + +/obj/item/device/aicard/show_message(msg, type, alt, alt_type) + if(carded_ai && carded_ai.client) + var/rendered = "[msg]" + carded_ai.show_message(rendered, type) + ..() + /* /obj/item/device/aicard/relaymove(var/mob/user, var/direction) if(src.loc && istype(src.loc.loc, /obj/item/rig_module)) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index eed6cdb12e..d2d06d6891 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -323,4 +323,10 @@ if(pai && pai.client) var/rendered = "[text]" pai.show_message(rendered, 2) + ..() + +/obj/item/device/paicard/show_message(msg, type, alt, alt_type) + if(pai && pai.client) + var/rendered = "[msg]" + pai.show_message(rendered, type) ..() \ No newline at end of file diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 35d04e4d08..d6fda94bcd 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -29,6 +29,25 @@ else storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [M.name] [verb], \"[msg]\"" +/obj/item/device/taperecorder/see_emote(mob/M as mob, text, var/emote_type) + if(emote_type != 2) //only hearable emotes + return + if(recording) + timestamp += timerecorded + storedinfo += "\[[time2text(timerecorded*10,"mm:ss")]\] [strip_html_properly(text)]" + +/obj/item/device/taperecorder/show_message(msg, type, alt, alt_type) + var/recordedtext + if (msg && type == 2) //must be hearable + recordedtext = msg + else if (alt && alt_type == 2) + recordedtext = alt + else + return + if(recording) + timestamp += timerecorded + storedinfo += "*\[[time2text(timerecorded*10,"mm:ss")]\] *[strip_html_properly(recordedtext)]*" //"*" at front as a marker + /obj/item/device/taperecorder/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if(istype(W, /obj/item/weapon/card/emag)) @@ -146,7 +165,10 @@ if(storedinfo.len < i) break var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: [storedinfo[i]]") + var/playedmessage = storedinfo[i] + if (findtextEx(playedmessage,"*",1,2)) //remove marker for action sounds + playedmessage = copytext(playedmessage,2) + T.visible_message("Tape Recorder: [playedmessage]") if(storedinfo.len < i+1) playsleepseconds = 1 sleep(10) @@ -200,7 +222,10 @@ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(get_turf(src)) var/t1 = "Transcript:

" for(var/i=1,storedinfo.len >= i,i++) - t1 += "[storedinfo[i]]
" + var/printedmessage = storedinfo[i] + if (findtextEx(printedmessage,"*",1,2)) //replace action sounds + printedmessage = "\[[time2text(timestamp[i]*10,"mm:ss")]\] (Unrecognized sound)" + t1 += "[printedmessage]
" P.info = t1 P.name = "Transcript" canprint = 0 diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 61786e10db..ee2138d0a2 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -51,10 +51,10 @@ //there's got to be a better way of doing this. if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) return - + if (( usr.restrained() ) || ( usr.stat )) return - + if ((src.loc == usr) && !usr.unEquip(src)) return @@ -450,6 +450,18 @@ var/obj/O = A O.hear_talk(M, text, verb, speaking) +/obj/item/weapon/storage/see_emote(mob/M as mob, text, var/emote_type) + for (var/atom/A in src) + if(istype(A,/obj/)) + var/obj/O = A + O.see_emote(M, text, emote_type) + +/obj/item/weapon/storage/show_message(msg, type, alt, alt_type) + for (var/atom/A in src) + if(istype(A,/obj/)) + var/obj/O = A + O.show_message(msg, type, alt, alt_type) + //Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area). //Returns -1 if the atom was not found on container. /atom/proc/storage_depth(atom/container) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index fc6ef5b99d..960eab6712 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -141,3 +141,6 @@ /obj/proc/see_emote(mob/M as mob, text, var/emote_type) return + +/obj/proc/show_message(msg, type, alt, alt_type) + return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 5e1a551cec..e941495747 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -302,6 +302,18 @@ var/obj/O = A O.hear_talk(M, text, verb, speaking) +/obj/structure/closet/see_emote(mob/M as mob, text, var/emote_type) + for (var/atom/A in src) + if(istype(A,/obj/)) + var/obj/O = A + O.see_emote(M, text, emote_type) + +/obj/structure/closet/show_message(msg, type, alt, alt_type) + for (var/atom/A in src) + if(istype(A,/obj/)) + var/obj/O = A + O.show_message(msg, type, alt, alt_type) + /obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker) if(!damage || !wallbreaker) return @@ -329,25 +341,25 @@ escapee.next_move = world.time + 100 escapee.last_special = world.time + 100 escapee << "You lean on the back of \the [src] and start pushing the door open. (this will take about [breakout_time] minutes)" - + visible_message("The [src] begins to shake violently!") breakout = 1 //can't think of a better way to do this right now. for(var/i in 1 to (6*breakout_time * 2)) //minutes * 6 * 5seconds * 2 playsound(src.loc, 'sound/effects/grillehit.ogg', 100, 1) animate_shake() - + if(!do_after(escapee, 50)) //5 seconds breakout = 0 return - if(!escapee || escapee.stat || escapee.loc != src) + if(!escapee || escapee.stat || escapee.loc != src) breakout = 0 return //closet/user destroyed OR user dead/unconcious OR user no longer in closet OR closet opened //Perform the same set of checks as above for weld and lock status to determine if there is even still a point in 'resisting'... if(!req_breakout()) breakout = 0 return - + //Well then break it! breakout = 0 escapee << "You successfully break out!" diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 221a8dbd29..8348e76ec9 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -33,6 +33,14 @@ pockets.hear_talk(M, msg, verb, speaking) ..() +/obj/item/clothing/suit/storage/see_emote(mob/M as mob, text, var/emote_type) + pockets.see_emote(M, text, emote_type) + ..() + +/obj/item/clothing/suit/storage/show_message(msg, type, alt, alt_type) + pockets.show_message(msg, type, alt, alt_type) + ..() + //Jackets with buttons, used for labcoats, IA jackets, First Responder jackets, and brown jackets. /obj/item/clothing/suit/storage/toggle var/icon_open diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 7f13449d16..4b9f4410b1 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -38,6 +38,14 @@ hold.hear_talk(M, msg, verb, speaking) ..() +/obj/item/clothing/accessory/storage/see_emote(mob/M as mob, text, var/emote_type) + hold.see_emote(M, text, emote_type) + ..() + +/obj/item/clothing/accessory/storage/show_message(msg, type, alt, alt_type) + hold.show_message(msg, type, alt, alt_type) + ..() + /obj/item/clothing/accessory/storage/attack_self(mob/user as mob) user << "You empty [src]." var/turf/T = get_turf(src) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 6347a091f4..61e5b3c637 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -32,9 +32,9 @@ for(var/mob/M in src.contents) M.attackby(W,user) -/obj/item/weapon/holder/proc/show_message(var/message, var/m_type) +/obj/item/weapon/holder/show_message(msg, type, alt, alt_type) for(var/mob/living/M in contents) - M.show_message(message,m_type) + M.show_message(msg,type) //Mob procs and vars for scooping up /mob/living/var/holder_type diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 8d7c655730..364d6228a7 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -21,15 +21,15 @@ switch(act) if ("airguitar") if (!src.restrained()) - message = "[src] is strumming the air and headbanging like a safari chimp." + message = "is strumming the air and headbanging like a safari chimp." m_type = 1 if ("blink") - message = "[src] blinks." + message = "blinks." m_type = 1 if ("blink_r") - message = "[src] blinks rapidly." + message = "blinks rapidly." m_type = 1 if ("bow") @@ -44,9 +44,9 @@ param = null if (param) - message = "[src] bows to [param]." + message = "bows to [param]." else - message = "[src] bows." + message = "bows." m_type = 1 if ("custom") @@ -94,73 +94,73 @@ param = null if (param) - message = "[src] salutes to [param]." + message = "salutes to [param]." else - message = "[src] salutes." + message = "salutes." m_type = 1 if ("choke") if(miming) - message = "[src] clutches his throat desperately!" + message = "clutches his throat desperately!" m_type = 1 else if (!muzzled) - message = "[src] chokes!" + message = "chokes!" m_type = 2 else - message = "[src] makes a strong noise." + message = "makes a strong noise." m_type = 2 if ("clap") if (!src.restrained()) - message = "[src] claps." + message = "claps." m_type = 2 if(miming) m_type = 1 if ("flap") if (!src.restrained()) - message = "[src] flaps \his wings." + message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings." m_type = 2 if(miming) m_type = 1 if ("aflap") if (!src.restrained()) - message = "[src] flaps \his wings ANGRILY!" + message = "flaps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] wings ANGRILY!" m_type = 2 if(miming) m_type = 1 if ("drool") - message = "[src] drools." + message = "drools." m_type = 1 if ("eyebrow") - message = "[src] raises an eyebrow." + message = "raises an eyebrow." m_type = 1 if ("chuckle") if(miming) - message = "[src] appears to chuckle." + message = "appears to chuckle." m_type = 1 else if (!muzzled) - message = "[src] chuckles." + message = "chuckles." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("twitch") - message = "[src] twitches violently." + message = "twitches violently." m_type = 1 if ("twitch_s") - message = "[src] twitches." + message = "twitches." m_type = 1 if ("faint") - message = "[src] faints." + message = "faints." if(src.sleeping) return //Can't faint while asleep src.sleeping += 10 //Short-short nap @@ -168,58 +168,58 @@ if ("cough") if(miming) - message = "[src] appears to cough!" + message = "appears to cough!" m_type = 1 else if (!muzzled) - message = "[src] coughs!" + message = "coughs!" m_type = 2 else - message = "[src] makes a strong noise." + message = "makes a strong noise." m_type = 2 if ("frown") - message = "[src] frowns." + message = "frowns." m_type = 1 if ("nod") - message = "[src] nods." + message = "nods." m_type = 1 if ("blush") - message = "[src] blushes." + message = "blushes." m_type = 1 if ("wave") - message = "[src] waves." + message = "waves." m_type = 1 if ("gasp") if(miming) - message = "[src] appears to be gasping!" + message = "appears to be gasping!" m_type = 1 else if (!muzzled) - message = "[src] gasps!" + message = "gasps!" m_type = 2 else - message = "[src] makes a weak noise." + message = "makes a weak noise." m_type = 2 if ("deathgasp") - message = "[src] [species.death_message]" + message = "[species.death_message]" m_type = 1 if ("giggle") if(miming) - message = "[src] giggles silently!" + message = "giggles silently!" m_type = 1 else if (!muzzled) - message = "[src] giggles." + message = "giggles." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("glare") @@ -233,9 +233,9 @@ param = null if (param) - message = "[src] glares at [param]." + message = "glares at [param]." else - message = "[src] glares." + message = "glares." if ("stare") var/M = null @@ -248,9 +248,9 @@ param = null if (param) - message = "[src] stares at [param]." + message = "stares at [param]." else - message = "[src] stares." + message = "stares." if ("look") var/M = null @@ -264,86 +264,86 @@ param = null if (param) - message = "[src] looks at [param]." + message = "looks at [param]." else - message = "[src] looks." + message = "looks." m_type = 1 if ("grin") - message = "[src] grins." + message = "grins." m_type = 1 if ("cry") if(miming) - message = "[src] cries." + message = "cries." m_type = 1 else if (!muzzled) - message = "[src] cries." + message = "cries." m_type = 2 else - message = "[src] makes a weak noise. \He frowns." + message = "makes a weak noise. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "frown" : "frowns"]." m_type = 2 if ("sigh") if(miming) - message = "[src] sighs." + message = "sighs." m_type = 1 else if (!muzzled) - message = "[src] sighs." + message = "sighs." m_type = 2 else - message = "[src] makes a weak noise." + message = "makes a weak noise." m_type = 2 if ("laugh") if(miming) - message = "[src] acts out a laugh." + message = "acts out a laugh." m_type = 1 else if (!muzzled) - message = "[src] laughs." + message = "laughs." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("mumble") - message = "[src] mumbles!" + message = "mumbles!" m_type = 2 if(miming) m_type = 1 if ("grumble") if(miming) - message = "[src] grumbles!" + message = "grumbles!" m_type = 1 if (!muzzled) - message = "[src] grumbles!" + message = "grumbles!" m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("groan") if(miming) - message = "[src] appears to groan!" + message = "appears to groan!" m_type = 1 else if (!muzzled) - message = "[src] groans!" + message = "groans!" m_type = 2 else - message = "[src] makes a loud noise." + message = "makes a loud noise." m_type = 2 if ("moan") if(miming) - message = "[src] appears to moan!" + message = "appears to moan!" m_type = 1 else - message = "[src] moans!" + message = "moans!" m_type = 2 if ("johnny") @@ -354,10 +354,10 @@ param = null else if(miming) - message = "[src] takes a drag from a cigarette and blows \"[M]\" out in smoke." + message = "takes a drag from a cigarette and blows \"[M]\" out in smoke." m_type = 1 else - message = "[src] says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke." + message = "says, \"[M], please. He had a family.\" [src.name] takes a drag from a cigarette and blows his name out in smoke." m_type = 2 if ("point") @@ -370,26 +370,26 @@ break if (!M) - message = "[src] points." + message = "points." else pointed(M) if (M) - message = "[src] points to [M]." + message = "points to [M]." else m_type = 1 if ("raise") if (!src.restrained()) - message = "[src] raises a hand." + message = "raises a hand." m_type = 1 if("shake") - message = "[src] shakes \his head." + message = "shakes [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] head." m_type = 1 if ("shrug") - message = "[src] shrugs." + message = "shrugs." m_type = 1 if ("signal") @@ -397,85 +397,85 @@ var/t1 = round(text2num(param)) if (isnum(t1)) if (t1 <= 5 && (!src.r_hand || !src.l_hand)) - message = "[src] raises [t1] finger\s." + message = "raises [t1] finger\s." else if (t1 <= 10 && (!src.r_hand && !src.l_hand)) - message = "[src] raises [t1] finger\s." + message = "raises [t1] finger\s." m_type = 1 if ("smile") - message = "[src] smiles." + message = "smiles." m_type = 1 if ("shiver") - message = "[src] shivers." + message = "shivers." m_type = 2 if(miming) m_type = 1 if ("pale") - message = "[src] goes pale for a second." + message = "goes pale for a second." m_type = 1 if ("tremble") - message = "[src] trembles in fear!" + message = "trembles in fear!" m_type = 1 if ("sneeze") if (miming) - message = "[src] sneezes." + message = "sneezes." m_type = 1 else if (!muzzled) - message = "[src] sneezes." + message = "sneezes." m_type = 2 else - message = "[src] makes a strange noise." + message = "makes a strange noise." m_type = 2 if ("sniff") - message = "[src] sniffs." + message = "sniffs." m_type = 2 if(miming) m_type = 1 if ("snore") if (miming) - message = "[src] sleeps soundly." + message = "sleeps soundly." m_type = 1 else if (!muzzled) - message = "[src] snores." + message = "snores." m_type = 2 else - message = "[src] makes a noise." + message = "makes a noise." m_type = 2 if ("whimper") if (miming) - message = "[src] appears hurt." + message = "appears hurt." m_type = 1 else if (!muzzled) - message = "[src] whimpers." + message = "whimpers." m_type = 2 else - message = "[src] makes a weak noise." + message = "makes a weak noise." m_type = 2 if ("wink") - message = "[src] winks." + message = "winks." m_type = 1 if ("yawn") if (!muzzled) - message = "[src] yawns." + message = "yawns." m_type = 2 if(miming) m_type = 1 if ("collapse") Paralyse(2) - message = "[src] collapses!" + message = "collapses!" m_type = 2 if(miming) m_type = 1 @@ -493,9 +493,9 @@ M = null if (M) - message = "[src] hugs [M]." + message = "hugs [M]." else - message = "[src] hugs \himself." + message = "hugs [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]." if ("handshake") m_type = 1 @@ -511,9 +511,9 @@ if (M) if (M.canmove && !M.r_hand && !M.restrained()) - message = "[src] shakes hands with [M]." + message = "shakes hands with [M]." else - message = "[src] holds out \his hand to [M]." + message = "holds out [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] hand to [M]." if("dap") m_type = 1 @@ -525,20 +525,20 @@ M = A break if (M) - message = "[src] gives daps to [M]." + message = "gives daps to [M]." else - message = "[src] sadly can't find anybody to give daps to, and daps \himself. Shameful." + message = "sadly can't find anybody to give daps to, and daps [get_visible_gender() == MALE ? "himself" : get_visible_gender() == FEMALE ? "herself" : "themselves"]. Shameful." if ("scream") if (miming) - message = "[src] acts out a scream!" + message = "acts out a scream!" m_type = 1 else if (!muzzled) - message = "[src] screams!" + message = "screams!" m_type = 2 else - message = "[src] makes a very loud noise." + message = "makes a very loud noise." m_type = 2 if ("help") @@ -553,23 +553,7 @@ if (message) log_emote("[name]/[key] : [message]") - - //Hearing gasp and such every five seconds is not good emotes were not global for a reason. - // Maybe some people are okay with that. - - for(var/mob/M in dead_mob_list) - if(!M.client || istype(M, /mob/new_player)) - continue //skip monkeys, leavers and new players - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) - M.show_message(message) - - - if (m_type & 1) - for (var/mob/O in get_mobs_in_view(world.view,src)) - O.show_message(message, m_type) - else if (m_type & 2) - for (var/mob/O in (hearers(src.loc, null) | get_mobs_in_view(world.view,src))) - O.show_message(message, m_type) + custom_emote(m_type,message) /mob/living/carbon/human/verb/pose() @@ -577,7 +561,7 @@ set desc = "Sets a description which will be shown when someone examines you." set category = "IC" - pose = sanitize(input(usr, "This is [src]. \He is...", "Pose", null) as text) + pose = sanitize(input(usr, "This is [src]. [get_visible_gender() == MALE ? "He" : get_visible_gender() == FEMALE ? "She" : "They"] [get_visible_gender() == NEUTER ? "are" : "is"]...", "Pose", null) as text) /mob/living/carbon/human/verb/set_flavor() set name = "Set Flavour Text" diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 6bf18971ba..34df63d397 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -38,9 +38,9 @@ param = null if (param) - message = "[src] salutes to [param]." + message = "salutes to [param]." else - message = "[src] salutes." + message = "salutes." m_type = 1 if ("bow") if (!src.buckled) @@ -54,39 +54,39 @@ param = null if (param) - message = "[src] bows to [param]." + message = "bows to [param]." else - message = "[src] bows." + message = "bows." m_type = 1 if ("clap") if (!src.restrained()) - message = "[src] claps." + message = "claps." m_type = 2 if ("flap") if (!src.restrained()) - message = "[src] flaps his wings." + message = "flaps his wings." m_type = 2 if ("aflap") if (!src.restrained()) - message = "[src] flaps his wings ANGRILY!" + message = "flaps his wings ANGRILY!" m_type = 2 if ("twitch") - message = "[src] twitches violently." + message = "twitches violently." m_type = 1 if ("twitch_s") - message = "[src] twitches." + message = "twitches." m_type = 1 if ("nod") - message = "[src] nods." + message = "nods." m_type = 1 if ("deathgasp") - message = "[src] shudders violently for a moment, then becomes motionless, its eyes slowly darkening." + message = "shudders violently for a moment, then becomes motionless, its eyes slowly darkening." m_type = 1 if ("glare") @@ -100,9 +100,9 @@ param = null if (param) - message = "[src] glares at [param]." + message = "glares at [param]." else - message = "[src] glares." + message = "glares." if ("stare") var/M = null @@ -115,9 +115,9 @@ param = null if (param) - message = "[src] stares at [param]." + message = "stares at [param]." else - message = "[src] stares." + message = "stares." if ("look") var/M = null @@ -131,9 +131,9 @@ param = null if (param) - message = "[src] looks at [param]." + message = "looks at [param]." else - message = "[src] looks." + message = "looks." m_type = 1 if("beep") @@ -147,9 +147,9 @@ param = null if (param) - message = "[src] beeps at [param]." + message = "beeps at [param]." else - message = "[src] beeps." + message = "beeps." playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) m_type = 1 @@ -164,9 +164,9 @@ param = null if (param) - message = "[src] pings at [param]." + message = "pings at [param]." else - message = "[src] pings." + message = "pings." playsound(src.loc, 'sound/machines/ping.ogg', 50, 0) m_type = 1 @@ -181,15 +181,15 @@ param = null if (param) - message = "[src] buzzes at [param]." + message = "buzzes at [param]." else - message = "[src] buzzes." + message = "buzzes." playsound(src.loc, 'sound/machines/buzz-sigh.ogg', 50, 0) m_type = 1 if("law") if (istype(module,/obj/item/weapon/robot_module/security)) - message = "[src] shows its legal authorization barcode." + message = "shows its legal authorization barcode." playsound(src.loc, 'sound/voice/biamthelaw.ogg', 50, 0) m_type = 2 @@ -211,10 +211,6 @@ src << "\blue Unusable emote '[act]'. Say *help for a list." if ((message && src.stat == 0)) - if (m_type & 1) - for(var/mob/O in viewers(src, null)) - O.show_message(message, m_type) - else - for(var/mob/O in hearers(src, null)) - O.show_message(message, m_type) + custom_emote(m_type,message) + return \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e9cae30755..a983d649d8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -51,6 +51,37 @@ // blind_message (optional) is what blind people will hear e.g. "You hear something!" /mob/visible_message(var/message, var/self_message, var/blind_message) + + var/list/seeing_obj = list() + + for(var/I in view(world.view, get_turf(usr))) //get_turf is needed to stop weirdness with x-ray. + if(istype(I, /mob/)) + var/mob/M = I + for(var/obj/O in M.contents) + seeing_obj |= O + else if(istype(I, /obj/)) + var/obj/O = I + seeing_obj |= O + + for (var/mob/O in viewers(get_turf(src), null)) + if(O.see_invisible < invisibility) + continue // Cannot view the invisible + var/msg = message + if(O.status_flags & PASSEMOTES) + for(var/obj/item/weapon/holder/H in O.contents) + H.show_message( msg, 1, blind_message, 2) + for(var/mob/living/M in O.contents) + M.show_message( msg, 1, blind_message, 2) + if(self_message && O==src) + msg = self_message + O.show_message( msg, 1, blind_message, 2) + + for(var/obj/O in seeing_obj) + spawn(0) + if(O) //It's possible that it could be deleted in the meantime. + O.show_message( message, 1, blind_message, 2) + + /* for(var/mob/M in viewers(src)) if(M.see_invisible < invisibility) continue // Cannot view the invisible @@ -58,14 +89,40 @@ if(self_message && M==src) msg = self_message M.show_message( msg, 1, blind_message, 2) + */ // Show a message to all mobs in sight of this atom // Use for objects performing visible actions // message is output to anyone who can see, e.g. "The [src] does something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" /atom/proc/visible_message(var/message, var/blind_message) - for(var/mob/M in viewers(src)) - M.show_message( message, 1, blind_message, 2) + + var/list/seeing_obj = list() + + for(var/I in view(world.view, get_turf(src))) //get_turf is needed to stop weirdness with x-ray. + if(istype(I, /mob/)) + var/mob/M = I + for(var/obj/O in M.contents) + seeing_obj |= O + else if(istype(I, /obj/)) + var/obj/O = I + seeing_obj |= O + + for (var/mob/O in viewers(get_turf(src), null)) + if(O.see_invisible < invisibility) + continue // Cannot view the invisible + var/msg = message + if(O.status_flags & PASSEMOTES) + for(var/obj/item/weapon/holder/H in O.contents) + H.show_message( msg, 1, blind_message, 2) + for(var/mob/living/M in O.contents) + M.show_message( msg, 1, blind_message, 2) + O.show_message( msg, 1, blind_message, 2) + + for(var/obj/O in seeing_obj) + spawn(0) + if(O) //It's possible that it could be deleted in the meantime. + O.show_message( message, 1, blind_message, 2) // Returns an amount of power drawn from the object (-1 if it's not viable). // If drain_check is set it will not actually drain power, just return a value. From f66cf9af054ad7fd4813e7e0a795990b75652ace Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Sun, 17 May 2015 16:54:18 +1000 Subject: [PATCH 2/7] get_mobs_in_view() renamed to get_mobs_or_objects_in_view(). Returns mobs or objects depending on specifications Transmission of emotes, visible_message() and say() refactored. All three use get_mobs_or_objects_in_view() to find objects and mobs in containers Storage objects and closets no longer transfer hear_talk(), see_emote() or show_message() to contents, as this is already covered by the above changes --- code/__HELPERS/game.dm | 64 +++++----- code/game/atoms.dm | 41 +++++++ code/game/mecha/mecha.dm | 12 -- .../game/objects/items/devices/radio/radio.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 18 --- code/game/objects/objs.dm | 2 +- .../structures/crates_lockers/closets.dm | 18 --- code/game/verbs/ooc.dm | 2 +- code/modules/clothing/suits/storage.dm | 12 -- .../clothing/under/accessories/storage.dm | 12 -- code/modules/mob/emote.dm | 71 ++++------- code/modules/mob/living/say.dm | 8 +- code/modules/mob/mob.dm | 116 +++++------------- 13 files changed, 128 insertions(+), 250 deletions(-) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 60e46d4ca6..9aa16f91b5 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -156,37 +156,35 @@ // It will keep doing this until it checks every content possible. This will fix any problems with mobs, that are inside objects, // being unable to hear people due to being in a box within a bag. -/proc/recursive_mob_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_radio = 1) +/proc/recursive_content_check(var/atom/O, var/list/L = list(), var/recursion_limit = 3, var/client_check = 1, var/sight_check = 1, var/include_mobs = 1, var/include_objects = 1) - //debug_mob += O.contents.len if(!recursion_limit) return L - for(var/atom/A in O.contents) - if(ismob(A)) - var/mob/M = A - if(client_check && !M.client) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio) - continue - if(sight_check && !isInSight(A, O)) - continue - L |= M - //world.log << "[recursion_limit] = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])" + for(var/I in O.contents) - else if(include_radio && istype(A, /obj/item/device/radio)) - if(sight_check && !isInSight(A, O)) - continue - L |= A + if(ismob(I)) + if(!sight_check || isInSight(I, O)) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + if(include_mobs) + if(client_check) + var/mob/M = I + if(M.client) + L |= M + else + L |= I + + else if(istype(I,/obj/)) + if(!sight_check || isInSight(I, O)) + L |= recursive_content_check(I, L, recursion_limit - 1, client_check, sight_check, include_mobs, include_objects) + if(include_objects) + L |= I - if(isobj(A) || ismob(A)) - L |= recursive_mob_check(A, L, recursion_limit - 1, client_check, sight_check, include_radio) return L -// The old system would loop through lists for a total of 5000 per function call, in an empty server. -// This new system will loop at around 1000 in an empty server. +// Returns a list of mobs and/or objects in range of R from source. Used in radio and say code. -/proc/get_mobs_in_view(var/R, var/atom/source) - // Returns a list of mobs in range of R from source. Used in radio and say code. +/proc/get_mobs_or_objects_in_view(var/R, var/atom/source, var/include_mobs = 1, var/include_objects = 1) var/turf/T = get_turf(source) var/list/hear = list() @@ -196,17 +194,17 @@ var/list/range = hear(R, T) - for(var/atom/A in range) - if(ismob(A)) - var/mob/M = A - if(M.client) - hear += M - //world.log << "Start = [M] - [get_turf(M)] - ([M.x], [M.y], [M.z])" - else if(istype(A, /obj/item/device/radio)) - hear += A - - if(isobj(A) || ismob(A)) - hear |= recursive_mob_check(A, hear, 3, 1, 0, 1) + for(var/I in range) + if(ismob(I)) + hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects) + if(include_mobs) + var/mob/M = I + if(M.client) + hear += M + else if(istype(I,/obj/)) + hear |= recursive_content_check(I, hear, 3, 1, 0, include_mobs, include_objects) + if(include_objects) + hear += I return hear diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 742c6389a9..c789958dc9 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -459,3 +459,44 @@ its easier to just keep the beam vertical. return 1 else return 0 + +// Show a message to all mobs and objects in sight of this atom +// Use for objects performing visible actions +// message is output to anyone who can see, e.g. "The [src] does something!" +// blind_message (optional) is what blind people will hear e.g. "You hear something!" +/atom/proc/visible_message(var/message, var/blind_message) + + var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null) + + for(var/I in see) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 1, blind_message, 2) + else if(ismob(I)) + var/mob/M = I + if(M.see_invisible >= invisibility) // Cannot view the invisible + M.show_message( message, 1, blind_message, 2) + +// Show a message to all mobs and objects in earshot of this atom +// Use for objects performing audible actions +// message is the message output to anyone who can hear. +// deaf_message (optional) is what deaf people will see. +// hearing_distance (optional) is the range, how many tiles away the message can be heard. +/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance) + + var/range = world.view + if(hearing_distance) + range = hearing_distance + var/list/hear = get_mobs_or_objects_in_view(range,src) + + for(var/I in hear) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 2, deaf_message, 1) + else if(ismob(I)) + var/mob/M = I + M.show_message( message, 2, deaf_message, 1) \ No newline at end of file diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 0f8d666de9..ed315cf747 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -252,18 +252,6 @@ radio.talk_into(M, text) return -/obj/mecha/see_emote(mob/living/M, text) - if(occupant && occupant.client) - var/rendered = "[text]" - occupant.show_message(rendered, 2) - ..() - -/obj/mecha/show_message(msg, type, alt, alt_type) - if(occupant && occupant.client) - var/rendered = "[msg]" - occupant.show_message(rendered, type) - ..() - //////////////////////////// ///// Action processing //// //////////////////////////// diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 0e5116f5d8..c131c846a7 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -456,7 +456,7 @@ var/range = receive_range(freq, level) if(range > -1) - return get_mobs_in_view(canhear_range, src) + return get_mobs_or_objects_in_view(canhear_range, src) /obj/item/device/radio/examine(mob/user) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index ee2138d0a2..2306c33057 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -444,24 +444,6 @@ src.quick_empty() return 1 -/obj/item/weapon/storage/hear_talk(mob/M as mob, text, verb, datum/language/speaking) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.hear_talk(M, text, verb, speaking) - -/obj/item/weapon/storage/see_emote(mob/M as mob, text, var/emote_type) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.see_emote(M, text, emote_type) - -/obj/item/weapon/storage/show_message(msg, type, alt, alt_type) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.show_message(msg, type, alt, alt_type) - //Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area). //Returns -1 if the atom was not found on container. /atom/proc/storage_depth(atom/container) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 960eab6712..09304d1ea2 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -142,5 +142,5 @@ /obj/proc/see_emote(mob/M as mob, text, var/emote_type) return -/obj/proc/show_message(msg, type, alt, alt_type) +/obj/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) return \ No newline at end of file diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index e941495747..41cd5308f6 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -296,24 +296,6 @@ else icon_state = icon_opened -/obj/structure/closet/hear_talk(mob/M as mob, text, verb, datum/language/speaking) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.hear_talk(M, text, verb, speaking) - -/obj/structure/closet/see_emote(mob/M as mob, text, var/emote_type) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.see_emote(M, text, emote_type) - -/obj/structure/closet/show_message(msg, type, alt, alt_type) - for (var/atom/A in src) - if(istype(A,/obj/)) - var/obj/O = A - O.show_message(msg, type, alt, alt_type) - /obj/structure/closet/attack_generic(var/mob/user, var/damage, var/attack_message = "destroys", var/wallbreaker) if(!damage || !wallbreaker) return diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index 82fef02e97..e35e4a6eb2 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -105,7 +105,7 @@ log_ooc("(LOCAL) [mob.name]/[key] : [msg]") var/mob/source = src.mob - var/list/heard = get_mobs_in_view(7, source) + var/list/heard = get_mobs_or_objects_in_view(7, source, 1, 0) var/display_name = source.key if(holder && holder.fakekey) diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 8348e76ec9..f82eebc1cf 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -29,18 +29,6 @@ pockets.emp_act(severity) ..() -/obj/item/clothing/suit/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking) - pockets.hear_talk(M, msg, verb, speaking) - ..() - -/obj/item/clothing/suit/storage/see_emote(mob/M as mob, text, var/emote_type) - pockets.see_emote(M, text, emote_type) - ..() - -/obj/item/clothing/suit/storage/show_message(msg, type, alt, alt_type) - pockets.show_message(msg, type, alt, alt_type) - ..() - //Jackets with buttons, used for labcoats, IA jackets, First Responder jackets, and brown jackets. /obj/item/clothing/suit/storage/toggle var/icon_open diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 4b9f4410b1..82fb37de36 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -34,18 +34,6 @@ hold.emp_act(severity) ..() -/obj/item/clothing/accessory/storage/hear_talk(mob/M, var/msg, verb, datum/language/speaking) - hold.hear_talk(M, msg, verb, speaking) - ..() - -/obj/item/clothing/accessory/storage/see_emote(mob/M as mob, text, var/emote_type) - hold.see_emote(M, text, emote_type) - ..() - -/obj/item/clothing/accessory/storage/show_message(msg, type, alt, alt_type) - hold.show_message(msg, type, alt, alt_type) - ..() - /obj/item/clothing/accessory/storage/attack_self(mob/user as mob) user << "You empty [src]." var/turf/T = get_turf(src) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 5645773ea0..54f31d5b5b 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -24,8 +24,6 @@ if (message) log_emote("[name]/[key] : [message]") - var/list/seeing_obj = list() //For objs that need to see emotes. You can use see_emote(), which is based off of hear_talk() - //Hearing gasp and such every five seconds is not good emotes were not global for a reason. // Maybe some people are okay with that. @@ -37,58 +35,31 @@ if(findtext(message," snores.")) //Because we have so many sleeping people. break if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) - M.show_message(message) + M.show_message(message, m_type) - for(var/I in view(world.view, get_turf(usr))) //get_turf is needed to stop weirdness with x-ray. - if(istype(I, /mob/)) - var/mob/M = I - for(var/obj/O in M.contents) - seeing_obj |= O - else if(istype(I, /obj/)) - var/obj/O = I - seeing_obj |= O - - // Type 1 (Visual) emotes are sent to anyone in view of the item if (m_type & 1) - //for (var/mob/O in viewers(src, null)) - for (var/mob/O in viewers(get_turf(src), null)) //This may break people with x-ray being able to see emotes across walls, - //but this saves many headaches down the road, involving mechs and pAIs. - //x-ray is so rare these days anyways. + var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null) + for(var/I in see) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.see_emote(src, message, 1) + else if(ismob(I)) + var/mob/M = I + M.show_message(message, 1) - if(O.status_flags & PASSEMOTES) - - for(var/obj/item/weapon/holder/H in O.contents) - H.show_message(message, m_type) - - for(var/mob/living/M in O.contents) - M.show_message(message, m_type) - - O.show_message(message, m_type) - - for(var/obj/O in seeing_obj) - spawn(0) - if(O) //It's possible that it could be deleted in the meantime. - O.see_emote(src, message, 1) - - // Type 2 (Audible) emotes are sent to anyone in hear range - // of the *LOCATION* -- this is important for AIs/pAIs to be heard else if (m_type & 2) - for (var/mob/O in hearers(get_turf(src), null)) - - if(O.status_flags & PASSEMOTES) - - for(var/obj/item/weapon/holder/H in O.contents) - H.show_message(message, m_type) - - for(var/mob/living/M in O.contents) - M.show_message(message, m_type) - - O.show_message(message, m_type) - - for(var/obj/O in seeing_obj) - spawn(0) - if(O) //It's possible that it could be deleted in the meantime. - O.see_emote(src, message, 2) + var/list/hear = get_mobs_or_objects_in_view(world.view,src) + for(var/I in hear) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.see_emote(src, message, 2) + else if(ismob(I)) + var/mob/M = I + M.show_message(message, 2) /mob/proc/emote_dead(var/message) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 8919ab0952..a126bccc87 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -238,17 +238,15 @@ proc/get_radio_key_from_channel(var/channel) italics = 1 sound_vol *= 0.5 //muffle the sound a bit, so it's like we're actually talking through contact - var/list/hear = hear(message_range, T) + var/list/hear = get_mobs_or_objects_in_view(message_range,src) var/list/hearturfs = list() for(var/I in hear) - if(istype(I, /mob/)) + if(ismob(I)) var/mob/M = I listening += M hearturfs += M.locs[1] - for(var/obj/O in M.contents) - listening_obj |= O - else if(istype(I, /obj/)) + else if(isobj(I)) var/obj/O = I hearturfs += O.locs[1] listening_obj |= O diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a983d649d8..762c318fa4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -44,7 +44,7 @@ src << msg return -// Show a message to all mobs in sight of this one +// Show a message to all mobs and objects in sight of this one // This would be for visible actions by the src mob // message is the message output to anyone who can see e.g. "[src] does something!" // self_message (optional) is what the src mob sees e.g. "You do something!" @@ -52,77 +52,21 @@ /mob/visible_message(var/message, var/self_message, var/blind_message) - var/list/seeing_obj = list() + var/list/see = get_mobs_or_objects_in_view(world.view,src) | viewers(get_turf(src), null) - for(var/I in view(world.view, get_turf(usr))) //get_turf is needed to stop weirdness with x-ray. - if(istype(I, /mob/)) + for(var/I in see) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 1, blind_message, 2) + else if(ismob(I)) var/mob/M = I - for(var/obj/O in M.contents) - seeing_obj |= O - else if(istype(I, /obj/)) - var/obj/O = I - seeing_obj |= O - - for (var/mob/O in viewers(get_turf(src), null)) - if(O.see_invisible < invisibility) - continue // Cannot view the invisible - var/msg = message - if(O.status_flags & PASSEMOTES) - for(var/obj/item/weapon/holder/H in O.contents) - H.show_message( msg, 1, blind_message, 2) - for(var/mob/living/M in O.contents) + if(M.see_invisible >= invisibility) // Cannot view the invisible + var/msg = message + if(self_message && M==src) + msg = self_message M.show_message( msg, 1, blind_message, 2) - if(self_message && O==src) - msg = self_message - O.show_message( msg, 1, blind_message, 2) - - for(var/obj/O in seeing_obj) - spawn(0) - if(O) //It's possible that it could be deleted in the meantime. - O.show_message( message, 1, blind_message, 2) - - /* - for(var/mob/M in viewers(src)) - if(M.see_invisible < invisibility) - continue // Cannot view the invisible - var/msg = message - if(self_message && M==src) - msg = self_message - M.show_message( msg, 1, blind_message, 2) - */ - -// Show a message to all mobs in sight of this atom -// Use for objects performing visible actions -// message is output to anyone who can see, e.g. "The [src] does something!" -// blind_message (optional) is what blind people will hear e.g. "You hear something!" -/atom/proc/visible_message(var/message, var/blind_message) - - var/list/seeing_obj = list() - - for(var/I in view(world.view, get_turf(src))) //get_turf is needed to stop weirdness with x-ray. - if(istype(I, /mob/)) - var/mob/M = I - for(var/obj/O in M.contents) - seeing_obj |= O - else if(istype(I, /obj/)) - var/obj/O = I - seeing_obj |= O - - for (var/mob/O in viewers(get_turf(src), null)) - if(O.see_invisible < invisibility) - continue // Cannot view the invisible - var/msg = message - if(O.status_flags & PASSEMOTES) - for(var/obj/item/weapon/holder/H in O.contents) - H.show_message( msg, 1, blind_message, 2) - for(var/mob/living/M in O.contents) - M.show_message( msg, 1, blind_message, 2) - O.show_message( msg, 1, blind_message, 2) - - for(var/obj/O in seeing_obj) - spawn(0) - if(O) //It's possible that it could be deleted in the meantime. - O.show_message( message, 1, blind_message, 2) // Returns an amount of power drawn from the object (-1 if it's not viable). // If drain_check is set it will not actually drain power, just return a value. @@ -131,33 +75,31 @@ /atom/proc/drain_power(var/drain_check,var/surge, var/amount = 0) return -1 -// Show a message to all mobs in earshot of this one +// Show a message to all mobs and objects in earshot of this one // This would be for audible actions by the src mob // message is the message output to anyone who can hear. // self_message (optional) is what the src mob hears. // deaf_message (optional) is what deaf people will see. // hearing_distance (optional) is the range, how many tiles away the message can be heard. /mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message) - var/range = 7 - if(hearing_distance) - range = hearing_distance - var/msg = message - for(var/mob/M in get_mobs_in_view(range, src)) - if(self_message && M==src) - msg = self_message - M.show_message( msg, 2, deaf_message, 1) -// Show a message to all mobs in earshot of this atom -// Use for objects performing audible actions -// message is the message output to anyone who can hear. -// deaf_message (optional) is what deaf people will see. -// hearing_distance (optional) is the range, how many tiles away the message can be heard. -/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance) - var/range = 7 + var/range = world.view if(hearing_distance) range = hearing_distance - for(var/mob/M in get_mobs_in_view(range, src)) - M.show_message( message, 2, deaf_message, 1) + var/list/hear = get_mobs_or_objects_in_view(range,src) + + for(var/I in hear) + if(isobj(I)) + spawn(0) + if(I) //It's possible that it could be deleted in the meantime. + var/obj/O = I + O.show_message( message, 2, deaf_message, 1) + else if(ismob(I)) + var/mob/M = I + var/msg = message + if(self_message && M==src) + msg = self_message + M.show_message( msg, 2, deaf_message, 1) /mob/proc/findname(msg) From 53eec427dca81fb2571de4a61400a98a86524418 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Sun, 17 May 2015 17:15:27 +1000 Subject: [PATCH 3/7] Typo fix. Obsolete viisible_message() hack removed from mob holders --- code/modules/mob/holder.dm | 4 ---- code/modules/mob/mob.dm | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index 61e5b3c637..14257b12ef 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -32,10 +32,6 @@ for(var/mob/M in src.contents) M.attackby(W,user) -/obj/item/weapon/holder/show_message(msg, type, alt, alt_type) - for(var/mob/living/M in contents) - M.show_message(msg,type) - //Mob procs and vars for scooping up /mob/living/var/holder_type diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index a5255200ab..5b46d48f42 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -65,7 +65,7 @@ if(self_message && M==src) M.show_message( self_message, 1, blind_message, 2) if(M.see_invisible >= invisibility) // Cannot view the invisible - M.show_message( messge, 1, blind_message, 2) + M.show_message( message, 1, blind_message, 2) // Returns an amount of power drawn from the object (-1 if it's not viable). // If drain_check is set it will not actually drain power, just return a value. From 7f3478ab3e26c151a4a2c8c23ec13e837a5e05a4 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Sun, 17 May 2015 19:34:08 +1000 Subject: [PATCH 4/7] Changelog update --- html/changelogs/RavingManiac-PR-9293.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/RavingManiac-PR-9293.yml diff --git a/html/changelogs/RavingManiac-PR-9293.yml b/html/changelogs/RavingManiac-PR-9293.yml new file mode 100644 index 0000000000..b15c27482b --- /dev/null +++ b/html/changelogs/RavingManiac-PR-9293.yml @@ -0,0 +1,7 @@ +author: RavingManiac + +delete-after: True + +changes: + - rscadd: "Tape recorders now record hearable emotes and action messages (e.g. gunshots)." + - bugfix: "You can how see actions from inside mechs and closets." \ No newline at end of file From 783baf35e067c9e9ba3663c0bdf9739037666fa0 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Mon, 18 May 2015 10:27:56 +1000 Subject: [PATCH 5/7] Reverts .int --- baystation12.int | 5 ----- 1 file changed, 5 deletions(-) diff --git a/baystation12.int b/baystation12.int index 1c5f8724da..b82874fded 100644 --- a/baystation12.int +++ b/baystation12.int @@ -1,11 +1,6 @@ // BEGIN_INTERNALS /* MAP_ICON_TYPE: 0 -WINDOW: code\modules\mob\emote.dm;code\modules\mob\mob.dm;code\modules\mob\living\say.dm;code\game\atoms.dm;code\game\objects\objs.dm;code\game\objects\items\devices\taperecorder.dm;code\modules\clothing\suits\storage.dm;code\modules\clothing\under\accessories\storage.dm;code\game\objects\items\weapons\storage\storage.dm;code\game\objects\structures\crates_lockers\closets.dm;code\game\mecha\mecha.dm;code\__HELPERS\game.dm;code\game\verbs\ooc.dm;code\game\objects\items\devices\radio\radio.dm -LAST_COMPILE_VERSION: 506.1249 -DIR: code code\__HELPERS code\game code\game\machinery code\game\mecha code\game\objects code\game\objects\items code\game\objects\items\devices code\game\objects\items\devices\radio code\game\objects\items\weapons code\game\objects\items\weapons\storage code\game\objects\structures code\game\objects\structures\crates_lockers code\game\verbs code\modules code\modules\clothing code\modules\clothing\suits code\modules\clothing\under code\modules\clothing\under\accessories code\modules\mob code\modules\mob\living -FILE: code\__HELPERS\game.dm -LAST_COMPILE_TIME: 1431844804 AUTO_FILE_DIR: OFF */ // END_INTERNALS From 839d3b0588d6f301c8df535753152dd6f39b2605 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Fri, 22 May 2015 00:02:36 +1000 Subject: [PATCH 6/7] Ability to head blind_message when invisible people do things readded Tape recorder playback uses audible_message instead of visible_message --- code/game/atoms.dm | 2 ++ .../game/objects/items/devices/taperecorder.dm | 18 +++++++++--------- code/modules/mob/mob.dm | 2 ++ 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c789958dc9..80be5cf716 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -478,6 +478,8 @@ its easier to just keep the beam vertical. var/mob/M = I if(M.see_invisible >= invisibility) // Cannot view the invisible M.show_message( message, 1, blind_message, 2) + else if (blind_message) + M.show_message(blind_message, 2) // Show a message to all mobs and objects in earshot of this atom // Use for objects performing audible actions diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index d6fda94bcd..d79971bf8c 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -116,7 +116,7 @@ else if(playing == 1) playing = 0 var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: Playback stopped.") + T.audible_message("Tape Recorder: Playback stopped.") icon_state = "taperecorderidle" return @@ -168,37 +168,37 @@ var/playedmessage = storedinfo[i] if (findtextEx(playedmessage,"*",1,2)) //remove marker for action sounds playedmessage = copytext(playedmessage,2) - T.visible_message("Tape Recorder: [playedmessage]") + T.audible_message("Tape Recorder: [playedmessage]") if(storedinfo.len < i+1) playsleepseconds = 1 sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: End of recording.") + T.audible_message("Tape Recorder: End of recording.") else playsleepseconds = timestamp[i+1] - timestamp[i] if(playsleepseconds > 14) sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") + T.audible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence") playsleepseconds = 1 i++ icon_state = "taperecorderidle" playing = 0 if(emagged == 1.0) var/turf/T = get_turf(src) - T.visible_message("Tape Recorder: This tape recorder will self-destruct in... Five.") + T.audible_message("Tape Recorder: This tape recorder will self-destruct in... Five.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Four.") + T.audible_message("Tape Recorder: Four.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Three.") + T.audible_message("Tape Recorder: Three.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: Two.") + T.audible_message("Tape Recorder: Two.") sleep(10) T = get_turf(src) - T.visible_message("Tape Recorder: One.") + T.audible_message("Tape Recorder: One.") sleep(10) explode() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 5b46d48f42..a2fb40d6f5 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -66,6 +66,8 @@ M.show_message( self_message, 1, blind_message, 2) if(M.see_invisible >= invisibility) // Cannot view the invisible M.show_message( message, 1, blind_message, 2) + else if (blind_message) + M.show_message(blind_message, 2) // Returns an amount of power drawn from the object (-1 if it's not viable). // If drain_check is set it will not actually drain power, just return a value. From ec347bf76eb8f0f13f5584083bec095d386cf004 Mon Sep 17 00:00:00 2001 From: RavingManiac Date: Fri, 22 May 2015 00:06:13 +1000 Subject: [PATCH 7/7] Stupid typo --- html/changelogs/RavingManiac-PR-9293.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/html/changelogs/RavingManiac-PR-9293.yml b/html/changelogs/RavingManiac-PR-9293.yml index b15c27482b..13128e2644 100644 --- a/html/changelogs/RavingManiac-PR-9293.yml +++ b/html/changelogs/RavingManiac-PR-9293.yml @@ -4,4 +4,4 @@ delete-after: True changes: - rscadd: "Tape recorders now record hearable emotes and action messages (e.g. gunshots)." - - bugfix: "You can how see actions from inside mechs and closets." \ No newline at end of file + - bugfix: "You can now see actions from inside mechs and closets." \ No newline at end of file