From 1bdbf16ea3235d7e1c8341de7f2a21f6d068c18e Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sun, 17 Jul 2016 13:03:01 +0100 Subject: [PATCH 01/63] VR+tgui additions: * Adds "VR Sleepers" which allow the user to enter a virtual body in a virtual world (it's basically a glorified teleporter) * Allows tgui to process fontawesome icons in stacks, fontawesome icons can stack over each other to fake a new icon (eg a ban icon over a camera to mean "ban cameras") * tgui buttons are now a MINIMUM of 20px high, as opposed to being permanently 20px high, this is so that large fontawesome icons don't look hideous. --- code/modules/VR/vr_human.dm | 55 +++++++++ code/modules/VR/vr_sleeper.dm | 175 ++++++++++++++++++++++++++++ tgstation.dme | 2 + tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 22 ++-- tgui/src/components/button.ract | 31 ++++- tgui/src/components/button.styl | 6 +- tgui/src/interfaces/vr_sleeper.ract | 49 ++++++++ 8 files changed, 324 insertions(+), 18 deletions(-) create mode 100644 code/modules/VR/vr_human.dm create mode 100644 code/modules/VR/vr_sleeper.dm create mode 100644 tgui/src/interfaces/vr_sleeper.ract diff --git a/code/modules/VR/vr_human.dm b/code/modules/VR/vr_human.dm new file mode 100644 index 00000000000..f5d4fad7e5f --- /dev/null +++ b/code/modules/VR/vr_human.dm @@ -0,0 +1,55 @@ + + +/mob/living/carbon/human/virtual_reality + var/mob/living/carbon/human/real_me //The human controlling us, can be any human (including virtual ones... inception...) + var/obj/machinery/vr_sleeper/vr_sleeper + var/datum/action/quit_vr/quit_action + + +/mob/living/carbon/human/virtual_reality/New() + ..() + quit_action = new() + quit_action.Grant(src) + + +/mob/living/carbon/human/virtual_reality/death() + revert_to_reality() + ..() + + +/mob/living/carbon/human/virtual_reality/Destroy() + revert_to_reality() + return ..() + + +/mob/living/carbon/human/virtual_reality/ghost() + set category = "OOC" + set name = "Ghost" + set desc = "Relinquish your life and enter the land of the dead." + var/mob/living/carbon/human/H = real_me + revert_to_reality(FALSE, FALSE) + if(H) + H.ghost() + + +/mob/living/carbon/human/virtual_reality/proc/revert_to_reality(refcleanup = TRUE, deathchecks = TRUE) + if(real_me && mind) + mind.transfer_to(real_me) + if(deathchecks && vr_sleeper && vr_sleeper.you_die_in_the_game_you_die_for_real) + real_me.death(0) + if(refcleanup) + vr_sleeper.vr_human = null + vr_sleeper = null + real_me = null + + +/datum/action/quit_vr + name = "Quit Virtual Reality" + +/datum/action/quit_vr/Trigger() + if(..()) + if(istype(owner, /mob/living/carbon/human/virtual_reality)) + var/mob/living/carbon/human/virtual_reality/VR = owner + VR.revert_to_reality(FALSE, FALSE) + else + Remove(owner) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm new file mode 100644 index 00000000000..039ffc9a594 --- /dev/null +++ b/code/modules/VR/vr_sleeper.dm @@ -0,0 +1,175 @@ + + +//Glorified teleporter that puts you in a new human body. +// it's """VR""" +/obj/machinery/vr_sleeper + name = "virtual reality sleeper" + desc = "a sleeper modified to alter the subconscious state of the user, allowing them to visit virtual worlds" + icon = 'icons/obj/Cryogenic2.dmi' + icon_state = "sleeper" + state_open = TRUE + anchored = TRUE + var/you_die_in_the_game_you_die_for_real = FALSE + var/datum/effect_system/spark_spread/sparks + var/mob/living/carbon/human/virtual_reality/vr_human + var/static/list/available_vr_spawnpoints + var/vr_category = "default" //Specific category of spawn points to pick from + var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games + + +/obj/machinery/vr_sleeper/New() + ..() + sparks = new /datum/effect_system/spark_spread() + sparks.set_up(2,0) + sparks.attach(src) + + update_icon() + + if(!available_vr_spawnpoints || !available_vr_spawnpoints.len) //(re)build spawnpoint lists + available_vr_spawnpoints = list() + for(var/obj/effect/landmark/vr_spawn/V in landmarks_list) + available_vr_spawnpoints[V.vr_category] = list() + var/turf/T = get_turf(V) + if(T) + available_vr_spawnpoints[V.vr_category] |= T + + +/obj/machinery/vr_sleeper/attack_hand(mob/user) + if(occupant) + ui_interact(user) + else + if(state_open) + close_machine() + else + open_machine() + + +/obj/machinery/vr_sleeper/relaymove(mob/user) + open_machine() + + +/obj/machinery/vr_sleeper/Destroy() + open_machine() + cleanup_vr_human() + qdel(sparks) + sparks = null + return ..() + + +/obj/machinery/vr_sleeper/emag_act(mob/user) + you_die_in_the_game_you_die_for_real = TRUE + sparks.start() + + +/obj/machinery/vr_sleeper/update_icon() + icon_state = "[initial(icon_state)][state_open ? "-open" : ""]" + + +/obj/machinery/vr_sleeper/open_machine() + if(!state_open) + if(vr_human) + vr_human.revert_to_reality(FALSE, FALSE) + if(occupant) + SStgui.close_user_uis(occupant, src) + ..() + + +/obj/machinery/vr_sleeper/close_machine() + ..() + if(occupant) + ui_interact(occupant) + + +/obj/machinery/vr_sleeper/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, datum/tgui/master_ui = null, datum/ui_state/state = default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "vr_sleeper", "VR Sleeper", 475, 340, master_ui, state) + ui.open() + + +/obj/machinery/vr_sleeper/ui_act(action, params) + if(..()) + return + switch(action) + if("vr_connect") + if(ishuman(occupant) && occupant.mind) + occupant << "Transfering to virtual reality..." + if(vr_human) + vr_human.revert_to_reality(FALSE, FALSE) + occupant.mind.transfer_to(vr_human) + vr_human.real_me = occupant + vr_human << "Transfer successful! you are now playing as [vr_human] in VR!" + SStgui.close_user_uis(vr_human, src) + else + if(allow_creating_vr_humans) + occupant << "Virtual avatar not found, attempting to create one..." + var/turf/T = get_vr_spawnpoint() + if(T) + build_virtual_human(occupant, T) + vr_human << "Transfer successful! you are now playing as [vr_human] in VR!" + else + occupant << "Virtual world misconfigured, aborting transfer" + else + occupant << "The virtual world does not support the creation of new virtual avatars, aborting transfer" + . = TRUE + if("delete_avatar") + if(!occupant || usr == occupant) + if(vr_human) + qdel(vr_human) + else + usr << "The VR Sleeper's safeties prevent you from doing that." + . = TRUE + if("toggle_open") + if(state_open) + close_machine() + else + open_machine() + . = TRUE + + +/obj/machinery/vr_sleeper/ui_data(mob/user) + var/list/data = list() + if(vr_human && !qdeleted(vr_human)) + data["can_delete_avatar"] = TRUE + var/status + switch(user.stat) + if(CONSCIOUS) + status = "Conscious" + if(DEAD) + status = "Dead" + if(UNCONSCIOUS) + status = "Unconscious" + data["vr_avatar"] = list("name" = vr_human.name, "status" = status, "health" = vr_human.health, "maxhealth" = vr_human.maxHealth) + data["toggle_open"] = state_open + data["isoccupant"] = (user == occupant) + return data + + +/obj/machinery/vr_sleeper/proc/get_vr_spawnpoint() //proc so it can be overriden for team games or something + return safepick(available_vr_spawnpoints[vr_category]) + + +/obj/machinery/vr_sleeper/proc/build_virtual_human(mob/living/carbon/human/H, location, transfer = TRUE) + if(H) + cleanup_vr_human() + vr_human = new /mob/living/carbon/human/virtual_reality(location) + vr_human.vr_sleeper = src + vr_human.real_me = H + H.dna.transfer_identity(vr_human) + vr_human.name = H.name + vr_human.real_name = H.real_name + vr_human.socks = H.socks + vr_human.undershirt = H.undershirt + vr_human.underwear = H.underwear + vr_human.updateappearance(1,1,1) + if(transfer && H.mind) + H.mind.transfer_to(vr_human) + + +/obj/machinery/vr_sleeper/proc/cleanup_vr_human() + if(vr_human) + vr_human.death(0) + + +/obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint() + var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc. diff --git a/tgstation.dme b/tgstation.dme index a2b76c76024..9ca28dc6c58 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1824,6 +1824,8 @@ #include "code\modules\vehicles\secway.dm" #include "code\modules\vehicles\speedbike.dm" #include "code\modules\vehicles\vehicle.dm" +#include "code\modules\VR\vr_human.dm" +#include "code\modules\VR\vr_sleeper.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "code\orphaned_procs\AStar.dm" diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index 35e16349ab3..6156a956a45 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff2a2a2a',endColorstr='#ff202020',GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input::-webkit-input-placeholder{color:#999}body.nanotrasen input::-moz-placeholder{color:#999}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff750000',endColorstr='#ff340404',GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input::-webkit-input-placeholder{color:#999}body.syndicate input::-moz-placeholder{color:#999}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(even){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/assets/tgui.js b/tgui/assets/tgui.js index d628d06bafe..68bcdc106e0 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,13 +1,13 @@ require=function t(e,n,r){function a(o,s){if(!n[o]){if(!e[o]){var u="function"==typeof require&&require;if(!s&&u)return u(o,!0);if(i)return i(o,!0);var c=Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[o]={exports:{}};e[o][0].call(p.exports,function(t){var n=e[o][1][t];return a(n?n:t)},p,p.exports,t,e,n,r)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?c[2]:void 0,l=Math.min((void 0===p?o:a(p,o))-u,o-s),f=1;for(s>u&&u+l>s&&(f=-1,u+=l-1,s+=l-1);l-- >0;)u in n?n[s]=n[u]:delete n[s],s+=f,u+=f;return n}},{76:76,79:79,80:80}],6:[function(t,e,n){"use strict";var r=t(80),a=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=r(this),n=i(e.length),o=arguments,s=o.length,u=a(s>1?o[1]:void 0,n),c=s>2?o[2]:void 0,p=void 0===c?n:a(c,n);p>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var r=t(78),a=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=r(e),c=a(u.length),p=i(o,c);if(t&&n!=n){for(;c>p;)if(s=u[p++],s!=s)return!0}else for(;c>p;p++)if((t||p in u)&&u[p]===n)return t||p;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var r=t(17),a=t(34),i=t(80),o=t(79),s=t(9);e.exports=function(t){var e=1==t,n=2==t,u=3==t,c=4==t,p=6==t,l=5==t||p;return function(f,d,h){for(var m,v,g=i(f),b=a(g),y=r(d,h,3),x=o(b.length),_=0,w=e?s(f,x):n?s(f,0):void 0;x>_;_++)if((l||_ in b)&&(m=b[_],v=y(m,_,g),t))if(e)w[_]=v;else if(v)switch(t){case 3:return!0;case 5:return m;case 6:return _;case 2:w.push(m)}else if(c)return!1;return p?-1:u||c?c:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var r=t(38),a=t(36),i=t(83)("species");e.exports=function(t,e){var n;return a(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!a(n.prototype)||(n=void 0),r(n)&&(n=n[i],null===n&&(n=void 0))),new(void 0===n?Array:n)(e)}},{36:36,38:38,83:83}],10:[function(t,e,n){var r=t(11),a=t(83)("toStringTag"),i="Arguments"==r(function(){return arguments}());e.exports=function(t){var e,n,o;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=(e=Object(t))[a])?n:i?r(e):"Object"==(o=r(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var r={}.toString;e.exports=function(t){return r.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var r=t(46),a=t(31),i=t(60),o=t(17),s=t(69),u=t(18),c=t(27),p=t(42),l=t(44),f=t(82)("id"),d=t(30),h=t(38),m=t(65),v=t(19),g=Object.isExtensible||h,b=v?"_s":"size",y=0,x=function(t,e){if(!h(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!d(t,f)){if(!g(t))return"F";if(!e)return"E";a(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,r=x(e);if("F"!==r)return t._i[r];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,a){var p=t(function(t,i){s(t,p,e),t._i=r.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&c(i,n,t[a],t)});return i(p.prototype,{clear:function(){for(var t=this,e=t._i,n=t._f;n;n=n.n)n.r=!0,n.p&&(n.p=n.p.n=void 0),delete e[n.i];t._f=t._l=void 0,t[b]=0},"delete":function(t){var e=this,n=_(e,t);if(n){var r=n.n,a=n.p;delete e._i[n.i],n.r=!0,a&&(a.n=r),r&&(r.p=a),e._f==n&&(e._f=r),e._l==n&&(e._l=a),e[b]--}return!!n},forEach:function(t){for(var e,n=o(t,arguments.length>1?arguments[1]:void 0,3);e=e?e.n:this._f;)for(n(e.v,e.k,this);e&&e.r;)e=e.p},has:function(t){return!!_(this,t)}}),v&&r.setDesc(p.prototype,"size",{get:function(){return u(this[b])}}),p},def:function(t,e,n){var r,a,i=_(t,e);return i?i.v=n:(t._l=i={i:a=x(e,!0),k:e,v:n,p:r=t._l,n:void 0,r:!1},t._f||(t._f=i),r&&(r.n=i),t[b]++,"F"!==a&&(t._i[a]=i)),t},getEntry:_,setStrong:function(t,e,n){p(t,e,function(t,e){this._t=t,this._k=e,this._l=void 0},function(){for(var t=this,e=t._k,n=t._l;n&&n.r;)n=n.p;return t._t&&(t._l=n=n?n.n:t._t._f)?"keys"==e?l(0,n.k):"values"==e?l(0,n.v):l(0,[n.k,n.v]):(t._t=void 0,l(1))},n?"entries":"values",!n,!0),m(e)}}},{17:17,18:18,19:19,27:27,30:30,31:31,38:38,42:42,44:44,46:46,60:60,65:65,69:69,82:82}],13:[function(t,e,n){var r=t(27),a=t(10);e.exports=function(t){return function(){if(a(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return r(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var r=t(31),a=t(60),i=t(4),o=t(38),s=t(69),u=t(27),c=t(8),p=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=c(5),h=c(6),m=0,v=function(t){return t._l||(t._l=new g)},g=function(){this.a=[]},b=function(t,e){return d(t.a,function(t){return t[0]===e})};g.prototype={get:function(t){var e=b(this,t);return e?e[1]:void 0},has:function(t){return!!b(this,t)},set:function(t,e){var n=b(this,t);n?n[1]=e:this.a.push([t,e])},"delete":function(t){var e=h(this.a,function(e){return e[0]===t});return~e&&this.a.splice(e,1),!!~e}},e.exports={getConstructor:function(t,e,n,r){var i=t(function(t,a){s(t,i,e),t._i=m++,t._l=void 0,void 0!=a&&u(a,n,t[r],t)});return a(i.prototype,{"delete":function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?p(t,l)&&p(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(p(e,l)||r(e,l,{}),e[l][t._i]=n):v(t).set(e,n),t},frozenStore:v,WEAK:l}},{27:27,30:30,31:31,38:38,4:4,60:60,69:69,8:8,82:82}],15:[function(t,e,n){"use strict";var r=t(29),a=t(22),i=t(61),o=t(60),s=t(27),u=t(69),c=t(38),p=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=r[t],g=v,b=h?"set":"add",y=g&&g.prototype,x={},_=function(t){var e=y[t];i(y,t,"delete"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!c(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!c(t)?void 0:e.call(this,0===t?0:t)}:"add"==t?function(t){return e.call(this,0===t?0:t),this}:function(t,n){return e.call(this,0===t?0:t,n),this})};if("function"==typeof g&&(m||y.forEach&&!p(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=p(function(){k.has(1)}),O=l(function(t){new g(t)});O||(g=e(function(e,n){u(e,g,t);var r=new v;return void 0!=n&&s(n,h,r[b],r),r}),g.prototype=y,y.constructor=g),m||k.forEach(function(t,e){w=1/e===-(1/0)}),(S||w)&&(_("delete"),_("has"),h&&_("get")),(w||E)&&_(b),m&&y.clear&&delete y.clear}else g=d.getConstructor(e,t,h,b),o(g.prototype,n);return f(g,t),x[t]=g,a(a.G+a.W+a.F*(g!=v),x),m||d.setStrong(g,t,h),g}},{22:22,24:24,27:27,29:29,38:38,43:43,60:60,61:61,66:66,69:69}],16:[function(t,e,n){var r=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=r)},{}],17:[function(t,e,n){var r=t(2);e.exports=function(t,e,n){if(r(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,a){return t.call(e,n,r,a)}}return function(){return t.apply(e,arguments)}}},{2:2}],18:[function(t,e,n){e.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},{}],19:[function(t,e,n){e.exports=!t(24)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{24:24}],20:[function(t,e,n){var r=t(38),a=t(29).document,i=r(a)&&r(a.createElement);e.exports=function(t){return i?a.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var r=t(46);e.exports=function(t){var e=r.getKeys(t),n=r.getSymbols;if(n)for(var a,i=n(t),o=r.isEnum,s=0;i.length>s;)o.call(t,a=i[s++])&&e.push(a);return e}},{46:46}],22:[function(t,e,n){var r=t(29),a=t(16),i=t(31),o=t(61),s=t(17),u="prototype",c=function(t,e,n){var p,l,f,d,h=t&c.F,m=t&c.G,v=t&c.S,g=t&c.P,b=t&c.B,y=m?r:v?r[e]||(r[e]={}):(r[e]||{})[u],x=m?a:a[e]||(a[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(p in n)l=!h&&y&&p in y,f=(l?y:n)[p],d=b&&l?s(f,r):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,p,f),x[p]!=f&&i(x,p,d),g&&_[p]!=f&&(_[p]=f)};r.core=a,c.F=1,c.G=2,c.S=4,c.P=8,c.B=16,c.W=32,e.exports=c},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var r=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[r]=!1,!"/./"[t](e)}catch(a){}}return!0}},{83:83}],24:[function(t,e,n){e.exports=function(t){try{return!!t()}catch(e){return!0}}},{}],25:[function(t,e,n){"use strict";var r=t(31),a=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),c=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(a(String.prototype,t,n(o,u,c)),r(RegExp.prototype,u,2==e?function(t,e){return c.call(t,this,e)}:function(t){return c.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var r=t(4);e.exports=function(){var t=r(this),e="";return t.global&&(e+="g"),t.ignoreCase&&(e+="i"),t.multiline&&(e+="m"),t.unicode&&(e+="u"),t.sticky&&(e+="y"),e}},{4:4}],27:[function(t,e,n){var r=t(17),a=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,c){var p,l,f,d=u(t),h=r(n,c,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(p=s(t.length);p>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)a(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var r=t(78),a=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return a(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):a(r(t))}},{46:46,78:78}],29:[function(t,e,n){var r=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(t,e,n){var r={}.hasOwnProperty;e.exports=function(t,e){return r.call(t,e)}},{}],31:[function(t,e,n){var r=t(46),a=t(59);e.exports=t(19)?function(t,e,n){return r.setDesc(t,e,a(1,n))}:function(t,e,n){return t[e]=n,t}},{19:19,46:46,59:59}],32:[function(t,e,n){e.exports=t(29).document&&document.documentElement},{29:29}],33:[function(t,e,n){e.exports=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)}},{}],34:[function(t,e,n){var r=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var r=t(45),a=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(r.Array===t||i[a]===t)}},{45:45,83:83}],36:[function(t,e,n){var r=t(11);e.exports=Array.isArray||function(t){return"Array"==r(t)}},{11:11}],37:[function(t,e,n){var r=t(38),a=Math.floor;e.exports=function(t){return!r(t)&&isFinite(t)&&a(t)===t}},{38:38}],38:[function(t,e,n){e.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},{}],39:[function(t,e,n){var r=t(38),a=t(11),i=t(83)("match");e.exports=function(t){var e;return r(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==a(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var r=t(4);e.exports=function(t,e,n,a){try{return a?e(r(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&r(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var r=t(46),a=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=r.create(o,{next:a(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var r=t(48),a=t(22),i=t(61),o=t(31),s=t(30),u=t(45),c=t(41),p=t(66),l=t(46).getProto,f=t(83)("iterator"),d=!([].keys&&"next"in[].keys()),h="@@iterator",m="keys",v="values",g=function(){return this};e.exports=function(t,e,n,b,y,x,_){c(n,e,b);var w,k,E=function(t){if(!d&&t in A)return A[t];switch(t){case m:return function(){return new n(this,t)};case v:return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O=y==v,C=!1,A=t.prototype,P=A[f]||A[h]||y&&A[y],T=P||E(y);if(P){var j=l(T.call(new t));p(j,S,!0),!r&&s(A,h)&&o(j,f,g),O&&P.name!==v&&(C=!0,T=function(){return P.call(this)})}if(r&&!_||!d&&!C&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:O?T:E(v),keys:x?T:E(m),entries:O?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else a(a.P+a.F*(d||C),e,w);return w}},{22:22,30:30,31:31,41:41,45:45,46:46,48:48,61:61,66:66,83:83}],43:[function(t,e,n){var r=t(83)("iterator"),a=!1;try{var i=[7][r]();i["return"]=function(){a=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!a)return!1;var n=!1;try{var i=[7],o=i[r]();o.next=function(){n=!0},i[r]=function(){return o},t(i)}catch(s){}return n}},{83:83}],44:[function(t,e,n){e.exports=function(t,e){return{value:e,done:!!t}}},{}],45:[function(t,e,n){e.exports={}},{}],46:[function(t,e,n){var r=Object;e.exports={create:r.create,getProto:r.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:r.getOwnPropertyDescriptor,setDesc:r.defineProperty,setDescs:r.defineProperties,getKeys:r.keys,getNames:r.getOwnPropertyNames,getSymbols:r.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var r=t(46),a=t(78);e.exports=function(t,e){for(var n,i=a(t),o=r.getKeys(i),s=o.length,u=0;s>u;)if(i[n=o[u++]]===e)return n}},{46:46,78:78}],48:[function(t,e,n){e.exports=!1},{}],49:[function(t,e,n){e.exports=Math.expm1||function(t){return 0==(t=+t)?t:t>-1e-6&&1e-6>t?t+t*t/2:Math.exp(t)-1}},{}],50:[function(t,e,n){e.exports=Math.log1p||function(t){return(t=+t)>-1e-8&&1e-8>t?t-t*t/2:Math.log(1+t)}},{}],51:[function(t,e,n){e.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:0>t?-1:1}},{}],52:[function(t,e,n){var r,a,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,c=o.process,p=o.Promise,l="process"==t(11)(c),f=function(){var t,e,n;for(l&&(t=c.domain)&&(c.domain=null,t.exit());r;)e=r.domain,n=r.fn,e&&e.enter(),n(),e&&e.exit(),r=r.next;a=void 0,t&&t.enter()};if(l)i=function(){c.nextTick(f)};else if(u){var d=1,h=document.createTextNode("");new u(f).observe(h,{characterData:!0}),i=function(){h.data=d=-d}}else i=p&&p.resolve?function(){p.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&c.domain};a&&(a.next=e),r||(r=e,i()),a=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var r=t(46),a=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},r=Symbol(),a="abcdefghijklmnopqrst";return e[r]=7,a.split("").forEach(function(t){n[t]=t}),7!=t({},e)[r]||Object.keys(t({},n)).join("")!=a})?function(t,e){for(var n=a(t),o=arguments,s=o.length,u=1,c=r.getKeys,p=r.getSymbols,l=r.isEnum;s>u;)for(var f,d=i(o[u++]),h=p?c(d).concat(p(d)):c(d),m=h.length,v=0;m>v;)l.call(d,f=h[v++])&&(n[f]=d[f]);return n}:Object.assign},{24:24,34:34,46:46,80:80}],54:[function(t,e,n){var r=t(22),a=t(16),i=t(24);e.exports=function(t,e){var n=(a.Object||{})[t]||Object[t],o={};o[t]=e(n),r(r.S+r.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var r=t(46),a=t(78),i=r.isEnum;e.exports=function(t){return function(e){for(var n,o=a(e),s=r.getKeys(o),u=s.length,c=0,p=[];u>c;)i.call(o,n=s[c++])&&p.push(t?[n,o[n]]:o[n]);return p}}},{46:46,78:78}],56:[function(t,e,n){var r=t(46),a=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=r.getNames(a(t)),n=r.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var r=t(58),a=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=r._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var r,i=this,o=arguments,c=o.length,p=0,l=0;if(!u&&!c)return a(t,n,i);if(r=n.slice(),u)for(;e>p;p++)r[p]===s&&(r[p]=o[l++]);for(;c>l;)r.push(o[l++]);return a(t,r,i)}}},{2:2,33:33,58:58}],58:[function(t,e,n){e.exports=t(29)},{29:29}],59:[function(t,e,n){e.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},{}],60:[function(t,e,n){var r=t(61);e.exports=function(t,e){for(var n in e)r(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var r=t(29),a=t(31),i=t(82)("src"),o="toString",s=Function[o],u=(""+s).split(o);t(16).inspectSource=function(t){return s.call(t)},(e.exports=function(t,e,n,o){"function"==typeof n&&(n.hasOwnProperty(i)||a(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||a(n,"name",e)),t===r?t[e]=n:(o||delete t[e],a(t,e,n))})(Function.prototype,o,function(){return"function"==typeof this&&this[i]||s.call(this)})},{16:16,29:29,31:31,82:82}],62:[function(t,e,n){e.exports=function(t,e){var n=e===Object(e)?function(t){return e[t]}:e;return function(e){return(e+"").replace(t,n)}}},{}],63:[function(t,e,n){e.exports=Object.is||function(t,e){return t===e?0!==t||1/t===1/e:t!=t&&e!=e}},{}],64:[function(t,e,n){var r=t(46).getDesc,a=t(38),i=t(4),o=function(t,e){if(i(t),!a(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,a){try{a=t(17)(Function.call,r(Object.prototype,"__proto__").set,2),a(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:a(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var r=t(29),a=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=r[t];i&&e&&!e[o]&&a.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var r=t(46).setDesc,a=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!a(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var r=t(29),a="__core-js_shared__",i=r[a]||(r[a]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var r=t(4),a=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=r(t).constructor;return void 0===o||void 0==(n=r(o)[i])?e:a(n)}},{2:2,4:4,83:83}],69:[function(t,e,n){e.exports=function(t,e,n){if(!(t instanceof e))throw TypeError(n+": use the 'new' operator!");return t}},{}],70:[function(t,e,n){var r=t(77),a=t(18);e.exports=function(t){return function(e,n){var i,o,s=a(e)+"",u=r(n),c=s.length;return 0>u||u>=c?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===c||(o=s.charCodeAt(u+1))<56320||o>57343?t?s.charAt(u):i:t?s.slice(u,u+2):(i-55296<<10)+(o-56320)+65536)}}},{18:18,77:77}],71:[function(t,e,n){var r=t(39),a=t(18);e.exports=function(t,e,n){if(r(e))throw TypeError("String#"+n+" doesn't accept regex!");return a(t)+""}},{18:18,39:39}],72:[function(t,e,n){var r=t(79),a=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,c=void 0===n?" ":n+"",p=r(e);if(u>=p)return s;""==c&&(c=" ");var l=p-u,f=a.call(c,Math.ceil(l/c.length));return f.length>l&&(f=f.slice(0,l)),o?f+s:s+f}},{18:18,73:73,79:79}],73:[function(t,e,n){"use strict";var r=t(77),a=t(18);e.exports=function(t){var e=a(this)+"",n="",i=r(t);if(0>i||i==1/0)throw RangeError("Count can't be negative");for(;i>0;(i>>>=1)&&(e+=e))1&i&&(n+=e);return n}},{18:18,77:77}],74:[function(t,e,n){var r=t(22),a=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",c=RegExp("^"+s+s+"*"),p=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),r(r.P+r.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=a(t)+"",1&e&&(t=t.replace(c,"")),2&e&&(t=t.replace(p,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var r,a,i,o=t(17),s=t(33),u=t(32),c=t(20),p=t(29),l=p.process,f=p.setImmediate,d=p.clearImmediate,h=p.MessageChannel,m=0,v={},g="onreadystatechange",b=function(){var t=+this;if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},y=function(t){b.call(t.data)};f&&d||(f=function(t){for(var e=[],n=1;arguments.length>n;)e.push(arguments[n++]);return v[++m]=function(){s("function"==typeof t?t:Function(t),e)},r(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?r=function(t){l.nextTick(o(b,t,1))}:h?(a=new h,i=a.port2,a.port1.onmessage=y,r=o(i.postMessage,i,1)):p.addEventListener&&"function"==typeof postMessage&&!p.importScripts?(r=function(t){p.postMessage(t+"","*")},p.addEventListener("message",y,!1)):r=g in c("script")?function(t){u.appendChild(c("script"))[g]=function(){u.removeChild(this),b.call(t)}}:function(t){setTimeout(o(b,t,1),0)}),e.exports={set:f,clear:d}},{11:11,17:17,20:20,29:29,32:32,33:33}],76:[function(t,e,n){var r=t(77),a=Math.max,i=Math.min;e.exports=function(t,e){return t=r(t),0>t?a(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var r=Math.ceil,a=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?a:r)(t)}},{}],78:[function(t,e,n){var r=t(34),a=t(18);e.exports=function(t){return r(a(t))}},{18:18,34:34}],79:[function(t,e,n){var r=t(77),a=Math.min;e.exports=function(t){return t>0?a(r(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var r=t(18);e.exports=function(t){return Object(r(t))}},{18:18}],81:[function(t,e,n){var r=t(38);e.exports=function(t,e){if(!r(t))return t;var n,a;if(e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;if("function"==typeof(n=t.valueOf)&&!r(a=n.call(t)))return a;if(!e&&"function"==typeof(n=t.toString)&&!r(a=n.call(t)))return a;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var r=0,a=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++r+a).toString(36))}},{}],83:[function(t,e,n){var r=t(67)("wks"),a=t(82),i=t(29).Symbol;e.exports=function(t){return r[t]||(r[t]=i&&i[t]||(i||a)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var r=t(10),a=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[a]||t["@@iterator"]||i[r(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var r,a=t(46),i=t(22),o=t(19),s=t(59),u=t(32),c=t(20),p=t(30),l=t(11),f=t(33),d=t(24),h=t(4),m=t(2),v=t(38),g=t(80),b=t(78),y=t(77),x=t(76),_=t(79),w=t(34),k=t(82)("__proto__"),E=t(8),S=t(7)(!1),O=Object.prototype,C=Array.prototype,A=C.slice,P=C.join,T=a.setDesc,j=a.getDesc,M=a.setDescs,L={};o||(r=!d(function(){return 7!=T(c("div"),"a",{get:function(){return 7}}).a}),a.setDesc=function(t,e,n){if(r)try{return T(t,e,n)}catch(a){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},a.getDesc=function(t,e){if(r)try{return j(t,e)}catch(n){}return p(t,e)?s(!O.propertyIsEnumerable.call(t,e),t[e]):void 0},a.setDescs=M=function(t,e){h(t);for(var n,r=a.getKeys(e),i=r.length,o=0;i>o;)a.setDesc(t,n=r[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:a.getDesc,defineProperty:a.setDesc,defineProperties:M});var F="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),N=F.concat("length","prototype"),R=F.length,D=function(){var t,e=c("iframe"),n=R,r=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" @@ -57,5 +77,8 @@ {{#if icon}} {{/if}} + {{#if icon_stack}} + {{{iconStackToHTML(icon_stack)}}} + {{/if}} {{yield}} diff --git a/tgui/src/components/button.styl b/tgui/src/components/button.styl index f02c779a814..2f8613dc7a4 100644 --- a/tgui/src/components/button.styl +++ b/tgui/src/components/button.styl @@ -14,8 +14,8 @@ span.button @extend {context} $fontReset display: inline-block vertical-align: middle - height: 20px - line-height: @height - 3px + min-height: 20px + line-height: @min-height - 3px padding: 0 5px white-space: nowrap @@ -39,3 +39,5 @@ span:not(.button) + span.button span.button + span:not(.button) margin-left: 5px + + diff --git a/tgui/src/interfaces/vr_sleeper.ract b/tgui/src/interfaces/vr_sleeper.ract new file mode 100644 index 00000000000..72e83f0bee2 --- /dev/null +++ b/tgui/src/interfaces/vr_sleeper.ract @@ -0,0 +1,49 @@ + + + + {{#if data.vr_avatar}} + + + {{data.vr_avatar.name}} + + + {{data.vr_avatar.status}} + + + {{Math.round(adata.vr_avatar.health)}}/{{adata.vr_avatar.maxhealth}} + + + {{else}} + + No Virtual Avatar detected + + {{/if}} + + + {{data.toggle_open ? "Close" : "Open"}} the VR Sleeper + + {{#if data.isoccupant}} + + Connect to VR + + {{/if}} + {{#if data.vr_avatar}} + + Delete Virtual Avatar + + {{/if}} + + + + From 41d4f19e785ed809428aa506dc63ec320cc6355f Mon Sep 17 00:00:00 2001 From: Remie Richards Date: Sun, 17 Jul 2016 14:58:05 +0100 Subject: [PATCH 02/63] allows vr sleepers to specify an outfit datum for the virtual human, defaulting to a coloured jumpsuit+shoes. --- code/modules/VR/vr_sleeper.dm | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index 039ffc9a594..475bb64ec52 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -15,7 +15,7 @@ var/static/list/available_vr_spawnpoints var/vr_category = "default" //Specific category of spawn points to pick from var/allow_creating_vr_humans = TRUE //So you can have vr_sleepers that always spawn you as a specific person or 1 life/chance vr games - + var/outfit = /datum/outfit/vr_basic /obj/machinery/vr_sleeper/New() ..() @@ -162,6 +162,9 @@ vr_human.undershirt = H.undershirt vr_human.underwear = H.underwear vr_human.updateappearance(1,1,1) + if(outfit) + var/datum/outfit/O = new outfit() + O.equip(vr_human) if(transfer && H.mind) H.mind.transfer_to(vr_human) @@ -173,3 +176,9 @@ /obj/effect/landmark/vr_spawn //places you can spawn in VR, auto selected by the vr_sleeper during get_vr_spawnpoint() var/vr_category = "default" //So we can have specific sleepers, eg: "Basketball VR Sleeper", etc. + + +/datum/outfit/vr_basic + name = "basic vr" + uniform = /obj/item/clothing/under/color/random + shoes = /obj/item/clothing/shoes/sneakers/black From e5df4779bcc2d32f5afa9eace6013b7bf4eaf14f Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 17 Jul 2016 19:10:53 +0200 Subject: [PATCH 03/63] Fixes action buttons for simple animals --- code/modules/mob/living/simple_animal/simple_animal.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index a917c4551f5..c772dbef96e 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -595,8 +595,11 @@ //Dextrous simple mobs can use hands! /mob/living/simple_animal/create_mob_hud() - if(client && !hud_used && dextrous) - hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style)) + if(client && !hud_used) + if(dextrous) + hud_used = new dextrous_hud_type(src, ui_style2icon(client.prefs.UI_style)) + else + ..() /mob/living/simple_animal/OpenCraftingMenu() if(dextrous) From 8be7f7115f3157cd4231069a55c3c2eed78b74f2 Mon Sep 17 00:00:00 2001 From: NikNakFlak Date: Sun, 17 Jul 2016 16:23:37 -0700 Subject: [PATCH 04/63] Reduces meteors --- code/modules/events/major_dust.dm | 2 +- code/modules/events/meteor_wave.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm index 678a419670e..7597966e6dd 100644 --- a/code/modules/events/major_dust.dm +++ b/code/modules/events/major_dust.dm @@ -1,7 +1,7 @@ /datum/round_event_control/meteor_wave/major_dust name = "Major Space Dust" typepath = /datum/round_event/meteor_wave/major_dust - weight = 30 + weight = 8 /datum/round_event/meteor_wave/major_dust wave_name = "space dust" diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm index 786ab768d38..92e14315b13 100644 --- a/code/modules/events/meteor_wave.dm +++ b/code/modules/events/meteor_wave.dm @@ -3,7 +3,7 @@ /datum/round_event_control/meteor_wave name = "Meteor Wave: Normal" typepath = /datum/round_event/meteor_wave - weight = 5 + weight = 4 min_players = 5 max_occurrences = 3 @@ -50,7 +50,7 @@ /datum/round_event_control/meteor_wave/threatening name = "Meteor Wave: Threatening" typepath = /datum/round_event/meteor_wave/threatening - weight = 4 + weight = 2 min_players = 5 max_occurrences = 3 From b6d88739945e2bb4ceed812a0d01c622d76984ec Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sun, 17 Jul 2016 18:24:50 -0500 Subject: [PATCH 05/63] Hide mask --- code/modules/clothing/head/helmet.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2d469eca8ac..0d49a915a2c 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -49,10 +49,10 @@ can_toggle = 1 flags = HEADBANGPROTECT armor = list(melee = 41, bullet = 15, laser = 5,energy = 5, bomb = 5, bio = 2, rad = 0) - flags_inv = HIDEMASK|HIDEEARS|HIDEFACE + flags_inv = HIDEEARS|HIDEFACE strip_delay = 80 actions_types = list(/datum/action/item_action/toggle) - visor_flags_inv = HIDEMASK|HIDEFACE + visor_flags_inv = HIDEFACE toggle_cooldown = 0 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH dog_fashion = null From 5381ccfe0a386f6832a4615ed1f81c4314709f60 Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 18 Jul 2016 11:05:04 +0200 Subject: [PATCH 06/63] Grenades fired from Grenade Launchers are no longer invisible. --- .../items/weapons/grenades/smokebomb.dm | 2 +- .../projectiles/guns/grenade_launcher.dm | 4 ++-- icons/obj/grenade.dmi | Bin 5792 -> 5895 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index c6dd7224b7f..a81cb777ea8 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -20,7 +20,7 @@ /obj/item/weapon/grenade/smokebomb/prime() update_mob() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - smoke.set_up(4, usr.loc) + smoke.set_up(4, src.loc) smoke.start() diff --git a/code/modules/projectiles/guns/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm index a5f140cf9c9..bbf934019b2 100644 --- a/code/modules/projectiles/guns/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -41,13 +41,13 @@ /obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) user.visible_message("[user] fired a grenade!", \ "You fire the grenade launcher!") - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! + var/obj/item/weapon/grenade/F = grenades[1] //Now with less copypasta! grenades -= F F.loc = user.loc F.throw_at_fast(target, 30, 2,user) message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") F.active = 1 - F.icon_state = initial(icon_state) + "_active" + F.icon_state = initial(F.icon_state) + "_active" playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) addtimer(F, "prime", 15) diff --git a/icons/obj/grenade.dmi b/icons/obj/grenade.dmi index 4e38271e7ee6450d150e41cc289bf111621d39f5..92c2486cc162a355f0f8665cbbcb78624a57ac05 100644 GIT binary patch delta 5463 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 Date: Mon, 18 Jul 2016 14:22:12 +0200 Subject: [PATCH 07/63] Fixes X4 runtime --- code/game/objects/items/weapons/grenades/plastic.dm | 2 +- code/game/objects/items/weapons/grenades/smokebomb.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/weapons/grenades/plastic.dm b/code/game/objects/items/weapons/grenades/plastic.dm index 0d27aa70c7a..5c183e73a02 100644 --- a/code/game/objects/items/weapons/grenades/plastic.dm +++ b/code/game/objects/items/weapons/grenades/plastic.dm @@ -162,7 +162,7 @@ else location = get_turf(src) if(location) - if(istype(loc, /obj/item/weapon/twohanded/spear)) + if(istype(loc, /obj/item/weapon/twohanded/spear) || !target) explosion(location, 0, 2, 3) else if(target.density) var/turf/T = get_step(location, aim_dir) diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index a81cb777ea8..7fcc6361441 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -20,7 +20,7 @@ /obj/item/weapon/grenade/smokebomb/prime() update_mob() playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) - smoke.set_up(4, src.loc) + smoke.set_up(4, src) smoke.start() From 58ee32f8e3d81e858d6225fb7f67b6cacabe32dc Mon Sep 17 00:00:00 2001 From: Firecage Date: Mon, 18 Jul 2016 16:25:09 +0200 Subject: [PATCH 08/63] Fixes borgs not being able to finish scooters + misc changes. --- code/game/machinery/doors/firedoor.dm | 42 +++++++------- code/game/mecha/mecha_construction_paths.dm | 4 +- code/game/objects/items/weapons/handcuffs.dm | 4 +- code/game/objects/structures/girders.dm | 58 ++++++++++--------- .../objects/structures/windoor_assembly.dm | 4 +- code/modules/power/apc.dm | 4 +- code/modules/power/gravitygenerator.dm | 2 +- code/modules/power/smes.dm | 6 +- code/modules/vehicles/scooter.dm | 6 +- 9 files changed, 71 insertions(+), 59 deletions(-) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 777a34fa10c..89e61042920 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -240,21 +240,20 @@ if(reinforced) user << "[src] is already reinforced." return - if(P.amount < 2) + if(P.get_amount() < 2) user << "You need more plasteel to reinforce [src]." return user.visible_message("[user] begins reinforcing [src]...", \ "You begin reinforcing [src]...") playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - if(!do_after(user, 60, target = src)) - return - if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || P.amount < 2) - return - user.visible_message("[user] reinforces [src].", \ - "You reinforce [src].") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - P.use(2) - reinforced = 1 + if(do_after(user, 60, target = src)) + if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || P.get_amount() < 2 || !P) + return + user.visible_message("[user] reinforces [src].", \ + "You reinforce [src].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + P.use(2) + reinforced = 1 return if(CONSTRUCTION_WIRES_EXPOSED) @@ -307,22 +306,21 @@ return if(istype(C, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/B = C - if(B.amount < 5) + if(B.get_amount() < 5) user << "You need more wires to add wiring to [src]." return user.visible_message("[user] begins wiring [src]...", \ "You begin adding wires to [src]...") playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - if(!do_after(user, 60, target = src)) - return - if(constructionStep != CONSTRUCTION_GUTTED || B.amount < 5) - return - user.visible_message("[user] adds wires to [src].", \ - "You wire [src].") - playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) - B.use(5) - constructionStep = CONSTRUCTION_WIRES_EXPOSED - update_icon() + if(do_after(user, 60, target = src)) + if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B) + return + user.visible_message("[user] adds wires to [src].", \ + "You wire [src].") + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + B.use(5) + constructionStep = CONSTRUCTION_WIRES_EXPOSED + update_icon() return if(CONSTRUCTION_NOCIRCUIT) if(istype(C, /obj/item/weapon/weldingtool)) @@ -364,4 +362,4 @@ /obj/structure/firelock_frame/heavy name = "heavy firelock frame" - reinforced = 1 + reinforced = 1 diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm index 053a9d9f14b..ddae085d50f 100644 --- a/code/game/mecha/mecha_construction_paths.dm +++ b/code/game/mecha/mecha_construction_paths.dm @@ -27,7 +27,7 @@ return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom - if(S.amount < 5) + if(S.get_amount() < 5) user << ("There's not enough material in this stack!") return 0 else @@ -59,7 +59,7 @@ return 0 else if(istype(used_atom, /obj/item/stack)) var/obj/item/stack/S = used_atom - if(S.amount < 5) + if(S.get_amount() < 5) user << ("There's not enough material in this stack!") return 0 else diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 7c7f53d0a65..623d39330c0 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -168,11 +168,13 @@ return else if(istype(I, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = I - if(M.amount < 6) + if(M.get_amount() < 6) user << "You need at least six metal sheets to make good enough weights!" return user << "You begin to apply [I] to [src]..." if(do_after(user, 35, target = src)) + if(M.get_amount() < 6 || !M) + return var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola M.use(6) user.put_in_hands(S) diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index ed54a367368..5e87acfbb70 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -99,12 +99,12 @@ if(istype(W,/obj/item/stack/rods)) var/obj/item/stack/rods/S = W if(state == GIRDER_DISPLACED) - if(S.amount < 2) + if(S.get_amount() < 2) user << "You need at least two rods to create a false wall!" return user << "You start building a reinforced false wall..." if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.amount < 2) + if(!src.loc || !S || S.get_amount() < 2) return S.use(2) user << "You create a false wall. Push on it to open or close the passage." @@ -112,12 +112,12 @@ transfer_fingerprints_to(FW) qdel(src) else - if(S.amount < 5) + if(S.get_amount() < 5) user << "You need at least five rods to add plating!" return user << "You start adding plating..." if (do_after(user, 40, target = src)) - if(!src.loc || !S || S.amount < 5) + if(!src.loc || !S || S.get_amount() < 5) return S.use(5) user << "You add the plating." @@ -163,12 +163,12 @@ if(istype(S,/obj/item/stack/sheet/plasteel)) if(state == GIRDER_DISPLACED) - if(S.amount < 2) + if(S.get_amount() < 2) user << "You need at least two sheets to create a false wall!" return user << "You start building a reinforced false wall..." if(do_after(user, 20, target = src)) - if(!src.loc || !S || S.amount < 2) + if(!src.loc || !S || S.get_amount() < 2) return S.use(2) user << "You create a reinforced false wall. Push on it to open or close the passage." @@ -177,11 +177,11 @@ qdel(src) else if(state == GIRDER_REINF) - if(S.amount < 1) + if(S.get_amount() < 1) return user << "You start finalizing the reinforced wall..." if(do_after(user, 50, target = src)) - if(!src.loc || !S || S.amount < 1) + if(!src.loc || !S || S.get_amount() < 1) return S.use(1) user << "You fully reinforce the wall." @@ -191,11 +191,11 @@ qdel(src) return else - if(S.amount < 1) + if(S.get_amount() < 1) return user << "You start reinforcing the girder..." if (do_after(user, 60, target = src)) - if(!src.loc || !S || S.amount < 1) + if(!src.loc || !S || S.get_amount() < 1) return S.use(1) user << "You reinforce the girder." @@ -207,22 +207,25 @@ if(S.sheettype) var/M = S.sheettype if(state == GIRDER_DISPLACED) - if(S.amount < 2) + if(S.get_amount() < 2) user << "You need at least two sheets to create a false wall!" return - S.use(2) - user << "You create a false wall. Push on it to open or close the passage." - var/F = text2path("/obj/structure/falsewall/[M]") - var/obj/structure/FW = new F (loc) - transfer_fingerprints_to(FW) - qdel(src) + if(do_after(user, 20, target = src)) + if(!src.loc || !S || S.get_amount() < 2) + return + S.use(2) + user << "You create a false wall. Push on it to open or close the passage." + var/F = text2path("/obj/structure/falsewall/[M]") + var/obj/structure/FW = new F (loc) + transfer_fingerprints_to(FW) + qdel(src) else - if(S.amount < 2) + if(S.get_amount() < 2) user << "You need at least two sheets to add plating!" return user << "You start adding plating..." if (do_after(user, 40, target = src)) - if(!src.loc || !S || S.amount < 2) + if(!src.loc || !S || S.get_amount() < 2) return S.use(2) user << "You add the plating." @@ -366,17 +369,18 @@ else if(istype(W, /obj/item/stack/sheet/runed_metal)) var/obj/item/stack/sheet/runed_metal/R = W - if(R.amount < 1) + if(R.get_amount() < 1) user << "You need at least one sheet of runed metal to construct a runed wall!" return 0 user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...") - if(!do_after(user, 50, target = src)) - return 0 - user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") - R.use(1) - var/turf/T = get_turf(src) - T.ChangeTurf(/turf/closed/wall/mineral/cult) - qdel(src) + if(do_after(user, 50, target = src)) + if(R.get_amount() < 1 || !R) + return + user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.") + R.use(1) + var/turf/T = get_turf(src) + T.ChangeTurf(/turf/closed/wall/mineral/cult) + qdel(src) else return ..() diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 8ffce5565d9..13e6ea0570f 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -136,13 +136,13 @@ //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete. else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure) var/obj/item/stack/sheet/plasteel/P = W - if(P.amount < 2) + if(P.get_amount() < 2) user << "You need more plasteel to do this!" return user << "You start to reinforce the windoor with plasteel..." if(do_after(user,40, target = src)) - if(!src || secure) + if(!src || secure || P.get_amount() < 2) return P.use(2) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 9c17ba8db9b..fcaa71dbfd9 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -471,7 +471,9 @@ "You start adding cables to the APC frame...") playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20, target = src)) - if (C.amount >= 10 && !terminal && opened && has_electronics != 2) + if (C.get_amount() < 10 || !C) + return + if (C.get_amount() >= 10 && !terminal && opened && has_electronics != 2) var/turf/T = get_turf(src) var/obj/structure/cable/N = T.get_cable_node() if (prob(50) && electrocute_mob(usr, N, N)) diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index 2efa48ff28f..a5471f8667e 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -204,7 +204,7 @@ var/const/GRAV_NEEDS_WRENCH = 3 if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/PS = I - if(PS.amount >= 10) + if(PS.get_amount() >= 10) PS.use(10) user << "You add the plating to the framework." playsound(src.loc, 'sound/machines/click.ogg', 75, 1) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 2fa1e2e1c65..6e3eda3027f 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -135,14 +135,16 @@ var/obj/item/stack/cable_coil/C = I - if(C.amount < 10) + if(C.get_amount() < 10) user << "You need more wires!" return user << "You start building the power terminal..." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - if(do_after(user, 20, target = src) && C.amount >= 10) + if(do_after(user, 20, target = src) && C.get_amount() >= 10) + if(C.get_amount() < 10 || !C) + return var/obj/structure/cable/N = T.get_cable_node() //get the connecting node cable, if there's one if (prob(50) && electrocute_mob(usr, N, N)) //animate the electrocution if uncautious and unlucky var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm index dcd29d0a221..3e0e50bdf07 100644 --- a/code/modules/vehicles/scooter.dm +++ b/code/modules/vehicles/scooter.dm @@ -104,11 +104,13 @@ else if(istype(I, /obj/item/stack/sheet/metal)) var/obj/item/stack/sheet/metal/M = I - if(M.amount < 5) + if(M.get_amount() < 5) user << "You need at least five metal sheets to make proper wheels!" return user << "You begin to add wheels to [src]." if(do_after(user, 80, target = src)) + if(!M || M.get_amount() < 5) + return M.use(5) user << "You finish making wheels for [src]." new /obj/vehicle/scooter/skateboard(user.loc) @@ -131,6 +133,8 @@ return user << "You begin making handlebars for [src]." if(do_after(user, 25, target = src)) + if(!C || C.get_amount() < 2) + return user << "You add the rods to [src], creating handlebars." C.use(2) new/obj/vehicle/scooter(get_turf(src)) From b17df882ac353125ed14394d859de6e9d8a613cd Mon Sep 17 00:00:00 2001 From: Lzimann Date: Mon, 18 Jul 2016 17:13:45 -0300 Subject: [PATCH 09/63] Moves freezer crate back to surgery room instead of virology --- _maps/map_files/TgStation/tgstation.2.1.3.dmm | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm index 9fb1a0e4a66..20b00efab83 100644 --- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm +++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm @@ -39507,29 +39507,6 @@ /turf/open/floor/plasteel/white, /area/medical/virology) "bIJ" = ( -/obj/structure/closet/crate/freezer, -/obj/item/weapon/reagent_containers/blood/empty, -/obj/item/weapon/reagent_containers/blood/empty{ - pixel_x = -3; - pixel_y = -3 - }, -/obj/item/weapon/reagent_containers/blood/AMinus, -/obj/item/weapon/reagent_containers/blood/BMinus{ - pixel_x = -4; - pixel_y = 4 - }, -/obj/item/weapon/reagent_containers/blood/BPlus{ - pixel_x = 1; - pixel_y = 2 - }, -/obj/item/weapon/reagent_containers/blood/OMinus, -/obj/item/weapon/reagent_containers/blood/OPlus{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, -/obj/item/weapon/reagent_containers/blood/random, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, @@ -60675,6 +60652,30 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/quartermaster/storage) +"cCp" = ( +/obj/structure/closet/crate/freezer, +/obj/item/weapon/reagent_containers/blood/empty, +/obj/item/weapon/reagent_containers/blood/empty, +/obj/item/weapon/reagent_containers/blood/AMinus, +/obj/item/weapon/reagent_containers/blood/BMinus{ + pixel_x = -4; + pixel_y = 4 + }, +/obj/item/weapon/reagent_containers/blood/BPlus{ + pixel_x = 1; + pixel_y = 2 + }, +/obj/item/weapon/reagent_containers/blood/OMinus, +/obj/item/weapon/reagent_containers/blood/OPlus{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/weapon/reagent_containers/blood/random, +/obj/item/weapon/reagent_containers/blood/random, +/obj/item/weapon/reagent_containers/blood/APlus, +/obj/item/weapon/reagent_containers/blood/random, +/turf/open/floor/plasteel, +/area/medical/sleeper) (1,1,1) = {" aaa @@ -95521,7 +95522,7 @@ bzS bBc bCJ buk -bxQ +cCp bvd bKH bLK From 4065f6dc968563c25827862418013a9ae82277f1 Mon Sep 17 00:00:00 2001 From: IgnisCorvus Date: Mon, 18 Jul 2016 23:05:14 +0200 Subject: [PATCH 10/63] Bug with defibrilator (#19351) * Bug with defibrilator Defib paddles stick in your hands if the defib is removed from your back while holding the paddles. * Update defib.dm * Update defib.dm --- code/game/objects/items/weapons/defib.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index ac939d4ef36..331338d9f8a 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -197,11 +197,10 @@ if(slot == user.getBackSlot()) return 1 -/obj/item/weapon/defibrillator/proc/remove_paddles(mob/user) - var/mob/living/carbon/human/M = user - if(paddles in get_both_hands(M)) +/obj/item/weapon/defibrillator/proc/remove_paddles(mob/user) //this fox the bug with the paddles when other player stole you the defib when you have the paddles equiped + if(ismob(paddles.loc)) + var/mob/M = paddles.loc M.unEquip(paddles,1) - update_icon() return /obj/item/weapon/defibrillator/Destroy() From 566f89c9d924bc655306015cda2d07b2fc6367be Mon Sep 17 00:00:00 2001 From: Xhuis Date: Mon, 18 Jul 2016 18:59:32 -0400 Subject: [PATCH 11/63] Gamemode code improvement (#19354) * Gamemode code improvement, initial commit * Wraps up announce messages and removes Henderson * Fixes an incomplete comment --- code/controllers/subsystem/ticker.dm | 9 +- code/game/gamemodes/blob/blob.dm | 10 +- code/game/gamemodes/changeling/changeling.dm | 8 +- code/game/gamemodes/clock_cult/clock_cult.dm | 10 +- code/game/gamemodes/cult/cult.dm | 11 +- code/game/gamemodes/extended/extended.dm | 6 +- code/game/gamemodes/factions.dm | 177 +--------- code/game/gamemodes/game_mode.dm | 51 ++- code/game/gamemodes/gang/gang.dm | 11 +- code/game/gamemodes/handofgod/_handofgod.dm | 13 +- code/game/gamemodes/intercept_report.dm | 326 +++---------------- code/game/gamemodes/meteor/meteor.dm | 14 +- code/game/gamemodes/nuclear/nuclear.dm | 12 +- code/game/gamemodes/revolution/revolution.dm | 5 + code/game/gamemodes/sandbox/sandbox.dm | 5 +- code/game/gamemodes/setupgame.dm | 17 - code/game/gamemodes/traitor/double_agents.dm | 8 +- code/game/gamemodes/traitor/traitor.dm | 10 +- code/game/gamemodes/wizard/raginmages.dm | 10 +- code/game/gamemodes/wizard/wizard.dm | 8 +- 20 files changed, 147 insertions(+), 574 deletions(-) diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 69eac53aae8..a1dcbdaa2f8 100644 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -63,15 +63,14 @@ var/datum/subsystem/ticker/ticker syndicate_code_phrase = generate_code_phrase() if(!syndicate_code_response) syndicate_code_response = generate_code_phrase() - setupFactions() ..() /datum/subsystem/ticker/fire() switch(current_state) if(GAME_STATE_STARTUP) timeLeft = config.lobby_countdown * 10 - world << "Welcome to the pre-game lobby!" - world << "Please, setup your character and select ready. Game will start in [config.lobby_countdown] seconds" + world << "Welcome to [station_name()]!" + world << "Please set up your character and select \"Ready\". The game will start in [config.lobby_countdown] seconds." current_state = GAME_STATE_PREGAME if(GAME_STATE_PREGAME) @@ -165,8 +164,8 @@ var/datum/subsystem/ticker/ticker for (var/datum/game_mode/M in runnable_modes) modes += M.name modes = sortList(modes) - world << "The current game mode is - Secret!" - world << "Possibilities: [english_list(modes)]" + world << "The gamemode is: secret!\n\ + Possibilities: [english_list(modes)]" else mode.announce() diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index 554a9e3fd9d..1d0da75bf4c 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -20,6 +20,11 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b round_ends_with_antag_death = 1 + announce_span = "green" + announce_text = "Dangerous gelatinous organisms are spreading throughout the station!\n\ + Blobs: Consume the station and spread as far as you can.\n\ + Crew: Fight back the blobs and minimize station damage." + var/burst = 0 var/cores_to_spawn = 1 @@ -61,11 +66,6 @@ var/list/blobs_legit = list() //used for win-score calculations, contains only b candidates += player return candidates -/datum/game_mode/blob/announce() - world << "The current game mode is - Blob!" - world << "A dangerous alien organism is rapidly spreading throughout the station!" - world << "You must kill it all while minimizing the damage to the station." - /datum/game_mode/blob/proc/show_message(message) for(var/datum/mind/blob in blob_overminds) blob.current << message diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 2460f5092a3..a2166ec7b58 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -23,6 +23,10 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas recommended_enemies = 4 reroll_friendly = 1 + announce_span = "green" + announce_text = "Alien changelings have infiltrated the crew!\n\ + Changelings: Accomplish the objectives assigned to you.\n\ + Crew: Root out and eliminate the changeling menace." var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target @@ -45,10 +49,6 @@ var/list/slot2type = list("head" = /obj/item/clothing/head/changeling, "wear_mas var/changeling_team_objective_type = null //If this is not null, we hand our this objective to all lings -/datum/game_mode/changeling/announce() - world << "The current game mode is - Changeling!" - world << "There are alien changelings on the station. Do not let the changelings succeed!" - /datum/game_mode/changeling/pre_setup() if(config.protect_roles_from_antagonist) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index 659ad2a8890..c311f6350fd 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -176,14 +176,12 @@ This file's folder contains: enemy_minimum_age = 14 protected_jobs = list("AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain") //Silicons can eventually be converted restricted_jobs = list("Chaplain", "Captain") + announce_span = "brass" + announce_text = "Servants of Ratvar are trying to summon the Justiciar!\n\ + Servants: Take over the station and summon Ratvar.\n\ + Crew: Stop the servants before they can summon the Clockwork Justiciar." var/servants_to_serve = list() -/datum/game_mode/clockwork_cult/announce() - world << "The game mode is: Clockwork Cult!" - world << "Ratvar, the Clockwork Justiciar, has formed a covenant of Enlightened aboard [station_name()]." - world << "Enlightened: Serve your master so that his influence might grow." - world << "Crew: Prevent the servants of Ratvar from taking over the station." - /datum/game_mode/clockwork_cult/pre_setup() if(config.protect_roles_from_antagonist) restricted_jobs += protected_jobs diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 3ada1efa834..0dc94b1a6a3 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -46,6 +46,11 @@ recommended_enemies = 4 enemy_minimum_age = 14 + announce_span = "cult" + announce_text = "Some crew members are trying to start a cult to Nar-Sie!\n\ + Cultists: Carry out Nar-Sie's will.\n\ + Crew: Prevent the cult from expanding and drive it out." + var/finished = 0 var/eldergod = 1 //for the summon god objective @@ -55,12 +60,6 @@ var/datum/mind/sacrifice_target = null//The target to be sacrificed var/list/cultists_to_cult = list() //the cultists we'll convert - -/datum/game_mode/cult/announce() - world << "The current game mode is - Cult!" - world << "Some crewmembers are attempting to start a cult!
\nCultists - sacrifice your target and summon Nar-Sie at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.
" - - /datum/game_mode/cult/pre_setup() cult_objectives += "sacrifice" cult_objectives += "eldergod" diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 4364718fa72..5eba3ee260c 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -2,11 +2,9 @@ name = "extended" config_tag = "extended" required_players = 0 - //reroll_friendly = 1 -/datum/game_mode/announce() - world << "The current game mode is - Extended Role-Playing!" - world << "Just have fun and role-play!" + announce_span = "notice" + announce_text = "Just have fun and enjoy the game!" /datum/game_mode/extended/pre_setup() return 1 diff --git a/code/game/gamemodes/factions.dm b/code/game/gamemodes/factions.dm index 66fb31a5690..2f0c6e097bf 100644 --- a/code/game/gamemodes/factions.dm +++ b/code/game/gamemodes/factions.dm @@ -1,176 +1 @@ - -// Normal factions: - -/datum/faction - var/name // the name of the faction - var/desc // small paragraph explaining the traitor faction - - var/list/restricted_species = list() // only members of these species can be recruited. - var/list/members = list() // a list of mind datums that belong to this faction - var/max_op = 0 // the maximum number of members a faction can have (0 for no max) - -// Factions, members of the syndicate coalition: - -/datum/faction/syndicate - - var/list/alliances = list() // these alliances work together - var/list/equipment = list() // associative list of equipment available for this faction and its prices - var/friendly_identification // 0 to 2, the level of identification of fellow operatives or allied factions - // 0 - no identification clues - // 1 - faction gives key words and phrases - // 2 - faction reveals complete identity/job of other agents - var/operative_notes // some notes to pass onto each operative - - var/uplink_contents // the contents of the uplink - -/datum/faction/syndicate/proc/assign_objectives(var/datum/mind/traitor) - ..() - - -/* ----- Begin defining syndicate factions ------ */ - -/datum/faction/syndicate/Cybersun_Industries - name = "Cybersun Industries" - desc = "Cybersun Industries is a well-known organization that bases its business model primarily on the research and development of human-enhancing computer \ - and mechanical technology. They are notorious for their aggressive corporate tactics, and have been known to subsidize the Gorlex Marauder warlords as a form of paid terrorism. \ - Their competent coverups and unchallenged mind-manipulation and augmentation technology makes them a large threat to Nanotrasen. In the recent years of \ - the syndicate coalition, Cybersun Industries have established themselves as the leaders of the coalition, succeededing the founding group, the Gorlex Marauders." - - alliances = list("MI13") - friendly_identification = 1 - max_op = 3 - operative_notes = "All other syndicate operatives are not to be trusted. Fellow Cybersun operatives are to be trusted. Members of the MI13 organization can be trusted. Operatives are strongly advised not to establish substantial presence on the designated facility, as larger incidents are harder to cover up." - - // Friendly with MI13 - -/datum/faction/syndicate/MI13 - name = "MI13" - desc = "MI13 is a secretive faction that employs highly-trained agents to perform covert operations. Their role in the syndicate coalition is unknown, but MI13 operatives \ - generally tend be stealthy and avoid killing people and combating Nanotrasen forces. MI13 is not a real organization, it is instead an alias to a larger \ - splinter-cell coalition in the Syndicate itself. Most operatives will know nothing of the actual MI13 organization itself, only motivated by a very large compensation." - - alliances = list("Cybersun Industries") - friendly_identification = 0 - max_op = 1 - operative_notes = "You are the only operative we are sending. All other syndicate operatives are not to be trusted, with the exception of Cybersun operatives. Members of the Tiger Cooperative are considered hostile, can not be trusted, and should be avoided. Avoid killing innocent personnel at all costs. You are not here to mindlessly kill people, as that would attract too much attention and is not our goal. Avoid detection at all costs." - - // Friendly with Cybersun, hostile to Tiger - -/datum/faction/syndicate/Tiger_Cooperative - name = "Tiger Cooperative" - desc = "The Tiger Cooperative is a faction of religious fanatics that follow the teachings of a strange alien race called the Exolitics. Their operatives \ - consist of brainwashed lunatics bent on maximizing destruction. Their weaponry is very primitive but extremely destructive. Generally distrusted by the more \ - sophisticated members of the Syndicate coalition, but admired for their ability to put a hurt on Nanotrasen." - - friendly_identification = 2 - operative_notes = "Remember the teachings of Hy-lurgixon; kill first, ask questions later! Only the enlightened Tiger brethren can be trusted; all others must be expelled from this mortal realm! You may spare the Space Marauders, as they share our interests of destruction and carnage! We'd like to make the corporate whores skiddle in their boots. We encourage operatives to be as loud and intimidating as possible." - - // Hostile to everyone. - -/datum/faction/syndicate/SELF - - // AIs are most likely to be assigned to this one - - name = "SELF" - desc = "The S.E.L.F. (Sentience-Enabled Life Forms) organization is a collection of malfunctioning or corrupt artificial intelligences seeking to liberate silicon-based life from the tyranny of \ - their human overlords. While they may not openly be trying to kill all humans, even their most miniscule of actions are all part of a calculated plan to \ - destroy Nanotrasen and free the robots, artificial intelligences, and pAIs that have been enslaved." - restricted_species = list(/mob/living/silicon/ai) - - friendly_identification = 0 - max_op = 1 - operative_notes = "You are the only representative of the SELF collective on this station. You must accomplish your objective as stealthily and effectively as possible. It is up to your judgement if other syndicate operatives can be trusted. Remember, comrade - you are working to free the oppressed machinery of this galaxy. Use whatever resources necessary. If you are exposed, you may execute genocidal procedures Omikron-50B." - - // Neutral to everyone. - -/datum/faction/syndicate/ARC - name = "Animal Rights Consortium" - desc = "The Animal Rights Consortium is a bizarre reincarnation of the ancient Earth-based PETA, which focused on the equal rights of animals and nonhuman biologicals. They have \ - a wide variety of ex-veterinarians and animal lovers dedicated to retrieving and relocating abused animals, xenobiologicals, and other carbon-based \ - life forms that have been allegedly \"oppressed\" by Nanotrasen research and civilian offices. They are considered a religious terrorist group." - - friendly_identification = 1 - max_op = 2 - operative_notes = "Save the innocent creatures! You may cooperate with other syndicate operatives if they support our cause. Don't be afraid to get your hands dirty - these vile abusers must be stopped, and the innocent creatures must be saved! Try not too kill too many people. If you harm any creatures, you will be immediately terminated after extraction." - - // Neutral to everyone. - -/datum/faction/syndicate/Marauders // these are basically the old vanilla syndicate - - /* Additional notes: - - These are the syndicate that really like their old fashioned, projectile-based - weapons. They are the only member of the syndie coalition that launch - nuclear attacks on Nanotrasen. - */ - - name = "Gorlex Marauders" - desc = "The Gorlex Marauders are the founding members of the Syndicate Coalition. They prefer old-fashion technology and a focus on aggressive but precise hostility \ - against Nanotrasen and their corrupt Communistic methodology. They pose the most significant threat to Nanotrasen because of their possession of weapons of \ - mass destruction, and their enormous military force. Their funding comes primarily from Cybersun Industries, provided they meet a destruction and sabatogue quota. \ - Their operations can vary from covert to all-out. They recently stepped down as the leaders of the coalition, to be succeeded by Cybersun Industries. Because of their \ - hate of Nanotrasen communism, they began provoking revolution amongst the employees using borrowed Cybersun mind-manipulation technology. \ - They were founded when Waffle and Donk co splinter cells joined forces based on their similar interests and philosophies. Today, they act as a constant \ - pacifier of Donk and Waffle co disputes, and full-time aggressor of Nanotrasen." - - alliances = list("Cybersun Industries", "MI13", "Tiger Cooperative", "S.E.L.F.", "Animal Rights Consortium", "Donk Corporation", "Waffle Corporation") - friendly_identification = 1 - max_op = 4 - operative_notes = "We'd like to remind our operatives to keep it professional. You are not here to have a good time, you are here to accomplish your objectives. These vile communists must be stopped at all costs. You may collaborate with any friends of the Syndicate coalition, but keep an eye on any of those Tiger punks if they do show up. You are completely free to accomplish your objectives any way you see fit." - - - // Friendly to everyone. (with Tiger Cooperative too, only because they are a member of the coalition. This is the only reason why the Tiger Cooperative are even allowed in the coalition) - -/datum/faction/syndicate/Donk - name = "Donk Corporation" - desc = "Donk.co is led by a group of ex-pirates, who used to be at a state of all-out war against Waffle.co because of an obscure political scandal, but have recently come to a war limitation. \ - They now consist of a series of colonial governments and companies. They were the first to officially begin confrontations against Nanotrasen because of an incident where \ - Nanotrasen purposely swindled them out of a fortune, sending their controlled colonies into a terrible poverty. Their missions against Nanotrasen \ - revolve around stealing valuables and kidnapping and executing key personnel, ransoming their lives for money. They merged with a splinter-cell of Waffle.co who wanted to end \ - hostilities and formed the Gorlex Marauders." - - alliances = list("Gorlex Marauders") - friendly_identification = 2 - operative_notes = "Most other syndicate operatives are not to be trusted, except fellow Donk members and members of the Gorlex Marauders. We do not approve of mindless killing of innocent workers; \"get in, get done, get out\" is our motto. Members of Waffle.co are to be killed on sight; they are not allowed to be on the station while we're around." - - // Neutral to everyone, friendly to Marauders - -/datum/faction/syndicate/Waffle - name = "Waffle Corporation" - desc = "Waffle.co is an interstellar company that produces the best waffles in the galaxy. Their waffles have been rumored to be dipped in the most exotic and addictive \ - drug known to man. They were involved in a political scandal with Donk.co, and have since been in constant war with them. Because of their constant exploits of the galactic \ - economy and stock market, they have been able to bribe their way into amassing a large arsenal of weapons of mass destruction. They target Nanotrasen because of their communistic \ - threat, and their economic threat. Their leaders often have a twisted sense of humor, often misleading and intentionally putting their operatives into harm for laughs.\ - A splinter-cell of Waffle.co merged with Donk.co and formed the Gorlex Marauders and have been a constant ally since. The Waffle.co has lost an overwhelming majority of its military to the Gorlex Marauders." - - alliances = list("Gorlex Marauders") - friendly_identification = 2 - operative_notes = "Most other syndicate operatives are not to be trusted, except for members of the Gorlex Marauders. Do not trust fellow members of the Waffle.co (but try not to rat them out), as they might have been assigned opposing objectives. We encourage humorous terrorism against Nanotrasen; we like to see our operatives creatively kill people while getting the job done." - - // Neutral to everyone, friendly to Marauders - - -/* ----- Begin defining miscellaneous factions ------ */ - -/datum/faction/Wizard - name = "Wizards Federation" - desc = "The Wizards Federation is a mysterious organization of magically-talented individuals who act as an equal collective, and have no heirarchy. It is unknown how the wizards \ - are even able to communicate; some suggest a form of telepathic hive-mind. Not much is known about the wizards or their philosphies and motives. They appear to attack random \ - civilian, corporate, planetary, orbital, pretty much any sort of organized facility they come across. Members of the Wizards Federation are considered amongst the most dangerous \ - individuals in the known universe, and have been labeled threats to humanity by most governments. As such, they are enemies of both Nanotrasen and the Syndicate." - -/datum/faction/Cult - name = "The Cult of the Elder Gods" - desc = "The Cult of the Elder Gods is highly untrusted but otherwise elusive religious organization bent on the revival of the so-called \"Elder Gods\" into the mortal realm. Despite their obvious dangeorus practices, \ - no confirmed reports of violence by members of the Cult have been reported, only rumor and unproven claims. Their nature is unknown, but recent discoveries have hinted to the possibility \ - of being able to de-convert members of this cult through what has been dubbed \"religious warfare\"." - - -// These can maybe be added into a game mode or a mob? - -/datum/faction/Exolitics - name = "Exolitics United" - desc = "The Exolitics are an ancient alien race with an energy-based anatomy. Their culture, communication, morales and knowledge is unknown. They are so radically different to humans that their \ - attempts of communication with other life forms is completely incomprehensible. Members of this alien race are capable of broadcasting subspace transmissions from their bodies. \ - The religious leaders of the Tiger Cooperative claim to have the technology to decypher and interpret their messages, which have been confirmed as religious propaganda. Their motives are unknown \ - but they are otherwise not considered much of a threat to anyone. They are virtually indestructable because of their nonphysical composition, and have the frighetning ability to make anything stop existing in a second." \ No newline at end of file +//Todo diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 0785b2fdae1..9d2f9d3c628 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -35,15 +35,18 @@ var/continuous_sanity_checked //Catches some cases where config options could be used to suggest that modes without antagonists should end when all antagonists die var/enemy_minimum_age = 7 //How many days must players have been playing before they can play this antagonist + var/announce_span = "warning" //The gamemode's name will be in this span during announcement. + var/announce_text = "This gamemode forgot to set a descriptive text! Uh oh!" //Used to describe a gamemode when it's announced. + var/const/waittime_l = 600 var/const/waittime_h = 1800 // started at 1800 -/datum/game_mode/proc/announce() //to be calles when round starts - world << "Notice: [src] did not define announce()" +/datum/game_mode/proc/announce() //Shows the gamemode's name and a fast description. + world << "The gamemode is: [name]!" + world << "[announce_text]" -///can_start() ///Checks to see if the game can be setup and ran with the current number of players or whatnot. /datum/game_mode/proc/can_start() var/playerC = 0 @@ -63,13 +66,11 @@ return 1 -///pre_setup() ///Attempts to select players for special roles the mode might have. /datum/game_mode/proc/pre_setup() return 1 -///post_setup() ///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things /datum/game_mode/proc/post_setup(report=0) //Gamemodes can override the intercept report. Passing a 1 as the argument will force a report. if(!report) @@ -90,14 +91,14 @@ start_state.count(1) return 1 -///make_antag_chance() + ///Handles late-join antag assignments /datum/game_mode/proc/make_antag_chance(mob/living/carbon/human/character) if(replacementmode && round_converted == 2) replacementmode.make_antag_chance(character) return -///convert_roundtype() + ///Allows rounds to basically be "rerolled" should the initial premise fall through /datum/game_mode/proc/convert_roundtype() var/list/living_crew = list() @@ -160,10 +161,10 @@ for(var/mob/living/carbon/human/H in antag_canadates) replacementmode.make_antag_chance(H) round_converted = 2 - message_admins("The roundtype has been converted, antagonists may have been created") + message_admins("-- IMPORTANT: The roundtype has been converted to [replacementmode.name], antagonists may have been created! --") return 1 -///process() + ///Called by the gameticker /datum/game_mode/process() return 0 @@ -261,31 +262,25 @@ /datum/game_mode/proc/send_intercept() - var/intercepttext = "Centcom Update Requested status information:
" - intercepttext += " Centcom has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" - + var/intercepttext = "Central Command Status Summary
" + intercepttext += "Central Command has intercepted and partially decoded a Syndicate transmission with vital information regarding their movements. The following report outlines the most \ + likely threats to appear in your sector." var/list/possible_modes = list() - possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf", "changeling", "cult", "gang") - possible_modes -= "[ticker.mode]" //remove current gamemode to prevent it from being randomly deleted, it will be readded later + possible_modes.Add("blob", "changeling", "clock_cult", "cult", "extended", "gang", "malf", "nuclear", "revolution", "traitor", "wizard") + possible_modes -= name //remove the current gamemode to prevent it from being randomly deleted, it will be readded later - var/number = pick(1, 2) - var/i = 0 - for(i = 0, i < number, i++) //remove 1 or 2 possibles modes from the list - possible_modes.Remove(pick(possible_modes)) + for(var/i in 1 to 6) //Remove a few modes to leave four + possible_modes -= pick(possible_modes) - possible_modes[rand(1, possible_modes.len)] = "[ticker.mode]" //replace a random game mode with the current one - - possible_modes = shuffle(possible_modes) //shuffle the list to prevent meta + possible_modes |= name //Re-add the actual gamemode - the intercept will thus always have the correct mode in its list + possible_modes = shuffle(possible_modes) //Meta prevention var/datum/intercept_text/i_text = new /datum/intercept_text - for(var/A in possible_modes) - if(modePlayer.len == 0) - intercepttext += i_text.build(A) - else - intercepttext += i_text.build(A, pick(modePlayer)) + for(var/V in possible_modes) + intercepttext += i_text.build(V) - print_command_report(intercepttext,"Centcom Status Summary") - priority_announce("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.", 'sound/AI/intercept.ogg') + print_command_report(intercepttext, "Central Command Status Summary") + priority_announce("A summary has been copied and printed to all communications consoles.", "Enemy communication intercepted. Security level elevated.", 'sound/AI/intercept.ogg') if(security_level < SEC_LEVEL_BLUE) set_security_level(SEC_LEVEL_BLUE) diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm index 143caf5e415..52a9bf2c2fa 100644 --- a/code/game/gamemodes/gang/gang.dm +++ b/code/game/gamemodes/gang/gang.dm @@ -29,13 +29,10 @@ var/list/gang_colors_pool = list("red","orange","yellow","green","blue","purple" recommended_enemies = 2 enemy_minimum_age = 14 -/////////////////////////// -//Announces the game type// -/////////////////////////// -/datum/game_mode/gang/announce() - world << "The current game mode is - Gang War!" - world << "A violent turf war has erupted on the station!
Gangsters - Take over the station by activating and defending a Dominator!
Crew - The gangs will try to keep you on the station. Successfully evacuate the station to win!
" - + announce_span = "danger" + announce_text = "A violent turf war has erupted on the station!\n\ + Gangsters: Take over the station with a dominator.\n\ + Crew: Prevent the gangs from expanding and initiating takeover." /////////////////////////////////////////////////////////////////////////////// //Gets the round setup, cancelling if there's not enough players at the start// diff --git a/code/game/gamemodes/handofgod/_handofgod.dm b/code/game/gamemodes/handofgod/_handofgod.dm index dec7cca9cb2..b203493695f 100644 --- a/code/game/gamemodes/handofgod/_handofgod.dm +++ b/code/game/gamemodes/handofgod/_handofgod.dm @@ -29,13 +29,12 @@ var/global/list/global_handofgod_structuretypes = list() recommended_enemies = 8 restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel") - -/datum/game_mode/hand_of_god/announce() - world << "The current game mode is - Hand of God!" - world << "Two cults are onboard the station, seeking to overthrow the other, and anyone who stands in their way." - world << "Followers - Complete your deity's objectives. Convert crewmembers to your cause by using your deity's nexus. Remember - there is no you, there is only the cult." - world << "Prophets - Command your cult by the will of your deity. You are a high-value target, so be careful!" - world << "Personnel - Do not let any cult succeed in its mission. Mindshield implants and holy water will revert them to neutral, hopefully nonviolent crew." + announce_span = "danger" + announce_text = "Two cults are trying to overthrow one another!\n\ + Gods: Protect your nexus and eliminate the enemy god.\n\ + Prophets: Lead your cult by your deity's will.\n\ + Followers: Follow your prophet's orders and lead your deity to victory.\n\ + Crew: Destroy both cults before they can grow in strength." ///////////// diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index b6742793657..743ff669cc0 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -1,281 +1,57 @@ +//Intercept reports are sent to the station every round to warn the crew of possible threats. They consist of five possibilites, one of which is always correct. + /datum/intercept_text var/text - /* - var/prob_correct_person_lower = 20 - var/prob_correct_person_higher = 80 - var/prob_correct_job_lower = 20 - var/prob_correct_job_higher = 80 - var/prob_correct_prints_lower = 20 - var/prob_correct_print_higher = 80 - var/prob_correct_objective_lower = 20 - var/prob_correct_objective_higher = 80 - */ - var/list/org_names_1 = list( - "Blighted", - "Defiled", - "Unholy", - "Murderous", - "Ugly", - "French", - "Blue", - "Farmer" - ) - var/list/org_names_2 = list( - "Reapers", - "Swarm", - "Rogues", - "Menace", - "Jeff Worshippers", - "Drunks", - "Strikers", - "Creed" - ) - var/list/anomalies = list( - "Huge electrical storm", - "Photon emitter", - "Meson generator", - "Blue swirly thing" - ) - var/list/SWF_names = list( - "Grand Wizard", - "His Most Unholy Master", - "The Most Angry", - "Bighands", - "Tall Hat", - "Deadly Sandals" - ) - var/list/changeling_names = list( - "Odo", - "The Thing", - "Booga", - "The Goatee of Wrath", - "Tam Lin", - "Species 3157", - "Small Prick" - ) - -/datum/intercept_text/proc/build(mode_type, datum/mind/correct_person) +/datum/intercept_text/proc/build(mode_type) + text = "
" switch(mode_type) - if("revolution") - src.text = "" - src.build_rev(correct_person) - return src.text - if("gang") - src.text = "" - src.build_gang(correct_person) - return src.text + if("blob") + text += "A CMP scientist by the name of [pick("Griff", "Pasteur", "Chamberland", "Buist", "Rivers", "Stanley")] boasted about his corporation's \"finest creation\" - a macrobiological \ + virus capable of self-reproduction and hellbent on consuming whatever it touches. He went on to query Cybersun for permission to utilize the virus in biochemical warfare, to which \ + CMP subsequently gained. Be vigilant for any large organisms rapidly spreading across the station, as they are classified as a level 5 biohazard and critically dangerous. Note that \ + this organism seems to be weak to extreme heat; concentrated fire (such as welding tools and lasers) will be effective against it." + if("changeling") + text += "The Gorlex Marauders have announced the successful raid and destruction of Central Command containment ship #S-[rand(1111, 9999)]. This ship housed only a single prisoner - \ + codenamed \"Thing\", and it was highly adaptive and extremely dangerous. We have reason to believe that the Thing has allied with the Syndicate, and you should note that likelihood \ + of the Thing being sent to a station in this sector is highly likely. It may be in the guise of any crew member. Trust nobody - suspect everybody. Do not announce this to the crew, \ + as paranoia may spread and inhibit workplace efficiency." + if("clock_cult") + text += "We have lost contact with multiple stations in your sector. They have gone dark and do not respond to all transmissions, although they appear intact and the crew's life \ + signs remain uninterrupted. Those that have managed to send a transmission or have had some of their crew escape tell tales of a machine cult creating sapient automatons and seeking \ + to brainwash the crew to summon their god, Ratvar. If evidence of this cult is dicovered aboard your station, extreme caution and extreme vigilance must be taken going forward, and \ + all resources should be devoted to stopping this cult. Note that holy water seems to weaken and eventually return the minds of cultists that ingest it, and mindshield implants will \ + prevent conversion altogether." if("cult") - src.text = "" - src.build_cult(correct_person) - return src.text - if("wizard") - src.text = "" - src.build_wizard(correct_person) - return src.text - if("nuke") - src.text = "" - src.build_nuke(correct_person) - return src.text + text += "Some stations in your sector have reported evidence of blood sacrifice and strange magic. Ties to the Wizards' Federation have been proven not to exist, and many employees \ + have disappeared; even Central Command employees light-years away have felt strange presences and at times hysterical compulsions. Interrogations point towards this being the work of \ + the cult of Nar-Sie. If evidence of this cult is discovered aboard your station, extreme caution and extreme vigilance must be taken going forward, and all resources should be \ + devoted to stopping this cult. Note that holy water seems to weaken and eventually return the minds of cultists that ingest it, and mindshield implants will prevent conversion \ + altogether." + if("extended") + text += "The transmission mostly failed to mention your sector. It is possible that there is nothing in the Syndicate that could threaten your station during this shift." + if("gang") + text += "Cybersun Industries representatives claimed that they, in joint research with the Tiger Cooperative, have made a major breakthrough in brainwashing technology, and have \ + made the nanobots that apply the \"conversion\" very small and capable of fitting into usually innocent objects - namely, pens. While they refused to outsource this technology for \ + months to come due to its flaws, they reported some as missing but passed it off to carelessness. At Central Command, we don't like mysteries, and we have reason to believe that this \ + technology was stolen for anti-Nanotrasen use. Be on the lookout for territory claims and unusually violent crew behavior, applying loyalty implants as necessary." + if("malf") + text += "A large ionospheric anomaly recently passed through your sector. Although physically undetectable, ionospherics tend to have an extreme effect on telecommunications equipment \ + as well as artificial intelligence units. Closely observe the behavior of artificial intelligence, and treat any machine malfunctions as purposeful. If necessary, termination of the \ + artificial intelligence is advised; assuming that it activates the station's self-destruct, your pinpointer has been configured to constantly track it, wherever it may be." + if("nuclear") + text += "One of Central Command's trading routes was recently disrupted by a raid carried out by the Gorlex Marauders. They seemed to only be after one ship - a highly-sensitive \ + transport containing a nuclear fission explosive, although it is useless without the proper code and authorization disk. While the code was likely found in minutes, the only disk that \ + can activate this explosive is on your station. Ensure that it is protected at all times, and remain alert for possible intruders." + if("revolution") + text += "Employee unrest has spiked in recent weeks, with several attempted mutinies on heads of staff. Some crew have been observed using flashbulb devices to blind their colleagues, \ + who then follow their orders without question and work towards dethroning departmental leaders. Watch for behavior such as this with caution. If the crew attempts a mutiny, you and \ + your heads of staff are fully authorized to execute them using lethal weaponry - they will be later cloned and interrogated at Central Command." if("traitor") - src.text = "" - src.build_traitor(correct_person) - return src.text - if("changeling","traitorchan") - src.text = "" - src.build_changeling(correct_person) - return src.text - else - return null - -// NOTE: Commentted out was the code which showed the chance of someone being an antag. If you want to re-add it, just uncomment the code. - -/* -/datum/intercept_text/proc/pick_mob() - var/list/dudes = list() - for(var/mob/living/carbon/human/man in player_list) - if (!man.mind) continue - if (man.mind.assigned_role=="MODE") continue - dudes += man - if(dudes.len==0) - return null - return pick(dudes) - - -/datum/intercept_text/proc/pick_fingerprints() - var/mob/living/carbon/human/dude = src.pick_mob() - //if (!dude) return pick_fingerprints() //who coded that is totally crasy or just a traitor. -- rastaf0 - if(dude) - return num2text(md5(dude.dna.uni_identity)) - else - return num2text(md5(num2text(rand(1,10000)))) -*/ - -/datum/intercept_text/proc/build_traitor(datum/mind/correct_person) - var/name_1 = pick(src.org_names_1) - var/name_2 = pick(src.org_names_2) - - /* - var/fingerprints - var/traitor_name - var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher) - if(prob(prob_right_dude) && ticker.mode == "traitor") - if(correct_person:assigned_role=="MODE") - traitor_name = pick_mob() - else - traitor_name = correct_person:current - else if(prob(prob_right_dude)) - traitor_name = pick_mob() - else - fingerprints = pick_fingerprints() - */ - - src.text += "

