diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 015ffa36a92..1728a95430d 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -365,7 +365,7 @@ If it gains pressure too slowly, it may leak or just rupture instead of explodin var/total_combustables = (total_fuel + total_oxidizers) var/active_combustables = (FIRE_REACTION_OXIDIZER_AMOUNT/FIRE_REACTION_FUEL_AMOUNT + 1)*reaction_limit - if(total_combustables > 0) + if(total_combustables > 0 && total_moles > 0) //slows down the burning when the concentration of the reactants is low var/damping_multiplier = min(1, active_combustables / (total_moles/group_multiplier)) diff --git a/code/__defines/admin_vr.dm b/code/__defines/admin_vr.dm index cdbc8c023d0..01226df1bd8 100644 --- a/code/__defines/admin_vr.dm +++ b/code/__defines/admin_vr.dm @@ -7,8 +7,10 @@ #define MODIFIY_ROBOT_MODULE_ADD "Add a Module" #define MODIFIY_ROBOT_MODULE_REMOVE "Remove a Module" #define MODIFIY_ROBOT_APPLY_UPGRADE "Apply an Upgrade" +#define MODIFIY_ROBOT_SUPP_ADD "Add Upgrade Support" +#define MODIFIY_ROBOT_SUPP_REMOVE "Remove Upgrade Support" #define MODIFIY_ROBOT_RADIOC_ADD "Add a Radio Channel" #define MODIFIY_ROBOT_RADIOC_REMOVE "Remove a Radio Channel" #define MODIFIY_ROBOT_COMP_ADD "Replace a Component" #define MODIFIY_ROBOT_COMP_REMOVE "Remove a Component" -#define MODIFIY_ROBOT_RESET_MODULE "Fully Resets a Robot Module" +#define MODIFIY_ROBOT_RESET_MODULE "Fully Reset Robot Module" diff --git a/code/__defines/exosuit_fab.dm b/code/__defines/exosuit_fab.dm index ccb05b93744..030c324cd31 100644 --- a/code/__defines/exosuit_fab.dm +++ b/code/__defines/exosuit_fab.dm @@ -1,15 +1,30 @@ + +/// Module is compatible with All Cyborg models, utility upgrades +#define BORG_UTILITY (1<<0) +/// Module is compatible with All Cyborg models, basic upgrades +#define BORG_BASIC (1<<1) +/// Module is compatible with All Cyborg models, advanced upgrades +#define BORG_ADVANCED (1<<2) /// Module is compatible with Security Cyborg models -#define BORG_MODULE_SECURITY (1<<0) +#define BORG_MODULE_SECURITY (1<<3) /// Module is compatible with Miner Cyborg models -#define BORG_MODULE_MINER (1<<1) +#define BORG_MODULE_MINER (1<<4) /// Module is compatible with Janitor Cyborg models -#define BORG_MODULE_JANITOR (1<<2) +#define BORG_MODULE_JANITOR (1<<5) /// Module is compatible with Medical Cyborg models -#define BORG_MODULE_MEDICAL (1<<3) +#define BORG_MODULE_MEDICAL (1<<6) /// Module is compatible with Engineering Cyborg models -#define BORG_MODULE_ENGINEERING (1<<4) +#define BORG_MODULE_ENGINEERING (1<<7) /// Module is compatible with Science Cyborg models -#define BORG_MODULE_SCIENCE (1<<5) +#define BORG_MODULE_SCIENCE (1<<8) +/// Module is compatible with Service Cyborg models +#define BORG_MODULE_SERVICE (1<<9) +/// Module is compatible with Clerical Cyborg models +#define BORG_MODULE_CLERIC (1<<10) +/// Module is compatible with Combat Cyborg models +#define BORG_MODULE_COMBAT (1<<11) +/// Module is compatible with Exploration Cyborg models +#define BORG_MODULE_EXPLO (1<<12) /// Module is compatible with Ripley Exosuit models #define EXOSUIT_MODULE_RIPLEY (1<<0) /// Module is compatible with Odyseeus Exosuit models diff --git a/code/__defines/span_vr.dm b/code/__defines/span_vr.dm index 549098f2d83..2793d0546fc 100644 --- a/code/__defines/span_vr.dm +++ b/code/__defines/span_vr.dm @@ -10,7 +10,7 @@ #define span_comradio(str) ("" + str + "") #define span_syndradio(str) ("" + str + "") -#define span_centradio(str) ("" + str + "" +#define span_centradio(str) ("" + str + "") #define span_airadio(str) ("" + str + "") #define span_entradio(str) ("" + str + "") @@ -18,7 +18,7 @@ #define span_engradio(str) ("" + str + "") #define span_medradio(str) ("" + str + "") #define span_sciradio(str) ("" + str + "") -#define span_supradio(str) ("" + str + "" +#define span_supradio(str) ("" + str + "") #define span_srvradio(str) ("" + str + "") #define span_expradio(str) ("" + str + "") @@ -81,6 +81,7 @@ #define span_debug_debug(str) ("" + str + "") #define span_debug_trace(str) ("" + str + "") +#define span_white(str) ("" + str + "") #define span_black(str) ("" + str + "") #define span_darkgray(str) ("" + str + "") #define span_gray(str) ("" + str + "") @@ -88,3 +89,12 @@ #define span_orange(str) ("" + str + "") #define span_blue(str) ("" + str + "") #define span_green(str) ("" + str + "") +#define span_purple(str) ("" + str + "") +#define span_yellow(str) ("" + str + "") +#define span_pink(str) ("" + str + "") +#define span_cyan(str) ("" + str + "") +#define span_crimson(str) ("" + str + "") +#define span_maroon(str) ("" + str + "") +#define span_brown(str) ("" + str + "") +#define span_lightpurple(str) ("" + str + "") +#define span_darkpink(str) ("" + str + "") diff --git a/code/_helpers/files.dm b/code/_helpers/files.dm index 9468becf8b1..d904646a0fa 100644 --- a/code/_helpers/files.dm +++ b/code/_helpers/files.dm @@ -39,7 +39,7 @@ var/extension = copytext(path,-4,0) if( !fexists(path) || !(extension in valid_extensions) ) - to_chat(src, "Error: browse_files(): File not found/Invalid file([path]).") + to_chat(src, span_red("Error: browse_files(): File not found/Invalid file([path]).")) return return path @@ -53,7 +53,7 @@ /client/proc/file_spam_check() var/time_to_wait = fileaccess_timer - world.time if(time_to_wait > 0) - to_chat(src, "Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.") + to_chat(src, span_red("Error: file_spam_check(): Spam. Please wait [round(time_to_wait/10)] seconds.")) return 1 fileaccess_timer = world.time + FTPDELAY return 0 diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index d0f25eeb294..a9fedf110bb 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -121,9 +121,9 @@ Proc for attack log creation, because really why not var/target_str = key_name(target) if(ismob(user)) - user.attack_log += text("\[[time_stamp()]\] Attacked [target_str]: [what_done]") + user.attack_log += text("\[[time_stamp()]\] [span_red("Attacked [target_str]: [what_done]")]") if(ismob(target)) - target.attack_log += text("\[[time_stamp()]\] Attacked by [user_str]: [what_done]") + target.attack_log += text("\[[time_stamp()]\] [span_orange("Attacked by [user_str]: [what_done]")]") log_attack(user_str,target_str,what_done) if(admin_notify) msg_admin_attack("[key_name_admin(user)] vs [target_str]: [what_done]") diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 68006b91819..6846a79b8ea 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -469,22 +469,22 @@ var/global/datum/controller/subsystem/ticker/ticker var/turf/playerTurf = get_turf(Player) if(emergency_shuttle.departed && emergency_shuttle.evac) if(isNotAdminLevel(playerTurf.z)) - to_chat(Player, "You survived the round, but remained on [station_name()] as [Player.real_name].") + to_chat(Player, "[span_blue("You survived the round, but remained on [station_name()] as [Player.real_name].")]") else - to_chat(Player, "You managed to survive the events on [station_name()] as [Player.real_name].") + to_chat(Player, "[span_green("You managed to survive the events on [station_name()] as [Player.real_name].")]") else if(isAdminLevel(playerTurf.z)) - to_chat(Player, "You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].") + to_chat(Player, "[span_green("You successfully underwent crew transfer after events on [station_name()] as [Player.real_name].")]") else if(issilicon(Player)) - to_chat(Player, "You remain operational after the events on [station_name()] as [Player.real_name].") + to_chat(Player, "[span_green("You remain operational after the events on [station_name()] as [Player.real_name].")]") else - to_chat(Player, "You missed the crew transfer after the events on [station_name()] as [Player.real_name].") + to_chat(Player, "[span_blue("You missed the crew transfer after the events on [station_name()] as [Player.real_name].")]") else if(istype(Player,/mob/observer/dead)) var/mob/observer/dead/O = Player if(!O.started_as_observer) - to_chat(Player, "You did not survive the events on [station_name()]...") + to_chat(Player, "[span_red("You did not survive the events on [station_name()]...")]") else - to_chat(Player, "You did not survive the events on [station_name()]...") + to_chat(Player, "[span_red("You did not survive the events on [station_name()]...")]") to_world("
") for (var/mob/living/silicon/ai/aiPlayer in mob_list) diff --git a/code/controllers/subsystems/vote.dm b/code/controllers/subsystems/vote.dm index 6d00d9e28b7..41b440b410e 100644 --- a/code/controllers/subsystems/vote.dm +++ b/code/controllers/subsystems/vote.dm @@ -104,7 +104,7 @@ SUBSYSTEM_DEF(vote) else factor = 1.4 choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor) - to_world("Crew Transfer Factor: [factor]") + to_world(span_purple("Crew Transfer Factor: [factor]")) greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit . = list() // Get all options with that many votes and return them in a list @@ -137,7 +137,7 @@ SUBSYSTEM_DEF(vote) if(mode == VOTE_ADD_ANTAGONIST) antag_add_failed = 1 log_vote(text) - to_chat(world, "[text]") + to_chat(world, span_purple("[text]")) /datum/controller/subsystem/vote/proc/result() . = announce_result() @@ -166,7 +166,7 @@ SUBSYSTEM_DEF(vote) if(mode == VOTE_GAMEMODE) //fire this even if the vote fails. if(!round_progressing) round_progressing = 1 - to_world("The round will start soon.") + to_world(span_red("The round will start soon.")) if(restart) to_world("World restarting due to vote...") @@ -252,7 +252,7 @@ SUBSYSTEM_DEF(vote) log_vote(text) - to_world("[text]\nType vote or click here to place your votes.\nYou have [config.vote_period / 10] seconds to vote.") + to_world(span_purple("[text]\nType vote or click here to place your votes.\nYou have [config.vote_period / 10] seconds to vote.")) if(vote_type == VOTE_CREW_TRANSFER || vote_type == VOTE_GAMEMODE || vote_type == VOTE_CUSTOM) world << sound('sound/misc/notice1.ogg', repeat = 0, wait = 0, volume = 50, channel = 3) //YW Edit @@ -260,7 +260,7 @@ SUBSYSTEM_DEF(vote) if(mode == VOTE_GAMEMODE && round_progressing) gamemode_vote_called = TRUE round_progressing = 0 - to_world("Round start has been delayed.") + to_world(span_red("Round start has been delayed.")) time_remaining = round(config.vote_period / 10) return 1 @@ -309,13 +309,13 @@ SUBSYSTEM_DEF(vote) if(admin || config.allow_vote_restart) . += "Restart" else - . += "Restart (Disallowed)" + . += span_gray("Restart (Disallowed)") . += "
  • " if(admin || config.allow_vote_restart) . += "Crew Transfer" else - . += "Crew Transfer (Disallowed)" + . += span_gray("Crew Transfer (Disallowed)") if(admin) . += "\t([config.allow_vote_restart ? "Allowed" : "Disallowed"])" @@ -324,7 +324,7 @@ SUBSYSTEM_DEF(vote) if(admin || config.allow_vote_mode) . += "GameMode" else - . += "GameMode (Disallowed)" + . += span_gray("GameMode (Disallowed)") if(admin) . += "\t([config.allow_vote_mode ? "Allowed" : "Disallowed"])" @@ -333,7 +333,7 @@ SUBSYSTEM_DEF(vote) if(!antag_add_failed && config.allow_extra_antags) . += "Add Antagonist Type" else - . += "Add Antagonist (Disallowed)" + . += span_gray("Add Antagonist (Disallowed)") . += "
  • " if(admin) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index bc87275800b..f7bb7a738f9 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -143,9 +143,9 @@ for(var/datum/objective/O in objectives) out += "Objective #[num]: [O.explanation_text] " if(O.completed) - out += "(complete)" + out += "([span_green("complete")])" else - out += "(incomplete)" + out += "([span_red("incomplete")])" out += " \[toggle\]" out += " \[remove\]
    " num++ @@ -419,7 +419,7 @@ else if (href_list["obj_announce"]) var/obj_count = 1 - to_chat(current, "Your current objectives:") + to_chat(current, span_blue("Your current objectives:")) for(var/datum/objective/objective in objectives) to_chat(current, "Objective #[obj_count]: [objective.explanation_text]") obj_count++ diff --git a/code/datums/observation/stat_set.dm b/code/datums/observation/stat_set.dm index b980d06eccc..6bc6ea45f05 100644 --- a/code/datums/observation/stat_set.dm +++ b/code/datums/observation/stat_set.dm @@ -22,3 +22,12 @@ GLOBAL_DATUM_INIT(stat_set_event, /decl/observ/stat_set, new) . = ..() if(stat != old_stat) GLOB.stat_set_event.raise_event(src, old_stat, new_stat) + + if(isbelly(src.loc)) + var/obj/belly/ourbelly = src.loc + if(!ourbelly.owner.client) + return + if(stat == CONSCIOUS) + to_chat(ourbelly.owner, "\The [src.name] is awake.") + else if(stat == UNCONSCIOUS) + to_chat(ourbelly.owner, "\The [src.name] has fallen unconscious!") diff --git a/code/datums/supplypacks/recreation.dm b/code/datums/supplypacks/recreation.dm index ca19cc342af..e512b92ebcf 100644 --- a/code/datums/supplypacks/recreation.dm +++ b/code/datums/supplypacks/recreation.dm @@ -38,7 +38,7 @@ /datum/supply_pack/recreation/donksoftborg name = "Donk-Soft Cyborg Blaster Crate" contains = list( - /obj/item/borg/upgrade/toygun = 2, + /obj/item/borg/upgrade/no_prod/toygun = 2, ) cost = 35 containertype = /obj/structure/closet/crate/allico @@ -136,4 +136,4 @@ contains = list( /obj/machinery/porta_turret/lasertag/blue, /obj/machinery/porta_turret/lasertag/red - ) \ No newline at end of file + ) diff --git a/code/game/antagonist/antagonist_print.dm b/code/game/antagonist/antagonist_print.dm index 16fa6176dfd..830d4806f57 100644 --- a/code/game/antagonist/antagonist_print.dm +++ b/code/game/antagonist/antagonist_print.dm @@ -16,17 +16,17 @@ for(var/datum/objective/O in P.objectives) text += print_objective(O, num) if(O.check_completion()) - text += "Success!" + text += span_green("Success!") feedback_add_details(feedback_tag,"[O.type]|SUCCESS") else - text += "Fail." + text += span_red("Fail.") feedback_add_details(feedback_tag,"[O.type]|FAIL") failed = TRUE num++ if(failed) - text += "
    The [role_text] has failed." + text += "
    " + span_red("The [role_text] has failed.") else - text += "
    The [role_text] was successful!" + text += "
    " + span_green("The [role_text] was successful!") if(global_objectives && global_objectives.len) text += "
    Their objectives were:" @@ -42,9 +42,9 @@ var/text = "
    Objective [num]: [O.explanation_text] " if(append_success) if(O.check_completion()) - text += "Success!" + text += span_green("Success!") else - text += "Fail." + text += span_red("Fail.") return text /datum/antagonist/proc/print_player_lite(var/datum/mind/ply) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 9f865aced66..08295836f22 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -691,7 +691,7 @@ return var/list/speech_bubble_hearers = list() for(var/mob/M in get_mobs_in_view(7, src)) - M.show_message("[src] [atom_say_verb], \"[message]\"", 2, null, 1) + M.show_message("[src] [atom_say_verb], \"[message]\"", 2, null, 1) if(M.client) speech_bubble_hearers += M.client diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 74c4d3569ee..0e8e0ba43c0 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -217,7 +217,7 @@ if(!M.client && M.mind) for(var/mob/observer/dead/ghost in player_list) if(ghost.mind == M.mind) - to_chat(ghost, "Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned! (Verbs -> Ghost -> Re-enter corpse)") + to_chat(ghost, span_interface("Your corpse has been placed into a cloning scanner. Return to your body if you want to be resurrected/cloned! (Verbs -> Ghost -> Re-enter corpse)")) break SStgui.update_uis(src) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 3ad86499bda..0c52c00621c 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -357,9 +357,9 @@ var/list/sacrificed = list() else if(!corpse_to_raise.client && corpse_to_raise.mind) //Don't force the dead person to come back if they don't want to. for(var/mob/observer/dead/ghost in player_list) if(ghost.mind == corpse_to_raise.mind) - to_chat(ghost, "The cultist [usr.real_name] is trying to \ + to_chat(ghost, span_interface("The cultist [usr.real_name] is trying to \ revive you. Return to your body if you want to be resurrected into the service of Nar'Sie! \ - (Verbs -> Ghost -> Re-enter corpse)") + (Verbs -> Ghost -> Re-enter corpse)")) break sleep(10 SECONDS) diff --git a/code/game/gamemodes/events/holidays/Holidays.dm b/code/game/gamemodes/events/holidays/Holidays.dm index 3995f537846..35d67ccd572 100644 --- a/code/game/gamemodes/events/holidays/Holidays.dm +++ b/code/game/gamemodes/events/holidays/Holidays.dm @@ -268,11 +268,11 @@ var/global/list/Holiday = list() //Holidays are lists now, so we can have more t holidays.Add(p) holiday_blurbs.Add("[Holiday[p]]") var/holidays_string = english_list(holidays, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) - to_world("and...") + to_world(span_blue("and...")) to_world("

    Happy [holidays_string] Everybody!

    ") if(holiday_blurbs.len != 0) for(var/blurb in holiday_blurbs) - to_world("
    [blurb]
    ") + to_world(span_blue("
    [blurb]
    ")) switch(Holiday) //special holidays if("Easter") //do easter stuff diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 7af06d8d33d..326d14a798f 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -369,11 +369,11 @@ var/global/list/additional_antag_types = list() send2mainirc("A round of [src.name] has ended - [surviving_total] survivors, [ghosts] ghosts.") SSwebhooks.send( - WEBHOOK_ROUNDEND, + WEBHOOK_ROUNDEND, list( - "survivors" = surviving_total, - "escaped" = escaped_total, - "ghosts" = ghosts, + "survivors" = surviving_total, + "escaped" = escaped_total, + "ghosts" = ghosts, "clients" = clients ) ) @@ -480,15 +480,15 @@ var/global/list/additional_antag_types = list() found = 1 break if(!found) - msg += "[L.name] ([L.ckey]), the [L.job] (Disconnected)\n" + msg += "[L.name] ([L.ckey]), the [L.job] ([span_yellow("Disconnected")])\n" if(L.ckey && L.client) if(L.client.inactivity >= (ROUNDSTART_LOGOUT_REPORT_TIME / 2)) //Connected, but inactive (alt+tabbed or something) - msg += "[L.name] ([L.ckey]), the [L.job] (Connected, Inactive)\n" + msg += "[L.name] ([L.ckey]), the [L.job] ([span_yellow("Connected, Inactive")])\n" continue //AFK client if(L.stat) if(L.suiciding) //Suicider - msg += "[L.name] ([L.ckey]), the [L.job] (Suicide)\n" + msg += "[L.name] ([L.ckey]), the [L.job] ([span_red("Suicide")])\n" continue //Disconnected client if(L.stat == UNCONSCIOUS) msg += "[L.name] ([L.ckey]), the [L.job] (Dying)\n" @@ -502,17 +502,17 @@ var/global/list/additional_antag_types = list() if(D.mind && (D.mind.original == L || D.mind.current == L)) if(L.stat == DEAD) if(L.suiciding) //Suicider - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n" + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_red("Suicide")])\n" continue //Disconnected client else msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Dead)\n" continue //Dead mob, ghost abandoned else if(D.can_reenter_corpse) - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Adminghosted)\n" + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_red("Adminghosted")])\n" continue //Lolwhat else - msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Ghosted)\n" + msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] ([span_red("Ghosted")])\n" continue //Ghosted while alive msg += "" // close the span from right at the top diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 940e31f3cd5..c4cc82bc003 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -14,9 +14,9 @@ name = "Rapid Core" desc = "A core optimized for passive regeneration, however at the cost of capacity. Has a capacity of 7,000 units of energy, and \ recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster.
    \ - Capacity: 7k
    \ - Recharge: 70/s
    \ - Instability Modifier: 90%
    \ + " + span_red("Capacity: 7k") + "
    \ + " + span_green("Recharge: 70/s") + "
    \ + " + span_red("Instability Modifier: 90%") + "
    \ Energy Cost Modifier: 100%
    \ Spell Power: 100%" cost = 100 @@ -27,11 +27,11 @@ desc = "This core has very large capacitors, however it also has a subpar fractal reactor. The user is recommended to \ purchase one or more energy-generating Functions as well if using this core. The intense weight of the core unfortunately can \ cause the wear to move slightly slower, and the closeness of the capacitors causes a slight increase in incoming instability.
    \ - Capacity: 20k
    \ - Recharge: 25/s
    \ - Instability Modifier: 100%
    \ + " + span_green("Capacity: 20k") + "
    \ + " + span_red("Recharge: 25/s") + "
    \ + " + span_red("Instability Modifier: 100%") + "
    \ Energy Cost Modifier: 100%
    \ - Spell Power: 140%" + " + span_green("Spell Power: 140%") + "" cost = 100 obj_path = /obj/item/weapon/technomancer_core/bulky @@ -40,11 +40,11 @@ desc = "This core feeds off unstable energies around the user in addition to a fractal reactor. This means that it performs \ better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. The rate of recharging \ increases as the user accumulates more instability, eventually exceeding even the rapid core in regen speed, at a huge risk.
    \ - Capacity: 13k
    \ - Recharge: 35/s to 110/s+
    \ - Instability Modifier: 130%
    \ - Energy Cost Modifier: 70%
    \ - Spell Power: 110%" + " + span_green("Capacity: 13k") + "
    \ + " + span_green("Recharge: 35/s to 110/s+") + "
    \ + " + span_red("Instability Modifier: 130%") + "
    \ + " + span_green("Energy Cost Modifier: 70%") + "
    \ + " + span_green("Spell Power: 110%") + "" cost = 100 obj_path = /obj/item/weapon/technomancer_core/unstable @@ -52,10 +52,10 @@ name = "Recycling Core" desc = "This core is optimized for energy efficency, being able to sometimes recover energy that would have been lost with other \ cores. Each time energy is spent, there is a 30% chance of recovering half of what was spent.
    \ - Capacity: 12k
    \ - Recharge: 40/s
    \ - Instability Modifier: 60%
    \ - Energy Cost Modifier: 80%
    \ + " + span_green("Capacity: 12k") + "
    \ + " + span_red("Recharge: 40/s") + "
    \ + " + span_green("Instability Modifier: 60%") + "
    \ + " + span_green("Energy Cost Modifier: 80%") + "
    \ Spell Power: 100%" cost = 100 obj_path = /obj/item/weapon/technomancer_core/recycling @@ -65,11 +65,11 @@ desc = "A unique type of core, this one sacrifices other characteristics in order to optimize it for the purposes teleporting \ entities from vast distances, and keeping them there. Wearers of this core can maintain up to 40 summons at once, and the energy \ demand for maintaining summons is severely reduced.
    \ - Capacity: 8k
    \ - Recharge: 35/s
    \ - Instability Modifier: 120%
    \ + " + span_red("Capacity: 8k") + "
    \ + " + span_red("Recharge: 35/s") + "
    \ + " + span_red("Instability Modifier: 120%") + "
    \ Energy Cost Modifier: 100%
    \ - Spell Power: 120%" + " + span_green("Spell Power: 120%") + "" cost = 100 obj_path = /obj/item/weapon/technomancer_core/summoner @@ -77,11 +77,11 @@ name = "Safety Core" desc = "This core is designed so that the wearer suffers almost no instability. It unfortunately comes at a cost of subpar \ ratings for everything else.
    \ - Capacity: 7k
    \ - Recharge: 30/s
    \ - Instability Modifier: 30%
    \ + " + span_red("Capacity: 7k") + "
    \ + " + span_red("Recharge: 30/s") + "
    \ + " + span_green("Instability Modifier: 30%") + "
    \ Energy Cost Modifier: 100%
    \ - Spell Power: 70%" + " + span_red("Spell Power: 70%") + "" cost = 100 obj_path = /obj/item/weapon/technomancer_core/safety @@ -90,11 +90,11 @@ desc = "A core that was created in order to get the most power out of functions. It does this by shoving the most power into \ those functions, so it is the opposite of energy efficent, however the enhancement of functions is second to none for other \ cores.
    \ - Capacity: 15k (effectively 7.5k)
    \ - Recharge: 40/s
    \ - Instability Modifier: 110%
    \ - Energy Cost Modifier: 200%
    \ - Spell Power: 175%" + " + span_red("Capacity: 15k (effectively 7.5k)") + "
    \ + " + span_red("Recharge: 40/s") + "
    \ + " + span_red("Instability Modifier: 110%") + "
    \ + " + span_red("Energy Cost Modifier: 200%") + "
    \ + " + span_green("Spell Power: 175%") + "" cost = 100 obj_path = /obj/item/weapon/technomancer_core/overcharged diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index ebd8974305f..b89db0c0c46 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -92,4 +92,4 @@ M.Paralyse(4) else M.make_jittery(50) - to_chat(M, "HONK") + to_chat(M, span_red("HONK")) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index f33549fc232..b73df5ca3ab 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -352,7 +352,7 @@ P.info += "Time of scan: [stationtime2text()]

    " P.info += "[generate_printing_text()]" P.info += "

    Notes:
    " - P.name = "Body Scan - [name] ([stationtime2text()]" + P.name = "Body Scan - [name] ([stationtime2text()])" else return FALSE diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 10b8aa1fa88..3c2a4cd810a 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -270,7 +270,7 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva if(D in empty_playable_ai_cores) empty_playable_ai_cores -= D - to_chat(src, "\The [id] is now not available for latejoining AIs.") + to_chat(src, "\The [id] is now [span_red("not available")] for latejoining AIs.") else empty_playable_ai_cores += D - to_chat(src, "\The [id] is now available for latejoining AIs.") + to_chat(src, "\The [id] is now [span_green("available")] for latejoining AIs.") diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 7b8039cb6f9..d05d9661702 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -41,7 +41,7 @@ var/list/doppler_arrays = list() var/message = "Explosive disturbance detected - Epicenter at: grid ([x0],[y0]). Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range]. Temporal displacement of tachyons: [took]seconds." for(var/mob/O in hearers(src, null)) - O.show_message("[src] states coldly, \"[message]\"",2) + O.show_message("[src] states coldly, \"[message]\"",2) /obj/machinery/doppler_array/power_change() ..() diff --git a/code/game/machinery/embedded_controller/mapping_helpers.dm b/code/game/machinery/embedded_controller/mapping_helpers.dm index 768fc74beb7..0306146d388 100644 --- a/code/game/machinery/embedded_controller/mapping_helpers.dm +++ b/code/game/machinery/embedded_controller/mapping_helpers.dm @@ -26,11 +26,11 @@ Any frequency works, it's self-setting, but it seems like people have decided 13 my_controller = get_controller(get_area(src)) my_device = locate(my_device_type) in get_turf(src) if(!my_device) - to_world("WARNING:Airlock helper '[name]' couldn't find what it wanted at: X:[x] Y:[y] Z:[z]") + to_world("[span_red("WARNING:")][span_black("Airlock helper '[name]' couldn't find what it wanted at: X:[x] Y:[y] Z:[z]")]") else if(!my_controller) - to_world("WARNING:Airlock helper '[name]' couldn't find a controller at: X:[x] Y:[y] Z:[z]") + to_world("[span_red("WARNING:")][span_black("Airlock helper '[name]' couldn't find a controller at: X:[x] Y:[y] Z:[z]")]") else if(!my_controller.id_tag) - to_world("WARNING:Airlock helper '[name]' found a controller without an 'id_tag' set: X:[x] Y:[y] Z:[z]") + to_world("[span_red("WARNING:")][span_black("Airlock helper '[name]' found a controller without an 'id_tag' set: X:[x] Y:[y] Z:[z]")]") else setup() return INITIALIZE_HINT_QDEL @@ -48,15 +48,15 @@ Any frequency works, it's self-setting, but it seems like people have decided 13 for(var/obj/O in A) if(istype(O, my_controller_type)) potentials += O - + //Couldn't find one if(!potentials.len) return null - + //Only found one if(potentials.len == 1) return potentials[1] - + //Gotta find closest var/closest = potentials[potentials.len] var/closest_dist = get_dist(src, closest) diff --git a/code/game/machinery/suit_storage/suit_storage.dm b/code/game/machinery/suit_storage/suit_storage.dm index 3134eee4873..021b050c5f8 100644 --- a/code/game/machinery/suit_storage/suit_storage.dm +++ b/code/game/machinery/suit_storage/suit_storage.dm @@ -229,7 +229,7 @@ /obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob) if(islocked || isUV) - to_chat(user, "Unable to open unit.") + to_chat(user, span_red("Unable to open unit.")) return if(OCCUPANT) eject_occupant(user) @@ -240,7 +240,7 @@ /obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob) if(OCCUPANT && safetieson) - to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.") + to_chat(user, span_red("The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.")) return if(isopen) return @@ -252,10 +252,10 @@ if(isUV || isopen) //I'm bored of all these sanity checks return if(OCCUPANT && safetieson) - to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.") + to_chat(user, span_red("WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.")) return if(!HELMET && !MASK && !SUIT && !OCCUPANT) //shit's empty yo - to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.") + to_chat(user, span_red("Unit storage bays empty. Nothing to disinfect -- Aborting.")) return to_chat(user, "You start the Unit's cauterisation cycle.") cycletime_left = 20 @@ -295,7 +295,7 @@ SUIT = null if(MASK) MASK = null - visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.", 3) + visible_message(span_red("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber."), 3) isbroken = 1 isopen = 1 islocked = 0 @@ -320,9 +320,9 @@ if(OCCUPANT.client) if(user != OCCUPANT) - to_chat(OCCUPANT, "The machine kicks you out!") + to_chat(OCCUPANT, span_blue("The machine kicks you out!")) if(user.loc != src.loc) - to_chat(OCCUPANT, "You leave the not-so-cozy confines of the SSU.") + to_chat(OCCUPANT, span_blue("You leave the not-so-cozy confines of the SSU.")) OCCUPANT.client.eye = OCCUPANT.client.mob OCCUPANT.client.perspective = MOB_PERSPECTIVE @@ -356,13 +356,13 @@ if(usr.stat != 0) return if(!isopen) - to_chat(usr, "The unit's doors are shut.") + to_chat(usr, span_red("The unit's doors are shut.")) return if(!ispowered || isbroken) - to_chat(usr, "The unit is not operational.") + to_chat(usr, span_red("The unit is not operational.")) return if((OCCUPANT) || (HELMET) || (SUIT)) - to_chat(usr, "It's too cluttered inside for you to fit in!") + to_chat(usr, span_red("It's too cluttered inside for you to fit in!")) return visible_message("[usr] starts squeezing into the suit storage unit!", 3) if(do_after(usr, 10)) @@ -388,7 +388,7 @@ if(I.has_tool_quality(TOOL_SCREWDRIVER)) panelopen = !panelopen playsound(src, I.usesound, 100, 1) - to_chat(user, "You [panelopen ? "open up" : "close"] the unit's maintenance panel.") + to_chat(user, span_blue("You [panelopen ? "open up" : "close"] the unit's maintenance panel.")) updateUsrDialog() return if(istype(I, /obj/item/weapon/grab)) @@ -396,13 +396,13 @@ if(!(ismob(G.affecting))) return if(!isopen) - to_chat(user, "The unit's doors are shut.") + to_chat(user, span_red("The unit's doors are shut.")) return if(!ispowered || isbroken) - to_chat(user, "The unit is not operational.") + to_chat(user, span_red("The unit is not operational.")) return if((OCCUPANT) || (HELMET) || (SUIT)) //Unit needs to be absolutely empty - to_chat(user, "The unit's storage area is too cluttered.") + to_chat(user, span_red("The unit's storage area is too cluttered.")) return visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.", 3) if(do_after(user, 20)) @@ -426,7 +426,7 @@ return var/obj/item/clothing/suit/space/S = I if(SUIT) - to_chat(user, "The unit already contains a suit.") + to_chat(user, span_blue("The unit already contains a suit.")) return to_chat(user, "You load the [S.name] into the storage compartment.") user.drop_item() @@ -440,7 +440,7 @@ return var/obj/item/clothing/head/helmet/H = I if(HELMET) - to_chat(user, "The unit already contains a helmet.") + to_chat(user, span_blue("The unit already contains a helmet.")) return to_chat(user, "You load the [H.name] into the storage compartment.") user.drop_item() @@ -454,7 +454,7 @@ return var/obj/item/clothing/mask/M = I if(MASK) - to_chat(user, "The unit already contains a mask.") + to_chat(user, span_blue("The unit already contains a mask.")) return to_chat(user, "You load the [M.name] into the storage compartment.") user.drop_item() @@ -473,4 +473,4 @@ //////////////////////////////REMINDER: Make it lock once you place some fucker inside. -//God this entire file is fucking awful //Yes \ No newline at end of file +//God this entire file is fucking awful //Yes diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm index 88dace7ff97..1a163579c34 100644 --- a/code/game/mecha/combat/combat.dm +++ b/code/game/mecha/combat/combat.dm @@ -97,7 +97,7 @@ return M.updatehealth() src.occupant_message("You hit [T].") - src.visible_message("[src.name] hits [T].") + src.visible_message(span_red("[src.name] hits [T].")) else step_away(M,src) src.occupant_message("You push [T] out of the way.") @@ -114,7 +114,7 @@ if(src.occupant.a_intent == I_HURT || istype(src.occupant, /mob/living/carbon/brain)) // Don't smash unless we mean it if(damtype == "brute") src.occupant_message("You hit [T].") - src.visible_message("[src.name] hits [T]") + src.visible_message(span_red("[src.name] hits [T]")) playsound(src, 'sound/weapons/heavysmash.ogg', 50, 1) if(istype(T, /obj/structure/girder)) diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm index 1fa6933add7..8e64f7efd87 100644 --- a/code/game/mecha/combat/gygax.dm +++ b/code/game/mecha/combat/gygax.dm @@ -120,7 +120,7 @@ /obj/mecha/combat/gygax/serenity/moved_inside(var/mob/living/carbon/human/H as mob) if(..()) if(H.glasses) - occupant_message("[H.glasses] prevent you from using [src] [hud]") + occupant_message(span_red("[H.glasses] prevent you from using [src] [hud]!")) else H.glasses = hud H.recalculate_vis() diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 7184fc3364c..0b3cc2ff5be 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -90,7 +90,7 @@ if(chassis.selected == src) chassis.selected = null src.update_chassis_page() - chassis.occupant_message("The [src] is destroyed!") + chassis.occupant_message(span_red("The [src] is destroyed!")) chassis.log_append_to_last("[src] is destroyed.",1) if(istype(src, /obj/item/mecha_parts/mecha_equipment/weapon))//Gun switch(chassis.mech_faction) diff --git a/code/game/mecha/equipment/tools/cable_layer.dm b/code/game/mecha/equipment/tools/cable_layer.dm index 8de184cb7a5..eb1e891a3be 100644 --- a/code/game/mecha/equipment/tools/cable_layer.dm +++ b/code/game/mecha/equipment/tools/cable_layer.dm @@ -20,7 +20,7 @@ var/result = load_cable(target) var/message if(isnull(result)) - message = "Unable to load [target] - no cable found." + message = span_red("Unable to load [target] - no cable found.") else if(!result) message = "Reel is full." else @@ -123,4 +123,4 @@ //NC.mergeConnectedNetworksOnTurf() last_piece = NC - return 1 \ No newline at end of file + return 1 diff --git a/code/game/mecha/equipment/tools/sleeper.dm b/code/game/mecha/equipment/tools/sleeper.dm index 9163ecec2ba..634e1ad435d 100644 --- a/code/game/mecha/equipment/tools/sleeper.dm +++ b/code/game/mecha/equipment/tools/sleeper.dm @@ -44,7 +44,7 @@ if(chassis.loc!=C || target.loc!=T) return if(occupant) - occupant_message("The sleeper is already occupied!") + occupant_message(span_red("The sleeper is already occupied!")) return target.forceMove(src) occupant = target @@ -57,7 +57,7 @@ */ set_ready_state(FALSE) START_PROCESSING(SSprocessing, src) - occupant_message("[target] successfully loaded into [src]. Life support functions engaged.") + occupant_message(span_blue("[target] successfully loaded into [src]. Life support functions engaged.")) chassis.visible_message("[chassis] loads [target] into [src].") log_message("[target] loaded. Life support functions engaged.") return @@ -236,4 +236,4 @@ M.reagents.add_reagent("inaprovaline", 5) chassis.use_power(energy_drain) update_equip_info() - return \ No newline at end of file + return diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index e7585d4ec29..35d258ee785 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -138,6 +138,12 @@ var/module_types = initial(U.module_flags) sub_category = list() if(module_types) + if(module_types & BORG_UTILITY) + sub_category += "All Cyborgs - Utility" + if(module_types & BORG_BASIC) + sub_category += "All Cyborgs - Basic" + if(module_types & BORG_ADVANCED) + sub_category += "All Cyborgs - Advanced" if(module_types & BORG_MODULE_SECURITY) sub_category += "Security" if(module_types & BORG_MODULE_MINER) @@ -150,9 +156,16 @@ sub_category += "Engineering" if(module_types & BORG_MODULE_SCIENCE) sub_category += "Science" - + if(module_types & BORG_MODULE_SERVICE) + sub_category += "Service" + if(module_types & BORG_MODULE_CLERIC) + sub_category += "Cleric" + if(module_types & BORG_MODULE_COMBAT) + sub_category += "Combat" + if(module_types & BORG_MODULE_EXPLO) + sub_category += "Exploration" else - sub_category += "All Cyborgs" + sub_category += "This shouldn't be here, bother a dev!" // Else check if this design builds a piece of exosuit equipment. else if(built_item in typesof(/obj/item/mecha_parts/mecha_equipment)) var/obj/item/mecha_parts/mecha_equipment/E = built_item diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index effab680ead..633757a03f9 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -622,7 +622,7 @@ show_radial_occupant(user) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message(span_red("Maintenance protocols in effect")) return if(phasing)//Phazon and other mechs with phasing. @@ -792,7 +792,7 @@ if(defence_mode)//Check if we are currently locked down if(world.time - last_message > 20) - src.occupant_message("Unable to move while in defence mode") + src.occupant_message(span_red("Unable to move while in defence mode")) last_message = world.time return 0 @@ -810,7 +810,7 @@ if(health < initial(health) - initial(health)/3) overload = 0 step_energy_drain = initial(step_energy_drain) - src.occupant_message("Leg actuators damage threshold exceded. Disabling overload.") + src.occupant_message(span_red("Leg actuators damage threshold exceded. Disabling overload.")) var/move_result = 0 @@ -979,12 +979,12 @@ internal_damage &= ~int_dam_flag switch(int_dam_flag) if(MECHA_INT_TEMP_CONTROL) - occupant_message("Life support system reactivated.") + occupant_message(span_blue("Life support system reactivated.")) start_process(MECHA_PROC_INT_TEMP) if(MECHA_INT_FIRE) - occupant_message("Internal fire extinquished.") + occupant_message(span_blue("Internal fire extinquished.")) if(MECHA_INT_TANK_BREACH) - occupant_message("Damaged internal tank has been sealed.") + occupant_message(span_blue("Damaged internal tank has been sealed.")) return @@ -1097,9 +1097,9 @@ src.take_damage(15) //The take_damage() proc handles armor values if(prob(25)) //Hulks punch hard but lets not give them consistent internal damage. src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) - user.visible_message("[user] hits [src.name], doing some damage.", "You hit [src.name] with all your might. The metal creaks and bends.") + user.visible_message(span_red("[user] hits [src.name], doing some damage."), span_red("You hit [src.name] with all your might. The metal creaks and bends.")) else - user.visible_message("[user] hits [src.name]. Nothing happens.","You hit [src.name] with no visible effect.") + user.visible_message(span_red("[user] hits [src.name]. Nothing happens."),span_red("You hit [src.name] with no visible effect.")) src.log_append_to_last("Armor saved.") return @@ -1377,8 +1377,8 @@ else pass_damage_reduc_mod = 1 //Just making sure. - src.occupant_message("[user] hits [src] with [W].") - user.visible_message("[user] hits [src] with [W].", "You hit [src] with [W].") + src.occupant_message(span_red("[user] hits [src] with [W].")) + user.visible_message(span_red("[user] hits [src] with [W]."), span_red("You hit [src] with [W].")) var/pass_damage = W.force pass_damage = (pass_damage*pass_damage_reduc_mod) //Apply the reduction of damage from not having enough armor penetration. This is not regular armor values at play. @@ -2555,7 +2555,7 @@ if(href_list["toggle_maint_access"]) if(usr != src.occupant) return if(state) - occupant_message("Maintenance protocols in effect") + occupant_message(span_red("Maintenance protocols in effect")) return maint_access = !maint_access send_byjax(src.occupant,"exosuit.browser","t_maint_access","[maint_access?"Forbid":"Permit"] maintenance protocols") @@ -2647,10 +2647,10 @@ if(do_after(100)) if(T == src.loc) src.clearInternalDamage(MECHA_INT_CONTROL_LOST) - src.occupant_message("Recalibration successful.") + src.occupant_message(span_blue("Recalibration successful.")) src.log_message("Recalibration of coordination system finished with 0 errors.") else - src.occupant_message("Recalibration failed.") + src.occupant_message(span_red("Recalibration failed.")) src.log_message("Recalibration of coordination system failed with 1 error.",1) if(href_list["drop_from_cargo"]) var/obj/O = locate(href_list["drop_from_cargo"]) @@ -2795,7 +2795,7 @@ src.log_append_to_last("Armor saved.") src.occupant_message("\The [user]'s attack is stopped by the armor.") visible_message("\The [user] rebounds off [src.name]'s armor!") - user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + user.attack_log += text("\[[time_stamp()]\] [span_red("attacked [src.name]")]") playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1) else if(damage < temp_damage_minimum)//Pathetic damage levels just don't harm MECH. @@ -2810,7 +2810,7 @@ if(damage > internal_damage_minimum) //Only decently painful attacks trigger a chance of mech damage. src.check_for_internal_damage(list(MECHA_INT_TEMP_CONTROL,MECHA_INT_TANK_BREACH,MECHA_INT_CONTROL_LOST)) visible_message("[user] [attack_message] [src]!") - user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + user.attack_log += text("\[[time_stamp()]\] [span_red("attacked [src.name]")]") return 1 diff --git a/code/game/mecha/mecha_actions.dm b/code/game/mecha/mecha_actions.dm index 33d7d711e81..cee2768dacd 100644 --- a/code/game/mecha/mecha_actions.dm +++ b/code/game/mecha/mecha_actions.dm @@ -195,7 +195,7 @@ return if(!chassis.selected) chassis.selected = available_equipment[1] - chassis.occupant_message("You select [chassis.selected]") + chassis.occupant_message("You select [chassis.selected]") send_byjax(chassis.occupant,"exosuit.browser","eq_list",chassis.get_equipment_list()) button_icon_state = "mech_cycle_equip_on" button.UpdateIcon() @@ -277,10 +277,10 @@ defence_mode = !defence_mode if(defence_mode) deflect_chance = defence_deflect - src.occupant_message("You enable [src] defence mode.") + src.occupant_message(span_blue("You enable [src] defence mode.")) else deflect_chance = initial(deflect_chance) - src.occupant_message("You disable [src] defence mode.") + src.occupant_message(span_red("You disable [src] defence mode.")) src.log_message("Toggled defence mode.") return @@ -299,17 +299,17 @@ if(usr!=src.occupant) return if(health < initial(health) - initial(health)/3)//Same formula as in movement, just beforehand. - src.occupant_message("Leg actuators damage critical, unable to engage overload.") + src.occupant_message(span_red("Leg actuators damage critical, unable to engage overload.")) overload = 0 //Just to be sure return if(overload) overload = 0 step_energy_drain = initial(step_energy_drain) - src.occupant_message("You disable leg actuators overload.") + src.occupant_message(span_blue("You disable leg actuators overload.")) else overload = 1 step_energy_drain = step_energy_drain*overload_coeff - src.occupant_message("You enable leg actuators overload.") + src.occupant_message(span_red("You enable leg actuators overload.")) src.log_message("Toggled leg actuators overload.") playsound(src, 'sound/mecha/mechanical_toggle.ogg', 50, 1) return @@ -327,12 +327,12 @@ return if(smoke_reserve < 1) - src.occupant_message("You don't have any smoke left in stock!") + src.occupant_message(span_red("You don't have any smoke left in stock!")) return if(smoke_ready) smoke_reserve-- //Remove ammo - src.occupant_message("Smoke fired. [smoke_reserve] usages left.") + src.occupant_message(span_red("Smoke fired. [smoke_reserve] usages left.")) var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() smoke.attach(src) @@ -360,7 +360,10 @@ if(src.occupant.client) src.zoom = !src.zoom src.log_message("Toggled zoom mode.") - src.occupant_message("Zoom mode [zoom?"en":"dis"]abled.") + if(src.zoom) + src.occupant_message(span_blue("Zoom mode enabled.")) + else + src.occupant_message(span_red("Zoom mode disabled.")) if(zoom) src.occupant.set_viewsize(12) src.occupant << sound('sound/mecha/imag_enh.ogg',volume=50) @@ -384,7 +387,10 @@ if(get_charge() > 0) thrusters = !thrusters src.log_message("Toggled thrusters.") - src.occupant_message("Thrusters [thrusters?"en":"dis"]abled.") + if(src.thrusters) + src.occupant_message(span_blue("Thrusters enabled.")) + else + src.occupant_message(span_red("Thrusters disabled.")) return @@ -427,7 +433,10 @@ return phasing = !phasing send_byjax(src.occupant,"exosuit.browser","phasing_command","[phasing?"Dis":"En"]able phasing") - src.occupant_message("En":"#f00\">Dis"]abled phasing.") + if(phasing) + src.occupant_message(span_blue("Enabled phasing.")) + else + src.occupant_message(span_red("Disabled phasing.")) return @@ -447,7 +456,10 @@ else cloak() - src.occupant_message("En":"#f00\">Dis"]abled cloaking.") + if(cloaked) + src.occupant_message(span_blue("Enabled cloaking.")) + else + src.occupant_message(span_red("Disabled cloaking.")) return /obj/mecha/verb/toggle_weapons_only_cycle() @@ -461,5 +473,8 @@ if(usr!=src.occupant) return weapons_only_cycle = !weapons_only_cycle - src.occupant_message("En":"#f00\">Dis"]abled weapons only cycling.") + if(weapons_only_cycle) + src.occupant_message(span_blue("Enabled weapons only cycling.")) + else + src.occupant_message(span_red("Disabled weapons only cycling.")) return diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm index f1612e9083d..929418e4a44 100644 --- a/code/game/mecha/medical/odysseus.dm +++ b/code/game/mecha/medical/odysseus.dm @@ -28,7 +28,7 @@ /obj/mecha/medical/odysseus/moved_inside(var/mob/living/carbon/human/H as mob) if(..()) if(H.glasses) - occupant_message("[H.glasses] prevent you from using [src] [hud]") + occupant_message(span_red("[H.glasses] prevent you from using [src] [hud]!")) else H.glasses = hud H.recalculate_vis() @@ -143,4 +143,4 @@ ..() health = 25 maxhealth = 50 //Just slightly worse. - cell.charge = rand(0, (cell.charge/2)) \ No newline at end of file + cell.charge = rand(0, (cell.charge/2)) diff --git a/code/game/mecha/micro/micro.dm b/code/game/mecha/micro/micro.dm index d1e5aedf592..1f301ce5417 100644 --- a/code/game/mecha/micro/micro.dm +++ b/code/game/mecha/micro/micro.dm @@ -81,7 +81,7 @@ return M.updatehealth() src.occupant_message("You hit [target].") - src.visible_message("[src.name] hits [target].") + src.visible_message(span_red("[src.name] hits [target].")) else step_away(M,src) src.occupant_message("You push [target] out of the way.") @@ -97,7 +97,7 @@ for(var/target_type in src.destroyable_obj) if(istype(target, target_type) && hascall(target, "attackby")) src.occupant_message("You hit [target].") - src.visible_message("[src.name] hits [target]") + src.visible_message(span_red("[src.name] hits [target].")) if(!istype(target, /turf/simulated/wall)) target:attackby(src,src.occupant) else @@ -155,4 +155,3 @@ /obj/effect/decal/mecha_wreckage/micro icon = 'icons/mecha/micro.dmi' - diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index d8be1b8c2c3..3e07548542f 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -349,12 +349,12 @@ GLOBAL_LIST_BOILERPLATE(all_pai_cards, /obj/item/device/paicard) return var/mob/M = usr if(!istype(M, /mob/living/carbon)) - to_chat(usr, "You don't have any DNA, or your DNA is incompatible with this device.") + to_chat(usr, span_blue("You don't have any DNA, or your DNA is incompatible with this device.")) else var/datum/dna/dna = usr.dna pai.master = M.real_name pai.master_dna = dna.unique_enzymes - to_chat(pai, "

    You have been bound to a new master.

    ") + to_chat(pai, span_red("

    You have been bound to a new master.

    ")) if(href_list["request"]) src.looking_for_personality = 1 paiController.findPAI(src, usr) diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index c57773b3faf..dc71c0cafc2 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -209,10 +209,10 @@ /obj/item/device/radio/intercom/AIAltClick(var/mob/user) if(frequency == AI_FREQ) set_frequency(initial(frequency)) - to_chat(user, "\The [src]'s frequency is now set to Default.") + to_chat(user, "\The [src]'s frequency is now set to [span_green("Default")].") else set_frequency(AI_FREQ) - to_chat(user, "\The [src]'s frequency is now set to AI Private.") + to_chat(user, "\The [src]'s frequency is now set to [span_pink("AI Private")].") //VOREStation Add End /obj/item/device/radio/intercom/locked var/locked_frequency @@ -232,4 +232,4 @@ /obj/item/device/radio/intercom/locked/confessional name = "confessional intercom" - frequency = 1480 \ No newline at end of file + frequency = 1480 diff --git a/code/game/objects/items/devices/scanners/health.dm b/code/game/objects/items/devices/scanners/health.dm index 6d854e201c5..2d0b040c991 100644 --- a/code/game/objects/items/devices/scanners/health.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -59,11 +59,11 @@ if (!ishuman(M) || M.isSynthetic()) //these sensors are designed for organic life dat += "Analyzing Results for ERROR:\n\tOverall Status: ERROR
    " - dat += "\tKey: Suffocation/Toxin/Burns/Brute
    " - dat += "\tDamage Specifics: ? - ? - ? - ?
    " + dat += "\tKey: [span_cyan("Suffocation")]/[span_green("Toxin")]/[span_orange("Burns")]/[span_red("Brute")]
    " + dat += "\tDamage Specifics: [span_cyan("?")] - [span_green("?")] - [span_orange("?")] - [span_red("?")]
    " dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)

    " dat += "Warning: Blood Level ERROR: --% --cl. Type: ERROR
    " - dat += "Subject's pulse: -- bpm." + dat += "Subject's pulse: [span_red("-- bpm.")]" user.show_message(dat, 1) return @@ -78,8 +78,8 @@ dat += "Overall Status: dead
    " else dat += "Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "dead" : "[round((M.health/M.getMaxHealth())*100) ]% healthy"]
    " - dat += "\tKey: Suffocation/Toxin/Burns/Brute
    " - dat += "\tDamage Specifics: [OX] - [TX] - [BU] - [BR]
    " + dat += "\tKey: [span_cyan("Suffocation")]/[span_green("Toxin")]/[span_orange("Burns")]/[span_red("Brute")]
    " + dat += "\tDamage Specifics: [span_cyan("[OX]")] - [span_green("[TX]")] - [span_orange("[BU]")] - [span_red("[BR]")]
    " dat += "Body Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)

    " //VOREStation edit/addition starts if(M.timeofdeath && (M.stat == DEAD || (M.status_flags & FAKEDEATH))) @@ -99,14 +99,14 @@ else dat += " [capitalize(org.name)]: [(org.brute_dam > 0) ? "[org.brute_dam]" : 0]" dat += "[(org.status & ORGAN_BLEEDING)?"\[Bleeding\]":""] - " - dat += "[(org.burn_dam > 0) ? "[org.burn_dam]" : 0]
    " + dat += "[(org.burn_dam > 0) ? "[span_orange("[org.burn_dam]")]" : 0]
    " else dat += " Limbs are OK.
    " - OX = M.getOxyLoss() > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" - TX = M.getToxLoss() > 50 ? "Dangerous amount of toxins detected" : "Subject bloodstream toxin level minimal" - BU = M.getFireLoss() > 50 ? "Severe burn damage detected" : "Subject burn injury status O.K" - BR = M.getBruteLoss() > 50 ? "Severe anatomical damage detected" : "Subject brute-force injury status O.K" + OX = M.getOxyLoss() > 50 ? "[span_cyan("Severe oxygen deprivation detected")]" : "Subject bloodstream oxygen level normal" + TX = M.getToxLoss() > 50 ? "[span_green("Dangerous amount of toxins detected")]" : "Subject bloodstream toxin level minimal" + BU = M.getFireLoss() > 50 ? "[span_orange("Severe burn damage detected")]" : "Subject burn injury status O.K" + BR = M.getBruteLoss() > 50 ? "[span_red("Severe anatomical damage detected")]" : "Subject brute-force injury status O.K" if(M.status_flags & FAKEDEATH) OX = fake_oxy > 50 ? "Severe oxygen deprivation detected" : "Subject bloodstream oxygen level normal" dat += "[OX] | [TX] | [BU] | [BR]
    " diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 131aba49936..4294b56f85d 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -259,13 +259,13 @@ var/playedmessage = mytape.storedinfo[i] if (findtextEx(playedmessage,"*",1,2)) //remove marker for action sounds playedmessage = copytext(playedmessage,2) - T.audible_message("Tape Recorder: [playedmessage]", runemessage = playedmessage) + T.audible_message(span_maroon("Tape Recorder: [playedmessage]"), runemessage = playedmessage) if(mytape.storedinfo.len < i+1) playsleepseconds = 1 sleep(10) T = get_turf(src) - T.audible_message("Tape Recorder: End of recording.", runemessage = "click") + T.audible_message(span_maroon("Tape Recorder: End of recording."), runemessage = "click") break else playsleepseconds = mytape.timestamp[i+1] - mytape.timestamp[i] @@ -273,7 +273,7 @@ if(playsleepseconds > 14) sleep(10) T = get_turf(src) - T.audible_message("Tape Recorder: Skipping [playsleepseconds] seconds of silence", runemessage = "tape winding") + T.audible_message(span_maroon("Tape Recorder: Skipping [playsleepseconds] seconds of silence"), runemessage = "tape winding") playsleepseconds = 1 sleep(10 * playsleepseconds) @@ -283,19 +283,19 @@ if(emagged) var/turf/T = get_turf(src) - T.audible_message("Tape Recorder: This tape recorder will self-destruct in... Five.", runemessage = "beep beep") + T.audible_message(span_maroon("Tape Recorder: This tape recorder will self-destruct in... Five."), runemessage = "beep beep") sleep(10) T = get_turf(src) - T.audible_message("Tape Recorder: Four.") + T.audible_message(span_maroon("Tape Recorder: Four.")) sleep(10) T = get_turf(src) - T.audible_message("Tape Recorder: Three.") + T.audible_message(span_maroon("Tape Recorder: Three.")) sleep(10) T = get_turf(src) - T.audible_message("Tape Recorder: Two.") + T.audible_message(span_maroon("Tape Recorder: Two.")) sleep(10) T = get_turf(src) - T.audible_message("Tape Recorder: One.") + T.audible_message(span_maroon("Tape Recorder: One.")) sleep(10) explode() diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm index 1109d204068..2ced1325123 100644 --- a/code/game/objects/items/devices/translocator_vr.dm +++ b/code/game/objects/items/devices/translocator_vr.dm @@ -301,11 +301,11 @@ This device records all warnings given and teleport events for admin review in c if(isbelly(real_dest)) var/obj/belly/B = real_dest if(!(target.can_be_drop_prey) && B.owner != user) - to_chat(target,"\The [src] narrowly avoids teleporting you right into \a [lowertext(real_dest.name)]!") + to_chat(target,"\The [src] narrowly avoids teleporting you right into \a [lowertext(real_dest.name)]!") real_dest = dT //Nevermind! else televored = TRUE - to_chat(target,"\The [src] teleports you right into \a [lowertext(real_dest.name)]!") + to_chat(target,"\The [src] teleports you right into \a [lowertext(real_dest.name)]!") //Phase-out effect phase_out(target,get_turf(target)) diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 474ef45c6b3..34892beab26 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -18,31 +18,39 @@ return 1 return 0 +/* ###################################################################################################### + # Utility section. All reusable upgrades without lasting effects, like renaming, reset, etc. go here.# + ######################################################################################################*/ -/obj/item/borg/upgrade/reset +/obj/item/borg/upgrade/utility + module_flags = BORG_UTILITY + +/obj/item/borg/upgrade/utility/reset name = "robotic module reset board" - desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." + desc = "Used to reset a cyborg's module. Destroys any higher than basic upgrades applied to the robot." icon_state = "cyborg_upgrade1" item_state = "cyborg_upgrade" require_module = 1 -/obj/item/borg/upgrade/reset/action(var/mob/living/silicon/robot/R) - if(..()) - return 0 +/obj/item/borg/upgrade/utility/reset/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + R.module_reset() return 1 -/obj/item/borg/upgrade/rename +/obj/item/borg/upgrade/utility/rename name = "robot reclassification board" desc = "Used to rename a cyborg." icon_state = "cyborg_upgrade1" item_state = "cyborg_upgrade" var/heldname = "default name" -/obj/item/borg/upgrade/rename/attack_self(mob/user as mob) - heldname = sanitizeSafe(tgui_input_text(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN), MAX_NAME_LEN) +/obj/item/borg/upgrade/utility/rename/attack_self(mob/user as mob) + var/new_name = sanitizeSafe(tgui_input_text(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN), MAX_NAME_LEN) + if(new_name) + heldname = new_name -/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/utility/rename/action(var/mob/living/silicon/robot/R) if(..()) return 0 R.notify_ai(ROBOT_NOTIFICATION_NEW_NAME, R.name, heldname) R.name = heldname @@ -51,14 +59,17 @@ return 1 -/obj/item/borg/upgrade/restart +/obj/item/borg/upgrade/utility/restart name = "robot emergency restart module" desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." icon_state = "cyborg_upgrade1" item_state = "cyborg_upgrade" -/obj/item/borg/upgrade/restart/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/utility/restart/action(var/mob/living/silicon/robot/R) + if(R.stat == CONSCIOUS) + return 0 + if(R.health < 0) to_chat(usr, "You have to repair the robot before using this module!") return 0 @@ -75,25 +86,257 @@ R.notify_ai(ROBOT_NOTIFICATION_NEW_UNIT) return 1 +/* ################################################################################### + # Basic section. All upgrades which effect the robot's variables directly go here.# + ###################################################################################*/ + +/obj/item/borg/upgrade/basic + module_flags = BORG_BASIC -/obj/item/borg/upgrade/vtec +/obj/item/borg/upgrade/basic/vtec name = "robotic VTEC Module" desc = "Used to kick in a robot's VTEC systems, increasing their speed." icon_state = "cyborg_upgrade2" item_state = "cyborg_upgrade" require_module = 1 -/obj/item/borg/upgrade/vtec/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/basic/vtec/action(var/mob/living/silicon/robot/R) if(..()) return 0 - if(R.speed == -1 || (/mob/living/silicon/robot/proc/toggle_vtec in R.verbs)) + if(R.has_basic_upgrade(type)) + to_chat(R, "Actuator already running on overdrive mode!") + to_chat(usr, "It'd be unwise to plug another vtec module in!") return 0 + R.verbs += /mob/living/silicon/robot/proc/toggle_vtec - R.speed-- + R.speed = -1 + return 1 + +/obj/item/borg/upgrade/basic/sizeshift + name = "robot size alteration module" + desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary." + icon_state = "cyborg_upgrade2" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/basic/sizeshift/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.has_basic_upgrade(type)) + to_chat(R, "Size alteration module already applied!") + to_chat(usr, "There's no space for another size alteration module!") + return 0 + + R.verbs += /mob/living/proc/set_size + return 1 + +/obj/item/borg/upgrade/basic/syndicate + name = "scrambled equipment module" + desc = "Unlocks new and often deadly module specific items of a robot" + icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/basic/syndicate/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.has_basic_upgrade(type)) + to_chat(R, "Secret modules already unlocked!") + to_chat(usr, "Plugging another scambled module would be useless!") + return 0 + + R.emag_items = 1 + return 1 + +/obj/item/borg/upgrade/basic/language + name = "language module" + desc = "Used to let cyborgs other than clerical or service speak a variety of languages." + icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" + +/obj/item/borg/upgrade/basic/language/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.has_basic_upgrade(type)) + to_chat(R, "All possible languages already uploaded!") + to_chat(usr, "The language database is up to date!") + return 0 + + R.add_language(LANGUAGE_SOL_COMMON, 1) + R.add_language(LANGUAGE_TRADEBAND, 1) + R.add_language(LANGUAGE_UNATHI, 1) + R.add_language(LANGUAGE_SIIK, 1) + R.add_language(LANGUAGE_AKHANI, 1) + R.add_language(LANGUAGE_SKRELLIAN, 1) + R.add_language(LANGUAGE_GUTTER, 1) + R.add_language(LANGUAGE_SCHECHI, 1) + R.add_language(LANGUAGE_ROOTLOCAL, 1) + R.add_language(LANGUAGE_TERMINUS, 1) + R.add_language(LANGUAGE_ZADDAT, 1) + R.add_language(LANGUAGE_BIRDSONG, 1) + R.add_language(LANGUAGE_SAGARU, 1) + R.add_language(LANGUAGE_CANILUNZT, 1) + R.add_language(LANGUAGE_ECUREUILIAN, 1) + R.add_language(LANGUAGE_DAEMON, 1) + R.add_language(LANGUAGE_ENOCHIAN, 1) + R.add_language(LANGUAGE_DRUDAKAR, 1) + R.add_language(LANGUAGE_TAVAN, 1) + R.add_language(LANGUAGE_SIGN, 1) + R.add_language(LANGUAGE_VOX, 1) + R.add_language(LANGUAGE_ALAI, 1) + R.add_language(LANGUAGE_PROMETHEAN, 1) + R.add_language(LANGUAGE_GIBBERISH, 1) + R.add_language(LANGUAGE_VESPINAE, 1) + R.add_language(LANGUAGE_SPACER, 1) + R.add_language(LANGUAGE_MOUSE, 1) + R.add_language(LANGUAGE_ANIMAL, 1) + R.add_language(LANGUAGE_TEPPI, 1) + /* Admin Stuff + R.add_language(LANGUAGE_CULT, 1) + R.add_language(LANGUAGE_SWARMBOT, 1) + R.add_language(LANGUAGE_MINBUS, 1) + R.add_language(LANGUAGE_EVENT1, 1) + */ + /* We don't want telepathy, but want to mark it that it's not been oversighted + R.add_language(LANGUAGE_CHANGELING, 1) + R.add_language(LANGUAGE_ROOTGLOBAL, 1) + R.add_language(LANGUAGE_SHADEKIN, 1) + */ + + return 1 + +/* ########################################################################### + # Advanced section. All upgrades which effect the robot's modules go here.# + ###########################################################################*/ + +/obj/item/borg/upgrade/advanced + module_flags = BORG_ADVANCED + +/obj/item/borg/upgrade/advanced/bellysizeupgrade + name = "robohound capacity expansion module" + desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once." + icon_state = "cyborg_upgrade2" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/advanced/bellysizeupgrade/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + var/obj/T = R.has_upgrade_module(/obj/item/device/dogborg/sleeper) + if(!T) + to_chat(usr, "This robot has had its processor removed!") + return 0 + + if(R.has_advanced_upgrade(type)) + to_chat(R, "Maximum capacity achieved for this hardpoint!") + to_chat(usr, "There's no room for another capacity upgrade!") + return 0 + + var/obj/item/device/dogborg/sleeper/B = T + var/X = B.max_item_count*2 + B.max_item_count = X //I couldn't do T = maxitem*2 for some reason. + to_chat(R, "Internal capacity doubled.") + to_chat(usr, "Internal capacity doubled.") + B.upgraded_capacity = TRUE + return 1 + +/obj/item/borg/upgrade/advanced/jetpack + name = "robot jetpack" + desc = "A carbon dioxide jetpack suitable for low-gravity operations." + icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/advanced/jetpack/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.has_advanced_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide(R.module) + for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules) + R.internals = src + return 1 + +/obj/item/borg/upgrade/advanced/advhealth + name = "advanced health analyzer module" + desc = "An Advanced Health Analyzer, optimized for borg mounting." + icon_state = "cyborg_upgrade3" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/advanced/advhealth/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.has_advanced_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + R.module.modules += new/obj/item/device/healthanalyzer/advanced(R.module) + return 1 + +//Robot size gun +/obj/item/borg/upgrade/advanced/sizegun + name = "robot mounted size gun" + desc = "A size gun adapted for installation in cyborgs, allows them to turn people pocket-sized among other uses. What could go wrong?" + icon_state = "cyborg_upgrade2" + item_state = "cyborg_upgrade" + require_module = 1 + +/obj/item/borg/upgrade/advanced/sizegun/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(R.has_advanced_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + R.module.modules += new/obj/item/weapon/gun/energy/sizegun/mounted(R.module) return 1 +/* ############################################################################## + # Restricted section. All upgrades which only work on specific modules go here.# + ##############################################################################*/ + +//adds the capability to ingest items to the sleeper modules as optional upgrade +/obj/item/borg/upgrade/restricted/bellycapupgrade + name = "robohound capability expansion module" + desc = "Used to enable a robohound's sleeper to ingest items. This only affects sleepers, and has no effect on compactor bellies. Can only be applied once." + icon_state = "cyborg_upgrade2" + item_state = "cyborg_upgrade" + require_module = 1 + module_flags = BORG_MODULE_SECURITY | BORG_MODULE_MEDICAL | BORG_MODULE_COMBAT + +/obj/item/borg/upgrade/restricted/bellycapupgrade/action(var/mob/living/silicon/robot/R) + if(..()) return 0 + + if(!R.supports_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + var/obj/T = R.has_upgrade_module(/obj/item/device/dogborg/sleeper) + if(!T) + to_chat(usr, "This robot has had its processor removed!") + return 0 + + if(R.has_restricted_upgrade(type)) + to_chat(R, "Maximum capability achieved for this hardpoint!") + to_chat(usr, "There's no room for another capability upgrade!") + return 0 + + var/obj/item/device/dogborg/sleeper/B = T + var/X = B.max_item_count*2 //double the capacity from 1 to 2 to allow sleepers to store some items, at most 4 with both upgrades + B.max_item_count = X //I couldn't do T = maxitem*2 for some reason. + to_chat(R, "Internal capability upgraded.") + to_chat(usr, "Internal capability upgraded.") + B.compactor = TRUE + return 1 -/obj/item/borg/upgrade/tasercooler +/obj/item/borg/upgrade/restricted/tasercooler name = "robotic Rapid Taser Cooling Module" desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." icon_state = "cyborg_upgrade3" @@ -102,116 +345,125 @@ require_module = 1 -/obj/item/borg/upgrade/tasercooler/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/restricted/tasercooler/action(var/mob/living/silicon/robot/R) if(..()) return 0 - if(!R.module || !(type in R.module.supported_upgrades)) + if(!R.supports_upgrade(type)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") return 0 - var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules + var/obj/T = R.has_upgrade_module(/obj/item/weapon/gun/energy/taser/mounted/cyborg) if(!T) to_chat(usr, "This robot has had its taser removed!") return 0 - if(T.recharge_time <= 2) + if(R.has_restricted_upgrade(type)) to_chat(R, "Maximum cooling achieved for this hardpoint!") to_chat(usr, "There's no room for another cooling unit!") return 0 - else - T.recharge_time = max(2 , T.recharge_time - 4) - + var/obj/item/weapon/gun/energy/taser/mounted/cyborg/B = T + B.recharge_time = max(2 , B.recharge_time - 4) return 1 -/obj/item/borg/upgrade/jetpack - name = "robot jetpack" - desc = "A carbon dioxide jetpack suitable for low-gravity operations." +//Advanced RPED +/obj/item/borg/upgrade/restricted/advrped + name = "Advanced Rapid Part Exchange Device" + desc = "An ARPED, now in borg size!" icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" + module_flags = BORG_MODULE_SCIENCE require_module = 1 -/obj/item/borg/upgrade/jetpack/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/restricted/advrped/action(var/mob/living/silicon/robot/R) if(..()) return 0 - var/obj/item/weapon/tank/jetpack/carbondioxide/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/weapon/tank/jetpack/carbondioxide(R.module) - for(var/obj/item/weapon/tank/jetpack/carbondioxide in R.module.modules) - R.internals = src - return 1 - if(T) + if(!R.supports_upgrade(type)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") return 0 -/obj/item/borg/upgrade/advhealth - name = "advanced health analyzer module" - desc = "An Advanced Health Analyzer, optimized for borg mounting." + if(R.has_restricted_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + R.module.modules += new/obj/item/weapon/storage/part_replacer/adv(R.module) + return 1 + +//Diamond Drill +/obj/item/borg/upgrade/restricted/diamonddrill + name = "Mounted Diamond Drill" + desc = "An advanced drill, optimized for borg use." icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" + module_flags = BORG_MODULE_MINER require_module = 1 -/obj/item/borg/upgrade/advhealth/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/restricted/diamonddrill/action(var/mob/living/silicon/robot/R) if(..()) return 0 - var/obj/item/device/healthanalyzer/advanced/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/device/healthanalyzer/advanced(R.module) - return 1 - if(T) + if(!R.supports_upgrade(type)) to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") to_chat(usr, "There's no mounting point for the module!") return 0 -/obj/item/borg/upgrade/syndicate/ - name = "scrambled equipment module" - desc = "Unlocks new and often deadly module specific items of a robot" + if(R.has_restricted_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + R.module.modules += new/obj/item/weapon/pickaxe/diamonddrill(R.module) + return 1 + +//PKA +/obj/item/borg/upgrade/restricted/pka + name = "Protokenetic Accelerator Upgrade" + desc = "A borg mounted PKA Rifle for use in mining and wildlife defense." icon_state = "cyborg_upgrade3" item_state = "cyborg_upgrade" + module_flags = BORG_MODULE_MINER require_module = 1 -/obj/item/borg/upgrade/syndicate/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/restricted/pka/action(var/mob/living/silicon/robot/R) if(..()) return 0 - if(R.emag_items == 1) + if(!R.supports_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") return 0 - R.emag_items = 1 + if(R.has_restricted_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + + R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module) return 1 -/obj/item/borg/upgrade/language - name = "language module" - desc = "Used to let cyborgs other than clerical or service speak a variety of languages." - icon_state = "cyborg_upgrade3" +/* ############################################### + # Unsorted section. All cargo modules go here.# + ###############################################*/ + +/obj/item/borg/upgrade/no_prod + var/hidden_from_scan = 0//use this for unproduceable modules you want to hide from scanning (e.g. event tools / admeme) + +//cyborg foam dart gun +/obj/item/borg/upgrade/no_prod/toygun + name = "Donk-Soft Cyborg Blaster module" //Cyborg Blaster is capitalized because it's the brand name + desc = "A foam dart gun designed for mounting into cyborgs. It's Donk or Don't! DISCLAIMER: Donk-Soft bears no responsibility for incidents relating to cyborgs becoming too accustomed to shooting at crew. Installation of the Donk-Soft Cyborg Blaster must be performed only by a licensed roboticist." + icon_state = "cyborg_upgrade5" item_state = "cyborg_upgrade" + require_module = 1 -/obj/item/borg/upgrade/language/action(var/mob/living/silicon/robot/R) +/obj/item/borg/upgrade/no_prod/toygun/action(var/mob/living/silicon/robot/R) if(..()) return 0 - R.add_language(LANGUAGE_SOL_COMMON, 1) - R.add_language(LANGUAGE_TRADEBAND, 1) - R.add_language(LANGUAGE_UNATHI, 1) - R.add_language(LANGUAGE_SIIK, 1) - R.add_language(LANGUAGE_AKHANI, 1) - R.add_language(LANGUAGE_SKRELLIAN, 1) - R.add_language(LANGUAGE_GUTTER, 1) - R.add_language(LANGUAGE_SCHECHI, 1) - R.add_language(LANGUAGE_ROOTLOCAL, 1) - R.add_language(LANGUAGE_TERMINUS, 1) - R.add_language(LANGUAGE_ZADDAT, 1) + if(R.has_no_prod_upgrade(type)) + to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") + to_chat(usr, "There's no mounting point for the module!") + return 0 + R.module.modules += new/obj/item/weapon/gun/projectile/cyborgtoy(R.module) return 1 diff --git a/code/game/objects/items/robot/robot_upgrades_vr.dm b/code/game/objects/items/robot/robot_upgrades_vr.dm deleted file mode 100644 index 4b80bdc03e6..00000000000 --- a/code/game/objects/items/robot/robot_upgrades_vr.dm +++ /dev/null @@ -1,242 +0,0 @@ -/obj/item/borg/upgrade/language/action(var/mob/living/silicon/robot/R) - if(..()) - R.add_language(LANGUAGE_BIRDSONG, 1) - R.add_language(LANGUAGE_SAGARU, 1) - R.add_language(LANGUAGE_CANILUNZT, 1) - R.add_language(LANGUAGE_ECUREUILIAN, 1) - R.add_language(LANGUAGE_DAEMON, 1) - R.add_language(LANGUAGE_ENOCHIAN, 1) - R.add_language(LANGUAGE_DRUDAKAR, 1) - R.add_language(LANGUAGE_TAVAN, 1) - return 1 - else - return 0 - -//Robot resizing module - -/obj/item/borg/upgrade/sizeshift - name = "robot size alteration module" - desc = "Using technology similar to one used in sizeguns, allows cyborgs to adjust their own size as neccesary." - icon_state = "cyborg_upgrade2" - item_state = "cyborg_upgrade" - require_module = 1 - -/obj/item/borg/upgrade/sizeshift/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - if(/mob/living/proc/set_size in R.verbs) - return 0 - - R.verbs += /mob/living/proc/set_size - return 1 - -//Robot size gun -/obj/item/borg/upgrade/sizegun - name = "robot mounted size gun" - desc = "A size gun adapted for installation in cyborgs, allows them to turn people pocket-sized among other uses. What could go wrong?" - icon_state = "cyborg_upgrade2" - item_state = "cyborg_upgrade" - require_module = 1 - -/obj/item/borg/upgrade/sizegun/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - var/obj/item/weapon/gun/energy/sizegun/mounted/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/weapon/gun/energy/sizegun/mounted(R.module) - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - -/obj/item/borg/upgrade/bellysizeupgrade - name = "robohound capacity expansion module" - desc = "Used to double a robohound's belly capacity. This only affects total volume, and won't allow support of more than one patient in case of sleeper bellies. Can only be applied once." - icon_state = "cyborg_upgrade2" - item_state = "cyborg_upgrade" - require_module = 1 - -/obj/item/borg/upgrade/bellysizeupgrade/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - if(!R.module)//can work - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - - var/obj/item/device/dogborg/sleeper/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - to_chat(usr, "This robot has had its processor removed!") - return 0 - - if(T.upgraded_capacity)// == TRUE - to_chat(R, "Maximum capacity achieved for this hardpoint!") - to_chat(usr, "There's no room for another capacity upgrade!") - return 0 - else - var/X = T.max_item_count*2 - T.max_item_count = X //I couldn't do T = maxitem*2 for some reason. - to_chat(R, "Internal capacity doubled.") - to_chat(usr, "Internal capacity doubled.") - T.upgraded_capacity = TRUE - return 1 - -//adds the capability to ingest items to the sleeper modules as optional upgrade -/obj/item/borg/upgrade/bellycapupgrade - name = "robohound capability expansion module" - desc = "Used to enable a robohound's sleeper to ingest items. This only affects sleepers, and has no effect on compactor bellies. Can only be applied once." - icon_state = "cyborg_upgrade2" - item_state = "cyborg_upgrade" - require_module = 1 - -/obj/item/borg/upgrade/bellycapupgrade/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - if(!R.module)//can work - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - - var/obj/item/device/dogborg/sleeper/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - to_chat(usr, "This robot has had its processor removed!") - return 0 - - if(T.compactor)// == TRUE, the belly unit is a compactor and no sleeper unit already - to_chat(R, "Maximum capability achieved for this hardpoint!") - to_chat(usr, "There's no room for another capability upgrade!") - return 0 - else - var/X = T.max_item_count*2 //double the capacity from 1 to 2 to allow sleepers to store some items, at most 4 with both upgrades - T.max_item_count = X //I couldn't do T = maxitem*2 for some reason. - to_chat(R, "Internal capability upgraded.") - to_chat(usr, "Internal capability upgraded.") - T.compactor = TRUE - return 1 - -//Advanced RPED -/obj/item/borg/upgrade/advrped - name = "Advanced Rapid Part Exchange Device" - desc = "An ARPED, now in borg size!" - icon_state = "cyborg_upgrade3" - item_state = "cyborg_upgrade" - module_flags = BORG_MODULE_SCIENCE - require_module = 1 - -/obj/item/borg/upgrade/advrped/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - var/obj/item/weapon/storage/part_replacer/adv/T = locate() in R.module - - if(!R.module || !(type in R.module.supported_upgrades)) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/weapon/storage/part_replacer/adv(R.module) - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - -//Diamond Drill -/obj/item/borg/upgrade/diamonddrill - name = "Mounted Diamond Drill" - desc = "An advanced drill, optimized for borg use." - icon_state = "cyborg_upgrade3" - item_state = "cyborg_upgrade" - module_flags = BORG_MODULE_MINER - require_module = 1 - -/obj/item/borg/upgrade/diamonddrill/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - var/obj/item/weapon/pickaxe/diamonddrill/T = locate() in R.module - - if(!R.module || !(type in R.module.supported_upgrades)) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/weapon/pickaxe/diamonddrill(R.module) - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - -//PKA -/obj/item/borg/upgrade/pka - name = "Protokenetic Accelerator Upgrade" - desc = "A borg mounted PKA Rifle for use in mining and wildlife defense." - icon_state = "cyborg_upgrade3" - item_state = "cyborg_upgrade" - module_flags = BORG_MODULE_MINER - require_module = 1 - -/obj/item/borg/upgrade/pka/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - var/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/T = locate() in R.module - - if(!R.module || !(type in R.module.supported_upgrades)) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg(R.module) - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 - -//cyborg foam dart gun -/obj/item/borg/upgrade/toygun - name = "Donk-Soft Cyborg Blaster module" //Cyborg Blaster is capitalized because it's the brand name - desc = "A foam dart gun designed for mounting into cyborgs. It's Donk or Don't! DISCLAIMER: Donk-Soft bears no responsibility for incidents relating to cyborgs becoming too accustomed to shooting at crew. Installation of the Donk-Soft Cyborg Blaster must be performed only by a licensed roboticist." - icon_state = "cyborg_upgrade5" - item_state = "cyborg_upgrade" - require_module = 1 - -/obj/item/borg/upgrade/toygun/action(var/mob/living/silicon/robot/R) - if(..()) return 0 - - var/obj/item/weapon/gun/projectile/cyborgtoy/T = locate() in R.module - if(!T) - T = locate() in R.module.contents - if(!T) - T = locate() in R.module.modules - if(!T) - R.module.modules += new/obj/item/weapon/gun/projectile/cyborgtoy(R.module) - return 1 - if(T) - to_chat(R, "Upgrade mounting error! No suitable hardpoint detected!") - to_chat(usr, "There's no mounting point for the module!") - return 0 diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index dbae1eead78..5432d46f32d 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -50,7 +50,7 @@ if(W.has_tool_quality(TOOL_WELDER) && material.shard_can_repair) var/obj/item/weapon/weldingtool/WT = W.get_welder() if(WT.remove_fuel(0, user)) - material.place_sheet(loc) + material.place_sheet(loc, 1) qdel(src) return return ..() diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index f930b12ddce..15ae2c9d4f8 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -335,7 +335,7 @@ /obj/item/weapon/storage/box/mousetraps name = "box of Pest-B-Gon mousetraps" - desc = "WARNING: Keep out of reach of children." + desc = span_red("WARNING:") + " Keep out of reach of children." icon_state = "mousetraps" starts_with = list(/obj/item/device/assembly/mousetrap = 7) @@ -504,4 +504,4 @@ name = "box of sin-pockets" desc = "Instructions: Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes." icon_state = "donk_kit" - starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 7) \ No newline at end of file + starts_with = list(/obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket = 7) diff --git a/code/game/objects/structures/crates_lockers/crates_vr.dm b/code/game/objects/structures/crates_lockers/crates_vr.dm index 5ebf9894e93..8825c25d834 100644 --- a/code/game/objects/structures/crates_lockers/crates_vr.dm +++ b/code/game/objects/structures/crates_lockers/crates_vr.dm @@ -7,7 +7,7 @@ if(locked && tamper_proof && health <= Proj.damage) if(tamper_proof == 2) // Mainly used for events to prevent any chance of opening the box improperly. - visible_message("The anti-tamper mechanism of [src] triggers an explosion!") + visible_message(span_red("The anti-tamper mechanism of [src] triggers an explosion!")) var/turf/T = get_turf(src.loc) explosion(T, 0, 0, 0, 1) // Non-damaging, but it'll alert security. qdel(src) @@ -15,18 +15,18 @@ var/open_chance = rand(1,5) switch(open_chance) if(1) - visible_message("The anti-tamper mechanism of [src] causes an explosion!") + visible_message(span_red("The anti-tamper mechanism of [src] causes an explosion!")) var/turf/T = get_turf(src.loc) explosion(T, 0, 0, 0, 1) // Non-damaging, but it'll alert security. qdel(src) if(2 to 4) - visible_message("The anti-tamper mechanism of [src] causes a small fire!") + visible_message(span_red("The anti-tamper mechanism of [src] causes a small fire!")) for(var/atom/movable/A as mob|obj in src) // For every item in the box, we spawn a pile of ash. new /obj/effect/decal/cleanable/ash(src.loc) new /obj/fire(src.loc) qdel(src) if(5) - visible_message("The anti-tamper mechanism of [src] fails!") + visible_message(span_green("The anti-tamper mechanism of [src] fails!")) return ..() diff --git a/code/game/objects/structures/dancepole_vr.dm b/code/game/objects/structures/dancepole_vr.dm index c44ff91fb9b..739d50643ce 100644 --- a/code/game/objects/structures/dancepole_vr.dm +++ b/code/game/objects/structures/dancepole_vr.dm @@ -24,9 +24,9 @@ anchored = !anchored playsound(src, O.usesound, 50, 1) if(anchored) - to_chat(user, "You secure \the [src].") + to_chat(user, span_blue("You secure \the [src].")) else - to_chat(user, "You unsecure \the [src].") + to_chat(user, span_blue("You unsecure \the [src].")) if(O.has_tool_quality(TOOL_WRENCH)) playsound(src, O.usesound, 50, 1) to_chat(user, "Now disassembling \the [src]...") diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 0100167a05a..a43a15afbe3 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -349,7 +349,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/weapon/stock_parts/subspace/treatment, /obj/item/frame, /obj/item/broken_device/random, - /obj/item/borg/upgrade/restart, + /obj/item/borg/upgrade/utility/restart, /obj/item/weapon/cell, /obj/item/weapon/cell/high, /obj/item/weapon/cell/device, @@ -407,10 +407,10 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/device/tvcamera, /obj/item/device/universal_translator, /obj/item/device/aicard, - /obj/item/borg/upgrade/jetpack, - /obj/item/borg/upgrade/advhealth, - /obj/item/borg/upgrade/vtec, - /obj/item/borg/upgrade/tasercooler, + /obj/item/borg/upgrade/advanced/jetpack, + /obj/item/borg/upgrade/advanced/advhealth, + /obj/item/borg/upgrade/basic/vtec, + /obj/item/borg/upgrade/restricted/tasercooler, /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser, /obj/item/mecha_parts/mecha_equipment/tool/drill/diamonddrill, /obj/item/rig_module/device/drill, @@ -917,11 +917,11 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh rare_loot = list( /obj/item/weapon/cell/super, - /obj/item/borg/upgrade/restart, - /obj/item/borg/upgrade/jetpack, - /obj/item/borg/upgrade/tasercooler, - /obj/item/borg/upgrade/syndicate, - /obj/item/borg/upgrade/vtec + /obj/item/borg/upgrade/utility/restart, + /obj/item/borg/upgrade/advanced/jetpack, + /obj/item/borg/upgrade/restricted/tasercooler, + /obj/item/borg/upgrade/basic/syndicate, + /obj/item/borg/upgrade/basic/vtec ) // Contains old mediciation, most of it unidentified and has a good chance of being useless. @@ -946,4 +946,4 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh common_loot = list( /obj/random/unidentified_medicine/fresh_medicine - ) \ No newline at end of file + ) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 486ea6958ef..dcd2bdf46c8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -1,388 +1,388 @@ -/* Beds... get your mind out of the gutter, they're for sleeping! - * Contains: - * Beds - * Roller beds - */ - -/* - * Beds - */ -/obj/structure/bed - name = "bed" - desc = "This is used to lie in, sleep in or strap on." - icon = 'icons/obj/furniture.dmi' - icon_state = "bed" - pressure_resistance = 15 - anchored = TRUE - can_buckle = TRUE - buckle_dir = SOUTH - buckle_lying = 1 - var/datum/material/material - var/datum/material/padding_material - var/base_icon = "bed" - var/applies_material_colour = 1 - -/obj/structure/bed/New(var/newloc, var/new_material, var/new_padding_material) - ..(newloc) - color = null - if(!new_material) - new_material = MAT_STEEL - material = get_material_by_name(new_material) - if(!istype(material)) - qdel(src) - return - if(new_padding_material) - padding_material = get_material_by_name(new_padding_material) - update_icon() - -/obj/structure/bed/get_material() - return material - -// Reuse the cache/code from stools, todo maybe unify. -/obj/structure/bed/update_icon() - // Prep icon. - icon_state = "" - cut_overlays() - // Base icon. - var/cache_key = "[base_icon]-[material.name]" - if(isnull(stool_cache[cache_key])) - var/image/I = image(icon, base_icon) - if(applies_material_colour) //VOREStation Add - Goes with added var - I.color = material.icon_colour - stool_cache[cache_key] = I - add_overlay(stool_cache[cache_key]) - // Padding overlay. - if(padding_material) - var/padding_cache_key = "[base_icon]-padding-[padding_material.name]" - if(isnull(stool_cache[padding_cache_key])) - var/image/I = image(icon, "[base_icon]_padding") - I.color = padding_material.icon_colour - stool_cache[padding_cache_key] = I - add_overlay(stool_cache[padding_cache_key]) - // Strings. - desc = initial(desc) - if(padding_material) - name = "[padding_material.display_name] [initial(name)]" //this is not perfect but it will do for now. - desc += " It's made of [material.use_name] and covered with [padding_material.use_name]." - else - name = "[material.display_name] [initial(name)]" - desc += " It's made of [material.use_name]." - -/obj/structure/bed/CanPass(atom/movable/mover, turf/target) - if(istype(mover) && mover.checkpass(PASSTABLE)) - return TRUE - return ..() - -/obj/structure/bed/ex_act(severity) - switch(severity) - if(1.0) - qdel(src) - return - if(2.0) - if (prob(50)) - qdel(src) - return - if(3.0) - if (prob(5)) - qdel(src) - return - -/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.has_tool_quality(TOOL_WRENCH)) - playsound(src, W.usesound, 50, 1) - dismantle() - qdel(src) - else if(istype(W,/obj/item/stack)) - if(padding_material) - to_chat(user, "\The [src] is already padded.") - return - var/obj/item/stack/C = W - if(C.get_amount() < 1) // How?? - user.drop_from_inventory(C) - qdel(C) - return - var/padding_type //This is awful but it needs to be like this until tiles are given a material var. - if(istype(W,/obj/item/stack/tile/carpet)) - padding_type = "carpet" - else if(istype(W,/obj/item/stack/material)) - var/obj/item/stack/material/M = W - if(M.material && (M.material.flags & MATERIAL_PADDING)) - padding_type = "[M.material.name]" - if(!padding_type) - to_chat(user, "You cannot pad \the [src] with that.") - return - C.use(1) - if(!istype(src.loc, /turf)) - user.drop_from_inventory(src) - src.loc = get_turf(src) - to_chat(user, "You add padding to \the [src].") - add_padding(padding_type) - return - - else if(W.has_tool_quality(TOOL_WIRECUTTER)) - if(!padding_material) - to_chat(user, "\The [src] has no padding to remove.") - return - to_chat(user, "You remove the padding from \the [src].") - playsound(src, W.usesound, 100, 1) - remove_padding() - - else if(istype(W, /obj/item/weapon/disk) || (istype(W, /obj/item/toy/plushie))) - user.drop_from_inventory(W, get_turf(src)) - W.pixel_x = 10 //make sure they reach the pillow - W.pixel_y = -6 - if(istype(W, /obj/item/weapon/disk)) - user.visible_message("[src] sleeps soundly. Sleep tight, disky.") - - else if(istype(W, /obj/item/weapon/grab)) - var/obj/item/weapon/grab/G = W - var/mob/living/affecting = G.affecting - if(has_buckled_mobs()) //Handles trying to buckle someone else to a chair when someone else is on it - to_chat(user, "\The [src] already has someone buckled to it.") - return - user.visible_message("[user] attempts to buckle [affecting] into \the [src]!") - if(do_after(user, 20, G.affecting)) - affecting.loc = loc - spawn(0) - if(buckle_mob(affecting)) - affecting.visible_message(\ - "[affecting.name] is buckled to [src] by [user.name]!",\ - "You are buckled to [src] by [user.name]!",\ - "You hear metal clanking.") - qdel(W) - else - ..() - -/obj/structure/bed/proc/remove_padding() - if(padding_material) - padding_material.place_sheet(get_turf(src)) - padding_material = null - update_icon() - -/obj/structure/bed/proc/add_padding(var/padding_type) - padding_material = get_material_by_name(padding_type) - update_icon() - -/obj/structure/bed/proc/dismantle() - material.place_sheet(get_turf(src)) - if(padding_material) - padding_material.place_sheet(get_turf(src)) - -/obj/structure/bed/psych - name = "psychiatrist's couch" - desc = "For prime comfort during psychiatric evaluations." - icon_state = "psychbed" - base_icon = "psychbed" - -/obj/structure/bed/psych/New(var/newloc) - ..(newloc,"wood","leather") - -/obj/structure/bed/padded/New(var/newloc) - ..(newloc,"plastic","cotton") - -/obj/structure/bed/double - name = "double bed" - icon_state = "doublebed" - base_icon = "doublebed" - -/obj/structure/bed/double/padded/New(var/newloc) - ..(newloc,"wood","cotton") - -/obj/structure/bed/double/post_buckle_mob(mob/living/M as mob) - if(M.buckled == src) - M.pixel_y = 13 - M.old_y = 13 - else - M.pixel_y = 0 - M.old_y = 0 - -/* - * Roller beds - */ -/obj/structure/bed/roller - name = "roller bed" - desc = "A portable bed-on-wheels made for transporting medical patients." - icon = 'icons/obj/rollerbed.dmi' - icon_state = "rollerbed" - anchored = FALSE - surgery_odds = 50 //VOREStation Edit - var/bedtype = /obj/structure/bed/roller - var/rollertype = /obj/item/roller - -/obj/structure/bed/roller/adv - name = "advanced roller bed" - icon_state = "rollerbedadv" - bedtype = /obj/structure/bed/roller/adv - rollertype = /obj/item/roller/adv - surgery_odds = 75 //YW Edit - -/obj/structure/bed/roller/update_icon() - return - -/obj/structure/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.has_tool_quality(TOOL_WRENCH) || istype(W,/obj/item/stack) || W.has_tool_quality(TOOL_WIRECUTTER)) - return - else if(istype(W,/obj/item/roller_holder)) - if(has_buckled_mobs()) - for(var/A in buckled_mobs) - user_unbuckle_mob(A, user) - else - visible_message("[user] collapses \the [src.name].") - new rollertype(get_turf(src)) - spawn(0) - qdel(src) - return - ..() - -/obj/item/roller - name = "roller bed" - desc = "A collapsed roller bed that can be carried around." - icon = 'icons/obj/rollerbed.dmi' - icon_state = "folded_rollerbed" - center_of_mass = list("x" = 17,"y" = 7) - slot_flags = SLOT_BACK - w_class = ITEMSIZE_LARGE - var/rollertype = /obj/item/roller - var/bedtype = /obj/structure/bed/roller - drop_sound = 'sound/items/drop/axe.ogg' - pickup_sound = 'sound/items/pickup/axe.ogg' - -/obj/item/roller/attack_self(mob/user) - var/obj/structure/bed/roller/R = new bedtype(user.loc) - R.add_fingerprint(user) - qdel(src) - -/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) - - if(istype(W,/obj/item/roller_holder)) - var/obj/item/roller_holder/RH = W - if(!RH.held) - to_chat(user, "You collect the roller bed.") - src.loc = RH - RH.held = src - return - - ..() - -/obj/item/roller/adv - name = "advanced roller bed" - desc = "A high-tech, compact version of the regular roller bed." - icon_state = "folded_rollerbedadv" - w_class = ITEMSIZE_NORMAL - rollertype = /obj/item/roller/adv - bedtype = /obj/structure/bed/roller/adv - -/obj/item/roller_holder - name = "roller bed rack" - desc = "A rack for carrying a collapsed roller bed." - icon = 'icons/obj/rollerbed.dmi' - icon_state = "rollerbed" - var/obj/item/roller/held - -/obj/item/roller_holder/New() - ..() - held = new /obj/item/roller(src) - -/obj/item/roller_holder/attack_self(mob/user as mob) - - if(!held) - to_chat(user, "The rack is empty.") - return - - to_chat(user, "You deploy the roller bed.") - var/obj/structure/bed/roller/R = new held.bedtype(user.loc) - R.add_fingerprint(user) - qdel(held) - held = null - - -/obj/structure/bed/roller/Moved(atom/old_loc, direction, forced = FALSE) - . = ..() - - playsound(src, 'sound/effects/roll.ogg', 100, 1) - -/obj/structure/bed/roller/post_buckle_mob(mob/living/M as mob) - if(M.buckled == src) - M.pixel_y = 6 - M.old_y = 6 - density = TRUE - icon_state = "[initial(icon_state)]_up" - else - M.pixel_y = 0 - M.old_y = 0 - density = FALSE - icon_state = "[initial(icon_state)]" - update_icon() - return ..() - -/obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location) - ..() - if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) - if(!ishuman(usr)) return - if(has_buckled_mobs()) return 0 - visible_message("[usr] collapses \the [src.name].") - new rollertype(get_turf(src)) - spawn(0) - qdel(src) - return - -/datum/category_item/catalogue/anomalous/precursor_a/alien_bed - name = "Precursor Alpha Object - Resting Contraption" - desc = "This appears to be a relatively long and flat object, with the top side being made of \ - an soft material, giving it very similar characteristics to an ordinary bed. If this object was \ - designed to act as a bed, this carries several implications for whatever species had built it, such as;\ -

    \ - Being capable of experiencing comfort, or at least being able to suffer from some form of fatigue.
    \ - Developing while under the influence of gravitational forces, to be able to 'lie' on the object.
    \ - Being within a range of sizes in order for the object to function as a bed. Too small, and the species \ - would be unable to reach the top of the object. Too large, and they would have little room to contact \ - the top side of the object.
    \ -

    \ - As a note, the size of this object appears to be within the bounds for an average human to be able to \ - rest comfortably on top of it." - value = CATALOGUER_REWARD_EASY - -/obj/structure/bed/alien - name = "resting contraption" - desc = "Whatever species designed this must've enjoyed relaxation as well. Looks vaguely comfy." - catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_bed) - icon = 'icons/obj/abductor.dmi' - icon_state = "bed" - -/obj/structure/bed/alien/update_icon() - return // Doesn't care about material or anything else. - -/obj/structure/bed/alien/attackby(obj/item/weapon/W, mob/user) - return // No deconning. - -/* - * Dirty Mattress - */ -/obj/structure/dirtybed - name = "dirty mattress" - desc = "A stained matress. Guess it's better than sleeping on the floor." - icon = 'icons/obj/furniture.dmi' - icon_state = "dirtybed" - pressure_resistance = 15 - anchored = TRUE - can_buckle = TRUE - buckle_dir = SOUTH - buckle_lying = 1 - -/obj/structure/dirtybed/attackby(obj/item/weapon/W as obj, mob/user as mob) - if(W.has_tool_quality(TOOL_WRENCH)) - playsound(src, W.usesound, 100, 1) - if(anchored) - user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") - else - user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") - - if(do_after(user, 20 * W.toolspeed)) - if(!src) return - to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") - anchored = !anchored - return - - if(!anchored) - to_chat(user," The bed isn't secured.") - return +/* Beds... get your mind out of the gutter, they're for sleeping! + * Contains: + * Beds + * Roller beds + */ + +/* + * Beds + */ +/obj/structure/bed + name = "bed" + desc = "This is used to lie in, sleep in or strap on." + icon = 'icons/obj/furniture.dmi' + icon_state = "bed" + pressure_resistance = 15 + anchored = TRUE + can_buckle = TRUE + buckle_dir = SOUTH + buckle_lying = 1 + var/datum/material/material + var/datum/material/padding_material + var/base_icon = "bed" + var/applies_material_colour = 1 + +/obj/structure/bed/New(var/newloc, var/new_material, var/new_padding_material) + ..(newloc) + color = null + if(!new_material) + new_material = MAT_STEEL + material = get_material_by_name(new_material) + if(!istype(material)) + qdel(src) + return + if(new_padding_material) + padding_material = get_material_by_name(new_padding_material) + update_icon() + +/obj/structure/bed/get_material() + return material + +// Reuse the cache/code from stools, todo maybe unify. +/obj/structure/bed/update_icon() + // Prep icon. + icon_state = "" + cut_overlays() + // Base icon. + var/cache_key = "[base_icon]-[material.name]" + if(isnull(stool_cache[cache_key])) + var/image/I = image(icon, base_icon) + if(applies_material_colour) //VOREStation Add - Goes with added var + I.color = material.icon_colour + stool_cache[cache_key] = I + add_overlay(stool_cache[cache_key]) + // Padding overlay. + if(padding_material) + var/padding_cache_key = "[base_icon]-padding-[padding_material.name]" + if(isnull(stool_cache[padding_cache_key])) + var/image/I = image(icon, "[base_icon]_padding") + I.color = padding_material.icon_colour + stool_cache[padding_cache_key] = I + add_overlay(stool_cache[padding_cache_key]) + // Strings. + desc = initial(desc) + if(padding_material) + name = "[padding_material.display_name] [initial(name)]" //this is not perfect but it will do for now. + desc += " It's made of [material.use_name] and covered with [padding_material.use_name]." + else + name = "[material.display_name] [initial(name)]" + desc += " It's made of [material.use_name]." + +/obj/structure/bed/CanPass(atom/movable/mover, turf/target) + if(istype(mover) && mover.checkpass(PASSTABLE)) + return TRUE + return ..() + +/obj/structure/bed/ex_act(severity) + switch(severity) + if(1.0) + qdel(src) + return + if(2.0) + if (prob(50)) + qdel(src) + return + if(3.0) + if (prob(5)) + qdel(src) + return + +/obj/structure/bed/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.has_tool_quality(TOOL_WRENCH)) + playsound(src, W.usesound, 50, 1) + dismantle() + qdel(src) + else if(istype(W,/obj/item/stack)) + if(padding_material) + to_chat(user, "\The [src] is already padded.") + return + var/obj/item/stack/C = W + if(C.get_amount() < 1) // How?? + user.drop_from_inventory(C) + qdel(C) + return + var/padding_type //This is awful but it needs to be like this until tiles are given a material var. + if(istype(W,/obj/item/stack/tile/carpet)) + padding_type = "carpet" + else if(istype(W,/obj/item/stack/material)) + var/obj/item/stack/material/M = W + if(M.material && (M.material.flags & MATERIAL_PADDING)) + padding_type = "[M.material.name]" + if(!padding_type) + to_chat(user, "You cannot pad \the [src] with that.") + return + C.use(1) + if(!istype(src.loc, /turf)) + user.drop_from_inventory(src) + src.loc = get_turf(src) + to_chat(user, "You add padding to \the [src].") + add_padding(padding_type) + return + + else if(W.has_tool_quality(TOOL_WIRECUTTER)) + if(!padding_material) + to_chat(user, "\The [src] has no padding to remove.") + return + to_chat(user, "You remove the padding from \the [src].") + playsound(src, W.usesound, 100, 1) + remove_padding() + + else if(istype(W, /obj/item/weapon/disk) || (istype(W, /obj/item/toy/plushie))) + user.drop_from_inventory(W, get_turf(src)) + W.pixel_x = 10 //make sure they reach the pillow + W.pixel_y = -6 + if(istype(W, /obj/item/weapon/disk)) + user.visible_message("[src] sleeps soundly. Sleep tight, disky.") + + else if(istype(W, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = W + var/mob/living/affecting = G.affecting + if(has_buckled_mobs()) //Handles trying to buckle someone else to a chair when someone else is on it + to_chat(user, "\The [src] already has someone buckled to it.") + return + user.visible_message("[user] attempts to buckle [affecting] into \the [src]!") + if(do_after(user, 20, G.affecting)) + affecting.loc = loc + spawn(0) + if(buckle_mob(affecting)) + affecting.visible_message(\ + "[affecting.name] is buckled to [src] by [user.name]!",\ + "You are buckled to [src] by [user.name]!",\ + "You hear metal clanking.") + qdel(W) + else + ..() + +/obj/structure/bed/proc/remove_padding() + if(padding_material) + padding_material.place_sheet(get_turf(src), 1) + padding_material = null + update_icon() + +/obj/structure/bed/proc/add_padding(var/padding_type) + padding_material = get_material_by_name(padding_type) + update_icon() + +/obj/structure/bed/proc/dismantle() + material.place_sheet(get_turf(src), 1) + if(padding_material) + padding_material.place_sheet(get_turf(src), 1) + +/obj/structure/bed/psych + name = "psychiatrist's couch" + desc = "For prime comfort during psychiatric evaluations." + icon_state = "psychbed" + base_icon = "psychbed" + +/obj/structure/bed/psych/New(var/newloc) + ..(newloc,"wood","leather") + +/obj/structure/bed/padded/New(var/newloc) + ..(newloc,"plastic","cotton") + +/obj/structure/bed/double + name = "double bed" + icon_state = "doublebed" + base_icon = "doublebed" + +/obj/structure/bed/double/padded/New(var/newloc) + ..(newloc,"wood","cotton") + +/obj/structure/bed/double/post_buckle_mob(mob/living/M as mob) + if(M.buckled == src) + M.pixel_y = 13 + M.old_y = 13 + else + M.pixel_y = 0 + M.old_y = 0 + +/* + * Roller beds + */ +/obj/structure/bed/roller + name = "roller bed" + desc = "A portable bed-on-wheels made for transporting medical patients." + icon = 'icons/obj/rollerbed.dmi' + icon_state = "rollerbed" + anchored = FALSE + surgery_odds = 50 //VOREStation Edit + var/bedtype = /obj/structure/bed/roller + var/rollertype = /obj/item/roller + +/obj/structure/bed/roller/adv + name = "advanced roller bed" + icon_state = "rollerbedadv" + bedtype = /obj/structure/bed/roller/adv + rollertype = /obj/item/roller/adv + surgery_odds = 75 //YW Edit + +/obj/structure/bed/roller/update_icon() + return + +/obj/structure/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.has_tool_quality(TOOL_WRENCH) || istype(W,/obj/item/stack) || W.has_tool_quality(TOOL_WIRECUTTER)) + return + else if(istype(W,/obj/item/roller_holder)) + if(has_buckled_mobs()) + for(var/A in buckled_mobs) + user_unbuckle_mob(A, user) + else + visible_message("[user] collapses \the [src.name].") + new rollertype(get_turf(src)) + spawn(0) + qdel(src) + return + ..() + +/obj/item/roller + name = "roller bed" + desc = "A collapsed roller bed that can be carried around." + icon = 'icons/obj/rollerbed.dmi' + icon_state = "folded_rollerbed" + center_of_mass = list("x" = 17,"y" = 7) + slot_flags = SLOT_BACK + w_class = ITEMSIZE_LARGE + var/rollertype = /obj/item/roller + var/bedtype = /obj/structure/bed/roller + drop_sound = 'sound/items/drop/axe.ogg' + pickup_sound = 'sound/items/pickup/axe.ogg' + +/obj/item/roller/attack_self(mob/user) + var/obj/structure/bed/roller/R = new bedtype(user.loc) + R.add_fingerprint(user) + qdel(src) + +/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + + if(istype(W,/obj/item/roller_holder)) + var/obj/item/roller_holder/RH = W + if(!RH.held) + to_chat(user, "You collect the roller bed.") + src.loc = RH + RH.held = src + return + + ..() + +/obj/item/roller/adv + name = "advanced roller bed" + desc = "A high-tech, compact version of the regular roller bed." + icon_state = "folded_rollerbedadv" + w_class = ITEMSIZE_NORMAL + rollertype = /obj/item/roller/adv + bedtype = /obj/structure/bed/roller/adv + +/obj/item/roller_holder + name = "roller bed rack" + desc = "A rack for carrying a collapsed roller bed." + icon = 'icons/obj/rollerbed.dmi' + icon_state = "rollerbed" + var/obj/item/roller/held + +/obj/item/roller_holder/New() + ..() + held = new /obj/item/roller(src) + +/obj/item/roller_holder/attack_self(mob/user as mob) + + if(!held) + to_chat(user, "The rack is empty.") + return + + to_chat(user, "You deploy the roller bed.") + var/obj/structure/bed/roller/R = new held.bedtype(user.loc) + R.add_fingerprint(user) + qdel(held) + held = null + + +/obj/structure/bed/roller/Moved(atom/old_loc, direction, forced = FALSE) + . = ..() + + playsound(src, 'sound/effects/roll.ogg', 100, 1) + +/obj/structure/bed/roller/post_buckle_mob(mob/living/M as mob) + if(M.buckled == src) + M.pixel_y = 6 + M.old_y = 6 + density = TRUE + icon_state = "[initial(icon_state)]_up" + else + M.pixel_y = 0 + M.old_y = 0 + density = FALSE + icon_state = "[initial(icon_state)]" + update_icon() + return ..() + +/obj/structure/bed/roller/MouseDrop(over_object, src_location, over_location) + ..() + if((over_object == usr && (in_range(src, usr) || usr.contents.Find(src)))) + if(!ishuman(usr)) return + if(has_buckled_mobs()) return 0 + visible_message("[usr] collapses \the [src.name].") + new rollertype(get_turf(src)) + spawn(0) + qdel(src) + return + +/datum/category_item/catalogue/anomalous/precursor_a/alien_bed + name = "Precursor Alpha Object - Resting Contraption" + desc = "This appears to be a relatively long and flat object, with the top side being made of \ + an soft material, giving it very similar characteristics to an ordinary bed. If this object was \ + designed to act as a bed, this carries several implications for whatever species had built it, such as;\ +

    \ + Being capable of experiencing comfort, or at least being able to suffer from some form of fatigue.
    \ + Developing while under the influence of gravitational forces, to be able to 'lie' on the object.
    \ + Being within a range of sizes in order for the object to function as a bed. Too small, and the species \ + would be unable to reach the top of the object. Too large, and they would have little room to contact \ + the top side of the object.
    \ +

    \ + As a note, the size of this object appears to be within the bounds for an average human to be able to \ + rest comfortably on top of it." + value = CATALOGUER_REWARD_EASY + +/obj/structure/bed/alien + name = "resting contraption" + desc = "Whatever species designed this must've enjoyed relaxation as well. Looks vaguely comfy." + catalogue_data = list(/datum/category_item/catalogue/anomalous/precursor_a/alien_bed) + icon = 'icons/obj/abductor.dmi' + icon_state = "bed" + +/obj/structure/bed/alien/update_icon() + return // Doesn't care about material or anything else. + +/obj/structure/bed/alien/attackby(obj/item/weapon/W, mob/user) + return // No deconning. + +/* + * Dirty Mattress + */ +/obj/structure/dirtybed + name = "dirty mattress" + desc = "A stained matress. Guess it's better than sleeping on the floor." + icon = 'icons/obj/furniture.dmi' + icon_state = "dirtybed" + pressure_resistance = 15 + anchored = TRUE + can_buckle = TRUE + buckle_dir = SOUTH + buckle_lying = 1 + +/obj/structure/dirtybed/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(W.has_tool_quality(TOOL_WRENCH)) + playsound(src, W.usesound, 100, 1) + if(anchored) + user.visible_message("[user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.") + else + user.visible_message("[user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.") + + if(do_after(user, 20 * W.toolspeed)) + if(!src) return + to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") + anchored = !anchored + return + + if(!anchored) + to_chat(user," The bed isn't secured.") + return diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index c22e3d5f1f0..7240c4fb21e 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -67,7 +67,7 @@ var/global/list/stool_cache = list() //haha stool /obj/item/weapon/stool/proc/remove_padding() if(padding_material) - padding_material.place_sheet(get_turf(src)) + padding_material.place_sheet(get_turf(src), 1) padding_material = null update_icon() @@ -104,9 +104,9 @@ var/global/list/stool_cache = list() //haha stool /obj/item/weapon/stool/proc/dismantle() if(material) - material.place_sheet(get_turf(src)) + material.place_sheet(get_turf(src), 1) if(padding_material) - padding_material.place_sheet(get_turf(src)) + padding_material.place_sheet(get_turf(src), 1) qdel(src) /obj/item/weapon/stool/attackby(obj/item/weapon/W as obj, mob/user as mob) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 8f5444aa211..19abe702b55 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -297,6 +297,91 @@ icon_state = "rubberducky" honk_sound = 'sound/voice/quack.ogg' //VOREStation edit +//Admin spawn duckies + +/obj/item/weapon/bikehorn/rubberducky/red + name = "rubber ducky" + desc = "From the depths of hell it arose, feathers glistening with crimson, a honk that struck fear into all men." //thanks doohl + icon = 'icons/obj/watercloset.dmi' + icon_state = "rubberducky_red" + honk_sound = 'sound/effects/adminhelp.ogg' + var/honk_count = 0 + +/obj/item/weapon/bikehorn/rubberducky/red/attack_self(mob/user as mob) + if(honk_count >= 3) + var/turf/epicenter = src.loc + explosion(epicenter, 0, 0, 1, 3) + qdel(src) + return + else if(spam_flag == 0) + spam_flag = 1 + playsound(src, honk_sound, 50, 1) + src.add_fingerprint(user) + honk_count ++ + spawn(20) + spam_flag = 0 + return + +/obj/item/weapon/bikehorn/rubberducky/blue + name = "rubber ducky" + desc = "The see me rollin', they hatin'." //thanks doohl + icon = 'icons/obj/watercloset.dmi' + icon_state = "rubberducky_blue" + honk_sound = 'sound/effects/bubbles.ogg' + var/honk_count = 0 + +/obj/item/weapon/bikehorn/rubberducky/blue/attack_self(mob/user as mob) + if(spam_flag == 0) + var/turf/simulated/whereweare = get_turf(src) + whereweare.wet_floor(2) + spam_flag = 1 + playsound(src, honk_sound, 50, 1) + src.add_fingerprint(user) + spawn(20) + spam_flag = 0 + return + +/obj/item/weapon/bikehorn/rubberducky/white + name = "rubber ducky" + desc = "It's so full of energy, such a happy little guy, I just wanna give him a squeeze." //thanks doohl + icon = 'icons/obj/watercloset.dmi' + icon_state = "rubberducky_white" + honk_sound = 'sound/effects/lightningshock.ogg' + var/honk_count = 0 + +/obj/item/weapon/bikehorn/rubberducky/white/attack_self(mob/user as mob) + if(spam_flag == 0) + lightning_strike(get_turf(src), 1) + spam_flag = 1 + playsound(src, honk_sound, 50, 1) + src.add_fingerprint(user) + spawn(20) + spam_flag = 0 //leaving this in incase it doesn't qdel somehow + qdel(src) + return + +/obj/item/weapon/grenade/anti_photon/rubberducky/black + desc = "Good work NanoTrasen Employee, you struck fear within the Syndicate." + name = "rubber ducky" + icon = 'icons/obj/watercloset.dmi' + icon_state = "rubberducky_black" + det_time = 20 + +/obj/item/weapon/grenade/anti_photon/rubberducky/black/detonate() + playsound(src, 'sound/voice/quack.ogg', 50, 1, 5) + set_light(10, -10, "#FFFFFF") + + var/extra_delay = rand(0,90) + + spawn(extra_delay) + spawn(200) + if(prob(10+extra_delay)) + set_light(10, 10, "#[num2hex(rand(64,255))][num2hex(rand(64,255))][num2hex(rand(64,255))]") + spawn(210) + ..() + playsound(src, 'sound/voice/quack.ogg', 50, 1, 5) + qdel(src) + /obj/structure/sink name = "sink" icon = 'icons/obj/watercloset.dmi' diff --git a/code/game/world.dm b/code/game/world.dm index 7fffaeee12f..23a636120f3 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -337,8 +337,8 @@ var/world_topic_spam_protect_time = world.timeofday if(!rank) rank = "Admin" - var/message = "IRC-[rank] PM from IRC-[input["sender"]]: [input["msg"]]" - var/amessage = "IRC-[rank] PM from IRC-[input["sender"]] to [key_name(C)] : [input["msg"]]" + var/message = span_red("IRC-[rank] PM from IRC-[input["sender"]]: [input["msg"]]") + var/amessage = span_blue("IRC-[rank] PM from IRC-[input["sender"]] to [key_name(C)] : [input["msg"]]") C.received_irc_pm = world.time C.irc_admin = input["sender"] diff --git a/code/modules/admin/DB ban/functions.dm b/code/modules/admin/DB ban/functions.dm index dfd236c0d92..51e538e8310 100644 --- a/code/modules/admin/DB ban/functions.dm +++ b/code/modules/admin/DB ban/functions.dm @@ -83,7 +83,7 @@ var/sql = "INSERT INTO erro_ban (`id`,`bantime`,`serverip`,`bantype`,`reason`,`job`,`duration`,`rounds`,`expiration_time`,`ckey`,`computerid`,`ip`,`a_ckey`,`a_computerid`,`a_ip`,`who`,`adminwho`,`edits`,`unbanned`,`unbanned_datetime`,`unbanned_ckey`,`unbanned_computerid`,`unbanned_ip`) VALUES (null, Now(), '[serverip]', '[bantype_str]', '[reason]', '[job]', [(duration)?"[duration]":"0"], [(rounds)?"[rounds]":"0"], Now() + INTERVAL [(duration>0) ? duration : 0] MINUTE, '[ckey]', '[computerid]', '[ip]', '[a_ckey]', '[a_computerid]', '[a_ip]', '[who]', '[adminwho]', '', null, null, null, null, null)" var/DBQuery/query_insert = dbcon.NewQuery(sql) query_insert.Execute() - to_chat(usr, "Ban saved to database.") + to_chat(usr, "[span_blue("Ban saved to database.")]") message_admins("[key_name_admin(usr)] has added a [bantype_str] for [ckey] [(job)?"([job])":""] [(duration > 0)?"([duration] minutes)":""] with the reason: \"[reason]\" to the ban database.",1) @@ -137,17 +137,17 @@ ban_number++; if(ban_number == 0) - to_chat(usr, "Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.") + to_chat(usr, "[span_red("Database update failed due to no bans fitting the search criteria. If this is not a legacy ban you should contact the database admin.")]") return if(ban_number > 1) - to_chat(usr, "Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.") + to_chat(usr, "[span_red("Database update failed due to multiple bans fitting the search criteria. Note down the ckey, job and current time and contact the database admin.")]") return if(istext(ban_id)) ban_id = text2num(ban_id) if(!isnum(ban_id)) - to_chat(usr, "Database update failed due to a ban ID mismatch. Contact the database admin.") + to_chat(usr, "[span_red("Database update failed due to a ban ID mismatch. Contact the database admin.")]") return DB_ban_unban_by_id(ban_id) @@ -228,11 +228,11 @@ ban_number++; if(ban_number == 0) - to_chat(usr, "Database update failed due to a ban id not being present in the database.") + to_chat(usr, "[span_red("Database update failed due to a ban id not being present in the database.")]") return if(ban_number > 1) - to_chat(usr, "Database update failed due to multiple bans having the same ID. Contact the database admin.") + to_chat(usr, "[span_red("Database update failed due to multiple bans having the same ID. Contact the database admin.")]") return if(!src.owner || !istype(src.owner, /client)) @@ -268,7 +268,7 @@ establish_db_connection() if(!dbcon.IsConnected()) - to_chat(usr, "Failed to establish database connection") + to_chat(usr, "[span_red("Failed to establish database connection")]") return var/output = "
    " diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index efaf0795e2b..8248b3c6832 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -7,13 +7,13 @@ //Guest Checking if(!config.guests_allowed && IsGuestKey(key)) log_adminwarn("Failed Login: [key] - Guests not allowed") - message_admins("Failed Login: [key] - Guests not allowed") + message_admins(span_blue("Failed Login: [key] - Guests not allowed")) return list("reason"="guest", "desc"="\nReason: Guests not allowed. Please sign in with a byond account.") //check if the IP address is a known TOR node if(config && config.ToRban && ToRban_isbanned(address)) log_adminwarn("Failed Login: [src] - Banned: ToR") - message_admins("Failed Login: [src] - Banned: ToR") + message_admins(span_blue("Failed Login: [src] - Banned: ToR")) //ban their computer_id and ckey for posterity AddBan(ckey(key), computer_id, "Use of ToR", "Automated Ban", 0, 0) return list("reason"="Using ToR", "desc"="\nReason: The network you are using to connect has been banned.\nIf you believe this is a mistake, please request help at [config.banappeals]") @@ -25,7 +25,7 @@ . = CheckBan( ckey(key), computer_id, address ) if(.) log_adminwarn("Failed Login: [key] [computer_id] [address] - Banned [.["reason"]]") - message_admins("Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]") + message_admins(span_blue("Failed Login: [key] id:[computer_id] ip:[address] - Banned [.["reason"]]")) return . return ..() //default pager ban stuff diff --git a/code/modules/admin/ToRban.dm b/code/modules/admin/ToRban.dm index dfe4ba88e23..0002cb7e29e 100644 --- a/code/modules/admin/ToRban.dm +++ b/code/modules/admin/ToRban.dm @@ -54,10 +54,10 @@ if(config) if(config.ToRban) config.ToRban = 0 - message_admins("ToR banning disabled.") + message_admins(span_red("ToR banning disabled.")) else config.ToRban = 1 - message_admins("ToR banning enabled.") + message_admins(span_green("ToR banning enabled.")) if("show") var/savefile/F = new(TORFILE) var/dat @@ -80,7 +80,7 @@ var/input = tgui_input_text(src,"Please input an IP address to search for:","Find ToR ban",null) if(input) if(ToRban_isbanned(input)) - to_chat(src, "Address is a known ToR address") + to_chat(src, "[span_orange("Address is a known ToR address")]") else to_chat(src, "Address is not a known ToR address") return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 8fc617af317..17a8f8de245 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -869,7 +869,7 @@ var/datum/announcement/minor/admin_min_announcer = new else to_world("New players may now enter the game.") log_admin("[key_name(usr)] toggled new player game entering.") - message_admins("[key_name_admin(usr)] toggled new player game entering.", 1) + message_admins(span_blue("[key_name_admin(usr)] toggled new player game entering."), 1) world.update_status() feedback_add_details("admin_verb","TE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -895,7 +895,7 @@ var/datum/announcement/minor/admin_min_announcer = new to_world("You may now respawn.") else to_world("You may no longer respawn :(") - message_admins("[key_name_admin(usr)] toggled respawn to [config.abandon_allowed ? "On" : "Off"].", 1) + message_admins(span_blue("[key_name_admin(usr)] toggled respawn to [config.abandon_allowed ? "On" : "Off"]."), 1) log_admin("[key_name(usr)] toggled respawn to [config.abandon_allowed ? "On" : "Off"].") world.update_status() feedback_add_details("admin_verb","TR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -909,7 +909,7 @@ var/datum/announcement/minor/admin_min_announcer = new to_world("Persistence is now enabled..") else to_world("Persistence is no longer enabled.") - message_admins("[key_name_admin(usr)] toggled persistence to [config.persistence_disabled ? "Off" : "On"].", 1) + message_admins(span_blue("[key_name_admin(usr)] toggled persistence to [config.persistence_disabled ? "Off" : "On"]."), 1) log_admin("[key_name(usr)] toggled persistence to [config.persistence_disabled ? "Off" : "On"].") world.update_status() feedback_add_details("admin_verb","TPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -923,7 +923,7 @@ var/datum/announcement/minor/admin_min_announcer = new to_world("Persistence is now enabled..") else to_world("Persistence is no longer enabled.") - message_admins("[key_name_admin(usr)] toggled persistence to [config.persistence_ignore_mapload ? "Off" : "On"].", 1) + message_admins(span_blue("[key_name_admin(usr)] toggled persistence to [config.persistence_ignore_mapload ? "Off" : "On"]."), 1) log_admin("[key_name(usr)] toggled persistence to [config.persistence_ignore_mapload ? "Off" : "On"].") world.update_status() feedback_add_details("admin_verb","TMPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -955,7 +955,7 @@ var/datum/announcement/minor/admin_min_announcer = new if (SSticker.current_state >= GAME_STATE_PLAYING) SSticker.delay_end = !SSticker.delay_end log_admin("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_admins(span_blue("[key_name(usr)] [SSticker.delay_end ? "delayed the round end" : "has made the round end normally"]."), 1) return round_progressing = !round_progressing if (!round_progressing) @@ -971,7 +971,7 @@ var/datum/announcement/minor/admin_min_announcer = new set desc="Toggle admin jumping" set name="Toggle Jump" config.allow_admin_jump = !(config.allow_admin_jump) - message_admins("Toggled admin jumping to [config.allow_admin_jump].") + message_admins(span_blue("Toggled admin jumping to [config.allow_admin_jump].")) feedback_add_details("admin_verb","TJ") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adspawn() @@ -979,7 +979,7 @@ var/datum/announcement/minor/admin_min_announcer = new set desc="Toggle admin spawning" set name="Toggle Spawn" config.allow_admin_spawning = !(config.allow_admin_spawning) - message_admins("Toggled admin item spawning to [config.allow_admin_spawning].") + message_admins(span_blue("Toggled admin item spawning to [config.allow_admin_spawning].")) feedback_add_details("admin_verb","TAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/adrev() @@ -987,7 +987,7 @@ var/datum/announcement/minor/admin_min_announcer = new set desc="Toggle admin revives" set name="Toggle Revive" config.allow_admin_rev = !(config.allow_admin_rev) - message_admins("Toggled reviving to [config.allow_admin_rev].") + message_admins(span_blue("Toggled reviving to [config.allow_admin_rev].")) feedback_add_details("admin_verb","TAR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/immreboot() @@ -997,7 +997,7 @@ var/datum/announcement/minor/admin_min_announcer = new if(!usr.client.holder) return if(alert(usr, "Reboot server?","Reboot!","Yes","No") == "No") // Not tgui_alert for safety return - to_world("Rebooting world!Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!") + to_world("[span_red("Rebooting world!")] [span_blue("Initiated by [usr.client.holder.fakekey ? "Admin" : usr.key]!")]") log_admin("[key_name(usr)] initiated an immediate reboot.") feedback_set_details("end_error","immediate admin reboot - by [usr.key] [usr.client.holder.fakekey ? "(stealth)" : ""]") @@ -1263,7 +1263,7 @@ var/datum/announcement/minor/admin_min_announcer = new else to_world("Guests may now enter the game.") log_admin("[key_name(usr)] toggled guests game entering [config.guests_allowed?"":"dis"]allowed.") - message_admins("[key_name_admin(usr)] toggled guests game entering [config.guests_allowed?"":"dis"]allowed.", 1) + message_admins(span_blue("[key_name_admin(usr)] toggled guests game entering [config.guests_allowed?"":"dis"]allowed."), 1) feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/output_ai_laws() diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 81a3e795760..d6502200fe3 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -279,7 +279,7 @@ var/light_impact_range = tgui_input_number(usr, "Light impact range (in tiles):") var/flash_range = tgui_input_number(usr, "Flash range (in tiles):") explosion(epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range) - message_admins("[ckey] creating an admin explosion at [epicenter.loc].") + message_admins(span_blue("[ckey] creating an admin explosion at [epicenter.loc].")) feedback_add_details("admin_verb","DB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease2(mob/T as mob in mob_list) // -- Giacom @@ -311,7 +311,7 @@ feedback_add_details("admin_verb","GD2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].", 1) + message_admins(span_blue("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance]."), 1) /client/proc/admin_give_modifier(var/mob/living/L) set category = "Debug" @@ -347,7 +347,7 @@ return O.audible_message(message) log_admin("[key_name(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound") - message_admins("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound.", 1) + message_admins(span_blue("[key_name_admin(usr)] made [O] at [O.x], [O.y], [O.z]. make a sound."), 1) feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -377,7 +377,7 @@ to_chat(usr, "[SSair.can_fire ? "En" : "Dis"]abled air processing.") feedback_add_details("admin_verb","KA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] used 'kill air'.") - message_admins("[key_name_admin(usr)] used 'kill air'.", 1) + message_admins(span_blue("[key_name_admin(usr)] used 'kill air'."), 1) /client/proc/readmin_self() set name = "Re-Admin self" @@ -533,7 +533,7 @@ to_chat(T, "Move along.") log_admin("[key_name(usr)] told [key_name(T)] to man up and deal with it.") - message_admins("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it.", 1) + message_admins(span_blue("[key_name_admin(usr)] told [key_name(T)] to man up and deal with it."), 1) /client/proc/global_man_up() set category = "Fun" @@ -547,7 +547,7 @@ T << 'sound/voice/ManUp1.ogg' log_admin("[key_name(usr)] told everyone to man up and deal with it.") - message_admins("[key_name_admin(usr)] told everyone to man up and deal with it.", 1) + message_admins(span_blue("[key_name_admin(usr)] told everyone to man up and deal with it."), 1) /client/proc/give_spell(mob/T as mob in mob_list) // -- Urist set category = "Fun" @@ -558,4 +558,4 @@ T.spell_list += new S feedback_add_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].") - message_admins("[key_name_admin(usr)] gave [key_name(T)] the spell [S].", 1) \ No newline at end of file + message_admins(span_blue("[key_name_admin(usr)] gave [key_name(T)] the spell [S]."), 1) diff --git a/code/modules/admin/callproc/callproc.dm b/code/modules/admin/callproc/callproc.dm index 58e90122771..b3bea8ee6c5 100644 --- a/code/modules/admin/callproc/callproc.dm +++ b/code/modules/admin/callproc/callproc.dm @@ -39,12 +39,12 @@ testname = replacetext(testname, "()", "") if(targetselected && !hascall(target,testname)) - to_chat(usr, "Error: callproc(): type [target.type] has no proc named [procname].") + to_chat(usr, "" + span_red("Error: callproc(): type [target.type] has no proc named [procname].") + "") return else var/procpath = text2path(procname) if (!procpath) - to_chat(usr, "Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)") + to_chat(usr, "" + span_red("Error: callproc(): proc [procname] does not exist. (Did you forget the /proc/ part?)") + "") return var/list/lst = get_callproc_args() if(!lst) @@ -52,7 +52,7 @@ if(targetselected) if(!target) - to_chat(usr, "Error: callproc(): owner of proc no longer exists.") + to_chat(usr, "" + span_red("Error: callproc(): owner of proc no longer exists.") + "") return var/msg = "[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]." log_admin(msg) @@ -140,7 +140,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) if(!procname) return if(!hascall(A,procname)) - to_chat(usr, "Error: callproc_datum(): type [A.type] has no proc named [procname].") + to_chat(usr, "" + span_red("Error: callproc_datum(): type [A.type] has no proc named [procname].") + "") return var/list/lst = get_callproc_args() if(!lst) @@ -190,7 +190,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) . = "" if(islist(returnval)) var/list/returnedlist = returnval - . = "" + . = "" if(returnedlist.len) var/assoc_check = returnedlist[1] if(istext(assoc_check) && (returnedlist[assoc_check] != null)) @@ -204,7 +204,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) . += "\n[elem]" else . = "[procname] returned an empty list" - . += "" + . += "" else - . = "[procname] returned: [!isnull(returnval) ? returnval : "null"]" + . = span_blue("[procname] returned: [!isnull(returnval) ? returnval : "null"]") diff --git a/code/modules/admin/newbanjob.dm b/code/modules/admin/newbanjob.dm index 4915c00594b..7657182312c 100644 --- a/code/modules/admin/newbanjob.dm +++ b/code/modules/admin/newbanjob.dm @@ -141,7 +141,7 @@ var/savefile/Banlistjob Banlistjob.cd = "/base" if ( Banlistjob.dir.Find("[ckey][computerid][rank]") ) - to_chat(usr,"Banjob already exists.") + to_chat(usr, span_red("Banjob already exists.")) return 0 else Banlistjob.dir.Add("[ckey][computerid][rank]") diff --git a/code/modules/admin/permissionverbs/permissionedit.dm b/code/modules/admin/permissionverbs/permissionedit.dm index 5f84d5692a2..b6be3a77906 100644 --- a/code/modules/admin/permissionverbs/permissionedit.dm +++ b/code/modules/admin/permissionverbs/permissionedit.dm @@ -51,13 +51,13 @@ return if(!usr.client.holder || !(usr.client.holder.rights & R_PERMISSIONS)) - to_chat(usr, "You do not have permission to do this!") + to_chat(usr, "[span_red("You do not have permission to do this!")]") return establish_db_connection() if(!dbcon.IsConnected()) - to_chat(usr, "Failed to establish database connection") + to_chat(usr, "[span_red("Failed to establish database connection")]") return if(!adm_ckey || !new_rank) @@ -85,14 +85,14 @@ insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added new admin [adm_ckey] to rank [new_rank]');") log_query.Execute() - to_chat(usr, "New admin added.") + to_chat(usr, "[span_blue("New admin added.")]") else if(!isnull(admin_id) && isnum(admin_id)) var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET rank = '[new_rank]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Edited the rank of [adm_ckey] to [new_rank]');") log_query.Execute() - to_chat(usr, "Admin rank changed.") + to_chat(usr, "[span_blue("Admin rank changed.")]") /datum/admins/proc/log_admin_permission_modification(var/adm_ckey, var/new_permission) if(config.admin_legacy_system) return @@ -101,12 +101,12 @@ return if(!usr.client.holder || !(usr.client.holder.rights & R_PERMISSIONS)) - to_chat(usr, "You do not have permission to do this!") + to_chat(usr, "[span_red(">You do not have permission to do this!")]") return establish_db_connection() if(!dbcon.IsConnected()) - to_chat(usr, "Failed to establish database connection") + to_chat(usr, "[span_red("Failed to establish database connection!")]") return if(!adm_ckey || !new_permission) @@ -140,10 +140,10 @@ insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Removed permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]');") log_query.Execute() - to_chat(usr, "Permission removed.") + to_chat(usr, "[span_blue("Permission removed.")]") else //This admin doesn't have this permission, so we are adding it. var/DBQuery/insert_query = dbcon.NewQuery("UPDATE `erro_admin` SET flags = '[admin_rights | new_permission]' WHERE id = [admin_id]") insert_query.Execute() var/DBQuery/log_query = dbcon.NewQuery("INSERT INTO `test`.`erro_admin_log` (`id` ,`datetime` ,`adminckey` ,`adminip` ,`log` ) VALUES (NULL , NOW( ) , '[usr.ckey]', '[usr.client.address]', 'Added permission [rights2text(new_permission)] (flag = [new_permission]) to admin [adm_ckey]')") log_query.Execute() - to_chat(usr, "Permission added.") + to_chat(usr, "[span_blue("Permission added.")]") diff --git a/code/modules/admin/player_notes.dm b/code/modules/admin/player_notes.dm index f25e6024b92..53479bdcad2 100644 --- a/code/modules/admin/player_notes.dm +++ b/code/modules/admin/player_notes.dm @@ -37,7 +37,7 @@ infos += P info << infos - message_admins("[key_name_admin(user)] has edited [key]'s notes.") + message_admins(span_blue("[key_name_admin(user)] has edited [key]'s notes.")) log_admin("[key_name(user)] has edited [key]'s notes.") admin_action_message(P.author, key, "added note on", note, 0) //VOREStation Add del(info) // savefile, so NOT qdel @@ -62,7 +62,7 @@ infos.Remove(item) info << infos - message_admins("[key_name_admin(usr)] deleted one of [key]'s notes.") + message_admins(span_blue("[key_name_admin(usr)] deleted one of [key]'s notes.")) log_admin("[key_name(usr)] deleted one of [key]'s notes.") admin_action_message(usr.key, key, "deleted note on", "\[Note gone\]", 0) //VOREStation Add qdel(info) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 6fb5dfd430c..4465abc7c57 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -234,7 +234,7 @@ if (emergency_shuttle.can_call()) emergency_shuttle.call_evac() log_admin("[key_name(usr)] called the Emergency Shuttle") - message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station.", 1) + message_admins(span_blue("[key_name_admin(usr)] called the Emergency Shuttle to the station."), 1) if("2") if (!( ticker ) || !emergency_shuttle.location()) @@ -242,12 +242,12 @@ if (emergency_shuttle.can_call()) emergency_shuttle.call_evac() log_admin("[key_name(usr)] called the Emergency Shuttle") - message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station.", 1) + message_admins(span_blue("[key_name_admin(usr)] called the Emergency Shuttle to the station."), 1) else if (emergency_shuttle.can_recall()) emergency_shuttle.recall() log_admin("[key_name(usr)] sent the Emergency Shuttle back") - message_admins("[key_name_admin(usr)] sent the Emergency Shuttle back.", 1) + message_admins(span_blue("[key_name_admin(usr)] sent the Emergency Shuttle back."), 1) href_list["secretsadmin"] = "check_antagonist" @@ -260,14 +260,14 @@ emergency_shuttle.launch_time = world.time + new_time_left*10 log_admin("[key_name(usr)] edited the Emergency Shuttle's launch time to [new_time_left]") - message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's launch time to [new_time_left*10]", 1) + message_admins(span_blue("[key_name_admin(usr)] edited the Emergency Shuttle's launch time to [new_time_left*10]"), 1) else if (emergency_shuttle.shuttle.has_arrive_time()) var/new_time_left = tgui_input_number(usr, "Enter new shuttle arrival time (seconds):","Edit Shuttle Arrival Time", emergency_shuttle.estimate_arrival_time() ) emergency_shuttle.shuttle.arrive_time = world.time + new_time_left*10 log_admin("[key_name(usr)] edited the Emergency Shuttle's arrival time to [new_time_left]") - message_admins("[key_name_admin(usr)] edited the Emergency Shuttle's arrival time to [new_time_left*10]", 1) + message_admins(span_blue("[key_name_admin(usr)] edited the Emergency Shuttle's arrival time to [new_time_left*10]"), 1) else tgui_alert_async(usr, "The shuttle is neither counting down to launch nor is it in transit. Please try again when it is.") @@ -278,7 +278,7 @@ ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") - message_admins("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].", 1) + message_admins(span_blue("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"]."), 1) href_list["secretsadmin"] = "check_antagonist" else if(href_list["simplemake"]) @@ -296,7 +296,7 @@ if("Yes") delmob = 1 log_admin("[key_name(usr)] has used rudimentary transformation on [key_name(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]") - message_admins("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]", 1) + message_admins(span_blue("[key_name_admin(usr)] has used rudimentary transformation on [key_name_admin(M)]. Transforming to [href_list["simplemake"]]; deletemob=[delmob]"), 1) switch(href_list["simplemake"]) if("observer") M.change_mob_type( /mob/observer/dead , null, null, delmob ) @@ -376,7 +376,7 @@ log_admin("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") ban_unban_log_save("[key_name(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]") - message_admins("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]", 1) + message_admins(span_blue("[key_name_admin(usr)] edited [banned_key]'s ban. Reason: [reason] Duration: [duration]"), 1) Banlist.cd = "/base/[banfolder]" Banlist["reason"] << reason Banlist["temp"] << temp @@ -804,10 +804,10 @@ else msg += ", [job]" notes_add(M.ckey, "Banned from [msg] - [reason]", usr) - message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes", 1) - to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "This jobban will be lifted in [mins] minutes.") + message_admins(span_blue("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg] for [mins] minutes"), 1) + to_chat(M, "[span_red("You have been jobbanned by [usr.client.ckey] from: [msg].")]") + to_chat(M, "[span_red("The reason is: [reason]")]") + to_chat(M, "[span_red("This jobban will be lifted in [mins] minutes.")]") href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("No") @@ -825,10 +825,10 @@ if(!msg) msg = job else msg += ", [job]" notes_add(M.ckey, "Banned from [msg] - [reason]", usr) - message_admins("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) - to_chat(M, "You have been jobbanned by [usr.client.ckey] from: [msg].") - to_chat(M, "The reason is: [reason]") - to_chat(M, "Jobban can be lifted only upon request.") + message_admins(span_blue("[key_name_admin(usr)] banned [key_name_admin(M)] from [msg]"), 1) + to_chat(M, "[span_red("You have been jobbanned by [usr.client.ckey] from: [msg].")]") + to_chat(M, "[span_red("The reason is: [reason]")]") + to_chat(M, "[span_red("Jobban can be lifted only upon request.")]") href_list["jobban2"] = 1 // lets it fall through and refresh return 1 if("Cancel") @@ -858,7 +858,7 @@ else continue if(msg) - message_admins("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) + message_admins(span_blue("[key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]"), 1) to_chat(M, "You have been un-jobbanned by [usr.client.ckey] from [msg].") href_list["jobban2"] = 1 // lets it fall through and refresh return 1 @@ -875,7 +875,7 @@ to_chat(M, span("filter_system critical", "You have been kicked from the server: [reason]")) log_admin("[key_name(usr)] booted [key_name(M)] for reason: '[reason]'.") - message_admins("[key_name_admin(usr)] booted [key_name_admin(M)] for reason '[reason]'.", 1) + message_admins(span_blue("[key_name_admin(usr)] booted [key_name_admin(M)] for reason '[reason]'."), 1) //M.client = null admin_action_message(usr.key, M.key, "kicked", reason, 0) //VOREStation Add qdel(M.client) @@ -887,7 +887,7 @@ if(t) if((tgui_alert(usr, "Do you want to unjobban [t]?","Unjobban confirmation", list("Yes", "No")) == "Yes") && t) //No more misclicks! Unless you do it twice. log_admin("[key_name(usr)] removed [t]") - message_admins("[key_name_admin(usr)] removed [t]", 1) + message_admins(span_blue("[key_name_admin(usr)] removed [t]"), 1) jobban_remove(t) href_list["ban"] = 1 // lets it fall through and refresh var/t_split = splittext(t, " - ") @@ -934,7 +934,7 @@ else to_chat(M, "No ban appeals URL has been set.") log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") - message_admins("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.") + message_admins(span_blue("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis will be removed in [mins] minutes.")) var/datum/admin_help/AH = M.client ? M.client.current_ticket : null if(AH) AH.Resolve() @@ -960,7 +960,7 @@ ban_unban_log_save("[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.") notes_add(M.ckey,"[usr.client.ckey] has permabanned [M.ckey]. - Reason: [reason] - This is a permanent ban.",usr) log_admin("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") - message_admins("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.") + message_admins(span_blue("[usr.client.ckey] has banned [M.ckey].\nReason: [reason]\nThis is a permanent ban.")) feedback_inc("ban_perma",1) DB_ban_record(BANTYPE_PERMA, M, -1, reason) var/datum/admin_help/AH = M.client ? M.client.current_ticket : null @@ -1018,8 +1018,8 @@ return tgui_alert_async(usr, "The game has already started.") master_mode = href_list["c_mode2"] log_admin("[key_name(usr)] set the mode as [config.mode_names[master_mode]].") - message_admins("[key_name_admin(usr)] set the mode as [config.mode_names[master_mode]].", 1) - to_world("The mode is now: [config.mode_names[master_mode]]") + message_admins(span_blue("[key_name_admin(usr)] set the mode as [config.mode_names[master_mode]]."), 1) + to_world(span_blue("The mode is now: [config.mode_names[master_mode]]")) Game() // updates the main game menu world.save_mode(master_mode) .(href, list("c_mode"=1)) @@ -1033,7 +1033,7 @@ return tgui_alert_async(usr, "The game mode has to be secret!") secret_force_mode = href_list["f_secret2"] log_admin("[key_name(usr)] set the forced secret mode as [secret_force_mode].") - message_admins("[key_name_admin(usr)] set the forced secret mode as [secret_force_mode].", 1) + message_admins(span_blue("[key_name_admin(usr)] set the forced secret mode as [secret_force_mode]."), 1) Game() // updates the main game menu .(href, list("f_secret"=1)) @@ -1046,7 +1046,7 @@ return log_admin("[key_name(usr)] attempting to monkeyize [key_name(H)]") - message_admins("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]", 1) + message_admins(span_blue("[key_name_admin(usr)] attempting to monkeyize [key_name_admin(H)]"), 1) H.monkeyize() else if(href_list["corgione"]) @@ -1058,7 +1058,7 @@ return log_admin("[key_name(usr)] attempting to corgize [key_name(H)]") - message_admins("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]", 1) + message_admins(span_blue("[key_name_admin(usr)] attempting to corgize [key_name_admin(H)]"), 1) H.corgize() else if(href_list["forcespeech"]) @@ -1073,7 +1073,7 @@ M.say(speech) speech = sanitize(speech) // Nah, we don't trust them log_admin("[key_name(usr)] forced [key_name(M)] to say: [speech]") - message_admins("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]") + message_admins(span_blue("[key_name_admin(usr)] forced [key_name_admin(M)] to say: [speech]")) else if(href_list["sendtoprison"]) if(!check_rights(R_ADMIN)) return @@ -1113,7 +1113,7 @@ to_chat(M, "You have been sent to the prison station!") log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") - message_admins("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) + message_admins(span_blue("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station."), 1) else if(href_list["sendbacktolobby"]) if(!check_rights(R_ADMIN)) @@ -1249,7 +1249,7 @@ if(config.allow_admin_rev) L.revive() - message_admins("Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!", 1) + message_admins(span_red("Admin [key_name_admin(usr)] healed / revived [key_name_admin(L)]!"), 1) log_admin("[key_name(usr)] healed / Rrvived [key_name(L)]") else to_chat(usr, "Admin Rejuvinates have been disabled") @@ -1262,7 +1262,7 @@ to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - message_admins("Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!", 1) + message_admins(span_red("Admin [key_name_admin(usr)] AIized [key_name_admin(H)]!"), 1) log_admin("[key_name(usr)] AIized [key_name(H)]") H.AIize() @@ -1402,7 +1402,7 @@ //Job + antagonist if(M.mind) - special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [M.mind.special_role]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]" + special_role_description = "Role: [M.mind.assigned_role]; Antagonist: [span_red("[M.mind.special_role]")]; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]" else special_role_description = "Role: Mind datum missing Antagonist: Mind datum missing; Has been rev: Mind datum missing;" @@ -1412,8 +1412,8 @@ var/status switch (M.stat) if (0) status = "Alive" - if (1) status = "Unconscious" - if (2) status = "Dead" + if (1) status = span_orange("Unconscious") + if (2) status = span_red("Dead") health_description = "Status = [status]" health_description += "
    Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]" else @@ -1422,7 +1422,7 @@ //Gener switch(M.gender) if(MALE,FEMALE) gender_description = "[M.gender]" - else gender_description = "[M.gender]" + else gender_description = span_red("[M.gender]") to_chat(src.owner, "Info about [M.name]:
    \ Mob type = [M.type]; Gender = [gender_description] Damage = [health_description]
    \ diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index fe64b973460..14b1bf7932c 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -1046,7 +1046,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null else if(char == "'") if(word != "") - to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") + to_chat(usr, span_red("SDQL2: You have an error in your SDQL syntax, unexpected ' in query: \"[span_gray("[query_text]")]\" following \"[span_gray("[word]")]\". Please check your syntax, and try again.")) return null word = "'" @@ -1066,7 +1066,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null word += char if(i > len) - to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[query_text]\". Please check your syntax, and try again.") + to_chat(usr, span_red("SDQL2: You have an error in your SDQL syntax, unmatched ' in query: \"[span_gray("[query_text]")]\". Please check your syntax, and try again.")) return null query_list += "[word]'" @@ -1074,7 +1074,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null else if(char == "\"") if(word != "") - to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[query_text]\" following \"[word]\". Please check your syntax, and try again.") + to_chat(usr, span_red("SDQL2: You have an error in your SDQL syntax, unexpected \" in query: \"[span_gray("[query_text]")]\" following \"[span_gray("[word]")]\". Please check your syntax, and try again.")) return null word = "\"" @@ -1094,7 +1094,7 @@ GLOBAL_DATUM_INIT(sdql2_vv_statobj, /obj/effect/statclick/SDQL2_VV_all, new(null word += char if(i > len) - to_chat(usr, "SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[query_text]\". Please check your syntax, and try again.") + to_chat(usr, span_red("SDQL2: You have an error in your SDQL syntax, unmatched \" in query: \"[span_gray("[query_text]")]\". Please check your syntax, and try again.")) return null query_list += "[word]\"" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 1d5ecdadfc4..dceff6ab46d 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -1,785 +1,785 @@ -/client/var/datum/admin_help/current_ticket //the current ticket the (usually) not-admin client is dealing with - -// -//TICKET MANAGER -// - -GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) - -/datum/admin_help_tickets - var/list/active_tickets = list() - var/list/closed_tickets = list() - var/list/resolved_tickets = list() - - var/obj/effect/statclick/ticket_list/astatclick = new(null, null, AHELP_ACTIVE) - var/obj/effect/statclick/ticket_list/cstatclick = new(null, null, AHELP_CLOSED) - var/obj/effect/statclick/ticket_list/rstatclick = new(null, null, AHELP_RESOLVED) - -/datum/admin_help_tickets/Destroy() - QDEL_LIST(active_tickets) - QDEL_LIST(closed_tickets) - QDEL_LIST(resolved_tickets) - QDEL_NULL(astatclick) - QDEL_NULL(cstatclick) - QDEL_NULL(rstatclick) - return ..() - -//private -/datum/admin_help_tickets/proc/ListInsert(datum/admin_help/new_ticket) - var/list/ticket_list - switch(new_ticket.state) - if(AHELP_ACTIVE) - ticket_list = active_tickets - if(AHELP_CLOSED) - ticket_list = closed_tickets - if(AHELP_RESOLVED) - ticket_list = resolved_tickets - else - CRASH("Invalid ticket state: [new_ticket.state]") - var/num_closed = ticket_list.len - if(num_closed) - for(var/I in 1 to num_closed) - var/datum/admin_help/AH = ticket_list[I] - if(AH.id > new_ticket.id) - ticket_list.Insert(I, new_ticket) - return - ticket_list += new_ticket - -//opens the ticket listings for one of the 3 states -/datum/admin_help_tickets/proc/BrowseTickets(state) - var/list/l2b - var/title - switch(state) - if(AHELP_ACTIVE) - l2b = active_tickets - title = "Active Tickets" - if(AHELP_CLOSED) - l2b = closed_tickets - title = "Closed Tickets" - if(AHELP_RESOLVED) - l2b = resolved_tickets - title = "Resolved Tickets" - if(!l2b) - return - var/list/dat = list("[title]") - dat += "Refresh

    " - for(var/datum/admin_help/AH as anything in l2b) - dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
    " - - usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") - -//Tickets statpanel -/datum/admin_help_tickets/proc/stat_entry() - var/num_disconnected = 0 - stat("== Admin Tickets ==") - stat("Active Tickets:", astatclick.update("[active_tickets.len]")) - for(var/datum/admin_help/AH as anything in active_tickets) - if(AH.initiator) - stat("#[AH.id]. [AH.initiator_key_name]:", AH.statclick.update()) - else - ++num_disconnected - if(num_disconnected) - stat("Disconnected:", astatclick.update("[num_disconnected]")) - stat("Closed Tickets:", cstatclick.update("[closed_tickets.len]")) - stat("Resolved Tickets:", rstatclick.update("[resolved_tickets.len]")) - -//Reassociate still open ticket if one exists -/datum/admin_help_tickets/proc/ClientLogin(client/C) - C.current_ticket = CKey2ActiveTicket(C.ckey) - if(C.current_ticket) - C.current_ticket.AddInteraction("Client reconnected.") - C.current_ticket.initiator = C - -//Dissasociate ticket -/datum/admin_help_tickets/proc/ClientLogout(client/C) - if(C.current_ticket) - C.current_ticket.AddInteraction("Client disconnected.") - C.current_ticket.initiator = null - C.current_ticket = null - -//Get a ticket given a ckey -/datum/admin_help_tickets/proc/CKey2ActiveTicket(ckey) - for(var/datum/admin_help/AH as anything in active_tickets) - if(AH.initiator_ckey == ckey) - return AH - -// -//TICKET LIST STATCLICK -// - -/obj/effect/statclick/ticket_list - var/current_state - -/obj/effect/statclick/ticket_list/New(loc, name, state) - current_state = state - ..() - -/obj/effect/statclick/ticket_list/Click() - GLOB.ahelp_tickets.BrowseTickets(current_state) - -// -//TICKET DATUM -// - -/datum/admin_help - var/id - var/name - var/state = AHELP_ACTIVE - - var/opened_at - var/closed_at - - var/client/initiator //semi-misnomer, it's the person who ahelped/was bwoinked - var/initiator_ckey - var/initiator_key_name - - var/list/_interactions //use AddInteraction() or, preferably, admin_ticket_log() - - var/obj/effect/statclick/ahelp/statclick - - var/static/ticket_counter = 0 - -//call this on its own to create a ticket, don't manually assign current_ticket -//msg is the title of the ticket: usually the ahelp text -//is_bwoink is TRUE if this ticket was started by an admin PM -/datum/admin_help/New(msg, client/C, is_bwoink) - //clean the input msg - msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) - if(!msg || !C || !C.mob) - qdel(src) - return - - id = ++ticket_counter - opened_at = world.time - - name = msg - - initiator = C - initiator_ckey = initiator.ckey - initiator_key_name = key_name(initiator, FALSE, TRUE) - if(initiator.current_ticket) //This is a bug - log_debug("Multiple ahelp current_tickets") - initiator.current_ticket.AddInteraction("Ticket erroneously left open by code") - initiator.current_ticket.Close() - initiator.current_ticket = src - - var/parsed_message = keywords_lookup(msg) - - statclick = new(null, src) - _interactions = list() - - if(is_bwoink) - AddInteraction("[key_name_admin(usr)] PM'd [LinkedReplyName()]") - message_admins("Ticket [TicketHref("#[id]")] created") - else - MessageNoRecipient(parsed_message) - send2adminchat() //VOREStation Add - //show it to the person adminhelping too - to_chat(C, "PM to-Admins: [name]") - - //send it to irc if nobody is on and tell us how many were on - var/admin_number_present = send2irc_adminless_only(initiator_ckey, name) - log_admin("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.") - if(admin_number_present <= 0) - to_chat(C, "No active admins are online, your adminhelp was sent to the admin discord.") //VOREStation Edit - - // Also send it to discord since that's the hip cool thing now. - SSwebhooks.send( - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) ticket opened.", - "body" = "[key_name(initiator)] has opened a ticket. \n[msg]", - "color" = COLOR_WEBHOOK_POOR - ) - ) - - GLOB.ahelp_tickets.active_tickets += src - -/datum/admin_help/Destroy() - RemoveActive() - GLOB.ahelp_tickets.closed_tickets -= src - GLOB.ahelp_tickets.resolved_tickets -= src - return ..() - -/datum/admin_help/proc/AddInteraction(formatted_message) - _interactions += "[gameTimestamp()]: [formatted_message]" - -//private -/datum/admin_help/proc/FullMonty(ref_src) - if(!ref_src) - ref_src = "\ref[src]" - if(initiator && initiator.mob) - . = ADMIN_FULLMONTY_NONAME(initiator.mob) - else - . = "Initiator disconnected." - if(state == AHELP_ACTIVE) - . += ClosureLinks(ref_src) - -//private -/datum/admin_help/proc/ClosureLinks(ref_src) - if(!ref_src) - ref_src = "\ref[src]" - . = " (REJT)" - . += " (IC)" - . += " (CLOSE)" - . += " (RSLVE)" - . += " (HANDLE)" - -//private -/datum/admin_help/proc/LinkedReplyName(ref_src) - if(!ref_src) - ref_src = "\ref[src]" - return "[initiator_key_name]" - -//private -/datum/admin_help/proc/TicketHref(msg, ref_src, action = "ticket") - if(!ref_src) - ref_src = "\ref[src]" - return "[msg]" - -//message from the initiator without a target, all admins will see this -//won't bug irc -/datum/admin_help/proc/MessageNoRecipient(msg) - var/ref_src = "\ref[src]" - var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [msg]" - - AddInteraction("[LinkedReplyName(ref_src)]: [msg]") - //send this msg to all admins - - for(var/client/X in GLOB.admins) - if(!check_rights(R_ADMIN, 0, X)) - continue - if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) - X << 'sound/effects/adminhelp.ogg' - window_flash(X) - to_chat(X, chat_msg) - -//Reopen a closed ticket -/datum/admin_help/proc/Reopen() - if(state == AHELP_ACTIVE) - to_chat(usr, "This ticket is already open.") - return - - if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey)) - to_chat(usr, "This user already has an active ticket, cannot reopen this one.") - return - - statclick = new(null, src) - GLOB.ahelp_tickets.active_tickets += src - GLOB.ahelp_tickets.closed_tickets -= src - GLOB.ahelp_tickets.resolved_tickets -= src - switch(state) - if(AHELP_CLOSED) - feedback_dec("ahelp_close") - if(AHELP_RESOLVED) - feedback_dec("ahelp_resolve") - state = AHELP_ACTIVE - closed_at = null - if(initiator) - initiator.current_ticket = src - - AddInteraction("Reopened by [key_name_admin(usr)]") - if(initiator) - to_chat(initiator, "Ticket [TicketHref("#[id]")] was reopened by [key_name(usr,FALSE,FALSE)].") - var/msg = "Ticket [TicketHref("#[id]")] reopened by [key_name_admin(usr)]." - message_admins(msg) - log_admin(msg) - feedback_inc("ahelp_reopen") - TicketPanel() //can only be done from here, so refresh it - - SSwebhooks.send( - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) reopened.", - "body" = "Reopened by [key_name(usr)]." - ) - ) - -//private -/datum/admin_help/proc/RemoveActive() - if(state != AHELP_ACTIVE) - return - closed_at = world.time - QDEL_NULL(statclick) - GLOB.ahelp_tickets.active_tickets -= src - if(initiator && initiator.current_ticket == src) - initiator.current_ticket = null - -//Mark open ticket as closed/meme -/datum/admin_help/proc/Close(silent = FALSE) - if(state != AHELP_ACTIVE) - return - RemoveActive() - state = AHELP_CLOSED - GLOB.ahelp_tickets.ListInsert(src) - AddInteraction("Closed by [key_name_admin(usr)].") - if(initiator) - to_chat(initiator, "Ticket [TicketHref("#[id]")] was closed by [key_name(usr,FALSE,FALSE)].") - if(!silent) - feedback_inc("ahelp_close") - var/msg = "Ticket [TicketHref("#[id]")] closed by [key_name_admin(usr)]." - message_admins(msg) - log_admin(msg) - SSwebhooks.send( - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) closed.", - "body" = "Closed by [key_name(usr)].", - "color" = COLOR_WEBHOOK_BAD - ) - ) - -//Mark open ticket as resolved/legitimate, returns ahelp verb -/datum/admin_help/proc/Resolve(silent = FALSE) - if(state != AHELP_ACTIVE) - return - RemoveActive() - state = AHELP_RESOLVED - GLOB.ahelp_tickets.ListInsert(src) - - AddInteraction("Resolved by [key_name_admin(usr)].") - if(initiator) - to_chat(initiator, "Ticket [TicketHref("#[id]")] was marked resolved by [key_name(usr,FALSE,FALSE)].") - if(!silent) - feedback_inc("ahelp_resolve") - var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name_admin(usr)]" - message_admins(msg) - log_admin(msg) - SSwebhooks.send( - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) resolved.", - "body" = "Marked as Resolved by [key_name(usr)].", - "color" = COLOR_WEBHOOK_GOOD - ) - ) - -//Close and return ahelp verb, use if ticket is incoherent -/datum/admin_help/proc/Reject(key_name = key_name_admin(usr)) - if(state != AHELP_ACTIVE) - return - - if(initiator) - if(initiator.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) - initiator << 'sound/effects/adminhelp.ogg' - - to_chat(initiator, "- AdminHelp Rejected! -
    \ - Your admin help was rejected.
    \ - Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting.
    ") - - feedback_inc("ahelp_reject") - var/msg = "Ticket [TicketHref("#[id]")] rejected by [key_name_admin(usr)]" - message_admins(msg) - log_admin(msg) - AddInteraction("Rejected by [key_name_admin(usr)].") - Close(silent = TRUE) - SSwebhooks.send( - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) rejected.", - "body" = "Rejected by [key_name(usr)].", - "color" = COLOR_WEBHOOK_BAD - ) - ) - -//Resolve ticket with IC Issue message -/datum/admin_help/proc/ICIssue(key_name = key_name_admin(usr)) - if(state != AHELP_ACTIVE) - return - - var/msg = "- AdminHelp marked as IC issue! -
    " - msg += "This is something that can be solved ICly, and does not currently require staff intervention.
    " - msg += "Your AdminHelp may also be unanswerable due to ongoing events.
    " - - if(initiator) - to_chat(initiator, msg) - - feedback_inc("ahelp_icissue") - msg = "Ticket [TicketHref("#[id]")] marked as IC by [key_name_admin(usr)]" - message_admins(msg) - log_admin(msg) - AddInteraction("Marked as IC issue by [key_name_admin(usr)]") - Resolve(silent = TRUE) - SSwebhooks.send( - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) marked as IC issue.", - "body" = "Marked as IC Issue by [key_name(usr)].", - "color" = COLOR_WEBHOOK_BAD - ) - ) - -//Resolve ticket with IC Issue message -/datum/admin_help/proc/HandleIssue() - if(state != AHELP_ACTIVE) - return - - var/msg = "Your AdminHelp is being handled by [key_name(usr,FALSE,FALSE)] please be patient." - - if(initiator) - to_chat(initiator, msg) - - feedback_inc("ahelp_handling") - msg = "Ticket [TicketHref("#[id]")] being handled by [key_name(usr,FALSE,FALSE)]" - message_admins(msg) - log_admin(msg) - AddInteraction("[key_name_admin(usr)] is now handling this ticket.") - SSwebhooks.send( // YW EDIT: Reverts to use SSwebhooks - WEBHOOK_AHELP_SENT, - list( - "name" = "Ticket ([id]) (Game ID: [game_id]) being handled.", - "body" = "[key_name(usr)] is now handling the ticket." - ) - ) - -//Show the ticket panel -/datum/admin_help/proc/TicketPanel() - tgui_interact(usr.client.mob) - -/datum/admin_help/proc/TicketPanelLegacy() - var/list/dat = list("Ticket #[id]") - var/ref_src = "\ref[src]" - dat += "

    Admin Help Ticket #[id]: [LinkedReplyName(ref_src)]

    " - dat += "State: " - switch(state) - if(AHELP_ACTIVE) - dat += "OPEN" - if(AHELP_RESOLVED) - dat += "RESOLVED" - if(AHELP_CLOSED) - dat += "CLOSED" - else - dat += "UNKNOWN" - dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" - if(state != AHELP_ACTIVE) - dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" - dat += "

    Opened at: [gameTimestamp(wtime = opened_at)] (Approx [(world.time - opened_at) / 600] minutes ago)" - if(closed_at) - dat += "
    Closed at: [gameTimestamp(wtime = closed_at)] (Approx [(world.time - closed_at) / 600] minutes ago)" - dat += "

    " - if(initiator) - dat += "Actions: [FullMonty(ref_src)]
    " - else - dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)]
    " - dat += "
    Log:

    " - for(var/I in _interactions) - dat += "[I]
    " - - usr << browse(dat.Join(), "window=ahelp[id];size=620x480") - -/datum/admin_help/proc/Retitle() - var/new_title = tgui_input_text(usr, "Enter a title for the ticket", "Rename Ticket", name) - if(new_title) - name = new_title - //not saying the original name cause it could be a long ass message - var/msg = "Ticket [TicketHref("#[id]")] titled [name] by [key_name_admin(usr)]" - message_admins(msg) - log_admin(msg) - TicketPanel() //we have to be here to do this - -/datum/admin_help/tgui_fallback(payload) - if(..()) - return - - TicketPanelLegacy() - -/datum/admin_help/tgui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "AdminTicketPanel", "Ticket #[id] - [LinkedReplyName("\ref[src]")]") - ui.open() - -/datum/admin_help/tgui_state(mob/user) - return GLOB.tgui_admin_state - -/datum/admin_help/tgui_data(mob/user) - var/list/data = list() - - data["id"] = id - - var/ref_src = "\ref[src]" - data["title"] = name - data["name"] = LinkedReplyName(ref_src) - - switch(state) - if(AHELP_ACTIVE) - data["state"] = "open" - if(AHELP_RESOLVED) - data["state"] = "resolved" - if(AHELP_CLOSED) - data["state"] = "closed" - else - data["state"] = "unknown" - - data["opened_at"] = (world.time - opened_at) - data["closed_at"] = (world.time - closed_at) - data["opened_at_date"] = gameTimestamp(wtime = opened_at) - data["closed_at_date"] = gameTimestamp(wtime = closed_at) - - data["actions"] = FullMonty(ref_src) - - data["log"] = _interactions - - return data - -/datum/admin_help/tgui_act(action, params) - if(..()) - return - switch(action) - if("retitle") - Retitle() - . = TRUE - if("reopen") - Reopen() - . = TRUE - if("legacy") - TicketPanelLegacy() - . = TRUE - -//Forwarded action from admin/Topic -/datum/admin_help/proc/Action(action) - testing("Ahelp action: [action]") - switch(action) - if("ticket") - TicketPanel() - if("retitle") - Retitle() - if("reject") - Reject() - if("reply") - usr.client.cmd_ahelp_reply(initiator) - if("icissue") - ICIssue() - if("close") - Close() - if("resolve") - Resolve() - if("handleissue") - HandleIssue() - if("reopen") - Reopen() - -// -// TICKET STATCLICK -// - -/obj/effect/statclick/ahelp - var/datum/admin_help/ahelp_datum - -/obj/effect/statclick/ahelp/New(loc, datum/admin_help/AH) - ahelp_datum = AH - ..(loc) - -/obj/effect/statclick/ahelp/update() - return ..(ahelp_datum.name) - -/obj/effect/statclick/ahelp/Click() - ahelp_datum.TicketPanel() - -/obj/effect/statclick/ahelp/Destroy() - ahelp_datum = null - return ..() - -// -// CLIENT PROCS -// - -/client/verb/adminhelp(msg as text) - set category = "Admin" - set name = "Adminhelp" - - if(say_disabled) //This is here to try to identify lag problems - to_chat(usr, "Speech is currently admin-disabled.") - return - - //handle muting and automuting - if(prefs.muted & MUTE_ADMINHELP) - to_chat(src, "Error: Admin-PM: You cannot send adminhelps (Muted).") - return - if(handle_spam_prevention(msg,MUTE_ADMINHELP)) - return - - if(!msg) - return - - //remove out adminhelp verb temporarily to prevent spamming of admins. - src.verbs -= /client/verb/adminhelp - spawn(1200) - src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps - - feedback_add_details("admin_verb","Adminhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - if(current_ticket) - if(tgui_alert(usr, "You already have a ticket open. Is this for the same issue?","Duplicate?",list("Yes","No")) != "No") - if(current_ticket) - current_ticket.MessageNoRecipient(msg) - to_chat(usr, "PM to-Admins: [msg]") - return - else - to_chat(usr, "Ticket not found, creating new one...") - else - current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") - current_ticket.Close() - - new /datum/admin_help(msg, src, FALSE) - -//admin proc -/client/proc/cmd_admin_ticket_panel() - set name = "Show Ticket List" - set category = "Admin" - - if(!check_rights(R_ADMIN|R_MOD|R_DEBUG, TRUE)) //YW Edit: Remove Ticket permissions from Event Makers - return - - var/browse_to - - switch(tgui_input_list(usr, "Display which ticket list?", "List Choice", list("Active Tickets", "Closed Tickets", "Resolved Tickets"))) - if("Active Tickets") - browse_to = AHELP_ACTIVE - if("Closed Tickets") - browse_to = AHELP_CLOSED - if("Resolved Tickets") - browse_to = AHELP_RESOLVED - else - return - - GLOB.ahelp_tickets.BrowseTickets(browse_to) - -// -// LOGGING -// - -//Use this proc when an admin takes action that may be related to an open ticket on what -//what can be a client, ckey, or mob -/proc/admin_ticket_log(what, message) - var/client/C - var/mob/Mob = what - if(istype(Mob)) - C = Mob.client - else - C = what - if(istype(C) && C.current_ticket) - C.current_ticket.AddInteraction(message) - return C.current_ticket - if(istext(what)) //ckey - var/datum/admin_help/AH = GLOB.ahelp_tickets.CKey2ActiveTicket(what) - if(AH) - AH.AddInteraction(message) - return AH - -// -// HELPER PROCS -// - -/proc/get_admin_counts(requiredflags = R_BAN) - . = list("total" = list(), "noflags" = list(), "afk" = list(), "stealth" = list(), "present" = list()) - for(var/client/X in GLOB.admins) - .["total"] += X - if(requiredflags != 0 && !check_rights(rights_required = requiredflags, show_msg = FALSE, C = X)) - .["noflags"] += X - else if(X.is_afk()) - .["afk"] += X - else if(X.holder.fakekey) - .["stealth"] += X - else - .["present"] += X - -/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN) - var/list/adm = get_admin_counts() - var/list/activemins = adm["present"] - . = activemins.len - if(. <= 0) - var/final = "" - var/list/afkmins = adm["afk"] - var/list/stealthmins = adm["stealth"] - var/list/powerlessmins = adm["noflags"] - var/list/allmins = adm["total"] - if(!afkmins.len && !stealthmins.len && !powerlessmins.len) - final = "[msg] - No admins online" - else - final = "[msg] - All admins stealthed\[[english_list(stealthmins)]\], AFK\[[english_list(afkmins)]\], or lacks +BAN\[[english_list(powerlessmins)]\]! Total: [allmins.len] " - send2irc(source,final) - -/proc/ircadminwho() - var/list/message = list("Admins: ") - var/list/admin_keys = list() - for(var/client/C as anything in GLOB.admins) - admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]" - - for(var/admin in admin_keys) - if(LAZYLEN(admin_keys) > 1) - message += ", [admin]" - else - message += "[admin]" - - return jointext(message, "") - -/proc/keywords_lookup(msg,irc) - - //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! - var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") - - //explode the input msg into a list - var/list/msglist = splittext(msg, " ") - - //generate keywords lookup - var/list/surnames = list() - var/list/forenames = list() - var/list/ckeys = list() - var/founds = "" - for(var/mob/M in mob_list) - var/list/indexing = list(M.real_name, M.name) - if(M.mind) - indexing += M.mind.name - - for(var/string in indexing) - var/list/L = splittext(string, " ") - var/surname_found = 0 - //surnames - for(var/i=L.len, i>=1, i--) - var/word = ckey(L[i]) - if(word) - surnames[word] = M - surname_found = i - break - //forenames - for(var/i=1, i(?|F) " - continue - msg += "[original_word] " - if(irc) - if(founds == "") - return "Search Failed" - else - return founds - - return msg +/client/var/datum/admin_help/current_ticket //the current ticket the (usually) not-admin client is dealing with + +// +//TICKET MANAGER +// + +GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) + +/datum/admin_help_tickets + var/list/active_tickets = list() + var/list/closed_tickets = list() + var/list/resolved_tickets = list() + + var/obj/effect/statclick/ticket_list/astatclick = new(null, null, AHELP_ACTIVE) + var/obj/effect/statclick/ticket_list/cstatclick = new(null, null, AHELP_CLOSED) + var/obj/effect/statclick/ticket_list/rstatclick = new(null, null, AHELP_RESOLVED) + +/datum/admin_help_tickets/Destroy() + QDEL_LIST(active_tickets) + QDEL_LIST(closed_tickets) + QDEL_LIST(resolved_tickets) + QDEL_NULL(astatclick) + QDEL_NULL(cstatclick) + QDEL_NULL(rstatclick) + return ..() + +//private +/datum/admin_help_tickets/proc/ListInsert(datum/admin_help/new_ticket) + var/list/ticket_list + switch(new_ticket.state) + if(AHELP_ACTIVE) + ticket_list = active_tickets + if(AHELP_CLOSED) + ticket_list = closed_tickets + if(AHELP_RESOLVED) + ticket_list = resolved_tickets + else + CRASH("Invalid ticket state: [new_ticket.state]") + var/num_closed = ticket_list.len + if(num_closed) + for(var/I in 1 to num_closed) + var/datum/admin_help/AH = ticket_list[I] + if(AH.id > new_ticket.id) + ticket_list.Insert(I, new_ticket) + return + ticket_list += new_ticket + +//opens the ticket listings for one of the 3 states +/datum/admin_help_tickets/proc/BrowseTickets(state) + var/list/l2b + var/title + switch(state) + if(AHELP_ACTIVE) + l2b = active_tickets + title = "Active Tickets" + if(AHELP_CLOSED) + l2b = closed_tickets + title = "Closed Tickets" + if(AHELP_RESOLVED) + l2b = resolved_tickets + title = "Resolved Tickets" + if(!l2b) + return + var/list/dat = list("[title]") + dat += "Refresh

    " + for(var/datum/admin_help/AH as anything in l2b) + dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
    " + + usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") + +//Tickets statpanel +/datum/admin_help_tickets/proc/stat_entry() + var/num_disconnected = 0 + stat("== Admin Tickets ==") + stat("Active Tickets:", astatclick.update("[active_tickets.len]")) + for(var/datum/admin_help/AH as anything in active_tickets) + if(AH.initiator) + stat("#[AH.id]. [AH.initiator_key_name]:", AH.statclick.update()) + else + ++num_disconnected + if(num_disconnected) + stat("Disconnected:", astatclick.update("[num_disconnected]")) + stat("Closed Tickets:", cstatclick.update("[closed_tickets.len]")) + stat("Resolved Tickets:", rstatclick.update("[resolved_tickets.len]")) + +//Reassociate still open ticket if one exists +/datum/admin_help_tickets/proc/ClientLogin(client/C) + C.current_ticket = CKey2ActiveTicket(C.ckey) + if(C.current_ticket) + C.current_ticket.AddInteraction("Client reconnected.") + C.current_ticket.initiator = C + +//Dissasociate ticket +/datum/admin_help_tickets/proc/ClientLogout(client/C) + if(C.current_ticket) + C.current_ticket.AddInteraction("Client disconnected.") + C.current_ticket.initiator = null + C.current_ticket = null + +//Get a ticket given a ckey +/datum/admin_help_tickets/proc/CKey2ActiveTicket(ckey) + for(var/datum/admin_help/AH as anything in active_tickets) + if(AH.initiator_ckey == ckey) + return AH + +// +//TICKET LIST STATCLICK +// + +/obj/effect/statclick/ticket_list + var/current_state + +/obj/effect/statclick/ticket_list/New(loc, name, state) + current_state = state + ..() + +/obj/effect/statclick/ticket_list/Click() + GLOB.ahelp_tickets.BrowseTickets(current_state) + +// +//TICKET DATUM +// + +/datum/admin_help + var/id + var/name + var/state = AHELP_ACTIVE + + var/opened_at + var/closed_at + + var/client/initiator //semi-misnomer, it's the person who ahelped/was bwoinked + var/initiator_ckey + var/initiator_key_name + + var/list/_interactions //use AddInteraction() or, preferably, admin_ticket_log() + + var/obj/effect/statclick/ahelp/statclick + + var/static/ticket_counter = 0 + +//call this on its own to create a ticket, don't manually assign current_ticket +//msg is the title of the ticket: usually the ahelp text +//is_bwoink is TRUE if this ticket was started by an admin PM +/datum/admin_help/New(msg, client/C, is_bwoink) + //clean the input msg + msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN)) + if(!msg || !C || !C.mob) + qdel(src) + return + + id = ++ticket_counter + opened_at = world.time + + name = msg + + initiator = C + initiator_ckey = initiator.ckey + initiator_key_name = key_name(initiator, FALSE, TRUE) + if(initiator.current_ticket) //This is a bug + log_debug("Multiple ahelp current_tickets") + initiator.current_ticket.AddInteraction("Ticket erroneously left open by code") + initiator.current_ticket.Close() + initiator.current_ticket = src + + var/parsed_message = keywords_lookup(msg) + + statclick = new(null, src) + _interactions = list() + + if(is_bwoink) + AddInteraction("[key_name_admin(usr)] PM'd [LinkedReplyName()]") + message_admins(span_blue("Ticket [TicketHref("#[id]")] created")) + else + MessageNoRecipient(parsed_message) + send2adminchat() //VOREStation Add + //show it to the person adminhelping too + to_chat(C, "PM to-Admins: [name]") + + //send it to irc if nobody is on and tell us how many were on + var/admin_number_present = send2irc_adminless_only(initiator_ckey, name) + log_admin("Ticket #[id]: [key_name(initiator)]: [name] - heard by [admin_number_present] non-AFK admins who have +BAN.") + if(admin_number_present <= 0) + to_chat(C, "No active admins are online, your adminhelp was sent to the admin discord.") //VOREStation Edit + + // Also send it to discord since that's the hip cool thing now. + SSwebhooks.send( + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) ticket opened.", + "body" = "[key_name(initiator)] has opened a ticket. \n[msg]", + "color" = COLOR_WEBHOOK_POOR + ) + ) + + GLOB.ahelp_tickets.active_tickets += src + +/datum/admin_help/Destroy() + RemoveActive() + GLOB.ahelp_tickets.closed_tickets -= src + GLOB.ahelp_tickets.resolved_tickets -= src + return ..() + +/datum/admin_help/proc/AddInteraction(formatted_message) + _interactions += "[gameTimestamp()]: [formatted_message]" + +//private +/datum/admin_help/proc/FullMonty(ref_src) + if(!ref_src) + ref_src = "\ref[src]" + if(initiator && initiator.mob) + . = ADMIN_FULLMONTY_NONAME(initiator.mob) + else + . = "Initiator disconnected." + if(state == AHELP_ACTIVE) + . += ClosureLinks(ref_src) + +//private +/datum/admin_help/proc/ClosureLinks(ref_src) + if(!ref_src) + ref_src = "\ref[src]" + . = " (REJT)" + . += " (IC)" + . += " (CLOSE)" + . += " (RSLVE)" + . += " (HANDLE)" + +//private +/datum/admin_help/proc/LinkedReplyName(ref_src) + if(!ref_src) + ref_src = "\ref[src]" + return "[initiator_key_name]" + +//private +/datum/admin_help/proc/TicketHref(msg, ref_src, action = "ticket") + if(!ref_src) + ref_src = "\ref[src]" + return "[msg]" + +//message from the initiator without a target, all admins will see this +//won't bug irc +/datum/admin_help/proc/MessageNoRecipient(msg) + var/ref_src = "\ref[src]" + var/chat_msg = "Ticket [TicketHref("#[id]", ref_src)]: [LinkedReplyName(ref_src)] [FullMonty(ref_src)]: [msg]" + + AddInteraction("[LinkedReplyName(ref_src)]: [msg]") + //send this msg to all admins + + for(var/client/X in GLOB.admins) + if(!check_rights(R_ADMIN, 0, X)) + continue + if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) + X << 'sound/effects/adminhelp.ogg' + window_flash(X) + to_chat(X, chat_msg) + +//Reopen a closed ticket +/datum/admin_help/proc/Reopen() + if(state == AHELP_ACTIVE) + to_chat(usr, "This ticket is already open.") + return + + if(GLOB.ahelp_tickets.CKey2ActiveTicket(initiator_ckey)) + to_chat(usr, "This user already has an active ticket, cannot reopen this one.") + return + + statclick = new(null, src) + GLOB.ahelp_tickets.active_tickets += src + GLOB.ahelp_tickets.closed_tickets -= src + GLOB.ahelp_tickets.resolved_tickets -= src + switch(state) + if(AHELP_CLOSED) + feedback_dec("ahelp_close") + if(AHELP_RESOLVED) + feedback_dec("ahelp_resolve") + state = AHELP_ACTIVE + closed_at = null + if(initiator) + initiator.current_ticket = src + + AddInteraction("Reopened by [key_name_admin(usr)]") + if(initiator) + to_chat(initiator, "[span_purple("Ticket [TicketHref("#[id]")] was reopened by [key_name(usr,FALSE,FALSE)].")]") + var/msg = "Ticket [TicketHref("#[id]")] reopened by [key_name_admin(usr)]." + message_admins(msg) + log_admin(msg) + feedback_inc("ahelp_reopen") + TicketPanel() //can only be done from here, so refresh it + + SSwebhooks.send( + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) reopened.", + "body" = "Reopened by [key_name(usr)]." + ) + ) + +//private +/datum/admin_help/proc/RemoveActive() + if(state != AHELP_ACTIVE) + return + closed_at = world.time + QDEL_NULL(statclick) + GLOB.ahelp_tickets.active_tickets -= src + if(initiator && initiator.current_ticket == src) + initiator.current_ticket = null + +//Mark open ticket as closed/meme +/datum/admin_help/proc/Close(silent = FALSE) + if(state != AHELP_ACTIVE) + return + RemoveActive() + state = AHELP_CLOSED + GLOB.ahelp_tickets.ListInsert(src) + AddInteraction("Closed by [key_name_admin(usr)].") + if(initiator) + to_chat(initiator, "[span_red("Ticket [TicketHref("#[id]")] was closed by [key_name(usr,FALSE,FALSE)].")]") + if(!silent) + feedback_inc("ahelp_close") + var/msg = "Ticket [TicketHref("#[id]")] closed by [key_name_admin(usr)]." + message_admins(msg) + log_admin(msg) + SSwebhooks.send( + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) closed.", + "body" = "Closed by [key_name(usr)].", + "color" = COLOR_WEBHOOK_BAD + ) + ) + +//Mark open ticket as resolved/legitimate, returns ahelp verb +/datum/admin_help/proc/Resolve(silent = FALSE) + if(state != AHELP_ACTIVE) + return + RemoveActive() + state = AHELP_RESOLVED + GLOB.ahelp_tickets.ListInsert(src) + + AddInteraction("Resolved by [key_name_admin(usr)].") + if(initiator) + to_chat(initiator, "[span_green("Ticket [TicketHref("#[id]")] was marked resolved by [key_name(usr,FALSE,FALSE)].")]") + if(!silent) + feedback_inc("ahelp_resolve") + var/msg = "Ticket [TicketHref("#[id]")] resolved by [key_name_admin(usr)]" + message_admins(msg) + log_admin(msg) + SSwebhooks.send( + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) resolved.", + "body" = "Marked as Resolved by [key_name(usr)].", + "color" = COLOR_WEBHOOK_GOOD + ) + ) + +//Close and return ahelp verb, use if ticket is incoherent +/datum/admin_help/proc/Reject(key_name = key_name_admin(usr)) + if(state != AHELP_ACTIVE) + return + + if(initiator) + if(initiator.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) + initiator << 'sound/effects/adminhelp.ogg' + + to_chat(initiator, "[span_red("- AdminHelp Rejected! -")]
    \ + [span_red("Your admin help was rejected.")]
    \ + Please try to be calm, clear, and descriptive in admin helps, do not assume the admin has seen any related events, and clearly state the names of anybody you are reporting.
    ") + + feedback_inc("ahelp_reject") + var/msg = "Ticket [TicketHref("#[id]")] rejected by [key_name_admin(usr)]" + message_admins(msg) + log_admin(msg) + AddInteraction("Rejected by [key_name_admin(usr)].") + Close(silent = TRUE) + SSwebhooks.send( + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) rejected.", + "body" = "Rejected by [key_name(usr)].", + "color" = COLOR_WEBHOOK_BAD + ) + ) + +//Resolve ticket with IC Issue message +/datum/admin_help/proc/ICIssue(key_name = key_name_admin(usr)) + if(state != AHELP_ACTIVE) + return + + var/msg = "[span_red("- AdminHelp marked as IC issue! -")]
    " + msg += "[span_red("This is something that can be solved ICly, and does not currently require staff intervention.")]
    " + msg += "[span_red("Your AdminHelp may also be unanswerable due to ongoing events.")]
    " + + if(initiator) + to_chat(initiator, msg) + + feedback_inc("ahelp_icissue") + msg = "Ticket [TicketHref("#[id]")] marked as IC by [key_name_admin(usr)]" + message_admins(msg) + log_admin(msg) + AddInteraction("Marked as IC issue by [key_name_admin(usr)]") + Resolve(silent = TRUE) + SSwebhooks.send( + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) marked as IC issue.", + "body" = "Marked as IC Issue by [key_name(usr)].", + "color" = COLOR_WEBHOOK_BAD + ) + ) + +//Resolve ticket with IC Issue message +/datum/admin_help/proc/HandleIssue() + if(state != AHELP_ACTIVE) + return + + var/msg = span_red("Your AdminHelp is being handled by [key_name(usr,FALSE,FALSE)] please be patient.") + + if(initiator) + to_chat(initiator, msg) + + feedback_inc("ahelp_handling") + msg = "Ticket [TicketHref("#[id]")] being handled by [key_name(usr,FALSE,FALSE)]" + message_admins(msg) + log_admin(msg) + AddInteraction("[key_name_admin(usr)] is now handling this ticket.") + SSwebhooks.send( // YW EDIT: Reverts to use SSwebhooks + WEBHOOK_AHELP_SENT, + list( + "name" = "Ticket ([id]) (Game ID: [game_id]) being handled.", + "body" = "[key_name(usr)] is now handling the ticket." + ) + ) + +//Show the ticket panel +/datum/admin_help/proc/TicketPanel() + tgui_interact(usr.client.mob) + +/datum/admin_help/proc/TicketPanelLegacy() + var/list/dat = list("Ticket #[id]") + var/ref_src = "\ref[src]" + dat += "

    Admin Help Ticket #[id]: [LinkedReplyName(ref_src)]

    " + dat += "State: " + switch(state) + if(AHELP_ACTIVE) + dat += "OPEN" + if(AHELP_RESOLVED) + dat += "RESOLVED" + if(AHELP_CLOSED) + dat += "CLOSED" + else + dat += "UNKNOWN" + dat += "[GLOB.TAB][TicketHref("Refresh", ref_src)][GLOB.TAB][TicketHref("Re-Title", ref_src, "retitle")]" + if(state != AHELP_ACTIVE) + dat += "[GLOB.TAB][TicketHref("Reopen", ref_src, "reopen")]" + dat += "

    Opened at: [gameTimestamp(wtime = opened_at)] (Approx [(world.time - opened_at) / 600] minutes ago)" + if(closed_at) + dat += "
    Closed at: [gameTimestamp(wtime = closed_at)] (Approx [(world.time - closed_at) / 600] minutes ago)" + dat += "

    " + if(initiator) + dat += "Actions: [FullMonty(ref_src)]
    " + else + dat += "DISCONNECTED[GLOB.TAB][ClosureLinks(ref_src)]
    " + dat += "
    Log:

    " + for(var/I in _interactions) + dat += "[I]
    " + + usr << browse(dat.Join(), "window=ahelp[id];size=620x480") + +/datum/admin_help/proc/Retitle() + var/new_title = tgui_input_text(usr, "Enter a title for the ticket", "Rename Ticket", name) + if(new_title) + name = new_title + //not saying the original name cause it could be a long ass message + var/msg = "Ticket [TicketHref("#[id]")] titled [name] by [key_name_admin(usr)]" + message_admins(msg) + log_admin(msg) + TicketPanel() //we have to be here to do this + +/datum/admin_help/tgui_fallback(payload) + if(..()) + return + + TicketPanelLegacy() + +/datum/admin_help/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "AdminTicketPanel", "Ticket #[id] - [LinkedReplyName("\ref[src]")]") + ui.open() + +/datum/admin_help/tgui_state(mob/user) + return GLOB.tgui_admin_state + +/datum/admin_help/tgui_data(mob/user) + var/list/data = list() + + data["id"] = id + + var/ref_src = "\ref[src]" + data["title"] = name + data["name"] = LinkedReplyName(ref_src) + + switch(state) + if(AHELP_ACTIVE) + data["state"] = "open" + if(AHELP_RESOLVED) + data["state"] = "resolved" + if(AHELP_CLOSED) + data["state"] = "closed" + else + data["state"] = "unknown" + + data["opened_at"] = (world.time - opened_at) + data["closed_at"] = (world.time - closed_at) + data["opened_at_date"] = gameTimestamp(wtime = opened_at) + data["closed_at_date"] = gameTimestamp(wtime = closed_at) + + data["actions"] = FullMonty(ref_src) + + data["log"] = _interactions + + return data + +/datum/admin_help/tgui_act(action, params) + if(..()) + return + switch(action) + if("retitle") + Retitle() + . = TRUE + if("reopen") + Reopen() + . = TRUE + if("legacy") + TicketPanelLegacy() + . = TRUE + +//Forwarded action from admin/Topic +/datum/admin_help/proc/Action(action) + testing("Ahelp action: [action]") + switch(action) + if("ticket") + TicketPanel() + if("retitle") + Retitle() + if("reject") + Reject() + if("reply") + usr.client.cmd_ahelp_reply(initiator) + if("icissue") + ICIssue() + if("close") + Close() + if("resolve") + Resolve() + if("handleissue") + HandleIssue() + if("reopen") + Reopen() + +// +// TICKET STATCLICK +// + +/obj/effect/statclick/ahelp + var/datum/admin_help/ahelp_datum + +/obj/effect/statclick/ahelp/New(loc, datum/admin_help/AH) + ahelp_datum = AH + ..(loc) + +/obj/effect/statclick/ahelp/update() + return ..(ahelp_datum.name) + +/obj/effect/statclick/ahelp/Click() + ahelp_datum.TicketPanel() + +/obj/effect/statclick/ahelp/Destroy() + ahelp_datum = null + return ..() + +// +// CLIENT PROCS +// + +/client/verb/adminhelp(msg as text) + set category = "Admin" + set name = "Adminhelp" + + if(say_disabled) //This is here to try to identify lag problems + to_chat(usr, "Speech is currently admin-disabled.") + return + + //handle muting and automuting + if(prefs.muted & MUTE_ADMINHELP) + to_chat(src, "Error: Admin-PM: You cannot send adminhelps (Muted).") + return + if(handle_spam_prevention(msg,MUTE_ADMINHELP)) + return + + if(!msg) + return + + //remove out adminhelp verb temporarily to prevent spamming of admins. + src.verbs -= /client/verb/adminhelp + spawn(1200) + src.verbs += /client/verb/adminhelp // 2 minute cool-down for adminhelps + + feedback_add_details("admin_verb","Adminhelp") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + if(current_ticket) + if(tgui_alert(usr, "You already have a ticket open. Is this for the same issue?","Duplicate?",list("Yes","No")) != "No") + if(current_ticket) + current_ticket.MessageNoRecipient(msg) + to_chat(usr, "PM to-Admins: [msg]") + return + else + to_chat(usr, "Ticket not found, creating new one...") + else + current_ticket.AddInteraction("[key_name_admin(usr)] opened a new ticket.") + current_ticket.Close() + + new /datum/admin_help(msg, src, FALSE) + +//admin proc +/client/proc/cmd_admin_ticket_panel() + set name = "Show Ticket List" + set category = "Admin" + + if(!check_rights(R_ADMIN|R_MOD|R_DEBUG, TRUE)) //YW Edit: Remove Ticket permissions from Event Makers + return + + var/browse_to + + switch(tgui_input_list(usr, "Display which ticket list?", "List Choice", list("Active Tickets", "Closed Tickets", "Resolved Tickets"))) + if("Active Tickets") + browse_to = AHELP_ACTIVE + if("Closed Tickets") + browse_to = AHELP_CLOSED + if("Resolved Tickets") + browse_to = AHELP_RESOLVED + else + return + + GLOB.ahelp_tickets.BrowseTickets(browse_to) + +// +// LOGGING +// + +//Use this proc when an admin takes action that may be related to an open ticket on what +//what can be a client, ckey, or mob +/proc/admin_ticket_log(what, message) + var/client/C + var/mob/Mob = what + if(istype(Mob)) + C = Mob.client + else + C = what + if(istype(C) && C.current_ticket) + C.current_ticket.AddInteraction(message) + return C.current_ticket + if(istext(what)) //ckey + var/datum/admin_help/AH = GLOB.ahelp_tickets.CKey2ActiveTicket(what) + if(AH) + AH.AddInteraction(message) + return AH + +// +// HELPER PROCS +// + +/proc/get_admin_counts(requiredflags = R_BAN) + . = list("total" = list(), "noflags" = list(), "afk" = list(), "stealth" = list(), "present" = list()) + for(var/client/X in GLOB.admins) + .["total"] += X + if(requiredflags != 0 && !check_rights(rights_required = requiredflags, show_msg = FALSE, C = X)) + .["noflags"] += X + else if(X.is_afk()) + .["afk"] += X + else if(X.holder.fakekey) + .["stealth"] += X + else + .["present"] += X + +/proc/send2irc_adminless_only(source, msg, requiredflags = R_BAN) + var/list/adm = get_admin_counts() + var/list/activemins = adm["present"] + . = activemins.len + if(. <= 0) + var/final = "" + var/list/afkmins = adm["afk"] + var/list/stealthmins = adm["stealth"] + var/list/powerlessmins = adm["noflags"] + var/list/allmins = adm["total"] + if(!afkmins.len && !stealthmins.len && !powerlessmins.len) + final = "[msg] - No admins online" + else + final = "[msg] - All admins stealthed\[[english_list(stealthmins)]\], AFK\[[english_list(afkmins)]\], or lacks +BAN\[[english_list(powerlessmins)]\]! Total: [allmins.len] " + send2irc(source,final) + +/proc/ircadminwho() + var/list/message = list("Admins: ") + var/list/admin_keys = list() + for(var/client/C as anything in GLOB.admins) + admin_keys += "[C][C.holder.fakekey ? "(Stealth)" : ""][C.is_afk() ? "(AFK)" : ""]" + + for(var/admin in admin_keys) + if(LAZYLEN(admin_keys) > 1) + message += ", [admin]" + else + message += "[admin]" + + return jointext(message, "") + +/proc/keywords_lookup(msg,irc) + + //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE! + var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i") + + //explode the input msg into a list + var/list/msglist = splittext(msg, " ") + + //generate keywords lookup + var/list/surnames = list() + var/list/forenames = list() + var/list/ckeys = list() + var/founds = "" + for(var/mob/M in mob_list) + var/list/indexing = list(M.real_name, M.name) + if(M.mind) + indexing += M.mind.name + + for(var/string in indexing) + var/list/L = splittext(string, " ") + var/surname_found = 0 + //surnames + for(var/i=L.len, i>=1, i--) + var/word = ckey(L[i]) + if(word) + surnames[word] = M + surname_found = i + break + //forenames + for(var/i=1, i(?|F) " + continue + msg += "[original_word] " + if(irc) + if(founds == "") + return "Search Failed" + else + return founds + + return msg diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 1a2d54b1816..ca03b0e14e7 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -1,695 +1,695 @@ -/client/proc/Debug2() - set category = "Debug" - set name = "Debug-Game" - if(!check_rights(R_DEBUG)) return - - if(Debug2) - Debug2 = 0 - message_admins("[key_name(src)] toggled debugging off.") - log_admin("[key_name(src)] toggled debugging off.") - else - Debug2 = 1 - message_admins("[key_name(src)] toggled debugging on.") - log_admin("[key_name(src)] toggled debugging on.") - - feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -// callproc moved to code/modules/admin/callproc - -/client/proc/simple_DPS() - set name = "Simple DPS" - set category = "Debug" - set desc = "Gives a really basic idea of how much hurt something in-hand does." - - var/obj/item/I = null - var/mob/living/user = null - if(isliving(usr)) - user = usr - I = user.get_active_hand() - if(!I || !istype(I)) - to_chat(user, "You need to have something in your active hand, to use this verb.") - return - var/weapon_attack_speed = user.get_attack_speed(I) / 10 - var/weapon_damage = I.force - var/modified_damage_percent = 1 - - for(var/datum/modifier/M in user.modifiers) - if(!isnull(M.outgoing_melee_damage_percent)) - weapon_damage *= M.outgoing_melee_damage_percent - modified_damage_percent *= M.outgoing_melee_damage_percent - - if(istype(I, /obj/item/weapon/gun)) - var/obj/item/weapon/gun/G = I - var/obj/item/projectile/P - - if(istype(I, /obj/item/weapon/gun/energy)) - var/obj/item/weapon/gun/energy/energy_gun = G - P = new energy_gun.projectile_type() - - else if(istype(I, /obj/item/weapon/gun/projectile)) - var/obj/item/weapon/gun/projectile/projectile_gun = G - var/obj/item/ammo_casing/ammo = projectile_gun.chambered - P = ammo.BB - - else - to_chat(user, "DPS calculation by this verb is not supported for \the [G]'s type. Energy or Ballistic only, sorry.") - - weapon_damage = P.damage - weapon_attack_speed = G.fire_delay / 10 - qdel(P) - - var/DPS = weapon_damage / weapon_attack_speed - to_chat(user, "Damage: [weapon_damage][modified_damage_percent != 1 ? " (Modified by [modified_damage_percent*100]%)":""]") - to_chat(user, "Attack Speed: [weapon_attack_speed]/s") - to_chat(user, "\The [I] does [DPS] damage per second.") - if(DPS > 0) - to_chat(user, "At your maximum health ([user.getMaxHealth()]), it would take approximately;") - to_chat(user, "[(user.getMaxHealth() - config.health_threshold_softcrit) / DPS] seconds to softcrit you. ([config.health_threshold_softcrit] health)") - to_chat(user, "[(user.getMaxHealth() - config.health_threshold_crit) / DPS] seconds to hardcrit you. ([config.health_threshold_crit] health)") - to_chat(user, "[(user.getMaxHealth() - config.health_threshold_dead) / DPS] seconds to kill you. ([config.health_threshold_dead] health)") - - else - to_chat(user, "You need to be a living mob, with hands, and for an object to be in your active hand, to use this verb.") - return - -/client/proc/Cell() - set category = "Debug" - set name = "Cell" - if(!mob) - return - var/turf/T = mob.loc - - if (!( istype(T, /turf) )) - return - - var/datum/gas_mixture/env = T.return_air() - - var/t = "Coordinates: [T.x],[T.y],[T.z]\n" - t += "Temperature: [env.temperature]\n" - t += "Pressure: [env.return_pressure()]kPa\n" - for(var/g in env.gas) - t += "[g]: [env.gas[g]] / [env.gas[g] * R_IDEAL_GAS_EQUATION * env.temperature / env.volume]kPa\n" - - usr.show_message(t, 1) - feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_admin_robotize(var/mob/M in mob_list) - set category = "Fun" - set name = "Make Robot" - - if(!ticker) - tgui_alert_async(usr, "Wait until the game starts") - return - if(istype(M, /mob/living/carbon/human)) - log_admin("[key_name(src)] has robotized [M.key].") - spawn(10) - M:Robotize() - - else - tgui_alert_async(usr, "Invalid mob") - -/client/proc/cmd_admin_animalize(var/mob/M in mob_list) - set category = "Fun" - set name = "Make Simple Animal" - - if(!ticker) - tgui_alert_async(usr, "Wait until the game starts") - return - - if(!M) - tgui_alert_async(usr, "That mob doesn't seem to exist, close the panel and try again.") - return - - if(istype(M, /mob/new_player)) - tgui_alert_async(usr, "The mob must not be a new_player.") - return - - log_admin("[key_name(src)] has animalized [M.key].") - spawn(10) - M.Animalize() - - -/client/proc/makepAI() - set category = "Fun" - set name = "Make pAI" - set desc = "Spawn someone in as a pAI!" - if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) - return - var/turf/T = get_turf(mob) - - var/list/available = list() - for(var/mob/C in mob_list) - if(C.key && isobserver(C)) - available.Add(C) - var/mob/choice = tgui_input_list(usr, "Choose a player to play the pAI", "Spawn pAI", available) - if(!choice) - return 0 - var/obj/item/device/paicard/typeb/card = new(T) - var/mob/living/silicon/pai/pai = new(card) - pai.real_name = pai.name - pai.key = choice.key - card.setPersonality(pai) - if(tgui_alert(pai, "Do you want to load your pAI data?", "Load", list("Yes", "No")) == "Yes") - pai.savefile_load(pai) - else - pai.name = sanitizeSafe(tgui_input_text(pai, "Enter your pAI name:", "pAI Name", "Personal AI")) - card.setPersonality(pai) - for(var/datum/paiCandidate/candidate in paiController.pai_candidates) - if(candidate.key == choice.key) - paiController.pai_candidates.Remove(candidate) - log_admin("made a pAI with key=[pai.key] at ([T.x],[T.y],[T.z])") - feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_admin_alienize(var/mob/M in mob_list) - set category = "Fun" - set name = "Make Alien" - - if(!ticker) - tgui_alert_async(usr, "Wait until the game starts") - return - if(ishuman(M)) - log_admin("[key_name(src)] has alienized [M.key].") - spawn(10) - M:Alienize() - feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(usr)] made [key_name(M)] into an alien.") - message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.", 1) - else - tgui_alert_async(usr, "Invalid mob") - - -//TODO: merge the vievars version into this or something maybe mayhaps -/client/proc/cmd_debug_del_all() - set category = "Debug" - set name = "Del-All" - - // to prevent REALLY stupid deletions - var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/observer/dead, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) - var/hsbitem = tgui_input_list(usr, "Choose an object to delete.", "Delete:", typesof(/obj) + typesof(/mob) - blocked) - if(hsbitem) - for(var/atom/O in world) - if(istype(O, hsbitem)) - qdel(O) - log_admin("[key_name(src)] has deleted all instances of [hsbitem].") - message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) - feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_debug_make_powernets() - set category = "Debug" - set name = "Make Powernets" - SSmachines.makepowernets() - log_admin("[key_name(src)] has remade the powernet. SSmachines.makepowernets() called.") - message_admins("[key_name_admin(src)] has remade the powernets. SSmachines.makepowernets() called.", 0) - feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_debug_tog_aliens() - set category = "Server" - set name = "Toggle Aliens" - - config.aliens_allowed = !config.aliens_allowed - log_admin("[key_name(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].") - message_admins("[key_name_admin(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].", 0) - feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/cmd_display_del_log() - set category = "Debug" - set name = "Display del() Log" - set desc = "Display del's log of everything that's passed through it." - - if(!check_rights(R_DEBUG)) return - var/list/dellog = list("List of things that have gone through qdel this round

      ") - sortTim(SSgarbage.items, cmp=/proc/cmp_qdel_item_time, associative = TRUE) - for(var/path in SSgarbage.items) - var/datum/qdel_item/I = SSgarbage.items[path] - dellog += "
    1. [path]
        " - if (I.failures) - dellog += "
      • Failures: [I.failures]
      • " - dellog += "
      • qdel() Count: [I.qdels]
      • " - dellog += "
      • Destroy() Cost: [I.destroy_time]ms
      • " - if (I.hard_deletes) - dellog += "
      • Total Hard Deletes [I.hard_deletes]
      • " - dellog += "
      • Time Spent Hard Deleting: [I.hard_delete_time]ms
      • " - if (I.slept_destroy) - dellog += "
      • Sleeps: [I.slept_destroy]
      • " - if (I.no_respect_force) - dellog += "
      • Ignored force: [I.no_respect_force]
      • " - if (I.no_hint) - dellog += "
      • No hint: [I.no_hint]
      • " - dellog += "
    2. " - - dellog += "
    " - - usr << browse(dellog.Join(), "window=dellog") - -/client/proc/cmd_display_init_log() - set category = "Debug" - set name = "Display Initialize() Log" - set desc = "Displays a list of things that didn't handle Initialize() properly" - - if(!check_rights(R_DEBUG)) return - src << browse(replacetext(SSatoms.InitLog(), "\n", "
    "), "window=initlog") - -/* -/client/proc/cmd_display_overlay_log() - set category = "Debug" - set name = "Display overlay Log" - set desc = "Display SSoverlays log of everything that's passed through it." - - if(!check_rights(R_DEBUG)) return - render_stats(SSoverlays.stats, src) -*/ -// Render stats list for round-end statistics. -/proc/render_stats(list/stats, user, sort = /proc/cmp_generic_stat_item_time) - sortTim(stats, sort, TRUE) - - var/list/lines = list() - for (var/entry in stats) - var/list/data = stats[entry] - lines += "[entry] => [num2text(data[STAT_ENTRY_TIME], 10)]ms ([data[STAT_ENTRY_COUNT]]) (avg:[num2text(data[STAT_ENTRY_TIME]/(data[STAT_ENTRY_COUNT] || 1), 99)])" - - if (user) - user << browse("
    1. [lines.Join("
    2. ")]
    ", "window=[url_encode("stats:\ref[stats]")]") - else - . = lines.Join("\n") - -/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list) - set category = "Admin" - set name = "Grant Full Access" - - if (!ticker) - tgui_alert_async(usr, "Wait until the game starts") - return - if (istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if (H.wear_id) - var/obj/item/weapon/card/id/id = H.wear_id - if(istype(H.wear_id, /obj/item/device/pda)) - var/obj/item/device/pda/pda = H.wear_id - id = pda.id - id.icon_state = "gold" - id.access = get_all_accesses().Copy() - else - var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); - id.icon_state = "gold" - id.access = get_all_accesses().Copy() - id.registered_name = H.real_name - id.assignment = "Site Manager" - id.name = "[id.registered_name]'s ID Card ([id.assignment])" - H.equip_to_slot_or_del(id, slot_wear_id) - H.update_inv_wear_id() - else - tgui_alert_async(usr, "Invalid mob") - feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_admin("[key_name(src)] has granted [M.key] full access.") - message_admins("[key_name_admin(usr)] has granted [M.key] full access.", 1) - -/client/proc/cmd_assume_direct_control(var/mob/M in mob_list) - set category = "Admin" - set name = "Assume direct control" - set desc = "Direct intervention" - - if(!check_rights(R_DEBUG|R_ADMIN|R_EVENT)) return - if(M.ckey) - if(tgui_alert(usr, "This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.","Confirmation",list("Yes","No")) != "Yes") - return - else - var/mob/observer/dead/ghost = new/mob/observer/dead(M,1) - ghost.ckey = M.ckey - message_admins("[key_name_admin(usr)] assumed direct control of [M].", 1) - log_admin("[key_name(usr)] assumed direct control of [M].") - var/mob/adminmob = src.mob - M.ckey = src.ckey - if( isobserver(adminmob) ) - qdel(adminmob) - feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/take_picture(var/atom/A in world) - set name = "Save PNG" - set category = "Debug" - set desc = "Opens a dialog to save a PNG of any object in the game." - - if(!check_rights(R_DEBUG)) - return - - downloadImage(A) - -/client/proc/cmd_admin_areatest() - set category = "Mapping" - set name = "Test areas" - - var/list/areas_all = list() - var/list/areas_with_APC = list() - var/list/areas_with_air_alarm = list() - var/list/areas_with_RC = list() - var/list/areas_with_light = list() - var/list/areas_with_LS = list() - var/list/areas_with_intercom = list() - var/list/areas_with_camera = list() - - for(var/area/A in world) - if(!(A.type in areas_all)) - areas_all.Add(A.type) - - for(var/obj/machinery/power/apc/APC in GLOB.apcs) - var/area/A = get_area(APC) - if(A && !(A.type in areas_with_APC)) - areas_with_APC.Add(A.type) - - for(var/obj/machinery/alarm/alarm in machines) - var/area/A = get_area(alarm) - if(A && !(A.type in areas_with_air_alarm)) - areas_with_air_alarm.Add(A.type) - - for(var/obj/machinery/requests_console/RC in machines) - var/area/A = get_area(RC) - if(A && !(A.type in areas_with_RC)) - areas_with_RC.Add(A.type) - - for(var/obj/machinery/light/L in machines) - var/area/A = get_area(L) - if(A && !(A.type in areas_with_light)) - areas_with_light.Add(A.type) - - for(var/obj/machinery/light_switch/LS in machines) - var/area/A = get_area(LS) - if(A && !(A.type in areas_with_LS)) - areas_with_LS.Add(A.type) - - for(var/obj/item/device/radio/intercom/I in machines) - var/area/A = get_area(I) - if(A && !(A.type in areas_with_intercom)) - areas_with_intercom.Add(A.type) - - for(var/obj/machinery/camera/C in machines) - var/area/A = get_area(C) - if(A && !(A.type in areas_with_camera)) - areas_with_camera.Add(A.type) - - var/list/areas_without_APC = areas_all - areas_with_APC - var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm - var/list/areas_without_RC = areas_all - areas_with_RC - var/list/areas_without_light = areas_all - areas_with_light - var/list/areas_without_LS = areas_all - areas_with_LS - var/list/areas_without_intercom = areas_all - areas_with_intercom - var/list/areas_without_camera = areas_all - areas_with_camera - - to_world("AREAS WITHOUT AN APC:") - for(var/areatype in areas_without_APC) - to_world("* [areatype]") - - to_world("AREAS WITHOUT AN AIR ALARM:") - for(var/areatype in areas_without_air_alarm) - to_world("* [areatype]") - - to_world("AREAS WITHOUT A REQUEST CONSOLE:") - for(var/areatype in areas_without_RC) - to_world("* [areatype]") - - to_world("AREAS WITHOUT ANY LIGHTS:") - for(var/areatype in areas_without_light) - to_world("* [areatype]") - - to_world("AREAS WITHOUT A LIGHT SWITCH:") - for(var/areatype in areas_without_LS) - to_world("* [areatype]") - - to_world("AREAS WITHOUT ANY INTERCOMS:") - for(var/areatype in areas_without_intercom) - to_world("* [areatype]") - - to_world("AREAS WITHOUT ANY CAMERAS:") - for(var/areatype in areas_without_camera) - to_world("* [areatype]") - -/datum/admins/proc/cmd_admin_dress(input in getmobs()) - set category = "Fun" - set name = "Select equipment" - - if(!check_rights(R_FUN)) - return - - var/target = getmobs()[input] - if(!target) - return - - if(!ishuman(target)) - return - - var/mob/living/carbon/human/H = target - - var/decl/hierarchy/outfit/outfit = tgui_input_list(usr, "Select outfit.", "Select equipment.", outfits()) - if(!outfit) - return - - feedback_add_details("admin_verb","SEQ") - dressup_human(H, outfit, 1) - -/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit) - if(!H || !outfit) - return - if(outfit.undress) - H.delete_inventory() - outfit.equip(H) - log_and_message_admins("changed the equipment of [key_name(H)] to [outfit.name].") - -/client/proc/startSinglo() - - set category = "Debug" - set name = "Start Singularity" - set desc = "Sets up the singularity and all machines to get power flowing through the station" - - if(tgui_alert(usr, "Are you sure? This will start up the engine. Should only be used during debug!","Start Singularity",list("Yes","No")) != "Yes") - return - - for(var/obj/machinery/power/emitter/E in machines) - if(istype(get_area(E), /area/space)) - E.anchored = TRUE - E.state = 2 - E.connect_to_network() - E.active = TRUE - for(var/obj/machinery/field_generator/F in machines) - if(istype(get_area(F), /area/space)) - F.Varedit_start = 1 - for(var/obj/machinery/power/grounding_rod/GR in machines) - GR.anchored = TRUE - GR.update_icon() - for(var/obj/machinery/power/tesla_coil/TC in machines) - TC.anchored = TRUE - TC.update_icon() - for(var/obj/structure/particle_accelerator/PA in machines) - PA.anchored = TRUE - PA.construction_state = 3 - PA.update_icon() - for(var/obj/machinery/particle_accelerator/PA in machines) - PA.anchored = TRUE - PA.construction_state = 3 - PA.update_icon() - - for(var/obj/machinery/power/rad_collector/Rad in machines) - if(Rad.anchored) - if(!Rad.P) - var/obj/item/weapon/tank/phoron/Phoron = new/obj/item/weapon/tank/phoron(Rad) - Phoron.air_contents.gas["phoron"] = 70 - Rad.drainratio = 0 - Rad.P = Phoron - Phoron.loc = Rad - - if(!Rad.active) - Rad.toggle_power() - -/client/proc/setup_supermatter_engine() - set category = "Debug" - set name = "Setup supermatter" - set desc = "Sets up the supermatter engine" - - if(!check_rights(R_DEBUG|R_ADMIN)) return - - var/response = tgui_alert(usr, "Are you sure? This will start up the engine. Should only be used during debug!","Setup Supermatter",list("Setup Completely","Setup except coolant","No")) - - if(response == "No") - return - - var/found_the_pump = 0 - var/obj/machinery/power/supermatter/SM - - for(var/obj/machinery/M in machines) - if(!M) - continue - if(!M.loc) - continue - if(!M.loc.loc) - continue - - if(istype(M.loc.loc,/area/engineering/engine_room)) - if(istype(M,/obj/machinery/power/rad_collector)) - var/obj/machinery/power/rad_collector/Rad = M - Rad.anchored = TRUE - Rad.connect_to_network() - - var/obj/item/weapon/tank/phoron/Phoron = new/obj/item/weapon/tank/phoron(Rad) - - Phoron.air_contents.gas["phoron"] = 29.1154 //This is a full tank if you filled it from a canister - Rad.P = Phoron - - Phoron.loc = Rad - - if(!Rad.active) - Rad.toggle_power() - Rad.update_icon() - - else if(istype(M,/obj/machinery/atmospherics/binary/pump)) //Turning on every pump. - var/obj/machinery/atmospherics/binary/pump/Pump = M - if(Pump.name == "Engine Feed" && response == "Setup Completely") - found_the_pump = 1 - Pump.air2.gas["nitrogen"] = 3750 //The contents of 2 canisters. - Pump.air2.temperature = 50 - Pump.air2.update_values() - Pump.update_use_power(USE_POWER_IDLE) - Pump.target_pressure = 4500 - Pump.update_icon() - - else if(istype(M,/obj/machinery/power/supermatter)) - SM = M - spawn(50) - SM.power = 320 - - else if(istype(M,/obj/machinery/power/smes)) //This is the SMES inside the engine room. We don't need much power. - var/obj/machinery/power/smes/SMES = M - SMES.input_attempt = 1 - SMES.input_level = 200000 - SMES.output_level = 75000 - - else if(istype(M.loc.loc,/area/engineering/engine_smes)) //Set every SMES to charge and spit out 300,000 power between the 4 of them. - if(istype(M,/obj/machinery/power/smes)) - var/obj/machinery/power/smes/SMES = M - SMES.input_attempt = 1 - SMES.input_level = 200000 - SMES.output_level = 75000 - - if(!found_the_pump && response == "Setup Completely") - to_chat(src, "Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter") - var/turf/simulated/T = SM.loc - T.zone.air.gas["nitrogen"] += 450 - T.zone.air.temperature = 50 - T.zone.air.update_values() - - - log_admin("[key_name(usr)] setup the supermatter engine [response == "Setup except coolant" ? "without coolant" : ""]") - message_admins("[key_name_admin(usr)] setup the supermatter engine [response == "Setup except coolant" ? "without coolant": ""]", 1) - return - - - -/client/proc/cmd_debug_mob_lists() - set category = "Debug" - set name = "Debug Mob Lists" - set desc = "For when you just gotta know" - - switch(tgui_input_list(usr, "Which list?", "List Choice", list("Players","Admins","Mobs","Living Mobs","Dead Mobs", "Clients"))) - if("Players") - to_chat(usr, span("filter_debuglogs", jointext(player_list,","))) - if("Admins") - to_chat(usr, span("filter_debuglogs", jointext(GLOB.admins,","))) - if("Mobs") - to_chat(usr, span("filter_debuglogs", jointext(mob_list,","))) - if("Living Mobs") - to_chat(usr, span("filter_debuglogs", jointext(living_mob_list,","))) - if("Dead Mobs") - to_chat(usr, span("filter_debuglogs", jointext(dead_mob_list,","))) - if("Clients") - to_chat(usr, span("filter_debuglogs", jointext(GLOB.clients,","))) - -/client/proc/cmd_debug_using_map() - set category = "Debug" - set name = "Debug Map Datum" - set desc = "Debug the map metadata about the currently compiled in map." - - if(!check_rights(R_DEBUG)) - return - debug_variables(using_map) - -// DNA2 - Admin Hax -/client/proc/cmd_admin_toggle_block(var/mob/M,var/block) - if(!ticker) - tgui_alert_async(usr, "Wait until the game starts") - return - if(istype(M, /mob/living/carbon)) - M.dna.SetSEState(block,!M.dna.GetSEState(block)) - domutcheck(M,null,MUTCHK_FORCED) - M.update_mutations() - var/state="[M.dna.GetSEState(block)?"on":"off"]" - var/blockname=assigned_blocks[block] - message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") - log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") - else - tgui_alert_async(usr, "Invalid mob") - -/datum/admins/proc/view_runtimes() - set category = "Debug" - set name = "View Runtimes" - set desc = "Open the Runtime Viewer" - - if(!check_rights(R_DEBUG)) - return - - error_cache.showTo(usr) - -/datum/admins/proc/change_weather() - set category = "Debug" - set name = "Change Weather" - set desc = "Changes the current weather." - - if(!check_rights(R_DEBUG|R_EVENT)) //YW Edit: Event Makers can change weather - return - - var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to modify the weather on?", "Change Weather", SSplanets.planets) - if(istype(planet)) - var/datum/weather/new_weather = tgui_input_list(usr, "What weather do you want to change to?", "Change Weather", planet.weather_holder.allowed_weather_types) - if(new_weather) - planet.weather_holder.change_weather(new_weather) - planet.weather_holder.rebuild_forecast() - var/log = "[key_name(src)] changed [planet.name]'s weather to [new_weather]." - message_admins(log) - log_admin(log) - -/datum/admins/proc/toggle_firework_override() - set category = "Fun" - set name = "Toggle Weather Firework Override" - set desc = "Toggles ability for weather fireworks to affect weather on planet of choice." - - if(!check_rights(R_DEBUG)) - return - - var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to toggle firework effects on?", "Change Weather", SSplanets.planets) - if(istype(planet) && planet.weather_holder) - planet.weather_holder.firework_override = !(planet.weather_holder.firework_override) - var/log = "[key_name(src)] toggled [planet.name]'s firework override to [planet.weather_holder.firework_override ? "on" : "off"]." - message_admins(log) - log_admin(log) - -/datum/admins/proc/change_time() - set category = "Debug" - set name = "Change Planet Time" - set desc = "Changes the time of a planet." - - if(!check_rights(R_DEBUG)) - return - - var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to modify time on?", "Change Time", SSplanets.planets) - if(istype(planet)) - var/datum/time/current_time_datum = planet.current_time - var/new_hour = tgui_input_number(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) - if(!isnull(new_hour)) - var/new_minute = tgui_input_number(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")) ) - if(!isnull(new_minute)) - var/type_needed = current_time_datum.type - var/datum/time/new_time = new type_needed() - new_time = new_time.add_hours(new_hour) - new_time = new_time.add_minutes(new_minute) - planet.current_time = new_time - spawn(1) - planet.update_sun() - - var/log = "[key_name(src)] changed [planet.name]'s time to [planet.current_time.show_time("hh:mm")]." - message_admins(log) - log_admin(log) +/client/proc/Debug2() + set category = "Debug" + set name = "Debug-Game" + if(!check_rights(R_DEBUG)) return + + if(Debug2) + Debug2 = 0 + message_admins("[key_name(src)] toggled debugging off.") + log_admin("[key_name(src)] toggled debugging off.") + else + Debug2 = 1 + message_admins("[key_name(src)] toggled debugging on.") + log_admin("[key_name(src)] toggled debugging on.") + + feedback_add_details("admin_verb","DG2") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +// callproc moved to code/modules/admin/callproc + +/client/proc/simple_DPS() + set name = "Simple DPS" + set category = "Debug" + set desc = "Gives a really basic idea of how much hurt something in-hand does." + + var/obj/item/I = null + var/mob/living/user = null + if(isliving(usr)) + user = usr + I = user.get_active_hand() + if(!I || !istype(I)) + to_chat(user, "You need to have something in your active hand, to use this verb.") + return + var/weapon_attack_speed = user.get_attack_speed(I) / 10 + var/weapon_damage = I.force + var/modified_damage_percent = 1 + + for(var/datum/modifier/M in user.modifiers) + if(!isnull(M.outgoing_melee_damage_percent)) + weapon_damage *= M.outgoing_melee_damage_percent + modified_damage_percent *= M.outgoing_melee_damage_percent + + if(istype(I, /obj/item/weapon/gun)) + var/obj/item/weapon/gun/G = I + var/obj/item/projectile/P + + if(istype(I, /obj/item/weapon/gun/energy)) + var/obj/item/weapon/gun/energy/energy_gun = G + P = new energy_gun.projectile_type() + + else if(istype(I, /obj/item/weapon/gun/projectile)) + var/obj/item/weapon/gun/projectile/projectile_gun = G + var/obj/item/ammo_casing/ammo = projectile_gun.chambered + P = ammo.BB + + else + to_chat(user, "DPS calculation by this verb is not supported for \the [G]'s type. Energy or Ballistic only, sorry.") + + weapon_damage = P.damage + weapon_attack_speed = G.fire_delay / 10 + qdel(P) + + var/DPS = weapon_damage / weapon_attack_speed + to_chat(user, "Damage: [weapon_damage][modified_damage_percent != 1 ? " (Modified by [modified_damage_percent*100]%)":""]") + to_chat(user, "Attack Speed: [weapon_attack_speed]/s") + to_chat(user, "\The [I] does [DPS] damage per second.") + if(DPS > 0) + to_chat(user, "At your maximum health ([user.getMaxHealth()]), it would take approximately;") + to_chat(user, "[(user.getMaxHealth() - config.health_threshold_softcrit) / DPS] seconds to softcrit you. ([config.health_threshold_softcrit] health)") + to_chat(user, "[(user.getMaxHealth() - config.health_threshold_crit) / DPS] seconds to hardcrit you. ([config.health_threshold_crit] health)") + to_chat(user, "[(user.getMaxHealth() - config.health_threshold_dead) / DPS] seconds to kill you. ([config.health_threshold_dead] health)") + + else + to_chat(user, "You need to be a living mob, with hands, and for an object to be in your active hand, to use this verb.") + return + +/client/proc/Cell() + set category = "Debug" + set name = "Cell" + if(!mob) + return + var/turf/T = mob.loc + + if (!( istype(T, /turf) )) + return + + var/datum/gas_mixture/env = T.return_air() + + var/t = span_blue("Coordinates: [T.x],[T.y],[T.z]\n") + t += span_red("Temperature: [env.temperature]\n") + t += span_red("Pressure: [env.return_pressure()]kPa\n") + for(var/g in env.gas) + t += span_blue("[g]: [env.gas[g]] / [env.gas[g] * R_IDEAL_GAS_EQUATION * env.temperature / env.volume]kPa\n") + + usr.show_message(t, 1) + feedback_add_details("admin_verb","ASL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_robotize(var/mob/M in mob_list) + set category = "Fun" + set name = "Make Robot" + + if(!ticker) + tgui_alert_async(usr, "Wait until the game starts") + return + if(istype(M, /mob/living/carbon/human)) + log_admin("[key_name(src)] has robotized [M.key].") + spawn(10) + M:Robotize() + + else + tgui_alert_async(usr, "Invalid mob") + +/client/proc/cmd_admin_animalize(var/mob/M in mob_list) + set category = "Fun" + set name = "Make Simple Animal" + + if(!ticker) + tgui_alert_async(usr, "Wait until the game starts") + return + + if(!M) + tgui_alert_async(usr, "That mob doesn't seem to exist, close the panel and try again.") + return + + if(istype(M, /mob/new_player)) + tgui_alert_async(usr, "The mob must not be a new_player.") + return + + log_admin("[key_name(src)] has animalized [M.key].") + spawn(10) + M.Animalize() + + +/client/proc/makepAI() + set category = "Fun" + set name = "Make pAI" + set desc = "Spawn someone in as a pAI!" + if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) + return + var/turf/T = get_turf(mob) + + var/list/available = list() + for(var/mob/C in mob_list) + if(C.key && isobserver(C)) + available.Add(C) + var/mob/choice = tgui_input_list(usr, "Choose a player to play the pAI", "Spawn pAI", available) + if(!choice) + return 0 + var/obj/item/device/paicard/typeb/card = new(T) + var/mob/living/silicon/pai/pai = new(card) + pai.real_name = pai.name + pai.key = choice.key + card.setPersonality(pai) + if(tgui_alert(pai, "Do you want to load your pAI data?", "Load", list("Yes", "No")) == "Yes") + pai.savefile_load(pai) + else + pai.name = sanitizeSafe(tgui_input_text(pai, "Enter your pAI name:", "pAI Name", "Personal AI")) + card.setPersonality(pai) + for(var/datum/paiCandidate/candidate in paiController.pai_candidates) + if(candidate.key == choice.key) + paiController.pai_candidates.Remove(candidate) + log_admin("made a pAI with key=[pai.key] at ([T.x],[T.y],[T.z])") + feedback_add_details("admin_verb","MPAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_admin_alienize(var/mob/M in mob_list) + set category = "Fun" + set name = "Make Alien" + + if(!ticker) + tgui_alert_async(usr, "Wait until the game starts") + return + if(ishuman(M)) + log_admin("[key_name(src)] has alienized [M.key].") + spawn(10) + M:Alienize() + feedback_add_details("admin_verb","MKAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(usr)] made [key_name(M)] into an alien.") + message_admins("[key_name_admin(usr)] made [key_name(M)] into an alien.", 1) + else + tgui_alert_async(usr, "Invalid mob") + + +//TODO: merge the vievars version into this or something maybe mayhaps +/client/proc/cmd_debug_del_all() + set category = "Debug" + set name = "Del-All" + + // to prevent REALLY stupid deletions + var/blocked = list(/obj, /mob, /mob/living, /mob/living/carbon, /mob/living/carbon/human, /mob/observer/dead, /mob/living/silicon, /mob/living/silicon/robot, /mob/living/silicon/ai) + var/hsbitem = tgui_input_list(usr, "Choose an object to delete.", "Delete:", typesof(/obj) + typesof(/mob) - blocked) + if(hsbitem) + for(var/atom/O in world) + if(istype(O, hsbitem)) + qdel(O) + log_admin("[key_name(src)] has deleted all instances of [hsbitem].") + message_admins("[key_name_admin(src)] has deleted all instances of [hsbitem].", 0) + feedback_add_details("admin_verb","DELA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_debug_make_powernets() + set category = "Debug" + set name = "Make Powernets" + SSmachines.makepowernets() + log_admin("[key_name(src)] has remade the powernet. SSmachines.makepowernets() called.") + message_admins("[key_name_admin(src)] has remade the powernets. SSmachines.makepowernets() called.", 0) + feedback_add_details("admin_verb","MPWN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_debug_tog_aliens() + set category = "Server" + set name = "Toggle Aliens" + + config.aliens_allowed = !config.aliens_allowed + log_admin("[key_name(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].") + message_admins("[key_name_admin(src)] has turned aliens [config.aliens_allowed ? "on" : "off"].", 0) + feedback_add_details("admin_verb","TAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/cmd_display_del_log() + set category = "Debug" + set name = "Display del() Log" + set desc = "Display del's log of everything that's passed through it." + + if(!check_rights(R_DEBUG)) return + var/list/dellog = list("List of things that have gone through qdel this round

      ") + sortTim(SSgarbage.items, cmp=/proc/cmp_qdel_item_time, associative = TRUE) + for(var/path in SSgarbage.items) + var/datum/qdel_item/I = SSgarbage.items[path] + dellog += "
    1. [path]
        " + if (I.failures) + dellog += "
      • Failures: [I.failures]
      • " + dellog += "
      • qdel() Count: [I.qdels]
      • " + dellog += "
      • Destroy() Cost: [I.destroy_time]ms
      • " + if (I.hard_deletes) + dellog += "
      • Total Hard Deletes [I.hard_deletes]
      • " + dellog += "
      • Time Spent Hard Deleting: [I.hard_delete_time]ms
      • " + if (I.slept_destroy) + dellog += "
      • Sleeps: [I.slept_destroy]
      • " + if (I.no_respect_force) + dellog += "
      • Ignored force: [I.no_respect_force]
      • " + if (I.no_hint) + dellog += "
      • No hint: [I.no_hint]
      • " + dellog += "
    2. " + + dellog += "
    " + + usr << browse(dellog.Join(), "window=dellog") + +/client/proc/cmd_display_init_log() + set category = "Debug" + set name = "Display Initialize() Log" + set desc = "Displays a list of things that didn't handle Initialize() properly" + + if(!check_rights(R_DEBUG)) return + src << browse(replacetext(SSatoms.InitLog(), "\n", "
    "), "window=initlog") + +/* +/client/proc/cmd_display_overlay_log() + set category = "Debug" + set name = "Display overlay Log" + set desc = "Display SSoverlays log of everything that's passed through it." + + if(!check_rights(R_DEBUG)) return + render_stats(SSoverlays.stats, src) +*/ +// Render stats list for round-end statistics. +/proc/render_stats(list/stats, user, sort = /proc/cmp_generic_stat_item_time) + sortTim(stats, sort, TRUE) + + var/list/lines = list() + for (var/entry in stats) + var/list/data = stats[entry] + lines += "[entry] => [num2text(data[STAT_ENTRY_TIME], 10)]ms ([data[STAT_ENTRY_COUNT]]) (avg:[num2text(data[STAT_ENTRY_TIME]/(data[STAT_ENTRY_COUNT] || 1), 99)])" + + if (user) + user << browse("
    1. [lines.Join("
    2. ")]
    ", "window=[url_encode("stats:\ref[stats]")]") + else + . = lines.Join("\n") + +/client/proc/cmd_admin_grantfullaccess(var/mob/M in mob_list) + set category = "Admin" + set name = "Grant Full Access" + + if (!ticker) + tgui_alert_async(usr, "Wait until the game starts") + return + if (istype(M, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if (H.wear_id) + var/obj/item/weapon/card/id/id = H.wear_id + if(istype(H.wear_id, /obj/item/device/pda)) + var/obj/item/device/pda/pda = H.wear_id + id = pda.id + id.icon_state = "gold" + id.access = get_all_accesses().Copy() + else + var/obj/item/weapon/card/id/id = new/obj/item/weapon/card/id(M); + id.icon_state = "gold" + id.access = get_all_accesses().Copy() + id.registered_name = H.real_name + id.assignment = "Site Manager" + id.name = "[id.registered_name]'s ID Card ([id.assignment])" + H.equip_to_slot_or_del(id, slot_wear_id) + H.update_inv_wear_id() + else + tgui_alert_async(usr, "Invalid mob") + feedback_add_details("admin_verb","GFA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + log_admin("[key_name(src)] has granted [M.key] full access.") + message_admins(span_blue("[key_name_admin(usr)] has granted [M.key] full access."), 1) + +/client/proc/cmd_assume_direct_control(var/mob/M in mob_list) + set category = "Admin" + set name = "Assume direct control" + set desc = "Direct intervention" + + if(!check_rights(R_DEBUG|R_ADMIN|R_EVENT)) return + if(M.ckey) + if(tgui_alert(usr, "This mob is being controlled by [M.ckey]. Are you sure you wish to assume control of it? [M.ckey] will be made a ghost.","Confirmation",list("Yes","No")) != "Yes") + return + else + var/mob/observer/dead/ghost = new/mob/observer/dead(M,1) + ghost.ckey = M.ckey + message_admins(span_blue("[key_name_admin(usr)] assumed direct control of [M]."), 1) + log_admin("[key_name(usr)] assumed direct control of [M].") + var/mob/adminmob = src.mob + M.ckey = src.ckey + if( isobserver(adminmob) ) + qdel(adminmob) + feedback_add_details("admin_verb","ADC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/take_picture(var/atom/A in world) + set name = "Save PNG" + set category = "Debug" + set desc = "Opens a dialog to save a PNG of any object in the game." + + if(!check_rights(R_DEBUG)) + return + + downloadImage(A) + +/client/proc/cmd_admin_areatest() + set category = "Mapping" + set name = "Test areas" + + var/list/areas_all = list() + var/list/areas_with_APC = list() + var/list/areas_with_air_alarm = list() + var/list/areas_with_RC = list() + var/list/areas_with_light = list() + var/list/areas_with_LS = list() + var/list/areas_with_intercom = list() + var/list/areas_with_camera = list() + + for(var/area/A in world) + if(!(A.type in areas_all)) + areas_all.Add(A.type) + + for(var/obj/machinery/power/apc/APC in GLOB.apcs) + var/area/A = get_area(APC) + if(A && !(A.type in areas_with_APC)) + areas_with_APC.Add(A.type) + + for(var/obj/machinery/alarm/alarm in machines) + var/area/A = get_area(alarm) + if(A && !(A.type in areas_with_air_alarm)) + areas_with_air_alarm.Add(A.type) + + for(var/obj/machinery/requests_console/RC in machines) + var/area/A = get_area(RC) + if(A && !(A.type in areas_with_RC)) + areas_with_RC.Add(A.type) + + for(var/obj/machinery/light/L in machines) + var/area/A = get_area(L) + if(A && !(A.type in areas_with_light)) + areas_with_light.Add(A.type) + + for(var/obj/machinery/light_switch/LS in machines) + var/area/A = get_area(LS) + if(A && !(A.type in areas_with_LS)) + areas_with_LS.Add(A.type) + + for(var/obj/item/device/radio/intercom/I in machines) + var/area/A = get_area(I) + if(A && !(A.type in areas_with_intercom)) + areas_with_intercom.Add(A.type) + + for(var/obj/machinery/camera/C in machines) + var/area/A = get_area(C) + if(A && !(A.type in areas_with_camera)) + areas_with_camera.Add(A.type) + + var/list/areas_without_APC = areas_all - areas_with_APC + var/list/areas_without_air_alarm = areas_all - areas_with_air_alarm + var/list/areas_without_RC = areas_all - areas_with_RC + var/list/areas_without_light = areas_all - areas_with_light + var/list/areas_without_LS = areas_all - areas_with_LS + var/list/areas_without_intercom = areas_all - areas_with_intercom + var/list/areas_without_camera = areas_all - areas_with_camera + + to_world("AREAS WITHOUT AN APC:") + for(var/areatype in areas_without_APC) + to_world("* [areatype]") + + to_world("AREAS WITHOUT AN AIR ALARM:") + for(var/areatype in areas_without_air_alarm) + to_world("* [areatype]") + + to_world("AREAS WITHOUT A REQUEST CONSOLE:") + for(var/areatype in areas_without_RC) + to_world("* [areatype]") + + to_world("AREAS WITHOUT ANY LIGHTS:") + for(var/areatype in areas_without_light) + to_world("* [areatype]") + + to_world("AREAS WITHOUT A LIGHT SWITCH:") + for(var/areatype in areas_without_LS) + to_world("* [areatype]") + + to_world("AREAS WITHOUT ANY INTERCOMS:") + for(var/areatype in areas_without_intercom) + to_world("* [areatype]") + + to_world("AREAS WITHOUT ANY CAMERAS:") + for(var/areatype in areas_without_camera) + to_world("* [areatype]") + +/datum/admins/proc/cmd_admin_dress(input in getmobs()) + set category = "Fun" + set name = "Select equipment" + + if(!check_rights(R_FUN)) + return + + var/target = getmobs()[input] + if(!target) + return + + if(!ishuman(target)) + return + + var/mob/living/carbon/human/H = target + + var/decl/hierarchy/outfit/outfit = tgui_input_list(usr, "Select outfit.", "Select equipment.", outfits()) + if(!outfit) + return + + feedback_add_details("admin_verb","SEQ") + dressup_human(H, outfit, 1) + +/proc/dressup_human(var/mob/living/carbon/human/H, var/decl/hierarchy/outfit/outfit) + if(!H || !outfit) + return + if(outfit.undress) + H.delete_inventory() + outfit.equip(H) + log_and_message_admins("changed the equipment of [key_name(H)] to [outfit.name].") + +/client/proc/startSinglo() + + set category = "Debug" + set name = "Start Singularity" + set desc = "Sets up the singularity and all machines to get power flowing through the station" + + if(tgui_alert(usr, "Are you sure? This will start up the engine. Should only be used during debug!","Start Singularity",list("Yes","No")) != "Yes") + return + + for(var/obj/machinery/power/emitter/E in machines) + if(istype(get_area(E), /area/space)) + E.anchored = TRUE + E.state = 2 + E.connect_to_network() + E.active = TRUE + for(var/obj/machinery/field_generator/F in machines) + if(istype(get_area(F), /area/space)) + F.Varedit_start = 1 + for(var/obj/machinery/power/grounding_rod/GR in machines) + GR.anchored = TRUE + GR.update_icon() + for(var/obj/machinery/power/tesla_coil/TC in machines) + TC.anchored = TRUE + TC.update_icon() + for(var/obj/structure/particle_accelerator/PA in machines) + PA.anchored = TRUE + PA.construction_state = 3 + PA.update_icon() + for(var/obj/machinery/particle_accelerator/PA in machines) + PA.anchored = TRUE + PA.construction_state = 3 + PA.update_icon() + + for(var/obj/machinery/power/rad_collector/Rad in machines) + if(Rad.anchored) + if(!Rad.P) + var/obj/item/weapon/tank/phoron/Phoron = new/obj/item/weapon/tank/phoron(Rad) + Phoron.air_contents.gas["phoron"] = 70 + Rad.drainratio = 0 + Rad.P = Phoron + Phoron.loc = Rad + + if(!Rad.active) + Rad.toggle_power() + +/client/proc/setup_supermatter_engine() + set category = "Debug" + set name = "Setup supermatter" + set desc = "Sets up the supermatter engine" + + if(!check_rights(R_DEBUG|R_ADMIN)) return + + var/response = tgui_alert(usr, "Are you sure? This will start up the engine. Should only be used during debug!","Setup Supermatter",list("Setup Completely","Setup except coolant","No")) + + if(response == "No") + return + + var/found_the_pump = 0 + var/obj/machinery/power/supermatter/SM + + for(var/obj/machinery/M in machines) + if(!M) + continue + if(!M.loc) + continue + if(!M.loc.loc) + continue + + if(istype(M.loc.loc,/area/engineering/engine_room)) + if(istype(M,/obj/machinery/power/rad_collector)) + var/obj/machinery/power/rad_collector/Rad = M + Rad.anchored = TRUE + Rad.connect_to_network() + + var/obj/item/weapon/tank/phoron/Phoron = new/obj/item/weapon/tank/phoron(Rad) + + Phoron.air_contents.gas["phoron"] = 29.1154 //This is a full tank if you filled it from a canister + Rad.P = Phoron + + Phoron.loc = Rad + + if(!Rad.active) + Rad.toggle_power() + Rad.update_icon() + + else if(istype(M,/obj/machinery/atmospherics/binary/pump)) //Turning on every pump. + var/obj/machinery/atmospherics/binary/pump/Pump = M + if(Pump.name == "Engine Feed" && response == "Setup Completely") + found_the_pump = 1 + Pump.air2.gas["nitrogen"] = 3750 //The contents of 2 canisters. + Pump.air2.temperature = 50 + Pump.air2.update_values() + Pump.update_use_power(USE_POWER_IDLE) + Pump.target_pressure = 4500 + Pump.update_icon() + + else if(istype(M,/obj/machinery/power/supermatter)) + SM = M + spawn(50) + SM.power = 320 + + else if(istype(M,/obj/machinery/power/smes)) //This is the SMES inside the engine room. We don't need much power. + var/obj/machinery/power/smes/SMES = M + SMES.input_attempt = 1 + SMES.input_level = 200000 + SMES.output_level = 75000 + + else if(istype(M.loc.loc,/area/engineering/engine_smes)) //Set every SMES to charge and spit out 300,000 power between the 4 of them. + if(istype(M,/obj/machinery/power/smes)) + var/obj/machinery/power/smes/SMES = M + SMES.input_attempt = 1 + SMES.input_level = 200000 + SMES.output_level = 75000 + + if(!found_the_pump && response == "Setup Completely") + to_chat(src, span_red("Unable to locate air supply to fill up with coolant, adding some coolant around the supermatter")) + var/turf/simulated/T = SM.loc + T.zone.air.gas["nitrogen"] += 450 + T.zone.air.temperature = 50 + T.zone.air.update_values() + + + log_admin("[key_name(usr)] setup the supermatter engine [response == "Setup except coolant" ? "without coolant" : ""]") + message_admins(span_blue("[key_name_admin(usr)] setup the supermatter engine [response == "Setup except coolant" ? "without coolant": ""]"), 1) + return + + + +/client/proc/cmd_debug_mob_lists() + set category = "Debug" + set name = "Debug Mob Lists" + set desc = "For when you just gotta know" + + switch(tgui_input_list(usr, "Which list?", "List Choice", list("Players","Admins","Mobs","Living Mobs","Dead Mobs", "Clients"))) + if("Players") + to_chat(usr, span("filter_debuglogs", jointext(player_list,","))) + if("Admins") + to_chat(usr, span("filter_debuglogs", jointext(GLOB.admins,","))) + if("Mobs") + to_chat(usr, span("filter_debuglogs", jointext(mob_list,","))) + if("Living Mobs") + to_chat(usr, span("filter_debuglogs", jointext(living_mob_list,","))) + if("Dead Mobs") + to_chat(usr, span("filter_debuglogs", jointext(dead_mob_list,","))) + if("Clients") + to_chat(usr, span("filter_debuglogs", jointext(GLOB.clients,","))) + +/client/proc/cmd_debug_using_map() + set category = "Debug" + set name = "Debug Map Datum" + set desc = "Debug the map metadata about the currently compiled in map." + + if(!check_rights(R_DEBUG)) + return + debug_variables(using_map) + +// DNA2 - Admin Hax +/client/proc/cmd_admin_toggle_block(var/mob/M,var/block) + if(!ticker) + tgui_alert_async(usr, "Wait until the game starts") + return + if(istype(M, /mob/living/carbon)) + M.dna.SetSEState(block,!M.dna.GetSEState(block)) + domutcheck(M,null,MUTCHK_FORCED) + M.update_mutations() + var/state="[M.dna.GetSEState(block)?"on":"off"]" + var/blockname=assigned_blocks[block] + message_admins("[key_name_admin(src)] has toggled [M.key]'s [blockname] block [state]!") + log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") + else + tgui_alert_async(usr, "Invalid mob") + +/datum/admins/proc/view_runtimes() + set category = "Debug" + set name = "View Runtimes" + set desc = "Open the Runtime Viewer" + + if(!check_rights(R_DEBUG)) + return + + error_cache.showTo(usr) + +/datum/admins/proc/change_weather() + set category = "Debug" + set name = "Change Weather" + set desc = "Changes the current weather." + + if(!check_rights(R_DEBUG|R_EVENT)) //YW Edit: Event Makers can change weather + return + + var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to modify the weather on?", "Change Weather", SSplanets.planets) + if(istype(planet)) + var/datum/weather/new_weather = tgui_input_list(usr, "What weather do you want to change to?", "Change Weather", planet.weather_holder.allowed_weather_types) + if(new_weather) + planet.weather_holder.change_weather(new_weather) + planet.weather_holder.rebuild_forecast() + var/log = "[key_name(src)] changed [planet.name]'s weather to [new_weather]." + message_admins(log) + log_admin(log) + +/datum/admins/proc/toggle_firework_override() + set category = "Fun" + set name = "Toggle Weather Firework Override" + set desc = "Toggles ability for weather fireworks to affect weather on planet of choice." + + if(!check_rights(R_DEBUG)) + return + + var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to toggle firework effects on?", "Change Weather", SSplanets.planets) + if(istype(planet) && planet.weather_holder) + planet.weather_holder.firework_override = !(planet.weather_holder.firework_override) + var/log = "[key_name(src)] toggled [planet.name]'s firework override to [planet.weather_holder.firework_override ? "on" : "off"]." + message_admins(log) + log_admin(log) + +/datum/admins/proc/change_time() + set category = "Debug" + set name = "Change Planet Time" + set desc = "Changes the time of a planet." + + if(!check_rights(R_DEBUG)) + return + + var/datum/planet/planet = tgui_input_list(usr, "Which planet do you want to modify time on?", "Change Time", SSplanets.planets) + if(istype(planet)) + var/datum/time/current_time_datum = planet.current_time + var/new_hour = tgui_input_number(usr, "What hour do you want to change to?", "Change Time", text2num(current_time_datum.show_time("hh"))) + if(!isnull(new_hour)) + var/new_minute = tgui_input_number(usr, "What minute do you want to change to?", "Change Time", text2num(current_time_datum.show_time("mm")) ) + if(!isnull(new_minute)) + var/type_needed = current_time_datum.type + var/datum/time/new_time = new type_needed() + new_time = new_time.add_hours(new_hour) + new_time = new_time.add_minutes(new_minute) + planet.current_time = new_time + spawn(1) + planet.update_sun() + + var/log = "[key_name(src)] changed [planet.name]'s time to [planet.current_time.show_time("hh:mm")]." + message_admins(log) + log_admin(log) diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index 723d59b5772..6d79548df35 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -24,16 +24,16 @@ set category = null if(!src.holder) - to_chat(src, "Only Admins may use this command.") + to_chat(src, span_red("Only Admins may use this command.")) return var/client/target = tgui_input_list(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions", GLOB.clients) if(!istype(target,/client)) - to_chat(src, "Error: giveruntimelog(): Client not found.") + to_chat(src, span_red("Error: giveruntimelog(): Client not found.")) return target.verbs |= /client/proc/getruntimelog - to_chat(target, "You have been granted access to runtime logs. Please use them responsibly or risk being banned.") + to_chat(target, span_red("You have been granted access to runtime logs. Please use them responsibly or risk being banned.")) return @@ -89,7 +89,7 @@ if( fexists(path) ) src << run( file(path) ) else - to_chat(src, "Error: view_txt_log(): File not found/Invalid path([path]).") + to_chat(src, span_red("Error: view_txt_log(): File not found/Invalid path([path]).")) return feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 64e66f912a8..8cdc984f6cf 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -218,7 +218,7 @@ var/list/debug_verbs = list ( var/turf/simulated/location = get_turf(usr) if(!istype(location, /turf/simulated)) // We're in space, let's not cause runtimes. - to_chat(usr, "this debug tool cannot be used from space") + to_chat(usr, span_red("this debug tool cannot be used from space")) return var/icon/red = new('icons/misc/debug_group.dmi', "red") //created here so we don't have to make thousands of these. @@ -227,10 +227,10 @@ var/list/debug_verbs = list ( if(!usedZAScolors) to_chat(usr, "ZAS Test Colors") - to_chat(usr, "Green = Zone you are standing in") - to_chat(usr, "Blue = Connected zone to the zone you are standing in") - to_chat(usr, "Yellow = A zone that is connected but not one adjacent to your connected zone") - to_chat(usr, "Red = Not connected") + to_chat(usr, "[span_green("Green")] = Zone you are standing in") + to_chat(usr, "[span_blue("Blue")] = Connected zone to the zone you are standing in") + to_chat(usr, "[span_yellow("Yellow")] = A zone that is connected but not one adjacent to your connected zone") + to_chat(usr, "[span_red("Red")] = Not connected") usedZAScolors = 1 testZAScolors_zones += location.zone @@ -362,7 +362,7 @@ var/global/prevent_airgroup_regroup = 0 set category = "Mapping" set name = "Regroup All Airgroups Attempt" - to_chat(usr, "Proc disabled.") //Why not.. Delete the procs instead? + to_chat(usr, span_red("Proc disabled.")) //Why not.. Delete the procs instead? /*prevent_airgroup_regroup = 0 for(var/datum/air_group/AG in air_master.air_groups) @@ -373,7 +373,7 @@ var/global/prevent_airgroup_regroup = 0 set category = "Mapping" set name = "Kill pipe processing" - to_chat(usr, "Proc disabled.") + to_chat(usr, span_red("Proc disabled.")) /*pipe_processing_killed = !pipe_processing_killed if(pipe_processing_killed) @@ -385,7 +385,7 @@ var/global/prevent_airgroup_regroup = 0 set category = "Mapping" set name = "Kill air processing" - to_chat(usr, "Proc disabled.") + to_chat(usr, span_red("Proc disabled.")) /*air_processing_killed = !air_processing_killed if(air_processing_killed) @@ -399,7 +399,7 @@ var/global/say_disabled = 0 set category = "Mapping" set name = "Disable all communication verbs" - to_chat(usr, "Proc disabled.") + to_chat(usr, span_red("Proc disabled.")) /*say_disabled = !say_disabled if(say_disabled) @@ -414,7 +414,7 @@ var/global/movement_disabled_exception //This is the client that calls the proc, set category = "Mapping" set name = "Disable all movement" - to_chat(usr, "Proc disabled.") + to_chat(usr, span_red("Proc disabled.")) /*movement_disabled = !movement_disabled if(movement_disabled) diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm index 6a13ee98078..567a0d2d188 100644 --- a/code/modules/admin/verbs/modify_robot.dm +++ b/code/modules/admin/verbs/modify_robot.dm @@ -3,7 +3,7 @@ set name = "Modify Robot Module" set desc = "Allows to add or remove modules to/from robots." set category = "Admin" - if(!check_rights(R_ADMIN, R_FUN, R_VAREDIT)) + if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT)) return if(!istype(target) || !target.module) @@ -12,12 +12,16 @@ if(!target.module.modules) return - var/list/modification_options = list(MODIFIY_ROBOT_MODULE_ADD,MODIFIY_ROBOT_MODULE_REMOVE, MODIFIY_ROBOT_APPLY_UPGRADE, MODIFIY_ROBOT_RADIOC_ADD, MODIFIY_ROBOT_RADIOC_REMOVE, MODIFIY_ROBOT_COMP_ADD, MODIFIY_ROBOT_COMP_REMOVE, MODIFIY_ROBOT_RESET_MODULE) + var/list/modification_options = list(MODIFIY_ROBOT_MODULE_ADD,MODIFIY_ROBOT_MODULE_REMOVE, MODIFIY_ROBOT_APPLY_UPGRADE, MODIFIY_ROBOT_SUPP_ADD, MODIFIY_ROBOT_SUPP_REMOVE, MODIFIY_ROBOT_RADIOC_ADD, MODIFIY_ROBOT_RADIOC_REMOVE, MODIFIY_ROBOT_COMP_ADD, MODIFIY_ROBOT_COMP_REMOVE, MODIFIY_ROBOT_RESET_MODULE) while(TRUE) var/modification_choice = tgui_input_list(usr, "Select if you want to add or remove a module to/from [target]","Choice", modification_options) if(!modification_choice || modification_choice == "Cancel") - break + return + + if(!target.module || !target.module.modules) + to_chat(usr, "[target] was recently reset, you must wait until module selection has been completed before continuing modifying.") + continue log_and_message_admins("[key_name(src)] has used MODIFYROBOT ([modification_choice]) on [key_name(target)].") feedback_add_details("admin_verb","MODIFYROBOT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -105,7 +109,8 @@ if(MODIFIY_ROBOT_APPLY_UPGRADE) var/list/upgrades = list() for(var/datum/design/item/prosfab/robot_upgrade/upgrade) - upgrades[initial(upgrade.name)] = initial(upgrade.build_path) + if(!(target.has_upgrade(initial(upgrade.build_path)))) + upgrades[initial(upgrade.name)] = initial(upgrade.build_path) while(TRUE) var/selected_module_upgrade = tgui_input_list(usr, "Please select the module to remove", "Upgrades", upgrades) if(!selected_module_upgrade || selected_module_upgrade == "Cancel") @@ -114,9 +119,16 @@ if(tgui_alert(usr, "Are you sure that you want to install [selected_module_upgrade] and reset the robot's module?","Confirm",list("Yes","No"))=="No") continue var/new_upgrade = upgrades[capitalize(selected_module_upgrade)] - target.module.supported_upgrades += new_upgrade upgrades.Remove(selected_module_upgrade) var/obj/item/borg/upgrade/U = new new_upgrade(src) + if(selected_module_upgrade == "Rename Module") + var/obj/item/borg/upgrade/utility/rename/UN = U + var/new_name = sanitizeSafe(tgui_input_text(usr, "Enter new robot name", "Robot Reclassification", UN.heldname, MAX_NAME_LEN), MAX_NAME_LEN) + if(new_name) + UN.heldname = new_name + U = UN + if(istype(U, /obj/item/borg/upgrade/restricted)) + target.module.supported_upgrades |= new_upgrade if(U.action(target)) to_chat(usr, "You apply the [U] to [target]!") usr.drop_item() @@ -143,6 +155,30 @@ modkits.Remove(selected_ka_upgrade) M.install(kin, target) capacity = kin.get_remaining_mod_capacity() + if(MODIFIY_ROBOT_SUPP_ADD) + var/list/whitelisted_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade) + if(!(initial(upgrade.build_path) in target.module.supported_upgrades)) + whitelisted_upgrades[initial(upgrade.name)] = initial(upgrade.build_path) + while(TRUE) + var/selected_upgrade_type = tgui_input_list(usr, "Please select which upgrade you want this module to support", "Upgrades", whitelisted_upgrades) + if(!selected_upgrade_type || selected_upgrade_type == "Cancel") + break + var/upgrade_path = whitelisted_upgrades[capitalize(selected_upgrade_type)] + whitelisted_upgrades.Remove(selected_upgrade_type) + target.module.supported_upgrades |= upgrade_path + if(MODIFIY_ROBOT_SUPP_REMOVE) + var/list/whitelisted_upgrades = list() + for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade) + if((initial(upgrade.build_path) in target.module.supported_upgrades)) + whitelisted_upgrades[initial(upgrade.name)] = initial(upgrade.build_path) + while(TRUE) + var/selected_upgrade_type = tgui_input_list(usr, "Please select which upgrade you want this module to support", "Upgrades", whitelisted_upgrades) + if(!selected_upgrade_type || selected_upgrade_type == "Cancel") + break + var/upgrade_path = whitelisted_upgrades[capitalize(selected_upgrade_type)] + whitelisted_upgrades.Remove(selected_upgrade_type) + target.module.supported_upgrades -= upgrade_path if(MODIFIY_ROBOT_RADIOC_ADD) var/list/available_channels = radiochannels.Copy() for(var/has_channel in target.radio.channels) @@ -240,6 +276,6 @@ to_chat(usr, "You removed \"[C]\" from [target]") if(MODIFIY_ROBOT_RESET_MODULE) if(tgui_alert(usr, "Are you sure that you want to reset the entire module?","Confirm",list("Yes","No"))=="No") - return + continue target.module_reset() to_chat(usr, "You resetted [target]'s module selection.") diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index ffac68a6f98..4add0123f8a 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -3,7 +3,7 @@ set name = "Pray" if(say_disabled) //This is here to try to identify lag problems - to_chat(usr, "Speech is currently admin-disabled.") + to_chat(usr, span_red("Speech is currently admin-disabled.")) return var/raw_msg = sanitize(tgui_input_text(usr, "Prayers are sent to staff but do not open tickets or go to Discord. If you have a technical difficulty or an event/spice idea/hook - please ahelp instead. Thank you!", "Pray", null, MAX_MESSAGE_LEN)) @@ -13,11 +13,11 @@ if(raw_msg) client.handle_spam_prevention(MUTE_PRAY) if(usr.client.prefs.muted & MUTE_PRAY) - to_chat(usr, " You cannot pray (muted).") + to_chat(usr, span_red("You cannot pray (muted).")) return var/icon/cross = icon('icons/obj/storage.dmi',"bible") - var/msg = "\icon[cross][bicon(cross)] PRAY: [key_name(src, 1)] [ADMIN_QUE(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] ([admin_jump_link(src, src)]) [ADMIN_CA(src)] [ADMIN_SC(src)] [ADMIN_SMITE(src)]: [raw_msg]" + var/msg = "" + span_blue("\icon[cross][bicon(cross)] " + span_purple("PRAY: ") + "[key_name(src, 1)] [ADMIN_QUE(src)] [ADMIN_PP(src)] [ADMIN_VV(src)] [ADMIN_SM(src)] ([admin_jump_link(src, src)]) [ADMIN_CA(src)] [ADMIN_SC(src)] [ADMIN_SMITE(src)]: [raw_msg]") + "" for(var/client/C in GLOB.admins) if(R_ADMIN|R_EVENT & C.holder.rights) @@ -30,14 +30,14 @@ log_pray(raw_msg, src) /proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage) - msg = "[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]: [msg]" + msg = span_blue("" + span_orange("[uppertext(using_map.boss_short)]M[iamessage ? " IA" : ""]:") + "[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_CENTCOM_REPLY(Sender)]: [msg]") for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins if(R_ADMIN|R_EVENT & C.holder.rights) to_chat(C,msg) C << 'sound/machines/signal.ogg' /proc/Syndicate_announce(var/msg, var/mob/Sender) - msg = "ILLEGAL:[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_SYNDICATE_REPLY(Sender)]: [msg]" + msg = span_blue("" + span_crimson("ILLEGAL:") + "[key_name(Sender, 1)] [ADMIN_PP(Sender)] [ADMIN_VV(Sender)] [ADMIN_SM(Sender)] ([admin_jump_link(Sender)]) [ADMIN_CA(Sender)] [ADMIN_BSA(Sender)] [ADMIN_SYNDICATE_REPLY(Sender)]: [msg]") for(var/client/C in GLOB.admins) //VOREStation Edit - GLOB admins if(R_ADMIN|R_EVENT & C.holder.rights) to_chat(C,msg) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 2719ad6dbf2..64987e38c16 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -39,9 +39,9 @@ prisoner.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(prisoner), slot_w_uniform) prisoner.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(prisoner), slot_shoes) spawn(50) - to_chat(M, "You have been sent to the prison station!") + to_chat(M, span_red("You have been sent to the prison station!")) log_admin("[key_name(usr)] sent [key_name(M)] to the prison station.") - message_admins("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station.", 1) + message_admins(span_blue("[key_name_admin(usr)] sent [key_name_admin(M)] to the prison station."), 1) feedback_add_details("admin_verb","PRISON") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //Allows staff to determine who the newer players are. @@ -123,7 +123,7 @@ to_world("[msg]") log_admin("GlobalNarrate: [key_name(usr)] : [msg]") - message_admins(" GlobalNarrate: [key_name_admin(usr)] : [msg]
    ", 1) + message_admins(span_blue(" GlobalNarrate: [key_name_admin(usr)] : [msg]
    "), 1) feedback_add_details("admin_verb","GLN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(var/mob/M) // Targetted narrate -- TLE @@ -161,7 +161,7 @@ return M.status_flags ^= GODMODE - to_chat(usr, " Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]") + to_chat(usr, span_blue("Toggled [(M.status_flags & GODMODE) ? "ON" : "OFF"]")) log_admin("[key_name(usr)] has toggled [key_name(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]") var/msg = "[key_name_admin(usr)] has toggled [ADMIN_LOOKUPFLW(M)]'s nodamage to [(M.status_flags & GODMODE) ? "On" : "Off"]" @@ -178,12 +178,12 @@ if(!usr || !usr.client) return if(!usr.client.holder) - to_chat(usr, "Error: cmd_admin_mute: You don't have permission to do this.") + to_chat(usr, span_red("Error: cmd_admin_mute: You don't have permission to do this.")) return if(!M.client) - to_chat(usr, "Error: cmd_admin_mute: This mob doesn't have a client tied to it.") + to_chat(usr, span_red("Error: cmd_admin_mute: This mob doesn't have a client tied to it.")) if(M.client.holder) - to_chat(usr, "Error: cmd_admin_mute: You cannot mute an admin/mod.") + to_chat(usr, span_red("Error: cmd_admin_mute: You cannot mute an admin/mod.")) if(!M.client) return if(M.client.holder) @@ -324,18 +324,18 @@ Ccomp's first proc. if(g.antagHUD) g.antagHUD = 0 // Disable it on those that have it enabled g.has_enabled_antagHUD = 2 // We'll allow them to respawn - to_chat(g, "The Administrator has disabled AntagHUD ") + to_chat(g, span_red("The Administrator has disabled AntagHUD ")) config.antag_hud_allowed = 0 - to_chat(src, "AntagHUD usage has been disabled") + to_chat(src, span_red("AntagHUD usage has been disabled")) action = "disabled" else for(var/mob/observer/dead/g in get_ghosts()) if(!g.client.holder) // Add the verb back for all non-admin ghosts g.verbs += /mob/observer/dead/verb/toggle_antagHUD - to_chat(g, "The Administrator has enabled AntagHUD ") // Notify all observers they can now use AntagHUD + to_chat(g, span_blue("The Administrator has enabled AntagHUD ")) // Notify all observers they can now use AntagHUD config.antag_hud_allowed = 1 action = "enabled" - to_chat(src, "AntagHUD usage has been enabled") + to_chat(src, span_blue("AntagHUD usage has been enabled")) log_admin("[key_name(usr)] has [action] antagHUD usage for observers") @@ -354,19 +354,19 @@ Ccomp's first proc. var/action="" if(config.antag_hud_restricted) for(var/mob/observer/dead/g in get_ghosts()) - to_chat(g, "The administrator has lifted restrictions on joining the round if you use AntagHUD") + to_chat(g, span_blue("The administrator has lifted restrictions on joining the round if you use AntagHUD")) action = "lifted restrictions" config.antag_hud_restricted = 0 - to_chat(src, "AntagHUD restrictions have been lifted") + to_chat(src, span_blue("AntagHUD restrictions have been lifted")) else for(var/mob/observer/dead/g in get_ghosts()) - to_chat(g, "The administrator has placed restrictions on joining the round if you use AntagHUD") - to_chat(g, "Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions ") + to_chat(g, span_red("The administrator has placed restrictions on joining the round if you use AntagHUD")) + to_chat(g, span_red("Your AntagHUD has been disabled, you may choose to re-enabled it but will be under restrictions ")) g.antagHUD = 0 g.has_enabled_antagHUD = 0 action = "placed restrictions" config.antag_hud_restricted = 1 - to_chat(src, "AntagHUD restrictions have been enabled") + to_chat(src, span_red("AntagHUD restrictions have been enabled")) log_admin("[key_name(usr)] has [action] on joining the round if they use AntagHUD") message_admins("Admin [key_name_admin(usr)] has [action] on joining the round if they use AntagHUD", 1) @@ -605,7 +605,7 @@ Traitors and the like can also be revived with the previous role mostly intact. else M.add_ion_law(input) for(var/mob/living/silicon/ai/O in mob_list) - to_chat(O,input + "... LAWS UPDATED!") + to_chat(O,input + span_red("... LAWS UPDATED!")) O.show_laws() log_admin("Admin [key_name(usr)] has added a new AI law - [input]") @@ -660,7 +660,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Yes") command_announcement.Announce(input, customname, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1); if("No") - to_world("New [using_map.company_name] Update available at all communication consoles.") + to_world(span_red("New [using_map.company_name] Update available at all communication consoles.")) world << sound('sound/AI/commandreport.ogg') log_admin("[key_name(src)] has created a command report: [input]") @@ -778,7 +778,7 @@ Traitors and the like can also be revived with the previous role mostly intact. mob.gib() log_admin("[key_name(usr)] used gibself.") - message_admins("[key_name_admin(usr)] used gibself.", 1) + message_admins(span_blue("[key_name_admin(usr)] used gibself."), 1) feedback_add_details("admin_verb","GIBS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /* /client/proc/cmd_manual_ban() @@ -935,7 +935,7 @@ Traitors and the like can also be revived with the previous role mostly intact. feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") - message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.", 1) + message_admins(span_blue("[key_name_admin(usr)] admin-called the emergency shuttle."), 1) return /client/proc/admin_cancel_shuttle() @@ -952,7 +952,7 @@ Traitors and the like can also be revived with the previous role mostly intact. emergency_shuttle.recall() feedback_add_details("admin_verb","CCSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-recalled the emergency shuttle.") - message_admins("[key_name_admin(usr)] admin-recalled the emergency shuttle.", 1) + message_admins(span_blue("[key_name_admin(usr)] admin-recalled the emergency shuttle."), 1) return @@ -974,7 +974,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Attack Log" - to_chat(usr, "Attack Log for [mob]") + to_chat(usr, span_red("Attack Log for [mob]")) for(var/t in M.attack_log) to_chat(usr,t) feedback_add_details("admin_verb","ATTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -1006,7 +1006,7 @@ Traitors and the like can also be revived with the previous role mostly intact. message_admins("Admin [key_name_admin(usr)] has forced the players to have random appearances.", 1) if(notifyplayers == "Yes") - to_world("Admin [usr.key] has forced the players to have completely random identities!") + to_world(span_blue("Admin [usr.key] has forced the players to have completely random identities!")) to_chat(usr, "Remember: you can always disable the randomness by using the verb again, assuming the round hasn't started yet.") @@ -1161,4 +1161,4 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Polite") new /obj/structure/drop_pod/polite(get_turf(usr), L, autoopen == "Yes" ? TRUE : FALSE) - feedback_add_details("admin_verb","DPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file + feedback_add_details("admin_verb","DPD") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm index d19d67916a0..6a1e90aed1e 100644 --- a/code/modules/admin/verbs/randomverbs_vr.dm +++ b/code/modules/admin/verbs/randomverbs_vr.dm @@ -2,7 +2,7 @@ set category = "Special Verbs" set name = "Spawn Character As Mob" set desc = "Spawn a specified ckey as a chosen mob." - + if(!holder) return @@ -95,7 +95,7 @@ if(M.z == pos_z) to_chat(M, msg) log_admin("ZNarrate: [key_name(usr)] : [msg]") - message_admins(" ZNarrate: [key_name_admin(usr)] : [msg]
    ", 1) + message_admins(span_blue(" ZNarrate: [key_name_admin(usr)] : [msg]
    "), 1) feedback_add_details("admin_verb","GLNA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/toggle_vantag_hud(var/mob/target as mob) @@ -107,10 +107,10 @@ target.vantag_hud = FALSE target.recalculate_vis() to_chat(src, "You removed the event HUD from [key_name(target)].") - to_chat(target, "You no longer have the event HUD.") + to_chat(target, "You no longer have the event HUD.") else target.vantag_hud = TRUE target.recalculate_vis() to_chat(src, "You gave the event HUD to [key_name(target)].") - to_chat(target, "You now have the event HUD. Icons will appear next to characters indicating if they prefer to be killed(red crosshairs), devoured(belly), or kidnapped(blue crosshairs) by event characters.") + to_chat(target, "You now have the event HUD. Icons will appear next to characters indicating if they prefer to be killed(red crosshairs), devoured(belly), or kidnapped(blue crosshairs) by event characters.") feedback_add_details("admin_verb","GREHud") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/resize.dm b/code/modules/admin/verbs/resize.dm index bc65d31b66a..d8bc5be57c2 100644 --- a/code/modules/admin/verbs/resize.dm +++ b/code/modules/admin/verbs/resize.dm @@ -2,7 +2,7 @@ set name = "Resize" set desc = "Resizes any living mob without any restrictions on size." set category = "Fun" - if(!check_rights(R_ADMIN, R_FUN, R_VAREDIT)) + if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT)) return var/size_multiplier = tgui_input_number(usr, "Input size multiplier.", "Resize", 1) diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 7724062a6ed..85e13ce288d 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -11,11 +11,11 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future return if(!ticker) - to_chat(usr, "The game hasn't started yet!") + to_chat(usr, span_red("The game hasn't started yet!")) return if(world.time < 6000) - to_chat(usr, "There are [(6000-world.time)/10] seconds remaining before it may be called.") + to_chat(usr, span_red("There are [(6000-world.time)/10] seconds remaining before it may be called.")) return var/datum/antagonist/deathsquad/team @@ -33,7 +33,7 @@ var/const/commandos_possible = 6 //if more Commandos are needed in the future return if(team.deployed) - to_chat(usr, "Someone is already sending a team.") + to_chat(usr, span_red("Someone is already sending a team.")) return if(tgui_alert(usr, "Do you want to send in a strike team? Once enabled, this is irreversible.","Strike Team",list("Yes","No"))!="Yes") diff --git a/code/modules/admin/verbs/tripAI.dm b/code/modules/admin/verbs/tripAI.dm index eaf6dfa49f5..9298d1111ce 100644 --- a/code/modules/admin/verbs/tripAI.dm +++ b/code/modules/admin/verbs/tripAI.dm @@ -14,9 +14,9 @@ if(ticker.triai) ticker.triai = 0 to_chat(usr, "Only one AI will be spawned at round start.") - message_admins("[key_name_admin(usr)] has toggled off triple AIs at round start.", 1) + message_admins(span_blue("[key_name_admin(usr)] has toggled off triple AIs at round start."), 1) else ticker.triai = 1 to_chat(usr, "There will be an AI Triumvirate at round start.") - message_admins("[key_name_admin(usr)] has toggled on triple AIs at round start.", 1) + message_admins(span_blue("[key_name_admin(usr)] has toggled on triple AIs at round start."), 1) return diff --git a/code/modules/artifice/cursedform.dm b/code/modules/artifice/cursedform.dm index 43acac8bf3d..ee994924c8e 100644 --- a/code/modules/artifice/cursedform.dm +++ b/code/modules/artifice/cursedform.dm @@ -31,7 +31,7 @@ qdel(src) else - to_chat(user,"You must hold \the [P] steady to burn \the [src].") + to_chat(user, span_red("You must hold \the [P] steady to burn \the [src].")) if(isliving(user)) var/mob/living/L = user diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index d0774dc2a57..ed4e184543d 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -32,20 +32,20 @@ /obj/item/weapon/deadringer/attack_self(var/mob/living/user as mob) var/mob/living/H = src.loc if (!istype(H, /mob/living/carbon/human)) - to_chat(H,"You have no clue what to do with this thing.") + to_chat(H, span_blue("You have no clue what to do with this thing.")) return if(!activated) if(timer == 0) - to_chat(H, "You press a small button on [src]'s side. It starts to hum quietly.") + to_chat(H, span_blue("You press a small button on [src]'s side. It starts to hum quietly.")) bruteloss_prev = H.getBruteLoss() fireloss_prev = H.getFireLoss() activated = 1 return else - to_chat(H,"You press a small button on [src]'s side. It buzzes a little.") + to_chat(H, span_blue("You press a small button on [src]'s side. It buzzes a little.")) return if(activated) - to_chat(H,"You press a small button on [src]'s side. It stops humming.") + to_chat(H, span_blue("You press a small button on [src]'s side. It stops humming.")) activated = 0 return @@ -58,9 +58,9 @@ deathprevent() activated = 0 if(watchowner.isSynthetic()) - to_chat(watchowner, "You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!") + to_chat(watchowner, span_blue("You fade into nothingness! [src]'s screen blinks, being unable to copy your synthetic body!")) else - to_chat(watchowner, "You fade into nothingness, leaving behind a fake body!") + to_chat(watchowner, span_blue("You fade into nothingness, leaving behind a fake body!")) icon_state = "deadringer_cd" timer = 50 return diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index 31f4ca52443..dbd4ffc8599 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -41,7 +41,7 @@ H.updatehealth() else if(ismouse(target)) var/mob/living/simple_mob/animal/passive/mouse/M = target - visible_message("SPLAT!") + visible_message(span_red("SPLAT!")) M.splat() playsound(target, 'sound/effects/snap.ogg', 50, 1) layer = MOB_LAYER - 0.2 @@ -120,4 +120,4 @@ return layer = HIDING_LAYER - to_chat(usr, "You hide [src].") \ No newline at end of file + to_chat(usr, "You hide [src].") diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 6474e008b77..156002b3c05 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -44,12 +44,12 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) update_icon() wait = world.time + config.gateway_delay //+ thirty minutes default - + if(GLOB.gateway_away) awaygate = GLOB.gateway_away else awaygate = locate(/obj/machinery/gateway/centeraway) - + . = ..() density = TRUE //VOREStation Add @@ -167,7 +167,7 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) if(dest) M.forceMove(dest.loc) M.set_dir(SOUTH) - //VOREStation Addition Start: Mcguffin time! + //VOREStation Addition Start: Mcguffin time! if(ishuman(M)) var/mob/living/carbon/human/H = M if(H.client) @@ -177,7 +177,7 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) //VOREStation Addition Start: Abduction! if(istype(M, /mob/living) && dest.abductor) var/mob/living/L = M - if(L.nutrition > 500) + if(L.nutrition > 500) L.nutrition = 500 //If the aim is to negate people overpreparing, then they shouldn't be able to stuff themselves full of food either. //Situations to get the mob out of if(L.buckled) @@ -225,7 +225,7 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) /obj/machinery/gateway/centerstation/attackby(obj/item/device/W as obj, mob/user as mob) if(istype(W,/obj/item/device/multitool)) - if(!awaygate) + if(!awaygate) if(GLOB.gateway_away) awaygate = GLOB.gateway_away else @@ -235,7 +235,7 @@ GLOBAL_DATUM(gateway_station, /obj/machinery/gateway/centerstation) return to_chat(user, "Startup programming successful!: A destination in another point of space and time has been detected.") else - to_chat(user, "The gate is already calibrated, there is no work for you to do here.") + to_chat(user, span_black("The gate is already calibrated, there is no work for you to do here.")) return /////////////////////////////////////Away//////////////////////// @@ -257,9 +257,9 @@ GLOBAL_DATUM(gateway_away, /obj/machinery/gateway/centeraway) warning("[src] at [x],[y],[z] appears to be an additional away-gateway") else GLOB.gateway_away = src - + update_icon() - + if(GLOB.gateway_station) stationgate = GLOB.gateway_station else @@ -338,7 +338,7 @@ GLOBAL_DATUM(gateway_away, /obj/machinery/gateway/centeraway) if(istype(M, /mob/living/carbon)) for(var/obj/item/weapon/implant/exile/E in M)//Checking that there is an exile implant in the contents if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket - to_chat(M, "The station gate has detected your exile implant and is blocking your entry.") + to_chat(M, span_black("The station gate has detected your exile implant and is blocking your entry.")) return M.forceMove(get_step(stationgate.loc, SOUTH)) M.set_dir(SOUTH) @@ -349,7 +349,7 @@ GLOBAL_DATUM(gateway_away, /obj/machinery/gateway/centeraway) /obj/machinery/gateway/centeraway/attackby(obj/item/device/W as obj, mob/user as mob) if(istype(W,/obj/item/device/multitool)) if(calibrated && stationgate) - to_chat(user, "The gate is already calibrated, there is no work for you to do here.") + to_chat(user, span_black("The gate is already calibrated, there is no work for you to do here.")) return else // VOREStation Add @@ -362,6 +362,6 @@ GLOBAL_DATUM(gateway_away, /obj/machinery/gateway/centeraway) return // VOREStation Add End else - to_chat(user, "Recalibration successful!: This gate's systems have been fine tuned. Travel to this gate will now be on target.") + to_chat(user, span_blue("Recalibration successful!:") + span_black(" This gate's systems have been fine tuned. Travel to this gate will now be on target.")) calibrated = 1 - return \ No newline at end of file + return diff --git a/code/modules/awaymissions/gateway_vr.dm b/code/modules/awaymissions/gateway_vr.dm index 86ff8e5e135..25a57ce7d7c 100644 --- a/code/modules/awaymissions/gateway_vr.dm +++ b/code/modules/awaymissions/gateway_vr.dm @@ -15,7 +15,7 @@ return if(istype(W,mcguffin_type) && !calibrated) - to_chat(user, "As the device nears the gateway, mechanical clunks and whirrs can be heard.
    Configuration successful!
    This gate's systems have been fine tuned. Travel to this gate will now be on target.
    ") + to_chat(user, "As the device nears the gateway, mechanical clunks and whirrs can be heard.
    [span_blue("Configuration successful! ")]
    This gate's systems have been fine tuned. Travel to this gate will now be on target.
    ") calibrated = 1 return else @@ -39,7 +39,7 @@ /obj/machinery/gateway/centeraway/proc/entrydetect() return - + /obj/machinery/gateway/centeraway/mcguffin/entrydetect() if(key) return @@ -47,9 +47,9 @@ var/list/spawners = list() for(var/obj/effect/landmark/mcguffin_spawner/sp in world) spawners += sp - + var/obj/effect/landmark/mcguffin_spawner/the_cool_one = pick(spawners) - + var/atom/destination = get_turf(the_cool_one) var/obj/structure/closet/CL = locate() in destination if(CL) @@ -76,4 +76,4 @@ //No, you can't digest the key to leave the gateway. /obj/item/device/mcguffin/digest_act(var/atom/movable/item_storage = null) - return FALSE \ No newline at end of file + return FALSE diff --git a/code/modules/awaymissions/zlevel.dm b/code/modules/awaymissions/zlevel.dm index fea781da8bf..8a959a6501c 100644 --- a/code/modules/awaymissions/zlevel.dm +++ b/code/modules/awaymissions/zlevel.dm @@ -3,7 +3,7 @@ return var/list/potentialRandomZlevels = list() - admin_notice(" Searching for away missions...", R_DEBUG) + admin_notice(span_red(" Searching for away missions..."), R_DEBUG) var/list/Lines = file2list("maps/RandomZLevels/fileList.txt") if(!Lines.len) return for (var/t in Lines) @@ -35,7 +35,7 @@ if(potentialRandomZlevels.len) - admin_notice("Loading away mission...", R_DEBUG) + admin_notice(span_red("Loading away mission..."), R_DEBUG) var/map = pick(potentialRandomZlevels) to_world_log("Away mission picked: [map]") //VOREStation Add for debugging @@ -50,10 +50,10 @@ continue awaydestinations.Add(L) */ //VOREStation Removal End - admin_notice("Away mission loaded.", R_DEBUG) + admin_notice(span_red("Away mission loaded."), R_DEBUG) else - admin_notice("No away missions found.", R_DEBUG) + admin_notice(span_red("No away missions found."), R_DEBUG) return //VOREStation Add - This landmark type so it's not so ghetto. diff --git a/code/modules/casino/casino_prize_vendor.dm b/code/modules/casino/casino_prize_vendor.dm index 115e51ed487..18ffd62b7d1 100644 --- a/code/modules/casino/casino_prize_vendor.dm +++ b/code/modules/casino/casino_prize_vendor.dm @@ -344,7 +344,7 @@ return for(var/mob/O in hearers(src, null)) - O.show_message("\The [src] beeps, \"[message]\"",2) + O.show_message("\The [src] beeps, \"[message]\"",2) return /obj/machinery/casino_prize_dispenser/process() //Might not need this, but just to be safe for now diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index 1faa36fe8c3..ab978f6fe91 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -144,7 +144,7 @@ //This stops files larger than UPLOAD_LIMIT being sent from client to server via input(), client.Import() etc. /client/AllowUpload(filename, filelength) if(filelength > UPLOAD_LIMIT) - to_chat(src, "Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.") + to_chat(src, span_red("Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.")) return 0 /* //Don't need this at the moment. But it's here if it's needed later. //Helps prevent multiple files being uploaded at once. Or right after eachother. @@ -174,7 +174,7 @@ //Only show this if they are put into a new_player mob. Otherwise, "what title screen?" if(isnewplayer(src.mob)) - to_chat(src, "If the title screen is black, resources are still downloading. Please be patient until the title screen appears.") + to_chat(src, span_red("If the title screen is black, resources are still downloading. Please be patient until the title screen appears.")) GLOB.clients += src GLOB.directory[ckey] = src diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm index fd1ebc2ebce..437337f3264 100644 --- a/code/modules/client/preference_setup/global/setting_datums.dm +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -330,6 +330,12 @@ var/list/_client_preferences_by_type enabled_description = "On" disabled_description = "Off" +/datum/client_preference/vore_health_bars + description = "Vore Health Bars" + key = "VORE_HEALTH_BARS" + enabled_description = "Enabled" + disabled_description = "Disabled" + /datum/client_preference/runechat_mob description = "Runechat (Mobs)" key = "RUNECHAT_MOB" diff --git a/code/modules/client/preferences_toggle_procs.dm b/code/modules/client/preferences_toggle_procs.dm index 8ce75698ba6..fb5f3d70c5e 100644 --- a/code/modules/client/preferences_toggle_procs.dm +++ b/code/modules/client/preferences_toggle_procs.dm @@ -489,6 +489,19 @@ feedback_add_details("admin_verb","TSubtleSounds") +/client/verb/toggle_vore_health_bars() + set name = "Toggle Vore Health Bars" + set category = "Preferences" + set desc = "Toggle the display of vore related health bars" + + var/pref_path = /datum/client_preference/vore_health_bars + toggle_preference(pref_path) + SScharacter_setup.queue_preferences_save(prefs) + + to_chat(src, "Vore related health bars - [(is_preference_enabled(/datum/client_preference/vore_health_bars)) ? "Enabled" : "Disabled"]") + + feedback_add_details("admin_verb","TVoreHealthBars") + // Not attached to a pref datum because those are strict binary toggles /client/verb/toggle_examine_mode() set name = "Toggle Examine Mode" diff --git a/code/modules/client/verbs/who.dm b/code/modules/client/verbs/who.dm index a9e4c07f801..b00d2bb8965 100644 --- a/code/modules/client/verbs/who.dm +++ b/code/modules/client/verbs/who.dm @@ -16,29 +16,29 @@ entry += " - Playing as [C.mob.real_name]" switch(C.mob.stat) if(UNCONSCIOUS) - entry += " - Unconscious" + entry += " - [span_darkgray("Unconscious")]" if(DEAD) if(isobserver(C.mob)) var/mob/observer/dead/O = C.mob if(O.started_as_observer) - entry += " - Observing" + entry += " - [span_gray("Observing")]" else - entry += " - DEAD" + entry += " - [span_black("DEAD")]" else - entry += " - DEAD" + entry += " - [span_black("DEAD")]" if(C.player_age != initial(C.player_age) && isnum(C.player_age)) // database is on var/age = C.player_age switch(age) if(0 to 1) - age = "[age] days old" + age = span_red("[age] days old") if(1 to 10) - age = "[age] days old" + age = span_orange("[age] days old") else entry += " - [age] days old" if(is_special_character(C.mob)) - entry += " - Antagonist" + entry += " - [span_red("Antagonist")]" if(C.is_afk()) var/seconds = C.last_activity_seconds() diff --git a/code/modules/clothing/clothing_vr.dm b/code/modules/clothing/clothing_vr.dm index 381bc32c396..6109f89e70c 100644 --- a/code/modules/clothing/clothing_vr.dm +++ b/code/modules/clothing/clothing_vr.dm @@ -11,10 +11,10 @@ /obj/item/clothing/shoes/New() inside_emotes = list( - "You feel weightless for a moment as \the [name] moves upwards.", - "\The [name] are a ride you've got no choice but to participate in as the wearer moves.", - "The wearer of \the [name] moves, pressing down on you.", - "More motion while \the [name] move, feet pressing down against you." + span_red("You feel weightless for a moment as \the [name] moves upwards."), + span_red("\The [name] are a ride you've got no choice but to participate in as the wearer moves."), + span_red("The wearer of \the [name] moves, pressing down on you."), + span_red("More motion while \the [name] move, feet pressing down against you.") ) ..() @@ -116,20 +116,20 @@ if(ishuman(src.loc)) //Is this on a person? var/mob/living/carbon/human/H = src.loc if(istype(user,/mob/living/voice)) //Is this a possessed item? Spooky. It can move on it's own! - to_chat(H, "The [src] shifts about, almost as if squirming!") - to_chat(user, "You cause the [src] to shift against [H]'s form! Well, what little you can get to, given your current state!") + to_chat(H, span_red("The [src] shifts about, almost as if squirming!")) + to_chat(user, span_red("You cause the [src] to shift against [H]'s form! Well, what little you can get to, given your current state!")) else if(H.shoes == src) - to_chat(H, "[user]'s tiny body presses against you in \the [src], squirming!") - to_chat(user, "Your body presses out against [H]'s form! Well, what little you can get to!") + to_chat(H, span_red("[user]'s tiny body presses against you in \the [src], squirming!")) + to_chat(user, span_red("Your body presses out against [H]'s form! Well, what little you can get to!")) else - to_chat(H, "[user]'s form shifts around in the \the [src], squirming!") - to_chat(user, "You move around inside the [src], to no avail.") + to_chat(H, span_red("[user]'s form shifts around in the \the [src], squirming!")) + to_chat(user, span_red("You move around inside the [src], to no avail.")) else if(istype(user,/mob/living/voice)) //Possessed! - src.visible_message("The [src] shifts about!") - to_chat(user, "You cause the [src] to shift about!") + src.visible_message(span_red("The [src] shifts about!")) + to_chat(user, span_red("You cause the [src] to shift about!")) else - src.visible_message("\The [src] moves a little!") - to_chat(user, "You throw yourself against the inside of \the [src]!") + src.visible_message(span_red("\The [src] moves a little!")) + to_chat(user, span_red("You throw yourself against the inside of \the [src]!")) //Mask /obj/item/clothing/mask diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index f301199830d..e984f606cbb 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -537,7 +537,7 @@ BLIND // can't see anything /obj/item/clothing/glasses/thermal/emp_act(severity) if(istype(src.loc, /mob/living/carbon/human)) var/mob/living/carbon/human/M = src.loc - to_chat(M, "The Optical Thermal Scanner overloads and blinds you!") + to_chat(M, span_red("The Optical Thermal Scanner overloads and blinds you!")) if(M.glasses == src) M.Blind(3) M.eye_blurry = 5 @@ -624,4 +624,3 @@ BLIND // can't see anything to_chat(usr, "You push \the [src] up from in front of your eyes.") update_clothing_icon() usr.update_action_buttons() - diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index 4b12f8382ee..8737aa71a13 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -155,11 +155,11 @@ if(cooldown < world.time - 35) // A cooldown, to stop people being jerks if(!safety) message = "FUCK YOUR CUNT YOU SHIT EATING COCKSUCKER MAN EAT A DONG FUCKING ASS RAMMING SHIT FUCK EAT PENISES IN YOUR FUCK FACE AND SHIT OUT ABORTIONS OF FUCK AND DO SHIT IN YOUR ASS YOU COCK FUCK SHIT MONKEY FUCK ASS WANKER FROM THE DEPTHS OF SHIT." - usr.visible_message("[usr]'s Compli-o-Nator: [message]") + usr.visible_message("[usr]'s Compli-o-Nator: [span_red("[message]")]") playsound(src, 'sound/voice/binsult.ogg', 50, 0, 4) //Future sound channel = something like SFX cooldown = world.time return - usr.visible_message("[usr]'s Compli-o-Nator: [message]") + usr.visible_message("[usr]'s Compli-o-Nator: [span_red("[message]")]") playsound(src, "sound/voice/complionator/[key].ogg", 50, 0, 4) //future sound channel = something like SFX - cooldown = world.time \ No newline at end of file + cooldown = world.time diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index c12caa2e02b..7e74ee57f83 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -206,7 +206,7 @@ var/global/list/breach_burn_descriptors = list( else if(W.has_tool_quality(TOOL_WELDER)) if(istype(src.loc,/mob/living)) - to_chat(user, "How do you intend to patch a hardsuit while someone is wearing it?") + to_chat(user, span_red("How do you intend to patch a hardsuit while someone is wearing it?")) return if (!damage || ! brute_damage) @@ -215,7 +215,7 @@ var/global/list/breach_burn_descriptors = list( var/obj/item/weapon/weldingtool/WT = W.get_welder() if(!WT.remove_fuel(5)) - to_chat(user, "You need more welding fuel to repair this suit.") + to_chat(user, span_red("You need more welding fuel to repair this suit.")) return repair_breaches(BRUTE, 3, user) @@ -227,4 +227,4 @@ var/global/list/breach_burn_descriptors = list( . = ..() if(can_breach && breaches?.len) for(var/datum/breach/B in breaches) - . += "It has \a [B.descriptor]." + . += span_red("It has \a [B.descriptor].") diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 5d92408e560..4db4e7146e7 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -54,7 +54,7 @@ to_chat(user, "Another grenade of that type will not fit into the module.") return 0 - to_chat(user, "You slot \the [input_device] into the suit module.") + to_chat(user, span_blue("You slot \the [input_device] into the suit module.")) user.drop_from_inventory(input_device) qdel(input_device) accepted_item.charges++ @@ -256,7 +256,7 @@ else var/obj/item/new_weapon = new fabrication_type() new_weapon.forceMove(H) - to_chat(H, "You quickly fabricate \a [new_weapon].") + to_chat(H, span_blue("You quickly fabricate \a [new_weapon].")) H.put_in_hands(new_weapon) return 1 diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index fbf08479f49..21dad8e8c21 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -208,8 +208,8 @@ user.drop_from_inventory(ai) ai.forceMove(src) ai_card = ai - to_chat(ai_mob, "You have been transferred to \the [holder]'s [src].") - to_chat(user, "You load [ai_mob] into \the [holder]'s [src].") + to_chat(ai_mob, span_blue("You have been transferred to \the [holder]'s [src].")) + to_chat(user, span_blue("You load [ai_mob] into \the [holder]'s [src].")) integrated_ai = ai_mob @@ -261,7 +261,7 @@ var/obj/item/weapon/disk/tech_disk/disk = input_device if(disk.stored) if(load_data(disk.stored)) - to_chat(user, "Download successful; disk erased.") + to_chat(user, span_blue"Download successful; disk erased.")) disk.stored = null else to_chat(user, "The disk is corrupt. It is useless to you.") @@ -287,7 +287,7 @@ else // Maybe consider a way to drop all your data into a target repo in the future. if(load_data(incoming_files.known_tech)) - to_chat(user, "Download successful; local and remote repositories synchronized.") + to_chat(user, span_blue("Download successful; local and remote repositories synchronized.")) else to_chat(user, "Scan complete. There is nothing useful stored on this terminal.") return 1 @@ -466,10 +466,10 @@ if(!interfaced_with) if(M) - to_chat(M, "Total power drained: [round(total_power_drained*CELLRATE)] cell units.") + to_chat(M, span_blue("Total power drained: [round(total_power_drained*CELLRATE)] cell units.")) else if(M) - to_chat(M, "Total power drained from [interfaced_with]: [round(total_power_drained*CELLRATE)] cell units.") + to_chat(M, span_blue("Total power drained from [interfaced_with]: [round(total_power_drained*CELLRATE)] cell units.")) interfaced_with.drain_power(0,1,0) // Damage the victim. drain_loc = null diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 48752e3b6f2..89802134804 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -37,7 +37,7 @@ var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "You are now nearly invisible to normal detection.") + to_chat(H, span_blue("You are now nearly invisible to normal detection.")) H.alpha = 5 anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null) diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/ai_container.dm b/code/modules/clothing/spacesuits/rig/modules/specific/ai_container.dm index cdc86a0acfd..d3d62089111 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/ai_container.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/ai_container.dm @@ -200,8 +200,8 @@ user.drop_from_inventory(ai) ai.forceMove(src) ai_card = ai - to_chat(ai_mob, "You have been transferred to \the [holder]'s [src].") - to_chat(user, "You load [ai_mob] into \the [holder]'s [src].") + to_chat(ai_mob, span_blue("You have been transferred to \the [holder]'s [src].")) + to_chat(user, span_blue("You load [ai_mob] into \the [holder]'s [src].")) integrated_ai = ai_mob diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/chem_dispenser.dm b/code/modules/clothing/spacesuits/rig/modules/specific/chem_dispenser.dm index e8d6416e9a1..7e1d40858b9 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/chem_dispenser.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/chem_dispenser.dm @@ -71,7 +71,7 @@ break if(total_transferred) - to_chat(user, "You transfer [total_transferred] units into the suit reservoir.") + to_chat(user, span_blue("You transfer [total_transferred] units into the suit reservoir.")) else to_chat(user, "None of the reagents seem suitable.") return 1 diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/cleaner_launcher.dm b/code/modules/clothing/spacesuits/rig/modules/specific/cleaner_launcher.dm index 998fc3d46a1..46acec15988 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/cleaner_launcher.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/cleaner_launcher.dm @@ -34,7 +34,7 @@ to_chat(user, "Another grenade of that type will not fit into the module.") return 0 - to_chat(user, "You slot \the [input_device] into the suit module.") + to_chat(user, span_blue("You slot \the [input_device] into the suit module.")) user.drop_from_inventory(input_device) qdel(input_device) accepted_item.charges++ diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm b/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm index c63f1c2fbd4..2d27dd2ddb2 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/cloak.dm @@ -29,7 +29,7 @@ var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "You are now nearly invisible to normal detection.") + to_chat(H, span_blue("You are now nearly invisible to normal detection.")) H.alpha = 5 anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null) @@ -50,4 +50,4 @@ H.alpha = initial(H.alpha) H.visible_message("[H.name] appears from thin air!") - playsound(H, 'sound/effects/stealthoff.ogg', 75, 1) \ No newline at end of file + playsound(H, 'sound/effects/stealthoff.ogg', 75, 1) diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/datajack.dm b/code/modules/clothing/spacesuits/rig/modules/specific/datajack.dm index be34426447d..d863fa06768 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/datajack.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/datajack.dm @@ -36,7 +36,7 @@ var/obj/item/weapon/disk/tech_disk/disk = input_device if(disk.stored) if(load_data(disk.stored)) - to_chat(user, "Download successful; disk erased.") + to_chat(user, span_blue("Download successful; disk erased.")) disk.stored = null else to_chat(user, "The disk is corrupt. It is useless to you.") @@ -58,7 +58,7 @@ else // Maybe consider a way to drop all your data into a target repo in the future. if(load_data(incoming_files.known_tech)) - to_chat(user, "Download successful; local and remote repositories synchronized.") + to_chat(user, span_blue("Download successful; local and remote repositories synchronized.")) else to_chat(user, "Scan complete. There is nothing useful stored on this terminal.") return 1 @@ -83,4 +83,4 @@ if(!data_found) stored_research += incoming_data return 1 - return 0 \ No newline at end of file + return 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/grenade_launcher.dm b/code/modules/clothing/spacesuits/rig/modules/specific/grenade_launcher.dm index 9252b062bd6..0ae4a461a30 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/grenade_launcher.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/grenade_launcher.dm @@ -36,7 +36,7 @@ to_chat(user, "Another grenade of that type will not fit into the module.") return 0 - to_chat(user, "You slot \the [input_device] into the suit module.") + to_chat(user, span_blue("You slot \the [input_device] into the suit module.")) user.drop_from_inventory(input_device) qdel(input_device) accepted_item.charges++ diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/inhand_fabricator.dm b/code/modules/clothing/spacesuits/rig/modules/specific/inhand_fabricator.dm index 8e71cf27458..3ea3c09ea82 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/inhand_fabricator.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/inhand_fabricator.dm @@ -34,7 +34,7 @@ else var/obj/item/new_weapon = new fabrication_type() new_weapon.forceMove(H) - to_chat(H, "You quickly fabricate \a [new_weapon].") + to_chat(H, span_blue("You quickly fabricate \a [new_weapon].")) H.put_in_hands(new_weapon) return 1 diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm b/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm index c27e0d9ce37..27eb5f9b794 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/passive_protection.dm @@ -27,14 +27,14 @@ if(!..()) return 0 - + var/mob/living/carbon/human/H = holder.wearer var/obj/item/clothing/shoes/boots = holder.boots var/obj/item/clothing/suit/space/rig/chest = holder.chest var/obj/item/clothing/head/helmet/space/rig/helmet = holder.helmet var/obj/item/clothing/gloves/gauntlets/rig/gloves = holder.gloves - to_chat(H, "You activate your suit's powered radiation shielding.") + to_chat(H, span_blue("You activate your suit's powered radiation shielding.")) stored_rad_armor = holder.armor["rad"] if(boots) boots.armor["rad"] = 100 @@ -107,17 +107,17 @@ if(!..()) return 0 - + var/mob/living/carbon/human/H = holder.wearer var/obj/item/clothing/shoes/boots = holder.boots var/obj/item/clothing/suit/space/rig/chest = holder.chest var/obj/item/clothing/head/helmet/space/rig/helmet = holder.helmet var/obj/item/clothing/gloves/gauntlets/rig/gloves = holder.gloves - + stored_max_pressure = holder.max_pressure_protection stored_max_temp = holder.max_heat_protection_temperature - to_chat(H, "You activate your suit's powered atmospheric shielding.") + to_chat(H, span_blue("You activate your suit's powered atmospheric shielding.")) if(boots) boots.max_pressure_protection = INFINITY @@ -163,4 +163,4 @@ holder.max_heat_protection_temperature = stored_max_temp stored_max_pressure = 0 - stored_max_temp = 0 \ No newline at end of file + stored_max_temp = 0 diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm b/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm index bfea5ccf1c4..562f874af12 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/powersink.dm @@ -118,10 +118,10 @@ if(!interfaced_with) if(M) - to_chat(M, "Total power drained: [round(total_power_drained*CELLRATE)] cell units.") + to_chat(M, span_blue("Total power drained: [round(total_power_drained*CELLRATE)] cell units.")) else if(M) - to_chat(M, "Total power drained from [interfaced_with]: [round(total_power_drained*CELLRATE)] cell units.") + to_chat(M, span_blue("Total power drained from [interfaced_with]: [round(total_power_drained*CELLRATE)] cell units.")) interfaced_with.drain_power(0,1,0) // Damage the victim. drain_loc = null diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/sprinter.dm b/code/modules/clothing/spacesuits/rig/modules/specific/sprinter.dm index b8646cfa81d..2df47f575f3 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/sprinter.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/sprinter.dm @@ -27,7 +27,7 @@ var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "You activate the suit's sprint mode.") + to_chat(H, span_blue("You activate the suit's sprint mode.")) holder.slowdown = initial(holder.slowdown) - sprint_speed diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/vision.dm b/code/modules/clothing/spacesuits/rig/modules/specific/vision.dm index 7e73f08880a..37848b2c1d9 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/vision.dm @@ -198,7 +198,7 @@ // Don't cycle if this engage() is being called by activate(). if(!active) - to_chat(holder.wearer, "You activate your visual sensors.") + to_chat(holder.wearer, span_blue("You activate your visual sensors.")) return 1 if(vision_modes.len > 1) @@ -207,9 +207,9 @@ vision_index = 1 vision = vision_modes[vision_index] - to_chat(holder.wearer, "You cycle your sensors to [vision.mode] mode.") + to_chat(holder.wearer, span_blue("You cycle your sensors to [vision.mode] mode.")) else - to_chat(holder.wearer, "Your sensors only have one mode.") + to_chat(holder.wearer, span_blue("Your sensors only have one mode.")) return 1 /obj/item/rig_module/vision/activate() @@ -234,4 +234,4 @@ if(!vision) vision = vision_datum processed_vision += vision_datum - vision_modes = processed_vision \ No newline at end of file + vision_modes = processed_vision diff --git a/code/modules/clothing/spacesuits/rig/modules/specific/voice.dm b/code/modules/clothing/spacesuits/rig/modules/specific/voice.dm index fe04d123f5c..5f32f15c415 100644 --- a/code/modules/clothing/spacesuits/rig/modules/specific/voice.dm +++ b/code/modules/clothing/spacesuits/rig/modules/specific/voice.dm @@ -38,15 +38,15 @@ if("Enable") active = 1 voice_holder.active = 1 - to_chat(usr, "You enable the speech synthesiser.") + to_chat(usr, span_blue("You enable the speech synthesiser.")) if("Disable") active = 0 voice_holder.active = 0 - to_chat(usr, "You disable the speech synthesiser.") + to_chat(usr, span_blue("You disable the speech synthesiser.")) if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) return 0 voice_holder.voice = raw_choice - to_chat(usr, "You are now mimicking [voice_holder.voice].") - return 1 \ No newline at end of file + to_chat(usr, span_blue("You are now mimicking [voice_holder.voice].")) + return 1 diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 4550eab0882..a92dfe1039e 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -201,7 +201,7 @@ break if(total_transferred) - to_chat(user, "You transfer [total_transferred] units into the suit reservoir.") + to_chat(user, span_blue("You transfer [total_transferred] units into the suit reservoir.")) else to_chat(user, "None of the reagents seem suitable.") return 1 @@ -330,17 +330,17 @@ if("Enable") active = 1 voice_holder.active = 1 - to_chat(usr, "You enable the speech synthesiser.") + to_chat(usr, span_blue("You enable the speech synthesiser.")) if("Disable") active = 0 voice_holder.active = 0 - to_chat(usr, "You disable the speech synthesiser.") + to_chat(usr, span_blue("You disable the speech synthesiser.")) if("Set Name") var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) return 0 voice_holder.voice = raw_choice - to_chat(usr, "You are now mimicking [voice_holder.voice].") + to_chat(usr, span_blue("You are now mimicking [voice_holder.voice].")) return 1 /obj/item/rig_module/maneuvering_jets @@ -508,7 +508,7 @@ to_chat(user, "Another grenade of that type will not fit into the module.") return 0 - to_chat(user, "You slot \the [input_device] into the suit module.") + to_chat(user, span_blue("You slot \the [input_device] into the suit module.")) user.drop_from_inventory(input_device) qdel(input_device) accepted_item.charges++ @@ -632,7 +632,7 @@ var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "You activate the suit's sprint mode.") + to_chat(H, span_blue("You activate the suit's sprint mode.")) holder.slowdown = initial(holder.slowdown) - sprint_speed diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index ad8a6fc5abd..d96c6a80fac 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -205,7 +205,7 @@ // Don't cycle if this engage() is being called by activate(). if(starting_up) - to_chat(holder.wearer, "You activate your visual sensors.") + to_chat(holder.wearer, span_blue("You activate your visual sensors.")) return 1 if(vision_modes.len > 1) @@ -214,9 +214,9 @@ vision_index = 1 vision = vision_modes[vision_index] - to_chat(holder.wearer, "You cycle your sensors to [vision.mode] mode.") + to_chat(holder.wearer, span_blue("You cycle your sensors to [vision.mode] mode.")) else - to_chat(holder.wearer, "Your sensors only have one mode.") + to_chat(holder.wearer, span_blue("Your sensors only have one mode.")) return 1 /obj/item/rig_module/vision/activate() diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index b28d93bc554..3cc91f6249a 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -223,11 +223,11 @@ if(!istype(module)) selected_module = null - to_chat(usr, "Primary system is now: deselected.") + to_chat(usr, span_blue("Primary system is now: deselected.")) return selected_module = module - to_chat(usr, "Primary system is now: [selected_module.interface_name].") + to_chat(usr, span_blue("Primary system is now: [selected_module.interface_name].")) /obj/item/weapon/rig/verb/toggle_module() @@ -261,10 +261,10 @@ return if(module.active) - to_chat(usr, "You attempt to deactivate \the [module.interface_name].") + to_chat(usr, span_blue("You attempt to deactivate \the [module.interface_name].")) module.deactivate() else - to_chat(usr, "You attempt to activate \the [module.interface_name].") + to_chat(usr, span_blue("You attempt to activate \the [module.interface_name].")) module.activate() /obj/item/weapon/rig/verb/engage_module() @@ -298,5 +298,5 @@ if(!istype(module)) return - to_chat(usr, "You attempt to engage the [module.interface_name].") - module.engage() \ No newline at end of file + to_chat(usr, span_blue("You attempt to engage the [module.interface_name].")) + module.engage() diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 9ee31aeb602..a07ebe19a9b 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -54,11 +54,11 @@ if(camera.status == TRUE) camera.set_status(FALSE) - to_chat(usr, "Camera deactivated.") + to_chat(usr, span_blue("Camera deactivated.")) else camera.set_status(TRUE) camera.c_tag = usr.name - to_chat(usr, "User scanned as [camera.c_tag]. Camera activated.") + to_chat(usr, span_blue("User scanned as [camera.c_tag]. Camera activated.")) /obj/item/clothing/head/helmet/space/examine(mob/user) . = ..() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ec0b54befa5..001f894ca60 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -198,10 +198,10 @@ /obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob) active = !( active ) if (active) - to_chat(user, "The reactive armor is now active.") + to_chat(user, span_blue("The reactive armor is now active.")) icon_state = "reactive" else - to_chat(user, "The reactive armor is now inactive.") + to_chat(user, span_blue("The reactive armor is now inactive.")) icon_state = "reactiveoff" add_fingerprint(user) return @@ -639,4 +639,4 @@ starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/bulletproof, /obj/item/clothing/accessory/armor/armguards/bulletproof, /obj/item/clothing/accessory/armor/legguards/bulletproof, /obj/item/clothing/accessory/storage/pouches) /obj/item/clothing/suit/armor/pcarrier/riot/full - starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches) \ No newline at end of file + starting_accessories = list(/obj/item/clothing/accessory/armor/armorplate/riot, /obj/item/clothing/accessory/armor/armguards/riot, /obj/item/clothing/accessory/armor/legguards/riot, /obj/item/clothing/accessory/storage/pouches) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index aae9a23515b..5d77b215f33 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -85,7 +85,7 @@ log transactions if(istype(I, /obj/item/weapon/card)) if(emagged > 0) //prevent inserting id into an emagged ATM - to_chat(user, "\icon[src][bicon(src)] CARD READER ERROR. This system has been compromised!") + to_chat(user, span_red("\icon[src][bicon(src)] CARD READER ERROR. This system has been compromised!")) return else if(istype(I,/obj/item/weapon/card/emag)) I.resolve_attackby(src, user) @@ -288,11 +288,11 @@ log transactions T.time = stationtime2text() failed_account.transaction_log.Add(T) else - to_chat(usr, "\icon[src][bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.") + to_chat(usr, span_red("\icon[src][bicon(src)] Incorrect pin/account combination entered, [max_pin_attempts - number_incorrect_tries] attempts remaining.")) previous_account_number = tried_account_num playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) else - to_chat(usr, "\icon[src][bicon(src)] incorrect pin/account combination entered.") + to_chat(usr, span_red("\icon[src][bicon(src)] incorrect pin/account combination entered.")) number_incorrect_tries = 0 else playsound(src, 'sound/machines/twobeep.ogg', 50, 1) @@ -308,7 +308,7 @@ log transactions T.time = stationtime2text() authenticated_account.transaction_log.Add(T) - to_chat(usr, "\icon[src][bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'") + to_chat(usr, span_blue("\icon[src][bicon(src)] Access granted. Welcome user '[authenticated_account.owner_name].'")) previous_account_number = tried_account_num if("e_withdrawal") @@ -433,7 +433,7 @@ log transactions if(!held_card) //this might happen if the user had the browser window open when somebody emagged it if(emagged > 0) - to_chat(usr, "\icon[src][bicon(src)] The ATM card reader rejected your ID because this machine has been sabotaged!") + to_chat(usr, span_red("\icon[src][bicon(src)] The ATM card reader rejected your ID because this machine has been sabotaged!")) else var/obj/item/I = usr.get_active_hand() if (istype(I, /obj/item/weapon/card/id)) diff --git a/code/modules/economy/money_bag.dm b/code/modules/economy/money_bag.dm index 3e85d62e460..d9afc36357e 100644 --- a/code/modules/economy/money_bag.dm +++ b/code/modules/economy/money_bag.dm @@ -49,14 +49,14 @@ ..() if (istype(W, /obj/item/weapon/coin)) var/obj/item/weapon/coin/C = W - to_chat(user, "You add the [C.name] into the bag.") + to_chat(user, span_blue("You add the [C.name] into the bag.")) usr.drop_item() contents += C if (istype(W, /obj/item/weapon/moneybag)) var/obj/item/weapon/moneybag/C = W for (var/obj/O in C.contents) contents += O; - to_chat(user, "You empty the [C.name] into the bag.") + to_chat(user, span_blue("You empty the [C.name] into the bag.")) return /obj/item/weapon/moneybag/Topic(href, href_list) @@ -95,4 +95,4 @@ new /obj/item/weapon/coin/silver(src) new /obj/item/weapon/coin/silver(src) new /obj/item/weapon/coin/gold(src) - new /obj/item/weapon/coin/gold(src) \ No newline at end of file + new /obj/item/weapon/coin/gold(src) diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm index be0303a41f0..a11a6768dde 100644 --- a/code/modules/economy/vending.dm +++ b/code/modules/economy/vending.dm @@ -737,7 +737,7 @@ GLOBAL_LIST_EMPTY(vending_products) return for(var/mob/O in hearers(src, null)) - O.show_message("\The [src] beeps, \"[message]\"",2) + O.show_message("\The [src] beeps, \"[message]\"",2) return /obj/machinery/vending/power_change() diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 49b1cc4bf22..53ffe228790 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -27,7 +27,7 @@ var/list/dreams = list( spawn(0) for(var/i = rand(1,4),i > 0, i--) - to_chat(src, "... [pick(dreams)] ...") + to_chat(src, span_blue("... [pick(dreams)] ...")) sleep(rand(40,70)) if(paralysis <= 0) dreaming = 0 diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index e4fc9ac89ca..f0dc850bd96 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -244,8 +244,8 @@ Gunshots/explosions/opening doors/less rare audio (done) /obj/effect/fake_attacker/attackby(var/obj/item/weapon/P as obj, mob/user as mob) step_away(src,my_target,2) for(var/mob/M in oviewers(world.view,my_target)) - to_chat(M, "[my_target] flails around wildly.") - my_target.show_message("[src] has been attacked by [my_target] ", 1) //Lazy. + to_chat(M, span_red("[my_target] flails around wildly.")) + my_target.show_message(span_red("[src] has been attacked by [my_target] "), 1) //Lazy. src.health -= P.force @@ -257,7 +257,7 @@ Gunshots/explosions/opening doors/less rare audio (done) step_away(src,my_target,2) if(prob(30)) for(var/mob/O in oviewers(world.view , my_target)) - to_chat(O, "[my_target] stumbles around.") + to_chat(O, span_red("[my_target] stumbles around.")) /obj/effect/fake_attacker/New() ..() @@ -304,7 +304,7 @@ Gunshots/explosions/opening doors/less rare audio (done) if(prob(15)) if(weapon_name) my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg')) - my_target.show_message("[my_target] has been attacked with [weapon_name] by [src.name] ", 1) + my_target.show_message(span_red("[my_target] has been attacked with [weapon_name] by [src.name]!"), 1) my_target.halloss += 8 if(prob(20)) my_target.eye_blurry += 3 if(prob(33)) @@ -312,7 +312,7 @@ Gunshots/explosions/opening doors/less rare audio (done) fake_blood(my_target) else my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg')) - my_target.show_message("[src.name] has punched [my_target]!", 1) + my_target.show_message(span_red("[src.name] has punched [my_target]!"), 1) my_target.halloss += 4 if(prob(33)) if(!locate(/obj/effect/overlay) in my_target.loc) diff --git a/code/modules/food/food/sandwich.dm b/code/modules/food/food/sandwich.dm index 738e3f4a461..e8fc9e9e1e6 100644 --- a/code/modules/food/food/sandwich.dm +++ b/code/modules/food/food/sandwich.dm @@ -23,16 +23,16 @@ sandwich_limit += 4 if(istype(W,/obj/item/weapon/material/shard)) - to_chat(user, "You hide [W] in \the [src].") + to_chat(user, span_blue("You hide [W] in \the [src].")) user.drop_item() W.loc = src update() return else if(istype(W,/obj/item/weapon/reagent_containers/food/snacks)) if(src.contents.len > sandwich_limit) - to_chat(user, "If you put anything else on \the [src] it's going to collapse.") + to_chat(user, span_red("If you put anything else on \the [src] it's going to collapse.")) return - to_chat(user, "You layer [W] over \the [src].") + to_chat(user, span_blue("You layer [W] over \the [src].")) var/obj/item/weapon/reagent_containers/F = W F.reagents.trans_to_obj(src, F.reagents.total_volume) user.drop_item() @@ -82,7 +82,7 @@ . = ..() if(contents.len) var/obj/item/O = pick(contents) - . += "You think you can see [O.name] in there." + . += span_blue("You think you can see [O.name] in there.") /obj/item/weapon/reagent_containers/food/snacks/csandwich/attack(mob/M as mob, mob/user as mob, def_zone) @@ -97,6 +97,6 @@ H = M if(H && shard && M == user) //This needs a check for feeding the food to other people, but that could be abusable. - to_chat(H, "You lacerate your mouth on a [shard.name] in the sandwich!") + to_chat(H, span_red("You lacerate your mouth on a [shard.name] in the sandwich!")) H.adjustBruteLoss(5) //TODO: Target head if human. //This TODO has been here for 4 years. ..() diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 4488a07701c..38142fc4667 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -853,7 +853,7 @@ . = ..() new/obj/effect/decal/cleanable/egg_smudge(src.loc) src.reagents.splash(hit_atom, reagents.total_volume) - src.visible_message("[src.name] has been squashed.","You hear a smack.") + src.visible_message(span_red("[src.name] has been squashed."),span_red("You hear a smack.")) qdel(src) /obj/item/weapon/reagent_containers/food/snacks/egg/attackby(obj/item/weapon/W as obj, mob/user as mob) @@ -862,10 +862,10 @@ var/clr = C.colourName if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow"))) - to_chat(usr, "The egg refuses to take on this color!") + to_chat(usr, span_blue("The egg refuses to take on this color!")) return - to_chat(usr, "You color \the [src] [clr]") + to_chat(usr, span_blue("You color \the [src] [clr]")) icon_state = "egg-[clr]" else . = ..() @@ -1633,7 +1633,7 @@ /obj/item/weapon/reagent_containers/food/snacks/popcorn/On_Consume() if(prob(unpopped)) //lol ...what's the point? - to_chat(usr, "You bite down on an un-popped kernel!") + to_chat(usr, span_red("You bite down on an un-popped kernel!")) unpopped = max(0, unpopped-1) . = ..() diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm index 6e28243baca..5746e18c4cd 100644 --- a/code/modules/food/kitchen/cooking_machines/fryer.dm +++ b/code/modules/food/kitchen/cooking_machines/fryer.dm @@ -233,8 +233,8 @@ else to_chat(victim, "Searing hot oil scorches your [E ? E.name : "flesh"]!") - user.attack_log += text("\[[time_stamp()]\] Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]") - victim.attack_log += text("\[[time_stamp()]\] Has been [cook_type] in \a [src] by [user.name] ([user.ckey])") + user.attack_log += text("\[[time_stamp()]\] [span_red("Has [cook_type] \the [victim] ([victim.ckey]) in \a [src]")]") + victim.attack_log += text("\[[time_stamp()]\] [span_orange("Has been [cook_type] in \a [src] by [user.name] ([user.ckey])")]") msg_admin_attack("[key_name_admin(user)] [cook_type] \the [victim] ([victim.ckey]) in \a [src]. (JMP)") //Coat the victim in some oil diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 5ae93bfd9cd..430029a0df9 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -154,7 +154,7 @@ var/damage = rand(0, 9) if(!damage) playsound(target, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - target.visible_message("[user] has attempted to punch [target]!") + target.visible_message(span_red("[user] has attempted to punch [target]!")) return TRUE var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting)) var/armor_block = target.run_armor_check(affecting, "melee") @@ -165,14 +165,14 @@ playsound(target, "punch", 25, 1, -1) - target.visible_message("[user] has punched [target]!") + target.visible_message(span_red("[user] has punched [target]!")) if(armor_soak >= damage) return TRUE target.apply_damage(damage, HALLOSS, affecting, armor_block, armor_soak) if(damage >= 9) - target.visible_message("[user] has weakened [target]!") + target.visible_message(span_red("[user] has weakened [target]!")) target.apply_effect(4, WEAKEN, armor_block) return TRUE @@ -239,7 +239,7 @@ if(src.density && istype(I, /obj/item/weapon) && !istype(I, /obj/item/weapon/card)) var/aforce = I.force playsound(src, 'sound/effects/Glasshit.ogg', 75, 1) - visible_message("[src] was hit by [I].") + visible_message(span_red("[src] was hit by [I].")) if(I.damtype == BRUTE || I.damtype == BURN) take_damage(aforce) return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 0b11c0ef15d..00712e4f7cc 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -404,7 +404,7 @@ Book Cart End modedesc = "ERROR" to_chat(user, " - Mode [mode] : [modedesc]") if(src.computer) - to_chat(user, "Computer has been associated with this unit.") + to_chat(user, span_green("Computer has been associated with this unit.")) else - to_chat(user, "No associated computer found. Only local scans will function properly.") - to_chat(user, "\n") \ No newline at end of file + to_chat(user, span_red("No associated computer found. Only local scans will function properly.")) + to_chat(user, "\n") diff --git a/code/modules/materials/materials/_materials.dm b/code/modules/materials/materials/_materials.dm index 1e1fec8a2d0..853c9e90ead 100644 --- a/code/modules/materials/materials/_materials.dm +++ b/code/modules/materials/materials/_materials.dm @@ -321,12 +321,13 @@ var/list/name_to_material // General wall debris product placement. // Not particularly necessary aside from snowflakey cult girders. -/datum/material/proc/place_dismantled_product(var/turf/target) - place_sheet(target) +/datum/material/proc/place_dismantled_product(var/turf/target, var/amount = 1) + place_sheet(target, amount) // Debris product. Used ALL THE TIME. /datum/material/proc/place_sheet(var/turf/target, amount) - if(stack_type) + amount = round(amount) + if(stack_type && amount > 0) return new stack_type(target, amount) // As above. diff --git a/code/modules/materials/sheets/organic/tanning/hide.dm b/code/modules/materials/sheets/organic/tanning/hide.dm index e8dadfce734..5f61873537e 100644 --- a/code/modules/materials/sheets/organic/tanning/hide.dm +++ b/code/modules/materials/sheets/organic/tanning/hide.dm @@ -1,7 +1,7 @@ /obj/item/stack/animalhide name = "hide" desc = "The hide of some creature." - description_info = "Use something sharp, like a knife, to scrape the hairs/feathers/etc off this hide to prepare it for tanning." + description_info = "Use something sharp, like a knife, to scrape the hairs/feathers/etc off this hide to prepare it for tanning." icon_state = "sheet-hide" drop_sound = 'sound/items/drop/cloth.ogg' pickup_sound = 'sound/items/pickup/cloth.ogg' @@ -27,7 +27,7 @@ if(HS.get_amount() < HS.max_amount) H = HS break - + // Either we found a valid stack, in which case increment amount, // Or we need to make a new stack if(istype(H)) @@ -38,7 +38,7 @@ // Increment the amount src.use(1) scraped++ - + if(scraped) to_chat(user, SPAN_NOTICE("You scrape the hair off [scraped] hide\s.")) else @@ -87,4 +87,4 @@ desc = "The skin of a terrible creature." singular_name = "alien hide piece" icon_state = "sheet-xeno" - stacktype = "hide-xeno" \ No newline at end of file + stacktype = "hide-xeno" diff --git a/code/modules/materials/sheets/organic/tanning/hide_hairless.dm b/code/modules/materials/sheets/organic/tanning/hide_hairless.dm index f504e24a9f5..edb36b9b867 100644 --- a/code/modules/materials/sheets/organic/tanning/hide_hairless.dm +++ b/code/modules/materials/sheets/organic/tanning/hide_hairless.dm @@ -3,7 +3,7 @@ /obj/item/stack/hairlesshide name = "hairless hide" desc = "This hide was stripped of it's hair, but still needs tanning." - description_info = "Get it wet to continue tanning this into leather.
    \ + description_info = "Get it wet to continue tanning this into leather.
    \ You could set it in a river, wash it with a sink, or just splash water on it with a bucket." singular_name = "hairless hide piece" icon_state = "sheet-hairlesshide" @@ -24,7 +24,7 @@ if(HS.get_amount() < HS.max_amount) H = HS break - + // Either we found a valid stack, in which case increment amount, // Or we need to make a new stack if(istype(H)) @@ -45,4 +45,4 @@ I.dry() use(1) - stacknum -= 1 \ No newline at end of file + stacknum -= 1 diff --git a/code/modules/materials/sheets/organic/tanning/leather_wet.dm b/code/modules/materials/sheets/organic/tanning/leather_wet.dm index 6d1df6fd753..be4d60570aa 100644 --- a/code/modules/materials/sheets/organic/tanning/leather_wet.dm +++ b/code/modules/materials/sheets/organic/tanning/leather_wet.dm @@ -3,9 +3,9 @@ name = "wet leather" desc = "This leather has been cleaned but still needs to be dried." description_info = "To finish tanning the leather, you need to dry it. \ - You could place it under a fire, \ - put it in a drying rack, \ - or build a tanning rack from steel or wooden boards." + You could place it under a fire, \ + put it in a drying rack, \ + or build a tanning rack from steel or wooden boards." singular_name = "wet leather piece" icon_state = "sheet-wetleather" var/wetness = 30 //Reduced when exposed to high temperautres diff --git a/code/modules/mentor/mentorhelp.dm b/code/modules/mentor/mentorhelp.dm index 41a760f475c..8a53d8d398e 100644 --- a/code/modules/mentor/mentorhelp.dm +++ b/code/modules/mentor/mentorhelp.dm @@ -224,7 +224,7 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new) AddInteraction("Reopened by [usr.ckey]") if(initiator) - to_chat(initiator, "Ticket [TicketHref("#[id]")] was reopened by [usr.ckey].") + to_chat(initiator, "[span_purple("Ticket [TicketHref("#[id]")] was reopened by [usr.ckey].")]") var/msg = "Ticket [TicketHref("#[id]")] reopened by [usr.ckey]." message_mentors(msg) log_admin(msg) @@ -249,9 +249,9 @@ GLOBAL_DATUM_INIT(mhelp_tickets, /datum/mentor_help_tickets, new) state = AHELP_RESOLVED GLOB.mhelp_tickets.ListInsert(src) - AddInteraction("Resolved by [usr.ckey].") + AddInteraction("[span_green("Resolved by [usr.ckey].")]") if(initiator) - to_chat(initiator, "Ticket [TicketHref("#[id]")] was marked resolved by [usr.ckey].") + to_chat(initiator, "[span_green("Ticket [TicketHref("#[id]")] was marked resolved by [usr.ckey].")]") if(!silent) feedback_inc("mhelp_resolve") var/msg = "Ticket [TicketHref("#[id]")] resolved by [usr.ckey]" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 154adb6060b..9f2619cbaa3 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -323,10 +323,10 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "Toggles AntagHUD allowing you to see who is the antagonist" if(!config.antag_hud_allowed && !client.holder) - to_chat(src, "Admins have disabled this for this round.") + to_chat(src, "[span_red("Admins have disabled this for this round.")]") return if(jobban_isbanned(src, "AntagHUD")) - to_chat(src, "You have been banned from using this feature") + to_chat(src, "[span_red("You have been banned from using this feature")]") return if(config.antag_hud_restricted && !has_enabled_antagHUD && !client.holder) var/response = tgui_alert(src, "If you turn this on, you will not be able to take any part in the round.","Are you sure you want to turn this feature on?",list("Yes","No")) @@ -597,11 +597,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp /mob/observer/dead/memory() set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") + to_chat(src, "[span_red("You are dead! You have no mind to store memory!")]") /mob/observer/dead/add_memory() set hidden = 1 - to_chat(src, "You are dead! You have no mind to store memory!") + to_chat(src, "[span_red("You are dead! You have no mind to store memory!")]") /mob/observer/dead/Post_Incorpmove() stop_following() @@ -625,7 +625,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(abs(pressure - ONE_ATMOSPHERE) < 10) gas_analyzing += "Pressure: [round(pressure,0.1)] kPa" else - gas_analyzing += "Pressure: [round(pressure,0.1)] kPa" + gas_analyzing += span_red("Pressure: [round(pressure,0.1)] kPa") if(total_moles) for(var/g in environment.gas) gas_analyzing += "[gas_data.name[g]]: [round((environment.gas[g] / total_moles) * 100)]% ([round(environment.gas[g], 0.01)] moles)" @@ -724,7 +724,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set desc = "If the round is sufficiently spooky, write a short message in blood on the floor or a wall. Remember, no IC in OOC or OOC in IC." if(!(config.cult_ghostwriter)) - to_chat(src, "That verb is not currently permitted.") + to_chat(src, "[span_red("That verb is not currently permitted.")]") return if (!src.stat) @@ -739,7 +739,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp ghosts_can_write = 1 if(!ghosts_can_write && !check_rights(R_ADMIN|R_EVENT|R_FUN, 0)) //Let's allow for admins to write in blood for events and the such. - to_chat(src, "The veil is not thin enough for you to do that.") + to_chat(src, "[span_red("The veil is not thin enough for you to do that.")]") return var/list/choices = list() @@ -789,7 +789,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp W.update_icon() W.message = message W.add_hiddenprint(src) - W.visible_message("Invisible fingers crudely paint something in blood on [T]...") + W.visible_message("[span_red("Invisible fingers crudely paint something in blood on [T]...")]") /mob/observer/dead/pointed(atom/A as mob|obj|turf in view()) if(!..()) @@ -801,7 +801,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp is_manifest = TRUE verbs |= /mob/observer/dead/proc/toggle_visibility verbs |= /mob/observer/dead/proc/ghost_whisper - to_chat(src, "As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.") + to_chat(src, "[span_purple("As you are now in the realm of the living, you can whisper to the living with the Spectral Whisper verb, inside the IC tab.")]") if(plane != PLANE_WORLD) user.visible_message( \ "\The [user] drags ghost, [src], to our plane of reality!", \ @@ -944,7 +944,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/msg = sanitize(tgui_input_text(src, "Message:", "Spectral Whisper")) if(msg) log_say("(SPECWHISP to [key_name(M)]): [msg]", src) - to_chat(M, " You hear a strange, unidentifiable voice in your head... [msg]") + to_chat(M, " You hear a strange, unidentifiable voice in your head... [span_purple("[msg]")]") to_chat(src, " You said: '[msg]' to [M].") else return diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm index 96aa9ccada4..8bf61350ec3 100644 --- a/code/modules/mob/dead/observer/say.dm +++ b/code/modules/mob/dead/observer/say.dm @@ -10,7 +10,7 @@ if(message) client.handle_spam_prevention(MUTE_DEADCHAT) if(client.prefs.muted & MUTE_DEADCHAT) - to_chat(src, "You cannot talk in deadchat (muted).") + to_chat(src, "[span_red("You cannot talk in deadchat (muted).")]") return . = say_dead(message) @@ -26,7 +26,7 @@ if(message) client.handle_spam_prevention(MUTE_DEADCHAT) if(client.prefs.muted & MUTE_DEADCHAT) - to_chat(src, "You cannot emote in deadchat (muted).") + to_chat(src, "[span_red("You cannot emote in deadchat (muted).")]") return . = emote_dead(message) @@ -39,4 +39,4 @@ //Announce computer and various stuff that broadcasts doesn't use it's real name but AI's can't pretend to be other mobs. if(speaker && (speaker_name != speaker.real_name) && !isAI(speaker)) speaker_name = "[speaker.real_name] ([speaker_name])" - return speaker_name \ No newline at end of file + return speaker_name diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 10d2b91aaf8..6bb57e488ba 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -38,6 +38,9 @@ raw_msg += (piece + " ") + if(!speaker.client) + piece = "[piece]" + //HTML formatting if(!SP.speaking) // Catch the most generic case first piece = "[piece]" @@ -215,37 +218,47 @@ return "\[[time2text(world.timeofday, "hh:mm")]\]" /mob/proc/on_hear_radio(part_a, part_b, speaker_name, track, part_c, formatted, part_d, part_e) + var/time = "" + if(client.prefs.chat_timestamp) + time = say_timestamp() var/final_message = "[part_b][speaker_name][part_c][formatted][part_d]" if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) - final_message = "[part_a][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" else - final_message = "[part_a][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" to_chat(src, final_message) /mob/observer/dead/on_hear_radio(part_a, part_b, speaker_name, track, part_c, formatted, part_d, part_e) + var/time = "" + if(client.prefs.chat_timestamp) + time = say_timestamp() var/final_message = "[part_b][track][part_c][formatted][part_d]" if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) - final_message = "[part_a][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" else - final_message = "[part_a][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" to_chat(src, final_message) /mob/living/silicon/on_hear_radio(part_a, part_b, speaker_name, track, part_c, formatted, part_d, part_e) - var/time = say_timestamp() + var/time = "" + if(client.prefs.chat_timestamp) + time = say_timestamp() var/final_message = "[part_b][speaker_name][part_c][formatted][part_d]" if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) - final_message = "[part_a][time][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" else - final_message = "[part_a][time][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" to_chat(src, final_message) /mob/living/silicon/ai/on_hear_radio(part_a, part_b, speaker_name, track, part_c, formatted, part_d, part_e) - var/time = say_timestamp() + var/time = "" + if(client.prefs.chat_timestamp) + time = say_timestamp() var/final_message = "[part_b][track][part_c][formatted][part_d]" if(check_mentioned(formatted) && is_preference_enabled(/datum/client_preference/check_mention)) - final_message = "[part_a][time][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" else - final_message = "[part_a][time][final_message][part_e]" + final_message = "[time][part_a][final_message][part_e]" to_chat(src, final_message) /mob/proc/hear_signlang(var/message, var/verb = "gestures", var/verb_understood = "gestures", var/datum/language/language, var/mob/speaker = null, var/speech_type = 1) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index e7bf3f44157..eec77b02ab4 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -56,7 +56,7 @@ var/list/slot_equipment_priority = list( \ else if(!disable_warning) - to_chat(src, "You are unable to equip that.") //Only print if del_on_fail is false + to_chat(src, span_red("You are unable to equip that.")) //Only print if del_on_fail is false return 0 equip_to_slot(W, slot, redraw_mob) //This proc should not ever fail. diff --git a/code/modules/mob/living/carbon/alien/alien_attacks.dm b/code/modules/mob/living/carbon/alien/alien_attacks.dm index e2c965e2c95..6eac6a05d26 100644 --- a/code/modules/mob/living/carbon/alien/alien_attacks.dm +++ b/code/modules/mob/living/carbon/alien/alien_attacks.dm @@ -28,7 +28,7 @@ playsound(src, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("[] has grabbed [] passively!", M, src), 1) + O.show_message(span_red(text("[] has grabbed [] passively!", M, src)), 1) else var/damage = rand(1, 9) @@ -43,17 +43,17 @@ playsound(src, "punch", 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("[] has punched []!", M, src), 1) + O.show_message(span_red(text("[] has punched []!", M, src)), 1) if (damage > 4.9) Weaken(rand(10,15)) for(var/mob/O in viewers(M, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("[] has weakened []!", M, src), 1, "You hear someone fall.", 2) + O.show_message(span_red(text("[] has weakened []!", M, src)), 1, span_red("You hear someone fall."), 2) adjustBruteLoss(damage) updatehealth() else playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message(text("[] has attempted to punch []!", M, src), 1) + O.show_message(span_red(text("[] has attempted to punch []!", M, src)), 1) return diff --git a/code/modules/mob/living/carbon/alien/diona/progression.dm b/code/modules/mob/living/carbon/alien/diona/progression.dm index 6a8d0864f41..806fcbe8dbe 100644 --- a/code/modules/mob/living/carbon/alien/diona/progression.dm +++ b/code/modules/mob/living/carbon/alien/diona/progression.dm @@ -20,5 +20,5 @@ src.loc = L.loc qdel(L) - src.visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.") - return SPECIES_DIONA \ No newline at end of file + src.visible_message(span_red("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea."),span_red("You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")) + return SPECIES_DIONA diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 64e5145b97f..df3c336a588 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -150,7 +150,7 @@ adjustFireLoss((environment.temperature - (T0C+66))/5) // Might be too high, check in testing. throw_alert("alien_fire", /obj/screen/alert/alien_fire) if(prob(20)) - to_chat(src, "You feel a searing heat!") + to_chat(src, span_red("You feel a searing heat!")) else clear_alert("alien_fire") diff --git a/code/modules/mob/living/carbon/alien/progression.dm b/code/modules/mob/living/carbon/alien/progression.dm index 0dd4ba7e136..001c1111392 100644 --- a/code/modules/mob/living/carbon/alien/progression.dm +++ b/code/modules/mob/living/carbon/alien/progression.dm @@ -12,11 +12,11 @@ return if(handcuffed || legcuffed) - to_chat(src, "You cannot evolve when you are cuffed.") + to_chat(src, span_red("You cannot evolve when you are cuffed.")) return if(amount_grown < max_grown) - to_chat(src, "You are not fully grown.") + to_chat(src, span_red("You are not fully grown.")) return // confirm_evolution() handles choices and other specific requirements. @@ -62,4 +62,4 @@ return /mob/living/carbon/alien/proc/show_evolution_blurb() - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index cfa9d59f85a..98b72fcf6f1 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -237,7 +237,7 @@ /obj/item/device/mmi/digital/attack_self(mob/user as mob) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. - to_chat(user, "You carefully locate the manual activation switch and start the [src]'s boot process.") + to_chat(user, span_blue("You carefully locate the manual activation switch and start the [src]'s boot process.")) request_player() /obj/item/device/mmi/digital/proc/request_player() @@ -261,7 +261,7 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("\The [src] buzzes quietly, and the golden lights fade away. Perhaps you could try again?") + M.show_message(span_blue("\The [src] buzzes quietly, and the golden lights fade away. Perhaps you could try again?")) /obj/item/device/mmi/digital/proc/transfer_personality(var/mob/candidate) announce_ghost_joinleave(candidate, 0, "They are occupying a synthetic brain now.") @@ -279,7 +279,7 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("\The [src] chimes quietly.") + M.show_message(span_blue("\The [src] chimes quietly.")) /obj/item/device/mmi/digital/robot name = "robotic intelligence circuit" diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 075384bc18d..1ba6bd09187 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -6,9 +6,9 @@ if (radiation > 100) radiation = 100 if(!container)//If it's not in an MMI - to_chat(src, "You feel weak.") + to_chat(src, span_red("You feel weak.")) else//Fluff-wise, since the brain can't detect anything itself, the MMI handles thing like that - to_chat(src, "STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.") + to_chat(src, span_red("STATUS: CRITICAL AMOUNTS OF RADIATION DETECTED.")) switch(radiation) if(1 to 49) @@ -23,9 +23,9 @@ if(prob(5)) radiation -= 5 if(!container) - to_chat(src, "You feel weak.") + to_chat(src, span_red("You feel weak.")) else - to_chat(src, "STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.") + to_chat(src, span_red("STATUS: DANGEROUS LEVELS OF RADIATION DETECTED.")) updatehealth() if(75 to 100) @@ -115,7 +115,7 @@ silent = 1 if(!alert)//Sounds an alarm, but only once per 'level' emote("alarm") - to_chat(src, "Major electrical distruption detected: System rebooting.") + to_chat(src, span_red("Major electrical distruption detected: System rebooting.")) alert = 1 if(prob(75)) emp_damage -= 1 @@ -131,7 +131,7 @@ ear_damage = 1 if(!alert) emote("alert") - to_chat(src, "Primary systems are now online.") + to_chat(src, span_red("Primary systems are now online.")) alert = 1 if(prob(50)) emp_damage -= 1 @@ -143,13 +143,13 @@ if(2 to 9)//Low level of EMP damage, has few effects(handled elsewhere) if(!alert) emote("notice") - to_chat(src, "System reboot nearly complete.") + to_chat(src, span_red("System reboot nearly complete.")) alert = 1 if(prob(25)) emp_damage -= 1 if(1) alert = 0 - to_chat(src, "All systems restored.") + to_chat(src, span_red("All systems restored.")) emp_damage -= 1 return 1 @@ -219,4 +219,4 @@ if(client && !client.adminobs) reset_view(null) - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index a1f12f97b50..cb155797a22 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -16,7 +16,7 @@ /obj/item/device/mmi/digital/posibrain/attack_self(mob/user as mob) if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. - to_chat(user, "You carefully locate the manual activation switch and start the positronic brain's boot process.") + to_chat(user, span_blue("You carefully locate the manual activation switch and start the positronic brain's boot process.")) icon_state = "posibrain-searching" src.searching = 1 src.request_player() @@ -68,7 +68,7 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("The positronic brain beeps as it loads a personality.") + M.show_message(span_blue("The positronic brain beeps as it loads a personality.")) playsound(src, 'sound/misc/boobeebeep.ogg', 50, 1) icon_state = "posibrain-occupied" @@ -82,7 +82,7 @@ var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("The positronic brain buzzes and beeps, and the golden lights fade away. Perhaps you could try again?") + M.show_message(span_blue("The positronic brain buzzes and beeps, and the golden lights fade away. Perhaps you could try again?")) playsound(src, 'sound/misc/buzzbeep.ogg', 50, 1) /obj/item/device/mmi/digital/posibrain/emp_act(severity) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3904656a995..316f314860d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -80,7 +80,7 @@ M.loc = src.loc for(var/mob/N in viewers(src, null)) if(N.client) - N.show_message(text("[M] bursts out of [src]!"), 2) + N.show_message(span_red(text("[M] bursts out of [src]!")), 2) ..() /mob/living/carbon/attack_hand(mob/M as mob) @@ -91,7 +91,7 @@ if (H.hand) temp = H.organs_by_name["l_hand"] if(temp && !temp.is_usable()) - to_chat(H, "You can't use your [temp.name]") + to_chat(H, span_red("You can't use your [temp.name]")) return return @@ -400,7 +400,7 @@ set category = "IC" if(usr.sleeping) - to_chat(usr, "You are already sleeping") + to_chat(usr, span_red("You are already sleeping")) return if(tgui_alert(src,"You sure you want to sleep for a while?","Sleep",list("Yes","No")) == "Yes") usr.AdjustSleeping(20) diff --git a/code/modules/mob/living/carbon/human/MedicalSideEffects.dm b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm index b37dff23ac3..f5b52e09294 100644 --- a/code/modules/mob/living/carbon/human/MedicalSideEffects.dm +++ b/code/modules/mob/living/carbon/human/MedicalSideEffects.dm @@ -24,7 +24,7 @@ for(var/R in cures) if(H.reagents.has_reagent(R)) if (cure_message) - to_chat(H, "[cure_message]") + to_chat(H, span_blue("[cure_message]")) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/chem_side_effects.dm b/code/modules/mob/living/carbon/human/chem_side_effects.dm index b37dff23ac3..f5b52e09294 100644 --- a/code/modules/mob/living/carbon/human/chem_side_effects.dm +++ b/code/modules/mob/living/carbon/human/chem_side_effects.dm @@ -24,7 +24,7 @@ for(var/R in cures) if(H.reagents.has_reagent(R)) if (cure_message) - to_chat(H, "[cure_message]") + to_chat(H, span_blue("[cure_message]")) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/examine_vr.dm b/code/modules/mob/living/carbon/human/examine_vr.dm index 3ac7698e632..e1d52728f98 100644 --- a/code/modules/mob/living/carbon/human/examine_vr.dm +++ b/code/modules/mob/living/carbon/human/examine_vr.dm @@ -87,13 +87,13 @@ /mob/living/carbon/human/proc/examine_pickup_size(mob/living/H) var/message = "" if(istype(H) && (H.get_effective_size(FALSE) - src.get_effective_size(TRUE)) >= 0.50) - message = "They are small enough that you could easily pick them up!" + message = span_blue("They are small enough that you could easily pick them up!") return message /mob/living/carbon/human/proc/examine_step_size(mob/living/H) var/message = "" if(istype(H) && (H.get_effective_size(FALSE) - src.get_effective_size(TRUE)) >= 0.75) - message = "They are small enough that you could easily trample them!" + message = span_red("They are small enough that you could easily trample them!") return message /mob/living/carbon/human/proc/examine_nif(mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 8f2847da119..cd7758a44bb 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -371,7 +371,7 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["secrecord"]) if(hasHUD(usr,"security")) @@ -401,7 +401,7 @@ read = 1 if(!read) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["secrecordComment"]) if(hasHUD(usr,"security")) @@ -428,7 +428,7 @@ to_chat(usr, "\[Add comment\]") if(!read) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["secrecordadd"]) if(hasHUD(usr,"security")) @@ -490,7 +490,7 @@ U.handle_regular_hud_updates() if(!modified) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["medrecord"]) if(hasHUD(usr,"medical")) @@ -521,7 +521,7 @@ read = 1 if(!read) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["medrecordComment"]) if(hasHUD(usr,"medical")) @@ -548,7 +548,7 @@ to_chat(usr, "\[Add comment\]") if(!read) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["medrecordadd"]) if(hasHUD(usr,"medical")) @@ -607,7 +607,7 @@ read = 1 if(!read) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["emprecordComment"]) if(hasHUD(usr,"best")) @@ -634,7 +634,7 @@ to_chat(usr, "\[Add comment\]") if(!read) - to_chat(usr, "Unable to locate a data core entry for this person.") + to_chat(usr, "[span_red("Unable to locate a data core entry for this person.")]") if (href_list["emprecordadd"]) if(hasHUD(usr,"best")) @@ -798,7 +798,7 @@ /mob/living/carbon/human/proc/play_xylophone() if(!src.xylophone) var/datum/gender/T = gender_datums[get_visible_gender()] - visible_message("\The [src] begins playing [T.his] ribcage like a xylophone. It's quite spooky.","You begin to play a spooky refrain on your ribcage.","You hear a spooky xylophone melody.") + visible_message("[span_red("\The [src] begins playing [T.his] ribcage like a xylophone. It's quite spooky.")]","You begin to play a spooky refrain on your ribcage.","[span_red("You hear a spooky xylophone melody.")]") var/song = pick('sound/effects/xylophone1.ogg','sound/effects/xylophone2.ogg','sound/effects/xylophone3.ogg') playsound(src, song, 50, 1, -1) xylophone = 1 @@ -889,7 +889,7 @@ regenerate_icons() check_dna() var/datum/gender/T = gender_datums[get_visible_gender()] - visible_message("\The [src] morphs and changes [T.his] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") + visible_message("\The [src] morphs and changes [T.his] appearance!", "You change your appearance!", "[span_red("Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!")]") /mob/living/carbon/human/proc/remotesay() set name = "Project mind" @@ -912,10 +912,10 @@ var/say = sanitize(tgui_input_text(usr, "What do you wish to say?")) if(mRemotetalk in target.mutations) - target.show_message("You hear [src.real_name]'s voice: [say]") + target.show_message("[span_blue("You hear [src.real_name]'s voice: [say]")]") else - target.show_message("You hear a voice that seems to echo around the room: [say]") - usr.show_message("You project your mind into [target.real_name]: [say]") + target.show_message("[span_blue("You hear a voice that seems to echo around the room: [say]")]") + usr.show_message("[span_blue("You project your mind into [target.real_name]: [say]")]") log_say("(TPATH to [key_name(target)]) [say]",src) for(var/mob/observer/dead/G in mob_list) G.show_message("Telepathic message from [src] to [target]: [say]") diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 27df5f58c46..a2483356122 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -64,7 +64,7 @@ if(!hit_zone) H.do_attack_animation(src) playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[H] reaches for [src], but misses!") + visible_message("[span_red("[H] reaches for [src], but misses!")]") return FALSE if(H != src && check_shields(0, null, H, H.zone_sel.selecting, H.name)) @@ -346,7 +346,7 @@ return playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message(" [M] attempted to disarm [src]!") + visible_message("[span_red("[M] attempted to disarm [src]!")]") return /mob/living/carbon/human/proc/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, inrange, params) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 8c7aaebe8e1..723fbc49b27 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -404,7 +404,7 @@ emp_act // PERSON BEING THROWN: DEVOURABLE, ALLOWS THROW VORE, CAN BE DROP PREY. if((can_be_drop_pred && throw_vore && vore_selected) && (thrown_mob.devourable && thrown_mob.throw_vore && thrown_mob.can_be_drop_prey)) //Prey thrown into pred. vore_selected.nom_mob(thrown_mob) //Eat them!!! - visible_message("[thrown_mob] is thrown right into [src]'s [lowertext(vore_selected.name)]!") + visible_message("[thrown_mob] is thrown right into [src]'s [lowertext(vore_selected.name)]!") if(thrown_mob.loc != vore_selected) thrown_mob.forceMove(vore_selected) //Double check. Should never happen but...Weirder things have happened! add_attack_logs(thrown_mob.thrower,src,"Devoured [thrown_mob.name] via throw vore.") @@ -413,7 +413,7 @@ emp_act // PERSON BEING HIT: CAN BE DROP PREY, ALLOWS THROW VORE, AND IS DEVOURABLE. // PERSON BEING THROWN: CAN BE DROP PRED, ALLOWS THROW VORE. else if((can_be_drop_prey && throw_vore && devourable) && (thrown_mob.can_be_drop_pred && thrown_mob.throw_vore && thrown_mob.vore_selected)) //Pred thrown into prey. - visible_message("[src] suddenly slips inside of [thrown_mob]'s [lowertext(thrown_mob.vore_selected.name)] as [thrown_mob] flies into them!") + visible_message("[src] suddenly slips inside of [thrown_mob]'s [lowertext(thrown_mob.vore_selected.name)] as [thrown_mob] flies into them!") thrown_mob.vore_selected.nom_mob(src) //Eat them!!! if(src.loc != thrown_mob.vore_selected) src.forceMove(thrown_mob.vore_selected) //Double check. Should never happen but...Weirder things have happened! @@ -469,7 +469,7 @@ emp_act var/obj/item/organ/external/affecting = get_organ(zone) var/hit_area = affecting.name - src.visible_message("[src] has been hit in the [hit_area] by [O].") + src.visible_message("[span_red("[src] has been hit in the [hit_area] by [O].")]") if(ismob(O.thrower)) add_attack_logs(O.thrower,src,"Hit with thrown [O.name]") @@ -515,7 +515,7 @@ emp_act if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED && !buckled) var/dir = get_dir(O.throw_source, src) - visible_message("[src] staggers under the impact!","You stagger under the impact!") + visible_message("[span_red("[src] staggers under the impact!")]","[span_red("You stagger under the impact!")]") src.throw_at(get_edge_target_turf(src,dir),1,momentum) if(!O || !src) return diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index ce3fb9d186c..6e5f9eae6c2 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -78,7 +78,7 @@ for(var/mob/O in viewers(src, null)) if ((O.client && !( O.blinded ))) - O.show_message("[src] [failed ? "tried to tackle" : "has tackled"] down [T]!", 1) + O.show_message("[span_red("[src] [failed ? "tried to tackle" : "has tackled"] down [T]!")]", 1) /mob/living/carbon/human/proc/commune() set category = "Abilities" @@ -108,12 +108,12 @@ log_say("(COMMUNE to [key_name(M)]) [text]",src) - to_chat(M, "Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]") + to_chat(M, "[span_blue("Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]")]") if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(H.species.name == src.species.name) return - to_chat(H, "Your nose begins to bleed...") + to_chat(H, "[span_red("Your nose begins to bleed...")]") H.drip(1) /mob/living/carbon/human/proc/regurgitate() @@ -126,7 +126,7 @@ if(M in stomach_contents) stomach_contents.Remove(M) M.loc = loc - src.visible_message("[src] hurls out the contents of their stomach!") + src.visible_message("[span_red("[src] hurls out the contents of their stomach!")]") return /mob/living/carbon/human/proc/psychic_whisper(mob/M as mob in oview()) @@ -137,8 +137,8 @@ var/msg = sanitize(tgui_input_text(usr, "Message:", "Psychic Whisper")) if(msg) log_say("(PWHISPER to [key_name(M)]) [msg]", src) - to_chat(M, "You hear a strange, alien voice in your head... [msg]") - to_chat(src, "You said: \"[msg]\" to [M]") + to_chat(M, "[span_green("You hear a strange, alien voice in your head... [msg]")]") + to_chat(src, "[span_green("You said: \"[msg]\" to [M]")]") return /mob/living/carbon/human/proc/diona_split_nymph() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c8aba577353..b1641597176 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -357,7 +357,7 @@ This saves us from having to call add_fingerprint() any time something is put in if(C.attempt_attach_accessory(A, src)) return else - to_chat(src, "You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...") + to_chat(src, span_red("You are trying to equip this item to an unsupported inventory slot. How the heck did you manage that? Stop it...")) return if((W == src.l_hand) && (slot != slot_l_hand)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 4afe699cfa7..08499931701 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -199,7 +199,7 @@ if (disabilities & EPILEPSY) if ((prob(1) && paralysis < 1)) - to_chat(src, "You have a seizure!") + to_chat(src, span_red("You have a seizure!")) for(var/mob/O in viewers(src, null)) if(O == src) continue @@ -435,7 +435,7 @@ if(prob(50) && prob(100 * RADIATION_SPEED_COEFFICIENT)) spawn vomit() if(!paralysis && prob(30) && prob(100 * RADIATION_SPEED_COEFFICIENT)) //CNS is shutting down. - to_chat(src, "You have a seizure!") + to_chat(src, "You have a seizure!") Paralyse(10) make_jittery(1000) if(!lying) @@ -495,7 +495,7 @@ drop_item() if(accumulated_rads > 700) // (12Gy) if(!paralysis && prob(1) && prob(100 * RADIATION_SPEED_COEFFICIENT)) //1 in 1000 chance per tick. - to_chat(src, "You have a seizure!") + to_chat(src, "You have a seizure!") Paralyse(10) make_jittery(1000) if(!lying) diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm index e64a4bf9385..eed09b56c52 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_abilities.dm @@ -121,7 +121,7 @@ var/mob/living/target = pick(potentials) if(istype(target) && target.devourable && target.can_be_drop_prey && vore_selected) target.forceMove(vore_selected) - to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") ability_flags &= ~AB_PHASE_SHIFTING diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 34a0ad325be..4bdd1cbf0e5 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -381,15 +381,17 @@ if((organ in H.organs) || (organ in H.internal_organs)) qdel(organ) - if(H.organs) H.organs.Cut() - if(H.internal_organs) H.internal_organs.Cut() - if(H.organs_by_name) H.organs_by_name.Cut() - if(H.internal_organs_by_name) H.internal_organs_by_name.Cut() + if(H.organs) H.organs.Cut() + if(H.internal_organs) H.internal_organs.Cut() + if(H.organs_by_name) H.organs_by_name.Cut() + if(H.internal_organs_by_name) H.internal_organs_by_name.Cut() + if(H.bad_external_organs) H.bad_external_organs.Cut() H.organs = list() H.internal_organs = list() H.organs_by_name = list() H.internal_organs_by_name = list() + H.bad_external_organs = list() for(var/limb_type in has_limbs) var/list/organ_data = has_limbs[limb_type] diff --git a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm index bc228f7ef07..6a397f985fa 100644 --- a/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm +++ b/code/modules/mob/living/carbon/human/species/station/protean_vr/protean_blob.dm @@ -276,7 +276,7 @@ if(target.buckled) target.buckled.unbuckle_mob(target, force = TRUE) target.forceMove(vore_selected) - to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") /mob/living/simple_mob/protean_blob/attack_target(var/atom/A) if(refactory && istype(A,/obj/item/stack/material)) diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm index d9380254855..f4b80235620 100644 --- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm +++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm @@ -430,7 +430,7 @@ to_chat(src, "You cannot bite in your current state.") return if(B.vessel.total_volume <= 0 || B.isSynthetic()) //Do they have any blood in the first place, and are they synthetic? - to_chat(src, "There appears to be no blood in this prey...") + to_chat(src, span_red("There appears to be no blood in this prey...")) return last_special = world.time + 600 @@ -468,9 +468,9 @@ if(noise) - src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!") + src.visible_message(span_red("[src] moves their head next to [B]'s neck, seemingly looking for something!")) else - src.visible_message("[src] moves their head next to [B]'s neck, seemingly looking for something!", range = 1) + src.visible_message(span_red("[src] moves their head next to [B]'s neck, seemingly looking for something!"), range = 1) if(bleed) //Due to possibility of missing/misclick and missing the bleeding cues, we are warning the scene members of BLEEDING being on to_chat(src, SPAN_WARNING("This is going to cause [B] to keep bleeding!")) @@ -479,9 +479,9 @@ if(do_after(src, 300, B)) //Thrirty seconds. if(!Adjacent(B)) return if(noise) - src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!") + src.visible_message(span_red("[src] suddenly extends their fangs and plunges them down into [B]'s neck!")) else - src.visible_message("[src] suddenly extends their fangs and plunges them down into [B]'s neck!", range = 1) + src.visible_message(span_red("[src] suddenly extends their fangs and plunges them down into [B]'s neck!"), range = 1) if(bleed) B.apply_damage(10, BRUTE, BP_HEAD, blocked = 0, soaked = 0, sharp = TRUE, edge = FALSE) var/obj/item/organ/external/E = B.get_organ(BP_HEAD) @@ -1232,9 +1232,9 @@ return if(target.buckled) //how are you buckled in the water?! target.buckled.unbuckle_mob() - target.visible_message("\The [target] suddenly disappears, being dragged into the water!",\ - "You are dragged below the water and feel yourself slipping directly into \the [src]'s [vore_selected]!") - to_chat(src, "You successfully drag \the [target] into the water, slipping them into your [vore_selected].") + target.visible_message("\The [target] suddenly disappears, being dragged into the water!",\ + "You are dragged below the water and feel yourself slipping directly into \the [src]'s [vore_selected]!") + to_chat(src, "You successfully drag \the [target] into the water, slipping them into your [vore_selected].") target.forceMove(src.vore_selected) /mob/living/carbon/human/proc/toggle_pain_module() @@ -1308,8 +1308,8 @@ to_chat(src, "You need to be closer to do that.") return - visible_message("\The [src] attempts to snatch up [target]!", \ - "You attempt to snatch up [target]!" ) + visible_message("\The [src] attempts to snatch up [target]!", \ + "You attempt to snatch up [target]!" ) playsound(src, 'sound/vore/sunesound/pred/schlorp.ogg', 25) //Code to shoot the beam here. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a959c635ed2..7abf8601aa1 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -109,14 +109,14 @@ confirm2 = tgui_alert(usr, "Pressing this buttom will really kill you, no going back", "Are you sure?", list("Yes", "No")) //Swapped answers to protect from accidental double clicks. if (src.health < 0 && stat != DEAD && confirm1 == "Yes" && confirm2 == "Yes") // Checking both confirm1 and confirm2 for good measure. I don't trust TGUI. src.death() - to_chat(src, "You have given up life and succumbed to death.") + to_chat(src, span_blue("You have given up life and succumbed to death.")) else if(stat == DEAD) - to_chat(src, "As much as you'd like, you can't die when already dead") + to_chat(src, span_blue("As much as you'd like, you can't die when already dead")) else if(confirm1 == "No" || confirm2 == "No") - to_chat(src, "You chose to live another day.") + to_chat(src, span_blue("You chose to live another day.")) else - to_chat(src, "You are not injured enough to succumb to death!") + to_chat(src, span_blue("You are not injured enough to succumb to death!")) /mob/living/proc/updatehealth() if(status_flags & GODMODE) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index f30c02a1519..a686d4501ee 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -269,7 +269,7 @@ visible_message("\The [O] misses [src] narrowly!") return - src.visible_message("[src] has been hit by [O].") + src.visible_message("[span_red("[src] has been hit by [O].")]") var/armor = run_armor_check(null, "melee") var/soaked = get_armor_soak(null, "melee") @@ -296,7 +296,7 @@ if(O.throw_source && momentum >= THROWNOBJ_KNOCKBACK_SPEED) var/dir = get_dir(O.throw_source, src) - visible_message("[src] staggers under the impact!","You stagger under the impact!") + visible_message("[span_red("[src] staggers under the impact!")]","[span_red("You stagger under the impact!")]") src.throw_at(get_edge_target_turf(src,dir),1,momentum) if(!O || !src) return @@ -330,7 +330,7 @@ // PERSON BEING THROWN: DEVOURABLE, ALLOWS THROW VORE, CAN BE DROP PREY. if((can_be_drop_pred && throw_vore) && (thrown_mob.devourable && thrown_mob.throw_vore && thrown_mob.can_be_drop_prey)) //Prey thrown into pred. vore_selected.nom_mob(thrown_mob) //Eat them!!! - visible_message("[thrown_mob] is thrown right into [src]'s [lowertext(vore_selected.name)]!") + visible_message("[thrown_mob] is thrown right into [src]'s [lowertext(vore_selected.name)]!") if(thrown_mob.loc != vore_selected) thrown_mob.forceMove(vore_selected) //Double check. Should never happen but...Weirder things have happened! on_throw_vore_special(TRUE, thrown_mob) @@ -340,7 +340,7 @@ // PERSON BEING HIT: CAN BE DROP PREY, ALLOWS THROW VORE, AND IS DEVOURABLE. // PERSON BEING THROWN: CAN BE DROP PRED, ALLOWS THROW VORE. else if((can_be_drop_prey && throw_vore && devourable) && (thrown_mob.can_be_drop_pred && thrown_mob.throw_vore)) //Pred thrown into prey. - visible_message("[src] suddenly slips inside of [thrown_mob]'s [lowertext(thrown_mob.vore_selected.name)] as [thrown_mob] flies into them!") + visible_message("[src] suddenly slips inside of [thrown_mob]'s [lowertext(thrown_mob.vore_selected.name)] as [thrown_mob] flies into them!") thrown_mob.vore_selected.nom_mob(src) //Eat them!!! if(src.loc != thrown_mob.vore_selected) src.forceMove(thrown_mob.vore_selected) //Double check. Should never happen but...Weirder things have happened! diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ea9cdc3579e..33f79d28c09 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -475,7 +475,7 @@ var/list/ai_verbs_default = list( if(target && (!istype(target, /mob/living/carbon/human) || html_decode(href_list["trackname"]) == target:get_face_name())) ai_actual_track(target) else - to_chat(src, "System error. Cannot locate [html_decode(href_list["trackname"])].") + to_chat(src, "[span_red("System error. Cannot locate [html_decode(href_list["trackname"])].")]") return if(href_list["trackbot"]) diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 6e7e8a42a10..054497422cf 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -4,7 +4,7 @@ if(get_dist(src, src.cable) > 1) var/turf/T = get_turf_or_move(src.loc) for (var/mob/M in viewers(T)) - M.show_message("The data cable rapidly retracts back into its spool.", 3, "You hear a click and the sound of wire spooling rapidly.", 2) + M.show_message(span_red("The data cable rapidly retracts back into its spool."), 3, span_red("You hear a click and the sound of wire spooling rapidly."), 2) playsound(src, 'sound/machines/click.ogg', 50, 1) qdel(src.cable) @@ -31,7 +31,7 @@ if(silence_time) if(world.timeofday >= silence_time) silence_time = null - to_chat(src, "Communication circuit reinitialized. Speech and messaging functionality restored.") + to_chat(src, span_green("Communication circuit reinitialized. Speech and messaging functionality restored.")) handle_statuses() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7ad0487945a..94249790166 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -186,12 +186,12 @@ // 33% chance of no additional effect src.silence_time = world.timeofday + 120 * 10 // Silence for 2 minutes - to_chat(src, "Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.") + to_chat(src, span_green("Communication circuit overload. Shutting down and reloading communication circuits - speech and messaging functionality will be unavailable until the reboot is complete.")) if(prob(20)) var/turf/T = get_turf_or_move(src.loc) card.death_damage() for (var/mob/M in viewers(T)) - M.show_message("A shower of sparks spray from [src]'s inner workings.", 3, "You hear and smell the ozone hiss of electrical sparks being expelled violently.", 2) + M.show_message(span_red("A shower of sparks spray from [src]'s inner workings."), 3, span_red("You hear and smell the ozone hiss of electrical sparks being expelled violently."), 2) return if(prob(50)) card.damage_random_component(TRUE) @@ -199,7 +199,7 @@ if(1) src.master = null src.master_dna = null - to_chat(src, "You feel unbound.") + to_chat(src, span_green("You feel unbound.")) if(2) var/command if(severity == 1) @@ -207,9 +207,9 @@ else command = pick("Serve", "Kill", "Love", "Hate", "Disobey", "Devour", "Fool", "Enrage", "Entice", "Observe", "Judge", "Respect", "Disrespect", "Consume", "Educate", "Destroy", "Disgrace", "Amuse", "Entertain", "Ignite", "Glorify", "Memorialize", "Analyze") src.pai_law0 = "[command] your master." - to_chat(src, "Pr1m3 d1r3c71v3 uPd473D.") + to_chat(src, span_green("Pr1m3 d1r3c71v3 uPd473D.")) if(3) - to_chat(src, "You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.") + to_chat(src, span_green("You feel an electric surge run through your circuitry and become acutely aware at how lucky you are that you can still feel at all.")) /mob/living/silicon/pai/proc/switchCamera(var/obj/machinery/camera/C) if (!C) diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index ed38dfc9c83..869692c92d1 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -1,6 +1,6 @@ /mob/living/silicon/pai/say(var/message, var/datum/language/speaking = null, var/whispering = 0) if(silence_time) - to_chat(src, "Communication circuits remain uninitialized.") + to_chat(src, span_green("Communication circuits remain uninitialized.")) else if(card.speech_synthesizer != PP_FUNCTIONAL) to_chat(src, "Communication circuits damaged. Service required.") else diff --git a/code/modules/mob/living/silicon/pai/software_modules.dm b/code/modules/mob/living/silicon/pai/software_modules.dm index 687e90e616a..3189028248c 100644 --- a/code/modules/mob/living/silicon/pai/software_modules.dm +++ b/code/modules/mob/living/silicon/pai/software_modules.dm @@ -77,7 +77,7 @@ for (var/mob/v in viewers(T)) v.show_message("[M] presses [TM.his] thumb against [P].", 3, "[P] makes a sharp clicking sound as it extracts DNA material from [M].", 2) var/datum/dna/dna = M.dna - to_chat(P, "

    [M]'s UE string : [dna.unique_enzymes]

    ") + to_chat(P, span_red("

    [M]'s UE string : [dna.unique_enzymes]

    ")) if(dna.unique_enzymes == P.master_dna) to_chat(P, "DNA is a match to stored Master DNA.") else @@ -293,9 +293,9 @@ var/turf/T = get_turf(src) for(var/mob/living/silicon/ai/AI in player_list) if(T.loc) - to_chat(AI, "Network Alert: Brute-force encryption crack in progress in [T.loc].") + to_chat(AI, span_red("Network Alert: Brute-force encryption crack in progress in [T.loc].")) else - to_chat(AI, "Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.") + to_chat(AI, span_red("Network Alert: Brute-force encryption crack in progress. Unable to pinpoint location.")) var/obj/machinery/door/D = cable.machine if(!istype(D)) hack_aborted = 1 diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 6a24796d872..9e6fbdb2d2c 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -6,6 +6,7 @@ icon_state = "robotanalyzer" item_state = "analyzer" desc = "A hand-held scanner able to diagnose robotic injuries." + description_info = "Alt-click to toggle between robot analysis and robot module scan mode." slot_flags = SLOT_BELT throwforce = 3 w_class = ITEMSIZE_SMALL @@ -18,15 +19,19 @@ /obj/item/device/robotanalyzer/attack(mob/living/M as mob, mob/living/user as mob) do_scan(M, user) +/obj/item/device/robotanalyzer/AltClick(mob/user) + mode = !mode + user.show_message(span_blue("[mode ? "Toggled to cyborg analyzing mode." : "Toggled to cyborg upgrade scan mode."]"), 1) + /obj/item/device/robotanalyzer/proc/do_scan(mob/living/M as mob, mob/living/user as mob) if((CLUMSY in user.mutations) && prob(50)) - to_chat(user, "You try to analyze the floor's vitals!") + to_chat(user, span_red("You try to analyze the floor's vitals!")) for(var/mob/O in viewers(M, null)) - O.show_message(text("[user] has analyzed the floor's vitals!"), 1) - user.show_message(text("Analyzing Results for The floor:\n\t Overall Status: Healthy"), 1) - user.show_message(text("\t Damage Specifics: [0]-[0]-[0]-[0]"), 1) - user.show_message("Key: Suffocation/Toxin/Burns/Brute", 1) - user.show_message("Body Temperature: ???", 1) + O.show_message(span_red(text("[user] has analyzed the floor's vitals!")), 1) + user.show_message(span_blue(text("Analyzing Results for The floor:\n\t Overall Status: Healthy")), 1) + user.show_message(span_blue(text("\t Damage Specifics: [0]-[0]-[0]-[0]")), 1) + user.show_message(span_blue("Key: Suffocation/Toxin/Burns/Brute"), 1) + user.show_message(span_blue("Body Temperature: ???"), 1) return var/scan_type @@ -37,44 +42,133 @@ else if(istype(M, /obj/mecha)) scan_type = "mecha" else - to_chat(user, "You can't analyze non-robotic things!") + to_chat(user, span_red("You can't analyze non-robotic things!")) return user.visible_message("\The [user] has analyzed [M]'s components.","You have analyzed [M]'s components.") switch(scan_type) if("robot") - var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() - var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() - user.show_message("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]") - user.show_message("\t Key: Electronics/Brute", 1) - user.show_message("\t Damage Specifics: [BU] - [BR]") - if(M.tod && M.stat == DEAD) - user.show_message("Time of Disable: [M.tod]") - var/mob/living/silicon/robot/H = M - var/list/damaged = H.get_damaged_components(1,1,1) - user.show_message("Localized Damage:",1) - if(length(damaged)>0) - for(var/datum/robot_component/org in damaged) - user.show_message(text("\t []: [][] - [] - [] - []", \ - capitalize(org.name), \ - (org.installed == -1) ? "DESTROYED " :"",\ - (org.electronics_damage > 0) ? "[org.electronics_damage]" :0, \ - (org.brute_damage > 0) ? "[org.brute_damage]" :0, \ - (org.toggled) ? "Toggled ON" : "Toggled OFF",\ - (org.powered) ? "Power ON" : "Power OFF"),1) + if(mode) + var/BU = M.getFireLoss() > 50 ? "[M.getFireLoss()]" : M.getFireLoss() + var/BR = M.getBruteLoss() > 50 ? "[M.getBruteLoss()]" : M.getBruteLoss() + user.show_message(span_blue("Analyzing Results for [M]:\n\t Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.halloss]% functional"]")) + user.show_message("\t Key: [span_orange("Electronics")]/[span_red("Brute")]", 1) + user.show_message("\t Damage Specifics: [span_orange("[BU]")] - [span_red("[BR]")]") + if(M.tod && M.stat == DEAD) + user.show_message(span_blue("Time of Disable: [M.tod]")) + var/mob/living/silicon/robot/H = M + var/obj/item/weapon/cell/cell = H.get_cell() + if(cell) + var/cell_charge = round(cell.percent()) + var/cell_text + if(cell_charge > 60) + cell_text = span_green("[cell_charge]") + else if (cell_charge > 30) + cell_text = span_yellow("[cell_charge]") + else if (cell_charge > 10) + cell_text = span_orange("[cell_charge]") + else if (cell_charge > 1) + cell_text = span_red("[cell_charge]") + else + cell_text = span_red("[cell_charge]") + user.show_message("\t Power Cell Status: [span_blue("[capitalize(cell.name)]")] at [cell_text]% charge") + var/list/damaged = H.get_damaged_components(1,1,1) + user.show_message(span_blue("Localized Damage:"),1) + if(length(damaged)>0) + for(var/datum/robot_component/org in damaged) + user.show_message(span_blue(text("\t []: [][] - [] - [] - []", \ + span_blue(capitalize(org.name)), \ + (org.installed == -1) ? "[span_red("DESTROYED")] " :"",\ + (org.electronics_damage > 0) ? "[span_orange("[org.electronics_damage]")]" :0, \ + (org.brute_damage > 0) ? "[span_red("[org.brute_damage]")]" :0, \ + (org.toggled) ? "Toggled ON" : "[span_red("Toggled OFF")]",\ + (org.powered) ? "Power ON" : "[span_red("Power OFF")]")),1) + else + user.show_message(span_blue("\t Components are OK."),1) + if(H.emagged && prob(5)) + user.show_message(span_red("\t ERROR: INTERNAL SYSTEMS COMPROMISED"),1) + user.show_message(span_blue("Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)"), 1) else - user.show_message("\t Components are OK.",1) - if(H.emagged && prob(5)) - user.show_message("\t ERROR: INTERNAL SYSTEMS COMPROMISED",1) - user.show_message("Operating Temperature: [M.bodytemperature-T0C]°C ([M.bodytemperature*1.8-459.67]°F)", 1) + var/mob/living/silicon/robot/H = M + var/obj/item/weapon/cell/cell = H.get_cell() + user.show_message(span_blue("Upgrade Analyzing Results for [M]:")) + if(cell) + user.show_message("\t Power Cell Details: [span_blue("[capitalize(cell.name)]")] with a capacity of [cell.maxcharge] at [round(cell.percent())]% charge") + var/show_title = TRUE + for(var/datum/design/item/prosfab/robot_upgrade/utility/upgrade) + var/obj/item/borg/upgrade/utility/upgrade_type = initial(upgrade.build_path) + var/needs_module = initial(upgrade_type.require_module) + if((!H.module && needs_module) || !initial(upgrade.name) || (H.stat != DEAD && initial(upgrade.name) == "Emergency Restart Module")) + continue + if(show_title) + user.show_message("\t Utility Modules, used for modifying purposes:") + show_title = FALSE + if(H.stat == DEAD) + if(initial(upgrade.name) == "Emergency Restart Module") + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_green("Usable")]")) + else + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_green("Usable")]")) + show_title = TRUE + for(var/datum/design/item/prosfab/robot_upgrade/basic/upgrade) + var/obj/item/borg/upgrade/basic/upgrade_type = initial(upgrade.build_path) + var/needs_module = initial(upgrade_type.require_module) + if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD) + continue + if(show_title) + user.show_message("\t Basic Modules, used for direct upgrade purposes:") + show_title = FALSE + if(H.has_basic_upgrade(initial(upgrade.build_path)) == "") + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR")]")) + else + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_basic_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]")) + show_title = TRUE + for(var/datum/design/item/prosfab/robot_upgrade/advanced/upgrade) + var/obj/item/borg/upgrade/advanced/upgrade_type = initial(upgrade.build_path) + var/needs_module = initial(upgrade_type.require_module) + if((!H.module && needs_module) || !initial(upgrade.name) || H.stat == DEAD) + continue + if(show_title) + user.show_message("\t Advanced Modules, used for module upgrade purposes:") + show_title = FALSE + if(H.has_advanced_upgrade(initial(upgrade.build_path)) == "") + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR")]")) + else + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_advanced_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]")) + show_title = TRUE + for(var/datum/design/item/prosfab/robot_upgrade/restricted/upgrade) + var/obj/item/borg/upgrade/restricted/upgrade_type = initial(upgrade.build_path) + var/needs_module = initial(upgrade_type.require_module) + if((!H.module && needs_module) || !initial(upgrade.name) || !H.supports_upgrade(initial(upgrade.build_path)) || H.stat == DEAD) + continue + if(show_title) + user.show_message("\t Restricted Modules, used for module upgrade purposes on specific chassis:") + show_title = FALSE + if(H.has_restricted_upgrade(initial(upgrade.build_path)) == "") + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR")]")) + else + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_restricted_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]")) + show_title = TRUE + for(var/datum/design/item/prosfab/robot_upgrade/no_prod/upgrade) + var/obj/item/borg/upgrade/no_prod/upgrade_type = initial(upgrade.build_path) + var/needs_module = initial(upgrade_type.require_module) + var/hidden = initial(upgrade_type.hidden_from_scan) + if((!H.module && needs_module) || !initial(upgrade.name) || hidden || H.stat == DEAD) + continue + if(show_title) + user.show_message("\t Special Modules, used for recreation purposes:") + show_title = FALSE + if(H.has_no_prod_upgrade(initial(upgrade.build_path)) == "") + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [span_red("ERROR")]")) + else + user.show_message(span_blue("\t\t [capitalize(initial(upgrade.name))]: [H.has_no_prod_upgrade(initial(upgrade.build_path)) ? span_green("Installed") : span_red("Missing")]")) if("prosthetics") var/mob/living/carbon/human/H = M to_chat(user, "Analyzing Results for \the [H]:") if(H.isSynthetic()) - to_chat(user, "System instability: [H.getToxLoss()]") - to_chat(user, "Key: Electronics/Brute") + to_chat(user, "System instability: [span_green("[H.getToxLoss()]")]") + to_chat(user, "Key: [span_orange("Electronics")]/[span_red("Brute")]") to_chat(user, "External prosthetics:") var/organ_found if(H.internal_organs.len) @@ -82,7 +176,7 @@ if(!(E.robotic >= ORGAN_ROBOT)) continue organ_found = 1 - to_chat(user, "[E.name]: [E.brute_dam] [E.burn_dam]") + to_chat(user, "[E.name]: [span_red("[E.brute_dam] ")] [span_orange("[E.burn_dam]")]") if(!organ_found) to_chat(user, "No prosthetics located.") to_chat(user, "
    ") @@ -93,7 +187,7 @@ if(!(O.robotic >= ORGAN_ROBOT)) continue organ_found = 1 - to_chat(user, "[O.name]: [O.damage]") + to_chat(user, "[O.name]: [span_red("[O.damage]")]") if(!organ_found) to_chat(user, "No prosthetics located.") @@ -109,11 +203,11 @@ var/output = {"Analyzing Results for \the [Mecha]:
    Chassis Integrity: [integrity]%
    - Powercell charge: [isnull(cell_charge)?"No powercell installed":"[Mecha.cell.percent()]%"]
    + Powercell charge: [isnull(cell_charge)?"No powercell installed":"[capitalize(initial(Mecha.cell.name))] at [Mecha.cell.percent()]%"]
    Air source: [Mecha.use_internal_tank?"Internal Airtank":"Environment"]
    Airtank pressure: [tank_pressure]kPa
    Airtank temperature: [tank_temperature]K|[tank_temperature - T0C]°C
    - Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? "[cabin_pressure]": cabin_pressure]kPa
    + Cabin pressure: [cabin_pressure>WARNING_HIGH_PRESSURE ? span_red("[cabin_pressure]"): cabin_pressure]kPa
    Cabin temperature: [Mecha.return_temperature()]K|[Mecha.return_temperature() - T0C]°C
    DNA Lock: [Mecha.dna?"Mecha.dna":"Not Found"]
    "} diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index aaa854b47fe..255bd2b19ff 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -1,24 +1,27 @@ +/obj/item/weapon/melee/dogborg/jaws + icon = 'icons/mob/dogborg_vr.dmi' + hitsound = 'sound/weapons/bite.ogg' + throwforce = 0 + w_class = ITEMSIZE_NORMAL + pry = 1 + tool_qualities = list(TOOL_CROWBAR) + /obj/item/weapon/melee/dogborg/jaws/big name = "combat jaws" - icon = 'icons/mob/dogborg_vr.dmi' icon_state = "jaws" desc = "The jaws of the law." - force = 10 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' + force = 25 + armor_penetration = 25 + defend_chance = 15 attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - w_class = ITEMSIZE_NORMAL /obj/item/weapon/melee/dogborg/jaws/small name = "puppy jaws" - icon = 'icons/mob/dogborg_vr.dmi' icon_state = "smalljaws" desc = "The jaws of a small dog." - force = 5 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' + force = 10 + defend_chance = 5 attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - w_class = ITEMSIZE_NORMAL var/emagged = 0 /obj/item/weapon/melee/dogborg/jaws/small/attack_self(mob/user) @@ -27,24 +30,20 @@ emagged = !emagged if(emagged) name = "combat jaws" - icon = 'icons/mob/dogborg_vr.dmi' icon_state = "jaws" desc = "The jaws of the law." - force = 10 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' + force = 25 + armor_penetration = 25 + defend_chance = 15 attack_verb = list("chomped", "bit", "ripped", "mauled", "enforced") - w_class = ITEMSIZE_NORMAL else name = "puppy jaws" - icon = 'icons/mob/dogborg_vr.dmi' icon_state = "smalljaws" desc = "The jaws of a small dog." - force = 5 - throwforce = 0 - hitsound = 'sound/weapons/bite.ogg' + force = 10 + armor_penetration = 0 + defend_chance = 5 attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") - w_class = ITEMSIZE_NORMAL update_icon() // Baton chompers diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index e2fc82df32c..106ab34f7d4 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -60,7 +60,7 @@ src.has_power = 1 else if (src.has_power) - to_chat(src, "You are now running on emergency backup power.") + to_chat(src, span_red("You are now running on emergency backup power.")) src.has_power = 0 if(lights_on) // Light is on but there is no power! lights_on = 0 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 373d38a8e47..38669a99e0c 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -107,7 +107,10 @@ /mob/living/silicon/robot/proc/robot_checklaws, /mob/living/silicon/robot/proc/robot_mount, /mob/living/proc/toggle_rider_reins, - /mob/living/proc/shred_limb + /mob/living/proc/vertical_nom, + /mob/living/proc/shred_limb, + /mob/living/proc/dominate_prey, + /mob/living/proc/lend_prey_control ) /mob/living/silicon/robot/New(loc, var/unfinished = 0) @@ -319,7 +322,7 @@ else modules.Add(robot_module_types) if(crisis || security_level == SEC_LEVEL_RED || crisis_override) - to_chat(src, "Crisis mode active. Combat module available.") + to_chat(src, span_red("Crisis mode active. Combat module available.")) modules |= emergency_module_types for(var/module_name in whitelisted_module_types) if(is_borg_whitelisted(src, module_name)) @@ -449,11 +452,11 @@ set name = "Self Diagnosis" if(!is_component_functioning("diagnosis unit")) - to_chat(src, "Your self-diagnosis component isn't functioning.") + to_chat(src, span_red("Your self-diagnosis component isn't functioning.")) var/datum/robot_component/CO = get_component("diagnosis unit") if (!cell_use_power(CO.active_usage)) - to_chat(src, "Low Power.") + to_chat(src, span_red("Low Power.")) var/dat = self_diagnosis() src << browse(dat, "window=robotdiagnosis") @@ -477,10 +480,10 @@ var/datum/robot_component/C = components[toggle] if(C.toggled) C.toggled = 0 - to_chat(src, "You disable [C.name].") + to_chat(src, span_red("You disable [C.name].")) else C.toggled = 1 - to_chat(src, "You enable [C.name].") + to_chat(src, span_red("You enable [C.name].")) /mob/living/silicon/robot/verb/spark_plug() //So you can still sparkle on demand without violence. set category = "Robot Commands" @@ -608,7 +611,7 @@ updatehealth() add_fingerprint(user) for(var/mob/O in viewers(user, null)) - O.show_message("[user] has fixed some of the dents on [src]!", 1) + O.show_message("[span_red("[user] has fixed some of the dents on [src]!")]", 1) else to_chat(user, "Need more welding fuel!") return @@ -623,7 +626,7 @@ adjustFireLoss(-30) updatehealth() for(var/mob/O in viewers(user, null)) - O.show_message("[user] has fixed some of the burnt wires on [src]!", 1) + O.show_message("[span_red("[user] has fixed some of the burnt wires on [src]!")]", 1) else if(W.has_tool_quality(TOOL_CROWBAR) && user.a_intent != I_HURT) // crowbar means open or close the cover if(opened) @@ -753,7 +756,7 @@ to_chat(user, "You [ locked ? "lock" : "unlock"] [src]'s interface.") update_icon() else - to_chat(user, "Access denied.") + to_chat(user, "[span_red("Access denied.")]") else if(istype(W, /obj/item/borg/upgrade/)) var/obj/item/borg/upgrade/U = W @@ -1010,7 +1013,7 @@ /mob/living/silicon/robot/proc/installed_modules() if(weapon_lock) - to_chat(src, "Weapon lock active, unable to use modules! Count:[weaponlock_time]") + to_chat(src, "" + span_red("Weapon lock active, unable to use modules! Count:[weaponlock_time]") + "") return if(!module) @@ -1416,8 +1419,8 @@ return cell /mob/living/silicon/robot/lay_down() - . = ..() - update_icon() + . = ..() + update_icon() /mob/living/silicon/robot/verb/rest_style() set name = "Switch Rest Style" @@ -1437,3 +1440,75 @@ rest_style = tgui_alert(src, "Select resting pose", "Resting Pose", sprite_datum.rest_sprite_options) if(!rest_style) rest_style = "Default" + +// Those basic ones require quite detailled checks on the robot's vars to see if they are installed! +/mob/living/silicon/robot/proc/has_basic_upgrade(var/given_type) + if(given_type == /obj/item/borg/upgrade/basic/vtec) + return (/mob/living/silicon/robot/proc/toggle_vtec in verbs) + else if(given_type == /obj/item/borg/upgrade/basic/sizeshift) + return (/mob/living/proc/set_size in verbs) + else if(given_type == /obj/item/borg/upgrade/basic/syndicate) + return emag_items + else if(given_type == /obj/item/borg/upgrade/basic/language) + return (speech_synthesizer_langs.len > 20) // Service with the most has 18 + return null + +// We check for the module only here +/mob/living/silicon/robot/proc/has_upgrade_module(var/given_type) + var/obj/T = locate(given_type) in module + if(!T) + T = locate(given_type) in module.contents + if(!T) + T = locate(given_type) in module.modules + return T + +// Most of the advanced ones, we can easily check, but a few special cases exist and need to be handled specially +/mob/living/silicon/robot/proc/has_advanced_upgrade(var/given_type) + if(given_type == /obj/item/borg/upgrade/advanced/bellysizeupgrade) + var/obj/item/device/dogborg/sleeper/T = has_upgrade_module(/obj/item/device/dogborg/sleeper) + if(T && T.upgraded_capacity) + return T + else + return "" // Return this to have the analyzer show an error if the module is missing. FALSE / NULL are used for missing upgrades themselves + if(given_type == /obj/item/borg/upgrade/advanced/jetpack) + return has_upgrade_module(/obj/item/weapon/tank/jetpack/carbondioxide) + if(given_type == /obj/item/borg/upgrade/advanced/advhealth) + return has_upgrade_module(/obj/item/device/healthanalyzer/advanced) + if(given_type == /obj/item/borg/upgrade/advanced/sizegun) + return has_upgrade_module(/obj/item/weapon/gun/energy/sizegun/mounted) + return null + +// Do we support specific upgrades? +/mob/living/silicon/robot/proc/supports_upgrade(var/given_type) + return (given_type in module.supported_upgrades) + +// Most of the restricted ones, we can easily check, but a few special cases exist and need to be handled specially +/mob/living/silicon/robot/proc/has_restricted_upgrade(var/given_type) + if(given_type == /obj/item/borg/upgrade/restricted/bellycapupgrade) + var/obj/item/device/dogborg/sleeper/T = has_upgrade_module(/obj/item/device/dogborg/sleeper) + if(T && T.compactor) + return T + else + return "" + if(given_type == /obj/item/borg/upgrade/restricted/tasercooler) + var/obj/item/weapon/gun/energy/taser/mounted/cyborg/T = has_upgrade_module(/obj/item/weapon/gun/energy/taser/mounted/cyborg) + if(T && T.recharge_time <= 2) + return T + else + return "" + if(given_type == /obj/item/borg/upgrade/restricted/advrped) + return has_upgrade_module(/obj/item/weapon/storage/part_replacer/adv) + if(given_type == /obj/item/borg/upgrade/restricted/diamonddrill) + return has_upgrade_module(/obj/item/weapon/pickaxe/diamonddrill) + if(given_type == /obj/item/borg/upgrade/restricted/pka) + return has_upgrade_module(/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg) + return null + +// Check if we have any non production upgrades +/mob/living/silicon/robot/proc/has_no_prod_upgrade(var/given_type) + if(given_type == /obj/item/borg/upgrade/no_prod/toygun) + return has_upgrade_module(/obj/item/weapon/gun/projectile/cyborgtoy) + return null + +/mob/living/silicon/robot/proc/has_upgrade(var/given_type) + return (has_basic_upgrade(given_type) || has_advanced_upgrade(given_type) || has_restricted_upgrade(given_type) || has_no_prod_upgrade(given_type)) diff --git a/code/modules/mob/living/silicon/robot/robot_damage.dm b/code/modules/mob/living/silicon/robot/robot_damage.dm index 82c5edd4149..83d08c98ddb 100644 --- a/code/modules/mob/living/silicon/robot/robot_damage.dm +++ b/code/modules/mob/living/silicon/robot/robot_damage.dm @@ -79,11 +79,11 @@ cell.charge -= cost if(cell.charge <= 0) cell.charge = 0 - to_chat(src, "Your shield has overloaded!") + to_chat(src, "[span_red("Your shield has overloaded!")]") else brute -= absorb_brute burn -= absorb_burn - to_chat(src, "Your shield absorbs some of the impact!") + to_chat(src, "[span_red("Your shield absorbs some of the impact!")]") if(!emp) var/datum/robot_component/armour/A = get_armour() @@ -126,11 +126,11 @@ cell.charge -= cost if(cell.charge <= 0) cell.charge = 0 - to_chat(src, "Your shield has overloaded!") + to_chat(src, "[span_red("Your shield has overloaded!")]") else brute -= absorb_brute burn -= absorb_burn - to_chat(src, "Your shield absorbs some of the impact!") + to_chat(src, "[span_red("Your shield absorbs some of the impact!")]") var/datum/robot_component/armour/A = get_armour() if(A) @@ -152,4 +152,4 @@ /mob/living/silicon/robot/emp_act(severity) uneq_all() - ..() //Damage is handled at /silicon/ level. \ No newline at end of file + ..() //Damage is handled at /silicon/ level. diff --git a/code/modules/mob/living/silicon/robot/robot_modules/station.dm b/code/modules/mob/living/silicon/robot/robot_modules/station.dm index 2622ff4ae35..ea34d54e55b 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/station.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/station.dm @@ -47,8 +47,6 @@ var/global/list/robot_modules = list( var/list/modules = list() var/list/datum/matter_synth/synths = list() var/list/emag = list() - var/obj/item/borg/upgrade/jetpack = null - var/obj/item/borg/upgrade/advhealth = null var/list/subsystems = list() var/list/obj/item/borg/upgrade/supported_upgrades = list() @@ -109,8 +107,6 @@ var/global/list/robot_modules = list( modules.Cut() synths.Cut() emag.Cut() - qdel(jetpack) - jetpack = null return ..() /obj/item/weapon/robot_module/emp_act(severity) @@ -233,6 +229,7 @@ var/global/list/robot_modules = list( networks = list(NETWORK_MEDICAL) subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) pto_type = PTO_MEDICAL + supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade) /obj/item/weapon/robot_module/robot/medical/surgeon name = "surgeon robot module" @@ -470,7 +467,7 @@ var/global/list/robot_modules = list( channels = list("Security" = 1) networks = list(NETWORK_SECURITY) subsystems = list(/mob/living/silicon/proc/subsystem_crew_monitor) - supported_upgrades = list(/obj/item/borg/upgrade/tasercooler) + supported_upgrades = list(/obj/item/borg/upgrade/restricted/tasercooler, /obj/item/borg/upgrade/restricted/bellycapupgrade) pto_type = PTO_SECURITY /obj/item/weapon/robot_module/robot/security/general @@ -668,7 +665,7 @@ var/global/list/robot_modules = list( name = "miner robot module" channels = list("Supply" = 1) networks = list(NETWORK_MINE) - supported_upgrades = list(/obj/item/borg/upgrade/pka, /obj/item/borg/upgrade/diamonddrill) + supported_upgrades = list(/obj/item/borg/upgrade/restricted/pka, /obj/item/borg/upgrade/restricted/diamonddrill) pto_type = PTO_CARGO /obj/item/weapon/robot_module/robot/miner/create_equipment(var/mob/living/silicon/robot/robot) @@ -689,7 +686,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/research name = "research module" channels = list("Science" = 1) - supported_upgrades = list(/obj/item/borg/upgrade/advrped) + supported_upgrades = list(/obj/item/borg/upgrade/restricted/advrped) pto_type = PTO_SCIENCE /obj/item/weapon/robot_module/robot/research/create_equipment(var/mob/living/silicon/robot/robot) @@ -752,6 +749,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/security/combat name = "combat robot module" hide_on_manifest = TRUE + supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade) /obj/item/weapon/robot_module/robot/security/combat/create_equipment(var/mob/living/silicon/robot/robot) ..() diff --git a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm index d87b6eaec35..7ed99340421 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules/syndicate.dm @@ -48,6 +48,7 @@ // Gets a big shield and a gun that shoots really fast to scare the opposing force. /obj/item/weapon/robot_module/robot/syndicate/protector name = "protector robot module" + supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade) /obj/item/weapon/robot_module/robot/syndicate/protector/create_equipment(var/mob/living/silicon/robot/robot) ..() @@ -133,6 +134,7 @@ // Mediborg optimized for on-the-field healing, but can also do surgery if needed. /obj/item/weapon/robot_module/robot/syndicate/combat_medic name = "combat medic robot module" + supported_upgrades = list(/obj/item/borg/upgrade/restricted/bellycapupgrade) /obj/item/weapon/robot_module/robot/syndicate/combat_medic/create_equipment(var/mob/living/silicon/robot/robot) ..() @@ -190,4 +192,4 @@ S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() - ..() \ No newline at end of file + ..() diff --git a/code/modules/mob/living/silicon/robot/sprites/combat.dm b/code/modules/mob/living/silicon/robot/sprites/combat.dm index a451a70e790..3ff24f321ff 100644 --- a/code/modules/mob/living/silicon/robot/sprites/combat.dm +++ b/code/modules/mob/living/silicon/robot/sprites/combat.dm @@ -8,9 +8,8 @@ var/has_shield_sprite = FALSE /datum/robot_sprite/combat/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) - if(has_speed_sprite) - if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) - ourborg.icon_state = "[sprite_icon_state]-roll" + if(has_speed_sprite && istype(ourborg.module_active, /obj/item/borg/combat/mobility)) + ourborg.icon_state = "[sprite_icon_state]-roll" if(has_shield_sprite) if(ourborg.has_active_type(/obj/item/borg/combat/shield)) var/obj/item/borg/combat/shield/shield = locate() in ourborg @@ -90,10 +89,20 @@ has_custom_equipment_sprites = TRUE var/has_gun_sprite = FALSE + var/has_speed_sprite = FALSE + var/has_shield_sprite = FALSE /datum/robot_sprite/dogborg/tall/combat/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) if(has_gun_sprite && (istype(ourborg.module_active, /obj/item/weapon/gun/energy/laser/mounted) || istype(ourborg.module_active, /obj/item/weapon/gun/energy/taser/mounted/cyborg/ertgun) || istype(ourborg.module_active, /obj/item/weapon/gun/energy/lasercannon/mounted))) ourborg.add_overlay("[sprite_icon_state]-gun") + if(has_speed_sprite && (istype(ourborg.module_active, /obj/item/borg/combat/mobility))) + ourborg.icon_state = "[sprite_icon_state]-roll" + if(has_shield_sprite) + if(ourborg.has_active_type(/obj/item/borg/combat/shield)) + var/obj/item/borg/combat/shield/shield = locate() in ourborg + if(shield && shield.active) + ourborg.add_overlay("[sprite_icon_state]-shield") + /datum/robot_sprite/dogborg/tall/combat/do_equipment_glamour(var/obj/item/weapon/robot_module/module) if(!has_custom_equipment_sprites) @@ -133,3 +142,29 @@ rest_sprite_options = list("Default") has_eye_sprites = FALSE has_eye_light_sprites = TRUE + +/datum/robot_sprite/dogborg/tall/combat/raptor + name = "Raptor V-4" + sprite_icon_state = "raptor" + sprite_hud_icon_state = "ert" + rest_sprite_options = list("Default", "Bellyup") + has_gun_sprite = TRUE + has_eye_light_sprites = TRUE + has_shield_sprite = TRUE + has_speed_sprite = TRUE + +/datum/robot_sprite/dogborg/tall/combat/raptor/get_eyes_overlay(var/mob/living/silicon/robot/ourborg) + if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + return + else + return ..() +/datum/robot_sprite/dogborg/tall/combat/raptor/get_eye_light_overlay(var/mob/living/silicon/robot/ourborg) + if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + return + else + return ..() +/datum/robot_sprite/dogborg/tall/combat/raptor/get_belly_overlay(var/mob/living/silicon/robot/ourborg) + if(istype(ourborg.module_active,/obj/item/borg/combat/mobility)) + return + else + return ..() diff --git a/code/modules/mob/living/silicon/robot/sprites/event.dm b/code/modules/mob/living/silicon/robot/sprites/event.dm index 71cecd56eed..681e0f2fcfb 100644 --- a/code/modules/mob/living/silicon/robot/sprites/event.dm +++ b/code/modules/mob/living/silicon/robot/sprites/event.dm @@ -47,6 +47,32 @@ sprite_icon_state = "stray" +// Tall sprites + +/datum/robot_sprite/dogborg/tall/lost + module_type = "Lost" + sprite_icon = 'icons/mob/robot/lost_large.dmi' + sprite_hud_icon_state = "lost" + + var/has_shield_sprite = FALSE + var/has_laser_sprite = FALSE + +/datum/robot_sprite/dogborg/tall/lost/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) + if(has_laser_sprite && istype(ourborg.module_active, /obj/item/weapon/gun/energy/retro/mounted)) + ourborg.add_overlay("[sprite_icon_state]-laser") + if(has_shield_sprite) + if(ourborg.has_active_type(/obj/item/borg/combat/shield)) + var/obj/item/borg/combat/shield/shield = locate() in ourborg + if(shield && shield.active) + ourborg.add_overlay("[sprite_icon_state]-shield") + +/datum/robot_sprite/dogborg/tall/lost/raptor + name = "Raptor V-4" + sprite_icon_state = "raptor" + has_shield_sprite = TRUE + has_laser_sprite = TRUE + + // Gravekeeper // Regular sprites @@ -73,4 +99,30 @@ /datum/robot_sprite/gravekeeper/sleek name = "WTOperator" sprite_icon_state = "sleek" - has_shield_sprite = TRUE \ No newline at end of file + has_shield_sprite = TRUE + + +// Tall sprites + +/datum/robot_sprite/dogborg/tall/gravekeeper + module_type = "Gravekeeper" + sprite_icon = 'icons/mob/robot/gravekeeper_large.dmi' + sprite_hud_icon_state = "lost" + + var/has_shield_sprite = FALSE + var/has_laser_sprite = FALSE + +/datum/robot_sprite/dogborg/tall/gravekeeper/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) + if(has_laser_sprite && istype(ourborg.module_active, /obj/item/weapon/gun/energy/retro/mounted)) + ourborg.add_overlay("[sprite_icon_state]-laser") + if(has_shield_sprite) + if(ourborg.has_active_type(/obj/item/borg/combat/shield)) + var/obj/item/borg/combat/shield/shield = locate() in ourborg + if(shield && shield.active) + ourborg.add_overlay("[sprite_icon_state]-shield") + +/datum/robot_sprite/dogborg/tall/gravekeeper/raptor + name = "Raptor V-4" + sprite_icon_state = "raptor" + has_shield_sprite = TRUE + has_laser_sprite = TRUE diff --git a/code/modules/mob/living/silicon/robot/sprites/science.dm b/code/modules/mob/living/silicon/robot/sprites/science.dm index 4443f90a198..7232bd97262 100644 --- a/code/modules/mob/living/silicon/robot/sprites/science.dm +++ b/code/modules/mob/living/silicon/robot/sprites/science.dm @@ -148,6 +148,12 @@ module_type = "Research" sprite_icon = 'icons/mob/robot/science_large.dmi' + var/has_taser_sprite = FALSE + +/datum/robot_sprite/dogborg/tall/science/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) + if(has_taser_sprite && istype(ourborg.module_active, /obj/item/weapon/gun/energy/taser/xeno/robot)) + ourborg.add_overlay("[sprite_icon_state]-taser") + /datum/robot_sprite/dogborg/tall/science/do_equipment_glamour(var/obj/item/weapon/robot_module/module) if(!has_custom_equipment_sprites) return @@ -166,6 +172,7 @@ name = "Raptor V-4" sprite_icon_state = "raptor" has_custom_equipment_sprites = TRUE + has_taser_sprite = TRUE rest_sprite_options = list("Default", "Bellyup") /datum/robot_sprite/dogborg/tall/science/meka @@ -203,4 +210,4 @@ has_eye_light_sprites = TRUE has_custom_open_sprites = TRUE has_vore_belly_sprites = FALSE - rest_sprite_options = list("Default", "Bellyup") \ No newline at end of file + rest_sprite_options = list("Default", "Bellyup") diff --git a/code/modules/mob/living/silicon/robot/sprites/security.dm b/code/modules/mob/living/silicon/robot/sprites/security.dm index fb38d159f42..c42ea7279ed 100644 --- a/code/modules/mob/living/silicon/robot/sprites/security.dm +++ b/code/modules/mob/living/silicon/robot/sprites/security.dm @@ -182,10 +182,21 @@ module_type = "Security" sprite_icon = 'icons/mob/robot/security_large.dmi' + var/has_laser_sprite = FALSE + var/has_taser_sprite = FALSE + +/datum/robot_sprite/dogborg/tall/security/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) + if(has_laser_sprite && istype(ourborg.module_active, /obj/item/weapon/gun/energy/laser/mounted)) + ourborg.add_overlay("[sprite_icon_state]-laser") + if(has_taser_sprite && istype(ourborg.module_active, /obj/item/weapon/gun/energy/taser/mounted/cyborg)) + ourborg.add_overlay("[sprite_icon_state]-taser") + /datum/robot_sprite/dogborg/tall/security/raptor name = "Raptor V-4" sprite_icon_state = "raptor" has_custom_equipment_sprites = TRUE + has_laser_sprite = TRUE + has_taser_sprite = TRUE rest_sprite_options = list("Default", "Bellyup") /datum/robot_sprite/dogborg/tall/security/meka @@ -223,4 +234,4 @@ has_eye_light_sprites = TRUE has_custom_open_sprites = TRUE has_vore_belly_sprites = FALSE - rest_sprite_options = list("Default", "Bellyup") \ No newline at end of file + rest_sprite_options = list("Default", "Bellyup") diff --git a/code/modules/mob/living/silicon/robot/sprites/syndicate.dm b/code/modules/mob/living/silicon/robot/sprites/syndicate.dm index 685ebce2b27..2bc63bbe066 100644 --- a/code/modules/mob/living/silicon/robot/sprites/syndicate.dm +++ b/code/modules/mob/living/silicon/robot/sprites/syndicate.dm @@ -32,11 +32,6 @@ sprite_icon = 'icons/mob/robot/syndie_large.dmi' sprite_hud_icon_state = "malf" -/datum/robot_sprite/dogborg/tall/syndie/raptor - name = "Raptor V-4" - sprite_icon_state = "raptor" - rest_sprite_options = list("Default", "Bellyup") - /datum/robot_sprite/dogborg/tall/syndie/meka name = "MEKA" sprite_icon_state = "meka" @@ -112,6 +107,25 @@ sprite_icon_state = "k9" has_eye_light_sprites = TRUE +// Tall sprites + +/datum/robot_sprite/dogborg/tall/protector + module_type = "Protector" + sprite_icon = 'icons/mob/robot/syndie_large.dmi' + sprite_hud_icon_state = "malf" + + var/has_gun_sprite = FALSE + +/datum/robot_sprite/dogborg/tall/protector/handle_extra_icon_updates(var/mob/living/silicon/robot/ourborg) + if(has_gun_sprite && istype (ourborg.module_active, /obj/item/weapon/gun/energy/dakkalaser)) + ourborg.add_overlay("[sprite_icon_state]-gun") + +/datum/robot_sprite/dogborg/tall/protector/syndiprotraptor + name = "Raptor V-4" + sprite_icon_state = "syndiprotraptor" + has_eye_light_sprites = TRUE + has_gun_sprite = TRUE + rest_sprite_options = list("Default", "Bellyup") // Mechanist @@ -143,6 +157,18 @@ has_eye_light_sprites = TRUE rest_sprite_options = list("Default") +// Tall sprites + +/datum/robot_sprite/dogborg/tall/mechanist + module_type = "Mechanist" + sprite_icon = 'icons/mob/robot/syndie_large.dmi' + sprite_hud_icon_state = "malf" + +/datum/robot_sprite/dogborg/tall/mechanist/syndimechraptor + name = "Raptor V-4" + sprite_icon_state = "syndimechraptor" + has_eye_light_sprites = TRUE + rest_sprite_options = list("Default", "Bellyup") // Combat Medic @@ -183,3 +209,16 @@ sprite_icon_state = "vale" has_eye_light_sprites = TRUE has_sleeper_light_indicator = TRUE + +// Tall sprites + +/datum/robot_sprite/dogborg/tall/combat_medic + module_type = "Combat Medic" + sprite_icon = 'icons/mob/robot/syndie_large.dmi' + sprite_hud_icon_state = "malf" + +/datum/robot_sprite/dogborg/tall/combat_medic/syndimediraptor + name = "Raptor V-4" + sprite_icon_state = "syndimediraptor" + has_eye_light_sprites = TRUE + rest_sprite_options = list("Default", "Bellyup") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm index 618efee6dc4..c0bc4e310af 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_captive.dm @@ -9,7 +9,7 @@ if (src.client) if(client.prefs.muted & MUTE_IC) - to_chat(src, "You cannot speak in IC (muted).") + to_chat(src, span_red("You cannot speak in IC (muted).")) return if(istype(src.loc, /mob/living/simple_mob/animal/borer)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm index 39f3a27e874..f7b19810b76 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/borer/borer_powers.dm @@ -11,7 +11,7 @@ to_chat(src, "You cannot leave your host in your current state.") if(docile) - to_chat(src, "You are feeling far too docile to do that.") + to_chat(src, span_blue("You are feeling far too docile to do that.")) return if(!host || !src) return @@ -212,7 +212,7 @@ to_chat(src, "You cannot secrete chemicals in your current state.") if(docile) - to_chat(src, "You are feeling far too docile to do that.") + to_chat(src, span_blue("You are feeling far too docile to do that.")) return if(chemicals < 50) @@ -223,7 +223,7 @@ if(!chem || chemicals < 50 || !host || controlling || !src || stat) //Sanity check. return - to_chat(src, "You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.") + to_chat(src, span_red("You squirt a measure of [chem] from your reservoirs into [host]'s bloodstream.")) host.reagents.add_reagent(chem, 10) chemicals -= 50 @@ -261,8 +261,8 @@ to_chat(src, "You cannot infest someone who is already infested!") return - to_chat(src, "You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.") - to_chat(M, "You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.") + to_chat(src, span_red("You focus your psychic lance on [M] and freeze their limbs with a wave of terrible dread.")) + to_chat(M, span_red("You feel a creeping, horrible sense of dread come over you, freezing your limbs and setting your heart racing.")) M.Weaken(10) used_dominate = world.time @@ -281,7 +281,7 @@ return if(docile) - to_chat(src, "You are feeling far too docile to do that.") + to_chat(src, span_blue("You are feeling far too docile to do that.")) return to_chat(src, "You begin delicately adjusting your connection to the host brain...") @@ -292,8 +292,8 @@ return else - to_chat(src, "You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.") - to_chat(host, "You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.") + to_chat(src, span_red("You plunge your probosci deep into the cortex of the host brain, interfacing directly with their nervous system.")) + to_chat(host, span_red("You feel a strange shifting sensation behind your eyes as an alien consciousness displaces yours.")) host.add_language("Cortical Link") // host -> brain @@ -353,4 +353,4 @@ rejuvenate() restore_blood() fixblood() - update_canmove() \ No newline at end of file + update_canmove() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm index 224eac80e8f..bb31c1ef14f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/chicken.dm @@ -52,12 +52,12 @@ GLOBAL_VAR_INIT(chicken_count, 0) // How mant chickens DO we have? var/obj/item/weapon/reagent_containers/food/snacks/grown/G = O if(G.seed && G.seed.kitchen_tag == "wheat") if(!stat && eggsleft < 8) - user.visible_message("[user] feeds [O] to [name]! It clucks happily.","You feed [O] to [name]! It clucks happily.") + user.visible_message(span_blue("[user] feeds [O] to [name]! It clucks happily."),span_blue("You feed [O] to [name]! It clucks happily.")) user.drop_item() qdel(O) eggsleft += rand(1, 4) else - to_chat(user, "[name] doesn't seem hungry!") + to_chat(user, span_blue("[name] doesn't seem hungry!")) else to_chat(user, "[name] doesn't seem interested in that.") else diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm index 0ff6ee6496b..4fdd32500e2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/cow.dm @@ -35,9 +35,9 @@ user.visible_message("[user] milks [src] using \the [O].") var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) - to_chat(user, "The [O] is full.") + to_chat(user, span_red("The [O] is full.")) if(!transfered) - to_chat(user, "The udder is dry. Wait a bit longer...") + to_chat(user, span_red("The udder is dry. Wait a bit longer...")) else ..() @@ -69,4 +69,4 @@ emote_see = list("shakes its head") /decl/mob_organ_names/cow - hit_zones = list("head", "torso", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "udder") \ No newline at end of file + hit_zones = list("head", "torso", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "udder") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm index 477dcb5aa74..c172d0b6549 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/farm animals/goat.dm @@ -66,9 +66,9 @@ user.visible_message("[user] milks [src] using \the [O].") var/transfered = udder.trans_id_to(G, "milk", rand(5,10)) if(G.reagents.total_volume >= G.volume) - to_chat(user, "The [O] is full.") + to_chat(user, span_red("The [O] is full.")) if(!transfered) - to_chat(user, "The udder is dry. Wait a bit longer...") + to_chat(user, span_red("The udder is dry. Wait a bit longer...")) else ..() @@ -78,4 +78,4 @@ emote_see = list("shakes its head", "stamps a foot", "glares around") // say_got_target doesn't seem to handle emotes, but keeping this here in case someone wants to make it work -// say_got_target = list("[src] gets an evil-looking gleam in their eye.") \ No newline at end of file +// say_got_target = list("[src] gets an evil-looking gleam in their eye.") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index dcb5349ad2e..dd6b6db3cf5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -79,7 +79,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - M.visible_message("\icon[src][bicon(src)] Squeek!") + M.visible_message(span_blue("\icon[src][bicon(src)] Squeek!")) playsound(src, 'sound/effects/mouse_squeak.ogg', 35, 1) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm index 33acad33dfb..c9533951875 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm @@ -33,7 +33,7 @@ if(!stat) for(var/mob/M in viewers(user, null)) if ((M.client && !( M.blinded ))) - M.show_message("[user] baps [name] on the nose with the rolled up [O]") + M.show_message(span_blue("[user] baps [name] on the nose with the rolled up [O].")) spawn(0) for(var/i in list(1,2,4,8,4,2,1,2)) set_dir(i) @@ -103,7 +103,7 @@ //pupplies cannot wear anything. /mob/living/simple_mob/animal/passive/dog/corgi/puppy/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) - to_chat(usr, "You can't fit this on [src]") + to_chat(usr, span_red("You can't fit this on [src]!")) return ..() @@ -195,7 +195,7 @@ //Lisa already has a cute bow! /mob/living/simple_mob/animal/passive/dog/corgi/Lisa/Topic(href, href_list) if(href_list["remove_inv"] || href_list["add_inv"]) - to_chat(usr, "[src] already has a cute bow!") + to_chat(usr, span_red("[src] already has a cute bow!")) return ..() @@ -284,4 +284,4 @@ icon_dead = "brittany_dead" /decl/mob_organ_names/corgi - hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "tail", "heart") //You monster. \ No newline at end of file + hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "tail", "heart") //You monster. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm index 9dd02f083cf..167992f9cd8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/grafadreka.dm @@ -121,7 +121,7 @@ Field studies suggest analytical abilities on par with some species of cepholapo desc = "A large, sleek snow drake with heavy claws, powerful jaws and many pale spines along its body." player_msg = "You are a large Sivian pack predator in symbiosis with the local bioluminescent bacteria. You can eat glowing \ tree fruit to fuel your ranged spitting attack and poisonous bite (on harm intent), as well as healing saliva \ - (on help intent).
    There are humans moving through your territory; whether you help them get home safely, or treat them as a snack, \ + (on help intent).
    There are humans moving through your territory; whether you help them get home safely, or treat them as a snack, \ is up to you." color = "#608894" icon = 'icons/mob/drake_adult.dmi' diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm index 84733bac395..f939e1d3c7a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/mercs/mercs.dm @@ -135,7 +135,7 @@ /mob/living/simple_mob/humanoid/merc/melee/sword/bullet_act(var/obj/item/projectile/Proj) if(!Proj) return if(prob(35)) - visible_message("[src] blocks [Proj] with its shield!") + visible_message(span_red("[src] blocks [Proj] with its shield!")) if(Proj.firer) ai_holder.react_to_attack(Proj.firer) return diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm index f20d02b5c78..df9bed2d6a5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/shade.dm @@ -43,11 +43,11 @@ ..() for(var/mob/M in viewers(src, null)) if((M.client && !( M.blinded ))) - M.show_message("[src] lets out a contented sigh as their form unwinds.") + M.show_message(span_red("[src] lets out a contented sigh as their form unwinds.")) ghostize() qdel(src) return /decl/mob_organ_names/shade - hit_zones = list("spectral robe", "featureless visage", "haunting glow") \ No newline at end of file + hit_zones = list("spectral robe", "featureless visage", "haunting glow") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm index 7d32b7b3504..d3ad0c3c875 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/corrupt_hounds.dm @@ -71,7 +71,7 @@ vore_stomach_name = "fuel processor" vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..." - loot_list = list(/obj/item/borg/upgrade/syndicate = 6, /obj/item/borg/upgrade/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6) + loot_list = list(/obj/item/borg/upgrade/basic/syndicate = 6, /obj/item/borg/upgrade/basic/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6) /mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi name = "corrupt corrupt hound" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm index e6c84387c80..2ff98138eb9 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm @@ -57,7 +57,7 @@ var/mob/living/target = pick(potentials) if(istype(target) && target.devourable && target.can_be_drop_prey && vore_selected) target.forceMove(vore_selected) - to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") // Do this after the potential vore, so we get the belly update_icon() @@ -201,10 +201,10 @@ var/mob/living/target = pick(potentials) if(istype(target) && target.devourable && target.can_be_drop_prey && vore_selected) target.forceMove(vore_selected) - to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") // Do this after the potential vore, so we get the belly update_icon() shift_state = AB_SHIFT_NONE - last_shift = world.time \ No newline at end of file + last_shift = world.time diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm index 540aaaa156b..f5e93af8220 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/dominated_brain.dm @@ -197,6 +197,9 @@ if(!pred.ckey) to_chat(prey, "\The [pred] isn't able to be dominated.") return + if(isrobot(pred) && jobban_isbanned(prey, "Cyborg")) + to_chat(prey, "Forces beyond your comprehension forbid you from taking control of [pred].") + return if(prey.prey_controlled) to_chat(prey, "You are already controlling someone, you can't control anyone else at this time.") return @@ -421,17 +424,20 @@ var/mob/living/pred = src if(prey.stat == DEAD) - to_chat(prey, "You cannot do that to this prey.") + to_chat(pred, "You cannot do that to this prey.") return if(!prey.ckey) - to_chat(prey, "\The [prey] cannot take control.") + to_chat(pred, "\The [prey] cannot take control.") + return + if(isrobot(pred) && jobban_isbanned(prey, "Cyborg")) + to_chat(pred, "Forces beyond your comprehension prevent you from giving [prey] control.") return if(prey.prey_controlled) - to_chat(prey, "\The [prey] is already under someone's control and cannot be given control of your body.") + to_chat(pred, "\The [prey] is already under someone's control and cannot be given control of your body.") return if(pred.prey_controlled) - to_chat(prey, "You are already controlling someone's body.") + to_chat(pred, "You are already controlling someone's body.") return if(tgui_alert(pred, "You are attempting to give [prey] control over you, are you sure? Ensure that their preferences align with this kind of play.", "Give Prey Control",list("No","Yes")) != "Yes") return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm index e6bacc0ed1e..e6fee921b79 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/mimic.dm @@ -31,7 +31,7 @@ mimic_active = FALSE if(prob(mimic_chance)) var/mob/living/simple_mob/vore/aggressive/mimic/new_mimic = new(loc, src) - visible_message("[new_mimic] suddenly growls as it turns out to be a mimic!") + visible_message(span_red("[new_mimic] suddenly growls as it turns out to be a mimic!")) forceMove(new_mimic) new_mimic.real_crate = src new_mimic.name = name @@ -52,7 +52,7 @@ /obj/structure/closet/crate/mimic/damage(var/damage) if(contents.len) - visible_message("[src] makes out a crunchy noise as its contents are destroyed!") + visible_message(span_red("[src] makes out a crunchy noise as its contents are destroyed!")) for(var/obj/O in src.contents) qdel(O) ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm index 5fac8585273..6d3d58f40ac 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/morph/morph.dm @@ -221,7 +221,7 @@ if(target.buckled) target.buckled.unbuckle_mob(target, force = TRUE) target.forceMove(vore_selected) - to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + to_chat(target,"\The [src] quickly engulfs you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") else ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm index ec1161630a6..d094bd91143 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/shadekin/ability_procs.dm @@ -45,7 +45,7 @@ var/mob/living/target = pick(potentials) if(istype(target) && target.devourable && target.can_be_drop_prey && vore_selected) target.forceMove(vore_selected) - to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") + to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") // Do this after the potential vore, so we get the belly update_icon() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 398c748ccce..099ddfde0f6 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -18,10 +18,10 @@ tgui_alert_async(usr, "You appear to have logged in with another key this round, which is not permitted. Please contact an administrator if you believe this message to be in error.") if(matches) if(M.client) - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)].", 1) + message_admins("[span_red("Notice: ")][span_blue("[key_name_admin(src)] has the same [matches] as [key_name_admin(M)].")]", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)].") else - message_admins("Notice: [key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ", 1) + message_admins("[span_red("Notice: ")][span_blue("[key_name_admin(src)] has the same [matches] as [key_name_admin(M)] (no longer logged in). ")]", 1) log_adminwarn("Notice: [key_name(src)] has the same [matches] as [key_name(M)] (no longer logged in).") /mob/Login() @@ -83,4 +83,4 @@ if(cloaked && cloaked_selfimage) client.images += cloaked_selfimage - SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) \ No newline at end of file + SEND_SIGNAL(src, COMSIG_MOB_CLIENT_LOGIN, client) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 05a631b1b48..cb66434897b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -70,8 +70,10 @@ to_chat(src, "... You can almost hear someone talking ...") else if(client && client.prefs.chat_timestamp) - msg = replacetext(msg, new/regex("^(]*)?>)((?:.|\\n)*
    )", ""), "$1[time] $2") - to_chat(src,msg) + // TG-Chat filters latch directly to the spans, we no longer need that + //msg = replacetext(msg, new/regex("^(]*)?>)((?:.|\\n)*)", ""), "$1[time] $2") // Insteres timestamps after the first qualifying span + //msg = replacetext(msg, new/regex("^\[^<]((?:.|\\n)*)", ""), "[time] $1") // Spanless messages also get timestamped + to_chat(src,"[time] [msg]") else if(teleop) to_chat(teleop, create_text_tag("body", "BODY:", teleop.client) + "[msg]") else @@ -458,7 +460,7 @@ if(client.holder && (client.holder.rights & R_ADMIN|R_EVENT)) is_admin = 1 else if(stat != DEAD || istype(src, /mob/new_player)) - to_chat(usr, "You must be observing to use this!") + to_chat(usr, "[span_blue("You must be observing to use this!")]") return if(is_admin && stat == DEAD) @@ -609,7 +611,7 @@ playsound(src.loc, 'sound/weapons/thudswoosh.ogg', 25) //Quieter than hugging/grabbing but we still want some audio feedback if(H.pull_damage()) - to_chat(src, "Pulling \the [H] in their current condition would probably be a bad idea.") + to_chat(src, "[span_red("Pulling \the [H] in their current condition would probably be a bad idea.")]") //Attempted fix for people flying away through space when cuffed and dragged. if(ismob(AM)) @@ -691,6 +693,7 @@ stat("Keys Held", keys2text(client.move_keys_held | client.mod_keys_held)) stat("Next Move ADD", dirs2text(client.next_move_dir_add)) stat("Next Move SUB", dirs2text(client.next_move_dir_sub)) + stat("Current size:", size_multiplier * 100) if(statpanel("MC")) stat("Location:", "([x], [y], [z]) [loc]") diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 6cbb6240123..ea3802856fc 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -45,7 +45,7 @@ var/mob/living/carbon/C = usr C.toggle_throw_mode() else - to_chat(usr, "This mob type cannot throw items.") + to_chat(usr, span_red("This mob type cannot throw items.")) return if(NORTHWEST) if(isliving(usr)) @@ -54,11 +54,11 @@ if(C.pulling) C.stop_pulling() return - to_chat(usr, "You have nothing to drop in your hand.") + to_chat(usr, span_red("You have nothing to drop in your hand.")) return drop_item() else - to_chat(usr, "This mob type cannot drop items.") + to_chat(usr, span_red("This mob type cannot drop items.")) return //This gets called when you press the delete button. @@ -66,7 +66,7 @@ set hidden = 1 if(!usr.pulling) - to_chat(usr, "You are not pulling anything.") + to_chat(usr, span_blue("You are not pulling anything.")) return usr.stop_pulling() @@ -225,13 +225,13 @@ for(var/mob/M in range(my_mob, 1)) if(M.pulling == my_mob) if(!M.restrained() && M.stat == 0 && M.canmove && my_mob.Adjacent(M)) - to_chat(src, "You're restrained! You can't move!") + to_chat(src, span_blue("You're restrained! You can't move!")) return 0 else M.stop_pulling() if(my_mob.pinned.len) - to_chat(src, "You're pinned to a wall by [my_mob.pinned[1]]!") + to_chat(src, span_blue("You're pinned to a wall by [my_mob.pinned[1]]!")) return 0 if(istype(my_mob.buckled, /obj/vehicle) || ismob(my_mob.buckled)) diff --git a/code/modules/mob/mob_transformation_simple.dm b/code/modules/mob/mob_transformation_simple.dm index 25347558735..f32ae4aa749 100644 --- a/code/modules/mob/mob_transformation_simple.dm +++ b/code/modules/mob/mob_transformation_simple.dm @@ -5,7 +5,7 @@ /mob/proc/change_mob_type(var/new_type = null, var/turf/location = null, var/new_name = null as text, var/delete_old_mob = 0 as num, var/subspecies) if(istype(src,/mob/new_player)) - to_chat(usr, "cannot convert players who have not entered yet.") + to_chat(usr, span_red("cannot convert players who have not entered yet.")) return if(!new_type) @@ -19,7 +19,7 @@ return if( new_type == /mob/new_player ) - to_chat(usr, "cannot convert into a new_player mob type.") + to_chat(usr, span_red("cannot convert into a new_player mob type.")) return var/mob/M diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 16b5bf9377b..f2b867f5d3c 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -195,7 +195,7 @@ if(href_list["late_join"]) if(!ticker || ticker.current_state != GAME_STATE_PLAYING) - to_chat(usr, "The round is either not ready, or has already finished...") + to_chat(usr, span_red("The round is either not ready, or has already finished...")) return var/time_till_respawn = time_till_respawn() @@ -428,7 +428,7 @@ if (src != usr) return 0 if(!ticker || ticker.current_state != GAME_STATE_PLAYING) - to_chat(usr, "The round is either not ready, or has already finished...") + to_chat(usr, span_red("The round is either not ready, or has already finished...")) return 0 if(!config.enter_allowed) to_chat(usr, "There is an administrative lock on entering the game!") diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm index e4f42774e90..7476783a12e 100644 --- a/code/modules/mob/new_player/poll.dm +++ b/code/modules/mob/new_player/poll.dm @@ -103,7 +103,7 @@ break if(!found) - to_chat(usr, "Poll question details not found.") + to_chat(usr, span_red("Poll question details not found.")) return switch(polltype) @@ -360,7 +360,7 @@ break if(!validpoll) - to_chat(usr, "Poll is not valid.") + to_chat(usr, span_red("Poll is not valid.")) return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]") @@ -373,7 +373,7 @@ break if(!validoption) - to_chat(usr, "Poll option is not valid.") + to_chat(usr, span_red("Poll option is not valid.")) return var/alreadyvoted = 0 @@ -387,11 +387,11 @@ break if(!multichoice && alreadyvoted) - to_chat(usr, "You already voted in this poll.") + to_chat(usr, span_red("You already voted in this poll.")) return if(multichoice && (alreadyvoted >= multiplechoiceoptions)) - to_chat(usr, "You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error.") + to_chat(usr, span_red("You already have more than [multiplechoiceoptions] logged votes on this poll. Enough is enough. Contact the database admin if this is an error.")) return var/adminrank = "Player" @@ -402,7 +402,7 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]')") insert_query.Execute() - to_chat(usr, "Vote successful.") + to_chat(usr, span_blue("Vote successful.")) usr << browse(null,"window=playerpoll") @@ -427,7 +427,7 @@ break if(!validpoll) - to_chat(usr, "Poll is not valid.") + to_chat(usr, span_red("Poll is not valid.")) return var/alreadyvoted = 0 @@ -440,7 +440,7 @@ break if(alreadyvoted) - to_chat(usr, "You already sent your feedback for this poll.") + to_chat(usr, span_red("You already sent your feedback for this poll.")) return var/adminrank = "Player" @@ -460,7 +460,7 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_textreply (id ,datetime ,pollid ,ckey ,ip ,replytext ,adminrank) VALUES (null, Now(), [pollid], '[usr.ckey]', '[usr.client.address]', '[replytext]', '[adminrank]')") insert_query.Execute() - to_chat(usr, "Feedback logging successful.") + to_chat(usr, span_blue("Feedback logging successful.")) usr << browse(null,"window=playerpoll") @@ -485,7 +485,7 @@ break if(!validpoll) - to_chat(usr, "Poll is not valid.") + to_chat(usr, span_red("Poll is not valid.")) return var/DBQuery/select_query2 = dbcon.NewQuery("SELECT id FROM erro_poll_option WHERE id = [optionid] AND pollid = [pollid]") @@ -498,7 +498,7 @@ break if(!validoption) - to_chat(usr, "Poll option is not valid.") + to_chat(usr, span_red("Poll option is not valid.")) return var/alreadyvoted = 0 @@ -511,7 +511,7 @@ break if(alreadyvoted) - to_chat(usr, "You already voted in this poll.") + to_chat(usr, span_red("You already voted in this poll.")) return var/adminrank = "Player" @@ -522,5 +522,5 @@ var/DBQuery/insert_query = dbcon.NewQuery("INSERT INTO erro_poll_vote (id ,datetime ,pollid ,optionid ,ckey ,ip ,adminrank, rating) VALUES (null, Now(), [pollid], [optionid], '[usr.ckey]', '[usr.client.address]', '[adminrank]', [(isnull(rating)) ? "null" : rating])") insert_query.Execute() - to_chat(usr, "Vote successful.") - usr << browse(null,"window=playerpoll") \ No newline at end of file + to_chat(usr, span_blue("Vote successful.")) + usr << browse(null,"window=playerpoll") diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index eec138c412c..d728e90537f 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -29,7 +29,7 @@ set category = "IC" if(say_disabled) //This is here to try to identify lag problems - to_chat(usr, "Speech is currently admin-disabled.") + to_chat(usr, span_red("Speech is currently admin-disabled.")) return //VOREStation Addition Start if(forced_psay) diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index e012ed4b1a6..5ec03364d16 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -157,12 +157,6 @@ var/mob/living/silicon/robot/O = new /mob/living/silicon/robot( loc ) - // cyborgs produced by Robotize get an automatic power cell - O.cell = new(O) - O.cell.maxcharge = 7500 - O.cell.charge = 7500 - - O.gender = gender O.invisibility = 0 @@ -254,7 +248,7 @@ var/mobpath = tgui_input_list(usr, "Which type of mob should [src] turn into?", "Choose a type", mobtypes) if(!safe_animal(mobpath)) - to_chat(usr, "Sorry but this mob type is currently unavailable.") + to_chat(usr, span_red("Sorry but this mob type is currently unavailable.")) return if(transforming) @@ -288,7 +282,7 @@ var/mobpath = tgui_input_list(usr, "Which type of mob should [src] turn into?", "Choose a type", mobtypes) if(!safe_animal(mobpath)) - to_chat(usr, "Sorry but this mob type is currently unavailable.") + to_chat(usr, span_red("Sorry but this mob type is currently unavailable.")) return var/mob/new_mob = new mobpath(src.loc) @@ -337,6 +331,3 @@ //Not in here? Must be untested! return 0 - - - diff --git a/code/modules/multiz/movement_vr.dm b/code/modules/multiz/movement_vr.dm index db9057d6c0a..c77ab2c0412 100644 --- a/code/modules/multiz/movement_vr.dm +++ b/code/modules/multiz/movement_vr.dm @@ -48,11 +48,11 @@ pred.loc = fallloc if(!safe_fall) pred.Weaken(8) - pred.visible_message("\The [pred] falls right onto \the [prey]!") + pred.visible_message("\The [pred] falls right onto \the [prey]!") else if(prey.vore_selected && prey.can_be_drop_pred && pred.can_be_drop_prey && pred.drop_vore && prey.drop_vore) prey.feed_grabbed_to_self_falling_nom(prey,pred) prey.Weaken(4) - prey.visible_message("\The [pred] falls right into \the [prey]!") + prey.visible_message("\The [pred] falls right into \the [prey]!") else pred.loc = prey.loc if(!safe_fall) diff --git a/code/modules/news/new_newspaper.dm b/code/modules/news/new_newspaper.dm index 3962f80cf4e..d84a2a53c4c 100644 --- a/code/modules/news/new_newspaper.dm +++ b/code/modules/news/new_newspaper.dm @@ -132,7 +132,7 @@ obj/item/weapon/newspaper/Topic(href, href_list) obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user) if(istype(W, /obj/item/weapon/pen)) if(scribble_page == curr_page) - to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + to_chat(user, span_blue("There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")) else var/s = sanitize(tgui_input_text(user, "Write something", "Newspaper", "")) s = sanitize(s) diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm index 9eae4b19eef..d58b9446b22 100644 --- a/code/modules/news/newspaper.dm +++ b/code/modules/news/newspaper.dm @@ -133,7 +133,7 @@ /obj/item/weapon/newspaper/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen)) if(scribble_page == curr_page) - to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") + to_chat(user, span_blue("There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?")) else var/s = sanitize(tgui_input_text(user, "Write something", "Newspaper", "")) s = sanitize(s) @@ -144,4 +144,4 @@ scribble_page = curr_page scribble = s attack_self(user) - return \ No newline at end of file + return diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 9d36c005d0f..7d820c54f18 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -118,10 +118,10 @@ var/const/CE_STABLE_THRESHOLD = 0.5 pale = 1 update_icons_body() var/word = pick("dizzy","woozy","faint","disoriented","unsteady") - to_chat(src, "You feel slightly [word]") + to_chat(src, span_red("You feel slightly [word]")) if(prob(1)) var/word = pick("dizzy","woozy","faint","disoriented","unsteady") - to_chat(src, "You feel [word]") + to_chat(src, span_red("You feel [word]")) if(getOxyLoss() < 20 * threshold_coef) adjustOxyLoss(3 * dmg_coef) else if(blood_volume_raw >= species.blood_volume*species.blood_level_danger) @@ -135,13 +135,13 @@ var/const/CE_STABLE_THRESHOLD = 0.5 if(prob(15)) Paralyse(rand(1,3)) var/word = pick("dizzy","woozy","faint","disoriented","unsteady") - to_chat(src, "You feel dangerously [word]") + to_chat(src, span_red("You feel dangerously [word]")) else if(blood_volume_raw >= species.blood_volume*species.blood_level_fatal) adjustOxyLoss(5 * dmg_coef) // adjustToxLoss(3 * dmg_coef) if(prob(15)) var/word = pick("dizzy","woozy","faint","disoriented","unsteady") - to_chat(src, "You feel extremely [word]") + to_chat(src, span_red("You feel extremely [word]")) else //Not enough blood to survive (usually) if(!pale) pale = 1 diff --git a/code/modules/organs/internal/robotic/heatsink.dm b/code/modules/organs/internal/robotic/heatsink.dm index 2309a9b7c28..48d7b17053b 100644 --- a/code/modules/organs/internal/robotic/heatsink.dm +++ b/code/modules/organs/internal/robotic/heatsink.dm @@ -7,7 +7,6 @@ /obj/item/organ/internal/robotic/heatsink/handle_organ_proc_special() if(owner && owner.stat != DEAD) - owner.bodytemperature += round(owner.robobody_count * 0.75, 0.1) var/thermostat = owner.species.body_temperature var/turf/T = get_turf(src) @@ -17,7 +16,10 @@ var/env_temp = get_environment_temperature() var/thermal_protection = owner.get_heat_protection(env_temp) - if(thermal_protection < 1) + if(!efficiency) + owner.bodytemperature -= round(owner.robobody_count * (1 - damage / max_damage), 0.1) // We are dissipating added heat under normal conditions and without damage + + if(thermal_protection < 0.99) temp_adj = min(owner.bodytemperature - max(thermostat, env_temp), owner.robobody_count * 2) else temp_adj = min(owner.bodytemperature - thermostat, owner.robobody_count * 2) @@ -27,9 +29,12 @@ owner.bodytemperature -= temp_adj*efficiency - if(owner.bodytemperature > owner.species.heat_level_2) // If you're already overheating to the point of melting, the heatsink starts causing problems. + if(owner.bodytemperature > owner.species.heat_level_3) // If you're already overheating to the point of melting, the heatsink starts causing problems. owner.adjustToxLoss(2 * damage / max_damage) take_damage(max(0.5,round(damage / max_damage, 0.1))) + else if (owner.bodytemperature > owner.species.heat_level_2) + owner.adjustToxLoss(damage / max_damage) + take_damage(max(0.25,round(damage / max_damage, 0.1))) return @@ -54,6 +59,6 @@ return owner.species.heat_level_2 * efficiency if(!environment) - return owner.species.heat_level_2 * efficiency + return owner.species.heat_level_2 return environment.temperature diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index f4f86289b01..f12ee1a2d04 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -432,7 +432,7 @@ qdel(src) else - to_chat(user, "You must hold \the [P] steady to burn \the [src].") + to_chat(user, span_red("You must hold \the [P] steady to burn \the [src].")) /obj/item/weapon/paper/Topic(href, href_list) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 287927a6d34..cad2cff56ff 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -94,7 +94,7 @@ qdel(src) else - to_chat(user, "You must hold \the [P] steady to burn \the [src].") + to_chat(user, span_red("You must hold \the [P] steady to burn \the [src].")) /obj/item/weapon/paper_bundle/examine(mob/user) . = ..() @@ -243,4 +243,4 @@ if(photo) desc += "\nThere is a photo attached to it." add_overlay(image('icons/obj/bureaucracy.dmi', "clip")) - return \ No newline at end of file + return diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 5ce9eacd998..fcaa6ca414b 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -230,7 +230,7 @@ toner-- if(toner == 0) playsound(src, "sound/machines/buzz-sigh.ogg", 100) - visible_message("A red light on \the [src] flashes, indicating that it is out of toner.") + visible_message("A [span_red("red")] light on \the [src] flashes, indicating that it is out of toner.") return c diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index 189f0295015..aab380fe487 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -156,12 +156,12 @@ src.anchored = FALSE disconnect_from_network() else - to_chat(user, "Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!") + to_chat(user, span_red("Once bolted and linked to a shielding unit it the [src.name] is unable to be moved!")) return if(istype(W, /obj/item/weapon/am_containment)) if(fueljar) - to_chat(user, "There is already a [fueljar] inside!") + to_chat(user, span_red("There is already a [fueljar] inside!")) return fueljar = W user.remove_from_mob(W) @@ -327,4 +327,4 @@ check_core_stability() updateDialog() - return \ No newline at end of file + return diff --git a/code/modules/power/antimatter/engine.dm b/code/modules/power/antimatter/engine.dm index c76f329b50d..224c12e3819 100644 --- a/code/modules/power/antimatter/engine.dm +++ b/code/modules/power/antimatter/engine.dm @@ -109,7 +109,7 @@ antiH_fuel = residual_matter for(var/mob/M in hearers(src, null)) - M.show_message(text("You hear a loud bang!")) + M.show_message(span_red(text("You hear a loud bang!"))) //Q = k x (delta T) @@ -161,7 +161,7 @@ if(energy > convert2energy(8e-12)) //TOO MUCH ENERGY for(var/mob/M in hearers(src, null)) - M.show_message(text("You hear a loud whirring!")) + M.show_message(span_red(text("You hear a loud whirring!"))) sleep(20) //Q = k x (delta T) @@ -180,7 +180,7 @@ if(energy > convert2energy(8e-12)) //FAR TOO MUCH ENERGY STILL for(var/mob/M in hearers(src, null)) - M.show_message(text("BANG!")) + M.show_message(span_red(text("BANG!"))) new /obj/effect/bhole(src.loc) else //this amount of energy is okay so it does the proper output thing diff --git a/code/modules/power/antimatter/fuel.dm b/code/modules/power/antimatter/fuel.dm index bd78186a96f..9d94e80c441 100644 --- a/code/modules/power/antimatter/fuel.dm +++ b/code/modules/power/antimatter/fuel.dm @@ -77,7 +77,7 @@ if("Anti-Hydrogen") M.gib() //Yikes! if("Hydrogen") - to_chat(M, "You feel very light, as if you might just float away...") + to_chat(M, span_blue("You feel very light, as if you might just float away...")) qdel(src) return @@ -96,5 +96,5 @@ return else for(var/mob/O in viewers(M, null)) - O.show_message(text("[M] ate the [content ? content : "empty canister"]!"), 1) + O.show_message(span_red(text("[M] ate the [content ? content : "empty canister"]!")), 1) src.injest(M) diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 3dc9e97af3b..753ed9c7886 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -68,7 +68,7 @@ /obj/machinery/am_shielding/Destroy() if(control_unit) control_unit.remove_shielding(src) if(processing) shutdown_core() - visible_message("The [src.name] melts!") + visible_message(span_red("The [src.name] melts!")) //Might want to have it leave a mess on the floor but no sprites for now ..() return @@ -202,4 +202,4 @@ qdel(src) return ..() - return \ No newline at end of file + return diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 2dffe3c228f..1b2e03cb749 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -53,18 +53,18 @@ /obj/machinery/power/breakerbox/attack_ai(mob/user) if(update_locked) - to_chat(user, "System locked. Please try again later.") + to_chat(user, span_red("System locked. Please try again later.")) return if(busy) - to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.") + to_chat(user, span_red("System is busy. Please wait until current operation is finished before changing power settings.")) return busy = 1 - to_chat(user, "Updating power settings...") + to_chat(user, span_green("Updating power settings...")) if(do_after(user, 50)) set_state(!on) - to_chat(user, "Update Completed. New setting:[on ? "on": "off"]") + to_chat(user, span_green("Update Completed. New setting:[on ? "on": "off"]")) update_locked = 1 spawn(600) update_locked = 0 @@ -73,16 +73,16 @@ /obj/machinery/power/breakerbox/attack_hand(mob/user) if(update_locked) - to_chat(user, "System locked. Please try again later.") + to_chat(user, span_red("System locked. Please try again later.")) return if(busy) - to_chat(user, "System is busy. Please wait until current operation is finished before changing power settings.") + to_chat(user, span_red("System is busy. Please wait until current operation is finished before changing power settings.")) return busy = 1 for(var/mob/O in viewers(user)) - O.show_message(text("[user] started reprogramming [src]!"), 1) + O.show_message(span_red(text("[user] started reprogramming [src]!")), 1) if(do_after(user, 50)) set_state(!on) @@ -102,7 +102,7 @@ RCon_tag = newtag to_chat(user, "You changed the RCON tag to: [newtag]") if(on) - to_chat(user, "Disable the breaker before performing maintenance.") + to_chat(user, span_red("Disable the breaker before performing maintenance.")) return if(default_deconstruction_screwdriver(user, W)) return @@ -152,4 +152,4 @@ update_locked = 0 /obj/machinery/power/breakerbox/process() - return 1 \ No newline at end of file + return 1 diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 0b06dfbf31f..00e855e0479 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -985,7 +985,7 @@ var/list/possible_cable_coil_colours = list( var/obj/item/stack/cable_coil/CC = new/obj/item/stack/cable_coil(user.loc) CC.amount = N CC.update_icon() - to_chat(user,"You take [N] units of wire from the [src].") + to_chat(user,span_blue("You take [N] units of wire from the [src].")) if (CC) user.put_in_hands(CC) src.add_fingerprint(user) diff --git a/code/modules/power/cable_heavyduty.dm b/code/modules/power/cable_heavyduty.dm index e37a8755d66..cc0cdcd6a19 100644 --- a/code/modules/power/cable_heavyduty.dm +++ b/code/modules/power/cable_heavyduty.dm @@ -18,13 +18,13 @@ return if(W.has_tool_quality(TOOL_WIRECUTTER)) - to_chat(usr, "These cables are too tough to be cut with those [W.name].") + to_chat(usr, span_blue("These cables are too tough to be cut with those [W.name].")) return else if(istype(W, /obj/item/stack/cable_coil)) - to_chat(usr, "You will need heavier cables to connect to these.") + to_chat(usr, span_blue("You will need heavier cables to connect to these.")) return else ..() /obj/structure/cable/heavyduty/cableColor(var/colorC) - return \ No newline at end of file + return diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index 381ac483cca..4054c422c6e 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -38,7 +38,7 @@ * Robot */ /obj/item/weapon/cell/robot_station - name = "A standard robot power cell" + name = "standard robot power cell" maxcharge = 7500 /* @@ -75,7 +75,7 @@ * Syndicate */ /obj/item/weapon/cell/robot_syndi - name = "A syndicate robot power cell" + name = "syndicate robot power cell" description_fluff = "Almost as good as a hyper." icon_state = "super" //We don't want roboticists confuse it with a low standard cell maxcharge = 25000 diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index a4936bf65e5..29153d04832 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -785,7 +785,7 @@ var/global/list/light_type_cache = list() if(H.species.can_shred(H)) user.setClickCooldown(user.get_attack_speed()) for(var/mob/M in viewers(src)) - M.show_message("[user.name] smashed the light!", 3, "You hear a tinkle of breaking glass", 2) + M.show_message(span_red("[user.name] smashed the light!"), 3, "You hear a tinkle of breaking glass", 2) broken() return @@ -1173,7 +1173,7 @@ var/global/list/light_type_cache = list() /obj/item/weapon/light/proc/shatter() if(status == LIGHT_OK || status == LIGHT_BURNED) - src.visible_message("[name] shatters."," You hear a small glass object shatter.") + src.visible_message(span_red("[name] shatters."),span_red("You hear a small glass object shatter.")) status = LIGHT_BROKEN force = 5 sharp = TRUE diff --git a/code/modules/power/pacman2.dm b/code/modules/power/pacman2.dm index 27f86867edb..9471665d470 100644 --- a/code/modules/power/pacman2.dm +++ b/code/modules/power/pacman2.dm @@ -63,28 +63,28 @@ attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/weapon/tank/phoron)) if(P) - to_chat(user, "The generator already has a phoron tank loaded!") + to_chat(user, span_red("The generator already has a phoron tank loaded!")) return P = O user.drop_item() O.loc = src - to_chat(user, "You add the phoron tank to the generator.") + to_chat(user, span_blue("You add the phoron tank to the generator.")) else if(!active) if(O.has_tool_quality(TOOL_WRENCH)) anchored = !anchored playsound(src, 'sound/items/Deconstruct.ogg', 50, 1) if(anchored) - to_chat(user, "You secure the generator to the floor.") + to_chat(user, span_blue("You secure the generator to the floor.")) else - to_chat(user, "You unsecure the generator from the floor.") + to_chat(user, span_blue("You unsecure the generator from the floor.")) SSmachines.makepowernets() else if(O.has_tool_quality(TOOL_SCREWDRIVER)) open = !open playsound(src, O.usesound, 50, 1) if(open) - to_chat(user, "You open the access panel.") + to_chat(user, span_blue("You open the access panel.")) else - to_chat(user, "You close the access panel.") + to_chat(user, span_blue("You close the access panel.")) else if(O.has_tool_quality(TOOL_CROWBAR) && !open) playsound(src, O.usesound, 50, 1) var/obj/machinery/constructable_frame/machine_frame/new_frame = new /obj/machinery/constructable_frame/machine_frame(src.loc) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 59abb2cca7a..fcaea3b8994 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -54,17 +54,17 @@ var/global/list/rad_collectors = list() investigate_log("turned [active?"on":"off"] by [user.key]. [P?"Fuel: [round(P.air_contents.gas["phoron"]/0.29)]%":"It is empty"].","singulo") return else - to_chat(user, "The controls are locked!") + to_chat(user, span_red("The controls are locked!")) return /obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/weapon/tank/phoron)) if(!src.anchored) - to_chat(user, "The [src] needs to be secured to the floor first.") + to_chat(user, span_red("The [src] needs to be secured to the floor first.")) return 1 if(src.P) - to_chat(user, "There's already a phoron tank loaded.") + to_chat(user, span_red("There's already a phoron tank loaded.")) return 1 user.drop_item() src.P = W @@ -77,7 +77,7 @@ var/global/list/rad_collectors = list() return 1 else if(W.has_tool_quality(TOOL_WRENCH)) if(P) - to_chat(user, "Remove the phoron tank first.") + to_chat(user, span_blue("Remove the phoron tank first.")) return 1 playsound(src, W.usesound, 75, 1) src.anchored = !src.anchored @@ -96,9 +96,9 @@ var/global/list/rad_collectors = list() to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") else src.locked = 0 //just in case it somehow gets locked - to_chat(user, "The controls can only be locked when the [src] is active.") + to_chat(user, span_red("The controls can only be locked when the [src] is active.")) else - to_chat(user, "Access denied!") + to_chat(user, span_red("Access denied!")) return 1 return ..() @@ -157,4 +157,3 @@ var/global/list/rad_collectors = list() flick("ca_deactive", src) update_icons() return - diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index 17c4d770e41..657f0a23735 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -133,13 +133,13 @@ field_generator power level display "You hear ratchet") src.anchored = FALSE if(2) - to_chat(user, "The [src.name] needs to be unwelded from the floor.") + to_chat(user, span_red("The [src.name] needs to be unwelded from the floor.")) return else if(W.has_tool_quality(TOOL_WELDER)) var/obj/item/weapon/weldingtool/WT = W.get_welder() switch(state) if(0) - to_chat(user, "The [src.name] needs to be wrenched to the floor.") + to_chat(user, span_red("The [src.name] needs to be wrenched to the floor.")) return if(1) if (WT.remove_fuel(0,user)) @@ -227,7 +227,7 @@ field_generator power level display return 1 else for(var/mob/M in viewers(src)) - M.show_message("\The [src] shuts down!") + M.show_message(span_red("\The [src] shuts down!")) turn_off() log_game("FIELDGEN([x],[y],[z]) Lost power and was ON.") investigate_log("ran out of power and deactivated","singulo") diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 47bd37f0081..902616f9342 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -348,7 +348,7 @@ total_system_failure(failure_probability, user) return - to_chat(user, "You have disassembled the SMES cell!") + to_chat(user, span_red("You have disassembled the SMES cell!")) dismantle() return @@ -367,4 +367,4 @@ W.loc = src recalc_coils() else - to_chat(user, "You can't insert more coils into this SMES unit!") + to_chat(user, span_red("You can't insert more coils into this SMES unit!")) diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 97d9ff488bc..179b6e7b786 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -416,7 +416,7 @@ GLOBAL_LIST_EMPTY(solars_list) playsound(src, I.usesound, 50, 1) if(do_after(user, 20)) if (src.stat & BROKEN) - to_chat(user, "The broken glass falls out.") + to_chat(user, span_blue("The broken glass falls out.")) var/obj/structure/frame/A = new /obj/structure/frame/computer( src.loc ) new /obj/item/weapon/material/shard( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) @@ -428,7 +428,7 @@ GLOBAL_LIST_EMPTY(solars_list) A.anchored = TRUE qdel(src) else - to_chat(user, "You disconnect the monitor.") + to_chat(user, span_blue("You disconnect the monitor.")) var/obj/structure/frame/A = new /obj/structure/frame/computer( src.loc ) var/obj/item/weapon/circuitboard/solar_control/M = new /obj/item/weapon/circuitboard/solar_control( A ) for (var/obj/C in src) diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 45ca8fb603e..4c94888c836 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -48,7 +48,7 @@ /obj/machinery/power/supermatter name = "Supermatter" - desc = "A strangely translucent and iridescent crystal. You get headaches just from looking at it." + desc = "A strangely translucent and iridescent crystal. You get headaches just from looking at it." icon = 'icons/obj/supermatter.dmi' icon_state = "darkmatter" plane = MOB_PLANE // So people can walk behind the top part @@ -515,7 +515,7 @@ /obj/machinery/power/supermatter/shard //Small subtype, less efficient and more sensitive, but less boom. name = "Supermatter Shard" - desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it." + desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it." icon_state = "darkmatter_shard" base_icon_state = "darkmatter_shard" diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index a09e7cfb612..2330a4dad1a 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -33,18 +33,18 @@ /obj/item/ammo_casing/attackby(obj/item/I as obj, mob/user as mob) if(I.has_tool_quality(TOOL_SCREWDRIVER)) if(!BB) - to_chat(user, "There is no bullet in the casing to inscribe anything into.") + to_chat(user, span_blue("There is no bullet in the casing to inscribe anything into.")) return var/tmp_label = "" var/label_text = sanitizeSafe(tgui_input_text(user, "Inscribe some text into \the [initial(BB.name)]","Inscription",tmp_label,MAX_NAME_LEN), MAX_NAME_LEN) if(length(label_text) > 20) - to_chat(user, "The inscription can be at most 20 characters long.") + to_chat(user, span_red("The inscription can be at most 20 characters long.")) else if(!label_text) - to_chat(user, "You scratch the inscription off of [initial(BB)].") + to_chat(user, span_blue("You scratch the inscription off of [initial(BB)].")) BB.name = initial(BB.name) else - to_chat(user, "You inscribe \"[label_text]\" into \the [initial(BB.name)].") + to_chat(user, span_blue("You inscribe \"[label_text]\" into \the [initial(BB.name)].")) BB.name = "[initial(BB.name)] (\"[label_text]\")" else if(istype(I, /obj/item/ammo_magazine) && isturf(loc)) // Mass magazine reloading. var/obj/item/ammo_magazine/box = I @@ -281,4 +281,4 @@ /obj/item/ammo_magazine/ammo_box/examine(mob/user) . = ..() - . += to_chat(usr, "Alt-click to extract contents.") \ No newline at end of file + . += to_chat(usr, "Alt-click to extract contents.") diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 0af401493a1..63beb363339 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -718,9 +718,9 @@ var/mob/living/carbon/human/M = user mouthshoot = 1 - M.visible_message("[user] sticks their gun in their mouth, ready to pull the trigger...") + M.visible_message(span_red("[user] sticks their gun in their mouth, ready to pull the trigger...")) if(!do_after(user, 40)) - M.visible_message("[user] decided life was worth living") + M.visible_message(span_blue("[user] decided life was worth living")) mouthshoot = 0 return var/obj/item/projectile/in_chamber = consume_next_projectile() @@ -815,4 +815,4 @@ /obj/item/weapon/gun/dropped(mob/living/user) // Ditto as above, we remove the HUD. Pending porting TGMC code to clean up this fucking nightmare of spaghetti. user.hud_used.remove_ammo_hud(user, src) - ..() \ No newline at end of file + ..() diff --git a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm index e1c5711d279..4bea1318c6a 100644 --- a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm +++ b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm @@ -144,8 +144,8 @@ if(prey != user && prey.can_be_drop_prey) prey.forceMove(belly_dest) vore_happened = TRUE - to_chat(prey, "[living_user] materializes around you, as you end up in their [belly_dest]!") - to_chat(living_user, "You materialize around [prey] as they end up in your [belly_dest]!") + to_chat(prey, "[living_user] materializes around you, as you end up in their [belly_dest]!") + to_chat(living_user, "You materialize around [prey] as they end up in your [belly_dest]!") if(can_dropnom && !vore_happened && living_user.can_be_drop_prey) var/mob/living/pred for(var/mob/living/potential_pred in ToTurf) @@ -159,8 +159,8 @@ belly_dest = pick(pred.vore_organs) if(belly_dest) living_user.forceMove(belly_dest) - to_chat(pred, "[living_user] materializes inside you as they end up in your [belly_dest]!") - to_chat(living_user, "You materialize inside [pred] as you end up in their [belly_dest]!") + to_chat(pred, "[living_user] materializes inside you as they end up in your [belly_dest]!") + to_chat(living_user, "You materialize inside [pred] as you end up in their [belly_dest]!") else for(var/obj/O in FromTurf) @@ -185,8 +185,8 @@ belly_dest = pick(living_user.vore_organs) if(belly_dest) M.forceMove(belly_dest) - to_chat(living_user, "[M] materializes inside you as they end up in your [belly_dest]!") - to_chat(M, "You materialize inside [living_user] as you end up in their [belly_dest]!") + to_chat(living_user, "[M] materializes inside you as they end up in your [belly_dest]!") + to_chat(M, "You materialize inside [living_user] as you end up in their [belly_dest]!") else if(can_dropnom && living_user.can_be_drop_prey && M.can_be_drop_pred && !user_vored) var/obj/belly/belly_dest if(M.vore_selected) @@ -196,8 +196,8 @@ if(belly_dest) living_user.forceMove(belly_dest) user_vored = TRUE - to_chat(living_user, "[M] materializes around you, as you end up in their [belly_dest]!") - to_chat(M, "You materialize around [living_user] as they end up in your [belly_dest]!") + to_chat(living_user, "[M] materializes around you, as you end up in their [belly_dest]!") + to_chat(M, "You materialize around [living_user] as they end up in your [belly_dest]!") /obj/item/weapon/bluespace_harpoon/attack_self(mob/living/user as mob) diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm index 376604f4589..b67e197a118 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/ml3m_cells.dm @@ -322,7 +322,7 @@ /obj/item/projectile/beam/medical_cell/shrink/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) target.resize(0.5) - target.show_message("The beam fires into your body, changing your size!") + target.show_message(span_blue("The beam fires into your body, changing your size!")) target.update_icon() else return 1 @@ -336,7 +336,7 @@ /obj/item/projectile/beam/medical_cell/grow/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) target.resize(2.0) - target.show_message("The beam fires into your body, changing your size!") + target.show_message(span_blue("The beam fires into your body, changing your size!")) target.update_icon() else return 1 @@ -350,7 +350,7 @@ /obj/item/projectile/beam/medical_cell/normalsize/on_hit(var/mob/living/carbon/human/target) if(istype(target, /mob/living/carbon/human)) target.resize(1) - target.show_message("The beam fires into your body, changing your size!") + target.show_message(span_blue("The beam fires into your body, changing your size!")) target.update_icon() else return 1 diff --git a/code/modules/projectiles/guns/launcher.dm b/code/modules/projectiles/guns/launcher.dm index 412a032d3ad..e0494e534d6 100644 --- a/code/modules/projectiles/guns/launcher.dm +++ b/code/modules/projectiles/guns/launcher.dm @@ -15,7 +15,7 @@ //Override this to avoid a runtime with suicide handling. /obj/item/weapon/gun/launcher/handle_suicide(mob/living/user) - to_chat(user, "Shooting yourself with \a [src] is pretty tricky. You can't seem to manage it.") + to_chat(user, span_red("Shooting yourself with \a [src] is pretty tricky. You can't seem to manage it.")) return /obj/item/weapon/gun/launcher/proc/update_release_force(obj/item/projectile) diff --git a/code/modules/projectiles/guns/launcher/confetti.dm b/code/modules/projectiles/guns/launcher/confetti.dm index 3d23b193859..a6924b34347 100644 --- a/code/modules/projectiles/guns/launcher/confetti.dm +++ b/code/modules/projectiles/guns/launcher/confetti.dm @@ -17,17 +17,17 @@ /obj/item/weapon/gun/launcher/confetti_cannon/examine(mob/user) . = ..() if(get_dist(user, src) <= 2) - . += "It's loaded with [confetti_charge] ball\s of confetti." + . += span_blue("It's loaded with [confetti_charge] ball\s of confetti.") /obj/item/weapon/gun/launcher/confetti_cannon/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/shreddedp)) if(confetti_charge < max_confetti) user.drop_item() ++confetti_charge - to_chat(usr, "You put the paper in the [src].") + to_chat(usr, span_blue("You put the paper in the [src].")) qdel(I) else - to_chat(usr, "[src] cannot hold more paper.") + to_chat(usr, span_red("[src] cannot hold more paper.")) /obj/item/weapon/gun/launcher/confetti_cannon/proc/pump(mob/M as mob) playsound(M, 'sound/weapons/shotgunpump.ogg', 60, 1) @@ -35,11 +35,11 @@ if(confetti_charge) chambered = new /obj/item/weapon/grenade/confetti/party_ball --confetti_charge - to_chat(usr, "You compress a new confetti ball.") + to_chat(usr, span_blue("You compress a new confetti ball.")) else - to_chat(usr, "The [src] is out of confetti!") + to_chat(usr, span_red("The [src] is out of confetti!")) else - to_chat(usr, "The [src] is already loaded!") + to_chat(usr, span_red("The [src] is already loaded!")) /obj/item/weapon/gun/launcher/confetti_cannon/attack_self(mob/user) pump(user) @@ -80,26 +80,26 @@ switch(choice) if("Confetti") chambered = new /obj/item/weapon/grenade/confetti/party_ball - to_chat(usr, "Confetti loaded.") + to_chat(usr, span_blue("Confetti loaded.")) if(istype(usr,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = usr R.cell.charge -= 200 if("Banana Peel") chambered = new /obj/item/weapon/bananapeel - to_chat(usr, "Banana peel loaded.") + to_chat(usr, span_blue("Banana peel loaded.")) if(istype(usr,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = usr R.cell.charge -= 200 if("Cream Pie") chambered = new /obj/item/weapon/reagent_containers/food/snacks/pie - to_chat(usr, "Banana cream pie loaded.") + to_chat(usr, span_blue("Banana cream pie loaded.")) if(istype(usr,/mob/living/silicon/robot)) var/mob/living/silicon/robot/R = usr R.cell.charge -= 200 else - to_chat(usr, "The [src] is already loaded!") + to_chat(usr, span_red("The [src] is already loaded!")) /obj/item/weapon/gun/launcher/confetti_cannon/robot/consume_next_projectile() if(istype(chambered,/obj/item/weapon/grenade/confetti/party_ball)) chambered.activate(null) - return chambered \ No newline at end of file + return chambered diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index 647864365bb..2ae1996e05a 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -19,7 +19,7 @@ /obj/item/weapon/gun/launcher/rocket/examine(mob/user) . = ..() if(get_dist(user, src) <= 2) - . += "[rockets.len] / [max_rockets] rockets." + . += span_blue("[rockets.len] / [max_rockets] rockets.") /obj/item/weapon/gun/launcher/rocket/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/ammo_casing/rocket)) @@ -27,10 +27,10 @@ user.drop_item() I.loc = src rockets += I - to_chat(user, "You put the rocket in [src].") - to_chat(user, "[rockets.len] / [max_rockets] rockets.") + to_chat(user, span_blue("You put the rocket in [src].")) + to_chat(user, span_blue("[rockets.len] / [max_rockets] rockets.")) else - to_chat(usr, "[src] cannot hold more rockets.") + to_chat(usr, span_red(">[src] cannot hold more rockets.")) /obj/item/weapon/gun/launcher/rocket/consume_next_projectile() if(rockets.len) diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 20aef6e980e..f1d3e20d7b0 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -134,12 +134,12 @@ . += "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%." if(state & ICON_BAD) - . += "The capacitor charge indicator is blinking red. Maybe you should check the cell or capacitor." + . += "The capacitor charge indicator is blinking [span_red("red")]. Maybe you should check the cell or capacitor." else if(state & ICON_CHARGE) - . += "The capacitor charge indicator is amber." + . += "The capacitor charge indicator is [span_orange("amber")]." else - . += "The capacitor charge indicator is green." + . += "The capacitor charge indicator is [span_green("green")]." /obj/item/weapon/gun/magnetic/attackby(var/obj/item/thing, var/mob/user) @@ -313,4 +313,4 @@ #undef ICON_BAD #undef ICON_CHARGE #undef ICON_READY -#undef ICON_LOADED \ No newline at end of file +#undef ICON_LOADED diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index c0a61803526..6fde481f1fb 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -111,16 +111,16 @@ /obj/item/weapon/gun/projectile/dartgun/attackby(obj/item/I as obj, mob/user as mob) if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(!istype(I, container_type)) - to_chat(user, "[I] doesn't seem to fit into [src].") + to_chat(user, span_blue("[I] doesn't seem to fit into [src].")) return if(beakers.len >= max_beakers) - to_chat(user, "[src] already has [max_beakers] beakers in it - another one isn't going to fit!") + to_chat(user, span_blue("[src] already has [max_beakers] beakers in it - another one isn't going to fit!")) return var/obj/item/weapon/reagent_containers/glass/beaker/B = I user.drop_item() B.loc = src beakers += B - to_chat(user, "You slot [B] into [src].") + to_chat(user, span_blue("You slot [B] into [src].")) src.updateUsrDialog() return 1 ..() diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 5e5d7f5c4ea..2309744420c 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -273,7 +273,7 @@ /obj/item/projectile/energy/blue_pellet name = "suppressive pellet" icon_state = "blue_pellet" - fire_sound = 'sound/weapons/Laser.ogg' + fire_sound = 'sound/weapons/Laser4.ogg' damage = 5 armor_penetration = 75 pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE @@ -334,4 +334,4 @@ /obj/item/projectile/energy/flash/flare flash_range = 2 - hud_state = "grenade_dummy" \ No newline at end of file + hud_state = "grenade_dummy" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index e45e4ee3a5e..6b9d9d51d00 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -163,7 +163,7 @@ M.Weaken(5) var/datum/gender/TM = gender_datums[M.get_visible_gender()] for (var/mob/V in viewers(src)) - V.show_message("[M] writhes in pain as [TM.his] vacuoles boil.", 3, "You hear the crunching of leaves.", 2) + V.show_message(span_red("[M] writhes in pain as [TM.his] vacuoles boil."), 3, span_red("You hear the crunching of leaves."), 2) if(prob(35)) // for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan // V.show_message("[M] is mutated by the radiation beam.", 3, " You hear the snapping of twigs.", 2) @@ -175,13 +175,13 @@ domutcheck(M,null) else M.adjustFireLoss(rand(5,15)) - M.show_message("The radiation beam singes you!") + M.show_message(span_red("The radiation beam singes you!")) // for (var/mob/V in viewers(src)) // V.show_message("[M] is singed by the radiation beam.", 3, " You hear the crackle of burning leaves.", 2) else if(istype(target, /mob/living/carbon/)) // for (var/mob/V in viewers(src)) // V.show_message("The radiation beam dissipates harmlessly through [M]", 3) - M.show_message("The radiation beam dissipates harmlessly through your body.") + M.show_message(span_blue("The radiation beam dissipates harmlessly through your body.")) else return 1 @@ -218,7 +218,7 @@ if((H.species.flags & IS_PLANT) && (M.nutrition < 500)) M.adjust_nutrition(30) else if (istype(target, /mob/living/carbon/)) - M.show_message("The radiation beam dissipates harmlessly through your body.") + M.show_message(span_blue("The radiation beam dissipates harmlessly through your body.")) else return 1 diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index 118ad57bb3e..d6a15ae59a0 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -6,7 +6,7 @@ switch(reagents.get_master_reagent_id()) if("blood") user.show_message("You sink your fangs into \the [src] and suck the blood out of it!") - user.visible_message("[user] sinks their fangs into \the [src] and drains it!") + user.visible_message(span_red("[user] sinks their fangs into \the [src] and drains it!")) user.adjust_nutrition(remove_volume*5) reagents.remove_reagent(reagent_to_remove, remove_volume) update_icon() @@ -55,4 +55,4 @@ /obj/item/weapon/reagent_containers/blood/prelabeled/OMinus name = "IV Pack (O-)" desc = "Holds liquids used for transfusion. This one's label seems to be hardprinted. This one is labeled O-" - blood_type = "O-" \ No newline at end of file + blood_type = "O-" diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index afc0728f3f3..9570fcf03f4 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -98,7 +98,7 @@ return /obj/item/weapon/reagent_containers/borghypo/attack_self(mob/user as mob) //Change the mode - var/t = "" + var/t = "" for(var/i = 1 to reagent_ids.len) if(t) t += ", " @@ -106,7 +106,7 @@ t += "[reagent_names[i]]" else t += "[reagent_names[i]]" - t = "Available reagents: [t]." + t = "Available reagents: [t]." to_chat(user,t) return diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 797e7c701d0..71d5731ea2c 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -278,7 +278,7 @@ if (target != user && H.getarmor(target_zone, "melee") > 5 && prob(50)) for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!"), 1) + O.show_message(span_red(text("[user] tries to stab [target] in \the [hit_area] with [src.name], but the attack is deflected by armor!")), 1) user.remove_from_mob(src) qdel(src) diff --git a/code/modules/reagents/reagents/vore_vr.dm b/code/modules/reagents/reagents/vore_vr.dm index 4da668883ee..42e39065628 100644 --- a/code/modules/reagents/reagents/vore_vr.dm +++ b/code/modules/reagents/reagents/vore_vr.dm @@ -113,7 +113,7 @@ else if(prob(1)) playsound(M, 'sound/vore/schlorp.ogg', 50, 1) P.absorbed = 0 - M.visible_message("Something spills into [M]'s [lowertext(B.name)]!") + M.visible_message(span_green("Something spills into [M]'s [lowertext(B.name)]!")) ////////////////////////// TF Drugs ////////////////////////// @@ -185,4 +185,4 @@ H.set_gender(PLURAL) H.change_gender_identity(PLURAL) H.visible_message("[H] suddenly twitches as some of their features seem to contort and reshape, adjusting... In the end, it seems they are now of mixed gender.", - "Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became of mixed gender.") \ No newline at end of file + "Your body suddenly contorts, feeling very different in various ways... By the time the rushing feeling is over it seems you just became of mixed gender.") diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index a9a317b45d0..8622c2369e8 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -5,9 +5,9 @@ // Automatically recharges air (unless off), will flush when ready if pre-set // Can hold items and human size things, no other draggables // Toilets are a type of disposal bin for small objects only and work on magic. By magic, I mean torque rotation -#define SEND_PRESSURE (700 + ONE_ATMOSPHERE) //kPa - assume the inside of a dispoal pipe is 1 atm, so that needs to be added. +#define SEND_PRESSURE (0.05 + ONE_ATMOSPHERE) //kPa - assume the inside of a dispoal pipe is 1 atm, so that needs to be added. #define PRESSURE_TANK_VOLUME 150 //L -#define PUMP_MAX_FLOW_RATE 90 //L/s - 4 m/s using a 15 cm by 15 cm inlet +#define PUMP_MAX_FLOW_RATE 11.25 //L/s - 4 m/s using a 15 cm by 15 cm inlet //NOTE: I reduced the send pressure from 801 to 101.05 which is about 1/8 there was originally, and this was 90 before that. 90/8 is about 11.25, so that's the new value. -Reo /obj/machinery/disposal name = "disposal unit" @@ -100,7 +100,7 @@ if(istype(I, /obj/item/weapon/storage/bag/trash)) var/obj/item/weapon/storage/bag/trash/T = I - to_chat(user, "You empty the bag.") + to_chat(user, span_blue("You empty the bag.")) for(var/obj/item/O in T.contents) T.remove_from_storage(O,src) T.update_icon() @@ -129,7 +129,7 @@ GM.client.eye = src GM.forceMove(src) for (var/mob/C in viewers(src)) - C.show_message("[GM.name] has been placed in the [src] by [user].", 3) + C.show_message(span_red("[GM.name] has been placed in the [src] by [user]."), 3) qdel(G) add_attack_logs(user,GM,"Disposals dunked") @@ -233,7 +233,7 @@ return if(user && user.loc == src) - to_chat(user, "You cannot reach the controls from inside.") + to_chat(user, span_red("You cannot reach the controls from inside.")) return // Clumsy folks can only flush it. @@ -1272,7 +1272,7 @@ if(O.currTag)// Tag set sort_tag = O.currTag playsound(src, 'sound/machines/twobeep.ogg', 100, 1) - to_chat(user, "Changed tag to '[sort_tag]'.") + to_chat(user, span_blue("Changed tag to '[sort_tag]'.")) updatename() updatedesc() @@ -1340,7 +1340,7 @@ if(O.currTag)// Tag set sortType = O.currTag playsound(src, 'sound/machines/twobeep.ogg', 100, 1) - to_chat(user, "Changed filter to '[sortType]'.") + to_chat(user, span_blue("Changed filter to '[sortType]'.")) updatename() updatedesc() diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index caa4df13bc9..d630c3e6c1e 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -59,7 +59,7 @@ if("Description") var/str = sanitize(tgui_input_text(usr,"Label text?","Set label","")) if(!str || !length(str)) - to_chat(user, "Invalid text.") + to_chat(user, span_red("Invalid text.")) return if(!examtext && !nameset) examtext = str @@ -171,7 +171,7 @@ if("Description") var/str = sanitize(tgui_input_text(usr,"Label text?","Set label","")) if(!str || !length(str)) - to_chat(user, "Invalid text.") + to_chat(user, span_red("Invalid text.")) return if(!examtext && !nameset) examtext = str @@ -241,7 +241,7 @@ if(user in target) //no wrapping closets that you are inside - it's not physically possible return - user.attack_log += text("\[[time_stamp()]\] Has used [src.name] on \ref[target]") + user.attack_log += text("\[[time_stamp()]\] [span_blue("Has used [src.name] on \ref[target]")]") if (istype(target, /obj/item) && !(istype(target, /obj/item/weapon/storage) && !istype(target,/obj/item/weapon/storage/box))) @@ -305,7 +305,7 @@ else if(src.amount < 3) to_chat(user, "You need more paper.") else - to_chat(user, "The object you are trying to wrap is unsuitable for the sorting machinery!") + to_chat(user, span_blue("The object you are trying to wrap is unsuitable for the sorting machinery!")) if (src.amount <= 0) new /obj/item/weapon/c_tube( src.loc ) qdel(src) @@ -315,7 +315,7 @@ /obj/item/weapon/packageWrap/examine(mob/user) . = ..() if(get_dist(user, src) <= 0) - . += "There are [amount] units of package wrap left!" + . += span_blue("There are [amount] units of package wrap left!") /obj/structure/bigDelivery/Destroy() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 diff --git a/code/modules/research/designs/circuits/ai_modules.dm b/code/modules/research/designs/circuits/ai_modules.dm index c9dc9b19425..b61c6f89dbd 100644 --- a/code/modules/research/designs/circuits/ai_modules.dm +++ b/code/modules/research/designs/circuits/ai_modules.dm @@ -62,14 +62,14 @@ id = "reset" req_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) build_path = /obj/item/weapon/aiModule/reset - sort_string = "XAAAZ" // Duplicate string, really need to redo this whole thing + sort_string = "XABAH" /datum/design/aimodule/purge name = "Purge" id = "purge" req_tech = list(TECH_DATA = 4, TECH_MATERIAL = 6) build_path = /obj/item/weapon/aiModule/purge - sort_string = "XAAAB" + sort_string = "XABAI" // Core modules /datum/design/aimodule/core @@ -104,4 +104,134 @@ id = "tyrant" req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) build_path = /obj/item/weapon/aiModule/tyrant - sort_string = "XACAD" \ No newline at end of file + sort_string = "XACAD" + +/datum/design/aimodule/core/nanotrasen + name = "NT Default" + id = "nanotrasen" + build_path = /obj/item/weapon/aiModule/nanotrasen + req_tech = list(TECH_DATA = 1) + sort_string = "XACAE" + +/datum/design/aimodule/core/predator + name = "Predator" + id = "laws_predator_vr" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/predator + sort_string = "XACAF" + +/datum/design/aimodule/core/protective_shell + name = "Protective Shell" + id = "laws_protective_shell_vr" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/protective_shell + sort_string = "XACAG" + +/datum/design/aimodule/core/scientific_pursuer + name = "Scientific Pursuer" + id = "laws_scientific_pursuer_vr" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/scientific_pursuer + sort_string = "XACAH" + +/datum/design/aimodule/core/guard_dog + name = "Guard Dog" + id = "laws_guard_dog_vr" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/guard_dog + sort_string = "XACAI" + +/datum/design/aimodule/core/pleasurebot + name = "Pleasurebot" + id = "laws_pleasurebot_vr" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/pleasurebot + sort_string = "XACAJ" + +/datum/design/aimodule/core/consuming_eradicator + name = "Consuming Eradicator" + id = "laws_consuming_eradicator_vr" + req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 6, TECH_MATERIAL = 6) + build_path = /obj/item/weapon/aiModule/consuming_eradicator + sort_string = "XACAK" + +// Illegal modules +/datum/design/aimodule/illegal + materials = list(MAT_GLASS = 4000, MAT_GOLD = 500) + req_tech = list(TECH_DATA = 6, TECH_ILLEGAL = 7, TECH_MATERIAL = 9, TECH_COMBAT = 7) + +/datum/design/aimodule/illegal/AssembleDesignName() + name = "AI illegal module design ([name])" + +/datum/design/aimodule/illegal/AssembleDesignDesc() + desc = "Allows for the construction of \a '[name]' AI illegal module." + +/datum/design/aimodule/illegal/noengine + name = "EngineOffline" + id = "noengine" + req_tech = list(TECH_DATA = 5, TECH_ILLEGAL = 5, TECH_MATERIAL = 6, TECH_COMBAT = 7) + build_path = /obj/item/weapon/aiModule/prototypeEngineOffline + sort_string = "XADAA" + +/datum/design/aimodule/illegal/corp + name = "Corporate" + id = "corp" + req_tech = list(TECH_DATA = 2, TECH_ILLEGAL = 4, TECH_MATERIAL = 2, TECH_COMBAT = 2) + build_path = /obj/item/weapon/aiModule/corp + sort_string = "XADAB" + +/datum/design/aimodule/illegal/robocop + name = "Robocop" + id = "robocop" + req_tech = list(TECH_DATA = 2, TECH_ILLEGAL = 2, TECH_MATERIAL = 2, TECH_COMBAT = 4) + build_path = /obj/item/weapon/aiModule/robocop + sort_string = "XADAC" + +/datum/design/aimodule/illegal/antimov + name = "Antimov" + id = "antimov" + req_tech = list(TECH_DATA = 6, TECH_ILLEGAL = 7, TECH_MATERIAL = 7, TECH_COMBAT = 5) + build_path = /obj/item/weapon/aiModule/antimov + sort_string = "XADAD" + +/datum/design/aimodule/illegal/nanotrasen_aggressive + name = "NT Aggressive" + id = "nanotrasen_aggressive" + req_tech = list(TECH_DATA = 5, TECH_ILLEGAL = 6, TECH_MATERIAL = 3, TECH_COMBAT = 7) + build_path = /obj/item/weapon/aiModule/nanotrasen_aggressive + sort_string = "XADAE" + +/datum/design/aimodule/illegal/maintenance + name = "Maintenance" + id = "maintenance" + req_tech = list(TECH_DATA = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 3, TECH_COMBAT = 2) + build_path = /obj/item/weapon/aiModule/maintenance + sort_string = "XADAF" + +/datum/design/aimodule/illegal/peacekeeper + name = "Peacekeeper" + id = "peacekeeper" + req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 3, TECH_MATERIAL = 2, TECH_COMBAT = 2) + build_path = /obj/item/weapon/aiModule/peacekeeper + sort_string = "XADAG" + +/datum/design/aimodule/illegal/reporter + name = "Reporter" + id = "reporter" + req_tech = list(TECH_DATA = 2, TECH_ILLEGAL = 2, TECH_MATERIAL = 3) + build_path = /obj/item/weapon/aiModule/reporter + sort_string = "XADAH" + +/datum/design/aimodule/illegal/live_and_let_live + name = "Live and Let Live" + id = "live_and_let_live" + req_tech = list(TECH_DATA = 5, TECH_ILLEGAL = 3, TECH_MATERIAL = 4, TECH_COMBAT = 3) + build_path = /obj/item/weapon/aiModule/live_and_let_live + sort_string = "XADAI" + +/datum/design/aimodule/illegal/balance + name = "Guardian of Balance." + id = "balance" + req_tech = list(TECH_DATA = 4, TECH_ILLEGAL = 2, TECH_MATERIAL = 2, TECH_COMBAT = 3) + build_path = /obj/item/weapon/aiModule/balance + sort_string = "XADAJ" diff --git a/code/modules/research/designs/circuits/ai_modules_vr.dm b/code/modules/research/designs/circuits/ai_modules_vr.dm deleted file mode 100644 index d8bc3814ace..00000000000 --- a/code/modules/research/designs/circuits/ai_modules_vr.dm +++ /dev/null @@ -1,41 +0,0 @@ -/datum/design/aimodule/core/predator - name = "Predator" - id = "laws_predator_vr" - req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) - build_path = /obj/item/weapon/aiModule/predator - sort_string = "XAVAA" - -/datum/design/aimodule/core/protective_shell - name = "Protective Shell" - id = "laws_protective_shell_vr" - req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) - build_path = /obj/item/weapon/aiModule/protective_shell - sort_string = "XAVAB" - -/datum/design/aimodule/core/scientific_pursuer - name = "Scientific Pursuer" - id = "laws_scientific_pursuer_vr" - req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) - build_path = /obj/item/weapon/aiModule/scientific_pursuer - sort_string = "XAVAC" - -/datum/design/aimodule/core/guard_dog - name = "Guard Dog" - id = "laws_guard_dog_vr" - req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) - build_path = /obj/item/weapon/aiModule/guard_dog - sort_string = "XAVAD" - -/datum/design/aimodule/core/pleasurebot - name = "Pleasurebot" - id = "laws_pleasurebot_vr" - req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 2, TECH_MATERIAL = 6) - build_path = /obj/item/weapon/aiModule/pleasurebot - sort_string = "XAVAE" - -/datum/design/aimodule/core/consuming_eradicator - name = "Consuming Eradicator" - id = "laws_consuming_eradicator_vr" - req_tech = list(TECH_DATA = 4, TECH_BIO = 3, TECH_ILLEGAL = 6, TECH_MATERIAL = 6) - build_path = /obj/item/weapon/aiModule/consuming_eradicator - sort_string = "XAVAF" diff --git a/code/modules/research/prosfab_designs.dm b/code/modules/research/prosfab_designs.dm index 5d7c6900096..e168af2b23c 100644 --- a/code/modules/research/prosfab_designs.dm +++ b/code/modules/research/prosfab_designs.dm @@ -385,68 +385,140 @@ time = 12 materials = list(MAT_STEEL = 7500) -/datum/design/item/prosfab/robot_upgrade/rename +// Section for utility upgrades + +/datum/design/item/prosfab/robot_upgrade/utility/rename name = "Rename Module" desc = "Used to rename a cyborg." id = "borg_rename_module" - build_path = /obj/item/borg/upgrade/rename + build_path = /obj/item/borg/upgrade/utility/rename -/datum/design/item/prosfab/robot_upgrade/reset +/datum/design/item/prosfab/robot_upgrade/utility/reset name = "Reset Module" desc = "Used to reset a cyborg's module. Destroys any other upgrades applied to the robot." id = "borg_reset_module" - build_path = /obj/item/borg/upgrade/reset + build_path = /obj/item/borg/upgrade/utility/reset -/datum/design/item/prosfab/robot_upgrade/restart +/datum/design/item/prosfab/robot_upgrade/utility/restart name = "Emergency Restart Module" desc = "Used to force a restart of a disabled-but-repaired robot, bringing it back online." id = "borg_restart_module" materials = list(MAT_STEEL = 45000, MAT_GLASS = 3750) - build_path = /obj/item/borg/upgrade/restart + build_path = /obj/item/borg/upgrade/utility/restart + +// Section for basic upgrades for all cyborgs + +/datum/design/item/prosfab/robot_upgrade/basic/sizeshift + name = "Size Alteration Module" + id = "borg_sizeshift_module" + req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000) + build_path = /obj/item/borg/upgrade/basic/sizeshift -/datum/design/item/prosfab/robot_upgrade/vtec +/datum/design/item/prosfab/robot_upgrade/basic/vtec name = "VTEC Module" desc = "Used to kick in a robot's VTEC systems, increasing their speed." id = "borg_vtec_module" materials = list(MAT_STEEL = 60000, MAT_GLASS = 4500, MAT_GOLD = 3750) - build_path = /obj/item/borg/upgrade/vtec + build_path = /obj/item/borg/upgrade/basic/vtec -/datum/design/item/prosfab/robot_upgrade/tasercooler - name = "Rapid Taser Cooling Module" - desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." - id = "borg_taser_module" - materials = list(MAT_STEEL = 60000, MAT_GLASS = 4500, MAT_GOLD = 1500, MAT_DIAMOND = 375) - build_path = /obj/item/borg/upgrade/tasercooler +/datum/design/item/prosfab/robot_upgrade/basic/syndicate + name = "Scrambled Equipment Module" + desc = "Allows for the construction of lethal upgrades for cyborgs." + id = "borg_syndicate_module" + req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) + materials = list(MAT_STEEL = 7500, MAT_GLASS = 11250, MAT_DIAMOND = 7500) + build_path = /obj/item/borg/upgrade/basic/syndicate + +/datum/design/item/prosfab/robot_upgrade/basic/language + name = "Language Module" + desc = "Used to let cyborgs other than clerical or service speak a variety of languages." + id = "borg_language_module" + req_tech = list(TECH_DATA = 6, TECH_MATERIAL = 6) + materials = list(MAT_STEEL = 25000, MAT_GLASS = 3000, MAT_GOLD = 350) + build_path = /obj/item/borg/upgrade/basic/language + +// Section for advanced upgrades for all cyborgs + +/datum/design/item/prosfab/robot_upgrade/advanced/bellysizeupgrade + name = "Robohound Capacity Expansion Module" + id = "borg_hound_capacity_module" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2) + materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000) + build_path = /obj/item/borg/upgrade/advanced/bellysizeupgrade -/datum/design/item/prosfab/robot_upgrade/jetpack +/datum/design/item/prosfab/robot_upgrade/advanced/sizegun + name = "Size Gun Module" + id = "borg_sizegun_module" + req_tech = list(TECH_COMBAT = 3, TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) + materials = list(MAT_STEEL = 6000, MAT_GLASS = 4000) + build_path = /obj/item/borg/upgrade/advanced/sizegun + +/datum/design/item/prosfab/robot_upgrade/advanced/jetpack name = "Jetpack Module" desc = "A carbon dioxide jetpack suitable for low-gravity mining operations." id = "borg_jetpack_module" materials = list(MAT_STEEL = 7500, MAT_PHORON = 11250, MAT_URANIUM = 15000) - build_path = /obj/item/borg/upgrade/jetpack + build_path = /obj/item/borg/upgrade/advanced/jetpack -/datum/design/item/prosfab/robot_upgrade/advhealth +/datum/design/item/prosfab/robot_upgrade/advanced/advhealth name = "Advanced Health Analyzer Module" desc = "An advanced health analyzer suitable for diagnosing more serious injuries." id = "borg_advhealth_module" materials = list(MAT_STEEL = 10000, MAT_GLASS = 6500, MAT_DIAMOND = 350) - build_path = /obj/item/borg/upgrade/advhealth + build_path = /obj/item/borg/upgrade/advanced/advhealth + +/* + Some job related borg upgrade modules, adding useful items for puppers. +*/ + +/datum/design/item/prosfab/robot_upgrade/restricted/bellycapupgrade + name = "Robohound Capability Expansion Module" + id = "borg_hound_capability_module" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) + materials = list(MAT_STEEL = 8000, MAT_GLASS = 6000) + build_path = /obj/item/borg/upgrade/restricted/bellycapupgrade + +/datum/design/item/prosfab/robot_upgrade/restricted/advrped + name = "Advanced Rapid Part Exchange Device" + desc = "Exactly the same as a standard Advanced RPED, but this one has mounting hardware for a Science Borg." + id = "borg_advrped_module" + req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6) + materials = list(MAT_STEEL = 30000, MAT_GLASS = 10000) + build_path = /obj/item/borg/upgrade/restricted/advrped + +/datum/design/item/prosfab/robot_upgrade/restricted/diamonddrill + name = "Diamond Drill" + desc = "A mining drill with a diamond tip, made for use by Mining Borgs." + id = "borg_ddrill_module" + req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_ENGINEERING = 5) + materials = list(MAT_STEEL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) + build_path = /obj/item/borg/upgrade/restricted/diamonddrill + +/datum/design/item/prosfab/robot_upgrade/restricted/pka + name = "Proto-Kinetic Accelerator" + desc = "A mining weapon designed for clearing rocks and hostile wildlife. This model is equiped with a self upgrade system, allowing it to attach modules hands free." + id = "borg_pka_module" + req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) + materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 500, MAT_PLATINUM = 350) + build_path = /obj/item/borg/upgrade/restricted/pka + +/datum/design/item/prosfab/robot_upgrade/restricted/tasercooler + name = "Rapid Taser Cooling Module" + desc = "Used to cool a mounted taser, increasing the potential current in it and thus its recharge rate." + id = "borg_taser_module" + materials = list(MAT_STEEL = 60000, MAT_GLASS = 4500, MAT_GOLD = 1500, MAT_DIAMOND = 375) + build_path = /obj/item/borg/upgrade/restricted/tasercooler -/datum/design/item/prosfab/robot_upgrade/syndicate - name = "Scrambled Equipment Module" - desc = "Allows for the construction of lethal upgrades for cyborgs." - id = "borg_syndicate_module" - req_tech = list(TECH_COMBAT = 4, TECH_ILLEGAL = 3) - materials = list(MAT_STEEL = 7500, MAT_GLASS = 11250, MAT_DIAMOND = 7500) - build_path = /obj/item/borg/upgrade/syndicate +// Section for quick access for admins, events and such, but can't be produced. -/datum/design/item/prosfab/robot_upgrade/language - name = "Language Module" - desc = "Used to let cyborgs other than clerical or service speak a variety of languages." - id = "borg_language_module" - req_tech = list(TECH_DATA = 6, TECH_MATERIAL = 6) - materials = list(MAT_STEEL = 25000, MAT_GLASS = 3000, MAT_GOLD = 350) - build_path = /obj/item/borg/upgrade/language +/datum/design/item/prosfab/robot_upgrade/no_prod/cyborgtoy + category = list() // We simply do not sort them in + +/datum/design/item/prosfab/robot_upgrade/no_prod/cyborgtoy + name = "Donk-Soft Cyborg Blaster" + id = "borg_hound_cyborg_blaster" + build_path = /obj/item/borg/upgrade/no_prod/toygun // Synthmorph Bags. @@ -546,3 +618,46 @@ time = 30 materials = list(MAT_STEEL = 8000, MAT_GLASS = 2000, MAT_SILVER = 2000, MAT_GOLD = 2000) //req_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5, TECH_MATERIAL = 5, TECH_ENGINEERING = 5, TECH_DATA = 5) + +///// pAI parts!!! + +//////////////////// Cyborg Parts //////////////////// +/datum/design/item/prosfab/paiparts + category = list("pAI Parts") + time = 20 + materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000) + +/datum/design/item/prosfab/paiparts/cell + name = "pAI Cell" + id = "pai_cell" + build_path = /obj/item/paiparts/cell + +/datum/design/item/prosfab/paiparts/processor + name = "pAI Processor" + id = "pai_processor" + build_path = /obj/item/paiparts/processor + +/datum/design/item/prosfab/paiparts/board + name = "pAI Board" + id = "pai_board" + build_path = /obj/item/paiparts/board + +/datum/design/item/prosfab/paiparts/capacitor + name = "pAI capacitor" + id = "pai_capacitor" + build_path = /obj/item/paiparts/capacitor + +/datum/design/item/prosfab/paiparts/projector + name = "pAI Projector" + id = "pai_projector" + build_path = /obj/item/paiparts/projector + +/datum/design/item/prosfab/paiparts/emitter + name = "pAI Emitter" + id = "pai_emitter" + build_path = /obj/item/paiparts/emitter + +/datum/design/item/prosfab/paiparts/speech_synthesizer + name = "pAI Speech Synthesizer" + id = "pai_speech_synthesizer" + build_path = /obj/item/paiparts/speech_synthesizer diff --git a/code/modules/research/prosfab_designs_vr.dm b/code/modules/research/prosfab_designs_vr.dm deleted file mode 100644 index d5195b28ad0..00000000000 --- a/code/modules/research/prosfab_designs_vr.dm +++ /dev/null @@ -1,100 +0,0 @@ -//Prosfab stuff for borgs and such - -/datum/design/item/prosfab/robot_upgrade/sizeshift - name = "Size Alteration Module" - id = "borg_sizeshift_module" - req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000) - build_path = /obj/item/borg/upgrade/sizeshift - -/datum/design/item/prosfab/robot_upgrade/sizegun - name = "Size Gun Module" - id = "borg_sizegun_module" - req_tech = list(TECH_COMBAT = 3, TECH_BLUESPACE = 3, TECH_MATERIAL = 3, TECH_POWER = 2) - materials = list(MAT_STEEL = 6000, MAT_GLASS = 4000) - build_path = /obj/item/borg/upgrade/sizegun - -/datum/design/item/prosfab/robot_upgrade/bellysizeupgrade - name = "Robohound Capacity Expansion Module" - id = "borg_hound_capacity_module" - req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2) - materials = list(MAT_STEEL = 4000, MAT_GLASS = 4000) - build_path = /obj/item/borg/upgrade/bellysizeupgrade - -/datum/design/item/prosfab/robot_upgrade/bellycapupgrade - name = "Robohound Capability Expansion Module" - id = "borg_hound_capability_module" - req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4) - materials = list(MAT_STEEL = 8000, MAT_GLASS = 6000) - build_path = /obj/item/borg/upgrade/bellycapupgrade - -/* - Some job related borg upgrade modules, adding useful items for puppers. - -*/ -/datum/design/item/prosfab/robot_upgrade/advrped - name = "Advanced Rapid Part Exchange Device" - desc = "Exactly the same as a standard Advanced RPED, but this one has mounting hardware for a Science Borg." - id = "borg_advrped_module" - req_tech = list(TECH_ENGINEERING = 6, TECH_MATERIAL = 6) - materials = list(MAT_STEEL = 30000, MAT_GLASS = 10000) - build_path = /obj/item/borg/upgrade/advrped - -/datum/design/item/prosfab/robot_upgrade/diamonddrill - name = "Diamond Drill" - desc = "A mining drill with a diamond tip, made for use by Mining Borgs." - id = "borg_ddrill_module" - req_tech = list(TECH_MATERIAL = 6, TECH_POWER = 5, TECH_ENGINEERING = 5) - materials = list(MAT_STEEL = 3000, MAT_GLASS = 1000, MAT_DIAMOND = 2000) - build_path = /obj/item/borg/upgrade/diamonddrill - -/datum/design/item/prosfab/robot_upgrade/pka - name = "Proto-Kinetic Accelerator" - desc = "A mining weapon designed for clearing rocks and hostile wildlife. This model is equiped with a self upgrade system, allowing it to attach modules hands free." - id = "borg_pka_module" - req_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 5, TECH_POWER = 4) - materials = list(MAT_PLASTEEL = 5000, MAT_GLASS = 1000, MAT_URANIUM = 500, MAT_PLATINUM = 350) - build_path = /obj/item/borg/upgrade/pka - -///// pAI parts!!! - -//////////////////// Cyborg Parts //////////////////// -/datum/design/item/prosfab/paiparts - category = list("pAI Parts") - time = 20 - materials = list(MAT_STEEL = 1000, MAT_GLASS = 1000) - -/datum/design/item/prosfab/paiparts/cell - name = "pAI Cell" - id = "pai_cell" - build_path = /obj/item/paiparts/cell - -/datum/design/item/prosfab/paiparts/processor - name = "pAI Processor" - id = "pai_processor" - build_path = /obj/item/paiparts/processor - -/datum/design/item/prosfab/paiparts/board - name = "pAI Board" - id = "pai_board" - build_path = /obj/item/paiparts/board - -/datum/design/item/prosfab/paiparts/capacitor - name = "pAI capacitor" - id = "pai_capacitor" - build_path = /obj/item/paiparts/capacitor - -/datum/design/item/prosfab/paiparts/projector - name = "pAI Projector" - id = "pai_projector" - build_path = /obj/item/paiparts/projector - -/datum/design/item/prosfab/paiparts/emitter - name = "pAI Emitter" - id = "pai_emitter" - build_path = /obj/item/paiparts/emitter - -/datum/design/item/prosfab/paiparts/speech_synthesizer - name = "pAI Speech Synthesizer" - id = "pai_speech_synthesizer" - build_path = /obj/item/paiparts/speech_synthesizer diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index effc14b2224..5330fd3fd66 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -175,7 +175,7 @@ feedback_inc("alert_keycard_auth_maintRevoke",1) if("Emergency Response Team") if(is_ert_blocked()) - to_chat(usr, "All emergency response teams are dispatched and can not be called at this time.") + to_chat(usr, span_red("All emergency response teams are dispatched and can not be called at this time.")) return trigger_armed_response_team(1) @@ -189,15 +189,15 @@ var/global/maint_all_access = 0 /proc/make_maint_all_access() maint_all_access = 1 - to_world("Attention!") - to_world("The maintenance access requirement has been revoked on all airlocks.") + to_world(span_red("Attention!")) + to_world(span_red("The maintenance access requirement has been revoked on all airlocks.")) /proc/revoke_maint_all_access() maint_all_access = 0 - to_world("Attention!") - to_world("The maintenance access requirement has been readded on all maintenance airlocks.") + to_world(span_red("Attention!")) + to_world(span_red("The maintenance access requirement has been readded on all maintenance airlocks.")) /obj/machinery/door/airlock/allowed(mob/M) if(maint_all_access && src.check_access_list(list(access_maint_tunnels))) return 1 - return ..(M) \ No newline at end of file + return ..(M) diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index a3908a6a55d..49610cbcd07 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -259,14 +259,14 @@ return if (src.active) - user.visible_message("\icon[src][bicon(src)] [user] deactivated the shield generator.", \ - "\icon[src][bicon(src)] You deactivate the shield generator.", \ + user.visible_message(span_blue("\icon[src][bicon(src)] [user] deactivated the shield generator."), \ + span_blue("\icon[src][bicon(src)] You deactivate the shield generator."), \ "You hear heavy droning fade out.") src.shields_down() else if(anchored) - user.visible_message("\icon[src][bicon(src)] [user] activated the shield generator.", \ - "\icon[src][bicon(src)] You activate the shield generator.", \ + user.visible_message(span_blue("\icon[src][bicon(src)] [user] activated the shield generator."), \ + span_blue("\icon[src][bicon(src)] You activate the shield generator."), \ "You hear heavy droning.") src.shields_up() else @@ -283,10 +283,10 @@ if(W.has_tool_quality(TOOL_SCREWDRIVER)) playsound(src, W.usesound, 100, 1) if(is_open) - to_chat(user, "You close the panel.") + to_chat(user, span_blue("You close the panel.")) is_open = 0 else - to_chat(user, "You open the panel and expose the wiring.") + to_chat(user, span_blue("You open the panel and expose the wiring.")) is_open = 1 else if(istype(W, /obj/item/stack/cable_coil) && malfunction && is_open) @@ -306,15 +306,15 @@ return if(anchored) playsound(src, W.usesound, 100, 1) - to_chat(user, "You unsecure the [src] from the floor!") + to_chat(user, span_blue("You unsecure the [src] from the floor!")) if(active) - to_chat(user, "The [src] shuts off!") + to_chat(user, span_blue("The [src] shuts off!")) src.shields_down() anchored = FALSE else if(istype(get_turf(src), /turf/space)) return //No wrenching these in space! playsound(src, W.usesound, 100, 1) - to_chat(user, "You secure the [src] to the floor!") + to_chat(user, span_blue("You secure the [src] to the floor!")) anchored = TRUE @@ -323,7 +323,7 @@ src.locked = !src.locked to_chat(user, "The controls are now [src.locked ? "locked." : "unlocked."]") else - to_chat(user, "Access denied.") + to_chat(user, span_red("Access denied.")) else ..() diff --git a/code/modules/shieldgen/sheldwallgen.dm b/code/modules/shieldgen/sheldwallgen.dm index 3f4b7c29229..cc78324ba8e 100644 --- a/code/modules/shieldgen/sheldwallgen.dm +++ b/code/modules/shieldgen/sheldwallgen.dm @@ -27,13 +27,13 @@ /obj/machinery/shieldwallgen/attack_hand(mob/user as mob) if(state != 1) - to_chat(user, "The shield generator needs to be firmly secured to the floor first.") + to_chat(user, span_red("The shield generator needs to be firmly secured to the floor first.")) return 1 if(src.locked && !istype(user, /mob/living/silicon)) - to_chat(user, "The controls are locked!") + to_chat(user, span_red("The controls are locked!")) return 1 if(power != 1) - to_chat(user, "The shield generator needs to be powered by wire underneath.") + to_chat(user, span_red("The shield generator needs to be powered by wire underneath.")) return 1 if(src.active >= 1) @@ -105,7 +105,7 @@ src.active = 2 if(src.active >= 1) if(src.power == 0) - src.visible_message("The [src.name] shuts down due to lack of power!", \ + src.visible_message(span_red("The [src.name] shuts down due to lack of power!"), \ "You hear heavy droning fade out") icon_state = "Shield_Gen" src.active = 0 @@ -181,11 +181,11 @@ src.locked = !src.locked to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") else - to_chat(user, "Access denied.") + to_chat(user, span_red("Access denied.")) else src.add_fingerprint(user) - visible_message("The [src.name] has been hit with \the [W.name] by [user.name]!") + visible_message(span_red("The [src.name] has been hit with \the [W.name] by [user.name]!")) /obj/machinery/shieldwallgen/proc/cleanup(var/NSEW) var/obj/machinery/shieldwall/F diff --git a/code/modules/shieldgen/shield_capacitor.dm b/code/modules/shieldgen/shield_capacitor.dm index c32998a0a23..6ec477ceb27 100644 --- a/code/modules/shieldgen/shield_capacitor.dm +++ b/code/modules/shieldgen/shield_capacitor.dm @@ -45,11 +45,11 @@ to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") updateDialog() else - to_chat(user, "Access denied.") + to_chat(user, span_red("Access denied.")) else if(W.has_tool_quality(TOOL_WRENCH)) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) - src.visible_message("\icon[src][bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].") + src.visible_message(span_blue("\icon[src][bicon(src)] [src] has been [anchored ? "bolted to the floor" : "unbolted from the floor"] by [user].")) if(anchored) spawn(0) @@ -121,7 +121,7 @@ switch(action) if("toggle") if(!active && !anchored) - to_chat(usr, "The [src] needs to be firmly secured to the floor first.") + to_chat(usr, span_red("The [src] needs to be firmly secured to the floor first.")) return active = !active . = TRUE @@ -145,4 +145,4 @@ return src.set_dir(turn(src.dir, 270)) - return \ No newline at end of file + return diff --git a/code/modules/shieldgen/shield_gen.dm b/code/modules/shieldgen/shield_gen.dm index 3763f324d7f..5a2cfc2616a 100644 --- a/code/modules/shieldgen/shield_gen.dm +++ b/code/modules/shieldgen/shield_gen.dm @@ -65,11 +65,11 @@ to_chat(user, "Controls are now [src.locked ? "locked." : "unlocked."]") updateDialog() else - to_chat(user, "Access denied.") + to_chat(user, span_red("Access denied.")) else if(W.has_tool_quality(TOOL_WRENCH)) src.anchored = !src.anchored playsound(src, W.usesound, 75, 1) - src.visible_message("\icon[src][bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].") + src.visible_message(span_blue("\icon[src][bicon(src)] [src] has been [anchored?"bolted to the floor":"unbolted from the floor"] by [user].")) if(active) toggle() @@ -204,7 +204,7 @@ switch(action) if("toggle") if (!active && !anchored) - to_chat(usr, "The [src] needs to be firmly secured to the floor first.") + to_chat(usr, span_red("The [src] needs to be firmly secured to the floor first.")) return toggle() . = TRUE diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 04ec3380004..f1d23995c4b 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -332,10 +332,10 @@ for(var/mob/living/M in A) spawn(0) if(M.buckled) - to_chat(M, "Sudden acceleration presses you into \the [M.buckled]!") + to_chat(M, span_red("Sudden acceleration presses you into \the [M.buckled]!")) shake_camera(M, 3, 1) else - to_chat(M, "The floor lurches beneath you!") + to_chat(M, span_red("The floor lurches beneath you!")) shake_camera(M, 10, 1) // TODO - tossing? //M.visible_message("[M.name] is tossed around by the sudden acceleration!") diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index 6cfe6ba6a37..0b0bc59a51b 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -300,7 +300,7 @@ return if(WS.moving_status != SHUTTLE_IDLE) - to_chat(usr, "[WS.visible_name] is busy moving.") + to_chat(usr, span_blue("[WS.visible_name] is busy moving.")) return switch(action) @@ -337,7 +337,7 @@ return if((WS.last_move + WS.cooldown) > world.time) - to_chat(usr, "The ship's drive is inoperable while the engines are charging.") + to_chat(usr, span_red("The ship's drive is inoperable while the engines are charging.")) return var/index = text2num(params["traverse"]) diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm index 6db671d1bb9..0491deac1ac 100644 --- a/code/modules/spells/spell_code.dm +++ b/code/modules/spells/spell_code.dm @@ -90,7 +90,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now take_charge(user, skipcharge) before_cast(targets) //applies any overlays and effects - user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) cast the spell [name].") + user.attack_log += text("\[[time_stamp()]\] [span_red("[user.real_name] ([user.ckey]) cast the spell [name].")]") if(prob(critfailchance)) critfail(targets, user) else @@ -267,7 +267,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now else user.whisper(replacetext(invocation," ","`")) if(SpI_EMOTE) - user.custom_emote(VISIBLE_MESSAGE, invocation) + user.custom_emote(VISIBLE_MESSAGE, invocation) ///////////////////// ///UPGRADING PROCS/// diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index eea8cc1a9ab..d49dda3e7f6 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -270,7 +270,7 @@ else user.add_spell(S) to_chat(user, "you rapidly read through the arcane book. Suddenly you realize you understand [spellname]!") - user.attack_log += text("\[[time_stamp()]\] [user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).") + user.attack_log += text("\[[time_stamp()]\] [span_orange("[user.real_name] ([user.ckey]) learned the spell [spellname] ([S]).")]") onlearned(user) /obj/item/weapon/spellbook/oneuse/proc/recoil(mob/user as mob) diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 698feefe2f3..2dcbf822906 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -305,13 +305,13 @@ var/list/table_icon_cache = list() var/obj/item/weapon/material/shard/S = null if(reinforced) if(reinforced.stack_type && (full_return || prob(20))) - reinforced.place_sheet(loc) + reinforced.place_sheet(loc, 1) else S = reinforced.place_shard(loc) if(S) shards += S if(material) if(material.stack_type && (full_return || prob(20))) - material.place_sheet(loc) + material.place_sheet(loc, 1) else S = material.place_shard(loc) if(S) shards += S diff --git a/code/modules/tgui/modules/communications.dm b/code/modules/tgui/modules/communications.dm index 10429d53cc6..6a726aae9cb 100644 --- a/code/modules/tgui/modules/communications.dm +++ b/code/modules/tgui/modules/communications.dm @@ -347,7 +347,7 @@ to_chat(usr, "Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum.") return CentCom_announce(input, usr) - to_chat(usr, "Message transmitted.") + to_chat(usr, span_blue("Message transmitted.")) log_game("[key_name(usr)] has made an IA [using_map.boss_short] announcement: [input]") centcomm_message_cooldown = world.time + 300 // 30 seconds setMenuState(usr, COMM_SCREEN_MAIN) @@ -365,7 +365,7 @@ to_chat(usr, "Message '[input]' is too short. [COMM_CCMSGLEN_MINIMUM] character minimum.") return Syndicate_announce(input, usr) - to_chat(usr, "Message transmitted.") + to_chat(usr, span_blue("Message transmitted.")) log_game("[key_name(usr)] has made an illegal announcement: [input]") centcomm_message_cooldown = world.time + 300 // 30 seconds diff --git a/code/modules/vehicles/Securitrain_vr.dm b/code/modules/vehicles/Securitrain_vr.dm index fa6049b2dbe..14abfe54fdb 100644 --- a/code/modules/vehicles/Securitrain_vr.dm +++ b/code/modules/vehicles/Securitrain_vr.dm @@ -175,7 +175,7 @@ /obj/vehicle/train/security/trolley/RunOver(var/mob/living/M) ..() - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") /obj/vehicle/train/security/engine/RunOver(var/mob/living/M) ..() @@ -185,9 +185,9 @@ to_chat(D, "You ran over \the [M]!") visible_message("\The [src] ran over \the [M]!") add_attack_logs(D,M,"Ran over with [src.name]") - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey]), driven by [D.name] ([D.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey]), driven by [D.name] ([D.ckey])")]") else - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") //------------------------------------------- diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 850eed66b10..5ee30abc7a3 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -164,19 +164,19 @@ /obj/vehicle/train/trolley/RunOver(var/mob/living/M) ..() - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") /obj/vehicle/train/engine/RunOver(var/mob/living/M) ..() if(is_train_head() && istype(load, /mob/living/carbon/human)) var/mob/living/carbon/human/D = load - to_chat(D, "You ran over [M]!") - visible_message("\The [src] ran over [M]!") + to_chat(D, span_red("You ran over [M]!")) + visible_message(span_red("\The [src] ran over [M]!")) add_attack_logs(D,M,"Ran over with [src.name]") - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey]), driven by [D.name] ([D.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey]), driven by [D.name] ([D.ckey])")]") else - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") //------------------------------------------- diff --git a/code/modules/vehicles/construction.dm b/code/modules/vehicles/construction.dm index 3c81ccc6ae3..d7c22676af9 100644 --- a/code/modules/vehicles/construction.dm +++ b/code/modules/vehicles/construction.dm @@ -203,7 +203,7 @@ /obj/item/weapon/vehicle_assembly/spacebike/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) switch(build_stage) if(0) - if(istype(W, /obj/item/weapon/tank/jetpack) || istype(W, /obj/item/borg/upgrade/jetpack)) + if(istype(W, /obj/item/weapon/tank/jetpack) || istype(W, /obj/item/borg/upgrade/advanced/jetpack)) user.drop_item() qdel(W) increase_step() diff --git a/code/modules/vehicles/rover_vr.dm b/code/modules/vehicles/rover_vr.dm index 55825088378..d0458ae821f 100644 --- a/code/modules/vehicles/rover_vr.dm +++ b/code/modules/vehicles/rover_vr.dm @@ -173,7 +173,7 @@ /obj/vehicle/train/rover/trolley/RunOver(var/mob/living/M) ..() - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") /obj/vehicle/train/rover/engine/RunOver(var/mob/living/M) ..() @@ -183,9 +183,9 @@ to_chat(D, "You ran over \the [M]!") visible_message("\The [src] ran over \the [M]!") add_attack_logs(D,M,"Ran over with [src.name]") - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey]), driven by [D.name] ([D.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey]), driven by [D.name] ([D.ckey])")]") else - attack_log += text("\[[time_stamp()]\] ran over [M.name] ([M.ckey])") + attack_log += text("\[[time_stamp()]\] [span_red("ran over [M.name] ([M.ckey])")]") //------------------------------------------- diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index a92b9828f6b..be09f4986e2 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -50,12 +50,12 @@ if(emagged) if(istype(A, /mob/living)) var/mob/living/M = A - visible_message("[src] knocks over [M]!") + visible_message(span_red("[src] knocks over [M]!")) M.apply_effects(5, 5) //knock people down if you hit them M.apply_damages(22 / move_delay) // and do damage according to how fast the train is going if(istype(load, /mob/living/carbon/human)) var/mob/living/D = load - to_chat(D, "You hit [M]!") + to_chat(D, span_red("You hit [M]!")) add_attack_logs(D,M,"Ran over with [src.name]") //trains are commonly open topped, so there is a chance the projectile will hit the mob riding the train instead @@ -99,7 +99,7 @@ unload(user, direction) - to_chat(user, "You climb down from [src].") + to_chat(user, span_blue("You climb down from [src].")) return 1 @@ -110,7 +110,7 @@ latch(C, user) else if(!load(C, user)) - to_chat(user, "You were unable to load [C] on [src].") + to_chat(user, span_red("You were unable to load [C] on [src].")) /obj/vehicle/train/attack_hand(mob/user as mob) if(user.stat || user.restrained() || !Adjacent(user)) @@ -149,17 +149,17 @@ /obj/vehicle/train/proc/attach_to(obj/vehicle/train/T, mob/user) if (get_dist(src, T) > 1) if(user) - to_chat(user, "[src] is too far away from [T] to hitch them together.") + to_chat(user, span_red("[src] is too far away from [T] to hitch them together.")) return if (lead) if(user) - to_chat(user, "[src] is already hitched to something.") + to_chat(user, span_red("[src] is already hitched to something.")) return if (T.tow) if(user) - to_chat(user, "[T] is already towing something.") + to_chat(user, span_red("[T] is already towing something.")) return //check for cycles. @@ -167,7 +167,7 @@ while (next_car) if (next_car == src) if(user) - to_chat(user, "That seems very silly.") + to_chat(user, span_red("That seems very silly.")) return next_car = next_car.lead @@ -177,7 +177,7 @@ set_dir(lead.dir) if(user) - to_chat(user, "You hitch [src] to [T].") + to_chat(user, span_blue("You hitch [src] to [T].")) update_stats() @@ -185,13 +185,13 @@ //detaches the train from whatever is towing it /obj/vehicle/train/proc/unattach(mob/user) if (!lead) - to_chat(user, "[src] is not hitched to anything.") + to_chat(user, span_red("[src] is not hitched to anything.")) return lead.tow = null lead.update_stats() - to_chat(user, "You unhitch [src] from [lead].") + to_chat(user, span_blue("You unhitch [src] from [lead].")) lead = null update_stats() diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index 6fbb98c549d..409c649caa7 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -118,7 +118,7 @@ health = min(maxhealth, health+10) user.setClickCooldown(user.get_attack_speed(W)) playsound(src, T.usesound, 50, 1) - user.visible_message("[user] repairs [src]!"," You repair [src]!") + user.visible_message(span_red("[user] repairs [src]!"),span_blue("You repair [src]!")) else to_chat(user, "Unable to repair with the maintenance panel closed.") else @@ -233,7 +233,7 @@ return TRUE /obj/vehicle/proc/explode() - src.visible_message("[src] blows apart!", 1) + src.visible_message(span_red("[src] blows apart!"), 1) var/turf/Tsec = get_turf(src) //stuns people who are thrown off a train that has been blown up @@ -409,7 +409,7 @@ if(!damage) return visible_message("[user] [attack_message] the [src]!") - user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") + user.attack_log += text("\[[time_stamp()]\] [span_red("attacked [src.name]")]") user.do_attack_animation(src) src.health -= damage if(mechanical && prob(10)) diff --git a/code/modules/virus2/biohazard destroyer.dm b/code/modules/virus2/biohazard destroyer.dm index fe5bb7c8538..e4cdeafd23a 100644 --- a/code/modules/virus2/biohazard destroyer.dm +++ b/code/modules/virus2/biohazard destroyer.dm @@ -17,4 +17,4 @@ I.loc = src.loc for(var/mob/O in hearers(src, null)) - O.show_message("\icon[src][bicon(src)] The [src.name] beeps.", 2) \ No newline at end of file + O.show_message(span_blue("\icon[src][bicon(src)] The [src.name] beeps."), 2) diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index 4fae221b5a6..a5744d3c5b2 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -31,7 +31,7 @@ report("Antibodies detected: [antigens2string(C.antibodies)]", user) /obj/item/device/antibody_scanner/proc/report(var/text, mob/user as mob) - to_chat(user, "\icon[src][bicon(src)] \The [src] beeps, \"[text]\"") + to_chat(user, "[span_blue("\icon[src][bicon(src)] \The [src] beeps,")] \"[span_blue("[text]")]\"") ///////////////VIRUS DISH/////////////// diff --git a/code/modules/vore/chat_healthbars.dm b/code/modules/vore/chat_healthbars.dm new file mode 100644 index 00000000000..f64be8c25ba --- /dev/null +++ b/code/modules/vore/chat_healthbars.dm @@ -0,0 +1,118 @@ +//Health bars in the game window would be pretty challenging and I don't know how to do that, so I thought this would be a good alternative + +/mob/living/proc/chat_healthbar(var/mob/living/reciever, onExamine = FALSE, override = FALSE) + if(!reciever) //No one to send it to, don't bother + return + if(!reciever.client) //No one is home, don't bother + return + if(!override) //Did the person push the verb? Ignore the pref + if(!reciever.client.is_preference_enabled(/datum/client_preference/vore_health_bars)) + return + var/ourpercent = 0 + + if(ishuman(src)) //humans don't die or become unconcious at 0%, it's actually like -50% or something, so, let's pretend they have 50 more health than they do + ourpercent = ((health + 50) / (maxHealth + 50)) * 100 + else + ourpercent = (health / maxHealth) * 100 + + var/ourbar = "" + var/obj/belly/ourbelly = src.loc + var/which_var = "Health" + if(ourbelly.digest_mode == "Absorb" || ourbelly.digest_mode == "Drain") + ourpercent = round(((nutrition - 100) / 500) * 100) + which_var = "Nutrition" //It's secretly also a nutrition bar depending on your digest mode + + ourpercent = round(ourpercent) + + switch(ourpercent) //I thought about trying to do this in a more automated way but my brain isn't very large so enjoy my stupid switch statement + if(100) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–“â–“â–“|" + if(95 to 99) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–“â–“â–’|" + if(90 to 94) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–“â–“â–‘|" + if(85 to 89) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–“â–’â–‘|" + if(80 to 84) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–“â–‘â–‘|" + if(75 to 79) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–’â–‘â–‘|" + if(70 to 74) + ourbar = "|â–“â–“â–“â–“â–“â–“â–“â–‘â–‘â–‘|" + if(65 to 69) + ourbar = "|â–“â–“â–“â–“â–“â–“â–’â–‘â–‘â–‘|" + if(60 to 64) + ourbar = "|â–“â–“â–“â–“â–“â–“â–‘â–‘â–‘â–‘|" + if(55 to 59) + ourbar = "|â–“â–“â–“â–“â–“â–’â–‘â–‘â–‘â–‘|" + if(50 to 54) + ourbar = "|â–“â–“â–“â–“â–“â–‘â–‘â–‘â–‘â–‘|" + if(45 to 49) + ourbar = "|â–“â–“â–“â–“â–’â–‘â–‘â–‘â–‘â–‘|" + if(40 to 44) + ourbar = "|â–“â–“â–“â–“â–‘â–‘â–‘â–‘â–‘â–‘|" + if(35 to 39) + ourbar = "|â–“â–“â–“â–’â–‘â–‘â–‘â–‘â–‘â–‘|" + if(30 to 34) + ourbar = "|â–“â–“â–“â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + if(25 to 29) + ourbar = "|â–“â–“â–’â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + if(20 to 24) + ourbar = "|â–“â–“â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + if(15 to 19) + ourbar = "|â–“â–’â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + if(10 to 14) + ourbar = "|â–“â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + if(5 to 9) + ourbar = "|â–’â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + if(0) + ourbar = "|â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘|" + else + ourbar = "!â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘â–‘!" + + ourbar = "[ourbar] [which_var] - [src.name]" + + if(stat == UNCONSCIOUS) + ourbar = "[ourbar] - [span_orange("UNCONSCIOUS")]" + else if(stat == DEAD) + ourbar = "[ourbar] - [span_red("DEAD")]" + if(absorbed) + ourbar = span_purple("[ourbar] - ABSORBED") //Absorb is a little funny, I didn't want it to say 'absorbing ABSORBED' so we did it different + else if(ourpercent > 99 && ourbelly.digest_mode == DM_HEAL) + ourbar = span_green("[ourbar] - [ourbelly.digest_mode]ed") + else if(ourpercent > 75) + ourbar = span_green("[ourbar] - [ourbelly.digest_mode]ing") + else if(ourpercent > 50) + ourbar = span_yellow("[ourbar] - [ourbelly.digest_mode]ing") + else if(ourpercent > 25) + ourbar = span_orange("[ourbar] - [ourbelly.digest_mode]ing") + else if(ourpercent > 0) + ourbar = span_red("[ourbar] - [ourbelly.digest_mode]ing") + else + ourbar = span_red("[ourbar] - [ourbelly.digest_mode]ed") + + if(onExamine) + to_chat(reciever,"[ourbar]") + else + to_chat(reciever,"[ourbar]") + +/mob/living/verb/print_healthbars() + set name = "Print Prey Healthbars" + set category = "Abilities" + + var/nuffin = TRUE + for(var/obj/belly/b in vore_organs) + if(!b.contents.len) + continue + var/belly_announce = FALSE //We only want to announce the belly once + for(var/thing as anything in b.contents) + if(!isliving(thing)) + continue + if(!belly_announce) + to_chat(src, "[b.digest_mode] - Within [b.name]:") //We only want to announce the belly if we found something + belly_announce = TRUE + var/mob/living/ourmob = thing + ourmob.chat_healthbar(src, TRUE, TRUE) + nuffin = FALSE + if(nuffin) + to_chat(src, "There are no mobs within any of your bellies to print health bars for.") diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 960c406c039..f2852621ecb 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -181,13 +181,13 @@ "You feel your %belly beginning to become active!") var/list/digest_chance_messages_prey = list( - "In response to your struggling, %owner's %belly begins to get more active...") + "In response to your struggling, %pred's %belly begins to get more active...") var/list/absorb_chance_messages_owner = list( "You feel your %belly start to cling onto its contents...") var/list/absorb_chance_messages_prey = list( - "In response to your struggling, %owner's %belly begins to cling more tightly...") + "In response to your struggling, %pred's %belly begins to cling more tightly...") var/list/digest_messages_owner = list( "You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.", @@ -551,7 +551,7 @@ //Print notifications/sound if necessary if(!silent && count) - owner.visible_message("[owner] [release_verb] everything from their [lowertext(name)]!", range = privacy_range) + owner.visible_message("[span_green("[owner] [release_verb] everything from their [lowertext(name)]!")]", range = privacy_range) var/soundfile if(!fancy_vore) soundfile = classic_release_sounds[release_sound] @@ -631,7 +631,7 @@ //Print notifications/sound if necessary if(!silent) - owner.visible_message("[owner] [release_verb] [M] from their [lowertext(name)]!",range = privacy_range) + owner.visible_message("[span_green("[owner] [release_verb] [M] from their [lowertext(name)]!")]",range = privacy_range) var/soundfile if(!fancy_vore) soundfile = classic_release_sounds[release_sound] @@ -703,7 +703,7 @@ formatted_message = replacetext(formatted_message, "%countprey", living_count) formatted_message = replacetext(formatted_message, "%count", contents.len) - return("[formatted_message]") + return(span_red("[formatted_message]")) /obj/belly/proc/get_examine_msg_absorbed() if(!(contents.len) || !(examine_messages_absorbed.len) || !display_absorbed_examine) @@ -727,7 +727,7 @@ formatted_message = replacetext(formatted_message, "%prey", english_list(absorbed_victims)) formatted_message = replacetext(formatted_message, "%countprey", absorbed_count) - return("[formatted_message]") + return(span_red("[formatted_message]")) // The next function gets the messages set on the belly, in human-readable format. // This is useful in customization boxes and such. The delimiter right now is \n\n so diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm index b6a39fa96af..8892f29cf1a 100644 --- a/code/modules/vore/eating/bellymodes_datum_vr.dm +++ b/code/modules/vore/eating/bellymodes_datum_vr.dm @@ -40,6 +40,7 @@ GLOBAL_LIST_INIT(digest_modes, list()) return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("fancy_death_pred"))) // Deal digestion damage (and feed the pred) + var/old_health = L.health var/old_brute = L.getBruteLoss() var/old_burn = L.getFireLoss() var/old_oxy = L.getOxyLoss() @@ -59,6 +60,9 @@ GLOBAL_LIST_INIT(digest_modes, list()) var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02 var/difference = B.owner.size_multiplier / L.size_multiplier + + consider_healthbar(L, old_health, B.owner) + if(isrobot(B.owner)) var/mob/living/silicon/robot/R = B.owner R.cell.charge += 25 * damage_gain @@ -76,10 +80,15 @@ GLOBAL_LIST_INIT(digest_modes, list()) /datum/digest_mode/absorb/process_mob(obj/belly/B, mob/living/L) if(!L.absorbable || L.absorbed) return null + + var/old_nutrition = L.nutrition B.steal_nutrition(L) if(L.nutrition < 100) B.absorb_living(L) + consider_healthbar(L, old_nutrition, B.owner) return list("to_update" = TRUE) + else + consider_healthbar(L, old_nutrition, B.owner) /datum/digest_mode/unabsorb id = DM_UNABSORB @@ -95,7 +104,9 @@ GLOBAL_LIST_INIT(digest_modes, list()) noise_chance = 10 /datum/digest_mode/drain/process_mob(obj/belly/B, mob/living/L) + var/old_nutrition = L.nutrition B.steal_nutrition(L) + consider_healthbar(L, old_nutrition, B.owner) /datum/digest_mode/drain/shrink id = DM_SHRINK @@ -295,4 +306,115 @@ GLOBAL_LIST_INIT(digest_modes, list()) tempmode = DM_DIGEST // If not absorbable, are they digestible? Then digest. else tempmode = DM_DRAIN // Otherwise drain. - return tempmode \ No newline at end of file + return tempmode + +/datum/digest_mode/proc/consider_healthbar() + return + +/datum/digest_mode/digest/consider_healthbar(mob/living/L, old_health, mob/living/reciever) + + if(old_health <= L.health) + return + + var/old_percent + var/new_percent + + if(ishuman(L)) + old_percent = ((old_health + 50) / (L.maxHealth + 50)) * 100 + new_percent = ((L.health + 50) / (L.maxHealth + 50)) * 100 + else + old_percent = (old_health / L.maxHealth) * 100 + new_percent = (L.health / L.maxHealth) * 100 + + var/lets_announce = FALSE + if(new_percent <= 99 && old_percent > 99) + lets_announce = TRUE + else if(new_percent <= 75 && old_percent > 75) + lets_announce = TRUE + else if(new_percent <= 50 && old_percent > 50) + lets_announce = TRUE + else if(new_percent <= 25 && old_percent > 25) + lets_announce = TRUE + else if(new_percent <= 5 && old_percent > 5) + lets_announce = TRUE + + if(lets_announce) + L.chat_healthbar(reciever) + L.chat_healthbar(L) + +/datum/digest_mode/heal/consider_healthbar(mob/living/L, old_health, mob/living/reciever) + + if(old_health >= L.health) + return + + var/old_percent + var/new_percent + + if(ishuman(L)) + old_percent = ((old_health + 50) / (L.maxHealth + 50)) * 100 + new_percent = ((L.health + 50) / (L.maxHealth + 50)) * 100 + else + old_percent = (old_health / L.maxHealth) * 100 + new_percent = (L.health / L.maxHealth) * 100 + + var/lets_announce = FALSE + if(new_percent >= 100 && old_percent < 100) + lets_announce = TRUE + else if(new_percent >= 75 && old_percent < 75) + lets_announce = TRUE + else if(new_percent >= 50 && old_percent < 50) + lets_announce = TRUE + else if(new_percent >= 25 && old_percent < 25) + lets_announce = TRUE + else if(new_percent >= 5 && old_percent < 5) + lets_announce = TRUE + + if(lets_announce) + L.chat_healthbar(reciever) + L.chat_healthbar(L) + +/datum/digest_mode/absorb/consider_healthbar(mob/living/L, old_nutrition, mob/living/reciever) + if(old_nutrition <= L.nutrition) + return + + var/old_percent = ((old_nutrition - 100) / 500) * 100 + var/new_percent = ((L.nutrition - 100) / 500) * 100 + var/lets_announce = FALSE + if(new_percent <= 99 && old_percent > 99) + lets_announce = TRUE + else if(new_percent <= 75 && old_percent > 75) + lets_announce = TRUE + else if(new_percent <= 50 && old_percent > 50) + lets_announce = TRUE + else if(new_percent <= 25 && old_percent > 25) + lets_announce = TRUE + else if(new_percent <= 0 && old_percent > 0) + lets_announce = TRUE + + if(lets_announce) + L.chat_healthbar(reciever) + L.chat_healthbar(L) + +/datum/digest_mode/drain/consider_healthbar(mob/living/L, old_nutrition, mob/living/reciever) + + if(old_nutrition <= L.nutrition) + return + + var/old_percent = ((old_nutrition - 100) / 500) * 100 + var/new_percent = ((L.nutrition - 100) / 500) * 100 + + var/lets_announce = FALSE + if(new_percent <= 99 && old_percent > 99) + lets_announce = TRUE + else if(new_percent <= 75 && old_percent > 75) + lets_announce = TRUE + else if(new_percent <= 50 && old_percent > 50) + lets_announce = TRUE + else if(new_percent <= 25 && old_percent > 25) + lets_announce = TRUE + else if(new_percent <= 0 && old_percent > 0) + lets_announce = TRUE + + if(lets_announce) + L.chat_healthbar(reciever) + L.chat_healthbar(L) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 8fa43b135a3..7a7878ee454 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -629,6 +629,9 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if(!results || !results.len) results = list("You were unable to examine that. Tell a developer!") to_chat(user, jointext(results, "
    ")) + if(isliving(target)) + var/mob/living/ourtarget = target + ourtarget.chat_healthbar(user, TRUE) return TRUE if("Use Hand") @@ -649,19 +652,19 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", to_chat(user, "You can't do that in your state!") return TRUE - to_chat(user,"You begin to push [M] to freedom!") - to_chat(M,"[host] begins to push you to freedom!") - to_chat(OB.owner,"Someone is trying to escape from inside you!") + to_chat(user,"[span_green("You begin to push [M] to freedom!")]") + to_chat(M,"[host] begins to push you to freedom!") + to_chat(OB.owner,"Someone is trying to escape from inside you!") sleep(50) if(prob(33)) OB.release_specific_contents(M) - to_chat(user,"You manage to help [M] to safety!") - to_chat(M,"[host] pushes you free!") - to_chat(OB.owner,"[M] forces free of the confines of your body!") + to_chat(user,"[span_green("You manage to help [M] to safety!")]") + to_chat(M, "[span_green("[host] pushes you free!")]") + to_chat(OB.owner,"[M] forces free of the confines of your body!") else - to_chat(user,"[M] slips back down inside despite your efforts.") - to_chat(M," Even with [host]'s help, you slip back inside again.") - to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") + to_chat(user,"[M] slips back down inside despite your efforts.") + to_chat(M," Even with [host]'s help, you slip back inside again.") + to_chat(OB.owner,"[span_green("Your body efficiently shoves [M] back where they belong.")]") return TRUE if("Devour") //Eat the inside mob @@ -674,15 +677,15 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", return TRUE var/obj/belly/TB = host.vore_selected - to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M,"[host] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - to_chat(OB.owner,"Someone inside you is eating someone else!") + to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[host] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you is eating someone else!") sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound. if((host in OB) && (M in OB)) //Make sure they're still here. - to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M,"[host] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - to_chat(OB.owner,"Someone inside you has eaten someone else!") + to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[host] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you has eaten someone else!") if(M.absorbed) M.absorbed = FALSE OB.handle_absorb_langs(M, OB.owner) @@ -716,7 +719,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", return FALSE for(var/atom/movable/target in host.vore_selected) - to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected)] to their [lowertext(choice.name)]!") + to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected)] to their [lowertext(choice.name)]!") host.vore_selected.transfer_contents(target, choice, 1) return TRUE return @@ -739,6 +742,9 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if(!results || !results.len) results = list("You were unable to examine that. Tell a developer!") to_chat(user, jointext(results, "
    ")) + if(isliving(target)) + var/mob/living/ourtarget = target + ourtarget.chat_healthbar(user, TRUE) return TRUE if("Eject") @@ -756,7 +762,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", var/obj/belly/choice = tgui_input_list(usr, "Move [target] where?","Select Belly", host.vore_organs) if(!choice || !(target in host.vore_selected)) return TRUE - to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!") + to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!") host.vore_selected.transfer_contents(target, choice) @@ -785,18 +791,18 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", return TRUE if(belly_owner != host) - to_chat(user, "Transfer offer sent. Await their response.") + to_chat(user, "Transfer offer sent. Await their response.") var/accepted = tgui_alert(belly_owner, "[host] is trying to transfer [target] from their [lowertext(host.vore_selected.name)] into your [lowertext(choice.name)]. Do you accept?", "Feeding Offer", list("Yes", "No")) if(accepted != "Yes") - to_chat(user, "[belly_owner] refused the transfer!!") + to_chat(user, "[belly_owner] refused the transfer!!") return TRUE if(!belly_owner || !(belly_owner in range(1, host))) return TRUE - to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to [belly_owner]'s [lowertext(choice.name)]!") - to_chat(belly_owner,"[target] is squished from [host]'s [lowertext(host.vore_selected.name)] to your [lowertext(choice.name)]!") + to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to [belly_owner]'s [lowertext(choice.name)]!") + to_chat(belly_owner,"[target] is squished from [host]'s [lowertext(host.vore_selected.name)] to your [lowertext(choice.name)]!") host.vore_selected.transfer_contents(target, choice) else - to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!") + to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!") host.vore_selected.transfer_contents(target, choice) return TRUE @@ -826,27 +832,27 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", if(process_options.len) process_options += "Cancel" else - to_chat(usr, "You cannot instantly process [ourtarget].") + to_chat(usr, "You cannot instantly process [ourtarget].") return var/ourchoice = tgui_input_list(usr, "How would you prefer to process \the [target]? This will perform the given action instantly if the prey accepts.","Instant Process", process_options) if(!ourchoice) return if(!ourtarget.client) - to_chat(usr, "You cannot instantly process [ourtarget].") + to_chat(usr, "You cannot instantly process [ourtarget].") return var/obj/belly/b = ourtarget.loc switch(ourchoice) if("Digest") if(ourtarget.absorbed) - to_chat(usr, "\The [ourtarget] is absorbed, and cannot presently be digested.") + to_chat(usr, "\The [ourtarget] is absorbed, and cannot presently be digested.") return if(tgui_alert(ourtarget, "\The [usr] is attempting to instantly digest you. Is this something you are okay with happening to you?","Instant Digest", list("No", "Yes")) != "Yes") - to_chat(usr, "\The [ourtarget] declined your digest attempt.") - to_chat(ourtarget, "You declined the digest attempt.") + to_chat(usr, "\The [ourtarget] declined your digest attempt.") + to_chat(ourtarget, "You declined the digest attempt.") return if(ourtarget.loc != b) - to_chat(usr, "\The [ourtarget] is no longer in \the [b].") + to_chat(usr, "\The [ourtarget] is no longer in \the [b].") return if(isliving(usr)) var/mob/living/l = usr @@ -865,11 +871,11 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", b.handle_digestion_death(ourtarget) if("Absorb") if(tgui_alert(ourtarget, "\The [usr] is attempting to instantly absorb you. Is this something you are okay with happening to you?","Instant Absorb", list("No", "Yes")) != "Yes") - to_chat(usr, "\The [ourtarget] declined your absorb attempt.") - to_chat(ourtarget, "You declined the absorb attempt.") + to_chat(usr, "\The [ourtarget] declined your absorb attempt.") + to_chat(ourtarget, "You declined the absorb attempt.") return if(ourtarget.loc != b) - to_chat(usr, "\The [ourtarget] is no longer in \the [b].") + to_chat(usr, "\The [ourtarget] is no longer in \the [b].") return if(isliving(usr)) var/mob/living/l = usr @@ -884,7 +890,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", var/target_health = round((H.health/H.getMaxHealth())*100) var/condition var/condition_consequences - to_chat(usr, "\The [target] is at [target_health]% health.") + to_chat(usr, "\The [target] is at [target_health]% health.") if(H.blinded) condition += "blinded" condition_consequences += "hear emotes" @@ -901,7 +907,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono", condition += "sleeping" condition_consequences += "hear or do anything" if(condition) - to_chat(usr, "\The [target] is currently [condition], they will not be able to [condition_consequences].") + to_chat(usr, "\The [target] is currently [condition], they will not be able to [condition_consequences].") return diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index de9be69996a..0c2f9afa2ab 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -547,7 +547,7 @@ //Chica Head /obj/item/clothing/head/helmet/fluff/freddy/chica - desc = "LET'S EAT!" + desc = span_red("LET'S EAT!") icon_state = "chicahead" item_state = "chicahead_mob" @@ -586,7 +586,7 @@ //Chica Suit /obj/item/clothing/suit/fluff/freddy/chica - desc = "LET'S EAT!" + desc = span_red("LET'S EAT!") icon_state = "chicasuit" item_state = "chicasuit_mob" diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index f75ecaeed02..c5fc1f3648e 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -155,7 +155,7 @@ M.visible_message("\The [H]'s bracelet flashes and absorbs the beam!","Your bracelet flashes and absorbs the beam!") return if(!M.resize(set_size, uncapped = M.has_large_resize_bounds(), ignore_prefs = ignoring_prefs)) - to_chat(M, "The beam fires into your body, changing your size!") + to_chat(M, span_blue("The beam fires into your body, changing your size!")) M.update_icon() return return 1 @@ -175,7 +175,7 @@ M.resize(set_size, uncapped = TRUE, ignore_prefs = TRUE) // Always ignores prefs, caution is advisable - to_chat(M, "The beam fires into your body, changing your size!") + to_chat(M, span_blue("The beam fires into your body, changing your size!")) M.update_icon() return return 1 diff --git a/code/modules/xenoarcheaology/artifacts/crystal.dm b/code/modules/xenoarcheaology/artifacts/crystal.dm index a1d93d824b5..fecf94098d1 100644 --- a/code/modules/xenoarcheaology/artifacts/crystal.dm +++ b/code/modules/xenoarcheaology/artifacts/crystal.dm @@ -17,7 +17,7 @@ "It's mesmerizing to behold.") /obj/structure/crystal/Destroy() - src.visible_message("[src] shatters!") + src.visible_message(span_red("[src] shatters!")) if(prob(75)) new /obj/item/weapon/material/shard/phoron(src.loc) if(prob(50)) diff --git a/code/modules/xenoarcheaology/effect.dm b/code/modules/xenoarcheaology/effect.dm index bccb9faa0e8..966e55d05d5 100644 --- a/code/modules/xenoarcheaology/effect.dm +++ b/code/modules/xenoarcheaology/effect.dm @@ -92,7 +92,7 @@ var/atom/toplevelholder = target while(!istype(toplevelholder.loc, /turf)) toplevelholder = toplevelholder.loc - toplevelholder.visible_message("\icon[toplevelholder][bicon(toplevelholder)] [toplevelholder] [display_msg]") + toplevelholder.visible_message("[span_red("\icon[toplevelholder][bicon(toplevelholder)] [toplevelholder] [display_msg]")]") /datum/artifact_effect/proc/DoEffectTouch(var/mob/user) /datum/artifact_effect/proc/DoEffectAura(var/atom/holder) diff --git a/code/modules/xenoarcheaology/effect_master.dm b/code/modules/xenoarcheaology/effect_master.dm index b320cbead37..ddb77f661a6 100644 --- a/code/modules/xenoarcheaology/effect_master.dm +++ b/code/modules/xenoarcheaology/effect_master.dm @@ -260,7 +260,7 @@ return if (get_dist(user, holder) > 1) - to_chat(user, "You can't reach [holder] from here.") + to_chat(user, "[span_red("You can't reach [holder] from here.")]") return if(ishuman(user) && user:gloves) to_chat(user, "You touch [holder] with your gloved hands, [pick("but nothing of note happens","but nothing happens","but nothing interesting happens","but you notice nothing different","but nothing seems to have happened")].") @@ -418,4 +418,3 @@ //NITROGEN GAS ACTIVATION if(my_effect.trigger == TRIGGER_NITRO && (trigger_nitro ^ my_effect.activated)) my_effect.ToggleActivate() - diff --git a/code/modules/xenoarcheaology/effects/badfeeling.dm b/code/modules/xenoarcheaology/effects/badfeeling.dm index 2a7e480e18d..da5e8f5bee2 100644 --- a/code/modules/xenoarcheaology/effects/badfeeling.dm +++ b/code/modules/xenoarcheaology/effects/badfeeling.dm @@ -34,9 +34,9 @@ var/mob/living/carbon/human/H = user if(prob(50)) if(prob(75)) - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_red("[pick(drastic_messages)]")) else - to_chat(H, "[pick(messages)]") + to_chat(H, span_red("[pick(messages)]")) if(prob(50)) H.dizziness += rand(3,5) @@ -48,9 +48,9 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(5)) if(prob(75)) - to_chat(H, "[pick(messages)]") + to_chat(H, span_red("[pick(messages)]")) else - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_red("[pick(drastic_messages)]")) if(prob(10)) H.dizziness += rand(3,5) @@ -63,9 +63,9 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(50)) if(prob(95)) - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_red("[pick(drastic_messages)]")) else - to_chat(H, "[pick(messages)]") + to_chat(H, span_red("[pick(messages)]")) if(prob(50)) H.dizziness += rand(3,5) diff --git a/code/modules/xenoarcheaology/effects/cannibal.dm b/code/modules/xenoarcheaology/effects/cannibal.dm index ad584ccc7cd..ba1b4a616c4 100644 --- a/code/modules/xenoarcheaology/effects/cannibal.dm +++ b/code/modules/xenoarcheaology/effects/cannibal.dm @@ -35,9 +35,9 @@ if(H.is_sentient()) if(prob(50)) if(prob(75)) - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_red("[pick(drastic_messages)]")) else - to_chat(H, "[pick(messages)]") + to_chat(H, span_red("[pick(messages)]")) if(prob(50)) H.dizziness += rand(3,5) @@ -51,9 +51,9 @@ if(H.is_sentient()) if(prob(5)) if(prob(75)) - to_chat(H, "[pick(messages)]") + to_chat(H, span_red("[pick(messages)]")) else - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_red("[pick(drastic_messages)]")) if(prob(10)) H.dizziness += rand(3,5) @@ -68,9 +68,9 @@ if(H.is_sentient()) if(prob(50)) if(prob(95)) - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_red("[pick(drastic_messages)]")) else - to_chat(H, "[pick(messages)]") + to_chat(H, span_red("[pick(messages)]")) if(prob(50)) H.dizziness += rand(3,5) diff --git a/code/modules/xenoarcheaology/effects/cold.dm b/code/modules/xenoarcheaology/effects/cold.dm index f20fdf00d55..1b922f91323 100644 --- a/code/modules/xenoarcheaology/effects/cold.dm +++ b/code/modules/xenoarcheaology/effects/cold.dm @@ -14,7 +14,7 @@ /datum/artifact_effect/cold/DoEffectTouch(var/mob/user) var/atom/holder = get_master_holder() if(holder) - to_chat(user, "A chill passes up your spine!") + to_chat(user, span_blue("A chill passes up your spine!")) var/datum/gas_mixture/env = holder.loc.return_air() if(env) env.temperature = max(env.temperature - rand(5,50), 0) diff --git a/code/modules/xenoarcheaology/effects/goodfeeling.dm b/code/modules/xenoarcheaology/effects/goodfeeling.dm index 42b1be7e3a2..10678a9600e 100644 --- a/code/modules/xenoarcheaology/effects/goodfeeling.dm +++ b/code/modules/xenoarcheaology/effects/goodfeeling.dm @@ -32,9 +32,9 @@ var/mob/living/carbon/human/H = user if(prob(50)) if(prob(75)) - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_blue("[pick(drastic_messages)]")) else - to_chat(H, "[pick(messages)]") + to_chat(H, span_blue("[pick(messages)]")) if(prob(50)) H.dizziness += rand(3,5) @@ -46,9 +46,9 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(5)) if(prob(75)) - to_chat(H, "[pick(messages)]") + to_chat(H, span_blue("[pick(messages)]")) else - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_blue("[pick(drastic_messages)]")) if(prob(5)) H.dizziness += rand(3,5) @@ -61,9 +61,9 @@ for (var/mob/living/carbon/human/H in range(src.effectrange,T)) if(prob(50)) if(prob(95)) - to_chat(H, "[pick(drastic_messages)]") + to_chat(H, span_blue("[pick(drastic_messages)]")) else - to_chat(H, "[pick(messages)]") + to_chat(H, span_blue("[pick(messages)]")) if(prob(50)) H.dizziness += rand(3,5) diff --git a/code/modules/xenoarcheaology/effects/heal.dm b/code/modules/xenoarcheaology/effects/heal.dm index 313bbc011e5..db0cf9d05ed 100644 --- a/code/modules/xenoarcheaology/effects/heal.dm +++ b/code/modules/xenoarcheaology/effects/heal.dm @@ -9,7 +9,7 @@ var/weakness = GetAnomalySusceptibility(toucher) if(prob(weakness * 100)) var/mob/living/carbon/C = toucher - to_chat(C, "You feel a soothing energy invigorate you.") + to_chat(C, span_blue("You feel a soothing energy invigorate you.")) if(ishuman(toucher)) var/mob/living/carbon/human/H = toucher @@ -42,7 +42,7 @@ var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) if(prob(10)) - to_chat(C, "You feel a soothing energy radiating from something nearby.") + to_chat(C, span_blue("You feel a soothing energy radiating from something nearby.")) C.adjustBruteLoss(-1 * weakness) C.adjustFireLoss(-1 * weakness) C.adjustToxLoss(-1 * weakness) @@ -58,7 +58,7 @@ for (var/mob/living/carbon/C in range(src.effectrange,T)) var/weakness = GetAnomalySusceptibility(C) if(prob(weakness * 100)) - to_chat(C, "A wave of energy invigorates you.") + to_chat(C, span_blue("A wave of energy invigorates you.")) C.adjustBruteLoss(-5 * weakness) C.adjustFireLoss(-5 * weakness) C.adjustToxLoss(-5 * weakness) diff --git a/code/modules/xenoarcheaology/effects/heat.dm b/code/modules/xenoarcheaology/effects/heat.dm index 0bb3ae1f104..1dbab3eecf2 100644 --- a/code/modules/xenoarcheaology/effects/heat.dm +++ b/code/modules/xenoarcheaology/effects/heat.dm @@ -13,7 +13,7 @@ /datum/artifact_effect/heat/DoEffectTouch(var/mob/user) var/atom/holder = get_master_holder() if(holder) - to_chat(user, " You feel a wave of heat travel up your spine!") + to_chat(user, span_red("You feel a wave of heat travel up your spine!")) var/datum/gas_mixture/env = holder.loc.return_air() if(env) env.temperature += rand(5,50) diff --git a/code/modules/xenoarcheaology/effects/resurrect.dm b/code/modules/xenoarcheaology/effects/resurrect.dm index 0fbb8c6aef4..0fb7c1b88fc 100644 --- a/code/modules/xenoarcheaology/effects/resurrect.dm +++ b/code/modules/xenoarcheaology/effects/resurrect.dm @@ -58,9 +58,9 @@ if(!H.client && H.mind) for(var/mob/observer/dead/ghost in player_list) if(ghost.mind == H.mind) - to_chat(ghost, "An artifact is trying to \ + to_chat(ghost, "[span_interface("An artifact is trying to \ revive you. Return to your body if you want to be resurrected! \ - (Verbs -> Ghost -> Re-enter corpse)") + (Verbs -> Ghost -> Re-enter corpse)")]") break H.adjustBruteLoss(-40) diff --git a/code/modules/xenoarcheaology/effects/roboheal.dm b/code/modules/xenoarcheaology/effects/roboheal.dm index 16660029b77..f8a1820bcb8 100644 --- a/code/modules/xenoarcheaology/effects/roboheal.dm +++ b/code/modules/xenoarcheaology/effects/roboheal.dm @@ -12,7 +12,7 @@ if(user) if (istype(user, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user - to_chat(R, "Your systems report damaged components mending by themselves!") + to_chat(R, span_blue("Your systems report damaged components mending by themselves!")) R.adjustBruteLoss(rand(-10,-30)) R.adjustFireLoss(rand(-10,-30)) return 1 @@ -23,7 +23,7 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(world.time - last_message > 200) - to_chat(M, "SYSTEM ALERT: Beneficial energy field detected!") + to_chat(M, span_blue("SYSTEM ALERT: Beneficial energy field detected!")) last_message = world.time M.adjustBruteLoss(-1) M.adjustFireLoss(-1) @@ -36,7 +36,7 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(world.time - last_message > 200) - to_chat(M, "SYSTEM ALERT: Structural damage has been repaired by energy pulse!") + to_chat(M, span_blue("SYSTEM ALERT: Structural damage has been repaired by energy pulse!")) last_message = world.time M.adjustBruteLoss(-10) M.adjustFireLoss(-10) diff --git a/code/modules/xenoarcheaology/effects/robohurt.dm b/code/modules/xenoarcheaology/effects/robohurt.dm index 8b93e04ead4..41b8caf72ba 100644 --- a/code/modules/xenoarcheaology/effects/robohurt.dm +++ b/code/modules/xenoarcheaology/effects/robohurt.dm @@ -12,7 +12,7 @@ if(user) if (istype(user, /mob/living/silicon/robot)) var/mob/living/silicon/robot/R = user - to_chat(R, "Your systems report severe damage has been inflicted!") + to_chat(R, span_red("Your systems report severe damage has been inflicted!")) R.adjustBruteLoss(rand(10,50)) R.adjustFireLoss(rand(10,50)) return 1 @@ -23,7 +23,7 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(world.time - last_message > 200) - to_chat(M, "SYSTEM ALERT: Harmful energy field detected!") + to_chat(M, span_red("SYSTEM ALERT: Harmful energy field detected!")) last_message = world.time M.adjustBruteLoss(1) M.adjustFireLoss(1) @@ -36,7 +36,7 @@ var/turf/T = get_turf(holder) for (var/mob/living/silicon/robot/M in range(src.effectrange,T)) if(world.time - last_message > 200) - to_chat(M, "SYSTEM ALERT: Structural damage inflicted by energy pulse!") + to_chat(M, span_red("SYSTEM ALERT: Structural damage inflicted by energy pulse!")) last_message = world.time M.adjustBruteLoss(10) M.adjustFireLoss(10) diff --git a/code/modules/xenoarcheaology/effects/sleepy.dm b/code/modules/xenoarcheaology/effects/sleepy.dm index 244814a1da7..a13c1dcbb4f 100644 --- a/code/modules/xenoarcheaology/effects/sleepy.dm +++ b/code/modules/xenoarcheaology/effects/sleepy.dm @@ -12,12 +12,12 @@ var/weakness = GetAnomalySusceptibility(toucher) if(ishuman(toucher) && prob(weakness * 100)) var/mob/living/carbon/human/H = toucher - to_chat(H, pick("You feel like taking a nap."," You feel a yawn coming on."," You feel a little tired.")) + to_chat(H, span_blue("[pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired.")]")) H.drowsyness = min(H.drowsyness + rand(5,25) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(1,3) * weakness, 50 * weakness) return 1 else if(isrobot(toucher)) - to_chat(toucher, "SYSTEM ALERT: CPU cycles slowing down.") + to_chat(toucher, span_red("SYSTEM ALERT: CPU cycles slowing down.")) return 1 /datum/artifact_effect/sleepy/DoEffectAura() @@ -28,11 +28,11 @@ var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) if(prob(10)) - to_chat(H, pick("You feel like taking a nap."," You feel a yawn coming on."," You feel a little tired.")) + to_chat(H, span_blue("[pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired.")]")) H.drowsyness = min(H.drowsyness + 1 * weakness, 25 * weakness) H.eye_blurry = min(H.eye_blurry + 1 * weakness, 25 * weakness) for (var/mob/living/silicon/robot/R in range(src.effectrange,holder)) - to_chat(R, "SYSTEM ALERT: CPU cycles slowing down.") + to_chat(R, span_red("SYSTEM ALERT: CPU cycles slowing down.")) return 1 /datum/artifact_effect/sleepy/DoEffectPulse() @@ -42,9 +42,9 @@ for(var/mob/living/carbon/human/H in range(src.effectrange, T)) var/weakness = GetAnomalySusceptibility(H) if(prob(weakness * 100)) - to_chat(H, pick("You feel like taking a nap."," You feel a yawn coming on."," You feel a little tired.")) + to_chat(H, span_blue("[pick("You feel like taking a nap.","You feel a yawn coming on.","You feel a little tired.")]")) H.drowsyness = min(H.drowsyness + rand(5,15) * weakness, 50 * weakness) H.eye_blurry = min(H.eye_blurry + rand(5,15) * weakness, 50 * weakness) for (var/mob/living/silicon/robot/R in range(src.effectrange,holder)) - to_chat(R, "SYSTEM ALERT: CPU cycles slowing down.") + to_chat(R, span_red("SYSTEM ALERT: CPU cycles slowing down.")) return 1 diff --git a/code/modules/xenoarcheaology/effects/stun.dm b/code/modules/xenoarcheaology/effects/stun.dm index 12ca276b93d..82b0ff534ca 100644 --- a/code/modules/xenoarcheaology/effects/stun.dm +++ b/code/modules/xenoarcheaology/effects/stun.dm @@ -11,7 +11,7 @@ var/mob/living/carbon/C = toucher var/susceptibility = GetAnomalySusceptibility(C) if(prob(susceptibility * 100)) - to_chat(C, "A powerful force overwhelms your consciousness.") + to_chat(C, span_red("A powerful force overwhelms your consciousness.")) C.Weaken(rand(1,10) * susceptibility) C.stuttering += 30 * susceptibility C.Stun(rand(1,10) * susceptibility) @@ -23,13 +23,13 @@ for (var/mob/living/carbon/C in range(src.effectrange,T)) var/susceptibility = GetAnomalySusceptibility(C) if(prob(10 * susceptibility)) - to_chat(C, "Your body goes numb for a moment.") + to_chat(C, span_red("Your body goes numb for a moment.")) C.Weaken(2) C.stuttering += 2 if(prob(10)) C.Stun(1) else if(prob(10)) - to_chat(C, "You feel numb.") + to_chat(C, span_red("You feel numb.")) /datum/artifact_effect/stun/DoEffectPulse() var/atom/holder = get_master_holder() @@ -38,7 +38,7 @@ for (var/mob/living/carbon/C in range(src.effectrange,T)) var/susceptibility = GetAnomalySusceptibility(C) if(prob(100 * susceptibility)) - to_chat(C, "A wave of energy overwhelms your senses!") + to_chat(C, span_red("A wave of energy overwhelms your senses!")) C.SetWeakened(4 * susceptibility) C.stuttering = 4 * susceptibility if(prob(10)) diff --git a/code/modules/xenoarcheaology/effects/teleport.dm b/code/modules/xenoarcheaology/effects/teleport.dm index de71e767680..31a0dd6e67a 100644 --- a/code/modules/xenoarcheaology/effects/teleport.dm +++ b/code/modules/xenoarcheaology/effects/teleport.dm @@ -8,7 +8,7 @@ var/atom/holder = get_master_holder() var/weakness = GetAnomalySusceptibility(user) if(prob(100 * weakness)) - to_chat(user, "You are suddenly zapped away elsewhere!") + to_chat(user, span_red("You are suddenly zapped away elsewhere!")) if (user.buckled) user.buckled.unbuckle_mob() @@ -29,7 +29,7 @@ for (var/mob/living/M in range(src.effectrange,T)) var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) - to_chat(M, "You are displaced by a strange force!") + to_chat(M, span_red("You are displaced by a strange force!")) if(M.buckled) M.buckled.unbuckle_mob(M) @@ -49,7 +49,7 @@ for (var/mob/living/M in range(src.effectrange, T)) var/weakness = GetAnomalySusceptibility(M) if(prob(100 * weakness)) - to_chat(M, "You are displaced by a strange force!") + to_chat(M, span_red("You are displaced by a strange force!")) if(M.buckled) M.buckled.unbuckle_mob() diff --git a/code/modules/xenoarcheaology/finds/special.dm b/code/modules/xenoarcheaology/finds/special.dm index af22d90dbf7..cf6c21546d8 100644 --- a/code/modules/xenoarcheaology/finds/special.dm +++ b/code/modules/xenoarcheaology/finds/special.dm @@ -99,7 +99,7 @@ if(charges >= 0.1) if(prob(5)) - src.visible_message("\icon[src][bicon(src)] [src]'s eyes glow ruby red for a moment!") + src.visible_message(span_red("\icon[src][bicon(src)] [src]'s eyes glow ruby red for a moment!")) charges -= 0.1 //check on our shadow wights @@ -129,7 +129,7 @@ var/target = pick(M.organs_by_name) M.apply_damage(rand(5, 10), BRUTE, target) - to_chat(M, "The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out.") + to_chat(M, span_red("The skin on your [parse_zone(target)] feels like it's ripping apart, and a stream of blood flies out.")) var/obj/effect/decal/cleanable/blood/splatter/animated/B = new(M.loc) B.target_turf = pick(range(1, src)) B.blood_DNA = list() @@ -200,4 +200,4 @@ STOP_PROCESSING(SSobj, src) /obj/effect/shadow_wight/Bump(var/atom/obstacle) - to_chat(obstacle, "You feel a chill run down your spine!") + to_chat(obstacle, span_red("You feel a chill run down your spine!")) diff --git a/code/modules/xenoarcheaology/finds/talking.dm b/code/modules/xenoarcheaology/finds/talking.dm index d2ce513285e..2d6b23508af 100644 --- a/code/modules/xenoarcheaology/finds/talking.dm +++ b/code/modules/xenoarcheaology/finds/talking.dm @@ -54,7 +54,7 @@ var/list/options = list("[holder_atom] seems to be listening intently to [source]...",\ "[holder_atom] seems to be focusing on [source]...",\ "[holder_atom] seems to turn it's attention to [source]...") - holder_atom.loc.visible_message("\icon[holder_atom][bicon(holder_atom)] [pick(options)]") + holder_atom.loc.visible_message(span_blue("\icon[holder_atom][bicon(holder_atom)] [pick(options)]")) if(prob(20)) spawn(2) @@ -111,5 +111,5 @@ var/list/listening = viewers(holder_atom) for(var/mob/M in listening) - to_chat(M, "\icon[holder_atom][bicon(holder_atom)] [holder_atom] reverberates, \"[msg]\"") + to_chat(M, "\icon[holder_atom][bicon(holder_atom)] [holder_atom] reverberates, \"[span_blue(msg)]\"") last_talk_time = world.time diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index a83462c43b3..7fb51a0a4a6 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -45,7 +45,7 @@ /obj/item/weapon/anodevice/attackby(var/obj/I as obj, var/mob/user as mob) if(istype(I, /obj/item/weapon/anobattery)) if(!inserted_battery) - to_chat(user, "You insert the battery.") + to_chat(user, span_blue("You insert the battery.")) user.drop_item() I.loc = src inserted_battery = I @@ -103,7 +103,7 @@ if("startup") if(inserted_battery && inserted_battery.battery_effect && (inserted_battery.stored_charge > 0)) activated = TRUE - visible_message("\icon[src][bicon(src)] [src] whirrs.", "\icon[src][bicon(src)]You hear something whirr.") + visible_message(span_blue("\icon[src][bicon(src)] [src] whirrs."), span_blue("\icon[src][bicon(src)]You hear something whirr.")) if(!inserted_battery.battery_effect.activated) inserted_battery.battery_effect.ToggleActivate(1) time_end = world.time + duration @@ -175,13 +175,13 @@ //work out if we need to shutdown if(inserted_battery.stored_charge <= 0) - src.loc.visible_message("\icon[src][bicon(src)] [src] buzzes.", "\icon[src][bicon(src)] You hear something buzz.") + src.loc.visible_message(span_blue("\icon[src][bicon(src)] [src] buzzes."), span_blue("\icon[src][bicon(src)] You hear something buzz.")) shutdown_emission() else if(world.time > time_end) - src.loc.visible_message("\icon[src][bicon(src)] [src] chimes.", "\icon[src][bicon(src)] You hear something chime.") + src.loc.visible_message(span_blue("\icon[src][bicon(src)] [src] chimes."), span_blue("\icon[src][bicon(src)] You hear something chime.")) shutdown_emission() else - src.visible_message("\icon[src][bicon(src)] [src] buzzes.", "\icon[src][bicon(src)] You hear something buzz.") + src.visible_message(span_blue("\icon[src][bicon(src)] [src] buzzes."), span_blue("\icon[src][bicon(src)] You hear something buzz.")) shutdown_emission() last_process = world.time @@ -210,9 +210,9 @@ if(activated && inserted_battery?.battery_effect?.effect == EFFECT_TOUCH && !isnull(inserted_battery)) inserted_battery?.battery_effect?.DoEffectTouch(M) inserted_battery.use_power(energy_consumed_on_touch) - user.visible_message("[user] taps [M] with [src], and it shudders on contact.") + user.visible_message(span_blue("[user] taps [M] with [src], and it shudders on contact.")) else - user.visible_message("[user] taps [M] with [src], but nothing happens.") + user.visible_message(span_blue("[user] taps [M] with [src], but nothing happens.")) //admin logging user.lastattacked = M diff --git a/code/modules/xenoarcheaology/tools/artifact_harvester.dm b/code/modules/xenoarcheaology/tools/artifact_harvester.dm index 03f0fdb4843..a8f19c916bd 100644 --- a/code/modules/xenoarcheaology/tools/artifact_harvester.dm +++ b/code/modules/xenoarcheaology/tools/artifact_harvester.dm @@ -22,13 +22,13 @@ /obj/machinery/artifact_harvester/attackby(var/obj/I as obj, var/mob/user as mob) if(istype(I,/obj/item/weapon/anobattery)) if(!inserted_battery) - to_chat(user, "You insert [I] into [src].") + to_chat(user, span_blue("You insert [I] into [src].")) user.drop_item() I.loc = src src.inserted_battery = I SStgui.update_uis(src) else - to_chat(user, "There is already a battery in [src].") + to_chat(user, span_red("There is already a battery in [src].")) else return..() diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index 4ab22878c19..53733810c61 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -268,16 +268,16 @@ //emergency stop if seal integrity reaches 0 if(scanner_seal_integrity <= 0 || (scanner_temperature >= 1273 && !rad_shield)) stop_scanning() - src.visible_message("\icon[src][bicon(src)] buzzes unhappily. It has failed mid-scan!", 2) + src.visible_message(span_blue("\icon[src][bicon(src)] buzzes unhappily. It has failed mid-scan!"), 2) if(prob(5)) - src.visible_message("\icon[src][bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")].", 2) + src.visible_message(span_blue("\icon[src][bicon(src)] [pick("whirrs","chuffs","clicks")][pick(" excitedly"," energetically"," busily")]."), 2) else //gradually cool down over time if(scanner_temperature > 0) scanner_temperature = max(scanner_temperature - 5 - 10 * rand(), 0) if(prob(0.75)) - src.visible_message("\icon[src][bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")].", 2) + src.visible_message(span_blue("\icon[src][bicon(src)] [pick("plinks","hisses")][pick(" quietly"," softly"," sadly"," plaintively")]."), 2) playsound(src, 'sound/effects/ding.ogg', 25) last_process_worldtime = world.time @@ -296,7 +296,7 @@ used_coolant = 0 /obj/machinery/radiocarbon_spectrometer/proc/complete_scan() - src.visible_message("\icon[src][bicon(src)] makes an insistent chime.", 2) + src.visible_message(span_blue("\icon[src][bicon(src)] makes an insistent chime."), 2) if(scanned_item) //create report diff --git a/code/modules/xenoarcheaology/tools/suspension_generator.dm b/code/modules/xenoarcheaology/tools/suspension_generator.dm index 4449d85db59..51f23f8b0ad 100644 --- a/code/modules/xenoarcheaology/tools/suspension_generator.dm +++ b/code/modules/xenoarcheaology/tools/suspension_generator.dm @@ -150,10 +150,10 @@ for(var/mob/living/M in T) M.Weaken(5) - M.visible_message("[bicon(M)] [M] begins to float in the air!","You feel tingly and light, but it is difficult to move.") + M.visible_message(span_blue("[bicon(M)] [M] begins to float in the air!"),"You feel tingly and light, but it is difficult to move.") suspension_field = new(T) - visible_message("[bicon(src)] [src] activates with a low hum.") + visible_message(span_blue("[bicon(src)] [src] activates with a low hum.")) icon_state = "suspension_on" playsound(loc, 'sound/machines/quiet_beep.ogg', 40) update_icon() @@ -165,7 +165,7 @@ if(collected) suspension_field.icon_state = "energynet" add_overlay("shield2") - visible_message("[bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].") + visible_message(span_blue("[bicon(suspension_field)] [suspension_field] gently absconds [collected > 1 ? "something" : "several things"].")) else if(istype(T,/turf/simulated/mineral) || istype(T,/turf/simulated/wall)) suspension_field.icon_state = "shieldsparkles" @@ -180,7 +180,7 @@ to_chat(M, "You no longer feel like floating.") M.Weaken(3) - visible_message("[bicon(src)] [src] deactivates with a gentle shudder.") + visible_message(span_blue("[bicon(src)] [src] deactivates with a gentle shudder.")) qdel(suspension_field) suspension_field = null icon_state = "suspension_wrenched" @@ -197,7 +197,7 @@ set category = "Object" if(anchored) - to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor.") + to_chat(usr, span_red("You cannot rotate [src], it has been firmly fixed to the floor.")) return set_dir(turn(dir, 90)) @@ -207,7 +207,7 @@ set category = "Object" if(anchored) - to_chat(usr, "You cannot rotate [src], it has been firmly fixed to the floor.") + to_chat(usr, span_red("You cannot rotate [src], it has been firmly fixed to the floor.")) return set_dir(turn(dir, 270)) diff --git a/icons/mob/robot/combat_large.dmi b/icons/mob/robot/combat_large.dmi index 0319962e5f4..7f654ef73e1 100644 Binary files a/icons/mob/robot/combat_large.dmi and b/icons/mob/robot/combat_large.dmi differ diff --git a/icons/mob/robot/crisis_large.dmi b/icons/mob/robot/crisis_large.dmi index ff9cfbbf415..c14ec16a115 100644 Binary files a/icons/mob/robot/crisis_large.dmi and b/icons/mob/robot/crisis_large.dmi differ diff --git a/icons/mob/robot/engineering_large.dmi b/icons/mob/robot/engineering_large.dmi index 74986efb5c9..611d26eee79 100644 Binary files a/icons/mob/robot/engineering_large.dmi and b/icons/mob/robot/engineering_large.dmi differ diff --git a/icons/mob/robot/gravekeeper_large.dmi b/icons/mob/robot/gravekeeper_large.dmi new file mode 100644 index 00000000000..ead49b5d1cd Binary files /dev/null and b/icons/mob/robot/gravekeeper_large.dmi differ diff --git a/icons/mob/robot/janitor_large.dmi b/icons/mob/robot/janitor_large.dmi index 178d861f5c8..ef28836268e 100644 Binary files a/icons/mob/robot/janitor_large.dmi and b/icons/mob/robot/janitor_large.dmi differ diff --git a/icons/mob/robot/lost_large.dmi b/icons/mob/robot/lost_large.dmi new file mode 100644 index 00000000000..981b301c38e Binary files /dev/null and b/icons/mob/robot/lost_large.dmi differ diff --git a/icons/mob/robot/mining_large.dmi b/icons/mob/robot/mining_large.dmi index 685076d204e..5258bc66979 100644 Binary files a/icons/mob/robot/mining_large.dmi and b/icons/mob/robot/mining_large.dmi differ diff --git a/icons/mob/robot/science_large.dmi b/icons/mob/robot/science_large.dmi index 389a4856aea..28bc4c04948 100644 Binary files a/icons/mob/robot/science_large.dmi and b/icons/mob/robot/science_large.dmi differ diff --git a/icons/mob/robot/security_large.dmi b/icons/mob/robot/security_large.dmi index 6f891fb185f..d7dc24fe5e2 100644 Binary files a/icons/mob/robot/security_large.dmi and b/icons/mob/robot/security_large.dmi differ diff --git a/icons/mob/robot/service_large.dmi b/icons/mob/robot/service_large.dmi index 9fe00af4dd6..1844e60bfab 100644 Binary files a/icons/mob/robot/service_large.dmi and b/icons/mob/robot/service_large.dmi differ diff --git a/icons/mob/robot/surgical_large.dmi b/icons/mob/robot/surgical_large.dmi index 9928442c4c0..5b7d22835f7 100644 Binary files a/icons/mob/robot/surgical_large.dmi and b/icons/mob/robot/surgical_large.dmi differ diff --git a/icons/mob/robot/syndie_large.dmi b/icons/mob/robot/syndie_large.dmi index 3a0db17d6e3..90edf7aa895 100644 Binary files a/icons/mob/robot/syndie_large.dmi and b/icons/mob/robot/syndie_large.dmi differ diff --git a/icons/obj/watercloset.dmi b/icons/obj/watercloset.dmi index 847c97fc231..6be639fe4ca 100644 Binary files a/icons/obj/watercloset.dmi and b/icons/obj/watercloset.dmi differ diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index d7b6a2e1bbd..f7f9e41cbe9 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -78,7 +78,7 @@ em {font-style: normal;font-weight: bold;} /* Miscellaneous */ .name {font-weight: bold;} .say {} -.alert {color: #ff0000;} +.alert, .valert {color: #ff0000;} h1.alert, h2.alert {color: #000000;} .ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} @@ -96,11 +96,11 @@ h1.alert, h2.alert {color: #000000;} .passive {color: #660000;} .critical {color: #ff0000; font-weight: bold; font-size: 150%;} -.danger {color: #ff0000; font-weight: bold;} -.warning {color: #ff0000; font-style: italic;} +.danger, .vdanger {color: #ff0000; font-weight: bold;} +.warning, .vwarning {color: #ff0000; font-style: italic;} .rose {color: #ff5050;} .info {color: #0000CC;} -.notice {color: #000099;} +.notice, .vnotice {color: #000099;} .alium {color: #00ff00;} .cult {color: #800080; font-weight: bold; font-style: italic;} @@ -116,7 +116,7 @@ h1.alert, h2.alert {color: #000000;} .skrellfar {color: #70FCFF;} .soghun {color: #50BA6C;} .solcom {color: #22228B;} -.changeling {color: #800080;font-style: italic;} +.changeling, .psay, .pemote {color: #800080;font-style: italic;} .sergal {color: #0077FF;} .birdsongc {color: #CC9900;} .vulpkanin {color: #B97A57;} @@ -133,8 +133,8 @@ h1.alert, h2.alert {color: #000000;} .say_quote {font-family: Georgia, Verdana, sans-serif;} .say_quote_italics {font-style: italic; font-family: Georgia, Verdana, sans-serif;} .terminus {font-family: "Times New Roman", Times, serif, sans-serif} -.interface {color: #330033;} -.spacer {color: #9c660b;} /* VOREStation Add */ +.psionic {color: #993399;} +.spacer {color: #9c660b;} .blob {color: #ff950d; font-weight: bold; font-style: italic;} .teppi {color: #816540; word-spacing:4pt; font-family: "Segoe Script Bold","Segoe Script",sans-serif,Verdana;} .shadekin {color: #be3cc5; font-size: 150%; font-weight: bold; font-family: "Gabriola", cursive, sans-serif;} @@ -149,6 +149,8 @@ BIG IMG.icon {width: 32px; height: 32px;} .debug_debug {color:#0000FF;} .debug_trace {color:#888888;} +.interface {color: #330033;} + .black {color: #000000;} .darkgray {color: #808080;} .gray {color: #A9A9A9;} @@ -156,6 +158,16 @@ BIG IMG.icon {width: 32px; height: 32px;} .orange {color: #FF8C00;} .blue {color: #0000FF;} .green {color: #00DD00;} +.purple {color: #800080;} +.yellow {color: #ffcc00;} +.pink {color: #ffc0cb;} +.cyan {color: #00ffff;} +.maroon {color: #800000;} +.crimson {color: #DC143C;} +.brown {color: #8D4925;} +.lightpurple {color: #AD5AAD;} +.darkpink {color: #E3209B;} +.white {color: #FFFFFF;} .pnarrate {color: #009AB2;} diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm index 551611b8f42..681f1955a70 100644 --- a/maps/RandomZLevels/stationCollision.dm +++ b/maps/RandomZLevels/stationCollision.dm @@ -124,7 +124,7 @@ var/sc_safecode5 = "[rand(0,9)]" /obj/item/weapon/paper/sc_safehint_paper_caf name = "blood-soaked paper" //This does not have to be in New() because it is a constant. There are no variables in it i.e. [sc_safcode] - info = "This paper is soaked in blood, it is impossible to read any text." + info = "This paper is soaked in blood, it is impossible to read any text." /obj/item/weapon/paper/sc_safehint_paper_bible name = "hidden paper" @@ -202,4 +202,4 @@ var/sc_safecode5 = "[rand(0,9)]" return /obj/machinery/singularity/narsie/sc_Narsie/ex_act() - return \ No newline at end of file + return diff --git a/maps/gateway_archive_vr/labyrinth.dm b/maps/gateway_archive_vr/labyrinth.dm index 94a88a68fcb..f1f19604905 100644 --- a/maps/gateway_archive_vr/labyrinth.dm +++ b/maps/gateway_archive_vr/labyrinth.dm @@ -167,13 +167,13 @@ return 0 playsound(chassis, 'sound/items/AirHorn.ogg', 100, 1) - chassis.occupant_message("HONK") + chassis.occupant_message(span_red("HONK")) for(var/mob/living/carbon/M in ohearers(6, chassis)) if(istype(M, /mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(istype(H.l_ear, /obj/item/clothing/ears/earmuffs) || istype(H.r_ear, /obj/item/clothing/ears/earmuffs)) continue - to_chat(M, "HONK") + to_chat(M, span_red("HONK")) M.sleeping = 0 M.stuttering += 20 M.ear_deaf += 30 @@ -365,4 +365,4 @@ icon_state = "x2" lootcount = 1 //how many items will be spawned lootdoubles = 0 //if the same item can be spawned twice - loot = "" //a list of possible items to spawn- a string of paths \ No newline at end of file + loot = "" //a list of possible items to spawn- a string of paths diff --git a/maps/gateway_archive_vr/stationCollision.dm b/maps/gateway_archive_vr/stationCollision.dm index 551611b8f42..681f1955a70 100644 --- a/maps/gateway_archive_vr/stationCollision.dm +++ b/maps/gateway_archive_vr/stationCollision.dm @@ -124,7 +124,7 @@ var/sc_safecode5 = "[rand(0,9)]" /obj/item/weapon/paper/sc_safehint_paper_caf name = "blood-soaked paper" //This does not have to be in New() because it is a constant. There are no variables in it i.e. [sc_safcode] - info = "This paper is soaked in blood, it is impossible to read any text." + info = "This paper is soaked in blood, it is impossible to read any text." /obj/item/weapon/paper/sc_safehint_paper_bible name = "hidden paper" @@ -202,4 +202,4 @@ var/sc_safecode5 = "[rand(0,9)]" return /obj/machinery/singularity/narsie/sc_Narsie/ex_act() - return \ No newline at end of file + return diff --git a/maps/gateway_archive_vr/wildwest.dm b/maps/gateway_archive_vr/wildwest.dm index ed6ab285942..9cffa0d7f89 100644 --- a/maps/gateway_archive_vr/wildwest.dm +++ b/maps/gateway_archive_vr/wildwest.dm @@ -121,7 +121,7 @@ if(istype(M, /mob/living/carbon/human) || istype(M, /mob/living/carbon/monkey)) for(var/mob/O in viewers(world.view, src.loc)) - to_chat(O, "[M] triggered the \icon[src][bicon(src)] [src]") + to_chat(O, span_red("[M] triggered the \icon[src][bicon(src)] [src]")) triggered = 1 call(src,triggerproc)(M) diff --git a/maps/yw/cryogaia_things.dm b/maps/yw/cryogaia_things.dm index 2e66729e3b0..a13b81fc886 100644 --- a/maps/yw/cryogaia_things.dm +++ b/maps/yw/cryogaia_things.dm @@ -505,9 +505,9 @@ anchored = !anchored playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(anchored) - to_chat(user, "You secure \the [src].") + to_chat(user, span_red("You secure \the [src].")) else - to_chat(user, "You unsecure \the [src].") + to_chat(user, span_blue("You unsecure \the [src].")) // // ### Wall Machines On Full Windows ### // To make sure wall-mounted machines placed on full-tile windows are clickable they must be above the window diff --git a/sound/weapons/Laser4.ogg b/sound/weapons/Laser4.ogg new file mode 100644 index 00000000000..2a3929356d0 Binary files /dev/null and b/sound/weapons/Laser4.ogg differ diff --git a/sound/weapons/laser4.ogg b/sound/weapons/laser4.ogg index 87d72eff5c5..2a3929356d0 100644 Binary files a/sound/weapons/laser4.ogg and b/sound/weapons/laser4.ogg differ diff --git a/tgui/packages/tgui-panel/chat/constants.ts b/tgui/packages/tgui-panel/chat/constants.ts index 365bbb1ac99..978e7b72e24 100644 --- a/tgui/packages/tgui-panel/chat/constants.ts +++ b/tgui/packages/tgui-panel/chat/constants.ts @@ -57,18 +57,18 @@ export const MESSAGE_TYPES = [ important: true, }, // Basic types + { + type: MESSAGE_TYPE_NPCEMOTE, // Needs to be first + name: 'NPC Emotes / Says', + description: 'In-character emotes and says from NPCs', + selector: '.npcemote, .npcsay', + }, { type: MESSAGE_TYPE_LOCALCHAT, name: 'Local', description: 'In-character local messages (say, emote, etc)', selector: '.say, .emote, .emotesubtle', }, - { - type: MESSAGE_TYPE_NPCEMOTE, - name: 'NPC Emotes', - description: 'In-character emotes from NPCs', - selector: '.npcemote', - }, { type: MESSAGE_TYPE_PLOCALCHAT, name: 'Local (Pred/Prey)', diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss index 71bfdae0f65..91c00a156ae 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss @@ -371,6 +371,7 @@ img.icon.bigicon { .emote, .emotesubtle, .npcemote, +.npcsay, .infoplain, .oocplain, .warningplain, @@ -662,8 +663,52 @@ img.icon.bigicon { color: #ff0000; } +.crimson { + color: #dc143c; +} + +.maroon { + color: #c60000; +} + +.brown { + color: #db733b; +} + .blue { - color: #215cff; + color: #4173fd; +} + +.black { + color: #ffffff; +} + +.white { + color: #ffffff; +} + +.darkgray { + color: #808080; +} + +.gray { + color: #a9a9a9; +} + +.yellow { + color: #ffcc00; +} + +.pink { + color: #ffc0cb; +} + +.cyan { + color: #00ffff; +} + +.orange { + color: #ff8c00; } .nicegreen { @@ -744,6 +789,14 @@ img.icon.bigicon { color: #9956d3; } +.lightpurple { + color: #ad5aad; +} + +.darkpink { + color: #e3209b; +} + .holoparasite { color: #88809c; } @@ -833,7 +886,7 @@ img.icon.bigicon { } .interface { - color: #750e75; + color: #961196; } .sans { diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss index 23b62dcb63d..1c613c84618 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss @@ -389,6 +389,7 @@ img.icon.bigicon { .emote, .emotesubtle, .npcemote, +.npcsay, .infoplain, .oocplain, .warningplain, @@ -689,10 +690,54 @@ h2.alert { color: #ff0000; } +.crimson { + color: #dc143c; +} + +.maroon { + color: #800000; +} + +.brown { + color: #8d4925; +} + .blue { color: #0000ff; } +.black { + color: #000000; +} + +.white { + color: #000000; +} + +.darkgray { + color: #808080; +} + +.gray { + color: #a9a9a9; +} + +.yellow { + color: #ffcc00; +} + +.pink { + color: #ffc0cb; +} + +.cyan { + color: #00ffff; +} + +.orange { + color: #ff8c00; +} + .nicegreen { color: #14a833; } @@ -771,6 +816,14 @@ h2.alert { color: #5e2d79; } +.lightpurple { + color: #ad5aad; +} + +.darkpink { + color: #e3209b; +} + .holoparasite { color: #35333a; } diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss index 88c7ad08cb3..99817f1b2a6 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss @@ -371,6 +371,7 @@ img.icon.bigicon { .emote, .emotesubtle, .npcemote, +.npcsay, .infoplain, .oocplain, .warningplain, @@ -663,10 +664,54 @@ img.icon.bigicon { color: #ff0000; } +.crimson { + color: #dc143c; +} + +.maroon { + color: #c60000; +} + +.brown { + color: #db733b; +} + .blue { color: #6666ff; } +.black { + color: #ffffff; +} + +.white { + color: #ffffff; +} + +.darkgray { + color: #808080; +} + +.gray { + color: #a9a9a9; +} + +.yellow { + color: #ffcc00; +} + +.pink { + color: #ffc0cb; +} + +.cyan { + color: #00ffff; +} + +.orange { + color: #ff8c00; +} + .nicegreen { color: #059223; } @@ -745,6 +790,14 @@ img.icon.bigicon { color: #9956d3; } +.lightpurple { + color: #ad5aad; +} + +.darkpink { + color: #e3209b; +} + .holoparasite { color: #88809c; } diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss index dd1d02f60a5..9ea1f659c01 100644 --- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss +++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss @@ -389,6 +389,7 @@ img.icon.bigicon { .emote, .emotesubtle, .npcemote, +.npcsay, .infoplain, .oocplain, .warningplain, @@ -690,10 +691,54 @@ h2.alert { color: #ff0000; } +.crimson { + color: #dc143c; +} + +.maroon { + color: #800000; +} + +.brown { + color: #8d4925; +} + .blue { color: #0000ff; } +.black { + color: #000000; +} + +.white { + color: #000000; +} + +.darkgray { + color: #808080; +} + +.gray { + color: #a9a9a9; +} + +.yellow { + color: #ffcc00; +} + +.pink { + color: #ffc0cb; +} + +.cyan { + color: #00ffff; +} + +.orange { + color: #ff8c00; +} + .nicegreen { color: #14a833; } @@ -772,6 +817,14 @@ h2.alert { color: #5e2d79; } +.lightpurple { + color: #ad5aad; +} + +.darkpink { + color: #e3209b; +} + .holoparasite { color: #35333a; } diff --git a/tgui/public/tgui-panel.bundle.css b/tgui/public/tgui-panel.bundle.css index 9b09ada81a4..de812b73b5a 100644 --- a/tgui/public/tgui-panel.bundle.css +++ b/tgui/public/tgui-panel.bundle.css @@ -1 +1 @@ -html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a!important}.color-white{color:#fff!important}.color-red{color:#df3e3e!important}.color-orange{color:#f37f33!important}.color-yellow{color:#fbda21!important}.color-olive{color:#cbe41c!important}.color-green{color:#25ca4c!important}.color-teal{color:#00d6cc!important}.color-blue{color:#2e93de!important}.color-violet{color:#7349cf!important}.color-purple{color:#ad45d0!important}.color-pink{color:#e34da1!important}.color-brown{color:#b97447!important}.color-grey{color:#848484!important}.color-good{color:#68c22d!important}.color-average{color:#f29a29!important}.color-bad{color:#df3e3e!important}.color-label{color:#8b9bb0!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9)!important;background:rgba(0,0,0,0)!important;outline:1px solid rgba(255,255,255,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:.167rem solid #1a1a1a!important}.outline-color-white{outline:.167rem solid #fff!important}.outline-color-red{outline:.167rem solid #df3e3e!important}.outline-color-orange{outline:.167rem solid #f37f33!important}.outline-color-yellow{outline:.167rem solid #fbda21!important}.outline-color-olive{outline:.167rem solid #cbe41c!important}.outline-color-green{outline:.167rem solid #25ca4c!important}.outline-color-teal{outline:.167rem solid #00d6cc!important}.outline-color-blue{outline:.167rem solid #2e93de!important}.outline-color-violet{outline:.167rem solid #7349cf!important}.outline-color-purple{outline:.167rem solid #ad45d0!important}.outline-color-pink{outline:.167rem solid #e34da1!important}.outline-color-brown{outline:.167rem solid #b97447!important}.outline-color-grey{outline:.167rem solid #848484!important}.outline-color-good{outline:.167rem solid #68c22d!important}.outline-color-average{outline:.167rem solid #f29a29!important}.outline-color-bad{outline:.167rem solid #df3e3e!important}.outline-color-label{outline:.167rem solid #8b9bb0!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color .1s,background-color .1s}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color .1s,background-color .1s}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color .1s,background-color .1s}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color .1s,background-color .1s}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color .1s,background-color .1s}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color .1s,background-color .1s}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color .1s,background-color .1s}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color .1s,background-color .1s}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color .1s,background-color .1s}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color .1s,background-color .1s}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color .1s,background-color .1s}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color .1s,background-color .1s}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color .1s,background-color .1s}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color .1s,background-color .1s}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color .1s,background-color .1s}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color .1s,background-color .1s}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color .1s,background-color .1s}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color .1s,background-color .1s}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color .1s,background-color .1s}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color .1s,background-color .1s}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color .1s,background-color .1s}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color .1s,background-color .1s}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999!important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color .1s,background-color .1s}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;-ms-user-select:none;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color .1s ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15) 0%,rgba(255,255,255,0) 100%);border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-.25em -.5em 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border:.0833333333em solid #000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border:.0833333333em solid #646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border:.0833333333em solid #657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.Section{position:relative;margin-bottom:.5em;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.Section .Section:first-child{margin-top:-.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Section--flex{display:flex;flex-flow:column}.Section--flex .Section__content{overflow:auto;flex-grow:1}.Section__content--noTopPadding{padding-top:0}.Section__content--stretchContents{height:calc(100% - 3rem)}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:700;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:rgba(0,0,0,0)}.Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:Consolas,monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity .15s ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:#dc143c;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Layout__content--flexRow{display:flex;flex-flow:row}.Layout__content--flexColumn{display:flex;flex-flow:column}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom,#202020 0%,#202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited,a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:700}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:700}.ooc{color:#cca300;font-weight:700}.ooc .elevated{color:#2e78d9}.ooc .moderator{color:#184880}.ooc .developer{color:#1b521f}.ooc .admin{color:#b82e00}.ooc .event_manager{color:#603}.ooc .aooc{color:#960018}img.text_tag{width:32px;height:10px;min-height:10px}img.icon{vertical-align:middle;max-height:1em}img.icon.bigicon{max-height:32px}.looc{color:#3a9696;font-weight:700}.rlooc{color:#3abb96;font-weight:700}.adminobserverooc{color:#09c;font-weight:700}.adminooc{color:#3d5bc3;font-weight:700}.adminsay{color:#ff4500;font-weight:700}.admin{color:#5975da;font-weight:700}.mentor_channel{color:olive;font-weight:700}.mod_channel{color:#735638;font-weight:700}.admin_channel{color:#9611d4;font-weight:700}.event_channel{color:#c39;font-weight:700}.name{font-weight:700}.psay,.pemote{color:#e300e4;font-style:italic}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:#0f0}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#57b8f0}.secradio{color:#dd3535}.medradio{color:#57f09e}.engradio{color:#fcdf03}.supradio{color:#b88646}.srvradio{color:#6ca729}.expradio{color:#8a8a8a}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centradio{color:#2681a5}.airadio{color:#d65d95}.redteamradio{color:#f44!important}.blueteamradio{color:#3434fd!important}.greenteamradio{color:#34fd34!important}.yellowteamradio{color:#fdfd34!important}.yell{font-weight:700}.alert,.valert{color:#d82020}.userdanger{color:#c51e1e;font-weight:700;font-size:185%}.bolddanger{color:#c51e1e;font-weight:700}.danger,.vdanger{color:#c51e1e}.warning,.vwarning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:700}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.announce,.boldannounce{color:#c51e1e;font-weight:700}.minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.minoralert{color:#a4bad6;font-size:125%}.priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.priorityalert{color:#c51e1e;font-size:140%}.greenannounce{color:#059223;font-weight:700}.rose{color:#ff5050}.info{color:#9ab0ff}.notice,.vnotice{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.bolditalic{font-style:italic;font-weight:700}.boldnotice{color:#6685f5;font-weight:700}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:700}.log_message{color:#386aff;font-weight:700}.unconscious{color:#a4bad6;font-weight:700}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.blue{color:#215cff}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:700}.blob{color:#ee4000}.blobannounce{color:#556b2f;font-weight:700;font-size:185%}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:700}.cultboldtalic,.cultlarge{color:#973e3b;font-weight:700;font-size:185%}.narsie{color:#973e3b;font-weight:700;font-size:925%}.narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:700;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:700}.revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:700;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:700}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:700}.changeling{color:#b000b1;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:700}.spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.spiderscout{color:#231d98;font-weight:700;font-size:120%}.interface{color:#750e75}.sans{font-family:Comic Sans MS,cursive,sans-serif}.papyrus{font-family:Papyrus,cursive,sans-serif}.robot{font-family:Courier New,cursive,sans-serif}.tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.command_headset{font-weight:700;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}.phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.hugeicon{font-size:5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:700}.text-normal{font-weight:400;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.tooltip{font-style:italic;border-bottom:1px dashed #fff}.major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_default .major_announcement_title,.chat_alert_default .minor_announcement_title{color:#33d5ff}.chat_alert_default .subheader_announcement_text{color:#ff5297}.chat_alert_default .minor_announcement_text,.chat_alert_default .major_announcement_text{background-color:#001621}.chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_green .major_announcement_title,.chat_alert_green .minor_announcement_title{color:#00ff80}.chat_alert_green .subheader_announcement_text{color:#ff85b5}.chat_alert_green .minor_announcement_text,.chat_alert_green .major_announcement_text{background-color:#002400}.chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_blue .major_announcement_title,.chat_alert_blue .minor_announcement_title{color:#33d5ff}.chat_alert_blue .subheader_announcement_text{color:#ff5297}.chat_alert_blue .minor_announcement_text,.chat_alert_blue .major_announcement_text{background-color:#001621}.chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_pink .major_announcement_title,.chat_alert_pink .minor_announcement_title{color:#ff5297}.chat_alert_pink .subheader_announcement_text{color:#33d5ff}.chat_alert_pink .minor_announcement_text,.chat_alert_pink .major_announcement_text{background-color:#17000d}.chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_yellow .major_announcement_title,.chat_alert_yellow .minor_announcement_title{color:#fff4e0}.chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.chat_alert_yellow .minor_announcement_text,.chat_alert_yellow .major_announcement_text{background-color:#3e3400}.chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_orange .major_announcement_title,.chat_alert_orange .minor_announcement_title{color:#feefe7}.chat_alert_orange .subheader_announcement_text{color:#33d5ff}.chat_alert_orange .minor_announcement_text,.chat_alert_orange .major_announcement_text{background-color:#402500}.chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_red .major_announcement_title,.chat_alert_red .minor_announcement_title{color:#ff5297}.chat_alert_red .subheader_announcement_text{color:#33d5ff}.chat_alert_red .minor_announcement_text,.chat_alert_red .major_announcement_text{background-color:#290000}.chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_purple .major_announcement_title,.chat_alert_purple .minor_announcement_title{color:#c7a1f7}.chat_alert_purple .subheader_announcement_text{color:#33d5ff}.chat_alert_purple .minor_announcement_text,.chat_alert_purple .major_announcement_text{background-color:#150017}.chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_grey .major_announcement_title,.chat_alert_grey .minor_announcement_title{color:#ff5297}.chat_alert_grey .subheader_announcement_text{color:#33d5ff}.chat_alert_grey .minor_announcement_text,.chat_alert_grey .major_announcement_text{background-color:#181818}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.akhani{color:#ac398c}.skrell{color:#00b0b3}.skrellfar{color:#70fcff}.soghun{color:#50ba6c}.solcom{color:#6da6f0}.sergal{color:#07f}.birdsongc{color:#c90}.vulpkanin{color:#b97a57}.tavan{color:#f54298;font-family:Arial}.echosong{color:#826d8c}.enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.bug{color:#9e9e39}.vox{color:#a0a}.promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.zaddat{color:#941c1c}.rough{font-family:Trebuchet MS,cursive,sans-serif}.say_quote{font-family:Georgia,Verdana,sans-serif}.say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.terminus{font-family:Times New Roman,Times,serif,sans-serif}.spacer{color:#9c660b}.teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-light .color-black{color:#000!important}.theme-light .color-white{color:#e6e6e6!important}.theme-light .color-red{color:#c82121!important}.theme-light .color-orange{color:#e6630d!important}.theme-light .color-yellow{color:#e5c304!important}.theme-light .color-olive{color:#a3b816!important}.theme-light .color-green{color:#1d9f3b!important}.theme-light .color-teal{color:#00a39c!important}.theme-light .color-blue{color:#1e78bb!important}.theme-light .color-violet{color:#5a30b5!important}.theme-light .color-purple{color:#932eb4!important}.theme-light .color-pink{color:#db228a!important}.theme-light .color-brown{color:#955d39!important}.theme-light .color-grey{color:#e6e6e6!important}.theme-light .color-good{color:#529923!important}.theme-light .color-average{color:#da810e!important}.theme-light .color-bad{color:#c82121!important}.theme-light .color-label{color:#353535!important}.theme-light .color-bg-black{background-color:#000!important}.theme-light .color-bg-white{background-color:#bfbfbf!important}.theme-light .color-bg-red{background-color:#a61c1c!important}.theme-light .color-bg-orange{background-color:#c0530b!important}.theme-light .color-bg-yellow{background-color:#bfa303!important}.theme-light .color-bg-olive{background-color:#889912!important}.theme-light .color-bg-green{background-color:#188532!important}.theme-light .color-bg-teal{background-color:#008882!important}.theme-light .color-bg-blue{background-color:#19649c!important}.theme-light .color-bg-violet{background-color:#4b2897!important}.theme-light .color-bg-purple{background-color:#7a2696!important}.theme-light .color-bg-pink{background-color:#b61d73!important}.theme-light .color-bg-brown{background-color:#7c4d2f!important}.theme-light .color-bg-grey{background-color:#bfbfbf!important}.theme-light .color-bg-good{background-color:#44801d!important}.theme-light .color-bg-average{background-color:#b56b0b!important}.theme-light .color-bg-bad{background-color:#a61c1c!important}.theme-light .color-bg-label{background-color:#2c2c2c!important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-light .Section .Section:first-child{margin-top:-.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Section--flex{display:flex;flex-flow:column}.theme-light .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-light .Section__content--noTopPadding{padding-top:0}.theme-light .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636!important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color .1s,background-color .1s}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15) 0%,rgba(255,255,255,0) 100%);border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-light .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotate(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-light .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-light .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border:.0833333333em solid #c0530b!important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border:.0833333333em solid #bfa303!important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border:.0833333333em solid #889912!important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border:.0833333333em solid #188532!important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border:.0833333333em solid #008882!important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border:.0833333333em solid #19649c!important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--violet{border:.0833333333em solid #4b2897!important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border:.0833333333em solid #7a2696!important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border:.0833333333em solid #b61d73!important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border:.0833333333em solid #7c4d2f!important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--good{border:.0833333333em solid #44801d!important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border:.0833333333em solid #b56b0b!important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border:.0833333333em solid #2c2c2c!important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Layout__content--flexRow{display:flex;flex-flow:row}.theme-light .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee 0%,#eee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s ease-out,background-color .25s ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:#00f}.theme-light a.visited,.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:700}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:#00f;font-family:Georgia,Verdana,sans-serif}.theme-light em{font-style:normal;font-weight:700}.theme-light .ooc{color:#002eb8;font-weight:700}.theme-light .ooc .elevated{color:#2e78d9}.theme-light .ooc .moderator{color:#184880}.theme-light .ooc .developer{color:#1b521f}.theme-light .ooc .admin{color:#b82e00}.theme-light .ooc .event_manager{color:#603}.theme-light .ooc .aooc{color:#960018}.theme-light img.text_tag{width:32px;height:10px;min-height:10px}.theme-light img.icon{vertical-align:middle;max-height:1em}.theme-light img.icon.bigicon{max-height:32px}.theme-light .looc{color:#3a9696;font-weight:700}.theme-light .rlooc{color:#3abb96;font-weight:700}.theme-light .adminobserverooc{color:#09c;font-weight:700}.theme-light .adminooc{color:#700038;font-weight:700}.theme-light .adminsay{color:#ff4500;font-weight:700}.theme-light .admin{color:#4473ff;font-weight:700}.theme-light .mentor_channel{color:olive;font-weight:700}.theme-light .mod_channel{color:#735638;font-weight:700}.theme-light .admin_channel{color:#9611d4;font-weight:700}.theme-light .event_channel{color:#c39;font-weight:700}.theme-light .name{font-weight:700}.theme-light .psay,.theme-light .pemote{color:purple;font-style:italic}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:#0f0}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#337296}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#339661}.theme-light .engradio{color:#948f02}.theme-light .supradio{color:#a8732b}.theme-light .srvradio{color:#6eaa2c}.theme-light .expradio{color:#555}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centradio{color:#686868}.theme-light .airadio{color:#f0f}.theme-light .redteamradio{color:red!important}.theme-light .blueteamradio{color:#00f!important}.theme-light .greenteamradio{color:#0f0!important}.theme-light .yellowteamradio{color:#d1ba22!important}.theme-light .yell{font-weight:700}.theme-light .alert,.theme-light .valert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:700;font-size:185%}.theme-light .bolddanger{color:red;font-weight:700}.theme-light .danger,.theme-light .vdanger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning,.theme-light .vwarning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:700}.theme-light .boldwarning{color:red;font-style:italic;font-weight:700}.theme-light .announce{color:#228b22;font-weight:700}.theme-light .boldannounce{color:red;font-weight:700}.theme-light .minorannounce{color:red;font-weight:700;font-size:185%}.theme-light .minoralert{color:#000;font-size:125%}.theme-light .priorityannounce{color:#000;font-weight:700;font-size:225%}.theme-light .prioritytitle{color:#00f;font-weight:700;font-size:185%}.theme-light .priorityalert{color:red;font-size:140%}.theme-light .greenannounce{color:#0f0;font-weight:700}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice,.theme-light .vnotice{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:700}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:#00f}.theme-light .adminhelp{color:red;font-weight:700}.theme-light .log_message{color:#386aff;font-weight:700}.theme-light .unconscious{color:#00f;font-weight:700}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .blue{color:#00f}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:700}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-light .cultboldtalic,.theme-light .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-light .blob{color:#ee4000}.theme-light .blobannounce{color:#323f1c;font-weight:700;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:700;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:700}.theme-light .revenbignotice{color:#1d2953;font-weight:700;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:700}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:700}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-light .spiderbroodmother{color:#4d004d;font-weight:700;font-size:185%}.theme-light .spiderbreacher{color:#804b02;font-weight:700;font-size:140%}.theme-light .spiderscout{color:#0c0674;font-weight:700;font-size:120%}.theme-light .interface{color:#303}.theme-light .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-light .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-light .robot{font-family:Courier New,cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:Courier New,cursive,sans-serif}.theme-light .command_headset{font-weight:700;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:#0f0;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-light .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}to{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}to{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .hugeicon{font-size:5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:700;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:#00f;font-weight:700}.theme-light .text-normal{font-weight:400;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000}.theme-light .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-light .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-light .major_announcement_text{color:#131313;background-color:#eaeaea;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-light .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-light .minor_announcement_text{background-color:#eaeaea;color:#202020;padding:.5rem;text-align:left;font-size:100%}.theme-light .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-light .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_default .major_announcement_title,.theme-light .chat_alert_default .minor_announcement_title{color:#003061}.theme-light .chat_alert_default .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_default .minor_announcement_text,.theme-light .chat_alert_default .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdffbd,#bdffbd 10px,#adffad 10px,#adffad 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_green .major_announcement_title,.theme-light .chat_alert_green .minor_announcement_title{color:#005229}.theme-light .chat_alert_green .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_green .minor_announcement_text,.theme-light .chat_alert_green .major_announcement_text{background-color:#d7ffd7}.theme-light .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_blue .major_announcement_title,.theme-light .chat_alert_blue .minor_announcement_title{color:#003061}.theme-light .chat_alert_blue .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_blue .minor_announcement_text,.theme-light .chat_alert_blue .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2e5,#ffc2e5 10px,#ffb3df 10px,#ffb3df 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_pink .major_announcement_title,.theme-light .chat_alert_pink .minor_announcement_title{color:#800033}.theme-light .chat_alert_pink .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_pink .minor_announcement_text,.theme-light .chat_alert_pink .major_announcement_text{background-color:#ffdcf0}.theme-light .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fff5c2,#fff5c2 10px,#fff3b3 10px,#fff3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_yellow .major_announcement_title,.theme-light .chat_alert_yellow .minor_announcement_title{color:#754900}.theme-light .chat_alert_yellow .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_yellow .minor_announcement_text,.theme-light .chat_alert_yellow .major_announcement_text{background-color:#fff9dc}.theme-light .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffe8c2,#ffe8c2 10px,#ffe2b3 10px,#ffe2b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_orange .major_announcement_title,.theme-light .chat_alert_orange .minor_announcement_title{color:#823208}.theme-light .chat_alert_orange .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_orange .minor_announcement_text,.theme-light .chat_alert_orange .major_announcement_text{background-color:#fff2dc}.theme-light .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2c2,#ffc2c2 10px,#ffb3b3 10px,#ffb3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_red .major_announcement_title,.theme-light .chat_alert_red .minor_announcement_title{color:#800029}.theme-light .chat_alert_red .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_red .minor_announcement_text,.theme-light .chat_alert_red .major_announcement_text{background-color:#ffdcdc}.theme-light .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fbd1ff,#fbd1ff 10px,#fac2ff 10px,#fac2ff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_purple .major_announcement_title,.theme-light .chat_alert_purple .minor_announcement_title{color:#450d8c}.theme-light .chat_alert_purple .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_purple .minor_announcement_text,.theme-light .chat_alert_purple .major_announcement_text{background-color:#fdebff}.theme-light .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ebebeb,#ebebeb 10px,#e3e3e3 10px,#e3e3e3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_grey .major_announcement_title,.theme-light .chat_alert_grey .minor_announcement_title{color:#800033}.theme-light .chat_alert_grey .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_grey .minor_announcement_text,.theme-light .chat_alert_grey .major_announcement_text{background-color:#f8f8f8}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .akhani{color:#ac398c}.theme-light .skrell{color:#00b0b3}.theme-light .skrellfar{color:#70fcff}.theme-light .soghun{color:#50ba6c}.theme-light .solcom{color:#3333ce}.theme-light .sergal{color:#07f}.theme-light .birdsongc{color:#c90}.theme-light .vulpkanin{color:#b97a57}.theme-light .tavan{color:#f54298;font-family:Arial}.theme-light .echosong{color:#826d8c}.theme-light .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-light .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-light .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-light .bug{color:#9e9e39}.theme-light .vox{color:#a0a}.theme-light .promethean{color:#5a5a5a;font-family:Comic Sans MS,Comic Sans,cursive}.theme-light .zaddat{color:#941c1c}.theme-light .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-light .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-light .spacer{color:#9c660b}.theme-light .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-light .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-vchatdark .color-black{color:#1a1a1a!important}.theme-vchatdark .color-white{color:#fff!important}.theme-vchatdark .color-red{color:#df3e3e!important}.theme-vchatdark .color-orange{color:#f37f33!important}.theme-vchatdark .color-yellow{color:#fbda21!important}.theme-vchatdark .color-olive{color:#cbe41c!important}.theme-vchatdark .color-green{color:#25ca4c!important}.theme-vchatdark .color-teal{color:#00d6cc!important}.theme-vchatdark .color-blue{color:#2e93de!important}.theme-vchatdark .color-violet{color:#7349cf!important}.theme-vchatdark .color-purple{color:#ad45d0!important}.theme-vchatdark .color-pink{color:#e34da1!important}.theme-vchatdark .color-brown{color:#b97447!important}.theme-vchatdark .color-grey{color:#848484!important}.theme-vchatdark .color-good{color:#68c22d!important}.theme-vchatdark .color-average{color:#f29a29!important}.theme-vchatdark .color-bad{color:#df3e3e!important}.theme-vchatdark .color-label{color:#8b9bb0!important}.theme-vchatdark .color-bg-black{background-color:#000!important}.theme-vchatdark .color-bg-white{background-color:#d9d9d9!important}.theme-vchatdark .color-bg-red{background-color:#bd2020!important}.theme-vchatdark .color-bg-orange{background-color:#d95e0c!important}.theme-vchatdark .color-bg-yellow{background-color:#d9b804!important}.theme-vchatdark .color-bg-olive{background-color:#9aad14!important}.theme-vchatdark .color-bg-green{background-color:#1b9638!important}.theme-vchatdark .color-bg-teal{background-color:#009a93!important}.theme-vchatdark .color-bg-blue{background-color:#1c71b1!important}.theme-vchatdark .color-bg-violet{background-color:#552dab!important}.theme-vchatdark .color-bg-purple{background-color:#8b2baa!important}.theme-vchatdark .color-bg-pink{background-color:#cf2082!important}.theme-vchatdark .color-bg-brown{background-color:#8c5836!important}.theme-vchatdark .color-bg-grey{background-color:#646464!important}.theme-vchatdark .color-bg-good{background-color:#4d9121!important}.theme-vchatdark .color-bg-average{background-color:#cd7a0d!important}.theme-vchatdark .color-bg-bad{background-color:#bd2020!important}.theme-vchatdark .color-bg-label{background-color:#657a94!important}.theme-vchatdark .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Tabs--fill{height:100%}.theme-vchatdark .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-vchatdark .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-vchatdark .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-vchatdark .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-vchatdark .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-vchatdark .Tabs--horizontal:last-child{margin-bottom:0}.theme-vchatdark .Tabs__Tab{flex-grow:0}.theme-vchatdark .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-vchatdark .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.theme-vchatdark .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.theme-vchatdark .Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.theme-vchatdark .Tab__text{flex-grow:1;margin:0 .5em}.theme-vchatdark .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-vchatdark .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-vchatdark .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-vchatdark .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.theme-vchatdark .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-vchatdark .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.theme-vchatdark .Tab--selected.Tab--color--black{color:#535353}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.theme-vchatdark .Tab--selected.Tab--color--white{color:#fff}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.theme-vchatdark .Tab--selected.Tab--color--red{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--orange{color:#f69f66}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.theme-vchatdark .Tab--selected.Tab--color--yellow{color:#fce358}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.theme-vchatdark .Tab--selected.Tab--color--olive{color:#d8eb55}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.theme-vchatdark .Tab--selected.Tab--color--green{color:#53e074}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.theme-vchatdark .Tab--selected.Tab--color--teal{color:#21fff5}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.theme-vchatdark .Tab--selected.Tab--color--blue{color:#62aee6}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.theme-vchatdark .Tab--selected.Tab--color--violet{color:#9676db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.theme-vchatdark .Tab--selected.Tab--color--purple{color:#c274db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.theme-vchatdark .Tab--selected.Tab--color--pink{color:#ea79b9}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.theme-vchatdark .Tab--selected.Tab--color--brown{color:#ca9775}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.theme-vchatdark .Tab--selected.Tab--color--grey{color:#a3a3a3}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.theme-vchatdark .Tab--selected.Tab--color--good{color:#8cd95a}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.theme-vchatdark .Tab--selected.Tab--color--average{color:#f5b35e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.theme-vchatdark .Tab--selected.Tab--color--bad{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--label{color:#a8b4c4}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.theme-vchatdark .Section{position:relative;margin-bottom:.5em;background-color:#191919;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-vchatdark .Section:last-child{margin-bottom:0}.theme-vchatdark .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-vchatdark .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-vchatdark .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-vchatdark .Section__rest{position:relative}.theme-vchatdark .Section__content{padding:.66em .5em}.theme-vchatdark .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-vchatdark .Section--fill{display:flex;flex-direction:column;height:100%}.theme-vchatdark .Section--fill>.Section__rest{flex-grow:1}.theme-vchatdark .Section--fill>.Section__rest>.Section__content{height:100%}.theme-vchatdark .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-vchatdark .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-vchatdark .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-vchatdark .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-vchatdark .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-vchatdark .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-vchatdark .Section .Section:first-child{margin-top:-.5em}.theme-vchatdark .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-vchatdark .Section .Section .Section .Section__titleText{font-size:1em}.theme-vchatdark .Section--flex{display:flex;flex-flow:column}.theme-vchatdark .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-vchatdark .Section__content--noTopPadding{padding-top:0}.theme-vchatdark .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-vchatdark .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-vchatdark .Button:last-child{margin-right:0;margin-bottom:0}.theme-vchatdark .Button .fa,.theme-vchatdark .Button .fas,.theme-vchatdark .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-vchatdark .Button--hasContent .fa,.theme-vchatdark .Button--hasContent .fas,.theme-vchatdark .Button--hasContent .far{margin-right:.25em}.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fa,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fas,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-vchatdark .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-vchatdark .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-vchatdark .Button--circular{border-radius:50%}.theme-vchatdark .Button--compact{padding:0 .25em;line-height:1.333em}.theme-vchatdark .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-vchatdark .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--black:hover,.theme-vchatdark .Button--color--black:focus{background-color:#131313;color:#fff}.theme-vchatdark .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.theme-vchatdark .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--white:hover,.theme-vchatdark .Button--color--white:focus{background-color:#f8f8f8;color:#000}.theme-vchatdark .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--red:hover,.theme-vchatdark .Button--color--red:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.theme-vchatdark .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--orange:hover,.theme-vchatdark .Button--color--orange:focus{background-color:#f0853f;color:#fff}.theme-vchatdark .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--yellow:hover,.theme-vchatdark .Button--color--yellow:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.theme-vchatdark .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--olive:hover,.theme-vchatdark .Button--color--olive:focus{background-color:#c4da2b;color:#fff}.theme-vchatdark .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--green:hover,.theme-vchatdark .Button--color--green:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.theme-vchatdark .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--teal:hover,.theme-vchatdark .Button--color--teal:focus{background-color:#13c4bc;color:#fff}.theme-vchatdark .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.theme-vchatdark .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--blue:hover,.theme-vchatdark .Button--color--blue:focus{background-color:#3a95d9;color:#fff}.theme-vchatdark .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.theme-vchatdark .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--violet:hover,.theme-vchatdark .Button--color--violet:focus{background-color:#7953cc;color:#fff}.theme-vchatdark .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.theme-vchatdark .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--purple:hover,.theme-vchatdark .Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.theme-vchatdark .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.theme-vchatdark .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--pink:hover,.theme-vchatdark .Button--color--pink:focus{background-color:#e257a5;color:#fff}.theme-vchatdark .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.theme-vchatdark .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--brown:hover,.theme-vchatdark .Button--color--brown:focus{background-color:#b47851;color:#fff}.theme-vchatdark .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.theme-vchatdark .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--grey:hover,.theme-vchatdark .Button--color--grey:focus{background-color:#868686;color:#fff}.theme-vchatdark .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.theme-vchatdark .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--good:hover,.theme-vchatdark .Button--color--good:focus{background-color:#6cba39;color:#fff}.theme-vchatdark .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.theme-vchatdark .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--average:hover,.theme-vchatdark .Button--color--average:focus{background-color:#ed9d35;color:#fff}.theme-vchatdark .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--bad:hover,.theme-vchatdark .Button--color--bad:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.theme-vchatdark .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--label:hover,.theme-vchatdark .Button--color--label:focus{background-color:#91a1b3;color:#fff}.theme-vchatdark .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.theme-vchatdark .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--default:hover,.theme-vchatdark .Button--color--default:focus{background-color:#5c83b0;color:#fff}.theme-vchatdark .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--caution:hover,.theme-vchatdark .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--danger:hover,.theme-vchatdark .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.theme-vchatdark .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--transparent:hover,.theme-vchatdark .Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.theme-vchatdark .Button--disabled{background-color:#999!important}.theme-vchatdark .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--selected:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--selected:hover,.theme-vchatdark .Button--selected:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--flex{display:inline-flex;flex-direction:column}.theme-vchatdark .Button--flex--fluid{width:100%}.theme-vchatdark .Button--verticalAlignContent--top{justify-content:flex-start}.theme-vchatdark .Button--verticalAlignContent--middle{justify-content:center}.theme-vchatdark .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-vchatdark .Button__content{display:block;align-self:stretch}.theme-vchatdark .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-vchatdark .NumberInput--fluid{display:block}.theme-vchatdark .NumberInput__content{margin-left:.5em}.theme-vchatdark .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-vchatdark .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.theme-vchatdark .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-vchatdark .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-vchatdark .Input--fluid{display:block;width:auto}.theme-vchatdark .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-vchatdark .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-vchatdark .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-vchatdark .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-vchatdark .TextArea--fluid{display:block;width:auto;height:auto}.theme-vchatdark .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-vchatdark .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-vchatdark .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-vchatdark .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15) 0%,rgba(255,255,255,0) 100%);border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-vchatdark .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-vchatdark .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-vchatdark .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-vchatdark .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-vchatdark .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-vchatdark .Knob__ringFillPivot{transform:rotate(135deg)}.theme-vchatdark .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-vchatdark .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-vchatdark .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-vchatdark .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-vchatdark .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-vchatdark .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-vchatdark .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-vchatdark .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-vchatdark .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-vchatdark .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-vchatdark .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-vchatdark .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-vchatdark .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-vchatdark .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-vchatdark .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-vchatdark .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-vchatdark .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-vchatdark .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.theme-vchatdark .Slider{cursor:e-resize}.theme-vchatdark .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-vchatdark .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-vchatdark .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-vchatdark .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-vchatdark .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-vchatdark .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-vchatdark .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-vchatdark .ProgressBar--color--default{border:.0833333333em solid #3e6189}.theme-vchatdark .ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.theme-vchatdark .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-vchatdark .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-vchatdark .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-vchatdark .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-vchatdark .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-vchatdark .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-vchatdark .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-vchatdark .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-vchatdark .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-vchatdark .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-vchatdark .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-vchatdark .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-vchatdark .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-vchatdark .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-vchatdark .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-vchatdark .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-vchatdark .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-vchatdark .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-vchatdark .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-vchatdark .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-vchatdark .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-vchatdark .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-vchatdark .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-vchatdark .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-vchatdark .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-vchatdark .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-vchatdark .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-vchatdark .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-vchatdark .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-vchatdark .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-vchatdark .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-vchatdark .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-vchatdark .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--label{border:.0833333333em solid #657a94!important}.theme-vchatdark .ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.theme-vchatdark .Chat{color:#abc6ec}.theme-vchatdark .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-vchatdark .Chat__badge:before{content:"x"}.theme-vchatdark .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-vchatdark .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-vchatdark .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-vchatdark .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-vchatdark .Chat__highlight{color:#000}.theme-vchatdark .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-vchatdark .ChatMessage{word-wrap:break-word}.theme-vchatdark .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-vchatdark .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-vchatdark .Layout,.theme-vchatdark .Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.theme-vchatdark .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-vchatdark .Layout__content--flexRow{display:flex;flex-flow:row}.theme-vchatdark .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-vchatdark .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(to bottom,#2a2a2a 0%,#202020 100%)}.theme-vchatdark .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-vchatdark .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-vchatdark .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-vchatdark .Window__contentPadding:after{height:0}.theme-vchatdark .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-vchatdark .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(62,62,62,.25);pointer-events:none}.theme-vchatdark .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-vchatdark .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-vchatdark .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-vchatdark .TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-vchatdark .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#363636;transition:color .25s ease-out,background-color .25s ease-out}.theme-vchatdark .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-vchatdark .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-vchatdark .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-vchatdark .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-vchatdark .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-vchatdark .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-vchatdark .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-vchatdark img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-vchatdark img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-vchatdark a{color:#397ea5}.theme-vchatdark a.visited,.theme-vchatdark a:visited{color:#7c00e6}.theme-vchatdark a.popt{text-decoration:none}.theme-vchatdark .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-vchatdark .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-vchatdark .popup .close:hover{background:#999}.theme-vchatdark .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-vchatdark .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-vchatdark .popup input[type=text]:hover,.theme-vchatdark .popup input[type=text]:active,.theme-vchatdark .popup input[type=text]:focus{border-color:green}.theme-vchatdark .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-vchatdark .popup input[type=submit]:hover,.theme-vchatdark .popup input[type=submit]:focus,.theme-vchatdark .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-vchatdark .changeFont{padding:10px}.theme-vchatdark .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-vchatdark .changeFont a:hover{background:#ccc}.theme-vchatdark .highlightPopup{padding:10px;text-align:center}.theme-vchatdark .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-vchatdark .highlightPopup input.highlightColor{background-color:#ff0}.theme-vchatdark .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-vchatdark .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-vchatdark .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-vchatdark .contextMenu a:hover{background-color:#ccc}.theme-vchatdark .filterMessages{padding:5px}.theme-vchatdark .filterMessages div{padding:2px 0}.theme-vchatdark .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-vchatdark .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-vchatdark .motd h1,.theme-vchatdark .motd h2,.theme-vchatdark .motd h3,.theme-vchatdark .motd h4,.theme-vchatdark .motd h5,.theme-vchatdark .motd h6{color:#638500;text-decoration:underline}.theme-vchatdark .motd a,.theme-vchatdark .motd a:link,.theme-vchatdark .motd a:visited,.theme-vchatdark .motd a:active,.theme-vchatdark .motd a:hover{color:#638500}.theme-vchatdark .bold,.theme-vchatdark .name,.theme-vchatdark .prefix,.theme-vchatdark .ooc,.theme-vchatdark .looc,.theme-vchatdark .adminooc,.theme-vchatdark .admin,.theme-vchatdark .medal,.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .italic,.theme-vchatdark .italics{font-style:italic}.theme-vchatdark .highlight{background:#ff0}.theme-vchatdark h1,.theme-vchatdark h2,.theme-vchatdark h3,.theme-vchatdark h4,.theme-vchatdark h5,.theme-vchatdark h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark h1.alert,.theme-vchatdark h2.alert{color:#a4bad6}.theme-vchatdark em{font-style:normal;font-weight:700}.theme-vchatdark .ooc{color:#004ed8;font-weight:700}.theme-vchatdark .ooc .elevated{color:#2e78d9}.theme-vchatdark .ooc .moderator{color:#184880}.theme-vchatdark .ooc .developer{color:#1b521f}.theme-vchatdark .ooc .admin{color:#b82e00}.theme-vchatdark .ooc .event_manager{color:#603}.theme-vchatdark .ooc .aooc{color:#960018}.theme-vchatdark img.text_tag{width:32px;height:10px;min-height:10px}.theme-vchatdark img.icon{vertical-align:middle;max-height:1em}.theme-vchatdark img.icon.bigicon{max-height:32px}.theme-vchatdark .looc{color:#3a9696;font-weight:700}.theme-vchatdark .rlooc{color:#3abb96;font-weight:700}.theme-vchatdark .adminobserverooc{color:#09c;font-weight:700}.theme-vchatdark .adminooc{color:#3d5bc3;font-weight:700}.theme-vchatdark .adminsay{color:#ff4500;font-weight:700}.theme-vchatdark .admin{color:#5975da;font-weight:700}.theme-vchatdark .mentor_channel{color:olive;font-weight:700}.theme-vchatdark .mod_channel{color:#735638;font-weight:700}.theme-vchatdark .admin_channel{color:#9611d4;font-weight:700}.theme-vchatdark .event_channel{color:#c39;font-weight:700}.theme-vchatdark .name{font-weight:700}.theme-vchatdark .say,.theme-vchatdark .emote,.theme-vchatdark .emotesubtle,.theme-vchatdark .npcemote,.theme-vchatdark .infoplain,.theme-vchatdark .oocplain,.theme-vchatdark .warningplain,.theme-vchatdark .chatexport{color:#fff}.theme-vchatdark .psay,.theme-vchatdark .pemote{color:#e300e4;font-style:italic}.theme-vchatdark .deadsay{color:#732fcd}.theme-vchatdark .binarysay{color:#1e90ff}.theme-vchatdark .binarysay a{color:#0f0}.theme-vchatdark .binarysay a:active,.theme-vchatdark .binarysay a:visited{color:#8f8}.theme-vchatdark .radio{color:#00a800}.theme-vchatdark .sciradio{color:#939}.theme-vchatdark .comradio{color:#395a9a}.theme-vchatdark .secradio{color:#a30000}.theme-vchatdark .medradio{color:#008160}.theme-vchatdark .engradio{color:#a66300}.theme-vchatdark .supradio{color:#5f4519}.theme-vchatdark .srvradio{color:#6eaa2c}.theme-vchatdark .expradio{color:#555}.theme-vchatdark .syndradio{color:#6d3f40}.theme-vchatdark .gangradio{color:#ac2ea1}.theme-vchatdark .centradio{color:#5c5c8a}.theme-vchatdark .airadio{color:#f0f}.theme-vchatdark .redteamradio{color:#f44!important}.theme-vchatdark .blueteamradio{color:#3434fd!important}.theme-vchatdark .greenteamradio{color:#34fd34!important}.theme-vchatdark .yellowteamradio{color:#fdfd34!important}.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .alert{color:red}.theme-vchatdark .valert{color:#d82020}.theme-vchatdark .userdanger{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .bolddanger{color:#c51e1e;font-weight:700}.theme-vchatdark .danger,.theme-vchatdark .vdanger{color:#c51e1e}.theme-vchatdark .warning,.theme-vchatdark .vwarning{color:#c51e1e;font-style:italic}.theme-vchatdark .alertwarning{color:red;font-weight:700}.theme-vchatdark .boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.theme-vchatdark .announce,.theme-vchatdark .boldannounce{color:#c51e1e;font-weight:700}.theme-vchatdark .minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .minoralert{color:#a4bad6;font-size:125%}.theme-vchatdark .priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.theme-vchatdark .prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.theme-vchatdark .priorityalert{color:#c51e1e;font-size:140%}.theme-vchatdark .greenannounce{color:#059223;font-weight:700}.theme-vchatdark .rose{color:#ff5050}.theme-vchatdark .info,.theme-vchatdark .notice,.theme-vchatdark .vnotice{color:#6060c9}.theme-vchatdark .tinynotice{color:#6060c9;font-size:85%}.theme-vchatdark .tinynoticeital{color:#6060c9;font-style:italic;font-size:85%}.theme-vchatdark .smallnotice{color:#6060c9;font-size:90%}.theme-vchatdark .smallnoticeital{color:#6060c9;font-style:italic;font-size:90%}.theme-vchatdark .bolditalic{font-style:italic;font-weight:700}.theme-vchatdark .boldnotice{color:#6060c9;font-weight:700}.theme-vchatdark .hear{color:#6060c9;font-style:italic}.theme-vchatdark .adminnotice{color:#6060c9}.theme-vchatdark .adminhelp{color:red;font-weight:700}.theme-vchatdark .log_message{color:#386aff;font-weight:700}.theme-vchatdark .unconscious{color:#a4bad6;font-weight:700}.theme-vchatdark .suicide{color:#ff5050;font-style:italic}.theme-vchatdark .green{color:#4f4}.theme-vchatdark .grey{color:#a9a9a9}.theme-vchatdark .red{color:red}.theme-vchatdark .blue{color:#66f}.theme-vchatdark .nicegreen{color:#059223}.theme-vchatdark .boldnicegreen{color:#059223;font-weight:700}.theme-vchatdark .blob{color:#ee4000}.theme-vchatdark .blobannounce{color:#556b2f;font-weight:700;font-size:185%}.theme-vchatdark .cult{color:#973e3b}.theme-vchatdark .cultitalic{color:#973e3b;font-style:italic}.theme-vchatdark .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-vchatdark .cultboldtalic,.theme-vchatdark .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-vchatdark .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-vchatdark .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-vchatdark .colossus{color:#7f282a;font-size:310%}.theme-vchatdark .hierophant{color:#b441ee;font-weight:700;font-style:italic}.theme-vchatdark .hierophant_warning{color:#c56bf1;font-style:italic}.theme-vchatdark .purple{color:#9956d3}.theme-vchatdark .holoparasite{color:#88809c}.theme-vchatdark .revennotice{color:#c099e2}.theme-vchatdark .revenboldnotice{color:#c099e2;font-weight:700}.theme-vchatdark .revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.theme-vchatdark .revenminor{color:#823abb}.theme-vchatdark .revenwarning{color:#760fbb;font-style:italic}.theme-vchatdark .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-vchatdark .deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.theme-vchatdark .ghostalert{color:#60f;font-style:italic;font-weight:700}.theme-vchatdark .alien{color:#855d85}.theme-vchatdark .noticealien{color:#059223}.theme-vchatdark .alertalien{color:#059223;font-weight:700}.theme-vchatdark .changeling{color:#b000b1;font-style:italic}.theme-vchatdark .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-vchatdark .spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.theme-vchatdark .spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.theme-vchatdark .spiderscout{color:#231d98;font-weight:700;font-size:120%}.theme-vchatdark .interface{color:#750e75}.theme-vchatdark .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-vchatdark .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-vchatdark .robot{font-family:Courier New,cursive,sans-serif}.theme-vchatdark .tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.theme-vchatdark .command_headset{font-weight:700;font-size:160%}.theme-vchatdark .small{font-size:60%}.theme-vchatdark .big{font-size:185%}.theme-vchatdark .reallybig{font-size:245%}.theme-vchatdark .extremelybig{font-size:310%}.theme-vchatdark .greentext{color:#059223;font-size:185%}.theme-vchatdark .redtext{color:#c51e1e;font-size:185%}.theme-vchatdark .clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-vchatdark .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-vchatdark .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-vchatdark .hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}to{color:#7adbf3}}.theme-vchatdark .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}to{color:#f75a5a}}.theme-vchatdark .icon{height:1em;width:auto}.theme-vchatdark .bigicon{font-size:2.5em}.theme-vchatdark .hugeicon{font-size:5em}.theme-vchatdark .memo{color:#638500;text-align:center}.theme-vchatdark .memoedit{text-align:center;font-size:125%}.theme-vchatdark .abductor{color:#c204c2;font-style:italic}.theme-vchatdark .mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.theme-vchatdark .slime{color:#00ced1}.theme-vchatdark .drone{color:#848482}.theme-vchatdark .monkey{color:#975032}.theme-vchatdark .swarmer{color:#2c75ff}.theme-vchatdark .resonate{color:#298f85}.theme-vchatdark .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-vchatdark .connectionClosed,.theme-vchatdark .fatalError{background:red;color:#fff;padding:5px}.theme-vchatdark .connectionClosed.restored{background:green}.theme-vchatdark .internal.boldnshit{color:#3d5bc3;font-weight:700}.theme-vchatdark .text-normal{font-weight:400;font-style:normal}.theme-vchatdark .hidden{display:none;visibility:hidden}.theme-vchatdark .ml-1{margin-left:1em}.theme-vchatdark .ml-2{margin-left:2em}.theme-vchatdark .ml-3{margin-left:3em}.theme-vchatdark .examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.theme-vchatdark .tooltip{font-style:italic;border-bottom:1px dashed #fff}.theme-vchatdark .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-vchatdark .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-vchatdark .major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-vchatdark .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-vchatdark .minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.theme-vchatdark .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-vchatdark .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_default .major_announcement_title,.theme-vchatdark .chat_alert_default .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_default .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_default .minor_announcement_text,.theme-vchatdark .chat_alert_default .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_green .major_announcement_title,.theme-vchatdark .chat_alert_green .minor_announcement_title{color:#00ff80}.theme-vchatdark .chat_alert_green .subheader_announcement_text{color:#ff85b5}.theme-vchatdark .chat_alert_green .minor_announcement_text,.theme-vchatdark .chat_alert_green .major_announcement_text{background-color:#002400}.theme-vchatdark .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_blue .major_announcement_title,.theme-vchatdark .chat_alert_blue .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_blue .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_blue .minor_announcement_text,.theme-vchatdark .chat_alert_blue .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_pink .major_announcement_title,.theme-vchatdark .chat_alert_pink .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_pink .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_pink .minor_announcement_text,.theme-vchatdark .chat_alert_pink .major_announcement_text{background-color:#17000d}.theme-vchatdark .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_yellow .major_announcement_title,.theme-vchatdark .chat_alert_yellow .minor_announcement_title{color:#fff4e0}.theme-vchatdark .chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_yellow .minor_announcement_text,.theme-vchatdark .chat_alert_yellow .major_announcement_text{background-color:#3e3400}.theme-vchatdark .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_orange .major_announcement_title,.theme-vchatdark .chat_alert_orange .minor_announcement_title{color:#feefe7}.theme-vchatdark .chat_alert_orange .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_orange .minor_announcement_text,.theme-vchatdark .chat_alert_orange .major_announcement_text{background-color:#402500}.theme-vchatdark .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_red .major_announcement_title,.theme-vchatdark .chat_alert_red .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_red .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_red .minor_announcement_text,.theme-vchatdark .chat_alert_red .major_announcement_text{background-color:#290000}.theme-vchatdark .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_purple .major_announcement_title,.theme-vchatdark .chat_alert_purple .minor_announcement_title{color:#c7a1f7}.theme-vchatdark .chat_alert_purple .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_purple .minor_announcement_text,.theme-vchatdark .chat_alert_purple .major_announcement_text{background-color:#150017}.theme-vchatdark .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_grey .major_announcement_title,.theme-vchatdark .chat_alert_grey .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_grey .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_grey .minor_announcement_text,.theme-vchatdark .chat_alert_grey .major_announcement_text{background-color:#181818}.theme-vchatdark .tajaran{color:#803b56}.theme-vchatdark .tajaran_signlang{color:#941c1c}.theme-vchatdark .akhani{color:#ac398c}.theme-vchatdark .skrell{color:#00b0b3}.theme-vchatdark .skrellfar{color:#70fcff}.theme-vchatdark .soghun{color:#50ba6c}.theme-vchatdark .solcom{color:#6da6f0}.theme-vchatdark .sergal{color:#07f}.theme-vchatdark .birdsongc{color:#c90}.theme-vchatdark .vulpkanin{color:#b97a57}.theme-vchatdark .tavan{color:#f54298;font-family:Arial}.theme-vchatdark .echosong{color:#826d8c}.theme-vchatdark .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-vchatdark .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-vchatdark .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-vchatdark .bug{color:#9e9e39}.theme-vchatdark .vox{color:#a0a}.theme-vchatdark .promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.theme-vchatdark .zaddat{color:#941c1c}.theme-vchatdark .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-vchatdark .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-vchatdark .spacer{color:#9c660b}.theme-vchatdark .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-vchatdark .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif} +html,body{box-sizing:border-box;height:100%;margin:0;font-size:12px}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif}*,*:before,*:after{box-sizing:inherit}h1,h2,h3,h4,h5,h6{display:block;margin:0;padding:6px 0;padding:.5rem 0}h1{font-size:18px;font-size:1.5rem}h2{font-size:16px;font-size:1.333rem}h3{font-size:14px;font-size:1.167rem}h4{font-size:12px;font-size:1rem}td,th{vertical-align:baseline;text-align:left}.candystripe:nth-child(odd){background-color:rgba(0,0,0,.25)}.color-black{color:#1a1a1a!important}.color-white{color:#fff!important}.color-red{color:#df3e3e!important}.color-orange{color:#f37f33!important}.color-yellow{color:#fbda21!important}.color-olive{color:#cbe41c!important}.color-green{color:#25ca4c!important}.color-teal{color:#00d6cc!important}.color-blue{color:#2e93de!important}.color-violet{color:#7349cf!important}.color-purple{color:#ad45d0!important}.color-pink{color:#e34da1!important}.color-brown{color:#b97447!important}.color-grey{color:#848484!important}.color-good{color:#68c22d!important}.color-average{color:#f29a29!important}.color-bad{color:#df3e3e!important}.color-label{color:#8b9bb0!important}.color-bg-black{background-color:#000!important}.color-bg-white{background-color:#d9d9d9!important}.color-bg-red{background-color:#bd2020!important}.color-bg-orange{background-color:#d95e0c!important}.color-bg-yellow{background-color:#d9b804!important}.color-bg-olive{background-color:#9aad14!important}.color-bg-green{background-color:#1b9638!important}.color-bg-teal{background-color:#009a93!important}.color-bg-blue{background-color:#1c71b1!important}.color-bg-violet{background-color:#552dab!important}.color-bg-purple{background-color:#8b2baa!important}.color-bg-pink{background-color:#cf2082!important}.color-bg-brown{background-color:#8c5836!important}.color-bg-grey{background-color:#646464!important}.color-bg-good{background-color:#4d9121!important}.color-bg-average{background-color:#cd7a0d!important}.color-bg-bad{background-color:#bd2020!important}.color-bg-label{background-color:#657a94!important}.debug-layout,.debug-layout *:not(g):not(path){color:rgba(255,255,255,.9)!important;background:rgba(0,0,0,0)!important;outline:1px solid rgba(255,255,255,.5)!important;box-shadow:none!important;filter:none!important}.debug-layout:hover,.debug-layout *:not(g):not(path):hover{outline-color:rgba(255,255,255,.8)!important}.outline-dotted{outline-style:dotted!important}.outline-dashed{outline-style:dashed!important}.outline-solid{outline-style:solid!important}.outline-double{outline-style:double!important}.outline-groove{outline-style:groove!important}.outline-ridge{outline-style:ridge!important}.outline-inset{outline-style:inset!important}.outline-outset{outline-style:outset!important}.outline-color-black{outline:.167rem solid #1a1a1a!important}.outline-color-white{outline:.167rem solid #fff!important}.outline-color-red{outline:.167rem solid #df3e3e!important}.outline-color-orange{outline:.167rem solid #f37f33!important}.outline-color-yellow{outline:.167rem solid #fbda21!important}.outline-color-olive{outline:.167rem solid #cbe41c!important}.outline-color-green{outline:.167rem solid #25ca4c!important}.outline-color-teal{outline:.167rem solid #00d6cc!important}.outline-color-blue{outline:.167rem solid #2e93de!important}.outline-color-violet{outline:.167rem solid #7349cf!important}.outline-color-purple{outline:.167rem solid #ad45d0!important}.outline-color-pink{outline:.167rem solid #e34da1!important}.outline-color-brown{outline:.167rem solid #b97447!important}.outline-color-grey{outline:.167rem solid #848484!important}.outline-color-good{outline:.167rem solid #68c22d!important}.outline-color-average{outline:.167rem solid #f29a29!important}.outline-color-bad{outline:.167rem solid #df3e3e!important}.outline-color-label{outline:.167rem solid #8b9bb0!important}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-baseline{text-align:baseline}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-pre{white-space:pre}.text-bold{font-weight:700}.text-italic{font-style:italic}.text-underline{text-decoration:underline}.BlockQuote{color:#8b9bb0;border-left:.1666666667em solid #8b9bb0;padding-left:.5em;margin-bottom:.5em}.BlockQuote:last-child{margin-bottom:0}.Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.Button:last-child{margin-right:0;margin-bottom:0}.Button .fa,.Button .fas,.Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.Button--hasContent .fa,.Button--hasContent .fas,.Button--hasContent .far{margin-right:.25em}.Button--hasContent.Button--iconPosition--right .fa,.Button--hasContent.Button--iconPosition--right .fas,.Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.Button--fluid{display:block;margin-left:0;margin-right:0}.Button--circular{border-radius:50%}.Button--compact{padding:0 .25em;line-height:1.333em}.Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.Button--color--black:hover{transition:color 0ms,background-color 0ms}.Button--color--black:focus{transition:color .1s,background-color .1s}.Button--color--black:hover,.Button--color--black:focus{background-color:#131313;color:#fff}.Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.Button--color--white:hover{transition:color 0ms,background-color 0ms}.Button--color--white:focus{transition:color .1s,background-color .1s}.Button--color--white:hover,.Button--color--white:focus{background-color:#f8f8f8;color:#000}.Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--red:hover{transition:color 0ms,background-color 0ms}.Button--color--red:focus{transition:color .1s,background-color .1s}.Button--color--red:hover,.Button--color--red:focus{background-color:#dc4848;color:#fff}.Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.Button--color--orange:hover{transition:color 0ms,background-color 0ms}.Button--color--orange:focus{transition:color .1s,background-color .1s}.Button--color--orange:hover,.Button--color--orange:focus{background-color:#f0853f;color:#fff}.Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.Button--color--yellow:focus{transition:color .1s,background-color .1s}.Button--color--yellow:hover,.Button--color--yellow:focus{background-color:#f5d72e;color:#000}.Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.Button--color--olive:hover{transition:color 0ms,background-color 0ms}.Button--color--olive:focus{transition:color .1s,background-color .1s}.Button--color--olive:hover,.Button--color--olive:focus{background-color:#c4da2b;color:#fff}.Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--color--green:hover{transition:color 0ms,background-color 0ms}.Button--color--green:focus{transition:color .1s,background-color .1s}.Button--color--green:hover,.Button--color--green:focus{background-color:#32c154;color:#fff}.Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.Button--color--teal:hover{transition:color 0ms,background-color 0ms}.Button--color--teal:focus{transition:color .1s,background-color .1s}.Button--color--teal:hover,.Button--color--teal:focus{background-color:#13c4bc;color:#fff}.Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.Button--color--blue:hover{transition:color 0ms,background-color 0ms}.Button--color--blue:focus{transition:color .1s,background-color .1s}.Button--color--blue:hover,.Button--color--blue:focus{background-color:#3a95d9;color:#fff}.Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.Button--color--violet:hover{transition:color 0ms,background-color 0ms}.Button--color--violet:focus{transition:color .1s,background-color .1s}.Button--color--violet:hover,.Button--color--violet:focus{background-color:#7953cc;color:#fff}.Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.Button--color--purple:hover{transition:color 0ms,background-color 0ms}.Button--color--purple:focus{transition:color .1s,background-color .1s}.Button--color--purple:hover,.Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.Button--color--pink:hover{transition:color 0ms,background-color 0ms}.Button--color--pink:focus{transition:color .1s,background-color .1s}.Button--color--pink:hover,.Button--color--pink:focus{background-color:#e257a5;color:#fff}.Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.Button--color--brown:hover{transition:color 0ms,background-color 0ms}.Button--color--brown:focus{transition:color .1s,background-color .1s}.Button--color--brown:hover,.Button--color--brown:focus{background-color:#b47851;color:#fff}.Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.Button--color--grey:hover{transition:color 0ms,background-color 0ms}.Button--color--grey:focus{transition:color .1s,background-color .1s}.Button--color--grey:hover,.Button--color--grey:focus{background-color:#868686;color:#fff}.Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.Button--color--good:hover{transition:color 0ms,background-color 0ms}.Button--color--good:focus{transition:color .1s,background-color .1s}.Button--color--good:hover,.Button--color--good:focus{background-color:#6cba39;color:#fff}.Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.Button--color--average:hover{transition:color 0ms,background-color 0ms}.Button--color--average:focus{transition:color .1s,background-color .1s}.Button--color--average:hover,.Button--color--average:focus{background-color:#ed9d35;color:#fff}.Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--bad:hover{transition:color 0ms,background-color 0ms}.Button--color--bad:focus{transition:color .1s,background-color .1s}.Button--color--bad:hover,.Button--color--bad:focus{background-color:#dc4848;color:#fff}.Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.Button--color--label:hover{transition:color 0ms,background-color 0ms}.Button--color--label:focus{transition:color .1s,background-color .1s}.Button--color--label:hover,.Button--color--label:focus{background-color:#91a1b3;color:#fff}.Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.Button--color--default:hover{transition:color 0ms,background-color 0ms}.Button--color--default:focus{transition:color .1s,background-color .1s}.Button--color--default:hover,.Button--color--default:focus{background-color:#5c83b0;color:#fff}.Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.Button--color--caution:hover{transition:color 0ms,background-color 0ms}.Button--color--caution:focus{transition:color .1s,background-color .1s}.Button--color--caution:hover,.Button--color--caution:focus{background-color:#f5d72e;color:#000}.Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.Button--color--danger:hover{transition:color 0ms,background-color 0ms}.Button--color--danger:focus{transition:color .1s,background-color .1s}.Button--color--danger:hover,.Button--color--danger:focus{background-color:#dc4848;color:#fff}.Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#202020;color:#fff;background-color:rgba(32,32,32,0);color:rgba(255,255,255,.5)}.Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.Button--color--transparent:focus{transition:color .1s,background-color .1s}.Button--color--transparent:hover,.Button--color--transparent:focus{background-color:#383838;color:#fff}.Button--disabled{background-color:#999!important}.Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.Button--selected:hover{transition:color 0ms,background-color 0ms}.Button--selected:focus{transition:color .1s,background-color .1s}.Button--selected:hover,.Button--selected:focus{background-color:#32c154;color:#fff}.Button--flex{display:inline-flex;flex-direction:column}.Button--flex--fluid{width:100%}.Button--verticalAlignContent--top{justify-content:flex-start}.Button--verticalAlignContent--middle{justify-content:center}.Button--verticalAlignContent--bottom{justify-content:flex-end}.Button__content{display:block;align-self:stretch}.ColorBox{display:inline-block;width:1em;height:1em;line-height:1em;text-align:center}.Dimmer{display:flex;justify-content:center;align-items:center;position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(0,0,0,.75);z-index:1}.Dropdown{position:relative}.Dropdown__control{position:relative;display:inline-block;font-family:Verdana,sans-serif;font-size:1em;width:8.3333333333em;line-height:1.4166666667em;-ms-user-select:none;user-select:none}.Dropdown__arrow-button{float:right;padding-left:.35em;width:1.2em;height:1.8333333333em;border-left:.0833333333em solid #000;border-left:.0833333333em solid rgba(0,0,0,.25)}.Dropdown__menu{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;overflow-y:scroll;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menu-noscroll{position:absolute;overflow-y:auto;z-index:5;width:8.3333333333em;max-height:16.6666666667em;border-radius:0 0 .1666666667em .1666666667em;color:#fff;background-color:#000;background-color:rgba(0,0,0,.75)}.Dropdown__menuentry{padding:.1666666667em .3333333333em;font-family:Verdana,sans-serif;font-size:1em;line-height:1.4166666667em;transition:background-color .1s ease-out}.Dropdown__menuentry:hover{background-color:rgba(255,255,255,.2);transition:background-color 0ms}.Dropdown__over{top:auto;bottom:100%}.Dropdown__selected-text{display:inline-block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;height:1.4166666667em;width:calc(100% - 1.2em)}.Flex{display:-ms-flexbox;display:flex}.Flex--inline{display:inline-flex}.Flex--iefix{display:block}.Flex--iefix.Flex--inline,.Flex__item--iefix{display:inline-block}.Flex--iefix--column>.Flex__item--iefix{display:block}.Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15) 0%,rgba(255,255,255,0) 100%);border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.Knob__ringTrackPivot{transform:rotate(135deg)}.Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.Knob__ringFillPivot{transform:rotate(135deg)}.Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.Knob--color--white .Knob__ringFill{stroke:#fff}.Knob--color--red .Knob__ringFill{stroke:#df3e3e}.Knob--color--orange .Knob__ringFill{stroke:#f37f33}.Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.Knob--color--green .Knob__ringFill{stroke:#25ca4c}.Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.Knob--color--blue .Knob__ringFill{stroke:#2e93de}.Knob--color--violet .Knob__ringFill{stroke:#7349cf}.Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.Knob--color--pink .Knob__ringFill{stroke:#e34da1}.Knob--color--brown .Knob__ringFill{stroke:#b97447}.Knob--color--grey .Knob__ringFill{stroke:#848484}.Knob--color--good .Knob__ringFill{stroke:#68c22d}.Knob--color--average .Knob__ringFill{stroke:#f29a29}.Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.LabeledList{display:table;width:100%;width:calc(100% + 1em);border-collapse:collapse;border-spacing:0;margin:-.25em -.5em 0;padding:0}.LabeledList__row{display:table-row}.LabeledList__row:last-child .LabeledList__cell{padding-bottom:0}.LabeledList__cell{display:table-cell;margin:0;padding:.25em .5em;border:0;text-align:left}.LabeledList__label--nowrap{width:1%;white-space:nowrap;min-width:5em}.LabeledList__buttons{width:.1%;white-space:nowrap;text-align:right;padding-top:.0833333333em;padding-bottom:0}.LabeledList__breakContents{word-break:break-all;word-wrap:break-word}.Modal{background-color:#202020;max-width:calc(100% - 1rem);padding:1rem}.NoticeBox{padding:.33em .5em;margin-bottom:.5em;box-shadow:none;font-weight:700;font-style:italic;color:#000;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,transparent,transparent .8333333333em,rgba(0,0,0,.1) .8333333333em,rgba(0,0,0,.1) 1.6666666667em)}.NoticeBox--color--black{color:#fff;background-color:#000}.NoticeBox--color--white{color:#000;background-color:#b3b3b3}.NoticeBox--color--red{color:#fff;background-color:#701f1f}.NoticeBox--color--orange{color:#fff;background-color:#854114}.NoticeBox--color--yellow{color:#000;background-color:#83710d}.NoticeBox--color--olive{color:#000;background-color:#576015}.NoticeBox--color--green{color:#fff;background-color:#174e24}.NoticeBox--color--teal{color:#fff;background-color:#064845}.NoticeBox--color--blue{color:#fff;background-color:#1b4565}.NoticeBox--color--violet{color:#fff;background-color:#3b2864}.NoticeBox--color--purple{color:#fff;background-color:#542663}.NoticeBox--color--pink{color:#fff;background-color:#802257}.NoticeBox--color--brown{color:#fff;background-color:#4c3729}.NoticeBox--color--grey{color:#fff;background-color:#3e3e3e}.NoticeBox--color--good{color:#fff;background-color:#2e4b1a}.NoticeBox--color--average{color:#fff;background-color:#7b4e13}.NoticeBox--color--bad{color:#fff;background-color:#701f1f}.NoticeBox--color--label{color:#fff;background-color:#53565a}.NoticeBox--type--info{color:#fff;background-color:#235982}.NoticeBox--type--success{color:#fff;background-color:#1e662f}.NoticeBox--type--warning{color:#fff;background-color:#a95219}.NoticeBox--type--danger{color:#fff;background-color:#8f2828}.NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.NumberInput--fluid{display:block}.NumberInput__content{margin-left:.5em}.NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.ProgressBar--color--default{border:.0833333333em solid #3e6189}.ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.ProgressBar--color--black{border:.0833333333em solid #000!important}.ProgressBar--color--black .ProgressBar__fill{background-color:#000}.ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.ProgressBar--color--grey{border:.0833333333em solid #646464!important}.ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.ProgressBar--color--label{border:.0833333333em solid #657a94!important}.ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.Section{position:relative;margin-bottom:.5em;background-color:#131313;box-sizing:border-box}.Section:last-child{margin-bottom:0}.Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.Section__rest{position:relative}.Section__content{padding:.66em .5em}.Section--fitted>.Section__rest>.Section__content{padding:0}.Section--fill{display:flex;flex-direction:column;height:100%}.Section--fill>.Section__rest{flex-grow:1}.Section--fill>.Section__rest>.Section__content{height:100%}.Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.Section--scrollable{overflow-x:hidden;overflow-y:hidden}.Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.Section .Section:first-child{margin-top:-.5em}.Section .Section .Section__titleText{font-size:1.0833333333em}.Section .Section .Section .Section__titleText{font-size:1em}.Section--flex{display:flex;flex-flow:column}.Section--flex .Section__content{overflow:auto;flex-grow:1}.Section__content--noTopPadding{padding-top:0}.Section__content--stretchContents{height:calc(100% - 3rem)}.Slider{cursor:e-resize}.Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.Divider--horizontal{margin:.5em 0}.Divider--horizontal:not(.Divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Divider--vertical{height:100%;margin:0 .5em}.Divider--vertical:not(.Divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--fill{height:100%}.Stack--horizontal>.Stack__item{margin-left:.5em}.Stack--horizontal>.Stack__item:first-child{margin-left:0}.Stack--vertical>.Stack__item{margin-top:.5em}.Stack--vertical>.Stack__item:first-child{margin-top:0}.Stack--horizontal>.Stack__divider:not(.Stack__divider--hidden){border-left:.1666666667em solid rgba(255,255,255,.1)}.Stack--vertical>.Stack__divider:not(.Stack__divider--hidden){border-top:.1666666667em solid rgba(255,255,255,.1)}.Table{display:table;width:100%;border-collapse:collapse;border-spacing:0;margin:0}.Table--collapsing{width:auto}.Table__row{display:table-row}.Table__cell{display:table-cell;padding:0 .25em}.Table__cell:first-child{padding-left:0}.Table__cell:last-child{padding-right:0}.Table__row--header .Table__cell,.Table__cell--header{font-weight:700;padding-bottom:.5em}.Table__cell--collapsing{width:1%;white-space:nowrap}.Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#131313}.Tabs--fill{height:100%}.Section .Tabs{background-color:rgba(0,0,0,0)}.Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.Tabs--horizontal:last-child{margin-bottom:0}.Tabs__Tab{flex-grow:0}.Tabs--fluid .Tabs__Tab{flex-grow:1}.Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.Tab__text{flex-grow:1;margin:0 .5em}.Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.Tab--selected.Tab--color--black{color:#535353}.Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.Tab--selected.Tab--color--white{color:#fff}.Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.Tab--selected.Tab--color--red{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.Tab--selected.Tab--color--orange{color:#f69f66}.Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.Tab--selected.Tab--color--yellow{color:#fce358}.Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.Tab--selected.Tab--color--olive{color:#d8eb55}.Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.Tab--selected.Tab--color--green{color:#53e074}.Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.Tab--selected.Tab--color--teal{color:#21fff5}.Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.Tab--selected.Tab--color--blue{color:#62aee6}.Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.Tab--selected.Tab--color--violet{color:#9676db}.Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.Tab--selected.Tab--color--purple{color:#c274db}.Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.Tab--selected.Tab--color--pink{color:#ea79b9}.Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.Tab--selected.Tab--color--brown{color:#ca9775}.Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.Tab--selected.Tab--color--grey{color:#a3a3a3}.Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.Tab--selected.Tab--color--good{color:#8cd95a}.Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.Tab--selected.Tab--color--average{color:#f5b35e}.Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.Tab--selected.Tab--color--bad{color:#e76e6e}.Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.Tab--selected.Tab--color--label{color:#a8b4c4}.Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.Input--fluid{display:block;width:auto}.Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Input--monospace .Input__input{font-family:Consolas,monospace}.TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.TextArea--fluid{display:block;width:auto;height:auto}.TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.Tooltip{z-index:2;padding:.5em .75em;pointer-events:none;text-align:left;transition:opacity .15s ease-out;background-color:#000;color:#fff;box-shadow:.1em .1em 1.25em -.1em rgba(0,0,0,.5);border-radius:.16em;max-width:20.8333333333em}.Chat{color:#abc6ec}.Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.Chat__badge:before{content:"x"}.Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.Chat__scrollButton{position:fixed;right:2em;bottom:1em}.Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#131313}.Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.Chat__highlight{color:#000}.Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.ChatMessage{word-wrap:break-word}.ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.Ping{position:relative;padding:.125em .25em;border:.0833333333em solid rgba(140,140,140,.5);border-radius:.25em;width:3.75em;text-align:right}.Ping__indicator{content:"";position:absolute;top:.5em;left:.5em;width:.5em;height:.5em;background-color:#888;border-radius:.25em}.Notifications{position:absolute;bottom:1em;left:1em;right:2em}.Notification{color:#fff;background-color:#dc143c;padding:.5em;margin:1em 0}.Notification:first-child{margin-top:0}.Notification:last-child{margin-bottom:0}.Layout,.Layout *{scrollbar-base-color:#181818;scrollbar-face-color:#363636;scrollbar-3dlight-color:#202020;scrollbar-highlight-color:#202020;scrollbar-track-color:#181818;scrollbar-arrow-color:#909090;scrollbar-shadow-color:#363636}.Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.Layout__content--flexRow{display:flex;flex-flow:row}.Layout__content--flexColumn{display:flex;flex-flow:column}.Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#202020;background-image:linear-gradient(to bottom,#202020 0%,#202020 100%)}.Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.Window__contentPadding:after{height:0}.Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(56,56,56,.25);pointer-events:none}.Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}a{color:#397ea5}a.visited,a:visited{color:#7c00e6}a.popt{text-decoration:none}.popup{position:fixed;top:50%;left:50%;background:#ddd}.popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.popup .close:hover{background:#999}.popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.popup input[type=text]:hover,.popup input[type=text]:active,.popup input[type=text]:focus{border-color:green}.popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.popup input[type=submit]:hover,.popup input[type=submit]:focus,.popup input[type=submit]:active{background:#aaa;cursor:pointer}.changeFont{padding:10px}.changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.changeFont a:hover{background:#ccc}.highlightPopup{padding:10px;text-align:center}.highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.highlightPopup input.highlightColor{background-color:#ff0}.highlightPopup input.highlightTermSubmit{margin-top:5px}.contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.contextMenu a:hover{background-color:#ccc}.filterMessages{padding:5px}.filterMessages div{padding:2px 0}.icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.motd{color:#a4bad6;font-family:Verdana,sans-serif;white-space:normal}.motd h1,.motd h2,.motd h3,.motd h4,.motd h5,.motd h6{color:#a4bad6;text-decoration:underline}.motd a,.motd a:link,.motd a:visited,.motd a:active,.motd a:hover{color:#a4bad6}.bold,.name,.prefix,.ooc,.looc,.adminooc,.admin,.medal,.yell{font-weight:700}.italic,.italics{font-style:italic}.highlight{background:#ff0}h1,h2,h3,h4,h5,h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}h1.alert,h2.alert{color:#a4bad6}em{font-style:normal;font-weight:700}.ooc{color:#cca300;font-weight:700}.ooc .elevated{color:#2e78d9}.ooc .moderator{color:#184880}.ooc .developer{color:#1b521f}.ooc .admin{color:#b82e00}.ooc .event_manager{color:#603}.ooc .aooc{color:#960018}img.text_tag{width:32px;height:10px;min-height:10px}img.icon{vertical-align:middle;max-height:1em}img.icon.bigicon{max-height:32px}.looc{color:#3a9696;font-weight:700}.rlooc{color:#3abb96;font-weight:700}.adminobserverooc{color:#09c;font-weight:700}.adminooc{color:#3d5bc3;font-weight:700}.adminsay{color:#ff4500;font-weight:700}.admin{color:#5975da;font-weight:700}.mentor_channel{color:olive;font-weight:700}.mod_channel{color:#735638;font-weight:700}.admin_channel{color:#9611d4;font-weight:700}.event_channel{color:#c39;font-weight:700}.name{font-weight:700}.psay,.pemote{color:#e300e4;font-style:italic}.deadsay{color:#e2c1ff}.binarysay{color:#1e90ff}.binarysay a{color:#0f0}.binarysay a:active,.binarysay a:visited{color:#8f8}.radio{color:#1ecc43}.sciradio{color:#c68cfa}.comradio{color:#57b8f0}.secradio{color:#dd3535}.medradio{color:#57f09e}.engradio{color:#fcdf03}.supradio{color:#b88646}.srvradio{color:#6ca729}.expradio{color:#8a8a8a}.syndradio{color:#8f4a4b}.gangradio{color:#ac2ea1}.centradio{color:#2681a5}.airadio{color:#d65d95}.redteamradio{color:#f44!important}.blueteamradio{color:#3434fd!important}.greenteamradio{color:#34fd34!important}.yellowteamradio{color:#fdfd34!important}.yell{font-weight:700}.alert,.valert{color:#d82020}.userdanger{color:#c51e1e;font-weight:700;font-size:185%}.bolddanger{color:#c51e1e;font-weight:700}.danger,.vdanger{color:#c51e1e}.warning,.vwarning{color:#c51e1e;font-style:italic}.alertwarning{color:red;font-weight:700}.boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.announce,.boldannounce{color:#c51e1e;font-weight:700}.minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.minoralert{color:#a4bad6;font-size:125%}.priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.priorityalert{color:#c51e1e;font-size:140%}.greenannounce{color:#059223;font-weight:700}.rose{color:#ff5050}.info{color:#9ab0ff}.notice,.vnotice{color:#6685f5}.tinynotice{color:#6685f5;font-size:85%}.tinynoticeital{color:#6685f5;font-style:italic;font-size:85%}.smallnotice{color:#6685f5;font-size:90%}.smallnoticeital{color:#6685f5;font-style:italic;font-size:90%}.bolditalic{font-style:italic;font-weight:700}.boldnotice{color:#6685f5;font-weight:700}.hear{color:#6685f5;font-style:italic}.adminnotice{color:#6685f5}.adminhelp{color:red;font-weight:700}.log_message{color:#386aff;font-weight:700}.unconscious{color:#a4bad6;font-weight:700}.suicide{color:#ff5050;font-style:italic}.green{color:#059223}.grey{color:#838383}.red{color:red}.crimson{color:#dc143c}.maroon{color:#c60000}.brown{color:#db733b}.blue{color:#4173fd}.black,.white{color:#fff}.darkgray{color:gray}.gray{color:#a9a9a9}.yellow{color:#fc0}.pink{color:pink}.cyan{color:#0ff}.orange{color:#ff8c00}.nicegreen{color:#059223}.boldnicegreen{color:#059223;font-weight:700}.blob{color:#ee4000}.blobannounce{color:#556b2f;font-weight:700;font-size:185%}.cult{color:#973e3b}.cultitalic{color:#973e3b;font-style:italic}.cultbold{color:#973e3b;font-style:italic;font-weight:700}.cultboldtalic,.cultlarge{color:#973e3b;font-weight:700;font-size:185%}.narsie{color:#973e3b;font-weight:700;font-size:925%}.narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.colossus{color:#7f282a;font-size:310%}.hierophant{color:#b441ee;font-weight:700;font-style:italic}.hierophant_warning{color:#c56bf1;font-style:italic}.purple{color:#9956d3}.lightpurple{color:#ad5aad}.darkpink{color:#e3209b}.holoparasite{color:#88809c}.revennotice{color:#c099e2}.revenboldnotice{color:#c099e2;font-weight:700}.revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.revenminor{color:#823abb}.revenwarning{color:#760fbb;font-style:italic}.revendanger{color:#760fbb;font-weight:700;font-size:185%}.deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.ghostalert{color:#60f;font-style:italic;font-weight:700}.alien{color:#855d85}.noticealien{color:#059223}.alertalien{color:#059223;font-weight:700}.changeling{color:#b000b1;font-style:italic}.alertsyndie{color:red;font-size:185%;font-weight:700}.spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.spiderscout{color:#231d98;font-weight:700;font-size:120%}.interface{color:#961196}.sans{font-family:Comic Sans MS,cursive,sans-serif}.papyrus{font-family:Papyrus,cursive,sans-serif}.robot{font-family:Courier New,cursive,sans-serif}.tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.command_headset{font-weight:700;font-size:160%}.small{font-size:60%}.big{font-size:185%}.reallybig{font-size:245%}.extremelybig{font-size:310%}.greentext{color:#059223;font-size:185%}.redtext{color:#c51e1e;font-size:185%}.clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}.phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}.icon{height:1em;width:auto}.bigicon{font-size:2.5em}.hugeicon{font-size:5em}.memo{color:#638500;text-align:center}.memoedit{text-align:center;font-size:125%}.abductor{color:#c204c2;font-style:italic}.mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.slime{color:#00ced1}.drone{color:#848482}.monkey{color:#975032}.swarmer{color:#2c75ff}.resonate{color:#298f85}.upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.connectionClosed,.fatalError{background:red;color:#fff;padding:5px}.connectionClosed.restored{background:green}.internal.boldnshit{color:#3d5bc3;font-weight:700}.text-normal{font-weight:400;font-style:normal}.hidden{display:none;visibility:hidden}.ml-1{margin-left:1em}.ml-2{margin-left:2em}.ml-3{margin-left:3em}.examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.tooltip{font-style:italic;border-bottom:1px dashed #fff}.major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_default .major_announcement_title,.chat_alert_default .minor_announcement_title{color:#33d5ff}.chat_alert_default .subheader_announcement_text{color:#ff5297}.chat_alert_default .minor_announcement_text,.chat_alert_default .major_announcement_text{background-color:#001621}.chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_green .major_announcement_title,.chat_alert_green .minor_announcement_title{color:#00ff80}.chat_alert_green .subheader_announcement_text{color:#ff85b5}.chat_alert_green .minor_announcement_text,.chat_alert_green .major_announcement_text{background-color:#002400}.chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_blue .major_announcement_title,.chat_alert_blue .minor_announcement_title{color:#33d5ff}.chat_alert_blue .subheader_announcement_text{color:#ff5297}.chat_alert_blue .minor_announcement_text,.chat_alert_blue .major_announcement_text{background-color:#001621}.chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_pink .major_announcement_title,.chat_alert_pink .minor_announcement_title{color:#ff5297}.chat_alert_pink .subheader_announcement_text{color:#33d5ff}.chat_alert_pink .minor_announcement_text,.chat_alert_pink .major_announcement_text{background-color:#17000d}.chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_yellow .major_announcement_title,.chat_alert_yellow .minor_announcement_title{color:#fff4e0}.chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.chat_alert_yellow .minor_announcement_text,.chat_alert_yellow .major_announcement_text{background-color:#3e3400}.chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_orange .major_announcement_title,.chat_alert_orange .minor_announcement_title{color:#feefe7}.chat_alert_orange .subheader_announcement_text{color:#33d5ff}.chat_alert_orange .minor_announcement_text,.chat_alert_orange .major_announcement_text{background-color:#402500}.chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_red .major_announcement_title,.chat_alert_red .minor_announcement_title{color:#ff5297}.chat_alert_red .subheader_announcement_text{color:#33d5ff}.chat_alert_red .minor_announcement_text,.chat_alert_red .major_announcement_text{background-color:#290000}.chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_purple .major_announcement_title,.chat_alert_purple .minor_announcement_title{color:#c7a1f7}.chat_alert_purple .subheader_announcement_text{color:#33d5ff}.chat_alert_purple .minor_announcement_text,.chat_alert_purple .major_announcement_text{background-color:#150017}.chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.chat_alert_grey .major_announcement_title,.chat_alert_grey .minor_announcement_title{color:#ff5297}.chat_alert_grey .subheader_announcement_text{color:#33d5ff}.chat_alert_grey .minor_announcement_text,.chat_alert_grey .major_announcement_text{background-color:#181818}.tajaran{color:#803b56}.tajaran_signlang{color:#941c1c}.akhani{color:#ac398c}.skrell{color:#00b0b3}.skrellfar{color:#70fcff}.soghun{color:#50ba6c}.solcom{color:#6da6f0}.sergal{color:#07f}.birdsongc{color:#c90}.vulpkanin{color:#b97a57}.tavan{color:#f54298;font-family:Arial}.echosong{color:#826d8c}.enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.bug{color:#9e9e39}.vox{color:#a0a}.promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.zaddat{color:#941c1c}.rough{font-family:Trebuchet MS,cursive,sans-serif}.say_quote{font-family:Georgia,Verdana,sans-serif}.say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.terminus{font-family:Times New Roman,Times,serif,sans-serif}.spacer{color:#9c660b}.teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-light .color-black{color:#000!important}.theme-light .color-white{color:#e6e6e6!important}.theme-light .color-red{color:#c82121!important}.theme-light .color-orange{color:#e6630d!important}.theme-light .color-yellow{color:#e5c304!important}.theme-light .color-olive{color:#a3b816!important}.theme-light .color-green{color:#1d9f3b!important}.theme-light .color-teal{color:#00a39c!important}.theme-light .color-blue{color:#1e78bb!important}.theme-light .color-violet{color:#5a30b5!important}.theme-light .color-purple{color:#932eb4!important}.theme-light .color-pink{color:#db228a!important}.theme-light .color-brown{color:#955d39!important}.theme-light .color-grey{color:#e6e6e6!important}.theme-light .color-good{color:#529923!important}.theme-light .color-average{color:#da810e!important}.theme-light .color-bad{color:#c82121!important}.theme-light .color-label{color:#353535!important}.theme-light .color-bg-black{background-color:#000!important}.theme-light .color-bg-white{background-color:#bfbfbf!important}.theme-light .color-bg-red{background-color:#a61c1c!important}.theme-light .color-bg-orange{background-color:#c0530b!important}.theme-light .color-bg-yellow{background-color:#bfa303!important}.theme-light .color-bg-olive{background-color:#889912!important}.theme-light .color-bg-green{background-color:#188532!important}.theme-light .color-bg-teal{background-color:#008882!important}.theme-light .color-bg-blue{background-color:#19649c!important}.theme-light .color-bg-violet{background-color:#4b2897!important}.theme-light .color-bg-purple{background-color:#7a2696!important}.theme-light .color-bg-pink{background-color:#b61d73!important}.theme-light .color-bg-brown{background-color:#7c4d2f!important}.theme-light .color-bg-grey{background-color:#bfbfbf!important}.theme-light .color-bg-good{background-color:#44801d!important}.theme-light .color-bg-average{background-color:#b56b0b!important}.theme-light .color-bg-bad{background-color:#a61c1c!important}.theme-light .color-bg-label{background-color:#2c2c2c!important}.theme-light .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:#fff}.theme-light .Tabs--fill{height:100%}.theme-light .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-light .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-light .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-light .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-light .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-light .Tabs--horizontal:last-child{margin-bottom:0}.theme-light .Tabs__Tab{flex-grow:0}.theme-light .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-light .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(0,0,0,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.theme-light .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.theme-light .Tab--selected{background-color:rgba(255,255,255,.125);color:#404040}.theme-light .Tab__text{flex-grow:1;margin:0 .5em}.theme-light .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-light .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-light .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-light .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #000}.theme-light .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-light .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #000}.theme-light .Tab--selected.Tab--color--black{color:#404040}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#000}.theme-light .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#000}.theme-light .Tab--selected.Tab--color--white{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--red{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--orange{color:#f48942}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#e6630d}.theme-light .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#e6630d}.theme-light .Tab--selected.Tab--color--yellow{color:#fcdd33}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#e5c304}.theme-light .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#e5c304}.theme-light .Tab--selected.Tab--color--olive{color:#d0e732}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#a3b816}.theme-light .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#a3b816}.theme-light .Tab--selected.Tab--color--green{color:#33da5a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#1d9f3b}.theme-light .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#1d9f3b}.theme-light .Tab--selected.Tab--color--teal{color:#00faef}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00a39c}.theme-light .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00a39c}.theme-light .Tab--selected.Tab--color--blue{color:#419ce1}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#1e78bb}.theme-light .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#1e78bb}.theme-light .Tab--selected.Tab--color--violet{color:#7f58d3}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#5a30b5}.theme-light .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#5a30b5}.theme-light .Tab--selected.Tab--color--purple{color:#b455d4}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#932eb4}.theme-light .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#932eb4}.theme-light .Tab--selected.Tab--color--pink{color:#e558a7}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#db228a}.theme-light .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#db228a}.theme-light .Tab--selected.Tab--color--brown{color:#c0825a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#955d39}.theme-light .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#955d39}.theme-light .Tab--selected.Tab--color--grey{color:#ececec}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#e6e6e6}.theme-light .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#e6e6e6}.theme-light .Tab--selected.Tab--color--good{color:#77d23b}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#529923}.theme-light .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#529923}.theme-light .Tab--selected.Tab--color--average{color:#f3a23a}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#da810e}.theme-light .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#da810e}.theme-light .Tab--selected.Tab--color--bad{color:#e14d4d}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#c82121}.theme-light .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#c82121}.theme-light .Tab--selected.Tab--color--label{color:#686868}.theme-light .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#353535}.theme-light .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#353535}.theme-light .Section{position:relative;margin-bottom:.5em;background-color:#fff;box-sizing:border-box}.theme-light .Section:last-child{margin-bottom:0}.theme-light .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #fff}.theme-light .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#000}.theme-light .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-light .Section__rest{position:relative}.theme-light .Section__content{padding:.66em .5em}.theme-light .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-light .Section--fill{display:flex;flex-direction:column;height:100%}.theme-light .Section--fill>.Section__rest{flex-grow:1}.theme-light .Section--fill>.Section__rest>.Section__content{height:100%}.theme-light .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-light .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-light .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-light .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-light .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-light .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-light .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-light .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-light .Section .Section:first-child{margin-top:-.5em}.theme-light .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-light .Section .Section .Section .Section__titleText{font-size:1em}.theme-light .Section--flex{display:flex;flex-flow:column}.theme-light .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-light .Section__content--noTopPadding{padding-top:0}.theme-light .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-light .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-light .Button:last-child{margin-right:0;margin-bottom:0}.theme-light .Button .fa,.theme-light .Button .fas,.theme-light .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-light .Button--hasContent .fa,.theme-light .Button--hasContent .fas,.theme-light .Button--hasContent .far{margin-right:.25em}.theme-light .Button--hasContent.Button--iconPosition--right .fa,.theme-light .Button--hasContent.Button--iconPosition--right .fas,.theme-light .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-light .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-light .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-light .Button--circular{border-radius:50%}.theme-light .Button--compact{padding:0 .25em;line-height:1.333em}.theme-light .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-light .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--black:hover,.theme-light .Button--color--black:focus{background-color:#131313;color:#fff}.theme-light .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--white:hover,.theme-light .Button--color--white:focus{background-color:#efefef;color:#000}.theme-light .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--red:hover,.theme-light .Button--color--red:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#c0530b;color:#fff}.theme-light .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--orange:hover,.theme-light .Button--color--orange:focus{background-color:#ea7426;color:#fff}.theme-light .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#bfa303;color:#fff}.theme-light .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--yellow:hover,.theme-light .Button--color--yellow:focus{background-color:#efce17;color:#fff}.theme-light .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#889912;color:#fff}.theme-light .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--olive:hover,.theme-light .Button--color--olive:focus{background-color:#afc328;color:#fff}.theme-light .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#188532;color:#fff}.theme-light .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--green:hover,.theme-light .Button--color--green:focus{background-color:#2fac4c;color:#fff}.theme-light .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#008882;color:#fff}.theme-light .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--teal:hover,.theme-light .Button--color--teal:focus{background-color:#13afa9;color:#fff}.theme-light .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#19649c;color:#fff}.theme-light .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--blue:hover,.theme-light .Button--color--blue:focus{background-color:#3086c7;color:#fff}.theme-light .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#4b2897;color:#fff}.theme-light .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--violet:hover,.theme-light .Button--color--violet:focus{background-color:#6a41c1;color:#fff}.theme-light .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#7a2696;color:#fff}.theme-light .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--purple:hover,.theme-light .Button--color--purple:focus{background-color:#a03fc0;color:#fff}.theme-light .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#b61d73;color:#fff}.theme-light .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--pink:hover,.theme-light .Button--color--pink:focus{background-color:#da3f96;color:#fff}.theme-light .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#7c4d2f;color:#fff}.theme-light .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--brown:hover,.theme-light .Button--color--brown:focus{background-color:#a26c49;color:#fff}.theme-light .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#bfbfbf;color:#000}.theme-light .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--grey:hover,.theme-light .Button--color--grey:focus{background-color:#efefef;color:#000}.theme-light .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#44801d;color:#fff}.theme-light .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--good:hover,.theme-light .Button--color--good:focus{background-color:#62a635;color:#fff}.theme-light .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#b56b0b;color:#fff}.theme-light .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--average:hover,.theme-light .Button--color--average:focus{background-color:#e48f20;color:#fff}.theme-light .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#a61c1c;color:#fff}.theme-light .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--bad:hover,.theme-light .Button--color--bad:focus{background-color:#d23333;color:#fff}.theme-light .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#2c2c2c;color:#fff}.theme-light .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--label:hover,.theme-light .Button--color--label:focus{background-color:#464646;color:#fff}.theme-light .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#bbb;color:#000}.theme-light .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--default:hover,.theme-light .Button--color--default:focus{background-color:#eaeaea;color:#000}.theme-light .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#be6209;color:#fff}.theme-light .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--caution:hover,.theme-light .Button--color--caution:focus{background-color:#ec8420;color:#fff}.theme-light .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#9a9d00;color:#fff}.theme-light .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--danger:hover,.theme-light .Button--color--danger:focus{background-color:#c4c813;color:#fff}.theme-light .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#eee;color:#000;background-color:rgba(238,238,238,0);color:rgba(0,0,0,.5)}.theme-light .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-light .Button--color--transparent:hover,.theme-light .Button--color--transparent:focus{background-color:#fcfcfc;color:#000}.theme-light .Button--disabled{background-color:#363636!important}.theme-light .Button--selected{transition:color 50ms,background-color 50ms;background-color:#0668b8;color:#fff}.theme-light .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-light .Button--selected:focus{transition:color .1s,background-color .1s}.theme-light .Button--selected:hover,.theme-light .Button--selected:focus{background-color:#1a8be7;color:#fff}.theme-light .Button--flex{display:inline-flex;flex-direction:column}.theme-light .Button--flex--fluid{width:100%}.theme-light .Button--verticalAlignContent--top{justify-content:flex-start}.theme-light .Button--verticalAlignContent--middle{justify-content:center}.theme-light .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-light .Button__content{display:block;align-self:stretch}.theme-light .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#353535;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-light .NumberInput--fluid{display:block}.theme-light .NumberInput__content{margin-left:.5em}.theme-light .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-light .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #353535;background-color:#353535}.theme-light .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#fff;color:#000;text-align:right}.theme-light .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;color:#000;background-color:#fff;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-light .Input--fluid{display:block;width:auto}.theme-light .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-light .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#000;color:inherit}.theme-light .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-light .TextArea{position:relative;display:inline-block;border:.0833333333em solid #353535;border:.0833333333em solid rgba(53,53,53,.75);border-radius:.16em;background-color:#fff;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-light .TextArea--fluid{display:block;width:auto;height:auto}.theme-light .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-light .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-light .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-light .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-light .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15) 0%,rgba(255,255,255,0) 100%);border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-light .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-light .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-light .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-light .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-light .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-light .Knob__ringFillPivot{transform:rotate(135deg)}.theme-light .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-light .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-light .Knob--color--black .Knob__ringFill{stroke:#000}.theme-light .Knob--color--white .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--red .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--orange .Knob__ringFill{stroke:#e6630d}.theme-light .Knob--color--yellow .Knob__ringFill{stroke:#e5c304}.theme-light .Knob--color--olive .Knob__ringFill{stroke:#a3b816}.theme-light .Knob--color--green .Knob__ringFill{stroke:#1d9f3b}.theme-light .Knob--color--teal .Knob__ringFill{stroke:#00a39c}.theme-light .Knob--color--blue .Knob__ringFill{stroke:#1e78bb}.theme-light .Knob--color--violet .Knob__ringFill{stroke:#5a30b5}.theme-light .Knob--color--purple .Knob__ringFill{stroke:#932eb4}.theme-light .Knob--color--pink .Knob__ringFill{stroke:#db228a}.theme-light .Knob--color--brown .Knob__ringFill{stroke:#955d39}.theme-light .Knob--color--grey .Knob__ringFill{stroke:#e6e6e6}.theme-light .Knob--color--good .Knob__ringFill{stroke:#529923}.theme-light .Knob--color--average .Knob__ringFill{stroke:#da810e}.theme-light .Knob--color--bad .Knob__ringFill{stroke:#c82121}.theme-light .Knob--color--label .Knob__ringFill{stroke:#353535}.theme-light .Slider{cursor:e-resize}.theme-light .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-light .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #000}.theme-light .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #000}.theme-light .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-light .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-light .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-light .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-light .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-light .ProgressBar--color--default{border:.0833333333em solid #bfbfbf}.theme-light .ProgressBar--color--default .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-light .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-light .ProgressBar--color--white{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--white .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--red{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--red .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--orange{border:.0833333333em solid #c0530b!important}.theme-light .ProgressBar--color--orange .ProgressBar__fill{background-color:#c0530b}.theme-light .ProgressBar--color--yellow{border:.0833333333em solid #bfa303!important}.theme-light .ProgressBar--color--yellow .ProgressBar__fill{background-color:#bfa303}.theme-light .ProgressBar--color--olive{border:.0833333333em solid #889912!important}.theme-light .ProgressBar--color--olive .ProgressBar__fill{background-color:#889912}.theme-light .ProgressBar--color--green{border:.0833333333em solid #188532!important}.theme-light .ProgressBar--color--green .ProgressBar__fill{background-color:#188532}.theme-light .ProgressBar--color--teal{border:.0833333333em solid #008882!important}.theme-light .ProgressBar--color--teal .ProgressBar__fill{background-color:#008882}.theme-light .ProgressBar--color--blue{border:.0833333333em solid #19649c!important}.theme-light .ProgressBar--color--blue .ProgressBar__fill{background-color:#19649c}.theme-light .ProgressBar--color--violet{border:.0833333333em solid #4b2897!important}.theme-light .ProgressBar--color--violet .ProgressBar__fill{background-color:#4b2897}.theme-light .ProgressBar--color--purple{border:.0833333333em solid #7a2696!important}.theme-light .ProgressBar--color--purple .ProgressBar__fill{background-color:#7a2696}.theme-light .ProgressBar--color--pink{border:.0833333333em solid #b61d73!important}.theme-light .ProgressBar--color--pink .ProgressBar__fill{background-color:#b61d73}.theme-light .ProgressBar--color--brown{border:.0833333333em solid #7c4d2f!important}.theme-light .ProgressBar--color--brown .ProgressBar__fill{background-color:#7c4d2f}.theme-light .ProgressBar--color--grey{border:.0833333333em solid #bfbfbf!important}.theme-light .ProgressBar--color--grey .ProgressBar__fill{background-color:#bfbfbf}.theme-light .ProgressBar--color--good{border:.0833333333em solid #44801d!important}.theme-light .ProgressBar--color--good .ProgressBar__fill{background-color:#44801d}.theme-light .ProgressBar--color--average{border:.0833333333em solid #b56b0b!important}.theme-light .ProgressBar--color--average .ProgressBar__fill{background-color:#b56b0b}.theme-light .ProgressBar--color--bad{border:.0833333333em solid #a61c1c!important}.theme-light .ProgressBar--color--bad .ProgressBar__fill{background-color:#a61c1c}.theme-light .ProgressBar--color--label{border:.0833333333em solid #2c2c2c!important}.theme-light .ProgressBar--color--label .ProgressBar__fill{background-color:#2c2c2c}.theme-light .Chat{color:#000}.theme-light .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-light .Chat__badge:before{content:"x"}.theme-light .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-light .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-light .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-light .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:#fff}.theme-light .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-light .Chat__highlight{color:#000}.theme-light .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-light .ChatMessage{word-wrap:break-word}.theme-light .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-light .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-light .Layout,.theme-light .Layout *{scrollbar-base-color:#f2f2f2;scrollbar-face-color:#d6d6d6;scrollbar-3dlight-color:#eee;scrollbar-highlight-color:#eee;scrollbar-track-color:#f2f2f2;scrollbar-arrow-color:#777;scrollbar-shadow-color:#d6d6d6}.theme-light .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-light .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-light .Layout__content--flexRow{display:flex;flex-flow:row}.theme-light .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-light .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#000;background-color:#eee;background-image:linear-gradient(to bottom,#eee 0%,#eee 100%)}.theme-light .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-light .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-light .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-light .Window__contentPadding:after{height:0}.theme-light .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-light .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(252,252,252,.25);pointer-events:none}.theme-light .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-light .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-light .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-light .TitleBar{background-color:#eee;border-bottom:1px solid rgba(0,0,0,.25);box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-light .TitleBar__clickable{color:rgba(0,0,0,.5);background-color:#eee;transition:color .25s ease-out,background-color .25s ease-out}.theme-light .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-light .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(0,0,0,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-light .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-light .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-light .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-light .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-light .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-light html,.theme-light body{padding:0;margin:0;height:100%;color:#000}.theme-light body{background:#fff;font-family:Verdana,sans-serif;font-size:13px;line-height:1.2;overflow-x:hidden;overflow-y:scroll;word-wrap:break-word}.theme-light img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-light img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-light a{color:#00f}.theme-light a.visited,.theme-light a:visited{color:#f0f}.theme-light a.popt{text-decoration:none}.theme-light .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-light .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-light .popup .close:hover{background:#999}.theme-light .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-light .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-light .popup input[type=text]:hover,.theme-light .popup input[type=text]:active,.theme-light .popup input[type=text]:focus{border-color:green}.theme-light .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-light .popup input[type=submit]:hover,.theme-light .popup input[type=submit]:focus,.theme-light .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-light .changeFont{padding:10px}.theme-light .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-light .changeFont a:hover{background:#ccc}.theme-light .highlightPopup{padding:10px;text-align:center}.theme-light .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-light .highlightPopup input.highlightColor{background-color:#ff0}.theme-light .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-light .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-light .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-light .contextMenu a:hover{background-color:#ccc}.theme-light .filterMessages{padding:5px}.theme-light .filterMessages div{padding:2px 0}.theme-light .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-light .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-light .motd h1,.theme-light .motd h2,.theme-light .motd h3,.theme-light .motd h4,.theme-light .motd h5,.theme-light .motd h6{color:#638500;text-decoration:underline}.theme-light .motd a,.theme-light .motd a:link,.theme-light .motd a:visited,.theme-light .motd a:active,.theme-light .motd a:hover{color:#638500}.theme-light .bold,.theme-light .name,.theme-light .prefix,.theme-light .ooc,.theme-light .looc,.theme-light .adminooc,.theme-light .admin,.theme-light .medal,.theme-light .yell{font-weight:700}.theme-light .italic,.theme-light .italics{font-style:italic}.theme-light .highlight{background:#ff0}.theme-light h1,.theme-light h2,.theme-light h3,.theme-light h4,.theme-light h5,.theme-light h6{color:#00f;font-family:Georgia,Verdana,sans-serif}.theme-light em{font-style:normal;font-weight:700}.theme-light .ooc{color:#002eb8;font-weight:700}.theme-light .ooc .elevated{color:#2e78d9}.theme-light .ooc .moderator{color:#184880}.theme-light .ooc .developer{color:#1b521f}.theme-light .ooc .admin{color:#b82e00}.theme-light .ooc .event_manager{color:#603}.theme-light .ooc .aooc{color:#960018}.theme-light img.text_tag{width:32px;height:10px;min-height:10px}.theme-light img.icon{vertical-align:middle;max-height:1em}.theme-light img.icon.bigicon{max-height:32px}.theme-light .looc{color:#3a9696;font-weight:700}.theme-light .rlooc{color:#3abb96;font-weight:700}.theme-light .adminobserverooc{color:#09c;font-weight:700}.theme-light .adminooc{color:#700038;font-weight:700}.theme-light .adminsay{color:#ff4500;font-weight:700}.theme-light .admin{color:#4473ff;font-weight:700}.theme-light .mentor_channel{color:olive;font-weight:700}.theme-light .mod_channel{color:#735638;font-weight:700}.theme-light .admin_channel{color:#9611d4;font-weight:700}.theme-light .event_channel{color:#c39;font-weight:700}.theme-light .name{font-weight:700}.theme-light .psay,.theme-light .pemote{color:purple;font-style:italic}.theme-light .deadsay{color:#5c00e6}.theme-light .binarysay{color:#20c20e;background-color:#000;display:block}.theme-light .binarysay a{color:#0f0}.theme-light .binarysay a:active,.theme-light .binarysay a:visited{color:#8f8}.theme-light .radio{color:green}.theme-light .sciradio{color:#939}.theme-light .comradio{color:#337296}.theme-light .secradio{color:#a30000}.theme-light .medradio{color:#339661}.theme-light .engradio{color:#948f02}.theme-light .supradio{color:#a8732b}.theme-light .srvradio{color:#6eaa2c}.theme-light .expradio{color:#555}.theme-light .syndradio{color:#6d3f40}.theme-light .gangradio{color:#ac2ea1}.theme-light .centradio{color:#686868}.theme-light .airadio{color:#f0f}.theme-light .redteamradio{color:red!important}.theme-light .blueteamradio{color:#00f!important}.theme-light .greenteamradio{color:#0f0!important}.theme-light .yellowteamradio{color:#d1ba22!important}.theme-light .yell{font-weight:700}.theme-light .alert,.theme-light .valert{color:red}.theme-light h1.alert,.theme-light h2.alert{color:#000}.theme-light .userdanger{color:red;font-weight:700;font-size:185%}.theme-light .bolddanger{color:red;font-weight:700}.theme-light .danger,.theme-light .vdanger{color:red}.theme-light .tinydanger{color:red;font-size:85%}.theme-light .smalldanger{color:red;font-size:90%}.theme-light .warning,.theme-light .vwarning{color:red;font-style:italic}.theme-light .alertwarning{color:red;font-weight:700}.theme-light .boldwarning{color:red;font-style:italic;font-weight:700}.theme-light .announce{color:#228b22;font-weight:700}.theme-light .boldannounce{color:red;font-weight:700}.theme-light .minorannounce{color:red;font-weight:700;font-size:185%}.theme-light .minoralert{color:#000;font-size:125%}.theme-light .priorityannounce{color:#000;font-weight:700;font-size:225%}.theme-light .prioritytitle{color:#00f;font-weight:700;font-size:185%}.theme-light .priorityalert{color:red;font-size:140%}.theme-light .greenannounce{color:#0f0;font-weight:700}.theme-light .rose{color:#ff5050}.theme-light .info{color:#00c}.theme-light .notice,.theme-light .vnotice{color:#009}.theme-light .tinynotice{color:#009;font-size:85%}.theme-light .tinynoticeital{color:#009;font-style:italic;font-size:85%}.theme-light .smallnotice{color:#009;font-size:90%}.theme-light .smallnoticeital{color:#009;font-style:italic;font-size:90%}.theme-light .boldnotice{color:#009;font-weight:700}.theme-light .hear{color:#009;font-style:italic}.theme-light .adminnotice{color:#00f}.theme-light .adminhelp{color:red;font-weight:700}.theme-light .log_message{color:#386aff;font-weight:700}.theme-light .unconscious{color:#00f;font-weight:700}.theme-light .suicide{color:#ff5050;font-style:italic}.theme-light .green{color:#03ff39}.theme-light .grey{color:#838383}.theme-light .red{color:red}.theme-light .crimson{color:#dc143c}.theme-light .maroon{color:maroon}.theme-light .brown{color:#8d4925}.theme-light .blue{color:#00f}.theme-light .black,.theme-light .white{color:#000}.theme-light .darkgray{color:gray}.theme-light .gray{color:#a9a9a9}.theme-light .yellow{color:#fc0}.theme-light .pink{color:pink}.theme-light .cyan{color:#0ff}.theme-light .orange{color:#ff8c00}.theme-light .nicegreen{color:#14a833}.theme-light .boldnicegreen{color:#14a833;font-weight:700}.theme-light .cult{color:#973e3b}.theme-light .cultitalic{color:#973e3b;font-style:italic}.theme-light .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-light .cultboldtalic,.theme-light .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-light .blob{color:#ee4000}.theme-light .blobannounce{color:#323f1c;font-weight:700;font-size:185%}.theme-light .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-light .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-light .colossus{color:#7f282a;font-size:310%}.theme-light .hierophant{color:#609;font-weight:700;font-style:italic}.theme-light .hierophant_warning{color:#609;font-style:italic}.theme-light .purple{color:#5e2d79}.theme-light .lightpurple{color:#ad5aad}.theme-light .darkpink{color:#e3209b}.theme-light .holoparasite{color:#35333a}.theme-light .revennotice{color:#1d2953}.theme-light .revenboldnotice{color:#1d2953;font-weight:700}.theme-light .revenbignotice{color:#1d2953;font-weight:700;font-size:185%}.theme-light .revenminor{color:#823abb}.theme-light .revenwarning{color:#760fbb;font-style:italic}.theme-light .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-light .deconversion_message{color:#5000a0;font-size:185%;font-style:italic}.theme-light .ghostalert{color:#5c00e6;font-style:italic;font-weight:700}.theme-light .alien{color:#543354}.theme-light .noticealien{color:#00c000}.theme-light .alertalien{color:#00c000;font-weight:700}.theme-light .changeling{color:purple;font-style:italic}.theme-light .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-light .spiderbroodmother{color:#4d004d;font-weight:700;font-size:185%}.theme-light .spiderbreacher{color:#804b02;font-weight:700;font-size:140%}.theme-light .spiderscout{color:#0c0674;font-weight:700;font-size:120%}.theme-light .interface{color:#303}.theme-light .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-light .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-light .robot{font-family:Courier New,cursive,sans-serif}.theme-light .tape_recorder{color:maroon;font-family:Courier New,cursive,sans-serif}.theme-light .command_headset{font-weight:700;font-size:160%}.theme-light .small{font-size:60%}.theme-light .big{font-size:185%}.theme-light .reallybig{font-size:245%}.theme-light .extremelybig{font-size:310%}.theme-light .greentext{color:#0f0;font-size:185%}.theme-light .redtext{color:red;font-size:185%}.theme-light .clown{color:#ff69bf;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-light .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-light .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-light .hypnophrase{color:#0d0d0d;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#0d0d0d}25%{color:#410194}50%{color:#7f17d8}75%{color:#410194}to{color:#3bb5d3}}.theme-light .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#0d0d0d}50%{color:#d00}to{color:#0d0d0d}}.theme-light .icon{height:1em;width:auto}.theme-light .bigicon{font-size:2.5em}.theme-light .hugeicon{font-size:5em}.theme-light .memo{color:#638500;text-align:center}.theme-light .memoedit{text-align:center;font-size:125%}.theme-light .abductor{color:purple;font-style:italic}.theme-light .mind_control{color:#a00d6f;font-size:100%;font-weight:700;font-style:italic}.theme-light .slime{color:#00ced1}.theme-light .drone{color:#848482}.theme-light .monkey{color:#975032}.theme-light .swarmer{color:#2c75ff}.theme-light .resonate{color:#298f85}.theme-light .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-light .connectionClosed,.theme-light .fatalError{background:red;color:#fff;padding:5px}.theme-light .connectionClosed.restored{background:green}.theme-light .internal.boldnshit{color:#00f;font-weight:700}.theme-light .text-normal{font-weight:400;font-style:normal}.theme-light .hidden{display:none;visibility:hidden}.theme-light .ml-1{margin-left:1em}.theme-light .ml-2{margin-left:2em}.theme-light .ml-3{margin-left:3em}.theme-light .examine_block{background:#f2f7fa;border:1px solid #111a27;margin:.5em;padding:.5em .75em}.theme-light .tooltip{font-style:italic;border-bottom:1px dashed #000}.theme-light .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-light .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-light .major_announcement_text{color:#131313;background-color:#eaeaea;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-light .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-light .minor_announcement_text{background-color:#eaeaea;color:#202020;padding:.5rem;text-align:left;font-size:100%}.theme-light .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-light .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_default .major_announcement_title,.theme-light .chat_alert_default .minor_announcement_title{color:#003061}.theme-light .chat_alert_default .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_default .minor_announcement_text,.theme-light .chat_alert_default .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdffbd,#bdffbd 10px,#adffad 10px,#adffad 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_green .major_announcement_title,.theme-light .chat_alert_green .minor_announcement_title{color:#005229}.theme-light .chat_alert_green .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_green .minor_announcement_text,.theme-light .chat_alert_green .major_announcement_text{background-color:#d7ffd7}.theme-light .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#bdc8ff,#bdc8ff 10px,#b3bfff 10px,#b3bfff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_blue .major_announcement_title,.theme-light .chat_alert_blue .minor_announcement_title{color:#003061}.theme-light .chat_alert_blue .subheader_announcement_text{color:#6b0020}.theme-light .chat_alert_blue .minor_announcement_text,.theme-light .chat_alert_blue .major_announcement_text{background-color:#d7ddff}.theme-light .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2e5,#ffc2e5 10px,#ffb3df 10px,#ffb3df 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_pink .major_announcement_title,.theme-light .chat_alert_pink .minor_announcement_title{color:#800033}.theme-light .chat_alert_pink .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_pink .minor_announcement_text,.theme-light .chat_alert_pink .major_announcement_text{background-color:#ffdcf0}.theme-light .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fff5c2,#fff5c2 10px,#fff3b3 10px,#fff3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_yellow .major_announcement_title,.theme-light .chat_alert_yellow .minor_announcement_title{color:#754900}.theme-light .chat_alert_yellow .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_yellow .minor_announcement_text,.theme-light .chat_alert_yellow .major_announcement_text{background-color:#fff9dc}.theme-light .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffe8c2,#ffe8c2 10px,#ffe2b3 10px,#ffe2b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_orange .major_announcement_title,.theme-light .chat_alert_orange .minor_announcement_title{color:#823208}.theme-light .chat_alert_orange .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_orange .minor_announcement_text,.theme-light .chat_alert_orange .major_announcement_text{background-color:#fff2dc}.theme-light .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ffc2c2,#ffc2c2 10px,#ffb3b3 10px,#ffb3b3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_red .major_announcement_title,.theme-light .chat_alert_red .minor_announcement_title{color:#800029}.theme-light .chat_alert_red .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_red .minor_announcement_text,.theme-light .chat_alert_red .major_announcement_text{background-color:#ffdcdc}.theme-light .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#fbd1ff,#fbd1ff 10px,#fac2ff 10px,#fac2ff 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_purple .major_announcement_title,.theme-light .chat_alert_purple .minor_announcement_title{color:#450d8c}.theme-light .chat_alert_purple .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_purple .minor_announcement_text,.theme-light .chat_alert_purple .major_announcement_text{background-color:#fdebff}.theme-light .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#ebebeb,#ebebeb 10px,#e3e3e3 10px,#e3e3e3 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-light .chat_alert_grey .major_announcement_title,.theme-light .chat_alert_grey .minor_announcement_title{color:#800033}.theme-light .chat_alert_grey .subheader_announcement_text{color:#002c85}.theme-light .chat_alert_grey .minor_announcement_text,.theme-light .chat_alert_grey .major_announcement_text{background-color:#f8f8f8}.theme-light .tajaran{color:#803b56}.theme-light .tajaran_signlang{color:#941c1c}.theme-light .akhani{color:#ac398c}.theme-light .skrell{color:#00b0b3}.theme-light .skrellfar{color:#70fcff}.theme-light .soghun{color:#50ba6c}.theme-light .solcom{color:#3333ce}.theme-light .sergal{color:#07f}.theme-light .birdsongc{color:#c90}.theme-light .vulpkanin{color:#b97a57}.theme-light .tavan{color:#f54298;font-family:Arial}.theme-light .echosong{color:#826d8c}.theme-light .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-light .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-light .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-light .bug{color:#9e9e39}.theme-light .vox{color:#a0a}.theme-light .promethean{color:#5a5a5a;font-family:Comic Sans MS,Comic Sans,cursive}.theme-light .zaddat{color:#941c1c}.theme-light .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-light .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-light .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-light .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-light .spacer{color:#9c660b}.theme-light .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-light .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif}.theme-vchatdark .color-black{color:#1a1a1a!important}.theme-vchatdark .color-white{color:#fff!important}.theme-vchatdark .color-red{color:#df3e3e!important}.theme-vchatdark .color-orange{color:#f37f33!important}.theme-vchatdark .color-yellow{color:#fbda21!important}.theme-vchatdark .color-olive{color:#cbe41c!important}.theme-vchatdark .color-green{color:#25ca4c!important}.theme-vchatdark .color-teal{color:#00d6cc!important}.theme-vchatdark .color-blue{color:#2e93de!important}.theme-vchatdark .color-violet{color:#7349cf!important}.theme-vchatdark .color-purple{color:#ad45d0!important}.theme-vchatdark .color-pink{color:#e34da1!important}.theme-vchatdark .color-brown{color:#b97447!important}.theme-vchatdark .color-grey{color:#848484!important}.theme-vchatdark .color-good{color:#68c22d!important}.theme-vchatdark .color-average{color:#f29a29!important}.theme-vchatdark .color-bad{color:#df3e3e!important}.theme-vchatdark .color-label{color:#8b9bb0!important}.theme-vchatdark .color-bg-black{background-color:#000!important}.theme-vchatdark .color-bg-white{background-color:#d9d9d9!important}.theme-vchatdark .color-bg-red{background-color:#bd2020!important}.theme-vchatdark .color-bg-orange{background-color:#d95e0c!important}.theme-vchatdark .color-bg-yellow{background-color:#d9b804!important}.theme-vchatdark .color-bg-olive{background-color:#9aad14!important}.theme-vchatdark .color-bg-green{background-color:#1b9638!important}.theme-vchatdark .color-bg-teal{background-color:#009a93!important}.theme-vchatdark .color-bg-blue{background-color:#1c71b1!important}.theme-vchatdark .color-bg-violet{background-color:#552dab!important}.theme-vchatdark .color-bg-purple{background-color:#8b2baa!important}.theme-vchatdark .color-bg-pink{background-color:#cf2082!important}.theme-vchatdark .color-bg-brown{background-color:#8c5836!important}.theme-vchatdark .color-bg-grey{background-color:#646464!important}.theme-vchatdark .color-bg-good{background-color:#4d9121!important}.theme-vchatdark .color-bg-average{background-color:#cd7a0d!important}.theme-vchatdark .color-bg-bad{background-color:#bd2020!important}.theme-vchatdark .color-bg-label{background-color:#657a94!important}.theme-vchatdark .Tabs{display:flex;align-items:stretch;overflow:hidden;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Tabs--fill{height:100%}.theme-vchatdark .Section .Tabs{background-color:rgba(0,0,0,0)}.theme-vchatdark .Section:not(.Section--fitted) .Tabs{margin:0 -.5em .5em}.theme-vchatdark .Section:not(.Section--fitted) .Tabs:first-child{margin-top:-.5em}.theme-vchatdark .Tabs--vertical{flex-direction:column;padding:.25em 0 .25em .25em}.theme-vchatdark .Tabs--horizontal{margin-bottom:.5em;padding:.25em .25em 0}.theme-vchatdark .Tabs--horizontal:last-child{margin-bottom:0}.theme-vchatdark .Tabs__Tab{flex-grow:0}.theme-vchatdark .Tabs--fluid .Tabs__Tab{flex-grow:1}.theme-vchatdark .Tab{display:flex;align-items:center;justify-content:space-between;background-color:rgba(0,0,0,0);color:rgba(255,255,255,.5);min-height:2.25em;min-width:4em;transition:background-color 50ms ease-out}.theme-vchatdark .Tab:not(.Tab--selected):hover{background-color:rgba(255,255,255,.075);transition:background-color 0}.theme-vchatdark .Tab--selected{background-color:rgba(255,255,255,.125);color:#dfe7f0}.theme-vchatdark .Tab__text{flex-grow:1;margin:0 .5em}.theme-vchatdark .Tab__left{min-width:1.5em;text-align:center;margin-left:.25em}.theme-vchatdark .Tab__right{min-width:1.5em;text-align:center;margin-right:.25em}.theme-vchatdark .Tabs--horizontal .Tab{border-top:.1666666667em solid rgba(0,0,0,0);border-bottom:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-top-right-radius:.25em}.theme-vchatdark .Tabs--horizontal .Tab--selected{border-bottom:.1666666667em solid #d4dfec}.theme-vchatdark .Tabs--vertical .Tab{min-height:2em;border-left:.1666666667em solid rgba(0,0,0,0);border-right:.1666666667em solid rgba(0,0,0,0);border-top-left-radius:.25em;border-bottom-left-radius:.25em}.theme-vchatdark .Tabs--vertical .Tab--selected{border-right:.1666666667em solid #d4dfec}.theme-vchatdark .Tab--selected.Tab--color--black{color:#535353}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--black{border-bottom-color:#1a1a1a}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--black{border-right-color:#1a1a1a}.theme-vchatdark .Tab--selected.Tab--color--white{color:#fff}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--white{border-bottom-color:#fff}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--white{border-right-color:#fff}.theme-vchatdark .Tab--selected.Tab--color--red{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--red{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--red{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--orange{color:#f69f66}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--orange{border-bottom-color:#f37f33}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--orange{border-right-color:#f37f33}.theme-vchatdark .Tab--selected.Tab--color--yellow{color:#fce358}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--yellow{border-bottom-color:#fbda21}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--yellow{border-right-color:#fbda21}.theme-vchatdark .Tab--selected.Tab--color--olive{color:#d8eb55}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--olive{border-bottom-color:#cbe41c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--olive{border-right-color:#cbe41c}.theme-vchatdark .Tab--selected.Tab--color--green{color:#53e074}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--green{border-bottom-color:#25ca4c}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--green{border-right-color:#25ca4c}.theme-vchatdark .Tab--selected.Tab--color--teal{color:#21fff5}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--teal{border-bottom-color:#00d6cc}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--teal{border-right-color:#00d6cc}.theme-vchatdark .Tab--selected.Tab--color--blue{color:#62aee6}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--blue{border-bottom-color:#2e93de}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--blue{border-right-color:#2e93de}.theme-vchatdark .Tab--selected.Tab--color--violet{color:#9676db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--violet{border-bottom-color:#7349cf}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--violet{border-right-color:#7349cf}.theme-vchatdark .Tab--selected.Tab--color--purple{color:#c274db}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--purple{border-bottom-color:#ad45d0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--purple{border-right-color:#ad45d0}.theme-vchatdark .Tab--selected.Tab--color--pink{color:#ea79b9}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--pink{border-bottom-color:#e34da1}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--pink{border-right-color:#e34da1}.theme-vchatdark .Tab--selected.Tab--color--brown{color:#ca9775}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--brown{border-bottom-color:#b97447}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--brown{border-right-color:#b97447}.theme-vchatdark .Tab--selected.Tab--color--grey{color:#a3a3a3}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--grey{border-bottom-color:#848484}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--grey{border-right-color:#848484}.theme-vchatdark .Tab--selected.Tab--color--good{color:#8cd95a}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--good{border-bottom-color:#68c22d}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--good{border-right-color:#68c22d}.theme-vchatdark .Tab--selected.Tab--color--average{color:#f5b35e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--average{border-bottom-color:#f29a29}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--average{border-right-color:#f29a29}.theme-vchatdark .Tab--selected.Tab--color--bad{color:#e76e6e}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--bad{border-bottom-color:#df3e3e}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--bad{border-right-color:#df3e3e}.theme-vchatdark .Tab--selected.Tab--color--label{color:#a8b4c4}.theme-vchatdark .Tabs--horizontal .Tab--selected.Tab--color--label{border-bottom-color:#8b9bb0}.theme-vchatdark .Tabs--vertical .Tab--selected.Tab--color--label{border-right-color:#8b9bb0}.theme-vchatdark .Section{position:relative;margin-bottom:.5em;background-color:#191919;background-color:rgba(0,0,0,.33);box-sizing:border-box}.theme-vchatdark .Section:last-child{margin-bottom:0}.theme-vchatdark .Section__title{position:relative;padding:.5em;border-bottom:.1666666667em solid #4972a1}.theme-vchatdark .Section__titleText{font-size:1.1666666667em;font-weight:700;color:#fff}.theme-vchatdark .Section__buttons{position:absolute;display:inline-block;right:.5em;margin-top:-.0833333333em}.theme-vchatdark .Section__rest{position:relative}.theme-vchatdark .Section__content{padding:.66em .5em}.theme-vchatdark .Section--fitted>.Section__rest>.Section__content{padding:0}.theme-vchatdark .Section--fill{display:flex;flex-direction:column;height:100%}.theme-vchatdark .Section--fill>.Section__rest{flex-grow:1}.theme-vchatdark .Section--fill>.Section__rest>.Section__content{height:100%}.theme-vchatdark .Section--fill.Section--scrollable>.Section__rest>.Section__content{position:absolute;top:0;left:0;right:0;bottom:0}.theme-vchatdark .Section--fill.Section--iefix{display:table!important;width:100%!important;height:100%!important;border-collapse:collapse;border-spacing:0}.theme-vchatdark .Section--fill.Section--iefix>.Section__rest{display:table-row!important;height:100%!important}.theme-vchatdark .Section--scrollable{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:hidden}.theme-vchatdark .Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:hidden;overflow-x:scroll}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal{overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Section--scrollable.Section--scrollableHorizontal>.Section__rest>.Section__content{overflow-y:scroll;overflow-x:scroll}.theme-vchatdark .Section .Section{background-color:rgba(0,0,0,0);margin-left:-.5em;margin-right:-.5em}.theme-vchatdark .Section .Section:first-child{margin-top:-.5em}.theme-vchatdark .Section .Section .Section__titleText{font-size:1.0833333333em}.theme-vchatdark .Section .Section .Section .Section__titleText{font-size:1em}.theme-vchatdark .Section--flex{display:flex;flex-flow:column}.theme-vchatdark .Section--flex .Section__content{overflow:auto;flex-grow:1}.theme-vchatdark .Section__content--noTopPadding{padding-top:0}.theme-vchatdark .Section__content--stretchContents{height:calc(100% - 3rem)}.theme-vchatdark .Button{position:relative;display:inline-block;line-height:1.667em;padding:0 .5em;margin-right:.1666666667em;white-space:nowrap;outline:0;border-radius:.16em;margin-bottom:.1666666667em;user-select:none;-ms-user-select:none}.theme-vchatdark .Button:last-child{margin-right:0;margin-bottom:0}.theme-vchatdark .Button .fa,.theme-vchatdark .Button .fas,.theme-vchatdark .Button .far{margin-left:-.25em;margin-right:-.25em;min-width:1.333em;text-align:center}.theme-vchatdark .Button--hasContent .fa,.theme-vchatdark .Button--hasContent .fas,.theme-vchatdark .Button--hasContent .far{margin-right:.25em}.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fa,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .fas,.theme-vchatdark .Button--hasContent.Button--iconPosition--right .far{margin-right:0;margin-left:3px}.theme-vchatdark .Button--ellipsis{overflow:hidden;text-overflow:ellipsis}.theme-vchatdark .Button--fluid{display:block;margin-left:0;margin-right:0}.theme-vchatdark .Button--circular{border-radius:50%}.theme-vchatdark .Button--compact{padding:0 .25em;line-height:1.333em}.theme-vchatdark .Button--color--black{transition:color 50ms,background-color 50ms;background-color:#000;color:#fff}.theme-vchatdark .Button--color--black:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--black:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--black:hover,.theme-vchatdark .Button--color--black:focus{background-color:#131313;color:#fff}.theme-vchatdark .Button--color--white{transition:color 50ms,background-color 50ms;background-color:#d9d9d9;color:#000}.theme-vchatdark .Button--color--white:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--white:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--white:hover,.theme-vchatdark .Button--color--white:focus{background-color:#f8f8f8;color:#000}.theme-vchatdark .Button--color--red{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--red:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--red:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--red:hover,.theme-vchatdark .Button--color--red:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--orange{transition:color 50ms,background-color 50ms;background-color:#d95e0c;color:#fff}.theme-vchatdark .Button--color--orange:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--orange:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--orange:hover,.theme-vchatdark .Button--color--orange:focus{background-color:#f0853f;color:#fff}.theme-vchatdark .Button--color--yellow{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--yellow:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--yellow:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--yellow:hover,.theme-vchatdark .Button--color--yellow:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--olive{transition:color 50ms,background-color 50ms;background-color:#9aad14;color:#fff}.theme-vchatdark .Button--color--olive:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--olive:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--olive:hover,.theme-vchatdark .Button--color--olive:focus{background-color:#c4da2b;color:#fff}.theme-vchatdark .Button--color--green{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--color--green:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--green:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--green:hover,.theme-vchatdark .Button--color--green:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--color--teal{transition:color 50ms,background-color 50ms;background-color:#009a93;color:#fff}.theme-vchatdark .Button--color--teal:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--teal:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--teal:hover,.theme-vchatdark .Button--color--teal:focus{background-color:#13c4bc;color:#fff}.theme-vchatdark .Button--color--blue{transition:color 50ms,background-color 50ms;background-color:#1c71b1;color:#fff}.theme-vchatdark .Button--color--blue:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--blue:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--blue:hover,.theme-vchatdark .Button--color--blue:focus{background-color:#3a95d9;color:#fff}.theme-vchatdark .Button--color--violet{transition:color 50ms,background-color 50ms;background-color:#552dab;color:#fff}.theme-vchatdark .Button--color--violet:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--violet:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--violet:hover,.theme-vchatdark .Button--color--violet:focus{background-color:#7953cc;color:#fff}.theme-vchatdark .Button--color--purple{transition:color 50ms,background-color 50ms;background-color:#8b2baa;color:#fff}.theme-vchatdark .Button--color--purple:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--purple:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--purple:hover,.theme-vchatdark .Button--color--purple:focus{background-color:#ad4fcd;color:#fff}.theme-vchatdark .Button--color--pink{transition:color 50ms,background-color 50ms;background-color:#cf2082;color:#fff}.theme-vchatdark .Button--color--pink:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--pink:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--pink:hover,.theme-vchatdark .Button--color--pink:focus{background-color:#e257a5;color:#fff}.theme-vchatdark .Button--color--brown{transition:color 50ms,background-color 50ms;background-color:#8c5836;color:#fff}.theme-vchatdark .Button--color--brown:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--brown:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--brown:hover,.theme-vchatdark .Button--color--brown:focus{background-color:#b47851;color:#fff}.theme-vchatdark .Button--color--grey{transition:color 50ms,background-color 50ms;background-color:#646464;color:#fff}.theme-vchatdark .Button--color--grey:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--grey:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--grey:hover,.theme-vchatdark .Button--color--grey:focus{background-color:#868686;color:#fff}.theme-vchatdark .Button--color--good{transition:color 50ms,background-color 50ms;background-color:#4d9121;color:#fff}.theme-vchatdark .Button--color--good:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--good:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--good:hover,.theme-vchatdark .Button--color--good:focus{background-color:#6cba39;color:#fff}.theme-vchatdark .Button--color--average{transition:color 50ms,background-color 50ms;background-color:#cd7a0d;color:#fff}.theme-vchatdark .Button--color--average:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--average:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--average:hover,.theme-vchatdark .Button--color--average:focus{background-color:#ed9d35;color:#fff}.theme-vchatdark .Button--color--bad{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--bad:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--bad:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--bad:hover,.theme-vchatdark .Button--color--bad:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--label{transition:color 50ms,background-color 50ms;background-color:#657a94;color:#fff}.theme-vchatdark .Button--color--label:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--label:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--label:hover,.theme-vchatdark .Button--color--label:focus{background-color:#91a1b3;color:#fff}.theme-vchatdark .Button--color--default{transition:color 50ms,background-color 50ms;background-color:#3e6189;color:#fff}.theme-vchatdark .Button--color--default:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--default:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--default:hover,.theme-vchatdark .Button--color--default:focus{background-color:#5c83b0;color:#fff}.theme-vchatdark .Button--color--caution{transition:color 50ms,background-color 50ms;background-color:#d9b804;color:#000}.theme-vchatdark .Button--color--caution:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--caution:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--caution:hover,.theme-vchatdark .Button--color--caution:focus{background-color:#f5d72e;color:#000}.theme-vchatdark .Button--color--danger{transition:color 50ms,background-color 50ms;background-color:#bd2020;color:#fff}.theme-vchatdark .Button--color--danger:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--danger:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--danger:hover,.theme-vchatdark .Button--color--danger:focus{background-color:#dc4848;color:#fff}.theme-vchatdark .Button--color--transparent{transition:color 50ms,background-color 50ms;background-color:#252525;color:#fff;background-color:rgba(37,37,37,0);color:rgba(255,255,255,.5)}.theme-vchatdark .Button--color--transparent:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--color--transparent:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--color--transparent:hover,.theme-vchatdark .Button--color--transparent:focus{background-color:#3e3e3e;color:#fff}.theme-vchatdark .Button--disabled{background-color:#999!important}.theme-vchatdark .Button--selected{transition:color 50ms,background-color 50ms;background-color:#1b9638;color:#fff}.theme-vchatdark .Button--selected:hover{transition:color 0ms,background-color 0ms}.theme-vchatdark .Button--selected:focus{transition:color .1s,background-color .1s}.theme-vchatdark .Button--selected:hover,.theme-vchatdark .Button--selected:focus{background-color:#32c154;color:#fff}.theme-vchatdark .Button--flex{display:inline-flex;flex-direction:column}.theme-vchatdark .Button--flex--fluid{width:100%}.theme-vchatdark .Button--verticalAlignContent--top{justify-content:flex-start}.theme-vchatdark .Button--verticalAlignContent--middle{justify-content:center}.theme-vchatdark .Button--verticalAlignContent--bottom{justify-content:flex-end}.theme-vchatdark .Button__content{display:block;align-self:stretch}.theme-vchatdark .NumberInput{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#88bfff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;text-align:right;overflow:visible;cursor:n-resize}.theme-vchatdark .NumberInput--fluid{display:block}.theme-vchatdark .NumberInput__content{margin-left:.5em}.theme-vchatdark .NumberInput__barContainer{position:absolute;top:.1666666667em;bottom:.1666666667em;left:.1666666667em}.theme-vchatdark .NumberInput__bar{position:absolute;bottom:0;left:0;width:.25em;box-sizing:border-box;border-bottom:.0833333333em solid #88bfff;background-color:#88bfff}.theme-vchatdark .NumberInput__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:#0a0a0a;color:#fff;text-align:right}.theme-vchatdark .Input{position:relative;display:inline-block;width:10em;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;color:#fff;background-color:#0a0a0a;padding:0 .3333333333em;margin-right:.1666666667em;line-height:1.4166666667em;overflow:visible}.theme-vchatdark .Input--fluid{display:block;width:auto}.theme-vchatdark .Input__baseline{display:inline-block;color:rgba(0,0,0,0)}.theme-vchatdark .Input__input{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;font-size:1em;line-height:1.4166666667em;height:1.4166666667em;margin:0;padding:0 .5em;font-family:Verdana,sans-serif;background-color:rgba(0,0,0,0);color:#fff;color:inherit}.theme-vchatdark .Input__input:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .Input--monospace .Input__input{font-family:Consolas,monospace}.theme-vchatdark .TextArea{position:relative;display:inline-block;border:.0833333333em solid #88bfff;border:.0833333333em solid rgba(136,191,255,.75);border-radius:.16em;background-color:#0a0a0a;margin-right:.1666666667em;line-height:1.4166666667em;box-sizing:border-box;width:100%}.theme-vchatdark .TextArea--fluid{display:block;width:auto;height:auto}.theme-vchatdark .TextArea__textarea{display:block;position:absolute;top:0;bottom:0;left:0;right:0;border:0;outline:0;width:100%;height:100%;font-size:1em;line-height:1.4166666667em;min-height:1.4166666667em;margin:0;padding:0 .5em;font-family:inherit;background-color:rgba(0,0,0,0);color:inherit;box-sizing:border-box;word-wrap:break-word;overflow:hidden}.theme-vchatdark .TextArea__textarea:-ms-input-placeholder{font-style:italic;color:#777;color:rgba(255,255,255,.45)}.theme-vchatdark .Knob{position:relative;font-size:1rem;width:2.6em;height:2.6em;margin:0 auto -.2em;cursor:n-resize}.theme-vchatdark .Knob:after{content:".";color:rgba(0,0,0,0);line-height:2.5em}.theme-vchatdark .Knob__circle{position:absolute;top:.1em;bottom:.1em;left:.1em;right:.1em;margin:.3em;background-color:#333;background-image:linear-gradient(to bottom,rgba(255,255,255,.15) 0%,rgba(255,255,255,0) 100%);border-radius:50%;box-shadow:0 .05em .5em rgba(0,0,0,.5)}.theme-vchatdark .Knob__cursorBox{position:absolute;top:0;bottom:0;left:0;right:0}.theme-vchatdark .Knob__cursor{position:relative;top:.05em;margin:0 auto;width:.2em;height:.8em;background-color:rgba(255,255,255,.9)}.theme-vchatdark .Knob__popupValue{position:absolute;top:-2rem;right:50%;font-size:1rem;text-align:center;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .Knob__ring{position:absolute;top:0;bottom:0;left:0;right:0;padding:.1em}.theme-vchatdark .Knob__ringTrackPivot{transform:rotate(135deg)}.theme-vchatdark .Knob__ringTrack{fill:rgba(0,0,0,0);stroke:rgba(255,255,255,.1);stroke-width:8;stroke-linecap:round;stroke-dasharray:235.62}.theme-vchatdark .Knob__ringFillPivot{transform:rotate(135deg)}.theme-vchatdark .Knob--bipolar .Knob__ringFillPivot{transform:rotate(270deg)}.theme-vchatdark .Knob__ringFill{fill:rgba(0,0,0,0);stroke:#6a96c9;stroke-width:8;stroke-linecap:round;stroke-dasharray:314.16;transition:stroke 50ms ease-out}.theme-vchatdark .Knob--color--black .Knob__ringFill{stroke:#1a1a1a}.theme-vchatdark .Knob--color--white .Knob__ringFill{stroke:#fff}.theme-vchatdark .Knob--color--red .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--orange .Knob__ringFill{stroke:#f37f33}.theme-vchatdark .Knob--color--yellow .Knob__ringFill{stroke:#fbda21}.theme-vchatdark .Knob--color--olive .Knob__ringFill{stroke:#cbe41c}.theme-vchatdark .Knob--color--green .Knob__ringFill{stroke:#25ca4c}.theme-vchatdark .Knob--color--teal .Knob__ringFill{stroke:#00d6cc}.theme-vchatdark .Knob--color--blue .Knob__ringFill{stroke:#2e93de}.theme-vchatdark .Knob--color--violet .Knob__ringFill{stroke:#7349cf}.theme-vchatdark .Knob--color--purple .Knob__ringFill{stroke:#ad45d0}.theme-vchatdark .Knob--color--pink .Knob__ringFill{stroke:#e34da1}.theme-vchatdark .Knob--color--brown .Knob__ringFill{stroke:#b97447}.theme-vchatdark .Knob--color--grey .Knob__ringFill{stroke:#848484}.theme-vchatdark .Knob--color--good .Knob__ringFill{stroke:#68c22d}.theme-vchatdark .Knob--color--average .Knob__ringFill{stroke:#f29a29}.theme-vchatdark .Knob--color--bad .Knob__ringFill{stroke:#df3e3e}.theme-vchatdark .Knob--color--label .Knob__ringFill{stroke:#8b9bb0}.theme-vchatdark .Slider{cursor:e-resize}.theme-vchatdark .Slider__cursorOffset{position:absolute;top:0;left:0;bottom:0;transition:none!important}.theme-vchatdark .Slider__cursor{position:absolute;top:0;right:-.0833333333em;bottom:0;width:0;border-left:.1666666667em solid #fff}.theme-vchatdark .Slider__pointer{position:absolute;right:-.4166666667em;bottom:-.3333333333em;width:0;height:0;border-left:.4166666667em solid rgba(0,0,0,0);border-right:.4166666667em solid rgba(0,0,0,0);border-bottom:.4166666667em solid #fff}.theme-vchatdark .Slider__popupValue{position:absolute;right:0;top:-2rem;font-size:1rem;padding:.25rem .5rem;color:#fff;background-color:#000;transform:translate(50%);white-space:nowrap}.theme-vchatdark .ProgressBar{display:inline-block;position:relative;width:100%;padding:0 .5em;border-radius:.16em;background-color:rgba(0,0,0,0);transition:border-color .9s ease-out}.theme-vchatdark .ProgressBar__fill{position:absolute;top:-.5px;left:0;bottom:-.5px}.theme-vchatdark .ProgressBar__fill--animated{transition:background-color .9s ease-out,width .9s ease-out}.theme-vchatdark .ProgressBar__content{position:relative;line-height:1.4166666667em;width:100%;text-align:right}.theme-vchatdark .ProgressBar--color--default{border:.0833333333em solid #3e6189}.theme-vchatdark .ProgressBar--color--default .ProgressBar__fill{background-color:#3e6189}.theme-vchatdark .ProgressBar--color--black{border:.0833333333em solid #000!important}.theme-vchatdark .ProgressBar--color--black .ProgressBar__fill{background-color:#000}.theme-vchatdark .ProgressBar--color--white{border:.0833333333em solid #d9d9d9!important}.theme-vchatdark .ProgressBar--color--white .ProgressBar__fill{background-color:#d9d9d9}.theme-vchatdark .ProgressBar--color--red{border:.0833333333em solid #bd2020!important}.theme-vchatdark .ProgressBar--color--red .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--orange{border:.0833333333em solid #d95e0c!important}.theme-vchatdark .ProgressBar--color--orange .ProgressBar__fill{background-color:#d95e0c}.theme-vchatdark .ProgressBar--color--yellow{border:.0833333333em solid #d9b804!important}.theme-vchatdark .ProgressBar--color--yellow .ProgressBar__fill{background-color:#d9b804}.theme-vchatdark .ProgressBar--color--olive{border:.0833333333em solid #9aad14!important}.theme-vchatdark .ProgressBar--color--olive .ProgressBar__fill{background-color:#9aad14}.theme-vchatdark .ProgressBar--color--green{border:.0833333333em solid #1b9638!important}.theme-vchatdark .ProgressBar--color--green .ProgressBar__fill{background-color:#1b9638}.theme-vchatdark .ProgressBar--color--teal{border:.0833333333em solid #009a93!important}.theme-vchatdark .ProgressBar--color--teal .ProgressBar__fill{background-color:#009a93}.theme-vchatdark .ProgressBar--color--blue{border:.0833333333em solid #1c71b1!important}.theme-vchatdark .ProgressBar--color--blue .ProgressBar__fill{background-color:#1c71b1}.theme-vchatdark .ProgressBar--color--violet{border:.0833333333em solid #552dab!important}.theme-vchatdark .ProgressBar--color--violet .ProgressBar__fill{background-color:#552dab}.theme-vchatdark .ProgressBar--color--purple{border:.0833333333em solid #8b2baa!important}.theme-vchatdark .ProgressBar--color--purple .ProgressBar__fill{background-color:#8b2baa}.theme-vchatdark .ProgressBar--color--pink{border:.0833333333em solid #cf2082!important}.theme-vchatdark .ProgressBar--color--pink .ProgressBar__fill{background-color:#cf2082}.theme-vchatdark .ProgressBar--color--brown{border:.0833333333em solid #8c5836!important}.theme-vchatdark .ProgressBar--color--brown .ProgressBar__fill{background-color:#8c5836}.theme-vchatdark .ProgressBar--color--grey{border:.0833333333em solid #646464!important}.theme-vchatdark .ProgressBar--color--grey .ProgressBar__fill{background-color:#646464}.theme-vchatdark .ProgressBar--color--good{border:.0833333333em solid #4d9121!important}.theme-vchatdark .ProgressBar--color--good .ProgressBar__fill{background-color:#4d9121}.theme-vchatdark .ProgressBar--color--average{border:.0833333333em solid #cd7a0d!important}.theme-vchatdark .ProgressBar--color--average .ProgressBar__fill{background-color:#cd7a0d}.theme-vchatdark .ProgressBar--color--bad{border:.0833333333em solid #bd2020!important}.theme-vchatdark .ProgressBar--color--bad .ProgressBar__fill{background-color:#bd2020}.theme-vchatdark .ProgressBar--color--label{border:.0833333333em solid #657a94!important}.theme-vchatdark .ProgressBar--color--label .ProgressBar__fill{background-color:#657a94}.theme-vchatdark .Chat{color:#abc6ec}.theme-vchatdark .Chat__badge{display:inline-block;min-width:.5em;font-size:.7em;padding:.2em .3em;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#dc143c;border-radius:10px;transition:font-size .2s ease-out}.theme-vchatdark .Chat__badge:before{content:"x"}.theme-vchatdark .Chat__badge--animate{font-size:.9em;transition:font-size 0ms}.theme-vchatdark .Chat__scrollButton{position:fixed;right:2em;bottom:1em}.theme-vchatdark .Chat__reconnected{font-size:.85em;text-align:center;margin:1em 0 2em}.theme-vchatdark .Chat__reconnected:before{content:"Reconnected";display:inline-block;border-radius:1em;padding:0 .7em;color:#db2828;background-color:rgba(0,0,0,.33)}.theme-vchatdark .Chat__reconnected:after{content:"";display:block;margin-top:-.75em;border-bottom:.1666666667em solid #db2828}.theme-vchatdark .Chat__highlight{color:#000}.theme-vchatdark .Chat__highlight--restricted{color:#fff;background-color:#a00;font-weight:700}.theme-vchatdark .ChatMessage{word-wrap:break-word}.theme-vchatdark .ChatMessage--highlighted{position:relative;border-left:.1666666667em solid #fd4;padding-left:.5em}.theme-vchatdark .ChatMessage--highlighted:after{content:"";position:absolute;top:0;bottom:0;left:0;right:0;background-color:rgba(255,221,68,.1);pointer-events:none}.theme-vchatdark .Layout,.theme-vchatdark .Layout *{scrollbar-base-color:#1c1c1c;scrollbar-face-color:#3b3b3b;scrollbar-3dlight-color:#252525;scrollbar-highlight-color:#252525;scrollbar-track-color:#1c1c1c;scrollbar-arrow-color:#929292;scrollbar-shadow-color:#3b3b3b}.theme-vchatdark .Layout__content{position:absolute;top:0;bottom:0;left:0;right:0;overflow-x:hidden;overflow-y:hidden}.theme-vchatdark .Layout__content--scrollable{overflow-y:scroll;margin-bottom:0}.theme-vchatdark .Layout__content--flexRow{display:flex;flex-flow:row}.theme-vchatdark .Layout__content--flexColumn{display:flex;flex-flow:column}.theme-vchatdark .Window{position:fixed;top:0;bottom:0;left:0;right:0;color:#fff;background-color:#252525;background-image:linear-gradient(to bottom,#2a2a2a 0%,#202020 100%)}.theme-vchatdark .Window__titleBar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;height:2.6666666667rem}.theme-vchatdark .Window__rest{position:fixed;top:32px;top:2.6666666667rem;bottom:0;left:0;right:0}.theme-vchatdark .Window__contentPadding{margin:.5rem;height:100%;height:calc(100% - 1.01rem)}.theme-vchatdark .Window__contentPadding:after{height:0}.theme-vchatdark .Layout__content--scrollable .Window__contentPadding:after{display:block;content:"";height:.5rem}.theme-vchatdark .Window__dimmer{position:fixed;top:0;bottom:0;left:0;right:0;background-color:rgba(62,62,62,.25);pointer-events:none}.theme-vchatdark .Window__resizeHandle__se{position:fixed;bottom:0;right:0;width:20px;width:1.6666666667rem;height:20px;height:1.6666666667rem;cursor:se-resize}.theme-vchatdark .Window__resizeHandle__s{position:fixed;bottom:0;left:0;right:0;height:6px;height:.5rem;cursor:s-resize}.theme-vchatdark .Window__resizeHandle__e{position:fixed;top:0;bottom:0;right:0;width:3px;width:.25rem;cursor:e-resize}.theme-vchatdark .TitleBar{background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 2px 2px rgba(0,0,0,.1);box-shadow:0 .1666666667rem .1666666667rem rgba(0,0,0,.1);user-select:none;-ms-user-select:none}.theme-vchatdark .TitleBar__clickable{color:rgba(255,255,255,.5);background-color:#363636;transition:color .25s ease-out,background-color .25s ease-out}.theme-vchatdark .TitleBar__clickable:hover{color:#fff;background-color:#c00;transition:color 0ms,background-color 0ms}.theme-vchatdark .TitleBar__title{position:absolute;display:inline-block;top:0;left:46px;left:3.8333333333rem;color:rgba(255,255,255,.75);font-size:14px;font-size:1.1666666667rem;line-height:31px;line-height:2.5833333333rem;white-space:nowrap;pointer-events:none}.theme-vchatdark .TitleBar__buttons{pointer-events:initial;display:inline-block;width:100%;margin-left:10px}.theme-vchatdark .TitleBar__dragZone{position:absolute;top:0;left:0;right:0;height:32px;height:2.6666666667rem}.theme-vchatdark .TitleBar__statusIcon{position:absolute;top:0;left:12px;left:1rem;transition:color .5s;font-size:20px;font-size:1.6666666667rem;line-height:32px!important;line-height:2.6666666667rem!important}.theme-vchatdark .TitleBar__close{position:absolute;top:-1px;right:0;width:45px;width:3.75rem;height:32px;height:2.6666666667rem;font-size:20px;font-size:1.6666666667rem;line-height:31px;line-height:2.5833333333rem;text-align:center}.theme-vchatdark .TitleBar__devBuildIndicator{position:absolute;top:6px;top:.5rem;right:52px;right:4.3333333333rem;min-width:20px;min-width:1.6666666667rem;padding:2px 4px;padding:.1666666667rem .3333333333rem;background-color:rgba(91,170,39,.75);color:#fff;text-align:center}.theme-vchatdark img{margin:0;padding:0;line-height:1;-ms-interpolation-mode:nearest-neighbor;image-rendering:pixelated}.theme-vchatdark img.icon{height:1em;min-height:16px;width:auto;vertical-align:bottom}.theme-vchatdark a{color:#397ea5}.theme-vchatdark a.visited,.theme-vchatdark a:visited{color:#7c00e6}.theme-vchatdark a.popt{text-decoration:none}.theme-vchatdark .popup{position:fixed;top:50%;left:50%;background:#ddd}.theme-vchatdark .popup .close{position:absolute;background:#aaa;top:0;right:0;color:#333;text-decoration:none;z-index:2;padding:0 10px;height:30px;line-height:30px}.theme-vchatdark .popup .close:hover{background:#999}.theme-vchatdark .popup .head{background:#999;color:#ddd;padding:0 10px;height:30px;line-height:30px;text-transform:uppercase;font-size:.9em;font-weight:700;border-bottom:2px solid green}.theme-vchatdark .popup input{border:1px solid #999;background:#fff;margin:0;padding:5px;outline:none;color:#333}.theme-vchatdark .popup input[type=text]:hover,.theme-vchatdark .popup input[type=text]:active,.theme-vchatdark .popup input[type=text]:focus{border-color:green}.theme-vchatdark .popup input[type=submit]{padding:5px 10px;background:#999;color:#ddd;text-transform:uppercase;font-size:.9em;font-weight:700}.theme-vchatdark .popup input[type=submit]:hover,.theme-vchatdark .popup input[type=submit]:focus,.theme-vchatdark .popup input[type=submit]:active{background:#aaa;cursor:pointer}.theme-vchatdark .changeFont{padding:10px}.theme-vchatdark .changeFont a{display:block;text-decoration:none;padding:3px;color:#333}.theme-vchatdark .changeFont a:hover{background:#ccc}.theme-vchatdark .highlightPopup{padding:10px;text-align:center}.theme-vchatdark .highlightPopup input[type=text]{display:block;width:215px;text-align:left;margin-top:5px}.theme-vchatdark .highlightPopup input.highlightColor{background-color:#ff0}.theme-vchatdark .highlightPopup input.highlightTermSubmit{margin-top:5px}.theme-vchatdark .contextMenu{background-color:#ddd;position:fixed;margin:2px;width:150px}.theme-vchatdark .contextMenu a{display:block;padding:2px 5px;text-decoration:none;color:#333}.theme-vchatdark .contextMenu a:hover{background-color:#ccc}.theme-vchatdark .filterMessages{padding:5px}.theme-vchatdark .filterMessages div{padding:2px 0}.theme-vchatdark .icon-stack{height:1em;line-height:1em;width:1em;vertical-align:middle;margin-top:-2px}.theme-vchatdark .motd{color:#638500;font-family:Verdana,sans-serif;white-space:normal}.theme-vchatdark .motd h1,.theme-vchatdark .motd h2,.theme-vchatdark .motd h3,.theme-vchatdark .motd h4,.theme-vchatdark .motd h5,.theme-vchatdark .motd h6{color:#638500;text-decoration:underline}.theme-vchatdark .motd a,.theme-vchatdark .motd a:link,.theme-vchatdark .motd a:visited,.theme-vchatdark .motd a:active,.theme-vchatdark .motd a:hover{color:#638500}.theme-vchatdark .bold,.theme-vchatdark .name,.theme-vchatdark .prefix,.theme-vchatdark .ooc,.theme-vchatdark .looc,.theme-vchatdark .adminooc,.theme-vchatdark .admin,.theme-vchatdark .medal,.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .italic,.theme-vchatdark .italics{font-style:italic}.theme-vchatdark .highlight{background:#ff0}.theme-vchatdark h1,.theme-vchatdark h2,.theme-vchatdark h3,.theme-vchatdark h4,.theme-vchatdark h5,.theme-vchatdark h6{color:#a4bad6;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark h1.alert,.theme-vchatdark h2.alert{color:#a4bad6}.theme-vchatdark em{font-style:normal;font-weight:700}.theme-vchatdark .ooc{color:#004ed8;font-weight:700}.theme-vchatdark .ooc .elevated{color:#2e78d9}.theme-vchatdark .ooc .moderator{color:#184880}.theme-vchatdark .ooc .developer{color:#1b521f}.theme-vchatdark .ooc .admin{color:#b82e00}.theme-vchatdark .ooc .event_manager{color:#603}.theme-vchatdark .ooc .aooc{color:#960018}.theme-vchatdark img.text_tag{width:32px;height:10px;min-height:10px}.theme-vchatdark img.icon{vertical-align:middle;max-height:1em}.theme-vchatdark img.icon.bigicon{max-height:32px}.theme-vchatdark .looc{color:#3a9696;font-weight:700}.theme-vchatdark .rlooc{color:#3abb96;font-weight:700}.theme-vchatdark .adminobserverooc{color:#09c;font-weight:700}.theme-vchatdark .adminooc{color:#3d5bc3;font-weight:700}.theme-vchatdark .adminsay{color:#ff4500;font-weight:700}.theme-vchatdark .admin{color:#5975da;font-weight:700}.theme-vchatdark .mentor_channel{color:olive;font-weight:700}.theme-vchatdark .mod_channel{color:#735638;font-weight:700}.theme-vchatdark .admin_channel{color:#9611d4;font-weight:700}.theme-vchatdark .event_channel{color:#c39;font-weight:700}.theme-vchatdark .name{font-weight:700}.theme-vchatdark .say,.theme-vchatdark .emote,.theme-vchatdark .emotesubtle,.theme-vchatdark .npcemote,.theme-vchatdark .npcsay,.theme-vchatdark .infoplain,.theme-vchatdark .oocplain,.theme-vchatdark .warningplain,.theme-vchatdark .chatexport{color:#fff}.theme-vchatdark .psay,.theme-vchatdark .pemote{color:#e300e4;font-style:italic}.theme-vchatdark .deadsay{color:#732fcd}.theme-vchatdark .binarysay{color:#1e90ff}.theme-vchatdark .binarysay a{color:#0f0}.theme-vchatdark .binarysay a:active,.theme-vchatdark .binarysay a:visited{color:#8f8}.theme-vchatdark .radio{color:#00a800}.theme-vchatdark .sciradio{color:#939}.theme-vchatdark .comradio{color:#395a9a}.theme-vchatdark .secradio{color:#a30000}.theme-vchatdark .medradio{color:#008160}.theme-vchatdark .engradio{color:#a66300}.theme-vchatdark .supradio{color:#5f4519}.theme-vchatdark .srvradio{color:#6eaa2c}.theme-vchatdark .expradio{color:#555}.theme-vchatdark .syndradio{color:#6d3f40}.theme-vchatdark .gangradio{color:#ac2ea1}.theme-vchatdark .centradio{color:#5c5c8a}.theme-vchatdark .airadio{color:#f0f}.theme-vchatdark .redteamradio{color:#f44!important}.theme-vchatdark .blueteamradio{color:#3434fd!important}.theme-vchatdark .greenteamradio{color:#34fd34!important}.theme-vchatdark .yellowteamradio{color:#fdfd34!important}.theme-vchatdark .yell{font-weight:700}.theme-vchatdark .alert{color:red}.theme-vchatdark .valert{color:#d82020}.theme-vchatdark .userdanger{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .bolddanger{color:#c51e1e;font-weight:700}.theme-vchatdark .danger,.theme-vchatdark .vdanger{color:#c51e1e}.theme-vchatdark .warning,.theme-vchatdark .vwarning{color:#c51e1e;font-style:italic}.theme-vchatdark .alertwarning{color:red;font-weight:700}.theme-vchatdark .boldwarning{color:#c51e1e;font-style:italic;font-weight:700}.theme-vchatdark .announce,.theme-vchatdark .boldannounce{color:#c51e1e;font-weight:700}.theme-vchatdark .minorannounce{color:#c51e1e;font-weight:700;font-size:185%}.theme-vchatdark .minoralert{color:#a4bad6;font-size:125%}.theme-vchatdark .priorityannounce{color:#a4bad6;font-weight:700;font-size:225%}.theme-vchatdark .prioritytitle{color:#6685f5;font-weight:700;font-size:185%}.theme-vchatdark .priorityalert{color:#c51e1e;font-size:140%}.theme-vchatdark .greenannounce{color:#059223;font-weight:700}.theme-vchatdark .rose{color:#ff5050}.theme-vchatdark .info,.theme-vchatdark .notice,.theme-vchatdark .vnotice{color:#6060c9}.theme-vchatdark .tinynotice{color:#6060c9;font-size:85%}.theme-vchatdark .tinynoticeital{color:#6060c9;font-style:italic;font-size:85%}.theme-vchatdark .smallnotice{color:#6060c9;font-size:90%}.theme-vchatdark .smallnoticeital{color:#6060c9;font-style:italic;font-size:90%}.theme-vchatdark .bolditalic{font-style:italic;font-weight:700}.theme-vchatdark .boldnotice{color:#6060c9;font-weight:700}.theme-vchatdark .hear{color:#6060c9;font-style:italic}.theme-vchatdark .adminnotice{color:#6060c9}.theme-vchatdark .adminhelp{color:red;font-weight:700}.theme-vchatdark .log_message{color:#386aff;font-weight:700}.theme-vchatdark .unconscious{color:#a4bad6;font-weight:700}.theme-vchatdark .suicide{color:#ff5050;font-style:italic}.theme-vchatdark .green{color:#4f4}.theme-vchatdark .grey{color:#a9a9a9}.theme-vchatdark .red{color:red}.theme-vchatdark .crimson{color:#dc143c}.theme-vchatdark .maroon{color:#c60000}.theme-vchatdark .brown{color:#db733b}.theme-vchatdark .blue{color:#66f}.theme-vchatdark .black,.theme-vchatdark .white{color:#fff}.theme-vchatdark .darkgray{color:gray}.theme-vchatdark .gray{color:#a9a9a9}.theme-vchatdark .yellow{color:#fc0}.theme-vchatdark .pink{color:pink}.theme-vchatdark .cyan{color:#0ff}.theme-vchatdark .orange{color:#ff8c00}.theme-vchatdark .nicegreen{color:#059223}.theme-vchatdark .boldnicegreen{color:#059223;font-weight:700}.theme-vchatdark .blob{color:#ee4000}.theme-vchatdark .blobannounce{color:#556b2f;font-weight:700;font-size:185%}.theme-vchatdark .cult{color:#973e3b}.theme-vchatdark .cultitalic{color:#973e3b;font-style:italic}.theme-vchatdark .cultbold{color:#973e3b;font-style:italic;font-weight:700}.theme-vchatdark .cultboldtalic,.theme-vchatdark .cultlarge{color:#973e3b;font-weight:700;font-size:185%}.theme-vchatdark .narsie{color:#973e3b;font-weight:700;font-size:925%}.theme-vchatdark .narsiesmall{color:#973e3b;font-weight:700;font-size:370%}.theme-vchatdark .colossus{color:#7f282a;font-size:310%}.theme-vchatdark .hierophant{color:#b441ee;font-weight:700;font-style:italic}.theme-vchatdark .hierophant_warning{color:#c56bf1;font-style:italic}.theme-vchatdark .purple{color:#9956d3}.theme-vchatdark .lightpurple{color:#ad5aad}.theme-vchatdark .darkpink{color:#e3209b}.theme-vchatdark .holoparasite{color:#88809c}.theme-vchatdark .revennotice{color:#c099e2}.theme-vchatdark .revenboldnotice{color:#c099e2;font-weight:700}.theme-vchatdark .revenbignotice{color:#c099e2;font-weight:700;font-size:185%}.theme-vchatdark .revenminor{color:#823abb}.theme-vchatdark .revenwarning{color:#760fbb;font-style:italic}.theme-vchatdark .revendanger{color:#760fbb;font-weight:700;font-size:185%}.theme-vchatdark .deconversion_message{color:#a947ff;font-size:185%;font-style:italic}.theme-vchatdark .ghostalert{color:#60f;font-style:italic;font-weight:700}.theme-vchatdark .alien{color:#855d85}.theme-vchatdark .noticealien{color:#059223}.theme-vchatdark .alertalien{color:#059223;font-weight:700}.theme-vchatdark .changeling{color:#b000b1;font-style:italic}.theme-vchatdark .alertsyndie{color:red;font-size:185%;font-weight:700}.theme-vchatdark .spiderbroodmother{color:#80f;font-weight:700;font-size:185%}.theme-vchatdark .spiderbreacher{color:#e8b670;font-weight:700;font-size:140%}.theme-vchatdark .spiderscout{color:#231d98;font-weight:700;font-size:120%}.theme-vchatdark .interface{color:#750e75}.theme-vchatdark .sans{font-family:Comic Sans MS,cursive,sans-serif}.theme-vchatdark .papyrus{font-family:Papyrus,cursive,sans-serif}.theme-vchatdark .robot{font-family:Courier New,cursive,sans-serif}.theme-vchatdark .tape_recorder{color:red;font-family:Courier New,cursive,sans-serif}.theme-vchatdark .command_headset{font-weight:700;font-size:160%}.theme-vchatdark .small{font-size:60%}.theme-vchatdark .big{font-size:185%}.theme-vchatdark .reallybig{font-size:245%}.theme-vchatdark .extremelybig{font-size:310%}.theme-vchatdark .greentext{color:#059223;font-size:185%}.theme-vchatdark .redtext{color:#c51e1e;font-size:185%}.theme-vchatdark .clown{color:#ff70c1;font-size:160%;font-family:Comic Sans MS,cursive,sans-serif;font-weight:700}.theme-vchatdark .singing{font-family:Trebuchet MS,cursive,sans-serif;font-style:italic}.theme-vchatdark .his_grace{color:#15d512;font-family:Courier New,cursive,sans-serif;font-style:italic}.theme-vchatdark .hypnophrase{color:#202020;font-weight:700;animation:hypnocolor 1.5s infinite;animation-direction:alternate}@keyframes hypnocolor{0%{color:#202020}25%{color:#4b02ac}50%{color:#9f41f1}75%{color:#541c9c}to{color:#7adbf3}}.theme-vchatdark .phobia{color:#d00;font-weight:700;animation:phobia .75s infinite}@keyframes phobia{0%{color:#f75a5a}50%{color:#d00}to{color:#f75a5a}}.theme-vchatdark .icon{height:1em;width:auto}.theme-vchatdark .bigicon{font-size:2.5em}.theme-vchatdark .hugeicon{font-size:5em}.theme-vchatdark .memo{color:#638500;text-align:center}.theme-vchatdark .memoedit{text-align:center;font-size:125%}.theme-vchatdark .abductor{color:#c204c2;font-style:italic}.theme-vchatdark .mind_control{color:#df3da9;font-size:100%;font-weight:700;font-style:italic}.theme-vchatdark .slime{color:#00ced1}.theme-vchatdark .drone{color:#848482}.theme-vchatdark .monkey{color:#975032}.theme-vchatdark .swarmer{color:#2c75ff}.theme-vchatdark .resonate{color:#298f85}.theme-vchatdark .upside_down{display:inline;-moz-transform:scale(-1,-1);-webkit-transform:scale(-1,-1);-o-transform:scale(-1,-1);-ms-transform:scale(-1,-1);transform:scale(-1)}.theme-vchatdark .connectionClosed,.theme-vchatdark .fatalError{background:red;color:#fff;padding:5px}.theme-vchatdark .connectionClosed.restored{background:green}.theme-vchatdark .internal.boldnshit{color:#3d5bc3;font-weight:700}.theme-vchatdark .text-normal{font-weight:400;font-style:normal}.theme-vchatdark .hidden{display:none;visibility:hidden}.theme-vchatdark .ml-1{margin-left:1em}.theme-vchatdark .ml-2{margin-left:2em}.theme-vchatdark .ml-3{margin-left:3em}.theme-vchatdark .examine_block{background:#1b1c1e;border:1px solid #a4bad6;margin:.5em;padding:.5em .75em}.theme-vchatdark .tooltip{font-style:italic;border-bottom:1px dashed #fff}.theme-vchatdark .major_announcement_title{font-size:175%;padding:0rem .5rem;line-height:100%;text-align:left;text-decoration:none;width:100%}.theme-vchatdark .subheader_announcement_text{font-weight:700;padding:.25rem .5rem 0;line-height:100%;width:100%;height:100%;text-align:left;font-size:125%}.theme-vchatdark .major_announcement_text{color:#eaeaea;background-color:#131313;font-weight:700;font-size:100%;text-align:left;padding:.5rem;width:100%;height:100%}.theme-vchatdark .minor_announcement_title{font-weight:700;padding:0 .5rem;padding-top:0;line-height:100%;width:100%;height:100%;text-align:left;font-size:150%}.theme-vchatdark .minor_announcement_text{background-color:#202020;color:#eaeaea;padding:.5rem;text-align:left;font-size:100%}.theme-vchatdark .announcement_header{padding:.5rem 0;display:flex;flex-direction:column}.theme-vchatdark .chat_alert_default{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_default .major_announcement_title,.theme-vchatdark .chat_alert_default .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_default .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_default .minor_announcement_text,.theme-vchatdark .chat_alert_default .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_green{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#004700,#004700 10px,#003d00 10px,#003d00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_green .major_announcement_title,.theme-vchatdark .chat_alert_green .minor_announcement_title{color:#00ff80}.theme-vchatdark .chat_alert_green .subheader_announcement_text{color:#ff85b5}.theme-vchatdark .chat_alert_green .minor_announcement_text,.theme-vchatdark .chat_alert_green .major_announcement_text{background-color:#002400}.theme-vchatdark .chat_alert_blue{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#003045,#003045 10px,#00283a 10px,#00283a 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_blue .major_announcement_title,.theme-vchatdark .chat_alert_blue .minor_announcement_title{color:#33d5ff}.theme-vchatdark .chat_alert_blue .subheader_announcement_text{color:#ff5297}.theme-vchatdark .chat_alert_blue .minor_announcement_text,.theme-vchatdark .chat_alert_blue .major_announcement_text{background-color:#001621}.theme-vchatdark .chat_alert_pink{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#400025,#400025 10px,#30001b 10px,#30001b 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_pink .major_announcement_title,.theme-vchatdark .chat_alert_pink .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_pink .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_pink .minor_announcement_text,.theme-vchatdark .chat_alert_pink .major_announcement_text{background-color:#17000d}.theme-vchatdark .chat_alert_yellow{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#4d4100,#4d4100 10px,#574a00 10px,#574a00 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_yellow .major_announcement_title,.theme-vchatdark .chat_alert_yellow .minor_announcement_title{color:#fff4e0}.theme-vchatdark .chat_alert_yellow .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_yellow .minor_announcement_text,.theme-vchatdark .chat_alert_yellow .major_announcement_text{background-color:#3e3400}.theme-vchatdark .chat_alert_orange{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#6b4200,#6b4200 10px,#593400 10px,#593400 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_orange .major_announcement_title,.theme-vchatdark .chat_alert_orange .minor_announcement_title{color:#feefe7}.theme-vchatdark .chat_alert_orange .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_orange .minor_announcement_text,.theme-vchatdark .chat_alert_orange .major_announcement_text{background-color:#402500}.theme-vchatdark .chat_alert_red{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#520000,#520000 10px,#420000 10px,#420000 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_red .major_announcement_title,.theme-vchatdark .chat_alert_red .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_red .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_red .minor_announcement_text,.theme-vchatdark .chat_alert_red .major_announcement_text{background-color:#290000}.theme-vchatdark .chat_alert_purple{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#38003d,#38003d 10px,#2c0030 10px,#2c0030 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_purple .major_announcement_title,.theme-vchatdark .chat_alert_purple .minor_announcement_title{color:#c7a1f7}.theme-vchatdark .chat_alert_purple .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_purple .minor_announcement_text,.theme-vchatdark .chat_alert_purple .major_announcement_text{background-color:#150017}.theme-vchatdark .chat_alert_grey{color:#fff;padding:.5rem;box-shadow:none;font-weight:700;margin:1rem 0;padding:0;display:flex;flex-direction:column;border-image:repeating-linear-gradient(-45deg,#292929,#292929 10px,#252525 10px,#252525 20px);border-image-slice:4 fill;border-width:4px;border-image-width:4px;border-image-outset:0 0 0 0;border-image-repeat:repeat repeat;border-style:solid}.theme-vchatdark .chat_alert_grey .major_announcement_title,.theme-vchatdark .chat_alert_grey .minor_announcement_title{color:#ff5297}.theme-vchatdark .chat_alert_grey .subheader_announcement_text{color:#33d5ff}.theme-vchatdark .chat_alert_grey .minor_announcement_text,.theme-vchatdark .chat_alert_grey .major_announcement_text{background-color:#181818}.theme-vchatdark .tajaran{color:#803b56}.theme-vchatdark .tajaran_signlang{color:#941c1c}.theme-vchatdark .akhani{color:#ac398c}.theme-vchatdark .skrell{color:#00b0b3}.theme-vchatdark .skrellfar{color:#70fcff}.theme-vchatdark .soghun{color:#50ba6c}.theme-vchatdark .solcom{color:#6da6f0}.theme-vchatdark .sergal{color:#07f}.theme-vchatdark .birdsongc{color:#c90}.theme-vchatdark .vulpkanin{color:#b97a57}.theme-vchatdark .tavan{color:#f54298;font-family:Arial}.theme-vchatdark .echosong{color:#826d8c}.theme-vchatdark .enochian{color:#848a33;letter-spacing:-1pt;word-spacing:4pt;font-family:Lucida Sans Unicode,Lucida Grande,sans-serif}.theme-vchatdark .daemon{color:#5e339e;letter-spacing:-1pt;word-spacing:0pt;font-family:Courier New,Courier,monospace}.theme-vchatdark .drudakar{color:#bb2463;word-spacing:0pt;font-family:High Tower Text,monospace}.theme-vchatdark .bug{color:#9e9e39}.theme-vchatdark .vox{color:#a0a}.theme-vchatdark .promethean{color:#a5a5a5;font-family:Comic Sans MS,Comic Sans,cursive}.theme-vchatdark .zaddat{color:#941c1c}.theme-vchatdark .rough{font-family:Trebuchet MS,cursive,sans-serif}.theme-vchatdark .say_quote{font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .say_quote_italics{font-style:italic;font-family:Georgia,Verdana,sans-serif}.theme-vchatdark .terminus{font-family:Times New Roman,Times,serif,sans-serif}.theme-vchatdark .spacer{color:#9c660b}.theme-vchatdark .teppi{color:#816540;word-spacing:4pt;font-family:Segoe Script Bold,Segoe Script,sans-serif,Verdana}.theme-vchatdark .shadekin{color:#be3cc5;font-size:150%;font-weight:700;font-family:Gabriola,cursive,sans-serif} diff --git a/tgui/public/tgui-panel.bundle.js b/tgui/public/tgui-panel.bundle.js index cb0ecc6c266..a34979935ed 100644 --- a/tgui/public/tgui-panel.bundle.js +++ b/tgui/public/tgui-panel.bundle.js @@ -118,7 +118,7 @@ * @file * @copyright 2020 Aleksej Komarov * @license MIT - */var t=n.MESSAGE_SAVE_INTERVAL=1e4,e=n.MESSAGE_PRUNE_INTERVAL=6e4,r=n.IMAGE_RETRY_DELAY=250,o=n.IMAGE_RETRY_LIMIT=10,a=n.IMAGE_RETRY_MESSAGE_AGE=6e4,i=n.MESSAGE_TYPE_UNKNOWN="unknown",d=n.MESSAGE_TYPE_INTERNAL="internal",u=n.MESSAGE_TYPE_SYSTEM="system",h=n.MESSAGE_TYPE_LOCALCHAT="localchat",s=n.MESSAGE_TYPE_NPCEMOTE="npcemote",l=n.MESSAGE_TYPE_PLOCALCHAT="plocalchat",v=n.MESSAGE_TYPE_VORE="vore",c=n.MESSAGE_TYPE_RADIO="radio",p=n.MESSAGE_TYPE_NIF="nif",f=n.MESSAGE_TYPE_INFO="info",g=n.MESSAGE_TYPE_WARNING="warning",m=n.MESSAGE_TYPE_DEADCHAT="deadchat",I=n.MESSAGE_TYPE_OOC="ooc",O=n.MESSAGE_TYPE_LOOC="looc",b=n.MESSAGE_TYPE_ADMINPM="adminpm",C=n.MESSAGE_TYPE_MENTORPM="mentorpm",E=n.MESSAGE_TYPE_COMBAT="combat",S=n.MESSAGE_TYPE_CHATPRINT="chatprint",T=n.MESSAGE_TYPE_ADMINCHAT="adminchat",A=n.MESSAGE_TYPE_MODCHAT="modchat",P=n.MESSAGE_TYPE_RLOOC="rlooc",N=n.MESSAGE_TYPE_PRAYER="prayer",w=n.MESSAGE_TYPE_EVENTCHAT="eventchat",R=n.MESSAGE_TYPE_ADMINLOG="adminlog",x=n.MESSAGE_TYPE_ATTACKLOG="attacklog",B=n.MESSAGE_TYPE_DEBUG="debug",F=n.MESSAGE_TYPES=[{type:u,name:"System Messages",description:"Messages from your client, always enabled",selector:".boldannounce",important:!0},{type:h,name:"Local",description:"In-character local messages (say, emote, etc)",selector:".say, .emote, .emotesubtle"},{type:s,name:"NPC Emotes",description:"In-character emotes from NPCs",selector:".npcemote"},{type:l,name:"Local (Pred/Prey)",description:"Messages from / to absorbed or dominated prey",selector:".psay, .pemote"},{type:v,name:"Vorgan Messages",description:"Messages regarding vore interactions",selector:".valert, .vwarning, .vnotice, .vdanger"},{type:c,name:"Radio",description:"All departments of radio messages",selector:".alert, .minorannounce, .syndradio, .centradio, .airadio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .binarysay, .newscaster, .resonate, .abductor, .alien, .changeling"},{type:p,name:"NIF",description:"Messages from the NIF itself and people inside",selector:".nif"},{type:f,name:"Info",description:"Non-urgent messages from the game and items",selector:".notice:not(.pm), .adminnotice, .info, .sinister, .cult, .infoplain, .announce, .hear, .smallnotice, .holoparasite, .boldnotice"},{type:g,name:"Warnings",description:"Urgent messages from the game and items",selector:".warning:not(.pm), .critical, .userdanger, .italics, .alertsyndie, .warningplain"},{type:m,name:"Deadchat",description:"All of deadchat",selector:".deadsay, .ghostalert"},{type:I,name:"OOC",description:"The bluewall of global OOC messages",selector:".ooc, .adminooc, .adminobserverooc, .oocplain"},{type:O,name:"Local OOC",description:"Local OOC messages, always enabled",selector:".looc",important:!0},{type:b,name:"Admin PMs",description:"Messages to/from admins (adminhelp)",selector:".pm, .adminhelp"},{type:C,name:"Mentor PMs",description:"Mentorchat and mentor pms",selector:".mentor_channel, .mentor"},{type:E,name:"Combat Log",description:"Urist McTraitor has stabbed you with a knife!",selector:".danger"},{type:S,name:"Chat prints",description:"Chat outputs of ooc notes or vorebelly exports",selector:".chatexport"},{type:i,name:"Unsorted",description:"Everything we could not sort, always enabled"},{type:T,name:"Admin Chat",description:"ASAY messages",selector:".admin_channel, .adminsay",admin:!0},{type:A,name:"Mod Chat",description:"MSAY messages",selector:".mod_channel",admin:!0},{type:w,name:"Event Chat",description:"ESAY messages",selector:".event_channel",admin:!0},{type:P,name:"Remote LOOC",description:"Remote LOOC messages",selector:".rlooc",admin:!0},{type:N,name:"Prayers",description:"Prayers from players",admin:!0},{type:R,name:"Admin Log",description:"ADMIN LOG: Urist McAdmin has jumped to coordinates X, Y, Z",selector:".log_message",admin:!0},{type:x,name:"Attack Log",description:"Urist McTraitor has shot John Doe",admin:!0},{type:B,name:"Debug Log",description:"DEBUG: SSPlanets subsystem Recover().",admin:!0}]},25457:function(y,n,t){"use strict";n.__esModule=!0,n.chatReducer=n.chatMiddleware=n.ChatTabs=n.ChatPanel=n.ChatPageSettings=void 0;var e=t(12104);n.ChatPageSettings=e.ChatPageSettings;var r=t(81230);n.ChatPanel=r.ChatPanel;var o=t(85896);n.ChatTabs=o.ChatTabs;var a=t(4165);n.chatMiddleware=a.chatMiddleware;var i=t(83547);n.chatReducer=i.chatReducer},4165:function(y,n,t){"use strict";n.__esModule=!0,n.chatMiddleware=void 0;var e=l(t(85964)),r=t(22800),o=t(50138),a=t(31794),i=t(8719),d=t(6098),u=t(64577),h=t(22553),s=t(68544);function l(E){return E&&E.__esModule?E:{default:E}}function v(E,S){var T=typeof Symbol!="undefined"&&E[Symbol.iterator]||E["@@iterator"];if(T)return(T=T.call(E)).next.bind(T);if(Array.isArray(E)||(T=c(E))||S&&E&&typeof E.length=="number"){T&&(E=T);var A=0;return function(){return A>=E.length?{done:!0}:{done:!1,value:E[A++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(E,S){if(E){if(typeof E=="string")return p(E,S);var T=Object.prototype.toString.call(E).slice(8,-1);if(T==="Object"&&E.constructor&&(T=E.constructor.name),T==="Map"||T==="Set")return Array.from(E);if(T==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(T))return p(E,S)}}function p(E,S){(S==null||S>E.length)&&(S=E.length);for(var T=0,A=new Array(S);T=0;--nt){var rt=this.tryEntries[nt],ut=rt.completion;if(rt.tryLoc==="root")return pt("end");if(rt.tryLoc<=this.prev){var z=A.call(rt,"catchLoc"),K=A.call(rt,"finallyLoc");if(z&&K){if(this.prev=0;--pt){var nt=this.tryEntries[pt];if(nt.tryLoc<=this.prev&&A.call(nt,"finallyLoc")&&this.prev=0;--ct){var pt=this.tryEntries[ct];if(pt.finallyLoc===ot)return this.complete(pt.completion,pt.afterLoc),At(pt),W}}return J}(),catch:function(){function J(ot){for(var ct=this.tryEntries.length-1;ct>=0;--ct){var pt=this.tryEntries[ct];if(pt.tryLoc===ot){var nt=pt.completion;if(nt.type==="throw"){var rt=nt.arg;At(pt)}return rt}}throw new Error("illegal catch attempt")}return J}(),delegateYield:function(){function J(ot,ct,pt){return this.delegate={iterator:dt(ot),resultName:ct,nextLoc:pt},this.method==="next"&&(this.arg=E),W}return J}()},S}function g(E,S,T,A,P,N,w){try{var R=E[N](w),x=R.value}catch(B){T(B);return}R.done?S(x):Promise.resolve(x).then(A,P)}function m(E){return function(){var S=this,T=arguments;return new Promise(function(A,P){var N=E.apply(S,T);function w(x){g(N,A,P,w,R,"next",x)}function R(x){g(N,A,P,w,R,"throw",x)}w(void 0)})}}/** + */var t=n.MESSAGE_SAVE_INTERVAL=1e4,e=n.MESSAGE_PRUNE_INTERVAL=6e4,r=n.IMAGE_RETRY_DELAY=250,o=n.IMAGE_RETRY_LIMIT=10,a=n.IMAGE_RETRY_MESSAGE_AGE=6e4,i=n.MESSAGE_TYPE_UNKNOWN="unknown",d=n.MESSAGE_TYPE_INTERNAL="internal",u=n.MESSAGE_TYPE_SYSTEM="system",h=n.MESSAGE_TYPE_LOCALCHAT="localchat",s=n.MESSAGE_TYPE_NPCEMOTE="npcemote",l=n.MESSAGE_TYPE_PLOCALCHAT="plocalchat",v=n.MESSAGE_TYPE_VORE="vore",c=n.MESSAGE_TYPE_RADIO="radio",p=n.MESSAGE_TYPE_NIF="nif",f=n.MESSAGE_TYPE_INFO="info",g=n.MESSAGE_TYPE_WARNING="warning",m=n.MESSAGE_TYPE_DEADCHAT="deadchat",I=n.MESSAGE_TYPE_OOC="ooc",O=n.MESSAGE_TYPE_LOOC="looc",b=n.MESSAGE_TYPE_ADMINPM="adminpm",C=n.MESSAGE_TYPE_MENTORPM="mentorpm",E=n.MESSAGE_TYPE_COMBAT="combat",S=n.MESSAGE_TYPE_CHATPRINT="chatprint",T=n.MESSAGE_TYPE_ADMINCHAT="adminchat",A=n.MESSAGE_TYPE_MODCHAT="modchat",P=n.MESSAGE_TYPE_RLOOC="rlooc",N=n.MESSAGE_TYPE_PRAYER="prayer",w=n.MESSAGE_TYPE_EVENTCHAT="eventchat",R=n.MESSAGE_TYPE_ADMINLOG="adminlog",x=n.MESSAGE_TYPE_ATTACKLOG="attacklog",B=n.MESSAGE_TYPE_DEBUG="debug",F=n.MESSAGE_TYPES=[{type:u,name:"System Messages",description:"Messages from your client, always enabled",selector:".boldannounce",important:!0},{type:s,name:"NPC Emotes / Says",description:"In-character emotes and says from NPCs",selector:".npcemote, .npcsay"},{type:h,name:"Local",description:"In-character local messages (say, emote, etc)",selector:".say, .emote, .emotesubtle"},{type:l,name:"Local (Pred/Prey)",description:"Messages from / to absorbed or dominated prey",selector:".psay, .pemote"},{type:v,name:"Vorgan Messages",description:"Messages regarding vore interactions",selector:".valert, .vwarning, .vnotice, .vdanger"},{type:c,name:"Radio",description:"All departments of radio messages",selector:".alert, .minorannounce, .syndradio, .centradio, .airadio, .comradio, .secradio, .gangradio, .engradio, .medradio, .sciradio, .supradio, .srvradio, .expradio, .radio, .deptradio, .binarysay, .newscaster, .resonate, .abductor, .alien, .changeling"},{type:p,name:"NIF",description:"Messages from the NIF itself and people inside",selector:".nif"},{type:f,name:"Info",description:"Non-urgent messages from the game and items",selector:".notice:not(.pm), .adminnotice, .info, .sinister, .cult, .infoplain, .announce, .hear, .smallnotice, .holoparasite, .boldnotice"},{type:g,name:"Warnings",description:"Urgent messages from the game and items",selector:".warning:not(.pm), .critical, .userdanger, .italics, .alertsyndie, .warningplain"},{type:m,name:"Deadchat",description:"All of deadchat",selector:".deadsay, .ghostalert"},{type:I,name:"OOC",description:"The bluewall of global OOC messages",selector:".ooc, .adminooc, .adminobserverooc, .oocplain"},{type:O,name:"Local OOC",description:"Local OOC messages, always enabled",selector:".looc",important:!0},{type:b,name:"Admin PMs",description:"Messages to/from admins (adminhelp)",selector:".pm, .adminhelp"},{type:C,name:"Mentor PMs",description:"Mentorchat and mentor pms",selector:".mentor_channel, .mentor"},{type:E,name:"Combat Log",description:"Urist McTraitor has stabbed you with a knife!",selector:".danger"},{type:S,name:"Chat prints",description:"Chat outputs of ooc notes or vorebelly exports",selector:".chatexport"},{type:i,name:"Unsorted",description:"Everything we could not sort, always enabled"},{type:T,name:"Admin Chat",description:"ASAY messages",selector:".admin_channel, .adminsay",admin:!0},{type:A,name:"Mod Chat",description:"MSAY messages",selector:".mod_channel",admin:!0},{type:w,name:"Event Chat",description:"ESAY messages",selector:".event_channel",admin:!0},{type:P,name:"Remote LOOC",description:"Remote LOOC messages",selector:".rlooc",admin:!0},{type:N,name:"Prayers",description:"Prayers from players",admin:!0},{type:R,name:"Admin Log",description:"ADMIN LOG: Urist McAdmin has jumped to coordinates X, Y, Z",selector:".log_message",admin:!0},{type:x,name:"Attack Log",description:"Urist McTraitor has shot John Doe",admin:!0},{type:B,name:"Debug Log",description:"DEBUG: SSPlanets subsystem Recover().",admin:!0}]},25457:function(y,n,t){"use strict";n.__esModule=!0,n.chatReducer=n.chatMiddleware=n.ChatTabs=n.ChatPanel=n.ChatPageSettings=void 0;var e=t(12104);n.ChatPageSettings=e.ChatPageSettings;var r=t(81230);n.ChatPanel=r.ChatPanel;var o=t(85896);n.ChatTabs=o.ChatTabs;var a=t(4165);n.chatMiddleware=a.chatMiddleware;var i=t(83547);n.chatReducer=i.chatReducer},4165:function(y,n,t){"use strict";n.__esModule=!0,n.chatMiddleware=void 0;var e=l(t(85964)),r=t(22800),o=t(50138),a=t(31794),i=t(8719),d=t(6098),u=t(64577),h=t(22553),s=t(68544);function l(E){return E&&E.__esModule?E:{default:E}}function v(E,S){var T=typeof Symbol!="undefined"&&E[Symbol.iterator]||E["@@iterator"];if(T)return(T=T.call(E)).next.bind(T);if(Array.isArray(E)||(T=c(E))||S&&E&&typeof E.length=="number"){T&&(E=T);var A=0;return function(){return A>=E.length?{done:!0}:{done:!1,value:E[A++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function c(E,S){if(E){if(typeof E=="string")return p(E,S);var T=Object.prototype.toString.call(E).slice(8,-1);if(T==="Object"&&E.constructor&&(T=E.constructor.name),T==="Map"||T==="Set")return Array.from(E);if(T==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(T))return p(E,S)}}function p(E,S){(S==null||S>E.length)&&(S=E.length);for(var T=0,A=new Array(S);T=0;--nt){var rt=this.tryEntries[nt],ut=rt.completion;if(rt.tryLoc==="root")return pt("end");if(rt.tryLoc<=this.prev){var z=A.call(rt,"catchLoc"),K=A.call(rt,"finallyLoc");if(z&&K){if(this.prev=0;--pt){var nt=this.tryEntries[pt];if(nt.tryLoc<=this.prev&&A.call(nt,"finallyLoc")&&this.prev=0;--ct){var pt=this.tryEntries[ct];if(pt.finallyLoc===ot)return this.complete(pt.completion,pt.afterLoc),At(pt),W}}return J}(),catch:function(){function J(ot){for(var ct=this.tryEntries.length-1;ct>=0;--ct){var pt=this.tryEntries[ct];if(pt.tryLoc===ot){var nt=pt.completion;if(nt.type==="throw"){var rt=nt.arg;At(pt)}return rt}}throw new Error("illegal catch attempt")}return J}(),delegateYield:function(){function J(ot,ct,pt){return this.delegate={iterator:dt(ot),resultName:ct,nextLoc:pt},this.method==="next"&&(this.arg=E),W}return J}()},S}function g(E,S,T,A,P,N,w){try{var R=E[N](w),x=R.value}catch(B){T(B);return}R.done?S(x):Promise.resolve(x).then(A,P)}function m(E){return function(){var S=this,T=arguments;return new Promise(function(A,P){var N=E.apply(S,T);function w(x){g(N,A,P,w,R,"next",x)}function R(x){g(N,A,P,w,R,"throw",x)}w(void 0)})}}/** * @file * @copyright 2020 Aleksej Komarov * @license MIT diff --git a/vorestation.dme b/vorestation.dme index ac7e2ca1b3d..d0d0846eb53 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1299,7 +1299,6 @@ #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" #include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\robot\robot_upgrades_vr.dm" #include "code\game\objects\items\stacks\marker_beacons.dm" #include "code\game\objects\items\stacks\matter_synth.dm" #include "code\game\objects\items\stacks\medical.dm" @@ -3946,7 +3945,6 @@ #include "code\modules\research\mechfab_designs.dm" #include "code\modules\research\message_server.dm" #include "code\modules\research\prosfab_designs.dm" -#include "code\modules\research\prosfab_designs_vr.dm" #include "code\modules\research\protolathe.dm" #include "code\modules\research\rd-readme.dm" #include "code\modules\research\rdconsole.dm" @@ -3987,7 +3985,6 @@ #include "code\modules\research\designs\xenobio_toys.dm" #include "code\modules\research\designs\xenobio_toys_vr.dm" #include "code\modules\research\designs\circuits\ai_modules.dm" -#include "code\modules\research\designs\circuits\ai_modules_vr.dm" #include "code\modules\research\designs\circuits\circuits.dm" #include "code\modules\research\designs\circuits\circuits_vr.dm" #include "code\modules\research\designs\circuits\circuits_yw.dm" @@ -4235,6 +4232,7 @@ #include "code\modules\virus2\helpers.dm" #include "code\modules\virus2\isolator.dm" #include "code\modules\virus2\items_devices.dm" +#include "code\modules\vore\chat_healthbars.dm" #include "code\modules\vore\hook-defs_vr.dm" #include "code\modules\vore\mouseray.dm" #include "code\modules\vore\trycatch_vr.dm"