From d9e3699f885b74cc43e3058099e1a78567bd6b7f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 8 Jun 2017 16:27:56 -0500 Subject: [PATCH 1/5] Ports Goonchat --- code/__HELPERS/icons.dm | 2 +- code/__HELPERS/unsorted.dm | 4 +- code/__HELPERS/unsorted.dm.rej | 13 + code/datums/browser.dm | 9 +- code/datums/wires/mulebot.dm | 10 +- code/datums/wires/particle_accelerator.dm | 2 +- code/datums/wires/syndicatebomb.dm | 24 +- code/game/atoms.dm | 2 +- code/game/gamemodes/clock_cult/clock_mobs.dm | 2 +- code/game/gamemodes/cult/cult_comms.dm.rej | 10 + code/game/gamemodes/cult/ritual.dm | 2 +- .../gamemodes/devil/true_devil/_true_devil.dm | 6 +- code/game/gamemodes/gang/gang_datum.dm | 4 +- code/game/gamemodes/gang/gang_pen.dm | 2 +- code/game/gamemodes/gang/recaller.dm | 2 +- code/game/gamemodes/gang/recaller.dm.rej | 53 + code/game/gamemodes/traitor/traitor.dm | 3 +- code/game/machinery/computer/apc_control.dm | 8 +- code/game/machinery/computer/message.dm.rej | 27 + code/game/machinery/machinery.dm | 2 +- code/game/machinery/overview.dm | 8 +- code/game/machinery/syndicatebomb.dm | 10 +- .../machinery/telecomms/broadcasting.dm.rej | 10 + code/game/mecha/equipment/mecha_equipment.dm | 2 +- code/game/mecha/mecha.dm | 6 +- code/game/objects/effects/mines.dm | 2 +- code/game/objects/items/devices/PDA/PDA.dm | 2 +- .../game/objects/items/devices/PDA/PDA.dm.rej | 10 + .../objects/items/devices/geiger_counter.dm | 14 +- code/game/objects/items/toys.dm | 4 +- code/game/objects/items/weapons/AI_modules.dm | 2 +- .../objects/items/weapons/cards_ids.dm.rej | 10 + .../objects/items/weapons/pneumaticCannon.dm | 4 +- code/game/objects/items/weapons/powerfist.dm | 2 +- code/modules/admin/verbs/pray.dm.rej | 10 + code/modules/assembly/bomb.dm | 2 +- code/modules/assembly/health.dm | 2 +- code/modules/assembly/infrared.dm | 2 +- code/modules/assembly/proximity.dm | 2 +- code/modules/assembly/signaler.dm | 2 +- code/modules/assembly/timer.dm | 2 +- code/modules/client/asset_cache.dm | 15 + code/modules/client/asset_cache.dm.rej | 21 + code/modules/client/client_defines.dm | 4 +- code/modules/client/client_procs.dm | 7 + code/modules/client/client_procs.dm.rej | 10 + code/modules/client/verbs/ooc.dm | 2 +- .../modules/clothing/spacesuits/flightsuit.dm | 14 +- code/modules/clothing/spacesuits/hardsuit.dm | 2 +- code/modules/emoji/emoji_parse.dm | 2 +- .../kitchen_machinery/icecream_vat.dm | 2 +- code/modules/food_and_drinks/pizzabox.dm | 2 +- .../goonchat/browserassets/js/errorHandler.js | 34 + code/modules/goonchat/jsErrorHandler.dm | 100 ++ code/modules/mob/living/carbon/examine.dm | 16 +- .../mob/living/carbon/human/examine.dm | 58 +- .../living/carbon/human/human_defense.dm.rej | 14 + .../mob/living/silicon/ai/examine.dm.rej | 8 + .../mob/living/silicon/pai/software.dm | 2 +- .../mob/living/silicon/robot/examine.dm | 4 +- .../mob/living/simple_animal/bot/bot.dm | 6 +- .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 2 +- .../simple_animal/friendly/drone/_drone.dm | 14 +- .../living/simple_animal/friendly/mouse.dm | 2 +- .../simple_animal/guardian/types/dextrous.dm | 10 +- .../mob/living/simple_animal/slime/slime.dm | 2 +- code/modules/reagents/chemistry/holder.dm | 4 +- code/modules/recycling/conveyor2.dm | 2 +- code/modules/stock_market/computer.dm | 2 +- code/modules/uplink/uplink_item.dm | 4 +- code/modules/uplink/uplink_item.dm.rej | 10 + code/world.dm.rej | 10 + goon/browserassets/css/browserOutput.css | 362 +++++++ goon/browserassets/css/font-awesome.css | 788 +++++++++++++++ goon/browserassets/html/browserOutput.html | 44 + goon/browserassets/js/browserOutput.js | 908 ++++++++++++++++++ goon/browserassets/js/json2.min.js | 1 + goon/code/datums/browserOutput.dm | 289 ++++++ interface/skin.dmf | 23 +- interface/stylesheet.dm | 8 + tgstation.dme | 2 + tgstation.dme.rej | 9 + 83 files changed, 2954 insertions(+), 162 deletions(-) create mode 100644 code/__HELPERS/unsorted.dm.rej create mode 100644 code/game/gamemodes/cult/cult_comms.dm.rej create mode 100644 code/game/gamemodes/gang/recaller.dm.rej create mode 100644 code/game/machinery/computer/message.dm.rej create mode 100644 code/game/machinery/telecomms/broadcasting.dm.rej create mode 100644 code/game/objects/items/devices/PDA/PDA.dm.rej create mode 100644 code/game/objects/items/weapons/cards_ids.dm.rej create mode 100644 code/modules/admin/verbs/pray.dm.rej create mode 100644 code/modules/client/asset_cache.dm.rej create mode 100644 code/modules/client/client_procs.dm.rej create mode 100644 code/modules/goonchat/browserassets/js/errorHandler.js create mode 100644 code/modules/goonchat/jsErrorHandler.dm create mode 100644 code/modules/mob/living/carbon/human/human_defense.dm.rej create mode 100644 code/modules/mob/living/silicon/ai/examine.dm.rej create mode 100644 code/modules/uplink/uplink_item.dm.rej create mode 100644 code/world.dm.rej create mode 100644 goon/browserassets/css/browserOutput.css create mode 100644 goon/browserassets/css/font-awesome.css create mode 100644 goon/browserassets/html/browserOutput.html create mode 100644 goon/browserassets/js/browserOutput.js create mode 100644 goon/browserassets/js/json2.min.js create mode 100644 goon/code/datums/browserOutput.dm create mode 100644 tgstation.dme.rej diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 31e67197a8..dbebb6bfb8 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -167,7 +167,7 @@ mob Output_Icon() set name = "2. Output Icon" - to_chat(src, "Icon is: \icon[getFlatIcon(src)]") + to_chat(src, "Icon is: [bicon(getFlatIcon(src))]") Label_Icon() set name = "3. Label Icon" diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 966a3a519a..90fbdfd77b 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -834,11 +834,11 @@ GLOBAL_LIST_INIT(WALLITEMS_INVERSE, typecacheof(list( /obj/proc/atmosanalyzer_scan(datum/gas_mixture/air_contents, mob/user, obj/target = src) var/obj/icon = target - user.visible_message("[user] has used the analyzer on \icon[icon] [target].", "You use the analyzer on \icon[icon] [target].") + user.visible_message("[user] has used the analyzer on [bicon(icon)] [target].", "You use the analyzer on [bicon(icon)] [target].") var/pressure = air_contents.return_pressure() var/total_moles = air_contents.total_moles() - to_chat(user, "Results of analysis of \icon[icon] [target].") + to_chat(user, "Results of analysis of [bicon(icon)] [target].") if(total_moles>0) to_chat(user, "Pressure: [round(pressure,0.1)] kPa") diff --git a/code/__HELPERS/unsorted.dm.rej b/code/__HELPERS/unsorted.dm.rej new file mode 100644 index 0000000000..d8ac1b978b --- /dev/null +++ b/code/__HELPERS/unsorted.dm.rej @@ -0,0 +1,13 @@ +diff a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm (rejected hunks) +@@ -1422,6 +1422,7 @@ var/valid_HTTPSGet = FALSE + fdel(temp_file) + + #define UNTIL(X) while(!(X)) stoplag() +- ++/* + /proc/to_chat(target, message) +- target << message +\ No newline at end of file ++ target << message ++ */ +\ No newline at end of file diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 282759b961..278d5cc85f 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -92,6 +92,10 @@ "} /datum/browser/proc/open(use_onclose = 1) + if(isnull(window_id)) //null check because this can potentially nuke goonchat + WARNING("Browser [title] tried to open with a null ID") + to_chat(user, "The [title] browser you tried to open failed a sanity check! Please report this on github!") + return var/window_size = "" if (width && height) window_size = "size=[width]x[height];" @@ -111,7 +115,10 @@ break /datum/browser/proc/close() - user << browse(null, "window=[window_id]") + if(!isnull(window_id))//null check because this can potentially nuke goonchat + user << browse(null, "window=[window_id]") + else + WARNING("Browser [title] tried to close with a null ID") /datum/browser/alert var/selectedbutton = 0 diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm index 35ea1cc808..7f71570e67 100644 --- a/code/datums/wires/mulebot.dm +++ b/code/datums/wires/mulebot.dm @@ -20,12 +20,12 @@ var/mob/living/simple_animal/bot/mulebot/M = holder switch(wire) if(WIRE_POWER1, WIRE_POWER2) - holder.visible_message("\icon[M] The charge light flickers.") + holder.visible_message("[bicon(M)] The charge light flickers.") if(WIRE_AVOIDANCE) - holder.visible_message("\icon[M] The external warning lights flash briefly.") + holder.visible_message("[bicon(M)] The external warning lights flash briefly.") if(WIRE_LOADCHECK) - holder.visible_message("\icon[M] The load platform clunks.") + holder.visible_message("[bicon(M)] The load platform clunks.") if(WIRE_MOTOR1, WIRE_MOTOR2) - holder.visible_message("\icon[M] The drive motor whines briefly.") + holder.visible_message("[bicon(M)] The drive motor whines briefly.") else - holder.visible_message("\icon[M] You hear a radio crackle.") \ No newline at end of file + holder.visible_message("[bicon(M)] You hear a radio crackle.") \ No newline at end of file diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm index 9d82892bea..e2bef037dd 100644 --- a/code/datums/wires/particle_accelerator.dm +++ b/code/datums/wires/particle_accelerator.dm @@ -25,7 +25,7 @@ if(WIRE_INTERFACE) C.interface_control = !C.interface_control if(WIRE_LIMIT) - C.visible_message("\icon[C][C] makes a large whirring noise.") + C.visible_message("[bicon(C)][C] makes a large whirring noise.") /datum/wires/particle_accelerator/control_box/on_cut(wire, mend) var/obj/machinery/particle_accelerator/control_box/C = holder diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm index 1d7f1ebf96..30d469f579 100644 --- a/code/datums/wires/syndicatebomb.dm +++ b/code/datums/wires/syndicatebomb.dm @@ -19,21 +19,21 @@ switch(wire) if(WIRE_BOOM) if(B.active) - holder.visible_message("\icon[B] An alarm sounds! It's go-") + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) if(WIRE_UNBOLT) - holder.visible_message("\icon[B] The bolts spin in place for a moment.") + holder.visible_message("[bicon(B)] The bolts spin in place for a moment.") if(WIRE_DELAY) if(B.delayedbig) - holder.visible_message("\icon[B] The bomb has already been delayed.") + holder.visible_message("[bicon(B)] The bomb has already been delayed.") else - holder.visible_message("\icon[B] The bomb chirps.") + holder.visible_message("[bicon(B)] The bomb chirps.") playsound(B, 'sound/machines/chime.ogg', 30, 1) B.detonation_timer += 300 B.delayedbig = TRUE if(WIRE_PROCEED) - holder.visible_message("\icon[B] The bomb buzzes ominously!") + holder.visible_message("[bicon(B)] The bomb buzzes ominously!") playsound(B, 'sound/machines/buzz-sigh.ogg', 30, 1) var/seconds = B.seconds_remaining() if(seconds >= 61) // Long fuse bombs can suddenly become more dangerous if you tinker with them. @@ -44,13 +44,13 @@ B.detonation_timer = world.time + 100 if(WIRE_ACTIVATE) if(!B.active && !B.defused) - holder.visible_message("\icon[B] You hear the bomb start ticking!") + holder.visible_message("[bicon(B)] You hear the bomb start ticking!") B.activate() B.update_icon() else if(B.delayedlittle) - holder.visible_message("\icon[B] Nothing happens.") + holder.visible_message("[bicon(B)] Nothing happens.") else - holder.visible_message("\icon[B] The bomb seems to hesitate for a moment.") + holder.visible_message("[bicon(B)] The bomb seems to hesitate for a moment.") B.detonation_timer += 100 B.delayedlittle = TRUE @@ -62,24 +62,24 @@ B.defused = FALSE // Cutting and mending all the wires of an inactive bomb will thus cure any sabotage. else if(B.active) - holder.visible_message("\icon[B] An alarm sounds! It's go-") + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) else B.defused = TRUE if(WIRE_UNBOLT) if(!mend && B.anchored) - holder.visible_message("\icon[B] The bolts lift out of the ground!") + holder.visible_message("[bicon(B)] The bolts lift out of the ground!") playsound(B, 'sound/effects/stealthoff.ogg', 30, 1) B.anchored = FALSE if(WIRE_PROCEED) if(!mend && B.active) - holder.visible_message("\icon[B] An alarm sounds! It's go-") + holder.visible_message("[bicon(B)] An alarm sounds! It's go-") B.explode_now = TRUE tell_admins(B) if(WIRE_ACTIVATE) if(!mend && B.active) - holder.visible_message("\icon[B] The timer stops! The bomb has been defused!") + holder.visible_message("[bicon(B)] The timer stops! The bomb has been defused!") B.active = FALSE B.defused = TRUE B.update_icon() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index acb60f77ac..2c9f0deae3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -249,7 +249,7 @@ f_name = "a " f_name += "blood-stained [name]!" - to_chat(user, "\icon[src] That's [f_name]") + to_chat(user, "[bicon(src)] That's [f_name]") if(desc) to_chat(user, desc) diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm index d3a33c0c40..14c8246703 100644 --- a/code/game/gamemodes/clock_cult/clock_mobs.dm +++ b/code/game/gamemodes/clock_cult/clock_mobs.dm @@ -37,7 +37,7 @@ /mob/living/simple_animal/hostile/clockwork/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" msg += "[desc]\n" if(health < maxHealth) msg += "" diff --git a/code/game/gamemodes/cult/cult_comms.dm.rej b/code/game/gamemodes/cult/cult_comms.dm.rej new file mode 100644 index 0000000000..32d4b882e3 --- /dev/null +++ b/code/game/gamemodes/cult/cult_comms.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm (rejected hunks) +@@ -171,7 +171,7 @@ + return 0 + if(cooldown > world.time) + if(!CM.active) +- owner << "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target!" ++ to_chat(owner, "You need to wait [round((cooldown - world.time) * 0.1)] seconds before you can mark another target!") + return 0 + return ..() + diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index e292cf5ab3..e37afa2b4d 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -70,7 +70,7 @@ This file contains the arcane tome files. /obj/item/weapon/tome/proc/read_tome(mob/user) var/text = "" text += "
Archives of the Dark One



" - text += "A rune's name and effects can be revealed by examining the rune.<

" + text += "A rune's name and effects can be revealed by examining the rune.

" text += "Create Talisman
This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \ invoking it and choosing which talisman you desire, the paper will be converted, after some delay into a talisman.

" diff --git a/code/game/gamemodes/devil/true_devil/_true_devil.dm b/code/game/gamemodes/devil/true_devil/_true_devil.dm index a77b2f95a6..57482c4a4e 100644 --- a/code/game/gamemodes/devil/true_devil/_true_devil.dm +++ b/code/game/gamemodes/devil/true_devil/_true_devil.dm @@ -66,15 +66,15 @@ /mob/living/carbon/true_devil/examine(mob/user) - var/msg = "*---------*\nThis is \icon[src] [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" //Left hand items for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It is holding \icon[I] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It is holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It is holding \icon[I] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It is holding [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Braindead if(!client && stat != DEAD) diff --git a/code/game/gamemodes/gang/gang_datum.dm b/code/game/gamemodes/gang/gang_datum.dm index d6aa1830f2..0fe53adf02 100644 --- a/code/game/gamemodes/gang/gang_datum.dm +++ b/code/game/gamemodes/gang/gang_datum.dm @@ -190,7 +190,7 @@ var/mob/living/mob = get(tool.loc,/mob/living) if(mob && mob.mind && mob.stat == CONSCIOUS) if(mob.mind.gang_datum == src) - to_chat(mob, "\icon[tool] [message]") + to_chat(mob, "[bicon(tool)] [message]") return @@ -284,7 +284,7 @@ G.points += points_newer pmessage += "Your influential choice of clothing has further increased your influence by [points_newer] points.
" pmessage += "You now have [G.points] influence.
" - to_chat(ganger, "\icon[G] [pmessage]") + to_chat(ganger, "[bicon(G)] [pmessage]") //Multiverse diff --git a/code/game/gamemodes/gang/gang_pen.dm b/code/game/gamemodes/gang/gang_pen.dm index d60a3cb57b..5c1bdf37e6 100644 --- a/code/game/gamemodes/gang/gang_pen.dm +++ b/code/game/gamemodes/gang/gang_pen.dm @@ -66,4 +66,4 @@ cooldown = 0 icon_state = "pen" var/mob/M = get(src, /mob) - to_chat(M, "\icon[src] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") + to_chat(M, "[bicon(src)] [src][(src.loc == M)?(""):(" in your [src.loc]")] vibrates softly. It is ready to be used again.") diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm index 8363261c5d..22fc4208c5 100644 --- a/code/game/gamemodes/gang/recaller.dm +++ b/code/game/gamemodes/gang/recaller.dm @@ -111,7 +111,7 @@ if(!message || !can_use(user)) return if(user.z > 2) - to_chat(user, "\icon[src]Error: Station out of range.") + to_chat(user, "[bicon(src)]Error: Station out of range.") return var/list/members = list() members += gang.gangsters diff --git a/code/game/gamemodes/gang/recaller.dm.rej b/code/game/gamemodes/gang/recaller.dm.rej new file mode 100644 index 0000000000..31ef014f69 --- /dev/null +++ b/code/game/gamemodes/gang/recaller.dm.rej @@ -0,0 +1,53 @@ +diff a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm (rejected hunks) +@@ -170,35 +170,35 @@ + + gang.message_gangtools("[usr] is attempting to recall the emergency shuttle.") + recalling = 1 +- to_chat(loc, "\icon[src]Generating shuttle recall order with codes retrieved from last call signal...") ++ to_chat(loc, "[bicon(src)]Generating shuttle recall order with codes retrieved from last call signal...") + + sleep(rand(100,300)) + + if(SSshuttle.emergency.mode != SHUTTLE_CALL) //Shuttle can only be recalled when it's moving to the station +- to_chat(user, "\icon[src]Emergency shuttle cannot be recalled at this time.") ++ to_chat(user, "[bicon(src)]Emergency shuttle cannot be recalled at this time.") + recalling = 0 + return 0 +- to_chat(loc, "\icon[src]Shuttle recall order generated. Accessing station long-range communication arrays...") ++ to_chat(loc, "[bicon(src)]Shuttle recall order generated. Accessing station long-range communication arrays...") + + sleep(rand(100,300)) + + if(!gang.dom_attempts) +- to_chat(user, "\icon[src]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") ++ to_chat(user, "[bicon(src)]Error: Unable to access communication arrays. Firewall has logged our signature and is blocking all further attempts.") + recalling = 0 + return 0 + + var/turf/userturf = get_turf(user) + if(userturf.z != 1) //Shuttle can only be recalled while on station +- to_chat(user, "\icon[src]Error: Device out of range of station communication arrays.") ++ to_chat(user, "[bicon(src)]Error: Device out of range of station communication arrays.") + recalling = 0 + return 0 + var/datum/station_state/end_state = new /datum/station_state() + end_state.count() + if((100 * start_state.score(end_state)) < 80) //Shuttle cannot be recalled if the station is too damaged +- to_chat(user, "\icon[src]Error: Station communication systems compromised. Unable to establish connection.") ++ to_chat(user, "[bicon(src)]Error: Station communication systems compromised. Unable to establish connection.") + recalling = 0 + return 0 +- to_chat(loc, "\icon[src]Comm arrays accessed. Broadcasting recall signal...") ++ to_chat(loc, "[bicon(src)]Comm arrays accessed. Broadcasting recall signal...") + + sleep(rand(100,300)) + +@@ -210,7 +210,7 @@ + if(SSshuttle.cancelEvac(user)) + return 1 + +- to_chat(loc, "\icon[src]No response recieved. Emergency shuttle cannot be recalled at this time.") ++ to_chat(loc, "[bicon(src)]No response recieved. Emergency shuttle cannot be recalled at this time.") + return 0 + + /obj/item/device/gangtool/proc/can_use(mob/living/carbon/human/user) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 6ad37815ca..7ff5c03739 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -274,7 +274,8 @@ if(uplink_true) text += " (used [TC_uses] TC) [purchases]" if(TC_uses==0 && traitorwin) - text += "" + var/static/icon/badass = icon('icons/BadAss.dmi', "badass") + text += "[bicon(badass)]" text += objectives diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index 0c1b870771..0c624688ce 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -116,24 +116,24 @@ authenticated = FALSE auth_id = "\[NULL\]" if(href_list["restore_logging"]) - to_chat(usr, "\icon[src] Logging functionality restored from backup data.") + to_chat(usr, "[bicon(src)] Logging functionality restored from backup data.") emagged = FALSE LAZYADD(logs, "-=- Logging restored to full functionality at this point -=-") if(href_list["access_apc"]) playsound(src, "terminal_type", 50, 0) var/obj/machinery/power/apc/APC = locate(href_list["access_apc"]) in GLOB.apcs_list if(!APC || APC.aidisabled || APC.panel_open || QDELETED(APC)) - to_chat(usr, "\icon[src] APC does not return interface request. Remote access may be disabled.") + to_chat(usr, "[bicon(src)] APC does not return interface request. Remote access may be disabled.") return if(active_apc) - to_chat(usr, "\icon[src] Disconnected from [active_apc].") + to_chat(usr, "[bicon(src)] Disconnected from [active_apc].") active_apc.say("Remote access canceled. Interface locked.") playsound(active_apc, 'sound/machines/BoltsDown.ogg', 25, 0) playsound(active_apc, 'sound/machines/terminal_alert.ogg', 50, 0) active_apc.locked = TRUE active_apc.update_icon() active_apc = null - to_chat(usr, "\icon[src] Connected to APC in [get_area(APC)]. Interface request sent.") + to_chat(usr, "[bicon(src)] Connected to APC in [get_area(APC)]. Interface request sent.") log_activity("remotely accessed APC in [get_area(APC)]") APC.interact(usr, GLOB.not_incapacitated_state) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) diff --git a/code/game/machinery/computer/message.dm.rej b/code/game/machinery/computer/message.dm.rej new file mode 100644 index 0000000000..bd4065af39 --- /dev/null +++ b/code/game/machinery/computer/message.dm.rej @@ -0,0 +1,27 @@ +diff a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm (rejected hunks) +@@ -413,10 +413,10 @@ + customrecepient.tnote += "← From [customsender] ([customjob]):
[custommessage]
" + if (!customrecepient.silent) + playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) +- customrecepient.audible_message("\icon[customrecepient] *[customrecepient.ttone]*", null, 3) ++ customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3) + if( customrecepient.loc && ishuman(customrecepient.loc) ) + var/mob/living/carbon/human/H = customrecepient.loc +- to_chat(H, "\icon[customrecepient] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") ++ to_chat(H, "[bicon(customrecepient)] Message from [customsender] ([customjob]), \"[custommessage]\" (Reply)") + log_pda("[usr]/([usr.ckey]) (PDA: [customsender]) sent \"[custommessage]\" to [customrecepient.owner]") + customrecepient.cut_overlays() + customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r")) +@@ -426,10 +426,10 @@ + customrecepient.tnote += "← From [PDARec.owner] ([customjob]):
[custommessage]
" + if (!customrecepient.silent) + playsound(customrecepient.loc, 'sound/machines/twobeep.ogg', 50, 1) +- customrecepient.audible_message("\icon[customrecepient] *[customrecepient.ttone]*", null, 3) ++ customrecepient.audible_message("[bicon(customrecepient)] *[customrecepient.ttone]*", null, 3) + if( customrecepient.loc && ishuman(customrecepient.loc) ) + var/mob/living/carbon/human/H = customrecepient.loc +- to_chat(H, "\icon[customrecepient] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") ++ to_chat(H, "[bicon(customrecepient)] Message from [PDARec.owner] ([customjob]), \"[custommessage]\" (Reply)") + log_pda("[usr]/([usr.ckey]) (PDA: [PDARec.owner]) sent \"[custommessage]\" to [customrecepient.owner]") + customrecepient.cut_overlays() + customrecepient.add_overlay(image('icons/obj/pda.dmi', "pda-r")) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index a224efd91c..e0355ca2be 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -440,7 +440,7 @@ Class Procs: /obj/machinery/proc/display_parts(mob/user) to_chat(user, "Following parts detected in the machine:") for(var/obj/item/C in component_parts) - to_chat(user, "\icon[C] [C.name]") + to_chat(user, "[bicon(C)] [C.name]") /obj/machinery/examine(mob/user) ..() diff --git a/code/game/machinery/overview.dm b/code/game/machinery/overview.dm index 9dfb77ab66..18a5dd7090 100644 --- a/code/game/machinery/overview.dm +++ b/code/game/machinery/overview.dm @@ -146,7 +146,7 @@ var/icon/I2 = imap[2+(ix + icx*iy)*2] - //to_chat(world, "icon: \icon[I]") + //to_chat(world, "icon: [bicon(I)]") I.DrawBox(colour, rx, ry, rx+1, ry+1) @@ -163,7 +163,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "\icon[I] at [H.screen_loc]") + //to_chat(world, "[bicon(I)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" @@ -274,7 +274,7 @@ var/icon/I = imap[1+(ix + icx*iy)] - //to_chat(world, "icon: \icon[I]") + //to_chat(world, "icon: [bicon(I)]") I.DrawBox(colour, rx, ry, rx, ry) @@ -289,7 +289,7 @@ H.screen_loc = "[5 + i%icx],[6+ round(i/icx)]" - //to_chat(world, "\icon[I] at [H.screen_loc]") + //to_chat(world, "[bicon(I)] at [H.screen_loc]") H.name = (i==0)?"maprefresh":"map" diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 4d8ad29941..e044ceb32e 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -210,14 +210,14 @@ var/new_timer = input(user, "Please set the timer.", "Timer", "[timer_set]") as num if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station timer_set = Clamp(new_timer, minimum_timer, maximum_timer) - src.loc.visible_message("\icon[src] timer set for [timer_set] seconds.") + src.loc.visible_message("[bicon(src)] timer set for [timer_set] seconds.") if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user)) if(defused || active) if(defused) - src.loc.visible_message("\icon[src] Device error: User intervention required.") + src.loc.visible_message("[bicon(src)] Device error: User intervention required.") return else - src.loc.visible_message("\icon[src] [timer_set] seconds until detonation, please clear the area.") + src.loc.visible_message("[bicon(src)] [timer_set] seconds until detonation, please clear the area.") activate() update_icon() add_fingerprint(user) @@ -331,7 +331,7 @@ var/obj/machinery/syndicatebomb/holder = loc if(istype(holder)) attempts++ - holder.loc.visible_message("\icon[holder] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") + holder.loc.visible_message("[bicon(holder)] Alert: Bomb has detonated. Your score is now [defusals] for [attempts]. Resetting wires...") reset() else qdel(src) @@ -341,7 +341,7 @@ if(istype(holder)) attempts++ defusals++ - holder.loc.visible_message("\icon[holder] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...") + holder.loc.visible_message("[bicon(holder)] Alert: Bomb has been defused. Your score is now [defusals] for [attempts]! Resetting wires in 5 seconds...") sleep(50) //Just in case someone is trying to remove the bomb core this gives them a little window to crowbar it out if(istype(holder)) reset() diff --git a/code/game/machinery/telecomms/broadcasting.dm.rej b/code/game/machinery/telecomms/broadcasting.dm.rej new file mode 100644 index 0000000000..af933e1dbc --- /dev/null +++ b/code/game/machinery/telecomms/broadcasting.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/machinery/telecomms/broadcasting.dm b/code/game/machinery/telecomms/broadcasting.dm (rejected hunks) +@@ -316,7 +316,7 @@ + // Create a radio headset for the sole purpose of using its icon + var/obj/item/device/radio/headset/radio = new + +- var/part_b = "
\icon[radio]\[[freq_text]\][part_b_extra] " ++ var/part_b = " [bicon(radio)]\[[freq_text]\][part_b_extra] " + var/part_c = "
" + + if (display_freq==SYND_FREQ) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 7fe1d93bef..9bbf141867 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -140,7 +140,7 @@ /obj/item/mecha_parts/mecha_equipment/proc/occupant_message(message) if(chassis) - chassis.occupant_message("\icon[src] [message]") + chassis.occupant_message("[bicon(src)] [message]") return /obj/item/mecha_parts/mecha_equipment/proc/log_message(message) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 1e6fd57b1d..5ce3b78d4f 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -262,7 +262,7 @@ if(equipment && equipment.len) to_chat(user, "It's equipped with:") for(var/obj/item/mecha_parts/mecha_equipment/ME in equipment) - to_chat(user, "\icon[ME] [ME]") + to_chat(user, "[bicon(ME)] [ME]") //processing internal damage, temperature, air regulation, alert updates, lights power use. /obj/mecha/process() @@ -637,7 +637,7 @@ var/can_control_mech = 0 for(var/obj/item/mecha_parts/mecha_tracking/ai_control/A in trackers) can_control_mech = 1 - to_chat(user, "\icon[src] Status of [name]:\n[A.get_mecha_info()]") + to_chat(user, "[bicon(src)] Status of [name]:\n[A.get_mecha_info()]") break if(!can_control_mech) to_chat(user, "You cannot control exosuits without AI control beacons installed.") @@ -1005,7 +1005,7 @@ /obj/mecha/proc/occupant_message(message as text) if(message) if(occupant && occupant.client) - to_chat(occupant, "\icon[src] [message]") + to_chat(occupant, "[bicon(src)] [message]") return /obj/mecha/proc/log_message(message as text,red=null) diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index 7af12ac577..da17bc4f0c 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -22,7 +22,7 @@ /obj/effect/mine/proc/triggermine(mob/victim) if(triggered) return - visible_message("[victim] sets off \icon[src] [src]!") + visible_message("[victim] sets off [bicon(src)] [src]!") var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(3, 1, src) s.start() diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index c86d0dff85..c60fde8aaa 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -622,7 +622,7 @@ GLOBAL_LIST_EMPTY(PDAs) if (!silent) playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) - audible_message("\icon[src] *[ttone]*", null, 3) + audible_message("[bicon(src)] *[ttone]*", null, 3) //Search for holder of the PDA. var/mob/living/L = null if(loc && isliving(loc)) diff --git a/code/game/objects/items/devices/PDA/PDA.dm.rej b/code/game/objects/items/devices/PDA/PDA.dm.rej new file mode 100644 index 0000000000..0a2c8ce6c6 --- /dev/null +++ b/code/game/objects/items/devices/PDA/PDA.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm (rejected hunks) +@@ -630,7 +630,7 @@ var/global/list/obj/item/device/pda/PDAs = list() + L = get(src, /mob/living/silicon) + + if(L && L.stat != UNCONSCIOUS) +- to_chat(L, "\icon[src] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)") ++ to_chat(L, "[bicon(src)] Message from [source.owner] ([source.ownjob]), \"[msg.message]\"[msg.get_photo_ref()] (Reply)") + + update_icon() + add_overlay(image(icon, icon_alert)) diff --git a/code/game/objects/items/devices/geiger_counter.dm b/code/game/objects/items/devices/geiger_counter.dm index a7afbd0a21..0aa6a55c03 100644 --- a/code/game/objects/items/devices/geiger_counter.dm +++ b/code/game/objects/items/devices/geiger_counter.dm @@ -86,27 +86,27 @@ if(isliving(loc)) var/mob/living/M = loc if(!emagged) - to_chat(M, "\icon[src] RADIATION PULSE DETECTED.") - to_chat(M, "\icon[src] Severity: [amount]") + to_chat(M, "[bicon(src)] RADIATION PULSE DETECTED.") + to_chat(M, "[bicon(src)] Severity: [amount]") else - to_chat(M, "\icon[src] !@%$AT!(N P!LS! D/TEC?ED.") - to_chat(M, "\icon[src] &!F2rity: <=[amount]#1") + to_chat(M, "[bicon(src)] !@%$AT!(N P!LS! D/TEC?ED.") + to_chat(M, "[bicon(src)] &!F2rity: <=[amount]#1") update_icon() /obj/item/device/geiger_counter/attack_self(mob/user) scanning = !scanning update_icon() - to_chat(user, "\icon[src] You switch [scanning ? "on" : "off"] [src].") + to_chat(user, "[bicon(src)] You switch [scanning ? "on" : "off"] [src].") /obj/item/device/geiger_counter/attack(mob/living/M, mob/user) if(user.a_intent == INTENT_HELP) if(!emagged) user.visible_message("[user] scans [M] with [src].", "You scan [M]'s radiation levels with [src]...") if(!M.radiation) - to_chat(user, "\icon[src] Radiation levels within normal boundaries.") + to_chat(user, "[bicon(src)] Radiation levels within normal boundaries.") return 1 else - to_chat(user, "\icon[src] Subject is irradiated. Radiation levels: [M.radiation].") + to_chat(user, "[bicon(src)] Subject is irradiated. Radiation levels: [M.radiation].") return 1 else user.visible_message("[user] scans [M] with [src].", "You project [src]'s stored radiation into [M]'s body!") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 69e00e057e..e789d03b30 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -521,7 +521,7 @@ return list(pick(messages)) /obj/item/toy/talking/proc/toy_talk(mob/user, message) - user.loc.visible_message("\icon[src] [message]") + user.loc.visible_message("[bicon(src)] [message]") if(chattering) chatter(message, phomeme, user) @@ -1077,7 +1077,7 @@ user.visible_message("[user] pulls back the string on [src].") icon_state = "[initial(icon_state)]_used" sleep(5) - audible_message("\icon[src] Hiss!") + audible_message("[bicon(src)] Hiss!") var/list/possible_sounds = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg') var/chosen_sound = pick(possible_sounds) playsound(get_turf(src), chosen_sound, 50, 1) diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index 75fbf3a526..912cbf862a 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -523,7 +523,7 @@ AI MODULES laws[1] = generate_ion_law() to_chat(user, "You press the button on [src].") playsound(user, 'sound/machines/click.ogg', 20, 1) - src.loc.visible_message("\icon[src] [laws[1]]") + src.loc.visible_message("[bicon(src)] [laws[1]]") /******************** Mother Drone ******************/ diff --git a/code/game/objects/items/weapons/cards_ids.dm.rej b/code/game/objects/items/weapons/cards_ids.dm.rej new file mode 100644 index 0000000000..6e4e3faa35 --- /dev/null +++ b/code/game/objects/items/weapons/cards_ids.dm.rej @@ -0,0 +1,10 @@ +diff a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm (rejected hunks) +@@ -86,7 +86,7 @@ + var/dorm = 0 // determines if this ID has claimed a dorm already + + /obj/item/weapon/card/id/attack_self(mob/user) +- user.visible_message("[user] shows you: \icon[src] [src.name].", \ ++ user.visible_message("[user] shows you: [bicon(src)] [src.name].", \ + "You show \the [src.name].") + src.add_fingerprint(user) + return diff --git a/code/game/objects/items/weapons/pneumaticCannon.dm b/code/game/objects/items/weapons/pneumaticCannon.dm index 834714f3a0..3de096680b 100644 --- a/code/game/objects/items/weapons/pneumaticCannon.dm +++ b/code/game/objects/items/weapons/pneumaticCannon.dm @@ -36,9 +36,9 @@ to_chat(user, "You'll need to get closer to see any more.") return for(var/obj/item/I in loadedItems) - to_chat(user, "\icon [I] It has \the [I] loaded.") + to_chat(user, "[bicon(I)] It has \the [I] loaded.") if(tank) - to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") + to_chat(user, "[bicon(tank)] It has \the [tank] mounted onto it.") /obj/item/weapon/pneumatic_cannon/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm index 7b26c58a5d..d3a940090d 100644 --- a/code/game/objects/items/weapons/powerfist.dm +++ b/code/game/objects/items/weapons/powerfist.dm @@ -24,7 +24,7 @@ to_chat(user, "You'll need to get closer to see any more.") return if(tank) - to_chat(user, "\icon [tank] It has \the [tank] mounted onto it.") + to_chat(user, "[bicon(tank)] It has \the [tank] mounted onto it.") /obj/item/weapon/melee/powerfist/attackby(obj/item/weapon/W, mob/user, params) diff --git a/code/modules/admin/verbs/pray.dm.rej b/code/modules/admin/verbs/pray.dm.rej new file mode 100644 index 0000000000..bc98860cfd --- /dev/null +++ b/code/modules/admin/verbs/pray.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm (rejected hunks) +@@ -33,7 +33,7 @@ + prayer_type = "CULTIST PRAYER" + deity = "Nar-Sie" + +- msg = "\icon[cross][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)] [ADMIN_SMITE(src)]: [msg]" ++ msg = "[bicon(cross)][prayer_type][deity ? " (to [deity])" : ""]: [ADMIN_FULLMONTY(src)] [ADMIN_SC(src)] [ADMIN_SMITE(src)]: [msg]" + + for(var/client/C in admins) + if(C.prefs.chat_toggles & CHAT_PRAYER) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index e761b05e92..f54d1f6875 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -61,7 +61,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("[bicon(src)] *beep* *beep*", "*beep* *beep*") sleep(10) if(!src) return diff --git a/code/modules/assembly/health.dm b/code/modules/assembly/health.dm index dddcf3ac48..b454cbacfb 100644 --- a/code/modules/assembly/health.dm +++ b/code/modules/assembly/health.dm @@ -59,7 +59,7 @@ health_scan = M.health if(health_scan <= alarm_health) pulse() - audible_message("\icon[src] *beep* *beep*", "*beep* *beep*") + audible_message("[bicon(src)] *beep* *beep*", "*beep* *beep*") toggle_scan() return return diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index bf85dcc45b..e65468fec6 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -99,7 +99,7 @@ if(!secured || !on || next_activate > world.time) return FALSE pulse(0) - audible_message("\icon[src] *beep* *beep*", null, 3) + audible_message("[bicon(src)] *beep* *beep*", null, 3) next_activate = world.time + 30 /obj/item/device/assembly/infra/interact(mob/user)//TODO: change this this to the wire control panel diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 1856313b36..15ea698c90 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -56,7 +56,7 @@ if(!secured || next_activate > world.time) return 0 pulse(0) - audible_message("\icon[src] *beep* *beep*", null, 3) + audible_message("[bicon(src)] *beep* *beep*", null, 3) next_activate = world.time + 30 diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index cff02284e5..70084eb83e 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -142,7 +142,7 @@ Code: if(!(src.wires & WIRE_RADIO_RECEIVE)) return 0 pulse(1) - audible_message("\icon[src] *beep* *beep*", null, 1) + audible_message("[bicon(src)] *beep* *beep*", null, 1) return diff --git a/code/modules/assembly/timer.dm b/code/modules/assembly/timer.dm index d8c6427477..0ebe7685eb 100644 --- a/code/modules/assembly/timer.dm +++ b/code/modules/assembly/timer.dm @@ -45,7 +45,7 @@ if(!secured || next_activate > world.time) return FALSE pulse(0) - audible_message("\icon[src] *beep* *beep*", null, 3) + audible_message("[bicon(src)] *beep* *beep*", null, 3) if(loop) timing = 1 update_icon() diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index c0f029af08..c125cd1757 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -279,6 +279,21 @@ GLOBAL_LIST_EMPTY(asset_datums) "changelog.css" = 'html/changelog.css' ) +/datum/asset/simple/goonchat + verify = TRUE + assets = list( + "jquery.min.js" = 'code/modules/html_interface/js/jquery.min.js', + "json2.min.js" = 'code/modules/goonchat/browserassets/js/json2.min.js', + "errorHandler.js" = 'code/modules/goonchat/browserassets/js/errorHandler.js', + "browserOutput.js" = 'code/modules/goonchat/browserassets/js/browserOutput.js', + "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', + "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', + "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', + "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', + "font-awesome.css" = 'code/modules/goonchat/browserassets/css/font-awesome.css', + "browserOutput.css" = 'code/modules/goonchat/browserassets/css/browserOutput.css', + ) + //Registers HTML Interface assets. /datum/asset/HTML_interface/register() for(var/path in typesof(/datum/html_interface)) diff --git a/code/modules/client/asset_cache.dm.rej b/code/modules/client/asset_cache.dm.rej new file mode 100644 index 0000000000..d6d6f8c738 --- /dev/null +++ b/code/modules/client/asset_cache.dm.rej @@ -0,0 +1,21 @@ +diff a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm (rejected hunks) +@@ -279,19 +279,6 @@ GLOBAL_LIST_EMPTY(asset_datums) + "changelog.css" = 'html/changelog.css' + ) + +-/datum/asset/simple/chat +- assets = list( +- "jquery.min.js" = 'code/modules/html_interface/js/jquery.min.js', +- "json2.min.js" = 'goon/browserassets/js/json2.min.js', +- "browserOutput.js" = 'goon/browserassets/js/browserOutput.js', +- "fontawesome-webfont.eot" = 'tgui/assets/fonts/fontawesome-webfont.eot', +- "fontawesome-webfont.svg" = 'tgui/assets/fonts/fontawesome-webfont.svg', +- "fontawesome-webfont.ttf" = 'tgui/assets/fonts/fontawesome-webfont.ttf', +- "fontawesome-webfont.woff" = 'tgui/assets/fonts/fontawesome-webfont.woff', +- "font-awesome.css" = 'goon/browserassets/css/font-awesome.css', +- "browserOutput.css" = 'goon/browserassets/css/browserOutput.css' +- ) +- + //Registers HTML Interface assets. + /datum/asset/HTML_interface/register() + for(var/path in typesof(/datum/html_interface)) diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 221043bd8a..c166acd2ce 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -65,4 +65,6 @@ var/connection_timeofday //world.timeofday they connected var/inprefs = FALSE - var/list/topiclimiter + var/list/topiclimiter + + var/datum/chatOutput/chatOutput \ No newline at end of file diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index fc21e9e0d2..2073645e73 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -101,6 +101,12 @@ 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") + src << link(href_list["link"]) ..() //redirect to hsrc.Topic() @@ -150,6 +156,7 @@ GLOBAL_LIST(external_rsc_urls) /client/New(TopicData) var/tdata = TopicData //save this for later use + chatOutput = new /datum/chatOutput(src) TopicData = null //Prevent calls to client.Topic from connect if(connection != "seeker" && connection != "web")//Invalid connection type. diff --git a/code/modules/client/client_procs.dm.rej b/code/modules/client/client_procs.dm.rej new file mode 100644 index 0000000000..78981beb46 --- /dev/null +++ b/code/modules/client/client_procs.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm (rejected hunks) +@@ -196,6 +203,8 @@ var/next_external_rsc = 0 + + . = ..() //calls mob.Login() + ++ chatOutput.start() ++ + connection_time = world.time + connection_realtime = world.realtime + connection_timeofday = world.timeofday diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 97e05ee221..93c5e50da8 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -57,7 +57,7 @@ var/keyname = key if(prefs.unlock_content) if(prefs.toggles & MEMBER_PUBLIC) - keyname = "[keyname]" + keyname = "[bicon(icon('icons/member_content.dmi', "blag"))][keyname]" for(var/client/C in GLOB.clients) if(C.prefs.chat_toggles & CHAT_OOC) diff --git a/code/modules/clothing/spacesuits/flightsuit.dm b/code/modules/clothing/spacesuits/flightsuit.dm index b1c0bb325d..6ed63a3eaf 100644 --- a/code/modules/clothing/spacesuits/flightsuit.dm +++ b/code/modules/clothing/spacesuits/flightsuit.dm @@ -782,13 +782,13 @@ /obj/item/device/flightpack/proc/usermessage(message, urgency = 0) if(urgency == 0) - to_chat(wearer, "\icon[src]|[message]") + to_chat(wearer, "[bicon(src)]|[message]") if(urgency == 1) - to_chat(wearer, "\icon[src]|[message]") + to_chat(wearer, "[bicon(src)]|[message]") if(urgency == 2) - to_chat(wearer, "\icon[src]|[message]") + to_chat(wearer, "[bicon(src)]|[message]") if(urgency == 3) - to_chat(wearer, "\icon[src]|[message]") + to_chat(wearer, "[bicon(src)]|[message]") /obj/item/device/flightpack/attackby(obj/item/I, mob/user, params) if(ishuman(user) && !ishuman(src.loc)) @@ -935,11 +935,11 @@ /obj/item/clothing/suit/space/hardsuit/flightsuit/proc/usermessage(message, urgency = 0) if(!urgency) - to_chat(user, "\icon[src]|[message]") + to_chat(user, "[bicon(src)]|[message]") else if(urgency == 1) - to_chat(user, "\icon[src]|[message]") + to_chat(user, "[bicon(src)]|[message]") else if(urgency == 2) - to_chat(user, "\icon[src]|[message]") + to_chat(user, "[bicon(src)]|[message]") /obj/item/clothing/suit/space/hardsuit/flightsuit/examine(mob/user) ..() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 0c3d20892f..92ee80d2c1 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -48,7 +48,7 @@ /obj/item/clothing/head/helmet/space/hardsuit/proc/display_visor_message(var/msg) var/mob/wearer = loc if(msg && ishuman(wearer)) - wearer.show_message("\icon[src][msg]", 1) + wearer.show_message("[bicon(src)][msg]", 1) /obj/item/clothing/head/helmet/space/hardsuit/rad_act(severity) ..() diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index 3a0281f3f0..5ecadbe09c 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -16,7 +16,7 @@ if(search) emoji = lowertext(copytext(text, pos+1, search)) if(emoji in emojis) - parsed += " " + parsed += bicon(icon('icons/emoji.dmi', emoji)) pos = search + 1 else parsed += copytext(text, pos, search) diff --git a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm index 2f810d70d7..e6807f79cb 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/icecream_vat.dm @@ -98,7 +98,7 @@ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O if(!I.ice_creamed) if(product_types[dispense_flavour] > 0) - src.visible_message("\icon[src] [user] scoops delicious [flavour_name] ice cream into [I].") + src.visible_message("[bicon(src)] [user] scoops delicious [flavour_name] ice cream into [I].") product_types[dispense_flavour] -= 1 I.add_ice_cream(flavour_name) // if(beaker) diff --git a/code/modules/food_and_drinks/pizzabox.dm b/code/modules/food_and_drinks/pizzabox.dm index 7bdd62211b..a7c96d949c 100644 --- a/code/modules/food_and_drinks/pizzabox.dm +++ b/code/modules/food_and_drinks/pizzabox.dm @@ -80,7 +80,7 @@ return open = !open if(open && !bomb_defused) - audible_message("\icon[src] *beep*") + audible_message("[bicon(src)] *beep*") bomb_active = TRUE START_PROCESSING(SSobj, src) update_icon() diff --git a/code/modules/goonchat/browserassets/js/errorHandler.js b/code/modules/goonchat/browserassets/js/errorHandler.js new file mode 100644 index 0000000000..ebe7e32411 --- /dev/null +++ b/code/modules/goonchat/browserassets/js/errorHandler.js @@ -0,0 +1,34 @@ +(function(window, navigator) { + + var escaper = encodeURIComponent || escape; + + var triggerError = function(msg, url, line, col, error) { + window.onerror(msg, url, line, col, error); + }; + + /** + * Directs JS errors to a byond proc for logging + * + * @param string file Name of the logfile to dump errors in, do not prepend with data/ + * @param boolean overrideDefault True to prevent default JS errors (an big honking error prompt thing) + * @return boolean + */ + var attach = function(file, overrideDefault) { + overrideDefault = typeof overrideDefault === 'undefined' ? false : overrideDefault; + file = escaper(file); + + window.onerror = function(msg, url, line, col, error) { + var extra = !col ? '' : ' | column: ' + col; + extra += !error ? '' : ' | error: ' + error; + extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent; + var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra; + window.location = '?action=debugFileOutput&file=' + file + '&message=' + escaper(debugLine); + return overrideDefault; + }; + + return triggerError; + }; + + window.attachErrorHandler = attach; + +}(window, window.navigator)); \ No newline at end of file diff --git a/code/modules/goonchat/jsErrorHandler.dm b/code/modules/goonchat/jsErrorHandler.dm new file mode 100644 index 0000000000..67ea5faca3 --- /dev/null +++ b/code/modules/goonchat/jsErrorHandler.dm @@ -0,0 +1,100 @@ +/** +* This is a generic handler for logging your dumb JS errors generated by html popups +* +* 1. Add your logfile to the validFiles list +* 2. Include the "browserassets/js/errorHandler.js" file in your html file (if using chui, skip this step) (look at browserOutput.html for an example) +* 3. Call attachErrorHandler('yourLogFile'); at the top of your JS (again see browserOutput.js for an example) +*/ + +/datum/debugFileOutput + var/directory = "data/popupErrors" //where to shove all the logfiles + var/ext = "log" //file extension + var/logFileLimit = 52428800 //50mb, so yeah pretty permissive + + //Add your dumb file here. This is so some schmuck can't just shit out a bunch of spam logfiles and use all the diskspace. Relative to src.directory + var/list/validFiles = list( + "chatDebug", + "tooltipDebug", + "chemDispenser", + "banPanel", + "stationNamer" + ) + +/datum/debugFileOutput/proc/error(fileName, message, client/C) + if (!fileName || !message) return 0 + + if (!(fileName in src.validFiles)) + throw EXCEPTION("Debug log file '[fileName].[src.ext]' is not a valid path.") + + var/logFile = file("[src.directory]/[fileName].[src.ext]") + var/fileSize = length(logFile) + if (fileSize >= src.logFileLimit) + CRASH("Debug Error Handling encountered an error! This is highly ironic! File: '[fileName]' has exceeded the filesize limit of: [src.logFileLimit] bytes") + + message = "\[[time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")]\] Client: \[[C && C.key ? C.key : "Unknown Client"]\] triggered: [message]" + logFile << message + return 1 + +/datum/debugFileOutput/proc/clear(fileName) + if (!fileName) return 0 + + if (!fexists("[src.directory]/[fileName].[src.ext]")) + throw EXCEPTION("Debug log file '[fileName].[src.ext]' does not exist.") + + if (!(fileName in src.validFiles)) + throw EXCEPTION("Debug log file '[fileName].[src.ext]' is not a valid path.") + + fdel("[src.directory]/[fileName].[src.ext]") + return 1 + +/datum/debugFileOutput/proc/clearAll() + var/list/deleted = new() + for (var/fileName in src.validFiles) + if (fexists("[src.directory]/[fileName].[src.ext]")) + fdel("[src.directory]/[fileName].[src.ext]") + deleted += fileName + + return deleted + + +GLOBAL_DATUM_INIT(debugFileOutput, /datum/debugFileOutput, new) + +/client/Topic(href, href_list) + ..() + + if (href_list["action"] && href_list["action"] == "debugFileOutput" && href_list["file"] && href_list["message"]) + var/file = href_list["file"] + var/message = href_list["message"] + GLOB.debugFileOutput.error(file, message, src) + +/client/proc/deleteJsLogFile(fileName as text) + set category = "Debug" + set name = "Delete JS Logfile" + set desc = "Delete a logfile for JS error reporting. Be sure you want to do this!" + set popup_menu = 0 + if(!holder) + return + if (!fileName) + return + + GLOB.debugFileOutput.clear(fileName) + + log_admin("[key_name(usr)] deleted the '[fileName]' JS logfile") + message_admins("[key_name_admin(usr)] deleted the '[fileName]' JS logfile") + +/client/proc/deleteAllJsLogFiles() + set category = null + set name = "Delete All JS Logfiles" + set desc = "Delete all logfiles for JS error reporting. Be extra sure you want to do this!" + + if(!holder) + return + + if (alert("Are you really sure you want to delete every single JS logfile?", "No", "Yes") == "No") + return + + var/list/summary = GLOB.debugFileOutput.clearAll() + var/friendlySummary = summary.Join(", ") + + log_admin("[key_name(usr)] deleted every JS logfile! ([friendlySummary])") + message_admins("[key_name_admin(usr)] deleted every JS logfile! ([friendlySummary])") \ No newline at end of file diff --git a/code/modules/mob/living/carbon/examine.dm b/code/modules/mob/living/carbon/examine.dm index 2fe0a7f7bd..ebc349cefc 100644 --- a/code/modules/mob/living/carbon/examine.dm +++ b/code/modules/mob/living/carbon/examine.dm @@ -6,26 +6,26 @@ var/t_has = p_have() var/t_is = p_are() - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" if (handcuffed) - msg += "[t_He] [t_is] \icon[src.handcuffed] handcuffed!\n" + msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n" if (head) - msg += "[t_He] [t_is] wearing \icon[src.head] \a [src.head] on [t_his] head. \n" + msg += "[t_He] [t_is] wearing [bicon(head)] \a [src.head] on [t_his] head. \n" if (wear_mask) - msg += "[t_He] [t_is] wearing \icon[src.wear_mask] \a [src.wear_mask] on [t_his] face.\n" + msg += "[t_He] [t_is] wearing [bicon(wear_mask)] \a [src.wear_mask] on [t_his] face.\n" if (wear_neck) - msg += "[t_He] [t_is] wearing \icon[src.wear_neck] \a [src.wear_neck] around [t_his] neck.\n" + msg += "[t_He] [t_is] wearing [bicon(wear_neck)] \a [src.wear_neck] around [t_his] neck.\n" for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "[t_He] [t_is] holding \icon[I] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "[t_He] [t_is] holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "[t_He] [t_is] holding \icon[I] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "[t_He] [t_is] holding [bicon(I)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" if (back) - msg += "[t_He] [t_has] \icon[src.back] \a [src.back] on [t_his] back.\n" + msg += "[t_He] [t_has] [bicon(back)] \a [src.back] on [t_his] back.\n" var/appears_dead = 0 if (stat == DEAD) appears_dead = 1 diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index a3bb2fefde..d9d2619544 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -19,55 +19,55 @@ if(istype(w_uniform,/obj/item/clothing/under)) var/obj/item/clothing/under/U = w_uniform if(U.hastie) - tie_msg += " with \icon[U.hastie] \a [U.hastie]" + tie_msg += " with [bicon(U.hastie)] \a [U.hastie]" if(w_uniform.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[w_uniform] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg]!\n" + msg += "[t_He] [t_is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg]!\n" else - msg += "[t_He] [t_is] wearing \icon[w_uniform] \a [w_uniform][tie_msg].\n" + msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][tie_msg].\n" //head if(head) if(head.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[head] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n" + msg += "[t_He] [t_is] wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on [t_his] head!\n" else - msg += "[t_He] [t_is] wearing \icon[head] \a [head] on [t_his] head.\n" + msg += "[t_He] [t_is] wearing [bicon(head)] \a [head] on [t_his] head.\n" //suit/armor if(wear_suit) if(wear_suit.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n" + msg += "[t_He] [t_is] wearing [bicon(wear_suit)] [wear_suit.gender==PLURAL?"some":"a"] blood-stained [wear_suit.name]!\n" else - msg += "[t_He] [t_is] wearing \icon[wear_suit] \a [wear_suit].\n" + msg += "[t_He] [t_is] wearing [bicon(wear_suit)] \a [wear_suit].\n" //suit/armor storage if(s_store) if(s_store.blood_DNA) - msg += "[t_He] [t_is] carrying \icon[s_store] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n" + msg += "[t_He] [t_is] carrying [bicon(s_store)] [s_store.gender==PLURAL?"some":"a"] blood-stained [s_store.name] on [t_his] [wear_suit.name]!\n" else - msg += "[t_He] [t_is] carrying \icon[s_store] \a [s_store] on [t_his] [wear_suit.name].\n" + msg += "[t_He] [t_is] carrying [bicon(s_store)] \a [s_store] on [t_his] [wear_suit.name].\n" //back if(back) if(back.blood_DNA) - msg += "[t_He] [t_has] \icon[back] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n" + msg += "[t_He] [t_has] [bicon(back)] [back.gender==PLURAL?"some":"a"] blood-stained [back] on [t_his] back.\n" else - msg += "[t_He] [t_has] \icon[back] \a [back] on [t_his] back.\n" + msg += "[t_He] [t_has] [bicon(back)] \a [back] on [t_his] back.\n" //Hands for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "[t_He] [t_is] holding \icon[I] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "[t_He] [t_is] holding [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in [t_his] [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "[t_He] [t_is] holding \icon[I] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "[t_He] [t_is] holding [bicon(I)] \a [I] in [t_his] [get_held_index_name(get_held_index_of_item(I))].\n" //gloves if(gloves && !(slot_gloves in obscured)) if(gloves.blood_DNA) - msg += "[t_He] [t_has] \icon[gloves] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n" + msg += "[t_He] [t_has] [bicon(gloves)] [gloves.gender==PLURAL?"some":"a"] blood-stained [gloves.name] on [t_his] hands!\n" else - msg += "[t_He] [t_has] \icon[gloves] \a [gloves] on [t_his] hands.\n" + msg += "[t_He] [t_has] [bicon(gloves)] \a [gloves] on [t_his] hands.\n" else if(blood_DNA) var/hand_number = get_num_arms() if(hand_number) @@ -78,48 +78,48 @@ //handcuffed? if(handcuffed) if(istype(handcuffed, /obj/item/weapon/restraints/handcuffs/cable)) - msg += "[t_He] [t_is] \icon[handcuffed] restrained with cable!\n" + msg += "[t_He] [t_is] [bicon(handcuffed)] restrained with cable!\n" else - msg += "[t_He] [t_is] \icon[handcuffed] handcuffed!\n" + msg += "[t_He] [t_is] [bicon(handcuffed)] handcuffed!\n" //belt if(belt) if(belt.blood_DNA) - msg += "[t_He] [t_has] \icon[belt] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n" + msg += "[t_He] [t_has] [bicon(belt)] [belt.gender==PLURAL?"some":"a"] blood-stained [belt.name] about [t_his] waist!\n" else - msg += "[t_He] [t_has] \icon[belt] \a [belt] about [t_his] waist.\n" + msg += "[t_He] [t_has] [bicon(belt)] \a [belt] about [t_his] waist.\n" //shoes if(shoes && !(slot_shoes in obscured)) if(shoes.blood_DNA) - msg += "[t_He] [t_is] wearing \icon[shoes] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n" + msg += "[t_He] [t_is] wearing [bicon(shoes)] [shoes.gender==PLURAL?"some":"a"] blood-stained [shoes.name] on [t_his] feet!\n" else - msg += "[t_He] [t_is] wearing \icon[shoes] \a [shoes] on [t_his] feet.\n" + msg += "[t_He] [t_is] wearing [bicon(shoes)] \a [shoes] on [t_his] feet.\n" //mask if(wear_mask && !(slot_wear_mask in obscured)) if(wear_mask.blood_DNA) - msg += "[t_He] [t_has] \icon[wear_mask] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n" + msg += "[t_He] [t_has] [bicon(wear_mask)] [wear_mask.gender==PLURAL?"some":"a"] blood-stained [wear_mask.name] on [t_his] face!\n" else - msg += "[t_He] [t_has] \icon[wear_mask] \a [wear_mask] on [t_his] face.\n" + msg += "[t_He] [t_has] [bicon(wear_mask)] \a [wear_mask] on [t_his] face.\n" if (wear_neck && !(slot_neck in obscured)) - msg += "[t_He] [t_is] wearing \icon[src.wear_neck] \a [src.wear_neck] around [t_his] neck.\n" + msg += "[t_He] [t_is] wearing [bicon(wear_neck)] \a [src.wear_neck] around [t_his] neck.\n" //eyes if(glasses && !(slot_glasses in obscured)) if(glasses.blood_DNA) - msg += "[t_He] [t_has] \icon[glasses] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n" + msg += "[t_He] [t_has] [bicon(glasses)] [glasses.gender==PLURAL?"some":"a"] blood-stained [glasses] covering [t_his] eyes!\n" else - msg += "[t_He] [t_has] \icon[glasses] \a [glasses] covering [t_his] eyes.\n" + msg += "[t_He] [t_has] [bicon(glasses)] \a [glasses] covering [t_his] eyes.\n" //ears if(ears && !(slot_ears in obscured)) - msg += "[t_He] [t_has] \icon[ears] \a [ears] on [t_his] ears.\n" + msg += "[t_He] [t_has] [bicon(ears)] \a [ears] on [t_his] ears.\n" //ID if(wear_id) - msg += "[t_He] [t_is] wearing \icon[wear_id] \a [wear_id].\n" + msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n" //Jitters switch(jitteriness) @@ -164,7 +164,7 @@ var/obj/item/bodypart/BP = X missing -= BP.body_zone for(var/obj/item/I in BP.embedded_objects) - msg += "[t_He] [t_has] \a \icon[I] [I] embedded in [t_his] [BP.name]!\n" + msg += "[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [BP.name]!\n" //stores missing limbs var/l_limbs_missing = 0 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm.rej b/code/modules/mob/living/carbon/human/human_defense.dm.rej new file mode 100644 index 0000000000..e5c19e638e --- /dev/null +++ b/code/modules/mob/living/carbon/human/human_defense.dm.rej @@ -0,0 +1,14 @@ +diff a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm (rejected hunks) +@@ -681,10 +681,10 @@ + status += "numb" + if(status == "") + status = "OK" +- to_chat(src, "\t [status == "OK" ? "\blue" : "\red"] Your [LB.name] is [status].") ++ to_chat(src, "\t Your [LB.name] is [status].") + + for(var/obj/item/I in LB.embedded_objects) +- to_chat(src, "\t \red There is \a [I] embedded in your [LB.name]!") ++ to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + + for(var/t in missing) + to_chat(src, "Your [parse_zone(t)] is missing!") diff --git a/code/modules/mob/living/silicon/ai/examine.dm.rej b/code/modules/mob/living/silicon/ai/examine.dm.rej new file mode 100644 index 0000000000..57060219e7 --- /dev/null +++ b/code/modules/mob/living/silicon/ai/examine.dm.rej @@ -0,0 +1,8 @@ +diff a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm (rejected hunks) +@@ -1,5 +1,5 @@ + /mob/living/silicon/ai/examine(mob/user) +- var/msg = "*---------*\nThis is \icon[src] [src]!\n" ++ var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" + if (src.stat == DEAD) + msg += "It appears to be powered-down.\n" + else diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 43647c89d6..d9a9ce60c8 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -173,7 +173,7 @@ if(href_list["send"]) sradio.send_signal("ACTIVATE") - audible_message("\icon[src] *beep* *beep*") + audible_message("[bicon(src)] *beep* *beep*") if(href_list["freq"]) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index 7f910dcdbd..b8a23b4021 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,11 +1,11 @@ /mob/living/silicon/robot/examine(mob/user) - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" if(desc) msg += "[desc]\n" var/obj/act_module = get_active_held_item() if(act_module) - msg += "It is holding \icon[act_module] \a [act_module].\n" + msg += "It is holding [bicon(act_module)] \a [act_module].\n" msg += "" if (src.getBruteLoss()) if (src.getBruteLoss() < maxHealth*0.5) diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 5b17ab7d6e..84fe6d6899 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -469,7 +469,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/area/end_area = get_area(waypoint) if(client) //Player bots instead get a location command from the AI - to_chat(src, "Priority waypoint set by \icon[caller] [caller]. Proceed to [end_area.name]<\b>.") + to_chat(src, "Priority waypoint set by [bicon(caller)] [caller]. Proceed to [end_area.name]<\b>.") //For giving the bot temporary all-access. var/obj/item/weapon/card/id/all_access = new /obj/item/weapon/card/id @@ -485,7 +485,7 @@ Pass a positive integer as an argument to override a bot's default speed. turn_on() //Saves the AI the hassle of having to activate a bot manually. access_card = all_access //Give the bot all-access while under the AI's command. if(message) - to_chat(calling_ai, "\icon[src] [name] called to [end_area.name]. [path.len-1] meters to destination.") + to_chat(calling_ai, "[bicon(src)] [name] called to [end_area.name]. [path.len-1] meters to destination.") pathset = 1 mode = BOT_RESPONDING tries = 0 @@ -500,7 +500,7 @@ Pass a positive integer as an argument to override a bot's default speed. var/success = bot_move(ai_waypoint, 3) if(!success) if(calling_ai) - to_chat(calling_ai, "\icon[src] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") + to_chat(calling_ai, "[bicon(src)] [get_turf(src) == ai_waypoint ? "[src] successfully arrived to waypoint." : "[src] failed to reach waypoint."]") calling_ai = null bot_reset() diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index bdf4277438..80162d50fe 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -596,7 +596,7 @@ if(pathset) //The AI called us here, so notify it of our arrival. loaddir = dir //The MULE will attempt to load a crate in whatever direction the MULE is "facing". if(calling_ai) - to_chat(calling_ai, "\icon[src] [src] wirelessly plays a chiming sound!") + to_chat(calling_ai, "[bicon(src)] [src] wirelessly plays a chiming sound!") playsound(calling_ai, 'sound/machines/chime.ogg',40, 0) calling_ai = null radio_channel = "AI Private" //Report on AI Private instead if the AI is controlling us. diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index afcf1d4c33..85f08d19f2 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -50,7 +50,7 @@ /mob/living/simple_animal/hostile/construct/examine(mob/user) var/t_He = p_they(TRUE) var/t_s = p_s() - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" msg += "[desc]\n" if(health < maxHealth) msg += "" diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index d675458485..dc1ae36604 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -170,29 +170,29 @@ /mob/living/simple_animal/drone/examine(mob/user) - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" //Hands for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It has \icon[I] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It has [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It has \icon[I] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It has [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" //Internal storage if(internal_storage && !(internal_storage.flags&ABSTRACT)) if(internal_storage.blood_DNA) - msg += "It is holding \icon[internal_storage] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" + msg += "It is holding [bicon(internal_storage)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" else - msg += "It is holding \icon[internal_storage] \a [internal_storage] in its internal storage.\n" + msg += "It is holding [bicon(internal_storage)] \a [internal_storage] in its internal storage.\n" //Cosmetic hat - provides no function other than looks if(head && !(head.flags&ABSTRACT)) if(head.blood_DNA) - msg += "It is wearing \icon[head] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!\n" + msg += "It is wearing [bicon(head)] [head.gender==PLURAL?"some":"a"] blood-stained [head.name] on its head!\n" else - msg += "It is wearing \icon[head] \a [head] on its head.\n" + msg += "It is wearing [bicon(head)] \a [head] on its head.\n" //Braindead if(!client && stat != DEAD) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 7d45923833..638e176d02 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -57,7 +57,7 @@ if( ishuman(AM) ) if(!stat) var/mob/M = AM - to_chat(M, "\icon[src] Squeek!") + to_chat(M, "[bicon(src)] Squeek!") playsound(src, 'sound/effects/mousesqueek.ogg', 100, 1) ..() diff --git a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm index 84bb6031f4..5fe0ccaade 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/dextrous.dm @@ -26,21 +26,21 @@ /mob/living/simple_animal/hostile/guardian/dextrous/examine(mob/user) if(dextrous) - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" msg += "[desc]\n" for(var/obj/item/I in held_items) if(!(I.flags & ABSTRACT)) if(I.blood_DNA) - msg += "It has \icon[I] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" + msg += "It has [bicon(I)] [I.gender==PLURAL?"some":"a"] blood-stained [I.name] in its [get_held_index_name(get_held_index_of_item(I))]!\n" else - msg += "It has \icon[I] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" + msg += "It has [bicon(I)] \a [I] in its [get_held_index_name(get_held_index_of_item(I))].\n" if(internal_storage && !(internal_storage.flags&ABSTRACT)) if(internal_storage.blood_DNA) - msg += "It is holding \icon[internal_storage] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" + msg += "It is holding [bicon(internal_storage)] [internal_storage.gender==PLURAL?"some":"a"] blood-stained [internal_storage.name] in its internal storage!\n" else - msg += "It is holding \icon[internal_storage] \a [internal_storage] in its internal storage.\n" + msg += "It is holding [bicon(internal_storage)] \a [internal_storage] in its internal storage.\n" msg += "*---------*" to_chat(user, msg) else diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 6c12b6d984..e016be2033 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -347,7 +347,7 @@ /mob/living/simple_animal/slime/examine(mob/user) - var/msg = "*---------*\nThis is \icon[src] \a [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] \a [src]!\n" if (src.stat == DEAD) msg += "It is limp and unresponsive.\n" else diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 55a59bed61..fb67439c7c 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -406,14 +406,14 @@ if(C.mix_sound) playsound(get_turf(cached_my_atom), C.mix_sound, 80, 1) for(var/mob/M in seen) - to_chat(M, "\icon[my_atom] [C.mix_message]") + to_chat(M, "[bicon(my_atom)] [C.mix_message]") if(istype(cached_my_atom, /obj/item/slime_extract)) var/obj/item/slime_extract/ME2 = my_atom ME2.Uses-- if(ME2.Uses <= 0) // give the notification that the slime core is dead for(var/mob/M in seen) - to_chat(M, "\icon[my_atom] \The [my_atom]'s power is consumed in the reaction.") + to_chat(M, "[bicon(my_atom)] \The [my_atom]'s power is consumed in the reaction.") ME2.name = "used slime extract" ME2.desc = "This extract has been used up." diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 72e42b500f..9506c89dbc 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -341,7 +341,7 @@ found = 1 break if(!found) - to_chat(user, "\icon[src]The conveyor switch did not detect any linked conveyor belts in range.") + to_chat(user, "[bicon(src)]The conveyor switch did not detect any linked conveyor belts in range.") return var/obj/machinery/conveyor_switch/NC = new/obj/machinery/conveyor_switch(A, id) transfer_fingerprints_to(NC) diff --git a/code/modules/stock_market/computer.dm b/code/modules/stock_market/computer.dm index 5299debf24..9cef9b3048 100644 --- a/code/modules/stock_market/computer.dm +++ b/code/modules/stock_market/computer.dm @@ -235,7 +235,7 @@ a.updated { if (!amt) return if (!S.buyShares(logged_in, amt)) - to_chat(user, "<Could not complete transaction.") + to_chat(user, "Could not complete transaction.") return var/total = amt * S.current_value diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 21c07750de..63b01483ef 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -110,10 +110,10 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. var/obj/item/weapon/storage/box/B = A if(istype(B) && B.contents.len > 0) for(var/obj/item/I in B) - U.purchase_log += "\icon[I]" + U.purchase_log += "[bicon(I)]" else if(purchase_log_vis) - U.purchase_log += "\icon[A]" + U.purchase_log += "[bicon(A)]" if(limited_stock > 0) limited_stock -= 1 diff --git a/code/modules/uplink/uplink_item.dm.rej b/code/modules/uplink/uplink_item.dm.rej new file mode 100644 index 0000000000..062b4b7814 --- /dev/null +++ b/code/modules/uplink/uplink_item.dm.rej @@ -0,0 +1,10 @@ +diff a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm (rejected hunks) +@@ -1312,7 +1312,7 @@ var/list/uplink_items = list() // Global list so we only initialize this once. + continue + crate_value -= I.cost + new I.item(C) +- U.purchase_log += "\icon[I.item]" ++ U.purchase_log += "[bicon(I.item)]" + + return C + diff --git a/code/world.dm.rej b/code/world.dm.rej new file mode 100644 index 0000000000..56a1ec077d --- /dev/null +++ b/code/world.dm.rej @@ -0,0 +1,10 @@ +diff a/code/world.dm b/code/world.dm (rejected hunks) +@@ -198,7 +198,7 @@ + #define CHAT_PULLR 64 //defined in preferences.dm, but not available here at compilation time + for(var/client/C in GLOB.clients) + if(C.prefs && (C.prefs.chat_toggles & CHAT_PULLR)) +- C << "PR: [announcement]" ++ to_chat(C, "PR: [announcement]") + #undef CHAT_PULLR + + #define WORLD_REBOOT(X) log_world("World rebooted at [time_stamp()]"); ..(X); return; diff --git a/goon/browserassets/css/browserOutput.css b/goon/browserassets/css/browserOutput.css new file mode 100644 index 0000000000..820537e32b --- /dev/null +++ b/goon/browserassets/css/browserOutput.css @@ -0,0 +1,362 @@ +/***************************************** +* +* GLOBAL STYLES +* +******************************************/ +html, body { + padding: 0; + margin: 0; + height: 100%; + color: #000000; +} +body { + background: #fff; + font-family: Verdana, sans-serif; + font-size: 9pt; + line-height: 1.4; + 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; +} +img.icon { + width: 16px; + height: 16px; +} + +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: 14px; + 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: 40px; + 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; +} +#options { + position: fixed; + top: 0; + right: 0; +} +#options a { + background: #ddd; + height: 30px; + padding: 5px 0; + display: block; + color: #333; + text-decoration: none; + line-height: 28px; + border-top: 1px solid #b4b4b4; +} +#options a:hover {background: #ccc;} +#options .toggle { + width: 40px; + background: #ccc; + border-top: 0; + float: right; + text-align: center; +} +#options .sub {clear: both; display: none; width: 160px;} +#options .sub.scroll {overflow-y: scroll;} +#options .sub a {padding: 3px 0 3px 8px; line-height: 30px; font-size: 0.9em; clear: both;} +#options .sub span { + display: block; + line-height: 30px; + float: left; +} +#options .sub i { + display: block; + padding: 0 5px; + font-size: 1.1em; + width: 22px; + text-align: center; + line-height: 30px; + float: right; +} +#options .decreaseFont {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;} + +.adminobserverooc {color: #0099cc; font-weight: bold;} +.adminooc {color: #b82e00; font-weight: bold;} +.adminobserver {color: #996600; font-weight: bold;} +.admin {color: #386aff; font-weight: bold;} +/* SAY CLASSES */ +.say {} +.deadsay {color: #5c00e6;} +.siliconsay {font-family: 'Courier New', Courier, monospace;} +/* RADIO CLASSES */ +.radio {color: #008000;} + +.syndradio {color: #6d3f40;} +.centradio {color: #686868;} + +.aiprivradio {color: #ff00ff;} +.comradio {color: #948f02;} + +.secradio {color: #a30000;} +.engradio {color: #fb5613;} +.medradio {color: #337296;} +.sciradio {color: #993399;} +.supradio {color: #a8732b;} +.servadio {color: #6eaa2c;} + +.attack {color: #ff0000;} +.disarm {color: #990000;} +.passive {color: #660000;} + +.selecteddna {color: #ffffff; background-color: #001B1B} +.alert {color: #ff0000;} +.userdanger {color: #ff0000; font-weight: bold; font-size: 3;} +.danger {color: #ff0000;} +.warning {color: #ff0000; font-style: italic;} +.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;} +.boldnotice {color: #000099; font-weight: bold;} +.adminnotice {color: #0000ff;} +.unconscious {color: #0000ff; font-weight: bold;} +.suicide {color: #ff5050; font-style: italic;} +.green {color: #03ff39;} +.shadowling {color: #3b2769;} +.cult {color: #960000;} +.cultitalic {color: #960000; font-style: italic;} +.cultlarge {color: #960000; font-weight: bold; font-size: 3;} +.narsie {color: #960000; font-weight: bold; font-size: 125px;} +.narsiesmall {color: #960000; font-weight: bold; font-size: 6;} +.colossus {color: #7F282A; font-size: 5;} +.hierophant {color: #660099; font-weight: bold; font-style: italic;} +.hierophant_warning {color: #660099; font-style: italic;} +.purple {color: #5e2d79;} +.holoparasite {color: #35333a;} +.holoparasitebold {color: #35333a; font-weight: bold;} + +.revennotice {color: #1d2953;} +.revenboldnotice {color: #1d2953; font-weight: bold;} +.revenbignotice {color: #1d2953; font-weight: bold; font-size: 3;} +.revenminor {color: #823abb} +.revenwarning {color: #760fbb; font-style: italic;} +.revendanger {color: #760fbb; font-weight: bold; font-size: 3;} +.umbra {color: #5000A0;} +.umbra_bold {color: #5000A0; font-weight: bold;} +.umbra_italics {color: #5000A0; font-style: italic;} +.umbra_emphasis {color: #5000A0; font-weight: bold; font-style: italic;} +.umbra_large {color: #5000A0; font-size: 3;} + +.brass {color: #BE8700;} +.heavy_brass {color: #BE8700; font-weight: bold; font-style: italic;} +.large_brass {color: #BE8700; font-size: 3;} +.big_brass {color: #BE8700; font-size: 3; font-weight: bold; font-style: italic;} +.ratvar {color: #BE8700; font-size: 6; font-weight: bold; font-style: italic;} +.alloy {color: #42474D;} +.heavy_alloy {color: #42474D; font-weight: bold; font-style: italic;} +.large_alloy {color: #42474D; font-size: 3;} +.nezbere_large {color: #42474D; font-size: 3; font-weight: bold; font-style: italic;} +.nezbere {color: #42474D; font-weight: bold; font-style: italic;} +.nezbere_small {color: #42474D;} +.sevtug_large {color: #AF0AAF; font-size: 3; font-weight: bold; font-style: italic;} +.sevtug {color: #AF0AAF; font-weight: bold; font-style: italic;} +.sevtug_small {color: #AF0AAF;} +.inathneq_large {color: #1E8CE1; font-size: 3; font-weight: bold; font-style: italic;} +.inathneq {color: #1E8CE1; font-weight: bold; font-style: italic;} +.inathneq_small {color: #1E8CE1;} +.nzcrentr_large {color: #DAAA18; font-size: 3; font-weight: bold; font-style: italic;} +.nzcrentr {color: #DAAA18; font-weight: bold; font-style: italic;} +.nzcrentr_small {color: #DAAA18;} +.neovgre_large {color: #6E001A; font-size: 3; font-weight: bold; font-style: italic;} +.neovgre {color: #6E001A; font-weight: bold; font-style: italic;} +.neovgre_small {color: #6E001A;} + +.newscaster {color: #800000;} +.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;} + +.alien {color: #543354;} +.noticealien {color: #00c000;} +.alertalien {color: #00c000; font-weight: bold;} +.borer {color: #543354; font-style: italic;} +.changeling {color: #800080; font-style: italic;} + +.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: 3;} +.big {font-size: 3;} +.reallybig {font-size: 4;} +.greentext {color: #00FF00; font-size: 3;} +.redtext {color: #FF0000; font-size: 3;} +.clown {color: #FF69Bf; font-size: 3; font-family: "Comic Sans MS", cursive, sans-serif; font-weight: bold;} + +big img.icon {width: 32px; height: 32px;} + +.memo {color: #638500; text-align: center;} +.memoedit {text-align: center; font-size: 2;} +.abductor {color: #800080; font-style: italic;} + +.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;} \ No newline at end of file diff --git a/goon/browserassets/css/font-awesome.css b/goon/browserassets/css/font-awesome.css new file mode 100644 index 0000000000..cc99d7b337 --- /dev/null +++ b/goon/browserassets/css/font-awesome.css @@ -0,0 +1,788 @@ +@font-face{font-family:'FontAwesome';src:url('fontawesome-webfont.eot');src:url('fontawesome-webfont.eot') format('embedded-opentype'),url('fontawesome-webfont.woff') format('woff'),url('fontawesome-webfont.ttf') format('truetype'),url('fontawesome-webfont.svg') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;} +[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;} +.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;} +a [class^="icon-"],a [class*=" icon-"]{display:inline;} +[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;} +.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;} +.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;} +[class^="icon-"].hide,[class*=" icon-"].hide{display:none;} +.icon-muted{color:#eeeeee;} +.icon-light{color:#ffffff;} +.icon-dark{color:#333333;} +.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;} +.pull-right{float:right;} +.pull-left{float:left;} +[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;} +[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;} +[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;} +.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;} +.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;} +.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;} +.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;} +.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;} +.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;} +.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;} +.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;} +.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;} +.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;} +.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;} +.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;} +.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;} +.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;} +a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;} +@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);} +.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);} +.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);} +.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);} +.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);} +a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;} +.icon-glass:before{content:"\f000";} +.icon-music:before{content:"\f001";} +.icon-search:before{content:"\f002";} +.icon-envelope-alt:before{content:"\f003";} +.icon-heart:before{content:"\f004";} +.icon-star:before{content:"\f005";} +.icon-star-empty:before{content:"\f006";} +.icon-user:before{content:"\f007";} +.icon-film:before{content:"\f008";} +.icon-th-large:before{content:"\f009";} +.icon-th:before{content:"\f00a";} +.icon-th-list:before{content:"\f00b";} +.icon-ok:before{content:"\f00c";} +.icon-remove:before{content:"\f00d";} +.icon-zoom-in:before{content:"\f00e";} +.icon-zoom-out:before{content:"\f010";} +.icon-power-off:before,.icon-off:before{content:"\f011";} +.icon-signal:before{content:"\f012";} +.icon-gear:before,.icon-cog:before{content:"\f013";} +.icon-trash:before{content:"\f014";} +.icon-home:before{content:"\f015";} +.icon-file-alt:before{content:"\f016";} +.icon-time:before{content:"\f017";} +.icon-road:before{content:"\f018";} +.icon-download-alt:before{content:"\f019";} +.icon-download:before{content:"\f01a";} +.icon-upload:before{content:"\f01b";} +.icon-inbox:before{content:"\f01c";} +.icon-play-circle:before{content:"\f01d";} +.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";} +.icon-refresh:before{content:"\f021";} +.icon-list-alt:before{content:"\f022";} +.icon-lock:before{content:"\f023";} +.icon-flag:before{content:"\f024";} +.icon-headphones:before{content:"\f025";} +.icon-volume-off:before{content:"\f026";} +.icon-volume-down:before{content:"\f027";} +.icon-volume-up:before{content:"\f028";} +.icon-qrcode:before{content:"\f029";} +.icon-barcode:before{content:"\f02a";} +.icon-tag:before{content:"\f02b";} +.icon-tags:before{content:"\f02c";} +.icon-book:before{content:"\f02d";} +.icon-bookmark:before{content:"\f02e";} +.icon-print:before{content:"\f02f";} +.icon-camera:before{content:"\f030";} +.icon-font:before{content:"\f031";} +.icon-bold:before{content:"\f032";} +.icon-italic:before{content:"\f033";} +.icon-text-height:before{content:"\f034";} +.icon-text-width:before{content:"\f035";} +.icon-align-left:before{content:"\f036";} +.icon-align-center:before{content:"\f037";} +.icon-align-right:before{content:"\f038";} +.icon-align-justify:before{content:"\f039";} +.icon-list:before{content:"\f03a";} +.icon-indent-left:before{content:"\f03b";} +.icon-indent-right:before{content:"\f03c";} +.icon-facetime-video:before{content:"\f03d";} +.icon-picture:before{content:"\f03e";} +.icon-pencil:before{content:"\f040";} +.icon-map-marker:before{content:"\f041";} +.icon-adjust:before{content:"\f042";} +.icon-tint:before{content:"\f043";} +.icon-edit:before{content:"\f044";} +.icon-share:before{content:"\f045";} +.icon-check:before{content:"\f046";} +.icon-move:before{content:"\f047";} +.icon-step-backward:before{content:"\f048";} +.icon-fast-backward:before{content:"\f049";} +.icon-backward:before{content:"\f04a";} +.icon-play:before{content:"\f04b";} +.icon-pause:before{content:"\f04c";} +.icon-stop:before{content:"\f04d";} +.icon-forward:before{content:"\f04e";} +.icon-fast-forward:before{content:"\f050";} +.icon-step-forward:before{content:"\f051";} +.icon-eject:before{content:"\f052";} +.icon-chevron-left:before{content:"\f053";} +.icon-chevron-right:before{content:"\f054";} +.icon-plus-sign:before{content:"\f055";} +.icon-minus-sign:before{content:"\f056";} +.icon-remove-sign:before{content:"\f057";} +.icon-ok-sign:before{content:"\f058";} +.icon-question-sign:before{content:"\f059";} +.icon-info-sign:before{content:"\f05a";} +.icon-screenshot:before{content:"\f05b";} +.icon-remove-circle:before{content:"\f05c";} +.icon-ok-circle:before{content:"\f05d";} +.icon-ban-circle:before{content:"\f05e";} +.icon-arrow-left:before{content:"\f060";} +.icon-arrow-right:before{content:"\f061";} +.icon-arrow-up:before{content:"\f062";} +.icon-arrow-down:before{content:"\f063";} +.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";} +.icon-resize-full:before{content:"\f065";} +.icon-resize-small:before{content:"\f066";} +.icon-plus:before{content:"\f067";} +.icon-minus:before{content:"\f068";} +.icon-asterisk:before{content:"\f069";} +.icon-exclamation-sign:before{content:"\f06a";} +.icon-gift:before{content:"\f06b";} +.icon-leaf:before{content:"\f06c";} +.icon-fire:before{content:"\f06d";} +.icon-eye-open:before{content:"\f06e";} +.icon-eye-close:before{content:"\f070";} +.icon-warning-sign:before{content:"\f071";} +.icon-plane:before{content:"\f072";} +.icon-calendar:before{content:"\f073";} +.icon-random:before{content:"\f074";} +.icon-comment:before{content:"\f075";} +.icon-magnet:before{content:"\f076";} +.icon-chevron-up:before{content:"\f077";} +.icon-chevron-down:before{content:"\f078";} +.icon-retweet:before{content:"\f079";} +.icon-shopping-cart:before{content:"\f07a";} +.icon-folder-close:before{content:"\f07b";} +.icon-folder-open:before{content:"\f07c";} +.icon-resize-vertical:before{content:"\f07d";} +.icon-resize-horizontal:before{content:"\f07e";} +.icon-bar-chart:before{content:"\f080";} +.icon-twitter-sign:before{content:"\f081";} +.icon-facebook-sign:before{content:"\f082";} +.icon-camera-retro:before{content:"\f083";} +.icon-key:before{content:"\f084";} +.icon-gears:before,.icon-cogs:before{content:"\f085";} +.icon-comments:before{content:"\f086";} +.icon-thumbs-up-alt:before{content:"\f087";} +.icon-thumbs-down-alt:before{content:"\f088";} +.icon-star-half:before{content:"\f089";} +.icon-heart-empty:before{content:"\f08a";} +.icon-signout:before{content:"\f08b";} +.icon-linkedin-sign:before{content:"\f08c";} +.icon-pushpin:before{content:"\f08d";} +.icon-external-link:before{content:"\f08e";} +.icon-signin:before{content:"\f090";} +.icon-trophy:before{content:"\f091";} +.icon-github-sign:before{content:"\f092";} +.icon-upload-alt:before{content:"\f093";} +.icon-lemon:before{content:"\f094";} +.icon-phone:before{content:"\f095";} +.icon-unchecked:before,.icon-check-empty:before{content:"\f096";} +.icon-bookmark-empty:before{content:"\f097";} +.icon-phone-sign:before{content:"\f098";} +.icon-twitter:before{content:"\f099";} +.icon-facebook:before{content:"\f09a";} +.icon-github:before{content:"\f09b";} +.icon-unlock:before{content:"\f09c";} +.icon-credit-card:before{content:"\f09d";} +.icon-rss:before{content:"\f09e";} +.icon-hdd:before{content:"\f0a0";} +.icon-bullhorn:before{content:"\f0a1";} +.icon-bell:before{content:"\f0a2";} +.icon-certificate:before{content:"\f0a3";} +.icon-hand-right:before{content:"\f0a4";} +.icon-hand-left:before{content:"\f0a5";} +.icon-hand-up:before{content:"\f0a6";} +.icon-hand-down:before{content:"\f0a7";} +.icon-circle-arrow-left:before{content:"\f0a8";} +.icon-circle-arrow-right:before{content:"\f0a9";} +.icon-circle-arrow-up:before{content:"\f0aa";} +.icon-circle-arrow-down:before{content:"\f0ab";} +.icon-globe:before{content:"\f0ac";} +.icon-wrench:before{content:"\f0ad";} +.icon-tasks:before{content:"\f0ae";} +.icon-filter:before{content:"\f0b0";} +.icon-briefcase:before{content:"\f0b1";} +.icon-fullscreen:before{content:"\f0b2";} +.icon-group:before{content:"\f0c0";} +.icon-link:before{content:"\f0c1";} +.icon-cloud:before{content:"\f0c2";} +.icon-beaker:before{content:"\f0c3";} +.icon-cut:before{content:"\f0c4";} +.icon-copy:before{content:"\f0c5";} +.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";} +.icon-save:before{content:"\f0c7";} +.icon-sign-blank:before{content:"\f0c8";} +.icon-reorder:before{content:"\f0c9";} +.icon-list-ul:before{content:"\f0ca";} +.icon-list-ol:before{content:"\f0cb";} +.icon-strikethrough:before{content:"\f0cc";} +.icon-underline:before{content:"\f0cd";} +.icon-table:before{content:"\f0ce";} +.icon-magic:before{content:"\f0d0";} +.icon-truck:before{content:"\f0d1";} +.icon-pinterest:before{content:"\f0d2";} +.icon-pinterest-sign:before{content:"\f0d3";} +.icon-google-plus-sign:before{content:"\f0d4";} +.icon-google-plus:before{content:"\f0d5";} +.icon-money:before{content:"\f0d6";} +.icon-caret-down:before{content:"\f0d7";} +.icon-caret-up:before{content:"\f0d8";} +.icon-caret-left:before{content:"\f0d9";} +.icon-caret-right:before{content:"\f0da";} +.icon-columns:before{content:"\f0db";} +.icon-sort:before{content:"\f0dc";} +.icon-sort-down:before{content:"\f0dd";} +.icon-sort-up:before{content:"\f0de";} +.icon-envelope:before{content:"\f0e0";} +.icon-linkedin:before{content:"\f0e1";} +.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";} +.icon-legal:before{content:"\f0e3";} +.icon-dashboard:before{content:"\f0e4";} +.icon-comment-alt:before{content:"\f0e5";} +.icon-comments-alt:before{content:"\f0e6";} +.icon-bolt:before{content:"\f0e7";} +.icon-sitemap:before{content:"\f0e8";} +.icon-umbrella:before{content:"\f0e9";} +.icon-paste:before{content:"\f0ea";} +.icon-lightbulb:before{content:"\f0eb";} +.icon-exchange:before{content:"\f0ec";} +.icon-cloud-download:before{content:"\f0ed";} +.icon-cloud-upload:before{content:"\f0ee";} +.icon-user-md:before{content:"\f0f0";} +.icon-stethoscope:before{content:"\f0f1";} +.icon-suitcase:before{content:"\f0f2";} +.icon-bell-alt:before{content:"\f0f3";} +.icon-coffee:before{content:"\f0f4";} +.icon-food:before{content:"\f0f5";} +.icon-file-text-alt:before{content:"\f0f6";} +.icon-building:before{content:"\f0f7";} +.icon-hospital:before{content:"\f0f8";} +.icon-ambulance:before{content:"\f0f9";} +.icon-medkit:before{content:"\f0fa";} +.icon-fighter-jet:before{content:"\f0fb";} +.icon-beer:before{content:"\f0fc";} +.icon-h-sign:before{content:"\f0fd";} +.icon-plus-sign-alt:before{content:"\f0fe";} +.icon-double-angle-left:before{content:"\f100";} +.icon-double-angle-right:before{content:"\f101";} +.icon-double-angle-up:before{content:"\f102";} +.icon-double-angle-down:before{content:"\f103";} +.icon-angle-left:before{content:"\f104";} +.icon-angle-right:before{content:"\f105";} +.icon-angle-up:before{content:"\f106";} +.icon-angle-down:before{content:"\f107";} +.icon-desktop:before{content:"\f108";} +.icon-laptop:before{content:"\f109";} +.icon-tablet:before{content:"\f10a";} +.icon-mobile-phone:before{content:"\f10b";} +.icon-circle-blank:before{content:"\f10c";} +.icon-quote-left:before{content:"\f10d";} +.icon-quote-right:before{content:"\f10e";} +.icon-spinner:before{content:"\f110";} +.icon-circle:before{content:"\f111";} +.icon-mail-reply:before,.icon-reply:before{content:"\f112";} +.icon-github-alt:before{content:"\f113";} +.icon-folder-close-alt:before{content:"\f114";} +.icon-folder-open-alt:before{content:"\f115";} +.icon-expand-alt:before{content:"\f116";} +.icon-collapse-alt:before{content:"\f117";} +.icon-smile:before{content:"\f118";} +.icon-frown:before{content:"\f119";} +.icon-meh:before{content:"\f11a";} +.icon-gamepad:before{content:"\f11b";} +.icon-keyboard:before{content:"\f11c";} +.icon-flag-alt:before{content:"\f11d";} +.icon-flag-checkered:before{content:"\f11e";} +.icon-terminal:before{content:"\f120";} +.icon-code:before{content:"\f121";} +.icon-reply-all:before{content:"\f122";} +.icon-mail-reply-all:before{content:"\f122";} +.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";} +.icon-location-arrow:before{content:"\f124";} +.icon-crop:before{content:"\f125";} +.icon-code-fork:before{content:"\f126";} +.icon-unlink:before{content:"\f127";} +.icon-question:before{content:"\f128";} +.icon-info:before{content:"\f129";} +.icon-exclamation:before{content:"\f12a";} +.icon-superscript:before{content:"\f12b";} +.icon-subscript:before{content:"\f12c";} +.icon-eraser:before{content:"\f12d";} +.icon-puzzle-piece:before{content:"\f12e";} +.icon-microphone:before{content:"\f130";} +.icon-microphone-off:before{content:"\f131";} +.icon-shield:before{content:"\f132";} +.icon-calendar-empty:before{content:"\f133";} +.icon-fire-extinguisher:before{content:"\f134";} +.icon-rocket:before{content:"\f135";} +.icon-maxcdn:before{content:"\f136";} +.icon-chevron-sign-left:before{content:"\f137";} +.icon-chevron-sign-right:before{content:"\f138";} +.icon-chevron-sign-up:before{content:"\f139";} +.icon-chevron-sign-down:before{content:"\f13a";} +.icon-html5:before{content:"\f13b";} +.icon-css3:before{content:"\f13c";} +.icon-anchor:before{content:"\f13d";} +.icon-unlock-alt:before{content:"\f13e";} +.icon-bullseye:before{content:"\f140";} +.icon-ellipsis-horizontal:before{content:"\f141";} +.icon-ellipsis-vertical:before{content:"\f142";} +.icon-rss-sign:before{content:"\f143";} +.icon-play-sign:before{content:"\f144";} +.icon-ticket:before{content:"\f145";} +.icon-minus-sign-alt:before{content:"\f146";} +.icon-check-minus:before{content:"\f147";} +.icon-level-up:before{content:"\f148";} +.icon-level-down:before{content:"\f149";} +.icon-check-sign:before{content:"\f14a";} +.icon-edit-sign:before{content:"\f14b";} +.icon-external-link-sign:before{content:"\f14c";} +.icon-share-sign:before{content:"\f14d";} +.icon-compass:before{content:"\f14e";} +.icon-collapse:before{content:"\f150";} +.icon-collapse-top:before{content:"\f151";} +.icon-expand:before{content:"\f152";} +.icon-euro:before,.icon-eur:before{content:"\f153";} +.icon-gbp:before{content:"\f154";} +.icon-dollar:before,.icon-usd:before{content:"\f155";} +.icon-rupee:before,.icon-inr:before{content:"\f156";} +.icon-yen:before,.icon-jpy:before{content:"\f157";} +.icon-renminbi:before,.icon-cny:before{content:"\f158";} +.icon-won:before,.icon-krw:before{content:"\f159";} +.icon-bitcoin:before,.icon-btc:before{content:"\f15a";} +.icon-file:before{content:"\f15b";} +.icon-file-text:before{content:"\f15c";} +.icon-sort-by-alphabet:before{content:"\f15d";} +.icon-sort-by-alphabet-alt:before{content:"\f15e";} +.icon-sort-by-attributes:before{content:"\f160";} +.icon-sort-by-attributes-alt:before{content:"\f161";} +.icon-sort-by-order:before{content:"\f162";} +.icon-sort-by-order-alt:before{content:"\f163";} +.icon-thumbs-up:before{content:"\f164";} +.icon-thumbs-down:before{content:"\f165";} +.icon-youtube-sign:before{content:"\f166";} +.icon-youtube:before{content:"\f167";} +.icon-xing:before{content:"\f168";} +.icon-xing-sign:before{content:"\f169";} +.icon-youtube-play:before{content:"\f16a";} +.icon-dropbox:before{content:"\f16b";} +.icon-stackexchange:before{content:"\f16c";} +.icon-instagram:before{content:"\f16d";} +.icon-flickr:before{content:"\f16e";} +.icon-adn:before{content:"\f170";} +.icon-bitbucket:before{content:"\f171";} +.icon-bitbucket-sign:before{content:"\f172";} +.icon-tumblr:before{content:"\f173";} +.icon-tumblr-sign:before{content:"\f174";} +.icon-long-arrow-down:before{content:"\f175";} +.icon-long-arrow-up:before{content:"\f176";} +.icon-long-arrow-left:before{content:"\f177";} +.icon-long-arrow-right:before{content:"\f178";} +.icon-apple:before{content:"\f179";} +.icon-windows:before{content:"\f17a";} +.icon-android:before{content:"\f17b";} +.icon-linux:before{content:"\f17c";} +.icon-dribbble:before{content:"\f17d";} +.icon-skype:before{content:"\f17e";} +.icon-foursquare:before{content:"\f180";} +.icon-trello:before{content:"\f181";} +.icon-female:before{content:"\f182";} +.icon-male:before{content:"\f183";} +.icon-gittip:before{content:"\f184";} +.icon-sun:before{content:"\f185";} +.icon-moon:before{content:"\f186";} +.icon-archive:before{content:"\f187";} +.icon-bug:before{content:"\f188";} +.icon-vk:before{content:"\f189";} +.icon-weibo:before{content:"\f18a";} +.icon-renren:before{content:"\f18b";} + +.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;} +.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;} +.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;} +.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;} +.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;} +a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;} +.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} +.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '');} \ No newline at end of file diff --git a/goon/browserassets/html/browserOutput.html b/goon/browserassets/html/browserOutput.html new file mode 100644 index 0000000000..74212fd815 --- /dev/null +++ b/goon/browserassets/html/browserOutput.html @@ -0,0 +1,44 @@ + + + + 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. +
+
+
+ +
+ + + + \ No newline at end of file diff --git a/goon/browserassets/js/browserOutput.js b/goon/browserassets/js/browserOutput.js new file mode 100644 index 0000000000..0fb7386dd8 --- /dev/null +++ b/goon/browserassets/js/browserOutput.js @@ -0,0 +1,908 @@ +/***************************************** +* +* FUNCTION AND VAR DECLARATIONS +* +******************************************/ + +//DEBUG STUFF +var escaper = encodeURIComponent || escape; +var decoder = decodeURIComponent || unescape; +window.onerror = function(msg, url, line, col, error) { + if (document.location.href.indexOf("proc=debug") <= 0) { + var extra = !col ? '' : ' | column: ' + col; + extra += !error ? '' : ' | error: ' + error; + extra += !navigator.userAgent ? '' : ' | user agent: ' + navigator.userAgent; + var debugLine = 'Error: ' + msg + ' | url: ' + url + ' | line: ' + line + extra; + window.location = '?_src_=chat&proc=debug¶m[error]='+escaper(debugLine); + } + return true; +}; + +//Globals +window.status = 'Output'; +var $messages, $subOptions, $contextMenu, $filterMessages; +var opts = { + //General + 'messageCount': 0, //A count...of messages... + 'messageLimit': 2053, //A limit...for the messages... + 'scrollSnapTolerance': 5, //If within x pixels of bottom + 'clickTolerance': 10, //Keep focus if outside x pixels of mousedown position on mouseup + 'popups': 0, //Amount of popups opened ever + 'wasd': false, //Is the user in wasd mode? + 'chatMode': 'default', //The mode the chat is in + 'priorChatHeight': 0, //Thing for height-resizing detection + 'restarting': false, //Is the round restarting? + + //Options menu + 'subOptionsLoop': null, //Contains the interval loop for closing the options menu + 'suppressOptionsClose': false, //Whether or not we should be hiding the suboptions menu + 'highlightTerms': [], + 'highlightLimit': 5, + 'highlightColor': '#FFFF00', //The color of the highlighted message + 'pingDisabled': false, //Has the user disabled the ping counter + + //Ping display + 'lastPang': 0, //Timestamp of the last response from the server. + 'pangLimit': 35000, + 'pingTime': 0, //Timestamp of when ping sent + 'pongTime': 0, //Timestamp of when ping received + 'noResponse': false, //Tracks the state of the previous ping request + 'noResponseCount': 0, //How many failed pings? + + //Clicks + 'mouseDownX': null, + 'mouseDownY': null, + 'preventFocus': false, //Prevents switching focus to the game window + + //Client Connection Data + 'clientDataLimit': 5, + 'clientData': [], + +}; + +function outerHTML(el) { + var wrap = document.createElement('div'); + wrap.appendChild(el.cloneNode(true)); + return wrap.innerHTML; +} + +//Polyfill for fucking date now because of course IE8 and below don't support it +if (!Date.now) { + Date.now = function now() { + return new Date().getTime(); + }; +} +//Polyfill for trim() (IE8 and below) +if (typeof String.prototype.trim !== 'function') { + String.prototype.trim = function () { + return this.replace(/^\s+|\s+$/g, ''); + }; +} + +//Shit fucking piece of crap that doesn't work god fuckin damn it +function linkify(text) { + var rex = /((?:'+$0+''; + } + else { + return $1 ? $0: ''+$0+''; + } + }); +} + +//Actually turns the highlight term match into appropriate html +function addHighlightMarkup(match) { + var extra = ''; + if (opts.highlightColor) { + extra += ' style="background-color: '+opts.highlightColor+'"'; + } + return ''+match+''; +} + +//Highlights words based on user settings +function highlightTerms(el) { + if (el.children.length > 0) { + for(var h = 0; h < el.children.length; h++){ + highlightTerms(el.children[h]); + } + } + + var hasTextNode = false; + for (var node = 0; node < el.childNodes.length; node++) + { + if (el.childNodes[node].nodeType === 3) + { + hasTextNode = true; + break; + } + } + + if (hasTextNode) { //If element actually has text + var newText = ''; + for (var c = 0; c < el.childNodes.length; c++) { //Each child element + if (el.childNodes[c].nodeType === 3) { //Is it text only? + var words = el.childNodes[c].data.split(' '); + for (var w = 0; w < words.length; w++) { //Each word in the text + var newWord = null; + for (var i = 0; i < opts.highlightTerms.length; i++) { //Each highlight term + if (opts.highlightTerms[i] && words[w].toLowerCase().indexOf(opts.highlightTerms[i].toLowerCase()) > -1) { //If a match is found + newWord = words[w].replace("<", "<").replace(new RegExp(opts.highlightTerms[i], 'gi'), addHighlightMarkup); + break; + } + console.log(newWord) + } + newText += newWord || words[w].replace("<", "<"); + newText += w >= words.length ? '' : ' '; + } + } else { //Every other type of element + newText += outerHTML(el.childNodes[c]); + } + } + el.innerHTML = newText; + } +} +//Send a message to the client +function output(message, flag) { + if (typeof message === 'undefined') { + return; + } + if (typeof flag === 'undefined') { + flag = ''; + } + + if (flag !== 'internal') + opts.lastPang = Date.now(); + + // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8. + // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b. + // Marvelous. + message = message.replace(/\+/g, "%20") + message = decoder(message) + + //The behemoth of filter-code (for Admin message filters) + //Note: This is proooobably hella inefficient + var filteredOut = false; + if (opts.hasOwnProperty('showMessagesFilters') && !opts.showMessagesFilters['All'].show) { + //Get this filter type (defined by class on message) + var messageHtml = $.parseHTML(message), + messageClasses; + if (opts.hasOwnProperty('filterHideAll') && opts.filterHideAll) { + var internal = false; + messageClasses = (!!$(messageHtml).attr('class') ? $(messageHtml).attr('class').split(/\s+/) : false); + if (messageClasses) { + for (var i = 0; i < messageClasses.length; i++) { //Every class + if (messageClasses[i] == 'internal') { + internal = true; + break; + } + } + } + if (!internal) { + filteredOut = 'All'; + } + } else { + //If the element or it's child have any classes + if (!!$(messageHtml).attr('class') || !!$(messageHtml).children().attr('class')) { + messageClasses = $(messageHtml).attr('class').split(/\s+/); + if (!!$(messageHtml).children().attr('class')) { + messageClasses = messageClasses.concat($(messageHtml).children().attr('class').split(/\s+/)); + } + var tempCount = 0; + for (var i = 0; i < messageClasses.length; i++) { //Every class + var thisClass = messageClasses[i]; + $.each(opts.showMessagesFilters, function(key, val) { //Every filter + if (key !== 'All' && val.show === false && typeof val.match != 'undefined') { + for (var i = 0; i < val.match.length; i++) { + var matchClass = val.match[i]; + if (matchClass == thisClass) { + filteredOut = key; + break; + } + } + } + if (filteredOut) return false; + }); + if (filteredOut) break; + tempCount++; + } + } else { + if (!opts.showMessagesFilters['Misc'].show) { + filteredOut = 'Misc'; + } + } + } + } + + //Stuff we do along with appending a message + var atBottom = false; + if (!filteredOut) { + var bodyHeight = $('body').height(); + var messagesHeight = $messages.outerHeight(); + var scrollPos = $('body,html').scrollTop(); + + //Should we snap the output to the bottom? + if (bodyHeight + scrollPos >= messagesHeight - opts.scrollSnapTolerance) { + atBottom = true; + if ($('#newMessages').length) { + $('#newMessages').remove(); + } + //If not, put the new messages box in + } else { + if ($('#newMessages').length) { + var messages = $('#newMessages .number').text(); + messages = parseInt(messages); + messages++; + $('#newMessages .number').text(messages); + if (messages == 2) { + $('#newMessages .messageWord').append('s'); + } + } else { + $messages.after('1 new message '); + } + } + } + + //Url stuff + if (message.length && flag != 'preventLink') { + message = linkify(message); + } + + opts.messageCount++; + + //Pop the top message off if history limit reached + if (opts.messageCount >= opts.messageLimit) { + $messages.children('div.entry:first-child').remove(); + opts.messageCount--; //I guess the count should only ever equal the limit + } + + //Actually append the message + var entry = document.createElement('div'); + entry.className = 'entry'; + + if (filteredOut) { + entry.className += ' hidden'; + entry.setAttribute('data-filter', filteredOut); + } + + entry.innerHTML = message.trim(); + $messages[0].appendChild(entry); + + //Actually do the snap + if (!filteredOut && atBottom) { + $('body,html').scrollTop($messages.outerHeight()); + } + + //Stuff we can do after the message shows can go here, in the interests of responsiveness + if (opts.highlightTerms && opts.highlightTerms.length > 0) { + highlightTerms(entry); + } +} + +function internalOutput(message, flag) +{ + output(escaper(message), flag) +} + +//Runs a route within byond, client or server side. Consider this "ehjax" for byond. +function runByond(uri) { + window.location = uri; +} + +function setCookie(cname, cvalue, exdays) { + cvalue = escaper(cvalue); + var d = new Date(); + d.setTime(d.getTime() + (exdays*24*60*60*1000)); + var expires = 'expires='+d.toUTCString(); + document.cookie = cname + '=' + cvalue + '; ' + expires; +} + +function getCookie(cname) { + var name = cname + '='; + var ca = document.cookie.split(';'); + for(var i=0; i < ca.length; i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1); + if (c.indexOf(name) === 0) { + return decoder(c.substring(name.length,c.length)); + } + } + return ''; +} + +function rgbToHex(R,G,B) {return toHex(R)+toHex(G)+toHex(B);} +function toHex(n) { + n = parseInt(n,10); + if (isNaN(n)) return "00"; + n = Math.max(0,Math.min(n,255)); + return "0123456789ABCDEF".charAt((n-n%16)/16) + "0123456789ABCDEF".charAt(n%16); +} + +function changeMode(mode) { + switch (mode) { + case 'geocities': + //switch in stylesheet + opts.chatMode = mode; + break; + case 'console': + + opts.chatMode = mode; + break; + case 'default': + default: + //remove loaded stylesheet/s + opts.chatMode = 'default'; + } +} + +function handleClientData(ckey, ip, compid) { + //byond sends player info to here + var currentData = {'ckey': ckey, 'ip': ip, 'compid': compid}; + if (opts.clientData && !$.isEmptyObject(opts.clientData)) { + runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]='+JSON.stringify({'connData': opts.clientData})); + + for (var i = 0; i < opts.clientData.length; i++) { + var saved = opts.clientData[i]; + if (currentData.ckey == saved.ckey && currentData.ip == saved.ip && currentData.compid == saved.compid) { + return; //Record already exists + } + } + + if (opts.clientData.length >= opts.clientDataLimit) { + opts.clientData.shift(); + } + } else { + runByond('?_src_=chat&proc=analyzeClientData¶m[cookie]=none'); + } + + //Update the cookie with current details + opts.clientData.push(currentData); + setCookie('connData', JSON.stringify(opts.clientData), 365); +} + +//Server calls this on ehjax response +//Or, y'know, whenever really +function ehjaxCallback(data) { + opts.lastPang = Date.now(); + if (data == 'softPang') { + return; + } else if (data == 'pang') { + opts.pingCounter = 0; //reset + opts.pingTime = Date.now(); + runByond('?_src_=chat&proc=ping'); + + } else if (data == 'pong') { + if (opts.pingDisabled) {return;} + opts.pongTime = Date.now(); + var pingDuration = Math.ceil((opts.pongTime - opts.pingTime) / 2); + $('#pingMs').text(pingDuration+'ms'); + pingDuration = Math.min(pingDuration, 255); + var red = pingDuration; + var green = 255 - pingDuration; + var blue = 0; + var hex = rgbToHex(red, green, blue); + $('#pingDot').css('color', '#'+hex); + + } else if (data == 'roundrestart') { + opts.restarting = true; + internalOutput('
The connection has been closed because the server is restarting. Please wait while you automatically reconnect.
', 'internal'); + } else if (data == 'stopaudio') { + $('.dectalk').remove(); + } else { + //Oh we're actually being sent data instead of an instruction + var dataJ; + try { + dataJ = $.parseJSON(data); + } catch (e) { + //But...incorrect :sadtrombone: + window.onerror('JSON: '+e+'. '+data, 'browserOutput.html', 327); + return; + } + data = dataJ; + + if (data.clientData) { + if (opts.restarting) { + opts.restarting = false; + $('.connectionClosed.restarting:not(.restored)').addClass('restored').text('The round restarted and you successfully reconnected!'); + } + if (!data.clientData.ckey && !data.clientData.ip && !data.clientData.compid) { + //TODO: Call shutdown perhaps + return; + } else { + handleClientData(data.clientData.ckey, data.clientData.ip, data.clientData.compid); + } + } else if (data.modeChange) { + changeMode(data.modeChange); + } else if (data.firebug) { + if (data.trigger) { + internalOutput('Loading firebug console, triggered by '+data.trigger+'...', 'internal'); + } else { + internalOutput('Loading firebug console...', 'internal'); + } + var firebugEl = document.createElement('script'); + firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js'; + document.body.appendChild(firebugEl); + } else if (data.dectalk) { + var message = ''; + if (data.decTalkTrigger) { + message = ' '+ + 'You hear a strange robotic voice...' + message; + } + internalOutput(message, 'preventLink'); + } + } +} + +function createPopup(contents, width) { + opts.popups++; + $('body').append(''); + + //Attach close popup event + var $popup = $('#popup'+opts.popups); + var height = $popup.outerHeight(); + $popup.css({'height': height+'px', 'margin': '-'+(height/2)+'px 0 0 -'+(width/2)+'px'}); + + $popup.on('click', '.close', function(e) { + e.preventDefault(); + $popup.remove(); + }); +} + +function toggleWasd(state) { + opts.wasd = (state == 'on' ? true : false); +} + +/***************************************** +* +* DOM READY +* +******************************************/ + +if (typeof $ === 'undefined') { + var div = document.getElementById('loading').childNodes[1]; + div += '

ERROR: Jquery did not load.'; +} + +$(function() { + $messages = $('#messages'); + $subOptions = $('#subOptions'); + + //Hey look it's a controller loop! + setInterval(function() { + if (opts.lastPang + opts.pangLimit < Date.now() && !opts.restarting) { //Every pingLimit + if (!opts.noResponse) { //Only actually append a message if the previous ping didn't also fail (to prevent spam) + opts.noResponse = true; + opts.noResponseCount++; + internalOutput('
You are either AFK, experiencing lag or the connection has closed.
', 'internal'); + } + } else if (opts.noResponse) { //Previous ping attempt failed ohno + $('.connectionClosed[data-count="'+opts.noResponseCount+'"]:not(.restored)').addClass('restored').text('Your connection has been restored (probably)!'); + opts.noResponse = false; + } + }, 2000); //2 seconds + + + /***************************************** + * + * LOAD SAVED CONFIG + * + ******************************************/ + var savedConfig = { + 'sfontSize': getCookie('fontsize'), + 'sfontType': getCookie('fonttype'), + 'spingDisabled': getCookie('pingdisabled'), + 'shighlightTerms': getCookie('highlightterms'), + 'shighlightColor': getCookie('highlightcolor'), + }; + + if (savedConfig.sfontSize) { + $messages.css('font-size', savedConfig.sfontSize); + internalOutput('Loaded font size setting of: '+savedConfig.sfontSize+'', 'internal'); + } + if (savedConfig.sfontType) { + $messages.css('font-family', savedConfig.sfontType); + internalOutput('Loaded font type setting of: '+savedConfig.sfontType+'', 'internal'); + } + if (savedConfig.spingDisabled) { + if (savedConfig.spingDisabled == 'true') { + opts.pingDisabled = true; + $('#ping').hide(); + } + internalOutput('Loaded ping display of: '+(opts.pingDisabled ? 'hidden' : 'visible')+'', 'internal'); + } + if (savedConfig.shighlightTerms) { + var savedTerms = $.parseJSON(savedConfig.shighlightTerms); + var actualTerms = ''; + for (var i = 0; i < savedTerms.length; i++) { + if (savedTerms[i]) { + actualTerms += savedTerms[i] + ', '; + } + } + if (actualTerms) { + actualTerms = actualTerms.substring(0, actualTerms.length - 2); + internalOutput('Loaded highlight strings of: ' + actualTerms+'', 'internal'); + opts.highlightTerms = savedTerms; + } + } + if (savedConfig.shighlightColor) { + opts.highlightColor = savedConfig.shighlightColor; + internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); + } + + (function() { + var dataCookie = getCookie('connData'); + if (dataCookie) { + var dataJ; + try { + dataJ = $.parseJSON(dataCookie); + } catch (e) { + window.onerror('JSON '+e+'. '+dataCookie, 'browserOutput.html', 434); + return; + } + opts.clientData = dataJ; + } + })(); + + + /***************************************** + * + * BASE CHAT OUTPUT EVENTS + * + ******************************************/ + + $('body').on('click', 'a', function(e) { + e.preventDefault(); + }); + + $('body').on('mousedown', function(e) { + var $target = $(e.target); + + if ($contextMenu && opts.hasOwnProperty('contextMenuTarget') && opts.contextMenuTarget) { + hideContextMenu(); + return false; + } + + if ($target.is('a') || $target.parent('a').length || $target.is('input') || $target.is('textarea')) { + opts.preventFocus = true; + } else { + opts.preventFocus = false; + opts.mouseDownX = e.pageX; + opts.mouseDownY = e.pageY; + } + }); + + $messages.on('mousedown', function(e) { + if ($subOptions && $subOptions.is(':visible')) { + $subOptions.slideUp('fast', function() { + $(this).removeClass('scroll'); + $(this).css('height', ''); + }); + clearInterval(opts.subOptionsLoop); + } + }); + + $('body').on('mouseup', function(e) { + if (!opts.preventFocus && + (e.pageX >= opts.mouseDownX - opts.clickTolerance && e.pageX <= opts.mouseDownX + opts.clickTolerance) && + (e.pageY >= opts.mouseDownY - opts.clickTolerance && e.pageY <= opts.mouseDownY + opts.clickTolerance) + ) { + opts.mouseDownX = null; + opts.mouseDownY = null; + runByond('byond://winset?mapwindow.map.focus=true'); + } + }); + + $messages.on('click', 'a', function(e) { + var href = $(this).attr('href'); + $(this).addClass('visited'); + if (href[0] == '?' || (href.length >= 8 && href.substring(0,8) == 'byond://')) { + runByond(href); + } else { + href = escaper(href); + runByond('?action=openLink&link='+href); + } + }); + + //Fuck everything about this event. Will look into alternatives. + $('body').on('keydown', function(e) { + if (e.target.nodeName == 'INPUT' || e.target.nodeName == 'TEXTAREA') { + return; + } + + if (e.ctrlKey || e.altKey || e.shiftKey) { //Band-aid "fix" for allowing ctrl+c copy paste etc. Needs a proper fix. + return; + } + + e.preventDefault() + + var k = e.which; + var command; // Command to execute through winset. + + // Hardcoded because else there would be no feedback message. + if (k == 113) { // F2 + runByond('byond://winset?screenshot=auto'); + internalOutput('Screenshot taken', 'internal'); + } + + var c = ""; + switch (k) { + case 8: + c = 'BACK'; + case 9: + c = 'TAB'; + case 13: + c = 'ENTER'; + case 19: + c = 'PAUSE'; + case 27: + c = 'ESCAPE'; + case 33: // Page up + c = 'NORTHEAST'; + case 34: // Page down + c = 'SOUTHEAST'; + case 35: // End + c = 'SOUTHWEST'; + case 36: // Home + c = 'NORTHWEST'; + case 37: + c = 'WEST'; + case 38: + c = 'NORTH'; + case 39: + c = 'EAST'; + case 40: + c = 'SOUTH'; + case 45: + c = 'INSERT'; + case 46: + c = 'DELETE'; + case 93: // That weird thing to the right of alt gr. + c = 'APPS'; + + default: + c = String.fromCharCode(k); + } + +// if(opts.macros.hasOwnProperty(c.toUpperCase())) + // command = opts.macros[c]; + + if (command) { + runByond('byond://winset?mapwindow.map.focus=true;command='+command); + return false; + } + else if (c.length == 0) { + if (!e.shiftKey) { + c = c.toLowerCase(); + } + runByond('byond://winset?mapwindow.map.focus=true;mainwindow.input.text='+c); + return false; + } else { + runByond('byond://winset?mapwindow.map.focus=true'); + return false; + } + }); + + //Mildly hacky fix for scroll issues on mob change (interface gets resized sometimes, messing up snap-scroll) + $(window).on('resize', function(e) { + if ($(this).height() !== opts.priorChatHeight) { + $('body,html').scrollTop($messages.outerHeight()); + opts.priorChatHeight = $(this).height(); + } + }); + + //Audio sound prevention + $messages.on('click', '.stopAudio', function() { + var $audio = $(this).parent().children('audio'); + if ($audio) { + $audio.remove(); + } + }); + + + /***************************************** + * + * OPTIONS INTERFACE EVENTS + * + ******************************************/ + + $('body').on('click', '#newMessages', function(e) { + var messagesHeight = $messages.outerHeight(); + $('body,html').scrollTop(messagesHeight); + $('#newMessages').remove(); + runByond('byond://winset?mapwindow.map.focus=true'); + }); + + $('#toggleOptions').click(function(e) { + if ($subOptions.is(':visible')) { + $subOptions.slideUp('fast', function() { + $(this).removeClass('scroll'); + $(this).css('height', ''); + }); + clearInterval(opts.subOptionsLoop); + } else { + $subOptions.slideDown('fast', function() { + var windowHeight = $(window).height(); + var toggleHeight = $('#toggleOptions').outerHeight(); + var priorSubHeight = $subOptions.outerHeight(); + var newSubHeight = windowHeight - toggleHeight; + $(this).height(newSubHeight); + if (priorSubHeight > (windowHeight - toggleHeight)) { + $(this).addClass('scroll'); + } + }); + opts.subOptionsLoop = setInterval(function() { + if (!opts.suppressOptionsClose && $('#subOptions').is(':visible')) { + $subOptions.slideUp('fast', function() { + $(this).removeClass('scroll'); + $(this).css('height', ''); + }); + clearInterval(opts.subOptionsLoop); + } + }, 5000); //Every 5 seconds + } + }); + + $('#subOptions, #toggleOptions').mouseenter(function() { + opts.suppressOptionsClose = true; + }); + + $('#subOptions, #toggleOptions').mouseleave(function() { + opts.suppressOptionsClose = false; + }); + + $('#decreaseFont').click(function(e) { + var fontSize = parseInt($messages.css('font-size')); + fontSize = fontSize - 1 + 'px'; + $messages.css({'font-size': fontSize}); + setCookie('fontsize', fontSize, 365); + internalOutput('Font size set to '+fontSize+'', 'internal'); + }); + + $('#increaseFont').click(function(e) { + var fontSize = parseInt($messages.css('font-size')); + fontSize = fontSize + 1 + 'px'; + $messages.css({'font-size': fontSize}); + setCookie('fontsize', fontSize, 365); + internalOutput('Font size set to '+fontSize+'', 'internal'); + }); + + $('#chooseFont').click(function(e) { + if ($('.popup .changeFont').is(':visible')) {return;} + var popupContent = '
Change Font
' + + ''; + createPopup(popupContent, 200); + }); + + $('body').on('click', '#changeFont a', function(e) { + var font = $(this).attr('data-font'); + $messages.css('font-family', font); + setCookie('fonttype', font, 365); + }); + + $('#togglePing').click(function(e) { + if (opts.pingDisabled) { + $('#ping').slideDown('fast'); + opts.pingDisabled = false; + } else { + $('#ping').slideUp('fast'); + opts.pingDisabled = true; + } + setCookie('pingdisabled', (opts.pingDisabled ? 'true' : 'false'), 365); + }); + + $('#saveLog').click(function(e) { + var saved = ''; + + if (window.XMLHtpRequest) { + xmlHttp = new XMLHttpRequest(); + } else { + xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); + } + xmlHttp.open('GET', 'browserOutput.css', false); + xmlHttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); + xmlHttp.send(); + saved += ''; + + saved += $messages.html(); + saved = saved.replace(/&/g, '&'); + saved = saved.replace(/'; + } + var popupContent = '
String Highlighting
' + + '
' + + '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
' + + '
' + + termInputs + + '
' + + '
' + + '
' + + '
'; + createPopup(popupContent, 250); + }); + + $('body').on('keyup', '#highlightColor', function() { + var color = $('#highlightColor').val(); + color = color.trim(); + if (!color || color.charAt(0) != '#') return; + $('#highlightColor').css('background-color', color); + }); + + $('body').on('submit', '#highlightTermForm', function(e) { + e.preventDefault(); + + var count = 0; + while (count < opts.highlightLimit) { + var term = $('#highlightTermInput'+count).val(); + if (term) { + term = term.trim(); + if (term === '') { + opts.highlightTerms[count] = null; + } else { + opts.highlightTerms[count] = term.toLowerCase(); + } + } else { + opts.highlightTerms[count] = null; + } + count++; + } + + var color = $('#highlightColor').val(); + color = color.trim(); + if (color == '' || color.charAt(0) != '#') { + opts.highlightColor = '#FFFF00'; + } else { + opts.highlightColor = color; + } + var $popup = $('#highlightPopup').closest('.popup'); + $popup.remove(); + + setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365); + setCookie('highlightcolor', opts.highlightColor, 365); + }); + + $('#clearMessages').click(function() { + $messages.empty(); + opts.messageCount = 0; + }); + + + /***************************************** + * + * KICK EVERYTHING OFF + * + ******************************************/ + + runByond('?_src_=chat&proc=doneLoading'); + if ($('#loading').is(':visible')) { + $('#loading').remove(); + } + $('#userBar').show(); + opts.priorChatHeight = $(window).height(); +}); \ No newline at end of file diff --git a/goon/browserassets/js/json2.min.js b/goon/browserassets/js/json2.min.js new file mode 100644 index 0000000000..d867407f26 --- /dev/null +++ b/goon/browserassets/js/json2.min.js @@ -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")})}(); \ No newline at end of file diff --git a/goon/code/datums/browserOutput.dm b/goon/code/datums/browserOutput.dm new file mode 100644 index 0000000000..d928397728 --- /dev/null +++ b/goon/code/datums/browserOutput.dm @@ -0,0 +1,289 @@ +/********************************* +For the main html chat area +*********************************/ + +//Precaching a bunch of shit +GLOBAL_DATUM_INIT(iconCache, /savefile, new("data/iconCache.sav")) //Cache of icons for the browser output + +//On client, created on login +/datum/chatOutput + var/client/owner //client ref + 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/list/connectionHistory //Contains the connection history passed from chat cookie + var/broken = FALSE + +/datum/chatOutput/New(client/C) + owner = C + messageQueue = list() + connectionHistory = list() + // log_world("chatOutput: New()") + +/datum/chatOutput/proc/start() + //Check for existing chat + if(!owner) + return FALSE + + if(!winexists(owner, "browseroutput")) // Oh goddamnit. + alert(owner.mob, "Updated chat window does not exist. If you are using a custom skin file please allow the game to update.") + broken = TRUE + return FALSE + + if(winget(owner, "browseroutput", "is-disabled") == "false") //Already setup + doneLoading() + + else //Not setup + load() + + return TRUE + +/datum/chatOutput/proc/load() + set waitfor = FALSE + if(!owner) + return + + var/static/list/chatResources = list( + "code/modules/html_interface/js/jquery.min.js", + "goon/browserassets/js/json2.min.js", + "goon/browserassets/js/browserOutput.js", + "tgui/assets/fonts/fontawesome-webfont.eot", + "tgui/assets/fonts/fontawesome-webfont.svg", + "tgui/assets/fonts/fontawesome-webfont.ttf", + "tgui/assets/fonts/fontawesome-webfont.woff", + "goon/browserassets/css/font-awesome.css", + "goon/browserassets/css/browserOutput.css" + ) + + // to_chat(world.log, "chatOutput: load()") + for(var/attempts in 1 to 5) + for(var/asset in chatResources) + owner << browse_rsc(file(asset)) + + //log_world("Sending main chat window to client [owner.ckey]") + owner << browse(file("goon/browserassets/html/browserOutput.html"), "window=browseroutput") + sleep(14 + (chatResources.len * 7)) + if(!owner || loaded) + break + + if(owner && !loaded) + doneLoading() // try doing this manually + CRASH("[owner] failed to load chat. Attempting doneLoading() manually") + // log_world("chatOutput: [owner.ckey] load() completed") + +/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(data) + ehjax_send(data = data) + +//Called on chat output done-loading by JS. +/datum/chatOutput/proc/doneLoading() + if(loaded) + return + + loaded = TRUE + winset(owner, "browseroutput", "is-disabled=false") + for(var/message in messageQueue) + to_chat(owner, message) + + messageQueue = null + sendClientData() + + pingLoop() + +/datum/chatOutput/proc/pingLoop() + set waitfor = FALSE + + while (owner) + ehjax_send(data = owner.is_afk(29) ? "softPang" : "pang") // SoftPang isn't handled anywhere but it'll always reset the opts.lastPang. + sleep(30) + +/datum/chatOutput/proc/ehjax_send(client/C = owner, window = "browseroutput", data) + if(islist(data)) + data = json_encode(data) + C << output("[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 = "") + 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() + for(var/i in connectionHistory.len to 1 step -1) + 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["compid"], row["ip"])) + found = row + break + + //Uh oh this fucker has a history of playing on a banned account!! + if (found.len > 0) + //TODO: add a new evasion ban for the CURRENT client details, using the matched row details + message_admins("[key_name(src.owner)] has a cookie from a banned account! (Matched: [found["ckey"]], [found["ip"]], [found["compid"]])") + log_admin("[key_name(src.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/chatOutput/proc/ping() + return "pong" + +//Called by js client on js error +/datum/chatOutput/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]") + +#ifdef TESTING +/client/verb/debug_chat() + set hidden = TRUE + chatOutput.ehjax_send(data = list("firebug" = TRUE)) +#endif +//Global chat procs + +GLOBAL_LIST_EMPTY(bicon_cache) + +//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 + GLOB.iconCache[iconKey] << icon + var/iconData = GLOB.iconCache.ExportText(iconKey) + var/list/partial = splittext(iconData, "{") + return replacetext(copytext(partial[2], 3, -5), "\n", "") + +/proc/bicon(obj) + if (!obj) + return + + if (isicon(obj)) + //Icons get pooled constantly, references are no good here. + /*if (!bicon_cache["\ref[obj]"]) // Doesn't exist yet, make it. + bicon_cache["\ref[obj]"] = icon2base64(obj) + return ""*/ + return "" + + // Either an atom or somebody fucked up and is gonna get a runtime, which I'm fine with. + var/atom/A = obj + var/key = "[istype(A.icon, /icon) ? "\ref[A.icon]" : A.icon]:[A.icon_state]" + if (!GLOB.bicon_cache[key]) // Doesn't exist, make it. + var/icon/I = icon(A.icon, A.icon_state, SOUTH, 1) + if (ishuman(obj)) // Shitty workaround for a BYOND issue. + var/icon/temp = I + I = icon() + I.Insert(temp, dir = SOUTH) + GLOB.bicon_cache[key] = icon2base64(I, key) + + return "" + +//Costlier version of bicon() that uses getFlatIcon() to account for overlays, underlays, etc. Use with extreme moderation, ESPECIALLY on mobs. +/proc/costly_bicon(obj) + if (!obj) + return + + if (isicon(obj)) + return bicon(obj) + + var/icon/I = getFlatIcon(obj) + return bicon(I) + +/proc/to_chat(target, message) + if(isnull(target)) + return + //Ok so I did my best but I accept that some calls to this will be for shit like sound and images + //It stands that we PROBABLY don't want to output those to the browser output so just handle them here + if (istype(message, /image) || istype(message, /sound) || istype(target, /savefile) || !(ismob(target) || islist(target) || istype(target, /client) || istype(target, /datum/log) || target == world)) + target << message + if (!istype(target, /atom)) // Really easy to mix these up, and not having to make sure things are mobs makes the code cleaner. + CRASH("DEBUG: Boutput called with invalid message") + return + + //Otherwise, we're good to throw it at the user + else if (istext(message)) + if (istext(target)) + return + + //Some macros remain in the string even after parsing and fuck up the eventual output + if (findtext(message, "\improper")) + message = replacetext(message, "\improper", "") + if (findtext(message, "\proper")) + message = replacetext(message, "\proper", "") + + //Grab us a client if possible + var/client/C = grab_client(target) + + if (C && C.chatOutput) + if(C.chatOutput.broken) // A player who hasn't updated his skin file. + to_chat(C, message) + return TRUE + if(!C.chatOutput.loaded && C.chatOutput.messageQueue && islist(C.chatOutput.messageQueue)) + //Client sucks at loading things, put their messages in a queue + C.chatOutput.messageQueue.Add(message) + return + + if(istype(target, /datum/log)) + var/datum/log/L = target + L.log += (message + "\n") + return + + message = replacetext(message, "\n", "
") + message = replacetext(message, "\t", "    ") + + // url_encode it TWICE, this way any UTF-8 characters are able to be decoded by the Javascript. + target << output(url_encode(url_encode(message)), "browseroutput:output") + +/proc/grab_client(target) + if(istype(target, /client)) + return target + else if(istype(target, /mob)) + var/mob/M = target + if(M.client) + return M.client + else if(istype(target, /datum/mind)) + var/datum/mind/M = target + if(M.current && M.current.client) + return M.current.client + +/datum/log //exists purely to capture to_chat() output + var/log = "" \ No newline at end of file diff --git a/interface/skin.dmf b/interface/skin.dmf index 02adcb7726..e711b4f197 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -1606,8 +1606,8 @@ window "outputwindow" macro = "" menu = "" on-close = "" - elem "output" - type = OUTPUT + elem "browseroutput" + type = BROWSER pos = 0,0 size = 640x480 anchor1 = 0,0 @@ -1618,20 +1618,20 @@ window "outputwindow" text-color = #000000 background-color = #ffffff is-visible = true - is-disabled = false + is-disabled = true is-transparent = false - is-default = true + is-default = false border = none drop-zone = false right-click = false - saved-params = "max-lines" + saved-params = "" on-size = "" - link-color = #0000ff - visited-color = #ff00ff - style = "" - enable-http-images = false - max-lines = 1000 - image = "" + show-history = false + show-url = false + auto-format = false + use-title = false + on_show = "" + on_hide = "" window "statwindow" elem "statwindow" @@ -1706,4 +1706,3 @@ window "statwindow" on-tab = "" prefix-color = none suffix-color = none - diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm index acecb4874b..74d1eaa3ef 100644 --- a/interface/stylesheet.dm +++ b/interface/stylesheet.dm @@ -1,3 +1,11 @@ +/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +/// !!!!!!!!!!HEY LISTEN!!!!!!!!!!!!!!!!!!!!!!!! +/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +// If you modify this file you ALSO need to modify code/modules/goonchat/browserAssets/browserOutput.css +// BUT you have to use PX font sizes with are on a x8 scale of these font sizes +// Sample font-size: DM: 8 CSS: 64px + /client/script = {"'; + win.document.body.innerHTML = $messages.html(); + } + } + }); + }); + + $('#highlightTerm').click(function(e) { + if ($('.popup .highlightTerm').is(':visible')) {return;} + var termInputs = ''; + for (var i = 0; i < opts.highlightLimit; i++) { + termInputs += '
'; + } + var popupContent = '
String Highlighting
' + + '
' + + '
Choose up to '+opts.highlightLimit+' strings that will highlight the line when they appear in chat.
' + + '
' + + termInputs + + '
' + + '
' + + '
' + + '
'; + createPopup(popupContent, 250); + }); + + $('body').on('keyup', '#highlightColor', function() { + var color = $('#highlightColor').val(); + color = color.trim(); + if (!color || color.charAt(0) != '#') return; + $('#highlightColor').css('background-color', color); + }); + + $('body').on('submit', '#highlightTermForm', function(e) { + e.preventDefault(); + + var count = 0; + while (count < opts.highlightLimit) { + var term = $('#highlightTermInput'+count).val(); + if (term) { + term = term.trim(); + if (term === '') { + opts.highlightTerms[count] = null; + } else { + opts.highlightTerms[count] = term.toLowerCase(); + } + } else { + opts.highlightTerms[count] = null; + } + count++; + } + + var color = $('#highlightColor').val(); + color = color.trim(); + if (color == '' || color.charAt(0) != '#') { + opts.highlightColor = '#FFFF00'; + } else { + opts.highlightColor = color; + } + var $popup = $('#highlightPopup').closest('.popup'); + $popup.remove(); + + setCookie('highlightterms', JSON.stringify(opts.highlightTerms), 365); + setCookie('highlightcolor', opts.highlightColor, 365); + }); + + $('#clearMessages').click(function() { + $messages.empty(); + opts.messageCount = 0; + }); + + + /***************************************** + * + * KICK EVERYTHING OFF + * + ******************************************/ + + runByond('?_src_=chat&proc=doneLoading'); + if ($('#loading').is(':visible')) { + $('#loading').remove(); + } + $('#userBar').show(); + opts.priorChatHeight = $(window).height(); +}); \ No newline at end of file diff --git a/code/modules/goonchat/browserassets/js/json2.min.js b/code/modules/goonchat/browserassets/js/json2.min.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 18fa2e8c60..38e15db5a0 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -40,13 +40,13 @@ if(spec_return) return spec_return - if(mind) - if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! - if(prob(mind.martial_art.deflection_chance)) - if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it - visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") - playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) - return 0 + if(mind) + if(mind.martial_art && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles! + if(prob(mind.martial_art.deflection_chance)) + if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it + visible_message("[src] deflects the projectile; [p_they()] can't be hit with ranged weapons!", "You deflect the projectile!") + playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1) + return 0 if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself if(istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) @@ -104,11 +104,11 @@ return 0 /mob/living/carbon/human/proc/check_block() - if(mind) - if(mind.martial_art && mind.martial_art.block_chance \ - && prob(mind.martial_art.block_chance) && in_throw_mode \ - && !stat && !weakened && !stunned) - return TRUE + if(mind) + if(mind.martial_art && mind.martial_art.block_chance \ + && prob(mind.martial_art.block_chance) && in_throw_mode \ + && !stat && !weakened && !stunned) + return TRUE return FALSE /mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = 0, hitpush = 1, blocked = 0) @@ -136,7 +136,7 @@ I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! I.loc = src L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier) - visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") hitpush = 0 skipcatch = 1 //can't catch the now embedded item @@ -160,8 +160,8 @@ var/obj/item/bodypart/affecting = get_bodypart(ran_zone(user.zone_selected)) //what we're actually ending up trying to hit. var/target_area = parse_zone(check_zone(user.zone_selected)) //our intended target - SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]") - SSblackbox.add_details("zone_targeted","[target_area]") + SSblackbox.add_details("item_used_for_combat","[I.type]|[I.force]") + SSblackbox.add_details("zone_targeted","[target_area]") // the attacked_by code varies among species return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) @@ -439,7 +439,7 @@ else if(S.siemens_coefficient == (-1)) total_coeff -= 1 siemens_coeff = total_coeff - if(HAS_SECONDARY_FLAG(src, TESLA_IGNORE)) + if(HAS_SECONDARY_FLAG(src, TESLA_IGNORE)) siemens_coeff = 0 else if(!safety) var/gloves_siemens_coeff = 1 @@ -622,7 +622,7 @@ gain = 100 if(mind.assigned_role == "Clown") gain = rand(-300, 300) - investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up! + investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up! gib() return(gain) @@ -665,10 +665,10 @@ status += "numb" if(status == "") status = "OK" - to_chat(src, "\t [status == "OK" ? "\blue" : "\red"] Your [LB.name] is [status].") + to_chat(src, "\t Your [LB.name] is [status].") for(var/obj/item/I in LB.embedded_objects) - to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") + to_chat(src, "\t There is \a [I] embedded in your [LB.name]!") for(var/t in missing) to_chat(src, "Your [parse_zone(t)] is missing!") diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index db72e94a86..b19e866378 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,5 +1,5 @@ /mob/living/silicon/ai/examine(mob/user) - var/msg = "*---------*\nThis is \icon[src] [src]!\n" + var/msg = "*---------*\nThis is [bicon(src)] [src]!\n" if (stat == DEAD) msg += "It appears to be powered-down.\n" else diff --git a/code/modules/uplink/uplink_item.dm b/code/modules/uplink/uplink_item.dm index 63b01483ef..bd7ba03dc5 100644 --- a/code/modules/uplink/uplink_item.dm +++ b/code/modules/uplink/uplink_item.dm @@ -1370,7 +1370,7 @@ GLOBAL_LIST_EMPTY(uplink_items) // Global list so we only initialize this once. continue crate_value -= I.cost new I.item(C) - U.purchase_log += "\icon[I.item]" + U.purchase_log += "[bicon(I.item)]" SSblackbox.add_details("traitor_uplink_items_bought", "[name]|[cost]") return C diff --git a/tgstation.dme b/tgstation.dme index 06fc7182cc..4aa6207ec5 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1496,8 +1496,8 @@ #include "code\modules\mining\equipment\lazarus_injector.dm" #include "code\modules\mining\equipment\marker_beacons.dm" #include "code\modules\mining\equipment\mineral_scanner.dm" -#include "code\modules\mining\equipment\regenerative_core.dm" #include "code\modules\mining\equipment\mining_tools.dm" +#include "code\modules\mining\equipment\regenerative_core.dm" #include "code\modules\mining\equipment\resonator.dm" #include "code\modules\mining\equipment\survival_pod.dm" #include "code\modules\mining\equipment\vendor_items.dm" From 5e759fd7922d965f11df1040cc5cb74026d1dd7e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 19 Jun 2017 15:47:08 -0500 Subject: [PATCH 4/5] Update examine.dm --- code/modules/mob/living/carbon/human/examine.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 1079650a21..50cbcfb3b3 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -22,9 +22,9 @@ accessory_msg += " with \icon[U.attached_accessory] \a [U.attached_accessory]" if(w_uniform.blood_DNA) - msg += "[t_He] [t_is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][tie_msg]!\n" + msg += "[t_He] [t_is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] blood-stained [w_uniform.name][accessory_msg]!\n" else - msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][tie_msg].\n" + msg += "[t_He] [t_is] wearing [bicon(w_uniform)] \a [w_uniform][accessory_msg].\n" //head if(head) From 12055144e477731e77263f154e82a9b095ccf680 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Mon, 19 Jun 2017 16:09:16 -0500 Subject: [PATCH 5/5] fix it --- code/_onclick/hud/screen_objects.dm | 34 +++++++++--------- code/game/turfs/closed.dm | 2 +- .../images/{blank.png => blank.dmi} | Bin 3 files changed, 18 insertions(+), 18 deletions(-) rename config/title_screens/images/{blank.png => blank.dmi} (100%) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 3cd0d5bdbd..0da04de7d3 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -91,9 +91,9 @@ screen_loc = ui_language_menu /obj/screen/language_menu/Click() - var/mob/M = usr - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) + var/mob/M = usr + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) /obj/screen/inventory var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. @@ -133,8 +133,8 @@ icon_state = icon_empty /obj/screen/inventory/hand - var/mutable_appearance/handcuff_overlay - var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") + var/mutable_appearance/handcuff_overlay + var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 /obj/screen/inventory/hand/update_icon() @@ -142,7 +142,7 @@ if(!handcuff_overlay) var/state = (!(held_index % 2)) ? "markus" : "gabrielle" - handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) + handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) cut_overlays() @@ -157,7 +157,7 @@ add_overlay(blocked_overlay) if(held_index == hud.mymob.active_hand_index) - add_overlay("hand_active") + add_overlay("hand_active") /obj/screen/inventory/hand/Click(location, control, params) @@ -439,7 +439,7 @@ /obj/screen/zone_sel/update_icon(mob/user) cut_overlays() - add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) + add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) user.zone_selected = selecting /obj/screen/zone_sel/alien @@ -447,7 +447,7 @@ /obj/screen/zone_sel/alien/update_icon(mob/user) cut_overlays() - add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) + add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) user.zone_selected = selecting /obj/screen/zone_sel/robot @@ -531,25 +531,25 @@ screen_loc = ui_health mouse_opacity = 0 -/obj/screen/healths/construct - icon = 'icons/mob/screen_construct.dmi' - icon_state = "artificer_health0" - screen_loc = ui_construct_health - mouse_opacity = 0 - +/obj/screen/healths/construct + icon = 'icons/mob/screen_construct.dmi' + icon_state = "artificer_health0" + screen_loc = ui_construct_health + mouse_opacity = 0 + /obj/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll /obj/screen/splash - icon = 'config/title_screens/images/blank.png' + icon = 'config/title_screens/images/blank.dmi' icon_state = "" screen_loc = "1,1" layer = SPLASHSCREEN_LAYER plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE +/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE holder = C if(!visible) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index a459ac5903..ac0add9746 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -29,7 +29,7 @@ /turf/closed/indestructible/splashscreen name = "Space Station 13" - icon = 'config/title_screens/images/blank.png' + icon = 'config/title_screens/images/blank.dmi' icon_state = "" layer = FLY_LAYER diff --git a/config/title_screens/images/blank.png b/config/title_screens/images/blank.dmi similarity index 100% rename from config/title_screens/images/blank.png rename to config/title_screens/images/blank.dmi