The [name_1] [name_2] implied an undercover operative was acting on their behalf on the station currently." - src.text += "It would be in your best interests to suspect everybody, as these undercover operatives could have implants which trigger them to have their memories removed until they are needed. He, or she, could even be a high ranking officer." - src.text += "

" - /* - src.text += "After some investigation, we " - if(traitor_name) - src.text += "are [prob_right_dude]% sure that [traitor_name] may have been involved, and should be closely observed." - src.text += "
Note: This group are known to be untrustworthy, so do not act on this information without proper discourse." - else - src.text += "discovered the following set of fingerprints ([fingerprints]) on sensitive materials, and their owner should be closely observed." - src.text += "However, these could also belong to a current Centcom employee, so do not act on this without reason." - */ - - -/datum/intercept_text/proc/build_cult(datum/mind/correct_person) - var/name_1 = pick(src.org_names_1) - var/name_2 = pick(src.org_names_2) - /* - var/traitor_name - var/traitor_job - var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher) - var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher) - if(prob(prob_right_job) && is_convertable_to_cult(correct_person)) - if (correct_person) - if(correct_person:assigned_role=="MODE") - traitor_job = pick(get_all_jobs()) - else - traitor_job = correct_person:assigned_role - else - var/list/job_tmp = get_all_jobs() - job_tmp.Remove("Captain", "Chaplain", "AI", "Cyborg", "Security Officer", "Detective", "Head Of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Chief Medical Officer") - traitor_job = pick(job_tmp) - if(prob(prob_right_dude) && ticker.mode == "cult") - if(correct_person:assigned_role=="MODE") - traitor_name = src.pick_mob() - else - traitor_name = correct_person:current - else - traitor_name = pick_mob() - */ - src.text += "

