diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 9fd72b04937..25e0c7e94a8 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -63,7 +63,7 @@ continue var/T = get_turf(user) if(isobserver(M) && M.client && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T))) - M.show_message("(Follow) " + msg) + M.show_message(formatFollow(user) + " " + msg) if (user.client && M?.client?.prefs.mob_chat_on_map && get_dist(M, user) < M?.client.view) M.create_chat_message(user, null, msg_runechat, "", list("italics")) diff --git a/code/datums/recruiter.dm b/code/datums/recruiter.dm index bef842c56d3..d460be8d1c1 100644 --- a/code/datums/recruiter.dm +++ b/code/datums/recruiter.dm @@ -28,10 +28,10 @@ subject=_subject /datum/recruiter/proc/recruiting_player(var/mob/dead/observer/O) - player_volunteering.invoke_async(O, "Teleport | Retract") + player_volunteering.invoke_async(O, "[formatGhostJump(subject)] | Retract") /datum/recruiter/proc/nonrecruiting_player(var/mob/dead/observer/O) - player_not_volunteering.invoke_async(O, "Teleport | Sign up") + player_not_volunteering.invoke_async(O, "[formatGhostJump(subject)] | Sign up") /datum/recruiter/proc/request_player() currently_querying = list() @@ -46,13 +46,13 @@ currently_querying |= O recruiting_player(O) - //to_chat(O, "Someone is harvesting [display_name]. You have been added to the list of potential ghosts. (Teleport | Retract)") + //to_chat(O, "Someone is harvesting [display_name]. You have been added to the list of potential ghosts. ([formatGhostJump(subject)] | Retract)") for(var/mob/dead/observer/O in dead_mob_list - active_candidates) if(!check_observer(O)) continue nonrecruiting_player(O) - //to_chat(O, "Someone is harvesting [display_name]. (Teleport | Sign up)") + //to_chat(O, "Someone is harvesting [display_name]. ([formatGhostJump(subject)] | Sign up)") spawn(recruitment_timeout) if(!currently_querying || currently_querying.len==0) diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm index cf61d799500..ee2c7d795d7 100644 --- a/code/game/gamemodes/blob/overmind.dm +++ b/code/game/gamemodes/blob/overmind.dm @@ -143,7 +143,7 @@ for (var/mob/M in dead_mob_list) if(!istype(M,/mob/new_player) && !istype(M,/mob/living/carbon/brain)) //No meta-evesdropping - rendered = "Blob Telepathy, [name] (Follow) [message_a]" + rendered = "Blob Telepathy, [name] [formatFollow(src)] [message_a]" M.show_message(rendered, 2) /mob/camera/blob/emote(act, m_type = null, message = null, ignore_status = FALSE, arguments) diff --git a/code/game/objects/items/devices/PDA/apps/messenger.dm b/code/game/objects/items/devices/PDA/apps/messenger.dm index 21483387ad6..d2931571aaa 100644 --- a/code/game/objects/items/devices/PDA/apps/messenger.dm +++ b/code/game/objects/items/devices/PDA/apps/messenger.dm @@ -274,7 +274,7 @@ msg_id++ for(var/mob/dead/observer/M in player_list) if(!multicast_message && M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTPDA)) // src.client is so that ghosts don't have to listen to mice - M.show_message("(Follow) PDA Message - \ + M.show_message("[formatFollow(U)] PDA Message - \ [U.real_name][U.real_name == pda_device.owner ? "" : " (as [pda_device.owner])"] -> [P.owner]: [t]\ [pda_device.photo ? " (View Photo)" : ""]") diff --git a/code/game/say.dm b/code/game/say.dm index cc4edb0b724..c28439b12b0 100644 --- a/code/game/say.dm +++ b/code/game/say.dm @@ -326,8 +326,8 @@ var/global/image/ghostimg = image("icon"='icons/mob/mob.dmi',"icon_state"="ghost if(istype(mob, /mob/new_player)) return //One extra layer of sanity if(istype(mob,/mob/dead/observer)) - var/reference = "(Follow) " - message = reference+message + var/reference = formatFollow(speaker) + message = reference+" "+message to_chat(mob, message) else to_chat(mob, message) diff --git a/code/modules/bomberman/bomberman.dm b/code/modules/bomberman/bomberman.dm index 2c56ad8c3c0..aeb9a2c22ab 100644 --- a/code/modules/bomberman/bomberman.dm +++ b/code/modules/bomberman/bomberman.dm @@ -988,14 +988,12 @@ var/global/list/arena_spawnpoints = list()//used by /mob/dead/observer/Logout() log_game("[key_name_admin(user.client)] created a \"[size]\" Bomberman arena at [center.loc.name] ([center.x],[center.y],[center.z]) ") for(var/mob/dead/observer/O in player_list) - to_chat(O, "[user.client.key] created a \"[size]\" Bomberman arena at [center.loc.name]. Click here to JUMP to it.") + to_chat(O, "[user.client.key] created a \"[size]\" Bomberman arena at [center.loc.name]. Click here to JUMP to it.") return 1 else qdel(src) return 0 - - /datum/bomberman_arena/proc/spawn_player(var/turf/T, var/mob/M) M.forceMove(T) M.name = "Bomberman #[rand(1,999)]" diff --git a/code/modules/events/immovablerod.dm b/code/modules/events/immovablerod.dm index ec3fa77dc45..c4f89adcaa0 100644 --- a/code/modules/events/immovablerod.dm +++ b/code/modules/events/immovablerod.dm @@ -89,7 +89,7 @@ var/list/all_rods = list() /obj/item/projectile/immovablerod/throw_at(atom/end) for(var/mob/dead/observer/people in observers) - to_chat(people, "\A [src] has been thrown at the station, Follow it") + to_chat(people, "\A [src] has been thrown at the station, [formatFollow(src,"Follow it")]") original = end starting = loc current = loc diff --git a/code/modules/events/old_vendotron_event/vendor_teleport_event.dm b/code/modules/events/old_vendotron_event/vendor_teleport_event.dm index bc77558f347..e09c80fe8a4 100644 --- a/code/modules/events/old_vendotron_event/vendor_teleport_event.dm +++ b/code/modules/events/old_vendotron_event/vendor_teleport_event.dm @@ -64,7 +64,7 @@ /obj/effect/old_vendotron_entrance/New() ..() for(var/mob/dead/observer/people in observers) - to_chat(people, "\A [src] has been thrown at the station, Follow it") + to_chat(people, "\A [src] has been thrown at the station, [formatFollow(src,"Follow it")]") /obj/effect/old_vendotron_entrance/proc/aestheticEntrance() animate(src, alpha = 255, transform = matrix()*2, time = 3 SECONDS) diff --git a/code/modules/hydroponics/seed_mobs.dm b/code/modules/hydroponics/seed_mobs.dm index 42c61a3f1f3..58295abb524 100644 --- a/code/modules/hydroponics/seed_mobs.dm +++ b/code/modules/hydroponics/seed_mobs.dm @@ -43,13 +43,13 @@ continue currently_querying |= O - to_chat(O, "Someone is harvesting [display_name]. You have been added to the list of potential ghosts. (Teleport | Retract)") + to_chat(O, "Someone is harvesting [display_name]. You have been added to the list of potential ghosts. ([formatGhostJump(host)] | Retract)") for(var/mob/dead/observer/O in dead_mob_list - active_candidates) if(!check_observer(O)) continue - to_chat(O, "Someone is harvesting [display_name]. (Teleport | Sign up)") + to_chat(O, "Someone is harvesting [display_name]. ([formatGhostJump(host)] | Sign up)") spawn(600) if(!currently_querying || !currently_querying.len) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index c1220711e78..3af5f7e2649 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -413,13 +413,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/dead/observer/proc/manual_follow(var/atom/movable/target) if(target) var/turf/targetloc = get_turf(target) + if(targetloc && targetloc.holy && (!invisibility || islegacycultist(src))) + to_chat(usr, "You cannot follow a mob standing on holy grounds!") + return var/area/targetarea = get_area(target) if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr)) to_chat(usr, "You can sense a sinister force surrounding that mob, your spooky body itself refuses to follow it.") return - if(targetloc && targetloc.holy && (!invisibility || islegacycultist(src))) - to_chat(usr, "You cannot follow a mob standing on holy grounds!") - return if(target != src) if(locked_to) if(locked_to == target) //Trying to follow same target, don't do anything @@ -453,43 +453,54 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(istype(A)) A.reenter_corpse() - //BEGIN TELEPORT HREF CODE if(usr != src) return ..() - if(href_list["follow"]) - var/target = locate(href_list["follow"]) - if(target) - if(isAI(target)) - var/mob/living/silicon/ai/M = target - target = M.eyeobj - manual_follow(target) +//BEGIN TELEPORT HREF CODE +/datum/subsystem/mob/Topic(href, href_list) + if(istype(usr,/mob/dead/observer)) + var/mob/dead/observer/O = usr + if(href_list["follow"]) + var/target = locate(href_list["follow"]) + if(target) + if(isAI(target)) + var/mob/living/silicon/ai/M = target + if(!istype(M.loc,/obj/item/device/aicard)) + target = M.eyeobj + O.manual_follow(target) + else + to_chat(O, "That mob doesn't seem to exist anymore.") + return - if (href_list["jump"]) - var/mob/target = locate(href_list["jump"]) - var/mob/A = usr; - to_chat(A, "Teleporting to [target]...") - if(target && target != usr) - var/turf/pos = get_turf(A) - var/turf/T=get_turf(target) - if(T != pos) - if(!T) - to_chat(A, "Target not in a turf.") - return - if(locked_to) - manual_stop_follow(locked_to) - forceMove(T) + if (href_list["jump"]) + var/target = locate(href_list["jump"]) + if(target && target != usr) + to_chat(O, "Teleporting to [target]...") + var/turf/pos = get_turf(O) + var/turf/T=get_turf(target) + if(T != pos) + if(!T) + to_chat(O, "Target not in a turf.") + return + if(O.locked_to) + O.manual_stop_follow(O.locked_to) + O.forceMove(T) + else + to_chat(O, "That thing doesn't seem to exist anymore, or is you.") + return - if(href_list["jumptoarenacood"]) - var/datum/bomberman_arena/targetarena = locate(href_list["targetarena"]) - if(targetarena) - if(locked_to) - manual_stop_follow(locked_to) - usr.forceMove(targetarena.center) - to_chat(usr, "Remember to enable darkness to be able to see the spawns. Click on a green spawn between rounds to register on it.") - else - to_chat(usr, "That arena doesn't seem to exist anymore.") + if(href_list["targetarena"]) + var/datum/bomberman_arena/targetarena = locate(href_list["targetarena"]) + if(targetarena) + if(O.locked_to) + O.manual_stop_follow(O.locked_to) + O.forceMove(targetarena.center) + to_chat(O, "Click on a green spawn between rounds to register on it.") + else + to_chat(O, "That arena doesn't seem to exist anymore.") + return + return ..() //END TELEPORT HREF CODE @@ -532,7 +543,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (get_dist(source_turf, src) <= world.view) // If this isn't true, we can't be in view, so no need for costlier proc. if (source_turf in view(src)) rendered_speech = "[rendered_speech]" - to_chat(src, "(Follow) [rendered_speech]") + to_chat(src, "[formatFollow(source)] [rendered_speech]") /mob/dead/observer/hasHUD(var/hud_kind) switch(hud_kind) diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 7843bc36809..a8ef7c4bb66 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -54,4 +54,4 @@ say_testing(src, "/mob/dead/observer/Hear(): CHAT_GHOSTRADIO is disabled, blocking. ([client.prefs.toggles] & [CHAT_GHOSTRADIO]) = [client.prefs.toggles & CHAT_GHOSTRADIO]") return - to_chat(src, "(Follow) [rendered_speech]") + to_chat(src, "[formatFollow(source)] [rendered_speech]") diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 2f34388541f..6d693a96384 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -67,7 +67,7 @@ var/mindname = (src.mind && src.mind.name) ? "[src.mind.name]" : "[real_name]" var/died_as = (mindname == real_name) ? "" : " (died as [real_name])" for(var/mob/M in get_deadchat_hearers()) - var/rendered = "\proper(Follow) \The [mindname][died_as] has died at \the [get_area(place_of_death)]." + var/rendered = "\proper[formatFollow(src)] \The [mindname][died_as] has died at \the [get_area(place_of_death)]." to_chat(M, rendered) log_game("[key_name(src)] has died at [get_area(place_of_death)]. Coordinates: ([get_coordinates_string(src)])") is_dying = FALSE diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 24c8bc44589..6d979f03cd9 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -73,7 +73,7 @@ if (!M.client) continue //skip leavers if(isobserver(M) && M.client.prefs && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(user))) - M.show_message("(Follow) " + msg) + M.show_message(formatFollow(user) + " " + msg) if(emote_type & EMOTE_VISIBLE) user.visible_message(msg) diff --git a/code/modules/mob/living/carbon/alien/larva/alien_embryo.dm b/code/modules/mob/living/carbon/alien/larva/alien_embryo.dm index a9bf4d43b4a..319a467723c 100644 --- a/code/modules/mob/living/carbon/alien/larva/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/larva/alien_embryo.dm @@ -19,7 +19,7 @@ for(var/mob/dead/observer/O in get_active_candidates(ROLE_ALIEN,poll="[affected_mob] has been infected by \a [src]!")) if(O.client && O.client.desires_role(ROLE_ALIEN)) if(check_observer(O)) - to_chat(O, "You have automatically been signed up for \a [src]. (Teleport | Retract)") + to_chat(O, "You have automatically been signed up for \a [src]. ([formatGhostJump(src)] | Retract)") ghost_volunteers += O spawn(0) AddInfectionImages(affected_mob) @@ -135,7 +135,7 @@ picked = affected_mob.key //Pick the person who was infected else for(var/mob/dead/observer/O in candidates) - to_chat(O, "\a [src] is about to burst out of \the [affected_mob]!(Teleport | Sign Up)") + to_chat(O, "\a [src] is about to burst out of \the [affected_mob]!([formatGhostJump(src)] | Sign Up)") else picked = ghostpicked.key @@ -143,7 +143,7 @@ stage = 4 // Let's try again later. var/list/candidates = get_active_candidates(ROLE_ALIEN, buffer=ALIEN_SELECT_AFK_BUFFER, poll=1) for(var/mob/dead/observer/O in candidates) //Shiggy - to_chat(O, "\a [src] is about to burst out of \the [affected_mob]!(Teleport | Sign Up)") + to_chat(O, "\a [src] is about to burst out of \the [affected_mob]!([formatGhostJump(src)] | Sign Up)") return if(affected_mob.lying) diff --git a/code/modules/mob/living/carbon/slime/slime.dm b/code/modules/mob/living/carbon/slime/slime.dm index 3a950a004c2..f79575d3e4a 100644 --- a/code/modules/mob/living/carbon/slime/slime.dm +++ b/code/modules/mob/living/carbon/slime/slime.dm @@ -960,7 +960,7 @@ if(O.client) var/area/A = get_area(src) if(A) - to_chat(O, "Golem rune created in [A.name]. (Teleport | Sign Up)") + to_chat(O, "Golem rune created in [A.name]. ([formatGhostJump(src)] | Sign Up)") /obj/effect/golem_rune/Topic(href,href_list) if("signup" in href_list) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 5403f9be4bb..b94111f528f 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -197,7 +197,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates for(var/mob/dead/observer/O in player_list) // We handle polling ourselves. if(O.client && get_role_desire_str(O.client.prefs.roles[ROLE_PAI]) != "Never") if(check_recruit(O)) - to_chat(O, "A pAI card is looking for personalities. (Sign Up | Teleport)") + to_chat(O, "A pAI card is looking for personalities. (Sign Up | [formatFollow(p,"Teleport")])") //question(O.client) /datum/paiController/proc/check_recruit(var/mob/dead/observer/O) diff --git a/code/modules/mob/living/simple_animal/borer.dm b/code/modules/mob/living/simple_animal/borer.dm index 87939059609..fb77f10005c 100644 --- a/code/modules/mob/living/simple_animal/borer.dm +++ b/code/modules/mob/living/simple_animal/borer.dm @@ -332,7 +332,7 @@ var/global/borer_unlock_types_leg = typesof(/datum/unlockable/borer/leg) - /datu if(istype(M, /mob/new_player)) continue if(istype(M,/mob/dead/observer) && (M.client && M.client.prefs.toggles & CHAT_GHOSTEARS || (get_turf(src) in view(M)))) - var/controls = "Follow" + var/controls = formatFollow(src,"Follow") if(M.client.holder) controls+= " | ?" var/rendered="Thought-speech, [truename] ([controls]) in [host]'s [limb_to_name(hostlimb)]: [encoded_message]" diff --git a/code/modules/mob/living/simple_animal/borer/captive_brain.dm b/code/modules/mob/living/simple_animal/borer/captive_brain.dm index a9bc2ae6447..0b94d4bfa74 100644 --- a/code/modules/mob/living/simple_animal/borer/captive_brain.dm +++ b/code/modules/mob/living/simple_animal/borer/captive_brain.dm @@ -23,7 +23,7 @@ if(istype(M, /mob/new_player)) continue if(istype(M,/mob/dead/observer) && (M.client && M.client.prefs.toggles & CHAT_GHOSTEARS)) - var/controls = "Follow" + var/controls = formatFollow(src,"Follow") if(M.client.holder) controls+= " | ?" var/rendered="Thought-speech, [src.name] ([controls]) -> [B.truename]: [message]" diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 3a4052013e3..9ace7e7e25e 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -73,12 +73,8 @@ var/list/global_deadchat_listeners = list() var/location_text = get_coordinates_string(src) log_say("[name]/[key_name(src)] (@[location_text]) Deadsay: [message]") - var/list/hearers = get_deadchat_hearers() - if(hearers) - for(var/mob/M in hearers) - var/rendered = "(Follow)" - rendered += " [name][alt_name] [message]" - to_chat(M, rendered) + for(var/mob/M in get_deadchat_hearers()) + to_chat(M, "[formatFollow(src)] [name][alt_name] [message]") /mob/proc/get_ear() // returns an atom representing a location on the map from which this diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 11ed4c33f32..1e6f6effcf8 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -977,17 +977,8 @@ var/list/obj/machinery/singularity/white_hole_candidates qdel(target_singulo) var/message = "An admin has begun DEADCHAT-CONTROLLED SINGULARITY!
It is on ANARCHY mode.
Simply type UP, DOWN, LEFT, or RIGHT to move the singularity.
Cooldown per person is currently [new_singulo.input_cooldown/10] seconds.
" - for(var/mob/M in player_list) - if(istype(M, /mob/new_player) || !M.client) - continue - if(M.client && M.client.holder && M.client.holder.rights & R_ADMIN && (M.client.prefs.toggles & CHAT_DEAD)) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above - to_chat(M, message + "(Follow)") - else if(M.client && M.stat == DEAD && !istype(M, /mob/dead/observer/deafmute) && (M.client.prefs.toggles & CHAT_DEAD)) - to_chat(M, message + "(Follow)") - else if(M.client && istype(M,/mob/living/carbon/brain) && (M.client.prefs.toggles & CHAT_DEAD)) - var/mob/living/carbon/brain/B = M - if(B.brain_dead_chat()) - to_chat(M, message + "(Follow)") + for(var/mob/M in get_deadchat_hearers()) + to_chat(M, message + formatFollow(new_singulo)) else if(option_chosen == "Democracy") var/interval = input("Please enter the interval that the singulo makes a move in seconds.", "Interval") as num if(!interval) @@ -1011,17 +1002,8 @@ var/list/obj/machinery/singularity/white_hole_candidates qdel(target_singulo) var/message = "An admin has begun DEADCHAT-CONTROLLED SINGULARITY!
It is on DEMOCRACY mode.
Simply type UP, DOWN, LEFT, or RIGHT to cast a vote on which direction it should move. Your vote will be your latest message.
The singulo will move every [new_singulo.democracy_cooldown/10] seconds. Votes start now!
" - for(var/mob/M in player_list) - if(istype(M, /mob/new_player) || !M.client) - continue - if(M.client && M.client.holder && M.client.holder.rights & R_ADMIN && (M.client.prefs.toggles & CHAT_DEAD)) - to_chat(M, message + "(Follow)") - else if(M.client && M.stat == DEAD && !istype(M, /mob/dead/observer/deafmute) && (M.client.prefs.toggles & CHAT_DEAD)) - to_chat(M, message + "(Follow)") - else if(M.client && istype(M,/mob/living/carbon/brain) && (M.client.prefs.toggles & CHAT_DEAD)) - var/mob/living/carbon/brain/B = M - if(B.brain_dead_chat()) - to_chat(M, message + "(Follow)") + for(var/mob/M in get_deadchat_hearers()) + to_chat(M, message + formatFollow(new_singulo)) /obj/machinery/singularity/special name = "specialarity" diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm index 8e1811c97d0..81639aa3f40 100644 --- a/goon/code/datums/browserOutput.dm +++ b/goon/code/datums/browserOutput.dm @@ -337,7 +337,7 @@ For the main html chat area target << output(url_encode(message), "browseroutput:output") /proc/get_deadchat_hearers() - var/list/hearers = list() + . = list() for(var/mob/M in player_list) if(!M.client) continue @@ -346,18 +346,19 @@ For the main html chat area else if(M.client.prefs.toggles & CHAT_DEAD) if(M.client.holder && M.client.holder.rights & R_ADMIN) //admins can toggle deadchat on and off. This is a proc in admin.dm and is only give to Administrators and above - hearers += M - continue + . += M else if(M.stat == DEAD && !istype(M, /mob/dead/observer/deafmute)) - hearers += M - continue + . += M else if(istype(M,/mob/living/carbon/brain)) var/mob/living/carbon/brain/B = M if(B.brain_dead_chat()) - hearers += M - continue - . = hearers - return . + . += M + +/proc/formatFollow(var/mob/target,var/custom_text="(Follow)") + return "[custom_text]" + +/proc/formatGhostJump(var/mob/target,var/custom_text="Teleport") + return "[custom_text]" /* This proc only handles sending the message to everyone who can hear deadchat. Formatting that message is up to you! Consider using on your message! */ /* Kinda useless if your message needs to include an href, though... */