Nobody expects the span inquisition: replaces most <span>s with macros (#86798)

## About The Pull Request
123 changed files and multiple crashes after writing broken regex, I
replaced most remains of direct spans with macros. This cleans up the
code and makes it easier to work with in general, see justification for
the original PR. I also fixed a bunch of broken and/or unclosed spans
here too.
I intentionally avoided replacing spans with multiple classes (in most
cases) and spans in the middle of strings as it would impact readability
(in my opinion at least) and could be done later if required.

## Why It's Good For The Game

Cleaner code, actually using our macros, fixes borked HTML in some
places. See original PR.

## Changelog
Nothing player-facing
This commit is contained in:
SmArtKar
2024-09-26 21:36:13 +02:00
committed by GitHub
parent 38c52107cc
commit d4ac95a0e1
123 changed files with 306 additions and 313 deletions

View File

@@ -48,9 +48,12 @@
#define span_drone(str) ("<span class='drone'>" + str + "</span>")
#define span_engradio(str) ("<span class='engradio'>" + str + "</span>")
#define span_extremelybig(str) ("<span class='extremelybig'>" + str + "</span>")
#define span_emote(str) ("<span class='emote'>" + str + "</span>")
#define span_enteradio(str) ("<span class='enteradio'>" + str + "</span>")
#define span_game(str) ("<span class='game'>" + str + "</span>")
#define span_game_say(str) ("<span class='game say'>" + str + "</span>")
#define span_ghostalert(str) ("<span class='ghostalert'>" + str + "</span>")
#define span_good(str) ("<span class='good'>" + str + "</span>")
#define span_green(str) ("<span class='green'>" + str + "</span>")
#define span_greenannounce(str) ("<span class='greenannounce'>" + str + "</span>")
#define span_greenteamradio(str) ("<span class='greenteamradio'>" + str + "</span>")
@@ -70,6 +73,7 @@
#define span_info(str) ("<span class='info'>" + str + "</span>")
#define span_infoplain(str) ("<span class='infoplain'>" + str + "</span>")
#define span_interface(str) ("<span class='interface'>" + str + "</span>")
#define span_italics(str) ("<span class='italics'>" + str + "</span>")
#define span_linkify(str) ("<span class='linkify'>" + str + "</span>")
#define span_looc(str) ("<span class='looc'>" + str + "</span>")
#define span_major_announcement_text(str) ("<span class='major_announcement_text'>" + str + "</span>")

View File

@@ -235,7 +235,7 @@
if(!SSticker.IsRoundInProgress() || QDELETED(character))
return
var/area/player_area = get_area(character)
deadchat_broadcast("<span class='game'> has arrived at the station at <span class='name'>[player_area.name]</span>.</span>", "<span class='game'><span class='name'>[character.real_name]</span> ([rank])</span>", follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
deadchat_broadcast(span_game(" has arrived at the station at [span_name(player_area.name)]."), span_game("[span_name(character.real_name)] ([rank])"), follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
if(!character.mind)
return
if(!GLOB.announcement_systems.len)

View File

@@ -571,7 +571,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list())
/datum/controller/subsystem/ticker/proc/medal_report()
if(GLOB.commendations.len)
var/list/parts = list()
parts += "<span class='header'>Medal Commendations:</span>"
parts += span_header("Medal Commendations:")
for (var/com in GLOB.commendations)
parts += com
return "<div class='panel stationborder'>[parts.Join("<br>")]</div>"
@@ -660,7 +660,7 @@ GLOBAL_LIST_INIT(achievements_unlocked, list())
var/datum/action/report/R = new
C.player_details.player_actions += R
R.Grant(C.mob)
to_chat(C,"<span class='infoplain'><a href='?src=[REF(R)];report=1'>Show roundend report again</a></span>")
to_chat(C,span_infoplain("<a href='?src=[REF(R)];report=1'>Show roundend report again</a>"))
/datum/action/report
name = "Show roundend report"

View File

@@ -680,7 +680,7 @@ SUBSYSTEM_DEF(job)
job_debug("RJCT: Player rejected, Player: [player]")
unassigned -= player
if(!run_divide_occupation_pure)
to_chat(player, "<span class='infoplain'><b>You have failed to qualify for any job you desired.</b></span>")
to_chat(player, span_infoplain("<b>You have failed to qualify for any job you desired.</b>"))
player.ready = PLAYER_NOT_READY

View File

@@ -57,11 +57,11 @@
shuffle_inplace(pools)
found_bloodpool = pick(pools)
if(found_bloodpool)
owner.visible_message("<span class='danger'>[owner] sinks into the blood...</span>")
owner.visible_message(span_danger("[owner] sinks into the blood..."))
playsound(owner_turf, 'sound/effects/magic/enter_blood.ogg', 100, TRUE, -1)
owner.forceMove(get_turf(found_bloodpool))
playsound(get_turf(owner), 'sound/effects/magic/exit_blood.ogg', 100, TRUE, -1)
owner.visible_message("<span class='danger'>And springs back out!</span>")
owner.visible_message(span_danger("And springs back out!"))
SEND_SIGNAL(owner, COMSIG_BLOOD_WARP)
return TRUE
return FALSE

View File

@@ -43,4 +43,4 @@
ANNOUNCER_SHUTTLERECALLED = 'sound/announcer/intern/shuttlerecalled.ogg',
ANNOUNCER_SPANOMALIES = 'sound/announcer/intern/spanomalies.ogg')
custom_alert_message = "<span class='alert'>Please stand by for an important message from our new intern.</span><br>"
custom_alert_message = span_alert("Please stand by for an important message from our new intern.<br>")

View File

@@ -159,15 +159,15 @@
/datum/component/religious_tool/proc/perform_rite(mob/living/user, path)
if(user.mind.holy_role < HOLY_ROLE_PRIEST)
if(user.mind.holy_role == HOLY_ROLE_DEACON)
to_chat(user, "<span class='warning'>You are merely a deacon of [GLOB.deity], and therefore cannot perform rites.")
to_chat(user, span_warning("You are merely a deacon of [GLOB.deity], and therefore cannot perform rites."))
else
to_chat(user, "<span class='warning'>You are not holy, and therefore cannot perform rites.")
to_chat(user, span_warning("You are not holy, and therefore cannot perform rites."))
return
if(rite_types_allowlist && !is_path_in_list(path, rite_types_allowlist))
to_chat(user, span_warning("This cannot perform that kind of rite."))
return
if(performing_rite)
to_chat(user, "<span class='notice'>There is a rite currently being performed here already.")
to_chat(user, span_notice("There is a rite currently being performed here already."))
return
if(!user.can_perform_action(parent, FORBID_TELEKINESIS_REACH))
to_chat(user,span_warning("You are not close enough to perform the rite."))

View File

@@ -15,19 +15,19 @@
if(!keycheck(rider))
if(z_move_flags & ZMOVE_FEEDBACK)
to_chat(rider, "<span class='warning'>[movable_parent] has no key inserted!</span>")
to_chat(rider, span_warning("[movable_parent] has no key inserted!"))
return COMPONENT_RIDDEN_STOP_Z_MOVE
if(HAS_TRAIT(rider, TRAIT_INCAPACITATED))
if(z_move_flags & ZMOVE_FEEDBACK)
to_chat(rider, "<span class='warning'>You cannot operate [movable_parent] right now!</span>")
to_chat(rider, span_warning("You cannot operate [movable_parent] right now!"))
return COMPONENT_RIDDEN_STOP_Z_MOVE
if(ride_check_flags & RIDER_NEEDS_LEGS && HAS_TRAIT(rider, TRAIT_FLOORED))
if(z_move_flags & ZMOVE_FEEDBACK)
to_chat(rider, "<span class='warning'>You can't seem to manage that while unable to stand up enough to move [movable_parent]...</span>")
to_chat(rider, span_warning("You can't seem to manage that while unable to stand up enough to move [movable_parent]..."))
return COMPONENT_RIDDEN_STOP_Z_MOVE
if(ride_check_flags & RIDER_NEEDS_ARMS && HAS_TRAIT(rider, TRAIT_HANDS_BLOCKED))
if(z_move_flags & ZMOVE_FEEDBACK)
to_chat(rider, "<span class='warning'>You can't seem to hold onto [movable_parent] to move it...</span>")
to_chat(rider, span_warning("You can't seem to hold onto [movable_parent] to move it..."))
return COMPONENT_RIDDEN_STOP_Z_MOVE
return COMPONENT_RIDDEN_ALLOW_Z_MOVE

View File

@@ -243,8 +243,8 @@
return
if(SEND_GLOBAL_SIGNAL(COMSIG_GLOB_TRAPDOOR_LINK, src) & LINKED_UP)
playsound(assembly_turf, 'sound/machines/chime.ogg', 50, TRUE)
assembly_turf.visible_message("<span class='notice'>[src] has linked up to a nearby trapdoor! \
You may now use it to check where the trapdoor is... be careful!</span>", vision_distance = SAMETILE_MESSAGE_RANGE)
assembly_turf.visible_message(span_notice("[src] has linked up to a nearby trapdoor! \
You may now use it to check where the trapdoor is... be careful!"), vision_distance = SAMETILE_MESSAGE_RANGE)
else
playsound(assembly_turf, 'sound/machines/buzz/buzz-sigh.ogg', 50, FALSE)
assembly_turf.visible_message(span_warning("[src] has failed to find a trapdoor nearby to link to."), vision_distance = SAMETILE_MESSAGE_RANGE)

View File

@@ -40,7 +40,7 @@
if((!istype(H.dna.species, /datum/species/skeleton)) && (!istype(H.dna.species, /datum/species/golem)) && (!istype(H.dna.species, /datum/species/android)) && (!istype(H.dna.species, /datum/species/jelly)))
C.adjustStaminaLoss(18) //boneless humanoids don't lose the will to live
to_chat(C, "<font color='red' size='4'><B>DOOT</B></font>")
to_chat(C, "<span class='robot'><font size='4'>You're feeling more bony.</font></span>")
to_chat(C, span_robot("<font size='4'>You're feeling more bony.</font>"))
INVOKE_ASYNC(src, PROC_REF(spectral_change), H)
else //the sound will spook monkeys.

View File

@@ -125,22 +125,22 @@
runechat_flags = EMOTE_MESSAGE,
)
else if(is_important)
to_chat(viewer, "<span class='emote'><b>[user]</b> [msg]</span>")
to_chat(viewer, span_emote("<b>[user]</b> [msg]"))
else if(is_audible && is_visual)
viewer.show_message(
"<span class='emote'><b>[user]</b> [msg]</span>", MSG_AUDIBLE,
"<span class='emote'>You see how <b>[user]</b> [msg]</span>", MSG_VISUAL,
span_emote("<b>[user]</b> [msg]"), MSG_AUDIBLE,
span_emote("You see how <b>[user]</b> [msg]"), MSG_VISUAL,
)
else if(is_audible)
viewer.show_message("<span class='emote'><b>[user]</b> [msg]</span>", MSG_AUDIBLE)
viewer.show_message(span_emote("<b>[user]</b> [msg]"), MSG_AUDIBLE)
else if(is_visual)
viewer.show_message("<span class='emote'><b>[user]</b> [msg]</span>", MSG_VISUAL)
viewer.show_message(span_emote("<b>[user]</b> [msg]"), MSG_VISUAL)
return // Early exit so no dchat message
// The emote has some important information, and should always be shown to the user
else if(is_important)
for(var/mob/viewer as anything in viewers(user))
to_chat(viewer, "<span class='emote'><b>[user]</b> [msg]</span>")
to_chat(viewer, span_emote("<b>[user]</b> [msg]"))
if(user.runechat_prefs_check(viewer, EMOTE_MESSAGE))
viewer.create_chat_message(
speaker = user,
@@ -152,7 +152,7 @@
else if(is_visual && is_audible)
user.audible_message(
message = msg,
deaf_message = "<span class='emote'>You see how <b>[user]</b> [msg]</span>",
deaf_message = span_emote("You see how <b>[user]</b> [msg]"),
self_message = msg,
audible_message_flags = EMOTE_MESSAGE|ALWAYS_SHOW_SELF_MESSAGE,
)
@@ -180,7 +180,7 @@
continue
if(!(get_chat_toggles(ghost.client) & CHAT_GHOSTSIGHT))
continue
to_chat(ghost, "<span class='emote'>[FOLLOW_LINK(ghost, user)] [dchatmsg]</span>")
to_chat(ghost, span_emote("[FOLLOW_LINK(ghost, user)] [dchatmsg]"))
return

View File

@@ -89,4 +89,4 @@
msg += "Protect Assistant Role From Traitor: [CONFIG_GET(flag/protect_assistant_from_antagonist)]"
msg += "Enforce Human Authority: [CONFIG_GET(flag/enforce_human_authority)]"
msg += "Allow Latejoin Antagonists: [CONFIG_GET(flag/allow_latejoin_antagonists)]"
to_chat(src, "<span class='infoplain'>[msg.Join("<br>")]</span>")
to_chat(src, span_infoplain(msg.Join("<br>")))

View File

@@ -13,7 +13,7 @@
/// description of weather
var/desc = "Heavy gusts of wind blanket the area, periodically knocking down anyone caught in the open."
/// The message displayed in chat to foreshadow the weather's beginning
var/telegraph_message = "<span class='warning'>The wind begins to pick up.</span>"
var/telegraph_message = span_warning("The wind begins to pick up.")
/// In deciseconds, how long from the beginning of the telegraph until the weather begins
var/telegraph_duration = 300
/// The sound file played to everyone on an affected z-level
@@ -22,7 +22,7 @@
var/telegraph_overlay
/// Displayed in chat once the weather begins in earnest
var/weather_message = "<span class='userdanger'>The wind begins to blow ferociously!</span>"
var/weather_message = span_userdanger("The wind begins to blow ferociously!")
/// In deciseconds, how long the weather lasts once it begins
var/weather_duration = 1200
/// See above - this is the lowest possible duration
@@ -37,7 +37,7 @@
var/weather_color = null
/// Displayed once the weather is over
var/end_message = "<span class='danger'>The wind relents its assault.</span>"
var/end_message = span_danger("The wind relents its assault.")
/// In deciseconds, how long the "wind-down" graphic will appear before vanishing entirely
var/end_duration = 300
/// Sound that plays while weather is ending

View File

@@ -3,16 +3,16 @@
name = "ash storm"
desc = "An intense atmospheric storm lifts ash off of the planet's surface and billows it down across the area, dealing intense fire damage to the unprotected."
telegraph_message = "<span class='boldwarning'>An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter.</span>"
telegraph_message = span_boldwarning("An eerie moan rises on the wind. Sheets of burning ash blacken the horizon. Seek shelter.")
telegraph_duration = 300
telegraph_overlay = "light_ash"
weather_message = "<span class='userdanger'><i>Smoldering clouds of scorching ash billow down around you! Get inside!</i></span>"
weather_message = span_userdanger("<i>Smoldering clouds of scorching ash billow down around you! Get inside!</i>")
weather_duration_lower = 600
weather_duration_upper = 1200
weather_overlay = "ash_storm"
end_message = "<span class='boldannounce'>The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now.</span>"
end_message = span_boldannounce("The shrieking wind whips away the last of the ash and falls to its usual murmur. It should be safe to go outside now.")
end_duration = 300
end_overlay = "light_ash"
@@ -81,10 +81,10 @@
name = "emberfall"
desc = "A passing ash storm blankets the area in harmless embers."
weather_message = "<span class='notice'>Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by...</span>"
weather_message = span_notice("Gentle embers waft down around you like grotesque snow. The storm seems to have passed you by...")
weather_overlay = "light_ash"
end_message = "<span class='notice'>The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet.</span>"
end_message = span_notice("The emberfall slows, stops. Another layer of hardened soot to the basalt beneath your feet.")
end_sound = null
aesthetic = TRUE

View File

@@ -3,15 +3,15 @@
name = "the floor is lava"
desc = "The ground turns into surprisingly cool lava, lightly damaging anything on the floor."
telegraph_message = "<span class='warning'>You feel the ground beneath you getting hot. Waves of heat distort the air.</span>"
telegraph_message = span_warning("You feel the ground beneath you getting hot. Waves of heat distort the air.")
telegraph_duration = 150
weather_message = "<span class='userdanger'>The floor is lava! Get on top of something!</span>"
weather_message = span_userdanger("The floor is lava! Get on top of something!")
weather_duration_lower = 300
weather_duration_upper = 600
weather_overlay = "lava"
end_message = "<span class='danger'>The ground cools and returns to its usual form.</span>"
end_message = span_danger("The ground cools and returns to its usual form.")
end_duration = 0
area_type = /area

View File

@@ -4,9 +4,9 @@
desc = "A cloud of intense radiation passes through the area dealing rad damage to those who are unprotected."
telegraph_duration = 400
telegraph_message = "<span class='danger'>The air begins to grow warm.</span>"
telegraph_message = span_danger("The air begins to grow warm.")
weather_message = "<span class='userdanger'><i>You feel waves of heat wash over you! Find shelter!</i></span>"
weather_message = span_userdanger("<i>You feel waves of heat wash over you! Find shelter!</i>")
weather_overlay = "ash_storm"
weather_duration_lower = 600
weather_duration_upper = 1500
@@ -14,7 +14,7 @@
weather_sound = 'sound/announcer/alarm/bloblarm.ogg'
end_duration = 100
end_message = "<span class='notice'>The air seems to be cooling off again.</span>"
end_message = span_notice("The air seems to be cooling off again.")
area_type = /area
protected_areas = list(/area/station/maintenance, /area/station/ai_monitored/turret_protected/ai_upload, /area/station/ai_monitored/turret_protected/ai_upload_foyer,

View File

@@ -3,18 +3,18 @@
desc = "Harsh snowstorms roam the topside of this arctic planet, burying any area unfortunate enough to be in its path."
probability = 90
telegraph_message = "<span class='warning'>Drifting particles of snow begin to dust the surrounding area..</span>"
telegraph_message = span_warning("Drifting particles of snow begin to dust the surrounding area..")
telegraph_duration = 300
telegraph_overlay = "light_snow"
weather_message = "<span class='userdanger'><i>Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!</i></span>"
weather_message = span_userdanger("<i>Harsh winds pick up as dense snow begins to fall from the sky! Seek shelter!</i>")
weather_overlay = "snow_storm"
weather_duration_lower = 600
weather_duration_upper = 1500
use_glow = FALSE
end_duration = 100
end_message = "<span class='boldannounce'>The snowfall dies down, it should be safe to go outside again.</span>"
end_message = span_boldannounce("The snowfall dies down, it should be safe to go outside again.")
area_type = /area
protect_indoors = TRUE

View File

@@ -78,7 +78,7 @@
/obj/machinery/computer/arcade/proc/prizevend(mob/living/user, prizes = 1)
SEND_SIGNAL(src, COMSIG_ARCADE_PRIZEVEND, user, prizes)
if(user.mind?.get_skill_level(/datum/skill/gaming) >= SKILL_LEVEL_LEGENDARY && HAS_TRAIT(user, TRAIT_GAMERGOD))
visible_message("<span class='notice'>[user] inputs an intense cheat code!",\
visible_message(span_notice("[user] inputs an intense cheat code!"),\
span_notice("You hear a flurry of buttons being pressed."))
say("CODE ACTIVATED: EXTRA PRIZES.")
prizes *= 2

View File

@@ -67,7 +67,7 @@
text = "Oh no! The engine has broken down! \
You can repair it with an engine part, or you \
can make repairs for 3 days."
emag_message = "<span class='warning'>You hear some large object lurch to a halt right behind you! When you go to look, nothing's there...</span>"
emag_message = span_warning("You hear some large object lurch to a halt right behind you! When you go to look, nothing's there...")
emag_sound = 'sound/effects/creak/creak1.ogg'
weight = 2
event_responses = list()

View File

@@ -1347,7 +1347,7 @@
// However, if this is the case, we can't make a complete injector and
// this catches that edge case
if(!buffer_slot["name"] || !buffer_slot["UF"] || !buffer_slot["blood_type"])
to_chat(usr,"<span class='warning'>Genetic data corrupted, unable to create injector.</span>")
to_chat(usr,span_warning("Genetic data corrupted, unable to create injector."))
return
I = new /obj/item/dnainjector/timed(loc)
@@ -1731,7 +1731,7 @@
// However, if this is the case, we can't make a complete injector and
// this catches that edge case
if(!buffer_slot["UF"])
to_chat(usr,"<span class='warning'>Genetic data corrupted, unable to apply genetic data.</span>")
to_chat(usr,span_warning("Genetic data corrupted, unable to apply genetic data."))
return FALSE
COOLDOWN_START(src, enzyme_copy_timer, ENZYME_COPY_BASE_COOLDOWN)
scanner_occupant.dna.unique_features = buffer_slot["UF"]

View File

@@ -114,13 +114,13 @@
interrupt_interrogation()
return
if(SPT_PROB(5, seconds_per_tick) && !(C.get_eye_protection() > 0))
to_chat(C, "<span class='hypnophrase'>[pick(\
to_chat(C, span_hypnophrase(pick(\
"...blue... red... green... blue, red, green, blueredgreen[span_small("blueredgreen")]",\
"...pretty colors...",\
"...you keep hearing words, but you can't seem to understand them...",\
"...so peaceful...",\
"...an annoying buzz in your ears..."\
)]</span>")
)))
use_energy(active_power_usage * seconds_per_tick)

View File

@@ -810,7 +810,7 @@
if(registered_account.replaceable)
. += span_info("Alt-Right-Click the ID to change the linked bank account.")
if(registered_account.civilian_bounty)
. += "<span class='info'><b>There is an active civilian bounty.</b>"
. += span_info("<b>There is an active civilian bounty.</b>")
. += span_info("<i>[registered_account.bounty_text()]</i>")
. += span_info("Quantity: [registered_account.bounty_num()]")
. += span_info("Reward: [registered_account.bounty_value()]")

View File

@@ -95,7 +95,7 @@
/obj/item/chainsaw/doomslayer
name = "THE GREAT COMMUNICATOR"
desc = "<span class='warning'>VRRRRRRR!!!</span>"
desc = span_warning("VRRRRRRR!!!")
armour_penetration = 100
force_on = 30

View File

@@ -69,8 +69,8 @@
if(!response_timer_id)
return
var/turf/T = get_turf(src)
T.visible_message("<span class='warning'>The proposed changes disappear \
from [src]; it looks like they've been rejected.</span>")
T.visible_message(span_warning("The proposed changes disappear \
from [src]; it looks like they've been rejected."))
var/m = "[key_name(user)] has rejected the proposed station name."
message_admins(m)

View File

@@ -86,7 +86,7 @@
return
if(ispodperson(M) && !advanced)
to_chat(user, "<span class='info'>[M]'s biological structure is too complex for the health analyzer.")
to_chat(user, span_info("[M]'s biological structure is too complex for the health analyzer."))
return
user.visible_message(span_notice("[user] analyzes [M]'s vitals."))

View File

@@ -52,7 +52,7 @@
/obj/item/food/pancakes/raw/examine(mob/user)
. = ..()
if(name == initial(name))
. += "<span class='notice'>You can modify the pancake by adding <b>blueberries</b> or <b>chocolate</b> before finishing the griddle."
. += span_notice("You can modify the pancake by adding <b>blueberries</b> or <b>chocolate</b> before finishing the griddle.")
/obj/item/food/pancakes/blueberry
name = "blueberry pancake"

View File

@@ -3,7 +3,7 @@
name = "old manual"
martial_name = "close quarters combat"
desc = "A small, black manual. There are drawn instructions of tactical hand-to-hand combat."
greet = "<span class='boldannounce'>You've mastered the basics of CQC.</span>"
greet = span_boldannounce("You've mastered the basics of CQC.")
icon_state = "cqcmanual"
remarks = list(
"Kick... Slam...",

View File

@@ -3,8 +3,8 @@
name = "frayed scroll"
martial_name = "plasma fist"
desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
greet = "<span class='boldannounce'>You have learned the ancient martial art of Plasma Fist. Your combos are extremely hard to pull off, but include some of the most deadly moves ever seen including \
the plasma fist, which when pulled off will make someone violently explode.</span>"
greet = span_boldannounce("You have learned the ancient martial art of Plasma Fist. Your combos are extremely hard to pull off, but include some of the most deadly moves ever seen including \
the plasma fist, which when pulled off will make someone violently explode.")
icon = 'icons/obj/scrolls.dmi'
icon_state ="plasmafist"
remarks = list(

View File

@@ -3,9 +3,9 @@
name = "mysterious scroll"
martial_name = "sleeping carp"
desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
greet = "<span class='sciradio'>You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
greet = span_sciradio("You have learned the ancient martial art of the Sleeping Carp! Your hand-to-hand combat has become much more effective, and you are now able to deflect any projectiles \
directed toward you while in Combat Mode. Your body has also hardened itself, granting extra protection against lasting wounds that would otherwise mount during extended combat. \
However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.</span>"
However, you are also unable to use any ranged weaponry. You can learn more about your newfound art by using the Recall Teachings verb in the Sleeping Carp tab.")
icon = 'icons/obj/scrolls.dmi'
icon_state = "sleepingcarp"
worn_icon_state = "scroll"

View File

@@ -195,10 +195,10 @@
*/
/obj/item/inspector/proc/print_report(mob/user)
if(!cell)
to_chat(user, "<span class='info'>\The [src] doesn't seem to be on... It feels quite light. Perhaps it lacks a power cell?")
to_chat(user, span_info("\The [src] doesn't seem to be on... It feels quite light. Perhaps it lacks a power cell?"))
return
if(cell.charge == 0)
to_chat(user, "<span class='info'>\The [src] doesn't seem to be on... Perhaps it ran out of power?")
to_chat(user, span_info("\The [src] doesn't seem to be on... Perhaps it ran out of power?"))
return
if(!cell.use(energy_per_print))
if(cell.use(ENERGY_TO_SPEAK))
@@ -389,7 +389,7 @@
if(cell.use(ENERGY_TO_SPEAK))
say("ERROR! OUT OF PAPER! MAXIMUM PRINTING SPEED UNAVAIBLE! SWITCH TO A SLOWER SPEED TO OR PROVIDE PAPER!")
else
to_chat(user, "<span class='info'>\The [src] doesn't seem to be on... Perhaps it ran out of power?")
to_chat(user, span_info("\The [src] doesn't seem to be on... Perhaps it ran out of power?"))
return
paper_charges--
return ..()

View File

@@ -426,9 +426,8 @@
interact_with_atom(target, user, modifiers)
/obj/item/construction/rcd/proc/detonate_pulse()
audible_message("<span class='danger'><b>[src] begins to vibrate and \
buzz loudly!</b></span>","<span class='danger'><b>[src] begins \
vibrating violently!</b></span>")
audible_message(span_danger("<b>[src] begins to vibrate and buzz loudly!</b>"), \
span_danger("<b>[src] begins vibrating violently!</b>"))
// 5 seconds to get rid of it
addtimer(CALLBACK(src, PROC_REF(detonate_pulse_explode)), 5 SECONDS)

View File

@@ -88,9 +88,9 @@
mode = HUG_MODE_NICE
switch(mode)
if(HUG_MODE_NICE)
to_chat(user, "<span class='infoplain'>Power reset. Hugs!</span>")
to_chat(user, span_infoplain("Power reset. Hugs!"))
if(HUG_MODE_HUG)
to_chat(user, "<span class='infoplain'>Power increased!</span>")
to_chat(user, span_infoplain("Power increased!"))
if(HUG_MODE_SHOCK)
to_chat(user, "<span class='warningplain'>BZZT. Electrifying arms...</span>")
if(HUG_MODE_CRUSH)

View File

@@ -133,7 +133,7 @@
if(!try_heal_checks(patient, user, heal_brute, heal_burn))
return FALSE
if(patient.heal_bodypart_damage((heal_brute * patient.maxHealth/100)))
user.visible_message("<span class='infoplain'><span class='green'>[user] applies [src] on [patient].</span></span>", "<span class='infoplain'><span class='green'>You apply [src] on [patient].</span></span>")
user.visible_message(span_infoplain(span_green("[user] applies [src] on [patient].")), span_infoplain(span_green("You apply [src] on [patient].")))
return TRUE
patient.balloon_alert(user, "can't heal [patient]!")
return FALSE
@@ -279,7 +279,7 @@
if(!do_after(user, treatment_delay, target = patient))
return
user.visible_message("<span class='infoplain'><span class='green'>[user] applies [src] to [patient]'s [limb.plaintext_zone].</span></span>", "<span class='infoplain'><span class='green'>You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].</span></span>")
user.visible_message(span_infoplain(span_green("[user] applies [src] to [patient]'s [limb.plaintext_zone].")), span_infoplain(span_green("You bandage the wounds on [user == patient ? "your" : "[patient]'s"] [limb.plaintext_zone].")))
limb.apply_gauze(src)
/obj/item/stack/medical/gauze/twelve

View File

@@ -47,7 +47,7 @@
/obj/item/storage/box/mousetraps
name = "box of Pest-B-Gon mousetraps"
desc = "<span class='alert'>Keep out of reach of children.</span>"
desc = span_alert("Keep out of reach of children.")
illustration = "mousetrap"
/obj/item/storage/box/mousetraps/PopulateContents()

View File

@@ -79,7 +79,7 @@
to_chat(user, span_notice("You connect the shock kit to the [name], electrifying it "))
else
user.put_in_active_hand(input_shock_kit)
to_chat(user, "<span class='notice'> You cannot fit the shock kit onto the [name]!")
to_chat(user, span_notice("You cannot fit the shock kit onto the [name]!"))
/obj/structure/chair/wrench_act_secondary(mob/living/user, obj/item/weapon)

View File

@@ -1,6 +1,6 @@
/obj/structure/destructible //a base for destructible structures
max_integrity = 100
var/break_message = "<span class='warning'>The strange, admin-y structure breaks!</span>" //The message shown when a structure breaks
var/break_message = span_warning("The strange, admin-y structure breaks!") //The message shown when a structure breaks
var/break_sound = 'sound/effects/magic/clockwork/invoke_general.ogg' //The sound played when a structure breaks
var/list/debris = null //Parts left behind when a structure breaks, takes the form of list(path = amount_to_spawn)

View File

@@ -68,26 +68,25 @@
var/logs_used = min(space_for_logs, wood.amount)
wood.use(logs_used)
adjust_fuel_timer(LOG_BURN_TIMER * logs_used)
user.visible_message("<span class='notice'>[user] tosses some \
wood into [src].</span>", "<span class='notice'>You add \
some fuel to [src].</span>")
else if(istype(T, /obj/item/paper_bin))
user.visible_message(span_notice("[user] tosses some wood into [src]."), span_notice("You add some fuel to [src]."))
return
if(istype(T, /obj/item/paper_bin))
var/obj/item/paper_bin/paper_bin = T
user.visible_message("<span class='notice'>[user] throws [T] into \
[src].</span>", "<span class='notice'>You add [T] to [src].\
</span>")
user.visible_message(span_notice("[user] throws [T] into [src]."), span_notice("You add [T] to [src]."))
adjust_fuel_timer(PAPER_BURN_TIMER * paper_bin.total_paper)
qdel(paper_bin)
else if(istype(T, /obj/item/paper))
user.visible_message("<span class='notice'>[user] throws [T] into \
[src].</span>", "<span class='notice'>You throw [T] into [src].\
</span>")
return
if(istype(T, /obj/item/paper))
user.visible_message(span_notice("[user] throws [T] into [src]."), span_notice("You throw [T] into [src]."))
adjust_fuel_timer(PAPER_BURN_TIMER)
qdel(T)
else if(try_light(T,user))
return
else
. = ..()
if(try_light(T,user))
return
return ..()
/obj/structure/fireplace/update_overlays()
. = ..()

View File

@@ -122,7 +122,7 @@ at the cost of risking a vicious bite.**/
desc = "What is this? Who put it on this station? And why does it emanate <span class='hypnophrase'>strange energy?</span>"
icon_state = "altar"
cult_examine_tip = "Even you don't understand the eldritch magic behind this."
break_message = "<span class='warning'>The structure shatters, leaving only a demonic screech!</span>"
break_message = span_warning("The structure shatters, leaving only a demonic screech!")
break_sound = 'sound/effects/magic/demon_dies.ogg'
light_color = LIGHT_COLOR_BLOOD_MAGIC
light_range = 2

View File

@@ -234,7 +234,7 @@ FLOOR SAFES
if(!canhear)
return
if(current_tick == 2)
to_chat(user, "<span class='italics'>The sounds from [src] are too fast and blend together.</span>")
to_chat(user, span_italics("The sounds from [src] are too fast and blend together."))
if(total_ticks == 1 || prob(SOUND_CHANCE))
balloon_alert(user, pick(sounds))

View File

@@ -976,8 +976,7 @@
if(!user.temporarilyRemoveItemFromInventory(src))
return
var/obj/structure/rack/R = new /obj/structure/rack(get_turf(src))
user.visible_message("<span class='notice'>[user] assembles \a [R].\
</span>", span_notice("You assemble \a [R]."))
user.visible_message(span_notice("[user] assembles \a [R]."), span_notice("You assemble \a [R]."))
R.add_fingerprint(user)
qdel(src)
building = FALSE

View File

@@ -6,7 +6,7 @@
density = FALSE
anchored = TRUE
alpha = 30 //initially quite hidden when not "recharging"
var/flare_message = "<span class='warning'>the trap flares brightly!</span>"
var/flare_message = span_warning("the trap flares brightly!")
var/last_trigger = 0
var/time_between_triggers = 1 MINUTES
var/charges = INFINITY
@@ -20,7 +20,7 @@
/obj/structure/trap/Initialize(mapload)
. = ..()
flare_message = "<span class='warning'>[src] flares brightly!</span>"
flare_message = span_warning("[src] flares brightly!")
spark_system = new
spark_system.set_up(4,1,src)
spark_system.attach(src)
@@ -113,7 +113,7 @@
/obj/structure/trap/stun/hunter/Initialize(mapload)
. = ..()
time_between_triggers = 1 SECONDS
flare_message = "<span class='warning'>[src] snaps shut!</span>"
flare_message = span_warning("[src] snaps shut!")
/obj/structure/trap/stun/hunter/Destroy()
if(!QDELETED(stored_item))

View File

@@ -77,16 +77,16 @@ GLOBAL_VAR(antag_prototypes)
/datum/mind/proc/get_special_statuses()
var/list/result = LAZYCOPY(special_statuses)
if(!current)
result += "<span class='bad'>No body!</span>"
result += span_bad("No body!")
if(current && HAS_TRAIT(current, TRAIT_MINDSHIELD))
result += "<span class='good'>Mindshielded</span>"
result += span_good("Mindshielded")
if(current && HAS_MIND_TRAIT(current, TRAIT_UNCONVERTABLE))
result += "<span class='good'>Unconvertable</span>"
result += span_good("Unconvertable")
//Move these to mob
if(iscyborg(current))
var/mob/living/silicon/robot/robot = current
if (robot.emagged)
result += "<span class='bad'>Emagged</span>"
result += span_bad("Emagged")
return result.Join(" | ")
/datum/mind/proc/traitor_panel()
@@ -154,7 +154,7 @@ GLOBAL_VAR(antag_prototypes)
continue
else //Show removal and current one
priority_sections |= antag_category
antag_header_parts += "<span class='bad'>[current_antag.name]</span>"
antag_header_parts += span_bad("[current_antag.name]")
antag_header_parts += "<a href='?src=[REF(src)];remove_antag=[REF(current_antag)]'>Remove</a>"
antag_header_parts += "<a href='?src=[REF(src)];open_antag_vv=[REF(current_antag)]'>Open VV</a>"

View File

@@ -583,8 +583,8 @@ ADMIN_VERB(jump_to_ruin, R_DEBUG, "Jump to Ruin", "Displays a list of all placed
return
var/datum/map_template/ruin/template = landmark.ruin_template
user.mob.forceMove(get_turf(landmark))
to_chat(user, span_name("[template.name]"), confidential = TRUE)
to_chat(user, "<span class='italics'>[template.description]</span>", confidential = TRUE)
to_chat(user, span_name(template.name), confidential = TRUE)
to_chat(user, span_italics(template.description), confidential = TRUE)
ADMIN_VERB_VISIBILITY(place_ruin, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG)
ADMIN_VERB(place_ruin, R_DEBUG, "Spawn Ruin", "Attempt to randomly place a specific ruin.", ADMIN_CATEGORY_MAPPING)
@@ -625,7 +625,7 @@ ADMIN_VERB(place_ruin, R_DEBUG, "Spawn Ruin", "Attempt to randomly place a speci
log_admin("[key_name(user)] randomly spawned ruin [ruinname] at [COORD(landmark)].")
user.mob.forceMove(get_turf(landmark))
to_chat(user, span_name("[template.name]"), confidential = TRUE)
to_chat(user, "<span class='italics'>[template.description]</span>", confidential = TRUE)
to_chat(user, span_italics("[template.description]"), confidential = TRUE)
else
to_chat(user, span_warning("Failed to place [template.name]."), confidential = TRUE)

View File

@@ -202,7 +202,7 @@ ADMIN_VERB(delay, R_SERVER, "Delay Pre-Game", "Delay the game start.", ADMIN_CAT
SSticker.SetTimeLeft(newtime)
SSticker.start_immediately = FALSE
if(newtime < 0)
to_chat(world, "<span class='infoplain'><b>The game start has been delayed.</b></span>", confidential = TRUE)
to_chat(world, span_infoplain("<b>The game start has been delayed.</b>"), confidential = TRUE)
log_admin("[key_name(user)] delayed the round start.")
else
to_chat(world, span_infoplain(span_bold("The game will start in [DisplayTimeText(newtime)].")), confidential = TRUE)

View File

@@ -415,7 +415,7 @@ GLOBAL_LIST_EMPTY(antagonists)
* Appears at start of roundend_catagory section.
*/
/datum/antagonist/proc/roundend_report_header()
return "<span class='header'>The [roundend_category] were:</span><br>"
return span_header("The [roundend_category] were:<br>")
/**
* Proc that sends string data for the round-end report.

View File

@@ -49,12 +49,12 @@ GLOBAL_LIST_EMPTY(antagonist_teams)
/datum/team/proc/roundend_report()
var/list/report = list()
report += "<span class='header'>\The [name]:</span>"
report += span_header("\The [name]:")
report += "The [member_name]s were:"
report += printplayerlist(members)
if(objectives.len)
report += "<span class='header'>Team had following objectives:</span>"
report += span_header("Team had following objectives:")
var/win = TRUE
var/objective_count = 1
for(var/datum/objective/objective as anything in objectives)

View File

@@ -171,7 +171,7 @@
else
result += "<span class='redtext big'>[name] team failed its mission.</span>"
result += "<span class='header'>The abductors of [name] were:</span>"
result += span_header("The abductors of [name] were:")
for(var/datum/mind/abductor_mind in members)
result += printplayer(abductor_mind)
result += printobjectives(objectives)

View File

@@ -226,7 +226,7 @@
return
living_target.balloon_alert(living_target, "you hear a voice")
to_chat(living_target, span_hear("You hear a voice in your head saying: </span><span class='abductor'>[message]"))
to_chat(living_target, span_hear("You hear a voice in your head saying: [span_abductor(message)]"))
to_chat(user, span_notice("You send the message to your target."))
log_directed_talk(user, living_target, message, LOG_SAY, "abductor whisper")
@@ -235,7 +235,7 @@
name = "alien firing pin"
icon_state = "firing_pin_ayy"
desc = "This firing pin is slimy and warm; you can swear you feel it constantly trying to mentally probe you."
fail_message = "<span class='abductor'>Firing error, please contact Command.</span>"
fail_message = span_abductor("Firing error, please contact Command.")
/obj/item/firing_pin/abductor/pin_auth(mob/living/user)
. = isabductor(user)

View File

@@ -65,9 +65,9 @@
objectives -= necropolis_objective //So we don't count it in the check for other objectives.
report += "<b>The [name] was tasked with defending the Necropolis:</b>"
if(necropolis_objective.check_completion())
report += span_greentext("<span class='header'>The nest stands! Glory to the Necropolis!</span><br>")
report += span_greentext(span_header("The nest stands! Glory to the Necropolis!<br>"))
else
report += span_redtext("<span class='header'>The Necropolis was destroyed, the tribe has fallen...</span><br>")
report += span_redtext(span_header("The Necropolis was destroyed, the tribe has fallen...<br>"))
if(length(objectives))
report += span_header("The [name]'s other objectives were:")

View File

@@ -54,7 +54,7 @@
user.temporarilyRemoveItemFromInventory(hand_item, TRUE) //DROPDEL will delete the item
if(!silent)
playsound(user, 'sound/effects/blob/blobattack.ogg', 30, TRUE)
user.visible_message(span_warning("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!"), span_notice("We assimilate the [weapon_name_simple] back into our body."), "<span class='italics>You hear organic matter ripping and tearing!</span>")
user.visible_message(span_warning("With a sickening crunch, [user] reforms [user.p_their()] [weapon_name_simple] into an arm!"), span_notice("We assimilate the [weapon_name_simple] back into our body."), span_italics("You hear organic matter ripping and tearing!"))
user.update_held_items()
return TRUE
@@ -512,7 +512,7 @@
if(remaining_uses < 1)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.visible_message(span_warning("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!"), span_notice("We assimilate our shield into our body"), "<span class='italics>You hear organic matter ripping and tearing!</span>")
H.visible_message(span_warning("With a sickening crunch, [H] reforms [H.p_their()] shield into an arm!"), span_notice("We assimilate our shield into our body"), span_italics("You hear organic matter ripping and tearing!"))
qdel(src)
return 0
else

View File

@@ -184,10 +184,8 @@
/datum/action/changeling/sting/false_armblade/proc/remove_fake(mob/target, obj/item/melee/arm_blade/false/blade)
playsound(target, 'sound/effects/blob/blobattack.ogg', 30, TRUE)
target.visible_message("<span class='warning'>With a sickening crunch, \
[target] reforms [target.p_their()] [blade.name] into an arm!</span>",
span_warning("[blade] reforms back to normal."),
"<span class='italics>You hear organic matter ripping and tearing!</span>")
target.visible_message(span_warning("With a sickening crunch, [target] reforms [target.p_their()] [blade.name] into an arm!"),
span_warning("[blade] reforms back to normal."), span_italics("You hear organic matter ripping and tearing!"))
qdel(blade)
target.update_held_items()

View File

@@ -1271,7 +1271,7 @@ Striking a noncultist, however, will tear their flesh."}
illusions++
if(illusions == initial(illusions) && isliving(loc))
var/mob/living/holder = loc
to_chat(holder, "<span class='cult italic'>The shield's illusions are back at full strength!</span>")
to_chat(holder, span_cult_italic("The shield's illusions are back at full strength!"))
/obj/item/shield/mirror/IsReflect()
if(prob(block_chance))

View File

@@ -10,7 +10,7 @@
desc = "A bloodstained altar dedicated to Nar'Sie."
cult_examine_tip = "Can be used to create eldritch whetstones, construct shells, and flasks of unholy water."
icon_state = "talismanaltar"
break_message = "<span class='warning'>The altar shatters, leaving only the wailing of the damned!</span>"
break_message = span_warning("The altar shatters, leaving only the wailing of the damned!")
mansus_conversion_path = /obj/effect/heretic_rune
/obj/structure/destructible/cult/item_dispenser/altar/setup_options()

View File

@@ -12,7 +12,7 @@
icon_state = "tomealtar"
light_range = 1.5
light_color = LIGHT_COLOR_FIRE
break_message = "<span class='warning'>The books and tomes of the archives burn into ash as the desk shatters!</span>"
break_message = span_warning("The books and tomes of the archives burn into ash as the desk shatters!")
mansus_conversion_path = /obj/item/codex_cicatrix
/obj/structure/destructible/cult/item_dispenser/archives/setup_options()

View File

@@ -12,7 +12,7 @@
icon_state = "forge"
light_range = 2
light_color = LIGHT_COLOR_LAVA
break_message = "<span class='warning'>The forge breaks apart into shards with a howling scream!</span>"
break_message = span_warning("The forge breaks apart into shards with a howling scream!")
mansus_conversion_path = /obj/structure/destructible/eldritch_crucible
/obj/structure/destructible/cult/item_dispenser/forge/setup_options()

View File

@@ -6,7 +6,7 @@
light_range = 1.5
light_color = COLOR_SOFT_RED
break_sound = 'sound/effects/glass/glassbr2.ogg'
break_message = "<span class='warning'>The blood-red crystal falls to the floor and shatters!</span>"
break_message = span_warning("The blood-red crystal falls to the floor and shatters!")
/// Length of the cooldown in between tile corruptions. Doubled if no turfs are found.
var/corruption_cooldown_duration = 5 SECONDS
/// The cooldown for corruptions.

View File

@@ -125,7 +125,7 @@
count++
if(members.len)
parts += "<span class='header'>The cultists were:</span>"
parts += span_header("The cultists were:")
if(length(true_cultists))
parts += printplayerlist(true_cultists)
else

View File

@@ -500,7 +500,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/turf/T = get_turf(src)
if(is_away_level(T.z))
to_chat(user, "<span class='cult italic'>You are not in the right dimension!</span>")
to_chat(user, span_cult_italic("You are not in the right dimension!"))
log_game("Teleport rune activated by [user] at [COORD(src)] failed - [user] is in away mission.")
fail_invoke()
return
@@ -849,37 +849,37 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated)
return
if(isnull(cultist_to_summon))
to_chat(user, "<span class='cult italic'>You require a summoning target!</span>")
to_chat(user, span_cult_italic("You require a summoning target!"))
fail_logmsg += "no target."
log_game(fail_logmsg)
fail_invoke()
return
if(cultist_to_summon.stat == DEAD)
to_chat(user, "<span class='cult italic'>[cultist_to_summon] has died!</span>")
to_chat(user, span_cult_italic("[cultist_to_summon] has died!"))
fail_logmsg += "target died."
log_game(fail_logmsg)
fail_invoke()
return
if(cultist_to_summon.pulledby || cultist_to_summon.buckled)
to_chat(user, "<span class='cult italic'>[cultist_to_summon] is being held in place!</span>")
to_chat(user, span_cult_italic("[cultist_to_summon] is being held in place!"))
fail_logmsg += "target restrained."
log_game(fail_logmsg)
fail_invoke()
return
if(!IS_CULTIST(cultist_to_summon))
to_chat(user, "<span class='cult italic'>[cultist_to_summon] is not a follower of the Geometer!</span>")
to_chat(user, span_cult_italic("[cultist_to_summon] is not a follower of the Geometer!"))
fail_logmsg += "target deconverted."
log_game(fail_logmsg)
fail_invoke()
return
if(is_away_level(cultist_to_summon.z))
to_chat(user, "<span class='cult italic'>[cultist_to_summon] is not in our dimension!</span>")
to_chat(user, span_cult_italic("[cultist_to_summon] is not in our dimension!"))
fail_logmsg += "target is in away mission."
log_game(fail_logmsg)
fail_invoke()
return
cultist_to_summon.visible_message(span_warning("[cultist_to_summon] suddenly disappears in a flash of red light!"), \
"<span class='cult italic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
span_cult_italic("<b>Overwhelming vertigo consumes you as you are hurled through the air!</b>"))
..()
visible_message(span_warning("A foggy shape materializes atop [src] and solidifies into [cultist_to_summon]!"))
var/turf/old_turf = get_turf(cultist_to_summon)
@@ -969,12 +969,12 @@ GLOBAL_VAR_INIT(narsie_summon_count, 0)
/obj/effect/rune/manifest/can_invoke(mob/living/user)
if(!(user in get_turf(src)))
to_chat(user, "<span class='cult italic'>You must be standing on [src]!</span>")
to_chat(user, span_cult_italic("You must be standing on [src]!"))
fail_invoke()
log_game("Manifest rune failed - user not standing on rune")
return list()
if(user.has_status_effect(/datum/status_effect/cultghost))
to_chat(user, "<span class='cult italic'>Ghosts can't summon more ghosts!</span>")
to_chat(user, span_cult_italic("Ghosts can't summon more ghosts!"))
fail_invoke()
log_game("Manifest rune failed - user is a ghost")
return list()

View File

@@ -43,8 +43,8 @@
. = ..()
/datum/antagonist/highlander/greet()
to_chat(owner, "<span class='boldannounce'>Your [sword.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>")
to_chat(owner, span_boldannounce("Your [sword.name] cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it."))
owner.announce_objectives()
@@ -88,8 +88,8 @@
name = "\improper highlander"
/datum/antagonist/highlander/robot/greet()
to_chat(owner, "<span class='boldannounce'>Your integrated claymore cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it.</span>")
to_chat(owner, span_boldannounce("Your integrated claymore cries out for blood. Claim the lives of others, and your own will be restored!\n\
Activate it in your hand, and it will lead to the nearest target. Attack the nuclear authentication disk with it, and you will store it."))
/datum/antagonist/highlander/robot/give_equipment()
var/mob/living/silicon/robot/robotlander = owner.current

View File

@@ -15,7 +15,7 @@
/datum/team/nuclear/roundend_report()
var/list/parts = list()
parts += "<span class='header'>[syndicate_name] Operatives:</span>"
parts += span_header("[syndicate_name] Operatives:")
switch(get_result())
if(NUKE_RESULT_FLUKE)
@@ -55,7 +55,7 @@
parts += "<span class='neutraltext big'>Neutral Victory</span>"
parts += "<B>Mission aborted!</B>"
var/text = "<br><span class='header'>The syndicate operatives were:</span>"
var/text = span_header("<br>The syndicate operatives were:")
var/purchases = ""
var/TC_uses = 0
LAZYINITLIST(GLOB.uplink_purchase_logs_by_key)

View File

@@ -147,7 +147,7 @@
O.update_explanation_text()
/datum/antagonist/obsessed/roundend_report_header()
return "<span class='header'>Someone became obsessed!</span><br>"
return span_header("Someone became obsessed!<br>")
/datum/antagonist/obsessed/roundend_report()
var/list/report = list()

View File

@@ -73,7 +73,7 @@
original_mind.quick_copy_all_memories(owner)
/datum/antagonist/paradox_clone/roundend_report_header()
return "<span class='header'>A paradox clone appeared on the station!</span><br>"
return span_header("A paradox clone appeared on the station!<br>")
/datum/outfit/paradox_clone
name = "Paradox Clone (Preview only)"

View File

@@ -104,7 +104,7 @@
/datum/team/pirate/roundend_report()
var/list/parts = list()
parts += "<span class='header'>Space Pirates were:</span>"
parts += span_header("Space Pirates were:")
var/all_dead = TRUE
for(var/datum/mind/M in members)

View File

@@ -584,19 +584,19 @@
if(headrevs.len)
var/list/headrev_part = list()
headrev_part += "<span class='header'>The head revolutionaries were:</span>"
headrev_part += span_header("The head revolutionaries were:")
headrev_part += printplayerlist(headrevs, !check_rev_victory())
result += headrev_part.Join("<br>")
if(revs.len)
var/list/rev_part = list()
rev_part += "<span class='header'>The revolutionaries were:</span>"
rev_part += span_header("The revolutionaries were:")
rev_part += printplayerlist(revs, !check_rev_victory())
result += rev_part.Join("<br>")
var/list/heads = SSjob.get_all_heads()
if(heads.len)
var/head_text = "<span class='header'>The heads of staff were:</span>"
var/head_text = span_header("The heads of staff were:")
head_text += "<ul class='playerlist'>"
for(var/datum/mind/head in heads)
var/target = (head in targets)

View File

@@ -256,7 +256,7 @@
parts += "<span class='redtext big'>The [name] has failed!</span>"
if(length(carp))
parts += "<br><span class='header'>The [name] was assisted by:</span>"
parts += span_header("<br>The [name] was assisted by:")
parts += "<ul class='playerlist'>"
var/list/players_to_carp_taken = list()
for(var/datum/mind/carpy as anything in carp)

View File

@@ -238,7 +238,7 @@
to_chat(user, span_userdanger("Your body is wracked with debilitating pain!"))
return ITEM_INTERACT_BLOCKING
user.visible_message("<span class='notice'>[user] holds [src] above [user.p_their()] head and forces it into [target_toolbox] with a flash of light!", \
user.visible_message(span_notice("[user] holds [src] above [user.p_their()] head and forces it into [target_toolbox] with a flash of light!"), \
span_notice("You hold [src] above your head briefly, then force it into [target_toolbox], transferring the [occupant]'s soul!"), ignored_mobs = occupant)
to_chat(occupant, span_userdanger("[user] holds you up briefly, then forces you into [target_toolbox]!"))
to_chat(occupant, span_deadsay("<b>Your eternal soul has been sacrificed to restore the soul of a toolbox. Them's the breaks!</b>"))
@@ -261,11 +261,11 @@
icon = 'icons/mob/shells.dmi'
icon_state = "construct_cult"
desc = "A wicked machine used by those skilled in magical arts. It is inactive."
var/extra_desc = {"<span class='cult'>A construct shell, used to house bound souls from a soulstone.\n
Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n
An <b>Artificer</b>, which can produce <b>more shells and soulstones</b>, as well as fortifications.\n
A <b>Wraith</b>, which does high damage and can jaunt through walls, though it is quite fragile.\n
A <b>Juggernaut</b>, which is very hard to kill and can produce temporary walls, but is slow.</span>"}
var/extra_desc = span_cult("A construct shell, used to house bound souls from a soulstone.\n\
Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n\
An <b>Artificer</b>, which can produce <b>more shells and soulstones</b>, as well as fortifications.\n\
A <b>Wraith</b>, which does high damage and can jaunt through walls, though it is quite fragile.\n\
A <b>Juggernaut</b>, which is very hard to kill and can produce temporary walls, but is slow.")
/obj/structure/constructshell/examine(mob/user)
. = ..()

View File

@@ -443,10 +443,10 @@ GLOBAL_LIST_EMPTY(wizard_spellbook_purchases_by_key)
/datum/team/wizard/roundend_report()
var/list/parts = list()
parts += "<span class='header'>Wizards/witches of [master_wizard.owner.name] team were:</span>"
parts += span_header("Wizards/witches of [master_wizard.owner.name] team were:")
parts += master_wizard.roundend_report()
parts += " "
parts += "<span class='header'>[master_wizard.owner.name] apprentices and minions were:</span>"
parts += span_header("[master_wizard.owner.name] apprentices and minions were:")
parts += printplayerlist(members - master_wizard.owner)
return "<div class='panel redborder'>[parts.Join("<br>")]</div>"

View File

@@ -11,7 +11,7 @@
//Simply lists them.
/datum/team/xeno/roundend_report()
var/list/parts = list()
parts += "<span class='header'>The [name] were:</span>"
parts += span_header("The [name] were:")
parts += printplayerlist(members)
return "<div class='panel redborder'>[parts.Join("<br>")]</div>"
@@ -109,7 +109,7 @@
var/escape_count = 0 //counts the number of xenomorphs that were born in captivity who ended the round outside of it
var/captive_count = 0 //counts the number of xenomorphs born in captivity who remained there until the end of the round (losers)
parts += "<span class='header'>The [name] were:</span> <br>"
parts += span_header("The [name] were: <br>")
if(check_captivity(progenitor.current) == CAPTIVE_XENO_PASS)
parts += span_greentext("The progenitor of this hive was [progenitor.key], as [progenitor], who successfully escaped captivity!") + "<br>"

View File

@@ -58,7 +58,7 @@
//do the pulse & the scan
pulse()
audible_message("<span class='infoplain'>[icon2html(src, hearers(src))] *beep* *beep* *beep*</span>")
audible_message(span_infoplain("[icon2html(src, hearers(src))] *beep* *beep* *beep*"))
playsound(src, 'sound/machines/beep/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
toggle_scan()

View File

@@ -92,7 +92,7 @@
return FALSE
next_activate = world.time + (3 SECONDS) // this must happen before anything else
pulse()
audible_message("<span class='infoplain'>[icon2html(src, hearers(src))] *beep* *beep* *beep*</span>", null, hearing_range)
audible_message(span_infoplain("[icon2html(src, hearers(src))] *beep* *beep* *beep*"), null, hearing_range)
for(var/mob/hearing_mob in get_hearers_in_view(hearing_range, src))
hearing_mob.playsound_local(get_turf(src), 'sound/machines/beep/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)

View File

@@ -169,7 +169,7 @@
last_receive_signal_log = istype(holder, /obj/item/transfer_valve) ? signal.logging_data : null
pulse()
audible_message("<span class='infoplain'>[icon2html(src, hearers(src))] *beep* *beep* *beep*</span>", null, hearing_range)
audible_message(span_infoplain("[icon2html(src, hearers(src))] *beep* *beep* *beep*"), null, hearing_range)
for(var/mob/hearing_mob in get_hearers_in_view(hearing_range, src))
hearing_mob.playsound_local(get_turf(src), 'sound/machines/beep/triple_beep.ogg', ASSEMBLY_BEEP_VOLUME, TRUE)
return TRUE

View File

@@ -125,7 +125,7 @@
if (unreceived.len)
if (unreceived.len >= ASSET_CACHE_TELL_CLIENT_AMOUNT)
to_chat(client, "<span class='infoplain'>Sending Resources...</span>")
to_chat(client, span_infoplain("Sending Resources..."))
for (var/asset_name in unreceived)
var/new_asset_name = asset_name

View File

@@ -19,7 +19,7 @@
if (!what_to_change)
return
save_flag ^= options[what_to_change]
to_chat(builder, "<span class='notice'>[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"].</span>")
to_chat(builder, span_notice("[what_to_change] is now [save_flag & options[what_to_change] ? "ENABLED" : "DISABLED"]."))
/datum/buildmode_mode/map_export/show_help(client/builder)
to_chat(builder, span_purple(examine_block(

View File

@@ -254,7 +254,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC
// Check if the list is empty
if(!length(players))
// Express that there are no players we can ignore in chat
to_chat(src, "<span class='infoplain'>There are no other players you can ignore!</span>")
to_chat(src, span_infoplain("There are no other players you can ignore!"))
// Stop running
return
@@ -275,7 +275,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC
// Check if the selected player is on our ignore list
if(selection in prefs.ignoring)
// Express that the selected player is already on our ignore list in chat
to_chat(src, "<span class='infoplain'>You are already ignoring [selection]!</span>")
to_chat(src, span_infoplain("You are already ignoring [selection]!"))
// Stop running
return
@@ -287,7 +287,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC
prefs.save_preferences()
// Express that we've ignored the selected player in chat
to_chat(src, "<span class='infoplain'>You are now ignoring [selection] on the OOC channel.</span>")
to_chat(src, span_infoplain("You are now ignoring [selection] on the OOC channel."))
// Unignore verb
/client/verb/select_unignore()
@@ -298,7 +298,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC
// Check if we've ignored any players
if(!length(prefs.ignoring))
// Express that we haven't ignored any players in chat
to_chat(src, "<span class='infoplain'>You haven't ignored any players!</span>")
to_chat(src, span_infoplain("You haven't ignored any players!"))
// Stop running
return
@@ -313,7 +313,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC
// Check if the selected player is not on our ignore list
if(!(selection in prefs.ignoring))
// Express that the selected player is not on our ignore list in chat
to_chat(src, "<span class='infoplain'>You are not ignoring [selection]!</span>")
to_chat(src, span_infoplain("You are not ignoring [selection]!"))
// Stop running
return
@@ -325,7 +325,7 @@ ADMIN_VERB(reset_ooc_color, R_FUN, "Reset Player OOC Color", "Returns player OOC
prefs.save_preferences()
// Express that we've unignored the selected player in chat
to_chat(src, "<span class='infoplain'>You are no longer ignoring [selection] on the OOC channel.</span>")
to_chat(src, span_infoplain("You are no longer ignoring [selection] on the OOC channel."))
/client/proc/show_previous_roundend_report()
set name = "Your Last Round"

View File

@@ -67,7 +67,7 @@
msg += "</tr></table>"
msg += "<b>Total Players: [length(Lines)]</b>"
to_chat(src, "<span class='infoplain'>[msg]</span>")
to_chat(src, span_infoplain("[msg]"))
/client/verb/adminwho()
set category = "Admin"

View File

@@ -53,7 +53,7 @@
/obj/item/gas_filter/examine(mob/user)
. = ..()
. += "<span class='notice'>[src] is at <b>[filter_status]%</b> durability.</span>"
. += span_notice("[src] is at <b>[filter_status]%</b> durability.")
/**
* called by the gas mask where the filter is installed, lower the filter_status depending on the breath gas composition and by the strength of the filter

View File

@@ -104,9 +104,9 @@ GLOBAL_LIST_INIT(high_priority_sentience, typecacheof(list(
spawned_mobs += selected
to_chat(selected, span_userdanger("Hello world!"))
to_chat(selected, "<span class='warning'>Due to freak radiation and/or chemicals \
to_chat(selected, span_warning("Due to freak radiation and/or chemicals \
and/or lucky chance, you have gained human level intelligence \
and the ability to speak and understand human language!</span>")
and the ability to speak and understand human language!"))
return SUCCESSFUL_SPAWN

View File

@@ -361,7 +361,7 @@
/datum/chemical_reaction/drink/bacchus_blessing
results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4)
required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1)
mix_message = "<span class='warning'>The mixture turns to a sickening froth.</span>"
mix_message = span_warning("The mixture turns to a sickening froth.")
/datum/chemical_reaction/drink/eggnog
results = list(/datum/reagent/consumable/ethanol/eggnog = 15)

View File

@@ -5,8 +5,8 @@
skill_name = "True Strength"
skill_description = "The knowledge and strength to resolve the most ancient conumdrum; what happens when an unstoppable force meets an immovable object."
skill_icon = "dumbbell"
activate_message = "<span class='notice'>You realise if you apply the correct force, at the correct angle, it is possible to make the immovable permanently movable. And... damn, you look huge.</span>"
deactivate_message = "<span class='notice'>You forget how to permanently anchor a paradoxical object. Also, you should really hit the gym...</span>"
activate_message = span_notice("You realise if you apply the correct force, at the correct angle, it is possible to make the immovable permanently movable. And... damn, you look huge.")
deactivate_message = span_notice("You forget how to permanently anchor a paradoxical object. Also, you should really hit the gym...")
chip_category = SKILLCHIP_CATEGORY_GENERAL
skillchip_flags = NONE
slot_use = 1

View File

@@ -4,8 +4,8 @@
skill_name = "Close Quarters Cooking"
skill_description = "A specialised form of self defence, developed by skilled sous-chef de cuisines. No man fights harder than a chef to defend his kitchen."
skill_icon = "utensils"
activate_message = "<span class='notice'>You can visualize how to defend your kitchen with martial arts.</span>"
deactivate_message = "<span class='notice'>You forget how to control your muscles to execute kicks, slams and restraints while in a kitchen environment.</span>"
activate_message = span_notice("You can visualize how to defend your kitchen with martial arts.")
deactivate_message = span_notice("You forget how to control your muscles to execute kicks, slams and restraints while in a kitchen environment.")
/// The Chef CQC given by the skillchip.
var/datum/martial_art/cqc/under_siege/style

View File

@@ -5,5 +5,5 @@
skill_name = "Supermatter Cognition Theory"
skill_description = "Understand the correct mental patterns to keep in mind around matter in a hyperfractal state, causing immunity to visions and making the matter in question \"calmer\"."
skill_icon = "spa"
activate_message = "<span class='notice'>You start thinking in patterns that will render you immune to visions from, and act as a calming influence for, matter in a hyperfractal state.</span>"
deactivate_message = "<span class='notice'>Your thoughts become more disordered and jumbled. You are no longer immune to the abyss.</span>"
activate_message = span_notice("You start thinking in patterns that will render you immune to visions from, and act as a calming influence for, matter in a hyperfractal state.")
deactivate_message = span_notice("Your thoughts become more disordered and jumbled. You are no longer immune to the abyss.")

View File

@@ -5,5 +5,5 @@
skill_name = "Cyborg Circuitry"
skill_description = "Recognise cyborg wire layouts and understand their functionality at a glance."
skill_icon = "sitemap"
activate_message = "<span class='notice'>You suddenly comprehend the secrets behind cyborg circuitry.</span>"
deactivate_message = "<span class='notice'>Cyborg circuitry stops making sense as images of coloured wires fade from your mind.</span>"
activate_message = span_notice("You suddenly comprehend the secrets behind cyborg circuitry.")
deactivate_message = span_notice("Cyborg circuitry stops making sense as images of coloured wires fade from your mind.")

View File

@@ -5,5 +5,5 @@
skill_name = "Engineering Circuitry"
skill_description = "Recognise airlock and APC wire layouts and understand their functionality at a glance."
skill_icon = "sitemap"
activate_message = "<span class='notice'>You suddenly comprehend the secrets behind airlock and APC circuitry.</span>"
deactivate_message = "<span class='notice'>Airlock and APC circuitry stops making sense as images of coloured wires fade from your mind.</span>"
activate_message = span_notice("You suddenly comprehend the secrets behind airlock and APC circuitry.")
deactivate_message = span_notice("Airlock and APC circuitry stops making sense as images of coloured wires fade from your mind.")

View File

@@ -377,8 +377,8 @@
skill_name = "Underwater Basketweaving"
skill_description = "Master intricate art of using twine to create perfect baskets while submerged."
skill_icon = "shopping-basket"
activate_message = "<span class='notice'>You're one with the twine and the sea.</span>"
deactivate_message = "<span class='notice'>Higher mysteries of underwater basketweaving leave your mind.</span>"
activate_message = span_notice("You're one with the twine and the sea.")
deactivate_message = span_notice("Higher mysteries of underwater basketweaving leave your mind.")
/obj/item/skillchip/wine_taster
name = "WINE skillchip"
@@ -387,8 +387,8 @@
skill_name = "Wine Tasting"
skill_description = "Recognize wine vintage from taste alone. Never again lack an opinion when presented with an unknown drink."
skill_icon = "wine-bottle"
activate_message = "<span class='notice'>You recall wine taste.</span>"
deactivate_message = "<span class='notice'>Your memories of wine evaporate.</span>"
activate_message = span_notice("You recall wine taste.")
deactivate_message = span_notice("Your memories of wine evaporate.")
/obj/item/skillchip/bonsai
name = "Hedge 3 skillchip"
@@ -396,16 +396,16 @@
skill_name = "Hedgetrimming"
skill_description = "Trim hedges and potted plants into marvelous new shapes with any old knife. Not applicable to plastic plants."
skill_icon = "spa"
activate_message = "<span class='notice'>Your mind is filled with plant arrangments.</span>"
deactivate_message = "<span class='notice'>You can't remember what a hedge looks like anymore.</span>"
activate_message = span_notice("Your mind is filled with plant arrangments.")
deactivate_message = span_notice("You can't remember what a hedge looks like anymore.")
/obj/item/skillchip/useless_adapter
name = "Skillchip adapter"
skill_name = "Useless adapter"
skill_description = "Allows you to insert another skillchip into this adapter after it has been inserted into your brain..."
skill_icon = "plug"
activate_message = "<span class='notice'>You can now activate another chip through this adapter, but you're not sure why you did this...</span>"
deactivate_message = "<span class='notice'>You no longer have the useless skillchip adapter.</span>"
activate_message = span_notice("You can now activate another chip through this adapter, but you're not sure why you did this...")
deactivate_message = span_notice("You no longer have the useless skillchip adapter.")
skillchip_flags = SKILLCHIP_ALLOWS_MULTIPLE
// Literally does nothing.
complexity = 0
@@ -417,8 +417,8 @@
skill_name = "Lightbulb Removing"
skill_description = "Stop failing taking out lightbulbs today, no gloves needed!"
skill_icon = "lightbulb"
activate_message = "<span class='notice'>Your feel like your pain receptors are less sensitive to hot objects.</span>"
deactivate_message = "<span class='notice'>You feel like hot objects could stop you again...</span>"
activate_message = span_notice("Your feel like your pain receptors are less sensitive to hot objects.")
deactivate_message = span_notice("You feel like hot objects could stop you again...")
/obj/item/skillchip/disk_verifier
name = "K33P-TH4T-D15K skillchip"
@@ -426,8 +426,8 @@
skill_name = "Nuclear Disk Verification"
skill_description = "Nuclear authentication disks have an extremely long serial number for verification. This skillchip stores that number, which allows the user to automatically spot forgeries."
skill_icon = "save"
activate_message = "<span class='notice'>You feel your mind automatically verifying long serial numbers on disk shaped objects.</span>"
deactivate_message = "<span class='notice'>The innate recognition of absurdly long disk-related serial numbers fades from your mind.</span>"
activate_message = span_notice("You feel your mind automatically verifying long serial numbers on disk shaped objects.")
deactivate_message = span_notice("The innate recognition of absurdly long disk-related serial numbers fades from your mind.")
/obj/item/skillchip/entrails_reader
name = "3NTR41LS skillchip"
@@ -435,8 +435,8 @@
skill_name = "Entrails Reader"
skill_description = "Be able to learn about a person's life, by looking at their internal organs. Not to be confused with looking into the future."
skill_icon = "lungs"
activate_message = "<span class='notice'>You feel that you know a lot about interpreting organs.</span>"
deactivate_message = "<span class='notice'>Knowledge of liver damage, heart strain and lung scars fades from your mind.</span>"
activate_message = span_notice("You feel that you know a lot about interpreting organs.")
deactivate_message = span_notice("Knowledge of liver damage, heart strain and lung scars fades from your mind.")
/obj/item/skillchip/appraiser
name = "GENUINE ID Appraisal Now! skillchip"

View File

@@ -39,8 +39,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list(
/obj/item/stack/marker_beacon/examine(mob/user)
. = ..()
. += "<span class='notice'>Use in-hand to place a [singular_name].\n"+\
"Alt-click to select a color. Current color is [picked_color].</span>"
. += span_notice("Use in-hand to place a [singular_name].\nAlt-click to select a color. Current color is [picked_color].")
/obj/item/stack/marker_beacon/update_icon_state()
icon_state = "[initial(icon_state)][LOWER_TEXT(picked_color)]"

View File

@@ -126,7 +126,7 @@
"<span class='notice'> - Going to the main station in search of materials.</span>\n"+\
"<span class='notice'> - Interacting with non-drone players outside KS13, dead or alive.</span>\n"+\
"<span class='warning'>These rules are at admin discretion and will be heavily enforced.</span>\n"+\
"<span class='warning'><u>If you do not have the regular drone laws, follow your laws to the best of your ability.</u></span>"
span_warning("<u>If you do not have the regular drone laws, follow your laws to the best of your ability.</u>")
shy = FALSE
/mob/living/basic/drone/derelict/Initialize(mapload)

View File

@@ -11,17 +11,17 @@ GLOBAL_VAR(posibrain_notify_cooldown)
braintype = "Android"
///Message sent to the user when polling ghosts
var/begin_activation_message = "<span class='notice'>You carefully locate the manual activation switch and start the positronic brain's boot process.</span>"
var/begin_activation_message = span_notice("You carefully locate the manual activation switch and start the positronic brain's boot process.")
///Message sent as a visible message on success
var/success_message = "<span class='notice'>The positronic brain pings, and its lights start flashing. Success!</span>"
var/success_message = span_notice("The positronic brain pings, and its lights start flashing. Success!")
///Message sent as a visible message on failure
var/fail_message = "<span class='notice'>The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?</span>"
var/fail_message = span_notice("The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
///Visible message sent when a player possesses the brain
var/new_mob_message = "<span class='notice'>The positronic brain chimes quietly.</span>"
var/new_mob_message = span_notice("The positronic brain chimes quietly.")
///Examine message when the posibrain has no mob
var/dead_message = "<span class='deadsay'>It appears to be completely inactive. The reset light is blinking.</span>"
var/dead_message = span_deadsay("It appears to be completely inactive. The reset light is blinking.")
///Examine message when the posibrain cannot poll ghosts due to cooldown
var/recharge_message = "<span class='warning'>The positronic brain isn't ready to activate again yet! Give it some time to recharge.</span>"
var/recharge_message = span_warning("The positronic brain isn't ready to activate again yet! Give it some time to recharge.")
///Can be set to tell ghosts what the brain will be used for
var/ask_role = ""

View File

@@ -219,15 +219,15 @@
adjustStaminaLoss(35)
throw_at(shovetarget, 4, 2, user, force = MOVE_FORCE_OVERPOWERING)
log_combat(user, src, "shoved")
visible_message("<span class='danger'>[user] tackles [src] down!</span>", \
"<span class='userdanger'>[user] shoves you with great force!</span>", "<span class='hear'>You hear aggressive shuffling followed by a loud thud!</span>", null, user)
to_chat(user, "<span class='danger'>You shove [src] with great force!</span>")
visible_message(span_danger("[user] tackles [src] down!"), \
span_userdanger("[user] shoves you with great force!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), null, user)
to_chat(user, span_danger("You shove [src] with great force!"))
else
Paralyze(5 SECONDS)
playsound(loc, 'sound/items/weapons/punch3.ogg', 25, TRUE, -1)
visible_message("<span class='danger'>[user] slams [src] into the floor!</span>", \
"<span class='userdanger'>[user] slams you into the ground!</span>", "<span class='hear'>You hear something slam loudly onto the floor!</span>", null, user)
to_chat(user, "<span class='danger'>You slam [src] into the floor beneath you!</span>")
visible_message(span_danger("[user] slams [src] into the floor!"), \
span_userdanger("[user] slams you into the ground!"), span_hear("You hear something slam loudly onto the floor!"), null, user)
to_chat(user, span_danger("You slam [src] into the floor beneath you!"))
log_combat(user, src, "slammed into the ground")
return TRUE

View File

@@ -462,16 +462,13 @@
if(!can_swap(dupe)) //sanity check
return
if(M.current.stat == CONSCIOUS)
M.current.visible_message("<span class='notice'>[M.current] \
stops moving and starts staring vacantly into space.</span>",
M.current.visible_message(span_notice("[M.current] stops moving and starts staring vacantly into space."),
span_notice("You stop moving this body..."))
else
to_chat(M.current, span_notice("You abandon this body..."))
M.current.transfer_quirk_datums(dupe)
M.transfer_to(dupe)
dupe.visible_message("<span class='notice'>[dupe] blinks and looks \
around.</span>",
span_notice("...and move this one instead."))
dupe.visible_message(span_notice("[dupe] blinks and looks around."), span_notice("...and move this one instead."))
///////////////////////////////////LUMINESCENTS//////////////////////////////////////////

View File

@@ -525,7 +525,7 @@
if(!..())
return FALSE
log_message("points at [pointing_at]", LOG_EMOTE)
visible_message("<span class='infoplain'>[span_name("[src]")] points at [pointing_at].</span>", span_notice("You point at [pointing_at]."))
visible_message(span_infoplain("[span_name("[src]")] points at [pointing_at]."), span_notice("You point at [pointing_at]."))
/mob/living/verb/succumb(whispered as num|null)
set hidden = TRUE
@@ -1789,13 +1789,13 @@ GLOBAL_LIST_EMPTY(fire_appearances)
// used by secbot and monkeys Crossed
/mob/living/proc/knockOver(mob/living/carbon/C)
if(C.key) //save us from monkey hordes
C.visible_message("<span class='warning'>[pick( \
C.visible_message(span_warning(pick( \
"[C] dives out of [src]'s way!", \
"[C] stumbles over [src]!", \
"[C] jumps out of [src]'s path!", \
"[C] trips over [src] and falls!", \
"[C] topples over [src]!", \
"[C] leaps out of [src]'s way!")]</span>")
"[C] leaps out of [src]'s way!")))
C.Paralyze(40)
/mob/living/can_be_pulled()

View File

@@ -755,8 +755,8 @@
/obj/item/robot_model/peacekeeper/do_transform_animation()
..()
to_chat(loc, "<span class='userdanger'>Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
You are not a security member and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.</span>")
to_chat(loc, span_userdanger("Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \
You are not a security member and you are expected to follow orders and prevent harm above all else. Space law means nothing to you."))
/obj/item/robot_model/security
name = "Security"
@@ -779,8 +779,8 @@
/obj/item/robot_model/security/do_transform_animation()
..()
to_chat(loc, "<span class='userdanger'>While you have picked the security model, you still have to follow your laws, NOT Space Law. \
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.</span>")
to_chat(loc, span_userdanger("While you have picked the security model, you still have to follow your laws, NOT Space Law. \
For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to."))
/obj/item/robot_model/security/respawn_consumable(mob/living/silicon/robot/cyborg, coeff = 1)
..()

View File

@@ -117,8 +117,8 @@
if(client) //Player bots do not have modes, thus the override. Also an easy way for PDA users/AI to know when a bot is a player.
return paicard ? "<b>pAI Controlled</b>" : "<b>Autonomous</b>"
if(!(bot_mode_flags & BOT_MODE_ON))
return "<span class='bad'>Inactive</span>"
return "<span class='average'>[mode]</span>"
return span_bad("Inactive")
return span_average("[mode]")
/**
* Returns a status string about the bot's current status, if it's moving, manually controlled, or idle.

View File

@@ -111,28 +111,28 @@ Difficulty: Hard
name = "Blink To Target"
button_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "sniper_zoom"
chosen_message = "<span class='colossus'>You are now blinking to your target.</span>"
chosen_message = span_colossus("You are now blinking to your target.")
chosen_attack_num = 1
/datum/action/innate/megafauna_attack/chaser_swarm
name = "Chaser Swarm"
button_icon = 'icons/effects/effects.dmi'
button_icon_state = "hierophant_squares_indefinite"
chosen_message = "<span class='colossus'>You are firing a chaser swarm at your target.</span>"
chosen_message = span_colossus("You are firing a chaser swarm at your target.")
chosen_attack_num = 2
/datum/action/innate/megafauna_attack/cross_blasts
name = "Cross Blasts"
button_icon = 'icons/effects/effects.dmi'
button_icon_state = "hierophant_blast_indefinite"
chosen_message = "<span class='colossus'>You are now firing cross blasts at your target.</span>"
chosen_message = span_colossus("You are now firing cross blasts at your target.")
chosen_attack_num = 3
/datum/action/innate/megafauna_attack/blink_spam
name = "Blink Chase"
button_icon = 'icons/obj/mining_zones/artefacts.dmi'
button_icon_state = "hierophant_club_ready_beacon"
chosen_message = "<span class='colossus'>You are now repeatedly blinking at your target.</span>"
chosen_message = span_colossus("You are now repeatedly blinking at your target.")
chosen_attack_num = 4
/mob/living/simple_animal/hostile/megafauna/hierophant/update_cooldowns(list/cooldown_updates, ignore_staggered = FALSE)

View File

@@ -353,7 +353,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
to_chat(mychild, "<b>Your max health has been halved, but can now heal by standing on your tumor. Note, it's your only way to heal.\n\
Bear in mind, if anyone interacts with your tumor, you'll be resummoned here to carry out another fight. In such a case, you will regain your full max health.\n\
Also, be weary of your fellow inhabitants, they likely won't be happy to see you!</b>")
to_chat(mychild, "<span class='big bold'>Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!</span>")
to_chat(mychild, span_boldbig("Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!"))
/obj/item/tumor_shard
name = "tumor shard"
@@ -380,8 +380,8 @@ While using this makes the system rely on OnFire, it still gives options for tim
E.revive(HEAL_ALL)
user.visible_message(span_notice("[user] stabs [E] with [src], reviving it."))
E.playsound_local(get_turf(E), 'sound/effects/magic.ogg', 40, 0)
to_chat(E, "<span class='userdanger'>You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk.</span>")
to_chat(E, "<span class='big bold'>Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!</span>")
to_chat(E, span_userdanger("You have been revived by [user]. While you can't speak to them, you owe [user] a great debt. Assist [user.p_them()] in achieving [user.p_their()] goals, regardless of risk."))
to_chat(E, span_boldbig("Note that you now share the loyalties of [user]. You are expected not to intentionally sabotage their faction unless commanded to!"))
E.maxHealth = E.maxHealth * 0.4
E.health = E.maxHealth
E.desc = "[E.desc] However, this one appears to be less wild in nature, and calmer around people."

View File

@@ -60,25 +60,25 @@
/datum/action/innate/elite_attack/tentacle_patch
name = "Tentacle Patch"
button_icon_state = "tentacle_patch"
chosen_message = "<span class='boldwarning'>You are now attacking with a patch of tentacles.</span>"
chosen_message = span_boldwarning("You are now attacking with a patch of tentacles.")
chosen_attack_num = TENTACLE_PATCH
/datum/action/innate/elite_attack/spawn_children
name = "Spawn Children"
button_icon_state = "spawn_children"
chosen_message = "<span class='boldwarning'>You will spawn two children at your location to assist you in combat. You can have up to 8.</span>"
chosen_message = span_boldwarning("You will spawn two children at your location to assist you in combat. You can have up to 8.")
chosen_attack_num = SPAWN_CHILDREN
/datum/action/innate/elite_attack/rage
name = "Rage"
button_icon_state = "rage"
chosen_message = "<span class='boldwarning'>You will temporarily increase your movement speed.</span>"
chosen_message = span_boldwarning("You will temporarily increase your movement speed.")
chosen_attack_num = RAGE
/datum/action/innate/elite_attack/call_children
name = "Call Children"
button_icon_state = "call_children"
chosen_message = "<span class='boldwarning'>You will summon your children to your location.</span>"
chosen_message = span_boldwarning("You will summon your children to your location.")
chosen_attack_num = CALL_CHILDREN
/mob/living/simple_animal/hostile/asteroid/elite/broodmother/OpenFire()

View File

@@ -72,25 +72,25 @@
/datum/action/innate/elite_attack/herald_trishot
name = "Triple Shot"
button_icon_state = "herald_trishot"
chosen_message = "<span class='boldwarning'>You are now firing three shots in your chosen direction.</span>"
chosen_message = span_boldwarning("You are now firing three shots in your chosen direction.")
chosen_attack_num = HERALD_TRISHOT
/datum/action/innate/elite_attack/herald_directionalshot
name = "Circular Shot"
button_icon_state = "herald_directionalshot"
chosen_message = "<span class='boldwarning'>You are firing projectiles in all directions.</span>"
chosen_message = span_boldwarning("You are firing projectiles in all directions.")
chosen_attack_num = HERALD_DIRECTIONALSHOT
/datum/action/innate/elite_attack/herald_teleshot
name = "Teleport Shot"
button_icon_state = "herald_teleshot"
chosen_message = "<span class='boldwarning'>You will now fire a shot which teleports you where it lands.</span>"
chosen_message = span_boldwarning("You will now fire a shot which teleports you where it lands.")
chosen_attack_num = HERALD_TELESHOT
/datum/action/innate/elite_attack/herald_mirror
name = "Summon Mirror"
button_icon_state = "herald_mirror"
chosen_message = "<span class='boldwarning'>You will spawn a mirror which duplicates your attacks.</span>"
chosen_message = span_boldwarning("You will spawn a mirror which duplicates your attacks.")
chosen_attack_num = HERALD_MIRROR
/mob/living/simple_animal/hostile/asteroid/elite/herald/OpenFire()

View File

@@ -55,25 +55,25 @@
/datum/action/innate/elite_attack/legionnaire_charge
name = "Legionnaire Charge"
button_icon_state = "legionnaire_charge"
chosen_message = "<span class='boldwarning'>You will attempt to grab your opponent and throw them.</span>"
chosen_message = span_boldwarning("You will attempt to grab your opponent and throw them.")
chosen_attack_num = LEGIONNAIRE_CHARGE
/datum/action/innate/elite_attack/head_detach
name = "Release Head"
button_icon_state = "head_detach"
chosen_message = "<span class='boldwarning'>You will now detach your head or kill it if it is already released.</span>"
chosen_message = span_boldwarning("You will now detach your head or kill it if it is already released.")
chosen_attack_num = HEAD_DETACH
/datum/action/innate/elite_attack/bonfire_teleport
name = "Bonfire Teleport"
button_icon_state = "bonfire_teleport"
chosen_message = "<span class='boldwarning'>You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it.</span>"
chosen_message = span_boldwarning("You will leave a bonfire. Second use will let you swap positions with it indefintiely. Using this move on the same tile as your active bonfire removes it.")
chosen_attack_num = BONFIRE_TELEPORT
/datum/action/innate/elite_attack/spew_smoke
name = "Spew Smoke"
button_icon_state = "spew_smoke"
chosen_message = "<span class='boldwarning'>Your head will spew smoke in an area, wherever it may be.</span>"
chosen_message = span_boldwarning("Your head will spew smoke in an area, wherever it may be.")
chosen_attack_num = SPEW_SMOKE
/mob/living/simple_animal/hostile/asteroid/elite/legionnaire/OpenFire()

View File

@@ -51,25 +51,25 @@
/datum/action/innate/elite_attack/singular_shot
name = "Singular Shot"
button_icon_state = "singular_shot"
chosen_message = "<span class='boldwarning'>You are now creating a single linear magic square.</span>"
chosen_message = span_boldwarning("You are now creating a single linear magic square.")
chosen_attack_num = SINGULAR_SHOT
/datum/action/innate/elite_attack/magic_box
name = "Magic Box"
button_icon_state = "magic_box"
chosen_message = "<span class='boldwarning'>You are now attacking with a box of magic squares.</span>"
chosen_message = span_boldwarning("You are now attacking with a box of magic squares.")
chosen_attack_num = MAGIC_BOX
/datum/action/innate/elite_attack/pandora_teleport
name = "Line Teleport"
button_icon_state = "pandora_teleport"
chosen_message = "<span class='boldwarning'>You will now teleport to your target.</span>"
chosen_message = span_boldwarning("You will now teleport to your target.")
chosen_attack_num = PANDORA_TELEPORT
/datum/action/innate/elite_attack/aoe_squares
name = "AOE Blast"
button_icon_state = "aoe_squares"
chosen_message = "<span class='boldwarning'>Your attacks will spawn an AOE blast at your target location.</span>"
chosen_message = span_boldwarning("Your attacks will spawn an AOE blast at your target location.")
chosen_attack_num = AOE_SQUARES
/mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire()

View File

@@ -561,7 +561,7 @@
if(isliving(hunted)) // Are we hunting a living mob?
var/mob/living/prey = hunted
if(inept_hunter) // Make your hunter inept to have them unable to catch their prey.
visible_message("<span class='warning'>[src] chases [prey] around, to no avail!</span>")
visible_message(span_warning("[src] chases [prey] around, to no avail!"))
step(prey, pick(GLOB.cardinals))
COOLDOWN_START(src, emote_cooldown, 1 MINUTES)
return

View File

@@ -281,7 +281,7 @@
var/raw_msg = message
if(visible_message_flags & EMOTE_MESSAGE)
message = "<span class='emote'><b>[src]</b> [message]</span>"
message = span_emote("<b>[src]</b> [message]")
for(var/mob/M in hearers)
if(!M.client)
@@ -318,7 +318,7 @@
var/raw_self_message = self_message
var/self_runechat = FALSE
if(visible_message_flags & EMOTE_MESSAGE)
self_message = "<span class='emote'><b>[src]</b> [self_message]</span>" // May make more sense as "You do x"
self_message = span_emote("<b>[src]</b> [self_message]") // May make more sense as "You do x"
if(visible_message_flags & ALWAYS_SHOW_SELF_MESSAGE)
to_chat(src, self_message)
@@ -348,7 +348,7 @@
hearers -= src
var/raw_msg = message
if(audible_message_flags & EMOTE_MESSAGE)
message = "<span class='emote'><b>[src]</b> [message]</span>"
message = span_emote("<b>[src]</b> [message]")
for(var/mob/M in hearers)
if(audible_message_flags & EMOTE_MESSAGE && runechat_prefs_check(M, audible_message_flags) && M.can_hear())
M.create_chat_message(src, raw_message = raw_msg, runechat_flags = audible_message_flags)
@@ -372,7 +372,7 @@
var/raw_self_message = self_message
var/self_runechat = FALSE
if(audible_message_flags & EMOTE_MESSAGE)
self_message = "<span class='emote'><b>[src]</b> [self_message]</span>"
self_message = span_emote("<b>[src]</b> [self_message]")
if(audible_message_flags & ALWAYS_SHOW_SELF_MESSAGE)
to_chat(src, self_message)
self_runechat = TRUE

Some files were not shown because too many files have changed in this diff Show More