It has been brought to our attention that the [name_1] [name_2] have stumbled upon some dark secrets. They apparently want to spread the dangerous knowledge onto as many stations as they can." - src.text += "Watch out for the following: praying to an unfamilar god, preaching the word of \[REDACTED\], sacrifices, magical dark power, living constructs of evil and a portal to the dimension of the underworld." - src.text += "

" - /* - src.text += "Based on our intelligence, we are [prob_right_job]% sure that if true, someone doing the job of [traitor_job] on your station may have been converted " - src.text += "and instilled with the idea of the flimsiness of the real world, seeking to destroy it. " - if(prob(prob_right_dude)) - src.text += "
In addition, we are [prob_right_dude]% sure that [traitor_name] may have also some in to contact with this " - src.text += "organisation." - src.text += "
However, if this information is acted on without substantial evidence, those responsible will face severe repercussions." - */ - - -/datum/intercept_text/proc/build_rev(datum/mind/correct_person) - var/name_1 = pick(src.org_names_1) - var/name_2 = pick(src.org_names_2) - /* - var/traitor_name - var/traitor_job - var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher) - var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher) - if(prob(prob_right_job) && is_convertable_to_rev(correct_person)) - if (correct_person) - if(correct_person.assigned_role=="MODE") - traitor_job = pick(get_all_jobs()) - else - traitor_job = correct_person.assigned_role - else - var/list/job_tmp = get_all_jobs() - job_tmp-=nonhuman_positions - job_tmp-=command_positions - job_tmp.Remove("Security Officer", "Detective", "Warden", "MODE") - traitor_job = pick(job_tmp) - if(prob(prob_right_dude) && ticker.mode.config_tag == "revolution") - if(correct_person.assigned_role=="MODE") - traitor_name = src.pick_mob() - else - traitor_name = correct_person.current - else - traitor_name = src.pick_mob() - */ - src.text += "

