Ports Goonchat from Baystation. (#9635)

changes:

    rscadd: "Ported a new chat system, Goonchat, that allows for cool things like changing font style, size, spacing, highlighting up to 5 strings in the chat, and DARK MODE."
    rscadd: "Repeated chat messages can now get compacted. You can disable this in goonchat settings."
    rscadd: "You can change icon style to any font on your system."
    tweak: "The game window has been altered a bit to adjust for this."
    rscdel: "Removed skin style prefs as they are no longer used."
This commit is contained in:
Matt Atlas
2020-09-24 22:06:04 +02:00
committed by GitHub
parent a7401aeb1d
commit d4666caaac
277 changed files with 4057 additions and 2955 deletions
+1 -1
View File
@@ -342,7 +342,7 @@
data += list(list(C.ckey, C.address, C.computer_id))
var/data_str = json_encode(data)
to_chat(C, output(list2params(list("E-DAT", data_str, 900)), "greeting.browser:setCookie"))
send_output(C, list2params(list("E-DAT", data_str, 900)), "greeting.browser:setCookie")
#undef BAD_CID
#undef BAD_IP
+2 -2
View File
@@ -64,7 +64,7 @@
ip = query.item[3]
if(!validckey)
if(!banned_mob || (banned_mob && !IsGuestKey(banned_mob.key)))
message_admins("<font color='red'>[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.</font>",1)
message_admins("<span class='warning'>[key_name_admin(usr)] attempted to ban [ckey], but [ckey] has not been seen yet. Please only ban actual players.</span>",1)
return
var/a_ckey
@@ -507,7 +507,7 @@
var/typedesc =""
switch(bantype)
if("PERMABAN")
typedesc = "<font color='red'><b>PERMABAN</b></font>"
typedesc = "<span class='warning'><b>PERMABAN</b></span>"
if("TEMPBAN")
typedesc = "<b>TEMPBAN</b><br><font size='2'>([duration] minutes) [(unbanned || auto) ? "" : "(<a href=\"byond://?src=\ref[src];dbbanedit=duration;dbbanid=[banid]\">Edit</a>)"]<br>Expires [expiration]</font>"
if("JOB_PERMABAN")
+11 -11
View File
@@ -397,7 +397,7 @@ proc/admin_notice(var/message, var/rights)
if(FC.is_admin_channel)
dat+="<B><FONT style='BACKGROUND-COLOR: LightGreen'><A href='?src=\ref[src];ac_show_channel=\ref[FC]'>[FC.channel_name]</A></FONT></B><BR>"
else
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR></B>"
dat+="<B><A href='?src=\ref[src];ac_show_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<span class='warning'>***</span>") : null]<BR></B>"
dat+={"<BR><HR><A href='?src=\ref[src];ac_refresh=1'>Refresh</A>
<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>
"}
@@ -452,7 +452,7 @@ proc/admin_notice(var/message, var/rights)
dat+="<B>[src.admincaster_feed_channel.channel_name]: </B><FONT SIZE=1>\[created by: <FONT COLOR='maroon'>[src.admincaster_feed_channel.author]</FONT>\]</FONT><HR>"
if(src.admincaster_feed_channel.censored)
dat+={"
<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a [current_map.company_name] D-Notice.<BR>
<span class='warning'><B>ATTENTION: </B></span>This channel has been deemed as threatening to the welfare of the station, and marked with a [current_map.company_name] D-Notice.<BR>
No further feed story additions are allowed while the D-Notice is in effect.<BR><BR>
"}
else
@@ -464,7 +464,7 @@ proc/admin_notice(var/message, var/rights)
i++
dat+="<BLOCKQUOTE style=\"padding:4px;border-left:4px #797979 solid\">[MESSAGE.body] <FONT SIZE=1>\[Likes: <A href='?src=\ref[src];ac_setlikes=1;'><FONT COLOR='DarkGreen'>[MESSAGE.likes]</FONT></A> Dislikes: <A href='?src=\ref[src];ac_setdislikes=1;'><FONT COLOR='maroon'>[MESSAGE.dislikes]</FONT></A>\]</FONT><BR>"
if(MESSAGE.img)
to_chat(usr, browse_rsc(MESSAGE.img, "tmp_photo[i].png"))
send_rsc(usr, MESSAGE.img, "tmp_photo[i].png")
dat+="<img src='tmp_photo[i].png' width = '180'><BR><BR>"
dat+="<FONT SIZE=1><A href='?src=\ref[src];ac_view_comments=1;ac_story=\ref[MESSAGE]'>View Comments</A> <A href='?src=\ref[src];ac_add_comment=1;ac_story=\ref[MESSAGE]'>Add Comment</A> <A href='?src=\ref[src];ac_like=1;ac_story=\ref[MESSAGE]'>Like Story</A> <A href='?src=\ref[src];ac_dislike=1;ac_story=\ref[MESSAGE]'>Dislike Story</A></FONT><BR>"
dat+="<FONT SIZE=1>\[Story by <FONT COLOR='maroon'>[MESSAGE.author] - [MESSAGE.time_stamp]</FONT>\]</FONT></BLOCKQUOTE><BR>"
@@ -484,7 +484,7 @@ proc/admin_notice(var/message, var/rights)
else
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR>"
dat+="<A href='?src=\ref[src];ac_pick_censor_channel=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<span class='warning'>***</span>") : null]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Cancel</A>"
if(11)
dat+={"
@@ -498,7 +498,7 @@ proc/admin_notice(var/message, var/rights)
else
for(var/channel in SSnews.network_channels)
var/datum/feed_channel/FC = SSnews.GetFeedChannel(channel)
dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<FONT COLOR='red'>***</FONT>") : null]<BR>"
dat+="<A href='?src=\ref[src];ac_pick_d_notice=\ref[FC]'>[FC.channel_name]</A> [(FC.censored) ? ("<span class='warning'>***</span>") : null]<BR>"
dat+="<BR><A href='?src=\ref[src];ac_setScreen=[0]'>Back</A>"
if(12)
@@ -522,7 +522,7 @@ proc/admin_notice(var/message, var/rights)
"}
if(src.admincaster_feed_channel.censored)
dat+={"
<FONT COLOR='red'><B>ATTENTION: </B></FONT>This channel has been deemed as threatening to the welfare of the station, and marked with a [current_map.company_name] D-Notice.<BR>
<span class='warning'><B>ATTENTION: </B></span>This channel has been deemed as threatening to the welfare of the station, and marked with a [current_map.company_name] D-Notice.<BR>
No further feed story additions are allowed while the D-Notice is in effect.<BR><BR>
"}
else
@@ -580,7 +580,7 @@ proc/admin_notice(var/message, var/rights)
<B>Photo:</B>:
"}
if(SSnews.wanted_issue.img)
to_chat(usr, browse_rsc(SSnews.wanted_issue.img, "tmp_photow.png"))
send_rsc(usr, SSnews.wanted_issue.img, "tmp_photow.png")
dat+="<BR><img src='tmp_photow.png' width = '180'>"
else
dat+="None"
@@ -817,11 +817,11 @@ proc/admin_notice(var/message, var/rights)
if(SSticker.current_state == GAME_STATE_PREGAME)
SSticker.current_state = GAME_STATE_SETTING_UP
log_admin("[usr.key] has started the game.")
message_admins("<font color='blue'>[usr.key] has started the game.</font>")
message_admins("<span class='notice'>[usr.key] has started the game.</span>")
feedback_add_details("admin_verb","SN") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return 1
else
to_chat(usr, "<font color='red'>Error: Start Now: Game has already started.</font>")
to_chat(usr, "<span class='warning'>Error: Start Now: Game has already started.</span>")
return 0
/datum/admins/proc/toggleenter()
@@ -1363,7 +1363,7 @@ proc/admin_notice(var/message, var/rights)
if(check_rights(R_ADMIN|R_MOD))
if (H.paralysis == 0)
msg = "has paralyzed [key_name_admin(H)]."
H.visible_message("<font color='#002eb8'><b>OOC Information:</b></font> <font color='red'>[H] has been winded by a member of staff! Please freeze all roleplay involving their character until the matter is resolved! Adminhelp if you have further questions.</font>", "<font color='red'><b>You have been winded by a member of staff! Please stand by until they contact you!</b></font>")
H.visible_message("<font color='#002eb8'><b>OOC Information:</b></font> <span class='warning'>[H] has been winded by a member of staff! Please freeze all roleplay involving their character until the matter is resolved! Adminhelp if you have further questions.</span>", "<span class='warning'><b>You have been winded by a member of staff! Please stand by until they contact you!</b></span>")
H.paralysis = 8000
else
if (alert("The player is currently winded. Do you want to unwind him?", "Unwind player?", "Yes", "No") == "No")
@@ -1371,7 +1371,7 @@ proc/admin_notice(var/message, var/rights)
H.paralysis = 0
msg = "has unparalyzed [key_name_admin(H)]."
H.visible_message("<font color='#002eb8'><b>OOC Information:</b></font> <font color='green'>[H] has been unwinded by a member of staff!</font>", "<font color='red'><b>You have been unwinded by a member of staff!</b></font>")
H.visible_message("<font color='#002eb8'><b>OOC Information:</b></font> <font color='green'>[H] has been unwinded by a member of staff!</font>", "<span class='warning'><b>You have been unwinded by a member of staff!</b></span>")
log_and_message_admins(msg)
feedback_add_details("admin_verb", "WIND")
+1 -1
View File
@@ -27,7 +27,7 @@ proc/admin_attack_log(var/mob/attacker, var/mob/victim, var/attacker_message, va
victim.attack_log += text("\[[time_stamp()]\] <font color='orange'>[key_name(attacker)] - [victim_message]</font>")
jmp_link = " (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[victim.x];Y=[victim.y];Z=[victim.z]'>JMP</a>)"
if(attacker)
attacker.attack_log += text("\[[time_stamp()]\] <font color='red'>[key_name(victim)] - [attacker_message]</font>")
attacker.attack_log += text("\[[time_stamp()]\] <span class='warning'>[key_name(victim)] - [attacker_message]</span>")
jmp_link = " (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[attacker.x];Y=[attacker.y];Z=[attacker.z]'>JMP</a>)"
msg_admin_attack("[key_name_admin(attacker)] [admin_message] [key_name_admin(victim)] (INTENT: [attacker? uppertext(attacker.a_intent) : "N/A"])[jmp_link]",ckey=key_name(attacker),ckey_target=key_name(victim))
+3 -3
View File
@@ -34,7 +34,7 @@
if("singulo", "telesci") //general one-round-only stuff
var/F = investigate_subject2file(subject)
if(!F)
to_chat(src, "<font color='red'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</font>")
to_chat(src, "<span class='warning'>Error: admin_investigate: [INVESTIGATE_DIR][subject] is an invalid path or cannot be accessed.</span>")
return
src << browse(F,"window=investigate[subject];size=800x300")
@@ -43,8 +43,8 @@
if(href_logfile)
src << browse(href_logfile,"window=investigate[subject];size=800x300")
else
to_chat(src, "<font color='red'>Error: admin_investigate: No href logfile found.</font>")
to_chat(src, "<span class='warning'>Error: admin_investigate: No href logfile found.</span>")
return
else
to_chat(src, "<font color='red'>Error: admin_investigate: Href Logging is not on.</font>")
to_chat(src, "<span class='warning'>Error: admin_investigate: Href Logging is not on.</span>")
return
@@ -1,80 +0,0 @@
/*
* A file containing the admin commands for interfacing with the server_greeting datum.
*/
/client/proc/admin_edit_motd()
set name = "Edit MotD"
set category = "Server"
if (!check_rights(R_SERVER))
return
var/new_message = input(usr, "Please edit the Message of the Day as necessary.", "Message of the Day", server_greeting.motd) as message
if (!new_message)
new_message = "<center>This is a palceholder. Pester your staff to change it!</center>"
server_greeting.update_value("motd", new_message)
message_admins("[ckey] has edited the message of the day:<br>[html_encode(new_message)]")
/client/proc/admin_memo_control(task in list("write", "delete"))
set name = "Edit Memos"
set category = "Server"
if (!check_rights(R_ADMIN))
return
switch (task)
if ("write")
admin_memo_write()
if ("delete")
admin_memo_delete()
/client/proc/admin_memo_write()
var/current_memo = ""
if (server_greeting.memo_list.len && server_greeting.memo_list[ckey])
current_memo = server_greeting.memo_list[ckey]
var/new_memo = input(usr, "Please write your memo.", "Memo", current_memo) as message
if (server_greeting.update_value("memo_write", list(ckey, new_memo)))
to_chat(src, "<span class='notice'>Operation carried out successfully.</span>")
message_admins("[ckey] wrote a new memo:<br>[html_encode(new_memo)]")
else
to_chat(src, "<span class='danger'>Error carrying out desired operation.</span>")
return
/client/proc/admin_memo_delete()
if (!server_greeting.memo_list.len)
to_chat(src, "<span class='notice'>No memos are currently saved.</span>")
return
if (!check_rights(R_SERVER))
if (!server_greeting.memo_list[ckey])
to_chat(src, "<span class='warning'>You do not have a memo saved. Cancelling.</span>")
else if (alert("Do you wish to delete your own memo, written on [server_greeting.memo_list[ckey]["date"]]?", "Choices", "Yes", "No") == "Yes")
if (server_greeting.update_value("memo_delete", ckey))
to_chat(src, "<span class='notice'>Operation carried out successfully.</span>")
message_admins("[ckey] has deleted their own memo.")
else
to_chat(src, "<span class='danger'>Error carrying out desired operation.</span>")
else
to_chat(src, "<span class='notice'>Cancelled.</span>")
return
else
var/input = input(usr, "Whose memo shall we delete?", "Remove Memo", null) as null|anything in server_greeting.memo_list
if (!input)
to_chat(src, "<span class='notice'>Cancelled.</span>")
return
if (server_greeting.update_value("memo_delete", input))
to_chat(src, "<span class='notice'>Operation carried out successfully.</span>")
message_admins("[ckey] has deleted the memo of [input].")
else
to_chat(src, "<span class='danger'>Error carrying out desired operation.</span>")
return
+3 -7
View File
@@ -48,7 +48,6 @@ var/list/admin_verbs_admin = list(
/client/proc/rename_silicon, //properly renames silicons,
/client/proc/manage_silicon_laws, // Allows viewing and editing silicon laws. ,
/client/proc/check_antagonists,
/client/proc/admin_memo_control, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
/client/proc/toggleprayers, /*toggles prayers on/off*/
// /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/
@@ -172,7 +171,6 @@ var/list/admin_verbs_server = list(
/client/proc/toggle_random_events,
/client/proc/check_customitem_activity,
/client/proc/nanomapgen_DumpImage,
/client/proc/admin_edit_motd,
/client/proc/toggle_recursive_explosions,
/client/proc/restart_controller,
/client/proc/cmd_ss_panic,
@@ -273,7 +271,6 @@ var/list/admin_verbs_hideable = list(
/client/proc/toggle_antagHUD_use,
/client/proc/toggle_antagHUD_restrictions,
/client/proc/event_manager_panel,
/client/proc/admin_edit_motd,
/client/proc/empty_ai_core_toggle_latejoin,
/client/proc/empty_ai_core_toggle_latejoin,
/client/proc/cmd_admin_change_custom_event,
@@ -301,7 +298,6 @@ var/list/admin_verbs_hideable = list(
/client/proc/add_client_color,
/datum/admins/proc/force_mode_latespawn,
/datum/admins/proc/toggleenter,
/client/proc/admin_memo_control,
/datum/admins/proc/toggleguests,
/datum/admins/proc/capture_map_part,
/client/proc/Set_Holiday,
@@ -569,13 +565,13 @@ var/list/admin_verbs_cciaa = list(
ghost.reenter_corpse()
log_admin("[src] reentered their corpose using aghost.",admin_key=key_name(src))
else
to_chat(ghost, "<font color='red'>Error: Aghost: Can't reenter corpse.</font>")
to_chat(ghost, "<span class='warning'>Error: Aghost: Can't reenter corpse.</span>")
return
feedback_add_details("admin_verb","P") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
else if(istype(mob,/mob/abstract/new_player))
to_chat(src, "<font color='red'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</font>")
to_chat(src, "<span class='warning'>Error: Aghost: Can't admin-ghost whilst in the lobby. Join or Observe first.</span>")
else
//ghostize
var/mob/body = mob
@@ -728,7 +724,7 @@ var/list/admin_verbs_cciaa = list(
C.cure_all_traumas(TRUE, CURE_ADMIN)
log_and_message_admins("<span class='notice'>cured [key_name(C)]'s traumas.</span>")
feedback_add_details("admin_verb","TB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!\
feedback_add_details("admin_verb","TB") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/add_traumas(mob/T as mob in mob_list)
set category = "Fun"
+3 -3
View File
@@ -87,13 +87,13 @@ NOTE: It checks usr by default. Supply the "user" argument if you wish to check
return 1
else
if(show_msg)
to_chat(user, "<font color='red'>Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].</font>")
to_chat(user, "<span class='warning'>Error: You do not have sufficient rights to do that. You require one of the following flags:[rights2text(rights_required," ")].</span>")
else
if(user.client.holder)
return 1
else
if(show_msg)
to_chat(user, "<font color='red'>Error: You are not an admin.</font>")
to_chat(user, "<span class='warning'>Error: You are not an admin.</span>")
return 0
//probably a bit iffy - will hopefully figure out a better solution
@@ -105,7 +105,7 @@ NOTE: It checks usr by default. Supply the "user" argument if you wish to check
if(usr.client.holder.rights != other.holder.rights)
if( (usr.client.holder.rights & other.holder.rights) == other.holder.rights )
return 1 //we have all the rights they have and more
to_chat(usr, "<font color='red'>Error: Cannot proceed. They have more or equal rights to us.</font>")
to_chat(usr, "<span class='warning'>Error: Cannot proceed. They have more or equal rights to us.</span>")
return 0
/client/proc/deadmin()
+3 -3
View File
@@ -24,7 +24,7 @@
var/cap = generate_image(tx ,ty ,tz ,range, CAPTURE_MODE_PARTIAL, null, ligths, 1)
var/file_name = "map_capture_x[tx]_y[ty]_z[tz]_r[range].png"
to_chat(usr, "Saved capture in cache as [file_name].")
to_chat(usr, browse_rsc(cap, file_name))
send_rsc(usr, cap, file_name)
else
to_chat(usr, "Target coordinates are incorrect.")
@@ -33,7 +33,7 @@
var/cap = generate_image(currentx ,currenty ,currentz ,16, CAPTURE_MODE_PARTIAL, null, ligths, 1)
var/file_name = "map_capture_x[currentx]_y[currenty]_z[currentz]_r16.png"
to_chat(usr, "Saved capture in cache as [file_name].")
to_chat(usr, browse_rsc(cap, file_name))
send_rsc(usr, cap, file_name)
currentx = currentx + 16
spawn (6)
del(cap)
@@ -45,7 +45,7 @@
var/cap = generate_image(currentx ,currenty ,currentz ,16, CAPTURE_MODE_PARTIAL, null, ligths, 1)
var/file_name = "map_capture_x[currentx]_y[currenty]_z[currentz]_r16.png"
to_chat(usr, "Saved capture in cache as [file_name].")
to_chat(usr, browse_rsc(cap, file_name))
send_rsc(usr, cap, file_name)
currentx = currentx + 16
spawn (6)
del(cap)
+1 -1
View File
@@ -10,7 +10,7 @@ datum/admins/proc/notes_show(var/ckey)
datum/admins/proc/notes_gethtml(var/ckey)
var/savefile/notesfile = new(NOTESFILE)
if(!notesfile) return "<font color='red'>Error: Cannot access [NOTESFILE]</font>"
if(!notesfile) return "<span class='warning'>Error: Cannot access [NOTESFILE]</span>"
if(ckey)
. = "<b>Notes for <a href='?src=\ref[src];notes=show'>[ckey]</a>:</b> <a href='?src=\ref[src];notes=add;ckey=[ckey]'>\[+\]</a> <a href='?src=\ref[src];notes=remove;ckey=[ckey]'>\[-\]</a><br>"
notesfile.cd = "/[ckey]"
+3 -3
View File
@@ -827,7 +827,7 @@
//Job + antagonist
if(M.mind)
special_role_description = "Role: <b>[M.mind.assigned_role]</b>; Antagonist: <font color='red'><b>[M.mind.special_role]</b></font>; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]"
special_role_description = "Role: <b>[M.mind.assigned_role]</b>; Antagonist: <span class='warning'><b>[M.mind.special_role]</b></span>; Has been rev: [(M.mind.has_been_rev)?"Yes":"No"]"
else
special_role_description = "Role: <i>Mind datum missing</i> Antagonist: <i>Mind datum missing</i>; Has been rev: <i>Mind datum missing</i>;"
@@ -838,7 +838,7 @@
switch (M.stat)
if (0) status = "Alive"
if (1) status = "<font color='orange'><b>Unconscious</b></font>"
if (2) status = "<font color='red'><b>Dead</b></font>"
if (2) status = "<span class='warning'><b>Dead</b></span>"
health_description = "Status: [status]"
health_description += "<BR>Oxy: [L.getOxyLoss()] - Tox: [L.getToxLoss()] - Fire: [L.getFireLoss()] - Brute: [L.getBruteLoss()] - Clone: [L.getCloneLoss()] - Brain: [L.getBrainLoss()]"
else
@@ -853,7 +853,7 @@
//GenDer
switch(M.gender)
if(MALE,FEMALE) gender_description = "[M.gender]"
else gender_description = "<font color='red'><b>[M.gender]</b></font>"
else gender_description = "<span class='warning'><b>[M.gender]</b></span>"
var/dat = "<b>Info about [M.name]:</b><br>"
dat += "Mob type: [M.type]<br>"
+10 -10
View File
@@ -13,27 +13,27 @@
data += "<b>If you do not know what these do, you shouldn't be touching them!</b><hr>"
data += "<h2>Hub Visibility Setting:</h2><br>"
data += "Currently [world.visibility ? "<font color='green'>VISIBLE</font>" : "<font color='red'>HIDDEN</font>"]. <a href='?_src_=holder;access_control=hub'>Toggle</a><br><hr>"
data += "Currently [world.visibility ? "<font color='green'>VISIBLE</font>" : "<span class='warning'>HIDDEN</span>"]. <a href='?_src_=holder;access_control=hub'>Toggle</a><br><hr>"
data += "<h2>IP Intel Settings:</h2><br><ul>"
data += "<li>Current warning level: [config.ipintel_rating_bad ? "[config.ipintel_rating_bad]" : "<font color='red'>DISABLED</font>"]. <a href='?_src_=holder;access_control=intel_bad'>Edit</a></li>"
data += "<li>Current kick level: [config.ipintel_rating_kick ? "[config.ipintel_rating_kick]" : "<font color='red'>DISABLED</font>"]. <a href='?_src_=holder;access_control=intel_kick'>Edit</a></li>"
data += "<li>Current warning level: [config.ipintel_rating_bad ? "[config.ipintel_rating_bad]" : "<span class='warning'>DISABLED</span>"]. <a href='?_src_=holder;access_control=intel_bad'>Edit</a></li>"
data += "<li>Current kick level: [config.ipintel_rating_kick ? "[config.ipintel_rating_kick]" : "<span class='warning'>DISABLED</span>"]. <a href='?_src_=holder;access_control=intel_kick'>Edit</a></li>"
data += "</ul><hr>"
data += "<h2>Player Age Settings:</h2><br><ul>"
data += "<li>New players: [config.access_deny_new_players ? "<font color='red'>DENIED</font>" : "<font color='green'>ALLOWED</font>"]. <a href='?_src_=holder;access_control=new_players;'>Toggle</a></li>"
data += "<li>Account age restriction: [config.access_deny_new_accounts == -1 ? "<font color='red'>DISABLED</font>" : "[config.access_deny_new_accounts] DAYS"]. <a href='?_src_=holder;access_control=new_accounts;'>Edit</a></li>"
data += "<li>New players: [config.access_deny_new_players ? "<span class='warning'>DENIED</span>" : "<font color='green'>ALLOWED</font>"]. <a href='?_src_=holder;access_control=new_players;'>Toggle</a></li>"
data += "<li>Account age restriction: [config.access_deny_new_accounts == -1 ? "<span class='warning'>DISABLED</span>" : "[config.access_deny_new_accounts] DAYS"]. <a href='?_src_=holder;access_control=new_accounts;'>Edit</a></li>"
data += "</ul><hr>"
data += "<h2>VM Detection Settings:</h2><br><ul>"
data += "<li>VM identifier count to warn on: [config.access_warn_vms ? "[config.access_warn_vms]" : "<font color='red'>DISABLED</font>"]. <a href='?_src_=holder;access_control=vm_warn;'>Edit</a></li>"
data += "<li>VM identifier count to kick on: [config.access_deny_vms ? "[config.access_deny_vms]" : "<font color='red'>DISABLED</font>"]. <a href='?_src_=holder;access_control=vm_kick;'>Edit</a></li>"
data += "<li>VM identifier count to warn on: [config.access_warn_vms ? "[config.access_warn_vms]" : "<span class='warning'>DISABLED</span>"]. <a href='?_src_=holder;access_control=vm_warn;'>Edit</a></li>"
data += "<li>VM identifier count to kick on: [config.access_deny_vms ? "[config.access_deny_vms]" : "<span class='warning'>DISABLED</span>"]. <a href='?_src_=holder;access_control=vm_kick;'>Edit</a></li>"
data += "</ul>"
data += "<h2>Guest join settings:</h2><br><ul>"
data += "<li>Guests [(config.guests_allowed || config.external_auth) ? "<font color='green'>CAN</font>" : "<font color='red'>CAN NOT</font>"] join.</li>"
data += "<li>Guests [config.guests_allowed ? "<font color='green'>CAN</font>" : "<font color='red'>CAN NOT</font>"] play. <a href='?_src_=holder;access_control=guest;'>Toggle</a></li>"
data += "<li>External authetification: [config.external_auth ? "<font color='green'>ENABLED</font>" : "<font color='red'>DISABLED</font>"]. <a href='?_src_=holder;access_control=external_auth;'>Toggle</a></li>"
data += "<li>Guests [(config.guests_allowed || config.external_auth) ? "<font color='green'>CAN</font>" : "<span class='warning'>CAN NOT</span>"] join.</li>"
data += "<li>Guests [config.guests_allowed ? "<font color='green'>CAN</font>" : "<span class='warning'>CAN NOT</span>"] play. <a href='?_src_=holder;access_control=guest;'>Toggle</a></li>"
data += "<li>External authetification: [config.external_auth ? "<font color='green'>ENABLED</font>" : "<span class='warning'>DISABLED</span>"]. <a href='?_src_=holder;access_control=external_auth;'>Toggle</a></li>"
data += "</ul>"
config_window.set_user(src.mob)
+2 -2
View File
@@ -111,7 +111,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
//Options bar: mob, details ( admin = 2, undibbsed admin = 3, mentor = 4, character name (0 = just ckey, 1 = ckey and character name), link? (0 no don't make it a link, 1 do so),
// highlight special roles (0 = everyone has same looking name, 1 = antags / special roles get a golden name)
msg = "<span class='notice'><b><font color=red>HELP: </font>[get_options_bar(mob, 2, 1, 1, 1, ticket)] (<a href='?_src_=holder;take_ticket=\ref[ticket]'>[(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]</a>) (<a href='?src=\ref[usr];close_ticket=\ref[ticket]'>CLOSE</a>):</b> [msg]</span>"
msg = "<span class='notice'><b>[create_text_tag("HELP")][get_options_bar(mob, 2, 1, 1, 1, ticket)] (<a href='?_src_=holder;take_ticket=\ref[ticket]'>[(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]</a>) (<a href='?src=\ref[usr];close_ticket=\ref[ticket]'>CLOSE</a>):</b> [msg]</span>"
var/admin_number_present = 0
var/admin_number_afk = 0
@@ -128,7 +128,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
to_chat(C, msg)
//show it to the person adminhelping too
to_chat(src, "<font color='blue'>PM to-<b>Staff </b>: [original_msg]</font>")
to_chat(src, "<span class='notice'>PM to-<b>Staff </b>: [original_msg]</span>")
var/admin_number_active = admin_number_present - admin_number_afk
log_admin("HELP: [key_name(src)]: [original_msg] - heard by [admin_number_present] non-AFK admins.",admin_key=key_name(src))
+16 -16
View File
@@ -3,7 +3,7 @@
set category = null
set name = "Admin PM Mob"
if(!holder)
to_chat(src, "<font color='red'>Error: Admin-PM-Context: Only administrators may use this command.</font>")
to_chat(src, "<span class='warning'>Error: Admin-PM-Context: Only administrators may use this command.</span>")
return
if( !ismob(M) || !M.client ) return
cmd_admin_pm(M.client,null)
@@ -14,7 +14,7 @@
set category = "Admin"
set name = "Admin PM"
if(!holder)
to_chat(src, "<font color='red'>Error: Admin-PM-Panel: Only administrators may use this command.</font>")
to_chat(src, "<span class='warning'>Error: Admin-PM-Panel: Only administrators may use this command.</span>")
return
var/list/client/targets[0]
for(var/p in clients)
@@ -41,8 +41,8 @@
/client/proc/cmd_admin_pm(var/client/C, var/msg = null, var/datum/ticket/ticket = null)
if(!istype(C, /client))
if(holder) to_chat(src, "<font color='red'>Error: Private-Message: Client not found.</font>")
else to_chat(src, "<font color='red'>Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!</font>")
if(holder) to_chat(src, "<span class='warning'>Error: Private-Message: Client not found.</span>")
else to_chat(src, "<span class='warning'>Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!</span>")
return
var/receive_pm_type = "Player"
@@ -66,9 +66,9 @@
return
if(!C)
if(holder)
to_chat(src, "<font color='red'>Error: Admin-PM: Client not found.</font>")
to_chat(src, "<span class='warning'>Error: Admin-PM: Client not found.</span>")
else
to_chat(src, "<font color='red'>Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!</font>")
to_chat(src, "<span class='warning'>Error: Private-Message: Client not found. They may have lost connection, so try using an adminhelp!</span>")
return
if(!check_rights(R_SERVER|R_DEBUG|R_DEV, 0))
@@ -125,21 +125,21 @@
adminhelp(reply) //sender has left, adminhelp instead
return
var/sender_message = "<span class='pm'><span class='out'>" + create_text_tag("pm_out_alt", "PM", src) + " to <span class='name'>[get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]</span>"
var/sender_message = "<span class='pm'><span class='out'>" + create_text_tag("PM <-", src) + " to <span class='name'>[get_options_bar(C, holder ? 1 : 0, holder ? 1 : 0, 1)]</span>"
if(holder)
sender_message += " (<a href='?_src_=holder;take_ticket=\ref[ticket]'>[(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]</a>) (<a href='?src=\ref[usr];close_ticket=\ref[ticket]'>CLOSE</a>)"
sender_message += ": <span class='message'>[generate_ahelp_key_words(mob, msg)]</span>"
sender_message += ": <span class='message linkify'>[generate_ahelp_key_words(mob, msg)]</span>"
else
sender_message += ": <span class='message'>[msg]</span>"
sender_message += ": <span class='message linkify'>[msg]</span>"
sender_message += "</span></span>"
to_chat(src, sender_message)
var/receiver_message = "<span class='pm'><span class='in'>" + create_text_tag("pm_in", "", C) + " <b>\[[receive_pm_type] PM\]</b> <span class='name'>[get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]</span>"
var/receiver_message = "<span class='pm'><span class='in'>" + create_text_tag("PM ->", C) + " <b>\[[receive_pm_type] PM\]</b> <span class='name'>[get_options_bar(src, C.holder ? 1 : 0, C.holder ? 1 : 0, 1)]</span>"
if(C.holder)
receiver_message += " (<a href='?_src_=holder;take_ticket=\ref[ticket]'>[(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]</a>) (<a href='?src=\ref[usr];close_ticket=\ref[ticket]'>CLOSE</a>)"
receiver_message += ": <span class='message'>[generate_ahelp_key_words(C.mob, msg)]</span>"
receiver_message += ": <span class='message linkify'>[generate_ahelp_key_words(C.mob, msg)]</span>"
else
receiver_message += ": <span class='message'>[msg]</span>"
receiver_message += ": <span class='message linkify'>[msg]</span>"
receiver_message += "</span></span>"
to_chat(C, receiver_message)
@@ -159,11 +159,11 @@
if(X == C || X == src)
continue
if(X.key != key && X.key != C.key && (X.holder.rights & (R_ADMIN|R_MOD)))
to_chat(X, "<span class='pm'><span class='other'>" + create_text_tag("pm_other", "PM:", X) + " <span class='name'>[key_name(src, X, 0, ticket)]</span> to <span class='name'>[key_name(C, X, 0, ticket)]</span> (<a href='?_src_=holder;take_ticket=\ref[ticket]'>[(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]</a>) (<a href='?src=\ref[usr];close_ticket=\ref[ticket]'>CLOSE</a>): <span class='message'>[msg]</span></span></span>")
to_chat(X, "<span class='pm'><span class='other'>" + create_text_tag("PM <->", X) + " <span class='name'>[key_name(src, X, 0, ticket)]</span> to <span class='name'>[key_name(C, X, 0, ticket)]</span> (<a href='?_src_=holder;take_ticket=\ref[ticket]'>[(ticket.status == TICKET_OPEN) ? "TAKE" : "JOIN"]</a>) (<a href='?src=\ref[usr];close_ticket=\ref[ticket]'>CLOSE</a>): <span class='message linkify'>[msg]</span></span></span>")
/client/proc/cmd_admin_discord_pm(sender)
if(prefs.muted & MUTE_ADMINHELP)
to_chat(src, "<font color='red'>Error: Private-Message: You are unable to use PM-s (muted).</font>")
to_chat(src, "<span class='warning'>Error: Private-Message: You are unable to use PM-s (muted).</span>")
return
var/msg = input(src,"Message:", "Reply private message to [sender] on Discord") as text|null
@@ -177,7 +177,7 @@
post_webhook_event(WEBHOOK_ADMIN_PM, list("title"="Help is requested", "message"="PlayerPM to **[discord_escape(sender)]** from **[discord_escape(key_name(src))]**: ```[discord_escape(html_decode(msg))]```"))
discord_bot.send_to_admins("PlayerPM to [discord_escape(sender)] from [discord_escape(key_name(src))]: [discord_escape(html_decode(msg))]")
to_chat(src, "<span class='pm'><span class='out'>" + create_text_tag("pm_out_alt", "", src) + " to <span class='name'>Discord-[sender]</span>: <span class='message'>[msg]</span></span></span>")
to_chat(src, "<span class='pm'><span class='out'>" + create_text_tag("PM <-", src) + " to <span class='name'>Discord-[sender]</span>: <span class='message linkify'>[msg]</span></span></span>")
log_admin("PM: [key_name(src)]->Discord-[sender]: [msg]")
for(var/s in staff)
@@ -185,4 +185,4 @@
if(C == src)
continue
if(C.holder.rights & (R_ADMIN|R_MOD))
to_chat(C, "<span class='pm'><span class='other'>" + create_text_tag("pm_other", "PM:", C) + " <span class='name'>[key_name(src, C, 0)]</span> to <span class='name'>Discord-[sender]</span>: <span class='message'>[msg]</span></span></span>")
to_chat(C, "<span class='pm'><span class='other'>" + create_text_tag("PM <->", C) + " <span class='name'>[key_name(src, C, 0)]</span> to <span class='name'>Discord-[sender]</span>: <span class='message linkify'>[msg]</span></span></span>")
+4 -4
View File
@@ -13,7 +13,7 @@
for(var/s in staff)
var/client/C = s
if(R_ADMIN & C.holder.rights)
to_chat(C, "<span class='admin_channel'>" + create_text_tag("admin", "ADMIN:", C) + " <span class='name'>[key_name(usr, 1)]</span>([admin_jump_link(mob, src)]): <span class='message'>[msg]</span></span>")
to_chat(C, "<span class='admin_channel'>" + create_text_tag("ADMIN", C) + " <span class='name'>[key_name(usr, 1)]</span>([admin_jump_link(mob, src)]): <span class='message linkify'>[msg]</span></span>")
feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -36,7 +36,7 @@
for(var/s in staff)
var/client/C = s
if ((R_ADMIN|R_MOD) & C.holder.rights)
to_chat(C, "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>(<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message'>[msg]</span></span>")
to_chat(C, "<span class='mod_channel'>" + create_text_tag("MOD", C) + " <span class='name'>[sender_name]</span>(<A HREF='?src=\ref[C.holder];adminplayerobservejump=\ref[mob]'>JMP</A>): <span class='message linkify'>[msg]</span></span>")
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -53,7 +53,7 @@
log_admin("DEV: [key_name(src)] : [msg]",admin_key=key_name(src))
if(check_rights(R_DEV,0))
msg = "<span class='devsay'><span class='prefix'>DEV:</span> <EM>[key_name(usr, 0, 1, 0)]</EM>: <span class='message'>[msg]</span></span>"
msg = "<span class='devsay'>[create_text_tag("DEV")] <EM>[key_name(usr, 0, 1, 0)]</EM>: <span class='message linkify'>[msg]</span></span>"
for(var/s in staff)
var/client/C = s
if(C.holder.rights & (R_ADMIN|R_DEV))
@@ -72,7 +72,7 @@
log_admin("CCIASAY: [key_name(src)] : [msg]",admin_key=key_name(src))
if(check_rights((R_CCIAA|R_ADMIN),0))
msg = "<span class='cciaasay'><span class='prefix'>CCIAAgent:</span> <EM>[key_name(usr, 0, 1, 0)]</EM>: <span class='message'>[msg]</span></span>"
msg = "<span class='cciaasay'><span class='prefix'>CCIAAgent:</span> <EM>[key_name(usr, 0, 1, 0)]</EM>: <span class='message linkify'>[msg]</span></span>"
for(var/s in staff)
var/client/C = s
if(C.holder.rights & (R_ADMIN|R_CCIAA))
+2 -2
View File
@@ -22,9 +22,9 @@
for(var/mob/M in mob_list)
if (check_rights(R_ADMIN|R_MOD|R_CCIAA, 0, M) && M.client.aooc_mute_holder_check() == FALSE)
to_chat(M, "<font color='#960018'><span class='ooc'>" + create_text_tag("aooc", "Antag-OOC:", M.client) + " <EM>[get_options_bar(src, 0, 1, 1)](<A HREF='?_src_=holder;adminplayerobservejump=\ref[src.mob]'>JMP</A>):</EM> <span class='message'>[msg]</span></span></font>")
to_chat(M, "<font color='#960018'><span class='ooc'>" + create_text_tag("A-OOC", M.client) + " <EM>[get_options_bar(src, 0, 1, 1)](<A HREF='?_src_=holder;adminplayerobservejump=\ref[src.mob]'>JMP</A>):</EM> <span class='message linkify'>[msg]</span></span></font>")
else if (M.mind && M.mind.special_role && M.client)
to_chat(M, "<font color='#960018'><span class='ooc'>" + create_text_tag("aooc", "Antag-OOC:", M.client) + " <EM>[display_name]:</EM> <span class='message'>[msg]</span></span></font>")
to_chat(M, "<font color='#960018'><span class='ooc'>" + create_text_tag("A-OOC", M.client) + " <EM>[display_name]:</EM> <span class='message linkify'>[msg]</span></span></font>")
log_ooc("(ANTAG) [key] : [msg]",ckey=key_name(mob))
+1 -1
View File
@@ -27,6 +27,6 @@
if (!msg)
return
say_dead_direct("<span class='name'>[stafftype]([src.holder.fakekey ? src.holder.fakekey : src.key])</span> says, <span class='message'>\"[msg]\"</span>")
say_dead_direct("<span class='name'>[stafftype]([src.holder.fakekey ? src.holder.fakekey : src.key])</span> says, <span class='message linkify'>\"[msg]\"</span>")
feedback_add_details("admin_verb","D") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+3 -3
View File
@@ -24,16 +24,16 @@
set category = null
if(!src.holder)
to_chat(src, "<font color='red'>Only Admins may use this command.</font>")
to_chat(src, "<span class='warning'>Only Admins may use this command.</span>")
return
var/client/target = input(src,"Choose somebody to grant access to the server's runtime logs (permissions expire at the end of each round):","Grant Permissions",null) as null|anything in clients
if(!istype(target,/client))
to_chat(src, "<font color='red'>Error: giveruntimelog(): Client not found.</font>")
to_chat(src, "<span class='warning'>Error: giveruntimelog(): Client not found.</span>")
return
target.verbs |= /client/proc/getruntimelog
to_chat(target, "<font color='red'>You have been granted access to runtime logs. Please use them responsibly or risk being banned.</font>")
to_chat(target, "<span class='warning'>You have been granted access to runtime logs. Please use them responsibly or risk being banned.</span>")
return
+3 -3
View File
@@ -81,13 +81,13 @@ var/intercom_range_display_status = 0
for(var/obj/machinery/camera/C1 in CL)
if(C1.c_tag == null)
output += "<li><font color='red'>null c_tag for sec camera at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc])</font></li>"
output += "<li><span class='warning'>null c_tag for sec camera at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc])</span></li>"
for(var/obj/machinery/camera/C2 in CL)
if(C1 != C2)
if(C1.c_tag == C2.c_tag)
output += "<li><font color='red'>c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]</font></li>"
output += "<li><span class='warning'>c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]</span></li>"
if(C1.loc == C2.loc && C1.dir == C2.dir && C1.pixel_x == C2.pixel_x && C1.pixel_y == C2.pixel_y)
output += "<li><font color='red'>FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</font></li>"
output += "<li><span class='warning'>FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</span></li>"
if(C1.loc == C2.loc)
output += "<li>overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]</font></li>"
var/turf/T = get_step(C1,turn(C1.dir,180))
+1 -1
View File
@@ -72,7 +72,7 @@
else if(isicon(var_value))
to_chat(usr, "Variable appears to be <b>ICON</b>.")
var_value = "\icon[var_value]"
var_value = "[icon2html(var_value, usr)]"
default = "icon"
else if(istype(var_value,/atom) || istype(var_value,/datum))
+3 -3
View File
@@ -239,7 +239,7 @@ var/list/VVdynamic_lock = list(
else if(isicon(variable))
to_chat(usr, "Variable appears to be <b>ICON</b>.")
variable = "\icon[variable]"
variable = "[icon2html(variable, usr)]"
default = "icon"
else if(istype(variable,/atom) || istype(variable,/datum))
@@ -458,7 +458,7 @@ var/list/VVdynamic_lock = list(
else if(isicon(var_value))
to_chat(usr, "Variable appears to be <b>ICON</b>.")
var_value = "\icon[var_value]"
var_value = "[icon2html(var_value, usr)]"
class = "icon"
else if(istype(var_value,/atom) || istype(var_value,/datum))
@@ -520,7 +520,7 @@ var/list/VVdynamic_lock = list(
else if(isicon(var_value))
to_chat(usr, "Variable appears to be <b>ICON</b>.")
var_value = "\icon[var_value]"
var_value = "[icon2html(var_value, usr)]"
default = "icon"
else if(istype(var_value,/atom) || istype(var_value,/datum))
+1 -1
View File
@@ -13,7 +13,7 @@
return
var/image/cross = image('icons/obj/storage.dmi',"bible")
msg = "<span class='notice'>\icon[cross] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]</span>"
msg = "<span class='notice'>[icon2html(cross, src)] <b><font color=purple>PRAY: </font>[key_name(src, 1)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[src]'>?</A>) (<A HREF='?_src_=holder;adminplayeropts=\ref[src]'>PP</A>) (<A HREF='?_src_=vars;Vars=\ref[src]'>VV</A>) (<A HREF='?_src_=holder;subtlemessage=\ref[src]'>SM</A>) ([admin_jump_link(src, src)]) (<A HREF='?_src_=holder;secretsadmin=check_antagonist'>CA</A>) (<A HREF='?_src_=holder;adminspawncookie=\ref[src]'>SC</a>):</b> [msg]</span>"
for(var/s in staff)
var/client/C = s
+5 -5
View File
@@ -190,12 +190,12 @@ proc/cmd_admin_mute(mob/M as mob, mute_type, automute = 0)
if(!usr || !usr.client)
return
if(!usr.client.holder)
to_chat(usr, "<font color='red'>Error: cmd_admin_mute: You don't have permission to do this.</font>")
to_chat(usr, "<span class='warning'>Error: cmd_admin_mute: You don't have permission to do this.</span>")
return
if(!M.client)
to_chat(usr, "<font color='red'>Error: cmd_admin_mute: This mob doesn't have a client tied to it.</font>")
to_chat(usr, "<span class='warning'>Error: cmd_admin_mute: This mob doesn't have a client tied to it.</span>")
if(M.client.holder)
to_chat(usr, "<font color='red'>Error: cmd_admin_mute: You cannot mute an admin/mod.</font>")
to_chat(usr, "<span class='warning'>Error: cmd_admin_mute: You cannot mute an admin/mod.</span>")
if(!M.client) return
if(M.client.holder) return
@@ -430,7 +430,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
break
if(!G_found)//If a ghost was not found.
to_chat(usr, "<font color='red'>There is no active key like that in the game or the person is not currently a ghost.</font>")
to_chat(usr, "<span class='warning'>There is no active key like that in the game or the person is not currently a ghost.</span>")
return
var/mob/living/carbon/human/new_character = new(pick(latejoin))//The mob being spawned.
@@ -629,7 +629,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
command_announcement.Announce("[reportbody]", reporttitle, new_sound = 'sound/AI/commandreport.ogg', msg_sanitized = 1);
if("No")
to_world("<span class='warning'>New [current_map.company_name] Update available at all communication consoles.</span>")
to_world(sound('sound/AI/commandreport.ogg'))
sound_to(world, ('sound/AI/commandreport.ogg'))
log_admin("[key_name(src)] has created a command report: [reportbody]",admin_key=key_name(usr))
message_admins("[key_name_admin(src)] has created a command report", 1)
+6 -6
View File
@@ -11,7 +11,7 @@
establish_db_connection(dbcon)
if (!dbcon.IsConnected())
to_chat(usr, "<font color='red'>Error: warn(): Database Connection failed, reverting to legacy systems.</font>")
to_chat(usr, "<span class='warning'>Error: warn(): Database Connection failed, reverting to legacy systems.</span>")
usr.client.warn_legacy(warned_ckey)
return
@@ -50,7 +50,7 @@
feedback_add_details("admin_verb", "WARN-DB")
if (C)
to_chat(C, "<font color='red'><BIG><B>You have been warned by an administrator.</B></BIG><br>Click <a href='byond://?src=\ref[src];warnview=1'>here</a> to review and acknowledge them!</font>")
to_chat(C, "<span class='warning'><BIG><B>You have been warned by an administrator.</B></BIG><br>Click <a href='byond://?src=\ref[src];warnview=1'>here</a> to review and acknowledge them!</span>")
message_admins("[key_name_admin(src)] has warned [warned_ckey] for: [warning_reason].")
@@ -63,7 +63,7 @@
/client/proc/warn_legacy(warned_ckey)
if (!warned_ckey)
to_chat(usr, "<font color='red'>Error: warn_legacy(): No ckey passed!</font>")
to_chat(usr, "<span class='warning'>Error: warn_legacy(): No ckey passed!</span>")
return
var/datum/preferences/D
@@ -72,14 +72,14 @@
else D = preferences_datums[warned_ckey]
if(!D)
to_chat(src, "<font color='red'>Error: warn_legacy(): No such ckey found.</font>")
to_chat(src, "<span class='warning'>Error: warn_legacy(): No such ckey found.</span>")
return
if(++D.warns >= MAX_WARNS) //uh ohhhh...you'reee iiiiin trouuuubble O:)
ban_unban_log_save("[ckey] warned [warned_ckey], resulting in a [AUTOBANTIME] minute autoban.")
if(C)
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)] resulting in a [AUTOBANTIME] minute ban.")
to_chat(C, "<font color='red'><BIG><B>You have been autobanned due to a warning by [ckey].</B></BIG><br>This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.</font>")
to_chat(C, "<span class='warning'><BIG><B>You have been autobanned due to a warning by [ckey].</B></BIG><br>This is a temporary ban, it will be removed in [AUTOBANTIME] minutes.</span>")
qdel(C)
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] resulting in a [AUTOBANTIME] minute ban.")
@@ -87,7 +87,7 @@
feedback_inc("ban_warn",1)
else
if(C)
to_chat(C, "<font color='red'><BIG><B>You have been warned by an administrator.</B></BIG><br>Further warnings will result in an autoban.</font>")
to_chat(C, "<span class='warning'><BIG><B>You have been warned by an administrator.</B></BIG><br>Further warnings will result in an autoban.</span>")
message_admins("[key_name_admin(src)] has warned [key_name_admin(C)]. They have [MAX_WARNS-D.warns] strikes remaining.")
else
message_admins("[key_name_admin(src)] has warned [warned_ckey] (DC). They have [MAX_WARNS-D.warns] strikes remaining.")
@@ -24,9 +24,9 @@
var/atom/A = D
if(A.icon && A.icon_state)
sprite = icon(A.icon, A.icon_state)
to_chat(usr, browse_rsc(sprite, "view_vars_sprite.png"))
send_rsc(usr, sprite, "view_vars_sprite.png")
to_chat(usr, browse_rsc('code/js/view_variables.js', "view_variables.js"))
send_rsc(usr, 'code/js/view_variables.js', "view_variables.js")
var/html = {"
<html>
+1 -1
View File
@@ -58,7 +58,7 @@
return
/obj/item/device/onetankbomb/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
visible_message("[icon2html(src, viewers(get_turf(src)))] *beep* *beep*", "*beep* *beep*")
sleep(10)
if(!src)
return
+1 -1
View File
@@ -196,7 +196,7 @@
process_activation(var/obj/D, var/normal = 1, var/special = 1)
if(!D) return 0
if(!secured)
visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
visible_message("[icon2html(src, viewers(get_turf(src)))] *beep* *beep*", "*beep* *beep*")
if((normal) && (a_right) && (a_left))
if(a_right != D)
a_right.pulsed(0)
+1 -1
View File
@@ -101,7 +101,7 @@
if((!secured)||(!on)||(cooldown > 0)) return 0
pulse(0)
if(!holder)
visible_message("\icon[src] *beep* *beep*")
visible_message("[icon2html(src, viewers(get_turf(src)))] *beep* *beep*")
cooldown = 2
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
return
+1 -3
View File
@@ -52,12 +52,10 @@
sense()
var/turf/mainloc = get_turf(src)
// if(scanning && cooldown <= 0)
// mainloc.visible_message("\icon[src] *boop* *boop*", "*boop* *boop*")
if((!holder && !secured)||(!scanning)||(cooldown > 0)) return 0
pulse(0)
if(!holder)
mainloc.visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
mainloc.visible_message("[icon2html(src, viewers(get_turf(src)))] *beep* *beep*", "*beep* *beep*")
cooldown = 2
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
+2 -2
View File
@@ -139,9 +139,9 @@
pulse(1)
if(machine)
machine.visible_message("\icon[machine] [capitalize_first_letters(src.name)] beeps, \"<b>Beep beep!</b>\"")
machine.visible_message("[icon2html(machine, viewers(get_turf(machine)))] [capitalize_first_letters(src.name)] beeps, \"<b>Beep beep!</b>\"")
else if(!holder)
visible_message("\icon[src] [capitalize_first_letters(src.name)] beeps, \"<b>Beep beep!</b>\"")
visible_message("[icon2html(src, viewers(get_turf(src)))] [capitalize_first_letters(src.name)] beeps, \"<b>Beep beep!</b>\"")
return
+1 -1
View File
@@ -42,7 +42,7 @@
if(!secured) return 0
pulse(0)
if(!holder)
visible_message("\icon[src] *beep* *beep*", "*beep* *beep*")
visible_message("[icon2html(src, viewers(get_turf(src)))] *beep* *beep*", "*beep* *beep*")
cooldown = 2
addtimer(CALLBACK(src, .proc/process_cooldown), 10)
return
+2 -2
View File
@@ -22,7 +22,7 @@
recorded = msg
listening = FALSE
var/turf/T = get_turf(src) //otherwise it won't work in hand
T.visible_message("\icon[src] beeps, \"Activation message is '[recorded]'.\"")
T.visible_message("[icon2html(src, viewers(get_turf(T)))] beeps, \"Activation message is '[recorded]'.\"")
else
if(findtext(msg, recorded))
pulse(0)
@@ -32,7 +32,7 @@
if(!holder)
listening = !listening
var/turf/T = get_turf(src)
T.visible_message("\icon[src] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
T.visible_message("[icon2html(src, viewers(get_turf(T)))] beeps, \"[listening ? "Now" : "No longer"] recording input.\"")
/obj/item/device/assembly/voice/attack_self(mob/user)
@@ -48,7 +48,7 @@
if (src.reload < 180) return
if ((user.contents.Find(src) || (in_range(src, user) && istype(src.loc, /turf))) || (istype(user, /mob/living/silicon)))
command_announcement.Announce("Bluespace artillery fire detected. Brace for impact.")
to_world(sound('sound/effects/yamato_fire.ogg'))
sound_to(world, ('sound/effects/yamato_fire.ogg'))
message_admins("[key_name_admin(usr)] has launched an artillery strike.", 1)
explosion(t,2,5,11)
reload = 0
+61
View File
@@ -127,6 +127,12 @@ You can set verify to TRUE if you want send() to sleep until the client has the
/proc/register_asset(asset_name, asset)
SSassets.cache[asset_name] = asset
//Generated names do not include file extention.
//Used mainly for code that deals with assets in a generic way
//The same asset will always lead to the same asset name
/proc/generate_asset_name(file)
return "asset.[md5(fcopy_rsc(file))]"
//These datums are used to populate the asset cache, the proc "register()" does this.
//all of our asset datums, used for referring to these later
@@ -231,6 +237,16 @@ var/list/asset_datums = list()
/datum/asset/chem_master/send(client)
send_asset_list(client, assets)
/datum/asset/simple/accents
verify = FALSE
/datum/asset/simple/accents/register()
for(var/A in subtypesof(/datum/accent)) //yes we have to do this here, SSrecords isn't initialized yet
var/datum/accent/accent = new A
var/name = "[accent.tag_icon].png"
assets[name] = icon('./icons/accent_tags.dmi', accent.tag_icon)
..()
/datum/asset/simple/faction_icons
assets = list(
"faction_EPMC.png" = 'icons/misc/factions/ECFlogo.png',
@@ -241,3 +257,48 @@ var/list/asset_datums = list()
"faction_Hepht.png" = 'icons/misc/factions/Hephaestuslogo.png',
"faction_unaffiliated.png" = 'icons/misc/factions/Unaffiliatedlogo.png'
)
/datum/asset/group
var/list/children
/datum/asset/group/register()
for(var/type in children)
get_asset_datum(type)
/datum/asset/group/send(client/C)
for(var/type in children)
var/datum/asset/A = get_asset_datum(type)
A.send(C)
/datum/asset/group/goonchat
children = list(
/datum/asset/simple/jquery,
/datum/asset/simple/goonchat,
/datum/asset/simple/fontawesome
)
/datum/asset/simple/jquery
verify = FALSE
assets = list(
"jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js',
)
/datum/asset/simple/goonchat
verify = TRUE
assets = list(
"json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js',
"browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js',
"browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css',
"browserOutput_white.css" = 'code/modules/goonchat/browserassets/css/browserOutput_white.css'
)
/datum/asset/simple/fontawesome
verify = FALSE
assets = list(
"fa-regular-400.eot" = 'html/font-awesome/webfonts/fa-regular-400.eot',
"fa-regular-400.woff" = 'html/font-awesome/webfonts/fa-regular-400.woff',
"fa-solid-900.eot" = 'html/font-awesome/webfonts/fa-solid-900.eot',
"fa-solid-900.woff" = 'html/font-awesome/webfonts/fa-solid-900.woff',
"font-awesome.css" = 'html/font-awesome/css/all.min.css',
"v4shim.css" = 'html/font-awesome/css/v4-shims.min.css'
)
+5
View File
@@ -77,3 +77,8 @@
var/authed = TRUE
var/is_initialized = FALSE // Used to track whether the client has been initialized with InitClient.
preload_rsc = 0
///goonchat chatoutput of the client
var/datum/chatOutput/chatOutput
+15 -27
View File
@@ -42,8 +42,6 @@
if (!info_sent)
handle_connection_info(src, href_list["data"])
info_sent = 1
else
server_greeting.close_window(src, "Your greeting window has malfunctioned and has been shut down.")
return
@@ -96,6 +94,11 @@
if("usr") hsrc = mob
if("prefs") return prefs.process_link(usr,href_list)
if("vars") return view_var_Topic(href,href_list,hsrc)
if("chat") return chatOutput.Topic(href, href_list)
switch(href_list["action"])
if("openLink")
send_link(src, href_list["link"])
if(href_list["warnacknowledge"])
var/queryid = text2num(href_list["warnacknowledge"])
@@ -143,13 +146,13 @@
query_details["new_status"] = "confirmed"
query_details["id"] = request_id
feedback_message = "<font color='green'><b>Account successfully linked!</b></font>"
feedback_message = "<span class='good'><b>Account successfully linked!</b></span>"
if ("deny")
query_contents = "UPDATE ss13_player_linking SET status = :new_status:, deleted_at = NOW() WHERE id = :id:"
query_details["new_status"] = "rejected"
query_details["id"] = request_id
feedback_message = "<font color='red'><b>Link request rejected!</b></font>"
feedback_message = "<span class='warning'><b>Link request rejected!</b></span>"
else
to_chat(src, "<span class='warning'>Invalid command sent.</span>")
return
@@ -210,11 +213,6 @@
if ("webint")
src.open_webint()
// Forward appropriate topics to the server greeting datum.
if ("greeting")
if (server_greeting)
server_greeting.handle_call(href_list, src)
// Handle the updating of MotD and Memo tabs upon click.
if ("updateHashes")
var/save = 0
@@ -308,13 +306,13 @@
//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, "<font color='red'>Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.</font>")
to_chat(src, "<span class='warning'>Error: AllowUpload(): File Upload too large. Upload Limit: [UPLOAD_LIMIT/1024]KiB.</span>")
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.
var/time_to_wait = fileaccess_timer - world.time
if(time_to_wait > 0)
to_chat(src, "<font color='red'>Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.</font>")
to_chat(src, "<span class='warning'>Error: AllowUpload(): Spam prevention. Please wait [round(time_to_wait/10)] seconds.</span>")
return 0
fileaccess_timer = world.time + FTPDELAY */
return 1
@@ -326,6 +324,9 @@
/client/New(TopicData)
TopicData = null //Prevent calls to client.Topic from connect
// Load goonchat
chatOutput = new(src)
if(!(connection in list("seeker", "web"))) //Invalid connection type.
return null
if(byond_version < MIN_CLIENT_VERSION) //Out of date client.
@@ -355,6 +356,7 @@
m.client = src
src.InitPrefs() //Init some default prefs
m.LateLogin()
chatOutput.start()
return m
//Do auth shit
else
@@ -362,6 +364,7 @@
src.InitClient()
src.InitPrefs()
mob.LateLogin()
chatOutput.start()
/client/proc/InitPrefs()
//preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum)
@@ -376,12 +379,6 @@
prefs.last_id = computer_id //these are gonna be used for banning
if (byond_version >= 511 && prefs.clientfps)
fps = prefs.clientfps
if(SStheming)
SStheming.apply_theme_from_perfs(src)
// Server greeting shenanigans.
if (server_greeting.find_outdated_info(src, 1) && !info_sent)
server_greeting.display_to_client(src)
/client/proc/InitClient()
to_chat(src, "<span class='alert'>If the title screen is black, resources are still downloading. Please be patient until the title screen appears.</span>")
@@ -686,15 +683,6 @@
send_link(src, linkURL)
return
/client/verb/show_greeting()
set name = "Open Greeting"
set category = "OOC"
// Update the information just in case.
server_greeting.find_outdated_info(src, 1)
server_greeting.display_to_client(src)
/client/proc/check_ip_intel()
set waitfor = 0 //we sleep when getting the intel, no need to hold up the client connection while we sleep
if (config.ipintel_email)
@@ -751,4 +739,4 @@
if(istype(gun) && gun.can_autofire())
M.set_dir(get_dir(M, over_object))
gun.Fire(get_turf(over_object), mob, params, (get_dist(over_object, mob) <= 1), FALSE)
CHECK_TICK
CHECK_TICK
+132
View File
@@ -0,0 +1,132 @@
//Darkmode preference by Kmc2000//
/*
This lets you switch chat themes by using winset and CSS loading, you must relog to see this change (or rebuild your browseroutput datum)
Things to note:
If you change ANYTHING in interface/skin.dmf you need to change it here:
Format:
winset(src, "window as appears in skin.dmf after elem", "var to change = currentvalue;var to change = desired value")
How this works:
I've added a function to browseroutput.js which registers a cookie for darkmode and swaps the chat accordingly. You can find the button to do this under the "cog" icon next to the ping button (top right of chat)
This then swaps the window theme automatically
Thanks to spacemaniac and mcdonald for help with the JS side of this.
*/
/client/proc/force_white_theme() //There's no way round it. We're essentially changing the skin by hand. It's painful but it works, and is the way Lummox suggested.
//Main windows
winset(src, "infowindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = none")
winset(src, "infowindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "rpane", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = none")
winset(src, "rpane", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "info", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "browseroutput", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "browseroutput", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "rpanewindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "rpanewindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = none")
winset(src, "split", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "mainvsplit", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
//Buttons
winset(src, "textb", "background-color = #494949;background-color = none")
winset(src, "textb", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "infob", "background-color = #494949;background-color = none")
winset(src, "infob", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "rulesb", "background-color = #494949;background-color = none")
winset(src, "rulesb", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "Lore", "background-color = #494949;background-color = none")
winset(src, "Lore", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "wikib", "background-color = #494949;background-color = none")
winset(src, "wikib", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "forumb", "background-color = #494949;background-color = none")
winset(src, "forumb", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "changelog", "background-color = #494949;background-color = none")
winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "interfaceb", "background-color = #494949;background-color = none")
winset(src, "interfaceb", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "discordb", "background-color = #494949;background-color = none")
winset(src, "discordb", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "reportbugb", "background-color = #494949;background-color = none")
winset(src, "reportbugb", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "hotkey_toggle", "background-color = #494949;background-color = none")
winset(src, "hotkey_toggle", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
//Status and verb tabs
winset(src, "output", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "output", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "outputwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "outputwindow", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "statwindow", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "statwindow", "text-color = #eaeaea;text-color = #000000")
winset(src, "info", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = #FFFFFF")
winset(src, "info", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = none")
winset(src, "info", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "info", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = #000000")
winset(src, "info", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = #000000")
winset(src, "info", "suffix-color = [COLOR_DARKMODE_TEXT];suffix-color = #000000")
//Say, OOC, me Buttons etc.
winset(src, "saybutton", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "saybutton", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
winset(src, "asset_cache_browser", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
/client/proc/force_dark_theme() //Inversely, if theyre using white theme and want to swap to the superior dark theme, let's get WINSET() ing
//Main windows
winset(src, "infowindow", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "infowindow", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rpane", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "rpane", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "info", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "browseroutput", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "browseroutput", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "outputwindow", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "outputwindow", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rpanewindow", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "rpanewindow", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "mainwindow", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "split", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "mainvsplit", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
//Buttons
winset(src, "textb", "background-color = none;background-color = #494949")
winset(src, "textb", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "infob", "background-color = none;background-color = #494949")
winset(src, "infob", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "rulesb", "background-color = none;background-color = #494949")
winset(src, "rulesb", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "Lore", "background-color = none;background-color = #494949")
winset(src, "Lore", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "wikib", "background-color = none;background-color = #494949")
winset(src, "wikib", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "forumb", "background-color = none;background-color = #494949")
winset(src, "forumb", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "changelog", "background-color = none;background-color = #494949")
winset(src, "changelog", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "interfaceb", "background-color = none;background-color = #494949")
winset(src, "interfaceb", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "discordb", "background-color = none;background-color = #494949")
winset(src, "discordb", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "reportbugb", "background-color = none;background-color = #494949")
winset(src, "reportbugb", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "hotkey_toggle", "background-color = none;background-color = #494949")
winset(src, "hotkey_toggle", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
//Status and verb tabs
winset(src, "output", "background-color = none;background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "output", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "outputwindow", "background-color = none;background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "outputwindow", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "statwindow", "background-color = none;background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "statwindow", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "background-color = #FFFFFF;background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
winset(src, "info", "tab-background-color = none;tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "info", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "tab-text-color = #000000;tab-text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "prefix-color = #000000;prefix-color = [COLOR_DARKMODE_TEXT]")
winset(src, "info", "suffix-color = #000000;suffix-color = [COLOR_DARKMODE_TEXT]")
//Say, OOC, me Buttons etc.
winset(src, "saybutton", "background-color = none;background-color = #494949")
winset(src, "saybutton", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
winset(src, "asset_cache_browser", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
winset(src, "asset_cache_browser", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
@@ -699,7 +699,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(current_species.preview_icon)
var/icon/preview = icon(current_species.preview_icon, "")
preview.Scale(64, 64) // Scale it here to stop it blurring.
to_chat(usr, browse_rsc(icon(icon = preview, icon_state = ""), "species_preview_[current_species.short_name].png"))
send_rsc(usr, icon(icon = preview, icon_state = ""), "species_preview_[current_species.short_name].png")
dat += "<img src='species_preview_[current_species.short_name].png' width='64px' height='64px'><br/><br/>"
dat += "<b>Language:</b> [current_species.language]<br/>"
dat += "<small>"
@@ -740,9 +740,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(restricted)
if(restricted == 1)
dat += "<font color='red'><b>You cannot play as this species.</br><small>If you wish to be whitelisted, you can make an application post on <a href='?src=\ref[user];preference=open_whitelist_forum'>the forums</a>.</small></b></font></br>"
dat += "<span class='warning'><b>You cannot play as this species.</br><small>If you wish to be whitelisted, you can make an application post on <a href='?src=\ref[user];preference=open_whitelist_forum'>the forums</a>.</small></b></span></br>"
else if(restricted == 2)
dat += "<font color='red'><b>You cannot play as this species.</br><small>This species is not available for play as a station race.</small></b></font></br>"
dat += "<span class='warning'><b>You cannot play as this species.</br><small>This species is not available for play as a station race.</small></b></span></br>"
if(!restricted || check_rights(R_ADMIN, 0))
dat += "\[<a href='?src=\ref[src];set_species=[html_encode(pref.species_preview)]'>select</a>\]"
dat += "</center>"
@@ -7,7 +7,6 @@
S["UI_style_color"] >> pref.UI_style_color
S["UI_style_alpha"] >> pref.UI_style_alpha
S["html_UI_style"] >> pref.html_UI_style
S["skin_theme"] >> pref.skin_theme
S["ooccolor"] >> pref.ooccolor
S["clientfps"] >> pref.clientfps
@@ -16,7 +15,6 @@
S["UI_style_color"] << pref.UI_style_color
S["UI_style_alpha"] << pref.UI_style_alpha
S["html_UI_style"] << pref.html_UI_style
S["skin_theme"] << pref.skin_theme
S["ooccolor"] << pref.ooccolor
S["clientfps"] << pref.clientfps
@@ -28,7 +26,6 @@
"UI_style_color",
"UI_style_alpha",
"html_UI_style",
"skin_theme",
"ooccolor",
"clientfps",
"tooltip_style"
@@ -47,7 +44,6 @@
"UI_style_color",
"UI_style_alpha",
"html_UI_style",
"skin_theme",
"ooccolor",
"clientfps",
"tooltip_style",
@@ -62,7 +58,6 @@
"UI_style_color" = pref.UI_style_color,
"UI_style" = pref.UI_style,
"html_UI_style" = pref.html_UI_style,
"skin_theme" = pref.skin_theme,
"ooccolor" = pref.ooccolor,
"clientfps" = pref.clientfps,
"tooltip_style" = pref.tooltip_style
@@ -74,7 +69,6 @@
pref.UI_style_alpha = sanitize_integer(text2num(pref.UI_style_alpha), 0, 255, initial(pref.UI_style_alpha))
pref.clientfps = sanitize_integer(text2num(pref.clientfps), 0, 1000, initial(pref.clientfps))
pref.html_UI_style = sanitize_inlist(pref.html_UI_style, SStheming.available_html_themes, initial(pref.html_UI_style))
pref.skin_theme = sanitize_inlist(pref.skin_theme, SStheming.skin_themes, initial(pref.skin_theme))
pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor))
/datum/category_item/player_setup_item/player_global/ui/content(mob/user)
@@ -86,7 +80,6 @@
dat += "-Alpha(transparency): <a href='?src=\ref[src];select_alpha=1'><b>[pref.UI_style_alpha]</b></a> - <a href='?src=\ref[src];reset=alpha'>reset</a><br>"
dat += "<b>Tooltip Style:</b> <a href='?src=\ref[src];select_tooltip_style=1'><b>[pref.tooltip_style]</b></a><br>"
dat += "<b>HTML UI Style:</b> <a href='?src=\ref[src];select_html=1'><b>[pref.html_UI_style]</b></a><br>"
dat += "<b>Main UI Style:</b> <a href='?src=\ref[src];select_skin_theme=1'><b>[pref.skin_theme]</b></a><br>"
dat += "-FPS: <a href='?src=\ref[src];select_fps=1'><b>[pref.clientfps]</b></a> - <a href='?src=\ref[src];reset=fps'>reset</a><br>"
if(can_select_ooc_color(user))
dat += "<b>OOC Color:</b> "
@@ -122,14 +115,6 @@
pref.html_UI_style = html_style_new
return TOPIC_REFRESH
else if(href_list["select_skin_theme"])
var/skin_theme_new = input(user, "Choose HTML UI style.", "Global Preference", pref.skin_theme) as null|anything in SStheming.skin_themes
if(isnull(skin_theme_new) || !CanUseTopic(user)) return TOPIC_NOACTION
pref.skin_theme = skin_theme_new
if(SStheming)
SStheming.apply_theme_from_perfs(user)
return TOPIC_REFRESH
else if(href_list["select_ooc_color"])
var/new_ooccolor = input(user, "Choose OOC color:", "Global Preference") as color|null
if(new_ooccolor && can_select_ooc_color(user) && CanUseTopic(user))
@@ -234,7 +234,7 @@
switch(pref.alternate_option)
if(BE_ASSISTANT)
dat += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=red>Be assistant if preference unavailable</font></a></u></center><br>"
dat += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><span class='attack'>Be assistant if preference unavailable</span></a></u></center><br>"
if(RETURN_TO_LOBBY)
dat += "<center><br><u><a href='?src=\ref[src];job_alternative=1'><font color=purple>Return to lobby if preference unavailable</font></a></u></center><br>"
-1
View File
@@ -27,7 +27,6 @@ datum/preferences
var/UI_style_color = "#ffffff"
var/UI_style_alpha = 255
var/html_UI_style = "Nano"
var/skin_theme = "Light"
//Style for popup tooltips
var/tooltip_style = "Midnight"
var/motd_hash = "" //Hashes for the new server greeting window.
+7 -7
View File
@@ -27,7 +27,7 @@
if(prefs.asfx_togs & ASFX_AMBIENCE)
to_chat(src, "You will now hear ambient sounds.")
else
to_chat(src, "<font color='red'>You will no longer hear ambient sounds.</font>")
to_chat(src, "<span class='warning'>You will no longer hear ambient sounds.</span>")
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1)
src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2)
feedback_add_details("admin_verb","TSFXAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -42,7 +42,7 @@
if(prefs.asfx_togs & ASFX_FOOTSTEPS)
to_chat(src, "You will now hear footstep sounds.")
else
to_chat(src, "<font color='red'>You will no longer hear footstep sounds.</font>")
to_chat(src, "<span class='warning'>You will no longer hear footstep sounds.</span>")
feedback_add_details("admin_verb","TSFXFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/Toggle_asfx_vote()
@@ -54,7 +54,7 @@
if(prefs.asfx_togs & ASFX_VOTE)
to_chat(src, "You will now hear the vote alarm.")
else
to_chat(src, "<font color='red'>You will no longer hear the vote alarm.</font>")
to_chat(src, "<span class='warning'>You will no longer hear the vote alarm.</span>")
feedback_add_details("admin_verb","TSFXFV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_vox_voice()
@@ -76,7 +76,7 @@
if(prefs.asfx_togs & ASFX_DROPSOUND)
to_chat(src, "You will now hear dropping and throwing sounds.")
else
to_chat(src, "<font color='red'>You will no longer hear dropping and throwing sounds.</font>")
to_chat(src, "<span class='warning'>You will no longer hear dropping and throwing sounds.</span>")
/client/proc/Toggle_arcadesounds()
set name = "Toggle Arcade SFX"
@@ -88,7 +88,7 @@
if(prefs.asfx_togs & ASFX_ARCADE)
to_chat(src, "You will now hear arcade sounds.")
else
to_chat(src, "<font color='red'>You will no longer hear arcade sounds.</font>")
to_chat(src, "<span class='warning'>You will no longer hear arcade sounds.</span>")
/client/proc/Toggle_radiosounds()
set name = "Toggle Radio SFX"
@@ -100,7 +100,7 @@
if(prefs.asfx_togs & ASFX_RADIO)
to_chat(src, "You will now hear radio sounds.")
else
to_chat(src, "<font color='red'>You will no longer hear radio sounds.</font>")
to_chat(src, "<span class='warning'>You will no longer hear radio sounds.</span>")
/client/proc/Toggle_instrumentsounds()
set name = "Toggle Instrument SFX"
@@ -112,4 +112,4 @@
if(prefs.asfx_togs & ASFX_INSTRUMENT)
to_chat(src, "You will now hear instrument sounds.")
else
to_chat(src, "<font color='red'>You will no longer hear instrument sounds.</font>")
to_chat(src, "<span class='warning'>You will no longer hear instrument sounds.</span>")
@@ -205,7 +205,7 @@
if(panel_notification)
new_notification("warning","You have <b>[notification_count] unread notifications!</b> Click <a href='?JSlink=warnings;notification=:src_ref'>here</a> to review and acknowledge them!")
if(chat_notification)
to_chat(user,"<font color='red'><BIG><B>You have unacknowledged notifications.</B></BIG><br>Click <a href='?JSlink=warnings;notification=:src_ref'>here</a> to review and acknowledge them!</font>")
to_chat(user,"<span class='warning'><BIG><B>You have unacknowledged notifications.</B></BIG><br>Click <a href='?JSlink=warnings;notification=:src_ref'>here</a> to review and acknowledge them!</span>")
/*
* Helper proc for getting a count of active CCIA actions against the player's characters.
@@ -215,8 +215,8 @@
else
user.drop_from_inventory(ai,src)
ai_card = ai
to_chat(ai_mob, "<font color='blue'>You have been transferred to \the [holder]'s [src].</font>")
to_chat(user, "<font color='blue'>You load [ai_mob] into \the [holder]'s [src].</font>")
to_chat(ai_mob, "<span class='notice'>You have been transferred to \the [holder]'s [src].</span>")
to_chat(user, "<span class='notice'>You load [ai_mob] into \the [holder]'s [src].</span>")
integrated_ai = ai_mob
+13 -13
View File
@@ -91,17 +91,17 @@
var/list/species_restricted = list(BODYTYPE_HUMAN,BODYTYPE_TAJARA,BODYTYPE_UNATHI, BODYTYPE_SKRELL, BODYTYPE_IPC, BODYTYPE_IPC_BISHOP, BODYTYPE_IPC_ZENGHU)
/obj/item/rig/examine()
to_chat(usr, "This is \icon[src][src.name].")
to_chat(usr, "This is [icon2html(src, usr)][src.name].")
to_chat(usr, "[src.desc]")
if(wearer)
for(var/obj/item/piece in list(helmet,gloves,chest,boots))
if(!piece || piece.loc != wearer)
continue
to_chat(usr, "\icon[piece] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.")
to_chat(usr, "[icon2html(piece, usr)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.")
if(src.loc == usr)
to_chat(usr, "The maintenance panel is [open ? "open" : "closed"].")
to_chat(usr, "Hardsuit systems are [offline ? "<font color='red'>offline</font>" : "<font color='green'>online</font>"].")
to_chat(usr, "Hardsuit systems are [offline ? "<span class='warning'>offline</span>" : "<span class='good'>online</span>"].")
/obj/item/rig/Initialize()
. = ..()
@@ -232,7 +232,7 @@
if(!failed_to_seal)
if(!instant)
wearer.visible_message("<font color='blue'>[wearer]'s suit emits a quiet hum as it begins to adjust its seals.</font>","<font color='blue'>With a quiet hum, the suit begins running checks and adjusting components.</font>")
wearer.visible_message("<span class='notice'>[wearer]'s suit emits a quiet hum as it begins to adjust its seals.</span>","<span class='notice'>With a quiet hum, the suit begins running checks and adjusting components.</span>")
if(seal_delay && !do_after(wearer, seal_delay, act_target = src))
if(wearer) to_chat(wearer, "<span class='warning'>You must remain still while the suit is adjusting the components.</span>")
playsound(src, 'sound/items/rfd_empty.ogg', 20, FALSE)
@@ -266,16 +266,16 @@
piece.item_state = "[initial(icon_state)][!seal_target ? "_sealed" : ""]"
switch(msg_type)
if("boots")
to_chat(wearer, "<font color='blue'>\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].</font>")
to_chat(wearer, "<span class='notice'>\The [piece] [!seal_target ? "seal around your feet" : "relax their grip on your legs"].</span>")
wearer.update_inv_shoes()
if("gloves")
to_chat(wearer, "<font color='blue'>\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].</font>")
to_chat(wearer, "<span class='notice'>\The [piece] [!seal_target ? "tighten around your fingers and wrists" : "become loose around your fingers"].</span>")
wearer.update_inv_gloves()
if(BP_CHEST)
to_chat(wearer, "<font color='blue'>\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].</font>")
to_chat(wearer, "<span class='notice'>\The [piece] [!seal_target ? "cinches tight again your chest" : "releases your chest"].</span>")
wearer.update_inv_wear_suit()
if("helmet")
to_chat(wearer, "<font color='blue'>\The [piece] hisses [!seal_target ? "closed" : "open"].</font>")
to_chat(wearer, "<span class='notice'>\The [piece] hisses [!seal_target ? "closed" : "open"].</span>")
wearer.update_inv_head()
if(helmet)
helmet.update_light(wearer)
@@ -309,17 +309,17 @@
// Success!
canremove = seal_target
to_chat(wearer, "<font color='blue'><b>Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"].</b></font>")
to_chat(wearer, "<span class='notice'><b>Your entire suit [canremove ? "loosens as the components relax" : "tightens around you as the components lock into place"].</b></span>")
playsound(src, 'sound/items/rped.ogg', 20, FALSE)
if (has_sealed_state)
icon_state = canremove ? initial(icon_state) : "[initial(icon_state)]_sealed"
if(dnaLock && !offline)
if(dnaLock != wearer.dna)
visible_message("\icon[src.icon] <b>[src]</b> announces, <span class='notice'>\"DNA mismatch. Unauthorized access detected.\"</span>")
visible_message("[icon2html(src, viewers(get_turf(src)))] <b>[src]</b> announces, <span class='notice'>\"DNA mismatch. Unauthorized access detected.\"</span>")
crushing = TRUE
if(wearer != initiator)
to_chat(initiator, "<font color='blue'>Suit adjustment complete. Suit is now [canremove ? "unsealed" : "sealed"].</font>")
to_chat(initiator, "<span class='notice'>Suit adjustment complete. Suit is now [canremove ? "unsealed" : "sealed"].</span>")
if(canremove)
for(var/obj/item/rig_module/module in installed_modules)
@@ -613,7 +613,7 @@
..()
if(seal_delay > 0 && istype(M) && M.back == src)
M.visible_message("<font color='blue'>[M] starts putting on \the [src]...</font>", "<font color='blue'>You start putting on \the [src]...</font>")
M.visible_message("<span class='notice'>[M] starts putting on \the [src]...</span>", "<span class='notice'>You start putting on \the [src]...</span>")
if(!do_after(M,seal_delay))
if(M && M.back == src)
if(!M.unEquip(src))
@@ -622,7 +622,7 @@
return
if(istype(M) && M.back == src)
M.visible_message("<font color='blue'><b>[M] struggles into \the [src].</b></font>", "<font color='blue'><b>You struggle into \the [src].</b></font>")
M.visible_message("<span class='notice'><b>[M] struggles into \the [src].</b></span>", "<span class='notice'><b>You struggle into \the [src].</b></span>")
wearer = M
wearer.wearing_rig = src
update_icon()
@@ -218,11 +218,11 @@
if(!istype(module))
selected_module = null
to_chat(usr, "<font color='blue'><b>Primary system is now: deselected.</b></font>")
to_chat(usr, "<span class='notice'><b>Primary system is now: deselected.</b></span>")
return
selected_module = module
to_chat(usr, "<font color='blue'><b>Primary system is now: [selected_module.interface_name].</b></font>")
to_chat(usr, "<span class='notice'><b>Primary system is now: [selected_module.interface_name].</b></span>")
/obj/item/rig/verb/toggle_module()
+1 -1
View File
@@ -96,7 +96,7 @@
/obj/item/clothing/suit/bomb_suit/equipped(var/mob/user, var/slot)
if (slot == slot_wear_suit)
var/mob/living/carbon/human/H = user
H.visible_message("<font color='blue'>[H] starts putting on \the [src]...</font>", "<font color='blue'>You start putting on \the [src]...</font>")
H.visible_message("<span class='notice'>[H] starts putting on \the [src]...</span>", "<span class='notice'>You start putting on \the [src]...</span>")
if(!do_after(H,50))
if(H && H.wear_suit == src)
H.wear_suit = null
@@ -99,7 +99,7 @@
last_process_worldtime = world.time
/obj/machinery/dnaforensics/proc/complete_scan()
visible_message("<span class='notice'>\icon[src] makes an insistent chime.</span>", range = 2)
visible_message("<span class='notice'>[icon2html(src, viewers(get_turf(src)))] makes an insistent chime.</span>", range = 2)
update_icon()
if(bloodsamp)
var/obj/item/paper/P = new()
+13 -13
View File
@@ -100,14 +100,14 @@ log transactions
//display a message to the user
var/response = pick("Initiating withdraw. Have a nice day!", "CRITICAL ERROR: Activating cash chamber panic siphon.","PIN Code accepted! Emptying account balance.", "Jackpot!")
to_chat(user, "<span class='warning'>\icon[src] The [src] beeps: \"[response]\"</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)] The [src] beeps: \"[response]\"</span>")
return 1
/obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I, /obj/item/card))
if(emagged)
//prevent inserting id into an emagged ATM
to_chat(user, "<span class='warning'>\icon[src] CARD READER ERROR. This system has been compromised!</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)] CARD READER ERROR. This system has been compromised!</span>")
return
else if(istype(I,/obj/item/card/emag))
I.resolve_attackby(src, user)
@@ -148,7 +148,7 @@ log transactions
/obj/machinery/atm/attack_hand(mob/user as mob)
if(istype(user, /mob/living/silicon))
to_chat(user, "<span class='warning'>\icon[src] Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per system banking regulation #1005.</span>")
to_chat(user, "<span class='warning'>[icon2html(src, user)] Artificial unit recognized. Artificial units do not currently receive monetary compensation, as per system banking regulation #1005.</span>")
return
if(get_dist(src,user) <= 1)
@@ -259,7 +259,7 @@ log transactions
var/target_account_number = text2num(href_list["target_acc_number"])
var/transfer_purpose = href_list["purpose"]
if(SSeconomy.charge_to_account(target_account_number, authenticated_account.owner_name, transfer_purpose, machine_id, transfer_amount))
to_chat(usr, "\icon[src]<span class='info'>Funds transfer successful.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='info'>Funds transfer successful.</span>")
authenticated_account.money -= transfer_amount
//create an entry in the account transaction log
@@ -272,10 +272,10 @@ log transactions
T.amount = "([transfer_amount])"
SSeconomy.add_transaction_log(authenticated_account,T)
else
to_chat(usr, "\icon[src]<span class='warning'>Funds transfer failed.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>Funds transfer failed.</span>")
else
to_chat(usr, "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>You don't have enough funds to do that!</span>")
if("view_screen")
view_screen = text2num(href_list["view_screen"])
if("change_security_level")
@@ -294,7 +294,7 @@ log transactions
var/tried_pin = text2num(href_list["account_pin"])
var/datum/money_account/potential_account = SSeconomy.get_account(tried_account_num)
if (!potential_account)
to_chat(usr, "<span class='warning'>\icon[src] Account number not found.</span>")
to_chat(usr, "<span class='warning'>[icon2html(src, usr)] Account number not found.</span>")
number_incorrect_tries++
handle_lockdown()
return
@@ -311,7 +311,7 @@ log transactions
else to_chat(usr, "<span class='warning'>Account card not found.</span>")
if (!authenticated_account)
number_incorrect_tries++
to_chat(usr, "<span class='warning'>\icon[src] Incorrect pin/account combination entered, [(max_pin_attempts+1) - number_incorrect_tries] attempts remaining.</span>")
to_chat(usr, "<span class='warning'>[icon2html(src, usr)] Incorrect pin/account combination entered, [(max_pin_attempts+1) - number_incorrect_tries] attempts remaining.</span>")
handle_lockdown(tried_account_num)
else
SSeconomy.bank_log_access(authenticated_account, machine_id)
@@ -319,7 +319,7 @@ log transactions
playsound(src, 'sound/machines/twobeep.ogg', 50, 1)
ticks_left_timeout = 120
view_screen = NO_SCREEN
to_chat(usr, "<span class='notice'> \icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
to_chat(usr, "<span class='notice'> [icon2html(src, usr)] Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
previous_account_number = tried_account_num
if("e_withdrawal")
@@ -347,7 +347,7 @@ log transactions
T.time = worldtime2text()
SSeconomy.add_transaction_log(authenticated_account,T)
else
to_chat(usr, "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>You don't have enough funds to do that!</span>")
if("withdrawal")
var/amount = max(text2num(href_list["funds_amount"]),0)
amount = round(amount, 0.01)
@@ -372,7 +372,7 @@ log transactions
T.time = worldtime2text()
SSeconomy.add_transaction_log(authenticated_account,T)
else
to_chat(usr, "\icon[src]<span class='warning'>You don't have enough funds to do that!</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>You don't have enough funds to do that!</span>")
if("balance_statement")
if(authenticated_account)
var/obj/item/paper/R = new()
@@ -452,7 +452,7 @@ log transactions
if(!held_card)
//this might happen if the user had the browser window open when somebody emagged it
if(emagged)
to_chat(usr, "<span class='warning'>\icon[src] The ATM card reader rejected your ID because this machine has been sabotaged!</span>")
to_chat(usr, "<span class='warning'>[icon2html(src, usr)] The ATM card reader rejected your ID because this machine has been sabotaged!</span>")
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/card/id))
@@ -480,7 +480,7 @@ log transactions
if(I)
authenticated_account = SSeconomy.attempt_account_access(I.associated_account_number)
if(authenticated_account)
to_chat(human_user, "<span class='notice'>\icon[src] Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
to_chat(human_user, "<span class='notice'>[icon2html(src, usr)] Access granted. Welcome user '[authenticated_account.owner_name].'</span>")
//create a transaction log entry
var/datum/transaction/T = new()
+19 -19
View File
@@ -111,7 +111,7 @@
else
user << browse(null,"window=eftpos")
/obj/item/device/eftpos/attackby(obj/item/O as obj, user as mob)
/obj/item/device/eftpos/attackby(var/obj/item/O, var/mob/user)
var/obj/item/card/id/I = O.GetID()
@@ -119,7 +119,7 @@
if(linked_account)
scan_card(I, O)
else
to_chat(usr, "\icon[src]<span class='warning'>Unable to connect to linked account.</span>")
to_chat(user, "[icon2html(src, user)]<span class='warning'>Unable to connect to linked account.</span>")
else if (istype(O, /obj/item/spacecash/ewallet))
var/obj/item/spacecash/ewallet/E = O
if (linked_account)
@@ -127,7 +127,7 @@
if(transaction_locked && !transaction_paid)
if(transaction_amount <= E.worth)
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] \The [src] chimes.")
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
transaction_paid = 1
//transfer the money
@@ -144,11 +144,11 @@
T.time = worldtime2text()
SSeconomy.add_transaction_log(linked_account,T)
else
to_chat(usr, "\icon[src]<span class='warning'>\The [O] doesn't have that much money!</span>")
to_chat(user, "[icon2html(src, user)]<span class='warning'>\The [O] doesn't have that much money!</span>")
else
to_chat(usr, "\icon[src]<span class='warning'>Connected account has been suspended.</span>")
to_chat(user, "[icon2html(src, user)]<span class='warning'>Connected account has been suspended.</span>")
else
to_chat(usr, "\icon[src]<span class='warning'>EFTPOS is not connected to an account.</span>")
to_chat(user, "[icon2html(src, user)]<span class='warning'>EFTPOS is not connected to an account.</span>")
else
..()
@@ -166,14 +166,14 @@
alert("That is not a valid code!")
print_reference()
else
to_chat(usr, "\icon[src]<span class='warning'>Incorrect code entered.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>Incorrect code entered.</span>")
if("change_id")
var/attempt_code = text2num(input("Re-enter the current EFTPOS access code", "Confirm EFTPOS code"))
if(attempt_code == access_code)
eftpos_name = sanitize(input("Enter a new terminal ID for this device", "Enter new EFTPOS ID"), MAX_NAME_LEN) + " EFTPOS scanner"
print_reference()
else
to_chat(usr, "\icon[src]<span class='warning'>Incorrect code entered.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>Incorrect code entered.</span>")
if("link_account")
if (!prelocked_account)
var/attempt_account_num = input("Enter account number to pay EFTPOS charges into", "New account number") as num
@@ -182,9 +182,9 @@
if(linked_account)
if(linked_account.suspended)
linked_account = null
to_chat(usr, "\icon[src]<span class='warning'>Account has been suspended.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>Account has been suspended.</span>")
else
to_chat(usr, "\icon[src]<span class='warning'>Account not found.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>Account not found.</span>")
if("trans_purpose")
var/choice = sanitize(input("Enter reason for EFTPOS transaction", "Transaction purpose"))
if(choice) transaction_purpose = choice
@@ -207,14 +207,14 @@
else if(linked_account)
transaction_locked = 1
else
to_chat(usr, "\icon[src]<span class='warning'>No account connected to send transactions to.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>No account connected to send transactions to.</span>")
if("scan_card")
if(linked_account)
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/card))
scan_card(I)
else
to_chat(usr, "\icon[src]<span class='warning'>Unable to link accounts.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>Unable to link accounts.</span>")
if("reset")
//reset the access code - requires HoP/captain access
var/obj/item/I = usr.get_active_hand()
@@ -222,10 +222,10 @@
var/obj/item/card/id/C = I
if((access_cent_captain in C.access) || (access_hop in C.access) || (access_captain in C.access))
access_code = 0
to_chat(usr, "\icon[src]<span class='info'>Access code reset to 0.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='info'>Access code reset to 0.</span>")
else if (istype(I, /obj/item/card/emag))
access_code = 0
to_chat(usr, "\icon[src]<span class='info'>Access code reset to 0.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='info'>Access code reset to 0.</span>")
src.attack_self(usr)
@@ -241,21 +241,21 @@
var/message = SSeconomy.transfer_money(C.associated_account_number, linked_account.account_number, transaction_purpose, machine_id, transaction_amount, null, usr)
if(message)
to_chat(usr,"\icon[src]<span class='warning'>[message].</span>")
to_chat(usr,"[icon2html(src, usr)]<span class='warning'>[message].</span>")
else
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] \The [src] chimes.")
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
transaction_paid = 1
else
to_chat(usr, "\icon[src]<span class='warning'>EFTPOS is not connected to an account.</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='warning'>EFTPOS is not connected to an account.</span>")
else if (istype(I, /obj/item/card/emag))
if(transaction_locked)
if(transaction_paid)
to_chat(usr, "\icon[src]<span class='info'>You stealthily swipe \the [I] through \the [src].</span>")
to_chat(usr, "[icon2html(src, usr)]<span class='info'>You stealthily swipe \the [I] through \the [src].</span>")
transaction_locked = 0
transaction_paid = 0
else
usr.visible_message("<span class='info'>\The [usr] swipes a card through \the [src].</span>")
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] \The [src] chimes.")
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
transaction_paid = 1
+2 -2
View File
@@ -112,10 +112,10 @@
var/transaction = SSeconomy.transfer_money(I.associated_account_number, SSeconomy.get_department_account(destinationact)?.account_number,transaction_purpose,transaction_terminal,transaction_amount,null,usr)
if(transaction)
to_chat(usr,"\icon[src]<span class='warning'>[transaction].</span>")
to_chat(user,"[icon2html(src, user)]<span class='warning'>[transaction].</span>")
else
playsound(src, 'sound/machines/chime.ogg', 50, 1)
src.visible_message("\icon[src] \The [src] chimes.")
src.visible_message("[icon2html(src, viewers(get_turf(src)))] \The [src] chimes.")
print_receipt()
sum = 0
receipt = ""
+3 -2
View File
@@ -177,7 +177,8 @@
if (!P.message_silent)
playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1)
for (var/mob/O in hearers(3, P.loc))
if(!P.message_silent) O.show_message(text("\icon[P] *[P.ttone]*"))
if(!P.message_silent)
O.show_message(text("[icon2html(P, O)] *[P.ttone]*"))
//Search for holder of the PDA.
var/mob/living/L = null
if(P.loc && isliving(P.loc))
@@ -187,4 +188,4 @@
L = get(P, /mob/living/silicon)
if(L)
to_chat(L, "\icon[P] <b>Message from [sender] (Unknown / spam?), </b>\"[message]\" (Unable to Reply)")
to_chat(L, "[icon2html(P, L)] <b>Message from [sender] (Unknown / spam?), </b>\"[message]\" (Unable to Reply)")
+1 -1
View File
@@ -53,7 +53,7 @@
description_holders["cult"] = show_cult_info ? A.get_description_cult() : ""
description_holders["name"] = "[A.name]"
description_holders["icon"] = "\icon[A]"
description_holders["icon"] = "[icon2html(A, usr)]"
description_holders["desc"] = A.desc
/client/Stat()
+1 -1
View File
@@ -111,7 +111,7 @@
if(board["[i]"])
var/obj/item/I = board["[i]"]
to_chat(user, browse_rsc(board_icons["[I.icon] [I.icon_state]"],"[I.icon_state].png"))
send_rsc(user, board_icons["[I.icon] [I.icon_state]"],"[I.icon_state].png")
dat += " style='background-image:url([I.icon_state].png)'>"
else
dat+= ">"
+112
View File
@@ -0,0 +1,112 @@
var/regex/is_http_protocol = regex("^https?://")
//Converts an icon to base64. Operates by putting the icon in the iconCache savefile,
// exporting it as text, and then parsing the base64 from that.
// (This relies on byond automatically storing icons in savefiles as base64)
/proc/icon2base64(icon/icon, iconKey = "misc")
if (!isicon(icon))
return FALSE
to_save(iconCache[iconKey], icon)
var/iconData = iconCache.ExportText(iconKey)
var/list/partial = splittext(iconData, "{")
return replacetext(copytext(partial[2], 3, -5), "\n", "")
/proc/icon2html(thing, target, icon_state, dir, frame = 1, moving = FALSE, realsize = FALSE, class = null)
if (!thing)
return
var/key
var/icon/I = thing
if (!target)
return
if (target == world)
target = clients
var/list/targets
if (!islist(target))
targets = list(target)
else
targets = target
if (!targets.len)
return
if (!isicon(I))
if (isfile(thing)) //special snowflake
var/name = "[generate_asset_name(thing)].png"
register_asset(name, thing)
for (var/thing2 in targets)
send_asset(thing2, key, FALSE)
return "<img class='icon icon-misc [class]' src=\"[url_encode(name)]\">"
var/atom/A = thing
if (isnull(dir))
dir = A.dir
if (isnull(icon_state))
icon_state = A.icon_state
I = A.icon
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
var/icon/temp = I
I = icon()
I.Insert(temp, dir = SOUTH)
dir = SOUTH
else
if (isnull(dir))
dir = SOUTH
if (isnull(icon_state))
icon_state = ""
I = icon(I, icon_state, dir, frame, moving)
key = "[generate_asset_name(I)].png"
register_asset(key, I)
for (var/thing2 in targets)
send_asset(thing2, key, FALSE)
if(realsize)
return "<img class='icon icon-[icon_state] [class]' style='width:[I.Width()]px;height:[I.Height()]px;min-height:[I.Height()]px' src=\"[url_encode(key)]\">"
return "<img class='icon icon-[icon_state] [class]' src=\"[url_encode(key)]\">"
/proc/icon2base64html(thing)
if (!thing)
return
var/static/list/bicon_cache = list()
if (isicon(thing))
var/icon/I = thing
var/icon_base64 = icon2base64(I)
if (I.Height() > world.icon_size || I.Width() > world.icon_size)
var/icon_md5 = md5(icon_base64)
icon_base64 = bicon_cache[icon_md5]
if (!icon_base64) // Doesn't exist yet, make it.
bicon_cache[icon_md5] = icon_base64 = icon2base64(I)
return "<img class='icon icon-misc' src='data:image/png;base64,[icon_base64]'>"
// Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with.
var/atom/A = thing
var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]"
if (!bicon_cache[key]) // Doesn't exist, make it.
var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1)
if (ishuman(thing)) // Shitty workaround for a BYOND issue.
var/icon/temp = I
I = icon()
I.Insert(temp, dir = SOUTH)
bicon_cache[key] = icon2base64(I, key)
return "<img class='icon icon-[A.icon_state]' src='data:image/png;base64,[bicon_cache[key]]'>"
//Costlier version of icon2html() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs.
/proc/costly_icon2html(thing, target)
if (!thing)
return
if (isicon(thing))
return icon2html(thing, target)
var/icon/I = getFlatIcon(thing)
return icon2html(I, target)
+286
View File
@@ -0,0 +1,286 @@
/*********************************
For the main html chat area
*********************************/
//Precaching a bunch of shit
var/savefile/iconCache = new("data/tmp/iconCache.sav") //Cache of icons for the browser output
//Should match the value set in the browser js
#define MAX_COOKIE_LENGTH 5
//On client, created on login
/datum/chatOutput
var/client/owner //client ref
// How many times client data has been checked
var/total_checks = 0
// When to next clear the client data checks counter
var/next_time_to_clear = 0
var/loaded = FALSE // Has the client loaded the browser output area?
var/list/messageQueue //If they haven't loaded chat, this is where messages will go until they do
var/cookieSent = FALSE // Has the client sent a cookie for analysis
var/broken = FALSE
var/list/connectionHistory //Contains the connection history passed from chat cookie
/datum/chatOutput/New(client/C)
owner = C
messageQueue = list()
connectionHistory = list()
/datum/chatOutput/proc/start()
//Check for existing chat
if(!owner)
return FALSE
if(!winexists(owner, "browseroutput")) // Oh goddamnit.
set waitfor = FALSE
broken = TRUE
message_admins("Couldn't start chat for [key_name_admin(owner)]!")
. = FALSE
alert(owner.mob, "Updated chat window does not exist. If you are using a custom skin file please allow the game to update.")
return
//It seems if someone disconnects while loading this can runtime, so we have to check for owner again
if(owner && winget(owner, "browseroutput", "is-visible") == "true") //Already setup
doneLoading()
else //Not setup
load()
return TRUE
/datum/chatOutput/proc/load()
set waitfor = FALSE
if(!owner)
return
var/datum/asset/stuff = get_asset_datum(/datum/asset/group/goonchat)
stuff.send(owner)
show_browser(owner, file('code/modules/goonchat/browserassets/html/browserOutput.html'), "window=browseroutput")
/datum/chatOutput/Topic(href, list/href_list)
if(usr.client != owner)
return TRUE
// Build arguments.
// Arguments are in the form "param[paramname]=thing"
var/list/params = list()
for(var/key in href_list)
if(length(key) > 7 && findtext(key, "param")) // 7 is the amount of characters in the basic param key template.
var/param_name = copytext(key, 7, -1)
var/item = href_list[key]
params[param_name] = item
var/data // Data to be sent back to the chat.
switch(href_list["proc"])
if("doneLoading")
data = doneLoading(arglist(params))
if("debug")
data = debug(arglist(params))
if("ping")
data = ping(arglist(params))
if("analyzeClientData")
data = analyzeClientData(arglist(params))
if("swaptodarkmode")
swaptodarkmode()
if("swaptolightmode")
swaptolightmode()
if(data)
ehjax_send(data = data)
//Called on chat output done-loading by JS.
/datum/chatOutput/proc/doneLoading()
if(loaded)
return
loaded = TRUE
showChat()
for(var/message in messageQueue)
// whitespace has already been handled by the original to_chat
to_chat(owner, message, handle_whitespace=FALSE)
messageQueue = null
sendClientData()
syncRegex()
//do not convert to to_chat()
legacy_chat(owner, "<span class=\"userdanger\">Failed to load fancy chat, reverting to old chat. Certain features won't work.</span>")
/datum/chatOutput/proc/showChat()
winset(owner, "output", "is-visible=false")
winset(owner, "browseroutput", "is-disabled=false;is-visible=true")
/proc/syncChatRegexes()
for (var/user in clients)
var/client/C = user
var/datum/chatOutput/Cchat = C.chatOutput
if (Cchat && !Cchat.broken && Cchat.loaded)
Cchat.syncRegex()
/datum/chatOutput/proc/syncRegex()
var/list/regexes = list()
if (regexes.len)
ehjax_send(data = list("syncRegex" = regexes))
/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data)
if(islist(data))
data = json_encode(data)
send_output(C, "[data]", "[window]:ehjaxCallback")
//Sends client connection details to the chat to handle and save
/datum/chatOutput/proc/sendClientData()
//Get dem deets
var/list/deets = list("clientData" = list())
deets["clientData"]["ckey"] = owner.ckey
deets["clientData"]["ip"] = owner.address
deets["clientData"]["compid"] = owner.computer_id
var/data = json_encode(deets)
ehjax_send(data = data)
//Called by client, sent data to investigate (cookie history so far)
/datum/chatOutput/proc/analyzeClientData(cookie = "")
//Spam check
if(world.time > next_time_to_clear)
next_time_to_clear = world.time + (3 SECONDS)
total_checks = 0
total_checks += 1
if(total_checks > SPAM_TRIGGER_AUTOMUTE)
message_admins("[key_name(owner)] kicked for goonchat topic spam")
qdel(owner)
return
if(!cookie)
return
if(cookie != "none")
var/list/connData = json_decode(cookie)
if (connData && islist(connData) && connData.len > 0 && connData["connData"])
connectionHistory = connData["connData"] //lol fuck
var/list/found = new()
if(connectionHistory.len > MAX_COOKIE_LENGTH)
message_admins("[key_name(src.owner)] was kicked for an invalid ban cookie)")
qdel(owner)
return
for(var/i in connectionHistory.len to 1 step -1)
if(QDELETED(owner))
//he got cleaned up before we were done
return
var/list/row = src.connectionHistory[i]
if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object
return
if (world.IsBanned(row["ckey"], row["ip"], row["compid"]))
found = row
break
CHECK_TICK
//Uh oh this fucker has a history of playing on a banned account!!
if (found.len > 0)
var/msg = "[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])"
//TODO: add a new evasion ban for the CURRENT client details, using the matched row details
message_admins(msg)
log_admin(msg)
cookieSent = TRUE
//Called by js client every 60 seconds
/datum/chatOutput/proc/ping()
return "pong"
//Called by js client on js error
/datum/chatOutput/proc/debug(error)
log_debug("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]")
//Global chat procs
/proc/to_chat_immediate(target, message, handle_whitespace = TRUE, trailing_newline = TRUE)
if(!target || !message)
return
if(target == world)
target = clients
var/original_message = message
if(handle_whitespace)
message = replacetext(message, "\n", "<br>")
message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
//Replace expanded \icon macro with icon2html
//regex/Replace with a proc won't work here because icon2html takes target as an argument and there is no way to pass it to the replacement proc
//not even hacks with reassigning usr work
var/regex/i = new(@/<IMG CLASS=icon SRC=(\[[^]]+])(?: ICONSTATE='([^']+)')?>/, "g")
while(i.Find(message))
message = copytext(message,1,i.index)+icon2html(locate(i.group[1]), target, icon_state=i.group[2])+copytext(message,i.next)
if(trailing_newline)
message += "<br>"
if(islist(target))
// Do the double-encoding outside the loop to save nanoseconds
var/twiceEncoded = url_encode(url_encode(message))
for(var/I in target)
var/client/C = CLIENT_FROM_VAR(I) //Grab us a client if possible
if (!C)
continue
//Send it to the old style output window.
legacy_chat(C, original_message)
if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file.
continue
if(!C.chatOutput.loaded)
//Client still loading, put their messages in a queue
C.chatOutput.messageQueue += message
continue
send_output(C, twiceEncoded, "browseroutput:output")
else
var/client/C = CLIENT_FROM_VAR(target) //Grab us a client if possible
if (!C)
return
//Send it to the old style output window.
legacy_chat(C, original_message)
if(!C.chatOutput || C.chatOutput.broken) // A player who hasn't updated his skin file.
return
if(!C.chatOutput.loaded)
//Client still loading, put their messages in a queue
C.chatOutput.messageQueue += message
return
// url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
send_output(C, url_encode(url_encode(message)), "browseroutput:output")
/proc/to_chat(target, message, handle_whitespace = TRUE, trailing_newline = TRUE)
set waitfor = FALSE
if(Master.initializing || !SSchat)
to_chat_immediate(target, message, handle_whitespace, trailing_newline)
return
SSchat.queue(target, message, handle_whitespace, trailing_newline)
/datum/chatOutput/proc/swaptolightmode() //Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
owner.force_white_theme()
/datum/chatOutput/proc/swaptodarkmode()
owner.force_dark_theme()
#undef MAX_COOKIE_LENGTH
@@ -0,0 +1,398 @@
/*****************************************
*
* GLOBAL STYLES
*
******************************************/
html, body {
padding: 0;
margin: 0;
height: 100%;
color: #a4bad6;
}
body {
background: #171717;
font-family: Verdana, sans-serif;
font-size: 13px;
color: #a4bad6;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
word-wrap: break-word;
scrollbar-face-color:#1A1A1A;
scrollbar-track-color:#171717;
scrollbar-highlight-color:#171717;
}
em {
font-style: normal;
font-weight: bold;
}
img {
margin: 0;
padding: 0;
line-height: 1;
-ms-interpolation-mode: nearest-neighbor;
image-rendering: pixelated;
}
img.icon {
height: 1em;
min-height: 1em;
width: auto;
vertical-align: bottom;
}
.r:before { /* "repeated" badge class for combined messages */
content: 'x';
}
.r {
display: inline-block;
min-width: 0.5em;
font-size: 0.7em;
padding: 0.2em 0.3em;
line-height: 1;
color: white;
text-align: center;
white-space: nowrap;
vertical-align: middle;
background-color: crimson;
border-radius: 10px;
}
a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
a.popt {text-decoration: none;}
/*****************************************
*
* OUTPUT NOT RELATED TO ACTUAL MESSAGES
*
******************************************/
#loading {
position: fixed;
width: 300px;
height: 150px;
text-align: center;
left: 50%;
top: 50%;
margin: -75px 0 0 -150px;
}
#loading i {display: block; padding-bottom: 3px;}
#messages {
font-size: 13px;
padding: 3px;
margin: 0;
word-wrap: break-word;
}
#newMessages {
position: fixed;
display: block;
bottom: 0;
right: 0;
padding: 8px;
background: #202020;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #a4bad6;
}
#newMessages:hover {background: #171717;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
right: 135px;
width: 45px;
background: #202020;
height: 30px;
padding: 8px 0 2px 0;
}
#ping i {display: block; text-align: center;}
#ping .ms {
display: block;
text-align: center;
font-size: 8pt;
padding-top: 2px;
}
#userBar {
position: fixed;
top: 0;
right: 0;
}
#userBar .subCell {
background: #202020;
height: 30px;
padding: 5px 0;
display: block;
color: #a4bad6;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #171717;
}
#userBar .subCell:hover {background: #202020;}
#userBar .toggle {
width: 45px;
background: #202020;
border-top: 0;
float: right;
text-align: center;
}
#userBar .sub {clear: both; display: none; width: 180px;}
#userBar .sub.scroll {overflow-y: scroll;}
#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#userBar .sub span {
display: block;
line-height: 30px;
float: left;
}
#userBar .sub i {
display: block;
padding: 0 5px;
font-size: 1.1em;
width: 22px;
text-align: center;
line-height: 30px;
float: right;
}
#userBar .sub input {
position: absolute;
padding: 7px 5px;
width: 121px;
line-height: 30px;
float: left;
}
#userBar .topCell {border-top: 0;}
/* POPUPS */
.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: 0.9em;
font-weight: bold;
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: 0.9em; font-weight: bold;}
.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: #FFFF00;}
.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
/* ADMIN CONTEXT MENU */
.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;
}
/* ADMIN FILTER MESSAGES MENU */
.filterMessages {padding: 5px;}
.filterMessages div {padding: 2px 0;}
.filterMessages input {}
.filterMessages label {}
.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
/*****************************************
*
* OUTPUT ACTUALLY RELATED TO MESSAGES
*
******************************************/
/* MOTD */
.motd {color: #a4bad6; font-family: Verdana, sans-serif;}
.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;}
/* ADD HERE FOR BOLD */
.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
/* ADD HERE FOR ITALIC */
.italic, .italics, .emote {font-style: italic;}
/* OUTPUT COLORS */
.highlight {background: yellow;}
h1, h2, h3, h4, h5, h6 {color: #a4bad6; font-family: Georgia, Verdana, sans-serif; line-height: 10%;}
em {font-style: normal; font-weight: bold;}
/* LOG */
.log_message {color: #386aff; font-weight: bold;}
/* CHAT TAGS */
.tag {color: #fff; border-radius: 15px; font-size: 80%; padding-left: 4px; padding-right: 4px;}
.ooc_tag {background-color: #3c5dc0;}
.looc_tag {color: #000; background-color: #46b2b2;}
.dev_tag {background-color: #2c7731;}
.admin_tag {background-color: #9611d4;}
.mod_tag {background-color: #663a0e;}
.dead_tag {background-color: #9269c7;}
.pmin_tag {background-color: #ff0000;}
.pmout_tag {background-color: #ff0000;}
.pmoutalt_tag {background-color: #b54a4a;}
.pmother_tag {background-color: #498db6;}
.help_tag {background-color: #ff0000;}
.aooc_tag {background-color: #920000;}
/* OOC */
.ooc {font-weight: bold;}
.ooc img.text_tag {width: 32px; height: 10px; vertical-align: middle;}
.ooc .everyone {color: #3c5dc0;}
.ooc .looc {color: #6699CC;}
.ooc .elevated {color: #2e78d9;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #2c7731;}
.ooc .admin {color: #b82e00;}
/* Admin: Private Messages */
.pm .howto {color: #ff0000; font-weight: bold; font-size: 200%;}
.pm .in {color: #ff0000;}
.pm .out {color: #ff0000;}
.pm .other {color: #0000ff;}
/* Admin: Channels */
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
.cciaasay {color: #22a9b4; font-weight: bold;}
.devsay {color: #2c7731; font-weight: bold;}
/* Radio: Misc */
.deadsay {color: #9269c7;}
.radio {color: #00a700;}
.deptradio {color: #ff00ff;} /* when all other department colors fail */
.newscaster {color: #b43c3c;}
/* Radio Channels */
.comradio {color: #5b8deb;}
.syndradio {color: #ac6667;}
.centradio {color: #7272a7;}
.airadio {color: #ec00ec;}
.entradio {color: #d19a46;}
.secradio {color: #e21111;}
.engradio {color: #cc7b01;}
.medradio {color: #0f7e62;}
.sciradio {color: #c03bc0;}
.supradio {color: #c09141;}
.srvradio {color: #7fc732;}
/* Miscellaneous */
.name {font-weight: bold;}
.alert {color: #d82020;}
.vote {color: #9933ff;}
h1.alert, h2.alert {color: #a4bad6;}
.emote {font-style: italic;}
/* Game Messages */
.attack {color: #ff0000;}
.moderate {color: #cc0000;}
.disarm {color: #990000;}
.passive {color: #660000;}
.danger {color: #c51e1e; font-weight: bold}
.warning {color: #c51e1e; font-style: italic;}
.boldannounce {color: #c51e1e; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #6685f5;}
.notice {color: #6685f5;}
.alium {color: #00ff00;}
.cult {color: #aa1c1c;}
/* Languages */
.alien {color: #ad67ad;}
.tajaran {color: #b15377;}
.tajaran_signlang {color: #cc2c2c;}
.skrell {color: #00CED1;}
.vaurca {color: #b9b943;}
.soghun {color: #2cad2c;}
.solcom {color: #5f5fd4;}
.soghun_alt {color: #1d9b1d;}
.changeling {color: #ad14ad;}
.vox {color: #bb19bb;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.yassa {color: #6323b6;}
.delvahhi {color: #914123; font-weight: bold;}
.siiktau {color: #be3434;}
.interface {color: #750e75;}
.good {color: #4f7529; font-weight: bold;}
.bad {color: #ee0000; font-weight: bold;}
@keyframes hypnocolor {
0% {color: #202020;}
25% {color: #4b02ac;}
50% {color: #9f41f1;}
75% {color: #541c9c;}
100% {color: #7adbf3;}
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% {color: #f75a5a;}
50% {color: #dd0000;}
100% {color: #f75a5a;}
}
.icon {height: 1em; width: auto;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
.ml-1 {margin-left: 1em;}
.ml-2 {margin-left: 2em;}
.ml-3 {margin-left: 3em;}
@@ -0,0 +1,395 @@
/*****************************************
*
* GLOBAL STYLES for white theme normies
*
******************************************/
html, body {
padding: 0;
margin: 0;
height: 100%;
color: #000000;
}
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;
}
em {
font-style: normal;
font-weight: bold;
}
img {
margin: 0;
padding: 0;
line-height: 1;
-ms-interpolation-mode: nearest-neighbor;
image-rendering: pixelated;
}
img.icon {
height: 1em;
min-height: 1em;
width: auto;
vertical-align: bottom;
}
.r:before { /* "repeated" badge class for combined messages */
content: 'x';
}
.r {
display: inline-block;
min-width: 0.5em;
font-size: 0.7em;
padding: 0.2em 0.3em;
line-height: 1;
color: white;
text-align: center;
white-space: nowrap;
vertical-align: middle;
background-color: crimson;
border-radius: 10px;
}
a {color: #0000ff;}
a.visited {color: #ff00ff;}
a:visited {color: #ff00ff;}
a.popt {text-decoration: none;}
/*****************************************
*
* OUTPUT NOT RELATED TO ACTUAL MESSAGES
*
******************************************/
#loading {
position: fixed;
width: 300px;
height: 150px;
text-align: center;
left: 50%;
top: 50%;
margin: -75px 0 0 -150px;
}
#loading i {display: block; padding-bottom: 3px;}
#messages {
font-size: 13px;
padding: 3px;
margin: 0;
word-wrap: break-word;
}
#newMessages {
position: fixed;
display: block;
bottom: 0;
right: 0;
padding: 8px;
background: #ddd;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #333;
}
#newMessages:hover {background: #ccc;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#ping {
position: fixed;
top: 0;
right: 135px;
width: 45px;
background: #ddd;
height: 30px;
padding: 8px 0 2px 0;
}
#ping i {display: block; text-align: center;}
#ping .ms {
display: block;
text-align: center;
font-size: 8pt;
padding-top: 2px;
}
#userBar {
position: fixed;
top: 0;
right: 0;
}
#userBar .subCell {
background: #ddd;
height: 30px;
padding: 5px 0;
display: block;
color: #333;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #b4b4b4;
}
#userBar .subCell:hover {background: #ccc;}
#userBar .toggle {
width: 45px;
background: #ccc;
border-top: 0;
float: right;
text-align: center;
}
#userBar .sub {clear: both; display: none; width: 180px;}
#userBar .sub.scroll {overflow-y: scroll;}
#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#userBar .sub span {
display: block;
line-height: 30px;
float: left;
}
#userBar .sub i {
display: block;
padding: 0 5px;
font-size: 1.1em;
width: 22px;
text-align: center;
line-height: 30px;
float: right;
}
#userBar .sub input {
position: absolute;
padding: 7px 5px;
width: 121px;
line-height: 30px;
float: left;
}
#userBar .topCell {border-top: 0;}
/* POPUPS */
.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: 0.9em;
font-weight: bold;
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: 0.9em; font-weight: bold;}
.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: #FFFF00;}
.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
/* ADMIN CONTEXT MENU */
.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;
}
/* ADMIN FILTER MESSAGES MENU */
.filterMessages {padding: 5px;}
.filterMessages div {padding: 2px 0;}
.filterMessages input {}
.filterMessages label {}
.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
/*****************************************
*
* OUTPUT ACTUALLY RELATED TO MESSAGES
*
******************************************/
/* MOTD */
.motd {color: #638500; font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6 {color: #638500; text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover {color: #638500;}
/* ADD HERE FOR BOLD */
.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
/* ADD HERE FOR ITALIC */
.italic, .italics, .emote {font-style: italic;}
/* OUTPUT COLORS */
.highlight {background: yellow;}
h1, h2, h3, h4, h5, h6 {color: #0000ff; font-family: Georgia, Verdana, sans-serif; line-height: 10%;}
em {font-style: normal;font-weight: bold;}
/* LOG */
.log_message {color: #386aff;font-weight: bold;}
/* CHAT TAGS */
.tag {color: #fff; border-radius: 15px; font-size: 80%; padding-left: 4px; padding-right: 4px;}
.ooc_tag {background-color: #002eb8;}
.looc_tag {color: #000; background-color: #46b2b2;}
.dev_tag {background-color: #2c7731;}
.admin_tag {background-color: #9611d4;}
.mod_tag {background-color: #663a0e;}
.dead_tag {background-color: #530fad;}
.pmin_tag {background-color: #ff0000;}
.pmout_tag {background-color: #ff0000;}
.pmoutalt_tag {background-color: #b54a4a;}
.pmother_tag {background-color: #498db6;}
.help_tag {background-color: #ff0000;}
.aooc_tag {background-color: #920000;}
/* OOC */
.ooc {font-weight: bold;}
.ooc img.text_tag {width: 32px; height: 10px; vertical-align: middle;}
.ooc .everyone {color: #002eb8;}
.ooc .looc {color: #6699CC;}
.ooc .elevated {color: #2e78d9;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #2c7731;}
.ooc .admin {color: #b82e00;}
/* Admin: Private Messages */
.pm .howto {color: #ff0000; font-weight: bold; font-size: 200%;}
.pm .in {color: #ff0000;}
.pm .out {color: #ff0000;}
.pm .other {color: #0000ff;}
/* Admin: Channels */
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
.cciaasay {color: #22a9b4; font-weight: bold;}
.devsay {color: #2c7731; font-weight: bold;}
/* Radio: Misc */
.deadsay {color: #530FAD;}
.radio {color: #008000;}
.deptradio {color: #ff00ff;} /* when all other department colors fail */
.newscaster {color: #750000;}
/* Radio Channels */
.comradio {color: #193A7A;}
.syndradio {color: #6D3F40;}
.centradio {color: #5C5C8A;}
.airadio {color: #FF00FF;}
.entradio {color: #bd893c;}
.secradio {color: #A30000;}
.engradio {color: #A66300;}
.medradio {color: #0a5c47;}
.sciradio {color: #993399;}
.supradio {color: #5F4519;}
.srvradio {color: #6eaa2c;}
/* Miscellaneous */
.name {font-weight: bold;}
.alert {color: #ff0000;}
.vote {color: #6c18c0}
h1.alert, h2.alert {color: #000080;}
.emote {font-style: italic;}
/* Game Messages */
.attack {color: #ff0000;}
.moderate {color: #cc0000;}
.disarm {color: #990000;}
.passive {color: #660000;}
.danger {color: #ff0000; font-weight: bold}
.warning {color: #ff0000; font-style: italic;}
.boldannounce {color: #ff0000; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #0000CC;}
.notice {color: #000099;}
.alium {color: #00ff00;}
.cult {color: #800080; font-weight: bold; font-style: italic;}
/* Languages */
.alien {color: #543354;}
.tajaran {color: #803B56;}
.tajaran_signlang {color: #941C1C;}
.skrell {color: #00CED1;}
.vaurca {color: #9e9e39;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
.soghun_alt {color: #024402;}
.changeling {color: #800080;}
.vox {color: #AA00AA;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.yassa {color: #400987;}
.delvahhi {color: #5E2612; font-weight: bold;}
.siiktau {color: #A52A2A;}
.interface {color: #750e75;}
.good {color: #4f7529; font-weight: bold;}
.bad {color: #ee0000; font-weight: bold;}
@keyframes hypnocolor {
0% {color: #0d0d0d;}
25% {color: #410194;}
50% {color: #7f17d8;}
75% {color: #410194;}
100% {color: #3bb5d3;}
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% {color: #0d0d0d;}
50% {color: #dd0000;}
100% {color: #0d0d0d;}
}
.icon {height: 1em; width: auto;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: blue; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
.ml-1 {margin-left: 1em;}
.ml-2 {margin-left: 2em;}
.ml-3 {margin-left: 3em;}
@@ -0,0 +1,365 @@
/*****************************************
*
* GLOBAL STYLES
*
******************************************/
html, body {
padding: 0;
margin: 0;
height: 100%;
color: #a4bad6;
}
body {
background: #171717;
font-family: Verdana, sans-serif;
font-size: 13px;
color: #a4bad6;
line-height: 1.2;
overflow-x: hidden;
overflow-y: scroll;
word-wrap: break-word;
scrollbar-face-color:#1A1A1A;
scrollbar-track-color:#171717;
scrollbar-highlight-color:#171717;
}
em {
font-style: normal;
font-weight: bold;
}
img {
margin: 0;
padding: 0;
line-height: 1;
-ms-interpolation-mode: nearest-neighbor;
image-rendering: pixelated;
}
img.icon {
height: 1em;
min-height: 1em;
width: auto;
vertical-align: bottom;
}
.r:before { /* "repeated" badge class for combined messages */
content: 'x';
}
.r {
display: inline-block;
min-width: 0.5em;
font-size: 0.7em;
padding: 0.2em 0.3em;
line-height: 1;
color: white;
text-align: center;
white-space: nowrap;
vertical-align: middle;
background-color: crimson;
border-radius: 10px;
}
a {color: #397ea5;}
a.visited {color: #7c00e6;}
a:visited {color: #7c00e6;}
a.popt {text-decoration: none;}
/*****************************************
*
* OUTPUT NOT RELATED TO ACTUAL MESSAGES
*
******************************************/
#loading {
position: fixed;
width: 300px;
height: 150px;
text-align: center;
left: 50%;
top: 50%;
margin: -75px 0 0 -150px;
}
#loading i {display: block; padding-bottom: 3px;}
#messages {
font-size: 13px;
padding: 3px;
margin: 0;
word-wrap: break-word;
}
#newMessages {
position: fixed;
display: block;
bottom: 0;
right: 0;
padding: 8px;
background: #202020;
text-decoration: none;
font-variant: small-caps;
font-size: 1.1em;
font-weight: bold;
color: #a4bad6;
}
#newMessages:hover {background: #171717;}
#newMessages i {vertical-align: middle; padding-left: 3px;}
#userBar {
position: fixed;
top: 0;
right: 0;
}
#userBar .subCell {
background: #202020;
height: 30px;
padding: 5px 0;
display: block;
color: #a4bad6;
text-decoration: none;
line-height: 28px;
border-top: 1px solid #171717;
}
#userBar .subCell:hover {background: #202020;}
#userBar .toggle {
width: 45px;
background: #202020;
border-top: 0;
float: right;
text-align: center;
}
#userBar .sub {clear: both; display: none; width: 180px;}
#userBar .sub.scroll {overflow-y: scroll;}
#userBar .sub.subCell {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;}
#userBar .sub span {
display: block;
line-height: 30px;
float: left;
}
#userBar .sub i {
display: block;
padding: 0 5px;
font-size: 1.1em;
width: 22px;
text-align: center;
line-height: 30px;
float: right;
}
#userBar .sub input {
position: absolute;
padding: 7px 5px;
width: 121px;
line-height: 30px;
float: left;
}
#userBar .topCell {border-top: 0;}
/* POPUPS */
.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: 0.9em;
font-weight: bold;
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: 0.9em; font-weight: bold;}
.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: #FFFF00;}
.highlightPopup input.highlightTermSubmit {margin-top: 5px;}
/* ADMIN CONTEXT MENU */
.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;
}
/* ADMIN FILTER MESSAGES MENU */
.filterMessages {padding: 5px;}
.filterMessages div {padding: 2px 0;}
.filterMessages input {}
.filterMessages label {}
.icon-stack {height: 1em; line-height: 1em; width: 1em; vertical-align: middle; margin-top: -2px;}
/*****************************************
*
* OUTPUT ACTUALLY RELATED TO MESSAGES
*
******************************************/
/* MOTD */
.motd {color: #a4bad6; font-family: Verdana, sans-serif;}
.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;}
/* ADD HERE FOR BOLD */
.bold, .name, .prefix, .ooc, .looc, .adminooc, .admin, .medal, .yell {font-weight: bold;}
/* ADD HERE FOR ITALIC */
.italic, .italics, .emote {font-style: italic;}
/* OUTPUT COLORS */
.highlight {background: yellow;}
h1, h2, h3, h4, h5, h6 {color: #a4bad6; font-family: Georgia, Verdana, sans-serif; margin-bottom: 20%;}
em {font-style: normal; font-weight: bold;}
/* LOG */
.log_message {color: #386aff; font-weight: bold;}
/* OOC */
.ooc {font-weight: bold;}
.ooc img.text_tag {width: 32px; height: 10px; vertical-align: middle;}
.ooc .everyone {color: #002eb8;}
.ooc .looc {color: #6699CC;}
.ooc .elevated {color: #2e78d9;}
.ooc .moderator {color: #184880;}
.ooc .developer {color: #1b521f;}
.ooc .admin {color: #b82e00;}
/* Admin: Private Messages */
.pm .howto {color: #ff0000; font-weight: bold; font-size: 200%;}
.pm .in {color: #ff0000;}
.pm .out {color: #ff0000;}
.pm .other {color: #0000ff;}
/* Admin: Channels */
.mod_channel {color: #735638; font-weight: bold;}
.mod_channel .admin {color: #b82e00; font-weight: bold;}
.admin_channel {color: #9611D4; font-weight: bold;}
.cciaasay {color: #22a9b4; font-weight: bold;}
.devsay {color: #1b521f; font-weight: bold;}
/* Radio: Misc */
.deadsay {color: #530FAD;}
.radio {color: #008000;}
.deptradio {color: #ff00ff;} /* when all other department colors fail */
.newscaster {color: #750000;}
/* Radio Channels */
.comradio {color: #193A7A;}
.syndradio {color: #6D3F40;}
.centradio {color: #5C5C8A;}
.airadio {color: #FF00FF;}
.entradio {color: #bd893c;}
.secradio {color: #A30000;}
.engradio {color: #A66300;}
.medradio {color: #0a5c47;}
.sciradio {color: #993399;}
.supradio {color: #5F4519;}
.srvradio {color: #6eaa2c;}
/* Miscellaneous */
.name {font-weight: bold;}
.alert {color: #ff0000;}
h1.alert, h2.alert {color: #000080;}
.emote {font-style: italic;}
/* Game Messages */
.attack {color: #ff0000;}
.moderate {color: #cc0000;}
.disarm {color: #990000;}
.passive {color: #660000;}
.danger {color: #ff0000; font-weight: bold;}
.warning {color: #ff0000; font-style: italic;}
.boldannounce {color: #ff0000; font-weight: bold;}
.rose {color: #ff5050;}
.info {color: #0000cc;}
.notice {color: #000099;}
.alium {color: #00ff00;}
.cult {color: #800080; font-weight: bold; font-style: italic;}
/* Languages */
.alien {color: #543354;}
.tajaran {color: #803B56;}
.tajaran_signlang {color: #941C1C;}
.skrell {color: #00CED1;}
.vaurca {color: #9e9e39;}
.soghun {color: #228B22;}
.solcom {color: #22228B;}
.soghun_alt {color: #024402;}
.changeling {color: #800080;}
.vox {color: #AA00AA;}
.rough {font-family: "Trebuchet MS", cursive, sans-serif;}
.say_quote {font-family: Georgia, Verdana, sans-serif;}
.yassa {color: #400987;}
.delvahhi {color: #5E2612; font-weight: bold;}
.siiktau {color: #A52A2A;}
.interface {color: #750e75;}
.good {color: #4f7529; font-weight: bold;}
.bad {color: #ee0000; font-weight: bold;}
@keyframes hypnocolor {
0% {color: #202020;}
25% {color: #4b02ac;}
50% {color: #9f41f1;}
75% {color: #541c9c;}
100% {color: #7adbf3;}
}
.phobia {color: #dd0000; font-weight: bold; animation: phobia 750ms infinite;}
@keyframes phobia {
0% {color: #f75a5a;}
50% {color: #dd0000;}
100% {color: #f75a5a;}
}
.icon {height: 1em; width: auto;}
.connectionClosed, .fatalError {background: red; color: white; padding: 5px;}
.connectionClosed.restored {background: green;}
.internal.boldnshit {color: #3d5bc3; font-weight: bold;}
/* HELPER CLASSES */
.text-normal {font-weight: normal; font-style: normal;}
.hidden {display: none; visibility: hidden;}
@@ -0,0 +1,71 @@
<!DOCTYPE html>
<html>
<head>
<title>Chat</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="font-awesome.css" />
<link id="sheetofstyles" rel="stylesheet" type="text/css" href="browserOutput_white.css" />
<link rel="stylesheet" type="text/css" href="spritesheet_chat.css" />
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="json2.min.js"></script>
</head>
<body>
<div id="loading">
<i class="fas fa-spinner fa-2x"></i>
<div>
Loading...<br><br>
If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times.<br>
If it <b>still</b> doesn't work, use the bug report button at the top right of the window.
</div>
</div>
<div id="messages">
</div>
<div id="userBar" style="display: none;">
<div id="ping">
<i class="fas fa-circle" id="pingDot"></i>
<span class="ms" id="pingMs">--ms</span>
</div>
<div id="theme">
<a href="#" class="subCell toggle" id="toggleTheme" title="Theme"><i class="fas fa-adjust"></i></a>
</div>
<div id="font">
<a href="#" class="subCell toggle" id="toggleFont" title="Font"><i class="fas fa-font"></i></a>
</div>
<div id="options">
<a href="#" class="subCell toggle" id="toggleOptions" title="Options"><i class="fas fa-cog"></i></a>
</div>
<div class="sub" id="subTheme">
<a href="#" class="subCell topCell" id="setWhiteTheme">
<span>Set White Theme</span>
<i class="fas fa-adjust"></i>
</a>
<a href="#" class="subCell" id="setDarkTheme">
<span>Set Dark Theme</span>
<i class="fas fa-adjust"></i>
</a>
</div>
<div class="sub" id="subOptions">
<a href="#" class="subCell decreaseFont topCell" id="decreaseFont"><span>Decrease font size</span> <i class="fas fa-font"></i></a>
<a href="#" class="subCell increaseFont" id="increaseFont"><span>Increase font size</span> <i class="fas fa-font"></i></a>
<a href="#" class="subCell decreaseIcon" id="decreaseIcon"><span>Decrease icon size</span> <i class="fas fa-image"></i></a>
<a href="#" class="subCell increaseIcon" id="increaseIcon"><span>Increase icon size</span> <i class="fas fa-image"></i></a>
<a href="#" class="subCell decreaseLineHeight" id="decreaseLineHeight"><span>Decrease line height</span> <i class="fas fa-text-height"></i></a>
<a href="#" class="subCell increaseLineHeight" id="increaseLineHeight"><span>Increase line height</span> <i class="fas fa-text-height"></i></a>
<a href="#" class="subCell togglePing" id="togglePing"><span>Toggle ping display</span> <i class="fas fa-circle"></i></a>
<a href="#" class="subCell highlightTerm" id="highlightTerm"><span>Highlight string</span> <i class="fas fa-tag"></i></a>
<a href="#" class="subCell saveLog" id="saveLog"><span>Save chat log</span> <i class="fas fa-save"></i></a>
<a href="#" class="subCell toggleCombine" id="toggleCombine"><span>Toggle line combining</span> <i class="fas fa-filter"></i></a>
<a href="#" class="subCell clearMessages" id="clearMessages"><span>Clear all messages</span> <i class="fas fa-eraser"></i></a>
</div>
<div class="sub" id="subFont">
<span class="subCell topCell" id="fontInputSpan">
<input id="fontInput" type="text" class="hidden" placeholder="Font name (Arial, 'PT Sans' for example)"><i class="fas fa-font"></i>
</span>
</div>
</div>
<script type="text/javascript" src="browserOutput.js"></script>
</body>
</html>
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
"object"!=typeof JSON&&(JSON={}),function(){"use strict";function f(t){return 10>t?"0"+t:t}function this_value(){return this.valueOf()}function quote(t){return rx_escapable.lastIndex=0,rx_escapable.test(t)?'"'+t.replace(rx_escapable,function(t){var e=meta[t];return"string"==typeof e?e:"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+t+'"'}function str(t,e){var r,n,o,u,f,a=gap,i=e[t];switch(i&&"object"==typeof i&&"function"==typeof i.toJSON&&(i=i.toJSON(t)),"function"==typeof rep&&(i=rep.call(e,t,i)),typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";if(gap+=indent,f=[],"[object Array]"===Object.prototype.toString.apply(i)){for(u=i.length,r=0;u>r;r+=1)f[r]=str(r,i)||"null";return o=0===f.length?"[]":gap?"[\n"+gap+f.join(",\n"+gap)+"\n"+a+"]":"["+f.join(",")+"]",gap=a,o}if(rep&&"object"==typeof rep)for(u=rep.length,r=0;u>r;r+=1)"string"==typeof rep[r]&&(n=rep[r],o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));else for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(o=str(n,i),o&&f.push(quote(n)+(gap?": ":":")+o));return o=0===f.length?"{}":gap?"{\n"+gap+f.join(",\n"+gap)+"\n"+a+"}":"{"+f.join(",")+"}",gap=a,o}}var rx_one=/^[\],:{}\s]*$/,rx_two=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,rx_three=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,rx_four=/(?:^|:|,)(?:\s*\[)+/g,rx_escapable=/[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,rx_dangerous=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;"function"!=typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},Boolean.prototype.toJSON=this_value,Number.prototype.toJSON=this_value,String.prototype.toJSON=this_value);var gap,indent,meta,rep;"function"!=typeof JSON.stringify&&(meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},JSON.stringify=function(t,e,r){var n;if(gap="",indent="","number"==typeof r)for(n=0;r>n;n+=1)indent+=" ";else"string"==typeof r&&(indent=r);if(rep=e,e&&"function"!=typeof e&&("object"!=typeof e||"number"!=typeof e.length))throw new Error("JSON.stringify");return str("",{"":t})}),"function"!=typeof JSON.parse&&(JSON.parse=function(text,reviver){function walk(t,e){var r,n,o=t[e];if(o&&"object"==typeof o)for(r in o)Object.prototype.hasOwnProperty.call(o,r)&&(n=walk(o,r),void 0!==n?o[r]=n:delete o[r]);return reviver.call(t,e,o)}var j;if(text=String(text),rx_dangerous.lastIndex=0,rx_dangerous.test(text)&&(text=text.replace(rx_dangerous,function(t){return"\\u"+("0000"+t.charCodeAt(0).toString(16)).slice(-4)})),rx_one.test(text.replace(rx_two,"@").replace(rx_three,"]").replace(rx_four,"")))return j=eval("("+text+")"),"function"==typeof reviver?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}();
@@ -61,7 +61,7 @@
to_chat(M, "<B>[holder]</B> [chosen_emote]")
//For adding accent tags when you imagine people talking to you
/datum/hallucination/proc/get_hallucinated_accent(var/mob/living/talker)
/datum/hallucination/proc/get_hallucinated_accent(var/mob/living/talker, var/mob/hearer)
var/hal_accent
if(ishuman(talker))
var/mob/living/carbon/human/T = talker
@@ -71,4 +71,4 @@
var/datum/accent/a = SSrecords.accents[hal_accent]
var/final_icon = a.tag_icon
return "<IMG src='\ref['./icons/accent_tags.dmi']' class='text_tag' iconstate='[final_icon]'>"
return "<img src=\"[final_icon].png\">"
+1 -1
View File
@@ -10,7 +10,7 @@
log_say("Hallucination level changed [orig_message] by [speaker] to [message] for [key_name(src)].", ckey=key_name(src))
return ..()
/mob/living/carbon/hear_radio(var/message, var/verb="says", var/datum/language/language, var/part_a, var/part_b, var/mob/speaker, var/hard_to_hear = 0, var/vname ="")
/mob/living/carbon/hear_radio(var/message, var/verb="says", var/datum/language/language, var/part_a, var/part_b, var/part_c, var/mob/speaker, var/hard_to_hear = 0, var/vname ="")
if(hallucination >= 60 && prob(1))
var/orig_message = message
message = pick(SShallucinations.hallucinated_phrases)
+6 -6
View File
@@ -51,7 +51,7 @@
if(9)
sound_to(holder, 'sound/effects/nuclearsiren.ogg')
to_chat(holder, "<font color='#008000'><b>Supermatter Monitor</b> states, \"WARNING: SUPERMATTER CRYSTAL DELAMINATION IMMINENT.\"</font>")
to_chat(holder, "<span class='radio'><b>Supermatter Monitor</b> states, \"WARNING: SUPERMATTER CRYSTAL DELAMINATION IMMINENT.\"</span>")
addtimer(CALLBACK(src, .proc/delam_call), 20)
addtimer(CALLBACK(src, .proc/delam_call), 35)
@@ -82,9 +82,9 @@
return
var/radio_exclaim = pick("Oh SHIT!", "Oh fuck.", "Uhhh!", "That's not good!", "FUCK.", "Engineering?", "It's under control!", "We're fucked!", "Ohhhh boy.", "What?!", "Um, <b>what?!</b>")
var/mob/living/caller = pick(people)
var/caller_accent = get_hallucinated_accent(caller)
var/caller_accent = get_hallucinated_accent(caller, holder)
to_chat(holder, "[caller_accent] <font color='#008000'><b>[pick(people)]</b> says, \"[radio_exclaim]\"</font>")
to_chat(holder, "[caller_accent] <span class='radio'><b>[pick(people)]</b> says, \"[radio_exclaim]\"</span>")
/datum/hallucination/pda //fake PDA messages. this only plays the beep and sends something to chat; it won't show up in the PDA.
@@ -269,7 +269,7 @@
"[pal] will keep you safe.",
"You feel captivated by [pal]'s charisma.",
"[pal] might as well be family to you.")
to_chat(holder, "<font color='green'><i>[pick(halpal_emotes)]</i></font>")
to_chat(holder, "<span class='good'><i>[pick(halpal_emotes)]</i></span>")
/datum/hallucination/passive
duration = 600 //minute fallback
@@ -419,7 +419,7 @@
var/mob/living/talker = pick(candidates) //Who is talking to us?
var/message //What will they say?
var/accent_tag = get_hallucinated_accent(talker) //Can't forget the accent
var/accent_tag = get_hallucinated_accent(talker, holder) //Can't forget the accent
//Name selection. This gives us variety. Sometimes it will be your last name, sometimes your first.
var/list/names = list()
@@ -478,7 +478,7 @@
whisper_candidates += M
if(whisper_candidates.len)
var/mob/living/whisperer = pick(whisper_candidates)
var/whisper_accent = get_hallucinated_accent(whisperer)
var/whisper_accent = get_hallucinated_accent(whisperer, holder)
if(prob(70))
to_chat(holder, "[whisper_accent] <B>[whisperer]</B> whispers, <I>\"[pick(SShallucinations.hallucinated_phrases)]\"</I>")
else
@@ -157,8 +157,8 @@
playsound(src.loc, arms.punch_sound, 45 + 25 * (arms.melee_damage / 50), -1 )
if(ismob(A))
var/mob/target = A
user.attack_log += "\[[time_stamp()]\]<font color='red'> Attacked [target.name] ([target.ckey]) with [arms] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(arms.damagetype)])</font>"
src.attack_log += "\[[time_stamp()]\]<font color='red'> [user] ([user.ckey]) attacked [target.name] ([target.ckey]) with [arms] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(arms.damagetype)])</font>"
user.attack_log += "\[[time_stamp()]\]<span class='warning'> Attacked [target.name] ([target.ckey]) with [arms] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(arms.damagetype)])</span>"
src.attack_log += "\[[time_stamp()]\]<span class='warning'> [user] ([user.ckey]) attacked [target.name] ([target.ckey]) with [arms] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(arms.damagetype)])</span>"
target.attack_log += "\[[time_stamp()]\]<font color='orange'> Attacked by [user.name] ([user.ckey]) with [arms] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(arms.damagetype)])</font>"
msg_admin_attack("[key_name(user, highlight_special = 1)] attacked [key_name(target, highlight_special = 1)] with [arms] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(arms.damagetype)]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[user.x];Y=[user.y];Z=[user.z]'>JMP</a>)",ckey=key_name(user),ckey_target=key_name(target) )
return A.attack_generic(src, arms.melee_damage, "attacked")
@@ -543,7 +543,7 @@
var/mob/living/carbon/human/D = H
if(D.lying)
D.attack_log += "\[[time_stamp()]\]<font color='orange'> Was trampled by [src]</font>"
attack_log += text("\[[time_stamp()]\] <font color='red'>trampled [D.name] ([D.ckey]) with \the [src].</font>")
attack_log += text("\[[time_stamp()]\] <span class='warning'>trampled [D.name] ([D.ckey]) with \the [src].</span>")
msg_admin_attack("[src] trampled [key_name(D)] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[D.x];Y=[D.y];Z=[D.z]'>JMP</a>)" )
src.visible_message("<span class='danger'>\The [src] runs over \the [D]!</span>")
D.apply_damage(legs.trample_damage, BRUTE)
+5 -5
View File
@@ -68,15 +68,15 @@
active = 0
if(failed_task)
failed_task = 0
visible_message("\icon[src] [src] pings unhappily, flashing a red warning light.")
visible_message("[icon2html(src, viewers(get_turf(src)))] [src] pings unhappily, flashing a red warning light.")
else
visible_message("\icon[src] [src] pings happily.")
visible_message("[icon2html(src, viewers(get_turf(src)))] [src] pings happily.")
if(eject_disk)
eject_disk = 0
if(loaded_disk)
loaded_disk.forceMove(get_turf(src))
visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
visible_message("[icon2html(src, viewers(get_turf(src)))] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
/obj/machinery/botany/attackby(obj/item/W as obj, mob/user as mob)
@@ -190,14 +190,14 @@
SSplants.seeds[seed.seed.name] = seed.seed
seed.update_seed()
visible_message("\icon[src] [src] beeps and spits out [seed].")
visible_message("[icon2html(src, viewers(get_turf(src)))] [src] beeps and spits out [seed].")
seed = null
if(href_list["eject_disk"])
if(!loaded_disk) return
loaded_disk.forceMove(get_turf(src))
visible_message("\icon[src] [src] beeps and spits out [loaded_disk].")
visible_message("[icon2html(src, viewers(get_turf(src)))] [src] beeps and spits out [loaded_disk].")
loaded_disk = null
usr.set_machine(src)
+3 -3
View File
@@ -172,7 +172,7 @@
var/dat = "<center><h1>Seed storage contents</h1></center>"
if (piles.len == 0)
dat += "<font color='red'>No seeds</font>"
dat += "<span class='warning'>No seeds</span>"
else
dat += "<table style='text-align:center;border-style:solid;border-width:1px;padding:4px'><tr><td>Name</td>"
dat += "<td>Variety</td>"
@@ -227,12 +227,12 @@
if(1)
dat += "CARN "
if(2)
dat += "<font color='red'>CARN </font>"
dat += "<span class='warning'>CARN </span>"
switch(seed.get_trait(TRAIT_SPREAD))
if(1)
dat += "VINE "
if(2)
dat += "<font color='red'>VINE </font>"
dat += "<span class='warning'>VINE </span>"
if ("pressure" in scanner)
if(seed.get_trait(TRAIT_LOWKPA_TOLERANCE) < 20)
dat += "LP "
+4 -4
View File
@@ -143,7 +143,7 @@
if(nymph.nutrition > 100 && nutrilevel < 10)
nymph.adjustNutritionLoss((10-nutrilevel)*5)
nutrilevel = 10
nymph.visible_message("<font color='blue'><b>[nymph]</b> secretes a trickle of green liquid, refilling [src].</font>","<font color='blue'>You secrete a trickle of green liquid, refilling [src].</font>")
nymph.visible_message("<span class='notice'><b>[nymph]</b> secretes a trickle of green liquid, refilling [src].</span>","<span class='notice'>You secrete a trickle of green liquid, refilling [src].</span>")
return//Nymphs cant open and close lids
if(mechanical && !usr.incapacitated() && Adjacent(usr))
close_lid(usr)
@@ -177,18 +177,18 @@
if(weedlevel > 0)
nymph.ingested.add_reagent(/datum/reagent/nutriment, weedlevel/6)
weedlevel = 0
nymph.visible_message("<font color='blue'><b>[nymph]</b> roots through [src], ripping out weeds and eating them noisily.</font>","<font color='blue'>You root through [src], ripping out weeds and eating them noisily.</font>")
nymph.visible_message("<span class='notice'><b>[nymph]</b> roots through [src], ripping out weeds and eating them noisily.</span>","<span class='notice'>You root through [src], ripping out weeds and eating them noisily.</span>")
return
if (dead)//Let nymphs eat dead plants
nymph.ingested.add_reagent(/datum/reagent/nutriment, 1)
nymph.visible_message("<font color='blue'><b>[nymph]</b> rips out the dead plants from [src], and loudly munches them.</font>","<font color='blue'>You root out the dead plants in [src], eating them with loud chewing sounds.</font>")
nymph.visible_message("<span class='notice'><b>[nymph]</b> rips out the dead plants from [src], and loudly munches them.</span>","<span class='notice'>You root out the dead plants in [src], eating them with loud chewing sounds.</span>")
remove_dead(user)
return
if (harvest)
harvest(user)
return
else
nymph.visible_message("<font color='blue'><b>[nymph]</b> rolls around in [src] for a bit.</font>","<font color='blue'>You roll around in [src] for a bit.</font>")
nymph.visible_message("<span class='notice'><b>[nymph]</b> rolls around in [src] for a bit.</span>","<span class='notice'>You roll around in [src] for a bit.</span>")
return
/obj/machinery/portable_atmospherics/hydroponics/New()
@@ -399,7 +399,7 @@
activate_pin(3)
for(var/mob/O in hearers(1, get_turf(src)))
O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2)
O.show_message(text("[icon2html(src, viewers(get_turf(src)))] *beep* *beep*"), 3, "*beep* *beep*", 2)
//This circuit gives information on where the machine is.
/obj/item/integrated_circuit/input/gps
@@ -43,7 +43,7 @@
var/list/nearby_things = range(0, get_turf(src))
for(var/mob/M in nearby_things)
var/obj/O = assembly ? assembly : src
to_chat(M, "<span class='notice'>\icon[O] [stuff_to_display]</span>")
to_chat(M, "<span class='notice'>[icon2html(O, viewers(get_turf(src)))] [stuff_to_display]</span>")
/obj/item/integrated_circuit/output/screen/large
name = "large screen"
@@ -54,7 +54,7 @@
/obj/item/integrated_circuit/output/screen/large/do_work()
..()
var/obj/O = assembly ? loc : assembly
O.visible_message("<span class='notice'>\icon[O] [stuff_to_display]</span>")
O.visible_message("<span class='notice'>[icon2html(O, viewers(get_turf(src)))] [stuff_to_display]</span>")
/obj/item/integrated_circuit/output/light
name = "light"
@@ -153,7 +153,7 @@
text = get_pin_data(IC_INPUT, 1)
if(!isnull(text))
var/obj/O = assembly ? loc : assembly
audible_message("\icon[O] \The [O.name] states, \"[text]\"")
audible_message("[icon2html(O, viewers(get_turf(O)))] \The [O.name] states, \"[text]\"")
/obj/item/integrated_circuit/output/sound/Initialize()
. = ..()
+1 -1
View File
@@ -359,6 +359,6 @@
if(src.computer)
to_chat(user, "<font color=green>Computer has been associated with this unit.</font>")
else
to_chat(user, "<font color=red>No associated computer found. Only local scans will function properly.</font>")
to_chat(user, "<span class='attack'>No associated computer found. Only local scans will function properly.</span>")
to_chat(user, "\n")
+2 -2
View File
@@ -490,8 +490,8 @@ atom
// set this up (at runtime) as follows:
// list(\
// 'player.dmi'="player",\
// 'monster.dmi'="monster",\
// 'player.dmi'="player",
// 'monster.dmi'="monster",
// ...
// 'item.dmi'="item")
var/list/swapmaps_iconcache
+1 -1
View File
@@ -89,7 +89,7 @@
D.visible_message("<span class='danger'>[attack_message]</span>")
playsound(D.loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1)
A.attack_log += text("\[[time_stamp()]\] <font color='red'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [D.name] ([D.ckey])</font>")
A.attack_log += text("\[[time_stamp()]\] <span class='warning'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [D.name] ([D.ckey])</span>")
D.attack_log += text("\[[time_stamp()]\] <font color='orange'>[miss_type ? (miss_type == 1 ? "Was missed by" : "Has blocked") : "Has Been [pick(attack.attack_verb)]"] by [A.name] ([A.ckey])</font>")
msg_admin_attack("[key_name(A)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]"] [key_name(D)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>JMP</a>)",ckey=key_name(A),ckey_target=key_name(D))
+2 -2
View File
@@ -71,7 +71,7 @@ datum/martial_art/sol_combat/grab_act(var/mob/living/carbon/human/A, var/mob/liv
playsound(get_turf(D), /decl/sound_category/punch_sound, 50, 1, -1)
A.visible_message("<span class='danger'>[A] [picked_hit_type] [D]!</span>")
A.attack_log += text("\[[time_stamp()]\] <font color='red'>["[picked_hit_type]"] [D.name] ([D.ckey])</font>")
A.attack_log += text("\[[time_stamp()]\] <span class='warning'>["[picked_hit_type]"] [D.name] ([D.ckey])</span>")
D.attack_log += text("\[[time_stamp()]\] <font color='orange'>["Has Been [picked_hit_type]"] by [A.name] ([A.ckey])</font>")
msg_admin_attack("[key_name(A)] ["has [picked_hit_type]"] [key_name(D)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[A.x];Y=[A.y];Z=[A.z]'>JMP</a>)",ckey=key_name(A),ckey_target=key_name(D))
@@ -83,7 +83,7 @@ datum/martial_art/sol_combat/grab_act(var/mob/living/carbon/human/A, var/mob/liv
if(check_streak(A,D))
return 1
A.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [D.name] ([D.ckey])</font>")
A.attack_log += text("\[[time_stamp()]\] <span class='warning'>Disarmed [D.name] ([D.ckey])</span>")
D.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been disarmed by [A.name] ([A.ckey])</font>")
msg_admin_attack("[key_name(A)] disarmed [D.name] ([D.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[D.x];Y=[D.y];Z=[D.z]'>JMP</a>)",ckey=key_name(D),ckey_target=key_name(A))
+5 -5
View File
@@ -339,9 +339,9 @@
system_error("Unbraced drill error.")
sleep(30)
if(!supported) //if you can resolve it manually in three seconds then power to you good-sir.
visible_message(SPAN_NOTICE("\icon[src] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\""))
visible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\""))
else
visible_message(SPAN_NOTICE("\icon[src] [src.name] beeps, \"Unbraced drill error manually resolved. Operations may resume normally.\""))
visible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] [src.name] beeps, \"Unbraced drill error manually resolved. Operations may resume normally.\""))
if(supported && panel_open)
if(cell)
system_error("Unsealed cell fitting error. Volatile cell discharge may occur if not immediately corrected.")
@@ -362,7 +362,7 @@
component_parts -= cell
cell = null
else
visible_message(SPAN_NOTICE("\icon[src] [src.name] beeps, \"Unsealed cell fitting error manually resolved. Operations may resume normally.\""))
visible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] [src.name] beeps, \"Unsealed cell fitting error manually resolved. Operations may resume normally.\""))
else
to_chat(user, SPAN_NOTICE("\The [src] is unpowered."))
update_icon()
@@ -412,7 +412,7 @@
/obj/machinery/mining/drill/proc/system_error(var/error)
if(error)
visible_message(SPAN_WARNING("\icon[src] <b>[capitalize_first_letters(src.name)]</b> flashes a system warning: \"[error]\"."))
visible_message(SPAN_WARNING("[icon2html(src, viewers(get_turf(src)))] <b>[capitalize_first_letters(src.name)]</b> flashes a system warning: \"[error]\"."))
current_error = error
playsound(get_turf(src), 'sound/machines/warning-buzzer.ogg', 100, 1)
need_player_check = TRUE
@@ -519,7 +519,7 @@
connected.system_error("Unbraced drill error.")
sleep(30)
if(connected?.active) //if you can resolve it manually in three seconds then power to you good-sir.
visible_message(SPAN_NOTICE("\icon[src] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\""))
visible_message(SPAN_NOTICE("[icon2html(src, viewers(get_turf(src)))] [src.name] beeps, \"Unbraced drill error automatically corrected. Please brace your drill.\""))
else
connected.system_error("Unexpected user interface error.")
return
+1 -1
View File
@@ -40,7 +40,7 @@
if(ore_type)
metals[ore_type] += T.resources[metal]
to_chat(user, "\icon[src] [SPAN_NOTICE("The scanner beeps and displays a readout:")]")
to_chat(user, "[icon2html(src, user)] [SPAN_NOTICE("The scanner beeps and displays a readout:")]")
for(var/ore_type in metals)
var/result = "no sign"
+3 -3
View File
@@ -95,15 +95,15 @@
if(machine.ores_processing[ore])
switch(machine.ores_processing[ore])
if(0)
dat += "<font color='red'>not processing</font>"
dat += "<span class='warning'>not processing</span>"
if(1)
dat += "<font color='orange'>smelting</font>"
if(2)
dat += "<font color='blue'>compressing</font>"
dat += "<span class='notice'>compressing</span>"
if(3)
dat += "<font color='gray'>alloying</font>"
else
dat += "<font color='red'>not processing</font>"
dat += "<span class='warning'>not processing</span>"
dat += ".</td><td width = 30><a href='?src=\ref[src];toggle_smelting=[ore]'>\[change\]</a></td></tr>"
dat += "</table><hr>"
+1 -1
View File
@@ -257,7 +257,7 @@ var/list/mineral_can_smooth_with = list(
if(do_after(user,25))
if(!istype(src, /turf/simulated/mineral))
return
to_chat(user, SPAN_NOTICE("\icon[P] \The [src] has been excavated to a depth of [2 * excavation_level]cm."))
to_chat(user, SPAN_NOTICE("[icon2html(P, user)] \The [src] has been excavated to a depth of [2 * excavation_level]cm."))
return
if(istype(W, /obj/item/pickaxe) && W.simulated) // Pickaxe offhand is not simulated.
+2 -2
View File
@@ -61,10 +61,10 @@
if(!input)
dat += text("input connection status: ")
dat += text("<b><font color='red'>NOT CONNECTED</font></b><br>")
dat += text("<b><span class='warning'>NOT CONNECTED</span></b><br>")
if(!output)
dat += text("<br>output connection status: ")
dat += text("<b><font color='red'>NOT CONNECTED</font></b><br>")
dat += text("<b><span class='warning'>NOT CONNECTED</span></b><br>")
dat += text("<br><font color='#ffcc00'><b>Gold inserted: </b>[amt_gold]</font> ")
if(chosen == "gold")
@@ -19,6 +19,4 @@
sight |= SEE_TURFS
player_list |= src
spawn(40)
if(client)
client.playtitlemusic()
client.playtitlemusic()
@@ -304,12 +304,12 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player)
if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles.
if(emergency_shuttle.going_to_centcom()) //Shuttle is going to centcomm, not recalled
dat += "<font color='red'><b>The station has been evacuated.</b></font><br>"
dat += "<span class='warning'><b>The station has been evacuated.</b></span><br>"
if(emergency_shuttle.online())
if (emergency_shuttle.evac) // Emergency shuttle is past the point of no recall
dat += "<font color='red'>The station is currently undergoing evacuation procedures.</font><br>"
dat += "<span class='warning'>The station is currently undergoing evacuation procedures.</span><br>"
else // Crew transfer initiated
dat += "<font color='red'>The station is currently undergoing crew transfer procedures.</font><br>"
dat += "<span class='warning'>The station is currently undergoing crew transfer procedures.</span><br>"
var/unique_role_available = FALSE
for(var/ghost_role in SSghostroles.spawners)
@@ -456,7 +456,7 @@ INITIALIZE_IMMEDIATE(/mob/abstract/new_player)
/mob/abstract/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null)
return
/mob/abstract/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0)
/mob/abstract/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0)
return
/mob/abstract/new_player/MayRespawn()
+4 -3
View File
@@ -41,7 +41,7 @@
else
message = stars(message)
var/accent_icon = speaker.get_accent_icon(language)
var/accent_icon = speaker.get_accent_icon(language, src)
var/speaker_name = speaker.name
if(ishuman(speaker))
var/mob/living/carbon/human/H = speaker
@@ -87,7 +87,7 @@
if(vr_mob)
to_chat(vr_mob, "[time] [message]")
/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
if(!client && !vr_mob)
return
@@ -197,6 +197,7 @@
formatted = language.format_message_radio(message, verb)
else
formatted = "[verb], <span class=\"body\">\"[message]\"</span>"
formatted += part_c
if(isdeaf(src))
if(prob(20))
to_chat(src, "<span class='warning'>You feel your headset vibrate but can hear nothing from it!</span>")
@@ -209,7 +210,7 @@
/mob/proc/on_hear_radio(part_a, speaker_name, track, part_b, formatted, accent_icon)
var/accent_tag
if(accent_icon)
accent_tag = "<IMG src='\ref['./icons/accent_tags.dmi']' class='text_tag' iconstate='[accent_icon]'>"
accent_tag = "<img src=\"[accent_icon].png\">"
to_chat(src, "[part_a][speaker_name][part_b][formatted]")
if(vr_mob)
to_chat(vr_mob, "[part_a][accent_tag][speaker_name][part_b][formatted]")
+1 -1
View File
@@ -365,7 +365,7 @@ var/list/slot_equipment_priority = list( \
var/end_T_descriptor = "<font color='#6b4400'>tile at [end_T.x], [end_T.y], [end_T.z] in area [get_area(end_T)]</font>"
M.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been thrown by [usr.name] ([usr.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
usr.attack_log += text("\[[time_stamp()]\] <font color='red'>Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</font>")
usr.attack_log += text("\[[time_stamp()]\] <span class='warning'>Has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor]</span>")
msg_admin_attack("[usr.name] ([usr.ckey]) has thrown [M.name] ([M.ckey]) from [start_T_descriptor] with the target [end_T_descriptor] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>)",ckey=key_name(usr),ckey_target=key_name(M))
qdel(G)
@@ -54,7 +54,7 @@
if(!..(user))
return
var/msg = "<span class='info'>*---------*</span>\nThis is \icon[src] \a <EM>[src]</EM>!\n[desc]\n"
var/msg = "<span class='info'>*---------*</span>\nThis is [icon2html(src, user)] \a <EM>[src]</EM>!\n[desc]\n"
msg += "<span class='warning'>"
if(brainmob?.key)
@@ -184,7 +184,7 @@
G.last_action = world.time
flick(G.hud.icon_state, G.hud)
user.attack_log += "\[[time_stamp()]\]<font color='red'> Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
user.attack_log += "\[[time_stamp()]\]<span class='warning'> Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</span>"
src.attack_log += "\[[time_stamp()]\]<font color='orange'> Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])</font>"
msg_admin_attack("[key_name_admin(user)] knifed [key_name_admin(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])",ckey=key_name(user),ckey_target=key_name(src) )
return 1
+33 -33
View File
@@ -29,7 +29,7 @@
var/list/msg = list("<span class='info'>*---------*\nThis is ")
if(icon)
msg += "\icon[icon] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
msg += icon2html(icon, user)
msg += "<EM>[src.name]</EM>"
@@ -49,9 +49,9 @@
tie_msg_warn += "! Attached to it is [lowertext(english_list(U.accessories))]"
if(w_uniform.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] [fluid_color_type_map(w_uniform.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[w_uniform]'>[w_uniform.name]</a>[tie_msg_warn].</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(w_uniform, user)] [w_uniform.gender==PLURAL?"some":"a"] [fluid_color_type_map(w_uniform.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[w_uniform]'>[w_uniform.name]</a>[tie_msg_warn].</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing \icon[w_uniform] <a href='?src=\ref[src];lookitem_desc_only=\ref[w_uniform]'>\a [w_uniform]</a>[tie_msg].\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(w_uniform, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[w_uniform]'>\a [w_uniform]</a>[tie_msg].\n"
//when the player is winded by an admin
if(paralysis > 6000)
@@ -60,9 +60,9 @@
//head
if(head)
if(head.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing \icon[head] [head.gender==PLURAL?"some":"a"] [fluid_color_type_map(head.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>[head.name]</a> on [get_pronoun("his")] head!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(head, user)] [head.gender==PLURAL?"some":"a"] [fluid_color_type_map(head.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>[head.name]</a> on [get_pronoun("his")] head!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing \icon[head] <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>\a [head]</a> on [get_pronoun("his")] head.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(head, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[head]'>\a [head]</a> on [get_pronoun("his")] head.\n"
//suit/armor
if(wear_suit)
@@ -75,42 +75,42 @@
tie_msg_warn += "! Attached to it is [lowertext(english_list(U.accessories))]"
if(wear_suit.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [fluid_color_type_map(wear_suit.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_suit]'>[wear_suit.name]</a>[tie_msg_warn].</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(wear_suit, user)] [wear_suit.gender==PLURAL?"some":"a"] [fluid_color_type_map(wear_suit.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_suit]'>[wear_suit.name]</a>[tie_msg_warn].</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing \icon[wear_suit] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_suit]'>\a [wear_suit]</a>[tie_msg].\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(wear_suit, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_suit]'>\a [wear_suit]</a>[tie_msg].\n"
//suit/armor storage
if(s_store && !skipsuitstorage)
if(s_store.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [fluid_color_type_map(s_store.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>[s_store.name]</a> on [get_pronoun("his")] [wear_suit.name]!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] carrying [icon2html(s_store, user)] [s_store.gender==PLURAL?"some":"a"] [fluid_color_type_map(s_store.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>[s_store.name]</a> on [get_pronoun("his")] [wear_suit.name]!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] carrying \icon[s_store] <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>\a [s_store]</a> on [get_pronoun("his")] [wear_suit.name].\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] carrying [icon2html(s_store, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>\a [s_store]</a> on [get_pronoun("his")] [wear_suit.name].\n"
else if(s_store && !skipsuitstorage)
if(s_store.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] [fluid_color_type_map(s_store.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>[s_store.name]</a> on [get_pronoun("his")] chest!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] carrying [icon2html(s_store, user)] [s_store.gender==PLURAL?"some":"a"] [fluid_color_type_map(s_store.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>[s_store.name]</a> on [get_pronoun("his")] chest!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] carrying \icon[s_store] <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>\a [s_store]</a> on [get_pronoun("his")] chest.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] carrying [icon2html(s_store, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[s_store]'>\a [s_store]</a> on [get_pronoun("his")] chest.\n"
//back
if(back)
if(back.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] \icon[back] [fluid_color_type_map(back.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[back]'>[back]</a> on [get_pronoun("his")] back.</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [icon2html(back, user)] [fluid_color_type_map(back.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[back]'>[back]</a> on [get_pronoun("his")] back.</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[back] <a href='?src=\ref[src];lookitem_desc_only=\ref[back]'>\a [back]</a> on [get_pronoun("his")] back.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(back, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[back]'>\a [back]</a> on [get_pronoun("his")] back.\n"
//left hand
if(l_hand)
if(l_hand.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] holding \icon[l_hand] [l_hand.gender==PLURAL?"some":"a"] [fluid_color_type_map(l_hand.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[l_hand]'>[l_hand.name]</a> in [get_pronoun("his")] left hand!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] holding [icon2html(l_hand, user)] [l_hand.gender==PLURAL?"some":"a"] [fluid_color_type_map(l_hand.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[l_hand]'>[l_hand.name]</a> in [get_pronoun("his")] left hand!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] holding \icon[l_hand] <a href='?src=\ref[src];lookitem_desc_only=\ref[l_hand]'>\a [l_hand]</a> in [get_pronoun("his")] left hand.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] holding [icon2html(l_hand, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[l_hand]'>\a [l_hand]</a> in [get_pronoun("his")] left hand.\n"
//right hand
if(r_hand)
if(r_hand.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] holding \icon[r_hand] [r_hand.gender==PLURAL?"some":"a"] [fluid_color_type_map(r_hand.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[r_hand]'>[r_hand.name]</a> in [get_pronoun("his")] right hand!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] holding [icon2html(r_hand, user)] [r_hand.gender==PLURAL?"some":"a"] [fluid_color_type_map(r_hand.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[r_hand]'>[r_hand.name]</a> in [get_pronoun("his")] right hand!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] holding \icon[r_hand] <a href='?src=\ref[src];lookitem_desc_only=\ref[r_hand]'>\a [r_hand]</a> in [get_pronoun("his")] right hand.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] holding [icon2html(r_hand, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[r_hand]'>\a [r_hand]</a> in [get_pronoun("his")] right hand.\n"
//gloves
if(gloves && !skipgloves)
@@ -121,60 +121,60 @@
if(ID)
gloves_name = "[C.name] ([ID.registered_name] ([ID.assignment]))"
if(gloves.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] [fluid_color_type_map(gloves.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>[gloves_name]</a> on [get_pronoun("his")] hands!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [icon2html(gloves, user)] [gloves.gender==PLURAL?"some":"a"] [fluid_color_type_map(gloves.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>[gloves_name]</a> on [get_pronoun("his")] hands!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[gloves] <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>\a [gloves_name]</a> on [get_pronoun("his")] hands.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(gloves, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[gloves]'>\a [gloves_name]</a> on [get_pronoun("his")] hands.\n"
else if(blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [fluid_color_type_map(hand_blood_color)]-stained hands!</span>\n"
//handcuffed?
if(handcuffed)
if(istype(handcuffed, /obj/item/handcuffs/cable))
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] \icon[handcuffed] restrained with cable!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] [icon2html(handcuffed, user)] restrained with cable!</span>\n"
else
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] \icon[handcuffed] handcuffed!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] [icon2html(handcuffed, user)] handcuffed!</span>\n"
//buckled
if(buckled)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] \icon[buckled] buckled to [buckled]!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] [icon2html(buckled, user)] buckled to [buckled]!</span>\n"
//belt
if(belt)
if(belt.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] \icon[belt] [belt.gender==PLURAL?"some":"a"] [fluid_color_type_map(belt.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[belt]'>[belt.name]</a> about [get_pronoun("his")] waist!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [icon2html(belt, user)] [belt.gender==PLURAL?"some":"a"] [fluid_color_type_map(belt.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[belt]'>[belt.name]</a> about [get_pronoun("his")] waist!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[belt] <a href='?src=\ref[src];lookitem_desc_only=\ref[belt]'>\a [belt]</a> about [get_pronoun("his")] waist.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(belt, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[belt]'>\a [belt]</a> about [get_pronoun("his")] waist.\n"
//shoes
if(shoes && !skipshoes)
if(shoes.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] [fluid_color_type_map(shoes.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[shoes]'>[shoes.name]</a> on [get_pronoun("his")] feet!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(shoes, user)] [shoes.gender==PLURAL?"some":"a"] [fluid_color_type_map(shoes.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[shoes]'>[shoes.name]</a> on [get_pronoun("his")] feet!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing \icon[shoes] <a href='?src=\ref[src];lookitem_desc_only=\ref[shoes]'>\a [shoes]</a> on [get_pronoun("his")] feet.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(shoes, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[shoes]'>\a [shoes]</a> on [get_pronoun("his")] feet.\n"
else if(footprint_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [fluid_color_type_map(footprint_color)]-stained feet!</span>\n"
//mask
if(wear_mask && !skipmask)
if(wear_mask.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] [fluid_color_type_map(wear_mask.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_mask]'>[wear_mask.name]</a> on [get_pronoun("his")] face!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [icon2html(wear_mask, user)] [wear_mask.gender==PLURAL?"some":"a"] [fluid_color_type_map(wear_mask.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_mask]'>[wear_mask.name]</a> on [get_pronoun("his")] face!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[wear_mask] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_mask]'>\a [wear_mask]</a> on [get_pronoun("his")] face.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(wear_mask, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_mask]'>\a [wear_mask]</a> on [get_pronoun("his")] face.\n"
//eyes
if(glasses && !skipeyes)
if(glasses.blood_color)
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] [fluid_color_type_map(glasses.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[glasses]'>[glasses]</a> covering [get_pronoun("his")] eyes!</span>\n"
msg += "<span class='warning'>[get_pronoun("He")] [get_pronoun("has")] [icon2html(glasses, user)] [glasses.gender==PLURAL?"some":"a"] [fluid_color_type_map(glasses.blood_color)]-stained <a href='?src=\ref[src];lookitem_desc_only=\ref[glasses]'>[glasses]</a> covering [get_pronoun("his")] eyes!</span>\n"
else
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[glasses] <a href='?src=\ref[src];lookitem_desc_only=\ref[glasses]'>\a [glasses]</a> covering [get_pronoun("his")] eyes.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(glasses, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[glasses]'>\a [glasses]</a> covering [get_pronoun("his")] eyes.\n"
//left ear
if(l_ear && !skipears)
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[l_ear] <a href='?src=\ref[src];lookitem_desc_only=\ref[l_ear]'>\a [l_ear]</a> on [get_pronoun("his")] left ear.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(l_ear, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[l_ear]'>\a [l_ear]</a> on [get_pronoun("his")] left ear.\n"
//right ear
if(r_ear && !skipears)
msg += "[get_pronoun("He")] [get_pronoun("has")] \icon[r_ear] <a href='?src=\ref[src];lookitem_desc_only=\ref[r_ear]'>\a [r_ear]</a> on [get_pronoun("his")] right ear.\n"
msg += "[get_pronoun("He")] [get_pronoun("has")] [icon2html(r_ear, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[r_ear]'>\a [r_ear]</a> on [get_pronoun("his")] right ear.\n"
//ID
if(wear_id)
@@ -184,7 +184,7 @@
var/obj/item/card/id/ID = C.GetID()
if(ID)
id_name = "[C.name] ([ID.registered_name] ([ID.assignment]))"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing \icon[wear_id] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_id]'>\a [id_name]</a>.\n"
msg += "[get_pronoun("He")] [get_pronoun("is")] wearing [icon2html(wear_id, user)] <a href='?src=\ref[src];lookitem_desc_only=\ref[wear_id]'>\a [id_name]</a>.\n"
//Jitters
if(is_jittery)
@@ -2021,7 +2021,7 @@
randmutg(src) // Applies good mutation
domutcheck(src,null,MUTCHK_FORCED)
/mob/living/carbon/human/get_accent_icon(var/datum/language/speaking = null)
/mob/living/carbon/human/get_accent_icon(var/datum/language/speaking, var/mob/hearer, var/force_accent)
var/used_accent = accent //starts with the mob's default accent
if(mind?.changeling)
@@ -2038,7 +2038,7 @@
if(changer && changer.active && changer.current_accent)
used_accent = changer.current_accent
return ..(speaking, used_accent)
return ..(speaking, hearer, used_accent)
/mob/living/carbon/human/proc/generate_valid_accent()
var/list/valid_accents = new()
@@ -47,7 +47,7 @@
if(G.cell.charge >= 2500)
G.cell.use(G.cell.charge) //So it drains the cell.
visible_message("<span class='danger'>[src] has been touched with the stun gloves by [M]!</span>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Stungloved [src.name] ([src.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <span class='warning'>Stungloved [src.name] ([src.ckey])</span>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been stungloved by [M.name] ([M.ckey])</font>")
msg_admin_attack("[key_name_admin(M)] stungloved [src.name] ([src.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>)",ckey=key_name(M),ckey_target=key_name(src))
@@ -296,7 +296,7 @@
H.visible_message("<span class='danger'>[attack_message]</span>")
playsound(loc, ((miss_type) ? (miss_type == 1 ? attack.miss_sound : 'sound/weapons/thudswoosh.ogg') : attack.attack_sound), 25, 1, -1)
H.attack_log += text("\[[time_stamp()]\] <font color='red'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [src.name] ([src.ckey])</font>")
H.attack_log += text("\[[time_stamp()]\] <span class='warning'>[miss_type ? (miss_type == 1 ? "Missed" : "Blocked") : "[pick(attack.attack_verb)]"] [src.name] ([src.ckey])</span>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>[miss_type ? (miss_type == 1 ? "Was missed by" : "Has blocked") : "Has Been [pick(attack.attack_verb)]"] by [H.name] ([H.ckey])</font>")
msg_admin_attack("[key_name(H)] [miss_type ? (miss_type == 1 ? "has missed" : "was blocked by") : "has [pick(attack.attack_verb)]"] [key_name(src)] (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[H.x];Y=[H.y];Z=[H.z]'>JMP</a>)",ckey=key_name(H),ckey_target=key_name(src))
@@ -368,7 +368,7 @@
if(attacker_style && attacker_style.disarm_act(H, src))
return TRUE
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Disarmed [src.name] ([src.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <span class='warning'>Disarmed [src.name] ([src.ckey])</span>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been disarmed by [M.name] ([M.ckey])</font>")
msg_admin_attack("[key_name(M)] disarmed [src.name] ([src.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>)",ckey=key_name(M),ckey_target=key_name(src))
@@ -467,7 +467,7 @@
if(!damage)
return
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <span class='warning'>attacked [src.name] ([src.ckey])</span>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [user.name] ([user.ckey])</font>")
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
user.do_attack_animation(src)
@@ -409,7 +409,7 @@ emp_act
var/client/assailant = M.client
if(assailant)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
M.attack_log += text("\[[time_stamp()]\] <span class='warning'>Hit [src.name] ([src.ckey]) with a thrown [O]</span>")
if(!istype(src,/mob/living/simple_animal/rat))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)",ckey=key_name(M),ckey_target=key_name(src))
@@ -727,7 +727,7 @@ mob/living/carbon/human/proc/change_monitor()
if (brokesomething)
playsound(get_turf(target), 'sound/weapons/heavysmash.ogg', 100, 1)
attack_log += "\[[time_stamp()]\]<font color='red'>crashed into [brokesomething] objects at ([target.x];[target.y];[target.z]) </font>"
attack_log += "\[[time_stamp()]\]<span class='warning'>crashed into [brokesomething] objects at ([target.x];[target.y];[target.z]) </span>"
msg_admin_attack("[key_name(src)] crashed into [brokesomething] objects at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[target.x];Y=[target.y];Z=[target.z]'>JMP</a>)" )
if (!done && target.Enter(src, null))
@@ -752,7 +752,7 @@ mob/living/carbon/human/proc/change_monitor()
if (istype(A, /mob/living))
var/mob/living/M = A
attack_log += "\[[time_stamp()]\]<font color='red'> Crashed into [key_name(M)]</font>"
attack_log += "\[[time_stamp()]\]<span class='warning'> Crashed into [key_name(M)]</span>"
M.attack_log += "\[[time_stamp()]\]<font color='orange'> Was rammed by [key_name(src)]</font>"
msg_admin_attack("[key_name(src)] crashed into [key_name(M)] at (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[M.x];Y=[M.y];Z=[M.z]'>JMP</a>)" )
@@ -61,7 +61,7 @@
if(istype(A, /obj/item/clothing/accessory/badge) || istype(A, /obj/item/clothing/accessory/medal))
user.visible_message("<span class='danger'>\The [user] tears off \the [A] from [src]'s [suit.name]!</span>")
attack_log += "\[[time_stamp()]\] <font color='orange'>Has had \the [A] removed by [user.name] ([user.ckey])</font>"
user.attack_log += "\[[time_stamp()]\] <font color='red'>Attempted to remove [name]'s ([ckey]) [A.name]</font>"
user.attack_log += "\[[time_stamp()]\] <span class='warning'>Attempted to remove [name]'s ([ckey]) [A.name]</span>"
suit.remove_accessory(user, A)
return 1
@@ -116,7 +116,7 @@
to_chat(user, "<span class='warning'>\The [src]'s suit sensor controls are locked.</span>")
return
attack_log += text("\[[time_stamp()]\] <font color='orange'>Has had their sensors toggled by [user.name] ([user.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Attempted to toggle [name]'s ([ckey]) sensors</font>")
user.attack_log += text("\[[time_stamp()]\] <span class='warning'>Attempted to toggle [name]'s ([ckey]) sensors</span>")
suit.set_sensors(user)
// Remove all splints.
+1 -1
View File
@@ -31,7 +31,7 @@
speech_buffer.Add(lowertext(html_decode(message)))
return ..()
/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="")
if(is_friend(speaker))
speech_buffer = list()
speech_buffer.Add(speaker)
+2 -2
View File
@@ -216,7 +216,7 @@
var/client/assailant = M.client
if(assailant)
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been hit with a [O], thrown by [M.name] ([assailant.ckey])</font>")
M.attack_log += text("\[[time_stamp()]\] <font color='red'>Hit [src.name] ([src.ckey]) with a thrown [O]</font>")
M.attack_log += text("\[[time_stamp()]\] <span class='warning'>Hit [src.name] ([src.ckey]) with a thrown [O]</span>")
if(!istype(src,/mob/living/simple_animal/rat))
msg_admin_attack("[src.name] ([src.ckey]) was hit by a [O], thrown by [M.name] ([assailant.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)",ckey=key_name(M),ckey_target=key_name(src))
@@ -278,7 +278,7 @@
return
adjustBruteLoss(damage)
user.attack_log += text("\[[time_stamp()]\] <font color='red'>attacked [src.name] ([src.ckey])</font>")
user.attack_log += text("\[[time_stamp()]\] <span class='warning'>attacked [src.name] ([src.ckey])</span>")
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>was attacked by [user.name] ([user.ckey])</font>")
if (attack_message)
src.visible_message("<span class='danger'>[user] has [attack_message] [src]!</span>")
-23
View File
@@ -204,30 +204,7 @@ var/controlling
to_chat(M, "[message]")
to_chat(src, "You said: \"[message]\" to [M]")
return
/*
var/list/candidates = indoctrinated.Copy()
if(!(src.host in candidates))
candidates.Add(src.host)
var/mob/target = select_indoctrinated("Thought", "Select a target which will hear your thought.")
if(!target) return
var/speaker = input("Select the voice in which you would like to make yourself heard.", "Voice") as text
//if(!speaker) return
var/message = input("What would you like to say?", "Message") as text
if(!message) return
// Use the points at the end rather than the beginning, because the user might cancel
if(!use_points(150)) return
message = say_quote(message)
var/rendered = "<span class='game say'><span class='name'>[speaker]</span> <span class='message'>[message]</span></span>"
target.show_message(rendered)
to_chat(usr, "<i>You make [target] hear:</i> [rendered]")
*/
// Mutes the host
/mob/living/parasite/meme/verb/Mute()
set category = "Meme"
+1 -1
View File
@@ -249,7 +249,7 @@ proc/get_radio_key_from_channel(var/channel)
message_range = speaking.get_talkinto_msg_range(message)
var/msg
if(!speaking || !(speaking.flags & NO_TALK_MSG))
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>"
msg = "<span class='notice'>\The [src] talks into \the [used_radios[1]]</span>."
for(var/mob/living/M in hearers(5, src))
if((M != src) && msg)
M.show_message(msg)
@@ -44,8 +44,8 @@
to_chat(user, SPAN_NOTICE("Analyzing Results for [M]:"))
to_chat(user, SPAN_NOTICE("Overall Status: [M.stat > 1 ? "fully disabled" : "[M.health - M.getHalLoss()]% functional"]"))
to_chat(user, "Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>")
to_chat(user, "Damage Specifics: <font color='#FFA500'>[BU]</font> - <font color='red'>[BR]</font>")
to_chat(user, "Key: <font color='#FFA500'>Electronics</font>/<span class='warning'>Brute</span>")
to_chat(user, "Damage Specifics: <font color='#FFA500'>[BU]</font> - <span class='warning'>[BR]</span>")
if(M.tod && M.stat == DEAD)
to_chat(user, SPAN_NOTICE("Time of Disable: [M.tod]"))
var/mob/living/silicon/robot/H = M
@@ -55,11 +55,11 @@
for(var/datum/robot_component/org in damaged)
user.show_message(text("<span class='notice'>\t []: [][] - [] - [] - []</span>", \
capitalize(org.name), \
(org.installed == -1) ? "<font color='red'><b>DESTROYED</b></font> " :"",\
(org.installed == -1) ? "<span class='warning'><b>DESTROYED</b></span> " :"",\
(org.electronics_damage > 0) ? "<font color='#FFA500'>[org.electronics_damage]</font>" :0, \
(org.brute_damage > 0) ? "<font color='red'>[org.brute_damage]</font>" :0, \
(org.toggled) ? "Toggled ON" : "<font color='red'>Toggled OFF</font>",\
(org.powered) ? "Power ON" : "<font color='red'>Power OFF</font>"),1)
(org.brute_damage > 0) ? "<span class='warning'>[org.brute_damage]</span>" :0, \
(org.toggled) ? "Toggled ON" : "<span class='warning'>Toggled OFF</span>",\
(org.powered) ? "Power ON" : "<span class='warning'>Power OFF</span>"),1)
else
to_chat(user, SPAN_NOTICE("Components are OK."))
if(H.emagged && prob(5))
@@ -68,7 +68,7 @@
if("prosthetics")
var/mob/living/carbon/human/H = M
to_chat(user, SPAN_NOTICE("Analyzing Results for \the [H]:"))
to_chat(user, "Key: <font color='#FFA500'>Electronics</font>/<font color='red'>Brute</font>")
to_chat(user, "Key: <font color='#FFA500'>Electronics</font>/<span class='warning'>Brute</span>")
to_chat(user, SPAN_NOTICE("External prosthetics:"))
var/organ_found
@@ -77,7 +77,7 @@
if(!(E.status & ORGAN_ROBOT))
continue
organ_found = TRUE
to_chat(user, "[E.name]: <font color='red'>[E.brute_dam]</font> <font color='#FFA500'>[E.burn_dam]</font>")
to_chat(user, "[E.name]: <span class='warning'>[E.brute_dam]</span> <font color='#FFA500'>[E.burn_dam]</font>")
if(!organ_found)
to_chat(user, SPAN_NOTICE("No prosthetics located."))
to_chat(user, "<hr>")
@@ -94,7 +94,7 @@
if(!show_tag && istype(O, /obj/item/organ/internal/ipc_tag))
continue
organ_found = TRUE
to_chat(user, "[O.name]: <font color='red'>[O.damage]</font>")
to_chat(user, "[O.name]: <span class='warning'>[O.damage]</span>")
if(!organ_found)
to_chat(user, SPAN_NOTICE("No prosthetics located."))
@@ -32,7 +32,7 @@
continue
else if (isNotStationLevel(src.z) && src.z != D.z) //If the console is not on the station, only list drones on the current level
continue
dat += "<BR>[D.real_name] ([D.stat == 2 ? "<font color='red'>INACTIVE</FONT>" : "<font color='green'>ACTIVE</FONT>"])"
dat += "<BR>[D.real_name] ([D.stat == 2 ? "<span class='warning'>INACTIVE</span>" : "<font color='green'>ACTIVE</FONT>"])"
dat += "<font dize = 9><BR>Cell charge: [D.cell.charge]/[D.cell.maxcharge]."
dat += "<BR>Currently located in: [get_area(D)]."
dat += "<BR><A href='?src=\ref[src];resync=\ref[D]'>Resync</A> | <A href='?src=\ref[src];shutdown=\ref[D]'>Shutdown</A></font>"
@@ -113,4 +113,4 @@
dronefab.produce_drones = !dronefab.produce_drones
to_chat(usr, SPAN_NOTICE("You [dronefab.produce_drones ? "enable" : "disable"] drone production in the nearby fabricator."))
src.updateUsrDialog()
src.updateUsrDialog()
@@ -284,7 +284,7 @@
/mob/living/silicon/robot/proc/describe_module(var/slot)
var/list/index_module = list(module_state_1,module_state_2,module_state_3)
var/result = " Hardpoint [slot] holds "
result += (index_module[slot]) ? "\icon[index_module[slot]] [index_module[slot]]." : "nothing."
result += (index_module[slot]) ? "[icon2html(index_module[slot], viewers(get_turf(src)))] [index_module[slot]]." : "nothing."
result += "\n"
return result

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