From e225fbc850f22e638ed59f8698acfd11276d87c0 Mon Sep 17 00:00:00 2001 From: phil235 Date: Mon, 4 Jan 2016 22:49:27 +0100 Subject: [PATCH] - Refactor the visible_message() proc to be much faster. - Replacing some "for(var/mob/o in viewers()) show_message()" by "visible_message()". - Replacing some "show_message()" by " << "..." " instead. - Fixes being able to see the results of the health and slime analyzers while blind. - --- code/game/objects/items/candle.dm | 3 +- code/game/objects/items/devices/PDA/PDA.dm | 6 +- .../game/objects/items/devices/radio/radio.dm | 6 +- code/game/objects/items/devices/scanners.dm | 81 +++++----- .../objects/items/weapons/storage/secure.dm | 8 +- .../objects/items/weapons/teleportation.dm | 5 +- code/modules/admin/verbs/debug.dm | 2 +- code/modules/assembly/health.dm | 2 +- .../food&drinks/drinks/drinks/bottle.dm | 3 +- code/modules/games/cards.dm | 6 +- .../carbon/alien/humanoid/alien_powers.dm | 5 +- .../mob/living/silicon/pai/software.dm | 3 +- code/modules/mob/mob.dm | 138 +++++++++--------- .../chemistry/recipes/slime_extracts.dm | 34 ++--- 14 files changed, 144 insertions(+), 158 deletions(-) diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 1171c646104..0d26ff0d940 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -59,8 +59,7 @@ if(!src.lit) src.lit = 1 //src.damtype = "fire" - for(var/mob/O in viewers(usr, null)) - O.show_message(flavor_text, 1) + usr.visible_message(flavor_text) SetLuminosity(CANDLE_LUMINOSITY) if(!infinite) SSobj.processing |= src diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index e49f4b19ace..c30b883c460 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -778,7 +778,7 @@ var/global/list/obj/item/device/pda/PDAs = list() /obj/item/device/pda/proc/show_to_ghosts(mob/living/user, datum/data_pda_msg/msg,multiple = 0) for(var/mob/M in player_list) if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA)) - M.show_message("(F) [msg.sender] PDA Message --> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]") + M << "(F) [msg.sender] PDA Message --> [multiple ? "Everyone" : msg.recipient]: [msg.message][msg.get_photo_ref()]" /obj/item/device/pda/proc/can_send(obj/item/device/pda/P) if(!P || qdeleted(P) || P.toff) @@ -944,9 +944,9 @@ var/global/list/obj/item/device/pda/PDAs = list() switch(scanmode) if(1) - user.visible_message(text("[] has analyzed []'s vitals!", user, C)) + C.visible_message("[user] has analyzed [C]'s vitals!") healthscan(user, C, 1) - src.add_fingerprint(user) + add_fingerprint(user) if(2) // Unused diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 954302bf055..639e59c9008 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -543,10 +543,10 @@ return b_stat = !( b_stat ) if(!istype(src, /obj/item/device/radio/beacon)) - if (b_stat) - user.show_message("The radio can now be attached and modified!") + if(b_stat) + user << "The radio can now be attached and modified!" else - user.show_message("The radio can no longer be modified or attached!") + user << "The radio can no longer be modified or attached!" updateDialog() //Foreach goto(83) add_fingerprint(user) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 32fdb40f65b..38404d1658e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -114,7 +114,8 @@ MASS SPECTROMETER // Used by the PDA medical scanner too /proc/healthscan(mob/living/user, mob/living/M, mode = 1) - + if(user.stat || user.eye_blind) + return //Damage specifics var/oxy_loss = M.getOxyLoss() var/tox_loss = M.getToxLoss() @@ -199,8 +200,8 @@ MASS SPECTROMETER if(CI.status == ORGAN_ROBOTIC) implant_detect += "[H.name] is modified with a [CI.name].
" if(implant_detect) - user.show_message("Detected cybernetic modifications:") - user.show_message("[implant_detect]") + user << "Detected cybernetic modifications:" + user << "[implant_detect]" /proc/chemscan(mob/living/user, mob/living/M) if(ishuman(M)) @@ -250,11 +251,13 @@ MASS SPECTROMETER /obj/item/device/analyzer/attack_self(mob/user) - if (user.stat) + add_fingerprint(user) + + if (user.stat || user.eye_blind) return var/turf/location = user.loc - if (!( istype(location, /turf) )) + if(!istype(location)) return var/datum/gas_mixture/environment = location.return_air() @@ -262,11 +265,11 @@ MASS SPECTROMETER var/pressure = environment.return_pressure() var/total_moles = environment.total_moles() - user.show_message("Results:", 1) + user << "Results:" if(abs(pressure - ONE_ATMOSPHERE) < 10) - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + user << "Pressure: [round(pressure,0.1)] kPa" else - user.show_message("Pressure: [round(pressure,0.1)] kPa", 1) + user << "Pressure: [round(pressure,0.1)] kPa" if(total_moles) var/o2_concentration = environment.oxygen/total_moles var/n2_concentration = environment.nitrogen/total_moles @@ -275,30 +278,28 @@ MASS SPECTROMETER var/unknown_concentration = 1-(o2_concentration+n2_concentration+co2_concentration+plasma_concentration) if(abs(n2_concentration - N2STANDARD) < 20) - user.show_message("Nitrogen: [round(n2_concentration*100)] %", 1) + user << "Nitrogen: [round(n2_concentration*100)] %" else - user.show_message("Nitrogen: [round(n2_concentration*100)] %", 1) + user << "Nitrogen: [round(n2_concentration*100)] %" if(abs(o2_concentration - O2STANDARD) < 2) - user.show_message("Oxygen: [round(o2_concentration*100)] %", 1) + user << "Oxygen: [round(o2_concentration*100)] %" else - user.show_message("Oxygen: [round(o2_concentration*100)] %", 1) + user << "Oxygen: [round(o2_concentration*100)] %" if(co2_concentration > 0.01) - user.show_message("CO2: [round(co2_concentration*100)] %", 1) + user << "CO2: [round(co2_concentration*100)] %" else - user.show_message("CO2: [round(co2_concentration*100)] %", 1) + user << "CO2: [round(co2_concentration*100)] %" if(plasma_concentration > 0.01) - user.show_message("Plasma: [round(plasma_concentration*100)] %", 1) + user << "Plasma: [round(plasma_concentration*100)] %" if(unknown_concentration > 0.01) - user.show_message("Unknown: [round(unknown_concentration*100)] %", 1) + user << "Unknown: [round(unknown_concentration*100)] %" - user.show_message("Temperature: [round(environment.temperature-T0C)] °C", 1) + user << "Temperature: [round(environment.temperature-T0C)] °C" - src.add_fingerprint(user) - return /obj/item/device/mass_spectrometer desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample." @@ -327,7 +328,7 @@ MASS SPECTROMETER icon_state = initial(icon_state) /obj/item/device/mass_spectrometer/attack_self(mob/user) - if (user.stat) + if (user.stat || user.eye_blind) return if (crit_fail) user << "This device has critically failed and is no longer functional!" @@ -340,7 +341,7 @@ MASS SPECTROMETER for(var/datum/reagent/R in reagents.reagent_list) if(R.id != "blood") reagents.clear_reagents() - user.show_message("The sample was contaminated! Please insert another sample.", 1) + user << "The sample was contaminated! Please insert another sample." return else blood_traces = params2list(R.data["trace_chem"]) @@ -367,7 +368,7 @@ MASS SPECTROMETER dat += "" user << dat reagents.clear_reagents() - return + /obj/item/device/mass_spectrometer/adv name = "advanced mass-spectrometer" @@ -389,32 +390,34 @@ MASS SPECTROMETER materials = list(MAT_METAL=30, MAT_GLASS=20) /obj/item/device/slime_scanner/attack(mob/living/M, mob/living/user) + if(user.stat || user.eye_blind) + return if (!isslime(M)) - user.show_message("This device can only scan slimes!", 1) + user << "This device can only scan slimes!" return var/mob/living/simple_animal/slime/T = M - user.show_message("Slime scan results:", 1) - user.show_message(text("[T.colour] [] slime", T.is_adult ? "adult" : "baby"), 1) - user.show_message(text("Nutrition: [T.nutrition]/[]", T.get_max_nutrition()), 1) + user << "Slime scan results:" + user << "[T.colour] [T.is_adult ? "adult" : "baby"] slime" + user << "Nutrition: [T.nutrition]/[T.get_max_nutrition()]" if (T.nutrition < T.get_starve_nutrition()) - user.show_message("Warning: slime is starving!", 1) + user << "Warning: slime is starving!" else if (T.nutrition < T.get_hunger_nutrition()) - user.show_message("Warning: slime is hungry", 1) - user.show_message("Electric change strength: [T.powerlevel]", 1) - user.show_message("Health: [T.health]", 1) + user << "Warning: slime is hungry" + user << "Electric change strength: [T.powerlevel]" + user << "Health: [T.health]" if (T.slime_mutation[4] == T.colour) - user.show_message("This slime does not evolve any further.", 1) + user << "This slime does not evolve any further." else if (T.slime_mutation[3] == T.slime_mutation[4]) if (T.slime_mutation[2] == T.slime_mutation[1]) - user.show_message("Possible mutation: [T.slime_mutation[3]]", 1) - user.show_message("Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting", 1) + user << "Possible mutation: [T.slime_mutation[3]]" + user << "Genetic destability: [T.mutation_chance/2] % chance of mutation on splitting" else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)", 1) - user.show_message("Genetic destability: [T.mutation_chance] % chance of mutation on splitting", 1) + user << "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)" + user << "Genetic destability: [T.mutation_chance] % chance of mutation on splitting" else - user.show_message("Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]", 1) - user.show_message("Genetic destability: [T.mutation_chance] % chance of mutation on splitting", 1) + user << "Possible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]" + user << "Genetic destability: [T.mutation_chance] % chance of mutation on splitting" if (T.cores > 1) - user.show_message("Anomalious slime core amount detected", 1) - user.show_message("Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]", 1) + user << "Anomalious slime core amount detected" + user << "Growth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index a91ba35482c..a80a611d619 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -36,21 +36,21 @@ if (istype(W, /obj/item/weapon/screwdriver)) if (do_after(user, 20/W.toolspeed, target = src)) src.open =! src.open - user.show_message(text("You [] the service panel.", (src.open ? "open" : "close"))) + user.show_message("You [open ? "open" : "close"] the service panel.", 1) return if ((istype(W, /obj/item/device/multitool)) && (src.open == 1)&& (!src.l_hacking)) - user.show_message(text("Now attempting to reset internal memory, please hold."), 1) + user.show_message("Now attempting to reset internal memory, please hold.", 1) src.l_hacking = 1 if (do_after(usr, 100/W.toolspeed, target = src)) if (prob(40)) src.l_setshort = 1 src.l_set = 0 - user.show_message(text("Internal memory reset. Please give it a few seconds to reinitialize."), 1) + user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1) sleep(80) src.l_setshort = 0 src.l_hacking = 0 else - user.show_message(text("Unable to reset internal memory."), 1) + user.show_message("Unable to reset internal memory.", 1) src.l_hacking = 0 else src.l_hacking = 0 return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 029c0fd0238..2406d7b9d7b 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -156,7 +156,7 @@ Frequency: if(turfs.len) L["None (Dangerous)"] = pick(turfs) var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") in L - if ((user.get_active_hand() != src || user.stat || user.restrained())) + if (user.get_active_hand() != src || user.incapacitated()) return if(active_portals >= 3) user.show_message("\The [src] is recharging!") @@ -166,7 +166,6 @@ Frequency: var/obj/effect/portal/P = new /obj/effect/portal(get_turf(src), T, src) try_move_adjacent(P) active_portals++ - src.add_fingerprint(user) - return + add_fingerprint(user) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 855b63efa69..de914537a72 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -201,7 +201,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that t+= "Plasma : [env.toxins]\n" t+= "CO2: [env.carbon_dioxide]\n" - usr.show_message(t, 1) + usr << t feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in mob_list) diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index febe545a30e..34c82ac8c6b 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -74,7 +74,7 @@ if(!secured) user.show_message("The [name] is unsecured!") return 0 - var/dat = text("Health Sensor [scanning?"On":"Off"]") + var/dat = "Health Sensor [scanning?"On":"Off"]" if(scanning && health_scan) dat += "
Health: [health_scan]" user << browse(dat, "window=hscan") diff --git a/code/modules/food&drinks/drinks/drinks/bottle.dm b/code/modules/food&drinks/drinks/drinks/bottle.dm index 9b9bccc986e..c41e3682c35 100644 --- a/code/modules/food&drinks/drinks/drinks/bottle.dm +++ b/code/modules/food&drinks/drinks/drinks/bottle.dm @@ -125,8 +125,7 @@ /obj/item/weapon/reagent_containers/food/drinks/bottle/proc/SplashReagents(var/mob/M) if(src.reagents.total_volume) - for(var/mob/O in viewers(M, null)) - O.show_message(text("The contents of \the [src] splashes all over [M]!"), 1) + M.visible_message("The contents of \the [src] splashes all over [M]!") reagents.reaction(M, TOUCH) reagents.clear_reagents() return diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 0efe72640e1..baec9c92ea7 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -87,7 +87,7 @@ else return ..() /obj/item/weapon/deck/proc/dealTo(mob/living/target, mob/living/source) - if (!src.cards.len) + if (!cards.len) source.show_message("There are no cards in the deck.") return @@ -185,10 +185,10 @@ . = ..() if((!concealed || src.loc == usr) && cards.len) - usr.show_message("It contains: ") + usr.show_message("It contains: ", 1) for (var/datum/playingcard/card in cards) - usr.show_message("The [card.name].") + usr.show_message("The [card.name].", 1) /obj/item/weapon/hand/proc/update_conceal() if (src.concealed) src.hi.updateContent("headbar", "You are currently concealing your hand. Reveal your hand.") diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 05bc607668b..4f01f0ca45d 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -90,8 +90,7 @@ Doesn't work on other aliens/AI.*/ if(locate(/obj/structure/alien/weeds/node) in get_turf(user)) src << "There's already a weed node here." return 0 - for(var/mob/O in viewers(user, null)) - O.show_message(text("[user] has planted some alien weeds!"), 1) + user.visible_message("[user] has planted some alien weeds!") new/obj/structure/alien/weeds/node(user.loc) return 1 @@ -241,7 +240,7 @@ Doesn't work on other aliens/AI.*/ user << "There is already a resin structure there." return 0 var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures - if(!choice) + if(!choice) return 0 if (!cost_check(check_turf,user)) return 0 diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 4aea4929e76..80babb296c8 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -260,8 +260,7 @@ if(href_list["cable"]) var/turf/T = get_turf(src.loc) src.cable = new /obj/item/weapon/pai_cable(T) - for (var/mob/M in viewers(T)) - M.show_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", 3, "You hear the soft click of something light and hard falling to the ground.", 2) + T.visible_message("A port on [src] opens to reveal [src.cable], which promptly falls to the floor.", "You hear the soft click of something light and hard falling to the ground.") //src.updateUsrDialog() We only need to account for the single mob this is intended for, and he will *always* be able to call this window src.paiInterface() // So we'll just call the update directly rather than doing some default checks return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 82362afc3c1..96b23eb6a57 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -42,108 +42,100 @@ var/next_mob_id = 0 for(var/datum/gas/trace_gas in environment.trace_gases) t+= "[trace_gas.type]: [trace_gas.moles] \n" - usr.show_message(t, 1) + usr << t -/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) +/mob/proc/show_message(msg, type, alt_msg, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) - if(!client) return + if(!client) + return msg = copytext(msg, 1, MAX_MESSAGE_LEN) - if (type) - if(type & 1 && (disabilities & BLIND || paralysis) )//Vision related - if (!( alt )) + if(type) + if(type & 1 && eye_blind )//Vision related + if(!alt_msg) return else - msg = alt + msg = alt_msg type = alt_type - if (type & 2 && ear_deaf)//Hearing related - if (!( alt )) + + if(type & 2 && ear_deaf)//Hearing related + if(!alt_msg) return else - msg = alt + msg = alt_msg type = alt_type - if ((type & 1 && disabilities & BLIND)) + if(type & 1 && eye_blind) return - // Added voice muffling for Issue 41. - if(stat == UNCONSCIOUS || sleeping > 0) - src << "... You can almost hear someone talking ..." + // voice muffling + if(stat == UNCONSCIOUS) + if(type & 2) //audio + src << "... You can almost hear something ..." else src << msg - return -// Show a message to all mobs who sees the src mob and the src mob itself +// Show a message the src mob and to all player mobs who sees the src mob // 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!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" /mob/visible_message(message, self_message, blind_message) - var/list/mob_viewers = list() - var/list/possible_viewers = list() - mob_viewers |= src - mob_viewers |= viewers(src) - var/heard = get_hear(7, src) - for(var/atom/movable/A in heard) - possible_viewers |= recursive_hear_check(A) - for(var/mob/B in possible_viewers) - if(B in mob_viewers) + var/turf/T = get_turf(src) + if(!T) + return + for(var/P in player_list) + var/mob/M = P + var/turf/U = get_turf(P) + if(!U) continue - if(isturf(B.loc)) - continue - var/turf/T = get_turf(B) - if(src in view(T)) - mob_viewers |= B + if(get_dist(T,U)<7 && inLineOfSight(T.x,T.y, U.x,U.y,T.z)) + var/msg = message + if(M == src) //the src always see the main message or self message + if(self_message) + msg = self_message + else + if(M.see_invisibleThe slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) - chemical_mob_spawn(holder, 5, "Gold Slime") /datum/chemical_reaction/slimecritlesser @@ -117,10 +116,9 @@ /datum/chemical_reaction/slimecritlesser/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) - chemical_mob_spawn(holder, 3, "Lesser Gold Slime", "neutral") /datum/chemical_reaction/slimecritfriendly @@ -134,10 +132,9 @@ /datum/chemical_reaction/slimecritfriendly/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate adorably !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") spawn(50) - chemical_mob_spawn(holder, 1, "Friendly Gold Slime", "neutral") //Silver @@ -262,8 +259,8 @@ /datum/chemical_reaction/slimefreeze/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate adorably !") spawn(50) if(holder && holder.my_atom) playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) @@ -310,8 +307,8 @@ /datum/chemical_reaction/slimefire/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/TU = get_turf(holder.my_atom) + TU.visible_message("The slime extract begins to vibrate adorably !") spawn(50) if(holder && holder.my_atom) var/turf/simulated/T = get_turf(holder.my_atom) @@ -359,8 +356,8 @@ /datum/chemical_reaction/slimeglow/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime F.loc = get_turf(holder.my_atom) @@ -438,8 +435,7 @@ feedback_add_details("slime_cores_used","[type]") for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The [slime] is driven into a frenzy!"), 1) + slime.visible_message("The [slime] is driven into a frenzy!") /datum/chemical_reaction/slimespeed @@ -498,8 +494,8 @@ /datum/chemical_reaction/slimeexplosion/on_reaction(datum/reagents/holder) feedback_add_details("slime_cores_used","[type]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) + var/turf/T = get_turf(holder.my_atom) + T.visible_message("The slime extract begins to vibrate violently !") spawn(50) if(holder && holder.my_atom) explosion(get_turf(holder.my_atom), 1 ,3, 6)