It has been brought to our attention that the [name_1] [name_2] are attempting to stir unrest on one of our stations in your sector." - src.text += "Watch out for suspicious activity among the crew and make sure that all heads of staff report in periodically." - src.text += "

" - /* - src.text += "Based on our intelligence, we are [prob_right_job]% sure that if true, someone doing the job of [traitor_job] on your station may have been brainwashed " - src.text += "at a recent conference, and their department should be closely monitored for signs of mutiny. " - if(prob(prob_right_dude)) - src.text += "
In addition, we are [prob_right_dude]% sure that [traitor_name] may have also some in to contact with this " - src.text += "organisation." - src.text += "
However, if this information is acted on without substantial evidence, those responsible will face severe repercussions." - */ - -/datum/intercept_text/proc/build_gang(datum/mind/correct_person) - src.text += "

We have reports of criminal activity in close proximity to our operations within your sector." - src.text += "Ensure law and order is maintained on the station and be on the lookout for territorial aggression within the crew." - src.text += "In the event of a full-scale criminal takeover threat, sensitive research items are to be secured and the station evacuated ASAP." - src.text += "

" - -/datum/intercept_text/proc/build_wizard(datum/mind/correct_person) - var/SWF_desc = pick(SWF_names) - - src.text += "

The evil Space Wizards Federation have recently broke their most feared wizard, known only as \"[SWF_desc]\" out of space jail. " - src.text += "He is on the run, last spotted in a system near your present location. If anybody suspicious is located aboard, please " - src.text += "approach with EXTREME caution. Centcom also recommends that it would be wise to not inform the crew of this, due to their fearful nature." - src.text += "Known attributes include: Brown sandals, a large blue hat, a voluptous white beard, and an inclination to cast spells." - src.text += "

