diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 2a98e34a458..63319aee335 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -292,9 +292,9 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
#define SHELTER_DEPLOY_ANCHORED_OBJECTS "anchored objects"
//debug printing macros
-#define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]")
-#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]")
-#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]")
+#define debug_world(msg) if (GLOB.Debug2) to_chat(world, "DEBUG: [msg]")
+#define debug_usr(msg) if (GLOB.Debug2&&usr) to_chat(usr, "DEBUG: [msg]")
+#define debug_admins(msg) if (GLOB.Debug2) to_chat(GLOB.admins, "DEBUG: [msg]")
#define debug_world_log(msg) if (GLOB.Debug2) log_world("DEBUG: [msg]")
#define INCREMENT_TALLY(L, stat) if(L[stat]){L[stat]++}else{L[stat] = 1}
diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm
index 4b1b9fcf3d1..0644af0b748 100644
--- a/code/__DEFINES/subsystems.dm
+++ b/code/__DEFINES/subsystems.dm
@@ -142,7 +142,6 @@
// Subsystem fire priority, from lowest to highest priority
// If the subsystem isn't listed here it's either DEFAULT or PROCESS (if it's a processing subsystem child)
-#define FIRE_PRIORITY_PING 10
#define FIRE_PRIORITY_IDLE_NPC 10
#define FIRE_PRIORITY_SERVER_MAINT 10
#define FIRE_PRIORITY_RESEARCH 10
diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm
index f5adeadadeb..f594b735b6b 100644
--- a/code/__DEFINES/tgui.dm
+++ b/code/__DEFINES/tgui.dm
@@ -26,3 +26,10 @@
#define TGUI_WINDOW_ID(index) "tgui-window-[index]"
/// Get a pool index of the provided window id
#define TGUI_WINDOW_INDEX(window_id) text2num(copytext(window_id, 13))
+
+/// Creates a message packet for sending via output()
+#define TGUI_CREATE_MESSAGE(type, payload) ( \
+ url_encode(json_encode(list( \
+ "type" = type, \
+ "payload" = payload, \
+ ))))
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 81092440d45..3af048f9b18 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -1483,47 +1483,3 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
return call(source, proctype)(arglist(arguments))
#define TURF_FROM_COORDS_LIST(List) (locate(List[1], List[2], List[3]))
-
-// Converts browser keycodes to BYOND keycodes.
-/proc/browser_keycode_to_byond(keycode)
- keycode = text2num(keycode)
- switch(keycode)
- // letters and numbers
- if(65 to 90, 48 to 57)
- return ascii2text(keycode)
- if(17)
- return "Ctrl"
- if(18)
- return "Alt"
- if(16)
- return "Shift"
- if(37)
- return "West"
- if(38)
- return "North"
- if(39)
- return "East"
- if(40)
- return "South"
- if(45)
- return "Insert"
- if(46)
- return "Delete"
- if(36)
- return "Northwest"
- if(35)
- return "Southwest"
- if(33)
- return "Northeast"
- if(34)
- return "Southeast"
- if(112 to 123)
- return "F[keycode-111]"
- if(96 to 105)
- return "Numpad[keycode-96]"
- if(188)
- return ","
- if(190)
- return "."
- if(189)
- return "-"
diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm
index be69d77a9cb..eb4c75312bc 100644
--- a/code/controllers/configuration/configuration.dm
+++ b/code/controllers/configuration/configuration.dm
@@ -405,23 +405,17 @@ Example config:
/datum/controller/configuration/proc/LoadChatFilter()
var/list/in_character_filter = list()
-
if(!fexists("[directory]/in_character_filter.txt"))
return
-
log_config("Loading config file in_character_filter.txt...")
-
for(var/line in world.file2list("[directory]/in_character_filter.txt"))
if(!line)
continue
if(findtextEx(line,"#",1,2))
continue
in_character_filter += REGEX_QUOTE(line)
-
ic_filter_regex = in_character_filter.len ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null
- syncChatRegexes()
-
//Message admins when you can.
/datum/controller/configuration/proc/DelayedMessageAdmins(text)
addtimer(CALLBACK(GLOBAL_PROC, /proc/message_admins, text), 0)
diff --git a/code/controllers/subsystem/chat.dm b/code/controllers/subsystem/chat.dm
index bbeb0683f0f..a4f8dfdc5d3 100644
--- a/code/controllers/subsystem/chat.dm
+++ b/code/controllers/subsystem/chat.dm
@@ -5,77 +5,35 @@ SUBSYSTEM_DEF(chat)
priority = FIRE_PRIORITY_CHAT
init_order = INIT_ORDER_CHAT
- var/list/payload = list()
-
+ var/list/payload_by_client = list()
/datum/controller/subsystem/chat/fire()
- for(var/i in payload)
- var/client/C = i
- C << output(payload[C], "browseroutput:output")
- payload -= C
-
+ for(var/key in payload_by_client)
+ var/client/client = key
+ var/payload = payload_by_client[key]
+ payload_by_client -= key
+ if(client)
+ // Send to tgchat
+ client.tgui_panel?.window.send_message("chat/message", payload)
+ // Send to old chat
+ for(var/msg in payload)
+ SEND_TEXT(client, msg["text"])
if(MC_TICK_CHECK)
return
-
-/datum/controller/subsystem/chat/proc/queue(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = TRUE)
- if(!target || !message)
- return
-
- if(!istext(message))
- stack_trace("to_chat called with invalid input type")
- return
-
- if(target == world)
- target = GLOB.clients
-
- //Some macros remain in the string even after parsing and fuck up the eventual output
- var/original_message = message
- message = replacetext(message, "\improper", "")
- message = replacetext(message, "\proper", "")
- if(handle_whitespace)
- message = replacetext(message, "\n", " ")
- message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]")
- if (trailing_newline)
- message += " "
-
- //url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript.
- //Do the double-encoding here to save nanoseconds
- var/twiceEncoded = url_encode(url_encode(message))
-
+/datum/controller/subsystem/chat/proc/queue(target, text, flags)
if(islist(target))
- 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.
- SEND_TEXT(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
-
- payload[C] += twiceEncoded
-
- 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.
- SEND_TEXT(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
-
- payload[C] += twiceEncoded
+ for(var/_target in target)
+ var/client/client = CLIENT_FROM_VAR(_target)
+ if(client)
+ LAZYADD(payload_by_client[client], list(list(
+ "text" = text,
+ "flags" = flags,
+ )))
+ return
+ var/client/client = CLIENT_FROM_VAR(target)
+ if(client)
+ LAZYADD(payload_by_client[client], list(list(
+ "text" = text,
+ "flags" = flags,
+ )))
diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm
deleted file mode 100644
index c5c9bb39335..00000000000
--- a/code/controllers/subsystem/ping.dm
+++ /dev/null
@@ -1,33 +0,0 @@
-SUBSYSTEM_DEF(ping)
- name = "Ping"
- priority = FIRE_PRIORITY_PING
- wait = 3 SECONDS
- flags = SS_NO_INIT
- runlevels = RUNLEVEL_LOBBY | RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME
-
- var/list/currentrun = list()
-
-/datum/controller/subsystem/ping/stat_entry()
- ..("P:[GLOB.clients.len]")
-
-
-/datum/controller/subsystem/ping/fire(resumed = 0)
- if (!resumed)
- src.currentrun = GLOB.clients.Copy()
-
- //cache for sanic speed (lists are references anyways)
- var/list/currentrun = src.currentrun
-
- while (currentrun.len)
- var/client/C = currentrun[currentrun.len]
- currentrun.len--
-
- if (!C || !C.chatOutput || !C.chatOutput.loaded)
- if (MC_TICK_CHECK)
- return
- continue
-
- // softPang isn't handled anywhere but it'll always reset the opts.lastPang.
- C.chatOutput.ehjax_send(data = C.is_afk(29) ? "softPang" : "pang")
- if (MC_TICK_CHECK)
- return
diff --git a/code/controllers/subsystem/server_maint.dm b/code/controllers/subsystem/server_maint.dm
index d9ce72242ac..b29c71563e8 100644
--- a/code/controllers/subsystem/server_maint.dm
+++ b/code/controllers/subsystem/server_maint.dm
@@ -81,9 +81,7 @@ SUBSYSTEM_DEF(server_maint)
if(!thing)
continue
var/client/C = thing
- var/datum/chat_output/co = C.chatOutput
- if(co)
- co.ehjax_send(data = "roundrestart")
+ C?.tgui_panel?.send_roundrestart()
if(server) //if you set a server location in config.txt, it sends you there instead of trying to reconnect to the same world address. -- NeoFite
C << link("byond://[server]")
var/datum/tgs_version/tgsversion = world.TgsVersion()
diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm
index 3b21757bc52..5318f1d233e 100644
--- a/code/game/objects/items/devices/PDA/PDA.dm
+++ b/code/game/objects/items/devices/PDA/PDA.dm
@@ -206,7 +206,7 @@ GLOBAL_LIST_EMPTY(PDAs)
var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda)
assets.send(user)
- var/datum/asset/spritesheet/emoji_s = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ var/datum/asset/spritesheet/emoji_s = get_asset_datum(/datum/asset/spritesheet/chat)
emoji_s.send(user) //Already sent by chat but no harm doing this
user.set_machine(src)
diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm
index 566a2f96ab1..41ec0c8d258 100644
--- a/code/game/objects/items/devices/PDA/cart.dm
+++ b/code/game/objects/items/devices/PDA/cart.dm
@@ -546,7 +546,7 @@ Code:
var/static/list/emoji_icon_states
var/static/emoji_table
if(!emoji_table)
- var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat)
var/list/collate = list("
")
for(var/emoji in sortList(icon_states(icon('icons/emoji.dmi'))))
var/tag = sheet.icon_tag("emoji-[emoji]")
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index e11a695ada2..e834d9a609c 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1,11 +1,11 @@
////////////////////////////////
/proc/message_admins(msg)
- msg = "ADMIN LOG:[msg]"
+ msg = "ADMIN LOG:[msg]"
to_chat(GLOB.admins, msg, confidential = TRUE)
/proc/relay_msg_admins(msg)
- msg = "RELAY:[msg]"
+ msg = "RELAY:[msg]"
to_chat(GLOB.admins, msg, confidential = TRUE)
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 91fb01ccdf8..701351b238d 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -32,9 +32,7 @@
for(var/mob/M in GLOB.player_list)
if(M.client.prefs.toggles & SOUND_MIDI)
- var/user_vol = M.client.chatOutput.adminMusicVolume
- if(user_vol)
- admin_sound.volume = vol * (user_vol / 100)
+ admin_sound.volume = vol * M.client.admin_music_volume
SEND_SOUND(M, admin_sound)
admin_sound.volume = vol
@@ -112,6 +110,8 @@
webpage_url = "[title]"
music_extra_data["start"] = data["start_time"]
music_extra_data["end"] = data["end_time"]
+ music_extra_data["link"] = data["webpage_url"]
+ music_extra_data["title"] = data["title"]
var/res = alert(usr, "Show the title of and link to this song to the players?\n[title]",, "No", "Yes", "Cancel")
switch(res)
@@ -141,11 +141,11 @@
for(var/m in GLOB.player_list)
var/mob/M = m
var/client/C = M.client
- if((C.prefs.toggles & SOUND_MIDI) && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
+ if(C.prefs.toggles & SOUND_MIDI)
if(!stop_web_sounds)
- C.chatOutput.sendMusic(web_sound_url, music_extra_data)
+ C.tgui_panel?.play_music(web_sound_url, music_extra_data)
else
- C.chatOutput.stopMusic()
+ C.tgui_panel?.stop_music()
SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound")
@@ -172,6 +172,5 @@
for(var/mob/M in GLOB.player_list)
SEND_SOUND(M, sound(null))
var/client/C = M.client
- if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
- C.chatOutput.stopMusic()
+ C?.tgui_panel?.stop_music()
SSblackbox.record_feedback("tally", "admin_verb", 1, "Stop All Playing Sounds") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/asset_cache/asset_cache_item.dm b/code/modules/asset_cache/asset_cache_item.dm
index 4b14144aa41..41cee06db1e 100644
--- a/code/modules/asset_cache/asset_cache_item.dm
+++ b/code/modules/asset_cache/asset_cache_item.dm
@@ -1,16 +1,25 @@
/**
- * # asset_cache_item
- *
- * An internal datum containing info on items in the asset cache. Mainly used to cache md5 info for speed.
-**/
+ * # asset_cache_item
+ *
+ * An internal datum containing info on items in the asset cache. Mainly used to cache md5 info for speed.
+ */
/datum/asset_cache_item
var/name
var/hash
var/resource
var/ext = ""
- var/legacy = FALSE //! Should this file also be sent via the legacy browse_rsc system when cdn transports are enabled?
- var/namespace = null //! used by the cdn system to keep legacy css assets with their parent css file. (css files resolve urls relative to the css file, so the legacy system can't be used if the css file itself could go out over the cdn)
- var/namespace_parent = FALSE //! True if this is the parent css or html file for an asset's namespace
+ /// Should this file also be sent via the legacy browse_rsc system
+ /// when cdn transports are enabled?
+ var/legacy = FALSE
+ /// Used by the cdn system to keep legacy css assets with their parent
+ /// css file. (css files resolve urls relative to the css file, so the
+ /// legacy system can't be used if the css file itself could go out over
+ /// the cdn)
+ var/namespace = null
+ /// True if this is the parent css or html file for an asset's namespace
+ var/namespace_parent = FALSE
+ /// TRUE for keeping local asset names when browse_rsc backend is used
+ var/keep_local_name = FALSE
/datum/asset_cache_item/New(name, file)
if (!isfile(file))
@@ -27,7 +36,6 @@
ext = ".[copytext(name, extstart+1)]"
resource = file
-
/datum/asset_cache_item/vv_edit_var(var_name, var_value)
return FALSE
diff --git a/code/modules/asset_cache/asset_list.dm b/code/modules/asset_cache/asset_list.dm
index 8aff5334fd2..221febbe14d 100644
--- a/code/modules/asset_cache/asset_list.dm
+++ b/code/modules/asset_cache/asset_list.dm
@@ -26,11 +26,18 @@ GLOBAL_LIST_EMPTY(asset_datums)
return
-//If you don't need anything complicated.
+/// If you don't need anything complicated.
/datum/asset/simple
_abstract = /datum/asset/simple
- var/assets = list() //! list of assets for this datum in the form of asset_filename = asset_file. At runtime the asset_file will be converted into a asset_cache datum.
- var/legacy = FALSE //! set to true to have this asset also be sent via browse_rsc when cdn asset transports are enabled.
+ /// list of assets for this datum in the form of:
+ /// asset_filename = asset_file. At runtime the asset_file will be
+ /// converted into a asset_cache datum.
+ var/assets = list()
+ /// Set to true to have this asset also be sent via the legacy browse_rsc
+ /// system when cdn transports are enabled?
+ var/legacy = FALSE
+ /// TRUE for keeping local asset names when browse_rsc backend is used
+ var/keep_local_name = FALSE
/datum/asset/simple/register()
for(var/asset_name in assets)
@@ -39,7 +46,9 @@ GLOBAL_LIST_EMPTY(asset_datums)
log_asset("ERROR: Invalid asset: [type]:[asset_name]:[ACI]")
continue
if (legacy)
- ACI.legacy = TRUE
+ ACI.legacy = legacy
+ if (keep_local_name)
+ ACI.keep_local_name = keep_local_name
assets[asset_name] = ACI
/datum/asset/simple/send(client)
@@ -273,7 +282,7 @@ GLOBAL_LIST_EMPTY(asset_datums)
assets |= parents
var/list/hashlist = list()
var/list/sorted_assets = sortList(assets)
-
+
for (var/asset_name in sorted_assets)
var/datum/asset_cache_item/ACI = new(asset_name, sorted_assets[asset_name])
if (!ACI?.hash)
@@ -302,7 +311,7 @@ GLOBAL_LIST_EMPTY(asset_datums)
..()
/// Get a html string that will load a html asset.
-/// Needed because byond doesn't allow you to browse() to a url.
+/// Needed because byond doesn't allow you to browse() to a url.
/datum/asset/simple/namespaced/proc/get_htmlloader(filename)
return url2htmlloader(SSassets.transport.get_asset_url(filename, assets[filename]))
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 1ffaba22ffa..8a11340a7d4 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -1,81 +1,95 @@
//DEFINITIONS FOR ASSET DATUMS START HERE.
+/datum/asset/simple/tgui_common
+ keep_local_name = TRUE
+ assets = list(
+ "tgui-common.chunk.js" = 'tgui/packages/tgui/public/tgui-common.chunk.js',
+ )
+
/datum/asset/simple/tgui
+ keep_local_name = TRUE
assets = list(
"tgui.bundle.js" = 'tgui/packages/tgui/public/tgui.bundle.js',
"tgui.bundle.css" = 'tgui/packages/tgui/public/tgui.bundle.css',
)
+/datum/asset/simple/tgui_panel
+ keep_local_name = TRUE
+ assets = list(
+ "tgui-panel.bundle.js" = 'tgui/packages/tgui/public/tgui-panel.bundle.js',
+ "tgui-panel.bundle.css" = 'tgui/packages/tgui/public/tgui-panel.bundle.css',
+ )
+
/datum/asset/simple/headers
assets = list(
- "alarm_green.gif" = 'icons/program_icons/alarm_green.gif',
- "alarm_red.gif" = 'icons/program_icons/alarm_red.gif',
- "batt_5.gif" = 'icons/program_icons/batt_5.gif',
- "batt_20.gif" = 'icons/program_icons/batt_20.gif',
- "batt_40.gif" = 'icons/program_icons/batt_40.gif',
- "batt_60.gif" = 'icons/program_icons/batt_60.gif',
- "batt_80.gif" = 'icons/program_icons/batt_80.gif',
- "batt_100.gif" = 'icons/program_icons/batt_100.gif',
- "charging.gif" = 'icons/program_icons/charging.gif',
- "downloader_finished.gif" = 'icons/program_icons/downloader_finished.gif',
- "downloader_running.gif" = 'icons/program_icons/downloader_running.gif',
- "ntnrc_idle.gif" = 'icons/program_icons/ntnrc_idle.gif',
- "ntnrc_new.gif" = 'icons/program_icons/ntnrc_new.gif',
- "power_norm.gif" = 'icons/program_icons/power_norm.gif',
- "power_warn.gif" = 'icons/program_icons/power_warn.gif',
- "sig_high.gif" = 'icons/program_icons/sig_high.gif',
- "sig_low.gif" = 'icons/program_icons/sig_low.gif',
- "sig_lan.gif" = 'icons/program_icons/sig_lan.gif',
- "sig_none.gif" = 'icons/program_icons/sig_none.gif',
- "smmon_0.gif" = 'icons/program_icons/smmon_0.gif',
- "smmon_1.gif" = 'icons/program_icons/smmon_1.gif',
- "smmon_2.gif" = 'icons/program_icons/smmon_2.gif',
- "smmon_3.gif" = 'icons/program_icons/smmon_3.gif',
- "smmon_4.gif" = 'icons/program_icons/smmon_4.gif',
- "smmon_5.gif" = 'icons/program_icons/smmon_5.gif',
- "smmon_6.gif" = 'icons/program_icons/smmon_6.gif',
- "borg_mon.gif" = 'icons/program_icons/borg_mon.gif'
+ "alarm_green.gif" = 'icons/program_icons/alarm_green.gif',
+ "alarm_red.gif" = 'icons/program_icons/alarm_red.gif',
+ "batt_5.gif" = 'icons/program_icons/batt_5.gif',
+ "batt_20.gif" = 'icons/program_icons/batt_20.gif',
+ "batt_40.gif" = 'icons/program_icons/batt_40.gif',
+ "batt_60.gif" = 'icons/program_icons/batt_60.gif',
+ "batt_80.gif" = 'icons/program_icons/batt_80.gif',
+ "batt_100.gif" = 'icons/program_icons/batt_100.gif',
+ "charging.gif" = 'icons/program_icons/charging.gif',
+ "downloader_finished.gif" = 'icons/program_icons/downloader_finished.gif',
+ "downloader_running.gif" = 'icons/program_icons/downloader_running.gif',
+ "ntnrc_idle.gif" = 'icons/program_icons/ntnrc_idle.gif',
+ "ntnrc_new.gif" = 'icons/program_icons/ntnrc_new.gif',
+ "power_norm.gif" = 'icons/program_icons/power_norm.gif',
+ "power_warn.gif" = 'icons/program_icons/power_warn.gif',
+ "sig_high.gif" = 'icons/program_icons/sig_high.gif',
+ "sig_low.gif" = 'icons/program_icons/sig_low.gif',
+ "sig_lan.gif" = 'icons/program_icons/sig_lan.gif',
+ "sig_none.gif" = 'icons/program_icons/sig_none.gif',
+ "smmon_0.gif" = 'icons/program_icons/smmon_0.gif',
+ "smmon_1.gif" = 'icons/program_icons/smmon_1.gif',
+ "smmon_2.gif" = 'icons/program_icons/smmon_2.gif',
+ "smmon_3.gif" = 'icons/program_icons/smmon_3.gif',
+ "smmon_4.gif" = 'icons/program_icons/smmon_4.gif',
+ "smmon_5.gif" = 'icons/program_icons/smmon_5.gif',
+ "smmon_6.gif" = 'icons/program_icons/smmon_6.gif',
+ "borg_mon.gif" = 'icons/program_icons/borg_mon.gif'
)
/datum/asset/simple/radar_assets
assets = list(
- "ntosradarbackground.png" = 'icons/UI_Icons/tgui/ntosradar_background.png',
- "ntosradarpointer.png" = 'icons/UI_Icons/tgui/ntosradar_pointer.png',
- "ntosradarpointerS.png" = 'icons/UI_Icons/tgui/ntosradar_pointer_S.png'
+ "ntosradarbackground.png" = 'icons/UI_Icons/tgui/ntosradar_background.png',
+ "ntosradarpointer.png" = 'icons/UI_Icons/tgui/ntosradar_pointer.png',
+ "ntosradarpointerS.png" = 'icons/UI_Icons/tgui/ntosradar_pointer_S.png'
)
/datum/asset/spritesheet/simple/pda
name = "pda"
assets = list(
- "atmos" = 'icons/pda_icons/pda_atmos.png',
- "back" = 'icons/pda_icons/pda_back.png',
- "bell" = 'icons/pda_icons/pda_bell.png',
- "blank" = 'icons/pda_icons/pda_blank.png',
- "boom" = 'icons/pda_icons/pda_boom.png',
- "bucket" = 'icons/pda_icons/pda_bucket.png',
- "medbot" = 'icons/pda_icons/pda_medbot.png',
- "floorbot" = 'icons/pda_icons/pda_floorbot.png',
- "cleanbot" = 'icons/pda_icons/pda_cleanbot.png',
- "crate" = 'icons/pda_icons/pda_crate.png',
- "cuffs" = 'icons/pda_icons/pda_cuffs.png',
- "eject" = 'icons/pda_icons/pda_eject.png',
- "flashlight" = 'icons/pda_icons/pda_flashlight.png',
- "honk" = 'icons/pda_icons/pda_honk.png',
- "mail" = 'icons/pda_icons/pda_mail.png',
- "medical" = 'icons/pda_icons/pda_medical.png',
- "menu" = 'icons/pda_icons/pda_menu.png',
- "mule" = 'icons/pda_icons/pda_mule.png',
- "notes" = 'icons/pda_icons/pda_notes.png',
- "power" = 'icons/pda_icons/pda_power.png',
- "rdoor" = 'icons/pda_icons/pda_rdoor.png',
- "reagent" = 'icons/pda_icons/pda_reagent.png',
- "refresh" = 'icons/pda_icons/pda_refresh.png',
- "scanner" = 'icons/pda_icons/pda_scanner.png',
- "signaler" = 'icons/pda_icons/pda_signaler.png',
- "skills" = 'icons/pda_icons/pda_skills.png',
- "status" = 'icons/pda_icons/pda_status.png',
- "dronephone" = 'icons/pda_icons/pda_dronephone.png',
- "emoji" = 'icons/pda_icons/pda_emoji.png'
+ "atmos" = 'icons/pda_icons/pda_atmos.png',
+ "back" = 'icons/pda_icons/pda_back.png',
+ "bell" = 'icons/pda_icons/pda_bell.png',
+ "blank" = 'icons/pda_icons/pda_blank.png',
+ "boom" = 'icons/pda_icons/pda_boom.png',
+ "bucket" = 'icons/pda_icons/pda_bucket.png',
+ "medbot" = 'icons/pda_icons/pda_medbot.png',
+ "floorbot" = 'icons/pda_icons/pda_floorbot.png',
+ "cleanbot" = 'icons/pda_icons/pda_cleanbot.png',
+ "crate" = 'icons/pda_icons/pda_crate.png',
+ "cuffs" = 'icons/pda_icons/pda_cuffs.png',
+ "eject" = 'icons/pda_icons/pda_eject.png',
+ "flashlight" = 'icons/pda_icons/pda_flashlight.png',
+ "honk" = 'icons/pda_icons/pda_honk.png',
+ "mail" = 'icons/pda_icons/pda_mail.png',
+ "medical" = 'icons/pda_icons/pda_medical.png',
+ "menu" = 'icons/pda_icons/pda_menu.png',
+ "mule" = 'icons/pda_icons/pda_mule.png',
+ "notes" = 'icons/pda_icons/pda_notes.png',
+ "power" = 'icons/pda_icons/pda_power.png',
+ "rdoor" = 'icons/pda_icons/pda_rdoor.png',
+ "reagent" = 'icons/pda_icons/pda_reagent.png',
+ "refresh" = 'icons/pda_icons/pda_refresh.png',
+ "scanner" = 'icons/pda_icons/pda_scanner.png',
+ "signaler" = 'icons/pda_icons/pda_signaler.png',
+ "skills" = 'icons/pda_icons/pda_skills.png',
+ "status" = 'icons/pda_icons/pda_status.png',
+ "dronephone" = 'icons/pda_icons/pda_dronephone.png',
+ "emoji" = 'icons/pda_icons/pda_emoji.png'
)
/datum/asset/spritesheet/simple/paper
@@ -133,32 +147,12 @@
"changelog.css" = 'html/changelog.css'
)
parents = list("changelog.html" = 'html/changelog.html')
-
-/datum/asset/group/goonchat
- children = list(
- /datum/asset/simple/jquery,
- /datum/asset/simple/namespaced/goonchat,
- /datum/asset/spritesheet/goonchat,
- /datum/asset/simple/namespaced/fontawesome
- )
/datum/asset/simple/jquery
legacy = TRUE
assets = list(
- "jquery.min.js" = 'code/modules/goonchat/browserassets/js/jquery.min.js',
- )
-
-/datum/asset/simple/namespaced/goonchat
- legacy = 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',
- )
- parents = list(
- //this list intentionally left empty (parent namespaced assets can't be referred to by name, only by generated url, and goonchat isn't smart enough for that. yet)
+ "jquery.min.js" = 'html/jquery.min.js',
)
/datum/asset/simple/namespaced/fontawesome
@@ -170,14 +164,13 @@
"fa-solid-900.woff" = 'html/font-awesome/webfonts/fa-solid-900.woff',
"v4shim.css" = 'html/font-awesome/css/v4-shims.min.css'
)
- parents = list("font-awesome.css" = 'html/font-awesome/css/all.min.css')
+ parents = list("font-awesome.css" = 'html/font-awesome/css/all.min.css')
-/datum/asset/spritesheet/goonchat
+/datum/asset/spritesheet/chat
name = "chat"
-/datum/asset/spritesheet/goonchat/register()
+/datum/asset/spritesheet/chat/register()
InsertAll("emoji", 'icons/emoji.dmi')
-
// pre-loading all lanugage icons also helps to avoid meta
InsertAll("language", 'icons/misc/language.dmi')
// catch languages which are pulling icons from another file
@@ -187,7 +180,6 @@
if (icon != 'icons/misc/language.dmi')
var/icon_state = initial(L.icon_state)
Insert("language-[icon_state]", icon, icon_state=icon_state)
-
..()
/datum/asset/simple/lobby
@@ -227,7 +219,7 @@
"boss4.gif" = 'icons/UI_Icons/Arcade/boss4.gif',
"boss5.gif" = 'icons/UI_Icons/Arcade/boss5.gif',
"boss6.gif" = 'icons/UI_Icons/Arcade/boss6.gif',
- )
+ )
/datum/asset/spritesheet/simple/achievements
name ="achievements"
@@ -409,9 +401,9 @@
/datum/asset/simple/genetics
assets = list(
- "dna_discovered.gif" = 'html/dna_discovered.gif',
- "dna_undiscovered.gif" = 'html/dna_undiscovered.gif',
- "dna_extra.gif" = 'html/dna_extra.gif'
+ "dna_discovered.gif" = 'html/dna_discovered.gif',
+ "dna_undiscovered.gif" = 'html/dna_undiscovered.gif',
+ "dna_extra.gif" = 'html/dna_extra.gif'
)
/datum/asset/simple/orbit
diff --git a/code/modules/asset_cache/transports/asset_transport.dm b/code/modules/asset_cache/transports/asset_transport.dm
index 6655fcbd79e..f5a1af4f057 100644
--- a/code/modules/asset_cache/transports/asset_transport.dm
+++ b/code/modules/asset_cache/transports/asset_transport.dm
@@ -5,7 +5,7 @@
/datum/asset_transport
var/name = "Simple browse_rsc asset transport"
var/static/list/preload
- /// Don't mutate the filename of assets when sending via browse_rsc.
+ /// Don't mutate the filename of assets when sending via browse_rsc.
/// This is to make it easier to debug issues with assets, and allow server operators to bypass issues that make it to production.
/// If turning this on fixes asset issues, something isn't using get_asset_url and the asset isn't marked legacy, fix one of those.
var/dont_mutate_filenames = FALSE
@@ -16,7 +16,7 @@
for(var/client/C in GLOB.clients)
addtimer(CALLBACK(src, .proc/send_assets_slow, C, preload), 1 SECONDS)
-/// Initialize - Called when SSassets initializes.
+/// Initialize - Called when SSassets initializes.
/datum/asset_transport/proc/Initialize(list/assets)
preload = assets.Copy()
if (!CONFIG_GET(flag/asset_simple_preload))
@@ -60,7 +60,13 @@
/datum/asset_transport/proc/get_asset_url(asset_name, datum/asset_cache_item/asset_cache_item)
if (!istype(asset_cache_item))
asset_cache_item = SSassets.cache[asset_name]
- if (dont_mutate_filenames || asset_cache_item.legacy || (asset_cache_item.namespace && !asset_cache_item.namespace_parent)) // to ensure code that breaks on cdns breaks in local testing, we only use the normal filename on legacy assets and name space assets.
+ // To ensure code that breaks on cdns breaks in local testing, we only
+ // use the normal filename on legacy assets and name space assets.
+ var/keep_local_name = dont_mutate_filenames \
+ || asset_cache_item.legacy \
+ || asset_cache_item.keep_local_name \
+ || (asset_cache_item.namespace && !asset_cache_item.namespace_parent)
+ if (keep_local_name)
return url_encode(asset_cache_item.name)
return url_encode("asset.[asset_cache_item.hash][asset_cache_item.ext]")
@@ -84,7 +90,7 @@
var/list/unreceived = list()
for (var/asset_name in asset_list)
- var/datum/asset_cache_item/ACI = asset_list[asset_name]
+ var/datum/asset_cache_item/ACI = asset_list[asset_name]
if (!istype(ACI) && !(ACI = SSassets.cache[asset_name]))
log_asset("ERROR: can't send asset `[asset_name]`: unregistered or invalid state: `[ACI]`")
continue
@@ -92,10 +98,14 @@
if (!asset_file)
log_asset("ERROR: can't send asset `[asset_name]`: invalid registered resource: `[ACI.resource]`")
continue
-
+
var/asset_hash = ACI.hash
var/new_asset_name = asset_name
- if (!dont_mutate_filenames && !ACI.legacy && (!ACI.namespace || ACI.namespace_parent))
+ var/keep_local_name = dont_mutate_filenames \
+ || ACI.legacy \
+ || ACI.keep_local_name \
+ || (ACI.namespace && !ACI.namespace_parent)
+ if (!keep_local_name)
new_asset_name = "asset.[ACI.hash][ACI.ext]"
if (client.sent_assets[new_asset_name] == asset_hash)
if (GLOB.Debug2)
@@ -110,11 +120,15 @@
for (var/asset_name in unreceived)
var/new_asset_name = asset_name
var/datum/asset_cache_item/ACI = unreceived[asset_name]
- if (!dont_mutate_filenames && !ACI.legacy && (!ACI.namespace || ACI.namespace_parent))
+ var/keep_local_name = dont_mutate_filenames \
+ || ACI.legacy \
+ || ACI.keep_local_name \
+ || (ACI.namespace && !ACI.namespace_parent)
+ if (!keep_local_name)
new_asset_name = "asset.[ACI.hash][ACI.ext]"
log_asset("Sending asset `[asset_name]` to client `[client]` as `[new_asset_name]`")
client << browse_rsc(ACI.resource, new_asset_name)
-
+
client.sent_assets[new_asset_name] = ACI.hash
addtimer(CALLBACK(client, /client/proc/asset_cache_update_json), 1 SECONDS, TIMER_UNIQUE|TIMER_OVERRIDE)
diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm
index 5c4ead8e189..dad02f6c93b 100644
--- a/code/modules/client/client_defines.dm
+++ b/code/modules/client/client_defines.dm
@@ -101,9 +101,6 @@
///Used for limiting the rate of clicks sends by the client to avoid abuse
var/list/clicklimiter
- ///goonchat chatoutput of the client
- var/datum/chat_output/chatOutput
-
///lazy list of all credit object bound to this client
var/list/credits
diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm
index 8b95620d9d8..f9dfd83cd55 100644
--- a/code/modules/client/client_procs.dm
+++ b/code/modules/client/client_procs.dm
@@ -89,20 +89,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
asset_cache_preload_data(href_list["asset_cache_preload_data"])
return
- // Keypress passthrough
- if(href_list["__keydown"])
- var/keycode = browser_keycode_to_byond(href_list["__keydown"])
- if(keycode)
- keyDown(keycode)
- return
- if(href_list["__keyup"])
- var/keycode = browser_keycode_to_byond(href_list["__keyup"])
- if(keycode)
- keyUp(keycode)
- return
-
// Tgui Topic middleware
- if(!tgui_Topic(href_list))
+ if(tgui_Topic(href_list))
return
// Admin PM
@@ -124,8 +112,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
return
if("vars")
return view_var_Topic(href,href_list,hsrc)
- if("chat")
- return chatOutput.Topic(href, href_list)
switch(href_list["action"])
if("openLink")
@@ -207,7 +193,6 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
/client/New(TopicData)
var/tdata = TopicData //save this for later use
- chatOutput = new /datum/chat_output(src)
TopicData = null //Prevent calls to client.Topic from connect
if(connection != "seeker" && connection != "web")//Invalid connection type.
@@ -216,6 +201,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
GLOB.clients += src
GLOB.directory[ckey] = src
+ // Instantiate tgui panel
+ tgui_panel = new(src)
+
GLOB.ahelp_tickets.ClientLogin(src)
var/connecting_admin = FALSE //because de-admined admins connecting should be treated like admins.
//Admin Authorisation
@@ -320,7 +308,8 @@ GLOBAL_LIST_INIT(blacklisted_builds, list(
set_macros()
update_movement_keys()
- chatOutput.start() // Starts the chat
+ // Initialize tgui panel
+ tgui_panel.initialize()
if(alert_mob_dupe_login)
spawn()
diff --git a/code/modules/client/darkmode.dm b/code/modules/client/darkmode.dm
deleted file mode 100644
index a58850ed3c7..00000000000
--- a/code/modules/client/darkmode.dm
+++ /dev/null
@@ -1,117 +0,0 @@
-//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, "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, "mainwindow", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = none")
- winset(src, "split", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
- //Buttons
- winset(src, "changelog", "background-color = #494949;background-color = none")
- winset(src, "changelog", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "rules", "background-color = #494949;background-color = none")
- winset(src, "rules", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "wiki", "background-color = #494949;background-color = none")
- winset(src, "wiki", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "forum", "background-color = #494949;background-color = none")
- winset(src, "forum", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "github", "background-color = #3a3a3a;background-color = none")
- winset(src, "github", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "report-issue", "background-color = #492020;background-color = none")
- winset(src, "report-issue", "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, "stat", "background-color = [COLOR_DARKMODE_DARKBACKGROUND];background-color = #FFFFFF")
- winset(src, "stat", "tab-background-color = [COLOR_DARKMODE_BACKGROUND];tab-background-color = none")
- winset(src, "stat", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "stat", "tab-text-color = [COLOR_DARKMODE_TEXT];tab-text-color = #000000")
- winset(src, "stat", "prefix-color = [COLOR_DARKMODE_TEXT];prefix-color = #000000")
- winset(src, "stat", "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, "oocbutton", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
- winset(src, "oocbutton", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "mebutton", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
- winset(src, "mebutton", "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", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
- winset(src, "tooltip", "background-color = [COLOR_DARKMODE_BACKGROUND];background-color = none")
- winset(src, "tooltip", "text-color = [COLOR_DARKMODE_TEXT];text-color = #000000")
-
-/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, "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, "mainwindow", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
- winset(src, "split", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
- //Buttons
- winset(src, "changelog", "background-color = none;background-color = #494949")
- winset(src, "changelog", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "rules", "background-color = none;background-color = #494949")
- winset(src, "rules", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "wiki", "background-color = none;background-color = #494949")
- winset(src, "wiki", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "forum", "background-color = none;background-color = #494949")
- winset(src, "forum", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "github", "background-color = none;background-color = #3a3a3a")
- winset(src, "github", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "report-issue", "background-color = none;background-color = #492020")
- winset(src, "report-issue", "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, "stat", "background-color = #FFFFFF;background-color = [COLOR_DARKMODE_DARKBACKGROUND]")
- winset(src, "stat", "tab-background-color = none;tab-background-color = [COLOR_DARKMODE_BACKGROUND]")
- winset(src, "stat", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "stat", "tab-text-color = #000000;tab-text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "stat", "prefix-color = #000000;prefix-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "stat", "suffix-color = #000000;suffix-color = [COLOR_DARKMODE_TEXT]")
- //Say, OOC, me Buttons etc.
- winset(src, "saybutton", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
- winset(src, "saybutton", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "oocbutton", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
- winset(src, "oocbutton", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
- winset(src, "mebutton", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
- winset(src, "mebutton", "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]")
- winset(src, "tooltip", "background-color = none;background-color = [COLOR_DARKMODE_BACKGROUND]")
- winset(src, "tooltip", "text-color = #000000;text-color = [COLOR_DARKMODE_TEXT]")
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index d766adb394e..a6ea9cd00e9 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -171,8 +171,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/settings/sound, togglemidis)()
to_chat(usr, "You will no longer hear sounds uploaded by admins")
usr.stop_sound_channel(CHANNEL_ADMIN)
var/client/C = usr.client
- if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
- C.chatOutput.stopMusic()
+ C?.tgui_panel?.stop_music()
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Toggle Hearing Midis", "[usr.client.prefs.toggles & SOUND_MIDI ? "Enabled" : "Disabled"]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/verbs/menu/settings/sound/togglemidis/Get_checked(client/C)
return C.prefs.toggles & SOUND_MIDI
@@ -245,8 +244,7 @@ TOGGLE_CHECKBOX(/datum/verbs/menu/settings/sound, toggle_announcement_sound)()
set desc = "Stop Current Sounds"
SEND_SOUND(usr, sound(null))
var/client/C = usr.client
- if(C && C.chatOutput && !C.chatOutput.broken && C.chatOutput.loaded)
- C.chatOutput.stopMusic()
+ C?.tgui_panel?.stop_music()
SSblackbox.record_feedback("nested tally", "preferences_verb", 1, list("Stop Self Sounds")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm
index beeded6fe8c..291befebe0f 100644
--- a/code/modules/client/verbs/ooc.dm
+++ b/code/modules/client/verbs/ooc.dm
@@ -57,7 +57,7 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
var/keyname = key
if(prefs.hearted)
- var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat)
keyname = "[sheet.icon_tag("emoji-heart")][keyname]"
if(prefs.unlock_content)
if(prefs.toggles & MEMBER_PUBLIC)
@@ -154,89 +154,6 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
else
to_chat(src, "There are no admin notices at the moment.")
-/client/verb/fix_chat()
- set name = "Fix chat"
- set category = "OOC"
- if (!chatOutput || !istype(chatOutput))
- var/action = alert(src, "Invalid Chat Output data found!\nRecreate data?", "Wot?", "Recreate Chat Output data", "Cancel")
- if (action != "Recreate Chat Output data")
- return
- chatOutput = new /datum/chat_output(src)
- chatOutput.start()
- action = alert(src, "Goon chat reloading, wait a bit and tell me if it's fixed", "", "Fixed", "Nope")
- if (action == "Fixed")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by re-creating the chatOutput datum")
- else
- chatOutput.load()
- action = alert(src, "How about now? (give it a moment (it may also try to load twice))", "", "Yes", "No")
- if (action == "Yes")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by re-creating the chatOutput datum and forcing a load()")
- else
- action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat")
- if (action == "Switch to old chat")
- winset(src, "output", "is-visible=true;is-disabled=false")
- winset(src, "browseroutput", "is-visible=false")
- log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window after recreating the chatOutput and forcing a load()")
-
- else if (chatOutput.loaded)
- var/action = alert(src, "ChatOutput seems to be loaded\nDo you want me to force a reload, wiping the chat log or just refresh the chat window because it broke/went away?", "Hmmm", "Force Reload", "Refresh", "Cancel")
- switch (action)
- if ("Force Reload")
- chatOutput.loaded = FALSE
- chatOutput.start() //this is likely to fail since it asks , but we should try it anyways so we know.
- action = alert(src, "Goon chat reloading, wait a bit and tell me if it's fixed", "", "Fixed", "Nope")
- if (action == "Fixed")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a start()")
- else
- chatOutput.load()
- action = alert(src, "How about now? (give it a moment (it may also try to load twice))", "", "Yes", "No")
- if (action == "Yes")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a load()")
- else
- action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat")
- if (action == "Switch to old chat")
- winset(src, "output", "is-visible=true;is-disabled=false")
- winset(src, "browseroutput", "is-visible=false")
- log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window forcing a start() and forcing a load()")
-
- if ("Refresh")
- chatOutput.showChat()
- action = alert(src, "Goon chat refreshing, wait a bit and tell me if it's fixed", "", "Fixed", "Nope, force a reload")
- if (action == "Fixed")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a show()")
- else
- chatOutput.loaded = FALSE
- chatOutput.load()
- action = alert(src, "How about now? (give it a moment)", "", "Yes", "No")
- if (action == "Yes")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by forcing a load()")
- else
- action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat")
- if (action == "Switch to old chat")
- winset(src, "output", "is-visible=true;is-disabled=false")
- winset(src, "browseroutput", "is-visible=false")
- log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window forcing a show() and forcing a load()")
- return
-
- else
- chatOutput.start()
- var/action = alert(src, "Manually loading Chat, wait a bit and tell me if it's fixed", "", "Fixed", "Nope")
- if (action == "Fixed")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by manually calling start()")
- else
- chatOutput.load()
- alert(src, "How about now? (give it a moment (it may also try to load twice))", "", "Yes", "No")
- if (action == "Yes")
- log_game("GOONCHAT: [key_name(src)] Had to fix their goonchat by manually calling start() and forcing a load()")
- else
- action = alert(src, "Welp, I'm all out of ideas. Try closing byond and reconnecting.\nWe could also disable fancy chat and re-enable oldchat", "", "Thanks anyways", "Switch to old chat")
- if (action == "Switch to old chat")
- winset(src, "output", list2params(list("on-show" = "", "is-disabled" = "false", "is-visible" = "true")))
- winset(src, "browseroutput", "is-disabled=true;is-visible=false")
- log_game("GOONCHAT: [key_name(src)] Failed to fix their goonchat window after manually calling start() and forcing a load()")
-
-
-
/client/verb/motd()
set name = "MOTD"
set category = "OOC"
diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm
index 65e8063ce0c..185341d294c 100644
--- a/code/modules/emoji/emoji_parse.dm
+++ b/code/modules/emoji/emoji_parse.dm
@@ -15,7 +15,7 @@
search = findtext(text, ":", pos + length(text[pos]))
if(search)
emoji = lowertext(copytext(text, pos + length(text[pos]), search))
- var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat)
+ var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/chat)
var/tag = sheet.icon_tag("emoji-[emoji]")
if(tag)
parsed += tag
diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm
deleted file mode 100644
index c8e7a68946f..00000000000
--- a/code/modules/goonchat/browserOutput.dm
+++ /dev/null
@@ -1,331 +0,0 @@
-/*********************************
-For the main html chat area
-*********************************/
-
-/// Should match the value set in the browser js
-#define MAX_COOKIE_LENGTH 5
-
-/**
- * The chatOutput datum exists to handle the goonchat browser.
- * On client, created on Client/New()
- */
-/datum/chat_output
- /// The client that owns us.
- var/client/owner
- /// 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
- /// Has the client loaded the browser output area?
- var/loaded = FALSE
- /// If they haven't loaded chat, this is where messages will go until they do
- var/list/messageQueue
- 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
- var/adminMusicVolume = 25 //This is for the Play Global Sound verb
-
-/datum/chat_output/New(client/C)
- owner = C
- messageQueue = list()
- connectionHistory = list()
-
-/**
- * start: Tries to load the chat browser
- * Aborts if a problem is encountered.
- * Async because this is called from Client/New.
- */
-/datum/chat_output/proc/start()
- set waitfor = FALSE
- //Check for existing chat
- if(!owner)
- return FALSE
-
- if(!winexists(owner, "browseroutput")) // Oh goddamnit.
- 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
-
- if(winget(owner, "browseroutput", "is-visible") == "true") //Already setup
- doneLoading()
-
- else //Not setup
- load()
-
- return TRUE
-
-/// Loads goonchat and sends assets.
-/datum/chat_output/proc/load()
- set waitfor = FALSE
- if(!owner)
- return
-
- var/datum/asset/stuff = get_asset_datum(/datum/asset/group/goonchat)
- stuff.send(owner)
-
- owner << browse(file('code/modules/goonchat/browserassets/html/browserOutput.html'), "window=browseroutput")
-
-/// Interprets input from the client. Will send data back if required.
-/datum/chat_output/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_char(key) > 7 && findtext(key, "param")) // 7 is the amount of characters in the basic param key template.
- var/param_name = copytext_char(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("setMusicVolume")
- data = setMusicVolume(arglist(params))
- if("swaptodarkmode")
- swaptodarkmode()
- if("swaptolightmode")
- swaptolightmode()
-
- if(data)
- ehjax_send(data = data)
-
-
-/// Called on chat output done-loading by JS.
-/datum/chat_output/proc/doneLoading()
- if(loaded)
- return
-
- testing("Chat loaded for [owner.ckey]")
- 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()
- SEND_TEXT(owner, "Failed to load fancy chat, reverting to old chat. Certain features won't work.")
-
-/// Hides the standard output and makes the browser visible.
-/datum/chat_output/proc/showChat()
- winset(owner, "output", "is-visible=false")
- winset(owner, "browseroutput", "is-disabled=false;is-visible=true")
-
-/// Calls syncRegex on all currently owned chatOutput datums
-/proc/syncChatRegexes()
- for (var/user in GLOB.clients)
- var/client/C = user
- var/datum/chat_output/Cchat = C.chatOutput
- if (Cchat && !Cchat.broken && Cchat.loaded)
- Cchat.syncRegex()
-
-/// Used to dynamically add regexes to the browser output. Currently only used by the IC filter.
-/datum/chat_output/proc/syncRegex()
- var/list/regexes = list()
-
- if (config.ic_filter_regex)
- regexes["show_filtered_ic_chat"] = list(
- config.ic_filter_regex.name,
- "ig",
- "$1"
- )
-
- if (regexes.len)
- ehjax_send(data = list("syncRegex" = regexes))
-
-/// Sends json encoded data to the browser.
-/datum/chat_output/proc/ehjax_send(client/C = owner, window = "browseroutput", data)
- if(islist(data))
- data = json_encode(data)
- C << output("[data]", "[window]:ehjaxCallback")
-
-/**
- * Sends music data to the browser. If enabled by the browser, it will start playing.
- * Arguments:
- * music must be a https adress.
- * extra_data is a list. The keys "pitch", "start" and "end" are used.
- ** "pitch" determines the playback rate
- ** "start" determines the start time of the sound
- ** "end" determines when the musics stops playing
- */
-/datum/chat_output/proc/sendMusic(music, list/extra_data)
- if(!findtext(music, GLOB.is_http_protocol))
- return
- var/list/music_data = list("adminMusic" = url_encode(url_encode(music)))
-
- if(extra_data?.len)
- music_data["musicRate"] = extra_data["pitch"]
- music_data["musicSeek"] = extra_data["start"]
- music_data["musicHalt"] = extra_data["end"]
-
- ehjax_send(data = music_data)
-
-/// Stops music playing throw the browser.
-/datum/chat_output/proc/stopMusic()
- ehjax_send(data = "stopMusic")
-
-/// Setter for adminMusicVolume. Sanitizes the value to between 0 and 100.
-/datum/chat_output/proc/setMusicVolume(volume = "")
- if(volume)
- adminMusicVolume = clamp(text2num(volume), 0, 100)
-
-/// Sends client connection details to the chat to handle and save
-/datum/chat_output/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/chat_output/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"], real_bans_only=TRUE))
- found = row
- break
- CHECK_TICK
-
- //Uh oh this fucker has a history of playing on a banned account!!
- if (found.len > 0)
- message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
- log_admin_private("[key_name(owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])")
-
- cookieSent = TRUE
-
-/// Called by js client every 60 seconds
-/datum/chat_output/proc/ping()
- return "pong"
-
-/// Called by js client on js error
-/datum/chat_output/proc/debug(error)
- log_world("\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: [(src.owner.key ? src.owner.key : src.owner)] triggered JS error: [error]")
-
-/// Global chat proc. to_chat_immediate will circumvent SSchat and send data as soon as possible.
-/proc/to_chat_immediate(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE)
- if(!target || !message)
- return
-
- if(target == world)
- target = GLOB.clients
-
- var/original_message = message
- if(handle_whitespace)
- message = replacetext(message, "\n", " ")
- message = replacetext(message, "\t", "[FOURSPACES][FOURSPACES]") //EIGHT SPACES IN TOTAL!!
- if(trailing_newline)
- message += " "
-
- 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.
- SEND_TEXT(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
-
- C << output(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.
- SEND_TEXT(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.
- C << output(url_encode(url_encode(message)), "browseroutput:output")
-
-/// Sends a text message to the target.
-/proc/to_chat(target, message, handle_whitespace = TRUE, trailing_newline = TRUE, confidential = FALSE)
- if(Master.current_runlevel == RUNLEVEL_INIT || !SSchat?.initialized)
- to_chat_immediate(target, message, handle_whitespace, trailing_newline, confidential)
- return
- SSchat.queue(target, message, handle_whitespace, trailing_newline, confidential)
-
-/// Dark mode light mode stuff. Yell at KMC if this breaks! (See darkmode.dm for documentation)
-/datum/chat_output/proc/swaptolightmode()
- owner.force_white_theme()
-
-/// Light mode stuff. (See darkmode.dm for documentation)
-/datum/chat_output/proc/swaptodarkmode()
- owner.force_dark_theme()
-
-#undef MAX_COOKIE_LENGTH
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
deleted file mode 100644
index 135ef6ea1e5..00000000000
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ /dev/null
@@ -1,417 +0,0 @@
-/*****************************************
-*
-* GLOBAL STYLES
-*
-******************************************/
-html, body {
- padding: 0;
- margin: 0;
- height: 100%;
- color: #a4bad6;
-}
-body {
- background: #171717;
- font-family: Verdana, sans-serif;
- font-size: 13px;
- font-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: 16px;
- 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;}
-h1.alert, h2.alert {color: #a4bad6;}
-
-em {font-style: normal; font-weight: bold;}
-
-.ooc {color: #cca300; font-weight: bold;}
-.adminobserverooc {color: #0099cc; font-weight: bold;}
-.adminooc {color: #3d5bc3; font-weight: bold;}
-
-.adminsay {color: #ff4500; font-weight: bold;}
-.admin {color: #5975da; font-weight: bold;}
-
-.name { font-weight: bold;}
-
-.say {}
-.deadsay {color: #e2c1ff}
-.binarysay {color: #1e90ff;}
-.binarysay a {color: #00ff00;}
-.binarysay a:active, .binarysay a:visited {color: #88ff88;}
-.radio {color: #1ecc43;}
-.sciradio {color: #c68cfa;}
-.comradio {color: #fcdf03;}
-.secradio {color: #dd3535;}
-.medradio {color: #57b8f0;}
-.engradio {color: #f37746;}
-.suppradio {color: #b88646;}
-.servradio {color: #6ca729;}
-.syndradio {color: #8f4a4b;}
-.centcomradio {color: #2681a5;}
-.aiprivradio {color: #d65d95;}
-.redteamradio {color: #ff4444;}
-.blueteamradio {color: #3434fd;}
-
-.yell { font-weight: bold;}
-
-.alert {color: #d82020;}
-
-.emote { font-style: italic;}
-
-.userdanger {color: #c51e1e; font-weight: bold; font-size: 185%;}
-.bolddanger {color: #c51e1e;font-weight: bold;}
-.danger {color: #c51e1e;}
-.tinydanger {color: #c51e1e; font-size: 85%;}
-.smalldanger {color: #c51e1e; font-size: 90%;}
-.warning {color: #c51e1e; font-style: italic;}
-.alertwarning {color: #FF0000; font-weight: bold}
-.boldwarning {color: #c51e1e; font-style: italic; font-weight: bold}
-.announce {color: #c51e1e; font-weight: bold;}
-.boldannounce {color: #c51e1e; font-weight: bold;}
-.greenannounce {color: #059223; font-weight: bold;}
-.rose {color: #ff5050;}
-.info {color: #9ab0ff;}
-.notice {color: #6685f5;}
-.tinynotice {color: #6685f5; font-style: italic; font-size: 85%;}
-.smallnotice {color: #6685f5; font-size: 90%;}
-.smallnoticeital {color: #6685f5; font-style: italic; font-size: 90%;}
-.boldnotice {color: #6685f5; font-weight: bold;}
-.hear {color: #6685f5; font-style: italic;}
-.adminnotice {color: #6685f5;}
-.adminhelp {color: #ff0000; font-weight: bold;}
-.unconscious {color: #a4bad6; font-weight: bold;}
-.suicide {color: #ff5050; font-style: italic;}
-.green {color: #059223;}
-.red {color: #FF0000}
-.blue {color: #215cff}
-.nicegreen {color: #059223;}
-
-.cult {color: #aa1c1c;}
-.cultitalic {color: #aa1c1c; font-style: italic;}
-.cultbold {color: #aa1c1c; font-style: italic; font-weight: bold;}
-.cultboldtalic {color: #aa1c1c; font-weight: bold; font-size: 185%;}
-
-.cultlarge {color: #aa1c1c; font-weight: bold; font-size: 185%;}
-.narsie {color: #aa1c1c; font-weight: bold; font-size: 925%;}
-.narsiesmall {color: #aa1c1c; font-weight: bold; font-size: 370%;}
-.colossus {color: #7F282A; font-size: 310%;}
-.hierophant {color: #b441ee; font-weight: bold; font-style: italic;}
-.hierophant_warning {color: #c56bf1; font-style: italic;}
-.purple {color: #9956d3;}
-.holoparasite {color: #88809c;}
-
-.revennotice {color: #c099e2;}
-.revenboldnotice {color: #c099e2; font-weight: bold;}
-.revenbignotice {color: #c099e2; font-weight: bold; font-size: 185%;}
-.revenminor {color: #823abb}
-.revenwarning {color: #760fbb; font-style: italic;}
-.revendanger {color: #760fbb; font-weight: bold; font-size: 185%;}
-
-.deconversion_message {color: #a947ff; font-size: 185%; font-style: italic;}
-
-.ghostalert {color: #6600ff; font-style: italic; font-weight: bold;}
-
-.alien {color: #855d85;}
-.noticealien {color: #059223;}
-.alertalien {color: #059223; font-weight: bold;}
-.changeling {color: #059223; font-style: italic;}
-.alertsyndie {color: #FF0000; font-size: 185%; font-weight: bold;}
-
-.spider {color: #8800ff; font-weight: bold; font-size: 185%;}
-
-.interface {color: #750e75;}
-
-.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
-.papyrus {font-family: "Papyrus", cursive, sans-serif;}
-.robot {font-family: "Courier New", cursive, sans-serif;}
-
-.command_headset {font-weight: bold; font-size: 160%;}
-.small {font-size: 60%;}
-.big {font-size: 185%;}
-.reallybig {font-size: 245%;}
-.extremelybig {font-size: 310%;}
-.greentext {color: #059223; font-size: 185%;}
-.redtext {color: #c51e1e; font-size: 185%;}
-.clown {color: #ff70c1; font-size: 160%; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
-.singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;}
-.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
-.hypnophrase {color: #202020; font-weight: bold; animation: hypnocolor 1500ms infinite; animation-direction: alternate;}
-@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;}
-
-.memo {color: #638500; text-align: center;}
-.memoedit {text-align: center; font-size: 125%;}
-.abductor {color: #c204c2; font-style: italic;}
-.mind_control {color: #df3da9; font-size: 100%; font-weight: bold; font-style: italic;}
-.slime {color: #00CED1;}
-.drone {color: #848482;}
-.monkey {color: #975032;}
-.swarmer {color: #2C75FF;}
-.resonate {color: #298F85;}
-
-.monkeyhive {color: #a56408;}
-.monkeylead {color: #af6805; font-size: 80%;}
-
-.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;}
diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css
deleted file mode 100644
index 1c9d0cdfb29..00000000000
--- a/code/modules/goonchat/browserassets/css/browserOutput_white.css
+++ /dev/null
@@ -1,415 +0,0 @@
-/*****************************************
-*
-* 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: 16px;
- 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;}
-h1.alert, h2.alert {color: #000000;}
-
-em {font-style: normal; font-weight: bold;}
-
-.ooc {color: #002eb8; font-weight: bold;}
-.adminobserverooc {color: #0099cc; font-weight: bold;}
-.adminooc {color: #700038; font-weight: bold;}
-
-.adminsay {color: #ff4500; font-weight: bold;}
-.admin {color: #4473ff; font-weight: bold;}
-
-.name { font-weight: bold;}
-
-.say {}
-.deadsay {color: #5c00e6;}
-.binarysay {color: #20c20e; background-color: #000000; display: block;}
-.binarysay a {color: #00ff00;}
-.binarysay a:active, .binarysay a:visited {color: #88ff88;}
-.radio {color: #008000;}
-.sciradio {color: #993399;}
-.comradio {color: #948f02;}
-.secradio {color: #a30000;}
-.medradio {color: #337296;}
-.engradio {color: #fb5613;}
-.suppradio {color: #a8732b;}
-.servradio {color: #6eaa2c;}
-.syndradio {color: #6d3f40;}
-.centcomradio {color: #686868;}
-.aiprivradio {color: #ff00ff;}
-.redteamradio {color: #ff0000;}
-.blueteamradio {color: #0000ff;}
-
-.yell { font-weight: bold;}
-
-.alert {color: #ff0000;}
-h1.alert, h2.alert {color: #000000;}
-
-.emote { font-style: italic;}
-
-.userdanger {color: #ff0000; font-weight: bold; font-size: 185%;}
-.bolddanger {color: #ff0000; font-weight: bold;}
-.danger {color: #ff0000;}
-.tinydanger {color: #ff0000; font-size: 85%;}
-.smalldanger {color: #ff0000; font-size: 90%;}
-.warning {color: #ff0000; font-style: italic;}
-.alertwarning {color: #FF0000; font-weight: bold}
-.boldwarning {color: #ff0000; font-style: italic; font-weight: bold}
-.announce {color: #228b22; font-weight: bold;}
-.boldannounce {color: #ff0000; font-weight: bold;}
-.greenannounce {color: #00ff00; font-weight: bold;}
-.rose {color: #ff5050;}
-.info {color: #0000CC;}
-.notice {color: #000099;}
-.tinynotice {color: #000099; font-style: italic; font-size: 85%;}
-.smallnotice {color: #000099; font-size: 90%;}
-.smallnoticeital {color: #000099; font-style: italic; font-size: 90%;}
-.boldnotice {color: #000099; font-weight: bold;}
-.hear {color: #000099; font-style: italic;}
-.adminnotice {color: #0000ff;}
-.adminhelp {color: #ff0000; font-weight: bold;}
-.unconscious {color: #0000ff; font-weight: bold;}
-.suicide {color: #ff5050; font-style: italic;}
-.green {color: #03ff39;}
-.red {color: #FF0000}
-.blue {color: #0000FF}
-.nicegreen {color: #14a833;}
-
-.cult {color: #960000;}
-.cultitalic {color: #960000; font-style: italic;}
-.cultbold {color: #960000; font-style: italic; font-weight: bold;}
-.cultboldtalic {color: #960000; font-weight: bold; font-size: 185%;}
-
-.cultlarge {color: #960000; font-weight: bold; font-size: 185%;}
-.narsie {color: #960000; font-weight: bold; font-size: 925%;}
-.narsiesmall {color: #960000; font-weight: bold; font-size: 370%;}
-.colossus {color: #7F282A; font-size: 310%;}
-.hierophant {color: #660099; font-weight: bold; font-style: italic;}
-.hierophant_warning {color: #660099; font-style: italic;}
-.purple {color: #5e2d79;}
-.holoparasite {color: #35333a;}
-
-.revennotice {color: #1d2953;}
-.revenboldnotice {color: #1d2953; font-weight: bold;}
-.revenbignotice {color: #1d2953; font-weight: bold; font-size: 185%;}
-.revenminor {color: #823abb}
-.revenwarning {color: #760fbb; font-style: italic;}
-.revendanger {color: #760fbb; font-weight: bold; font-size: 185%;}
-
-.deconversion_message {color: #5000A0; font-size: 185%; font-style: italic;}
-
-.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
-
-.alien {color: #543354;}
-.noticealien {color: #00c000;}
-.alertalien {color: #00c000; font-weight: bold;}
-.changeling {color: #800080; font-style: italic;}
-.alertsyndie {color: #FF0000; font-size: 185%; font-weight: bold;}
-
-.spider {color: #4d004d; font-weight: bold; font-size: 185%;}
-
-.interface {color: #330033;}
-
-.sans {font-family: "Comic Sans MS", cursive, sans-serif;}
-.papyrus {font-family: "Papyrus", cursive, sans-serif;}
-.robot {font-family: "Courier New", cursive, sans-serif;}
-
-.command_headset {font-weight: bold; font-size: 160%;}
-.small {font-size: 60%;}
-.big {font-size: 185%;}
-.reallybig {font-size: 245%;}
-.extremelybig {font-size: 310%;}
-.greentext {color: #00FF00; font-size: 185%;}
-.redtext {color: #FF0000; font-size: 185%;}
-.clown {color: #FF69Bf; font-size: 160%; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;}
-.singing {font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;}
-.his_grace {color: #15D512; font-family: "Courier New", cursive, sans-serif; font-style: italic;}
-.hypnophrase {color: #0d0d0d; font-weight: bold; animation: hypnocolor 1500ms infinite; animation-direction: alternate;}
-@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;}
-
-.memo {color: #638500; text-align: center;}
-.memoedit {text-align: center; font-size: 125%;}
-.abductor {color: #800080; font-style: italic;}
-.mind_control {color: #A00D6F; font-size: 100%; font-weight: bold; font-style: italic;}
-.slime {color: #00CED1;}
-.drone {color: #848482;}
-.monkey {color: #975032;}
-.swarmer {color: #2C75FF;}
-.resonate {color: #298F85;}
-
-.monkeyhive {color: #774704;}
-.monkeylead {color: #774704; font-size: 80%;}
-
-.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;}
diff --git a/code/modules/goonchat/browserassets/html/browserOutput.html b/code/modules/goonchat/browserassets/html/browserOutput.html
deleted file mode 100644
index ff7bff68150..00000000000
--- a/code/modules/goonchat/browserassets/html/browserOutput.html
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
- Chat
-
-
-
-
-
-
-
-
-
-
-
-
- Loading...
- If this takes longer than 30 seconds, it will automatically reload a maximum of 5 times.
- If it still doesn't work, use the bug report button at the top right of the window.
-