From 2b648112bd4960b2aca15b64e8d4394ed0e38b68 Mon Sep 17 00:00:00 2001 From: AnturK Date: Mon, 4 Sep 2017 15:26:02 +0200 Subject: [PATCH 01/79] Copypaste is bad. --- code/modules/mob/living/simple_animal/parrot.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 7418f16169200..e6de6a6c49385 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -295,7 +295,7 @@ else parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! drop_held_item(0) - if(!stat && M.a_intent == INTENT_HELP) + if(stat != DEAD && M.a_intent == INTENT_HELP) handle_automated_speech(1) //assured speak/emote return @@ -944,7 +944,7 @@ speech_buffer = list() /mob/living/simple_animal/parrot/Poly/proc/Write_Memory() - var/json_file = file("data/npc_saves/Punpun.json") + var/json_file = file("data/npc_saves/Poly.json") var/list/file_data = list() if(islist(speech_buffer)) file_data["phrases"] = speech_buffer From 749e27f605e5de9c4126b78fd326eef94e0efb78 Mon Sep 17 00:00:00 2001 From: vuonojenmustaturska Date: Tue, 5 Sep 2017 03:33:29 +0300 Subject: [PATCH 02/79] TGUI interfaces to various smartfridges of different kinds, drying racks and the disk compartmentalizer --- .../kitchen_machinery/smartfridge.dm | 143 +++++++++--------- tgui/assets/tgui.css | 2 +- tgui/assets/tgui.js | 32 ++-- tgui/src/interfaces/smartvend.ract | 48 ++++++ 4 files changed, 136 insertions(+), 89 deletions(-) create mode 100644 tgui/src/interfaces/smartvend.ract diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index e996429939d0e..735fc964c8b58 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -142,69 +142,55 @@ user.set_machine(src) interact(user) -/******************* -* SmartFridge Menu -********************/ -/obj/machinery/smartfridge/interact(mob/user) - if(stat) - return FALSE - var/dat = "Select an item:
" +/obj/machinery/smartfridge/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "smartvend", name, 440, 550, master_ui, state) + ui.open() - if (contents.len == 0) - dat += "No product loaded!" - else - var/listofitems = list() - for (var/atom/movable/O in contents) - if (listofitems[O.name]) - listofitems[O.name]++ - else - listofitems[O.name] = 1 - sortList(listofitems) - - for (var/O in listofitems) - if(listofitems[O] <= 0) - continue - var/N = listofitems[O] - var/itemName = url_encode(O) - dat += "[capitalize(O)]:" - dat += " [N] " - dat += "Vend " - if(N > 5) - dat += "(x5)" - if(N > 10) - dat += "(x10)" - if(N > 25) - dat += "(x25)" - if(N > 1) - dat += "(All)" - - dat += "
" - - dat += "
" - user << browse("[src] supplies[dat]", "window=smartfridge") - onclose(user, "smartfridge") - return dat - -/obj/machinery/smartfridge/Topic(var/href, var/list/href_list) - if(..()) - return - usr.set_machine(src) +/obj/machinery/smartfridge/ui_data(mob/user) + . = list() - var/N = href_list["vend"] - var/amount = text2num(href_list["amount"]) + var/listofitems = list() + for (var/I in src) + var/atom/movable/O = I + if (listofitems[O.name]) + listofitems[O.name]["amount"]++ + else + listofitems[O.name] = list("name" = O.name, "type" = O.type, "amount" = 1) + sortList(listofitems) - var/i = amount - for(var/obj/O in contents) - if(i <= 0) - break - if(O.name == N) - O.loc = src.loc - i-- + .["contents"] = listofitems + .["name"] = name + .["isdryer"] = FALSE - updateUsrDialog() +/obj/machinery/smartfridge/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("Release") + var/desired = 0 + + if (params["amount"]) + desired = text2num(params["amount"]) + else + desired = input("How many items?", "How many items would you like to take out?", 1) as null|num + + if(QDELETED(src) || QDELETED(usr) || !usr.Adjacent(src)) // Sanity checkin' in case stupid stuff happens while we wait for input() + return FALSE + + for(var/obj/item/O in src) + if(desired <= 0) + break + if(O.name == params["name"]) + O.forceMove(drop_location()) + desired-- + return TRUE + return FALSE // ---------------------------- @@ -215,9 +201,7 @@ desc = "A wooden contraption, used to dry plant products, food and leather." icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "drying_rack_on" - use_power = IDLE_POWER_USE - idle_power_usage = 5 - active_power_usage = 200 + use_power = NO_POWER_USE icon_on = "drying_rack_on" icon_off = "drying_rack" var/drying = FALSE @@ -240,20 +224,35 @@ /obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/crowbar/C, ignore_panel = 1) ..() -/obj/machinery/smartfridge/drying_rack/interact(mob/user) - var/dat = ..() - if(dat) - dat += "
" - dat += "Toggle Drying " - user << browse("[src] supplies[dat]", "window=smartfridge") - onclose(user, "smartfridge") +/obj/machinery/smartfridge/drying_rack/ui_data(mob/user) + . = list() -/obj/machinery/smartfridge/drying_rack/Topic(href, list/href_list) - ..() - if(href_list["dry"]) - toggle_drying(FALSE) - updateUsrDialog() - update_icon() + var/listofitems = list() + for (var/I in src) + var/atom/movable/O = I + + if (listofitems[O.name]) + listofitems[O.name]["amount"]++ + else + listofitems[O.name] = list("name" = O.name, "type" = O.type, "amount" = 1) + sortList(listofitems) + + .["contents"] = listofitems + .["name"] = name + .["isdryer"] = TRUE + .["verb"] = "Take" + .["drying"] = drying + + +/obj/machinery/smartfridge/drying_rack/ui_act(action, params) + . = ..() + if(.) + return + switch(action) + if("Dry") + toggle_drying(FALSE) + return TRUE + return FALSE /obj/machinery/smartfridge/drying_rack/power_change() if(powered() && anchored) diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index f19852971d721..ffe61666b99ee 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.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffb18b25',endColorstr='#ff5f380e',GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork 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 #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input::-moz-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork 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 #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,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.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork 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.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right: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.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.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.gridable.center{text-align:center;width:75px}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.tabular{padding:0;margin:0}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.number{width:35px}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 .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,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 section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}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.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.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.gridable.center{text-align:center;width:75px}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.tabular{padding:0;margin:0}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.number{width:35px}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 .cell,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 section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}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.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork 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 #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input::-webkit-input-placeholder{color:#999}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork 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 #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,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.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){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.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right: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.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.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.gridable.center{text-align:center;width:75px}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.tabular{padding:0;margin:0}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.number{width:35px}body.nanotrasen input::-webkit-input-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 .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,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(2n){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 section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}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.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.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.gridable.center{text-align:center;width:75px}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.tabular{padding:0;margin:0}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.number{width:35px}body.syndicate input::-webkit-input-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 .cell,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(2n){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 section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}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 d7a72c7d2adf4..f6d706373d6ea 100644 --- a/tgui/assets/tgui.js +++ b/tgui/assets/tgui.js @@ -1,16 +1,16 @@ -require=function t(e,n,a){function r(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 p=Error("Cannot find module '"+o+"'");throw p.code="MODULE_NOT_FOUND",p}var c=n[o]={exports:{}};e[o][0].call(c.exports,function(t){var n=e[o][1][t];return r(n?n:t)},c,c.exports,t,e,n,a)}return n[o].exports}for(var i="function"==typeof require&&require,o=0;o2?p[2]:void 0,l=Math.min((void 0===c?o:r(c,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 a=t(80),r=t(76),i=t(79);e.exports=[].fill||function(t){for(var e=a(this),n=i(e.length),o=arguments,s=o.length,u=r(s>1?o[1]:void 0,n),p=s>2?o[2]:void 0,c=void 0===p?n:r(p,n);c>u;)e[u++]=t;return e}},{76:76,79:79,80:80}],7:[function(t,e,n){var a=t(78),r=t(79),i=t(76);e.exports=function(t){return function(e,n,o){var s,u=a(e),p=r(u.length),c=i(o,p);if(t&&n!=n){for(;p>c;)if(s=u[c++],s!=s)return!0}else for(;p>c;c++)if((t||c in u)&&u[c]===n)return t||c;return!t&&-1}}},{76:76,78:78,79:79}],8:[function(t,e,n){var a=t(17),r=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,p=4==t,c=6==t,l=5==t||c;return function(f,d,h){for(var m,v,g=i(f),b=r(g),y=a(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(p)return!1;return c?-1:u||p?p:w}}},{17:17,34:34,79:79,80:80,9:9}],9:[function(t,e,n){var a=t(38),r=t(36),i=t(83)("species");e.exports=function(t,e){var n;return r(t)&&(n=t.constructor,"function"!=typeof n||n!==Array&&!r(n.prototype)||(n=void 0),a(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 a=t(11),r=t(83)("toStringTag"),i="Arguments"==a(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))[r])?n:i?a(e):"Object"==(o=a(e))&&"function"==typeof e.callee?"Arguments":o}},{11:11,83:83}],11:[function(t,e,n){var a={}.toString;e.exports=function(t){return a.call(t).slice(8,-1)}},{}],12:[function(t,e,n){"use strict";var a=t(46),r=t(31),i=t(60),o=t(17),s=t(69),u=t(18),p=t(27),c=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";r(t,f,++y)}return"O"+t[f]},_=function(t,e){var n,a=x(e);if("F"!==a)return t._i[a];for(n=t._f;n;n=n.n)if(n.k==e)return n};e.exports={getConstructor:function(t,e,n,r){var c=t(function(t,i){s(t,c,e),t._i=a.create(null),t._f=void 0,t._l=void 0,t[b]=0,void 0!=i&&p(i,n,t[r],t)});return i(c.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 a=n.n,r=n.p;delete e._i[n.i],n.r=!0,r&&(r.n=a),a&&(a.p=r),e._f==n&&(e._f=a),e._l==n&&(e._l=r),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&&a.setDesc(c.prototype,"size",{get:function(){return u(this[b])}}),c},def:function(t,e,n){var a,r,i=_(t,e);return i?i.v=n:(t._l=i={i:r=x(e,!0),k:e,v:n,p:a=t._l,n:void 0,r:!1},t._f||(t._f=i),a&&(a.n=i),t[b]++,"F"!==r&&(t._i[r]=i)),t},getEntry:_,setStrong:function(t,e,n){c(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 a=t(27),r=t(10);e.exports=function(t){return function(){if(r(this)!=t)throw TypeError(t+"#toJSON isn't generic");var e=[];return a(this,!1,e.push,e),e}}},{10:10,27:27}],14:[function(t,e,n){"use strict";var a=t(31),r=t(60),i=t(4),o=t(38),s=t(69),u=t(27),p=t(8),c=t(30),l=t(82)("weak"),f=Object.isExtensible||o,d=p(5),h=p(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,a){var i=t(function(t,r){s(t,i,e),t._i=m++,t._l=void 0,void 0!=r&&u(r,n,t[a],t)});return r(i.prototype,{"delete":function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i)&&delete t[l][this._i]:v(this)["delete"](t):!1},has:function(t){return o(t)?f(t)?c(t,l)&&c(t[l],this._i):v(this).has(t):!1}}),i},def:function(t,e,n){return f(i(e))?(c(e,l)||a(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 a=t(29),r=t(22),i=t(61),o=t(60),s=t(27),u=t(69),p=t(38),c=t(24),l=t(43),f=t(66);e.exports=function(t,e,n,d,h,m){var v=a[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&&!p(t)?!1:e.call(this,0===t?0:t)}:"has"==t?function(t){return m&&!p(t)?!1:e.call(this,0===t?0:t)}:"get"==t?function(t){return m&&!p(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&&!c(function(){(new g).entries().next()}))){var w,k=new g,E=k[b](m?{}:-0,1)!=k,S=c(function(){k.has(1)}),C=l(function(t){new g(t)});C||(g=e(function(e,n){u(e,g,t);var a=new v;return void 0!=n&&s(n,h,a[b],a),a}),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,r(r.G+r.W+r.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 a=e.exports={version:"1.2.6"};"number"==typeof __e&&(__e=a)},{}],17:[function(t,e,n){var a=t(2);e.exports=function(t,e,n){if(a(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,a){return t.call(e,n,a)};case 3:return function(n,a,r){return t.call(e,n,a,r)}}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 a=t(38),r=t(29).document,i=a(r)&&a(r.createElement);e.exports=function(t){return i?r.createElement(t):{}}},{29:29,38:38}],21:[function(t,e,n){var a=t(46);e.exports=function(t){var e=a.getKeys(t),n=a.getSymbols;if(n)for(var r,i=n(t),o=a.isEnum,s=0;i.length>s;)o.call(t,r=i[s++])&&e.push(r);return e}},{46:46}],22:[function(t,e,n){var a=t(29),r=t(16),i=t(31),o=t(61),s=t(17),u="prototype",p=function(t,e,n){var c,l,f,d,h=t&p.F,m=t&p.G,v=t&p.S,g=t&p.P,b=t&p.B,y=m?a:v?a[e]||(a[e]={}):(a[e]||{})[u],x=m?r:r[e]||(r[e]={}),_=x[u]||(x[u]={});m&&(n=e);for(c in n)l=!h&&y&&c in y,f=(l?y:n)[c],d=b&&l?s(f,a):g&&"function"==typeof f?s(Function.call,f):f,y&&!l&&o(y,c,f),x[c]!=f&&i(x,c,d),g&&_[c]!=f&&(_[c]=f)};a.core=r,p.F=1,p.G=2,p.S=4,p.P=8,p.B=16,p.W=32,e.exports=p},{16:16,17:17,29:29,31:31,61:61}],23:[function(t,e,n){var a=t(83)("match");e.exports=function(t){var e=/./;try{"/./"[t](e)}catch(n){try{return e[a]=!1,!"/./"[t](e)}catch(r){}}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 a=t(31),r=t(61),i=t(24),o=t(18),s=t(83);e.exports=function(t,e,n){var u=s(t),p=""[t];i(function(){var e={};return e[u]=function(){return 7},7!=""[t](e)})&&(r(String.prototype,t,n(o,u,p)),a(RegExp.prototype,u,2==e?function(t,e){return p.call(t,this,e)}:function(t){return p.call(t,this)}))}},{18:18,24:24,31:31,61:61,83:83}],26:[function(t,e,n){"use strict";var a=t(4);e.exports=function(){var t=a(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 a=t(17),r=t(40),i=t(35),o=t(4),s=t(79),u=t(84);e.exports=function(t,e,n,p){var c,l,f,d=u(t),h=a(n,p,e?2:1),m=0;if("function"!=typeof d)throw TypeError(t+" is not iterable!");if(i(d))for(c=s(t.length);c>m;m++)e?h(o(l=t[m])[0],l[1]):h(t[m]);else for(f=d.call(t);!(l=f.next()).done;)r(f,h,l.value,e)}},{17:17,35:35,4:4,40:40,79:79,84:84}],28:[function(t,e,n){var a=t(78),r=t(46).getNames,i={}.toString,o="object"==typeof window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(t){try{return r(t)}catch(e){return o.slice()}};e.exports.get=function(t){return o&&"[object Window]"==i.call(t)?s(t):r(a(t))}},{46:46,78:78}],29:[function(t,e,n){var a=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=a)},{}],30:[function(t,e,n){var a={}.hasOwnProperty;e.exports=function(t,e){return a.call(t,e)}},{}],31:[function(t,e,n){var a=t(46),r=t(59);e.exports=t(19)?function(t,e,n){return a.setDesc(t,e,r(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 a=void 0===n;switch(e.length){case 0:return a?t():t.call(n);case 1:return a?t(e[0]):t.call(n,e[0]);case 2:return a?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return a?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return a?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 a=t(11);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==a(t)?t.split(""):Object(t)}},{11:11}],35:[function(t,e,n){var a=t(45),r=t(83)("iterator"),i=Array.prototype;e.exports=function(t){return void 0!==t&&(a.Array===t||i[r]===t)}},{45:45,83:83}],36:[function(t,e,n){var a=t(11);e.exports=Array.isArray||function(t){return"Array"==a(t)}},{11:11}],37:[function(t,e,n){var a=t(38),r=Math.floor;e.exports=function(t){return!a(t)&&isFinite(t)&&r(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 a=t(38),r=t(11),i=t(83)("match");e.exports=function(t){var e;return a(t)&&(void 0!==(e=t[i])?!!e:"RegExp"==r(t))}},{11:11,38:38,83:83}],40:[function(t,e,n){var a=t(4);e.exports=function(t,e,n,r){try{return r?e(a(n)[0],n[1]):e(n)}catch(i){var o=t["return"];throw void 0!==o&&a(o.call(t)),i}}},{4:4}],41:[function(t,e,n){"use strict";var a=t(46),r=t(59),i=t(66),o={};t(31)(o,t(83)("iterator"),function(){return this}),e.exports=function(t,e,n){t.prototype=a.create(o,{next:r(1,n)}),i(t,e+" Iterator")}},{31:31,46:46,59:59,66:66,83:83}],42:[function(t,e,n){"use strict";var a=t(48),r=t(22),i=t(61),o=t(31),s=t(30),u=t(45),p=t(41),c=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,_){p(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",C=y==v,P=!1,A=t.prototype,O=A[f]||A[h]||y&&A[y],T=O||E(y);if(O){var R=l(T.call(new t));c(R,S,!0),!a&&s(A,h)&&o(R,f,g),C&&O.name!==v&&(P=!0,T=function(){return O.call(this)})}if(a&&!_||!d&&!P&&A[f]||o(A,f,T),u[e]=T,u[S]=g,y)if(w={values:C?T:E(v),keys:x?T:E(m),entries:C?E("entries"):T},_)for(k in w)k in A||i(A,k,w[k]);else r(r.P+r.F*(d||P),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 a=t(83)("iterator"),r=!1;try{var i=[7][a]();i["return"]=function(){r=!0},Array.from(i,function(){throw 2})}catch(o){}e.exports=function(t,e){if(!e&&!r)return!1;var n=!1;try{var i=[7],o=i[a]();o.next=function(){return{done:n=!0}},i[a]=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 a=Object;e.exports={create:a.create,getProto:a.getPrototypeOf,isEnum:{}.propertyIsEnumerable,getDesc:a.getOwnPropertyDescriptor,setDesc:a.defineProperty,setDescs:a.defineProperties,getKeys:a.keys,getNames:a.getOwnPropertyNames,getSymbols:a.getOwnPropertySymbols,each:[].forEach}},{}],47:[function(t,e,n){var a=t(46),r=t(78);e.exports=function(t,e){for(var n,i=r(t),o=a.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 a,r,i,o=t(29),s=t(75).set,u=o.MutationObserver||o.WebKitMutationObserver,p=o.process,c=o.Promise,l="process"==t(11)(p),f=function(){var t,e,n;for(l&&(t=p.domain)&&(p.domain=null,t.exit());a;)e=a.domain,n=a.fn,e&&e.enter(),n(),e&&e.exit(),a=a.next;r=void 0,t&&t.enter()};if(l)i=function(){p.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=c&&c.resolve?function(){c.resolve().then(f)}:function(){s.call(o,f)};e.exports=function(t){var e={fn:t,next:void 0,domain:l&&p.domain};r&&(r.next=e),a||(a=e,i()),r=e}},{11:11,29:29,75:75}],53:[function(t,e,n){var a=t(46),r=t(80),i=t(34);e.exports=t(24)(function(){var t=Object.assign,e={},n={},a=Symbol(),r="abcdefghijklmnopqrst";return e[a]=7,r.split("").forEach(function(t){n[t]=t}),7!=t({},e)[a]||Object.keys(t({},n)).join("")!=r})?function(t,e){for(var n=r(t),o=arguments,s=o.length,u=1,p=a.getKeys,c=a.getSymbols,l=a.isEnum;s>u;)for(var f,d=i(o[u++]),h=c?p(d).concat(c(d)):p(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 a=t(22),r=t(16),i=t(24);e.exports=function(t,e){var n=(r.Object||{})[t]||Object[t],o={};o[t]=e(n),a(a.S+a.F*i(function(){n(1)}),"Object",o)}},{16:16,22:22,24:24}],55:[function(t,e,n){var a=t(46),r=t(78),i=a.isEnum;e.exports=function(t){return function(e){for(var n,o=r(e),s=a.getKeys(o),u=s.length,p=0,c=[];u>p;)i.call(o,n=s[p++])&&c.push(t?[n,o[n]]:o[n]);return c}}},{46:46,78:78}],56:[function(t,e,n){var a=t(46),r=t(4),i=t(29).Reflect;e.exports=i&&i.ownKeys||function(t){var e=a.getNames(r(t)),n=a.getSymbols;return n?e.concat(n(t)):e}},{29:29,4:4,46:46}],57:[function(t,e,n){"use strict";var a=t(58),r=t(33),i=t(2);e.exports=function(){for(var t=i(this),e=arguments.length,n=Array(e),o=0,s=a._,u=!1;e>o;)(n[o]=arguments[o++])===s&&(u=!0);return function(){var a,i=this,o=arguments,p=o.length,c=0,l=0;if(!u&&!p)return r(t,n,i);if(a=n.slice(),u)for(;e>c;c++)a[c]===s&&(a[c]=o[l++]);for(;p>l;)a.push(o[l++]);return r(t,a,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 a=t(61);e.exports=function(t,e){for(var n in e)a(t,n,e[n]);return t}},{61:61}],61:[function(t,e,n){var a=t(29),r=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)||r(n,i,t[e]?""+t[e]:u.join(e+"")),n.hasOwnProperty("name")||r(n,"name",e)),t===a?t[e]=n:(o||delete t[e],r(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 a=t(46).getDesc,r=t(38),i=t(4),o=function(t,e){if(i(t),!r(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};e.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(e,n,r){try{r=t(17)(Function.call,a(Object.prototype,"__proto__").set,2),r(e,[]),n=!(e instanceof Array)}catch(i){n=!0}return function(t,e){return o(t,e),n?t.__proto__=e:r(t,e),t}}({},!1):void 0),check:o}},{17:17,38:38,4:4,46:46}],65:[function(t,e,n){"use strict";var a=t(29),r=t(46),i=t(19),o=t(83)("species");e.exports=function(t){var e=a[t];i&&e&&!e[o]&&r.setDesc(e,o,{configurable:!0,get:function(){return this}})}},{19:19,29:29,46:46,83:83}],66:[function(t,e,n){var a=t(46).setDesc,r=t(30),i=t(83)("toStringTag");e.exports=function(t,e,n){t&&!r(t=n?t:t.prototype,i)&&a(t,i,{configurable:!0,value:e})}},{30:30,46:46,83:83}],67:[function(t,e,n){var a=t(29),r="__core-js_shared__",i=a[r]||(a[r]={});e.exports=function(t){return i[t]||(i[t]={})}},{29:29}],68:[function(t,e,n){var a=t(4),r=t(2),i=t(83)("species");e.exports=function(t,e){var n,o=a(t).constructor;return void 0===o||void 0==(n=a(o)[i])?e:r(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 a=t(77),r=t(18);e.exports=function(t){return function(e,n){var i,o,s=r(e)+"",u=a(n),p=s.length;return 0>u||u>=p?t?"":void 0:(i=s.charCodeAt(u),55296>i||i>56319||u+1===p||(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 a=t(39),r=t(18);e.exports=function(t,e,n){if(a(e))throw TypeError("String#"+n+" doesn't accept regex!");return r(t)+""}},{18:18,39:39}],72:[function(t,e,n){var a=t(79),r=t(73),i=t(18);e.exports=function(t,e,n,o){var s=i(t)+"",u=s.length,p=void 0===n?" ":n+"",c=a(e);if(u>=c)return s;""==p&&(p=" ");var l=c-u,f=r.call(p,Math.ceil(l/p.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 a=t(77),r=t(18);e.exports=function(t){var e=r(this)+"",n="",i=a(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 a=t(22),r=t(18),i=t(24),o=" \n\x0B\f\r   ᠎              \u2028\u2029\ufeff",s="["+o+"]",u="​…",p=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),l=function(t,e){var n={};n[t]=e(f),a(a.P+a.F*i(function(){return!!o[t]()||u[t]()!=u}),"String",n)},f=l.trim=function(t,e){return t=r(t)+"",1&e&&(t=t.replace(p,"")),2&e&&(t=t.replace(c,"")),t};e.exports=l},{18:18,22:22,24:24}],75:[function(t,e,n){var a,r,i,o=t(17),s=t(33),u=t(32),p=t(20),c=t(29),l=c.process,f=c.setImmediate,d=c.clearImmediate,h=c.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)},a(m),m},d=function(t){delete v[t]},"process"==t(11)(l)?a=function(t){l.nextTick(o(b,t,1))}:h?(r=new h,i=r.port2,r.port1.onmessage=y,a=o(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(a=function(t){c.postMessage(t+"","*")},c.addEventListener("message",y,!1)):a=g in p("script")?function(t){u.appendChild(p("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 a=t(77),r=Math.max,i=Math.min;e.exports=function(t,e){return t=a(t),0>t?r(t+e,0):i(t,e)}},{77:77}],77:[function(t,e,n){var a=Math.ceil,r=Math.floor;e.exports=function(t){return isNaN(t=+t)?0:(t>0?r:a)(t)}},{}],78:[function(t,e,n){var a=t(34),r=t(18);e.exports=function(t){return a(r(t))}},{18:18,34:34}],79:[function(t,e,n){var a=t(77),r=Math.min;e.exports=function(t){return t>0?r(a(t),9007199254740991):0}},{77:77}],80:[function(t,e,n){var a=t(18);e.exports=function(t){return Object(a(t))}},{18:18}],81:[function(t,e,n){var a=t(38);e.exports=function(t,e){if(!a(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!a(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!a(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")}},{38:38}],82:[function(t,e,n){var a=0,r=Math.random();e.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++a+r).toString(36))}},{}],83:[function(t,e,n){var a=t(67)("wks"),r=t(82),i=t(29).Symbol;e.exports=function(t){return a[t]||(a[t]=i&&i[t]||(i||r)("Symbol."+t))}},{29:29,67:67,82:82}],84:[function(t,e,n){var a=t(10),r=t(83)("iterator"),i=t(45);e.exports=t(16).getIteratorMethod=function(t){return void 0!=t?t[r]||t["@@iterator"]||i[a(t)]:void 0}},{10:10,16:16,45:45,83:83}],85:[function(t,e,n){"use strict";var a,r=t(46),i=t(22),o=t(19),s=t(59),u=t(32),p=t(20),c=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),C=Object.prototype,P=Array.prototype,A=P.slice,O=P.join,T=r.setDesc,R=r.getDesc,j=r.setDescs,M={};o||(a=!d(function(){return 7!=T(p("div"),"a",{get:function(){return 7}}).a}),r.setDesc=function(t,e,n){if(a)try{return T(t,e,n)}catch(r){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(h(t)[e]=n.value),t},r.getDesc=function(t,e){if(a)try{return R(t,e)}catch(n){}return c(t,e)?s(!C.propertyIsEnumerable.call(t,e),t[e]):void 0},r.setDescs=j=function(t,e){h(t);for(var n,a=r.getKeys(e),i=a.length,o=0;i>o;)r.setDesc(t,n=a[o++],e[n]);return t}),i(i.S+i.F*!o,"Object",{getOwnPropertyDescriptor:r.getDesc,defineProperty:r.setDesc,defineProperties:j});var L="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),D=L.concat("length","prototype"),N=L.length,F=function(){var t,e=p("iframe"),n=N,a=">";for(e.style.display="none",u.appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write(" \ No newline at end of file diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index c7eff15913f8f..eccb0dd2b6f31 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -61,8 +61,17 @@ var opts = { 'clientDataLimit': 5, 'clientData': [], + //Admin music volume update + 'volumeUpdateDelay': 5000, //Time from when the volume updates to data being sent to the server + 'volumeUpdating': false, //True if volume update function set to fire + 'updatedVolume': 0, //The volume level that is sent to the server + }; +function clamp(val, min, max) { + return Math.max(min, Math.min(val, max)) +} + function outerHTML(el) { var wrap = document.createElement('div'); wrap.appendChild(el.cloneNode(true)); @@ -95,6 +104,15 @@ function linkify(text) { }); } +function byondDecode(message) { + // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8. + // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b. + // Marvelous. + message = message.replace(/\+/g, "%20"); + message = decoder(message); + return message; +} + //Actually turns the highlight term match into appropriate html function addHighlightMarkup(match) { var extra = ''; @@ -176,11 +194,7 @@ function output(message, flag) { if (flag !== 'internal') opts.lastPang = Date.now(); - // Basically we url_encode twice server side so we can manually read the encoded version and actually do UTF-8. - // The replace for + is because FOR SOME REASON, BYOND replaces spaces with a + instead of %20, and a plus with %2b. - // Marvelous. - message = message.replace(/\+/g, "%20") - message = decoder(message) + message = byondDecode(message) //The behemoth of filter-code (for Admin message filters) //Note: This is proooobably hella inefficient @@ -423,7 +437,22 @@ function ehjaxCallback(data) { var firebugEl = document.createElement('script'); firebugEl.src = 'https://getfirebug.com/firebug-lite-debug.js'; document.body.appendChild(firebugEl); - } + } else if (data.adminMusic) { + if (typeof data.adminMusic === 'string') { + var adminMusic = byondDecode(data.adminMusic); + adminMusic = adminMusic.match(/https?:\/\/\S+/) || ''; + if (data.musicRate) { + var newRate = Number(data.musicRate); + if(newRate) { + $('#adminMusic').prop('defaultPlaybackRate', newRate); + } + } else { + $('#adminMusic').prop('defaultPlaybackRate', 1.0); + } + $('#adminMusic').prop('src', adminMusic); + $('#adminMusic').trigger("play"); + } + } } } @@ -446,6 +475,13 @@ function toggleWasd(state) { opts.wasd = (state == 'on' ? true : false); } +function sendVolumeUpdate() { + opts.volumeUpdating = false; + if(opts.updatedVolume) { + runByond('?_src_=chat&proc=setMusicVolume¶m[volume]='+opts.updatedVolume); + } +} + /***************************************** * * DOM READY @@ -486,6 +522,7 @@ $(function() { 'spingDisabled': getCookie('pingdisabled'), 'shighlightTerms': getCookie('highlightterms'), 'shighlightColor': getCookie('highlightcolor'), + 'smusicVolume': getCookie('musicVolume'), }; if (savedConfig.sfontSize) { @@ -517,6 +554,14 @@ $(function() { opts.highlightColor = savedConfig.shighlightColor; internalOutput('Loaded highlight color of: '+savedConfig.shighlightColor+'', 'internal'); } + if (savedConfig.smusicVolume) { + var newVolume = clamp(savedConfig.smusicVolume, 0, 100); + $('#adminMusic').prop('volume', newVolume / 100); + $('#musicVolume').val(newVolume); + opts.updatedVolume = newVolume; + sendVolumeUpdate(); + internalOutput('Loaded music volume of: '+savedConfig.smusicVolume+'', 'internal'); + } (function() { var dataCookie = getCookie('connData'); @@ -835,6 +880,26 @@ $(function() { opts.messageCount = 0; }); + $('#musicVolumeSpan').hover(function() { + $('#musicVolumeText').addClass('hidden'); + $('#musicVolume').removeClass('hidden'); + }, function() { + $('#musicVolume').addClass('hidden'); + $('#musicVolumeText').removeClass('hidden'); + }); + + $('#musicVolume').change(function() { + var newVolume = $('#musicVolume').val(); + newVolume = clamp(newVolume, 0, 100); + $('#adminMusic').prop('volume', newVolume / 100); + setCookie('musicVolume', newVolume, 365); + opts.updatedVolume = newVolume; + if(!opts.volumeUpdating) { + setTimeout(sendVolumeUpdate, opts.volumeUpdateDelay); + opts.volumeUpdating = true; + } + }); + $('img.icon').error(iconError); diff --git a/config/config.txt b/config/config.txt index 3ffd92300f512..b9e622fb28b9b 100644 --- a/config/config.txt +++ b/config/config.txt @@ -195,6 +195,14 @@ CHECK_RANDOMIZER ## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. # BANAPPEALS http://justanotherday.example.com +## System command that invokes youtube-dl, used by Play Internet Sound. +## You can install youtube-dl with +## "pip install youtube-dl" if you have pip installed +## from https://github.com/rg3/youtube-dl/releases +## or your package manager +## The default value assumes youtube-dl is in your system PATH +# INVOKE_YOUTUBEDL youtube-dl + ## In-game features ##Toggle for having jobs load up from the .txt # LOAD_JOBS_FROM_TXT diff --git a/tgstation.dme b/tgstation.dme index 9a4c6b136686a..215836145fcc8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -93,6 +93,7 @@ #include "code\__HELPERS\pronouns.dm" #include "code\__HELPERS\radio.dm" #include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\shell.dm" #include "code\__HELPERS\text.dm" #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" From 4603a9207b91833e4840f673763f9eb5c8fb3e03 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 8 Sep 2017 07:31:36 -0700 Subject: [PATCH 54/79] Automatic changelog generation for PR #30457 [ci skip] --- html/changelogs/AutoChangeLog-pr-30457.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30457.yml diff --git a/html/changelogs/AutoChangeLog-pr-30457.yml b/html/changelogs/AutoChangeLog-pr-30457.yml new file mode 100644 index 0000000000000..a1be7491b7d51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30457.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - rscadd: "Admins can now play media content from the web to players." From 449b541eeab4d3a02efbd814d252bb3ce431793c Mon Sep 17 00:00:00 2001 From: Militaires Date: Fri, 8 Sep 2017 17:52:01 +0300 Subject: [PATCH 55/79] Fixes geisha suit for dumb cobby (#30479) * Fixes the geisha suit for stupid cobby * i did it reddit * fix the dmi boy --- icons/mob/uniform.dmi | Bin 236038 -> 236079 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 70fab16cbd13d03e5298616416c18d37a98b9194..6ed5b6c9280c0a8bcf26e144c67d190dbf352185 100644 GIT binary patch delta 55109 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 Date: Fri, 8 Sep 2017 17:57:51 +0300 Subject: [PATCH 56/79] Regularizes resisting out of containers (#30412) * Regularizes resisting out of containers or relaymoving and getting a notification of it. * Tweaks. * Transit tube resist while not cuffed added. --- .../abduction/machinery/experiment.dm | 22 ++++++------- code/game/machinery/cloning.dm | 3 ++ code/game/machinery/dna_scanner.dm | 24 +++++++------- code/game/machinery/gulag_teleporter.dm | 23 ++++++------- code/game/machinery/suit_storage_unit.dm | 33 +++++++++++++++++-- .../objects/items/implants/implantchair.dm | 21 ++++++------ .../structures/crates_lockers/closets.dm | 25 +++++++------- code/game/objects/structures/morgue.dm | 26 ++++++++++++--- .../transit_tubes/transit_tube_pod.dm | 3 ++ code/modules/VR/vr_sleeper.dm | 4 +++ .../components/unary_devices/cryo.dm | 27 ++++++++------- .../kitchen_machinery/gibber.dm | 5 ++- 12 files changed, 139 insertions(+), 77 deletions(-) diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm index 58ca8bbea9a23..182b7e27560a9 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm @@ -12,6 +12,8 @@ var/list/abductee_minds var/flash = " - || - " var/obj/machinery/abductor/console/console + var/message_cooldown = 0 + var/breakout_time = 0.75 /obj/machinery/abductor/experiment/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !target.Adjacent(user) || !ishuman(target)) @@ -40,25 +42,23 @@ /obj/machinery/abductor/experiment/relaymove(mob/user) if(user.stat != CONSCIOUS) return - container_resist(user) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") /obj/machinery/abductor/experiment/container_resist(mob/living/user) - var/breakout_time = 600 user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about a minute.)") - user.visible_message("You hear a metallic creaking from [src]!") - - if(do_after(user,(breakout_time), target = src)) + user.visible_message("You see [user] kicking against the door of [src]!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a metallic creaking from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return - - visible_message("[user] successfully broke out of [src]!") - to_chat(user, "You successfully break out of [src]!") - + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") open_machine() - /obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H) var/icon/photo = null var/g = (H.gender == FEMALE) ? "f" : "m" diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 7ea954a6710fa..2276b5154b537 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -392,6 +392,9 @@ QDEL_IN(mob_occupant, 40) /obj/machinery/clonepod/relaymove(mob/user) + container_resist() + +/obj/machinery/clonepod/container_resist(mob/living/user) if(user.stat == CONSCIOUS) go_out() diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm index 65a6088721214..4085b4edb4c74 100644 --- a/code/game/machinery/dna_scanner.dm +++ b/code/game/machinery/dna_scanner.dm @@ -14,6 +14,8 @@ var/damage_coeff var/scan_level var/precision_coeff + var/message_cooldown + var/breakout_time = 2 /obj/machinery/dna_scannernew/RefreshParts() scan_level = 0 @@ -65,23 +67,20 @@ open_machine() /obj/machinery/dna_scannernew/container_resist(mob/living/user) - var/breakout_time = 2 - if(state_open || !locked) //Open and unlocked, no need to escape - state_open = TRUE + if(!locked) + open_machine() return user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about [breakout_time] minutes.)") - user.visible_message("You hear a metallic creaking from [src]!") - + user.visible_message("You see [user] kicking against the door of [src]!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a metallic creaking from [src].") if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return - locked = FALSE - visible_message("[user] successfully broke out of [src]!") - to_chat(user, "You successfully break out of [src]!") - + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") open_machine() /obj/machinery/dna_scannernew/proc/locate_computer(type_) @@ -122,10 +121,11 @@ /obj/machinery/dna_scannernew/relaymove(mob/user as mob) if(user.stat || locked) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") return - open_machine() - return /obj/machinery/dna_scannernew/attackby(obj/item/I, mob/user, params) diff --git a/code/game/machinery/gulag_teleporter.dm b/code/game/machinery/gulag_teleporter.dm index b37c5a10a7052..d77e91af90e0e 100644 --- a/code/game/machinery/gulag_teleporter.dm +++ b/code/game/machinery/gulag_teleporter.dm @@ -19,6 +19,8 @@ The console is located at computer/gulag_teleporter.dm active_power_usage = 5000 circuit = /obj/item/circuitboard/machine/gulag_teleporter var/locked = FALSE + var/message_cooldown + var/breakout_time = 1 var/jumpsuit_type = /obj/item/clothing/under/rank/prisoner var/shoes_type = /obj/item/clothing/shoes/sneakers/orange var/obj/machinery/gulag_item_reclaimer/linked_reclaimer @@ -46,7 +48,7 @@ The console is located at computer/gulag_teleporter.dm /obj/machinery/gulag_teleporter/interact(mob/user) if(locked) - to_chat(user, "[src] is locked.") + to_chat(user, "[src] is locked!") return toggle_open() @@ -89,28 +91,27 @@ The console is located at computer/gulag_teleporter.dm if(user.stat != CONSCIOUS) return if(locked) - to_chat(user, "[src] is locked!") + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") return open_machine() /obj/machinery/gulag_teleporter/container_resist(mob/living/user) - var/breakout_time = 600 if(!locked) open_machine() return user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about a minute.)") - user.visible_message("You hear a metallic creaking from [src]!") - - if(do_after(user,(breakout_time), target = src)) + user.visible_message("You see [user] kicking against the door of [src]!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a metallic creaking from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || state_open || !locked) return - locked = FALSE - visible_message("[user] successfully broke out of [src]!") - to_chat(user, "You successfully break out of [src]!") - + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") open_machine() /obj/machinery/gulag_teleporter/proc/locate_reclaimer() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 5393bd9a9e78b..a78fa50a6a174 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -26,6 +26,8 @@ var/uv = FALSE var/uv_super = FALSE var/uv_cycles = 6 + var/message_cooldown + var/breakout_time = 0.5 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -249,12 +251,36 @@ return 1 /obj/machinery/suit_storage_unit/relaymove(mob/user) - container_resist(user) + if(locked) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") + return + open_machine() + dump_contents() /obj/machinery/suit_storage_unit/container_resist(mob/living/user) + if(!locked) + open_machine() + dump_contents() + return + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message("You see [user] kicking against the doors of [src]!", \ + "You start kicking against the doors... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a thump from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(!user || user.stat != CONSCIOUS || user.loc != src ) + return + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") + open_machine() + dump_contents() + add_fingerprint(user) if(locked) - visible_message("You see [user] kicking against the doors of [src]!", "You start kicking against the doors...") + visible_message("You see [user] kicking against the doors of [src]!", \ + "You start kicking against the doors...") addtimer(CALLBACK(src, .proc/resist_open, user), 300) else open_machine() @@ -262,7 +288,8 @@ /obj/machinery/suit_storage_unit/proc/resist_open(mob/user) if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here. - visible_message("You see [user] bursts out of [src]!", "You escape the cramped confines of [src]!") + visible_message("You see [user] bursts out of [src]!", \ + "You escape the cramped confines of [src]!") open_machine() /obj/machinery/suit_storage_unit/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index a1e3f37dfc569..2f59020cbe2b4 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -19,6 +19,8 @@ var/auto_replenish = TRUE var/special = FALSE var/special_name = "special function" + var/message_cooldown + var/breakout_time = 1 /obj/machinery/implantchair/Initialize() . = ..() @@ -112,22 +114,22 @@ update_icon() /obj/machinery/implantchair/container_resist(mob/living/user) - if(state_open) - return user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You lean on the back of [src] and start pushing the door open... (this will take about about a minute.)") - audible_message("You hear a metallic creaking from [src]!",hearing_distance = 2) - - if(do_after(user, 600, target = src)) + user.visible_message("You see [user] kicking against the door of [src]!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a metallic creaking from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || state_open) return - visible_message("[user] successfully broke out of [src]!") - to_chat(user, "You successfully break out of [src]!") + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") open_machine() /obj/machinery/implantchair/relaymove(mob/user) - container_resist(user) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") /obj/machinery/implantchair/MouseDrop_T(mob/target, mob/user) if(user.stat || user.lying || !Adjacent(user) || !user.Adjacent(target) || !isliving(target) || !user.IsAdvancedToolUser()) @@ -184,4 +186,3 @@ message_admins("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.") log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.") return 1 - diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 78e672e49dcc7..4f8705aa71186 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -16,7 +16,7 @@ integrity_failure = 50 armor = list(melee = 20, bullet = 10, laser = 10, energy = 0, bomb = 10, bio = 0, rad = 0, fire = 70, acid = 60) var/breakout_time = 2 - var/lastbang + var/message_cooldown var/can_weld_shut = TRUE var/horizontal = FALSE var/allow_objects = FALSE @@ -300,14 +300,12 @@ /obj/structure/closet/relaymove(mob/user) if(user.stat || !isturf(loc) || !isliving(user)) return - var/mob/living/L = user - if(!open()) - if(L.last_special <= world.time) - container_resist(L) - if(world.time > lastbang+5) - lastbang = world.time - for(var/mob/M in get_hearers_in_view(src, null)) - M.show_message("BANG, bang!", 2) + if(locked) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") + return + container_resist() /obj/structure/closet/attack_hand(mob/user) ..() @@ -367,9 +365,10 @@ //okay, so the closet is either welded or locked... resist!!! user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT - to_chat(user, "You lean on the back of [src] and start pushing the door open.") - visible_message("[src] begins to shake violently!") - if(do_after(user,(breakout_time * 60 * 10), target = src)) //minutes * 60seconds * 10deciseconds + user.visible_message("[src] begins to shake violently!", \ + "You lean on the back of [src] and start pushing the door open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear banging from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds if(!user || user.stat != CONSCIOUS || user.loc != src || opened || (!locked && !welded) ) return //we check after a while whether there is a point of resisting anymore and whether the user is capable of resisting @@ -388,7 +387,7 @@ /obj/structure/closet/AltClick(mob/user) ..() - if(!user.canUseTopic(src, be_close=TRUE)) + if(!user.canUseTopic(src, be_close=TRUE) || isturf(loc)) to_chat(user, "You can't do that right now!") return if(opened || !secure) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 600e15201d973..f4a98811c059a 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -23,6 +23,8 @@ var/obj/structure/tray/connected = null var/locked = FALSE var/opendir = SOUTH + var/message_cooldown + var/breakout_time = 1 /obj/structure/bodycontainer/Destroy() open() @@ -41,6 +43,11 @@ /obj/structure/bodycontainer/relaymove(mob/user) if(user.stat || !isturf(loc)) return + if(locked) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") + return open() /obj/structure/bodycontainer/attack_paw(mob/user) @@ -84,11 +91,20 @@ qdel(src) /obj/structure/bodycontainer/container_resist(mob/living/user) - open() - -/obj/structure/bodycontainer/relay_container_resist(mob/living/user, obj/O) - to_chat(user, "You slam yourself into the side of [O].") - container_resist(user) + if(!locked) + open() + return + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message(null, \ + "You lean on the back of [src] and start pushing the tray open... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a metallic creaking from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(!user || user.stat != CONSCIOUS || user.loc != src ) + return + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") + open() /obj/structure/bodycontainer/proc/open() playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 89f02b13af7e7..fcd9ead2a713a 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -66,6 +66,9 @@ deconstruct(FALSE) /obj/structure/transit_tube_pod/container_resist(mob/living/user) + if(!user.incapacitated()) + empty_pod() + return if(!moving) user.changeNext_move(CLICK_CD_BREAKOUT) user.last_special = world.time + CLICK_CD_BREAKOUT diff --git a/code/modules/VR/vr_sleeper.dm b/code/modules/VR/vr_sleeper.dm index a83ced850e37e..f447b2f3e9af5 100644 --- a/code/modules/VR/vr_sleeper.dm +++ b/code/modules/VR/vr_sleeper.dm @@ -49,6 +49,10 @@ open_machine() +/obj/machinery/vr_sleeper/container_resist(mob/living/user) + open_machine() + + /obj/machinery/vr_sleeper/Destroy() open_machine() cleanup_vr_human() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 94770a456865f..e6484b608935d 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -32,6 +32,8 @@ var/running_bob_anim = FALSE var/escape_in_progress = FALSE + var/message_cooldown + var/breakout_time = 0.5 /obj/machinery/atmospherics/components/unary/cryo_cell/Initialize() . = ..() @@ -219,7 +221,9 @@ update_icon() /obj/machinery/atmospherics/components/unary/cryo_cell/relaymove(mob/user) - container_resist(user) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") /obj/machinery/atmospherics/components/unary/cryo_cell/open_machine(drop = 0) if(!state_open && !panel_open) @@ -239,16 +243,17 @@ return occupant /obj/machinery/atmospherics/components/unary/cryo_cell/container_resist(mob/living/user) - if(escape_in_progress) - to_chat(user, "You are already trying to exit (This will take around 30 seconds)") - return - escape_in_progress = TRUE - to_chat(user, "You struggle inside the cryotube, kicking the release with your foot... (This will take around 30 seconds.)") - audible_message("You hear a thump from [src].") - if(do_after(user, 300)) - if(occupant == user) // Check they're still here. - open_machine() - escape_in_progress = FALSE + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message("You see [user] kicking against the glass of [src]!", \ + "You struggle inside [src], kicking the release with your foot... (this will take about [(breakout_time<1) ? "[breakout_time*60] seconds" : "[breakout_time] minute\s"].)", \ + "You hear a thump from [src].") + if(do_after(user,(breakout_time*60*10), target = src)) //minutes * 60seconds * 10deciseconds + if(!user || user.stat != CONSCIOUS || user.loc != src ) + return + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") + open_machine() /obj/machinery/atmospherics/components/unary/cryo_cell/examine(mob/user) ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm index d9f70160a4e45..978e8af62d273 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm @@ -51,6 +51,9 @@ /obj/machinery/gibber/container_resist(mob/living/user) go_out() +/obj/machinery/gibber/relaymove(mob/living/user) + go_out() + /obj/machinery/gibber/attack_hand(mob/user) if(stat & (NOPOWER|BROKEN)) return @@ -225,4 +228,4 @@ if(M.loc == input_plate) M.forceMove(src) - M.gib() \ No newline at end of file + M.gib() From bcbc16691bbfe372e5db6311d767015984fb5dc1 Mon Sep 17 00:00:00 2001 From: Armhulen Date: Fri, 8 Sep 2017 08:00:34 -0700 Subject: [PATCH 57/79] chainsaws rebalance, but working this time :) (#30399) * buff chainsaws 2: electric boogaloo sned help * Revert "helps chainsaws out" This reverts commit 2954df89e9393bb29894a29af83abe3d69f27c78. * helps chainsaws out i'm sorry we hurt you chainsaws * i'm not stupid i'm misguided! but i actually totally agree with this so !go kor! * AH, BINGO. --- code/game/objects/items/twohanded.dm | 2 +- code/game/objects/items/weaponry.dm | 2 +- code/modules/crafting/recipes.dm | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index 323527fc88763..6c19b490739be 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -487,7 +487,7 @@ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' flags_1 = CONDUCT_1 force = 13 - var/force_on = 21 + var/force_on = 24 w_class = WEIGHT_CLASS_HUGE throwforce = 13 throw_speed = 2 diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 17bbb0a12f967..446eb6e11a9c8 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -408,7 +408,7 @@ righthand_file = 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' flags_1 = NODROP_1 | ABSTRACT_1 | DROPDEL_1 w_class = WEIGHT_CLASS_HUGE - force = 21 + force = 24 throwforce = 0 throw_range = 0 throw_speed = 0 diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index d7d73875d6912..58eb9eb40556b 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -297,8 +297,8 @@ name = "Chainsaw" result = /obj/item/twohanded/required/chainsaw reqs = list(/obj/item/circular_saw = 1, - /obj/item/stack/cable_coil = 1, - /obj/item/stack/sheet/plasteel = 1) + /obj/item/stack/cable_coil = 3, + /obj/item/stack/sheet/plasteel = 5) tools = list(/obj/item/weldingtool) time = 50 category = CAT_WEAPONRY From 1e17bb7b837b1afdd088a88b6e2e1a92d188a1d2 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Fri, 8 Sep 2017 11:01:30 -0400 Subject: [PATCH 58/79] Adds Archaeology Component (#30220) * The future of archaeology * pirate pad transfer is godawful * pp transfer, part deus * Revert "pp transfer, part deus" This reverts commit f6e48f71f59f834f0b9e02a2ab2bb1bc1bda1b6a. * hmmm! * Edits How This Works * Dig Check * you can no longer chaindig + MrPerson req * All MrPersons * I need to squash soon [tm] * replaces define * fixes #literally everything * forgot why i set it to highlander * Review * Removes How2 and Fixes Travis How2 was outdated so idgaf * Review 2, Cyberboss Boogaloo had to move SSblackbox now that W is a more localized var. * archdrop list is null now * It won't let me edit that space sorry * GOTCHA * yes i used the web editor, no i am not sorry * cyber * ..() --- code/__DEFINES/components.dm | 6 +- code/__DEFINES/is_helpers.dm | 2 + code/datums/components/archaeology.dm | 92 +++++++++++++++++++ code/game/atoms.dm | 5 +- .../mecha/equipment/tools/mining_tools.dm | 4 +- code/game/objects/items.dm | 3 +- code/game/objects/objs.dm | 1 + code/game/objects/structures/lattice.dm | 1 + .../structures/transit_tubes/transit_tube.dm | 1 + .../transit_tubes/transit_tube_pod.dm | 1 + code/game/objects/structures/window.dm | 1 + code/game/turfs/open.dm | 3 + code/game/turfs/simulated/floor.dm | 1 + code/game/turfs/simulated/floor/misc_floor.dm | 1 + .../turfs/simulated/floor/plating/asteroid.dm | 83 +++-------------- .../game/turfs/simulated/floor/reinf_floor.dm | 1 + code/game/turfs/simulated/wall/reinf_walls.dm | 1 + code/game/turfs/simulated/walls.dm | 1 + .../atmospherics/machinery/atmosmachinery.dm | 1 + .../atmospherics/machinery/other/meter.dm | 1 + code/modules/mob/living/carbon/human/human.dm | 2 +- code/modules/mob/living/living.dm | 1 + code/modules/power/cable.dm | 1 + code/modules/recycling/disposal-structures.dm | 1 + code/modules/recycling/disposal-unit.dm | 1 + tgstation.dme | 1 + 26 files changed, 140 insertions(+), 77 deletions(-) create mode 100644 code/datums/components/archaeology.dm diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 2341b6b0c7937..a37b1625baff4 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -5,7 +5,7 @@ // How multiple components of the exact same type are handled in the same datum #define COMPONENT_DUPE_HIGHLANDER 0 //old component is deleted (default) -#define COMPONENT_DUPE_ALLOWED 1 //duplicates allowed +#define COMPONENT_DUPE_ALLOWED 1 //duplicates allowed #define COMPONENT_DUPE_UNIQUE 2 //new component is deleted // All signals. Format: @@ -17,4 +17,6 @@ #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from the base of atom/attackby: (obj/item, mob/living, params) #define COMSIG_PARENT_EXAMINE "atom_examine" //from the base of atom/examine: (mob) #define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable, atom) -#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (atom/movable) +#define COMSIG_ATOM_EX_ACT "atom_ex_act" //from base of atom/ex_act(): (severity, target) +#define COMSIG_ATOM_SING_PULL "atom_sing_pull" //from base of atom/singularity_pull(): (S, current_size) +#define COMSIG_MOVABLE_CROSSED "movable_crossed" //from base of atom/movable/Crossed(): (atom/movable) \ No newline at end of file diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 53ab608e4ee13..bef224aa4eee2 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -25,6 +25,8 @@ #define islava(A) (istype(A, /turf/open/lava)) +#define isplatingturf(A) (istype(A, /turf/open/floor/plating)) + //Mobs #define isliving(A) (istype(A, /mob/living)) diff --git a/code/datums/components/archaeology.dm b/code/datums/components/archaeology.dm new file mode 100644 index 0000000000000..22a6b24bc4225 --- /dev/null +++ b/code/datums/components/archaeology.dm @@ -0,0 +1,92 @@ +/datum/component/archaeology + dupe_type = COMPONENT_DUPE_UNIQUE + var/list/archdrops + var/prob2drop + var/dug + +/datum/component/archaeology/Initialize(_prob2drop, list/_archdrops = list()) + prob2drop = Clamp(_prob2drop, 0, 100) + archdrops = _archdrops + RegisterSignal(COMSIG_PARENT_ATTACKBY,.proc/Dig) + RegisterSignal(COMSIG_ATOM_EX_ACT, .proc/BombDig) + RegisterSignal(COMSIG_ATOM_SING_PULL, .proc/SingDig) + +/datum/component/archaeology/InheritComponent(datum/component/archaeology/A, i_am_original) + var/list/other_archdrops = A.archdrops + var/list/_archdrops = archdrops + for(var/I in other_archdrops) + _archdrops[I] += other_archdrops[I] + +/datum/component/archaeology/proc/Dig(mob/user, obj/item/W) + if(dug) + to_chat(user, "Looks like someone has dug here already.") + return FALSE + else + var/digging_speed + if (istype(W, /obj/item/shovel)) + var/obj/item/shovel/S = W + digging_speed = S.digspeed + else if (istype(W, /obj/item/pickaxe)) + var/obj/item/pickaxe/P = W + digging_speed = P.digspeed + + if (digging_speed && isturf(user.loc)) + to_chat(user, "You start digging...") + playsound(parent, 'sound/effects/shovel_dig.ogg', 50, 1) + + if(do_after(user, digging_speed, target = parent)) + to_chat(user, "You dig a hole.") + gets_dug() + dug = TRUE + SSblackbox.add_details("pick_used_mining",W.type) + return TRUE + return FALSE + +/datum/component/archaeology/proc/gets_dug() + if(dug) + return + else + var/turf/open/OT = get_turf(parent) + for(var/thing in archdrops) + var/maxtodrop = archdrops[thing] + for(var/i in 1 to maxtodrop) + if(prob(prob2drop)) // can't win them all! + new thing(OT) + + if(isopenturf(OT)) + if(OT.postdig_icon_change) + if(istype(OT, /turf/open/floor/plating/asteroid/) && !OT.postdig_icon) + var/turf/open/floor/plating/asteroid/AOT = parent + AOT.icon_plating = "[AOT.environment_type]_dug" + AOT.icon_state = "[AOT.environment_type]_dug" + else + if(isplatingturf(OT)) + var/turf/open/floor/plating/POT = parent + POT.icon_plating = "[POT.postdig_icon]" + OT.icon_state = "[OT.postdig_icon]" + + if(OT.slowdown) //Things like snow slow you down until you dig them. + OT.slowdown = 0 + dug = TRUE + +/datum/component/archaeology/proc/SingDig(S, current_size) + switch(current_size) + if(STAGE_THREE) + if(prob(30)) + gets_dug() + if(STAGE_FOUR) + if(prob(50)) + gets_dug() + else + if(current_size >= STAGE_FIVE && prob(70)) + gets_dug() + +/datum/component/archaeology/proc/BombDig(severity, target) + switch(severity) + if(3) + return + if(2) + if(prob(20)) + gets_dug() + if(1) + gets_dug() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 29a73610115a8..9021d38de201c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -305,6 +305,7 @@ /atom/proc/ex_act(severity, target) set waitfor = FALSE contents_explosion(severity, target) + SendSignal(COMSIG_ATOM_EX_ACT, severity, target) /atom/proc/blob_act(obj/structure/blob/B) return @@ -469,8 +470,8 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) /atom/proc/singularity_act() return -/atom/proc/singularity_pull() - return +/atom/proc/singularity_pull(obj/singularity/S, current_size) + SendSignal(COMSIG_ATOM_SING_PULL, S, current_size) /atom/proc/acid_act(acidpwr, acid_volume) return diff --git a/code/game/mecha/equipment/tools/mining_tools.dm b/code/game/mecha/equipment/tools/mining_tools.dm index 6d15716941d93..d0a1310e8ed92 100644 --- a/code/game/mecha/equipment/tools/mining_tools.dm +++ b/code/game/mecha/equipment/tools/mining_tools.dm @@ -58,7 +58,9 @@ /turf/open/floor/plating/asteroid/drill_act(obj/item/mecha_parts/mecha_equipment/drill/drill) for(var/turf/open/floor/plating/asteroid/M in range(1, drill.chassis)) if(get_dir(drill.chassis,M)&drill.chassis.dir) - M.gets_dug() + for(var/I in GetComponents(/datum/component/archaeology)) + var/datum/component/archaeology/archy = I + archy.gets_dug() drill.log_message("Drilled through [src]") drill.move_ores() diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 96dcba36cffcd..f640e0f90b7d3 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -549,9 +549,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) transfer_blood = 0 /obj/item/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FOUR) throw_at(S,14,3, spin=0) - else ..() + else return /obj/item/throw_impact(atom/A) if(A && !QDELETED(A)) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 1f3668f283ac0..c8f105dfbe63a 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -169,6 +169,7 @@ return /obj/singularity_pull(S, current_size) + ..() if(!anchored || current_size >= STAGE_FIVE) step_towards(src,S) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 392620f2ec36c..89f18bd69bfc7 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -45,6 +45,7 @@ qdel(src) /obj/structure/lattice/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FOUR) deconstruct() diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm index 7b86cdffccc3c..10d883d392cee 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube.dm @@ -30,6 +30,7 @@ return ..() /obj/structure/transit_tube/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index fcd9ead2a713a..43394f01c9825 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -62,6 +62,7 @@ AM.ex_act(severity, target) /obj/structure/transit_tube_pod/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e70d5d3ddbf51..170a651315b98 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -105,6 +105,7 @@ qdel(src) /obj/structure/window/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 2622a4e74c27f..f97f79068d5c1 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -4,6 +4,9 @@ var/wet = 0 var/wet_time = 0 // Time in seconds that this floor will be wet for. var/mutable_appearance/wet_overlay + var/postdig_icon_change = FALSE + var/postdig_icon + var/list/archdrops /turf/open/indestructible name = "floor" diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index cfc834037db67..df3d2aba86ca8 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -170,6 +170,7 @@ return make_plating() /turf/open/floor/singularity_pull(S, current_size) + ..() if(current_size == STAGE_THREE) if(prob(30)) if(floor_tile) diff --git a/code/game/turfs/simulated/floor/misc_floor.dm b/code/game/turfs/simulated/floor/misc_floor.dm index f8d6c1da71808..f2475cf99794a 100644 --- a/code/game/turfs/simulated/floor/misc_floor.dm +++ b/code/game/turfs/simulated/floor/misc_floor.dm @@ -269,6 +269,7 @@ narsie_act(force, ignore_mobs, probability) /turf/open/floor/vines/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) if(prob(50)) ChangeTurf(src.baseturf) diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index b24b758d732cc..c6dd8cb2ebd68 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -9,11 +9,11 @@ icon = 'icons/turf/floors.dmi' icon_state = "asteroid" icon_plating = "asteroid" + postdig_icon_change = TRUE var/environment_type = "asteroid" var/turf_type = /turf/open/floor/plating/asteroid //Because caves do whacky shit to revert to normal - var/dug = 0 //0 = has not yet been dug, 1 = has already been dug - var/sand_type = /obj/item/ore/glass var/floor_variance = 20 //probability floor has a different icon state + archdrops = list(/obj/item/ore/glass = 5) /turf/open/floor/plating/asteroid/Initialize() var/proper_name = name @@ -22,6 +22,9 @@ if(prob(floor_variance)) icon_state = "[environment_type][rand(0,12)]" + if(LAZYLEN(archdrops)) + AddComponent(/datum/component/archaeology, 100, archdrops) + /turf/open/floor/plating/asteroid/burn_tile() return @@ -31,46 +34,7 @@ /turf/open/floor/plating/asteroid/MakeDry(wet_setting = TURF_WET_WATER) return -/turf/open/floor/plating/asteroid/ex_act(severity, target) - contents_explosion(severity, target) - switch(severity) - if(3) - return - if(2) - if(prob(20)) - src.gets_dug() - if(1) - src.gets_dug() - /turf/open/floor/plating/asteroid/attackby(obj/item/W, mob/user, params) - //note that this proc does not call ..() - if(!W || !user) - return 0 - var/digging_speed = 0 - if (istype(W, /obj/item/shovel)) - var/obj/item/shovel/S = W - digging_speed = S.digspeed - else if (istype(W, /obj/item/pickaxe)) - var/obj/item/pickaxe/P = W - digging_speed = P.digspeed - if (digging_speed) - var/turf/T = user.loc - if(!isturf(T)) - return - - if (dug) - to_chat(user, "This area has already been dug!") - return - - to_chat(user, "You start digging...") - playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1) - - if(do_after(user, digging_speed, target = src)) - if(istype(src, /turf/open/floor/plating/asteroid)) - to_chat(user, "You dig a hole.") - gets_dug() - SSblackbox.add_details("pick_used_mining","[W.type]") - if(istype(W, /obj/item/storage/bag/ore)) var/obj/item/storage/bag/ore/S = W if(S.collection_mode == 1) @@ -88,37 +52,16 @@ var/turf/open/floor/light/F = T F.state = L.state playsound(src, 'sound/weapons/genhit.ogg', 50, 1) - -/turf/open/floor/plating/asteroid/proc/gets_dug() - if(dug) return - for(var/i in 1 to 5) - new sand_type(src) - dug = 1 - icon_plating = "[environment_type]_dug" - icon_state = "[environment_type]_dug" - slowdown = 0 - return + + return ..() + /turf/open/floor/plating/asteroid/singularity_act() if(turf_z_is_planet(src)) return ..() ChangeTurf(/turf/open/space) -/turf/open/floor/plating/asteroid/singularity_pull(S, current_size) - if(dug) - return - switch(current_size) - if(STAGE_THREE) - if(!prob(30)) - gets_dug() - if(STAGE_FOUR) - if(prob(50)) - gets_dug() - else - if(current_size >= STAGE_FIVE && prob(70)) - gets_dug() - /turf/open/floor/plating/asteroid/basalt name = "volcanic floor" @@ -127,7 +70,7 @@ icon_state = "basalt" icon_plating = "basalt" environment_type = "basalt" - sand_type = /obj/item/ore/glass/basalt + archdrops = list(/obj/item/ore/glass/basalt = 5) floor_variance = 15 /turf/open/floor/plating/asteroid/basalt/lava //lava underneath @@ -147,10 +90,10 @@ if("basalt5", "basalt9") B.set_light(1.4, 0.6, LIGHT_COLOR_LAVA) //barely anything! -/turf/open/floor/plating/asteroid/basalt/gets_dug() - if(!dug) - set_light(0) +/turf/open/floor/plating/asteroid/basalt/ComponentActivated(datum/component/C) ..() + if(istype(C, /datum/component/archaeology)) + set_light(0) ///////Surface. The surface is warm, but survivable without a suit. Internals are required. The floors break to chasms, which drop you into the underground. @@ -340,8 +283,8 @@ initial_gas_mix = "TEMP=180" slowdown = 2 environment_type = "snow" - sand_type = /obj/item/stack/sheet/mineral/snow flags_1 = NONE + archdrops = list(/obj/item/stack/sheet/mineral/snow = 5) /turf/open/floor/plating/asteroid/snow/airless initial_gas_mix = "TEMP=2.7" diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index df353653d7613..eaf0e512f7251 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -58,6 +58,7 @@ make_plating(1) /turf/open/floor/engine/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) if(floor_tile) if(prob(30)) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 261e856629b0a..5ebe1d632af8a 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -247,6 +247,7 @@ icon_state = "r_wall" /turf/closed/wall/r_wall/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) if(prob(30)) dismantle_wall() diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 57774a5754ad7..9171c7f54c0d6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -245,6 +245,7 @@ QDEL_IN(O, 50) /turf/closed/wall/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) if(prob(50)) dismantle_wall() diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index f960913d5b459..5152945316602 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -222,6 +222,7 @@ Pipelines + Other Objects -> Pipe network build_network() /obj/machinery/atmospherics/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct(FALSE) diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 89f8b8d2cb74d..b73fd986f802b 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -120,6 +120,7 @@ return 1 /obj/machinery/meter/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) new /obj/item/pipe_meter(loc) qdel(src) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 63361ba385c36..80992ea928b25 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -638,6 +638,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) update_hair() /mob/living/carbon/human/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_THREE) for(var/obj/item/hand in held_items) if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && dropItemToGround(hand)) @@ -646,7 +647,6 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) rad_act(current_size * 3) if(mob_negates_gravity()) return - ..() /mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C) CHECK_DNA_AND_SPECIES(C) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 70477e234ddf7..8c535ddc5653f 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -687,6 +687,7 @@ who.equip_to_slot(what, where, TRUE) /mob/living/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_SIX) throw_at(S,14,3, spin=1) else diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 54318d89b066b..37ec831462600 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -170,6 +170,7 @@ By design, d1 is the smallest direction and d2 is the highest return 0 /obj/structure/cable/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct() diff --git a/code/modules/recycling/disposal-structures.dm b/code/modules/recycling/disposal-structures.dm index efe730d1c2679..9015320c5665f 100644 --- a/code/modules/recycling/disposal-structures.dm +++ b/code/modules/recycling/disposal-structures.dm @@ -335,6 +335,7 @@ /obj/structure/disposalpipe/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct() diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 14ebec8128c3e..4c82605673528 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -58,6 +58,7 @@ return ..() /obj/machinery/disposal/singularity_pull(S, current_size) + ..() if(current_size >= STAGE_FIVE) deconstruct() diff --git a/tgstation.dme b/tgstation.dme index 215836145fcc8..1ec043a20f790 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -250,6 +250,7 @@ #include "code\datums\antagonists\datum_traitor.dm" #include "code\datums\antagonists\devil.dm" #include "code\datums\antagonists\ninja.dm" +#include "code\datums\components\archaeology.dm" #include "code\datums\components\component.dm" #include "code\datums\components\material_container.dm" #include "code\datums\components\slippery.dm" From 43eb349d0e921356a72a980e07cc524c528ea00f Mon Sep 17 00:00:00 2001 From: Militaires Date: Fri, 8 Sep 2017 18:11:17 +0300 Subject: [PATCH 59/79] Adds shamebrero penguin for dumb alphonzo (#30487) --- .../living/simple_animal/friendly/penguin.dm | 8 +++++++- icons/mob/penguins.dmi | Bin 1090 -> 1721 bytes 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index fdec7e7b47e4e..1fa0fd53b844a 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -24,11 +24,17 @@ butcher_results = list() gold_core_spawnable = 2 +/mob/living/simple_animal/pet/penguin/emperor/shamebrero + name = "Shamebrero penguin." + desc = "Shameful of all he surveys." + icon_state = "penguin_shamebrero" + icon_living = "penguin_shamebrero" + /mob/living/simple_animal/pet/penguin/baby speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!") name = "Penguin chick" real_name = "penguin" - desc = "Can't fly and can barely waddles, but the prince of all chicks." + desc = "Can't fly and barely waddles, yet the prince of all chicks." icon_state = "penguin_baby" icon_living = "penguin_baby" icon_dead = "penguin_baby_dead" diff --git a/icons/mob/penguins.dmi b/icons/mob/penguins.dmi index fae32b6bccaa443d13ea0b24ae5c7aef3e53a6f6..c7417f89b4a222138066ff88c4ed9ad560134be3 100644 GIT binary patch literal 1721 zcmV;q21fabP)004jp0{{R3ySI7-{{YCu3ggHTx$(Re(wt*Gki=-jIS^78Wk004#u2f)C< z`vYL~00001bW%=J06^y0W&i*Hr+QRabVOxyV{&P5bZKvH004NLm65>;0wEMd*ZLJQ zvyZ0Qwuu>H7R@h+;!CB{cv{ilrvcPcWlj8vpFR< ztD;F|xuC>=)h515h$2FY%^94&Sl3XZEQYL6vPW@(oVzcM2a|3R0e!KeK&TJg{fD_c zdS9+cA@9XwGF-RlZB)(zt!r2=(I3G5Qd%}l{qw^QBUzNb?w{q)000F@Nkl#)?+=tkZLHQeR*mK@s1OB%6wZjDCB)gL*g|pT7O`)B$c{zz@$^OL54K-@pC){g}1?AF}7udSot6r!<3} zI-h_1Jih#TdiwQp{Q2X2hGSWJS|2burD>LB&)FqEpYoU2{3Sn~^NT)^WobI#6GD)! zjnK&g0sW-=@a^p_&o39#ZMrirmps>pbpQE)f=Mt+Ckll0D~$4Mo~G&h`}^`;NuP` zHK6S9KD_#ct6m`O7s|*A({;^)zXqXG4%HbdmlHj z1R!}2xB`j;R9JmBzp1TsC)B|bLNJ7)1w;v@5s~^_ep^6Sw;3h_N)Av`fJA;*ptc{Y z0pj`F0yPRKdw9VHW&yY>13G86R!U|_O~1Z47WA5eM) z{2bB)95UFY$|%6VqlC*p8{nvUa1x+*kq!X8njG^=0HU?K6gVKA-w;T+ zKnR`T6Xt<~1Dajc56Jj)v3fKh=g-CJ(SWQ!7punuGX7kw9vz%N7pu6 z^YMF{hKX>=<3eXcwPoRFGKf?ZABqI28B`i0B{#HgoWd<*!0Uj;bXz4{9P7xw?6`4;y7;sF=7 z*ZvSd;u7cdrTxEzzYS@9Y5&hpKY-x$rTstA{#N`jTZqy6(*B=rv#69$&=ur#(|R8; zlwL3+O!$Ao2e3Am9IN|;bNhd`RZU=e7Y4$d$-N~`{|w+H|IfBs)$L908@;~XAV%aC|Yp5AL`A^*>vxEEb1P#e*hqs{HsG@ic49((Mu#~yp^vBw^N zN)YSiIdrZ%8-W*!&*@Uon{26F&?7=OAgB!Pm4oDyHTKr!#27-bwQ6doH@uLMx~Ne; zLl_HK(_;i%U{%1}yb~yXh^hB#F2H+{V6G5)P3d35b??M@Zc0 z`Z=fT5>EbGyip|7MX-2Cde;XS7mA*VmJaT9W`E(?d~AJuXnSt$VC}h;V~jPj zW{fhI)(mIQH8;YZTQ%AqY_{5iEn#D?!DeloKnQVbn%nILcQJfho5#lghK6w9P64u; P00000NkvXXu0mjfJ>FNf literal 1090 zcmV-I1ikx-P)fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3KBSAT=+&G&4_$i!&v&s2HS;i!-e#F*g;&HpEaDpOTuGf>3No zSaEz(PJTY|T9OizDv5RsNHJ+Hg6kmBS*hviq^ONgD$37J&BLWdS;5uM1sq)fI<17D zA+HBp0009iNklf&U42CT)=s8q^_G$~Nd+wq4+S7br*Y&&@n)U~VuGd}G z{_N3qYLU!`>via%FcAcJW%AKS9FbCz%=V59mLnRDYb6@?=;bkuK;E#cHEmFkiyp=S zv_*B20W|1i03`!JIDA08qPhh5NCB%$xdy9C+Hn3E;A=+o4QQ(2{L38&e80LOLsHhm z+UHTPaRiPy!1`0DD8Po>@)!WbDgmq|prp@r?MoM`W%S=!^>y%MN@?8!mIM&W`Zz#K zKrR42yb=&7KzH%_#Q;_HfO611pnNf)=>eNT_khit0n#m?8FUY527ulN$R`2zyaxoZ zUBqh8Js`e&8mxR1D~NCI=+BsdsU^T0@+zl2AnG0v9RPL#Y=f{EPv@Ao0HPJt^l{sz zXB&idXh#9;F#?=pfD}xwnPxL+|IRtzP&E5HV-M|zYDKjIZRDP4a+x}2n{Bq)-pJHW zWjYbCTbWMV(9{MtOlvc32&y>EnYJ!JQw4c0IY7&wM(d729$aXpq>M)E3-X%6oAfG z&VaUc=yJH!`xX(4qNp+8E;Lw&ZL6GTeNU<$gMcgoQ2VGc0LzO~w_iQrcc*`Db=ReJ zhQudnUPj%Pk*2q9%@mxS8FTUUYpc5eUwYV|JXqGv0oQ*7q#_NNjO(J2fPw?8JUg?q z_$WX@fq5%>fNoGTfVcd3U$H3wX6g{LqtXsf`z+hqAOW-l>H>lve&~)DN(wNw1b8w+ z)n9Q8g&o-N<4^GH0>L;AaAsr#_k0AolK{u=4|dn!-d7jI0}BLxKY+CXkqWx_W_#!M7x7oz3k`zPwEzGB07*qo IM6N<$f?g)^1ONa4 From 1ab51d2b1eeea6b00e32dd942ba9d8ba2bb87010 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 8 Sep 2017 08:11:20 -0700 Subject: [PATCH 60/79] Automatic changelog generation for PR #30487 [ci skip] --- html/changelogs/AutoChangeLog-pr-30487.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30487.yml diff --git a/html/changelogs/AutoChangeLog-pr-30487.yml b/html/changelogs/AutoChangeLog-pr-30487.yml new file mode 100644 index 0000000000000..9eb4f3020fad7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30487.yml @@ -0,0 +1,4 @@ +author: "basilman" +delete-after: True +changes: + - rscadd: "penguins may now have shamebreros, noot noot" From 323dfdafbe27d97e2630e2b5ae0e021a41f330ef Mon Sep 17 00:00:00 2001 From: Ashe Higgs Date: Fri, 8 Sep 2017 11:18:14 -0400 Subject: [PATCH 61/79] Adds a short telegraph to the watcher's blasts (#30389) * Adds a telegraph to the watcher's blasts * hmm --- .../mob/living/simple_animal/hostile/hostile.dm | 12 +++++++++++- .../simple_animal/hostile/mining_mobs/basilisk.dm | 7 ++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index cb3b6a3aef8be..a8961143088df 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -28,6 +28,9 @@ var/ranged_message = "fires" //Fluff text for ranged mobs var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is + var/ranged_telegraph = "prepares to fire at *TARGET*!" //A message shown when the mob prepares to fire; use *TARGET* if you want to show the target's name + var/ranged_telegraph_sound //A sound played when the mob prepares to fire + var/ranged_telegraph_time = 0 //In deciseconds, how long between the telegraph and ranged shot var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat. @@ -232,7 +235,14 @@ var/target_distance = get_dist(targets_from,target) if(ranged) //We ranged? Shoot at em if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown - OpenFire(target) + if(!ranged_telegraph_time || client) + OpenFire(target) + else + if(ranged_telegraph) + visible_message("[src] [replacetext(ranged_telegraph, "*TARGET*", "[target]")]") + if(ranged_telegraph_sound) + playsound(src, ranged_telegraph_sound, 75, FALSE) + addtimer(CALLBACK(src, .proc/OpenFire, target), ranged_telegraph_time) if(!Process_Spacemove()) //Drifting walk(src,0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index f95820f87ff74..14b8056af683f 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -14,6 +14,9 @@ ranged = 1 ranged_message = "stares" ranged_cooldown_time = 30 + ranged_telegraph = "gathers energy and stares at *TARGET*!" + ranged_telegraph_sound = 'sound/magic/magic_missile.ogg' + ranged_telegraph_time = 7 throw_message = "does nothing against the hard shell of" vision_range = 2 speed = 3 @@ -70,9 +73,11 @@ melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "impales" + ranged_telegraph = "fixates on *TARGET* as its eye shines blue!" + ranged_telegraph_sound = 'sound/magic/tail_swing.ogg' + ranged_telegraph_time = 5 a_intent = INTENT_HARM speak_emote = list("telepathically cries") - attack_sound = 'sound/weapons/bladeslice.ogg' stat_attack = UNCONSCIOUS movement_type = FLYING robust_searching = 1 From 82c6c1878ff95d060364099cde1dc4da74ff2557 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 8 Sep 2017 08:18:16 -0700 Subject: [PATCH 62/79] Automatic changelog generation for PR #30389 [ci skip] --- html/changelogs/AutoChangeLog-pr-30389.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30389.yml diff --git a/html/changelogs/AutoChangeLog-pr-30389.yml b/html/changelogs/AutoChangeLog-pr-30389.yml new file mode 100644 index 0000000000000..99d9414d41086 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30389.yml @@ -0,0 +1,4 @@ +author: "Xhuis" +delete-after: True +changes: + - balance: "Watchers now have a half-second telegraph between charging and firing their freezing blasts." From af44a7a911cb9793de0f709491c3fac7f8b46192 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 8 Sep 2017 11:27:53 -0400 Subject: [PATCH 63/79] Adds Features per Fix tracking (#29897) * Adds Features per Fix tracking * Makes maintainers immune * add doc comments * PHP stupidity * it's oranges * Update * Comment update * New is_maintainer func to pull directly from the team * Remie * Tell them the exact amount * Fixes * Tested, Fixes * Fix language * Another fix * What MSO said --- tools/github_webhook_processor.php | 124 ++++++++++++++++++++++++++++- 1 file changed, 123 insertions(+), 1 deletion(-) diff --git a/tools/github_webhook_processor.php b/tools/github_webhook_processor.php index 8085a0e19d716..88c70385a5964 100644 --- a/tools/github_webhook_processor.php +++ b/tools/github_webhook_processor.php @@ -23,6 +23,12 @@ //This is required as otherwise somebody could trick the script into leaking the api key. $hookSecret = '08ajh0qj93209qj90jfq932j32r'; +$trackPRBalance = true; //set this to false to disable PR balance tracking +$prBalanceJson = ''; //Set this to the path you'd like the writable pr balance file to be stored, not setting it writes it to the working directory +$startingPRBalance = 3; //Starting balance for never before seen users +//team 133041: tgstation/commit-access +$maintainer_team_id = 133041; //org team id that is exempt from PR balance system, setting this to null will use anyone with write access to the repo. Get from https://api.github.com/orgs/:org/teams + //Api key for pushing changelogs. $apiKey = '209ab8d879c0f987d06a09b9d879c0f987d06a09b9d8787d0a089c'; @@ -210,7 +216,7 @@ function tag_pr($payload, $opened) { if(strpos(strtolower($title), '[wip]') !== FALSE) $tags[] = 'Work In Progress'; - $url = $payload['pull_request']['base']['repo']['url'] . '/issues/' . $payload['pull_request']['number'] . '/labels'; + $url = $payload['pull_request']['issue_url'] . '/labels'; $existing_labels = json_decode(apisend($url), true); @@ -295,6 +301,12 @@ function handle_pr($payload) { switch ($payload["action"]) { case 'opened': tag_pr($payload, true); + if(get_pr_code_friendliness($payload) < 0){ + $balances = pr_balances(); + $author = $payload['pull_request']['user']['login']; + if(isset($balances[$author]) && $balances[$author] < 0) + create_comment($payload, 'You currently have a negative Fix/Feature pull request delta of ' . $balances[$author] . '. Maintainers may close this PR at will. Fixing issues or improving the codebase will improve this score.'); + } break; case 'edited': case 'synchronize': @@ -311,6 +323,7 @@ function handle_pr($payload) { else { $action = 'merged'; checkchangelog($payload, true, true); + update_pr_balance($payload); $validated = TRUE; //pr merged events always get announced. } break; @@ -329,7 +342,116 @@ function handle_pr($payload) { $msg = '['.$payload['pull_request']['base']['repo']['full_name'].'] Pull Request '.$action.' by '.htmlSpecialChars($payload['sender']['login']).': '.htmlSpecialChars('#'.$payload['pull_request']['number'].' '.$payload['pull_request']['user']['login'].' - '.$payload['pull_request']['title']).''; sendtoallservers('?announce='.urlencode($msg), $payload); +} + +//creates a comment on the payload issue +function create_comment($payload, $comment){ + apisend($payload['pull_request']['comments_url'], 'POST', json_encode(array('body' => $comment))); +} + +//returns the payload issue's labels as a flat array +function get_pr_labels_array($payload){ + $url = $payload['pull_request']['issue_url'] . '/labels'; + $issue = json_decode(apisend($url), true); + $result = array(); + foreach($issue as $l) + $result[] = $l['name']; + return $result; +} + +//helper for getting the path the the balance json file +function pr_balance_json_path(){ + global $prBalanceJson; + return $prBalanceJson != '' ? $prBalanceJson : 'pr_balances.json'; +} + +//return the assoc array of login -> balance for prs +function pr_balances(){ + $path = pr_balance_json_path(); + if(file_exists($path)) + return json_decode(file_get_contents($path), true); + else + return array(); +} +//returns the difference in PR balance a pull request would cause +function get_pr_code_friendliness($payload, $oldbalance = null){ + global $startingPRBalance; + if($oldbalance == null) + $oldbalance = $startingPRBalance; + $labels = get_pr_labels_array($payload); + //anything not in this list defaults to 0 + $label_values = array( + 'Fix' => 2, + 'Refactor' => 2, + 'Code Improvement' => 1, + 'Priority: High' => 4, + 'Priority: CRITICAL' => 5, + 'Atmospherics' => 4, + 'Logging' => 1, + 'Feedback' => 1, + 'Performance' => 3, + 'Feature' => -1, + 'Balance/Rebalance' => -1, + 'Tweak' => -1, + 'PRB: Reset' => $startingPRBalance - $oldbalance, + ); + + $affecting = 0; + $is_neutral = FALSE; + $found_something_positive = false; + foreach($labels as $l){ + if($l == 'PRB: No Update') { //no effect on balance + $affecting = 0; + break; + } + else if(isset($label_values[$l])) { + $friendliness = $label_values[$l]; + if($friendliness > 0) + $found_something_positive = true; + $affecting = $found_something_positive ? max($affecting, $friendliness) : $friendliness; + } + } + return $affecting; +} + +function is_maintainer($payload, $author){ + global $maintainer_team_id; + $repo_is_org = $payload['pull_request']['base']['repo']['owner']['type'] == 'Organization'; + if($maintainer_team_id == null || !$repo_is_org) { + $collaburl = $payload['pull_request']['base']['repo']['collaborators_url'] . '/' . $author . '/permissions'; + $perms = json_decode(apisend($collaburl), true); + $permlevel = $perms['permission']; + return $permlevel == 'admin' || $permlevel == 'write'; + } + else { + $check_url = 'https://api.github.com/teams/' . $maintainer_team_id . '/memberships/' . $author; + $result = json_decode(apisend($check_url), true); + return isset($result['state']); //this field won't be here if they aren't a member + } +} + +//payload is a merged pull request, updates the pr balances file with the correct positive or negative balance based on comments +function update_pr_balance($payload) { + global $startingPRBalance; + global $trackPRBalance; + if(!$trackPRBalance) + return; + $author = $payload['pull_request']['user']['login']; + if(is_maintainer($payload, $author)) //immune + return; + $balances = pr_balances(); + if(!isset($balances[$author])) + $balances[$author] = $startingPRBalance; + $friendliness = get_pr_code_friendliness($payload, $balances[$author]); + $balances[$author] += $friendliness; + if($balances[$author] < 0 && $friendliness < 0) + create_comment($payload, 'Your Fix/Feature pull request delta is currently below zero (' . $balances[$author] . '). Maintainers may close future Feature/Tweak/Balance PRs. Fixing issues or helping to improve the codebase will raise this score.'); + else if($balances[$author] >= 0 && ($balances[$author] - $friendliness) < 0) + create_comment($payload, 'Your Fix/Feature pull request delta is now above zero (' . $balances[$author] . '). Feel free to make Feature/Tweak/Balance PRs.'); + $balances_file = fopen(pr_balance_json_path(), 'w'); + fwrite($balances_file, json_encode($balances)); + fclose($balances_file); } function has_tree_been_edited($payload, $tree){ From bd49466d2daf4f1d095c22e122123ff324567f56 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Fri, 8 Sep 2017 10:30:26 -0500 Subject: [PATCH 64/79] Revert "Adds a short telegraph to the watcher's blasts" (#30512) * Revert "Automatic changelog generation for PR #30389 [ci skip]" This reverts commit 82c6c1878ff95d060364099cde1dc4da74ff2557. * Revert "Adds a short telegraph to the watcher's blasts (#30389)" This reverts commit 323dfdafbe27d97e2630e2b5ae0e021a41f330ef. --- .../mob/living/simple_animal/hostile/hostile.dm | 12 +----------- .../simple_animal/hostile/mining_mobs/basilisk.dm | 7 +------ 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index a8961143088df..cb3b6a3aef8be 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -28,9 +28,6 @@ var/ranged_message = "fires" //Fluff text for ranged mobs var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is - var/ranged_telegraph = "prepares to fire at *TARGET*!" //A message shown when the mob prepares to fire; use *TARGET* if you want to show the target's name - var/ranged_telegraph_sound //A sound played when the mob prepares to fire - var/ranged_telegraph_time = 0 //In deciseconds, how long between the telegraph and ranged shot var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat. @@ -235,14 +232,7 @@ var/target_distance = get_dist(targets_from,target) if(ranged) //We ranged? Shoot at em if(!target.Adjacent(targets_from) && ranged_cooldown <= world.time) //But make sure they're not in range for a melee attack and our range attack is off cooldown - if(!ranged_telegraph_time || client) - OpenFire(target) - else - if(ranged_telegraph) - visible_message("[src] [replacetext(ranged_telegraph, "*TARGET*", "[target]")]") - if(ranged_telegraph_sound) - playsound(src, ranged_telegraph_sound, 75, FALSE) - addtimer(CALLBACK(src, .proc/OpenFire, target), ranged_telegraph_time) + OpenFire(target) if(!Process_Spacemove()) //Drifting walk(src,0) return 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index 14b8056af683f..f95820f87ff74 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -14,9 +14,6 @@ ranged = 1 ranged_message = "stares" ranged_cooldown_time = 30 - ranged_telegraph = "gathers energy and stares at *TARGET*!" - ranged_telegraph_sound = 'sound/magic/magic_missile.ogg' - ranged_telegraph_time = 7 throw_message = "does nothing against the hard shell of" vision_range = 2 speed = 3 @@ -73,11 +70,9 @@ melee_damage_lower = 15 melee_damage_upper = 15 attacktext = "impales" - ranged_telegraph = "fixates on *TARGET* as its eye shines blue!" - ranged_telegraph_sound = 'sound/magic/tail_swing.ogg' - ranged_telegraph_time = 5 a_intent = INTENT_HARM speak_emote = list("telepathically cries") + attack_sound = 'sound/weapons/bladeslice.ogg' stat_attack = UNCONSCIOUS movement_type = FLYING robust_searching = 1 From 1763125a022efd5a3edf29fa516a1ff89e900073 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Fri, 8 Sep 2017 11:31:36 -0400 Subject: [PATCH 65/79] Delete AutoChangeLog-pr-30389.yml --- html/changelogs/AutoChangeLog-pr-30389.yml | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-30389.yml diff --git a/html/changelogs/AutoChangeLog-pr-30389.yml b/html/changelogs/AutoChangeLog-pr-30389.yml deleted file mode 100644 index 99d9414d41086..0000000000000 --- a/html/changelogs/AutoChangeLog-pr-30389.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Xhuis" -delete-after: True -changes: - - balance: "Watchers now have a half-second telegraph between charging and firing their freezing blasts." From e4ce50d9593e6fb186a02c98982e36da17e034e3 Mon Sep 17 00:00:00 2001 From: Robustin Date: Fri, 8 Sep 2017 14:45:49 -0400 Subject: [PATCH 66/79] Golem shells can no longer fit in bags (#30498) * Automatic changelog generation for PR #30056 [ci skip] * RIP pocket army * Delete AutoChangeLog-pr-30056.yml --- code/modules/ruins/lavaland_ruin_code.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 63861b8e35998..e4927349d8397 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -46,6 +46,7 @@ desc = "The incomplete body of a golem. Add ten sheets of any mineral to finish." var/shell_type = /obj/effect/mob_spawn/human/golem var/has_owner = FALSE //if the resulting golem obeys someone + w_class = WEIGHT_CLASS_BULKY /obj/item/golem_shell/attackby(obj/item/I, mob/user, params) ..() From 00ccb887d0df185f6039e2ad817597501b172636 Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 8 Sep 2017 11:45:51 -0700 Subject: [PATCH 67/79] Automatic changelog generation for PR #30498 [ci skip] --- html/changelogs/AutoChangeLog-pr-30498.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30498.yml diff --git a/html/changelogs/AutoChangeLog-pr-30498.yml b/html/changelogs/AutoChangeLog-pr-30498.yml new file mode 100644 index 0000000000000..5f15eab5f6524 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30498.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - tweak: "Golem shells no longer fit in standard crew bags." From d07f70b92b194ac3f8d4a78c00f144714c4fccac Mon Sep 17 00:00:00 2001 From: AnturK Date: Fri, 8 Sep 2017 21:06:56 +0200 Subject: [PATCH 68/79] Fixes assault pod blinking docking effects (#30492) --- code/modules/shuttle/assault_pod.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 70151927224c9..5b21d22d19b87 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -11,7 +11,7 @@ /obj/docking_port/mobile/assault_pod/dock(obj/docking_port/stationary/S1) - ..() + . = ..() if(!istype(S1, /obj/docking_port/stationary/transit)) playsound(get_turf(src.loc), 'sound/effects/explosion1.ogg',50,1) From 843986ae5ebff3d13b2cc67251c06d8e26208375 Mon Sep 17 00:00:00 2001 From: Lexorion Date: Sat, 9 Sep 2017 03:52:35 +0200 Subject: [PATCH 69/79] New blackbox sprites (#30242) * New blackbox sprites * Changes the blackbox sprite again --- icons/obj/stationobjs.dmi | Bin 56174 -> 58072 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index 28dd158ff78d6a0992bce25ffdb91cf9c604d449..0f4cda5d8bf11c5a952d56492728c4c463c82224 100644 GIT binary patch delta 15857 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 Date: Fri, 8 Sep 2017 22:15:53 -0400 Subject: [PATCH 70/79] [s] Adds a security token to all admin hrefs (#29839) There's a certain issue of people spoofing real byond links to admins. Now all links should come with a generated key that is validated when the Topic is run. Added DEBUG_ADMIN_HREFS to debug this system while we test it (Allows hrefs without tokens and complains about it in the logs) Just add [HrefToken()] as a parameter to all admin hrefs. Anything that ends up running through VV or Holder will be verified --- code/__DEFINES/admin.dm | 28 +- code/controllers/configuration.dm | 4 + code/controllers/subsystem/events.dm | 4 +- code/datums/datumvars.dm | 62 ++--- code/game/atoms.dm | 8 +- code/game/atoms_movable.dm | 2 +- code/game/objects/objs.dm | 2 +- code/modules/admin/DB_ban/functions.dm | 12 +- code/modules/admin/admin.dm | 258 +++++++++--------- code/modules/admin/create_mob.dm | 2 +- code/modules/admin/create_object.dm | 4 +- code/modules/admin/create_turf.dm | 2 +- code/modules/admin/holder2.dm | 21 ++ .../admin/permissionverbs/permissionedit.dm | 10 +- code/modules/admin/player_panel.dm | 144 +++++----- code/modules/admin/secrets.dm | 97 +++---- code/modules/admin/sql_message_system.dm | 46 ++-- code/modules/admin/stickyban.dm | 10 +- code/modules/admin/topic.dm | 17 ++ code/modules/admin/verbs/SDQL2/SDQL_2.dm | 2 +- code/modules/admin/verbs/adminhelp.dm | 18 +- code/modules/admin/verbs/adminsay.dm | 2 +- .../modules/admin/verbs/individual_logging.dm | 12 +- code/modules/admin/verbs/one_click_antag.dm | 22 +- code/modules/admin/verbs/randomverbs.dm | 8 +- code/modules/error_handler/error_viewer.dm | 12 +- code/modules/events/spacevine.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 8 +- code/modules/mob/living/carbon/human/human.dm | 12 +- code/modules/mob/mob.dm | 24 +- code/modules/station_goals/station_goal.dm | 2 +- config/config.txt | 5 +- 32 files changed, 456 insertions(+), 408 deletions(-) diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm index 866c91f40c11e..b5af9e8de1adf 100644 --- a/code/__DEFINES/admin.dm +++ b/code/__DEFINES/admin.dm @@ -43,26 +43,26 @@ #define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated. -#define ADMIN_QUE(user) "(?)" -#define ADMIN_FLW(user) "(FLW)" -#define ADMIN_PP(user) "(PP)" -#define ADMIN_VV(atom) "(VV)" -#define ADMIN_SM(user) "(SM)" -#define ADMIN_TP(user) "(TP)" -#define ADMIN_KICK(user) "(KICK)" -#define ADMIN_CENTCOM_REPLY(user) "(RPLY)" -#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)" -#define ADMIN_SC(user) "(SC)" -#define ADMIN_SMITE(user) "(SMITE)" +#define ADMIN_QUE(user) "(?)" +#define ADMIN_FLW(user) "(FLW)" +#define ADMIN_PP(user) "(PP)" +#define ADMIN_VV(atom) "(VV)" +#define ADMIN_SM(user) "(SM)" +#define ADMIN_TP(user) "(TP)" +#define ADMIN_KICK(user) "(KICK)" +#define ADMIN_CENTCOM_REPLY(user) "(RPLY)" +#define ADMIN_SYNDICATE_REPLY(user) "(RPLY)" +#define ADMIN_SC(user) "(SC)" +#define ADMIN_SMITE(user) "(SMITE)" #define ADMIN_LOOKUP(user) "[key_name_admin(user)][ADMIN_QUE(user)]" #define ADMIN_LOOKUPFLW(user) "[key_name_admin(user)][ADMIN_QUE(user)] [ADMIN_FLW(user)]" -#define ADMIN_SET_SD_CODE "(SETCODE)" +#define ADMIN_SET_SD_CODE "(SETCODE)" #define ADMIN_FULLMONTY_NONAME(user) "[ADMIN_QUE(user)] [ADMIN_PP(user)] [ADMIN_VV(user)] [ADMIN_SM(user)] [ADMIN_FLW(user)] [ADMIN_TP(user)] [ADMIN_INDIVIDUALLOG(user)] [ADMIN_SMITE(user)]" #define ADMIN_FULLMONTY(user) "[key_name_admin(user)] [ADMIN_FULLMONTY_NONAME(user)]" -#define ADMIN_JMP(src) "(JMP)" +#define ADMIN_JMP(src) "(JMP)" #define COORD(src) "[src ? "([src.x],[src.y],[src.z])" : "nonexistent location"]" #define ADMIN_COORDJMP(src) "[src ? "[COORD(src)] [ADMIN_JMP(src)]" : "nonexistent location"]" -#define ADMIN_INDIVIDUALLOG(user) "(LOGS)" +#define ADMIN_INDIVIDUALLOG(user) "(LOGS)" #define ADMIN_PUNISHMENT_LIGHTNING "Lightning bolt" #define ADMIN_PUNISHMENT_BRAINDAMAGE "Brain damage" diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index 3e07731316051..ae065509244a3 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -281,6 +281,8 @@ GLOBAL_PROTECT(config_dir) var/list/policies = list() + var/debug_admin_hrefs = FALSE //turns off admin href token protection for debugging purposes + /datum/configuration/New() gamemode_cache = typecacheof(/datum/game_mode,TRUE) for(var/T in gamemode_cache) @@ -566,6 +568,8 @@ GLOBAL_PROTECT(config_dir) error_msg_delay = text2num(value) if("irc_announce_new_game") irc_announce_new_game = TRUE + if("debug_admin_hrefs") + debug_admin_hrefs = TRUE else #if DM_VERSION > 511 #error Replace the line below with WRITE_FILE(GLOB.config_error_log, "Unknown setting in configuration: '[name]'") diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index c41f422575abd..7816a6bdf8d11 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -116,6 +116,8 @@ SUBSYSTEM_DEF(events) //allows a client to trigger an event //aka Badmin Central +// > Not in modules/admin +// REEEEEEEEE /client/proc/forceEvent() set name = "Trigger Event" set category = "Fun" @@ -131,7 +133,7 @@ SUBSYSTEM_DEF(events) var/magic = "" var/holiday = "" for(var/datum/round_event_control/E in SSevents.control) - dat = "
[E]" + dat = "
[E]" if(E.holidayID) holiday += dat else if(E.wizardevent) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 84cb42cf479b1..d55a32609a008 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -25,10 +25,10 @@ /datum/proc/vv_get_dropdown() . = list() . += "---" - .["Call Proc"] = "?_src_=vars;proc_call=\ref[src]" - .["Mark Object"] = "?_src_=vars;mark_object=\ref[src]" - .["Delete"] = "?_src_=vars;delete=\ref[src]" - .["Show VV To Player"] = "?_src_=vars;expose=\ref[src]" + .["Call Proc"] = "?_src_=vars;[HrefToken()];proc_call=\ref[src]" + .["Mark Object"] = "?_src_=vars;[HrefToken()];mark_object=\ref[src]" + .["Delete"] = "?_src_=vars;[HrefToken()];delete=\ref[src]" + .["Show VV To Player"] = "?_src_=vars;[HrefToken(TRUE)];expose=\ref[src]" /datum/proc/on_reagent_change() @@ -81,26 +81,26 @@ if(istype(D, /atom)) var/atom/A = D if(isliving(A)) - atomsnowflake += "[D]" + atomsnowflake += "[D]" if(A.dir) - atomsnowflake += "
<< [dir2text(A.dir)] >>" + atomsnowflake += "
<< [dir2text(A.dir)] >>" var/mob/living/M = A atomsnowflake += {" -
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"] +
[M.ckey ? M.ckey : "No ckey"] / [M.real_name ? M.real_name : "No real name"]
- BRUTE:[M.getBruteLoss()] - FIRE:[M.getFireLoss()] - TOXIN:[M.getToxLoss()] - OXY:[M.getOxyLoss()] - CLONE:[M.getCloneLoss()] - BRAIN:[M.getBrainLoss()] - STAMINA:[M.getStaminaLoss()] + BRUTE:[M.getBruteLoss()] + FIRE:[M.getFireLoss()] + TOXIN:[M.getToxLoss()] + OXY:[M.getOxyLoss()] + CLONE:[M.getCloneLoss()] + BRAIN:[M.getBrainLoss()] + STAMINA:[M.getStaminaLoss()] "} else - atomsnowflake += "[D]" + atomsnowflake += "[D]" if(A.dir) - atomsnowflake += "
<< [dir2text(A.dir)] >>" + atomsnowflake += "
<< [dir2text(A.dir)] >>" else atomsnowflake += "[D]" @@ -124,12 +124,12 @@ if (islist) dropdownoptions = list( "---", - "Add Item" = "?_src_=vars;listadd=[refid]", - "Remove Nulls" = "?_src_=vars;listnulls=[refid]", - "Remove Dupes" = "?_src_=vars;listdupes=[refid]", - "Set len" = "?_src_=vars;listlen=[refid]", - "Shuffle" = "?_src_=vars;listshuffle=[refid]", - "Show VV To Player" = "?_src_=vars;expose=[refid]" + "Add Item" = "?_src_=vars;[HrefToken()];listadd=[refid]", + "Remove Nulls" = "?_src_=vars;[HrefToken()];listnulls=[refid]", + "Remove Dupes" = "?_src_=vars;[HrefToken()];listdupes=[refid]", + "Set len" = "?_src_=vars;[HrefToken()];listlen=[refid]", + "Shuffle" = "?_src_=vars;[HrefToken()];listshuffle=[refid]", + "Show VV To Player" = "?_src_=vars;[HrefToken()];expose=[refid]" ) else dropdownoptions = D.vv_get_dropdown() @@ -335,7 +335,7 @@
- Refresh + Refresh
\ \ @@ -160,14 +160,14 @@ if(type == "memo" || type == "watchlist entry") if(type == "memo") output += "

Admin memos

" - output += "\[Add memo\]" + output += "\[Add memo\]" else if(type == "watchlist entry") output += "

Watchlist entries

" - output += "\[Add watchlist entry\]" + output += "\[Add watchlist entry\]" if(filter) - output += "|\[Unfilter clients\]" + output += "|\[Unfilter clients\]" else - output += "|\[Filter offline clients\]" + output += "|\[Filter offline clients\]" output += ruler var/datum/DBQuery/query_get_type_messages = SSdbcore.NewQuery("SELECT id, targetckey, adminckey, text, timestamp, server, lasteditor FROM [format_table_name("messages")] WHERE type = '[type]' AND deleted = 0") if(!query_get_type_messages.warn_execute()) @@ -186,10 +186,10 @@ if(type == "watchlist entry") output += "[t_ckey] | " output += "[timestamp] | [server] | [admin_ckey]
" - output += " \[Delete\]" - output += " \[Edit\]" + output += " \[Delete\]" + output += " \[Edit\]" if(editor_ckey) - output += " Last edit by [editor_ckey] (Click here to see edit log)" + output += " Last edit by [editor_ckey] (Click here to see edit log)" output += "
[text]
" if(target_ckey) target_ckey = sanitizeSQL(target_ckey) @@ -229,17 +229,17 @@ var/data data += "

[timestamp] | [server] | [admin_ckey]" if(!linkless) - data += " \[Delete\]" + data += " \[Delete\]" if(type == "note") - data += " [secret ? "\[Secret\]" : "\[Not secret\]"]" + data += " [secret ? "\[Secret\]" : "\[Not secret\]"]" if(type == "message sent") data += " Message has been sent" if(editor_ckey) data += "|" else - data += " \[Edit\]" + data += " \[Edit\]" if(editor_ckey) - data += " Last edit by [editor_ckey] (Click here to see edit log)" + data += " Last edit by [editor_ckey] (Click here to see edit log)" data += "
[text]


" switch(type) if("message") @@ -252,12 +252,12 @@ notedata += data output += "

[target_ckey]

" if(!linkless) - output += "\[Add note\]" - output += " \[Add message\]" - output += " \[Add to watchlist\]" - output += " \[Refresh page\]
" + output += "\[Add note\]" + output += " \[Add message\]" + output += " \[Add to watchlist\]" + output += " \[Refresh page\]" else - output += " \[Refresh page\]" + output += " \[Refresh page\]" output += ruler if(messagedata) output += "

Messages

" @@ -280,7 +280,7 @@ if(index) var/index_ckey var/search - output += "
\[Add message\]\[Add watchlist entry\]\[Add note\]
" + output += "
\[Add message\]\[Add watchlist entry\]\[Add note\]
" output += ruler if(!isnum(index)) index = sanitizeSQL(index) @@ -296,9 +296,9 @@ return while(query_list_messages.NextRow()) index_ckey = query_list_messages.item[1] - output += "[index_ckey]
" + output += "[index_ckey]
" else if(!type && !target_ckey && !index) - output += "
\[Add message\]\[Add watchlist entry\]\[Add note\]
" + output += "
\[Add message\]\[Add watchlist entry\]\[Add note\]
" output += ruler usr << browse({"[output]"}, "window=browse_messages;size=900x500") @@ -336,7 +336,7 @@ proc/get_message_output(type, target_ckey) if("memo") output += "Memo by [admin_ckey] on [timestamp]" if(editor_ckey) - output += "
Last edit by [editor_ckey] (Click here to see edit log)" + output += "
Last edit by [editor_ckey] (Click here to see edit log)" output += "
[text]

" return output diff --git a/code/modules/admin/stickyban.dm b/code/modules/admin/stickyban.dm index 9ac85e49fa2f0..f5d6c72ffbb6b 100644 --- a/code/modules/admin/stickyban.dm +++ b/code/modules/admin/stickyban.dm @@ -152,11 +152,11 @@ /datum/admins/proc/stickyban_gethtml(ckey, ban) . = {" - \[-\] - \[revert\] + \[-\] + \[revert\] [ckey]
" - [ban["message"]] \[Edit\]
+ [ban["message"]] \[Edit\]
"} if (ban["admin"]) . += "[ban["admin"]]
" @@ -166,7 +166,7 @@ for (var/key in ban["keys"]) if (ckey(key) == ckey) continue - . += "
  • \[-\][key]
  • " + . += "
  • \[-\][key]
  • " . += "\n" /datum/admins/proc/stickyban_show() @@ -185,7 +185,7 @@ Sticky Bans -

    All Sticky Bans:

    \[+\]
    +

    All Sticky Bans:

    \[+\]
    [banhtml] "} diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c77fcc52c09f6..cdfd0b0c75a39 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1,3 +1,16 @@ +/datum/admins/proc/CheckAdminHref(href, href_list) + var/auth = href_list["admin_token"] + . = auth && auth != href_token && auth != GLOB.href_token + if(.) + return + var/msg = !auth ? "no" : "a bad" + message_admins("[key_name_admin(usr)] clicked an href with [msg] authorization key!") + if(config.debug_admin_hrefs) + message_admins("Debug mode enabled, call not blocked. Please ask your coders to review this round's logs.") + log_world("UAH: [href]") + return TRUE + log_admin_private("[key_name(usr)] clicked an href with [msg] authorization key! [href]") + /datum/admins/Topic(href, href_list) ..() @@ -5,6 +18,10 @@ message_admins("[usr.key] has attempted to override the admin panel!") log_admin("[key_name(usr)] tried to use the admin panel without authorization.") return + + if(!CheckAdminHref(href, href_list)) + return + if(href_list["ahelp"]) if(!check_rights(R_ADMIN, TRUE)) return diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm index 5d4e0dc29a727..eaa98934d5cc4 100644 --- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm +++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm @@ -122,7 +122,7 @@ /proc/SDQL_gen_vv_href(t) var/text = "" - text += "\ref[t]" + text += "\ref[t]" if(istype(t, /atom)) var/atom/a = t var/turf/T = a.loc diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index d593973188bb1..c1c189418452f 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -80,10 +80,10 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(!l2b) return var/list/dat = list("[title]") - dat += "Refresh

    " + dat += "Refresh

    " for(var/I in l2b) var/datum/admin_help/AH = I - dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
    " + dat += "Ticket #[AH.id]: [AH.initiator_key_name]: [AH.name]
    " usr << browse(dat.Join(), "window=ahelp_list[state];size=600x480") @@ -228,22 +228,22 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) /datum/admin_help/proc/ClosureLinks(ref_src) if(!ref_src) ref_src = "\ref[src]" - . = " (REJT)" - . += " (IC)" - . += " (CLOSE)" - . += " (RSLVE)" + . = " (REJT)" + . += " (IC)" + . += " (CLOSE)" + . += " (RSLVE)" //private /datum/admin_help/proc/LinkedReplyName(ref_src) if(!ref_src) ref_src = "\ref[src]" - return "[initiator_key_name]" + return "[initiator_key_name]" //private /datum/admin_help/proc/TicketHref(msg, ref_src, action = "ticket") if(!ref_src) ref_src = "\ref[src]" - return "[msg]" + return "[msg]" //message from the initiator without a target, all admins will see this //won't bug irc @@ -675,7 +675,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new) if(found.mind && found.mind.special_role) is_antag = 1 founds += "Name: [found.name]([found.real_name]) Ckey: [found.ckey] [is_antag ? "(Antag)" : null] " - msg += "[original_word](?|F) " + msg += "[original_word](?|F) " continue msg += "[original_word] " if(irc) diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 707a76854f608..8e543c8a734f2 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -12,7 +12,7 @@ log_talk(mob,"[key_name(src)] : [msg]",LOGASAY) msg = keywords_lookup(msg) if(check_rights(R_ADMIN,0)) - msg = "ADMIN: [key_name(usr, 1)] (FLW): [msg]" + msg = "ADMIN: [key_name(usr, 1)] [ADMIN_FLW(mob)]: [msg]" to_chat(GLOB.admins, msg) else msg = "ADMIN: [key_name(usr, 1)]: [msg]" diff --git a/code/modules/admin/verbs/individual_logging.dm b/code/modules/admin/verbs/individual_logging.dm index ca84d5d759ee7..cd3feed5d0411 100644 --- a/code/modules/admin/verbs/individual_logging.dm +++ b/code/modules/admin/verbs/individual_logging.dm @@ -1,12 +1,12 @@ /proc/show_individual_logging_panel(mob/M, type = INDIVIDUAL_ATTACK_LOG) if(!M || !ismob(M)) return - var/dat = "
    Attack log | " - dat += "Say log | " - dat += "Emote log | " - dat += "OOC log | " - dat += "Show all | " - dat += "Refresh
    " + var/dat = "
    Attack log | " + dat += "Say log | " + dat += "Emote log | " + dat += "OOC log | " + dat += "Show all | " + dat += "Refresh
    " dat += "
    " diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 532064196c773..c637389031c71 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -11,17 +11,17 @@ /datum/admins/proc/one_click_antag() var/dat = {" - Make Traitors
    - Make Changelings
    - Make Revs
    - Make Cult
    - Make Clockwork Cult
    - Make Blob
    - Make Wizard (Requires Ghosts)
    - Make Nuke Team (Requires Ghosts)
    - Make CentCom Response Team (Requires Ghosts)
    - Make Abductor Team (Requires Ghosts)
    - Make Revenant (Requires Ghost)
    + Make Traitors
    + Make Changelings
    + Make Revs
    + Make Cult
    + Make Clockwork Cult
    + Make Blob
    + Make Wizard (Requires Ghosts)
    + Make Nuke Team (Requires Ghosts)
    + Make CentCom Response Team (Requires Ghosts)
    + Make Abductor Team (Requires Ghosts)
    + Make Revenant (Requires Ghost)
    "} var/datum/browser/popup = new(usr, "oneclickantag", "Quick-Create Antagonist", 400, 400) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 066fd9cd20d1f..c20eaf135e623 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -1144,8 +1144,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits /datum/admins/proc/modify_goals() var/dat = "" for(var/datum/station_goal/S in SSticker.mode.station_goals) - dat += "[S.name] - Announce | Remove
    " - dat += "
    Add New Goal" + dat += "[S.name] - Announce | Remove
    " + dat += "
    Add New Goal" usr << browse(dat, "window=goals;size=400x400") @@ -1217,7 +1217,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits var/list/msg = list() msg += "Playtime ReportPlaytime:
    " src << browse(msg.Join(), "window=Player_playtime_check") @@ -1231,7 +1231,7 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits var/list/body = list() body += "Playtime for [C.key]
    Playtime:" body += C.get_exp_report() - body += "Toggle Exempt status" + body += "Toggle Exempt status" body += "" usr << browse(body.Join(), "window=playerplaytime[C.ckey];size=550x615") diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm index eee95fe0af8f9..dddff75bb23b6 100644 --- a/code/modules/error_handler/error_viewer.dm +++ b/code/modules/error_handler/error_viewer.dm @@ -71,7 +71,7 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) if (linear) back_to_param += ";viewruntime_linear=1" - return "[linktext]" + return "[linktext]" /datum/error_viewer/error_cache var/list/errors = list() @@ -181,12 +181,12 @@ GLOBAL_DATUM(error_cache, /datum/error_viewer/error_cache) var/html = build_header(back_to, linear) html += "[name]
    [desc]
    " if (usr_ref) - html += "
    usr: VV" - html += " PP" - html += " Follow" + html += "
    usr: VV" + html += " PP" + html += " Follow" if (istype(usr_loc)) - html += "
    usr.loc: VV" - html += " JMP" + html += "
    usr.loc: VV" + html += " JMP" browse_to(user, html) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index 1feb7aa11603f..5ea8c20e32714 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -390,10 +390,10 @@ /datum/spacevine_controller/vv_get_dropdown() . = ..() . += "---" - .["Delete Vines"] = "?_src_=\ref[src];purge_vines=1" + .["Delete Vines"] = "?_src_=\ref[src];[HrefToken()];purge_vines=1" /datum/spacevine_controller/Topic(href, href_list) - if(..() || !check_rights(R_ADMIN, FALSE)) + if(..() || !check_rights(R_ADMIN, FALSE) || !usr.client.holder.CheckAdminHref(href, href_list)) return if(href_list["purge_vines"]) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f34b0633c381e..e1a33dffd236e 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -854,7 +854,7 @@ /mob/living/carbon/vv_get_dropdown() . = ..() . += "---" - .["Make AI"] = "?_src_=vars;makeai=\ref[src]" - .["Modify bodypart"] = "?_src_=vars;editbodypart=\ref[src]" - .["Modify organs"] = "?_src_=vars;editorgans=\ref[src]" - .["Hallucinate"] = "?_src_=vars;hallucinate=\ref[src]" + .["Make AI"] = "?_src_=vars;[HrefToken()];makeai=\ref[src]" + .["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=\ref[src]" + .["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=\ref[src]" + .["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=\ref[src]" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 80992ea928b25..6ec5d5e8fda63 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -901,12 +901,12 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) /mob/living/carbon/human/vv_get_dropdown() . = ..() . += "---" - .["Make monkey"] = "?_src_=vars;makemonkey=\ref[src]" - .["Set Species"] = "?_src_=vars;setspecies=\ref[src]" - .["Make cyborg"] = "?_src_=vars;makerobot=\ref[src]" - .["Make alien"] = "?_src_=vars;makealien=\ref[src]" - .["Make slime"] = "?_src_=vars;makeslime=\ref[src]" - .["Toggle Purrbation"] = "?_src_=vars;purrbation=\ref[src]" + .["Make monkey"] = "?_src_=vars;[HrefToken()];makemonkey=\ref[src]" + .["Set Species"] = "?_src_=vars;[HrefToken()];setspecies=\ref[src]" + .["Make cyborg"] = "?_src_=vars;[HrefToken()];makerobot=\ref[src]" + .["Make alien"] = "?_src_=vars;[HrefToken()];makealien=\ref[src]" + .["Make slime"] = "?_src_=vars;[HrefToken()];makeslime=\ref[src]" + .["Toggle Purrbation"] = "?_src_=vars;[HrefToken()];purrbation=\ref[src]" /mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user) if((target != pulling) || (grab_state < GRAB_AGGRESSIVE) || (user != target) || !isliving(user) || stat || user.stat)//Get consent first :^) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index ad4fb0f718ae6..e7588c0c7ddae 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -942,18 +942,18 @@ /mob/vv_get_dropdown() . = ..() . += "---" - .["Gib"] = "?_src_=vars;gib=\ref[src]" - .["Give Spell"] = "?_src_=vars;give_spell=\ref[src]" - .["Remove Spell"] = "?_src_=vars;remove_spell=\ref[src]" - .["Give Disease"] = "?_src_=vars;give_disease=\ref[src]" - .["Toggle Godmode"] = "?_src_=vars;godmode=\ref[src]" - .["Drop Everything"] = "?_src_=vars;drop_everything=\ref[src]" - .["Regenerate Icons"] = "?_src_=vars;regenerateicons=\ref[src]" - .["Make Space Ninja"] = "?_src_=vars;ninja=\ref[src]" - .["Show player panel"] = "?_src_=vars;mob_player_panel=\ref[src]" - .["Toggle Build Mode"] = "?_src_=vars;build_mode=\ref[src]" - .["Assume Direct Control"] = "?_src_=vars;direct_control=\ref[src]" - .["Offer Control to Ghosts"] = "?_src_=vars;offer_control=\ref[src]" + .["Gib"] = "?_src_=vars;[HrefToken()];gib=\ref[src]" + .["Give Spell"] = "?_src_=vars;[HrefToken()];give_spell=\ref[src]" + .["Remove Spell"] = "?_src_=vars;[HrefToken()];remove_spell=\ref[src]" + .["Give Disease"] = "?_src_=vars;[HrefToken()];give_disease=\ref[src]" + .["Toggle Godmode"] = "?_src_=vars;[HrefToken()];godmode=\ref[src]" + .["Drop Everything"] = "?_src_=vars;[HrefToken()];drop_everything=\ref[src]" + .["Regenerate Icons"] = "?_src_=vars;[HrefToken()];regenerateicons=\ref[src]" + .["Make Space Ninja"] = "?_src_=vars;[HrefToken()];ninja=\ref[src]" + .["Show player panel"] = "?_src_=vars;[HrefToken()];mob_player_panel=\ref[src]" + .["Toggle Build Mode"] = "?_src_=vars;[HrefToken()];build_mode=\ref[src]" + .["Assume Direct Control"] = "?_src_=vars;[HrefToken()];direct_control=\ref[src]" + .["Offer Control to Ghosts"] = "?_src_=vars;[HrefToken()];offer_control=\ref[src]" /mob/vv_get_var(var_name) switch(var_name) diff --git a/code/modules/station_goals/station_goal.dm b/code/modules/station_goals/station_goal.dm index 4a9bc4243865c..98ec01f641951 100644 --- a/code/modules/station_goals/station_goal.dm +++ b/code/modules/station_goals/station_goal.dm @@ -39,7 +39,7 @@ /datum/station_goal/Topic(href, href_list) ..() - if(!check_rights(R_ADMIN)) + if(!check_rights(R_ADMIN) || !usr.client.holder.CheckAdminHref(href, href_list)) return if(href_list["announce"]) diff --git a/config/config.txt b/config/config.txt index b9e622fb28b9b..c382b6aafc165 100644 --- a/config/config.txt +++ b/config/config.txt @@ -346,4 +346,7 @@ MINUTE_TOPIC_LIMIT 100 #ERROR_MSG_DELAY 50 ## Send a message to IRC when starting a new game -#IRC_ANNOUNCE_NEW_GAME \ No newline at end of file +#IRC_ANNOUNCE_NEW_GAME + +## Allow admin hrefs that don't use the new token system, will eventually be removed +DEBUG_ADMIN_HREFS \ No newline at end of file From c3a0b14d0053805276e34172c754ca57657d20fb Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Fri, 8 Sep 2017 19:22:07 -0700 Subject: [PATCH 71/79] Automatic changelog generation for PR #30504 [ci skip] --- html/changelogs/AutoChangeLog-pr-30504.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30504.yml diff --git a/html/changelogs/AutoChangeLog-pr-30504.yml b/html/changelogs/AutoChangeLog-pr-30504.yml new file mode 100644 index 0000000000000..d080d8b658442 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30504.yml @@ -0,0 +1,4 @@ +author: "YPOQ" +delete-after: True +changes: + - bugfix: "Windoors open when emagged again" From adc0cf9f7cb5479a61dffba089d241929e8161c5 Mon Sep 17 00:00:00 2001 From: Kyle Spier-Swenson Date: Sat, 9 Sep 2017 12:23:54 -0700 Subject: [PATCH 72/79] num2text the Instances number (#30509) --- code/modules/mob/mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e7588c0c7ddae..8479c64d5428a 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -579,7 +579,7 @@ var/turf/T = get_turf(client.eye) stat("Location:", COORD(T)) stat("CPU:", "[world.cpu]") - stat("Instances:", "[world.contents.len]") + stat("Instances:", "[num2text(world.contents.len, 10)]") GLOB.stat_entry() config.stat_entry() stat(null) From d5b2bd1578beee9ee6d2d50123757313c7c9abcd Mon Sep 17 00:00:00 2001 From: msgerbs Date: Sat, 9 Sep 2017 16:28:53 -0500 Subject: [PATCH 73/79] Fix crit-only healing to include softcrit (#30520) With softcrit implemented, people are only unconcious in hard crit. This will no longer bring you out of crit as intended. This PR fixes that. --- code/modules/reagents/chemistry/reagents/alcohol_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 9b22236a0345d..5e3bf0f749b71 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1072,7 +1072,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "Aromatic beverage served piping hot. According to folk tales it can almost wake the dead." /datum/reagent/consumable/ethanol/hearty_punch/on_mob_life(mob/living/M) - if(M.stat == UNCONSCIOUS && M.health <= 0) + if(M.health <= 0) M.adjustBruteLoss(-7, 0) M.adjustFireLoss(-7, 0) M.adjustToxLoss(-7, 0) From 2d58c81908433c20dec8da42834a6c2f1cfed2be Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sat, 9 Sep 2017 14:28:55 -0700 Subject: [PATCH 74/79] Automatic changelog generation for PR #30520 [ci skip] --- html/changelogs/AutoChangeLog-pr-30520.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30520.yml diff --git a/html/changelogs/AutoChangeLog-pr-30520.yml b/html/changelogs/AutoChangeLog-pr-30520.yml new file mode 100644 index 0000000000000..192d444569733 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30520.yml @@ -0,0 +1,4 @@ +author: "VexingRaven" +delete-after: True +changes: + - bugfix: "Hearty Punch once again pulls people out of crit." From 1204251d77fb55f3f5b25fc1fe56b4ce557a0fbf Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 10 Sep 2017 00:12:52 +0200 Subject: [PATCH 75/79] Fixes admin topics (#30554) * Fixes admin topics * Actually right --- code/modules/admin/topic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index cdfd0b0c75a39..a7ac73eed4eec 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1,6 +1,6 @@ /datum/admins/proc/CheckAdminHref(href, href_list) var/auth = href_list["admin_token"] - . = auth && auth != href_token && auth != GLOB.href_token + . = auth && (auth == href_token || auth == GLOB.href_token) if(.) return var/msg = !auth ? "no" : "a bad" From 9eac731aea87bb8d6dd73cd50dba2008b871f6f8 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Sat, 9 Sep 2017 20:39:49 -0400 Subject: [PATCH 76/79] Added warnings for ultrasafe and safe security modes (#30515) --- code/__DEFINES/misc.dm | 5 +++++ code/game/world.dm | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index f7734502d652b..2aed9ae7513f0 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -446,3 +446,8 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define SHELLEO_ERRORLEVEL 1 #define SHELLEO_STDOUT 2 #define SHELLEO_STDERR 3 + +//server security mode +#define SECURITY_SAFE 1 +#define SECURITY_ULTRASAFE 2 +#define SECURITY_TRUSTED 3 diff --git a/code/game/world.dm b/code/game/world.dm index a1fcc364cd99e..991e6230e6030 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -1,3 +1,6 @@ +GLOBAL_VAR(security_mode) +GLOBAL_PROTECT(security_mode) + /world/New() log_world("World loaded at [time_stamp()]") @@ -5,6 +8,8 @@ GLOB.config_error_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = file("data/logs/config_error.log") //temporary file used to record errors with loading config, moved to log directory once logging is set bl + CheckSecurityMode() + make_datum_references_lists() //initialises global lists for referencing frequently used datums (so that we only ever do it once) config = new @@ -94,6 +99,20 @@ if(GLOB.round_id) log_game("Round ID: [GLOB.round_id]") +/world/proc/CheckSecurityMode() + //try to write to data + if(!text2file("The world is running at least safe mode", "data/server_security_check.lock")) + GLOB.security_mode = SECURITY_ULTRASAFE + warning("/tg/station 13 is not supported in ultrasafe security mode. Everything will break!") + return + + //try to shell + if(shell("echo \"The world is running in trusted mode\"") != null) + GLOB.security_mode = SECURITY_TRUSTED + else + GLOB.security_mode = SECURITY_SAFE + warning("/tg/station 13 uses many file operations, a few shell()s, and some external call()s. Trusted mode is recommended. You can download our source code for your own browsing and compilation at https://github.com/tgstation/tgstation") + /world/Topic(T, addr, master, key) var/list/input = params2list(T) From d90363f19a669889adfa890ddb9195e0bb119e47 Mon Sep 17 00:00:00 2001 From: AnturK Date: Sun, 10 Sep 2017 02:40:23 +0200 Subject: [PATCH 77/79] Fixes more CanPass misuse (#30493) * Fixes more CanPass misuse * Let's not give wrong impression * spans --- code/game/atoms_movable.dm | 2 +- code/modules/holodeck/items.dm | 16 ++++++------ code/modules/recycling/disposal-unit.dm | 30 +++++++++++----------- code/modules/shuttle/special.dm | 33 ++++++++++++++++++------- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2428dface9928..cc57ca3b675c4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -214,7 +214,7 @@ //to differentiate it, naturally everyone forgot about this immediately and so some things //would bump twice, so now it's called Collide /atom/movable/proc/Collide(atom/A) - if((A)) + if(A) if(throwing) throwing.hit_atom(A) . = 1 diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm index 8dfbfa7c63a43..86481b4c14267 100644 --- a/code/modules/holodeck/items.dm +++ b/code/modules/holodeck/items.dm @@ -120,17 +120,15 @@ else ..() -/obj/structure/holohoop/CanPass(atom/movable/mover, turf/target) - if (isitem(mover) && mover.throwing) - var/obj/item/I = mover - if(istype(I, /obj/item/projectile)) - return +/obj/structure/holohoop/hitby(atom/movable/AM) + if (isitem(AM) && !istype(AM,/obj/item/projectile)) if(prob(50)) - I.forceMove(get_turf(src)) - visible_message("Swish! [I] lands in [src].") + AM.forceMove(get_turf(src)) + visible_message("Swish! [AM] lands in [src].") + return else - visible_message("[I] bounces off of [src]'s rim!") - return 0 + visible_message("[AM] bounces off of [src]'s rim!") + return ..() else return ..() diff --git a/code/modules/recycling/disposal-unit.dm b/code/modules/recycling/disposal-unit.dm index 4c82605673528..517b4aa195c13 100644 --- a/code/modules/recycling/disposal-unit.dm +++ b/code/modules/recycling/disposal-unit.dm @@ -336,20 +336,18 @@ eject() . = TRUE -/obj/machinery/disposal/bin/CanPass(atom/movable/mover, turf/target) - if (isitem(mover) && mover.throwing) - var/obj/item/I = mover - if(istype(I, /obj/item/projectile)) - return + +/obj/machinery/disposal/bin/hitby(atom/movable/AM) + if(isitem(AM) && AM.CanEnterDisposals()) if(prob(75)) - I.forceMove(src) - visible_message("[I] lands in [src].") + AM.forceMove(src) + visible_message("[AM] lands in [src].") update_icon() else - visible_message("[I] bounces off of [src]'s rim!") - return 0 + visible_message("[AM] bounces off of [src]'s rim!") + return ..() else - return ..(mover, target) + return ..() /obj/machinery/disposal/bin/flush() ..() @@ -458,12 +456,12 @@ trunk.linked = src // link the pipe trunk to self /obj/machinery/disposal/deliveryChute/place_item_in_disposal(obj/item/I, mob/user) - if(I.disposalEnterTry()) + if(I.CanEnterDisposals()) ..() flush() /obj/machinery/disposal/deliveryChute/CollidedWith(atom/movable/AM) //Go straight into the chute - if(!AM.disposalEnterTry()) + if(!AM.CanEnterDisposals()) return switch(dir) if(NORTH) @@ -486,16 +484,16 @@ M.forceMove(src) flush() -/atom/movable/proc/disposalEnterTry() +/atom/movable/proc/CanEnterDisposals() return 1 -/obj/item/projectile/disposalEnterTry() +/obj/item/projectile/CanEnterDisposals() return -/obj/effect/disposalEnterTry() +/obj/effect/CanEnterDisposals() return -/obj/mecha/disposalEnterTry() +/obj/mecha/CanEnterDisposals() return /obj/machinery/disposal/deliveryChute/newHolderDestination(obj/structure/disposalholder/H) diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 6a972bff9b388..0373ea5b531c4 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -215,23 +215,37 @@ /obj/effect/forcefield/luxury_shuttle var/threshold = 500 var/static/list/approved_passengers = list() + var/static/list/check_times = list() /obj/effect/forcefield/luxury_shuttle/CanPass(atom/movable/mover, turf/target) if(mover in approved_passengers) - return 1 + return TRUE if(!isliving(mover)) //No stowaways - return 0 + return FALSE + + return FALSE + + +#define LUXURY_MESSAGE_COOLDOWN 100 +/obj/effect/forcefield/luxury_shuttle/CollidedWith(atom/movable/AM) + if(!isliving(AM)) + return ..() + + if(check_times[AM] && check_times[AM] > world.time) //Let's not spam the message + return ..() + + check_times[AM] = world.time + LUXURY_MESSAGE_COOLDOWN var/total_cash = 0 var/list/counted_money = list() - for(var/obj/item/coin/C in mover.GetAllContents()) + for(var/obj/item/coin/C in AM.GetAllContents()) total_cash += C.value counted_money += C if(total_cash >= threshold) break - for(var/obj/item/stack/spacecash/S in mover.GetAllContents()) + for(var/obj/item/stack/spacecash/S in AM.GetAllContents()) total_cash += S.value * S.amount counted_money += S if(total_cash >= threshold) @@ -241,12 +255,13 @@ for(var/obj/I in counted_money) qdel(I) - to_chat(mover, "Thank you for your payment! Please enjoy your flight.") - approved_passengers += mover - return 1 + to_chat(AM, "Thank you for your payment! Please enjoy your flight.") + approved_passengers += AM + check_times -= AM + return else - to_chat(mover, "You don't have enough money to enter the main shuttle. You'll have to fly coach.") - return 0 + to_chat(AM, "You don't have enough money to enter the main shuttle. You'll have to fly coach.") + return ..() /mob/living/simple_animal/hostile/bear/fightpit name = "fight pit bear" From 96a55aafbc21a9cfa9c91a07cfef74b796729d69 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sat, 9 Sep 2017 21:07:02 -0500 Subject: [PATCH 78/79] People in soft crit will leave blood trails when dragging themselves/Will take less damage in soft crit (#30482) * People in soft crit will leave blood trails * Fixes the directions when dragging self * Oxyloss * Nicer proc for blood trails * No regaining all your oxyloss in crit * Losebreath magic * ifoxyloss * Moves crawling/bleeding to carbon * Puts the blood from dragging self under living * Redundant * Buckled * Curved trails --- .../mob/living/carbon/human/human_movement.dm | 2 +- code/modules/mob/living/carbon/life.dm | 10 +++++-- code/modules/mob/living/living.dm | 28 ++++++++++--------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 812d09a34fd28..06f3007e6b053 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -28,6 +28,7 @@ . = ..() for(var/datum/mutation/human/HM in dna.mutations) HM.on_move(src, NewLoc) + if(shoes) if(!lying && !buckled) if(loc == NewLoc) @@ -55,7 +56,6 @@ //End bloody footprints S.step_action() - /mob/living/carbon/human/Moved() . = ..() if(buckled_mobs && buckled_mobs.len && riding_datum) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 0c4f74d03d795..b4a5b527b5182 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -53,12 +53,14 @@ var/datum/gas_mixture/breath - if(health <= HEALTH_THRESHOLD_CRIT || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) + if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL && !getorganslot("breathing_tube"))) losebreath++ + else if(health <= HEALTH_THRESHOLD_CRIT) + losebreath += 0.25 + //Suffocate if(losebreath > 0) - losebreath-- if(prob(10)) emote("gasp") if(istype(loc, /obj/)) @@ -108,7 +110,9 @@ if(!breath || (breath.total_moles() == 0) || !lungs) if(reagents.has_reagent("epinephrine") && lungs) return - adjustOxyLoss(1) + var/oxy_loss = min(losebreath, 1) + adjustOxyLoss(oxy_loss) + losebreath -= oxy_loss failed_last_breath = 1 throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) return 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 8c535ddc5653f..7e4ade3e06d75 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -429,6 +429,7 @@ else return 0 + var/old_direction = dir var/atom/movable/pullee = pulling if(pullee && get_dist(src, pullee) > 1) stop_pulling() @@ -444,10 +445,6 @@ var/pull_dir = get_dir(src, pulling) if(get_dist(src, pulling) > 1 || ((pull_dir - 1) & pull_dir)) //puller and pullee more than one tile away or in diagonal position - if(isliving(pulling)) - var/mob/living/M = pulling - if(M.lying && !M.buckled && (prob(M.getBruteLoss()*200/M.maxHealth))) - M.makeTrail(T) pulling.Move(T, get_dir(pulling, T)) //the pullee tries to reach our previous position if(pulling && get_dist(src, pulling) > 1) //the pullee couldn't keep up stop_pulling() @@ -458,6 +455,10 @@ if (s_active && !(CanReach(s_active,view_only = TRUE))) s_active.close(src) + if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) + + makeTrail(newloc, T, old_direction) + /mob/living/movement_delay(ignorewalk = 0) . = ..() if(isopenturf(loc) && !is_flying()) @@ -474,31 +475,32 @@ if(MOVE_INTENT_WALK) . += config.walk_speed -/mob/living/proc/makeTrail(turf/target_turf) +/mob/living/proc/makeTrail(turf/target_turf, turf/start, direction) if(!has_gravity()) return var/blood_exists = FALSE - for(var/obj/effect/decal/cleanable/trail_holder/C in loc) //checks for blood splatter already on the floor + for(var/obj/effect/decal/cleanable/trail_holder/C in start) //checks for blood splatter already on the floor blood_exists = TRUE - if(isturf(loc)) + if(isturf(start)) var/trail_type = getTrail() if(trail_type) var/brute_ratio = round(getBruteLoss() / maxHealth, 0.1) if(blood_volume && blood_volume > max(BLOOD_VOLUME_NORMAL*(1 - brute_ratio * 0.25), 0))//don't leave trail if blood volume below a threshold blood_volume = max(blood_volume - max(1, brute_ratio * 2), 0) //that depends on our brute damage. - var/newdir = get_dir(target_turf, loc) - if(newdir != dir) - newdir = newdir | dir + var/newdir = get_dir(target_turf, start) + if(newdir != direction) + newdir = newdir | direction if(newdir == 3) //N + S newdir = NORTH else if(newdir == 12) //E + W newdir = EAST if((newdir in GLOB.cardinals) && (prob(50))) - newdir = turn(get_dir(target_turf, loc), 180) + newdir = turn(get_dir(target_turf, start), 180) if(!blood_exists) - new /obj/effect/decal/cleanable/trail_holder(loc) - for(var/obj/effect/decal/cleanable/trail_holder/TH in loc) + new /obj/effect/decal/cleanable/trail_holder(start) + + for(var/obj/effect/decal/cleanable/trail_holder/TH in start) if((!(newdir in TH.existing_dirs) || trail_type == "trails_1" || trail_type == "trails_2") && TH.existing_dirs.len <= 16) //maximum amount of overlays is 16 (all light & heavy directions filled) TH.existing_dirs += newdir TH.add_overlay(image('icons/effects/blood.dmi', trail_type, dir = newdir)) From 29888bcc1d52ce04d928943dbac6035bce71c5bf Mon Sep 17 00:00:00 2001 From: tgstation-server Date: Sat, 9 Sep 2017 19:07:04 -0700 Subject: [PATCH 79/79] Automatic changelog generation for PR #30482 [ci skip] --- html/changelogs/AutoChangeLog-pr-30482.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-30482.yml diff --git a/html/changelogs/AutoChangeLog-pr-30482.yml b/html/changelogs/AutoChangeLog-pr-30482.yml new file mode 100644 index 0000000000000..cf518a6179c5b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-30482.yml @@ -0,0 +1,5 @@ +author: "Kor" +delete-after: True +changes: + - rscadd: "People in soft crit will take oxyloss more slowly than people in full crit if they remain still." + - rscadd: "People dragging themselves in critical condition will now leave blood trails. This will rapidly deal oxyloss to you."