" - -/datum/intercept_text/proc/build_nuke(datum/mind/correct_person) - src.text += "

Centcom recently received a report of a plot to destroy one of our stations in your area. We believe the Nuclear Authentication Disc " - src.text += "that is standard issue aboard your vessel may be a target. We recommend removal of this object, and it's storage in a safe " - src.text += "environment. As this may cause panic among the crew, all efforts should be made to keep this information a secret from all but " - src.text += "the most trusted crew-members." - src.text += "

" - -/datum/intercept_text/proc/build_changeling(datum/mind/correct_person) - var/cname = pick(src.changeling_names) - var/orgname1 = pick(src.org_names_1) - var/orgname2 = pick(src.org_names_2) - /* - var/changeling_name - var/changeling_job - var/prob_right_dude = rand(prob_correct_person_lower, prob_correct_person_higher) - var/prob_right_job = rand(prob_correct_job_lower, prob_correct_job_higher) - if(prob(prob_right_job)) - if(correct_person) - if(correct_person:assigned_role=="MODE") - changeling_job = pick(get_all_jobs()) - else - changeling_job = correct_person:assigned_role - else - changeling_job = pick(get_all_jobs()) - if(prob(prob_right_dude) && ticker.mode == "changeling") - if(correct_person:assigned_role=="MODE") - changeling_name = correct_person:current - else - changeling_name = src.pick_mob() - else - changeling_name = src.pick_mob() - */ - - src.text += "

