diff --git a/code/datums/diseases/advance/symptoms/vomit.dm b/code/datums/diseases/advance/symptoms/vomit.dm index 67f53564deb..55fd92863e0 100644 --- a/code/datums/diseases/advance/symptoms/vomit.dm +++ b/code/datums/diseases/advance/symptoms/vomit.dm @@ -43,7 +43,8 @@ Bonus /datum/symptom/vomit/proc/Vomit(var/mob/living/M) - M.visible_message("[M] vomits on the floor!") + M.visible_message("[M] vomits on the floor!", \ + "You throw up on the floor!") M.nutrition -= 20 M.adjustToxLoss(-3) @@ -84,7 +85,8 @@ Bonus /datum/symptom/vomit/blood/Vomit(var/mob/living/M) M.Stun(1) - M.visible_message("[M] vomits on the floor!") + M.visible_message("[M] vomits on the floor!", \ + "You throw up on the floor!") // They lose blood and health. var/brute_dam = M.getBruteLoss() diff --git a/code/datums/diseases/appendicitis.dm b/code/datums/diseases/appendicitis.dm index 8a628eefd62..f3a2432ebe5 100644 --- a/code/datums/diseases/appendicitis.dm +++ b/code/datums/diseases/appendicitis.dm @@ -44,7 +44,7 @@ affected_mob.nutrition -= 95 affected_mob.adjustToxLoss(-1) else - affected_mob << "You gag as you want to throw up, but there's nothing in your stomach!" + affected_mob << "You gag as you want to throw up, but there's nothing in your stomach!" affected_mob.Weaken(10) affected_mob.adjustToxLoss(3) diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index f27815a0a3c..592b1686c4a 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -316,7 +316,7 @@ text("[src.oddbutton ? "Yes" : "No" /obj/machinery/bot/cleanbot/proc/clean(var/obj/effect/decal/cleanable/target) src.anchored = 1 src.icon_state = "cleanbot-c" - visible_message("[src] begins to clean up [target]") + visible_message("[src] begins to clean up [target]") src.cleaning = 1 spawn(50) src.cleaning = 0 diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1096f5d5533..3404cafa4f2 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -468,9 +468,10 @@ if ((HULK in user.mutations) && !prob(src.deflect_chance)) src.take_damage(15) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") + user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") + src.occupant_message("[user] hits [src.name], doing some damage.") else - user.visible_message("[user] hits [src.name]. Nothing happens","You hit [src.name] with no visible effect.") + user.visible_message("[user] hits [src.name]. Nothing happens","You hit [src.name] with no visible effect.") src.log_append_to_last("Armor saved.") return @@ -486,6 +487,7 @@ playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) user << "You slash at the armored suit!" visible_message("The [user] slashes at [src.name]'s armor!") + src.occupant_message("The [user] slashes at [src.name]'s armor!") else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) @@ -504,12 +506,13 @@ var/damage = rand(user.melee_damage_lower, user.melee_damage_upper) src.take_damage(damage) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - visible_message("[user] [user.attacktext] [src]!") + visible_message("[user] [user.attacktext] [src]!") + src.occupant_message("[user] [user.attacktext] [src]!") add_logs(user, src, "attacked", admin=0) else src.log_append_to_last("Armor saved.") playsound(src.loc, 'sound/weapons/slash.ogg', 50, 1, -1) - src.occupant_message("The [user]'s attack is stopped by the armor.") + src.occupant_message("[user]'s attack is stopped by the armor.") visible_message("The [user] rebounds off [src.name]'s armor!") add_logs(user, src, "attacked", admin=0) return @@ -537,6 +540,8 @@ else if(istype(A, /obj)) var/obj/O = A if(O.throwforce) + src.occupant_message("[src.name] is hit by [A].") + src.visible_message("[src.name] is hit by [A].") src.take_damage(O.throwforce) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return @@ -562,6 +567,8 @@ ignore_threshold = 1 if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) src.take_damage(Proj.damage,Proj.flag) + src.occupant_message("[src.name] is hit by [Proj]!") + src.visible_message("[src.name] is hit by [Proj].") src.check_for_internal_damage(list(MECHA_INT_FIRE,MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST,MECHA_INT_SHORT_CIRCUIT),ignore_threshold) Proj.on_hit(src) return @@ -644,7 +651,7 @@ return 0 else src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") + user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") src.take_damage(W.force,W.damtype) src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) return 1 diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm index 8d974017521..8f822385dd1 100644 --- a/code/game/objects/items/shooting_range.dm +++ b/code/game/objects/items/shooting_range.dm @@ -95,9 +95,7 @@ hp -= Proj.damage if(hp <= 0) - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "[src] breaks into tiny pieces and collapses!" + visible_message("[src] breaks into tiny pieces and collapses!") qdel(src) // Create a temporary object to represent the damage diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 63817318c05..0c4558d1bac 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -85,16 +85,14 @@ user.changeNext_move(CLICK_CD_MELEE) if (src.destroyed && src.occupied) new /obj/item/weapon/gun/energy/laser/captain( src.loc ) - user << "\b You deactivate the hover field built into the case." + user << "You deactivate the hover field built into the case." src.occupied = 0 src.add_fingerprint(user) update_icon() return else - usr << text("You kick the display case.") - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << text("[] kicks the display case.", usr) + user.visible_message("[user] kicks the display case.", \ + "You kick the display case.") src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/lamarr_cage.dm b/code/game/objects/structures/lamarr_cage.dm index 69a6626d69a..b95ec7128c4 100644 --- a/code/game/objects/structures/lamarr_cage.dm +++ b/code/game/objects/structures/lamarr_cage.dm @@ -75,10 +75,8 @@ if (src.destroyed) return else - usr << text("You kick the lab cage.") - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << text("[] kicks the lab cage.", usr) + user.visible_message("[user] kicks the lab cage.", \ + "You kick the lab cage.") src.health -= 2 healthcheck() return diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm index ba98fa3d0de..bf542a54c9c 100644 --- a/code/game/objects/structures/statues.dm +++ b/code/game/objects/structures/statues.dm @@ -25,7 +25,7 @@ CheckHardness() /obj/structure/statue/attack_hand(mob/user) - visible_message("[user] rubs some dust off from the [name]'s surface.") + visible_message("[user] rubs some dust off from the [name]'s surface.") /obj/structure/statue/CanAtmosPass() return !density diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm index 540741dcc32..09356add7d4 100644 --- a/code/modules/events/ninja.dm +++ b/code/modules/events/ninja.dm @@ -2207,9 +2207,8 @@ ________________________________________________________________________________ anim(U.loc,U,'icons/mob/mob.dmi',,"cloak",,U.dir) s_active=!s_active U.alpha = 0 - U << "You are now invisible to normal detection." - for(var/mob/O in oviewers(U)) - O.show_message("[U.name] vanishes into thin air!",1) + U.visible_message("[U.name] vanishes into thin air!", \ + "You are now invisible to normal detection.") return /obj/item/clothing/suit/space/space_ninja/proc/cancel_stealth() @@ -2219,9 +2218,8 @@ ________________________________________________________________________________ anim(U.loc,U,'icons/mob/mob.dmi',,"uncloak",,U.dir) s_active=!s_active U.alpha = 255 - U << "You are now visible." - for(var/mob/O in oviewers(U)) - O.show_message("[U.name] appears from thin air!",1) + U.visible_message("[U.name] appears from thin air!", \ + "You are now visible.") return 1 return 0 @@ -2610,143 +2608,139 @@ It is possible to destroy the net by the occupant or someone else. var/mob/living/affecting = null//Who it is currently affecting, if anyone. var/mob/living/master = null//Who shot web. Will let this person know if the net was successful or failed. - proc - healthcheck() - if(health <=0) - density = 0 - if(affecting) - var/mob/living/carbon/M = affecting - M.anchored = 0 - for(var/mob/O in viewers(src, 3)) - O.show_message(text("[] was recovered from the energy net!", M.name), 1, text("You hear a grunt."), 2) - if(!isnull(master))//As long as they still exist. - master << "ERROR: \black unable to initiate transport protocol. Procedure terminated." - qdel(src) - return - - process(var/mob/living/carbon/M as mob) - var/check = 30//30 seconds before teleportation. Could be extended I guess. - var/mob_name = affecting.name//Since they will report as null if terminated before teleport. - //The person can still try and attack the net when inside. - while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed. - check-- - sleep(10) - - if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location. - if(!isnull(master))//As long as they still exist. - master << "ERROR: \black unable to locate \the [mob_name]. Procedure terminated." - qdel(src)//Get rid of the net. - return - - if(!isnull(src))//As long as both net and person exist. - //No need to check for countdown here since while() broke, it's implicit that it finished. - - density = 0//Make the net pass-through. - invisibility = 101//Make the net invisible so all the animations can play out. - health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running. - for(var/obj/item/W in M) - if(istype(M,/mob/living/carbon/human)) - if(W==M:w_uniform) continue//So all they're left with are shoes and uniform. - if(W==M:shoes) continue - M.unEquip(W) - - spawn(0) - playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1) - anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) - - M.loc = pick(holdingfacility)//Throw mob in to the holding facility. - M << "You appear in a strange place!" - - spawn(0) - var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() - spark_system.set_up(5, 0, M.loc) - spark_system.start() - playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1) - playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1) - anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir) - qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). - +/obj/effect/energy_net/proc/healthcheck() + if(health <=0) + density = 0 + if(affecting) + var/mob/living/carbon/M = affecting + M.anchored = 0 for(var/mob/O in viewers(src, 3)) - O.show_message(text("[] vanished!", M), 1, text("You hear sparks flying!"), 2) - + O.show_message("[M.name] was recovered from the energy net!", 1, "You hear a grunt.", 2) if(!isnull(master))//As long as they still exist. - master << "SUCCESS: \black transport procedure of \the [affecting] complete." + master << "ERROR: \black unable to initiate transport protocol. Procedure terminated." + qdel(src) + return - M.anchored = 0//Important. +/obj/effect/energy_net/process(var/mob/living/carbon/M as mob) + var/check = 30//30 seconds before teleportation. Could be extended I guess. + var/mob_name = affecting.name//Since they will report as null if terminated before teleport. + //The person can still try and attack the net when inside. + while(!isnull(M)&&!isnull(src)&&check>0)//While M and net exist, and 30 seconds have not passed. + check-- + sleep(10) - else//And they are free. - M << "You are free of the net!" + if(isnull(M)||M.loc!=loc)//If mob is gone or not at the location. + if(!isnull(master))//As long as they still exist. + master << "ERROR: \black unable to locate \the [mob_name]. Procedure terminated." + qdel(src)//Get rid of the net. return - bullet_act(var/obj/item/projectile/Proj) - health -= Proj.damage - healthcheck() - ..() + if(!isnull(src))//As long as both net and person exist. + //No need to check for countdown here since while() broke, it's implicit that it finished. - ex_act(severity) - switch(severity) - if(1.0) - health-=50 - if(2.0) - health-=50 - if(3.0) - health-=prob(50)?50:25 - healthcheck() - return + density = 0//Make the net pass-through. + invisibility = 101//Make the net invisible so all the animations can play out. + health = INFINITY//Make the net invincible so that an explosion/something else won't kill it while, spawn() is running. + for(var/obj/item/W in M) + if(istype(M,/mob/living/carbon/human)) + if(W==M:w_uniform) continue//So all they're left with are shoes and uniform. + if(W==M:shoes) continue + M.unEquip(W) - blob_act() - health-=50 - healthcheck() - return + spawn(0) + playsound(M.loc, 'sound/effects/sparks4.ogg', 50, 1) + anim(M.loc,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) - hitby(AM as mob|obj) - ..() - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] was hit by [AM]."), 1) - var/tforce = 0 - if(ismob(AM)) - tforce = 10 - else - tforce = AM:throwforce - playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) - health = max(0, health - tforce) - healthcheck() - ..() - return + M.loc = pick(holdingfacility)//Throw mob in to the holding facility. + M << "You appear in a strange place!" - attack_hand() - if (HULK in usr.mutations) - usr << text("You easily destroy the energy net.") - for(var/mob/O in oviewers(src)) - O.show_message(text("[] rips the energy net apart!", usr), 1) + spawn(0) + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() + spark_system.set_up(5, 0, M.loc) + spark_system.start() + playsound(M.loc, 'sound/effects/phasein.ogg', 25, 1) + playsound(M.loc, 'sound/effects/sparks2.ogg', 50, 1) + anim(M.loc,M,'icons/mob/mob.dmi',,"phasein",,M.dir) + qdel(src)//Wait for everything to finish, delete the net. Else it will stop everything once net is deleted, including the spawn(0). + + for(var/mob/O in viewers(src, 3)) + O.show_message("[M] vanished!", 1, "You hear sparks flying!", 2) + + if(!isnull(master))//As long as they still exist. + master << "SUCCESS: \black transport procedure of \the [affecting] complete." + + M.anchored = 0//Important. + + else//And they are free. + M << "You are free of the net!" + return + +/obj/effect/energy_net/bullet_act(var/obj/item/projectile/Proj) + health -= Proj.damage + healthcheck() + ..() + +/obj/effect/energy_net/ex_act(severity) + switch(severity) + if(1.0) health-=50 - healthcheck() - return + if(2.0) + health-=50 + if(3.0) + health-=prob(50)?50:25 + healthcheck() + return - attack_paw() - return attack_hand() +/obj/effect/energy_net/blob_act() + health-=50 + healthcheck() + return - attack_alien() - if (islarva(usr)) - return - usr << text("\green You claw at the net.") - for(var/mob/O in oviewers(src)) - O.show_message(text("[] claws at the energy net!", usr), 1) - playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) - health -= rand(10, 20) - if(health <= 0) - usr << text("\green You slice the energy net to pieces.") - for(var/mob/O in oviewers(src)) - O.show_message(text("[] slices the energy net apart!", usr), 1) - healthcheck() - return +/obj/effect/energy_net/hitby(AM as mob|obj) + ..() + visible_message("[src] was hit by [AM].") + var/tforce = 0 + if(ismob(AM)) + tforce = 10 + else + tforce = AM:throwforce + playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) + health = max(0, health - tforce) + healthcheck() + ..() + return - attackby(obj/item/weapon/W as obj, mob/user as mob) - var/aforce = W.force - health = max(0, health - aforce) - healthcheck() - ..() +/obj/effect/energy_net/attack_hand(mob/user) + if (HULK in user.mutations) + user.visible_message("[user] rips the energy net apart!", \ + "You easily destroy the energy net.") + health-=50 + healthcheck() + return + +/obj/effect/energy_net/attack_paw(mob/user) + return attack_hand() + +/obj/effect/energy_net/attack_alien(mob/user as mob) + if (islarva(user)) return + playsound(src.loc, 'sound/weapons/slash.ogg', 80, 1) + health -= rand(10, 20) + if(health > 0) + user.visible_message("[user] claws at the energy net!", \ + "\green You claw at the net.") + else + user.visible_message("[user] slices the energy net apart!", \ + "\green You slice the energy net to pieces.") + healthcheck() + return + +/obj/effect/energy_net/attackby(obj/item/weapon/W as obj, mob/user as mob) + var/aforce = W.force + health = max(0, health - aforce) + healthcheck() + ..() + return proc/create_ninja_mind(key) var/datum/mind/Mind = new /datum/mind(key) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index c7207e99bb8..312635711ff 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -247,9 +247,8 @@ proc/check_panel(mob/M) /obj/effect/fake_attacker/attackby(var/obj/item/weapon/P as obj, mob/user as mob) step_away(src,my_target,2) - for(var/mob/M in oviewers(world.view,my_target)) - M << "[my_target] flails around wildly." - my_target.show_message("[src] has been attacked by [my_target] ", 1) //Lazy. + my_target.visible_message("[my_target] flails around wildly.", \ + "[src] has been attacked by [my_target] ") src.health -= P.force @@ -261,7 +260,7 @@ proc/check_panel(mob/M) step_away(src,my_target,2) if(prob(30)) for(var/mob/O in oviewers(world.view , my_target)) - O << "[my_target] stumbles around." + O << "[my_target] stumbles around." /obj/effect/fake_attacker/New() ..() diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm index 284922a5e8f..7ebb487edc9 100644 --- a/code/modules/mining/equipment_locker.dm +++ b/code/modules/mining/equipment_locker.dm @@ -453,7 +453,8 @@ shake_camera(L, 20, 1) spawn(20) if(L) - L.visible_message("[L.name] vomits from travelling through the [src.name]!") + L.visible_message("[L.name] vomits from travelling through the [src.name]!", \ + "You throw up from travelling through the [src.name]!") L.nutrition -= 20 L.adjustToxLoss(-3) var/turf/T = get_turf(L) 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 2c372c6497b..513c7b2b6e6 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -150,8 +150,7 @@ Doesn't work on other aliens/AI.*/ if(!choice || !powerc(55)) return adjustToxLoss(-55) src << "You shape a [choice]." - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] vomits up a thick purple substance and begins to shape it."), 1) + visible_message("[src] vomits up a thick purple substance and begins to shape it.") switch(choice) if("resin wall") new /obj/structure/alien/resin/wall(loc) diff --git a/code/modules/mob/living/carbon/alien/larva/powers.dm b/code/modules/mob/living/carbon/alien/larva/powers.dm index 46097e7c411..efbdcdafe9b 100644 --- a/code/modules/mob/living/carbon/alien/larva/powers.dm +++ b/code/modules/mob/living/carbon/alien/larva/powers.dm @@ -9,16 +9,12 @@ if (layer != TURF_LAYER+0.2) layer = TURF_LAYER+0.2 - src << text("You are now hiding.") - for(var/mob/O in oviewers(src, null)) - if ((O.client && !( O.blinded ))) - O << text("[] scurries to the ground!", src) + visible_message("[src] scurries to the ground!", \ + "You are now hiding.") else layer = MOB_LAYER - src << text("You have stopped hiding.") - for(var/mob/O in oviewers(src, null)) - if ((O.client && !( O.blinded ))) - O << text("[] slowly peaks up from the ground...", src) + visible_message("[src] slowly peaks up from the ground...", \ + "You have stopped hiding.") /mob/living/carbon/alien/larva/verb/evolve() set name = "Evolve" diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index fecd02cc271..bc11bcd2490 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -137,7 +137,8 @@ var/const/MAX_ACTIVE_TIME = 400 if(W.flags & NODROP) return 0 target.unEquip(W) - target.visible_message("[src] tears [W] off of [target]'s face!") + target.visible_message("[src] tears [W] off of [target]'s face!", \ + "[src] tears [W] off of [target]'s face!") src.loc = target target.equip_to_slot(src, slot_wear_mask,,0) @@ -166,7 +167,8 @@ var/const/MAX_ACTIVE_TIME = 400 if(!sterile) //target.contract_disease(new /datum/disease/alien_embryo(0)) //so infection chance is same as virus infection chance - target.visible_message("[src] falls limp after violating [target]'s face!") + target.visible_message("[src] falls limp after violating [target]'s face!", \ + "[src] falls limp after violating [target]'s face!") Die() icon_state = "[initial(icon_state)]_impregnated" @@ -180,7 +182,8 @@ var/const/MAX_ACTIVE_TIME = 400 src.loc = get_turf(C) C.facehugger = null else - target.visible_message("[src] violates [target]'s face!") + target.visible_message("[src] violates [target]'s face!", \ + "[src] violates [target]'s face!") return /obj/item/clothing/mask/facehugger/proc/GoActive() diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 770cd676ed8..349f4f1d581 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -438,12 +438,11 @@ if (istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(istype(H.glasses,/obj/item/clothing/glasses/meson)) - H << "You look directly into The [src.name], good thing you had your protective eyewear on!" + H << "You look directly into the [src.name], good thing you had your protective eyewear on!" return - M << "You look directly into The [src.name] and feel weak." M.apply_effect(3, STUN) - for(var/mob/O in viewers(M, null)) - O.show_message(text("[] stares blankly at The []!", M, src), 1) + M.visible_message("[M] stares blankly at the [src.name]!", \ + "You look directly into the [src.name] and feel weak.") return