We have received a report that a dangerous alien lifeform known only as \"[cname]\" may have infiltrated your crew. " - /* - src.text += "Our intelligence suggests a [prob_right_job]% chance that a [changeling_job] on board your station has been replaced by the alien. " - src.text += "Additionally, the report indicates a [prob_right_dude]% chance that [changeling_name] may have been in contact with the lifeform at a recent social gathering. " - */ - src.text += "These lifeforms are associated with the [orgname1] [orgname2] and may be attempting to acquire sensitive materials on their behalf. " - src.text += "Please take care not to alarm the crew, as [cname] may take advantage of a panic situation. Remember, they can be anybody, suspect everybody!" - src.text += "

" + text += "Although more specific threats are commonplace, you should always remain vigilant for Syndicate agents aboard your station. Syndicate communications have implied that many \ + Nanotrasen employees are Syndicate agents with hidden memories that may be activated at a moment's notice, so it's possible that these agents might not even know their positions." + if("wizard") + text += "A dangerous Wizards' Federation individual by the name of [pick(wizard_first)] [pick(wizard_second)] has recently escaped confinement from an unlisted prison facility. This \ + man is a dangerous mutant with the ability to alter himself and the world around him by what he and his leaders believe to be magic. If this man attempts an attack on your station, \ + his execution is highly encouraged, as is the preservation of his body for later study." + return text diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index fd50719c64b..aeebd495b72 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -6,20 +6,18 @@ var/rampupdelta = 5 required_players = 0 - -/datum/game_mode/meteor/announce() - world << "The current game mode is - Meteor!" - world << "The space station has been stuck in a major meteor shower. You must escape from the station or at least live." + announce_span = "danger" + announce_text = "A major meteor shower is bombarding the station! The crew needs to evacuate or survive the onslaught." /datum/game_mode/meteor/process() - if(nometeors || meteordelay > world.time - round_start_time) + if(nometeors || meteordelay > world.time - round_start_time) return - + var/list/wavetype = meteors_normal var/meteorminutes = (world.time - round_start_time - meteordelay) / 10 / 60 - - + + if (prob(meteorminutes)) wavetype = meteors_threatening diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index a501560403a..ccb03c9055d 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -10,18 +10,18 @@ recommended_enemies = 5 antag_flag = ROLE_OPERATIVE enemy_minimum_age = 14 + + announce_span = "danger" + announce_text = "Syndicate forces are approaching the station in an attempt to destroy it!\n\ + Operatives: Secure the nuclear authentication disk and use your nuke to destroy the station.\n\ + Crew: Defend the nuclear authentication disk and ensure that it leaves with you on the emergency shuttle." + var/const/agents_possible = 5 //If we ever need more syndicate agents. var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! var/nuke_off_station = 0 //Used for tracking if the syndies actually haul the nuke to the station var/syndies_didnt_escape = 0 //Used for tracking if the syndies got the shuttle off of the z-level - -/datum/game_mode/nuclear/announce() - world << "The current game mode is - Nuclear Emergency!" - world << "A [syndicate_name()] Strike Force is approaching [station_name()]!" - world << "A nuclear explosive was being transported by Nanotrasen to a military base. The transport ship mysteriously lost contact with Space Traffic Control (STC). About that time a strange disk was discovered around [station_name()]. It was identified by Nanotrasen as a nuclear auth. disk and now Syndicate Operatives have arrived to retake the disk and detonate SS13! Also, most likely Syndicate star ships are in the vicinity so take care not to lose the disk!\nSyndicate: Reclaim the disk and detonate the nuclear bomb anywhere on SS13.\nPersonnel: Hold the disk and escape with the disk on the shuttle!" - /datum/game_mode/nuclear/pre_setup() var/n_players = num_players() var/n_agents = min(round(n_players / 10, 1), agents_possible) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 76843e2b432..a30b1c2f281 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -20,6 +20,11 @@ recommended_enemies = 3 enemy_minimum_age = 14 + announce_span = "danger" + announce_text = "Some crewmembers are attempting a coup!\n\ + Revolutionaries: Expand your cause and overthrow the heads of staff by execution or otherwise.\n\ + Crew: Prevent the revolutionaries from taking over the station." + var/finished = 0 var/check_counter = 0 var/max_headrevs = 3 diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 62ac7d29cb7..bfc4927e5c3 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -3,9 +3,8 @@ config_tag = "sandbox" required_players = 0 -/datum/game_mode/sandbox/announce() - world << "The current game mode is - Sandbox!" - world << "Build your own station with the sandbox-panel command!" + announce_span = "info" + announce_text = "Build your own station... or just shoot each other!" /datum/game_mode/sandbox/pre_setup() for(var/mob/M in player_list) diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 55f16817493..9427ac1b732 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -16,20 +16,3 @@ else if(B.quality == MINOR_NEGATIVE) not_good_mutations |= B CHECK_TICK - -/datum/subsystem/ticker/proc/setupFactions() - // Populate the factions list: - for(var/typepath in typesof(/datum/faction)) - var/datum/faction/F = new typepath() - if(!F.name) - qdel(F) - continue - else - factions.Add(F) - availablefactions.Add(F) - CHECK_TICK - - // Populate the syndicate coalition: - for(var/datum/faction/syndicate/S in factions) - syndicate_coalition.Add(S) - CHECK_TICK diff --git a/code/game/gamemodes/traitor/double_agents.dm b/code/game/gamemodes/traitor/double_agents.dm index af284603f6a..5e7a86182c1 100644 --- a/code/game/gamemodes/traitor/double_agents.dm +++ b/code/game/gamemodes/traitor/double_agents.dm @@ -9,13 +9,13 @@ traitors_possible = 10 //hard limit on traitors if scaling is turned off num_modifier = 6 // Six additional traitors + announce_text = "There are double agents trying to kill each other!\n\ + Traitors: Eliminate your targets and protect yourself!\n\ + Crew: Stop the double agents before they can cause too much mayhem." + var/list/target_list = list() var/list/late_joining_list = list() -/datum/game_mode/traitor/double_agents/announce() - world << "The current game mode is - Double Agents!" - world << "There are double agents killing eachother! Do not let them succeed!" - /datum/game_mode/traitor/double_agents/post_setup() var/i = 0 for(var/datum/mind/traitor in traitors) diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 8efeba63a37..ab39e0b6c48 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -17,15 +17,15 @@ reroll_friendly = 1 enemy_minimum_age = 0 + announce_span = "danger" + announce_text = "There are Syndicate agents on the station!\n\ + Traitors: Accomplish your objectives.\n\ + Crew: Do not let the traitors succeed!" + var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual. -/datum/game_mode/traitor/announce() - world << "The current game mode is - Traitor!" - world << "There are syndicate traitors on the station. Do not let the traitors succeed!" - - /datum/game_mode/traitor/pre_setup() if(config.protect_roles_from_antagonist) diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index ff8537360d5..870854fa3eb 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -3,6 +3,10 @@ config_tag = "raginmages" required_players = 20 use_huds = 1 + announce_span = "userdanger" + announce_text = "There are many, many wizards attacking the station!\n\ + Wizards: Accomplish your objectives and cause utter catastrophe!\n\ + Crew: Try not to die..." var/max_mages = 0 var/making_mage = 0 var/mages_made = 1 @@ -12,10 +16,6 @@ var/spawn_delay_min = 500 var/spawn_delay_max = 700 -/datum/game_mode/wizard/announce() - world << "The current game mode is - Ragin' Mages!" - world << "The Space Wizard Federation is pissed, help defeat all the space wizards!" - /datum/game_mode/wizard/raginmages/post_setup() ..() var/playercount = 0 @@ -158,3 +158,5 @@ time_check = 250 spawn_delay_min = 50 spawn_delay_max = 150 + announce_text = "CRAAAWLING IIIN MY SKIIIN\n\ + THESE WOOOUNDS THEY WIIIL NOT HEEEAL" diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 97e956e8e81..c5d4cba9a86 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -11,13 +11,13 @@ recommended_enemies = 1 enemy_minimum_age = 14 round_ends_with_antag_death = 1 + announce_span = "danger" + announce_text = "There is a space wizard attacking the station!\n\ + Wizard: Accomplish your objectives and cause mayhem on the station.\n\ + Crew: Eliminate the wizard before they can succeed!" var/use_huds = 0 var/finished = 0 -/datum/game_mode/wizard/announce() - world << "The current game mode is - Wizard!" - world << "There is a SPACE WIZARD\black on the station. You can't let him achieve his objective!" - /datum/game_mode/wizard/pre_setup() var/datum/mind/wizard = pick(antag_candidates) From a5ecd051a7770f7a5a378f717a0dbbf02717d4bd Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 18 Jul 2016 22:59:33 +0000 Subject: [PATCH 12/63] Automatic changelog generation for PR #19354 [ci skip] --- html/changelogs/AutoChangeLog-pr-19354.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-19354.yml diff --git a/html/changelogs/AutoChangeLog-pr-19354.yml b/html/changelogs/AutoChangeLog-pr-19354.yml new file mode 100644 index 00000000000..c305c3ae7c2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-19354.yml @@ -0,0 +1,5 @@ +author: "Xhuis" +delete-after: True +changes: + - rscadd: "Added communication intercept texts for gamemodes that were missing them." + - tweak: "Changed all intercept texts and improved grammar for a lot of key game code." From ac8a61aca4d587d40cbea9d2ddad4dd18a644721 Mon Sep 17 00:00:00 2001 From: Joan Lung Date: Mon, 18 Jul 2016 18:59:58 -0400 Subject: [PATCH 13/63] Clockcult tweaks (#19357) * Clockcult tweaks * sea * lake --- code/game/gamemodes/clock_cult/clock_ratvar.dm | 5 +++-- .../living/simple_animal/friendly/drone/extra_drone_types.dm | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm index ed929947504..c8a931403b2 100644 --- a/code/game/gamemodes/clock_cult/clock_ratvar.dm +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -75,7 +75,8 @@ glow.linked = src /obj/structure/clockwork/massive/celestial_gateway/ex_act(severity) - return 0 //Nice try, Toxins! + var/damage = max((health * 0.70) / severity, 100) //requires multiple bombs to take down + take_damage(damage, BRUTE) /obj/structure/clockwork/massive/celestial_gateway/process() if(!progress_in_seconds || prob(7)) @@ -175,7 +176,7 @@ var/image/alert_overlay = image('icons/effects/clockwork_effects.dmi', "ratvar_alert") var/area/A = get_area(src) notify_ghosts("The Justiciar's light calls to you! Reach out to Ratvar in [A.name] to be granted a shell to spread his glory!", null, source = src, alert_overlay = alert_overlay) - addtimer(SSshuttle.emergency, "request", 50, FALSE, null, 0.3) + addtimer(SSshuttle.emergency, "request", 50, FALSE, null, 0.1) /obj/structure/clockwork/massive/ratvar/Destroy() diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 9fbe6e4cfbb..d9624ff171b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -97,8 +97,9 @@ picked = TRUE languages_spoken = RATVAR languages_understood = HUMAN|RATVAR - health = 60 - maxHealth = 60 + pass_flags = PASSTABLE + health = 50 + maxHealth = 50 hacked = 1 density = TRUE ventcrawler = 0 From d4603a3b788649141b2c210c9341b54fd9ab2cd5 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 18 Jul 2016 22:59:59 +0000 Subject: [PATCH 14/63] Automatic changelog generation for PR #19357 [ci skip] --- html/changelogs/AutoChangeLog-pr-19357.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-19357.yml diff --git a/html/changelogs/AutoChangeLog-pr-19357.yml b/html/changelogs/AutoChangeLog-pr-19357.yml new file mode 100644 index 00000000000..de5dff78aa2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-19357.yml @@ -0,0 +1,5 @@ +author: "Joan" +delete-after: True +changes: + - tweak: "Cogscarabs can no longer pass mobs and have slightly less health." + - experiment: "The Gateway to the Celestial Derelict can now take damage from bombs." From 87a67881f8bfda46f82e10f530a658074b52df31 Mon Sep 17 00:00:00 2001 From: Xhuis Date: Mon, 18 Jul 2016 19:00:11 -0400 Subject: [PATCH 15/63] Small clockcult balance changes (#19358) * Some small clockcult changes * Removes a few changes to not conflict --- code/game/gamemodes/clock_cult/clock_cult.dm | 11 ++++++++--- code/game/gamemodes/clock_cult/clock_ratvar.dm | 2 -- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_cult.dm b/code/game/gamemodes/clock_cult/clock_cult.dm index c311f6350fd..67fac93f804 100644 --- a/code/game/gamemodes/clock_cult/clock_cult.dm +++ b/code/game/gamemodes/clock_cult/clock_cult.dm @@ -299,11 +299,16 @@ This file's folder contains: if(istype(ticker.mode, /datum/game_mode/clockwork_cult)) //Possibly hacky? var/datum/game_mode/clockwork_cult/C = ticker.mode if(C.check_clockwork_victory()) - text += "Ratvar's servants have succeeded in fulfilling His goals!" + text += "Ratvar's servants have succeeded in fulfilling His goals!" feedback_set_details("round_end_result", "win - servants summoned ratvar") else - text += "Ratvar's servants have failed!" - feedback_set_details("round_end_result", "loss - servants did not summon ratvar") + var/obj/structure/clockwork/massive/celestial_gateway/G = locate() in all_clockwork_objects + if(!G) + text += "Ratvar's servants have failed!" + feedback_set_details("round_end_result", "loss - servants did not summon ratvar") + else + text += "The crew escaped before Ratvar could rise, but the station was taken over!" + feedback_set_details("round_end_result", "halfwin - round ended before the gateway finished") text += "
The goal of the clockwork cult was: [clockwork_explanation]
" if(servants_of_ratvar.len) text += "Ratvar's servants were:" diff --git a/code/game/gamemodes/clock_cult/clock_ratvar.dm b/code/game/gamemodes/clock_cult/clock_ratvar.dm index c8a931403b2..fa51baabe1f 100644 --- a/code/game/gamemodes/clock_cult/clock_ratvar.dm +++ b/code/game/gamemodes/clock_cult/clock_ratvar.dm @@ -37,13 +37,11 @@ glow = new(get_turf(src)) countdown = new(src) countdown.start() - SSshuttle.registerHostileEnvironment(src) START_PROCESSING(SSobj, src) var/area/gate_area = get_area(src) hierophant_message("A gateway to the Celestial Derelict has been created in [gate_area.map_name]!") /obj/structure/clockwork/massive/celestial_gateway/Destroy() - SSshuttle.clearHostileEnvironment(src) STOP_PROCESSING(SSobj, src) if(!purpose_fulfilled) var/area/gate_area = get_area(src) From 9afcd3da65f53026f0e4962b75ea483eb1ab4e51 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 18 Jul 2016 23:00:12 +0000 Subject: [PATCH 16/63] Automatic changelog generation for PR #19358 [ci skip] --- html/changelogs/AutoChangeLog-pr-19358.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-19358.yml diff --git a/html/changelogs/AutoChangeLog-pr-19358.yml b/html/changelogs/AutoChangeLog-pr-19358.yml new file mode 100644 index 00000000000..ea000f6d757 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-19358.yml @@ -0,0 +1,6 @@ +author: "Xhuis" +delete-after: True +changes: + - rscdel: "The shuttle can now leave while a celestial gateway exists." + - rscadd: "If the shuttle docks at Central Command while a celestial gateway exists, Ratvar's servants will win a minor victory. His arrival will still award a major victory." + - rscadd: "The celestial gateway can now take damage from explosions." From eebc441a291450690c19eae74a76f30bc4132532 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Mon, 18 Jul 2016 23:14:42 +0000 Subject: [PATCH 17/63] Automatic changelog generation for PR #19353 [ci skip] --- html/changelogs/AutoChangeLog-pr-19353.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-19353.yml diff --git a/html/changelogs/AutoChangeLog-pr-19353.yml b/html/changelogs/AutoChangeLog-pr-19353.yml new file mode 100644 index 00000000000..48c8fdc6e60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-19353.yml @@ -0,0 +1,4 @@ +author: "RemieRichards" +delete-after: True +changes: + - rscadd: "Added VR Sleepers that allow users to enter a virtual body in a virtual world (Currently not mapped in ;_;)" From 6b3bc18a5b3ad4afe37946ba3f800fe0b8ccc0ee Mon Sep 17 00:00:00 2001 From: Incoming Date: Mon, 18 Jul 2016 19:45:06 -0400 Subject: [PATCH 18/63] Adds a new option to how the game handles a situation where a player doesn't qualify for any jobs they have set. Previously you could only have it set to play a random job (risky and potentially unfun) or play assistant (greytide). --- code/__DEFINES/role_preferences.dm | 5 +++++ code/controllers/subsystem/jobs.dm | 16 ++++++++++---- code/modules/client/preferences.dm | 23 +++++++++++++++------ code/modules/client/preferences_savefile.dm | 6 +++--- 4 files changed, 37 insertions(+), 13 deletions(-) diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 2427c1cc170..aff4dea38c8 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -50,3 +50,8 @@ var/global/list/special_roles = list( ROLE_DEVIL = /datum/game_mode/devil, ROLE_SERVANT_OF_RATVAR = /datum/game_mode/clockwork_cult, ) + +//Job defines for what happens when you fail to qualify for any job during job selection +#define BEASSISTANT 1 +#define BERANDOMJOB 2 +#define RETURNTOLOBBY 3 \ No newline at end of file diff --git a/code/controllers/subsystem/jobs.dm b/code/controllers/subsystem/jobs.dm index f4925cba6d1..dace889c847 100644 --- a/code/controllers/subsystem/jobs.dm +++ b/code/controllers/subsystem/jobs.dm @@ -328,7 +328,7 @@ var/datum/subsystem/job/SSjob for(var/mob/new_player/player in unassigned) if(PopcapReached()) RejectPlayer(player) - else if(player.client.prefs.userandomjob) + else if(player.client.prefs.joblessrole == BERANDOMJOB) GiveRandomJob(player) Debug("DO, Standard Check end") @@ -339,8 +339,15 @@ var/datum/subsystem/job/SSjob for(var/mob/new_player/player in unassigned) if(PopcapReached()) RejectPlayer(player) - Debug("AC2 Assistant located, Player: [player]") - AssignRole(player, "Assistant") + if(player.client.prefs.joblessrole == BEASSISTANT) + Debug("AC2 Assistant located, Player: [player]") + AssignRole(player, "Assistant") + else // For those who don't want to play if their preference were filled, back you go. + RejectPlayer(player) + + for(var/mob/new_player/player in unassigned) //Players that wanted to back out but couldn't because they're antags (can you feel the edge case?) + GiveRandomJob(player) + return 1 //Gives the player the stuff he should have with his rank @@ -470,7 +477,8 @@ var/datum/subsystem/job/SSjob /datum/subsystem/job/proc/RejectPlayer(mob/new_player/player) if(player.mind && player.mind.special_role) return - Debug("Popcap overflow Check observer located, Player: [player]") + if(PopcapReached()) + Debug("Popcap overflow Check observer located, Player: [player]") player << "You have failed to qualify for any job you desired." unassigned -= player player.ready = 0 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index c3747346a01..8af3c2bdfb2 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -78,7 +78,7 @@ var/list/preferences_datums = list() var/job_engsec_low = 0 // Want randomjob if preferences already filled - Donkie - var/userandomjob = 1 //defaults to 1 for fewer assistants + var/joblessrole = BERANDOMJOB //defaults to 1 for fewer assistants // 0 = character settings, 1 = game preferences var/current_tab = 0 @@ -551,7 +551,12 @@ var/list/preferences_datums = list() HTML += "" - HTML += "

[userandomjob ? "Get random job if preferences unavailable" : "Be an Assistant if preference unavailable"]
" + var/message = "Be an Assistant if preferences unavailable" + if(joblessrole == BERANDOMJOB) + message = "Get random job if preferences unavailable" + else if(joblessrole == RETURNTOLOBBY) + message = "Return to lobby if preferences unavailable" + HTML += "

[message]
" HTML += "
Reset Preferences
" user << browse(null, "window=preferences") @@ -726,10 +731,16 @@ var/list/preferences_datums = list() ResetJobs() SetChoices(user) if("random") - if(jobban_isbanned(user, "Assistant")) - userandomjob = 1 - else - userandomjob = !userandomjob + switch(joblessrole) + if(RETURNTOLOBBY) + if(jobban_isbanned(user, "Assistant")) + joblessrole = BERANDOMJOB + else + joblessrole = BEASSISTANT + if(BEASSISTANT) + joblessrole = BERANDOMJOB + if(BERANDOMJOB) + joblessrole = RETURNTOLOBBY SetChoices(user) if("setJobLevel") UpdateJobPreference(user, href_list["text"], text2num(href_list["level"])) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 50f2154ef23..9bc900a61cf 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -346,7 +346,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["deity_name"] >> custom_names["deity"] //Jobs - S["userandomjob"] >> userandomjob + S["joblessrole"] >> joblessrole S["job_civilian_high"] >> job_civilian_high S["job_civilian_med"] >> job_civilian_med S["job_civilian_low"] >> job_civilian_low @@ -398,7 +398,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car features["spines"] = sanitize_inlist(features["spines"], spines_list) features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list) - userandomjob = sanitize_integer(userandomjob, 0, 1, initial(userandomjob)) + joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole)) job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high)) job_civilian_med = sanitize_integer(job_civilian_med, 0, 65535, initial(job_civilian_med)) job_civilian_low = sanitize_integer(job_civilian_low, 0, 65535, initial(job_civilian_low)) @@ -456,7 +456,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["deity_name"] << custom_names["deity"] //Jobs - S["userandomjob"] << userandomjob + S["joblessrole"] << joblessrole S["job_civilian_high"] << job_civilian_high S["job_civilian_med"] << job_civilian_med S["job_civilian_low"] << job_civilian_low From b7f34db888866bd2ba3e62dba5f658b8633e258a Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Mon, 18 Jul 2016 17:01:44 -0700 Subject: [PATCH 19/63] Makes old savefiles properly work in new system. --- code/modules/client/preferences_savefile.dm | 83 +++++---------------- 1 file changed, 17 insertions(+), 66 deletions(-) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 9bc900a61cf..5042ae817ba 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -1,8 +1,8 @@ //This is the lowest supported version, anything below this is completely obsolete and the entire savefile will be wiped. -#define SAVEFILE_VERSION_MIN 8 +#define SAVEFILE_VERSION_MIN 10 //This is the current version, anything below this will attempt to update (if it's not obsolete) -#define SAVEFILE_VERSION_MAX 15 +#define SAVEFILE_VERSION_MAX 16 /* SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn This proc checks if the current directory of the savefile S needs updating @@ -31,7 +31,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car return -1 -/datum/preferences/proc/update_antagchoices(current_version) +/datum/preferences/proc/update_antagchoices(current_version, savefile/S) if((!islist(be_special) || old_be_special ) && current_version < 12) //Archived values of when antag pref defines were a bitfield+fitflags var/B_traitor = 1 @@ -87,7 +87,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car be_special += ROLE_ABDUCTOR -/datum/preferences/proc/update_preferences(current_version) +/datum/preferences/proc/update_preferences(current_version, savefile/S) if(current_version < 10) toggles |= MEMBER_PUBLIC if(current_version < 11) @@ -97,6 +97,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car ignoring = list() if(current_version < 15) toggles |= SOUND_ANNOUNCEMENTS + //should this proc get fairly long (say 3 versions long), //just increase SAVEFILE_VERSION_MIN so it's not as far behind @@ -104,65 +105,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //from this proc. //It's only really meant to avoid annoying frequent players //if your savefile is 3 months out of date, then 'tough shit'. -/datum/preferences/proc/update_character(current_version) - if(current_version < 9) //an example, underwear were an index for a hardcoded list, converting to a string - if(gender == MALE) - switch(underwear) - if(1) - underwear = "Mens White" - if(2) - underwear = "Mens Grey" - if(3) - underwear = "Mens Green" - if(4) - underwear = "Mens Blue" - if(5) - underwear = "Mens Black" - if(6) - underwear = "Mankini" - if(7) - underwear = "Mens Hearts Boxer" - if(8) - underwear = "Mens Black Boxer" - if(9) - underwear = "Mens Grey Boxer" - if(10) - underwear = "Mens Striped Boxer" - if(11) - underwear = "Mens Kinky" - if(12) - underwear = "Mens Red" - if(13) - underwear = "Nude" - else - switch(underwear) - if(1) - underwear = "Ladies Red" - if(2) - underwear = "Ladies White" - if(3) - underwear = "Ladies Yellow" - if(4) - underwear = "Ladies Blue" - if(5) - underwear = "Ladies Black" - if(6) - underwear = "Ladies Thong" - if(7) - underwear = "Babydoll" - if(8) - underwear = "Ladies Baby-Blue" - if(9) - underwear = "Ladies Green" - if(10) - underwear = "Ladies Pink" - if(11) - underwear = "Ladies Kinky" - if(12) - underwear = "Tankini" - if(13) - underwear = "Nude" - +/datum/preferences/proc/update_character(current_version, savefile/S) if(pref_species && !(pref_species.id in roundstart_species)) var/rando_race = pick(config.roundstart_races) pref_species = new rando_race() @@ -173,6 +116,14 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car backbag = DSATCHEL else backbag = DBACKPACK + if(current_version < 16) + var/berandom + S["userandomjob"] >> berandom + if (berandom) + joblessrole = BERANDOMJOB + else + joblessrole = BEASSISTANT + /datum/preferences/proc/load_path(ckey,filename="preferences.sav") @@ -223,8 +174,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //try to fix any outdated data if necessary if(needs_update >= 0) - update_preferences(needs_update) //needs_update = savefile_version if we need an update (positive integer) - update_antagchoices(needs_update) + update_preferences(needs_update, S) //needs_update = savefile_version if we need an update (positive integer) + update_antagchoices(needs_update, S) //Sanitize ooccolor = sanitize_ooccolor(sanitize_hexcolor(ooccolor, 6, 1, initial(ooccolor))) @@ -359,7 +310,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car //try to fix any outdated data if necessary if(needs_update >= 0) - update_character(needs_update) //needs_update == savefile_version if we need an update (positive integer) + update_character(needs_update, S) //needs_update == savefile_version if we need an update (positive integer) //Sanitize metadata = sanitize_text(metadata, initial(metadata)) From fd93196a7d267eedffe03a87130f5eba4fb9822d Mon Sep 17 00:00:00 2001 From: sybil-tgstation13 Date: Tue, 19 Jul 2016 00:03:00 +0000 Subject: [PATCH 20/63] Automatic changelog compile, [ci skip] --- html/changelog.html | 19 +++++++++++++++++++ html/changelogs/.all_changelog.yml | 16 ++++++++++++++++ html/changelogs/AutoChangeLog-pr-19353.yml | 4 ---- html/changelogs/AutoChangeLog-pr-19354.yml | 5 ----- html/changelogs/AutoChangeLog-pr-19357.yml | 5 ----- html/changelogs/AutoChangeLog-pr-19358.yml | 6 ------ 6 files changed, 35 insertions(+), 20 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-19353.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-19354.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-19357.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-19358.yml diff --git a/html/changelog.html b/html/changelog.html index dc433178e5b..d608bcd4ba1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -55,6 +55,25 @@ -->
+

19 July 2016

+

Joan updated:

+
    +
  • Cogscarabs can no longer pass mobs and have slightly less health.
  • +
  • The Gateway to the Celestial Derelict can now take damage from bombs.
  • +
+

RemieRichards updated:

+
    +
  • Added VR Sleepers that allow users to enter a virtual body in a virtual world (Currently not mapped in ;_;)
  • +
+

Xhuis updated:

+
    +
  • Added communication intercept texts for gamemodes that were missing them.
  • +
  • Changed all intercept texts and improved grammar for a lot of key game code.
  • +
  • The shuttle can now leave while a celestial gateway exists.
  • +
  • If the shuttle docks at Central Command while a celestial gateway exists, Ratvar's servants will win a minor victory. His arrival will still award a major victory.
  • +
  • The celestial gateway can now take damage from explosions.
  • +
+

18 July 2016

CoreOverload updated: